CharacterManaJ/0000755000175000017500000000000013615720000013563 5ustar paulliupaulliuCharacterManaJ/icon.icns0000644000175000017500000001154713615720000015401 0ustar paulliupaulliuicnsgis32wyrzuvþuvzypwسÃvwnoēu赝uoӥo赤rtss{nĪrqpˬlݡltq7"CE=#.7<B_84E9o֠jm"0?E>n|,K'hȶi|:DUQz۶o怠᳆̺ܵ}Z]fV\ZgYkYZk\\VyaZcZjhZUiUoYgvYUvUu{Wk~XXX\ϔS~ΗWbVUȪRϴxRXUΎx(:;4'040oͶ:.4,obӠ{NS05rD2h\e"?"Ngiu,5OCTlksxzw⛤ }Z]bV\ZbYkY[g\[Ws`ZcZghZV}fUoYevXVqUu{Wh~XXzX\ďTyÑW`WTɾRƫxSYUňr'672%.3/oõ;5F;o_Ӡjm"06mF>n|,K'O}k|:DUQRܷp{w}ؑ 䰓s8mkil32 Jsy|trxv{tv˜s|zyz£twxwxm½ļ©vwyx{}uxvDŽxnļ~uxýtxuyuyꩼtxxvѭ™txtyxnҪ›txxw©wwxysvznļwxxw´|vxysq{q½Ŀ{wxwǺuxxuq{vqĺvxvĽuxx*ww}ygļÿtxxɯŌtxyy{yeǼɬǑsyvʏtxzwzl{Ľߣŝt{vŕuzuqzpvСltv鴬nxln{soţlnᄁjmg|vgގUK{mRD-"?TU^hM1EKPȑg>"] !"%)0' =I꿛N1 185 'ذwd8\f`F)!|Ŋ=dolX1 lz7A{veywe; YAjҭM>HQ9%498yɥyU4] !$'*1& .1oƠO1 185 'ج_Xwd8\f`F([bNJ=dolX1 z70]t~{veywe; Y;O\}MD8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB ProfileXYZ Zus4XYZ RXYZ tM=XYZ (6curvtextCopyright 2007 Apple Inc., all rights reserved.sf32 B&l8BIMHH8BIM+FFFF8BIMnorm:名称未設定 18BIMluniT yg*-[ 1- i i i i8BIMnormXNow Loading... コピー8BIMluni(Now Loading... 00018BIMnormDNow Loading...8BIMluni Now Loading...}}{}vovwwyyyyyywwxy|nymvzvwzzusy{yzv|rfs{wphj}yoozro{~|{mrot}{|zbajot||}to|y}||yqpno{{yxvttvy{wy~|zxwx{ubm~˝|lk{}`fbMxtghx鹉ƚь쵦g{y|eZUPP]yunƚЊ|h{~}tRNSaxfϚčtzlxհКѓxZr禝КѬ|OpǸǤК͚Ql俤КȋpK{КLj՗fSˑښКxcVڎКѴ~w~uldb晽}КѭgaawКѢvb~`WКўˈ|vddjdS茶Кѥαm\oZg_f[֟КѤŲSoYg~Wj|^au^ͫ֜Кџ×ǯJ\]djYkfcRoКѥݶfϺrKf^\h^[n]e]КѸzô{bPd\`\sv\[un_`{К}۹οq~^Smp`d_`\}b_[|^fIӔΎКѐۭİu`m_UXYl}[`^YųV`]q]bYКƂ٨Ÿ´uW``_KfYo^_i|dN_]^b_mКѢ٪~ԠتötWc\`cGy\Yy~qcKMa`q]fPʠКπ٫yݩߪp]^`Hs~]`Sy}Ԑt`^LjlCY_l_`iEКђܱÐНϑkg{zd\YU~رλsY_a^@VFa]qh_c\gК|߽yڟ׈Қ—rūԫɾhoZßᤘyDz]``bSInJPb`d``hU⾊КѤМ{߼ݬޯpˊɗ{ܥ䧌ݟ]e_``dF_]D]````aaȁКсޫ֝Òʕ}٢xӇڢ~ݦ嬈˺uJv\``a_@}lSIc````eSvКѿśx߹{߮Ϙ܇ඓᯫږbvN]```cQI`ETb```a`{zКч|w֜Ԝ”ߎ˗~͓qtMvO|e_```bDdlVBb````cRԉКoZM߻pÔ}ߴtzڢȽ]{LvRpw\```aXD`IKc````apϞКѮkW]Ӿۢu௓vިwަⷐiZ}LyUf^````cHUk]=^a```dRʺКv`Oĵr؞؟ڶuþe``RZ~M}{Y]h^```aYCr`RLc````c^}КatZVv_ZrV˘Ҝ~˷\˽h\`Zj_w|Pp[V~\````cISaaF\a```cQxКѥycSmrd]^VhĚs|gʯj~}}}tEk{\`_XdkvVe]Rt`````aWFko_TOc````b^ԊКp^Nl_WkFnY^]T[\E^]]_iOU^`bQkbo[Z`Qhq]````aIW\aK]a```cTΦКbrZY}qv[]hHh_`\^{^[8a`aasz}yYFd_aVore[QO7.3/)QcovYSr|m]````bSKe`aTIc````dWКѥdSqk{hTsFcb_aWhr`U#R`]`aOK;\zdafS׭z\adpa\`fI^_``aUKka?yaf:-^```aI\]u]```G_`````cZzԦКneaIk\fvpBG+P^`]`aQMT`afTۦ\`ejog|^`eSX_``a]Lu`I^m^o8A```bMUab_``cLSb`````fM̓КѨ~aZ_WtQQ7VT[`}]`aS`U]agW۠\`ejۊpkb_cUc`_``d[}^UH}ZkdK\``aSOb[```cO@d`````a`kyКeQW^gJbVaVRau]`aN`TXcgYۛ\`ejyx_h_cZq`_``elw^_=\cg_^``aXKb]pb_`a^:_``````cOКЃkRњTmYo_`bXOdk^`d@bSSef]۔Dž]`cns~Yo^bWaa_``ekbd?wa`e````a]Ia_ad_``eBLe``````bSКјqPoьlNzx]`bY]ib_`bHcOZef]ۏ]aayܫX~w]bYma_``ffykbKVj^a``````H_`_kd```cQ2aa`````a]gКѩvOyycDo^`a[sp]{b`cIudPidfZۘz]a^n[r{]bZd_``ednw^XEw\``````bI\```````ab=9f``````bS~КѦmQpvF^rl^`a\syZte_cJheQۀ`g\܎r]aZݥ_iy^bY|g_``eg۟\dG\``````bIYa```````g;GUe``````cLКѪsVqh{XZ`jh_`a[Zje_bO[fQܴTi\ݔ|r\cTncbq_bWwi^``ekp_fMda_`````bKWa```````g>SQe``````bMК̤tsleynd_cd``a_Ȁ\cd`bUNgQUj]ݜnt]eQ߰h_i`cVtj^`a`xgaWml^`````bMVa```````eJGRca````a^bКѽsdjxsb_`a``a`voa`b`aZMhQkf]׆ru]fS߄m]c`cT߀j^`a]ww\cqsy\`````bNVb```````cS>їNca````bYvКѠtysf^`````bpۮi^``a^WjQݔ^`qvu]f\ᾇu\``eSߚj^`cV|^fZ\`````cLVb```````b]9ѧT\c````dWКq}ll]`````dnuy\```d`xlPTX|w]dnုy\``fRḆj^`eSxiaUv_`````dDTb```````a`7pQbb```eMКr~eu\`````ejp^```fhtqPdYzu_[̈́|\``fUxk^`eS\a}c_````e@Mc```````ab3їVXcb``fRКu{]\`````e_ےh^``fdvOP_}vaR㏨\``f`pj^`fbu`fVtg_````f9Ce```````ad4łQ\ea`dOКуyW]`````gUo{\``ffOVB{rxdXၳ\`aazrg^a_ޗ|`Sn^````g6@f```````ad8ѽO[gddQКѕ]]b_````gSr^``ffqNHkqax暝\`cU}d_dRsa`|zx\````f5=f```````ab;ŀʼnRTejSКeWn]````eRݯ}g_`fcSQhnS~\`eS生a_gVuaRy\```ac8=f```````a_Jp̜lVYNК~w[````eRݐt]`feἅ\vfmZ飩VK`]飖`a_ࣀpTĀ]```bZ@Ae```````b[eҌƛgEКѻo^````dU|\`dkpodGb^Ό|>QVwȗz|QWIֈvi[u_```dNFHe```````dO˸Кыe_```bZl^abzysuyeV{`KVHթ}~V[do_N````gAPKd```````fEtКѷx\```a`zr`a^or_鶕[zx^g[ȻXtO:2fpdYSNLKMMS^gZ-4>]b_``g9MVb```````g>ԅКp]````eh⦍c`R䞋G믽~YߜA* $.ba_`a_CA_a``````abLͬКјe^```gWsLJ>`IdޓP(  K^ekotz"\```eNU;e```````eOqzКn}[```eSۓYfd`ЃDqܮɡϻ 9N(7=<3 ;?~`_`g>^=g```````g6}Кєa_``bVփaJh`aË26JQPF1B\_qa_a_?SMd``````cZ?ϝКs|[``aaޢG  e``````dV9srКы[``eR NcdSkmcQ3:ٌbdQVFJd`````ae6LԂКtl]`bZ@#  sP[stlV7#/!"}vڈ`g]^a`````gAE\ΥКn^_`fe픲+ FaӿF -9O@9[pvmV6AZ7; ڀbUVf`````ePK;~ŅКo|[`eN7sH:Xc0(G]c\F+gSY}b_ٴRd````eQGQ>zКxl\a`g#?zs#'8>:-/rorO|`a```dUFc4eԈКюc]fNN 11ȅ=./6@gvsrkWf```fVHcS8ͤКѮl``\SĨȲW&٦RٹQe``fJC`cCkÈК˃x]eR Ĺʿozrٌ[b`fRK`cPMuКѶz]`x B<glkcagLu`aC}КѲz}aS'9CA=3/29CCHH-;ٌcXhcVncNPњКѸ|vfQ\UjWc\De˷КɒqrYْQSTHf{Кѹbt|^ϭD@MyКѤċ[Z8ӊКѯTVeĒͥКӀ>ƕК˄9ɗzКgTtʖ|К\NW>YʖӋКq^`XTXXPIʘΤК~E```bXD˙ʿКv^]``a^Cz˜xК^M``aaDk˟wКiH```cHcˠԇКэZ```cLRˠϞКђۼߊL```cOIˡʸКѣ谠⼰t]```cTFˡ~КѧɬtEa```bWDˡ{КѥG[````bZD|ˡӆКѦŕڌOXa````a]DsˡіКѦuIXaa````a_Dvˡ̭КѨ“ՍRP]aa`````a`DqˡĈКѪΞҘ^HUaaa```````aFfˠzКѫ‚PIVaaaaa```````bH]ˡxКѮַ̠gMKX``````````````cJYˠӆКѯ߽ҥj{WV````````````````cMT̖՝КѱĤCQbx›zlx}W```````````````cQK}FKKGGGGS[^~КѱťTd`[DP```````a``````cVE߈Y```````faµКѳŇ`b`MJ``````_^`````a\Dɥxnhfgjr_X```````fVКѲfea^ٸD`````aVCc`````?G[HHKMPTY^```````_ZVQOPSX````````fRКѮUghB`````bP9a```cIN]````````````````````````````````dSКѹz}~{{ŴQj@`````bKDXa`cSIc`````````````````````````````````bZКсћi?`````_HQNba_D_````````^`````````````````````````acmКх򾶴kS````aVK]GbcJSb````````_``````````````````````````fZКёp~{Y````bOSbG`\Ha````````````````````````````````````gRКѠ˄e````bG[dKZNRb````````````````````````````````````fPКђ吨ѥfݯXLS_<`bSRI^`````````````````````````````````````dTКѝ좴ʢkټl=KY[FJa`````````````````````````````````````a]КсɧپĆM16\_````````````````````````````````````adkКĨ͊ꖃ٣n>\HLX``````````````````````````````````f\Књr뙠١<:UDBM[``````````````````````````````fTКѤΩتُ빞p_O[```````````````````````````eSКȭ縱ԗ0ʇp[NNPX_`````````````````````bWКѦ}tטܙ}Ӆ_էZRQT]````````````````aa|Кʹj%`޾ht "帓p^NPBS```````````edКήoMփӣﯥپwK```````````gWКϴv*DԦ걨걣٥"&ᠪQ```````````fRКǩxy_!Cۢݵר뺑6W˶ڀW```````````dSК}%!Tܢ⿁ұ+' ˜̩z[```````````b[КѤd)Cݢ઎̶ҹ !!/𦕺sq՝t_```````````acjКі {з|+TJ``````````````````cVКx.qlƙ[c-Q`````````````````a^КDŽڶ{ԩ߇}넡ꯠYͬ_eJ7``````````````````diКѢݶ߀nXyۭj㿡!$-_b_&``````````````````fYК೮׬џpɳa%!&,``dD V`````````````````fQКѷSƱj $ĞОb=]NR`_a\8`````````````````dQКɿwѬ뾓ϵwr /Neb___e3`````````````````bXКѕܸˆiDb____cS\````````````````abrКшޡ$tû~!,b`____`d A`````````````````f]КѱѮc $=h{yn71+gz>d______e@&`````````````````gTКъǡnZ@!"q[O 4~T S'!Rc______a\`````````````````eRК֎e B\*9 P)?!+a`_______h*N````````````````cTКђ|'c]S࿑ "$#&Ub_______dI3````````````````a]КѸ4 c Aq1eɼœ"n/h_______`a'`````````````````dpКўög2 ]ɾfj1*i________h-]````````````````f]Кь٧PR|W`zKZb_______eBD````````````````fUКуɿ =Ŗչǀ@e_______bV<^_``````````````eSКЂ˿ν Rƶĩ7d_______`a3][``````````````cTКyϟWmk.3<Ñķ@_________d=ZN``````````````a[КѴxUp *Ƕȟ¿YTa_______cJOKVa````````````abrКѫȤةPưȿŞݾɣxFd_______aZ@SLc`````````````e_Кќ絧ٱD˽ξŕ̿Ɔ0i________b:[Fa`````````````gXКګ܌3/ ̧ټĕƿƟ'j________dAWH\`````````````fRКѲî $= ˦Řʿ°@a`_______cLKMUa````````````fRКуԣǐA 驽š׾jMd_______`Z9TOb````````````dRКuž.=ĿIJ˘8g________c9[Lb````````````bWКlϷǺI/"{*;Ťܿəǽ+h________dCTC^````````````a]КuǶּŚͭ3g`_______bNM>Pb```````````abmКdzɞÿ\Xc_______`[?CEd````````````ehКLJɮ͜ZKd________c:L=d````````````e^КʩѠÿÀ)G_`________dAM9c````````````fWКѶˤդ̾ʞO%Kje`_________cJG7a````````````gUКѦӧ̡٢ɩc9A[le____________aY<9_````````````gUКћϿ隿̝٥ǿb.;Sdea______________`b1=\````````````gTКі΍˘٬װw98Yhfc`_________________d8>Za```````````gTКэ˕سʯgic_____________________dBCXa```````````gVКуʓֿz{_______________________bNETb```````````gSКсǑŲ_______________________aZ;Rd```````````gUКѿŏźb______________________`a6Pe```````````gUК2:CʏŽr_______________________d;Sf```````````fXКѣDkjSſ_______________________dCNg```````````ecКXW``yڹ}ša______________________cIHf``````````acmК=b_cö™p______________________bOIf``````````a^КѯCd_i×ޘ______________________aXBf``````````bVКэNc_oĖ`_____________________`];e``````````eSКpUb_yŚk_____________________`f/c``````````fSКrZe_šޚ____________________`dI`a`````````f\Кѧckťa__________________c`=[a````````a`wϚђ!/ťh________________`dU.\a````````cTƚЌħ______________`d]@""-[a````````fRƚkkkkkkkkkkkklmlbUOPSQJsimllllllllnkmkkkkkkkkklmldWPOQSKMhmlllllllmj{vskkkkkklmmkdWPOQSNH[gmlllllllnfkkklmmlg^UPPRSNJSngmlllllllnklmmje]VQPQSQJMetffmllllllmh~md[URQQQNJLYuxofmlllllloe{SIIHILOWe|sfnllllllltưƤƺƘļƳźĸƿ­ƷƪôƻƜƽƜęƷĵŞƠ~ٳƹ֟ƺִw~z_ٺ꺉ءԾ®}oiabsջڳךɺeagy΀ڮ량}ʘᆘڧհԉԹnڧ禝͓Ö֫aǸ֥֞do俤՞̋Y՘Ӡžֹ~bː۷˳џѪןz`ڎؐىНɑ΅{i晽Γўֲֹwv|ӡʰ֓y֜vk˞Ԟ՚||͂{a茶ĕԇտqַoֶt}d֟Žgӊm֝l՚sw⩆yͫ׺ßԫ[ɰ֪qr|̓m~zc򛁭įݶhdzӎ\ՠж~sr״spګr}h܈͙yc|Ѫ֡qvqՒrpԈuu~ьݤseԋwӫ{tvqytp۷s}XӔȧёwԇtil²֮mԪӼ֛pvsnנjurٍrydϑk۾vut\ǧȨ~nԨիvt|`vrsyuqŘѐk|١qvzUϠ֖qnդ֞٬{֭\_wwr~aʠƓ¿ŸԊrsvWԝֳrvgԸՖ֣㭎vt]τQnttvMʣ֯ۦԳ୦zך|qnhԸܘʒ܎muwsN׮kUxrtzri좸Ѳ绵ⷴյϷܢnڹΌծrvvygYψ[byv|uva۲ž߻ѯɊŲdzöܚ۵r|tvv{Vv׮rSrwvvvxwƽũ亱՚۴罴罴Ěב\ՓqvvwuNφfYzvvvv|cƄٻϵƱ߶̱vӓ_֯rvvvzdZ׫vTgyvvvwvʁϕ乵㹴ճ۵䭋Ԑ`ԓa|tvvvyR{υkPyvvvvzd¸ɉo_ϵyֳ˱z罴բsɘ]ԓe֓qvvvxmQׯwZ\zvvvwxzɼęУۄks龹~DZ³y뾔̮{֭o]ՕiӹȶsvvvvzWiσrKswvvv{dʺuaӿͦ~庴廴Έ|vvfշo^՘msǦ̀svvvxnRץue]zvvvvzeÎuoiեӓtnfܷ⺸xòrvotc֞pk՝qvvvvzZfwwVqwvvvzdɁƘyfΎ|rujŵⳍ|ȚmtȶSטqvvm|j}֨rfմuuvvvxlUӉuhbzvvvvyhɋ̫saոׯtlVԳՉnsrhգopSsstu\qȢahȺٱsvxdυypoֲudπrvvvvyYk֤qx\rwvvvzgÞxnn֛ՒptYթπtvqu՚so@wvwwbrΛnVϩ{twjʧ}qebC7=82e{nf֚rvvvvyg\}ԿwxhYzvvvv{aư|fЃɀhV{ԞyuwlӍve?zvwqrәwOզՈn\D5V]m|}bidFts]72Gպu}tvvvvuUpσsxUqwvvvzmƂ߱tbt۷roAәtvxh΄yXB}vxk{nՖ~{NճX16EO֞qxz]xZ>rvvvwsYwrܟqvxj]yvvvvvY˖v]SԻs|rZL*avrvxbշ]Hqf]|v~Wxmbqw{W~wqv}MdչuuvxgO΃xMw}G6svvvxYqrګrvvwWtvvvvvzouɞ}xXնq}QV4`nurvwd֭]gtgvw~Ttsh֨qw|Snsu|YMջuuvwrBԑvXuІsEOvvvy_iwyȺtvvz]fyvvvvv~YÂ˺ܝvnձtkddCjekurvwg֩uhykrxRqtnǫqw}SgԋyuzdLջvuvv{HբshY֛o|]qvvygbypvuvzaO{vvvvvwwp|c׮ְlvZyjxfXwrvx_֨vd{|gzRo{{qw|T֕ttzk[Ծvuvv}RfִsuIֱqzusvvxm\yrxuvwtGuvvvvvvz`Ãe֯hntvxhJ{sv{O֭x][}~UlrwzW`֝nsykiawuvv}Sky{Gxu|vvvvwrYwuw|uvv|P]|vvvvvvyeЌcڢ`rvxkJ́yuvyXְzVY}~Torwx[z֨mrynlXyuvv}R΄xVbςsxwvvvvvXuvt{uvvzdilzxvv~dۚu֠qvvvvv}Pm̀svv~RgԒUybbvx`vՠqvv}Wt΃sv}W~w}Ptvvvv~FR|vvvvvvvw{?cq}xv{`ܗlֱrvvvvvN_֙qvv~VݞW\Qq{V֥qvwweitxtkpubfЈsvvvvBM}vvvvvvvw{B`q{{btuytvvvvPxֳsvv}Yx\zYlwd~ܧqvzim|t|`exw^Օqvvvv}AK~vvvvvvvwyGǗdg}exkшrvvvv}U~tv~Xfٿd`mbqv}^{xtTxS`֡qvvvwzEK~vvvvvvvxuWxhn`方֟pvvvv|ZlԐrv~Yq|rYԮk\v\ھvwulzhpԭrvvvyoNO}vvvvvvvyquɊ|Sշsuvvw{d|k֤qw|]jԉloKrt{ðLdkgclRkRdոtvvv{`UW|vvvvvvv{b}tvvvyomjֲswyc{a}Zǀw[jT͜jpZcu]tqܻwuvvOb]|vvvvvvv}SǼǁ۟Քqvvvwv`ԾvxsrtWmćqst\skbG9W_TKEA>>>?EPXI&>3c`տyuvvF^jyvvvvvvvJֺɅձrvvvv|YyvbJqƕw\O2   %zxuvxuROtwvvvvvvwx\ʺ}svvvTgǡ\ZFzfVxˢeĂH&  K^ekotzNtvuv|`iH|vvvvvvv|bºË՛pvvv|[tg~{]pQbɼίοȻ 9N %((# 8+g[vuvKsJvvvvvvvBẺʂytvvyjsxZ[_WҿË'"054.!BXApxuxvLf_{vvvvvvzoJ巺ė֛pvvwwj; 4eˡWٸ|A%6::6* lmhzt}WmOtxvvvvvvHoиҕ{svv~\) 9эټ~u*8>?:0 R&czu~EvK}vvvvvv|jF~~צpvv}\— EaO3EF@5" :bfx{`FG[|vvvvvx}B]Ƀ΄rvyoů7   q;9JKF8$%}bdv~Q`txvvvvvOTmÞֶsuv}a& >s[? $=: %oD]ɂøm_ʍY|BNjЩ~R榌GrÝuˏcKιԥ}>ĈhÿºoNʁ]ürGbv{iMHiNJrQvmcclcZÜ}ǺļǝOvvvymSuŹļOrvvxsRȺÇcǻͺh^vvwwTz㸺ɀxùþºvTvvvzXq帺Ɇľl^vvvz]b为ęϱ̷cZvvvzbY帺뮸ۦձٿ_lvvvzgU帺簭뾣ᾏYOvvvvylT䷺džگbOovvvvyoRⷺȈŒÙdNjvvvvvxrR᷺Ɣ͡XNkvvvvvvxtR߷ÓѧgLZqvvvvvvvwvS~ܷΝˣnSQgvvvvvvvvvwxUu۷ĉɦdNThvvvvvvvvvvvvyXnַʁֶ̩kUOYlvvvvvvvvvvvvvvzZiηȆ߼ÕjQBH;jvvvvvvvvvvvvvvvv{_cǸʗԾݷP^izծuOAGR\`yZkvvvvvvvvvvvvvvvzdZyRWVQQPPW_bԽ踺g|vp9k|~zmwgmROZ`^]bsfbvvvvvvwwvvvvvvzjT҆nvvvvvvv~tƺּwyv>HYlvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv~f񑅤wС˲l볆XHGQpvvvvvvvvvvvvvvvvvvvvvvvvvvv|f̘}tz毯խv1„h\X[aluvvvvvvvvvvvvvvvvvvvvvykƥhg}ьo秊mY֪d^`frvvvvvvvvvvvvvvvvwwֶu#KВYY\nn} $幗wgX[Mgvvvvvvvvvvv}wϫj>^ö| p[vvvvvvvvvvviة7qxlzx}t ܜcvvvvvvvvvvv~dʣZ2ǏmzgВ}3W½~}kvvvvvvvvvvv{gAԒmX˞ն) —xpvvvvvvvvvvvyp^&jܕmdt࿬Ȭ0웎mkɔrtvvvvvvvvvvvwzCӐk}bοz І嫓Hbuvvvvvvvvvvvv~k| %XỌi[|εfcpRmĺXvvvvvvvvvvvvvdr'7zrr_UeNA  ľWvvvvvvvvvvvvv|eЕ #Vk˜~u.Jyi_lTvvvvvvvvvvvvvyjƥMPԹjޮR#_>-  JOvvvvvvvvvvvvvww칗UwqO8^ב_& Tvvvvvvvvvvvvvv}uXޘhfˮnp_tǴs zsvvvvvvvvvvvvvv~hΰrqD^젶ʦȿV 7|Yj^vvvvvvvvvvvvvv}eΟڕg5 *Nrڏǫw*% vvvvvvvvvvvvvvvvvvzi۠"PrVMq}ƽ(+ bvvvvvvvvvvvvvvvvvxsϬuʡѓ[WZm{kfgn椞V¢ )+! ?vvvvvvvvvvvvvvvvvw{}ѮؖWOd#@eݿ g,)))))))**$vvvvvvvvvvvvvvvvw{d/ zlcbbaad_ѼݷuƹI))))))))))))))))))))))*#C~vvvvvvvvvvxs+)Oⷺoƺj))))))))))))))))))))))*&7~vvvvvvvvvvyj"+)_ļ䷺kǺ/)))))))))))))))))))))*(,}vvvvvvvvvv|e%*)rƾ踺mɻC)))))))))))))))))))))),$zwvvvvvvvvv~e&+*ļ긺uʼm))))))))))))))))))))*+ uwvvvvvvvvv}o+6Ļvʼ2))))))))))))))))))+*nxvvvvvvvvww&%»𺹺xʼ>))))))))))))))))*+%qxvvvvvvvvzhſﻹ˽V+++++++++++++++-*5qywwwwwwww~eĶnnnnnnnnnnnnnonkeccddcij«snnnnnnnnnnonkfccddagĪĬ|nnnnnnnnonkfccddcbxĩĤŮnnnnoonlieccddbcnĬ¢½ưooomkifdcdddbg|Įľ¼ƲskheddddcberįįƵjaabbehp}ı̷ǽ̱º̖̺˾ƛ̽Ǿ̯ÿ̞ğĿ̘ȥ|}̽˥}ò̤z}nX[p~tnuwnklr~}TZVA^t\RS_|꺉õƆu쵆cUqjxlgjq{XNJDDNgcXõŁzkV}j~unlkoqwx{}~~}{cGDHTf|Vnŵƺnth~{wtrrpmooqrtryZ\հƵƍm~qLZ禝ƵƤmuzD[ǸǜƵÓqpmGk俤Ƶƾvl`Bx~Ƶƽ՗um~XI˒ړƵƷzkmunUOڎƵƫulld\V]晽yƵƥzlyY~SStƵƚoyeUlSKƵƗ{ljeUU[VJ茶ƵƝ^O`}NX|QXV֟ƵƝжH`MYlKZjPSfGͫ֕ƵƘÒԸu@zxuOPV[M\XVH_Ƶƞݶd¨{aAsnq|YPOZ{PO_uOXV|ƵƮtѻƳiUEoV|uoOSOadOOd_RRz|ƵwөamqPH\aSvVQSOlUQOj}PXAӔֈƵƉҚٷdS^QJKywM\ukOSPMqnJRPqaPUSƵƼ~ϕ׷ϼdKqSRQ?qsXM_suzQQZk{VCRPyPURkƵƚϗnɍТócKToOSUJ[P5PSSSSVGljƵp~RDp|wxiҼ͋xxΌexϦgĻVSSFn}NrlBkiMPqZPSSSTM:bqRGBUSSSSU]zƵWdNIpzdQMcL̶ܽqȇ~`}¿OZOSN[QekE`mOKlnOSSSSU?HySS=OSSSSUGzƵƝiUG]aVPRIYckoYnn]mkkmXiv;[iOSSLV\eJWsPH~|cRRSSSTK<\_RIDUSSSSTY␺ƵjvPC{}\wQK[=}yu]MPPHnNO;PPPRLhmmonDH~yPSTFt\U_OMzRGrZv`PSSSST?KnqOTAPSSSSUIܯƵYaMMk`eOPY>tzZQSORjPN/SSSSSjmikgM=rVQSK_sbWNFD/(,)$FU_dMHaj_rPSSSSUHAXSTI?USSSSVT΂ƵƝzWH`[iYIc=Tm}TRSKYaSH0VSSO`zq_i`S9zr~_MA1&=AKVairWEJF2P\O@'$2t~RrXQSSSSR#'18wmOTUBYS?+<=YYdePSSSSUBIVhOUHCUSSSSWPzƵƹldOHvNyqEeJ;czPSTFeXW>:XSTMnsrGhSV??m2?IESUDorOSSJJaQB|xN8MlSlRSSSSTK?PlvPSS=YSUKqstI|jPUI2]?DSRTERvOSSPAjR=^S7JMgYQSSSSS=PVSRUDGUSSSSYIܯƵrmQB_`PMfGEVsK;?O`kjFaK+&&*fSYBCYSUIwtsYklOTNApk`eqXQSMBxPSSU<}sRDIG%IaPSSSSU?IPqZPSOi}RM:M >SSSSSTIAS[ePSU?JTSSSSWHυƵc~QQ8TTkb?N2 bT~vPSTCoS8WQUSLXSXDrsgWpOSTV[}UkOSW5d|QRSU@RVR4|vH,,PSSSSP>SP|mOSTJAUSSSSSYU娛ƵƖyjSC<PWdO?6FSywPSTE}}@3O]SVSYBpvdUqOSVNwsS|uOSX;J~RRSTI<[T7gSX3&PSSST?OPdvPSSS=QSSSSSUNƵdWTA_|OXd`:=&DNRrwPSSG~vBIl\SSYBkwi]sOSWKVYk~PRWCARRSSP6dS>Q^P`19SSSUCJSUQSSUAHUSSSSSXG܈Ƶƛ~lSNpzQKcGG0JHLRkvPSSHsRIqbPTYCixlfvOSXJ]`\TRVHDzSRSSV?epPI>kN\VAOSSTHDUOuSRSUD8VSSSSSSShxƵƵn|WFwyKQX?UKTIBSduPSTBysSGsuJUYCfxqs~yOSWJcfQ~ZQULT]SRSSXJU|PR4yOVYRPSSTMAUP`TRSSP3RSSSSSSUCzƵu[G}ƑxI^M^QSTJoyUAEXXEcsvj~PSTSrtsMmfPUMeMTRSSXFd[T>G[PTSSSSSS>RSQ\VRSSUG,SSSSSSSTP\ƵƜxeE}phU;o`PSTNMh`PiURU?d{VAKVYDnk{b~PTP]RzNaiPUNgbzVQSSXFOfPK6eOSSSSSSU?OSSSSSSSSU52YSSSSSSUHtƵƜ{]JfleGUSSSSSTPYƵƳlZ`fbyUQSSSSSSPOSSUSTM;ZAOXJlZY}PYCc^PUSUIu\ZPSTP^`eOUMYgOSSSSSUCJTSSSSSSSUH7ƌDUTSSSSUMmƵƘjgctXPSSSSSULpnZPSSSP?v[BgPP\ZY|PXFodOSSWFlZPSUJjV}PYDYrOSSSSSUAIUSSSSSSSTP3ƜKOUSSSSVK}Ƶgk]s\PSSSSSVLRfOSSSVC_\AEKyft[yPVP^gOSSXDr[PSVEbZTGn^|QSSSSSU;IUSSSSSSSTS1ƺfGUUSSSXCƵhlWudOSSSSSWJ[|PSSSXJVaAKMhf[vQOjmjOSSYEb\PSXCVrPSS\URSSSSV9BUSSSSSSSSU.ƌKLUTSSXGƵmiQxnOSSSSSXDb~ZPSSYI_e@nDMi]nTFkmOSSXJY[PSXJ_SX@^YQSSSSY2;VSSSSSSSSV/ƹxGOXTSVEƵ{hK}zPSSSSSYAPiOSSXKwmBF9h[fVGhqOSSS\XYQTQbgkRG}[_PSSSSY/6XSSSSSSSSV3ƲvFOYVVFƵƍPQUQSSSSY@[|PSSXL[uCf?lVaS[vrOSUJyaVQVFUTSVdfOSSSSX/4YSSSSSSSSU6{ƺKIX[HƵƾ`K_PSSSSXBvhYQSXJ^G|EyU_FiuOSXFsTQYG^rT@UoOSSSSV04YSSSSSSSTRDpfLMCƵƶwhmOSSSSVCd|dPSXLpPtdqV^JwKASLSSRdql`Ig~ivPSSSUN89XSSSSSSSUOaߔƼa?ƵƱe}PRSSSVHt[qOSVPV_eT;QQswk6GK_xgjEL=be[FR}QSSSVC=>VSSSSSSSVEċƿƵƃXQSSSUNfUzPSUZsgcYeqWGeSAJ>jlJNPTRCmg}SRSSY9D@VSSSSSSSX;tƵƭofOSSSSSV_STPjZbKzh|Oy¾fgQYLmKbD2+SZPGA=;;;M8QTSSSSSSZ3X̄ƵƦjVPSSYN' 6Ɔϻ~u0I`kmdP/R#XURY1S5XSSSSSSVJ2qqƵƃ~qOSSXD Bdj^wyo[9:\\~TVD=7?VSSSSSTX.BㇾƵk[PSUNy4  |"uVfx`=%4%%}_ZySYBWQTSSSSSY8;RܰƵe}PRSXSy$;nR}<  2?UB?f}y_<D_>B ꗄWuUJ`>XSSSSSXC@3yҀƵfkOSWDľt/èЪd?Acm2+OgofN/k\cꕅYqUDqEVSSSSVG=F5zƵo\OTSsǡӻZF%+>EA02|䄇UnCkRRSSSSVIUH0ܯƵƤa}SSOqvQ ĿʬĻb&io@sCVSSX>;RU:cτƵ{huPXGܳ m텇SaaYNTSXF5SUDCtƵƫponPSi JؾCÂRKIVTY^xƵư[fujUےl~3g3D{ƵƛzONRs0ΜᑸƵƥtJݝ<[ќۯƵƷ޺qÇ[5ԠͅƵ|Ʋ̝u/֡xƵ`½g>nנ~ƵUýſi:Wmr`@3Oנ⑷ƵgżCSMGILF?ءܰƵrɿžř:SSSUM;ؤ˃ƵjʾƾCPSSTP:tئvƵW˷ƿ_BSSSS;bتxƵcŽýo=SSSU>[ج⌼ƵƆƾþeGSSSVBI٫ݨƵƌĿƪƱZASSSVD@ثʼnƵƜৰў̪ѷ}RNSSSUH<ث{ƵƠݩ൜صO:SSSSUK;ث{ƵƞѦX;NSSSSUN:uثƵƞŎܹ[>KSSSSSTP:lجƵƞØ|N;LSSSSSSTQ:pثڹƵƟ’Ŝ\>BPSSSSSSSSS;kثтƵƢΛcC;ISSSSSSSSSST<^ثyƵƣݽzX>=JSSSSSSSSSSSSU>U٫zƵƥֵ|dH=@LSSSSSSSSSSSSSSU?P٪⌺ƵƦ߼۸dMAI7KSSSSSSSSSSSSSSSSVBKڠ㧞ƵƧѪDEAABDPY_ƾƵƧҩIVSO1ixzuksdjQOY`^]ao\ESSSSSSSSSSSSSSUJKO(-MRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSVcƵƹÃޖMHλji/B7>KSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSYUƵƑ[gނӽkB@l<46ALSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSXLƵƙ|oǜg볈WE??OSSSSSSSSSSSSSSSSSSSSSSSSSSSVHƵƾulrۧɢq#9ӊfTGFGLRSSSSSSSSSSSSSSSSSSSSSUKƵƞyc訂`}uȄiݟjf զ{VKHIPSSSSSSSSSSSSSSSSSStƵëg*NŇvSxUXhg|{ +ɩ嶑mYGJSSSSSSSSSSSSSSSSSXWƵƧէiC /GZa`XQPL*$!GLqֈ 1//////2!)SSSSSSSSSSSSSSSSSYLƵƃʺdDDB&$yf_  *OxW [-)0///////-SSSSSSSSSSSSSSSSSXHƵwYRKFa,; 6Y꼜 A/////////3GSSSSSSSSSSSSSSSSVJƵƇh)jb!XoTb͘ !*0///////1%3SSSSSSSSSSSSSSSSTPƵƮ8 i Do%@_{ʧџ! )z(3/////////(SSSSSSSSSSSSSSSSSViƵƖj4 OSSSSSSSSSSSSSXHƵƬ '= ײԡλN/////////0&GCITSSSSSSSSSSSSXGƵԦՙA Ԭ•t'2////////,2HDUSSSSSSSSSSSSVGƵqʜ.=ƦѾנ&3////////0%OATSSSSSSSSSSSSUKƵiǛJ1${-dzҮף,3////////2#P:PSSSSSSSSSSSSTPyƵržΨҡԶ?2////////0'J5EUSSSSSSSSSSSSUgƵ}վզЮg,0////////-;:;VSSSSSSSSSSSSV`Ƶƽ׺ڣ`&1////////0+A5VSSSSSSSSSSSSXXƵƷ׳ݩʆ0&//////////2&G2USSSSSSSSSSSSYOƵƬٯӢS$)32//////////1%E/TSSSSSSSSSSSSYLƵƞִڬӰg4%-42/////////////,:2RSSSSSSSSSSSSYMƵƔڨǠi2&)12/////////////////,4OSSSSSSSSSSSSYMƵƏѓڢݼr/",320//////////////////2'7MSSSSSSSSSSSSYLƵƇؠɩwqgbdI30/////////////////////2"?LTSSSSSSSSSSSYNƵ~ם̡e|ola_gqi///////////////////////0'AIUSSSSSSSSSSSYLƵ|֛ԢLgkpqw}////////////////////////,9GVSSSSSSSSSSSYMƵƵҘҭwƸ?////////////////////////1FVSSSSSSSSSSSYNƵ'$;יҸø`///////////////////////2,LXSSSSSSSSSSSXRƵƖ$43bac{Ĺ///////////////////////2'LYSSSSSSSSSSSX\ƵL,/?|h^eebdfd[ahVOwźB//////////////////////0$FYSSSSSSSSSSSVfƵƽ+0/TѸxjcaaa`c^tȻ]//////////////////////0(HYSSSSSSSSSSTPzƵƠ$2/gƷpȻx///////////////////////,AYSSSSSSSSSSUJƵƆ'1/xnɽ://////////////////////.7XSSSSSSSSSSWIƵm*0/»q˾V//////////////////////2-USSSSSSSSSSYJƵn-22zy/////////////////////1&RSSSSSSSSSSXUƵƞ1D}˿A//////////////////0/ OTSSSSSSSSSSoŵƋ%1ýҁP/////////////////2+PTSSSSSSSSUIõƇ¼ш³i11111111111111130"1PUTTTTTTTTZJõþɻxwwwwwwwwwwwwwwsmjklkkʻwwwwwwwwwwxwtnjjklhn˼wwwwwwwwxwtnkjkliiz¿̽wwwwwxwuqmjjkliksĿ̾xxwvtqmkkklkipĿtpmkkkkjio}ÿ¹¾tiijjnr{6;?%=@ >?@=& @OkaeH/41XkjeR*5XkjxeR:3Xkj)eR6Xkj&-j'9bR> ,u.Xkj- .j&'R7 x%*Xku_25 1.j5$/3:zR(>  S9XkvM_!9 .j+ '6JBkwiR4<. XW51XkcZؖ`Q$ 2j$ -''=hRaC( ]` "&Xkld00(y: IVj5 00/A<N.0 .li"#jR=/0-[p*0P!!XkT{k6&jE #I=B)<l MuR@ 7"-sj#*$Xk{{E3h\D.jC3BF1$ク8X;[qR@?>4&CY#&XkwK:!p jC1aM;_nnjR@ tF#;-r_kwKo+,YpjC1pGF8;_s9R@#5q#B 2]kwK  c'jC1}y#;_sKR@-u#9^kwKD/qw"jC1ksSB;_sm=R@ ")#V>R+kw>:&}}zuo jC1m{}LC;_i_R@`)T9Dd#kv6,cjD=5Z:T($R@!%>1.ww}Ewwy_wwwm#@kH.e:p\n Z#jHalllllllllktDa^rxoYb-DPBbllcRR5 cg^y9#jLk&ɐ^!kja6ggwRR?CR z }faUi*otӗU㔵/ #kR *eDR dv/_cpPfDxA[3K5 A7qouiON%+Y?#|CBN7u+=^#{mL)*w*+Q{:e4;.}! αN;WwP,UQЏ{ʕ+mц!ͤʿ+&U +ZzPw>͡"ʺIۋ< jiYN}Bh8Y`J`cap{q>pT3jUfOeQ Ox?Io96Cl3/JJJ9Bk3B.S5 k.S5 -IZN50&3H4By܎ ;`wky܎ NK3ܙ`ɇHm'ܰ:|B0Ee27k0E8F6p? 6AB1Nnzk1NlPppE;2B7$ BRk7$ Y$MR%mii&>thEBl Dkl kHWoxff[sFE BB%v_pkB%=V:ffbc E=1B&?r&k1IYcff MZEB%A nTk%AI$ff{G6|E }BNuh8Xj kNuhI\ffpGeE@'B=T8< yk=T֕gTBcBrffpG7EB)&Kdk)0?,ffpG]E B\ke ffpG^1EBBfKkf ffpG j/IC,_J8+tEEEEEEEEFJWm ,_J8+NggqHZ==#=#=O HtLo`%tLoh)Hyݠ{mmwN#=#=XLP ] *pvuVb:G#=#=ngcnQcnGf=M+j^Sfr#=#=N\\\-\\\\,dĖh U\\: \\\']e`]\\\\\\\\\]am dĖh QzpI\\\H(yb\\\J9\\\B9\\\=+\\\M;:\\\D \\\\ \\\\C$l C P*̾'iғ "4.DCCCDDCCCFDCCCFFCCCCECCCCDCCCCDDCCCDCCCCDECCCDCCCCCCCCCCDUDCCCDCCCCDECCCDCCCCCDCCCCCDCCCCFDCCCECCCCDCCCCCDCCCCCDGDCCCDCCCCDFCCCCFEEECDCCCCCCCICCCCFDCCCEFCCCCDCCCCCCCDCCCCFUHDCFDCCCEUHDCFKDFDEC`IECUFCCCCKJUIDDCCCCDCCCECCCCFCCCCCCCCDFCDCCCEECCDDCCCDDCCCECCCCCCCCDFECCCCCCCDDDCCDCCCDDDFCCCCECCCDECCCEJCCCCCCDICDDCCCDDHCCCDDCCCFDCCCDUCCCCFEDCCCCCCCCCCFCCCCDCCCCGCCCCEDCCCEEDCCCCCCCCCCFICCCCCCCCCCCCDECCCCCCCCCDGCCCCDCCCCDCCCDECCCCCCCCCINDCCCCCCCCDGCCCDDCCCGIDCCCDCCCCFDCCCCCCCDCCCCCECCCCCUCCCCENCCCCDCCCEDCCCCCCCDCCCCCEDCCCDCDDDDCCCC`FCCCCCCDCCCCCCCCCDCCCCDCCCCCCCCDCCCCCCfCCCCCCDDCCCDCCCDDCCCFEDCCCGCCCCFDCCCDEGCCCCCFGDCCDFCCCCCDCCCDDCCCEDCCCDEGCCCCCFECCCCGDCCCEIDCCCDDCEDCCCCCCCDCCCDDCCCCCDDCECCCCCFDCCCDEUPCCCCCCCDCCCFDCCCDUCCCCFDCCCDFUDCCCCCCCCJDCCCCCFCCCCCDCCCEDCCCDFUDCCCCEDDCCCCCCEDCCCDNJCCCCCCCCCCDCCCCCCCDCCCEECCCCECCCCCDDCCCFLDCCCECCCCFCCCCFEDCCDECCCCCCCCCCDCCCCfDCCCECCCCFEDCCDNGCCCCDCCCDFCCCCCCCCCDCCCCCDDCCCDFCCCDNCCCCDDCCCFGCCCCDCCCCFUDCCDCCCCNCCCCDECCCCCCDCCCCDDCCCEUDCCDCCCCNCDFEFDCCCEUDCCDDCCCCCCCCDCCCCDLECCCDECCCDDCCCDDCCCFDCCCCfCCCCFECCCCDCCCGCCCDCCCDHCCDGCCCCFDCCCEECCCCDCCCGFCCCCCCCCCCCEGCCCCDCCCCCCCCDCCCCDDCCCDCCCCGDCCCDDCCCFFDCCCCDCCCFECCCDCCCCECCCCDCCCECCCCCCCDUDCCCEECCCDCCCCEUDCCCCCCCCCCCCEFCCCDECCCCCCCCDCCCCDDCCCDCCCCLDCCCDDCCCFDCCCDHDCCCFGCCCCDCCCFDCCCDDCCCNCCCCIDCCDDCCCEGCCCCDCCCFCDCCCCDDEFFFCCCEFCCCDCCCCCCCCCDCCCCDDCCCDDCCCEDCCCDDCCCFCCCCDCCCCFCCCCDDCCCDCCCDDCCDCCCCDCCCEDCCCECCCCDDCCCDECCCDEECCCEFCCCDCCCCCCCCCDCCCCDDCCCDDCCCDDCCCDDCCCFUCCCCDCCCFCCCDIDCCCDCCCCCCEDCCCCCDNDCCCECCCDIDCCCDCCCFDCCCE`DCCCJFCCCCCCCCCDCCCCDDCCCDDCCCDDCCCCDDCCCFFCCCCCCCFDCCCDCCCCCDCCCCCDDDCCCCCDDCCCEDCCCDCCCCCFCCCDDCCCEDCCCDCCCCCCCCCCDCCCCDDCCCDNDCCCCFCCCCCDUfffUffffffffDCCCFCCCCCCCDFCCCCCECCCCDICCCCCDGCCCCCDDCCCDFFFFFFFFEECDUFCCCCCECCCCDCCCCGICCCCCDECCCCEfUDCCCCCDECCCCECCCDCCCCCDCCCCDGDGDCCCCCCDCCCCCICCCCGICCCCGCCCCDNCCCCCCCCCCCCCDCEDCCCCCDCCCCEDCCCCECCCCCCCCCCCCCCCCCLCCCCCCDCEDCCCCCCCCCDEDCCDCCCCCCDCCCCDEDCCCCDCCCDDCCCDDCCCDECCCDCCCCCCCCCCDDCCCCCCCCCICCCCGICCCCGDCCCECCCCCCFUDCCCCCCCCCCCCKDCCCDICCCCCCCCCCCCCCCCCCCCCCLUDCCCCCCCCCCCCKIDCCCCCCCCCDCCCENCCCCCCCCCCCDCCCCECCCDCCCCDDCCCDDCCCCCCCCFDCCCCCCCCCICCCCGICCCCGDCCCCDCCCCEFCCCCCCCCDCJCCCCECCCCDCCCCCCCCCCCCCCCCLFCCCCCCCCDCDDCCCCCCCCGCCCDJCDCCCCCCCEGCCCCDCCCDCCCCCCCCCDLDEDDCDLCCCCCCCCCCICCCCGICCCCGEEEEDJEEEEFJECDCDDEHEEEFUEEEHDDEDEEEEEEEEEDDDDFJECDCDDEHEECEDFfFEEECFCCDCCDKDEEEECEEEFCEEEGGEEEECCCCEFEEECUEEEEFUEEEEFDDGDDCCCIUECCCDfHDCCCCFIDCCCCDCCCCCCCCCHCCCCCCCCCCCCDGUDCCCCCCCDDDLCEHP;999:;999:;999:<999:9999999999::999::9999<999::999:99999:U9999::9999=9999:999::9999999999;:9999:999::999:999999:=:9999:999;<9999<;;;:99999999I:999:99999<9999999999999:999:U=::F99999U=::F<>;;;:@I::9999999:9999:999999:<;:9999:9999:;U@;99999:9999;99999U:999:;999:FU9999::999@:99999>9999<99999;999:FU9999:99:9<;999999999C::999999999:999999;:999:;:999::999999999;L9999;:999:9999:>:999:999;999999;999:f999999999:>:999C;999:9999;9999999999:99999:9999;;999:;999999999;;999:9:999:U:999:999C<999:=99::999<999:99999U:999:999CC9;9;9999:U999::99999999:9999:L<999::999;999999999;:9999f:999:>999::999;:999;99:@999=:999:99999>999::999;;:9999999999:@999::99999999:9999:9999:9999=:99999999;F:9999:999:;9999;999;:999;999:999:999:@99999;9999;999;U:999999999999:;999::99999999:9999;9999:9999B:99999999;<999:;:999:;9999:999:;999:;99:;;99:I999:99999;9999:999:C:99999:;::;999::9999:99999999:9999;9999::999<:99999999;;9999:999:C99999999>9999999:<99::999;99999C99999999>:9999:=999::9999999999999:9999;9999::999::99999999;@9999:999:9999I@:999@:99::99:999:999C999999999I@:999@:999>:999:@9999:F999999999:9999;9999:<99999999999999;:9999999::999:9999::999999D:99999999999:999:9999:F99999999::999:9999999999:9999;9999:;:999:<:99999UfffUffffffff9999;99999999::99:;;:999;I:9999:;999999:9999;;;;;;;;:;;:U::99:;;:999;9999;I99999:;9999:fU:99999:;999:;999;<999:;9999:;D;::999999:999::9999;:9999;:999:;999999<:9999:999999999:9999:99999>:9999999999999999@:9999:9999999999999:;><;:99999999999:9:9999:999::9999:999:;99999999999999999999:999::9999;:9999;:999:9999999U:99999999999:<:9999=;999:99999999999999999@U:99999999999:<=9999999999:9999C:999999999:;9999:999:;999:;999:9:999999999999::999::9999;:9999;:999:99999;;:99999999:@9999<999;99999999999999999@;:99999999:9999999999;999:@::999999:<;999:99999:9999:9999B<:999:@9999::999::9999;:9999;;:::>::::::@;::99:;@9::9@:::;:::::::::::::::::F@;::99:;@@<;9:;;f::::<9;::::9<D:::;:::::::::;;:::<:999<9:::<@:::::@:::::99@;9999IU:99:9f@999999=:999999::99999:;:99999999999:GU:::9999999;L<;=@}}{}vovwwyyyyyywwxy|nymvzvwzzusy{yzv|rfs{wphj}yoozro{~|{mrot}{|zbajot||}to|y}||yqpno{{yxvttvy{wy~|zxwx{ubm~˝|lk{}`fbMxtghx鹉ƚь쵦g{y|eZUPP]yunƚЊ|h{~}tRNSaxfϚčtzlxհКѓxZr禝КѬ|OpǸǤК͚Ql俤КȋpK{КLj՗fSˑښКxcVڎКѴ~w~uldb晽}КѭgaawКѢvb~`WКўˈ|vddjdS茶Кѥαm\oZg_f[֟КѤŲSoYg~Wj|^au^ͫ֜Кџ×ǯJ\]djYkfcRoКѥݶfϺrKf^\h^[n]e]КѸzô{bPd\`\sv\[un_`{К}۹οq~^Smp`d_`\}b_[|^fIӔΎКѐۭİu`m_UXYl}[`^YųV`]q]bYКƂ٨Ÿ´uW``_KfYo^_i|dN_]^b_mКѢ٪~ԠتötWc\`cGy\Yy~qcKMa`q]fPʠКπ٫yݩߪp]^`Hs~]`Sy}Ԑt`^LjlCY_l_`iEКђܱÐНϑkg{zd\YU~رλsY_a^@VFa]qh_c\gК|߽yڟ׈Қ—rūԫɾhoZßᤘyDz]``bSInJPb`d``hU⾊КѤМ{߼ݬޯpˊɗ{ܥ䧌ݟ]e_``dF_]D]````aaȁКсޫ֝Òʕ}٢xӇڢ~ݦ嬈˺uJv\``a_@}lSIc````eSvКѿśx߹{߮Ϙ܇ඓᯫږbvN]```cQI`ETb```a`{zКч|w֜Ԝ”ߎ˗~͓qtMvO|e_```bDdlVBb````cRԉКoZM߻pÔ}ߴtzڢȽ]{LvRpw\```aXD`IKc````apϞКѮkW]Ӿۢu௓vިwަⷐiZ}LyUf^````cHUk]=^a```dRʺКv`Oĵr؞؟ڶuþe``RZ~M}{Y]h^```aYCr`RLc````c^}КatZVv_ZrV˘Ҝ~˷\˽h\`Zj_w|Pp[V~\````cISaaF\a```cQxКѥycSmrd]^VhĚs|gʯj~}}}tEk{\`_XdkvVe]Rt`````aWFko_TOc````b^ԊКp^Nl_WkFnY^]T[\E^]]_iOU^`bQkbo[Z`Qhq]````aIW\aK]a```cTΦКbrZY}qv[]hHh_`\^{^[8a`aasz}yYFd_aVore[QO7.3/)QcovYSr|m]````bSKe`aTIc````dWКѥdSqk{hTsFcb_aWhr`U#R`]`aOK;\zdafS׭z\adpa\`fI^_``aUKka?yaf:-^```aI\]u]```G_`````cZzԦКneaIk\fvpBG+P^`]`aQMT`afTۦ\`ejog|^`eSX_``a]Lu`I^m^o8A```bMUab_``cLSb`````fM̓КѨ~aZ_WtQQ7VT[`}]`aS`U]agW۠\`ejۊpkb_cUc`_``d[}^UH}ZkdK\``aSOb[```cO@d`````a`kyКeQW^gJbVaVRau]`aN`TXcgYۛ\`ejyx_h_cZq`_``elw^_=\cg_^``aXKb]pb_`a^:_``````cOКЃkRњTmYo_`bXOdk^`d@bSSef]۔Dž]`cns~Yo^bWaa_``ekbd?wa`e````a]Ia_ad_``eBLe``````bSКјqPoьlNzx]`bY]ib_`bHcOZef]ۏ]aayܫX~w]bYma_``ffykbKVj^a``````H_`_kd```cQ2aa`````a]gКѩvOyycDo^`a[sp]{b`cIudPidfZۘz]a^n[r{]bZd_``ednw^XEw\``````bI\```````ab=9f``````bS~КѦmQpvF^rl^`a\syZte_cJheQۀ`g\܎r]aZݥ_iy^bY|g_``eg۟\dG\``````bIYa```````g;GUe``````cLКѪsVqh{XZ`jh_`a[Zje_bO[fQܴTi\ݔ|r\cTncbq_bWwi^``ekp_fMda_`````bKWa```````g>SQe``````bMК̤tsleynd_cd``a_Ȁ\cd`bUNgQUj]ݜnt]eQ߰h_i`cVtj^`a`xgaWml^`````bMVa```````eJGRca````a^bКѽsdjxsb_`a``a`voa`b`aZMhQkf]׆ru]fS߄m]c`cT߀j^`a]ww\cqsy\`````bNVb```````cS>їNca````bYvКѠtysf^`````bpۮi^``a^WjQݔ^`qvu]f\ᾇu\``eSߚj^`cV|^fZ\`````cLVb```````b]9ѧT\c````dWКq}ll]`````dnuy\```d`xlPTX|w]dnုy\``fRḆj^`eSxiaUv_`````dDTb```````a`7pQbb```eMКr~eu\`````ejp^```fhtqPdYzu_[̈́|\``fUxk^`eS\a}c_````e@Mc```````ab3їVXcb``fRКu{]\`````e_ےh^``fdvOP_}vaR㏨\``f`pj^`fbu`fVtg_````f9Ce```````ad4łQ\ea`dOКуyW]`````gUo{\``ffOVB{rxdXၳ\`aazrg^a_ޗ|`Sn^````g6@f```````ad8ѽO[gddQКѕ]]b_````gSr^``ffqNHkqax暝\`cU}d_dRsa`|zx\````f5=f```````ab;ŀʼnRTejSКeWn]````eRݯ}g_`fcSQhnS~\`eS生a_gVuaRy\```ac8=f```````a_Jp̜lVYNК~w[````eRݐt]`feἅ\vfmZ飩VK`]飖`a_ࣀpTĀ]```bZ@Ae```````b[eҌƛgEКѻo^````dU|\`dkpodGb^Ό|>QVwȗz|QWIֈvi[u_```dNFHe```````dO˸Кыe_```bZl^abzysuyeV{`KVHթ}~V[do_N````gAPKd```````fEtКѷx\```a`zr`a^or_鶕[zx^g[ȻXtO:2fpdYSNLKMMS^gZ-4>]b_``g9MVb```````g>ԅКp]````eh⦍c`R䞋G믽~YߜA* $.ba_`a_CA_a``````abLͬКјe^```gWsLJ>`IdޓP(  K^ekotz"\```eNU;e```````eOqzКn}[```eSۓYfd`ЃDqܮɡϻ 9N(7=<3 ;?~`_`g>^=g```````g6}Кєa_``bVփaJh`aË26JQPF1B\_qa_a_?SMd``````cZ?ϝКs|[``aaޢG  e``````dV9srКы[``eR NcdSkmcQ3:ٌbdQVFJd`````ae6LԂКtl]`bZ@#  sP[stlV7#/!"}vڈ`g]^a`````gAE\ΥКn^_`fe픲+ FaӿF -9O@9[pvmV6AZ7; ڀbUVf`````ePK;~ŅКo|[`eN7sH:Xc0(G]c\F+gSY}b_ٴRd````eQGQ>zКxl\a`g#?zs#'8>:-/rorO|`a```dUFc4eԈКюc]fNN 11ȅ=./6@gvsrkWf```fVHcS8ͤКѮl``\SĨȲW&٦RٹQe``fJC`cCkÈК˃x]eR Ĺʿozrٌ[b`fRK`cPMuКѶz]`x B<glkcagLu`aC}КѲz}aS'9CA=3/29CCHH-;ٌcXhcVncNPњКѸ|vfQ\UjWc\De˷КɒqrYْQSTHf{Кѹbt|^ϭD@MyКѤċ[Z8ӊКѯTVeĒͥКӀ>ƕК˄9ɗzКgTtʖ|К\NW>YʖӋКq^`XTXXPIʘΤК~E```bXD˙ʿКv^]``a^Cz˜xК^M``aaDk˟wКiH```cHcˠԇКэZ```cLRˠϞКђۼߊL```cOIˡʸКѣ谠⼰t]```cTFˡ~КѧɬtEa```bWDˡ{КѥG[````bZD|ˡӆКѦŕڌOXa````a]DsˡіКѦuIXaa````a_Dvˡ̭КѨ“ՍRP]aa`````a`DqˡĈКѪΞҘ^HUaaa```````aFfˠzКѫ‚PIVaaaaa```````bH]ˡxКѮַ̠gMKX``````````````cJYˠӆКѯ߽ҥj{WV````````````````cMT̖՝КѱĤCQbx›zlx}W```````````````cQK}FKKGGGGS[^~КѱťTd`[DP```````a``````cVE߈Y```````faµКѳŇ`b`MJ``````_^`````a\Dɥxnhfgjr_X```````fVКѲfea^ٸD`````aVCc`````?G[HHKMPTY^```````_ZVQOPSX````````fRКѮUghB`````bP9a```cIN]````````````````````````````````dSКѹz}~{{ŴQj@`````bKDXa`cSIc`````````````````````````````````bZКсћi?`````_HQNba_D_````````^`````````````````````````acmКх򾶴kS````aVK]GbcJSb````````_``````````````````````````fZКёp~{Y````bOSbG`\Ha````````````````````````````````````gRКѠ˄e````bG[dKZNRb````````````````````````````````````fPКђ吨ѥfݯXLS_<`bSRI^`````````````````````````````````````dTКѝ좴ʢkټl=KY[FJa`````````````````````````````````````a]КсɧپĆM16\_````````````````````````````````````adkКĨ͊ꖃ٣n>\HLX``````````````````````````````````f\Књr뙠١<:UDBM[``````````````````````````````fTКѤΩتُ빞p_O[```````````````````````````eSКȭ縱ԗ0ʇp[NNPX_`````````````````````bWКѦ}tטܙ}Ӆ_էZRQT]````````````````aa|Кʹj%`޾ht "帓p^NPBS```````````edКήoMփӣﯥپwK```````````gWКϴv*DԦ걨걣٥"&ᠪQ```````````fRКǩxy_!Cۢݵר뺑6W˶ڀW```````````dSК}%!Tܢ⿁ұ+' ˜̩z[```````````b[КѤd)Cݢ઎̶ҹ !!/𦕺sq՝t_```````````acjКі {з|+TJ``````````````````cVКx.qlƙ[c-Q`````````````````a^КDŽڶ{ԩ߇}넡ꯠYͬ_eJ7``````````````````diКѢݶ߀nXyۭj㿡!$-_b_&``````````````````fYК೮׬џpɳa%!&,``dD V`````````````````fQКѷSƱj $ĞОb=]NR`_a\8`````````````````dQКɿwѬ뾓ϵwr /Neb___e3`````````````````bXКѕܸˆiDb____cS\````````````````abrКшޡ$tû~!,b`____`d A`````````````````f]КѱѮc $=h{yn71+gz>d______e@&`````````````````gTКъǡnZ@!"q[O 4~T S'!Rc______a\`````````````````eRК֎e B\*9 P)?!+a`_______h*N````````````````cTКђ|'c]S࿑ "$#&Ub_______dI3````````````````a]КѸ4 c Aq1eɼœ"n/h_______`a'`````````````````dpКўög2 ]ɾfj1*i________h-]````````````````f]Кь٧PR|W`zKZb_______eBD````````````````fUКуɿ =Ŗչǀ@e_______cV<^_```a``````````eSКЂ˿ν Rƶĩ7d___kw`a4]a}```````````cTКyϟ Wmk.3<Ñķ@___ery=]sz`````````a[КɼɽѴxɞUp *Ƕȟ¿YTa_J`````````abrКѫȤةŌPưȿŞݾɣxFd_|``````````e_Кҩߩќ絧ٱ΂D˽ξŕ̿Ɔ0i_``````````gXКի᪖ګ܌҂3/ ̧ټĕƿƟ'j_~``````````fRКլᬖѲîx$= ˦Řʿ°@a`c{```````````fRКլ᫖уԣǐ)A 驽š׾jMd`Z9TOb````````````dRКլ᫖Ŀg_``r`aКլř᫖ΨϷإ\/"Ψ߭;斖_`ٻКլ踖᫖쨖쫖ּ㡖薖x˖gʖ柖λ閖Кլ՟᫖ݘ˖뙖ﮖȤߗ̀іkіЦКլƗ᫖묖𗖖䖖ޖ¯񱖖ٖ椖Ӝ_`ǖȖÖКլ᫖ǖ–ӖѲܖ̖ˑ󨖖_`}ưָКլ՟᫖ᗖ–ϫ𘖖斖X%KvÖ_``gUז׻ҠКլŗ᫖昖薖斖і𖖖ٺŖ陖N[le___```gUȖԽѴКլ᫖ܖ򯖖򟖖Ö򖖗Җʡ𖖖–٥ἢܖea____ʖ_````gTӴÖКլמ⭖ϖÖϘߖϖ٬______Ŗ_````gTԨ̖Кլė֯ՖȖ疖疖Ζӕ斖˖ٮז______Ȗ_````gVԵÖКլ󱖖㖖ǖ𖖘ᖖѓŖݖĖ_______````gSƖѭКլڞ蜖񞖖ɑܹҖݛ_`__`__````gUǖЗКլŗ樖ϖ˖ŏՖ񶖖x____v_````gUΠϟКլﰖ˗ߛʏꘖ᝖זӜ_`}```fXזѼ策ɖɖКժܝҹ쉖˜ڬǖҺΡݱ͹_````ec蹖峖ɖɖКӧ–񦖖}맖̀ϖkϖ``acm֜ږ沖ɖɖКᥖꪖBݖôם⠖斖쾗}ŖjƖ``a^ŲЖ߳ɖɖКβѯXIJ;ޘΪtg``bVКэ]`__t߹e`b```eSȦٸКpUb_yŚl__________``___`f/d```````a``fSбͲКrZe_šޚ_`______`___________`dI`a`````````f\ȠКѧckťa__________________c`=[a````````a`w騖Ϛђ!/ťh________________`dU.\a````````cT԰ƚЌħ______________`d]@""-[a````````fRƚkkkkkkkkkkkklmlbUOPSQJsimllllllllnk _mkkkkkkkkklmldWPOQSKMhmlllllllmj{vskkkkkklmmkdWPOQSNH[gmlllllllnfkkklmmlg^UPPRSNJSngmlllllllnklmmje]VQPQSQJMetffmllllllmh~md[URQQQNJLYuxofmlllllloe{SIIHILOWe|sfnllllllltưƤƺƘļƳźĸƿ­ƷƪôƻƜƽƜęƷĵŞƠ~ٳƹ֟ƺִw~z_ٺ꺉ءԾ®}oiabsջڳךɺeagy΀ڮ량}ʘᆘڧհԉԹnڧ禝͓Ö֫aǸ֥֞do俤՞̋Y՘Ӡžֹ~bː۷˳џѪןz`ڎؐىНɑ΅{i晽Γўֲֹwv|ӡʰ֓y֜vk˞Ԟ՚||͂{a茶ĕԇտqַoֶt}d֟Žgӊm֝l՚sw⩆yͫ׺ßԫ[ɰ֪qr|̓m~zc򛁭įݶhdzӎ\ՠж~sr״spګr}h܈͙yc|Ѫ֡qvqՒrpԈuu~ьݤseԋwӫ{tvqytp۷s}XӔȧёwԇtil²֮mԪӼ֛pvsnנjurٍrydϑk۾vut\ǧȨ~nԨիvt|`vrsyuqŘѐk|١qvzUϠ֖qnդ֞٬{֭\_wwr~aʠƓ¿ŸԊrsvWԝֳrvgԸՖ֣㭎vt]τQnttvMʣ֯ۦԳ୦zך|qnhԸܘʒ܎muwsN׮kUxrtzri좸Ѳ绵ⷴյϷܢnڹΌծrvvygYψ[byv|uva۲ž߻ѯɊŲdzöܚ۵r|tvv{Vv׮rSrwvvvxwƽũ亱՚۴罴罴Ěב\ՓqvvwuNφfYzvvvv|cƄٻϵƱ߶̱vӓ_֯rvvvzdZ׫vTgyvvvwvʁϕ乵㹴ճ۵䭋Ԑ`ԓa|tvvvyR{υkPyvvvvzd¸ɉo_ϵyֳ˱z罴բsɘ]ԓe֓qvvvxmQׯwZ\zvvvwxzɼęУۄks龹~DZ³y뾔̮{֭o]ՕiӹȶsvvvvzWiσrKswvvv{dʺuaӿͦ~庴廴Έ|vvfշo^՘msǦ̀svvvxnRץue]zvvvvzeÎuoiեӓtnfܷ⺸xòrvotc֞pk՝qvvvvzZfwwVqwvvvzdɁƘyfΎ|rujŵⳍ|ȚmtȶSטqvvm|j}֨rfմuuvvvxlUӉuhbzvvvvyhɋ̫saոׯtlVԳՉnsrhգopSsstu\qȢahȺٱsvxdυypoֲudπrvvvvyYk֤qx\rwvvvzgÞxnn֛ՒptYթπtvqu՚so@wvwwbrΛnVϩ{twjʧ}qebC7=82e{nf֚rvvvvyg\}ԿwxhYzvvvv{aư|fЃɀhV{ԞyuwlӍve?zvwqrәwOզՈn\D5V]m|}bidFts]72Gպu}tvvvvuUpσsxUqwvvvzmƂ߱tbt۷roAәtvxh΄yXB}vxk{nՖ~{NճX16EO֞qxz]xZ>rvvvwsYwrܟqvxj]yvvvvvY˖v]SԻs|rZL*avrvxbշ]Hqf]|v~Wxmbqw{W~wqv}MdչuuvxgO΃xMw}G6svvvxYqrګrvvwWtvvvvvzouɞ}xXնq}QV4`nurvwd֭]gtgvw~Ttsh֨qw|Snsu|YMջuuvwrBԑvXuІsEOvvvy_iwyȺtvvz]fyvvvvv~YÂ˺ܝvnձtkddCjekurvwg֩uhykrxRqtnǫqw}SgԋyuzdLջvuvv{HբshY֛o|]qvvygbypvuvzaO{vvvvvwwp|c׮ְlvZyjxfXwrvx_֨vd{|gzRo{{qw|T֕ttzk[Ծvuvv}RfִsuIֱqzusvvxm\yrxuvwtGuvvvvvvz`Ãe֯hntvxhJ{sv{O֭x][}~UlrwzW`֝nsykiawuvv}Sky{Gxu|vvvvwrYwuw|uvv|P]|vvvvvvyeЌcڢ`rvxkJ́yuvyXְzVY}~Torwx[z֨mrynlXyuvv}R΄xVbςsxwvvvvvXuvt{uvvzdilzxvv~dۚu֠qvvvvv}Pm̀svv~RgԒUybbvx`vՠqvv}Wt΃sv}W~w}Ptvvvv~FR|vvvvvvvw{?cq}xv{`ܗlֱrvvvvvN_֙qvv~VݞW\Qq{V֥qvwweitxtkpubfЈsvvvvBM}vvvvvvvw{B`q{{btuytvvvvPxֳsvv}Yx\zYlwd~ܧqvzim|t|`exw^Օqvvvv}AK~vvvvvvvwyGǗdg}exkшrvvvv}U~tv~Xfٿd`mbqv}^{xtTxS`֡qvvvwzEK~vvvvvvvxuWxhn`方֟pvvvv|ZlԐrv~Yq|rYԮk\v\ھvwulzhpԭrvvvyoNO}vvvvvvvyquɊ|Sշsuvvw{d|k֤qw|]jԉloKrt{ðLdkgclRkRdոtvvv{`UW|vvvvvvv{b}tvvvyomjֲswyc{a}Zǀw[jT͜jpZcu]tqܻwuvvOb]|vvvvvvv}SǼǁ۟Քqvvvwv`ԾvxsrtWmćqst\skbG9W_TKEA>>>?EPXI&>3c`տyuvvF^jyvvvvvvvJֺɅձrvvvv|YyvbJqƕw\O2   %zxuvxuROtwvvvvvvwx\ʺ}svvvTgǡ\ZFzfVxˢeĂH&  K^ekotzNtvuv|`iH|vvvvvvv|bºË՛pvvv|[tg~{]pQbɼίοȻ 9N %((# 8+g[vuvKsJvvvvvvvBẺʂytvvyjsxZ[_WҿË'"054.!BXApxuxvLf_{vvvvvvzoJ巺ė֛pvvwwj; 4eˡWٸ|A%6::6* lmhzt}WmOtxvvvvvvHoиҕ{svv~\) 9эټ~u*8>?:0 R&czu~EvK}vvvvvv|jF~~צpvv}\— EaO3EF@5" :bfx{`FG[|vvvvvx}B]Ƀ΄rvyoů7   q;9JKF8$%}bdv~Q`txvvvvvOTmÞֶsuv}a& >s[? $=: %oD]ɂøm_ʍY|BNjЩ~R榌GrÝuˏcKιԥ}>ĈhÿºoNʁ]ürGbv{iMHiNJrQvmcclcZÜ}ǺļǝOvvvymSuŹļOrvvxsRȺÇcǻͺh^vvwwTz㸺ɀxùþºvTvvvzXq帺Ɇľl^vvvz]b为ęϱ̷cZvvvzbY帺뮸ۦձٿ_lvvvzgU帺簭뾣ᾏYOvvvvylT䷺džگbOovvvvyoRⷺȈŒÙdNjvvvvvxrR᷺Ɣ͡XNkvvvvvvxtR߷ÓѧgLZqvvvvvvvwvS~ܷΝˣnSQgvvvvvvvvvwxUu۷ĉɦdNThvvvvvvvvvvvvyXnַʁֶ̩kUOYlvvvvvvvvvvvvvvzZiηȆ߼ÕjQBH;jvvvvvvvvvvvvvvvv{_cǸʗԾݷP^izծuOAGR\`yZkvvvvvvvvvvvvvvvzdZyRWVQQPPW_bԽ踺g|vp9k|~zmwgmROZ`^]bsfbvvvvvvwwvvvvvvzjT҆nvvvvvvv~tƺּwyv>HYlvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv~f񑅤wС˲l볆XHGQpvvvvvvvvvvvvvvvvvvvvvvvvvvv|f̘}tz毯խv1„h\X[aluvvvvvvvvvvvvvvvvvvvvvykƥhg}ьo秊mY֪d^`frvvvvvvvvvvvvvvvvwwֶu#KВYY\nn} $幗wgX[Mgvvvvvvvvvvv}wϫj>^ö| p[vvvvvvvvvvviة7qxlzx}t ܜcvvvvvvvvvvv~dʣZ2ǏmzgВ}3W½~}kvvvvvvvvvvv{gAԒmX˞ն) —xpvvvvvvvvvvvyp^&jܕmdt࿬Ȭ0웎mkɔrtvvvvvvvvvvvwzCӐk}bοz І嫓Hbuvvvvvvvvvvvv~k| %XỌi[|εfcpRmĺXvvvvvvvvvvvvvdr'7zrr_UeNA  ľWvvvvvvvvvvvvv|eЕ #Vk˜~u.Jyi_lTvvvvvvvvvvvvvyjƥMPԹjޮR#_>-  JOvvvvvvvvvvvvvww칗UwqO8^ב_& Tvvvvvvvvvvvvvv}uXޘhfˮnp_tǴs zsvvvvvvvvvvvvvv~hΰrqD^젶ʦȿV 7|Yj^vvvvvvvvvvvvvv}eΟڕg5 *Nrڏǫw*% vvvvvvvvvvvvvvvvvvzi۠"PrVMq}ƽ(+ bvvvvvvvvvvvvvvvvvxsϬuʡѓ[WZm{kfgn椞V¢ )+! ?vvvvvvvvvvvvvvvvvw{}ѮؖWOd#@eݿ g,)))))))**$vvvvvvvvvvvvvvvvw{d/ kCCCCT)TCCCvkCCCCveCCCCCCwVCCCCCCDCCFCCCICCbvCCCCCCCCMCCpCCCCCCICCbwCCCдʾCCCHCCS/'.+))xCCCT)TCCCvkCCCIvvfCCCCCCCCCCCCCCCfCCCCCC}CCCYCCQCCCCECCCCCCCCC~CCCМʇYCCCCCCCCCCCC[+*))))CCCT)TCCCvkCCCvvvfCCCyCCCCCCCCC\CCCCCCCCCCCCCCCVCChCCnCCICCCCCCCCCТCCCCCCCCCCCCCCCk))))))YCCCT)TCCCvkCCCvvvfCCCeCCCCCCCCCDCCICCCCCCCCCCCCCCICCtHCC{ɍط|CCCCCCCCCmCCCCaϷCCCCCCd))))))hCCCT)TCCCvkCCCvvvfCCC~CCCCCCCCCCCCuCCCCCCrCCCUCCsCC~CCFCCCȋzCCCCCCrCCCCCCWŞCCCCCCU))))))CCCT)TCCCvkCCCvvveCCCCCCtCCCCCCZCCClCCCTCCO\CCGCCLcCCeCCjCCEzCCCSCCO]CCGTCCC꾵CCCKCCE)*))*)wRCCCT)TCCCvkCCCvvvfCCCCCCnDCCCCCCDCCCCCC{CCCCCCnCCCCCHCCCCCoCCC̺wCCCCCCnCCC\oCCC|CCCK))))GCCCCT)TCCCvkCCCvvvgCCCWCCCSCCCCCCCCCCCCCFCCIPCCDACCCC|CCCCCʿCCCFCCIPCCDRCCCCCCCüCCCC{|yCCCCCT)OCCCvhCCCvvv~jCCCCCCCўPCCCCCCCCtCCCCCCCCCCCYCCCCCCCCCzǮDCCC=CCCCPCCCCˣCCCCCCCCCCCCCCCCCCCCzǮDCCCyCCCh׿WCCCCCƣsCCCC]VCCDCCCS)zCCCvCCCvvw}vCCCCCCCCCCCCHCCCCCCsCCCCCCCCzCCCCCCCCtCCCCCCCCCCCpXCCCEf^bcfCCC`]MCCCCCCCCCCCCCCCCuCCCCCCCCCCCpICCCCCCCCCiCCCƢ`CCCCCCCCCDTCCCPUCCC{ꀩCCCvvwzCCCMCCCCCCTCCCCCCsCCCCCCCCjCCCxCCCCOCCCCCCCK,CCCiCCCw_oCCCCCCCCCCCCCCCCOCCCCCCCKXCCCCCCRCCCuǢECCCCCCECCCYQCCCRCCCvvxsCCCn캘vxCCCCCCsCCCCCCCCƼ鼼tYo8իuYoĦ\j~oHJHE¼|üvvyjݼvCCCӼ󺼼󺼼5䷺ƭ/ؙ))Eմ}vxvvv|eqECCU%*)rƾ踺mɻD))))))))))+*)))),${wvvvvvvwvv~eDCSCCCC&+*ļ긺vʼm)*))))))*)))))))))))*+ uwvvvvvvvvv}oTCCCCHisPCCCCC+6Ļvʼ2))))))))))))))))))+*nxvvvvvvvvwwcCCCCCCCCCCG&%»𺹺xʼ>))))))))))))))))*+%qxvvvvvvvvzhpFCCCCNdſﻹ˽V+++++++++++++++-*5qywwwwwwww~eĶnnnnnnnnnnnnnonkeccddc)yij«snnnnnnnnnnonkfccddagĪĬ|nnnnnnnnonkfccddcbxĩĤŮnnnnoonlieccddbcnĬ¢½ưooomkifdcdddbg|Įľ¼ƲskheddddcberįįƵjaabbehp}ıĵ̷ǽ̱º̖̺˾ƛ̽Ǿ̯ÿ̞ğĿ̘ȥ|}̽˥}ò̤z}nX[p~tnuwnklr~}TZVA^t\RS_|꺉õƆu쵆cUqjxlgjq{XNJDDNgcXõŁzkV}j~unlkoqwx{}~~}{cGDHTf|Vnŵƺnth~{wtrrpmooqrtryZ\հƵƍm~qLZ禝ƵƤmuzD[ǸǜƵÓqpmGk俤Ƶƾvl`Bx~Ƶƽ՗um~XI˒ړƵƷzkmunUOڎƵƫulld\V]晽yƵƥzlyY~SStƵƚoyeUlSKƵƗ{ljeUU[VJ茶ƵƝ^O`}NX|QXV֟ƵƝжH`MYlKZjPSfGͫ֕ƵƘÒԸu@zxuOPV[M\XVH_Ƶƞݶd¨{aAsnq|YPOZ{PO_uOXV|ƵƮtѻƳiUEoV|uoOSOadOOd_RRz|ƵwөamqPH\aSvVQSOlUQOj}PXAӔֈƵƉҚٷdS^QJKywM\ukOSPMqnJRPqaPUSƵƼ~ϕ׷ϼdKqSRQ?qsXM_suzQQZk{VCRPyPURkƵƚϗnɍТócKToOSUJ[P5PSSSSVGljƵp~RDp|wxiҼ͋xxΌexϦgĻVSSFn}NrlBkiMPqZPSSSTM:bqRGBUSSSSU]zƵWdNIpzdQMcL̶ܽqȇ~`}¿OZOSN[QekE`mOKlnOSSSSU?HySS=OSSSSUGzƵƝiUG]aVPRIYckoYnn]mkkmXiv;[iOSSLV\eJWsPH~|cRRSSSTK<\_RIDUSSSSTY␺ƵjvPC{}\wQK[=}yu]MPPHnNO;PPPRLhmmonDH~yPSTFt\U_OMzRGrZv`PSSSST?KnqOTAPSSSSUIܯƵYaMMk`eOPY>tzZQSORjPN/SSSSSjmikgM=rVQSK_sbWNFD/(,)$FU_dMHaj_rPSSSSUHAXSTI?USSSSVT΂ƵƝzWH`[iYIc=Tm}TRSKYaSH0VSSO`zq_i`S9zr~_MA1&=AKVairWEJF2P\O@'$2t~RrXQSSSSR#'18wmOTUBYS?+<=YYdePSSSSUBIVhOUHCUSSSSWPzƵƹldOHvNyqEeJ;czPSTFeXW>:XSTMnsrGhSV??m2?IESUDorOSSJJaQB|xN8MlSlRSSSSTK?PlvPSS=YSUKqstI|jPUI2]?DSRTERvOSSPAjR=^S7JMgYQSSSSS=PVSRUDGUSSSSYIܯƵrmQB_`PMfGEVsK;?O`kjFaK+&&*fSYBCYSUIwtsYklOTNApk`eqXQSMBxPSSU<}sRDIG%IaPSSSSU?IPqZPSOi}RM:M >SSSSSTIAS[ePSU?JTSSSSWHυƵc~QQ8TTkb?N2 bT~vPSTCoS8WQUSLXSXDrsgWpOSTV[}UkOSW5d|QRSU@RVR4|vH,,PSSSSP>SP|mOSTJAUSSSSSYU娛ƵƖyjSC<PWdO?6FSywPSTE}}@3O]SVSYBpvdUqOSVNwsS|uOSX;J~RRSTI<[T7gSX3&PSSST?OPdvPSSS=QSSSSSUNƵdWTA_|OXd`:=&DNRrwPSSG~vBIl\SSYBkwi]sOSWKVYk~PRWCARRSSP6dS>Q^P`19SSSUCJSUQSSUAHUSSSSSXG܈Ƶƛ~lSNpzQKcGG0JHLRkvPSSHsRIqbPTYCixlfvOSXJ]`\TRVHDzSRSSV?epPI>kN\VAOSSTHDUOuSRSUD8VSSSSSSShxƵƵn|WFwyKQX?UKTIBSduPSTBysSGsuJUYCfxqs~yOSWJcfQ~ZQULT]SRSSXJU|PR4yOVYRPSSTMAUP`TRSSP3RSSSSSSUCzƵu[G}ƑxI^M^QSTJoyUAEXXEcsvj~PSTSrtsMmfPUMeMTRSSXFd[T>G[PTSSSSSS>RSQ\VRSSUG,SSSSSSSTP\ƵƜxeE}phU;o`PSTNMh`PiURU?d{VAKVYDnk{b~PTP]RzNaiPUNgbzVQSSXFOfPK6eOSSSSSSU?OSSSSSSSSU52YSSSSSSUHtƵƜ{]JfleGUSSSSSTPYƵƳlZ`fbyUQSSSSSSPOSSUSTM;ZAOXJlZY}PYCc^PUSUIu\ZPSTP^`eOUMYgOSSSSSUCJTSSSSSSSUH7ƌDUTSSSSUMmƵƘjgctXPSSSSSULpnZPSSSP?v[BgPP\ZY|PXFodOSSWFlZPSUJjV}PYDYrOSSSSSUAIUSSSSSSSTP3ƜKOUSSSSVK}Ƶgk]s\PSSSSSVLRfOSSSVC_\AEKyft[yPVP^gOSSXDr[PSVEbZTGn^|QSSSSSU;IUSSSSSSSTS1ƺfGUUSSSXCƵhlWudOSSSSSWJ[|PSSSXJVaAKMhf[vQOjmjOSSYEb\PSXCVrPSS\URSSSSV9BUSSSSSSSSU.ƌKLUTSSXGƵmiQxnOSSSSSXDb~ZPSSYI_e@nDMi]nTFkmOSSXJY[PSXJ_SX@^YQSSSSY2;VSSSSSSSSV/ƹxGOXTSVEƵ{hK}zPSSSSSYAPiOSSXKwmBF9h[fVGhqOSSS\XYQTQbgkRG}[_PSSSSY/6XSSSSSSSSV3ƲvFOYVVFƵƍPQUQSSSSY@[|PSSXL[uCf?lVaS[vrOSUJyaVQVFUTSVdfOSSSSX/4YSSSSSSSSU6{ƺKIX[HƵƾ`K_PSSSSXBvhYQSXJ^G|EyU_FiuOSXFsTQYG^rT@UoOSSSSV04YSSSSSSSTRDpfLMCƵƶwhmOSSSSVCd|dPSXLpPtdqV^JwKASLSSRdql`Ig~ivPSSSUN89XSSSSSSSUOaߔƼa?ƵƱe}PRSSSVHt[qOSVPV_eT;QQswk6GK_xgjEL=be[FR}QSSSVC=>VSSSSSSSVEċƿƵƃXQSSSUNfUzPSUZsgcYeqWGeSAJ>jlJNPTRCmg}SRSSY9D@VSSSSSSSX;tƵƭofOSSSSSV_STPjZbKzh|Oy¾fgQYLmKbD2+SZPGA=;;;M8QTSSSSSSZ3X̄ƵƦjVPSSYN' 6Ɔϻ~u0I`kmdP/R#XURY1S5XSSSSSSVJ2qqƵƃ~qOSSXD Bdj^wyo[9:\\~TVD=7?VSSSSSTX.BㇾƵk[PSUNy4  |"uVfx`=%4%%}_ZySYBWQTSSSSSY8;RܰƵe}PRSXSy$;nR}<  2?UB?f}y_<D_>B ꗄWuUJ`>XSSSSSXC@3yҀƵfkOSWDľt/èЪd?Acm2+OgofN/k\cꕅYqUDqEVSSSSVG=F5zƵo\OTSsǡӻZF%+>EA02|䄇UnCkRRSSSSVIUH0ܯƵƤa}SSOqvQ ĿʬĻb&io@sCVSSX>;RU:cτƵ{huPXGܳ m텇SaaYNTSXF5SUDCtƵƫponPSi JؾCÂRKIVTY^xƵư[fujUےl~3g3D{ƵƛzONRs0ΜᑸƵƥtJݝ<[ќۯƵƷ޺qÇ[5ԠͅƵ|Ʋ̝u/֡xƵ`½g>nנ~ƵUýſi:Wmr`@3Oנ⑷ƵgżCSMGILF?ءܰƵrɿžř:SSSUM;ؤ˃ƵjʾƾCPSSTP:tئvƵW˷ƿ_BSSSS;bتxƵcŽýo=SSSU>[ج⌼ƵƆƾþeGSSSVBI٫ݨƵƌĿƪƱZASSSVD@ثʼnƵƜৰў̪ѷ}RNSSSUH<ث{ƵƠݩ൜صO:SSSSUK;ث{ƵƞѦX;NSSSSUN:uثƵƞŎܹ[>KSSSSSTP:lجƵƞØ|N;LSSSSSSTQ:pثڹƵƟ’Ŝ\>BPSSSSSSSSS;kثтƵƢΛcC;ISSSSSSSSSST<^ثyƵƣݽzX>=JSSSSSSSSSSSSU>U٫zƵƥֵ|dH=@LSSSSSSSSSSSSSSU?P٪⌺ƵƦ߼۸dMAI7KSSSSSSSSSSSSSSSSVBKڠ㧞ƵƧѪDEAABDPY_ƾƵƧҩIVSO1ixzuksdjQOY`^]ao\ESSSSSSSSSSSSSSUJKO(-MRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSVcƵƹÃޖMHλji/B7>KSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSYUƵƑ[gނӽkB@l<46ALSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSXLƵƙ|oǜg볈WE??OSSSSSSSSSSSSSSSSSSSSSSSSSSSVHƵƾulrۧɢq#9ӊfTGFGLRSSSSSSSSSSSSSSSSSSSSSUKƵƞyc訂`}uȄiݟjf զ{VKHIPSSSSSSSSSSSSSSSSSStƵëg*NŇvSxUXhg|{ +ɩ嶑mYGJSSSSSSSSSSSSSSSSSXWƵƧէiC /GZa`XQPL*$!GLqֈ 1//////2!)SSSSSSSSSSSSSSSSSYLƵƃʺdDDB&$yf_  *OxW [-)0///////-SSSSSSSSSSSSSSSSSXHƵwYRKFa,; 6Y꼜 A/////////3GSSSSSSSSSSSSSSSSVJƵƇh)jb!XoTb͘ !*0///////1%3SSSSSSSSSSSSSSSSTPƵƮ8 i Do%@_{ʧџ! )z(3/////////(SSSSSSSSSSSSSSSSSViƵƖj4 caN//-PT~{sSSSSSSSSSSSUJƵpƷ \ut06@іÙ:///6GN#ThoSSSSSSSSSTOƵƽƫnۓ\p -ĩ֦Ȝέ\*//z%uSSSSSSSSSSUkƵf9999d999ƣ~ǒtg999WԼԫ׮ڄ&2/k999jX999cSSSSSSSSSSWWƵf9999Ne999ƕ給xkq~yx999IʕҞՏ'3/p999JV999HSSSSSSSSSSYOƵk99999h999ƻ٦|yy}9998/ ۲ѝԪ13/q999OT999gSSSSSSSSSSXHƵm99999;l999Ƭ999x'= ײԡλN//s999O0RSSSSSSSSSSSXGƵm999999Rl999Ԧՙ999)A Ԭ•t'2s999O/,2HDUSSSSSSSSSSSSVGƵm999b999l999۾999ػǺƦ3r999O/bSSgSTƵm999?99\=99;c999O/LUUUSMUUUJ99@cƽ\=9RwUUUwƵm999҆999Tl999\999999999RZ999~999K999999`999999999RΨi9999999999JM99999999v999OP999O[999J9999999cƿ99999999v999aƵm999O999l999<9999C`F99999999G999999N999=9999CaH99999f99999K4-42//q999O/R999SU999<}SSYM999uʈ999u999mƵm999x999^l999999pt999Q99G99z99;999999999x999ǁP999999999999U2/////999O/R999SU999SSSYM999op999Ɣ999mƵm999L999o999999999999M99`99k99?ע999999999999999999999999f//////]999O/R999SU999SSSYL999o\999Ƥ999mƵm999:99?t999999}99999999@99m?99tޠz999999999e9999X̳999}999]//////l999O/R999SU999SSSYN999ou999ƒ999mƵm999v999d{999999dp999L99k99w99=999ܝx999999j999999NŞ999~999M//////999O/R999SU999SSSYL999oɕ999h999mƵm999K999X999F99CL99=99C[99\99d99;؛x999J99ET99=K999齵}999A99;/0//0/zI999O/R999SU999SSSYM999oˠ999^Ʒ:999mƵm999:999999d999999e99999>99999gҘ999r999999g999Sg999u999P////L~9999O/R999SU999SSSYN999oͿM999ƸI9999mƵk999u999999<99@E99:99999u99999י999=99@G99:I99999999999t99999P/N999SQ999SSSXR999oƶ9999߶F99999mo999mӳ99999999Ƶh999J99999}9999pĩ{:99989999J9999ε~99999999999999999999sĩ|:999r999`ѸN99999k9999T{M99:999O/w999Sw999SSSX\999k{999999999>999rv999g99999999Ƶc99999999`99999999999iV999;d^eea999X]Ox9999999999999999n99999999999i@999999999`999|X999999999;R999JZ999v_999SSSVf999gD999999K999}u999^99999999ƵZ999e9999C9999999Aƽ1999aѸ999v^g9999999999999999F9999999AQ999999I999m;999999<999SV999L^999SSTPz999]跒nh999u999b99999999Ƶø縸yaKaƠ=ӤnPgxjBDDJZSSUJe999ƵƵƆ::ٜ//JָXSUSSSWIƨ^Ћ;99GƵm*0/»q˾W//////////10////2-VSSSSSSSTSSYJx:9J˺y9999Ƶn-22{y/0//////0////////////1&RSSSSSSSSSSXUƯK9999>alG99999jƵƞ1D}˿A//////////////////0/ OTSSSSSSSSSSo[9999999999u*?u8ֻ}n!<`939͗kF7]q'q4qB*7L3_p7OJ>"Э%a\!mwB+33?k r|cϥRB[׏ 'RT,|:/PB!Pm67VZXh_illm hx:O+Aeۆi6%IojwW*XZF9L >o嗟焠k "\T^#p!yȻ}!G,NLۆ"I͛+Wo-.^kZbpD. .|ٳgO PO, DBtwbp.9eTuDU|<ں@p8ȌBR(߸֟?^S)47PB Y^7V+9a}{' ANr2)!zx<>98O>s3 ˂8!TLbY,J̮zMJ a<8@rBQ]F>~rT{72(ȥt\6Lsg{PGDTu~3,eiۈG"0=}(t<D4x 1UiY0, n5 ĩ1$QRp/dQD볳xbz":~0B*ݲ0ɡ!mzh|vshW~C˄>ؗK?0_v;; h6\.1L`mv@)fWVl9w!K(j8;9|*öA:˹8aPjTYF2SƊ3? PWeoNf;K(X(O=ϟ:}zB-Jss fT kkA"JI|_MJ.n//cP3g`$a]Nb5jg''Q؎(H7ޅ,I ^~+3" m d0ͽך!yBz  pu~k[[%E1lƐK$PdIj6T /cx i8{NB n.-A7Mt{$Ir]b: UĐsNJb., `qRitzxsx ey@Bzpfb_z:ޮɍETmܸwDXߵ#c$db`f kk&HD`-oɠJ!ֈP% 'ܗOǷoy #ȏm1ivRL{%"GFůDU"Բ[,+~B'D4L2<{ر-EBX.\sM,!L"LgCL v>7d4+l{-%Oֻ#ϣ`Te;G*I(jkaVC\4[["I(;΍qb++0l3 )SCC \6 Ktݰ'!`_/wϝ=k@8,FB*C2#o͑h$R: Ƚl(R2#EK4V$j4p{i ##ȧR((ŏo7|$!cmk w߇$q"f4U%􁝢Xoԕ91:Ա_&%iUca#@ϟN( .PFs b^'xȢ<⚆Loy[2s*br[$zy. &We,85>X$Q b~m LEAʵ@$Ȣ\2k4KKHh$}~*d +Ό<53: C2ćAH@,.$?:)~ܹ.}&iWggvK$O7XX_eۤlb8w/oj Nb,Zgfplpps VVu}#(2^y h\2 q9,A*E*8ोA)>z zE-GP 0"cX\VVzukNfv1`?yW y,8htrPx s}d$DA Ӷ1R(ݔnRT]DU5砄 nvaY]l6R(>y ?CC-B,/ssSS2lX 書R&h$FU*8Lۆ$Hy95Rt s856s!|8wںO<}띞s(E&Prɱi,BK׹eF[k]hRJ}BL(X1HOsnv>!qx.cVs]4/UU"覉Jzb&Y1.>ێYprt.np!®%E0o_ UD0r,c0c Ytۘ_]E6Q00Sccz 9xɁW=s_Ɛń\2b(Xo{~턼sdgONNUM mk"p#a|ޏb%m]G8Hh/IP.tU#]:&H!_A݆8HDp,̭br`xKPıc`V ui)aYh:r#M&J%dIޅ88>< Q\.@TMXd!p>Z@8GD>f!&th^ͳݢ `qcí+V0X,Qr]q7Q9BQb1pNǭdSUHFKK>W b0B0^,$FyHKiQCр$Pх583+2"ny~H>+_el0, OD]ÈήĄֻ?u.:R&Jq Q#敨xП_^tVmASU 868D4t<RȢ"G`6\*d,;++_[{KL"~>@[vzn !0mk p\ƙ]C"9Ip6닋iٞ!", w PEN|Jj_ ?C6J)jJ4U& rw^g6TI`6&Ȳg?ýJ=@_hUo癑 rpCA@1F,,aXa6%ZcHFB>~nuĄ.]8}ݲ* bZ 6uȢz}J4>u Hma ]]\Ho޽Z'z5 vZ (bq}X [* w^`0N1hb*DY>D˷7 [^{n sXWN/>͘IZd0 i;n.-a mvp/B,|'qnb-|_vM94EA)٭?0(G"h:#J!"FUX V x]:9˒-0LNQ#xdh}Y!CKzF>~˻8|*E|v-%ossxcve@{ 1O=@Et{\{^< .;,dQH)//,I$v|n. ࡢ8rd&} ֻ@1~C33'j`!!(]\Fd43896b|y|\䥎?))~'D4b:-4;ȒZFfmKB08#Cz?ȥR=ցBv ֻ .~zFHضfi (fݺ!|w8ûU`$ǎAu h;wpocJ̓0ƐO&wml68}xQ!GѨCPa.|3 n$QJ++xk~wWWqaj ϝ= pQHqqz5>Da0J9DQD^Gײv}dCE f}6\ "Gp&L2Fj=ܿwfⅲDb(!iXt -/½B*w]!ht:HbzH;ϋs񁁏 !#wR&̓'Oo mm,j6 +v~yXrwWMǎF(x#cH㨷Zf1MH)\BQo". @6{ID}`-JARU,9"=̴mv񨁩> kkkmӗDZ ^_(5!"_,B:y۰HipޘzX:LJTd~\s5 ùZ-4;$YPk셵ABNXK񡙙/qY o7; MMi>4:.BF$EAs8ǶaFp, iYבAzDxp< Q(_v|Ȃ|o-,9\D[[H!bD~ d,e/|.&Z 812Weq,onD^п41]Tc,$wI&.|d}F]^ N"xeYzx: A("HOhV?q'`eI;mC4!2DoI['H((T: R[Q013d"E Z:*xT4FӗcA>ƋEL aesNz/WwA A>Š&xAöL~OB;|2YEnM(X?y|x8iQ9 !n7VH"q òmTewk]`o% 2Ţ bcyRH9׍ 0aYHC(Ѣ(!h6p8h܄QaMܣgAm4`Ƽ@m]F\H.?`wUaz ӄnE"HF(}[blF c&={1U}m {$<3noD"=cZ[.(4ܿQQDM%9eYhV6^~t'ȓyR lT*7vwSj5V^Ly;!L8,*L5ļxh6:^+\2yМc|>4`L ~̙ C/'0:2p;w@4$v)1hZAn%ĝ-8c R6n>zET(ERA}m u ̯"8!HhF 5?f Jퟏq]]*HbXTYXwL&x]O9t,v;`.wNc&`LJ-5q HN> 9Nss8s̎ ]MU[=B`[ltM0] IDATۆ,Ie1؆nfE߾;ظ{JX @$9?#r(HmX mc@.i۸I1l<97ODɊD UQ098<?5ǰ,wBmcht9$id30Ƃd7!RXEE޼ބ8[pl;hB(uRDIMs8u4;//ի(߾իW書:6fgQ[YAV%z*&*"խ-,nl@""k5ܽDvNCW*% D݃ ?HۺoڝNt_"M$ec ۈǟ<&2ΑFDhaXLoy״GaqR6{NŢm:HH(Xo'O:i( p{F5qm]w~S)US)C6Lscau`Yh{c,AZEۅ*I0L %Ǐ|_vMbQ0\.C7 >;jacۺLV oj>t(6IyO/kj&*F_6jULFӧ19+864/\˫%4 n] V$4 C. ahnyCFXoR[zj7Bƿ I/SS( Jc*&Z..UA{ { W! k7cP$ ,cPW> 4]?s,=8g<=y@9YFj~qDb@Ӈ>0z(e2gNM_LF2='w`Ge^kX@<QdzgR,#BSXzAT |W0R(`fdm) rf UnD10Ӳ`&aJ)tF&7ݶ/R00Z(@S~ `BPױl"Jkefqm~:q"WxOaYl40M ڎ(HD"tHܮwVVıc{>[KK}G/\8GR " d!HbAaX4]8>gYOSBh?7t`6n//c}+*Jt x7/"Qocnem]w=ch7~{' vs9h^+VE:wKUBe،!na1UUc1qn8PU.⚆JMo832|X.0mH(T,a[ p!"s0uHBzxw)[7~!^"p|x_öEUKPR{ D5 Ї+WQׯl"zkxmf|,LA!hwUt;x<UtQJFqcaA;7݆c $#Hm;++>iK/A$ Ap#RO}TULsb:}^ء&#&i񓣣?jJ܉6iB~˺]GT P>Eh{YjOO_4"^4A)< }r$MM:XVcIs;=巙ir ݺ!Mh4xuxF// m%u%H(&z D+{wS O?4 ޘC, ˿("GwB9B)=qu$4D4;Bv;Eoa}9ǩQHV+ o1a9[%)s`w%?98g`;~_/)u\EV67w]#17訷A0X4 Mpgq!I0Ơ*R޲v8w 8+Ya;.]B! n8s v.l<BPlr!{'4c6Nòl]ںPB Q??y| .J圣@eLMd ;{l7;:^ouBbA4ȢRJm6B_(mq=؞'৞8W{/$p>SOd!Օ #Hy+%yy~sE"(s>-q[${P(!ȧR) B)LL\ e)_!yBD&LrR1,AZ7!~BPkw0Y,`'Xp i'!V_kBdfs6-+8G(!*تn[cNJɢF벐gKvv}q_c('6~|@ (xմp/@*,I'ȱAG`?["dIB6 FsVERBp]ddP>$-'T!FEE({,y,O(xiyw@f'1gs Y"wSIPDYPv!E"}u~+-jN> `!#>'p/eǁ,InO)#z0aðL X-?I)u[lBR 㸻@('wc}w?ښ( rkgEI_- vf/aAFDG "6:{LE"{o;nTU4L^uL iv7s{Nj$9P$N۝b(2mODQv]5$Upj1Mq~tֵ`!:yB@(݁yr/E";Dݱt#gN|g^_b#0MX x48}geX2?8TE<ց>`uDL*ANx)?87;.9'h -n zl{ M@fQBY]ƃBdo-(ZV('b~m/j"K[l:>2;QQJ\ms c n+eJ!HMt{l_; ]w'ꋴ(g7,foFJINt`PE4;X?wl/~B&hT mw79z=[Ѵݿ?kf3 9q oݽX.SBAcR\91 w]#{Xm).!I$X:sΡJҎa̍ ›67N?@:rZ1hÎoim-TcF(XGDRFcތ<gϏ^tsg)^pΡ{!|zw/ ^wǡPh(nAsq_!ȧÝrU`+k:-4-&$Q ZK=t#v}"( {o  ('v`SCHۢ2J!LJ[(PE"[KK?F]`RIG?9HcAw7w?t#ZV67iAFΧ>܆*ː% LxύzEyb'T~Da=7$>D?yhR1(};5! DZXAa8> ȧRC~^A` 0-P9rYcGV HM09B0=r Y1>(9dQz$(BQ\:y kPI\M-,^_'M0RQ-F_iϮ~{~,=> uȒD'8̓}.!t I. 0h`zDԛp`p{sK/^<0ƐF1ц@)*",9n 'ʽ-Ywi; Vﱫp"bb(tӄY{MeathЉ"$!.zsP~R}HǣرJܥ~~t} c :Ё>u-e2#K"qN &cu]OUB׃Fu* 1(&>QZ-|L8JQL|8+4j!DguEEXY_$OQeyJvoTIbe Å*J0a (BnSO^IVQvmoRǔcYh&꺁mt e=``DX+GF/1d1dߏ~dB2M1:}@m; Dܮ> o70Z,f Cep$Bp|| vzĝe(8 rmo I?H: ò~bΟt4a&886޸;م%,nlhRin(!eXH&ޘC1,IHb0 F {/߻aFb񞏩in-o>"#ɒD?u/w h˳08ܝ[$z)ݸ{k={19GK7'EE"E6@BVGǶ0A DAp~fV068MX\x+o㉡1w]!ZGst:o?zn/`emGx{G"# LEU50xr<0x2r]8CPE ,;ymȳ^k,j((*89:=ays`~SS!3Oݯቩcι-jULN  tfW~gl}VϹI_?Ipbd?s+HQxQiw~ض^xR wP_4TX\rynu]|ӟ?yZ0`YmuwsdIw nzL<7֥t,w;T¤ŊtWV^o#ʲf9ΟzNdAȽf$ /=sbjpEFܸaIh",.ܭ~s|MB>. IDAT۳, BDP(F0EQnQ* O[??ùSR( ȧ%sȥr(eJ&Pp`}OiBdLMMr,p:QJ,!zU,$p(###J=0߯5> nt DA%AFqdq$Qtt[5pJAXM{ ʵ6?@.gqD(ũiz&<<ު}QKj"[[HbHr؁'@C #?H23$ B9rv;Mv[ڒz_Gu[i^TuۯGCZnR/=/^w=,\Nj!|WOQ@0™VinŮ 'ˈ׭ſ|\Jhu:"G9wH{D ӋPx!xqqN ͌zePUVZj V@E˔y1V,!PAq?n8Ln+F@)EQn--/;nA08!fȂ%Lz1y8.7 RlǃPdqFc?lGO) r^ۇb˿u;s߱kGS/`qB1 W=,jEPձ Gvv6 u/ؑc?@O_v7F A::Z Nl"ǐc~?##0b-x2<Յk-C0h`96T0ce,X9++/G rPK.M{pskM(bA&JuwRP0gg2.^|^7pJ2Bb[E?H\UQՓ0J8YFL&w?ǰVV*u8Ca(0\ @$EI\$ɺHɽ &5J0t#T(8NyY!ekt^ r&ocR#ŸNp hT^wAv6=bB!`c#-@ 7^ePAFkoǞ`pG jqgo1X9cq1?``iP(VhZ#OaըWr,ŽhaqbPp X-12i)T!E}.n_)6~GKJI_׷|cY E6=I.cd >-)P((Q%UxJ& ,%1jV+/@kfj ]q^}=h4pʨ`ra؉ շn U߿PsͭP˻M:<(1 1KV)999P0M(+*Vņu`Avqc钥(4kBTAA}%K `y51NJ3B\qR9+kَC. ;[αN;%u4 ڂ9<`TՅTPZ:z{O #FS kMV2 L#pTR<;p nm_܌PprF|rr=yf$X.̣~jtX!]/⟾r'7|kh!L mYYY(*.eǼy(.ÁV݀ J+Kac>sgɫ>[>?T f9G* |Edɒץg=ϋn&L%-<2l'Zb _ʵ\-.A4AܐVrqy62,b-IgpYZ;(uaA9++P2!JA#9˲5N`ʢGCA^zWnyd ĢEؽ! ]8݃u׭4`:65Ja (v:hE)& p{14UBP|?vpA,3j->6/$.#.4cҘm!fda%JCeF '8 0hJ[8p|0t R)wN,X@[Oqi J+[(üQE؜N(6J)YY #GG@O/ KKp_{-(+*BѭGX qYR\t9уN`O&XT7V{>$f]~\Aǭh=Ԋަ^|`| Tm؆'`X|&0\Nd}Mh/Ql<~ZaSp\ʲB˲,d[9ШT']v7 s%5?gUHx0)7 Ys 3Yœ638E)?8;a^|UUG( EAm!}ρEx׿BmrϿCAAn[R R ZP@V˳B^ AB 1VZy5, 82a眑!ݐ<>_J܆8W5&Pd*r:m} 'J1)eȂ5 6io?S^\.m YBAbmX@8^( i;~RңG/Rz'=6\,,6jSAM1KBPl &T 0k`9|_7z,rTI)RޯI lj5͒m-p# :~,;a8`M? T"~f!^?6 ?;}ÄJVpb߾@)ۄ‚Q$OݘCbK?1xT6Fz-!!vӯ7 /i%,.WO6|" $x>zȑIRZZl%u|tT; y梱,@P@)qQ^ ÓP:OIQ5J nupz}PH&ERjݞLJUeY ^J ikAxm٨6LR! i~s{.9$ Kr}^l^3`MQ` ::mbH I"~=xhHi9PI'  D~ӄݣ 0Zd + `M"v[}ソb)Z =4[G rJq0 r z4w.t`@P]K$\!H{#SaeEŇxOyH#bɒ`('ۛF}Ab_Ȃ5@_{{ZFBXZ˵|fRb=xGٌ^ l.s{>l] ?^_X"(^|\,(pe F)X*? bC?c]ŏR egJ)=6B(BPD@0rI Y{)`M2 }|͜Vc4VSmmgi53~Io4eq=⃿ x[a>!yR/CPLjI:!P(KBBCQ/9CA):0`y~vPj*rN$Fd&SmQ;!v{e;L QEA5A\ z# !Bkw  {E-(hg|H(ҿvXkHV$-:l@g * :H} ҭ؟Jż3r3bg$+ #띢PU㻇'$A&LF9;rcfvq2+&@)e:T(,aݓ'2D#KzPQ۩P(,Z[kR,+ NDɰ@V6jhY | fV$g*#^D |maP bJ`jơc@V'|Wrw01.?<|Q㱹|;`M1߽}>W@Kw}H \8.h@%V(qШsTJ1h ;7e^!<΋'jn/hjNͭ;~ =(&ta8fk |J0O0`d {q# sN)fxjmN+X¨բ '' aY ˟aD*@Z!JQ(5ڥ]d^beѳ*R p @yP>PG; 2%4S| CjSx)u:K2 <> *϶S S%]޹k8tl Z-֯~qx< e) * nj{{Oϳo^&ryE7 KÂ*TP@Y-_nxbh$eK0dIJH",5n[ZQ߄Lh +ZV.'QjyC}(ϏqT} G3.'DBR)h48uz}y+2 z^{q#[X3O;V.^ש7ftiZ-d ,-5aPk~3O@+ GŅ33 *Cg, @lo {z@– XSQ ൣxm4Dn]YbŨcǡ]H40<,|p̶]P(WK\,*'vt|H-%YfEEEn9 JtHEOFV6D^{==Xt 9y@IUL<&"XaVC48, ZBa^㒆].~ժ;0p|8 a >"R!u7[z]P^t ZZqb =l뽐k&90'Ջ`}Ja 0r" `Q @LV4h%/ ^A2@g_$k?c;$T mz)jP)Upy}xIWhaařY<sVFK: vtpĿ1"@T35Mn_| %RMMζW9aȂ5PJk/ߜo2RI5$R_DK, twN:1VJ4dHPG|Ǐ!xמW K& 3,#0U^̲,)js,.0,-±,n70csvF a.ȃkV,GqqV.IGbW_ IDATJФ;FN@ho`@k ,ݰ;0((ʂYM6:u !sƵ99Ufa~Nn|XȂ>@<҂Dv*ͷtu;'VY@TVs^/ٳ[3}e# ,aի_JT&mN}ՅNH"*[[1/?*b>C3ꑝgh+a(**FV,W Ŷݒ- lj0l.vlΟ= ^;б (4MAɲ87Hwr8ڊGy y:= ėd#@PTh~*TRRB+SXC^Y ssCPAXNo~PHb\A@P  dk+[Z`0u` e ˲[>C V?%円)2cBY0e }ߦM?^wA/ "Dz8ގaQXL1?&,ˋ&^ v{u`Xg[CN{ 0v++rmL!pjT dsP!ʤ8N!ˤ9?Y/vyԛ·JT~K_:|+}xA&؜Έ+ȱ,AW?vTΛ|'78dǵ˖c L Yf1%yyeWWV>~GU핥BE\8ӃbOVP`c#lv;Lz]U Dz}`3tZ}@;/TUU=Ȗ-[HIIId;/}%͂&QJAJ@vF*R* Amo5\WF$SZPXx/|p_~v6yhnFg8AT!t 87R} N\oZVn3 CTJg srζZ ./3Adt/|5?vy1 a@! !p8pE2t KvƀAxmZN-ܢz[)O=$///RFo/,pTktFX1K^  ;m\(wX6߿`zU_ mmhZDzFrFL,?pwNix3#5๦?=|ЙvRj3  p;0RBV(7 8ޘƟ Â*._}}LJq'\>u}{ & Zuj*uj+`.΃9SآhTb3!6!&?{Ur-\c…ؽ{mmm%kr A75N! (0ĥ&^/J4/<@gαJ ?㷬Y)k:rr`T)GmcBA46ln=ɺۑ;j[yy9?%Kvŋ SCTm*x`bu-A9}ӧ]c.:zZTI} 򲲐o2p|vnk{RHwMa@)E[[[ꡅ ~o>VӊZc0"YTVV&<.77w&O9Ba~)(+*61E-S (+hˌBKaXe'H0%,}v;i~)Oa^aTBo`޽{$%q]pU g `'?S4bھ};o:V*^2t㥔bݕW'۽'I,XKϿw~AA~0Y%aDm0dKK]"ڸq[n=pmE>CCC)Ѐ_~HNvkm5K QR"8k!%҉DBDq85:xYYzɒ8~|&dƎ,Xsa.],"UUǣl^ܬ!l/>JPٳ՟[jUYRh4`Zyx$cZ@Dr+P@t %!Bkܞ?1@POjs`(mܹnۓvb`qlZ\RK-%<ϣlԨT ^y*> $RbΝ;8R)\LLX[RTUU}' ܷ_X~JRfJKzYYY8,]zVͨ1k< U* e >WX$,VK_[cJ΄Cvu7;(]ͳ&*VS644`۶mZokZxDeN^h-_3'ZZ~GȌFT_dz88~bup#a !{eŪ GRło㖤&G3j_1􇗈u!V;w|YCk8ڱyF|qkR) x1$wqi X,Ǝx#Zx<8|c u [[P)ٮ'z>Xd kSQZNR]_|~?j%g xQPZJE]wFlڴ [lIYb ߠ" *80|'v4F d  l`o;qbz([T* r>5)+,\͆%ݤnWe& ޻7.oߎΤVkKrZA^0}8u08PPxAe#9Xo><0m;vߛт]%,ɋ`Y^ L欬2F 'šUEEEqa <'@>Owވplڴ ;v@mm-6l/b;wET׃1`+|<,,.%X\RBV^={"///朒;WSS3wdxBDwoBٸuhANQE>L `QWmN}f?tu)bj۶m `8xp^u;p_?1 \#7 cqF-[ }v\ 2I$kkk%ZW8=={^ױPjjqڝeƄ,XsNh4yt|QWTO~N$ 6o (// .oöm{Q5Q682Ki PB]R Vso@ʫe˖H.\jBpAp hhh=p:.JCuu5jkku3a Gf`Q*U^CXB@xy#444)ϑs;P[[RipX555J4k(]G/\<7N#X:XbӦM(**Žp^J*vs={q{NNgm5D0~E! dVP&cd?]::~رUUUDmmmZjŊ3x:t ֢Ũ@EEO} P]]?1  C<^o|6m›oZTVVF[WWSQa֦'NDFo]<QLw؁6K(` ?_U({5{O? svNHv9Ѕ+98qO>dxuu)fBn7xJoR[FզMp1lٲ%$Rh\<ӣ^'`Æ 8Ad0 #Wdd, 0[,,[V9xGee%xb ~a\(^ GDA-?ٳg/6mBmm-sQMu% ! ]ÎB٣^OGaK%N-[&beM:EY$J Xf ~6Պ_{iPJqw:.FQxeY[RX,,^YSWW͛7h4FYRɬ+IE &!&nq[Yt\e# cƍO<Y_eΝM"+{;w^011ڊEļGI${1?~ 7FJSiZu%QSSI?~6Lt,]*$͸ Q AdddC+իW؋H.Xvc>*xg ]'Z ~Dك'OFT)=xqX,>fÆ Ûo ue0SU9PJyo=eƂ,XsJ(UWSjߏy-ܵkxhڵk {18#5n{bΝ8yd$NEe9/F[WH !رcك;wٺ]ĉɐ2E p'VH&Y7nFmu߹O21Ȃ5 2ļl$-a]"ZPۥmҘV\~xBUuE):aǎZV5+9^***n 1 #[X,X jٝz#V;/Pɂ6iL0*+#0Z' f>ŲB0tB̢2# ,&@}c}IA*ڝK'x#L֜ i ѳaDe tOEeȂ5bDxwR T|,'Dccc$ؾzj< һۿ+_ N$!1 'KKpS`b()xȂ7=!m+'I%PbY?0xʒ9{]v!;6dLu򄋢Ju2/,#" ,%;wO{>JiZ@%eQJfYҘcRu+i,7DLu DaJB1ܑkF'644zg=WY+bEJ"Iˊc2Iw/43 E_&Buu5B }P(Ň2# ,%;]JB2.*V^=JT˒ćRaQJ#ǤyEW#l׮]udtoLfCDR ;P)GC1 ?p{'{2`J644o4蜒u_*XVݻ77Ee(*u͑vc> (dFT1$v8ҩV*# <1" ,%W Dcx3ZCH|AxgEcc#~H]*BRDzB"1,BuȲۼys4dXtc;te J)k4ry)`꿆dL{WWy衇o>8q?N23RZ/f_* 02ٺG/%Bsss`|طo_v… #yf޽_ߴD mnpMES)XDʆc|f\z]-ٿe0G'n TU4pD& sw ,2ڌ~晖 o)a6oN|oa4668cNÃ3HXC@SG=n)ڦu0`BA_J뮘PRfhKDBL ɨWLص񻂢u5%i ))//;p`Yar)@a28qT*w}ay$e#Gcıbk BSvšecϞ=N8e˪qԴo鬫n(>d kӟtc͈'y̙-æ۷*r # ,vE3%2MgM]Y m3< 1;WXfoьud. d kAJ!hu1g3=Yf!D#ǯD"Ø!vq9 $Lj&f2!e82YfRκzggb۷oaL3`?IkNIw"pv=tȂ5hiiUn&Wj"d:C{S<ن,XvYLw`(@(KR9yQ'jlܸ1}q} ! ,6=W㩖0\헬kLQZZ JQKYf B.9XM3%2sYf ҊTntH¡׏cx [Ȃ5GBI88N3-6e疫)\:k l IDATeb.K BL\ySjYY,9_BfF7Kfk3kUC]zMz|)p㱍K Ef [XJ) E]]]1AQ{zcty8uF |3w&Ӽq[]{Nx _9&Af2Ӄ,XD]]]1?1Q"x&C L Yf+(x`XKQ(yh+"dZQ\`"V^;w0f=-]fkqb0f-c!X,Y]fkظp¤n)fbÆ S; iEF%vZաaԾ_7TM4YUAfȂ5$ h]]ݨ}srTuX555X]Ȃ5$jM?00m۶.BžQbnW `0 Z*++ZY3Ưjkk/[X `0۶mCMMMk՗m+IF:nɳ` w vsee%q KKK/8NgIۃP+ٲtkSUU_q,Xb/'\8>uݧYf9۶m71+=̊r]GDZCM x#ϷmvYűR5Mmhh@MM yT23,X3DtѾL0ˑ{` F5AQQܮ2B"h_Fu]5 sy5MbV)Ċa2SG.((@HpA0hh<@^FMJe?C||*LZرc(3Ȃ5C$pOBSy/F^#b+3#lhR)Dfۀ`0 w$[*7bRZE&-,WZd!eBՎiM2ћ*~ݾ PvDF::Ȃ5PT())$/f!YN[w2 "ݰ!Wzd[YEcN唉8%b<rjkki}}}ƍ|=ٍ,X3@D7S1ъ1s*d2pGIsN|__Lu/3+荅Ͷ(QǼuȂ5$p Z3Lhqq83:K?8Tk*k,Lh͖sCpjR/Z3zLc$pO*ѥ,XX1h,3=KY!Xt阏TDk _Mvl+VTTRhđk kRL inŁ&B2`M? ':R`%b,EJ=n4)TsN׏n(sI _(OS[msELUOE9Bxѳ+5a%!N"FRL>`]̞VrOJC/ ;w9ƍCZd$H|)5{LAJÔg1EuavvFŢ %"yi4S__@둝 2SVkǩ1<93^b;80c-R>CCCcNi 悋8ٱc럚q\Ȃ53A .x4$! 6ĸӀ,X3L^08* /SJ0a .D۶m8p`ۤ^D&!``q8¥P)!g럢"J2z3EI.-=.^A z!PJA]Ufґ3 gm&lٲ%Ҿ+Qq Zj?:oƍX~=QySMMM"֎gOؾ};z9YVb! "TAWWרaZa6l\iK0O&h8x㍂$DՑ/ 1ٲ6<`06lĆ b[,G޽{gfaZ3Z[[cu3I,HsYfJ)0u8OUS9L5EtɚS(T+Sta2mm^]]'ND?x)W:fC ZW3)>da(Q_8| *CZ&=BHsssd =a։0"\ɶm@)A aӈÚax闿%@=cRs͛GyO>d80M0 EVn  T?_/40 Y `0 غu}ms 7ɲϵ~=O`6}Od&dzŎU#ss,xcLR5PjkVq1t ( ں Jc9qUJ$q,F*mϏuLX,_UTT$'[Յ_~9g_CY9T wfxQ폁t[P\l46fCԂR/;{(Xt: Uu>v̎MO~c>ӱB;xMܟVo?^t 2CY£>y|T?޹w>B 싈 jھtV[]ڪuˣV$"OkZbպ?lE)A!!$53w;?I-37_=3C3|w)˚8}4x\YTg1ً/w\(~tu ݧzGr\sz'l>Իp8 #^kn)1 I`'IIW=Bk&M*X}`@x+iQsB2F+\q383qK!XKy :*X) 0A 6QN $_%x17 hl2syܧ-yʪ̴4\?T~FEɤHC\vW{͗xlvbV a{_ qGJM :pn}E)ñScΓ'l i9<> ˲yd0vB`/Nt 5 p]&VA^u dyY,9ho7d*EWWSAhbư# \,t'Lm9WJ]]QcN͗ ?a0h']]3.^Lv 鏪~uñbB`xpB+EPyv@!f'wD=' 9޽q(Q(Rߥ9fLNL|+$56 $Ee0 P03(pgJB2 L_122X,p:OPzILm̰s4d9#bY΀ ѱ9n>4%)qBt邎Ra@NV$烵Z }Df;iJO/JqV1hjV!qg$,w/JIM&"re+7` 1W &G:shl߁s ?{I)Ap,9Xus&/^IFdUAifF墫@kz'TB opv{$tUC8pЧzߠ)"91 ֎N@VTLg] !vUL41'b apF'UW]޸rF _ˠCl[bi>t:ulB#GNE *XC LOK_U8{8:nٴ'M4٦µ6ñf?E;cڲV\}g3UB` HmR1 !&j9 tDC]%'Q啈eje)q;!u\t+ Gm ; I 6m(H7\nOc`=g8W IKV_=ȏEN) PJ!:7E+I?N B&iaZz/6â'<%,TR=;s:̑CXqY*FuUR}(&SIr[J{ B+E,Y2ybŴXb5^Ád*SkITkڻڥdflRSƒPN Vp\gM>Z܇ v; ȱ-n *X)M-Wlܗѽ.Drot+ {+ ;z* ʀ" alص_ z(ڶPZ|.m!!VnZ\UC`)0ڵg/pVDpomfoPu<8E)Mbn~PJ˖/חOepfKͤ6 ݽa u#BB8@UO9Qx +JKFw0,I:JDˑnu ͆g)'I.ʓ^g\eEYF$:+EIJS9 ~0~v?7}/f`ោ4nJdp'22j0R<ɱIm!x-m*%β`Z ZC`^q}! e;8 8sLrqma^Ao^H'y.n5 V L%$1 zrB?``&!aEZn:ܞ߉"hSdY\)5TUW3is>ou`pWP+!{dήZ>rpj,R[FPd$Q4EJr$}h ˎ;p8_1 UM<Ƈ*XLߟfGsMh `ȶvlYXx|B-H5Eֈ1r½!7jmhvIQΨd.)4_^~&;Aduww"y2 ƪQ4?'keMM@b]^_BjΫ_Z\4T+V9M:Ɔ{zj~IJc@fZ;j:vxdZ-\]i%AxSmcpS]8N'Nvf,Ǔ12^ߝ6?pAkh:|,"Rk6kg0qNJii uߠC3PQVqmsfϛaBDE-gl fc%Ԙ+V&ߔ38D%À'GEH;X$3DؓBB{ $YAՂ,iu@Kcw嗜?J+{őa4TF6aRE;{< ǝH<ހLG{= 8F19唎X8 azKK+ڛϿ` Gapٌnƹ <ʡ!r˔} \0$FXNjf^lp9%fyb`iYm&f^/+{FfsW 睰KߵxߝT@VvDȊgNn o0 !Kǝ%v)zUNͤ2zBT(u_?(Z5'H@0s\u_?(7eP;J̝=#@yS3#DKN i?;: {447_XHKؑ[^~JȠY@?#tQ,p3O65RYU fej 8i# =6D>V:.{ VW=E K'?l3>1cm؆tyA|~X#8'7,CqJzo\+C$TB`5Qj_UUE?QoFd&-o 8rkT10Z=F~#D`IDATM?\|IӁc`i@D\wS~<ñCk~ڙ*X`4EVu{H C>8nM̲/Re=ӏHx @WuMH%X*((Ƽr:7aG!8, 2 K~Ȳy{.\xE%oGmS*X2Pt 7Mp|1'   0 ~[z9zܳ7oh5Iݏep,_,)  096+[E}ZZst, e2 dUX-lAmX ʲ  ^e `Ɇ8r@Ac_`JdU@0Bj&-p:g&?;Zou/[nwks??g?paݭ 4')*DY!,PL|hq9Qt P^/PշO}V[VPV /PXuCaYp #|(*rAJ_&(V-)_ !Bl#ǟ|']㗤nȪŒt'3nV|}nߗm¨`1c9m\"dĤ|\;CVCR/~CK8@bRx[! ;R{)Ͷ#Bn)A,à[Qn>%h47vʤnQ'4}sk~:ciuo~A`5(PT9;}j]{͊8"GT4/Jm$XkuHP<QQ|_.)tEg̲ :=>z~O[:vG\eq, A^;0 3f+fgo׽|vpڊv_住~*!Vˢ; b4 L9g u%& S`ivIYFrtuv WYQg {lUต2 !? Lj,EU!JQqiisZmimDy%~sWaVYx]G; }@yi6vZwțwyxXzuS=Κ]_gLϻ_[?lklwIǃG\~ |nRo05@}ө0 fL;wc޼yoR?B<';l`&B/M ]قñǹImC&tArhpt[mM=k/ɋ=?y]m`_6~ٝӍ./񤲟^VbRT) 2te9;ol믻'},[\_)_  CGF^4Sy]bZN͆'[xSP#(r"lMz, =}qtu->cBXzte?J^}kW ??7B`uQO>>oѷj3.ȵs@*!^U%sfMn:++ keMM@Q3 }.ߞuUR dPUX3!m:‚SR'݇B' ^o; g<1ҤsEZ Sz(Ac(͂Q/a~gG~?{~Ḃ'j.-_Q[m;eWo3k,*d9we&2meEgg{m̓GԆzxH*M9| Lq )1)',ܩ $K)*˻{0 'mY̞äI_SorsvG5xE sι8/}ïzT4.lȇa =4e: IW +uix)ArœpiPtkC}|u$|Ŭ?5ټvY޾֪sN_4ߝ>Q:Ҡ+kj[ 1 $[qͼsUU ~qlZvV@tKk̟.GT4a{8.r{>:@^J a;Ԁ|N ݄c}K=q8 Q"c=n_ ('2/lzkn\XyǵܰeqK1 &#'sRr.#*X!r36|&P3Pf1uNbվOОWX ')tDUQVVb Q]Ul;2} _TN>kiCk+ "n[[ΆxZYSx_^x.ZkP˾ڵ2'}~Q0=,\^~ 1 @ezՈމǍpd^|/=umfWT:ŒoeÏJMvn# 9}'PȲ׽zdg@T5U)cәM;jVݞZ>l[nޯ,#/= WN)[~5Dtu:AlimsBIi+CO8x@H،x } Wث~~f7/~Ӎ~*Xtݢ(0LPD nўE_~e  #` F<|]o:~󗇎Cx~[9œn3h F,+nTQ!quUxo4̥e *r}wMusGBCw<~?ή(͚[ouNqBK#b l2p `YtP'GѓO=Ϭ#)*N\-;O/p'hq`[D\{S&{7k8,^oܤ ِee7 YmkoL壶8(cO7ok&d2 qݙ:x|BK#d1P:6t͖ZڱM6FRc-Zt`ĺ~޺8X zX.ǩt,AK#_3rB5 pmc_hӵIKk؟pΝnwiwo=ڲeQoqT#2C/^emnٻW#gxHT܁2YКc4}6Z,SL c*XNlbY;-Xi'Qƚ5kZ#%Ԉي[9L8((C: J/T4B0Ko׮]/v/ w2 ìyP-F]ez+y=VE~T((PҐGy43U@۠ eCPN@B9/>eNI=T(r!t? ELFvv$}Bkd@?< `Q(, 2bEPF CXCffIENDB`CharacterManaJ/others/splash.pxm0000644000175000017500000030633113615720000017115 0ustar paulliupaulliuPXMT_DOCHEADER+@N n ؒأMETADATA   streamtyped@NSMutableDictionary NSDictionaryNSObjectiNSString+_MASKS_VISIBLE_RECT_{{0, 0}, {254, 165}}_MASKS_SELECTION_ NSMutableDataNSDataI[73c] streamtyped@NSMutableIndexSet NSIndexSetNSObjectI_LAYERS_SELECTION_8[56c] streamtyped@ NSIndexSetNSObjectI_LAYERS_VISIBLE_RECT_{{0, 0}, {254, 237}}_DOCUMENT_LAST_SLICE_INFO_qualityNSNumberNSValue*qdPXSliceFormatKeyPXSliceFormatJPEG _PX_VERSION_1.5.1_DOCUMENT_WINDOW_RECT_{{493, 413}, {334, 263}} _PRINT_INFO_}[381c] streamtyped@ NSPrintInfoNSObjectNSMutableDictionary NSDictionaryiNSString+NSBottomMarginNSNumberNSValue*fZ NSRightMarginHNSHorizontallyCenteredcNSVerticallyCentered NSTopMarginZ NSLeftMarginHNSVerticalPaginationNSHorizonalPagination__OLD_METADATA_FOR_SPOTLIGHT__ resolutiondHresolutionType colorModekeywordsNSMutableArrayNSArray canvasSize {299, 204} layersNamesNSMutableStringNow Loading...Now Loading... コピー名称未設定 1 csProfileName一般 RGB プロファイル_DOCUMENT_SLICES_INFO_PXSlicesPreviewEnabledKeycPXSlicesVisibleKeyʆ _IMAGE_ZOOM_f_IMAGE_VISIBLE_RECT_{{-18, -18}, {334, 239}}_ORIGINAL_EXIF_{Exif} ColorSpacePixelXDimension+PixelYDimension ColorModelRGB Orientation DPIHeightϧH PixelWidthϧ+{IPTC}ImageOrientationKeywordsProgramVersionPixelmator 1.5.1 PixelHeightϧ ProfileNameƒ*kCGImageDestinationLossyCompressionQualityϧDepth{TIFF}ResolutionUnit YResolutionϧHSoftwarePixelmator 1.5.1ݒDateTime˜2010-09-09 00:23:00 +0900 XResolutionϧH CompressionHasAlphaʒ{JFIF} DensityUnitYDensityϧH IsProgressive˦XDensityϧH{PNG}YPixelsPerMeter XPixelsPerMeter DPIWidthϧH_DOCUMENT_SLICES__ICC_PROFILE_NAME_Ɔ GUIDES_INFO0 COLORSYNC00appl mntrRGB XYZ   acspAPPLappl-appl dscmdescogXYZlwtptrXYZbXYZrTRCcprt8chad,gTRCbTRCmluc enUS&~esES&daDK.deDE,fiFI(frFU(*itIT(VnlNL(nbNO&ptBR&svSE&jaJPRkoKR@zhTWlzhCNruRU"plPL,Yleinen RGB-profiiliGenerisk RGB-profilProfil Gnrique RVBN, RGB 000000u( RGB r_icϏPerfil RGB GenricoAllgemeines RGB-Profilfn RGB cϏeNGenerel RGB-beskrivelseAlgemeen RGB-profiel| RGB \ |Profilo RGB GenericoGeneric RGB Profile1I89 ?@>D8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB ProfileXYZ Zus4XYZ RXYZ tM=XYZ (6curvtextCopyright 2007 Apple Inc., all rights reserved.sf32 B&lLAYERSȒr1^1Now Loading...d'91535B6F2-E8E5-4153-B3A7-0B1C95F1727D-850-00000C448808E8B5 z@txV.{ bCA{ `{I?齘$1$7ӌIowy}o{~̼́yw?sۼ%7W֭|*5+<Ћ|RiM}fNBmO*U+=7c)Y'eS\:7Z#EeXg+oC/Ȓ[еo[?/ۚ9*iW7/c)W}M[M_'2Zcy;5~{q||b]׾g?w/>hiPVN")Ǝo~ç+ߨKjX*䷭g5v{|%7E{L32jGl ^_+1Om #K7#z0T+^/e6/qkbhiM]/Ӭޣ5J=B=ߎKHjoVnӒL -EG{L3B7F^-? _W7.nN; {VgV'FKӁ e5'!5'-;x܂γ3.>!yjcKHJ˨NI-jd7}RN:).>~x9sRt^9ym>c-9̪~So\_u靻GogBBz^?U29=trN]4sTUWV|I~Ñq}[k /yy󳆙 D<99S/~+)_rK+'&e6=0Y}5ώm_?{W(":_O[75wmxwI -%IȮ[^.}zo/~٣iv^ɺqU5{gQSY5C !+ 3|O_0a0_v^O[Q{kǧ-qTqRrN;IΨk襡~\F3eꙻʺwjf= /9o-ŏs ,'qf~̞x6_b,E{$לzY$䭸/\%+CK38:=#ۿOvmG?4o}?O(5k7 +'ƙǏ{LG?wLswPc: rtSc1=s,~YCTN=ᬓzmJja}[cꁟKM%rLz<f!æΫ!W7+(쐃܏$%VzO;yY Aˊo>۳ϗ}86y)/Ʃ/IfoV(/iï\^\#˺U˶H>8Gn2k|Տy7>>1UdP5׽苒_V|쯰d2^ܿL}l..&nx3zU AJX2sx_wDnvTX:J;co:oC^mل_NG%gN9{hنfAJNɫagi?X8wodeXeT$~%Yy_n.|+%_6/Աو_l0,9FFn'*y~U|  7Hyם't_șg7UFJV+J 57*(8HjHS(jsRrvYw F9 tУYĶHWT~o*ju>W']?F?B]r Ĺ12?)7BO&&nι]\3g6>}f~&헙_r/Ծ2ޯ;[ i:M}J~$o'7vi%-%}S>=Xklwrdfݮ؎QPGL~]?v#glmҿPoKJ}!k<"N.zR'$& mX5^[ 8Nj?-++ndCD_r9sy k`$ _*|oDfBGu)'Oë=gnwB9:x^<<9~FA7HY#­| Ncwy5sw;m7},nS/y|VqG!u{F(i{k;{wlSPx-w̎Ux L5chs+8~Fc? @Һw%g|%['AJAl9zڿFA?qs֯W<^ |kk.O?W:Č`_M_"ɩu:zl7cnqm#sA8\wo]P;*t>7_9+1 Yx w"Oc#3Oy՟α5jb;|Ş0[2ufw]C{ g㜩oƸ;YKU.뺜/pg^c`owpBbFS]{#Gߟa7HYz?|׸ٟΥ9:6/k. ꒫BȂ/2g-6~u< ~rJ?ǭ>1 r>˶nwN -D=Hۍעd#Wkbg[n!2G/g,؍BiE}p*|iǷ>-kB7 zpajkNm}Dk·)R0l+9#ۑ3~V߹'<Ǎݢ-r@?$BP'=Jl]|S:,-r^wfoye5Kilv߻|PBwB:?U35'uGA~1Q섏]JI&s1Q%| #G}`YkߊۉQb4=?OP3;>wgcwmBq넄h=F1x $wYrnIJέxc9HNɯ|co_E{Lo M streamtyped@NSMutableDictionary NSDictionaryNSObjecti:#-Now Loading... コピーd'9F5547121-1986-412D-B105-82239712D16E-850-00000C848ED4E1F5L@x ԶXc<9P"Se@*Q1(s(2ej2dnCQtd*Lu뾟{=_{pk_='p88Sᐪ:nlvc:Rµ g)7Qvႅ3ێKY0)l=ۆ*rrBs_͵ rF+ZX.^B\\oN*2*m c 7% ORru¦۾[(, S\XaS-E￸ U±æ?¦۷ 䄼Ha ~w)¦۾O,_{ _cAa n6 }FA_;.F;baG O/|' ҿT> } /L¦۾͘/;. n6`V΂6"; ʯ\*wZOs5Fneed/qF< y_kG(Ի9sn>_ϟe~9Nk 3Sg|jU⣛jRPf^=?׏sVWH)t\_簈+ZƳ97k/G#BxswލK>%2_Q啅A' Sݔ4_ ȴ*o/H5WQ/? / ϊ)~wA].A:sa̫o7rٱ{.ZpFW'\G .UT}͙CFJ]ئ#cm|xDA~o ?(R[ ʳ`/:s=Rsڝ`}3 ?p4|P=/IƩU1oAo2&7.i?<~AS ns ~+Oo $6 0lڹ z_!: {li{ ʮ[H]̉| >)Uu[7r1}B͗r<C;!ϑĵF.wKd|z?u.(GwR8y>(kOae\neS2%i2,}L*8׺YSp9ENAٳ;8L[ I^>u_i{Oٰ؉VطɊ9sk}F_sM>q0Hx yg lE1|M w[{>RNwUKyʼn[yc{,x/+G/Dgb^?tY&u-rg_-$m}z##.+>iG{Gop:C<|qHGi}gs Kޅ1?26gVFVAt]>6uP3g7wNpR:^W-̷gIZg yj!yoh>Ǝ^'G^?{"Vm;!v} Hte?C:~)ܰ16z+?V~?35HY7u*8#7i;9،V#rˇlQf;f|)/k_^M;)G|tt%ىSZ(xy]#~{:y?޳_l]M+lo>slZm6pW c#-/s}<yG_v>|ѵ"|ҋbwSvFwY^W`{6xa7r%XG'S;6y•ӯ̥XU- z!y|b0ܗ-9c3{_򷅿7Ӕ][~ K}g dƺO 9LSج_'J;{ [+sV|q@u>Mj:;oN[q e gj?GObrf0@ĵ dgĿqWob:߉_H\3ٓȬe9ک͑圭׵}aWxutYo\HOʟhYPo'?~U il_~'yR6_ks\$~>G37,K4oU].Ly2Wx,M_alHycA^]B3'dK'3̛7=N]9qn#Qg^G6oHY,J :*o,|v~?ם#$dz<u걟$6S_ ?삌ke9& ;&!8u5wȻ~kF; lKjsÍ{eT+;ROG';Ƴv*1 'rwW]{ciؑmgPHL8:Ss/tW YpVtׂ=m qP}Ȟ/9CH1dw7{09Ml}?3?=Nst~/>BҸF H9kW=y#h_Խ[l9iK[i'f7 ({/ l՚iDnɟ}K^D/mem=z̽:,sgMۋŸܓv2mkR/5ӓ&{-l~`[k=5s;5N/[oHlgX^k}b9qH-˕>mU{a㕽O@w42A21?>Ⱥys# {_B%;&zov?q^uT]|%/TrO$N^bīJgw4V:߬?'8E TلU|7{1.MA\gـtOl־)3to0>K]ds*߬GWI'q.8ygbI3>'Nwd#^co]Vsۆ>|VdKte[Іk ? =Gp| SP3)@ )pܼ_MݭXBǢ3uD7_S>q 먽[O1kPxƈx3ՏiW;]>92G^[fKYj?yߊcA#=];ۿ90>uQ?W.#kbI^?#w;DoSmmǻSm|0ueN?UO?9u 8ף,Y55'4%'7k e.}eG)w?xkXī4}Mr>+«~coo3?3ٲfIsBkg)evY6s&X4WزgDS[x ؾ$_$mY?h dξXU-I$3Y+1i'#/~v!1|;>}C & 8ya/E=ć;lqw6ι~ 9oa6# qS hM streamtyped@NSMutableDictionary NSDictionaryNSObjecti+名称未設定 1d'9DFD4605F-2882-4E44-A3EC-8C08D90F55F6-850-00000BFF954CD5BEDxw\U?77$7}{oMcDP4{JQ*"(EQT6:XfޒZ}<99|>s{lkL-V۞Қ(!'Ź.=Tj#*wDx5v"xOKңįB*GwC%cWOno@4d`oy6˕'m=(%Ǩ<(}Z?R}}kQڞ̴1U4 ҐnfM{0xauk,Z }g< OjSx8W")q2+) þ4߫3;:C'8ƾ"k-y /Ҍs… |yoy .>STVV lav@60%!;s~YWkqyR.gH9_J X>SZ_F/[U$oC'% Uh4x쉆}a l}`p7  ˑ| Iy@s1%b [B a['\(V q'|{ 9ɣȹrqj1]Lio( [t- 1Xi̗/55Zxq,bHf0.^WݻGxOWaYI0"Q0%C*> gWʧe ~Gp5?15;&ǸO=ϽUv©, >Sż3WK{ۿdI}~6Y@a VR XjZ.[a%|cDtlOvh{qQz^f9PL;ۑio7Ͻ{%tCub5`]{(8F[[x }|' HMM}$P j2oL~l-w:Y~HKK ܹ3}s2Fɢ{`QtV`9bgg3|wat~l A<:3+"dӫ6w=6?8qs RWBy6nݺgٳطoO?}}DT hX\U Hj3Cg`3#~Uܒ8CLq* +56'mߤ߉cQYJulIpf~㣏>RyIcݾ}׮]cFI|_g\VV}F'1'c~Xkߍ+ȿ ? ;K?!?YŞJGR6yðdn@]_>;["8bۿJ>U3tKζT׌oGxB$g_AoA!䏐_"(pEus7TɈ[ǔ)IQo%VhCyۋ$vӏ??>;>㘪~.\DJcU_5юH>Pf'&S3qr8/(fXB\ MGAyyBܒ~rKrKZMïv[?%GFy0x*5~IyhIn9-gŒlc;>=Ç0b~4z,oSg3>#ſb3~8_u (o ar%:q7ǴCq}ʅ!Q(G9,NMïβ!<.IJxW(:+%E^ye#,RܡePmsLFyQf z]]]įzn~=Vђ(?O~$2@tY@W$]ُ}yӝپHvt,&t}XQ]9G fd?rx>ʕ+D__>jR~sZ[[ͯXߋ34zl,iQ]N?~!"phއs_VѸa O s/\dhD/4{W4pfKRTېg =sC񪠠猥\w|dgSSS3-_ ιW4  ;Z~O8v޾ۗ1p".w!\-bJGfP={ _4'=N ʴkǸB M0Xc-BsQ~tm  y2 +sN:ݻwF0?X6ϹsHkU=9#Lïo ؿ ?C \߸ӷF0t߾M#{ET'*vhjxbCs<8%2zL:>UEz?$MF\Ru/dp2ʧ r3ێ۵qAɁqs=sK |C0 f N&? ;̭-q71%fkykgqQ =vz?*. tܷ2Y8/ ixg,2Z 0'ǩ$KmHyɘ(Ŷ {H?w6–@k[ -I^GCG3ӨhV1gwn&Q.rzF?/ߗ34R"ٯ ؊d&z޻.'p0Ό1ٱq`d_ˈ]4^wd0è' -۾?C`b4J%0,a,T K]h.M]&K"a:bI}1gnLyh>j7giؙGn-9 vys8z\=##Qhr3P,K8Sc4 vyH'R(k:Ÿ>3 q)=硱}10AXGJ%>]k`Nz!R^b&Vu~h=H9-wIܦ(E(O׃b6B[G3̙3ܳp;SCdyc~=VU^\|熜K}l+إhH]szu;߿iC']&i3U{ v yGԏyf2:Mxhl4رؒ-bNS-CJcA YC܅s׆k zk-{I97s~/IS/?-յ&ȗq8(Q~ʪ{X1 >\385^*g ߻Pvv'^BܡBt^(bS1ϼu 'oCǍ܁"y6nGĉ$_VQ-\<~8&%EhbCF9ij.T"7*8 ʷ>pŵJt\ H7f#&fN#ι`$'. mJy$&2 F,^n))xwù`ρ v|7  u񁬽$ݕyl7,SR?]2VKn+{ͧb-eΎgxdcA(~ ŗ9юi~ҁ'{,Fny=0w q[|W7.aޒvn˽XږXnCn:>S/CV{c~=7a#쇓w>ɡ8n>os :S@FYݛ:fFv^uC<,vx#o]G~IGYa!6mBKB<_'M# xTf%r?URw_&iUֺ铽FL=qkvv .ճN,Dh|1o.q-]p(F`k,k #ME|~Ek,cGhݷ6zB.&OSf// qg#XBZZ E}(ܾ~>v#)G1  \UbjS`'h'UFx" >'_FHb$w7&C$8 imXa)i3*K,r.L+uiĵc{rƘ_3o]|r &Ưu'j瀩2=1֧<5ԇ-H HgeFt`[ו~E6%Ւ @$砢i/^;`/;'}(ߣdIA<0kHf 5|_:t͐6X3̧%ZMCS!9`*pd zM˰j܏Td =<]>ζvcP뵞 V}9cLïm"]rئ2كc!-H{1Ngئ|^͹ GTV"voLʌ/AVhۻG IlW81d,h>T}2$-uV0+8ejdbu}`ja sr?znESޓ'$ Uqu9T!"~Z;s|vQPؚC6އbas?f˱Oi083Y?k7qh/:x'Ź7gi5"yo4$`:%bh#G!sFO!1fwA^ш-J/G9wN>yf 9֟|G;?N+p>"\a퍚# 8r޽̵? ٸoC☟JlN@dA2Dzn]@׍A4_F/ z ڑo WUІI2J84e9Zkn\\}F ~l;Y} y·>t G:]dGaOa~X+ p=Zhf Ů\;4)/5Y̏DT^ 0?۩Ql~O}{mg&"K?ZRE4^a t2˶Mk-Wj.51oM=;;'&_{'7*tClt) Rz\?qE95O,rHGfȥܶ~|=!qqLذҚy`JLh7`{+pHhhܒlpa~XssGT.;8 hƌ,Ɲ)CX[6|kW;QvH{'`3q[y1V(.Ga1-2ߑ,|̹>zY!S_Q gX֡D+Wv_?>dY_"x<# 8Fgycpߌݣ?Zqoi/Ԇ}Yw$H}R¹mc)cאC,75<9@q}pg'K{U{ 6Vb$ASU,bǷj&q 񚵇4f`cp=GXtzS(nCySۣR՗ZQw{y}о7ΏS\.{ /"15BW}뿻)'%_հFY{tL<Y(r/9*|Gs<ɧ+嵗3P(H OtMd}(?=B69ۇDٔv\FO_g\}$q/H#!%RHro?Nrl# /N ;S0 f+º^y.~k.S]33(P0e\~M v )Sp"Q<暿RgbND8]v  ABփεZ;9&Ï.\5тk!i(mDBw R^9:`ajyR7$=CZC9k`TNHq6kR9TDz[ȱe$-%*j0#M99X9՞S*MXj^emo:P~Q ?1&Zv-_3v;rOfYE>S-~}^GU]AFHy[uog߈>Ƿ4wG^/Ph#fO`\x]kN $g`&xܗSe+rn0PރHږklx8B:A-u޵2OYJ1}XT=?E1J:duըֈK8,u<̤RGjː{TSǭ36c6sfߏ806&uU4ed7hOfe)kiHxO`'I=HI5O%İg`LK:f.\=(ޑ8E*͋ω{d~:t,ΕG{ X#qq)Y3+-'C,z%/{3˯lmǦc!k8ҵBRM"yKVdC_k$ 6iN8Mkl_í'=jWn~8#{_,i}и".I1U#F\r&FD̢=9A_GOٳbA4ֳ9!4O_Jf+ų r>/^9 ޑpz8ܞE V5qA 7Ċ疾^ ߢkF/R@p2 XCg3Ӎm v|k+^e=GLU|iY04>L̘}H+ )i@'{&?cpvUvkƙ}2g_ i3IrO Ɨw ,S=EXRh̓^{]&0hL E>)Eŋy\A#P7/F}lx}7fk-q3_;S1d߼iq_ܲxE0|eU10Y|>P#h Z8<9eCAb<ѕuJ F޶@:7I[{1NGJQ=2%nU_3ʚtVWYp]}_-ńUos8vc.h{iυM&[8qO"Ճ}++.d^xa^]La[ p. C#⸜u7Su{\|PF Wa]G6QL_zGɘc1vҒkbzFzAyW/0\#6~}>V6"Ukţ۩c %&V=VkFY2Gqߡ3nž|_i9qF$ws0t'dzi~sZ^R ȷ[}#Y^ShlM!ZI?x1fc'_up-*}+ObJrR[Q[>ͻ.0Z-8GyF>2>]ܬQJy{JCe&_m?y/ ^^*/+[?҂9Oޏ鼉p=BM^)R=VkXvAȸZq(8QT'+,<{6֡q"|HYZrh[QN(Ű?>:COOq10)~H331_k~ߪ41r(Mi}L8Л,oc3bl\!?m0f.IdOKi){3PZ/D7&Ao5=dT!G<}qqNԱزH~/HX 7`_$G1˝=_aYC,50Yÿ1m<1rJE#KΙ,Dv>R%[`SHҜ"4Bt\In`bM'`_8)k9H +2kP;TG㚌/'k1@ y0Kpx4/˓\MZ͵I@PI˔I_1 Z]{y^/' {\Ja}WǢyS0˄8:'EZHKp)4GD~|b⁛BLևNhṃil|._=֚SV^^HG@F[_3#yls)_8W{*LESIիc _-5-m/0~I9NJ}xtYU\,޺sl]`d%/k&ĦFQ.jsKD\ߓ͏ұ&!?"/c<3]Y~IhhJgߜ$x=^|q7mұmv&xn+<1>PY rR$>"=7#~:]y AzSa~rz+> e p2x='F9W@!{v죬؄6N+4)#P:AۄcN^{af'ch3v8s_`\1,8>G\-1V,#a,E('ג߷\KnwmR(%W*4E?ut1qΉ?^>$]EJf7:c#DɏW/Q/iIkG =y}KVQ;(NCZr3Q5|uT4(>M^f ,x9R/C|bc--UDk+7g?|j3I _9'*xM;5nlW)#R ȈB{HZSSYjl{|57c6Eli::W,Y'NG.3tb?28??W* S};L/YtS&A4.LcڀaC+b9<:դh^y9BmLh,\A&g<#h+>J%~zDtZfEίe2;$p=S`gr^H=8w ٗ؜wu8~X쌴t,lnwɯ=Rtն$cXI5Qt 3=dݥZ"Z[g>dtͤϤ{Rﯿ}AݻppÓjwgi8^L~aJqLN*Y3Ygxq/Zoj%]"TNI`8:H]/=Gi#5|THcqZcjoa~هd&'>!{.,[/jQQh۫X_mP/0_ςd~T+*t\s<ǰ~,V)cvkl6c֊e)<~BE?z'KXG}˗Vr)n}R\5_1 v=^SnfU`($u4mƑTiQ=/Cqеq/ԃz&FoF0˾d(K-2EBjX+,ۈȤAfgp [1\RRa+!f#+߫,7ѫJkk?iQcBl 0{J; q5l)C0psZ)wmuXcd8B't\륵9\5Ä^[m6~ViX'] ,mQ}~m|,TCgH/X jg#bRCV5ؙȾ<}%Fb͒ߢzZҜ6"*4*:uK72CWle eωK[],/k5ވH++r 4% ,:Y,31I$'bVl/ū9 m]v `sm8/z* }ֱC@crAQ[U5vu E#Vќ|^kqM FLđEzVdp~V$6)[\+dnG8K6 ) s̲=Be@ұcϳrk{ͯ7( f)ÂcYb[<7 ..=)ӬZU_9zYhS[&a'vjj~}ygkyv&O [l2qBY1rJ & kC^R}!q:=ufg/Itc&L}/kHJ#+)"NEkFM[@Or^X> Ir Ml?2 fYE9E㐴]HGC=רUTϩra53b'Gi\zd =yKg.݀3r}~ ˌ6WnX&5.['C W~-BfϷ9\H=E7$\×zņ<k٧wfvb8uaVm~X_z|0=_2}ܒJ=rq(ǂ;NQbaD~Xr81/I}܄RQIsj ɂO'h0R8>5]_5W\ ǬH_߷F\6+午:]eڻqN钊k(>vSKdz^J:ie.pfm&)J:'zo9+KܕHu. 9`$|M:gڂtgDq^SlFo_@ӭ*؆ Zn1ǸF\YG~~׌58Yܑ탍n[^`P/l63(_풹_aobib*ms[E2Pw=bN}@┽Wm:3cCT!fVww^{Rh#" { %{tlUݸse{m \Y/%_ɏK #N뇱|3-pOa[+zI&J׋h/r.QgcO| y!TkNQYHd~ƒct"9 ?f|>W!=KĶ2ҩGbH`nI+,aŰNAZ1F]3x[Y0:`+*jXY5XG1;>cY7Jo׎r_=l"X阥1+ >.2yc9y#}3gaֺů :k/j_; ah{fvLïkqi. 1iVaHyQpEy!YX|/ = {@ه1ǹ^o KYDZ*$; V6%%gk~'YCsOTս[u)E8C^A>i;S;?>kH/,}Ho/燘ykdBO3^‹kMS?Z1w'#pZT5wWc4BߐV f/I='˛#Uȴ Fb]1fN zwXq,4ߦqNf)[ǃr-V7Y@J2K?^鬋*סkgǹ\hȤzm|5ʶ Vy`;b?-.m:/h;T'ũ$EbJǫ1:?Xdr7#mPG[Wk%פGʽ/S.{eZՂcj#+D\XblfkYGX'y I*j&Oh2dIG h6Q$΋>]<$~5`+4As v-dfIxE<NqS%{/@ْ6؂Cvలյdmo"$z v:F[uFs2Is|ys`ht쟊&vqɻ\JVYĎ4Y)J}ҤDZzWroCd=„hf+'N#5:oTˑܒS_+,Y ujRk~q62eHż I@ bwR! )nmhKOqy1:lz;yG96\,zi9YƫrK{ٌP.>)̜JtTfwGe,ǥ/6njUkKz.M^_(qAރvtŘoD}h[{uO,6n-$n^p GHL*&{cآ3Z:`;tlY0OV"< e5P4EDB%vfq=#K [9 4vU ߙ]rHDbVH<.cش݁uےZsSWèǡl]Gx#.udL//0t? W{i5mH# {3>4UEδvg?}Kl1vĆMX`"-̙Va0w:,_a6[a-S_濈0[bVmc}EWJ|X*q\ډ!Ą5Ʀ0 fY=bdyì33K[Ӓ#˸#^0ӆOH1\@ei|EYpMh]j3cAFYwqJ'3y׀yS粶udoGط;~?txդNQ=Ͱh-{3FOMjfi5-1Lտ~9>'mWbbů7 9i+ Ÿ/-WLDFpTbwc BRf/+r-Ut,̑Sˬtlu~`'Ȭ2|Sl sQ: yxޛ׌Ώan?53~j?}|FR k X H;[M0*;!xuR9 nF{8p2i+v*9]J|1fT}}w~Wl mÂ7ݏ"-=~g:--׿O#Oc/c߿o}4U*##| ܹv-\~/^OW{lJa$,bVA/cċkT;>xڮuaSk=g{oƛ_֦r>;î]gbdllZ3}x~8D48_9/XkޅTcJ>fm`5z'+Z݌6 +;]i^*F(*8炾`kkr$fIsM>;8?!f^Ԝ M$VMƩW>`;sssWen냿?ܔgX0yE6M`a]g~'~|6˿ۿA:?daikkO r~mkI=(>l6_뗄9U*To'ΛE&Q8;ѦceF?ekQ(h0CaܲSwe|abF=??,^]8r\&Jb)U|o>`C9ɾŬ(07ݎ}v7Ƕt^p;~?O~cGQGO;GNNO?ewW_Y]dF/bF[W,N&"MF->ff*K;1`%S}7cMïlb]yq|% & }Pc @c,Xe5x^M@1(&ؿ' NxȬ:]Sn|#rFF>wů 9zs6r!W t+<۲?ɟ>(1죏>k0b;Bbt[#U0mx# }PyI9g2h^%.ua_~)ڿ}k~H3klfϱFq04?ƽ\L-zmyW@*Rk0grػBщ%o9Š6`'Ƒ(!<.gڼRŨ7[w3g='_;o=?`a9~+Ɲ5?υZ:{Wl|} Kbq}2/}@➨*I1۪ε Xhc_^1*Ev?|C?4z,zY9pqk܏W(YynCg{uŠnػ_XU{ ./İWéK7>1scѓb+al;Bş4?Vsh9׈ '~#+DYE{%~}g̰wFZ>:?q(ZIs2cmBz+|#Ȫ*'ٵc4zl=ooi%?zS]ӸC]G}^)4Lc케-۬8=r_Y8ULio}[oœ}6~` U.K؍P`<ϿW`Wo$U 6 +܁c#石)dtw8s/%aR6<sO<ֹz˹_m.o>:%BlTk~MïvqW`Xx r$ǍnR=-tS X}CbՁ'|+9$VMd2k7}*"o|o^\oCMv#? ^7 x5Y[jͭCoZlk*BW?8wJ_ ;BbY"{a8gh#FmП;r45߼RV] r rd,v 5%,U}6#Mïk]p-K4Ԗk(Sc֨ KIWϠȩRd{}>Gxr[fW|O?lǿA} lwupuz:Q]Pͪ#xvӻwVK=f㩧b^gEUWwJyNeܻp6UΌ4cĮWs=$,%mb`M-T8#MïkMG>O~< Gao6:N]Sɨy Ų$u $.=g̚8<ɺ#>wkFsNµ~3U6K=8چ~6aسMlsg䠔Gȯ{?ǽc xgZguI, MxصT/-\#Ϸ_}l]U.)p vS8#Mï9})p(bZFǠ̗*9Jc=Zs'O,Yyx`ScޟfcճK%zi%Zxyi'XO?pkb/Uۅβ܎A\D:k=86g-5r h>Ȯt 85eZ ׿4_Hv5hw;8+ 6IY5y~8M7bde.X߻p\~Cwv8q2/`W?Z:NݧGqқzO|G8o5T/D&+,1[xcOc.p>Nߓrncv7ٴwZGӈ4K34X;'/Np* fFuY#wUJUãQחaSiSjDwdF%,J"@KƶnbM<qAai?Hyq7]n,]Vپ5݆o?l5UJ̱/Y|o> 4*Α6rc^I1+0.{v""zrxП"*鿰t!n]=(K?R Lh6`/734ZNG j1Xog--h>l3o/+"{*nI̒)MI_)a%F' ;?]dA16H˼&<'ErcS&Q/h4:fF_X+AIe-n׽g_VkoBmK7sil_!3i_V`t9uQkaX?^}`>bN]WמѼb}dB똻B8Q͝ȍI@s#kXJߥcU2 F Pⱥ q.(sWdX1=L} "#hC?s8u}~N;wctGDE. ]|$+nzRo'kw4qw'F wϝ̐Oӝsc"3f}ι瞋K]XEs< qw.)*/xA^ly_^Ү""mY-pl.;:U\EbƱb(S36n@lܮkBo?1r*<3i$ëK=xHL*4whW  aXLj/֗aɇ/Co#ͻNnW [fX5#0 6]PT+c*1l` I=V]$8W)eVbޮ]f!~^=Vԡ&JѮx?VS[Fۈڙ,U܍,8u]9:GUmpe9"( zb܇Ua_^RՓ$+ab+5ƱmdV ePP%2E Ws*YNg,~ \V0'(96BjȿQ켥H~="~8qV2Wx\;(>,"~2¾gs܅XĵDķ#y5b6zpmDL1L;#RN/b>-oMbv&$zx2ܧSEloV0* £0Zz0ʑS&n~}q~Es_ށ-5G˅J{S(ZԵ+bHca.?\M(}|'|C9k2P]zdƈl`1n~~R9"kgH¯V9Q9l #Z0W/Acȧ Eĕ/?k"_)Z ɭ PPZ9 bGQ+?.5 m۸f <|E"EwZka|5R?) ~BIPK^ *h;łxu,3e.!/ _k"f /*k b.ڙǼ™E9{R# %{Q ز 3ׯӞo-.nvD .=݂sFZ 2._!vCk|s42UدI! ji!1ɨϳxEO k]ܗ0vn1$6rʯ 2)MEp [%kNx4CIT'n9 ٥We2Qƴk~Y56FALwv \ d6n~Q?#JΚbv&$zeagg m8bCɿk▰vo=H=l. *' , ;ݟXSɹE*UTg-AYR' xEu%ˠc҈Sx!,صn@8Kv)~X; EʍJƵ]/7Ρ.ܭuBNh3)$C-/h n9S F0΀A*q~ׯvun8y-.>a0c>$!ΏSWX8xqٸrfcR A>4E"~+QZFWυԪC5Iݵh^@Vp,SNx":[;nGV@t?~X_w8!/%C-h;z74~ۯwcq~[̃)ka킽G .r R*QT*R<{ 8ص`j|x+uYu4`ʺ?ϯxGQ?2Tt+ j#;'ߜj[1aϬ}Du W27(Uw͸[m'k6Rc%:k׹H 䪂V4(h4UWndzMWnEb~. j#-#m섹%u j:W-cPlAm-uLZ+ p^x/B(j@èlj'/$b~l)Zthg׾s ōUuCFcYu?~ ~¨Tٹ0B׏%C-DG$&'9c}CcDgޝwۨdFܼ[븬6:TZU{ ׺jibL_ vKvޏԀHIuòF}q~8WITJ(/VڵظaSsşbap iY̏ 7x݃pOP9c1c\|.-5}L`Zb VmX !'. T5`Wk۹#3h"kH+(,xXQYȨcÍf 99aR,?Bj| li'mp p6˞ÎX,j c=֯źu6$퀽qF! Z XUI/6/\O]sao3vUKxWxI-ʠ!{V ЕbաMD~kw6!NꝅދU¯Zι> r 0d7^iYA[sr4Wa>6mĚ56KvMwxa֭-EAI2ԍKO="j!?3$ r R%-[46f(a\nX"҂Q\P$8*8,w;} g+db{Ք`jmcc#hLS&,6æxk刓̥%C-aW[[Cp[Aw[Vg\(ӁضÕ3km/֮ںj4lsS[jٔCèʺ0~A@|"oݢ_6?cڲXRs1c|i!fo[ʽ1pψrqXMRںkruj+fm^ p_^~=Ԣnܸ?jPڻwa,woEfWzp1)5 )oܘ#ʑՌ˥*FtZBa^ CRh0UuJ;oY B|bHZlظ/،YK`e%cK¯ZA8"J8- : 8}UNivΟ&gau{Up/~߲UBZon[3 b>&$h9;lz]AT դsza 6uJA(>cK/*^S  2ņgFbˋ͝m c.bb'$h18.~uw 7wHgz?s3!eaU\{3/ru4xKIqޒ<I39 (dj^~I4KgkhjC@ P6Tis8!Zg>a1[༥TMo} qnËŮϜ_^אݎfxʥ P7KQ5h`mi&)'/7'ƒI#Xk$I%0z{%zLT0 gvRI'+A}k`P湊˯Y˶ ʯWzRn|~ݰ3,{CT6Sf!CNjI%HQݷcZg4a!oo3,eW߳h*߁;ڲѰ7vT+eKp8+˂yKxD,#FܢP`q5BNjI%H 7nľ{a S''8{!-8}rsVnB[z/:E+y/'ZKPhXoͰv-ŷ?s1w*^O=qhdI~/ԒK p$l nAHXLEj{@WvE1X QykH@H|3kzEc#PPP{?aYid;{qQx7ٿ*x #akd1f[7oz5{ j+`oj +gwEc^y1-gRJ¯R&2 mqP(;3+sdffzFyy9bccE߾փͫ7'^ƔϟBΜЄf7ank`q?l5y|8Z:LOBbfTq'\P\sHMn# 68zJ F3T֡,2+scc]>ev끕@uGл[uH>׮vy../pX lesدI) X&BGO)a1fQ&_FA\X $d' O n {߼ أ`owʃ(9FxjAIKE `%8 CZD=ʼn}%y}^|Zk򞃾q0r:u6|:KjX _~>; +-8kFk$f -xV\Ř5 b3o=AyD-sG#K8m0_Ó>)ip=sX1g!Lla Cy ůR3/>zt끕_M4͈ 5֚P;KE- >/dPPQߊNĞ#ؾaWy/ÓiSHI-3<_BMy9|BZx7qM7vJil+!*s_ޤFVȋLE{ l4 o4>:QGf\,JC'ƘtL5~MM:Iꬹg.Cmm8T$\gBq}5ۖ#N2K¯V:Jb! D|R6b3q7jmSEk~yp t>y%vpeflPΆwX.\pu=S}*8sdPԊ+Ŏ!/9f32gARb"#"` ՐK>f?ab&$z e W xv\.Gl%$eUP$kwh_3^=WW Gǧ9 N`758녴M.Zs#c+# +XX + : -(JDK|-#'c@h|Yw^)Wͫ92}9~mM*I@QE$-_[+mbR'"31HైET0*#2+9˨LU[o~"i«Xp?dNXfcrkpGDRRr"_Uԉ܃kBFp3akib4~H[ĤjE+i_Gtr6]N.s YmP)5 }>p 1ǐ_x#ܛNm5$'Pky^:015EJv!V}4$J`g`ԷER_TE2,YqRR{pQ3Z g%P* Uþa%-8 jhHy"li`19c[xlGq_.kKNFa~A?65T!7&VDk[>;[=[6x|?O?*?ԫW^z,#/ (Թr鲘'u>zeP.I ,T&$\jåN_:_Z}L1f%:ꇞ=E&JZ'Q9<޻_5]wc7^8uBEm]*G$_茎+NyiOcrN'cG%Myf0e5 go?!߄ }ql~l]K_ԣGS8z6aPoDZ6+b.iqhcȓx2k\kh_|]qbRǿfXAgx_D%з,1'x#4 Ime}9Fٽ1'9GTEii"vip3?^g1~_?!]}6Ư0s[}Dۖ Rܤ_yMZo2_Wm'!H^&ۯν}qvlop3FCn)*{{XƧ#7*.˂uǾkX1.U%!͜ūc:%W"-U yxfV FĤ"5/Bz2w'DALz?ܼLә!^st}jsOӰw~g-ذ'.CI*P+g)hAӤ̗7 y[یRHY JdP8XX YAqPwx7kh>j8~0{ X#~qدI! {釘#!dBjUe_H ,}39@,;{<+O?ǭAl׿ۛw?>(IS~Xe+'3c~8)sjY8r rJ̧erNɇJ(\*n##E: ,3޴z0RĞ;> #7iMW|/>>ܚ9xY@31¡fX$VUFm~6w&2:Duc[ [a}oOŵKW@fFq&jxPe ?wWC:;OKf5HƯ. {;?}٣gVICCe3~+^PXY]dDEE ?yf '5YIH @/il wc;y'9x\#ݏp5By|ր3hmK^H)7jʫhADR\`c`_g"%=_T"?ۃef>^iRϱg zz$Eu@5[Z>ix~+嵓C0"""{!(r駞#H0޾yT\ԧ[L21zR|vI$bL?vl{0|B# W8z*zPTՁ5a~Rjk; 9 <T^ߡ3cm_k0a-+>z _w e_z uC% %Eg;)dR[ #֮0U҄>bQT\66)w+8Wơ-;Q6t/-a.['Tgg_r_;:R+u}1Fytdef!//eeez_FGc10RтY%>e ̼ڏXe5~ݰ`\gq د?K¯FaWّg.shϤګ,nAAo'Cy+1tiS~Vl5 ~Yp]CGE=.~ *ۇ$|UBGxOFbg *4uQ{Cai\FF`4R}#8(fLu ~kATCyND ^F jչRo0m\ٹhk^}~?ItL|,d wmhᴲRol"X|GQyMDBF> ph:TOk3Wmݑ \kq'&&_+.ĝ!fٲSLŗQcEbXad*yt>5vV#tvZvD"y-}),Gw#\PCaL:.8>r ISWǯ~K0m< ǃљ+n5)vIuH/Д͞8*w<3Sսb>K<ǜpV孠 %-/;&pL}')Iw ݗ_+{H^W{ ѩ\Y<KAq{]Ưˁ6 ֯O+fAqlbD'$o!4(GڊbDFNm01 Μ׀6 < yƒAȌ4绻c8oydPb㏢#خu U(Mx#9!qqfcY_?ZiR_PE~T: {!)6y\~>fo_6.Fqdzk($o$ٰAmu!sw׹/"V*-瑨0Uf"eGCO>{#b\f yWЀAYaĩx@[p_&gzVdqWɎuWçcc̛kݵ~]U~7~l?מFVZ"=#G|wzu^zhA^isfg}{}X9ˡw8q/"^|^?4}!#>Cg4&ớ"665y/(+^Cǜ8ftFץX%}gWk[+lFU@׌/Uuy/>nAS^9j/r៊G%\Bq\&jrz0~&_+ʁ fk@dǧ ZgD$_sFȁ} 3s>oOMfc0 ~]U~S r}:-T:$>OŏskAb9I745&>(UWRُ_(zMl`kkck'@vX"dWGSWߏ7{kg?sx>klԶ`mb6* &@^]A4zn噃 eE1ժ05"&}Hi3EWWs5481~m^Gg`՘á}wv`?_qܿ^צX%}(ȫ׍p5CEV#] K'8陣,҄{bMTwdl22bKP/=>1y #ƏקaoUO}t)VIu_ȵ*s{AQ"'/fnV(K~w dȽ UoߎkV $ 4AFF"#k]c g6*3OuxAί&& ~y9:QNu H)|~Ӧg&Fw>×s~#kدMJ¯BrVj:tlvTd ¯Xk"֝ 4Xr:ߟZׄWGߺysRE}@=Kx/ g] vNo ITG[{G#&?aռ&b_~RW i&cT8_T7'^qTZ_Ҟ&dq,=e)F}Q9Uڎ!~(TI+k3:M)8^ODX8nzk)r0)1Nv8W@VZ Y=%FzyƯks`į[$/t؀uϨ+tLE,f-(c}kЭM?Gߧ4Z}4eKSy-hkTOfzز844b=mWAO7'O8`^Mad`!]i/?p:iٲK\*/)VIu_!k2G3˯ܰw(3+4A^$gUVʉ=F /[eyܰsb|Ƒ~8%sPӎuJӀFx6ޫq%xy/րIY~'򫉀6) 3s~򃍦"*h ;mji@A\ȋn =ō=b@eVhY0c1ʯrVw1u?7c[T{J_K*χ?Ipg~7-ce%PTxB^< xO!B[e=*Rs!8(*M/\Q3fVP+:܏ݓ_o(J='~*Hį@0hkHtV-1_ٍN\.Ĥ"0Z/+/Sjl{/`1Oz 5[a*}#}_ |N^/)x 6I@FFJ 6P8o;SG8;\&Ӳ% mm_K'xn62r׾S˥b=ZӜuLZ?H8iљ9<Ưr :ފ&MbުXuZv:"?_b_-\|#Ν<;B<m]~H3Bz 6Xcfkl6ǚU:شA۶crH?[ƶ0/rvy輴Ke,l#G澋URׇ_)¥R2 ׀ZXVк z&埩! ~}6~3=6aql=/?!WXk2>?@HԱvFVbp?vrg̉y469b&lv H,@gs5zFgKߛI rd3ѷYw46BAU+ʚ󫠗_1~e^Ev7#֮0b2º:~󽷤0cup=)VIu_2ŎJm'ZAes?ۑQ3joRI'ⳮ ep.k1 abS]L,Age~!s&Wo 5`l(_P-W]~]&~]Gp=*9tKqt_C}D+1cZٱ>b6* [Zzk)n؋~6gsR0;UԉN擯@Tj;b3N 0CQ~O G\F!{q WWXB <)Y SݧSs?_{G|hE?޲^b6* >L?*8~NmY_)x>yu0ֆVZ=kE^fq3ᣵITϑr{޳HnGxR BaVmVq|O%O?zI~&@O۫vDץEH~Ŵŋ5=R;Sg| UE޼s_į.H^bǤmIoEXD7ѧ6:!o=!`W_g*,&f % ˯>2`0.~L5YO>2?׎_g޶Ab&-DK0(h¥ %=]BiCoǁEOw;NְeJ qbgD*9._nFQ+W wDà2qݣ^nڹ{`Z(`ckۦ#;.afw甶/08!~_OΪ u@d|D㽄"d_v_.Hq;s&R)u50?n,PB~ #{Շgn~Y3~嗹%Ok˭"n[e`,?!3ts#KQko[دA~M>*":y^~G#^v,vx/◣5mL[f΄* aF_c俼܍{1vo޽'~?[@ܠk%Ɖ vn^,+ܳ*{}֮892$%o=8h;2@/!,9LՑ ~L=M`Z E/aދǎ1=`/AL76dc泶0f{Y E^nK>'*]C8{q+YY痩`\;g1ƪۤpb (K@hU9Yuj ?j5x?i0~MASKSPREVIEW'+xw\U?77$7}{oMcDP4{JQ*"(EQT6:XfޒZ}<99|>s{lkL-V۞Қ(!'Ź.=Tj#*wDx5v"xOKңįB*GwC%cWOno@4d`oy6˕'m=(%Ǩ<(}Z?R}}kQڞ̴1U4 ҐnfM{0xauk,Z }g< OjSx8W")q2+) þ4߫3;:C'8ƾ"k-y /Ҍs… |yoy .>STVV lav@60%!;s~YWkqyR.gH9_J X>SZ_F/[U$oC'% Uh4x쉆}a l}`p7  ˑ| Iy@s1%b [B a['\(V q'|{ 9ɣȹrqj1]Lio( [t- 1Xi̗/55Zxq,bHf0.^WݻGxOWaYI0"Q0%C*> gWʧe ~Gp5?15;&ǸO=ϽUv©, >Sż3WK{ۿdI}~6Y@a VR XjZ.[a%|cDtlOvh{qQz^f9PL;ۑio7Ͻ{%tCub5`]{(8F[[x }|' HMM}$P j2oL~l-w:Y~HKK ܹ3}s2Fɢ{`QtV`9bgg3|wat~l A<:3+"dӫ6w=6?8qs RWBy6nݺgٳطoO?}}DT hX\U Hj3Cg`3#~Uܒ8CLq* +56'mߤ߉cQYJulIpf~㣏>RyIcݾ}׮]cFI|_g\VV}F'1'c~Xkߍ+ȿ ? ;K?!?YŞJGR6yðdn@]_>;["8bۿJ>U3tKζT׌oGxB$g_AoA!䏐_"(pEus7TɈ[ǔ)IQo%VhCyۋ$vӏ??>;>㘪~.\DJcU_5юH>Pf'&S3qr8/(fXB\ MGAyyBܒ~rKrKZMïv[?%GFy0x*5~IyhIn9-gŒlc;>=Ç0b~4z,oSg3>#ſb3~8_u (o ar%:q7ǴCq}ʅ!Q(G9,NMïβ!<.IJxW(:+%E^ye#,RܡePmsLFyQf z]]]įzn~=Vђ(?O~$2@tY@W$]ُ}yӝپHvt,&t}XQ]9G fd?rx>ʕ+D__>jR~sZ[[ͯXߋ34zl,iQ]N?~!"phއs_VѸa O s/\dhD/4{W4pfKRTېg =sC񪠠猥\w|dgSSS3-_ ιW4  ;Z~O8v޾ۗ1p".w!\-bJGfP={ _4'=N ʴkǸB M0Xc-BsQ~tm  y2 +sN:ݻwF0?X6ϹsHkU=9#Lïo ؿ ?C \߸ӷF0t߾M#{ET'*vhjxbCs<8%2zL:>UEz?$MF\Ru/dp2ʧ r3ێ۵qAɁqs=sK |C0 f N&? ;̭-q71%fkykgqQ =vz?*. tܷ2Y8/ ixg,2Z 0'ǩ$KmHyɘ(Ŷ {H?w6–@k[ -I^GCG3ӨhV1gwn&Q.rzF?/ߗ34R"ٯ ؊d&z޻.'p0Ό1ٱq`d_ˈ]4^wd0è' -۾?C`b4J%0,a,T K]h.M]&K"a:bI}1gnLyh>j7giؙGn-9 vys8z\=##Qhr3P,K8Sc4 vyH'R(k:Ÿ>3 q)=硱}10AXGJ%>]k`Nz!R^b&Vu~h=H9-wIܦ(E(O׃b6B[G3̙3ܳp;SCdyc~=VU^\|熜K}l+إhH]szu;߿iC']&i3U{ v yGԏyf2:Mxhl4رؒ-bNS-CJcA YC܅s׆k zk-{I97s~/IS/?-յ&ȗq8(Q~ʪ{X1 >\385^*g ߻Pvv'^BܡBt^(bS1ϼu 'oCǍ܁"y6nGĉ$_VQ-\<~8&%EhbCF9ij.T"7*8 ʷ>pŵJt\ H7f#&fN#ι`$'. mJy$&2 F,^n))xwù`ρ v|7  u񁬽$ݕyl7,SR?]2VKn+{ͧb-eΎgxdcA(~ ŗ9юi~ҁ'{,Fny=0w q[|W7.aޒvn˽XږXnCn:>S/CV{c~=7a#쇓w>ɡ8n>os :S@FYݛ:fFv^uC<,vx#o]G~IGYa!6mBKB<_'M# xTf%r?URw_&iUֺ铽FL=qkvv .ճN,Dh|1o.q-]p(F`k,k #ME|~Ek,cGhݷ6zB.&OSf// qg#XBZZ E}(ܾ~>v#)G1  \UbjS`'h'UFx" >'_FHb$w7&C$8 imXa)i3*K,r.L+uiĵc{rƘ_3o]|r &Ưu'j瀩2=1֧<5ԇ-H HgeFt`[ו~E6%Ւ @$砢i/^;`/;'}(ߣdIA<0kHf 5|_:t͐6X3̧%ZMCS!9`*pd zM˰j܏Td =<]>ζvcP뵞 V}9cLïm"]rئ2كc!-H{1Ngئ|^͹ GTV"voLʌ/AVhۻG IlW81d,h>T}2$-uV0+8ejdbu}`ja sr?znESޓ'$ Uqu9T!"~Z;s|vQPؚC6އbas?f˱Oi083Y?k7qh/:x'Ź7gi5"yo4$`:%bh#G!sFO!1fwA^ш-J/G9wN>yf 9֟|G;?N+p>"\a퍚# 8r޽̵? ٸoC☟JlN@dA2Dzn]@׍A4_F/ z ڑo WUІI2J84e9Zkn\\}F ~l;Y} y·>t G:]dGaOa~X+ p=Zhf Ů\;4)/5Y̏DT^ 0?۩Ql~O}{mg&"K?ZRE4^a t2˶Mk-Wj.51oM=;;'&_{'7*tClt) Rz\?qE95O,rHGfȥܶ~|=!qqLذҚy`JLh7`{+pHhhܒlpa~XssGT.;8 hƌ,Ɲ)CX[6|kW;QvH{'`3q[y1V(.Ga1-2ߑ,|̹>zY!S_Q gX֡D+Wv_?>dY_"x<# 8Fgycpߌݣ?Zqoi/Ԇ}Yw$H}R¹mc)cאC,75<9@q}pg'K{U{ 6Vb$ASU,bǷj&q 񚵇4f`cp=GXtzS(nCySۣR՗ZQw{y}о7ΏS\.{ /"15BW}뿻)'%_հFY{tL<Y(r/9*|Gs<ɧ+嵗3P(H OtMd}(?=B69ۇDٔv\FO_g\}$q/H#!%RHro?Nrl# /N ;S0 f+º^y.~k.S]33(P0e\~M v )Sp"Q<暿RgbND8]v  ABփεZ;9&Ï.\5тk!i(mDBw R^9:`ajyR7$=CZC9k`TNHq6kR9TDz[ȱe$-%*j0#M99X9՞S*MXj^emo:P~Q ?1&Zv-_3v;rOfYE>S-~}^GU]AFHy[uog߈>Ƿ4wG^/Ph#fO`\x]kN $g`&xܗSe+rn0PރHږklx8B:A-u޵2OYJ1}XT=?E1J:duըֈK8,u<̤RGjː{TSǭ36c6sfߏ806&uU4ed7hOfe)kiHxO`'I=HI5O%İg`LK:f.\=(ޑ8E*͋ω{d~:t,ΕG{ X#qq)Y3+-'C,z%/{3˯lmǦc!k8ҵBRM"yKVdC_k$ 6iN8Mkl_í'=jWn~8#{_,i}и".I1U#F\r&FD̢=9A_GOٳbA4ֳ9!4O_Jf+ų r>/^9 ޑpz8ܞE V5qA 7Ċ疾^ ߢkF/R@p2 XCg3Ӎm v|k+^e=GLU|iY04>L̘}H+ )i@'{&?cpvUvkƙ}2g_ i3IrO Ɨw ,S=EXRh̓^{]&0hL E>)Eŋy\A#P7/F}lx}7fk-q3_;S1d߼iq_ܲxE0|eU10Y|>P#h Z8<9eCAb<ѕuJ F޶@:7I[{1NGJQ=2%nU_3ʚtVWYp]}_-ńUos8vc.h{iυM&[8qO"Ճ}++.d^xa^]La[ p. C#⸜u7Su{\|PF Wa]G6QL_zGɘc1vҒkbzFzAyW/0\#6~}>V6"Ukţ۩c %&V=VkFY2Gqߡ3nž|_i9qF$ws0t'dzi~sZ^R ȷ[}#Y^ShlM!ZI?x1fc'_up-*}+ObJrR[Q[>ͻ.0Z-8GyF>2>]ܬQJy{JCe&_m?y/ ^^*/+[?҂9Oޏ鼉p=BM^)R=VkXvAȸZq(8QT'+,<{6֡q"|HYZrh[QN(Ű?>:COOq10)~H331_k~ߪ41r(Mi}L8Л,oc3bl\!?m0f.IdOKi){3PZ/D7&Ao5=dT!G<}qqNԱزH~/HX 7`_$G1˝=_aYC,50Yÿ1m<1rJE#KΙ,Dv>R%[`SHҜ"4Bt\In`bM'`_8)k9H +2kP;TG㚌/'k1@ y0Kpx4/˓\MZ͵I@PI˔I_1 Z]{y^/' {\Ja}WǢyS0˄8:'EZHKp)4GD~|b⁛BLևNhṃil|._=֚SV^^HG@F[_3#yls)_8W{*LESIիc _-5-m/0~I9NJ}xtYU\,޺sl]`d%/k&ĦFQ.jsKD\ߓ͏ұ&!?"/c<3]Y~IhhJgߜ$x=^|q7mұmv&xn+<1>PY rR$>"=7#~:]y AzSa~rz+> e p2x='F9W@!{v죬؄6N+4)#P:AۄcN^{af'ch3v8s_`\1,8>G\-1V,#a,E('ג߷\KnwmR(%W*4E?ut1qΉ?^>$]EJf7:c#DɏW/Q/iIkG =y}KVQ;(NCZr3Q5|uT4(>M^f ,x9R/C|bc--UDk+7g?|j3I _9'*xM;5nlW)#R ȈB{HZSSYjl{|57c6Eli::W,Y'NG.3tb?28??W* S};L/YtS&A4.LcڀaC+b9<:դh^y9BmLh,\A&g<#h+>J%~zDtZfEίe2;$p=S`gr^H=8w ٗ؜wu8~X쌴t,lnwɯ=Rtն$cXI5Qt 3=dݥZ"Z[g>dtͤϤ{Rﯿ}AݻppÓjwgi8^L~aJqLN*Y3Ygxq/Zoj%]"TNI`8:H]/=Gi#5|THcqZcjoa~هd&'>!{.,[/jQQh۫X_mP/0_ςd~T+*t\s<ǰ~,V)cvkl6c֊e)<~BE?z'KXG}˗Vr)n}R\5_1 v=^SnfU`($u4mƑTiQ=/Cqеq/ԃz&FoF0˾d(K-2EBjX+,ۈȤAfgp [1\RRa+!f#+߫,7ѫJkk?iQcBl 0{J; q5l)C0psZ)wmuXcd8B't\륵9\5Ä^[m6~ViX'] ,mQ}~m|,TCgH/X jg#bRCV5ؙȾ<}%Fb͒ߢzZҜ6"*4*:uK72CWle eωK[],/k5ވH++r 4% ,:Y,31I$'bVl/ū9 m]v `sm8/z* }ֱC@crAQ[U5vu E#Vќ|^kqM FLđEzVdp~V$6)[\+dnG8K6 ) s̲=Be@ұcϳrk{ͯ7( f)ÂcYb[<7 ..=)ӬZU_9zYhS[&a'vjj~}ygkyv&O [l2qBY1rJ & kC^R}!q:=ufg/Itc&L}/kHJ#+)"NEkFM[@Or^X> Ir Ml?2 fYE9E㐴]HGC=רUTϩra53b'Gi\zd =yKg.݀3r}~ ˌ6WnX&5.['C W~-BfϷ9\H=E7$\×zņ<k٧wfvb8uaVm~X_z|0=_2}ܒJ=rq(ǂ;NQbaD~Xr81/I}܄RQIsj ɂO'h0R8>5]_5W\ ǬH_߷F\6+午:]eڻqN钊k(>vSKdz^J:ie.pfm&)J:'zo9+KܕHu. 9`$|M:gڂtgDq^SlFo_@ӭ*؆ Zn1ǸF\YG~~׌58Yܑ탍n[^`P/l63(_풹_aobib*ms[E2Pw=bN}@┽Wm:3cCT!fVww^{Rh#" { %{tlUݸse{m \Y/%_ɏK #N뇱|3-pOa[+zI&J׋h/r.QgcO| y!TkNQYHd~ƒct"9 ?f|>W!=KĶ2ҩGbH`nI+,aŰNAZ1F]3x[Y0:`+*jXY5XG1;>cY7Jo׎r_=l"X阥1+ >.2yc9y#}3gaֺů :k/j_; ah{fvLïkqi. 1iVaHyQpEy!YX|/ = {@ه1ǹ^o KYDZ*$; V6%%gk~'YCsOTս[u)E8C^A>i;S;?>kH/,}Ho/燘ykdBO3^‹kMS?Z1w'#pZT5wWc4BߐV f/I='˛#Uȴ Fb]1fN zwXq,4ߦqNf)[ǃr-V7Y@J2K?^鬋*סkgǹ\hȤzm|5ʶ Vy`;b?-.m:/h;T'ũ$EbJǫ1:?Xdr7#mPG[Wk%פGʽ/S.{eZՂcj#+D\XblfkYGX'y I*j&Oh2dIG h6Q$΋>]<$~5`+4As v-dfIxE<NqS%{/@ْ6؂Cvలյdmo"$z v:F[uFs2Is|ys`ht쟊&vqɻ\JVYĎ4Y)J}ҤDZzWroCd=„hf+'N#5:oTˑܒS_+,Y ujRk~q62eHż I@ bwR! )nmhKOqy1:lz;yG96\,zi9YƫrK{ٌP.>)̜JtTfwGe,ǥ/6njUkKz.M^_(qAރvtŘoD}h[{uO,6n-$n^p GHL*&{cآ3Z:`;tlY0OV"< e5P4EDB%vfq=#K [9 4vU ߙ]rHDbVH<.cش݁uےZsSWèǡl]Gx#.udL//0t? W{i5mH# {3>4UEδvg?}Kl1vĆMX`"-̙Va0w:,_a6[a-S_濈0[bVmc}EWJ|X*q\ډ!Ą5Ʀ0 fY=bdyì33K[Ӓ#˸#^0ӆOH1\@ei|EYpMh]j3cAFYwqJ'3y׀yS粶udoGط;~?txդNQ=Ͱh-{3FOMjfi5-1Lտ~9>'mWbbů7 9i+ Ÿ/-WLDFpTbwc BRf/+r-Ut,̑Sˬtlu~`'Ȭ2|Sl sQ: yxޛ׌Ώan?53~j?}|FR k X H;[M0*;!xuR9 nF{8p2i+v*9]J|1fT}}w~Wl mÂ7ݏ"-=~g:--׿O#Oc/c߿o}4U*##| ܹv-\~/^OW{lJa$,bVA/cċkT;>xڮuaSk=g{oƛ_֦r>;î]gbdllZ3}x~8D48_9/XkޅTcJ>fm`5z'+Z݌6 +;]i^*F(*8炾`kkr$fIsM>;8?!f^Ԝ M$VMƩW>`;sssWen냿?ܔgX0yE6M`a]g~'~|6˿ۿA:?daikkO r~mkI=(>l6_뗄9U*To'ΛE&Q8;ѦceF?ekQ(h0CaܲSwe|abF=??,^]8r\&Jb)U|o>`C9ɾŬ(07ݎ}v7Ƕt^p;~?O~cGQGO;GNNO?ewW_Y]dF/bF[W,N&"MF->ff*K;1`%S}7cMïlb]yq|% & }Pc @c,Xe5x^M@1(&ؿ' NxȬ:]Sn|#rFF>wů 9zs6r!W t+<۲?ɟ>(1죏>k0b;Bbt[#U0mx# }PyI9g2h^%.ua_~)ڿ}k~H3klfϱFq04?ƽ\L-zmyW@*Rk0grػBщ%o9Š6`'Ƒ(!<.gڼRŨ7[w3g='_;o=?`a9~+Ɲ5?υZ:{Wl|} Kbq}2/}@➨*I1۪ε Xhc_^1*Ev?|C?4z,zY9pqk܏W(YynCg{uŠnػ_XU{ ./İWéK7>1scѓb+al;Bş4?Vsh9׈ '~#+DYE{%~}g̰wFZ>:?q(ZIs2cmBz+|#Ȫ*'ٵc4zl=ooi%?zS]ӸC]G}^)4Lc케-۬8=r_Y8ULio}[oœ}6~` U.K؍P`<ϿW`Wo$U 6 +܁c#石)dtw8s/%aR6<sO<ֹz˹_m.o>:%BlTk~MïvqW`Xx r$ǍnR=-tS X}CbՁ'|+9$VMd2k7}*"o|o^\oCMv#? ^7 x5Y[jͭCoZlk*BW?8wJ_ ;BbY"{a8gh#FmП;r45߼RV] r rd,v 5%,U}6#Mïk]p-K4Ԗk(Sc֨ KIWϠȩRd{}>Gxr[fW|O?lǿA} lwupuz:Q]Pͪ#xvӻwVK=f㩧b^gEUWwJyNeܻp6UΌ4cĮWs=$,%mb`M-T8#MïkMG>O~< Gao6:N]Sɨy Ų$u $.=g̚8<ɺ#>wkFsNµ~3U6K=8چ~6aسMlsg䠔Gȯ{?ǽc xgZguI, MxصT/-\#Ϸ_}l]U.)p vS8#Mï9})p(bZFǠ̗*9Jc=Zs'O,Yyx`ScޟfcճK%zi%Zxyi'XO?pkb/Uۅβ܎A\D:k=86g-5r h>Ȯt 85eZ ׿4_Hv5hw;8+ 6IY5y~8M7bde.X߻p\~Cwv8q2/`W?Z:NݧGqқzO|G8o5T/D&+,1[xcOc.p>Nߓrncv7ٴwZGӈ4K34X;'/Np* fFuY#wUJUãQחaSiSjDwdF%,J"@KƶnbM<qAai?Hyq7]n,]Vپ5݆o?l5UJ̱/Y|o> 4*Α6rc^I1+0.{v""zrxП"*鿰t!n]=(K?R Lh6`/734ZNG j1Xog--h>l3o/+"{*nI̒)MI_)a%F' ;?]dA16H˼&<'ErcS&Q/h4:fF_X+AIe-n׽g_VkoBmK7sil_!3i_V`t9uQkaX?^}`>bN]WמѼb}dB똻B8Q͝ȍI@s#kXJߥcU2 F Pⱥ q.(sWdX1=L} "#hC?s8u}~N;wctGDE. ]|$ Ut{wz%wq{+1bb51+& aq orn{+][ߞ~m1u(3CA}_R:~bk8pGc=`ў5vG̯hW?7*ɇ;Fdz|?Ac IdCG NnphcAlZ$Kb ?쿡{~Hx..V8αͰi`;ʡVƤ jİ6$Xah]Zcֶ嘳m5_-ƷktC/[c:x=ȇOy'NOܙ6"+~\m#)o|dg/ӷ ILocvoHB#;u0򑓽6}q~ "ľ/OV#ˉ镶 P% kWBEِ%~hlĦ70cQjRmֳYBV#?J/G}'SS?w ﷝ރv#-Zdz1,$">a#&1BZ*(~1镒D(ge\Z (C^ v_L⡓nzQkhSm#-a]A/gsػiSƽ| PW_۪AEzlAuYg@KD _Uc b/":™E>{R#Kbv14o6`~ڸVӞou)\D@AL*{E댴V < N_A6nfoh $);BdzEEJD}@g!. 8%}mljAl{౜'>8)6Xy0zO_M_34JJEzPQ.U*(a6e|v(vܺ߭k+!vE *}ݽ>#/' X<0ȇ%G);Bdz8̊Ϫt&Զr{ F$&ns'{ٹ3aj-}sxau`b]rN%QX7)=IT/^@Eى"^QĐEe1jąX80fk9Z %ʍHĭA1e94YWVp+2=);Bdz<ʎ|5Z7_و[w$udOvg@(oEȿ/녃{l]ĥm>L1r眕7g\0k"3AGu}y_j-QZWŢ5LJr$ʓ_ҼhΧxtuCZ] H,_w7^eXi %=ߍLLnp O_PcT?[K+SϘ[\W+"+DI PѭWYXxhݨg] Kgy'ΦQ\Y(gAEQvydEƯZLcl-bbb6t qL3KO$OaUu>D jb|*U|[ ]3n(6uUEw(Kutg+ǐ*UĠiLvhpcvC.E~S>\dz4)i)nCӽ8(ϕ,$}K0~2Q?D5~K1Mj%}Ihm5Tt Zۯ9{f݃]Czʭ_qpܼD좺̂IFMn1p ;{YV)-6 K@\Bܸ)f _?8zv.L?+d;k31sp0shn _K}昽b^߭Lħ EkЮ{M®ܽsg*K͕_/Gs;x("rq HL/+ U3shJEƯZl3:Wc# cKYCjPSׁ“(ϾHO#Q=Gjd܆TTu3} ,3bsUw3K[nflZyۖU.i ƥIW Óa[K^6Iylj~EĩLUOP*_vL594"c-v ,.)ALlYXRu5;Y?`%Xg+=Jp AJnKz>5׊j;SH:aYt*֯768q&K^}~H} f{k vqBf1}T<nqMP93ҟ0sTdz8XQYcfAh9cçĞ}&8} g/Ym;p Ni`+{@K^ƢE Xֈ7Zc+ljCqI!Z XS?n]k +#-2~=9ގO4zۻD WzD,؉vp]hњ 8:sfbu֜];w;Io(F:^UvU94 |7k-\:sL&Hb\mg +fa-f.1Y=37.O[c\w".=1>Eܲ녳w.X]؉ۗ»:tǴkD_oFhXبǥ< #C{#tĈH,ܾkva ˬYJOP1\ ?*FFQ/"STkJXBӨ_EP7ϢBm1lHQqfn^kŗ_ZVێٻ0bǴkq/ )򸦣+qVΪ]Is8s(6Q>+'W-^2VOoc ܋.B7V s(/us{׉xƭ窊_Kc2nkWF"x`S-Y 6vZ_2yrͷadی],a cاz =ơ} rױ>9 TGDb˟^޵%׉ 1ߚaai-;㟟oü=kx?ġh;^06deٻzvClzZ'8Ʀ0QсGuK;^c[~ 9m[@-̝*%~/Pb׹6n,""q<c4`@Nm:6}SNkK&  0GTo +#6;1z&XLz(G*jaٳ֩NsZ:w"5KĮ:XHuϋصF{'㳟f~=wP ršSYOkK& Z7u{M/M=vu-ϛ^9M`h_u}ؐ8ҙ˪ Z%;%Cgk0)huZW/rgFbvӻalረ<އrW~E/yľ]bٍk ''5x{x&/(ʛbqa|;k]Zy~5PTVd}rIvΟ6u8q{0ݩ!Gz0ޔ#ـ5_!sYt.>t|BN,]*$4]8rRc~u|'+2`iKK{hiaX~f^-Ĭ-y_ݷ SO[K&9h3*ob3f/n}1^uͻ pA!V.5Lz՟5J'$>T DTqf{W}nPȅt."v]@dv5o~O'1nhM;hAkaq)fo^9q~d"%kqM\7WƮ{[nn܁b(GLzKqR(R[R0d9<T#XdNflkvc}PJ*V1疨>٩8wA 'C+';o2F;wK>?ճ7Z:8p03x_]؁ O"c-ѽMs+!EEE"""oPv{> ~fsP8o^t\xYcwC6!1,*9 碡iTvs~} p Tʡ_ErZ(\| noFfh"^{x:~PG^^?X#*( rOaƺyۅE{VM<"c#TK uQ< m ]{{{Gsqqq<T<* /~6I=ξSƞ#8tz\HzI=e#+=kylfHn$]b00V8~!8p6n̎Dݷf=/}~O ٤5}nhAmqlkum} gm_GO"#)d<WqL4N]9 S|ΉFyy9%߹Տk7g^ D%r53;X2;G`.#\UˇW=υuD msWS~']U49/h~l?dFKe?}鎯bӪUcK1 C$%&}2ƴ~Ƨ^tuu,DIB&#x°$D9Bu;!."ٜFQyDƯGRNݸ*Wo~FXX$Wd_/>',~9r^EŜ_sWS°lef%ľsD o3-Ptc8S1Q rɊkUXr{jsO>ۼ/>{IǏ^:#Xw.vq -嵨)xe("4 EnpBΞ+jg>YWd |}`,?#e8Hq{F9Pcx?2|8$+ʺ%Cf,+^9;bvu? mjDr$%:w aɰviQZ#FNVV߆2֠x-(DsLz$'3q=2e6.b<kc8ILnFVچҹ {fgj_SƙpzXkDeBo঒&3+^gN;s81HS]nϩi)2~=7Z+]?80G*Սns <(ǫxsWʝ: Y̘sKuKW`[q]3-.|U+'8s?^|}GzUfW^|MuUNvSP%E[=4~?(^z^ۗ~iS=H%8z}tOF,Fq(m^|oV\={zঅXISX UJx ^qwz,]xOhb]b" KƳ*TgO[og;~_G"/?9iiix'-S/ _:ދorXב$k*#ڱ5iډ_P~QHWv&ܯLnr}fsCQvxg9>,Xy(o3ۙݨRD&eᆱ+N^tHN) 0V6'9so-۔\H*F&F3qiy012#'\&nO҂^#{5Ϊ߿ĺ_{6MfG&Mü _TGDݵ|>M;둖Wr%nqlMoYF1 k7ZZK˘:x}_颜2x#")wV5s!1:뙝Ŧ~nkз,,5aoEI'g:g4zZ:tN_O{K<,?g|/0ԓ/ap1 kz ~4DƯGV|j 5.܌`3`iK ̒l-˿={/ؾb *$xoEt@9b.4cjE Ͽk6CA#AMaCoraMcC^ PQ.b;<1QI[k+ -HWXiov^}E)sgq3}0~ɽ)SNdzd岩3̨ DZsS eF{+nDl]QPՄ^T`ncli{܄%v6k5x k[GWO J=t0|?s'nElx#(sxMm53Kh_]b!VԷvf;:"7` t#/1 ն7L`chʸ兄xD ӗWC\_^~cƯgcO`ɚeصwfm\3c*C|^M+Tg8Y5;:]L$MD ;Ts‘^m=]P-Ŧ]6O>O>sþNoj`L'EB'm1 ^Bc# +XX }G׀GWC+o3{~W_~Ka:9 sc_VcZ>Љ.EEȫu0zu=H !ͮMFH,♭sk|uv.n,NCYl&rB?">:m#y9z _FG$9mkxp/8KWamnl?-bR=rE+~Cdb6ӻ]Z7T3،v(a:酗jkB͠ *aքka =m̹l.Gt-CKcgKmۺ{އC\WI|W|fƮ3]+0{ y6mDƯGJ\xo0VrKhCԠaH|;RЮIp٬Scq__!`اttڴTe?,KZrI&%}I{@A^Y_z KU}#rƣ &弿iBN9'ԥ(=7)y]C6yzG:ZyVR1zii<~ۋrȝ+ʼ/xW|^"vm/7 h>U7L\6"#!vpE'~ _Ȏ{dΫU3+~ O<txZOk7Q5lCG=~Q/;"#!FG~e˨~KTӘQ m8lo=3[~[[oоf Ջ8vXM ɾԣ'ć ^<z#RSۤ9" ۡiLb,#L³!ZFu74zU˗=u}d'/x套uafo_ )sBdz$䔺lnZAGer7k^|ᏌWyWyY կ% $oY5DB%~߿ff6.)J:5m5nCϼj\&$dsIs~}g#mN9XEi))viz^[^E?|vu7ׇ bTG{9ͧ|M =mS^mL!\F/3/M$د~+Z!C= cSVd` cƛXb\ ʁػ}(݋B{l3'foۡެFy1H ૯6`je \RɄR*pY9CqE%N>| 7EGus;ز0T{ymzg";)H N?x!yc,> Wb"\VEycCEy Y0R Gʊy_W.~ Flt ?3cV/\g_5Sr05G?hGMby^۴zn;XANH/qn5~{{ZTE/_m6CY݀H%]R}Ñ^5g>~=mHC |lϏA2~-ص>soEƯrN}eO_]Z Ek|PxQNceu5w7_:WUPtdD' / pMk޴B;{q'/c3FQF>^1ظU数E|f$C6rzU",!>ҷB|u"8B}sO\Ÿi"~QwW/}pczG zzNܛry 9Xbd3ȼSك%HșBy@g5JZ\<X+"#..b #O̙{3O 5 rx.aSq%ʓsPR W%S;c <졵H1aػ[6 g@8` CSkhBQU PTք {;%cW[ cR9 S}YE:=w2KK˿s{"aO)|W)ZoTCBcRRc$y Es UuY=6~;`n+9gNV)f80]k,ߵ݅ pHcSS.K L$j|Oo<|qӢ~DcN8x%dRqm=(*~8/k=/rn*jZNm1]5`[謨Gy\&Z'dxH`]sq?VǑ|yOFۢ]|kk*4WS\lµ5{d0.i}9fE\W K9kxhQ.&=m!6."~' {]Aneuqϓî=XFLx|]gl?"8VEX;AHF^ 06uqQYi09f$"Qi?7O݈KˇREmj+}#Q[mc ~ qfռŸ%SW8Ak˾ H|1V$'s='3Wׇ.+scLK}לFDw*ˎLTѶXww ak3 {0}ᦩ=옍bYF˧t\R)ƙê<6NjAT *j:1Džk)>C'|"7wmu(KCNh<IgcY_d?ZhR f]SE~D*~f;&-+:*Q,]z -咑UҚa Fҭ>oɿ<";;VV<z U)܏D99$dWq|9 />to Eo{u|2>WWKg DGD<5ObW_?L-`{px|k>]1s"V!s):nl=m/ߨ_wD;QTڌb70}jwcŹcZU'K5UMx x L"ۇjn w !]w{[>XѨmKϥ>dKfv2R6%O@d;vن}=uYw%}SMQ)+Mv䗉e46[O e MvLZQ?rPC[]%Ɗن|"e硽5#~m_m_^Ԏk?/R\%p]Z`;}4jZsIܛ]oYD^! ScZ+',~aģNݔ2~ SyKc˷1;,;Yaq3ح,ޣZw`?\b +(5W~4-Ԭy@_Y<)YE*/{_Wv6;2ֵJLO;g7DOO?vԹH ٹñ\ UX9y9ycfOnߨʷW7b]0Hl\ZXcS7wc1,3Wԃ0ݴAؖv]N2~ ^,$#L_4 K,QFؼ?X|crx? .}p5Esh; ga;܋=_ YN(MY#گgyq쥦c^+үăr҆#Ӿbzi95|{af;=YWRPV23zl!75+.q ۫jҾ۷aO٣ V4h'Jdt_:s uwsnJ_Ax;)״WLryIH'l}lc  ; _ˢ5JC`9ߧ_H&jatӪ>23~G QՎ2]b0E׃{]?!oK-I~!9V7|qkЌdf?֗bz!-3AXd iTUskBQ4"_o kb5m4<3ʪv~]{{3n~ə"f/Xx&k0b6vԘM]Ư˯Ѽz -.#/wzS7ڴq].$I~=#'<~(Du%dCc.5QwK$*Zcw}44vqP75 93V!sm<g. |XFvOSޭkļkX9s Eyl4n:M`R"muMȈHPЅuF F,Ul']8u^1b yT}Z*^=Y9zER `\' )W/ScQM_ӗ_1=9+fhηǯڡϷn+^6ѣ^QY/ֱf1ےg<$ jkžˣΡ$y]o\߱^~y}o-oS;|Ob4?}XT{ws\RF'Ll9޹wnx<,~>a_b2),TUz"Q[[;s(B}#8Ȗ#'-qd!>~_*8r9Z 5D vm6<wQ@6Cp2*Noyy=5r/~>}zimo+6 &Cn'k J;z;dͰN8k)ZD iuɗ҃;6tdݝy/@#5⚡ERq ?㗧 CXE'ӌ%:Qld?6ey;MHuk4.TD o\s9#Rr4(!RD>Zmyyc)dE} My^2G`%#-&MM^/7P#PFzm}ᜢx?!G:VC-[;8^CvIeC/Jr&3lKd7oYMu-',iQPQу3޹O)ۏguÚ01t?_bXO~ecOITE}<ǛB_S/ '6%Z`G}UB]I_9mT}Mb~0a|Ui۳r) #k1-JqOܾ=ol|Pt.s5]9x,ylPjm~)N@k赜=)x-I)FrTʤ|aGUxoܤ#6攄F|`ǁVoFc]6ߟl#}G?E4֨on5/q:̄dUZs=u⢏`{r(!αK-dtGTcqRShGn?sW_mU:ݓ_s;|]t/4}!?ΑuQ5K'0QAGG}ĽOV+8aT4)N>)=[]=H C_J/jd.P+h}^6? WXS3IK94\-ض`=x͊?_ڱq}֭w;yPk~U0X!)݅VhG/ W%|Z> "cu>JѷEH }'mQL\:^\(GEнö#{1'u&3o/8ޟA=DC:E&hm`=N-SVRuұX! -O^ rKO=#()I%~u39/[pxmgOaRa'}sy6lÆ+H+e(_nlcK\_A1>kmH[ /?gA~c ZcQld ::&a=Cy} !{TΣWIf=zJ˒{ApcoO`+Bau^˯X m@iYNl\^4R?$.Zkb~Q2=oobs[ڇ_9c)W nMZWloK3)?/[O/(_1}#עN_׾B~O_OGrKλ.N9䛲w3Hyb|^'ɠla\4oG=?g#Giy똯1|C/Z_fbcsD!"< sOS|ݒ'X"(*jCӵ yot]+EO1R1U@dJبks]MTKtfڇӘ,ȝ3IΛ1 ) zu6dwKY~) E7dn?u67#i5m"a_nsܫ*a9Dܞp;51v_LrɗO#s׌;^0᳞wu*d0J1:^)ΣhoVu^H(\5=L$sLM*3\nZșͯ" n4=kujkE#3B5b)> RXؤb᪱k/+s6Ъ)%jH~ s |_ so1WuJJ>u4Nց\ryIs2 uQ5WI{O c.{STW}w푙"e_vVW<~x!Z+,zt!Q͢Dgkf'ꙐQ55>\-#Nظ;2f- 4hXk#΃0$ j%Kу'OQBÀl% `-# yg-_{f' e%"ӵ{mNyJ/G5B;N;}|Ɏl>}phti!?kƸѐD|-c@Fa+an e(dsx0F'Oyc&3]T9U>F~.ă^qNq ?ِIX|s=* /~81~XVH͸-Տ7 1n_FK.p}Kz"56a^^$]c)$}2T݄zՆvE;X`}|+L4t$ѼctFքHk[u$p-XŵKbb琘9>8-1o)rudԷ0ǹ/$Xu|m2&(̒n{k@Zr`T&(*]c3TQo=[9?j04MFo.4uNFK9#RL2"S h |qi;~T{k~ _f8/m⾵!ܸ;kM>wsM(\UjTvoz4r&wz25Hz<qIu7-OkƱ;Gڮ-\x_{{yJbXkKoi8Z:MݩByZk~m߇4%zxh uV+=jœi565c`07=;h{K7^Xun?vG=M- ToWs^^ flݱ#sۥ-k_F[1wW#20Wˠ .\7J/k{aBv(u!Sĥ:fi>U1۳3%v$Ư _eGU"eM8h_j/g9{95c!6c?mӗc;9MFhr&ڽ|f[̻PCqX8:)Ω1_أ9 4W;^iy6+//};so!OJSi3GOM쾝*dpΓG%v5Z:`<޾/<?F'ѸF=V.ˊ$~xOxk{xiX⿒G1MGw4t8\[">9͡ٸҶ-."ތ'Uz]~3!,<OWM׷l,>ԋs(_Hl\݌j'$`Y`AW` lb/9~]Ufů8ƯHY#O4"Zފ~uv1fsf?=;?[ܾ^ޟ! sߡғj˼bybGt.LDv7/a܇Q,9qW&!c34u} c>nXWQQ SU' t@ghZ߂d]$f4ØSχ_+ qW |jhr1kq~Y[]o~#ǫګ %PdE\DB[ gwKj 8׃Ř{a^}ƭw2~l羖yGƔClkNnkRmg{k_FckJ?N /NgԔɤEI&C3pPSjґBvZMԪTRLS@J3P=cq! N3Y,meU,[>Z"9I$$ʒ g@/v(mĮM~~nYbrz=^p0t"p$bSG#(ϬΰiLwvy_UMkI+~X$|5:tYJdiP+dRNFmU˙3P!34;B#79 4(*P;\q̭[}=﵂qk.,bڿ?GbG{4*RI񖫙3F.+s^_uZl<_/1QƇڱq=lJrz,徘NJ#,* 0+jt~J)~M,TCAec~8,,RSKW Jsj3gU&dA9Ᵽss9忄Q*16d|'c*y}.泖Z7/f'DlvB)*u8_z#!md&'e-'BU^bG;0~)Ґ&@Qrތ00~2 tړ / 1301111117 0 0 0 168 ` l..__libshfolder_a_iname__head_libshfolder_a_SHGetFolderPathW@20__imp__SHGetFolderPathW@20_SHGetFolderPathA@20__imp__SHGetFolderPathA@20dclit.o/ 1301111117 0 0 100666 580 ` L.text 0`.data@0.bss0.idata$4@0.idata$5@0.idata$7 @0SHFOLDER.DLL.filegfake.text.data.bss.idata$4.idata$5.idata$7 __libshfolder_a_inamedclih.o/ 1301111117 0 0 100666 645 ` L6.text 0`.data@0.bss0.idata$2@0.idata$5@0.idata$4@0   .filegfakehnamefthunk.text.data.bss.idata$2.idata$4.idata$5/__head_libshfolder_a__libshfolder_a_iname dclis00001.o/ 1301111117 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SHGetFolderPathW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SHGetFolderPathW@20__imp__SHGetFolderPathW@20__head_libshfolder_a dclis00000.o/ 1301111117 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SHGetFolderPathA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SHGetFolderPathA@20__imp__SHGetFolderPathA@20__head_libshfolder_a CharacterManaJ/src/Launch4JStub/w32api/libadvapi32.a0000644000175000017500000144372413615720000022206 0ustar paulliupaulliu! / 1301111090 0 0 0 33900 ` ,0vv88JJ^^66\\<<ȬȬddӌӌDD۴۴ll$$LLpp((NNZZVV , ,  zz..RR  ""%%(N(N++--00336^6^9.9.<<>>AADpDpG<G<JJLLOORNRNUUWWZZ]N]N``bbeehThTjjmmpPpPs(s(uuxx{f{f~<~<JJHHVV^^tt&&DDDDǺǺʄʄ,,҄҄,,ڴڴ\\bbbbbb00>>PP    dd66  #P#P&(&(((++.t.t1J1J446699>^^  ||..HH J J$$PP  !!$$'T'T**,,//2$2$4477:f:f=H=H@*@*BBEEHtHtK6K6NNPPSSVVVVYY[[^x^xaaccffiNiNkknnqTqTttvvyy|j|j::66TT||$$::PPLL||44˶˶rr22־־||FF@@rrBB^^ " "  ~~<<bb",",%%''*x*x-<-<00225l5l8B8B;;==@@CCFNFNIIKKNNQ~Q~TTVVYY\v\v_\_\bbddggj0j0lloordrdu(u(wwzz}j}j44::JJNNNN<<rr::jj@@ττ""rr66߬߬^^JJpp..LLnn & &  ttNN!!##&&)H)H,,..1l1l44669|9|<:<:>>AADDG2G2IILLOtOtR6R6TTWWZZ]H]H`H`Hcceehhllnnqqttwpwpzz}}jjLL::((22  ll88~~BBÎÎNN00ԜԜ^^,,dd>>dd&&::    HHrr00""%%((++..114p4p7T7T: : <<??BTBTEE__libadvapi32_a_iname__head_libadvapi32_a_WriteEncryptedFileRaw@12__imp__WriteEncryptedFileRaw@12_UnregisterTraceGuids@8__imp__UnregisterTraceGuids@8_UnlockServiceDatabase@4__imp__UnlockServiceDatabase@4_UninstallApplication@4__imp__UninstallApplication@4_TrusteeAccessToObjectW@24__imp__TrusteeAccessToObjectW@24_TrusteeAccessToObjectA@24__imp__TrusteeAccessToObjectA@24_TraceEventInstance@20__imp__TraceEventInstance@20_TraceEvent@12__imp__TraceEvent@12_SystemFunction034@12__imp__SystemFunction034@12_SystemFunction033@8__imp__SystemFunction033@8_SystemFunction032@8__imp__SystemFunction032@8_SystemFunction031@8__imp__SystemFunction031@8_SystemFunction030@8__imp__SystemFunction030@8_SystemFunction029@8__imp__SystemFunction029@8_SystemFunction028@8__imp__SystemFunction028@8_SystemFunction027@12__imp__SystemFunction027@12_SystemFunction026@12__imp__SystemFunction026@12_SystemFunction025@12__imp__SystemFunction025@12_SystemFunction024@12__imp__SystemFunction024@12_SystemFunction023@12__imp__SystemFunction023@12_SystemFunction022@12__imp__SystemFunction022@12_SystemFunction021@12__imp__SystemFunction021@12_SystemFunction020@12__imp__SystemFunction020@12_SystemFunction019@12__imp__SystemFunction019@12_SystemFunction018@12__imp__SystemFunction018@12_SystemFunction017@12__imp__SystemFunction017@12_SystemFunction016@12__imp__SystemFunction016@12_SystemFunction015@12__imp__SystemFunction015@12_SystemFunction014@12__imp__SystemFunction014@12_SystemFunction013@12__imp__SystemFunction013@12_SystemFunction012@12__imp__SystemFunction012@12_SystemFunction011@12__imp__SystemFunction011@12_SystemFunction010@12__imp__SystemFunction010@12_SystemFunction009@12__imp__SystemFunction009@12_SystemFunction008@12__imp__SystemFunction008@12_SystemFunction007@8__imp__SystemFunction007@8_SystemFunction006@8__imp__SystemFunction006@8_SystemFunction005@12__imp__SystemFunction005@12_SystemFunction004@12__imp__SystemFunction004@12_SystemFunction003@8__imp__SystemFunction003@8_SystemFunction002@12__imp__SystemFunction002@12_SystemFunction001@12__imp__SystemFunction001@12_SynchronizeWindows31FilesAndWindowsNTRegistry@16__imp__SynchronizeWindows31FilesAndWindowsNTRegistry@16_StartTraceW@12__imp__StartTraceW@12_StartTraceA@12__imp__StartTraceA@12_StartServiceW@12__imp__StartServiceW@12_StartServiceCtrlDispatcherW@4__imp__StartServiceCtrlDispatcherW@4_StartServiceCtrlDispatcherA@4__imp__StartServiceCtrlDispatcherA@4_StartServiceA@12__imp__StartServiceA@12_SetUserFileEncryptionKey@4__imp__SetUserFileEncryptionKey@4_SetTraceCallback@8__imp__SetTraceCallback@8_SetTokenInformation@16__imp__SetTokenInformation@16_SetThreadToken@8__imp__SetThreadToken@8_SetServiceStatus@8__imp__SetServiceStatus@8_SetServiceObjectSecurity@12__imp__SetServiceObjectSecurity@12_SetServiceBits@16__imp__SetServiceBits@16_SetSecurityInfoExW@36__imp__SetSecurityInfoExW@36_SetSecurityInfoExA@36__imp__SetSecurityInfoExA@36_SetSecurityInfo@28__imp__SetSecurityInfo@28_SetSecurityDescriptorSacl@16__imp__SetSecurityDescriptorSacl@16_SetSecurityDescriptorRMControl@8__imp__SetSecurityDescriptorRMControl@8_SetSecurityDescriptorOwner@12__imp__SetSecurityDescriptorOwner@12_SetSecurityDescriptorGroup@12__imp__SetSecurityDescriptorGroup@12_SetSecurityDescriptorDacl@16__imp__SetSecurityDescriptorDacl@16_SetSecurityDescriptorControl@12__imp__SetSecurityDescriptorControl@12_SetPrivateObjectSecurityEx@24__imp__SetPrivateObjectSecurityEx@24_SetPrivateObjectSecurity@20__imp__SetPrivateObjectSecurity@20_SetNamedSecurityInfoW@28__imp__SetNamedSecurityInfoW@28_SetNamedSecurityInfoExW@36__imp__SetNamedSecurityInfoExW@36_SetNamedSecurityInfoExA@36__imp__SetNamedSecurityInfoExA@36_SetNamedSecurityInfoA@28__imp__SetNamedSecurityInfoA@28_SetKernelObjectSecurity@12__imp__SetKernelObjectSecurity@12_SetFileSecurityW@12__imp__SetFileSecurityW@12_SetFileSecurityA@12__imp__SetFileSecurityA@12_SetEntriesInAuditListW@24__imp__SetEntriesInAuditListW@24_SetEntriesInAuditListA@24__imp__SetEntriesInAuditListA@24_SetEntriesInAclW@16__imp__SetEntriesInAclW@16_SetEntriesInAclA@16__imp__SetEntriesInAclA@16_SetEntriesInAccessListW@24__imp__SetEntriesInAccessListW@24_SetEntriesInAccessListA@24__imp__SetEntriesInAccessListA@24_SetAclInformation@16__imp__SetAclInformation@16_RevertToSelf@0__imp__RevertToSelf@0_ReportEventW@36__imp__ReportEventW@36_ReportEventA@36__imp__ReportEventA@36_RemoveUsersFromEncryptedFile@8__imp__RemoveUsersFromEncryptedFile@8_RemoveTraceCallback@4__imp__RemoveTraceCallback@4_RegisterTraceGuidsW@32__imp__RegisterTraceGuidsW@32_RegisterTraceGuidsA@32__imp__RegisterTraceGuidsA@32_RegisterServiceCtrlHandlerW@8__imp__RegisterServiceCtrlHandlerW@8_RegisterServiceCtrlHandlerExW@12__imp__RegisterServiceCtrlHandlerExW@12_RegisterServiceCtrlHandlerExA@12__imp__RegisterServiceCtrlHandlerExA@12_RegisterServiceCtrlHandlerA@8__imp__RegisterServiceCtrlHandlerA@8_RegisterEventSourceW@8__imp__RegisterEventSourceW@8_RegisterEventSourceA@8__imp__RegisterEventSourceA@8_RegUnLoadKeyW@8__imp__RegUnLoadKeyW@8_RegUnLoadKeyA@8__imp__RegUnLoadKeyA@8_RegSetValueW@20__imp__RegSetValueW@20_RegSetValueExW@24__imp__RegSetValueExW@24_RegSetValueExA@24__imp__RegSetValueExA@24_RegSetValueA@20__imp__RegSetValueA@20_RegSetKeySecurity@12__imp__RegSetKeySecurity@12_RegSaveKeyW@12__imp__RegSaveKeyW@12_RegSaveKeyA@12__imp__RegSaveKeyA@12_RegRestoreKeyW@12__imp__RegRestoreKeyW@12_RegRestoreKeyA@12__imp__RegRestoreKeyA@12_RegReplaceKeyW@16__imp__RegReplaceKeyW@16_RegReplaceKeyA@16__imp__RegReplaceKeyA@16_RegQueryValueW@16__imp__RegQueryValueW@16_RegQueryValueExW@24__imp__RegQueryValueExW@24_RegQueryValueExA@24__imp__RegQueryValueExA@24_RegQueryValueA@16__imp__RegQueryValueA@16_RegQueryMultipleValuesW@20__imp__RegQueryMultipleValuesW@20_RegQueryMultipleValuesA@20__imp__RegQueryMultipleValuesA@20_RegQueryInfoKeyW@48__imp__RegQueryInfoKeyW@48_RegQueryInfoKeyA@48__imp__RegQueryInfoKeyA@48_RegOverridePredefKey@8__imp__RegOverridePredefKey@8_RegOpenUserClassesRoot@16__imp__RegOpenUserClassesRoot@16_RegOpenKeyW@12__imp__RegOpenKeyW@12_RegOpenKeyExW@20__imp__RegOpenKeyExW@20_RegOpenKeyExA@20__imp__RegOpenKeyExA@20_RegOpenKeyA@12__imp__RegOpenKeyA@12_RegOpenCurrentUser@8__imp__RegOpenCurrentUser@8_RegNotifyChangeKeyValue@20__imp__RegNotifyChangeKeyValue@20_RegLoadKeyW@12__imp__RegLoadKeyW@12_RegLoadKeyA@12__imp__RegLoadKeyA@12_RegGetKeySecurity@16__imp__RegGetKeySecurity@16_RegFlushKey@4__imp__RegFlushKey@4_RegEnumValueW@32__imp__RegEnumValueW@32_RegEnumValueA@32__imp__RegEnumValueA@32_RegEnumKeyW@16__imp__RegEnumKeyW@16_RegEnumKeyExW@32__imp__RegEnumKeyExW@32_RegEnumKeyExA@32__imp__RegEnumKeyExA@32_RegEnumKeyA@16__imp__RegEnumKeyA@16_RegDisablePredefinedCache@0__imp__RegDisablePredefinedCache@0_RegDeleteValueW@8__imp__RegDeleteValueW@8_RegDeleteValueA@8__imp__RegDeleteValueA@8_RegDeleteKeyW@8__imp__RegDeleteKeyW@8_RegDeleteKeyExW@16__imp__RegDeleteKeyExW@16_RegDeleteKeyExA@16__imp__RegDeleteKeyExA@16_RegDeleteKeyA@8__imp__RegDeleteKeyA@8_RegCreateKeyW@12__imp__RegCreateKeyW@12_RegCreateKeyExW@36__imp__RegCreateKeyExW@36_RegCreateKeyExA@36__imp__RegCreateKeyExA@36_RegCreateKeyA@12__imp__RegCreateKeyA@12_RegConnectRegistryW@12__imp__RegConnectRegistryW@12_RegConnectRegistryA@12__imp__RegConnectRegistryA@12_RegCloseKey@4__imp__RegCloseKey@4_ReadEventLogW@28__imp__ReadEventLogW@28_ReadEventLogA@28__imp__ReadEventLogA@28_ReadEncryptedFileRaw@12__imp__ReadEncryptedFileRaw@12_QueryWindows31FilesMigration@4__imp__QueryWindows31FilesMigration@4_QueryUsersOnEncryptedFile@8__imp__QueryUsersOnEncryptedFile@8_QueryServiceStatusEx@20__imp__QueryServiceStatusEx@20_QueryServiceStatus@8__imp__QueryServiceStatus@8_QueryServiceObjectSecurity@20__imp__QueryServiceObjectSecurity@20_QueryServiceLockStatusW@16__imp__QueryServiceLockStatusW@16_QueryServiceLockStatusA@16__imp__QueryServiceLockStatusA@16_QueryServiceConfigW@16__imp__QueryServiceConfigW@16_QueryServiceConfigA@16__imp__QueryServiceConfigA@16_QueryServiceConfig2W@20__imp__QueryServiceConfig2W@20_QueryServiceConfig2A@20__imp__QueryServiceConfig2A@20_QueryRecoveryAgentsOnEncryptedFile@8__imp__QueryRecoveryAgentsOnEncryptedFile@8_QueryAllTracesW@12__imp__QueryAllTracesW@12_QueryAllTracesA@12__imp__QueryAllTracesA@12_ProcessTrace@16__imp__ProcessTrace@16_PrivilegedServiceAuditAlarmW@20__imp__PrivilegedServiceAuditAlarmW@20_PrivilegedServiceAuditAlarmA@20__imp__PrivilegedServiceAuditAlarmA@20_PrivilegeCheck@12__imp__PrivilegeCheck@12_OpenTraceW@4__imp__OpenTraceW@4_OpenTraceA@4__imp__OpenTraceA@4_OpenThreadToken@16__imp__OpenThreadToken@16_OpenServiceW@12__imp__OpenServiceW@12_OpenServiceA@12__imp__OpenServiceA@12_OpenSCManagerW@12__imp__OpenSCManagerW@12_OpenSCManagerA@12__imp__OpenSCManagerA@12_OpenProcessToken@12__imp__OpenProcessToken@12_OpenEventLogW@8__imp__OpenEventLogW@8_OpenEventLogA@8__imp__OpenEventLogA@8_OpenEncryptedFileRawW@12__imp__OpenEncryptedFileRawW@12_OpenEncryptedFileRawA@12__imp__OpenEncryptedFileRawA@12_OpenBackupEventLogW@8__imp__OpenBackupEventLogW@8_OpenBackupEventLogA@8__imp__OpenBackupEventLogA@8_ObjectPrivilegeAuditAlarmW@24__imp__ObjectPrivilegeAuditAlarmW@24_ObjectPrivilegeAuditAlarmA@24__imp__ObjectPrivilegeAuditAlarmA@24_ObjectOpenAuditAlarmW@48__imp__ObjectOpenAuditAlarmW@48_ObjectOpenAuditAlarmA@48__imp__ObjectOpenAuditAlarmA@48_ObjectDeleteAuditAlarmW@12__imp__ObjectDeleteAuditAlarmW@12_ObjectDeleteAuditAlarmA@12__imp__ObjectDeleteAuditAlarmA@12_ObjectCloseAuditAlarmW@12__imp__ObjectCloseAuditAlarmW@12_ObjectCloseAuditAlarmA@12__imp__ObjectCloseAuditAlarmA@12_NotifyChangeEventLog@8__imp__NotifyChangeEventLog@8_NotifyBootConfigStatus@4__imp__NotifyBootConfigStatus@4_MapGenericMask@8__imp__MapGenericMask@8_MakeSelfRelativeSD@12__imp__MakeSelfRelativeSD@12_MakeAbsoluteSD@44__imp__MakeAbsoluteSD@44_MakeAbsoluteSD2@8__imp__MakeAbsoluteSD2@8_LsaStorePrivateData@12__imp__LsaStorePrivateData@12_LsaSetTrustedDomainInformation@16__imp__LsaSetTrustedDomainInformation@16_LsaSetTrustedDomainInfoByName@16__imp__LsaSetTrustedDomainInfoByName@16_LsaSetSystemAccessAccount@8__imp__LsaSetSystemAccessAccount@8_LsaSetSecurityObject@12__imp__LsaSetSecurityObject@12_LsaSetSecret@12__imp__LsaSetSecret@12_LsaSetQuotasForAccount@8__imp__LsaSetQuotasForAccount@8_LsaSetInformationTrustedDomain@12__imp__LsaSetInformationTrustedDomain@12_LsaSetInformationPolicy@12__imp__LsaSetInformationPolicy@12_LsaSetDomainInformationPolicy@12__imp__LsaSetDomainInformationPolicy@12_LsaRetrievePrivateData@12__imp__LsaRetrievePrivateData@12_LsaRemovePrivilegesFromAccount@12__imp__LsaRemovePrivilegesFromAccount@12_LsaRemoveAccountRights@20__imp__LsaRemoveAccountRights@20_LsaQueryTrustedDomainInfoByName@16__imp__LsaQueryTrustedDomainInfoByName@16_LsaQueryTrustedDomainInfo@16__imp__LsaQueryTrustedDomainInfo@16_LsaQuerySecurityObject@12__imp__LsaQuerySecurityObject@12_LsaQuerySecret@20__imp__LsaQuerySecret@20_LsaQueryInformationPolicy@12__imp__LsaQueryInformationPolicy@12_LsaQueryInfoTrustedDomain@12__imp__LsaQueryInfoTrustedDomain@12_LsaQueryDomainInformationPolicy@12__imp__LsaQueryDomainInformationPolicy@12_LsaOpenTrustedDomainByName@16__imp__LsaOpenTrustedDomainByName@16_LsaOpenTrustedDomain@16__imp__LsaOpenTrustedDomain@16_LsaOpenSecret@16__imp__LsaOpenSecret@16_LsaOpenPolicy@16__imp__LsaOpenPolicy@16_LsaOpenAccount@16__imp__LsaOpenAccount@16_LsaNtStatusToWinError@4__imp__LsaNtStatusToWinError@4_LsaLookupSids@20__imp__LsaLookupSids@20_LsaLookupPrivilegeValue@12__imp__LsaLookupPrivilegeValue@12_LsaLookupPrivilegeName@12__imp__LsaLookupPrivilegeName@12_LsaLookupPrivilegeDisplayName@16__imp__LsaLookupPrivilegeDisplayName@16_LsaLookupNames@20__imp__LsaLookupNames@20_LsaICLookupSids@32__imp__LsaICLookupSids@32_LsaICLookupNames@32__imp__LsaICLookupNames@32_LsaGetUserName@8__imp__LsaGetUserName@8_LsaGetSystemAccessAccount@8__imp__LsaGetSystemAccessAccount@8_LsaGetRemoteUserName@12__imp__LsaGetRemoteUserName@12_LsaGetQuotasForAccount@8__imp__LsaGetQuotasForAccount@8_LsaFreeMemory@4__imp__LsaFreeMemory@4_LsaEnumerateTrustedDomainsEx@20__imp__LsaEnumerateTrustedDomainsEx@20_LsaEnumerateTrustedDomains@20__imp__LsaEnumerateTrustedDomains@20_LsaEnumeratePrivilegesOfAccount@8__imp__LsaEnumeratePrivilegesOfAccount@8_LsaEnumeratePrivileges@20__imp__LsaEnumeratePrivileges@20_LsaEnumerateAccountsWithUserRight@16__imp__LsaEnumerateAccountsWithUserRight@16_LsaEnumerateAccounts@20__imp__LsaEnumerateAccounts@20_LsaEnumerateAccountRights@16__imp__LsaEnumerateAccountRights@16_LsaDeleteTrustedDomain@8__imp__LsaDeleteTrustedDomain@8_LsaDelete@4__imp__LsaDelete@4_LsaCreateTrustedDomainEx@20__imp__LsaCreateTrustedDomainEx@20_LsaCreateTrustedDomain@16__imp__LsaCreateTrustedDomain@16_LsaCreateSecret@16__imp__LsaCreateSecret@16_LsaCreateAccount@16__imp__LsaCreateAccount@16_LsaClose@4__imp__LsaClose@4_LsaClearAuditLog@4__imp__LsaClearAuditLog@4_LsaAddPrivilegesToAccount@8__imp__LsaAddPrivilegesToAccount@8_LsaAddAccountRights@16__imp__LsaAddAccountRights@16_LookupSecurityDescriptorPartsW@28__imp__LookupSecurityDescriptorPartsW@28_LookupSecurityDescriptorPartsA@28__imp__LookupSecurityDescriptorPartsA@28_LookupPrivilegeValueW@12__imp__LookupPrivilegeValueW@12_LookupPrivilegeValueA@12__imp__LookupPrivilegeValueA@12_LookupPrivilegeNameW@16__imp__LookupPrivilegeNameW@16_LookupPrivilegeNameA@16__imp__LookupPrivilegeNameA@16_LookupPrivilegeDisplayNameW@20__imp__LookupPrivilegeDisplayNameW@20_LookupPrivilegeDisplayNameA@20__imp__LookupPrivilegeDisplayNameA@20_LookupAccountSidW@28__imp__LookupAccountSidW@28_LookupAccountSidA@28__imp__LookupAccountSidA@28_LookupAccountNameW@28__imp__LookupAccountNameW@28_LookupAccountNameA@28__imp__LookupAccountNameA@28_LogonUserW@24__imp__LogonUserW@24_LogonUserA@24__imp__LogonUserA@24_LockServiceDatabase@4__imp__LockServiceDatabase@4_IsValidSid@4__imp__IsValidSid@4_IsValidSecurityDescriptor@4__imp__IsValidSecurityDescriptor@4_IsValidAcl@4__imp__IsValidAcl@4_IsTokenRestricted@4__imp__IsTokenRestricted@4_IsTextUnicode@12__imp__IsTextUnicode@12_IsProcessRestricted@0__imp__IsProcessRestricted@0_InstallApplication@4__imp__InstallApplication@4_InitiateSystemShutdownW@20__imp__InitiateSystemShutdownW@20_InitiateSystemShutdownExW@24__imp__InitiateSystemShutdownExW@24_InitiateSystemShutdownExA@24__imp__InitiateSystemShutdownExA@24_InitiateSystemShutdownA@20__imp__InitiateSystemShutdownA@20_InitializeSid@12__imp__InitializeSid@12_InitializeSecurityDescriptor@8__imp__InitializeSecurityDescriptor@8_InitializeAcl@12__imp__InitializeAcl@12_ImpersonateSelf@4__imp__ImpersonateSelf@4_ImpersonateNamedPipeClient@4__imp__ImpersonateNamedPipeClient@4_ImpersonateLoggedOnUser@4__imp__ImpersonateLoggedOnUser@4_ImpersonateAnonymousToken@4__imp__ImpersonateAnonymousToken@4_I_ScSetServiceBitsW@20__imp__I_ScSetServiceBitsW@20_I_ScSetServiceBitsA@20__imp__I_ScSetServiceBitsA@20_GetUserNameW@8__imp__GetUserNameW@8_GetUserNameA@8__imp__GetUserNameA@8_GetTrusteeTypeW@4__imp__GetTrusteeTypeW@4_GetTrusteeTypeA@4__imp__GetTrusteeTypeA@4_GetTrusteeNameW@4__imp__GetTrusteeNameW@4_GetTrusteeNameA@4__imp__GetTrusteeNameA@4_GetTrusteeFormW@4__imp__GetTrusteeFormW@4_GetTrusteeFormA@4__imp__GetTrusteeFormA@4_GetTraceLoggerHandle@4__imp__GetTraceLoggerHandle@4_GetTraceEnableLevel@8__imp__GetTraceEnableLevel@8_GetTraceEnableFlags@8__imp__GetTraceEnableFlags@8_GetTokenInformation@20__imp__GetTokenInformation@20_GetSiteSidFromUrl@4__imp__GetSiteSidFromUrl@4_GetSiteSidFromToken@4__imp__GetSiteSidFromToken@4_GetSiteNameFromSid@8__imp__GetSiteNameFromSid@8_GetSiteDirectoryW@12__imp__GetSiteDirectoryW@12_GetSiteDirectoryA@12__imp__GetSiteDirectoryA@12_GetSidSubAuthorityCount@4__imp__GetSidSubAuthorityCount@4_GetSidSubAuthority@8__imp__GetSidSubAuthority@8_GetSidLengthRequired@4__imp__GetSidLengthRequired@4_GetSidIdentifierAuthority@4__imp__GetSidIdentifierAuthority@4_GetServiceKeyNameW@16__imp__GetServiceKeyNameW@16_GetServiceKeyNameA@16__imp__GetServiceKeyNameA@16_GetServiceDisplayNameW@16__imp__GetServiceDisplayNameW@16_GetServiceDisplayNameA@16__imp__GetServiceDisplayNameA@16_GetSecurityInfoExW@36__imp__GetSecurityInfoExW@36_GetSecurityInfoExA@36__imp__GetSecurityInfoExA@36_GetSecurityInfo@32__imp__GetSecurityInfo@32_GetSecurityDescriptorSacl@16__imp__GetSecurityDescriptorSacl@16_GetSecurityDescriptorRMControl@8__imp__GetSecurityDescriptorRMControl@8_GetSecurityDescriptorOwner@12__imp__GetSecurityDescriptorOwner@12_GetSecurityDescriptorLength@4__imp__GetSecurityDescriptorLength@4_GetSecurityDescriptorGroup@12__imp__GetSecurityDescriptorGroup@12_GetSecurityDescriptorDacl@16__imp__GetSecurityDescriptorDacl@16_GetSecurityDescriptorControl@12__imp__GetSecurityDescriptorControl@12_GetPrivateObjectSecurity@20__imp__GetPrivateObjectSecurity@20_GetOverlappedAccessResults@16__imp__GetOverlappedAccessResults@16_GetOldestEventLogRecord@8__imp__GetOldestEventLogRecord@8_GetNumberOfEventLogRecords@8__imp__GetNumberOfEventLogRecords@8_GetNamedSecurityInfoW@32__imp__GetNamedSecurityInfoW@32_GetNamedSecurityInfoExW@36__imp__GetNamedSecurityInfoExW@36_GetNamedSecurityInfoExA@36__imp__GetNamedSecurityInfoExA@36_GetNamedSecurityInfoA@32__imp__GetNamedSecurityInfoA@32_GetMultipleTrusteeW@4__imp__GetMultipleTrusteeW@4_GetMultipleTrusteeOperationW@4__imp__GetMultipleTrusteeOperationW@4_GetMultipleTrusteeOperationA@4__imp__GetMultipleTrusteeOperationA@4_GetMultipleTrusteeA@4__imp__GetMultipleTrusteeA@4_GetMangledSiteSid@12__imp__GetMangledSiteSid@12_GetManagedApplications@20__imp__GetManagedApplications@20_GetLocalManagedApplications@12__imp__GetLocalManagedApplications@12_GetLengthSid@4__imp__GetLengthSid@4_GetKernelObjectSecurity@20__imp__GetKernelObjectSecurity@20_GetInheritanceSourceW@40__imp__GetInheritanceSourceW@40_GetInheritanceSourceA@40__imp__GetInheritanceSourceA@40_GetFileSecurityW@20__imp__GetFileSecurityW@20_GetFileSecurityA@20__imp__GetFileSecurityA@20_GetExplicitEntriesFromAclW@12__imp__GetExplicitEntriesFromAclW@12_GetExplicitEntriesFromAclA@12__imp__GetExplicitEntriesFromAclA@12_GetEventLogInformation@20__imp__GetEventLogInformation@20_GetEffectiveRightsFromAclW@12__imp__GetEffectiveRightsFromAclW@12_GetEffectiveRightsFromAclA@12__imp__GetEffectiveRightsFromAclA@12_GetCurrentHwProfileW@4__imp__GetCurrentHwProfileW@4_GetCurrentHwProfileA@4__imp__GetCurrentHwProfileA@4_GetAuditedPermissionsFromAclW@16__imp__GetAuditedPermissionsFromAclW@16_GetAuditedPermissionsFromAclA@16__imp__GetAuditedPermissionsFromAclA@16_GetAclInformation@16__imp__GetAclInformation@16_GetAce@12__imp__GetAce@12_GetAccessPermissionsForObjectW@36__imp__GetAccessPermissionsForObjectW@36_GetAccessPermissionsForObjectA@36__imp__GetAccessPermissionsForObjectA@36_FreeSid@4__imp__FreeSid@4_FreeEncryptionCertificateHashList@4__imp__FreeEncryptionCertificateHashList@4_FindFirstFreeAce@8__imp__FindFirstFreeAce@8_FileEncryptionStatusW@8__imp__FileEncryptionStatusW@8_FileEncryptionStatusA@8__imp__FileEncryptionStatusA@8_EqualSid@8__imp__EqualSid@8_EqualPrefixSid@8__imp__EqualPrefixSid@8_EnumServicesStatusW@32__imp__EnumServicesStatusW@32_EnumServicesStatusExW@40__imp__EnumServicesStatusExW@40_EnumServicesStatusExA@40__imp__EnumServicesStatusExA@40_EnumServicesStatusA@32__imp__EnumServicesStatusA@32_EnumServiceGroupW@36__imp__EnumServiceGroupW@36_EnumDependentServicesW@24__imp__EnumDependentServicesW@24_EnumDependentServicesA@24__imp__EnumDependentServicesA@24_EncryptionDisable@8__imp__EncryptionDisable@8_EncryptFileW@4__imp__EncryptFileW@4_EncryptFileA@4__imp__EncryptFileA@4_EnableTrace@24__imp__EnableTrace@24_ElfReportEventW@48__imp__ElfReportEventW@48_ElfReportEventA@48__imp__ElfReportEventA@48_ElfRegisterEventSourceW@12__imp__ElfRegisterEventSourceW@12_ElfRegisterEventSourceA@12__imp__ElfRegisterEventSourceA@12_ElfReadEventLogW@28__imp__ElfReadEventLogW@28_ElfReadEventLogA@28__imp__ElfReadEventLogA@28_ElfOpenEventLogW@12__imp__ElfOpenEventLogW@12_ElfOpenEventLogA@12__imp__ElfOpenEventLogA@12_ElfOpenBackupEventLogW@12__imp__ElfOpenBackupEventLogW@12_ElfOpenBackupEventLogA@12__imp__ElfOpenBackupEventLogA@12_ElfOldestRecord@8__imp__ElfOldestRecord@8_ElfNumberOfRecords@8__imp__ElfNumberOfRecords@8_ElfDeregisterEventSource@4__imp__ElfDeregisterEventSource@4_ElfCloseEventLog@4__imp__ElfCloseEventLog@4_ElfClearEventLogFileW@8__imp__ElfClearEventLogFileW@8_ElfClearEventLogFileA@8__imp__ElfClearEventLogFileA@8_ElfChangeNotify@8__imp__ElfChangeNotify@8_ElfBackupEventLogFileW@8__imp__ElfBackupEventLogFileW@8_ElfBackupEventLogFileA@8__imp__ElfBackupEventLogFileA@8_DuplicateTokenEx@24__imp__DuplicateTokenEx@24_DuplicateToken@12__imp__DuplicateToken@12_DuplicateEncryptionInfoFile@8__imp__DuplicateEncryptionInfoFile@8_DestroyPrivateObjectSecurity@4__imp__DestroyPrivateObjectSecurity@4_DeregisterEventSource@4__imp__DeregisterEventSource@4_DeleteService@4__imp__DeleteService@4_DeleteAce@8__imp__DeleteAce@8_DecryptFileW@8__imp__DecryptFileW@8_DecryptFileA@8__imp__DecryptFileA@8_CryptVerifySignatureW@24__imp__CryptVerifySignatureW@24_CryptVerifySignatureA@24__imp__CryptVerifySignatureA@24_CryptSignHashW@24__imp__CryptSignHashW@24_CryptSignHashA@24__imp__CryptSignHashA@24_CryptSetProviderW@8__imp__CryptSetProviderW@8_CryptSetProviderExW@16__imp__CryptSetProviderExW@16_CryptSetProviderExA@16__imp__CryptSetProviderExA@16_CryptSetProviderA@8__imp__CryptSetProviderA@8_CryptSetProvParam@16__imp__CryptSetProvParam@16_CryptSetKeyParam@16__imp__CryptSetKeyParam@16_CryptSetHashParam@16__imp__CryptSetHashParam@16_CryptReleaseContext@8__imp__CryptReleaseContext@8_CryptImportKey@24__imp__CryptImportKey@24_CryptHashSessionKey@12__imp__CryptHashSessionKey@12_CryptHashData@16__imp__CryptHashData@16_CryptGetUserKey@12__imp__CryptGetUserKey@12_CryptGetProvParam@20__imp__CryptGetProvParam@20_CryptGetKeyParam@20__imp__CryptGetKeyParam@20_CryptGetHashParam@20__imp__CryptGetHashParam@20_CryptGetDefaultProviderW@20__imp__CryptGetDefaultProviderW@20_CryptGetDefaultProviderA@20__imp__CryptGetDefaultProviderA@20_CryptGenRandom@12__imp__CryptGenRandom@12_CryptGenKey@16__imp__CryptGenKey@16_CryptExportKey@24__imp__CryptExportKey@24_CryptEnumProvidersW@24__imp__CryptEnumProvidersW@24_CryptEnumProvidersA@24__imp__CryptEnumProvidersA@24_CryptEnumProviderTypesW@24__imp__CryptEnumProviderTypesW@24_CryptEnumProviderTypesA@24__imp__CryptEnumProviderTypesA@24_CryptEncrypt@28__imp__CryptEncrypt@28_CryptDuplicateKey@16__imp__CryptDuplicateKey@16_CryptDuplicateHash@16__imp__CryptDuplicateHash@16_CryptDestroyKey@4__imp__CryptDestroyKey@4_CryptDestroyHash@4__imp__CryptDestroyHash@4_CryptDeriveKey@20__imp__CryptDeriveKey@20_CryptDecrypt@24__imp__CryptDecrypt@24_CryptCreateHash@20__imp__CryptCreateHash@20_CryptContextAddRef@12__imp__CryptContextAddRef@12_CryptAcquireContextW@20__imp__CryptAcquireContextW@20_CryptAcquireContextA@20__imp__CryptAcquireContextA@20_CreateTraceInstanceId@8__imp__CreateTraceInstanceId@8_CreateServiceW@52__imp__CreateServiceW@52_CreateServiceA@52__imp__CreateServiceA@52_CreateRestrictedToken@36__imp__CreateRestrictedToken@36_CreateProcessWithLogonW@44__imp__CreateProcessWithLogonW@44_CreateProcessAsUserW@44__imp__CreateProcessAsUserW@44_CreateProcessAsUserA@44__imp__CreateProcessAsUserA@44_CreatePrivateObjectSecurityEx@32__imp__CreatePrivateObjectSecurityEx@32_CreatePrivateObjectSecurity@24__imp__CreatePrivateObjectSecurity@24_CopySid@12__imp__CopySid@12_ConvertToAutoInheritPrivateObjectSecurity@24__imp__ConvertToAutoInheritPrivateObjectSecurity@24_ConvertStringSidToSidW@8__imp__ConvertStringSidToSidW@8_ConvertStringSidToSidA@8__imp__ConvertStringSidToSidA@8_ConvertStringSecurityDescriptorToSecurityDescriptorW@16__imp__ConvertStringSecurityDescriptorToSecurityDescriptorW@16_ConvertStringSecurityDescriptorToSecurityDescriptorA@16__imp__ConvertStringSecurityDescriptorToSecurityDescriptorA@16_ConvertStringSDToSDRootDomainW@20__imp__ConvertStringSDToSDRootDomainW@20_ConvertStringSDToSDRootDomainA@20__imp__ConvertStringSDToSDRootDomainA@20_ConvertSidToStringSidW@8__imp__ConvertSidToStringSidW@8_ConvertSidToStringSidA@8__imp__ConvertSidToStringSidA@8_ConvertSecurityDescriptorToStringSecurityDescriptorW@20__imp__ConvertSecurityDescriptorToStringSecurityDescriptorW@20_ConvertSecurityDescriptorToStringSecurityDescriptorA@20__imp__ConvertSecurityDescriptorToStringSecurityDescriptorA@20_ConvertSecurityDescriptorToAccessW@28__imp__ConvertSecurityDescriptorToAccessW@28_ConvertSecurityDescriptorToAccessNamedW@28__imp__ConvertSecurityDescriptorToAccessNamedW@28_ConvertSecurityDescriptorToAccessNamedA@28__imp__ConvertSecurityDescriptorToAccessNamedA@28_ConvertSecurityDescriptorToAccessA@28__imp__ConvertSecurityDescriptorToAccessA@28_ConvertSDToStringSDRootDomainW@24__imp__ConvertSDToStringSDRootDomainW@24_ConvertSDToStringSDRootDomainA@24__imp__ConvertSDToStringSDRootDomainA@24_ConvertAccessToSecurityDescriptorW@20__imp__ConvertAccessToSecurityDescriptorW@20_ConvertAccessToSecurityDescriptorA@20__imp__ConvertAccessToSecurityDescriptorA@20_ControlTraceW@20__imp__ControlTraceW@20_ControlTraceA@20__imp__ControlTraceA@20_ControlService@12__imp__ControlService@12_CommandLineFromMsiDescriptor@12__imp__CommandLineFromMsiDescriptor@12_CloseTrace@8__imp__CloseTrace@8_CloseServiceHandle@4__imp__CloseServiceHandle@4_CloseEventLog@4__imp__CloseEventLog@4_CloseEncryptedFileRaw@4__imp__CloseEncryptedFileRaw@4_ClearEventLogW@8__imp__ClearEventLogW@8_ClearEventLogA@8__imp__ClearEventLogA@8_CheckTokenMembership@12__imp__CheckTokenMembership@12_ChangeServiceConfigW@44__imp__ChangeServiceConfigW@44_ChangeServiceConfigA@44__imp__ChangeServiceConfigA@44_ChangeServiceConfig2W@12__imp__ChangeServiceConfig2W@12_ChangeServiceConfig2A@12__imp__ChangeServiceConfig2A@12_CancelOverlappedAccess@4__imp__CancelOverlappedAccess@4_BuildTrusteeWithSidW@8__imp__BuildTrusteeWithSidW@8_BuildTrusteeWithSidA@8__imp__BuildTrusteeWithSidA@8_BuildTrusteeWithObjectsAndSidW@20__imp__BuildTrusteeWithObjectsAndSidW@20_BuildTrusteeWithObjectsAndSidA@20__imp__BuildTrusteeWithObjectsAndSidA@20_BuildTrusteeWithObjectsAndNameW@24__imp__BuildTrusteeWithObjectsAndNameW@24_BuildTrusteeWithObjectsAndNameA@24__imp__BuildTrusteeWithObjectsAndNameA@24_BuildTrusteeWithNameW@8__imp__BuildTrusteeWithNameW@8_BuildTrusteeWithNameA@8__imp__BuildTrusteeWithNameA@8_BuildSecurityDescriptorW@36__imp__BuildSecurityDescriptorW@36_BuildSecurityDescriptorA@36__imp__BuildSecurityDescriptorA@36_BuildImpersonateTrusteeW@8__imp__BuildImpersonateTrusteeW@8_BuildImpersonateTrusteeA@8__imp__BuildImpersonateTrusteeA@8_BuildImpersonateExplicitAccessWithNameW@24__imp__BuildImpersonateExplicitAccessWithNameW@24_BuildImpersonateExplicitAccessWithNameA@24__imp__BuildImpersonateExplicitAccessWithNameA@24_BuildExplicitAccessWithNameW@20__imp__BuildExplicitAccessWithNameW@20_BuildExplicitAccessWithNameA@20__imp__BuildExplicitAccessWithNameA@20_BackupEventLogW@8__imp__BackupEventLogW@8_BackupEventLogA@8__imp__BackupEventLogA@8_AreAnyAccessesGranted@8__imp__AreAnyAccessesGranted@8_AreAllAccessesGranted@8__imp__AreAllAccessesGranted@8_AllocateLocallyUniqueId@4__imp__AllocateLocallyUniqueId@4_AllocateAndInitializeSid@44__imp__AllocateAndInitializeSid@44_AdjustTokenPrivileges@24__imp__AdjustTokenPrivileges@24_AdjustTokenGroups@24__imp__AdjustTokenGroups@24_AddUsersToEncryptedFile@8__imp__AddUsersToEncryptedFile@8_AddAuditAccessObjectAce@36__imp__AddAuditAccessObjectAce@36_AddAuditAccessAceEx@28__imp__AddAuditAccessAceEx@28_AddAuditAccessAce@24__imp__AddAuditAccessAce@24_AddAce@20__imp__AddAce@20_AddAccessDeniedObjectAce@28__imp__AddAccessDeniedObjectAce@28_AddAccessDeniedAceEx@20__imp__AddAccessDeniedAceEx@20_AddAccessDeniedAce@16__imp__AddAccessDeniedAce@16_AddAccessAllowedObjectAce@28__imp__AddAccessAllowedObjectAce@28_AddAccessAllowedAceEx@20__imp__AddAccessAllowedAceEx@20_AddAccessAllowedAce@16__imp__AddAccessAllowedAce@16_AccessCheckByTypeResultListAndAuditAlarmW@64__imp__AccessCheckByTypeResultListAndAuditAlarmW@64_AccessCheckByTypeResultListAndAuditAlarmByHandleW@68__imp__AccessCheckByTypeResultListAndAuditAlarmByHandleW@68_AccessCheckByTypeResultListAndAuditAlarmByHandleA@68__imp__AccessCheckByTypeResultListAndAuditAlarmByHandleA@68_AccessCheckByTypeResultListAndAuditAlarmA@64__imp__AccessCheckByTypeResultListAndAuditAlarmA@64_AccessCheckByTypeResultList@44__imp__AccessCheckByTypeResultList@44_AccessCheckByTypeAndAuditAlarmW@64__imp__AccessCheckByTypeAndAuditAlarmW@64_AccessCheckByTypeAndAuditAlarmA@64__imp__AccessCheckByTypeAndAuditAlarmA@64_AccessCheckByType@44__imp__AccessCheckByType@44_AccessCheckAndAuditAlarmW@44__imp__AccessCheckAndAuditAlarmW@44_AccessCheckAndAuditAlarmA@44__imp__AccessCheckAndAuditAlarmA@44_AccessCheck@32__imp__AccessCheck@32_AbortSystemShutdownW@4__imp__AbortSystemShutdownW@4_AbortSystemShutdownA@4__imp__AbortSystemShutdownA@4dgxgt.o/ 1301111089 0 0 100666 580 ` L.text 0`.data@0.bss0.idata$4@0.idata$5@0.idata$7 @0ADVAPI32.DLL.filegfake.text.data.bss.idata$4.idata$5.idata$7 __libadvapi32_a_inamedgxgh.o/ 1301111089 0 0 100666 645 ` L6.text 0`.data@0.bss0.idata$2@0.idata$5@0.idata$4@0   .filegfakehnamefthunk.text.data.bss.idata$2.idata$4.idata$5/__head_libadvapi32_a__libadvapi32_a_iname dgxgs00532.o/ 1301111090 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %WriteEncryptedFileRaw .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_WriteEncryptedFileRaw@12__imp__WriteEncryptedFileRaw@12__head_libadvapi32_a dgxgs00531.o/ 1301111090 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %UnregisterTraceGuids .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_UnregisterTraceGuids@8__imp__UnregisterTraceGuids@8__head_libadvapi32_a dgxgs00530.o/ 1301111090 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %UnlockServiceDatabase .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_UnlockServiceDatabase@4__imp__UnlockServiceDatabase@4__head_libadvapi32_a dgxgs00529.o/ 1301111090 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %UninstallApplication .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_UninstallApplication@4__imp__UninstallApplication@4__head_libadvapi32_a dgxgs00528.o/ 1301111090 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %TrusteeAccessToObjectW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_TrusteeAccessToObjectW@24__imp__TrusteeAccessToObjectW@24__head_libadvapi32_a dgxgs00527.o/ 1301111090 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %TrusteeAccessToObjectA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_TrusteeAccessToObjectA@24__imp__TrusteeAccessToObjectA@24__head_libadvapi32_a dgxgs00526.o/ 1301111090 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %TraceEventInstance .text.data.bss.idata$7.idata$5.idata$4.idata$68M_TraceEventInstance@20__imp__TraceEventInstance@20__head_libadvapi32_a dgxgs00525.o/ 1301111090 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % TraceEvent .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_TraceEvent@12__imp__TraceEvent@12__head_libadvapi32_a dgxgs00524.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % SystemFunction034 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction034@12__imp__SystemFunction034@12__head_libadvapi32_a dgxgs00523.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % SystemFunction033 .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SystemFunction033@8__imp__SystemFunction033@8__head_libadvapi32_a dgxgs00522.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % SystemFunction032 .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SystemFunction032@8__imp__SystemFunction032@8__head_libadvapi32_a dgxgs00521.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % SystemFunction031 .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SystemFunction031@8__imp__SystemFunction031@8__head_libadvapi32_a dgxgs00520.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction030 .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SystemFunction030@8__imp__SystemFunction030@8__head_libadvapi32_a dgxgs00519.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction029 .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SystemFunction029@8__imp__SystemFunction029@8__head_libadvapi32_a dgxgs00518.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction028 .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SystemFunction028@8__imp__SystemFunction028@8__head_libadvapi32_a dgxgs00517.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction027 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction027@12__imp__SystemFunction027@12__head_libadvapi32_a dgxgs00516.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction026 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction026@12__imp__SystemFunction026@12__head_libadvapi32_a dgxgs00515.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction025 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction025@12__imp__SystemFunction025@12__head_libadvapi32_a dgxgs00514.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction024 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction024@12__imp__SystemFunction024@12__head_libadvapi32_a dgxgs00513.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction023 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction023@12__imp__SystemFunction023@12__head_libadvapi32_a dgxgs00512.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction022 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction022@12__imp__SystemFunction022@12__head_libadvapi32_a dgxgs00511.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction021 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction021@12__imp__SystemFunction021@12__head_libadvapi32_a dgxgs00510.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction020 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction020@12__imp__SystemFunction020@12__head_libadvapi32_a dgxgs00509.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction019 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction019@12__imp__SystemFunction019@12__head_libadvapi32_a dgxgs00508.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction018 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction018@12__imp__SystemFunction018@12__head_libadvapi32_a dgxgs00507.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction017 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction017@12__imp__SystemFunction017@12__head_libadvapi32_a dgxgs00506.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction016 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction016@12__imp__SystemFunction016@12__head_libadvapi32_a dgxgs00505.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction015 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction015@12__imp__SystemFunction015@12__head_libadvapi32_a dgxgs00504.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction014 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction014@12__imp__SystemFunction014@12__head_libadvapi32_a dgxgs00503.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction013 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction013@12__imp__SystemFunction013@12__head_libadvapi32_a dgxgs00502.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction012 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction012@12__imp__SystemFunction012@12__head_libadvapi32_a dgxgs00501.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction011 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction011@12__imp__SystemFunction011@12__head_libadvapi32_a dgxgs00500.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction010 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction010@12__imp__SystemFunction010@12__head_libadvapi32_a dgxgs00499.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction009 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction009@12__imp__SystemFunction009@12__head_libadvapi32_a dgxgs00498.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction008 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction008@12__imp__SystemFunction008@12__head_libadvapi32_a dgxgs00497.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction007 .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SystemFunction007@8__imp__SystemFunction007@8__head_libadvapi32_a dgxgs00496.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction006 .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SystemFunction006@8__imp__SystemFunction006@8__head_libadvapi32_a dgxgs00495.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction005 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction005@12__imp__SystemFunction005@12__head_libadvapi32_a dgxgs00494.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction004 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction004@12__imp__SystemFunction004@12__head_libadvapi32_a dgxgs00493.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction003 .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SystemFunction003@8__imp__SystemFunction003@8__head_libadvapi32_a dgxgs00492.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction002 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction002@12__imp__SystemFunction002@12__head_libadvapi32_a dgxgs00491.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SystemFunction001 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SystemFunction001@12__imp__SystemFunction001@12__head_libadvapi32_a dgxgs00490.o/ 1301111090 0 0 100666 719 ` L .text,p 0`.data@0.bss0.idata$74z0.idata$580.idata$4<0.idata$60@ %SynchronizeWindows31FilesAndWindowsNTRegistry .text.data.bss.idata$7.idata$5.idata$4.idata$66n_SynchronizeWindows31FilesAndWindowsNTRegistry@16__imp__SynchronizeWindows31FilesAndWindowsNTRegistry@16__head_libadvapi32_a dgxgs00489.o/ 1301111090 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %StartTraceW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_StartTraceW@12__imp__StartTraceW@12__head_libadvapi32_a dgxgs00488.o/ 1301111090 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %StartTraceA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_StartTraceA@12__imp__StartTraceA@12__head_libadvapi32_a dgxgs00487.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %StartServiceW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_StartServiceW@12__imp__StartServiceW@12__head_libadvapi32_a dgxgs00486.o/ 1301111090 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %StartServiceCtrlDispatcherW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_StartServiceCtrlDispatcherW@4__imp__StartServiceCtrlDispatcherW@4__head_libadvapi32_a dgxgs00485.o/ 1301111090 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %StartServiceCtrlDispatcherA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_StartServiceCtrlDispatcherA@4__imp__StartServiceCtrlDispatcherA@4__head_libadvapi32_a dgxgs00484.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %StartServiceA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_StartServiceA@12__imp__StartServiceA@12__head_libadvapi32_a dgxgs00483.o/ 1301111090 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetUserFileEncryptionKey .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetUserFileEncryptionKey@4__imp__SetUserFileEncryptionKey@4__head_libadvapi32_a dgxgs00482.o/ 1301111090 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetTraceCallback .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetTraceCallback@8__imp__SetTraceCallback@8__head_libadvapi32_a dgxgs00481.o/ 1301111090 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetTokenInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_SetTokenInformation@16__imp__SetTokenInformation@16__head_libadvapi32_a dgxgs00480.o/ 1301111090 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetThreadToken .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_SetThreadToken@8__imp__SetThreadToken@8__head_libadvapi32_a dgxgs00479.o/ 1301111090 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetServiceStatus .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetServiceStatus@8__imp__SetServiceStatus@8__head_libadvapi32_a dgxgs00478.o/ 1301111090 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetServiceObjectSecurity .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_SetServiceObjectSecurity@12__imp__SetServiceObjectSecurity@12__head_libadvapi32_a dgxgs00477.o/ 1301111090 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetServiceBits .text.data.bss.idata$7.idata$5.idata$4.idata$60E_SetServiceBits@16__imp__SetServiceBits@16__head_libadvapi32_a dgxgs00476.o/ 1301111090 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetSecurityInfoExW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_SetSecurityInfoExW@36__imp__SetSecurityInfoExW@36__head_libadvapi32_a dgxgs00475.o/ 1301111090 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetSecurityInfoExA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_SetSecurityInfoExA@36__imp__SetSecurityInfoExA@36__head_libadvapi32_a dgxgs00474.o/ 1301111090 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetSecurityInfo .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetSecurityInfo@28__imp__SetSecurityInfo@28__head_libadvapi32_a dgxgs00473.o/ 1301111090 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetSecurityDescriptorSacl .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_SetSecurityDescriptorSacl@16__imp__SetSecurityDescriptorSacl@16__head_libadvapi32_a dgxgs00472.o/ 1301111090 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %SetSecurityDescriptorRMControl .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_SetSecurityDescriptorRMControl@8__imp__SetSecurityDescriptorRMControl@8__head_libadvapi32_a dgxgs00471.o/ 1301111090 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %SetSecurityDescriptorOwner .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_SetSecurityDescriptorOwner@12__imp__SetSecurityDescriptorOwner@12__head_libadvapi32_a dgxgs00470.o/ 1301111090 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %SetSecurityDescriptorGroup .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_SetSecurityDescriptorGroup@12__imp__SetSecurityDescriptorGroup@12__head_libadvapi32_a dgxgs00469.o/ 1301111090 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetSecurityDescriptorDacl .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_SetSecurityDescriptorDacl@16__imp__SetSecurityDescriptorDacl@16__head_libadvapi32_a dgxgs00468.o/ 1301111090 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %SetSecurityDescriptorControl .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_SetSecurityDescriptorControl@12__imp__SetSecurityDescriptorControl@12__head_libadvapi32_a dgxgs00467.o/ 1301111090 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %SetPrivateObjectSecurityEx .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_SetPrivateObjectSecurityEx@24__imp__SetPrivateObjectSecurityEx@24__head_libadvapi32_a dgxgs00466.o/ 1301111090 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetPrivateObjectSecurity .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_SetPrivateObjectSecurity@20__imp__SetPrivateObjectSecurity@20__head_libadvapi32_a dgxgs00465.o/ 1301111090 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetNamedSecurityInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetNamedSecurityInfoW@28__imp__SetNamedSecurityInfoW@28__head_libadvapi32_a dgxgs00464.o/ 1301111090 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetNamedSecurityInfoExW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetNamedSecurityInfoExW@36__imp__SetNamedSecurityInfoExW@36__head_libadvapi32_a dgxgs00463.o/ 1301111090 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetNamedSecurityInfoExA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetNamedSecurityInfoExA@36__imp__SetNamedSecurityInfoExA@36__head_libadvapi32_a dgxgs00462.o/ 1301111090 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetNamedSecurityInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetNamedSecurityInfoA@28__imp__SetNamedSecurityInfoA@28__head_libadvapi32_a dgxgs00461.o/ 1301111090 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetKernelObjectSecurity .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetKernelObjectSecurity@12__imp__SetKernelObjectSecurity@12__head_libadvapi32_a dgxgs00460.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetFileSecurityW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetFileSecurityW@12__imp__SetFileSecurityW@12__head_libadvapi32_a dgxgs00459.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetFileSecurityA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetFileSecurityA@12__imp__SetFileSecurityA@12__head_libadvapi32_a dgxgs00458.o/ 1301111090 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetEntriesInAuditListW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetEntriesInAuditListW@24__imp__SetEntriesInAuditListW@24__head_libadvapi32_a dgxgs00457.o/ 1301111090 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetEntriesInAuditListA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetEntriesInAuditListA@24__imp__SetEntriesInAuditListA@24__head_libadvapi32_a dgxgs00456.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetEntriesInAclW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetEntriesInAclW@16__imp__SetEntriesInAclW@16__head_libadvapi32_a dgxgs00455.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetEntriesInAclA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetEntriesInAclA@16__imp__SetEntriesInAclA@16__head_libadvapi32_a dgxgs00454.o/ 1301111090 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetEntriesInAccessListW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetEntriesInAccessListW@24__imp__SetEntriesInAccessListW@24__head_libadvapi32_a dgxgs00453.o/ 1301111090 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetEntriesInAccessListA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetEntriesInAccessListA@24__imp__SetEntriesInAccessListA@24__head_libadvapi32_a dgxgs00452.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetAclInformation .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SetAclInformation@16__imp__SetAclInformation@16__head_libadvapi32_a dgxgs00451.o/ 1301111090 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RevertToSelf .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_RevertToSelf@0__imp__RevertToSelf@0__head_libadvapi32_a dgxgs00450.o/ 1301111090 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReportEventW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_ReportEventW@36__imp__ReportEventW@36__head_libadvapi32_a dgxgs00449.o/ 1301111090 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReportEventA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_ReportEventA@36__imp__ReportEventA@36__head_libadvapi32_a dgxgs00448.o/ 1301111090 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %RemoveUsersFromEncryptedFile .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__RemoveUsersFromEncryptedFile@8__imp__RemoveUsersFromEncryptedFile@8__head_libadvapi32_a dgxgs00447.o/ 1301111090 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RemoveTraceCallback .text.data.bss.idata$7.idata$5.idata$4.idata$68M_RemoveTraceCallback@4__imp__RemoveTraceCallback@4__head_libadvapi32_a dgxgs00446.o/ 1301111090 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegisterTraceGuidsW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_RegisterTraceGuidsW@32__imp__RegisterTraceGuidsW@32__head_libadvapi32_a dgxgs00445.o/ 1301111090 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegisterTraceGuidsA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_RegisterTraceGuidsA@32__imp__RegisterTraceGuidsA@32__head_libadvapi32_a dgxgs00444.o/ 1301111090 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %RegisterServiceCtrlHandlerW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_RegisterServiceCtrlHandlerW@8__imp__RegisterServiceCtrlHandlerW@8__head_libadvapi32_a dgxgs00443.o/ 1301111090 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %RegisterServiceCtrlHandlerExW .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_RegisterServiceCtrlHandlerExW@12__imp__RegisterServiceCtrlHandlerExW@12__head_libadvapi32_a dgxgs00442.o/ 1301111090 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %RegisterServiceCtrlHandlerExA .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_RegisterServiceCtrlHandlerExA@12__imp__RegisterServiceCtrlHandlerExA@12__head_libadvapi32_a dgxgs00441.o/ 1301111090 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %RegisterServiceCtrlHandlerA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_RegisterServiceCtrlHandlerA@8__imp__RegisterServiceCtrlHandlerA@8__head_libadvapi32_a dgxgs00440.o/ 1301111090 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegisterEventSourceW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_RegisterEventSourceW@8__imp__RegisterEventSourceW@8__head_libadvapi32_a dgxgs00439.o/ 1301111090 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegisterEventSourceA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_RegisterEventSourceA@8__imp__RegisterEventSourceA@8__head_libadvapi32_a dgxgs00438.o/ 1301111090 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegUnLoadKeyW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_RegUnLoadKeyW@8__imp__RegUnLoadKeyW@8__head_libadvapi32_a dgxgs00437.o/ 1301111090 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegUnLoadKeyA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_RegUnLoadKeyA@8__imp__RegUnLoadKeyA@8__head_libadvapi32_a dgxgs00436.o/ 1301111090 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegSetValueW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_RegSetValueW@20__imp__RegSetValueW@20__head_libadvapi32_a dgxgs00435.o/ 1301111090 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegSetValueExW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RegSetValueExW@24__imp__RegSetValueExW@24__head_libadvapi32_a dgxgs00434.o/ 1301111090 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegSetValueExA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RegSetValueExA@24__imp__RegSetValueExA@24__head_libadvapi32_a dgxgs00433.o/ 1301111090 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegSetValueA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_RegSetValueA@20__imp__RegSetValueA@20__head_libadvapi32_a dgxgs00432.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegSetKeySecurity .text.data.bss.idata$7.idata$5.idata$4.idata$66K_RegSetKeySecurity@12__imp__RegSetKeySecurity@12__head_libadvapi32_a dgxgs00431.o/ 1301111090 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegSaveKeyW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_RegSaveKeyW@12__imp__RegSaveKeyW@12__head_libadvapi32_a dgxgs00430.o/ 1301111090 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegSaveKeyA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_RegSaveKeyA@12__imp__RegSaveKeyA@12__head_libadvapi32_a dgxgs00429.o/ 1301111090 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegRestoreKeyW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RegRestoreKeyW@12__imp__RegRestoreKeyW@12__head_libadvapi32_a dgxgs00428.o/ 1301111090 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegRestoreKeyA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RegRestoreKeyA@12__imp__RegRestoreKeyA@12__head_libadvapi32_a dgxgs00427.o/ 1301111090 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegReplaceKeyW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RegReplaceKeyW@16__imp__RegReplaceKeyW@16__head_libadvapi32_a dgxgs00426.o/ 1301111090 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegReplaceKeyA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RegReplaceKeyA@16__imp__RegReplaceKeyA@16__head_libadvapi32_a dgxgs00425.o/ 1301111090 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegQueryValueW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RegQueryValueW@16__imp__RegQueryValueW@16__head_libadvapi32_a dgxgs00424.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegQueryValueExW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_RegQueryValueExW@24__imp__RegQueryValueExW@24__head_libadvapi32_a dgxgs00423.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegQueryValueExA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_RegQueryValueExA@24__imp__RegQueryValueExA@24__head_libadvapi32_a dgxgs00422.o/ 1301111090 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegQueryValueA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RegQueryValueA@16__imp__RegQueryValueA@16__head_libadvapi32_a dgxgs00421.o/ 1301111090 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegQueryMultipleValuesW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_RegQueryMultipleValuesW@20__imp__RegQueryMultipleValuesW@20__head_libadvapi32_a dgxgs00420.o/ 1301111090 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegQueryMultipleValuesA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_RegQueryMultipleValuesA@20__imp__RegQueryMultipleValuesA@20__head_libadvapi32_a dgxgs00419.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegQueryInfoKeyW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_RegQueryInfoKeyW@48__imp__RegQueryInfoKeyW@48__head_libadvapi32_a dgxgs00418.o/ 1301111090 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegQueryInfoKeyA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_RegQueryInfoKeyA@48__imp__RegQueryInfoKeyA@48__head_libadvapi32_a dgxgs00417.o/ 1301111090 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegOverridePredefKey .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_RegOverridePredefKey@8__imp__RegOverridePredefKey@8__head_libadvapi32_a dgxgs00416.o/ 1301111090 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegOpenUserClassesRoot .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_RegOpenUserClassesRoot@16__imp__RegOpenUserClassesRoot@16__head_libadvapi32_a dgxgs00415.o/ 1301111090 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegOpenKeyW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_RegOpenKeyW@12__imp__RegOpenKeyW@12__head_libadvapi32_a dgxgs00414.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegOpenKeyExW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegOpenKeyExW@20__imp__RegOpenKeyExW@20__head_libadvapi32_a dgxgs00413.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegOpenKeyExA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegOpenKeyExA@20__imp__RegOpenKeyExA@20__head_libadvapi32_a dgxgs00412.o/ 1301111090 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegOpenKeyA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_RegOpenKeyA@12__imp__RegOpenKeyA@12__head_libadvapi32_a dgxgs00411.o/ 1301111090 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegOpenCurrentUser .text.data.bss.idata$7.idata$5.idata$4.idata$66K_RegOpenCurrentUser@8__imp__RegOpenCurrentUser@8__head_libadvapi32_a dgxgs00410.o/ 1301111090 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegNotifyChangeKeyValue .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_RegNotifyChangeKeyValue@20__imp__RegNotifyChangeKeyValue@20__head_libadvapi32_a dgxgs00409.o/ 1301111090 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegLoadKeyW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_RegLoadKeyW@12__imp__RegLoadKeyW@12__head_libadvapi32_a dgxgs00408.o/ 1301111090 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegLoadKeyA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_RegLoadKeyA@12__imp__RegLoadKeyA@12__head_libadvapi32_a dgxgs00407.o/ 1301111090 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegGetKeySecurity .text.data.bss.idata$7.idata$5.idata$4.idata$66K_RegGetKeySecurity@16__imp__RegGetKeySecurity@16__head_libadvapi32_a dgxgs00406.o/ 1301111090 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegFlushKey .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_RegFlushKey@4__imp__RegFlushKey@4__head_libadvapi32_a dgxgs00405.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegEnumValueW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegEnumValueW@32__imp__RegEnumValueW@32__head_libadvapi32_a dgxgs00404.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegEnumValueA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegEnumValueA@32__imp__RegEnumValueA@32__head_libadvapi32_a dgxgs00403.o/ 1301111090 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegEnumKeyW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_RegEnumKeyW@16__imp__RegEnumKeyW@16__head_libadvapi32_a dgxgs00402.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegEnumKeyExW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegEnumKeyExW@32__imp__RegEnumKeyExW@32__head_libadvapi32_a dgxgs00401.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegEnumKeyExA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegEnumKeyExA@32__imp__RegEnumKeyExA@32__head_libadvapi32_a dgxgs00400.o/ 1301111090 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegEnumKeyA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_RegEnumKeyA@16__imp__RegEnumKeyA@16__head_libadvapi32_a dgxgs00399.o/ 1301111090 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegDisablePredefinedCache .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_RegDisablePredefinedCache@0__imp__RegDisablePredefinedCache@0__head_libadvapi32_a dgxgs00398.o/ 1301111090 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegDeleteValueW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RegDeleteValueW@8__imp__RegDeleteValueW@8__head_libadvapi32_a dgxgs00397.o/ 1301111090 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegDeleteValueA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RegDeleteValueA@8__imp__RegDeleteValueA@8__head_libadvapi32_a dgxgs00396.o/ 1301111090 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegDeleteKeyW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_RegDeleteKeyW@8__imp__RegDeleteKeyW@8__head_libadvapi32_a dgxgs00395.o/ 1301111090 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegDeleteKeyExW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_RegDeleteKeyExW@16__imp__RegDeleteKeyExW@16__head_libadvapi32_a dgxgs00394.o/ 1301111090 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegDeleteKeyExA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_RegDeleteKeyExA@16__imp__RegDeleteKeyExA@16__head_libadvapi32_a dgxgs00393.o/ 1301111090 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegDeleteKeyA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_RegDeleteKeyA@8__imp__RegDeleteKeyA@8__head_libadvapi32_a dgxgs00392.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegCreateKeyW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegCreateKeyW@12__imp__RegCreateKeyW@12__head_libadvapi32_a dgxgs00391.o/ 1301111090 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegCreateKeyExW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_RegCreateKeyExW@36__imp__RegCreateKeyExW@36__head_libadvapi32_a dgxgs00390.o/ 1301111090 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegCreateKeyExA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_RegCreateKeyExA@36__imp__RegCreateKeyExA@36__head_libadvapi32_a dgxgs00389.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegCreateKeyA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegCreateKeyA@12__imp__RegCreateKeyA@12__head_libadvapi32_a dgxgs00388.o/ 1301111090 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegConnectRegistryW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_RegConnectRegistryW@12__imp__RegConnectRegistryW@12__head_libadvapi32_a dgxgs00387.o/ 1301111090 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegConnectRegistryA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_RegConnectRegistryA@12__imp__RegConnectRegistryA@12__head_libadvapi32_a dgxgs00386.o/ 1301111090 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegCloseKey .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_RegCloseKey@4__imp__RegCloseKey@4__head_libadvapi32_a dgxgs00385.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReadEventLogW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_ReadEventLogW@28__imp__ReadEventLogW@28__head_libadvapi32_a dgxgs00384.o/ 1301111090 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReadEventLogA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_ReadEventLogA@28__imp__ReadEventLogA@28__head_libadvapi32_a dgxgs00383.o/ 1301111090 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ReadEncryptedFileRaw .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_ReadEncryptedFileRaw@12__imp__ReadEncryptedFileRaw@12__head_libadvapi32_a dgxgs00382.o/ 1301111090 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %~QueryWindows31FilesMigration .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__QueryWindows31FilesMigration@4__imp__QueryWindows31FilesMigration@4__head_libadvapi32_a dgxgs00381.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %}QueryUsersOnEncryptedFile .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_QueryUsersOnEncryptedFile@8__imp__QueryUsersOnEncryptedFile@8__head_libadvapi32_a dgxgs00380.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %|QueryServiceStatusEx .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_QueryServiceStatusEx@20__imp__QueryServiceStatusEx@20__head_libadvapi32_a dgxgs00379.o/ 1301111089 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %{QueryServiceStatus .text.data.bss.idata$7.idata$5.idata$4.idata$66K_QueryServiceStatus@8__imp__QueryServiceStatus@8__head_libadvapi32_a dgxgs00378.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %zQueryServiceObjectSecurity .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_QueryServiceObjectSecurity@20__imp__QueryServiceObjectSecurity@20__head_libadvapi32_a dgxgs00377.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %yQueryServiceLockStatusW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_QueryServiceLockStatusW@16__imp__QueryServiceLockStatusW@16__head_libadvapi32_a dgxgs00376.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %xQueryServiceLockStatusA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_QueryServiceLockStatusA@16__imp__QueryServiceLockStatusA@16__head_libadvapi32_a dgxgs00375.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %wQueryServiceConfigW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_QueryServiceConfigW@16__imp__QueryServiceConfigW@16__head_libadvapi32_a dgxgs00374.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %vQueryServiceConfigA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_QueryServiceConfigA@16__imp__QueryServiceConfigA@16__head_libadvapi32_a dgxgs00373.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %uQueryServiceConfig2W .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_QueryServiceConfig2W@20__imp__QueryServiceConfig2W@20__head_libadvapi32_a dgxgs00372.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %tQueryServiceConfig2A .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_QueryServiceConfig2A@20__imp__QueryServiceConfig2A@20__head_libadvapi32_a dgxgs00371.o/ 1301111089 0 0 100666 687 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %sQueryRecoveryAgentsOnEncryptedFile .text.data.bss.idata$7.idata$5.idata$4.idata$6*Vk_QueryRecoveryAgentsOnEncryptedFile@8__imp__QueryRecoveryAgentsOnEncryptedFile@8__head_libadvapi32_a dgxgs00370.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %rQueryAllTracesW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_QueryAllTracesW@12__imp__QueryAllTracesW@12__head_libadvapi32_a dgxgs00369.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %qQueryAllTracesA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_QueryAllTracesA@12__imp__QueryAllTracesA@12__head_libadvapi32_a dgxgs00368.o/ 1301111089 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %pProcessTrace .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_ProcessTrace@16__imp__ProcessTrace@16__head_libadvapi32_a dgxgs00367.o/ 1301111089 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %oPrivilegedServiceAuditAlarmW .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_PrivilegedServiceAuditAlarmW@20__imp__PrivilegedServiceAuditAlarmW@20__head_libadvapi32_a dgxgs00366.o/ 1301111089 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %nPrivilegedServiceAuditAlarmA .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_PrivilegedServiceAuditAlarmA@20__imp__PrivilegedServiceAuditAlarmA@20__head_libadvapi32_a dgxgs00365.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %mPrivilegeCheck .text.data.bss.idata$7.idata$5.idata$4.idata$60E_PrivilegeCheck@12__imp__PrivilegeCheck@12__head_libadvapi32_a dgxgs00364.o/ 1301111089 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %lOpenTraceW .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_OpenTraceW@4__imp__OpenTraceW@4__head_libadvapi32_a dgxgs00363.o/ 1301111089 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %kOpenTraceA .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_OpenTraceA@4__imp__OpenTraceA@4__head_libadvapi32_a dgxgs00362.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %jOpenThreadToken .text.data.bss.idata$7.idata$5.idata$4.idata$62G_OpenThreadToken@16__imp__OpenThreadToken@16__head_libadvapi32_a dgxgs00361.o/ 1301111089 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %iOpenServiceW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_OpenServiceW@12__imp__OpenServiceW@12__head_libadvapi32_a dgxgs00360.o/ 1301111089 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %hOpenServiceA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_OpenServiceA@12__imp__OpenServiceA@12__head_libadvapi32_a dgxgs00359.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %gOpenSCManagerW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_OpenSCManagerW@12__imp__OpenSCManagerW@12__head_libadvapi32_a dgxgs00358.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %fOpenSCManagerA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_OpenSCManagerA@12__imp__OpenSCManagerA@12__head_libadvapi32_a dgxgs00357.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %eOpenProcessToken .text.data.bss.idata$7.idata$5.idata$4.idata$64I_OpenProcessToken@12__imp__OpenProcessToken@12__head_libadvapi32_a dgxgs00356.o/ 1301111089 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %dOpenEventLogW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_OpenEventLogW@8__imp__OpenEventLogW@8__head_libadvapi32_a dgxgs00355.o/ 1301111089 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %cOpenEventLogA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_OpenEventLogA@8__imp__OpenEventLogA@8__head_libadvapi32_a dgxgs00354.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %bOpenEncryptedFileRawW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_OpenEncryptedFileRawW@12__imp__OpenEncryptedFileRawW@12__head_libadvapi32_a dgxgs00353.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %aOpenEncryptedFileRawA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_OpenEncryptedFileRawA@12__imp__OpenEncryptedFileRawA@12__head_libadvapi32_a dgxgs00352.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %`OpenBackupEventLogW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_OpenBackupEventLogW@8__imp__OpenBackupEventLogW@8__head_libadvapi32_a dgxgs00351.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %_OpenBackupEventLogA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_OpenBackupEventLogA@8__imp__OpenBackupEventLogA@8__head_libadvapi32_a dgxgs00350.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %^ObjectPrivilegeAuditAlarmW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_ObjectPrivilegeAuditAlarmW@24__imp__ObjectPrivilegeAuditAlarmW@24__head_libadvapi32_a dgxgs00349.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %]ObjectPrivilegeAuditAlarmA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_ObjectPrivilegeAuditAlarmA@24__imp__ObjectPrivilegeAuditAlarmA@24__head_libadvapi32_a dgxgs00348.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %\ObjectOpenAuditAlarmW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ObjectOpenAuditAlarmW@48__imp__ObjectOpenAuditAlarmW@48__head_libadvapi32_a dgxgs00347.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %[ObjectOpenAuditAlarmA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ObjectOpenAuditAlarmA@48__imp__ObjectOpenAuditAlarmA@48__head_libadvapi32_a dgxgs00346.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ZObjectDeleteAuditAlarmW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_ObjectDeleteAuditAlarmW@12__imp__ObjectDeleteAuditAlarmW@12__head_libadvapi32_a dgxgs00345.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %YObjectDeleteAuditAlarmA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_ObjectDeleteAuditAlarmA@12__imp__ObjectDeleteAuditAlarmA@12__head_libadvapi32_a dgxgs00344.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %XObjectCloseAuditAlarmW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_ObjectCloseAuditAlarmW@12__imp__ObjectCloseAuditAlarmW@12__head_libadvapi32_a dgxgs00343.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %WObjectCloseAuditAlarmA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_ObjectCloseAuditAlarmA@12__imp__ObjectCloseAuditAlarmA@12__head_libadvapi32_a dgxgs00342.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VNotifyChangeEventLog .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_NotifyChangeEventLog@8__imp__NotifyChangeEventLog@8__head_libadvapi32_a dgxgs00341.o/ 1301111089 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %UNotifyBootConfigStatus .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_NotifyBootConfigStatus@4__imp__NotifyBootConfigStatus@4__head_libadvapi32_a dgxgs00340.o/ 1301111089 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %TMapGenericMask .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_MapGenericMask@8__imp__MapGenericMask@8__head_libadvapi32_a dgxgs00339.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SMakeSelfRelativeSD .text.data.bss.idata$7.idata$5.idata$4.idata$68M_MakeSelfRelativeSD@12__imp__MakeSelfRelativeSD@12__head_libadvapi32_a dgxgs00338.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RMakeAbsoluteSD .text.data.bss.idata$7.idata$5.idata$4.idata$60E_MakeAbsoluteSD@44__imp__MakeAbsoluteSD@44__head_libadvapi32_a dgxgs00337.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %QMakeAbsoluteSD2 .text.data.bss.idata$7.idata$5.idata$4.idata$60E_MakeAbsoluteSD2@8__imp__MakeAbsoluteSD2@8__head_libadvapi32_a dgxgs00336.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %PLsaStorePrivateData .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_LsaStorePrivateData@12__imp__LsaStorePrivateData@12__head_libadvapi32_a dgxgs00335.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %OLsaSetTrustedDomainInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_LsaSetTrustedDomainInformation@16__imp__LsaSetTrustedDomainInformation@16__head_libadvapi32_a dgxgs00334.o/ 1301111089 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %NLsaSetTrustedDomainInfoByName .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_LsaSetTrustedDomainInfoByName@16__imp__LsaSetTrustedDomainInfoByName@16__head_libadvapi32_a dgxgs00333.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %MLsaSetSystemAccessAccount .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_LsaSetSystemAccessAccount@8__imp__LsaSetSystemAccessAccount@8__head_libadvapi32_a dgxgs00332.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LLsaSetSecurityObject .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_LsaSetSecurityObject@12__imp__LsaSetSecurityObject@12__head_libadvapi32_a dgxgs00331.o/ 1301111089 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %KLsaSetSecret .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_LsaSetSecret@12__imp__LsaSetSecret@12__head_libadvapi32_a dgxgs00330.o/ 1301111089 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %JLsaSetQuotasForAccount .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_LsaSetQuotasForAccount@8__imp__LsaSetQuotasForAccount@8__head_libadvapi32_a dgxgs00329.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %ILsaSetInformationTrustedDomain .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_LsaSetInformationTrustedDomain@12__imp__LsaSetInformationTrustedDomain@12__head_libadvapi32_a dgxgs00328.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %HLsaSetInformationPolicy .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_LsaSetInformationPolicy@12__imp__LsaSetInformationPolicy@12__head_libadvapi32_a dgxgs00327.o/ 1301111089 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GLsaSetDomainInformationPolicy .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_LsaSetDomainInformationPolicy@12__imp__LsaSetDomainInformationPolicy@12__head_libadvapi32_a dgxgs00326.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %FLsaRetrievePrivateData .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_LsaRetrievePrivateData@12__imp__LsaRetrievePrivateData@12__head_libadvapi32_a dgxgs00325.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %ELsaRemovePrivilegesFromAccount .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_LsaRemovePrivilegesFromAccount@12__imp__LsaRemovePrivilegesFromAccount@12__head_libadvapi32_a dgxgs00324.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DLsaRemoveAccountRights .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_LsaRemoveAccountRights@20__imp__LsaRemoveAccountRights@20__head_libadvapi32_a dgxgs00323.o/ 1301111089 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %CLsaQueryTrustedDomainInfoByName .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_LsaQueryTrustedDomainInfoByName@16__imp__LsaQueryTrustedDomainInfoByName@16__head_libadvapi32_a dgxgs00322.o/ 1301111089 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BLsaQueryTrustedDomainInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_LsaQueryTrustedDomainInfo@16__imp__LsaQueryTrustedDomainInfo@16__head_libadvapi32_a dgxgs00321.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ALsaQuerySecurityObject .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_LsaQuerySecurityObject@12__imp__LsaQuerySecurityObject@12__head_libadvapi32_a dgxgs00320.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %@LsaQuerySecret .text.data.bss.idata$7.idata$5.idata$4.idata$60E_LsaQuerySecret@20__imp__LsaQuerySecret@20__head_libadvapi32_a dgxgs00319.o/ 1301111089 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %?LsaQueryInformationPolicy .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_LsaQueryInformationPolicy@12__imp__LsaQueryInformationPolicy@12__head_libadvapi32_a dgxgs00318.o/ 1301111089 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %>LsaQueryInfoTrustedDomain .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_LsaQueryInfoTrustedDomain@12__imp__LsaQueryInfoTrustedDomain@12__head_libadvapi32_a dgxgs00317.o/ 1301111089 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %=LsaQueryDomainInformationPolicy .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_LsaQueryDomainInformationPolicy@12__imp__LsaQueryDomainInformationPolicy@12__head_libadvapi32_a dgxgs00316.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %<LsaOpenTrustedDomainByName .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_LsaOpenTrustedDomainByName@16__imp__LsaOpenTrustedDomainByName@16__head_libadvapi32_a dgxgs00315.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %;LsaOpenTrustedDomain .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_LsaOpenTrustedDomain@16__imp__LsaOpenTrustedDomain@16__head_libadvapi32_a dgxgs00314.o/ 1301111089 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %:LsaOpenSecret .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_LsaOpenSecret@16__imp__LsaOpenSecret@16__head_libadvapi32_a dgxgs00313.o/ 1301111089 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %9LsaOpenPolicy .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_LsaOpenPolicy@16__imp__LsaOpenPolicy@16__head_libadvapi32_a dgxgs00312.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %8LsaOpenAccount .text.data.bss.idata$7.idata$5.idata$4.idata$60E_LsaOpenAccount@16__imp__LsaOpenAccount@16__head_libadvapi32_a dgxgs00311.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %7LsaNtStatusToWinError .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_LsaNtStatusToWinError@4__imp__LsaNtStatusToWinError@4__head_libadvapi32_a dgxgs00310.o/ 1301111089 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %6LsaLookupSids .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_LsaLookupSids@20__imp__LsaLookupSids@20__head_libadvapi32_a dgxgs00309.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %5LsaLookupPrivilegeValue .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_LsaLookupPrivilegeValue@12__imp__LsaLookupPrivilegeValue@12__head_libadvapi32_a dgxgs00308.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %4LsaLookupPrivilegeName .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_LsaLookupPrivilegeName@12__imp__LsaLookupPrivilegeName@12__head_libadvapi32_a dgxgs00307.o/ 1301111089 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %3LsaLookupPrivilegeDisplayName .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_LsaLookupPrivilegeDisplayName@16__imp__LsaLookupPrivilegeDisplayName@16__head_libadvapi32_a dgxgs00306.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %2LsaLookupNames .text.data.bss.idata$7.idata$5.idata$4.idata$60E_LsaLookupNames@20__imp__LsaLookupNames@20__head_libadvapi32_a dgxgs00305.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %1LsaICLookupSids .text.data.bss.idata$7.idata$5.idata$4.idata$62G_LsaICLookupSids@32__imp__LsaICLookupSids@32__head_libadvapi32_a dgxgs00304.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %0LsaICLookupNames .text.data.bss.idata$7.idata$5.idata$4.idata$64I_LsaICLookupNames@32__imp__LsaICLookupNames@32__head_libadvapi32_a dgxgs00303.o/ 1301111089 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %/LsaGetUserName .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_LsaGetUserName@8__imp__LsaGetUserName@8__head_libadvapi32_a dgxgs00302.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %.LsaGetSystemAccessAccount .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_LsaGetSystemAccessAccount@8__imp__LsaGetSystemAccessAccount@8__head_libadvapi32_a dgxgs00301.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %-LsaGetRemoteUserName .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_LsaGetRemoteUserName@12__imp__LsaGetRemoteUserName@12__head_libadvapi32_a dgxgs00300.o/ 1301111089 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %,LsaGetQuotasForAccount .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_LsaGetQuotasForAccount@8__imp__LsaGetQuotasForAccount@8__head_libadvapi32_a dgxgs00299.o/ 1301111089 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %+LsaFreeMemory .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_LsaFreeMemory@4__imp__LsaFreeMemory@4__head_libadvapi32_a dgxgs00298.o/ 1301111089 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %*LsaEnumerateTrustedDomainsEx .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_LsaEnumerateTrustedDomainsEx@20__imp__LsaEnumerateTrustedDomainsEx@20__head_libadvapi32_a dgxgs00297.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %)LsaEnumerateTrustedDomains .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_LsaEnumerateTrustedDomains@20__imp__LsaEnumerateTrustedDomains@20__head_libadvapi32_a dgxgs00296.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %(LsaEnumeratePrivilegesOfAccount .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_LsaEnumeratePrivilegesOfAccount@8__imp__LsaEnumeratePrivilegesOfAccount@8__head_libadvapi32_a dgxgs00295.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %'LsaEnumeratePrivileges .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_LsaEnumeratePrivileges@20__imp__LsaEnumeratePrivileges@20__head_libadvapi32_a dgxgs00294.o/ 1301111089 0 0 100666 683 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %&LsaEnumerateAccountsWithUserRight .text.data.bss.idata$7.idata$5.idata$4.idata$6*Vk_LsaEnumerateAccountsWithUserRight@16__imp__LsaEnumerateAccountsWithUserRight@16__head_libadvapi32_a dgxgs00293.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %%LsaEnumerateAccounts .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_LsaEnumerateAccounts@20__imp__LsaEnumerateAccounts@20__head_libadvapi32_a dgxgs00292.o/ 1301111089 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %$LsaEnumerateAccountRights .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_LsaEnumerateAccountRights@16__imp__LsaEnumerateAccountRights@16__head_libadvapi32_a dgxgs00291.o/ 1301111089 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %#LsaDeleteTrustedDomain .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_LsaDeleteTrustedDomain@8__imp__LsaDeleteTrustedDomain@8__head_libadvapi32_a dgxgs00290.o/ 1301111089 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %"LsaDelete .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_LsaDelete@4__imp__LsaDelete@4__head_libadvapi32_a dgxgs00289.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %!LsaCreateTrustedDomainEx .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_LsaCreateTrustedDomainEx@20__imp__LsaCreateTrustedDomainEx@20__head_libadvapi32_a dgxgs00288.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ % LsaCreateTrustedDomain .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_LsaCreateTrustedDomain@16__imp__LsaCreateTrustedDomain@16__head_libadvapi32_a dgxgs00287.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LsaCreateSecret .text.data.bss.idata$7.idata$5.idata$4.idata$62G_LsaCreateSecret@16__imp__LsaCreateSecret@16__head_libadvapi32_a dgxgs00286.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LsaCreateAccount .text.data.bss.idata$7.idata$5.idata$4.idata$64I_LsaCreateAccount@16__imp__LsaCreateAccount@16__head_libadvapi32_a dgxgs00285.o/ 1301111089 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %LsaClose .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_LsaClose@4__imp__LsaClose@4__head_libadvapi32_a dgxgs00284.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LsaClearAuditLog .text.data.bss.idata$7.idata$5.idata$4.idata$62G_LsaClearAuditLog@4__imp__LsaClearAuditLog@4__head_libadvapi32_a dgxgs00283.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %LsaAddPrivilegesToAccount .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_LsaAddPrivilegesToAccount@8__imp__LsaAddPrivilegesToAccount@8__head_libadvapi32_a dgxgs00282.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LsaAddAccountRights .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_LsaAddAccountRights@16__imp__LsaAddAccountRights@16__head_libadvapi32_a dgxgs00281.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %LookupSecurityDescriptorPartsW .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_LookupSecurityDescriptorPartsW@28__imp__LookupSecurityDescriptorPartsW@28__head_libadvapi32_a dgxgs00280.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %LookupSecurityDescriptorPartsA .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_LookupSecurityDescriptorPartsA@28__imp__LookupSecurityDescriptorPartsA@28__head_libadvapi32_a dgxgs00279.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LookupPrivilegeValueW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_LookupPrivilegeValueW@12__imp__LookupPrivilegeValueW@12__head_libadvapi32_a dgxgs00278.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LookupPrivilegeValueA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_LookupPrivilegeValueA@12__imp__LookupPrivilegeValueA@12__head_libadvapi32_a dgxgs00277.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LookupPrivilegeNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_LookupPrivilegeNameW@16__imp__LookupPrivilegeNameW@16__head_libadvapi32_a dgxgs00276.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LookupPrivilegeNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_LookupPrivilegeNameA@16__imp__LookupPrivilegeNameA@16__head_libadvapi32_a dgxgs00275.o/ 1301111089 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %LookupPrivilegeDisplayNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__LookupPrivilegeDisplayNameW@20__imp__LookupPrivilegeDisplayNameW@20__head_libadvapi32_a dgxgs00274.o/ 1301111089 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %LookupPrivilegeDisplayNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__LookupPrivilegeDisplayNameA@20__imp__LookupPrivilegeDisplayNameA@20__head_libadvapi32_a dgxgs00273.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LookupAccountSidW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_LookupAccountSidW@28__imp__LookupAccountSidW@28__head_libadvapi32_a dgxgs00272.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LookupAccountSidA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_LookupAccountSidA@28__imp__LookupAccountSidA@28__head_libadvapi32_a dgxgs00271.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LookupAccountNameW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_LookupAccountNameW@28__imp__LookupAccountNameW@28__head_libadvapi32_a dgxgs00270.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LookupAccountNameA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_LookupAccountNameA@28__imp__LookupAccountNameA@28__head_libadvapi32_a dgxgs00269.o/ 1301111089 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % LogonUserW .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_LogonUserW@24__imp__LogonUserW@24__head_libadvapi32_a dgxgs00268.o/ 1301111089 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % LogonUserA .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_LogonUserA@24__imp__LogonUserA@24__head_libadvapi32_a dgxgs00267.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ % LockServiceDatabase .text.data.bss.idata$7.idata$5.idata$4.idata$68M_LockServiceDatabase@4__imp__LockServiceDatabase@4__head_libadvapi32_a dgxgs00266.o/ 1301111089 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % IsValidSid .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_IsValidSid@4__imp__IsValidSid@4__head_libadvapi32_a dgxgs00265.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ % IsValidSecurityDescriptor .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_IsValidSecurityDescriptor@4__imp__IsValidSecurityDescriptor@4__head_libadvapi32_a dgxgs00264.o/ 1301111089 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IsValidAcl .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_IsValidAcl@4__imp__IsValidAcl@4__head_libadvapi32_a dgxgs00263.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsTokenRestricted .text.data.bss.idata$7.idata$5.idata$4.idata$64I_IsTokenRestricted@4__imp__IsTokenRestricted@4__head_libadvapi32_a dgxgs00262.o/ 1301111089 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IsTextUnicode .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_IsTextUnicode@12__imp__IsTextUnicode@12__head_libadvapi32_a dgxgs00261.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %IsProcessRestricted .text.data.bss.idata$7.idata$5.idata$4.idata$68M_IsProcessRestricted@0__imp__IsProcessRestricted@0__head_libadvapi32_a dgxgs00260.o/ 1301111089 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %InstallApplication .text.data.bss.idata$7.idata$5.idata$4.idata$66K_InstallApplication@4__imp__InstallApplication@4__head_libadvapi32_a dgxgs00259.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InitiateSystemShutdownW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_InitiateSystemShutdownW@20__imp__InitiateSystemShutdownW@20__head_libadvapi32_a dgxgs00258.o/ 1301111089 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InitiateSystemShutdownExW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_InitiateSystemShutdownExW@24__imp__InitiateSystemShutdownExW@24__head_libadvapi32_a dgxgs00257.o/ 1301111089 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InitiateSystemShutdownExA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_InitiateSystemShutdownExA@24__imp__InitiateSystemShutdownExA@24__head_libadvapi32_a dgxgs00256.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InitiateSystemShutdownA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_InitiateSystemShutdownA@20__imp__InitiateSystemShutdownA@20__head_libadvapi32_a dgxgs00255.o/ 1301111089 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %InitializeSid .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_InitializeSid@12__imp__InitializeSid@12__head_libadvapi32_a dgxgs00254.o/ 1301111089 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %InitializeSecurityDescriptor .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__InitializeSecurityDescriptor@8__imp__InitializeSecurityDescriptor@8__head_libadvapi32_a dgxgs00253.o/ 1301111089 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %InitializeAcl .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_InitializeAcl@12__imp__InitializeAcl@12__head_libadvapi32_a dgxgs00252.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ImpersonateSelf .text.data.bss.idata$7.idata$5.idata$4.idata$60E_ImpersonateSelf@4__imp__ImpersonateSelf@4__head_libadvapi32_a dgxgs00251.o/ 1301111089 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %ImpersonateNamedPipeClient .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_ImpersonateNamedPipeClient@4__imp__ImpersonateNamedPipeClient@4__head_libadvapi32_a dgxgs00250.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ImpersonateLoggedOnUser .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_ImpersonateLoggedOnUser@4__imp__ImpersonateLoggedOnUser@4__head_libadvapi32_a dgxgs00249.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ImpersonateAnonymousToken .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_ImpersonateAnonymousToken@4__imp__ImpersonateAnonymousToken@4__head_libadvapi32_a dgxgs00248.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %I_ScSetServiceBitsW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_I_ScSetServiceBitsW@20__imp__I_ScSetServiceBitsW@20__head_libadvapi32_a dgxgs00247.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %I_ScSetServiceBitsA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_I_ScSetServiceBitsA@20__imp__I_ScSetServiceBitsA@20__head_libadvapi32_a dgxgs00246.o/ 1301111089 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetUserNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetUserNameW@8__imp__GetUserNameW@8__head_libadvapi32_a dgxgs00245.o/ 1301111089 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetUserNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetUserNameA@8__imp__GetUserNameA@8__head_libadvapi32_a dgxgs00244.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetTrusteeTypeW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetTrusteeTypeW@4__imp__GetTrusteeTypeW@4__head_libadvapi32_a dgxgs00243.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetTrusteeTypeA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetTrusteeTypeA@4__imp__GetTrusteeTypeA@4__head_libadvapi32_a dgxgs00242.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetTrusteeNameW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetTrusteeNameW@4__imp__GetTrusteeNameW@4__head_libadvapi32_a dgxgs00241.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetTrusteeNameA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetTrusteeNameA@4__imp__GetTrusteeNameA@4__head_libadvapi32_a dgxgs00240.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetTrusteeFormW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetTrusteeFormW@4__imp__GetTrusteeFormW@4__head_libadvapi32_a dgxgs00239.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetTrusteeFormA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetTrusteeFormA@4__imp__GetTrusteeFormA@4__head_libadvapi32_a dgxgs00238.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetTraceLoggerHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetTraceLoggerHandle@4__imp__GetTraceLoggerHandle@4__head_libadvapi32_a dgxgs00237.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetTraceEnableLevel .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetTraceEnableLevel@8__imp__GetTraceEnableLevel@8__head_libadvapi32_a dgxgs00236.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetTraceEnableFlags .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetTraceEnableFlags@8__imp__GetTraceEnableFlags@8__head_libadvapi32_a dgxgs00235.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetTokenInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetTokenInformation@20__imp__GetTokenInformation@20__head_libadvapi32_a dgxgs00234.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetSiteSidFromUrl .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetSiteSidFromUrl@4__imp__GetSiteSidFromUrl@4__head_libadvapi32_a dgxgs00233.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetSiteSidFromToken .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetSiteSidFromToken@4__imp__GetSiteSidFromToken@4__head_libadvapi32_a dgxgs00232.o/ 1301111089 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetSiteNameFromSid .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetSiteNameFromSid@8__imp__GetSiteNameFromSid@8__head_libadvapi32_a dgxgs00231.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetSiteDirectoryW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetSiteDirectoryW@12__imp__GetSiteDirectoryW@12__head_libadvapi32_a dgxgs00230.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetSiteDirectoryA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetSiteDirectoryA@12__imp__GetSiteDirectoryA@12__head_libadvapi32_a dgxgs00229.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetSidSubAuthorityCount .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetSidSubAuthorityCount@4__imp__GetSidSubAuthorityCount@4__head_libadvapi32_a dgxgs00228.o/ 1301111089 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetSidSubAuthority .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetSidSubAuthority@8__imp__GetSidSubAuthority@8__head_libadvapi32_a dgxgs00227.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetSidLengthRequired .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetSidLengthRequired@4__imp__GetSidLengthRequired@4__head_libadvapi32_a dgxgs00226.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetSidIdentifierAuthority .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetSidIdentifierAuthority@4__imp__GetSidIdentifierAuthority@4__head_libadvapi32_a dgxgs00225.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetServiceKeyNameW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetServiceKeyNameW@16__imp__GetServiceKeyNameW@16__head_libadvapi32_a dgxgs00224.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetServiceKeyNameA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetServiceKeyNameA@16__imp__GetServiceKeyNameA@16__head_libadvapi32_a dgxgs00223.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetServiceDisplayNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetServiceDisplayNameW@16__imp__GetServiceDisplayNameW@16__head_libadvapi32_a dgxgs00222.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetServiceDisplayNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetServiceDisplayNameA@16__imp__GetServiceDisplayNameA@16__head_libadvapi32_a dgxgs00221.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetSecurityInfoExW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetSecurityInfoExW@36__imp__GetSecurityInfoExW@36__head_libadvapi32_a dgxgs00220.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetSecurityInfoExA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetSecurityInfoExA@36__imp__GetSecurityInfoExA@36__head_libadvapi32_a dgxgs00219.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetSecurityInfo .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetSecurityInfo@32__imp__GetSecurityInfo@32__head_libadvapi32_a dgxgs00218.o/ 1301111089 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetSecurityDescriptorSacl .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetSecurityDescriptorSacl@16__imp__GetSecurityDescriptorSacl@16__head_libadvapi32_a dgxgs00217.o/ 1301111089 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %GetSecurityDescriptorRMControl .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetSecurityDescriptorRMControl@8__imp__GetSecurityDescriptorRMControl@8__head_libadvapi32_a dgxgs00216.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetSecurityDescriptorOwner .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetSecurityDescriptorOwner@12__imp__GetSecurityDescriptorOwner@12__head_libadvapi32_a dgxgs00215.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetSecurityDescriptorLength .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetSecurityDescriptorLength@4__imp__GetSecurityDescriptorLength@4__head_libadvapi32_a dgxgs00214.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetSecurityDescriptorGroup .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetSecurityDescriptorGroup@12__imp__GetSecurityDescriptorGroup@12__head_libadvapi32_a dgxgs00213.o/ 1301111089 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetSecurityDescriptorDacl .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetSecurityDescriptorDacl@16__imp__GetSecurityDescriptorDacl@16__head_libadvapi32_a dgxgs00212.o/ 1301111089 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetSecurityDescriptorControl .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_GetSecurityDescriptorControl@12__imp__GetSecurityDescriptorControl@12__head_libadvapi32_a dgxgs00211.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetPrivateObjectSecurity .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetPrivateObjectSecurity@20__imp__GetPrivateObjectSecurity@20__head_libadvapi32_a dgxgs00210.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetOverlappedAccessResults .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetOverlappedAccessResults@16__imp__GetOverlappedAccessResults@16__head_libadvapi32_a dgxgs00209.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetOldestEventLogRecord .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetOldestEventLogRecord@8__imp__GetOldestEventLogRecord@8__head_libadvapi32_a dgxgs00208.o/ 1301111089 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetNumberOfEventLogRecords .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetNumberOfEventLogRecords@8__imp__GetNumberOfEventLogRecords@8__head_libadvapi32_a dgxgs00207.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetNamedSecurityInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetNamedSecurityInfoW@32__imp__GetNamedSecurityInfoW@32__head_libadvapi32_a dgxgs00206.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetNamedSecurityInfoExW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetNamedSecurityInfoExW@36__imp__GetNamedSecurityInfoExW@36__head_libadvapi32_a dgxgs00205.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetNamedSecurityInfoExA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetNamedSecurityInfoExA@36__imp__GetNamedSecurityInfoExA@36__head_libadvapi32_a dgxgs00204.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetNamedSecurityInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetNamedSecurityInfoA@32__imp__GetNamedSecurityInfoA@32__head_libadvapi32_a dgxgs00203.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetMultipleTrusteeW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetMultipleTrusteeW@4__imp__GetMultipleTrusteeW@4__head_libadvapi32_a dgxgs00202.o/ 1301111089 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetMultipleTrusteeOperationW .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetMultipleTrusteeOperationW@4__imp__GetMultipleTrusteeOperationW@4__head_libadvapi32_a dgxgs00201.o/ 1301111089 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetMultipleTrusteeOperationA .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetMultipleTrusteeOperationA@4__imp__GetMultipleTrusteeOperationA@4__head_libadvapi32_a dgxgs00200.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetMultipleTrusteeA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetMultipleTrusteeA@4__imp__GetMultipleTrusteeA@4__head_libadvapi32_a dgxgs00199.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetMangledSiteSid .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetMangledSiteSid@12__imp__GetMangledSiteSid@12__head_libadvapi32_a dgxgs00198.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetManagedApplications .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetManagedApplications@20__imp__GetManagedApplications@20__head_libadvapi32_a dgxgs00197.o/ 1301111089 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetLocalManagedApplications .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetLocalManagedApplications@12__imp__GetLocalManagedApplications@12__head_libadvapi32_a dgxgs00196.o/ 1301111089 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetLengthSid .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetLengthSid@4__imp__GetLengthSid@4__head_libadvapi32_a dgxgs00195.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetKernelObjectSecurity .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetKernelObjectSecurity@20__imp__GetKernelObjectSecurity@20__head_libadvapi32_a dgxgs00194.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetInheritanceSourceW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetInheritanceSourceW@40__imp__GetInheritanceSourceW@40__head_libadvapi32_a dgxgs00193.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetInheritanceSourceA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetInheritanceSourceA@40__imp__GetInheritanceSourceA@40__head_libadvapi32_a dgxgs00192.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetFileSecurityW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetFileSecurityW@20__imp__GetFileSecurityW@20__head_libadvapi32_a dgxgs00191.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetFileSecurityA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetFileSecurityA@20__imp__GetFileSecurityA@20__head_libadvapi32_a dgxgs00190.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetExplicitEntriesFromAclW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetExplicitEntriesFromAclW@12__imp__GetExplicitEntriesFromAclW@12__head_libadvapi32_a dgxgs00189.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetExplicitEntriesFromAclA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetExplicitEntriesFromAclA@12__imp__GetExplicitEntriesFromAclA@12__head_libadvapi32_a dgxgs00188.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetEventLogInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetEventLogInformation@20__imp__GetEventLogInformation@20__head_libadvapi32_a dgxgs00187.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetEffectiveRightsFromAclW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetEffectiveRightsFromAclW@12__imp__GetEffectiveRightsFromAclW@12__head_libadvapi32_a dgxgs00186.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetEffectiveRightsFromAclA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetEffectiveRightsFromAclA@12__imp__GetEffectiveRightsFromAclA@12__head_libadvapi32_a dgxgs00185.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetCurrentHwProfileW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetCurrentHwProfileW@4__imp__GetCurrentHwProfileW@4__head_libadvapi32_a dgxgs00184.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetCurrentHwProfileA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetCurrentHwProfileA@4__imp__GetCurrentHwProfileA@4__head_libadvapi32_a dgxgs00183.o/ 1301111089 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetAuditedPermissionsFromAclW .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetAuditedPermissionsFromAclW@16__imp__GetAuditedPermissionsFromAclW@16__head_libadvapi32_a dgxgs00182.o/ 1301111089 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetAuditedPermissionsFromAclA .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetAuditedPermissionsFromAclA@16__imp__GetAuditedPermissionsFromAclA@16__head_libadvapi32_a dgxgs00181.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetAclInformation .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetAclInformation@16__imp__GetAclInformation@16__head_libadvapi32_a dgxgs00180.o/ 1301111089 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %GetAce .text.data.bss.idata$7.idata$5.idata$4.idata$6 5_GetAce@12__imp__GetAce@12__head_libadvapi32_a dgxgs00179.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %GetAccessPermissionsForObjectW .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_GetAccessPermissionsForObjectW@36__imp__GetAccessPermissionsForObjectW@36__head_libadvapi32_a dgxgs00178.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %GetAccessPermissionsForObjectA .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_GetAccessPermissionsForObjectA@36__imp__GetAccessPermissionsForObjectA@36__head_libadvapi32_a dgxgs00177.o/ 1301111089 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %FreeSid .text.data.bss.idata$7.idata$5.idata$4.idata$6 5_FreeSid@4__imp__FreeSid@4__head_libadvapi32_a dgxgs00176.o/ 1301111089 0 0 100666 681 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %FreeEncryptionCertificateHashList .text.data.bss.idata$7.idata$5.idata$4.idata$6)Ti_FreeEncryptionCertificateHashList@4__imp__FreeEncryptionCertificateHashList@4__head_libadvapi32_a dgxgs00175.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %FindFirstFreeAce .text.data.bss.idata$7.idata$5.idata$4.idata$62G_FindFirstFreeAce@8__imp__FindFirstFreeAce@8__head_libadvapi32_a dgxgs00174.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %FileEncryptionStatusW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_FileEncryptionStatusW@8__imp__FileEncryptionStatusW@8__head_libadvapi32_a dgxgs00173.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %FileEncryptionStatusA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_FileEncryptionStatusA@8__imp__FileEncryptionStatusA@8__head_libadvapi32_a dgxgs00172.o/ 1301111089 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %EqualSid .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_EqualSid@8__imp__EqualSid@8__head_libadvapi32_a dgxgs00171.o/ 1301111089 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EqualPrefixSid .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_EqualPrefixSid@8__imp__EqualPrefixSid@8__head_libadvapi32_a dgxgs00170.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumServicesStatusW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_EnumServicesStatusW@32__imp__EnumServicesStatusW@32__head_libadvapi32_a dgxgs00169.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumServicesStatusExW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_EnumServicesStatusExW@40__imp__EnumServicesStatusExW@40__head_libadvapi32_a dgxgs00168.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumServicesStatusExA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_EnumServicesStatusExA@40__imp__EnumServicesStatusExA@40__head_libadvapi32_a dgxgs00167.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumServicesStatusA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_EnumServicesStatusA@32__imp__EnumServicesStatusA@32__head_libadvapi32_a dgxgs00166.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumServiceGroupW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_EnumServiceGroupW@36__imp__EnumServiceGroupW@36__head_libadvapi32_a dgxgs00165.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %EnumDependentServicesW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_EnumDependentServicesW@24__imp__EnumDependentServicesW@24__head_libadvapi32_a dgxgs00164.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %EnumDependentServicesA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_EnumDependentServicesA@24__imp__EnumDependentServicesA@24__head_libadvapi32_a dgxgs00163.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EncryptionDisable .text.data.bss.idata$7.idata$5.idata$4.idata$64I_EncryptionDisable@8__imp__EncryptionDisable@8__head_libadvapi32_a dgxgs00162.o/ 1301111089 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EncryptFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_EncryptFileW@4__imp__EncryptFileW@4__head_libadvapi32_a dgxgs00161.o/ 1301111089 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EncryptFileA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_EncryptFileA@4__imp__EncryptFileA@4__head_libadvapi32_a dgxgs00160.o/ 1301111089 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EnableTrace .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_EnableTrace@24__imp__EnableTrace@24__head_libadvapi32_a dgxgs00159.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ElfReportEventW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_ElfReportEventW@48__imp__ElfReportEventW@48__head_libadvapi32_a dgxgs00158.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ElfReportEventA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_ElfReportEventA@48__imp__ElfReportEventA@48__head_libadvapi32_a dgxgs00157.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ElfRegisterEventSourceW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_ElfRegisterEventSourceW@12__imp__ElfRegisterEventSourceW@12__head_libadvapi32_a dgxgs00156.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ElfRegisterEventSourceA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_ElfRegisterEventSourceA@12__imp__ElfRegisterEventSourceA@12__head_libadvapi32_a dgxgs00155.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ElfReadEventLogW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_ElfReadEventLogW@28__imp__ElfReadEventLogW@28__head_libadvapi32_a dgxgs00154.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ElfReadEventLogA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_ElfReadEventLogA@28__imp__ElfReadEventLogA@28__head_libadvapi32_a dgxgs00153.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ElfOpenEventLogW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_ElfOpenEventLogW@12__imp__ElfOpenEventLogW@12__head_libadvapi32_a dgxgs00152.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ElfOpenEventLogA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_ElfOpenEventLogA@12__imp__ElfOpenEventLogA@12__head_libadvapi32_a dgxgs00151.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ElfOpenBackupEventLogW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_ElfOpenBackupEventLogW@12__imp__ElfOpenBackupEventLogW@12__head_libadvapi32_a dgxgs00150.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ElfOpenBackupEventLogA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_ElfOpenBackupEventLogA@12__imp__ElfOpenBackupEventLogA@12__head_libadvapi32_a dgxgs00149.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ElfOldestRecord .text.data.bss.idata$7.idata$5.idata$4.idata$60E_ElfOldestRecord@8__imp__ElfOldestRecord@8__head_libadvapi32_a dgxgs00148.o/ 1301111089 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ElfNumberOfRecords .text.data.bss.idata$7.idata$5.idata$4.idata$66K_ElfNumberOfRecords@8__imp__ElfNumberOfRecords@8__head_libadvapi32_a dgxgs00147.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ElfDeregisterEventSource .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_ElfDeregisterEventSource@4__imp__ElfDeregisterEventSource@4__head_libadvapi32_a dgxgs00146.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ElfCloseEventLog .text.data.bss.idata$7.idata$5.idata$4.idata$62G_ElfCloseEventLog@4__imp__ElfCloseEventLog@4__head_libadvapi32_a dgxgs00145.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ElfClearEventLogFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_ElfClearEventLogFileW@8__imp__ElfClearEventLogFileW@8__head_libadvapi32_a dgxgs00144.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ElfClearEventLogFileA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_ElfClearEventLogFileA@8__imp__ElfClearEventLogFileA@8__head_libadvapi32_a dgxgs00143.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ElfChangeNotify .text.data.bss.idata$7.idata$5.idata$4.idata$60E_ElfChangeNotify@8__imp__ElfChangeNotify@8__head_libadvapi32_a dgxgs00142.o/ 1301111089 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ElfBackupEventLogFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ElfBackupEventLogFileW@8__imp__ElfBackupEventLogFileW@8__head_libadvapi32_a dgxgs00141.o/ 1301111089 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ElfBackupEventLogFileA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ElfBackupEventLogFileA@8__imp__ElfBackupEventLogFileA@8__head_libadvapi32_a dgxgs00140.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DuplicateTokenEx .text.data.bss.idata$7.idata$5.idata$4.idata$64I_DuplicateTokenEx@24__imp__DuplicateTokenEx@24__head_libadvapi32_a dgxgs00139.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DuplicateToken .text.data.bss.idata$7.idata$5.idata$4.idata$60E_DuplicateToken@12__imp__DuplicateToken@12__head_libadvapi32_a dgxgs00138.o/ 1301111089 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %DuplicateEncryptionInfoFile .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_DuplicateEncryptionInfoFile@8__imp__DuplicateEncryptionInfoFile@8__head_libadvapi32_a dgxgs00137.o/ 1301111089 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %DestroyPrivateObjectSecurity .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__DestroyPrivateObjectSecurity@4__imp__DestroyPrivateObjectSecurity@4__head_libadvapi32_a dgxgs00136.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DeregisterEventSource .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_DeregisterEventSource@4__imp__DeregisterEventSource@4__head_libadvapi32_a dgxgs00135.o/ 1301111089 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DeleteService .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_DeleteService@4__imp__DeleteService@4__head_libadvapi32_a dgxgs00134.o/ 1301111089 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %DeleteAce .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_DeleteAce@8__imp__DeleteAce@8__head_libadvapi32_a dgxgs00133.o/ 1301111089 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DecryptFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_DecryptFileW@8__imp__DecryptFileW@8__head_libadvapi32_a dgxgs00132.o/ 1301111089 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DecryptFileA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_DecryptFileA@8__imp__DecryptFileA@8__head_libadvapi32_a dgxgs00131.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CryptVerifySignatureW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_CryptVerifySignatureW@24__imp__CryptVerifySignatureW@24__head_libadvapi32_a dgxgs00130.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CryptVerifySignatureA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_CryptVerifySignatureA@24__imp__CryptVerifySignatureA@24__head_libadvapi32_a dgxgs00129.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CryptSignHashW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CryptSignHashW@24__imp__CryptSignHashW@24__head_libadvapi32_a dgxgs00128.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CryptSignHashA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CryptSignHashA@24__imp__CryptSignHashA@24__head_libadvapi32_a dgxgs00127.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CryptSetProviderW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_CryptSetProviderW@8__imp__CryptSetProviderW@8__head_libadvapi32_a dgxgs00126.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %~CryptSetProviderExW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CryptSetProviderExW@16__imp__CryptSetProviderExW@16__head_libadvapi32_a dgxgs00125.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %}CryptSetProviderExA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CryptSetProviderExA@16__imp__CryptSetProviderExA@16__head_libadvapi32_a dgxgs00124.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %|CryptSetProviderA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_CryptSetProviderA@8__imp__CryptSetProviderA@8__head_libadvapi32_a dgxgs00123.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %{CryptSetProvParam .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CryptSetProvParam@16__imp__CryptSetProvParam@16__head_libadvapi32_a dgxgs00122.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %zCryptSetKeyParam .text.data.bss.idata$7.idata$5.idata$4.idata$64I_CryptSetKeyParam@16__imp__CryptSetKeyParam@16__head_libadvapi32_a dgxgs00121.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %yCryptSetHashParam .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CryptSetHashParam@16__imp__CryptSetHashParam@16__head_libadvapi32_a dgxgs00120.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %xCryptReleaseContext .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CryptReleaseContext@8__imp__CryptReleaseContext@8__head_libadvapi32_a dgxgs00119.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %wCryptImportKey .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CryptImportKey@24__imp__CryptImportKey@24__head_libadvapi32_a dgxgs00118.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %vCryptHashSessionKey .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CryptHashSessionKey@12__imp__CryptHashSessionKey@12__head_libadvapi32_a dgxgs00117.o/ 1301111089 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %uCryptHashData .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_CryptHashData@16__imp__CryptHashData@16__head_libadvapi32_a dgxgs00116.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %tCryptGetUserKey .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CryptGetUserKey@12__imp__CryptGetUserKey@12__head_libadvapi32_a dgxgs00115.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %sCryptGetProvParam .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CryptGetProvParam@20__imp__CryptGetProvParam@20__head_libadvapi32_a dgxgs00114.o/ 1301111089 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %rCryptGetKeyParam .text.data.bss.idata$7.idata$5.idata$4.idata$64I_CryptGetKeyParam@20__imp__CryptGetKeyParam@20__head_libadvapi32_a dgxgs00113.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %qCryptGetHashParam .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CryptGetHashParam@20__imp__CryptGetHashParam@20__head_libadvapi32_a dgxgs00112.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %pCryptGetDefaultProviderW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_CryptGetDefaultProviderW@20__imp__CryptGetDefaultProviderW@20__head_libadvapi32_a dgxgs00111.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %oCryptGetDefaultProviderA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_CryptGetDefaultProviderA@20__imp__CryptGetDefaultProviderA@20__head_libadvapi32_a dgxgs00110.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %nCryptGenRandom .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CryptGenRandom@12__imp__CryptGenRandom@12__head_libadvapi32_a dgxgs00109.o/ 1301111089 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %mCryptGenKey .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_CryptGenKey@16__imp__CryptGenKey@16__head_libadvapi32_a dgxgs00108.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %lCryptExportKey .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CryptExportKey@24__imp__CryptExportKey@24__head_libadvapi32_a dgxgs00107.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %kCryptEnumProvidersW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CryptEnumProvidersW@24__imp__CryptEnumProvidersW@24__head_libadvapi32_a dgxgs00106.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %jCryptEnumProvidersA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CryptEnumProvidersA@24__imp__CryptEnumProvidersA@24__head_libadvapi32_a dgxgs00105.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %iCryptEnumProviderTypesW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_CryptEnumProviderTypesW@24__imp__CryptEnumProviderTypesW@24__head_libadvapi32_a dgxgs00104.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %hCryptEnumProviderTypesA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_CryptEnumProviderTypesA@24__imp__CryptEnumProviderTypesA@24__head_libadvapi32_a dgxgs00103.o/ 1301111089 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %gCryptEncrypt .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_CryptEncrypt@28__imp__CryptEncrypt@28__head_libadvapi32_a dgxgs00102.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %fCryptDuplicateKey .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CryptDuplicateKey@16__imp__CryptDuplicateKey@16__head_libadvapi32_a dgxgs00101.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %eCryptDuplicateHash .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CryptDuplicateHash@16__imp__CryptDuplicateHash@16__head_libadvapi32_a dgxgs00100.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %dCryptDestroyKey .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CryptDestroyKey@4__imp__CryptDestroyKey@4__head_libadvapi32_a dgxgs00099.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %cCryptDestroyHash .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CryptDestroyHash@4__imp__CryptDestroyHash@4__head_libadvapi32_a dgxgs00098.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %bCryptDeriveKey .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CryptDeriveKey@20__imp__CryptDeriveKey@20__head_libadvapi32_a dgxgs00097.o/ 1301111089 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %aCryptDecrypt .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_CryptDecrypt@24__imp__CryptDecrypt@24__head_libadvapi32_a dgxgs00096.o/ 1301111089 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %`CryptCreateHash .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CryptCreateHash@20__imp__CryptCreateHash@20__head_libadvapi32_a dgxgs00095.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %_CryptContextAddRef .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CryptContextAddRef@12__imp__CryptContextAddRef@12__head_libadvapi32_a dgxgs00094.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %^CryptAcquireContextW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CryptAcquireContextW@20__imp__CryptAcquireContextW@20__head_libadvapi32_a dgxgs00093.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %]CryptAcquireContextA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CryptAcquireContextA@20__imp__CryptAcquireContextA@20__head_libadvapi32_a dgxgs00092.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %\CreateTraceInstanceId .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CreateTraceInstanceId@8__imp__CreateTraceInstanceId@8__head_libadvapi32_a dgxgs00091.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %[CreateServiceW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CreateServiceW@52__imp__CreateServiceW@52__head_libadvapi32_a dgxgs00090.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ZCreateServiceA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CreateServiceA@52__imp__CreateServiceA@52__head_libadvapi32_a dgxgs00089.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %YCreateRestrictedToken .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_CreateRestrictedToken@36__imp__CreateRestrictedToken@36__head_libadvapi32_a dgxgs00088.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %XCreateProcessWithLogonW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_CreateProcessWithLogonW@44__imp__CreateProcessWithLogonW@44__head_libadvapi32_a dgxgs00087.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %WCreateProcessAsUserW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CreateProcessAsUserW@44__imp__CreateProcessAsUserW@44__head_libadvapi32_a dgxgs00086.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VCreateProcessAsUserA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CreateProcessAsUserA@44__imp__CreateProcessAsUserA@44__head_libadvapi32_a dgxgs00085.o/ 1301111089 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %UCreatePrivateObjectSecurityEx .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_CreatePrivateObjectSecurityEx@32__imp__CreatePrivateObjectSecurityEx@32__head_libadvapi32_a dgxgs00084.o/ 1301111089 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %TCreatePrivateObjectSecurity .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__CreatePrivateObjectSecurity@24__imp__CreatePrivateObjectSecurity@24__head_libadvapi32_a dgxgs00083.o/ 1301111089 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %SCopySid .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_CopySid@12__imp__CopySid@12__head_libadvapi32_a dgxgs00082.o/ 1301111089 0 0 100666 707 ` L .text,l 0`.data@0.bss0.idata$74v0.idata$580.idata$4<0.idata$6,@ %RConvertToAutoInheritPrivateObjectSecurity .text.data.bss.idata$7.idata$5.idata$4.idata$62f{_ConvertToAutoInheritPrivateObjectSecurity@24__imp__ConvertToAutoInheritPrivateObjectSecurity@24__head_libadvapi32_a dgxgs00081.o/ 1301111089 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %QConvertStringSidToSidW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ConvertStringSidToSidW@8__imp__ConvertStringSidToSidW@8__head_libadvapi32_a dgxgs00080.o/ 1301111089 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %PConvertStringSidToSidA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ConvertStringSidToSidA@8__imp__ConvertStringSidToSidA@8__head_libadvapi32_a dgxgs00079.o/ 1301111089 0 0 100666 741 ` L .text,x 0`.data@0.bss0.idata$740.idata$580.idata$4<0.idata$68@ %OConvertStringSecurityDescriptorToSecurityDescriptorW .text.data.bss.idata$7.idata$5.idata$4.idata$6=|_ConvertStringSecurityDescriptorToSecurityDescriptorW@16__imp__ConvertStringSecurityDescriptorToSecurityDescriptorW@16__head_libadvapi32_a dgxgs00078.o/ 1301111089 0 0 100666 741 ` L .text,x 0`.data@0.bss0.idata$740.idata$580.idata$4<0.idata$68@ %NConvertStringSecurityDescriptorToSecurityDescriptorA .text.data.bss.idata$7.idata$5.idata$4.idata$6=|_ConvertStringSecurityDescriptorToSecurityDescriptorA@16__imp__ConvertStringSecurityDescriptorToSecurityDescriptorA@16__head_libadvapi32_a dgxgs00077.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %MConvertStringSDToSDRootDomainW .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_ConvertStringSDToSDRootDomainW@20__imp__ConvertStringSDToSDRootDomainW@20__head_libadvapi32_a dgxgs00076.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %LConvertStringSDToSDRootDomainA .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_ConvertStringSDToSDRootDomainA@20__imp__ConvertStringSDToSDRootDomainA@20__head_libadvapi32_a dgxgs00075.o/ 1301111089 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %KConvertSidToStringSidW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ConvertSidToStringSidW@8__imp__ConvertSidToStringSidW@8__head_libadvapi32_a dgxgs00074.o/ 1301111089 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %JConvertSidToStringSidA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ConvertSidToStringSidA@8__imp__ConvertSidToStringSidA@8__head_libadvapi32_a dgxgs00073.o/ 1301111089 0 0 100666 741 ` L .text,x 0`.data@0.bss0.idata$740.idata$580.idata$4<0.idata$68@ %IConvertSecurityDescriptorToStringSecurityDescriptorW .text.data.bss.idata$7.idata$5.idata$4.idata$6=|_ConvertSecurityDescriptorToStringSecurityDescriptorW@20__imp__ConvertSecurityDescriptorToStringSecurityDescriptorW@20__head_libadvapi32_a dgxgs00072.o/ 1301111089 0 0 100666 741 ` L .text,x 0`.data@0.bss0.idata$740.idata$580.idata$4<0.idata$68@ %HConvertSecurityDescriptorToStringSecurityDescriptorA .text.data.bss.idata$7.idata$5.idata$4.idata$6=|_ConvertSecurityDescriptorToStringSecurityDescriptorA@20__imp__ConvertSecurityDescriptorToStringSecurityDescriptorA@20__head_libadvapi32_a dgxgs00071.o/ 1301111089 0 0 100666 689 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %GConvertSecurityDescriptorToAccessW .text.data.bss.idata$7.idata$5.idata$4.idata$6+Xm_ConvertSecurityDescriptorToAccessW@28__imp__ConvertSecurityDescriptorToAccessW@28__head_libadvapi32_a dgxgs00070.o/ 1301111089 0 0 100666 703 ` L .text,l 0`.data@0.bss0.idata$74v0.idata$580.idata$4<0.idata$6*@ %FConvertSecurityDescriptorToAccessNamedW .text.data.bss.idata$7.idata$5.idata$4.idata$60bw_ConvertSecurityDescriptorToAccessNamedW@28__imp__ConvertSecurityDescriptorToAccessNamedW@28__head_libadvapi32_a dgxgs00069.o/ 1301111089 0 0 100666 703 ` L .text,l 0`.data@0.bss0.idata$74v0.idata$580.idata$4<0.idata$6*@ %EConvertSecurityDescriptorToAccessNamedA .text.data.bss.idata$7.idata$5.idata$4.idata$60bw_ConvertSecurityDescriptorToAccessNamedA@28__imp__ConvertSecurityDescriptorToAccessNamedA@28__head_libadvapi32_a dgxgs00068.o/ 1301111089 0 0 100666 689 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %DConvertSecurityDescriptorToAccessA .text.data.bss.idata$7.idata$5.idata$4.idata$6+Xm_ConvertSecurityDescriptorToAccessA@28__imp__ConvertSecurityDescriptorToAccessA@28__head_libadvapi32_a dgxgs00067.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %CConvertSDToStringSDRootDomainW .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_ConvertSDToStringSDRootDomainW@24__imp__ConvertSDToStringSDRootDomainW@24__head_libadvapi32_a dgxgs00066.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %BConvertSDToStringSDRootDomainA .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_ConvertSDToStringSDRootDomainA@24__imp__ConvertSDToStringSDRootDomainA@24__head_libadvapi32_a dgxgs00065.o/ 1301111089 0 0 100666 689 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %AConvertAccessToSecurityDescriptorW .text.data.bss.idata$7.idata$5.idata$4.idata$6+Xm_ConvertAccessToSecurityDescriptorW@20__imp__ConvertAccessToSecurityDescriptorW@20__head_libadvapi32_a dgxgs00064.o/ 1301111089 0 0 100666 689 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %@ConvertAccessToSecurityDescriptorA .text.data.bss.idata$7.idata$5.idata$4.idata$6+Xm_ConvertAccessToSecurityDescriptorA@20__imp__ConvertAccessToSecurityDescriptorA@20__head_libadvapi32_a dgxgs00063.o/ 1301111089 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %?ControlTraceW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_ControlTraceW@20__imp__ControlTraceW@20__head_libadvapi32_a dgxgs00062.o/ 1301111089 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %>ControlTraceA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_ControlTraceA@20__imp__ControlTraceA@20__head_libadvapi32_a dgxgs00061.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %=ControlService .text.data.bss.idata$7.idata$5.idata$4.idata$60E_ControlService@12__imp__ControlService@12__head_libadvapi32_a dgxgs00060.o/ 1301111089 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %<CommandLineFromMsiDescriptor .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_CommandLineFromMsiDescriptor@12__imp__CommandLineFromMsiDescriptor@12__head_libadvapi32_a dgxgs00059.o/ 1301111089 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %;CloseTrace .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_CloseTrace@8__imp__CloseTrace@8__head_libadvapi32_a dgxgs00058.o/ 1301111089 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %:CloseServiceHandle .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CloseServiceHandle@4__imp__CloseServiceHandle@4__head_libadvapi32_a dgxgs00057.o/ 1301111089 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %9CloseEventLog .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_CloseEventLog@4__imp__CloseEventLog@4__head_libadvapi32_a dgxgs00056.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %8CloseEncryptedFileRaw .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CloseEncryptedFileRaw@4__imp__CloseEncryptedFileRaw@4__head_libadvapi32_a dgxgs00055.o/ 1301111089 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %7ClearEventLogW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_ClearEventLogW@8__imp__ClearEventLogW@8__head_libadvapi32_a dgxgs00054.o/ 1301111089 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %6ClearEventLogA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_ClearEventLogA@8__imp__ClearEventLogA@8__head_libadvapi32_a dgxgs00053.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %5CheckTokenMembership .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CheckTokenMembership@12__imp__CheckTokenMembership@12__head_libadvapi32_a dgxgs00052.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %4ChangeServiceConfigW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_ChangeServiceConfigW@44__imp__ChangeServiceConfigW@44__head_libadvapi32_a dgxgs00051.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %3ChangeServiceConfigA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_ChangeServiceConfigA@44__imp__ChangeServiceConfigA@44__head_libadvapi32_a dgxgs00050.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %2ChangeServiceConfig2W .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ChangeServiceConfig2W@12__imp__ChangeServiceConfig2W@12__head_libadvapi32_a dgxgs00049.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %1ChangeServiceConfig2A .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ChangeServiceConfig2A@12__imp__ChangeServiceConfig2A@12__head_libadvapi32_a dgxgs00048.o/ 1301111089 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %0CancelOverlappedAccess .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_CancelOverlappedAccess@4__imp__CancelOverlappedAccess@4__head_libadvapi32_a dgxgs00047.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %/BuildTrusteeWithSidW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_BuildTrusteeWithSidW@8__imp__BuildTrusteeWithSidW@8__head_libadvapi32_a dgxgs00046.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %.BuildTrusteeWithSidA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_BuildTrusteeWithSidA@8__imp__BuildTrusteeWithSidA@8__head_libadvapi32_a dgxgs00045.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %-BuildTrusteeWithObjectsAndSidW .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_BuildTrusteeWithObjectsAndSidW@20__imp__BuildTrusteeWithObjectsAndSidW@20__head_libadvapi32_a dgxgs00044.o/ 1301111089 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %,BuildTrusteeWithObjectsAndSidA .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_BuildTrusteeWithObjectsAndSidA@20__imp__BuildTrusteeWithObjectsAndSidA@20__head_libadvapi32_a dgxgs00043.o/ 1301111089 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %+BuildTrusteeWithObjectsAndNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_BuildTrusteeWithObjectsAndNameW@24__imp__BuildTrusteeWithObjectsAndNameW@24__head_libadvapi32_a dgxgs00042.o/ 1301111089 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %*BuildTrusteeWithObjectsAndNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_BuildTrusteeWithObjectsAndNameA@24__imp__BuildTrusteeWithObjectsAndNameA@24__head_libadvapi32_a dgxgs00041.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %)BuildTrusteeWithNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_BuildTrusteeWithNameW@8__imp__BuildTrusteeWithNameW@8__head_libadvapi32_a dgxgs00040.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %(BuildTrusteeWithNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_BuildTrusteeWithNameA@8__imp__BuildTrusteeWithNameA@8__head_libadvapi32_a dgxgs00039.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %'BuildSecurityDescriptorW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_BuildSecurityDescriptorW@36__imp__BuildSecurityDescriptorW@36__head_libadvapi32_a dgxgs00038.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %&BuildSecurityDescriptorA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_BuildSecurityDescriptorA@36__imp__BuildSecurityDescriptorA@36__head_libadvapi32_a dgxgs00037.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %%BuildImpersonateTrusteeW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_BuildImpersonateTrusteeW@8__imp__BuildImpersonateTrusteeW@8__head_libadvapi32_a dgxgs00036.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %$BuildImpersonateTrusteeA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_BuildImpersonateTrusteeA@8__imp__BuildImpersonateTrusteeA@8__head_libadvapi32_a dgxgs00035.o/ 1301111089 0 0 100666 703 ` L .text,l 0`.data@0.bss0.idata$74v0.idata$580.idata$4<0.idata$6*@ %#BuildImpersonateExplicitAccessWithNameW .text.data.bss.idata$7.idata$5.idata$4.idata$60bw_BuildImpersonateExplicitAccessWithNameW@24__imp__BuildImpersonateExplicitAccessWithNameW@24__head_libadvapi32_a dgxgs00034.o/ 1301111089 0 0 100666 703 ` L .text,l 0`.data@0.bss0.idata$74v0.idata$580.idata$4<0.idata$6*@ %"BuildImpersonateExplicitAccessWithNameA .text.data.bss.idata$7.idata$5.idata$4.idata$60bw_BuildImpersonateExplicitAccessWithNameA@24__imp__BuildImpersonateExplicitAccessWithNameA@24__head_libadvapi32_a dgxgs00033.o/ 1301111089 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %!BuildExplicitAccessWithNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_BuildExplicitAccessWithNameW@20__imp__BuildExplicitAccessWithNameW@20__head_libadvapi32_a dgxgs00032.o/ 1301111089 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ % BuildExplicitAccessWithNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_BuildExplicitAccessWithNameA@20__imp__BuildExplicitAccessWithNameA@20__head_libadvapi32_a dgxgs00031.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %BackupEventLogW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_BackupEventLogW@8__imp__BackupEventLogW@8__head_libadvapi32_a dgxgs00030.o/ 1301111089 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %BackupEventLogA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_BackupEventLogA@8__imp__BackupEventLogA@8__head_libadvapi32_a dgxgs00029.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AreAnyAccessesGranted .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_AreAnyAccessesGranted@8__imp__AreAnyAccessesGranted@8__head_libadvapi32_a dgxgs00028.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AreAllAccessesGranted .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_AreAllAccessesGranted@8__imp__AreAllAccessesGranted@8__head_libadvapi32_a dgxgs00027.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AllocateLocallyUniqueId .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_AllocateLocallyUniqueId@4__imp__AllocateLocallyUniqueId@4__head_libadvapi32_a dgxgs00026.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AllocateAndInitializeSid .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_AllocateAndInitializeSid@44__imp__AllocateAndInitializeSid@44__head_libadvapi32_a dgxgs00025.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AdjustTokenPrivileges .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_AdjustTokenPrivileges@24__imp__AdjustTokenPrivileges@24__head_libadvapi32_a dgxgs00024.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %AdjustTokenGroups .text.data.bss.idata$7.idata$5.idata$4.idata$66K_AdjustTokenGroups@24__imp__AdjustTokenGroups@24__head_libadvapi32_a dgxgs00023.o/ 1301111089 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AddUsersToEncryptedFile .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_AddUsersToEncryptedFile@8__imp__AddUsersToEncryptedFile@8__head_libadvapi32_a dgxgs00022.o/ 1301111089 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AddAuditAccessObjectAce .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_AddAuditAccessObjectAce@36__imp__AddAuditAccessObjectAce@36__head_libadvapi32_a dgxgs00021.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AddAuditAccessAceEx .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_AddAuditAccessAceEx@28__imp__AddAuditAccessAceEx@28__head_libadvapi32_a dgxgs00020.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %AddAuditAccessAce .text.data.bss.idata$7.idata$5.idata$4.idata$66K_AddAuditAccessAce@24__imp__AddAuditAccessAce@24__head_libadvapi32_a dgxgs00019.o/ 1301111089 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %AddAce .text.data.bss.idata$7.idata$5.idata$4.idata$6 5_AddAce@20__imp__AddAce@20__head_libadvapi32_a dgxgs00018.o/ 1301111089 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AddAccessDeniedObjectAce .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_AddAccessDeniedObjectAce@28__imp__AddAccessDeniedObjectAce@28__head_libadvapi32_a dgxgs00017.o/ 1301111089 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AddAccessDeniedAceEx .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_AddAccessDeniedAceEx@20__imp__AddAccessDeniedAceEx@20__head_libadvapi32_a dgxgs00016.o/ 1301111089 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AddAccessDeniedAce .text.data.bss.idata$7.idata$5.idata$4.idata$68M_AddAccessDeniedAce@16__imp__AddAccessDeniedAce@16__head_libadvapi32_a dgxgs00015.o/ 1301111089 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AddAccessAllowedObjectAce .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_AddAccessAllowedObjectAce@28__imp__AddAccessAllowedObjectAce@28__head_libadvapi32_a dgxgs00014.o/ 1301111089 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AddAccessAllowedAceEx .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_AddAccessAllowedAceEx@20__imp__AddAccessAllowedAceEx@20__head_libadvapi32_a dgxgs00013.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ % AddAccessAllowedAce .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_AddAccessAllowedAce@16__imp__AddAccessAllowedAce@16__head_libadvapi32_a dgxgs00012.o/ 1301111089 0 0 100666 707 ` L .text,l 0`.data@0.bss0.idata$74v0.idata$580.idata$4<0.idata$6,@ % AccessCheckByTypeResultListAndAuditAlarmW .text.data.bss.idata$7.idata$5.idata$4.idata$62f{_AccessCheckByTypeResultListAndAuditAlarmW@64__imp__AccessCheckByTypeResultListAndAuditAlarmW@64__head_libadvapi32_a dgxgs00011.o/ 1301111089 0 0 100666 731 ` L .text,t 0`.data@0.bss0.idata$74~0.idata$580.idata$4<0.idata$64@ % AccessCheckByTypeResultListAndAuditAlarmByHandleW .text.data.bss.idata$7.idata$5.idata$4.idata$6:v_AccessCheckByTypeResultListAndAuditAlarmByHandleW@68__imp__AccessCheckByTypeResultListAndAuditAlarmByHandleW@68__head_libadvapi32_a dgxgs00010.o/ 1301111089 0 0 100666 731 ` L .text,t 0`.data@0.bss0.idata$74~0.idata$580.idata$4<0.idata$64@ % AccessCheckByTypeResultListAndAuditAlarmByHandleA .text.data.bss.idata$7.idata$5.idata$4.idata$6:v_AccessCheckByTypeResultListAndAuditAlarmByHandleA@68__imp__AccessCheckByTypeResultListAndAuditAlarmByHandleA@68__head_libadvapi32_a dgxgs00009.o/ 1301111089 0 0 100666 707 ` L .text,l 0`.data@0.bss0.idata$74v0.idata$580.idata$4<0.idata$6,@ % AccessCheckByTypeResultListAndAuditAlarmA .text.data.bss.idata$7.idata$5.idata$4.idata$62f{_AccessCheckByTypeResultListAndAuditAlarmA@64__imp__AccessCheckByTypeResultListAndAuditAlarmA@64__head_libadvapi32_a dgxgs00008.o/ 1301111089 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %AccessCheckByTypeResultList .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__AccessCheckByTypeResultList@44__imp__AccessCheckByTypeResultList@44__head_libadvapi32_a dgxgs00007.o/ 1301111089 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %AccessCheckByTypeAndAuditAlarmW .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_AccessCheckByTypeAndAuditAlarmW@64__imp__AccessCheckByTypeAndAuditAlarmW@64__head_libadvapi32_a dgxgs00006.o/ 1301111089 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %AccessCheckByTypeAndAuditAlarmA .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_AccessCheckByTypeAndAuditAlarmA@64__imp__AccessCheckByTypeAndAuditAlarmA@64__head_libadvapi32_a dgxgs00005.o/ 1301111089 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %AccessCheckByType .text.data.bss.idata$7.idata$5.idata$4.idata$66K_AccessCheckByType@44__imp__AccessCheckByType@44__head_libadvapi32_a dgxgs00004.o/ 1301111089 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AccessCheckAndAuditAlarmW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_AccessCheckAndAuditAlarmW@44__imp__AccessCheckAndAuditAlarmW@44__head_libadvapi32_a dgxgs00003.o/ 1301111089 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AccessCheckAndAuditAlarmA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_AccessCheckAndAuditAlarmA@44__imp__AccessCheckAndAuditAlarmA@44__head_libadvapi32_a dgxgs00002.o/ 1301111089 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %AccessCheck .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_AccessCheck@32__imp__AccessCheck@32__head_libadvapi32_a dgxgs00001.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AbortSystemShutdownW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_AbortSystemShutdownW@4__imp__AbortSystemShutdownW@4__head_libadvapi32_a dgxgs00000.o/ 1301111089 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AbortSystemShutdownA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_AbortSystemShutdownA@4__imp__AbortSystemShutdownA@4__head_libadvapi32_a CharacterManaJ/src/Launch4JStub/w32api/crt2.o0000644000175000017500000000510713615720000020762 0ustar paulliupaulliuL(.textL& P`.data@0.bss0/4@0@S8tD$D$$Ѓ $D$,D$D$$D$,D$ D$(D$tBD$C$D$C0$D$CP$D$D$$$t&S(D$0=w==rMD$$1([v=tK=t=u=tB=uD$$tit$и1v&D$$ tJs$ иb$иOD$$3D$$ D$$۸D$D$'$kt&'$Kt&''zR| ( AC@b4C@LKS Z sx !"#  $%&?''''3'P'f L p    .filegcrt1.c " < L _atexit __onexit .text&.data.bss___argv__argci__fmode     % / ; ___main V _main __cexit d _signal s.eh_frame___mingw_CRTStartup__gnu_exception_handler@4_mainCRTStartup_WinMainCRTStartup.eh_frame___dyn_tls_init_callback__CRT_glob__CRT_fmode__imp___iob__imp____set_app_type__imp__atexit__imp___onexit_SetUnhandledExceptionFilter@4___cpu_features_init__fpreset___getmainargs__setmode___p__fmode__pei386_runtime_relocator___p__environ_ExitProcess@4CharacterManaJ/src/Launch4JStub/w32api/libshell32.a0000644000175000017500000042763213615720000022050 0ustar paulliupaulliu! / 1301111117 0 0 0 11724 ` .03L3L5588;0;0==@b@bBBEEH:H:JJMrMrPPRRUJUJWWZZ]]__bZbZddggj.j.llohohrrttw:w:yy|n|nnn tt$$,,xx((88@@88::ĒĒBB̰̰rr..עעjj22XX""rr::dd   ~ ~ < <dd||,,!!$$'l'l*:*:--//2z2z5*5*77::=F=F@@BBEEH@H@KKMMPdPdSSUUXxXx[*[*^ ^ ``ccf8f8i"i"kknnqhqht$t$vvyy|H|H~~\\FFxxFFbb..<<||JJ00nn̸̸jjטט@@߼߼llnn66>>RRNN    vv&&TT__libshell32_a_iname__head_libshell32_a_WOWShellExecute@28__imp__WOWShellExecute@28_StrStrW@8__imp__StrStrW@8_StrStrIW@8__imp__StrStrIW@8_StrStrIA@8__imp__StrStrIA@8_StrStrA@8__imp__StrStrA@8_StrRStrW@12__imp__StrRStrW@12_StrRStrIW@12__imp__StrRStrIW@12_StrRStrIA@12__imp__StrRStrIA@12_StrRStrA@12__imp__StrRStrA@12_StrRChrW@12__imp__StrRChrW@12_StrRChrIW@12__imp__StrRChrIW@12_StrRChrIA@12__imp__StrRChrIA@12_StrRChrA@12__imp__StrRChrA@12_StrNCpyW@12__imp__StrNCpyW@12_StrNCpyA@12__imp__StrNCpyA@12_StrNCmpW@12__imp__StrNCmpW@12_StrNCmpIW@12__imp__StrNCmpIW@12_StrNCmpIA@12__imp__StrNCmpIA@12_StrNCmpA@12__imp__StrNCmpA@12_StrCpyNW@12__imp__StrCpyNW@12_StrCpyNA@12__imp__StrCpyNA@12_StrCmpNW@12__imp__StrCmpNW@12_StrCmpNIW@12__imp__StrCmpNIW@12_StrCmpNIA@12__imp__StrCmpNIA@12_StrCmpNA@12__imp__StrCmpNA@12_StrChrW@8__imp__StrChrW@8_StrChrIW@8__imp__StrChrIW@8_StrChrIA@8__imp__StrChrIA@8_StrChrA@8__imp__StrChrA@8_Shell_NotifyIconW@8__imp__Shell_NotifyIconW@8_Shell_NotifyIconA@8__imp__Shell_NotifyIconA@8_Shell_NotifyIcon@8__imp__Shell_NotifyIcon@8_ShellHookProc@12__imp__ShellHookProc@12_ShellExecuteW@24__imp__ShellExecuteW@24_ShellExecuteExW@4__imp__ShellExecuteExW@4_ShellExecuteExA@4__imp__ShellExecuteExA@4_ShellExecuteEx@4__imp__ShellExecuteEx@4_ShellExecuteA@24__imp__ShellExecuteA@24_ShellAboutW@16__imp__ShellAboutW@16_ShellAboutA@16__imp__ShellAboutA@16_SheShortenPathW@8__imp__SheShortenPathW@8_SheShortenPathA@8__imp__SheShortenPathA@8_SheSetCurDrive@4__imp__SheSetCurDrive@4_SheRemoveQuotesW@4__imp__SheRemoveQuotesW@4_SheRemoveQuotesA@4__imp__SheRemoveQuotesA@4_SheGetPathOffsetW@4__imp__SheGetPathOffsetW@4_SheGetDirW@8__imp__SheGetDirW@8_SheGetDirExW@12__imp__SheGetDirExW@12_SheGetDirA@8__imp__SheGetDirA@8_SheGetCurDrive@0__imp__SheGetCurDrive@0_SheFullPathW@12__imp__SheFullPathW@12_SheFullPathA@12__imp__SheFullPathA@12_SheConvertPathW@12__imp__SheConvertPathW@12_SheChangeDirW@4__imp__SheChangeDirW@4_SheChangeDirExW@4__imp__SheChangeDirExW@4_SheChangeDirExA@4__imp__SheChangeDirExA@4_SheChangeDirA@4__imp__SheChangeDirA@4_SHUpdateRecycleBinIcon@0__imp__SHUpdateRecycleBinIcon@0_SHSetUnreadMailCountW@12__imp__SHSetUnreadMailCountW@12_SHSetLocalizedName@12__imp__SHSetLocalizedName@12_SHQueryRecycleBinW@8__imp__SHQueryRecycleBinW@8_SHQueryRecycleBinA@8__imp__SHQueryRecycleBinA@8_SHPathPrepareForWriteW@16__imp__SHPathPrepareForWriteW@16_SHPathPrepareForWriteA@16__imp__SHPathPrepareForWriteA@16_SHParseDisplayName@20__imp__SHParseDisplayName@20_SHOpenFolderAndSelectItems@16__imp__SHOpenFolderAndSelectItems@16_SHLoadNonloadedIconOverlayIdentifiers@0__imp__SHLoadNonloadedIconOverlayIdentifiers@0_SHLoadInProc@4__imp__SHLoadInProc@4_SHIsFileAvailableOffline@8__imp__SHIsFileAvailableOffline@8_SHInvokePrinterCommandW@20__imp__SHInvokePrinterCommandW@20_SHInvokePrinterCommandA@20__imp__SHInvokePrinterCommandA@20_SHILCreateFromPath@12__imp__SHILCreateFromPath@12_SHHelpShortcuts_RunDLL@16__imp__SHHelpShortcuts_RunDLL@16_SHGetUnreadMailCountW@24__imp__SHGetUnreadMailCountW@24_SHGetSpecialFolderPathW@16__imp__SHGetSpecialFolderPathW@16_SHGetSpecialFolderPathA@16__imp__SHGetSpecialFolderPathA@16_SHGetSpecialFolderLocation@12__imp__SHGetSpecialFolderLocation@12_SHGetSettings@8__imp__SHGetSettings@8_SHGetSetSettings@12__imp__SHGetSetSettings@12_SHGetPathFromIDListW@8__imp__SHGetPathFromIDListW@8_SHGetPathFromIDListA@8__imp__SHGetPathFromIDListA@8_SHGetPathFromIDList@8__imp__SHGetPathFromIDList@8_SHGetNewLinkInfoW@20__imp__SHGetNewLinkInfoW@20_SHGetNewLinkInfoA@20__imp__SHGetNewLinkInfoA@20_SHGetNewLinkInfo@20__imp__SHGetNewLinkInfo@20_SHGetMalloc@4__imp__SHGetMalloc@4_SHGetInstanceExplorer@4__imp__SHGetInstanceExplorer@4_SHGetImageList@12__imp__SHGetImageList@12_SHGetIconOverlayIndexW@8__imp__SHGetIconOverlayIndexW@8_SHGetIconOverlayIndexA@8__imp__SHGetIconOverlayIndexA@8_SHGetFolderPathW@20__imp__SHGetFolderPathW@20_SHGetFolderPathAndSubDirW@24__imp__SHGetFolderPathAndSubDirW@24_SHGetFolderPathAndSubDirA@24__imp__SHGetFolderPathAndSubDirA@24_SHGetFolderPathA@20__imp__SHGetFolderPathA@20_SHGetFolderLocation@20__imp__SHGetFolderLocation@20_SHGetFileInfoW@20__imp__SHGetFileInfoW@20_SHGetFileInfoA@20__imp__SHGetFileInfoA@20_SHGetFileInfo@20__imp__SHGetFileInfo@20_SHGetDiskFreeSpaceExW@16__imp__SHGetDiskFreeSpaceExW@16_SHGetDiskFreeSpaceExA@16__imp__SHGetDiskFreeSpaceExA@16_SHGetDiskFreeSpaceA@16__imp__SHGetDiskFreeSpaceA@16_SHGetDesktopFolder@4__imp__SHGetDesktopFolder@4_SHGetDataFromIDListW@20__imp__SHGetDataFromIDListW@20_SHGetDataFromIDListA@20__imp__SHGetDataFromIDListA@20_SHFreeNameMappings@4__imp__SHFreeNameMappings@4_SHFormatDrive@16__imp__SHFormatDrive@16_SHFileOperationW@4__imp__SHFileOperationW@4_SHFileOperationA@4__imp__SHFileOperationA@4_SHFileOperation@4__imp__SHFileOperation@4_SHExtractIconsW@32__imp__SHExtractIconsW@32_SHEnumerateUnreadMailAccountsW@16__imp__SHEnumerateUnreadMailAccountsW@16_SHEmptyRecycleBinW@12__imp__SHEmptyRecycleBinW@12_SHEmptyRecycleBinA@12__imp__SHEmptyRecycleBinA@12_SHCreateShellItem@16__imp__SHCreateShellItem@16_SHCreateQueryCancelAutoPlayMoniker@4__imp__SHCreateQueryCancelAutoPlayMoniker@4_SHCreateProcessAsUserW@4__imp__SHCreateProcessAsUserW@4_SHCreateDirectoryExW@12__imp__SHCreateDirectoryExW@12_SHCreateDirectoryExA@12__imp__SHCreateDirectoryExA@12_SHCoCreateInstance@20__imp__SHCoCreateInstance@20_SHChangeNotify@16__imp__SHChangeNotify@16_SHBrowseForFolderW@4__imp__SHBrowseForFolderW@4_SHBrowseForFolderA@4__imp__SHBrowseForFolderA@4_SHBrowseForFolder@4__imp__SHBrowseForFolder@4_SHBindToParent@16__imp__SHBindToParent@16_SHAppBarMessage@8__imp__SHAppBarMessage@8_SHAddToRecentDocs@8__imp__SHAddToRecentDocs@8_RegisterShellHook@8__imp__RegisterShellHook@8_RegenerateUserEnvironment@8__imp__RegenerateUserEnvironment@8_RealShellExecuteW@40__imp__RealShellExecuteW@40_RealShellExecuteExW@44__imp__RealShellExecuteExW@44_RealShellExecuteExA@44__imp__RealShellExecuteExA@44_RealShellExecuteA@40__imp__RealShellExecuteA@40_PrintersGetCommand_RunDLL@16__imp__PrintersGetCommand_RunDLL@16_PathResolve@12__imp__PathResolve@12_OpenAs_RunDLL@16__imp__OpenAs_RunDLL@16_InternalExtractIconListW@12__imp__InternalExtractIconListW@12_InternalExtractIconListA@12__imp__InternalExtractIconListA@12_ILSaveToStream@8__imp__ILSaveToStream@8_ILRemoveLastID@4__imp__ILRemoveLastID@4_ILLoadFromStream@8__imp__ILLoadFromStream@8_ILIsParent@12__imp__ILIsParent@12_ILIsEqual@8__imp__ILIsEqual@8_ILGetSize@4__imp__ILGetSize@4_ILGetNext@4__imp__ILGetNext@4_ILFree@4__imp__ILFree@4_ILFindLastID@4__imp__ILFindLastID@4_ILFindChild@8__imp__ILFindChild@8_ILCombine@8__imp__ILCombine@8_ILCloneFirst@4__imp__ILCloneFirst@4_ILClone@4__imp__ILClone@4_ILAppendID@12__imp__ILAppendID@12_FreeIconList@8__imp__FreeIconList@8_FindExecutableW@12__imp__FindExecutableW@12_FindExecutableA@12__imp__FindExecutableA@12_FindExeDlgProc@16__imp__FindExeDlgProc@16_ExtractVersionResource16W@8__imp__ExtractVersionResource16W@8_ExtractIconW@12__imp__ExtractIconW@12_ExtractIconResInfoW@20__imp__ExtractIconResInfoW@20_ExtractIconResInfoA@20__imp__ExtractIconResInfoA@20_ExtractIconExW@20__imp__ExtractIconExW@20_ExtractIconExA@20__imp__ExtractIconExA@20_ExtractIconEx@20__imp__ExtractIconEx@20_ExtractIconA@12__imp__ExtractIconA@12_ExtractAssociatedIconW@12__imp__ExtractAssociatedIconW@12_ExtractAssociatedIconExW@16__imp__ExtractAssociatedIconExW@16_ExtractAssociatedIconExA@16__imp__ExtractAssociatedIconExA@16_ExtractAssociatedIconA@12__imp__ExtractAssociatedIconA@12_DuplicateIcon@8__imp__DuplicateIcon@8_DragQueryPoint@8__imp__DragQueryPoint@8_DragQueryFileW@16__imp__DragQueryFileW@16_DragQueryFileAorW@24__imp__DragQueryFileAorW@24_DragQueryFileA@16__imp__DragQueryFileA@16_DragQueryFile@16__imp__DragQueryFile@16_DragFinish@4__imp__DragFinish@4_DragAcceptFiles@8__imp__DragAcceptFiles@8_DoEnvironmentSubstW@8__imp__DoEnvironmentSubstW@8_DoEnvironmentSubstA@8__imp__DoEnvironmentSubstA@8_Control_RunDLL@16__imp__Control_RunDLL@16_Control_FillCache_RunDLL@16__imp__Control_FillCache_RunDLL@16_CommandLineToArgvW@8__imp__CommandLineToArgvW@8_CheckEscapesW@8__imp__CheckEscapesW@8_CheckEscapesA@8__imp__CheckEscapesA@8_CLSID_ShellDesktop_CLSID_ShellLink_FMTID_Intshcut_FMTID_InternetSite_CGID_Explorer_CGID_ShellDocView_CGID_ShellServiceObject_IID_INewShortcutHookA_IID_IShellBrowser_IID_IShellView_IID_IContextMenu_IID_IQueryInfo_IID_IShellIcon_IID_IShellFolder_IID_IShellExtInit_IID_IShellPropSheetExt_IID_IPersistFolder_IID_IExtractIconA_IID_IShellLinkA_IID_IShellCopyHookA_IID_IFileViewerA_IID_ICommDlgBrowser_IID_IEnumIDList_IID_IFileViewerSite_IID_IContextMenu2_IID_IContextMenu3_IID_IShellExecuteHookA_IID_IPropSheetPage_IID_INewShortcutHookW_IID_IFileViewerW_IID_IShellLinkW_IID_IExtractIconW_IID_IShellExecuteHookW_IID_IShellCopyHookW_IID_IShellView2_IID_IShellFolder2_IID_IPersistFolder2_IID_IPersistFolder3_IID_IFileSystemBindData_LIBID_SHDocVw_IID_IShellExplorer_DIID_DShellExplorerEvents_CLSID_ShellExplorer_IID_ISHItemOC_DIID_DSHItemOCEvents_CLSID_SHItemOC_IID_DHyperLink_IID_DIExplorer_DIID_DExplorerEvents_CLSID_InternetExplorer_CLSID_StdHyperLink_CLSID_FileTypes_CLSID_InternetShortcut_IID_IUniformResourceLocator_CLSID_DragDropHelper_IID_IDropTargetHelper_IID_IDragSourceHelper_IID_IColumnProvider_IID_IShellIconOverlayIdentifier_CLSID_AutoComplete_IID_IAutoComplete_IID_IAutoComplete2_CLSID_ACLMulti_IID_IObjMgr_CLSID_ACListISF_IID_IACList_CLSID_RecycleBin_CLSID_ControlPanel_CLSID_MyComputer_CLSID_Internet_CLSID_NetworkPlaces_CLSID_MyDocuments_CLSID_FolderShortcut_CLSID_ShellFSFolder_IID_IShellLinkDataList_IID_IFolderViewdukit.o/ 1301111117 0 0 100666 575 ` L.text 0`.data@0.bss0.idata$4@0.idata$5@0.idata$7 @0SHELL32.DLL.filegfake.text.data.bss.idata$4.idata$5.idata$7 __libshell32_a_iname dukih.o/ 1301111117 0 0 100666 643 ` L6.text 0`.data@0.bss0.idata$2@0.idata$5@0.idata$4@0   .filegfakehnamefthunk.text.data.bss.idata$2.idata$4.idata$5-__head_libshell32_a__libshell32_a_iname dukis00181.o/ 1301111117 0 0 100666 630 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %WOWShellExecute .text.data.bss.idata$7.idata$5.idata$4.idata$62F_WOWShellExecute@28__imp__WOWShellExecute@28__head_libshell32_adukis00180.o/ 1301111117 0 0 100666 604 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrStrW .text.data.bss.idata$7.idata$5.idata$4.idata$6 4_StrStrW@8__imp__StrStrW@8__head_libshell32_adukis00179.o/ 1301111117 0 0 100666 606 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrStrIW .text.data.bss.idata$7.idata$5.idata$4.idata$6"6_StrStrIW@8__imp__StrStrIW@8__head_libshell32_adukis00178.o/ 1301111117 0 0 100666 606 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrStrIA .text.data.bss.idata$7.idata$5.idata$4.idata$6"6_StrStrIA@8__imp__StrStrIA@8__head_libshell32_adukis00177.o/ 1301111117 0 0 100666 604 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrStrA .text.data.bss.idata$7.idata$5.idata$4.idata$6 4_StrStrA@8__imp__StrStrA@8__head_libshell32_adukis00176.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrRStrW .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrRStrW@12__imp__StrRStrW@12__head_libshell32_adukis00175.o/ 1301111117 0 0 100666 610 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrRStrIW .text.data.bss.idata$7.idata$5.idata$4.idata$6&:_StrRStrIW@12__imp__StrRStrIW@12__head_libshell32_adukis00174.o/ 1301111117 0 0 100666 610 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrRStrIA .text.data.bss.idata$7.idata$5.idata$4.idata$6&:_StrRStrIA@12__imp__StrRStrIA@12__head_libshell32_adukis00173.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrRStrA .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrRStrA@12__imp__StrRStrA@12__head_libshell32_adukis00172.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrRChrW .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrRChrW@12__imp__StrRChrW@12__head_libshell32_adukis00171.o/ 1301111117 0 0 100666 610 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrRChrIW .text.data.bss.idata$7.idata$5.idata$4.idata$6&:_StrRChrIW@12__imp__StrRChrIW@12__head_libshell32_adukis00170.o/ 1301111117 0 0 100666 610 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrRChrIA .text.data.bss.idata$7.idata$5.idata$4.idata$6&:_StrRChrIA@12__imp__StrRChrIA@12__head_libshell32_adukis00169.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrRChrA .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrRChrA@12__imp__StrRChrA@12__head_libshell32_adukis00168.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrNCpyW .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrNCpyW@12__imp__StrNCpyW@12__head_libshell32_adukis00167.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrNCpyA .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrNCpyA@12__imp__StrNCpyA@12__head_libshell32_adukis00166.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrNCmpW .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrNCmpW@12__imp__StrNCmpW@12__head_libshell32_adukis00165.o/ 1301111117 0 0 100666 610 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrNCmpIW .text.data.bss.idata$7.idata$5.idata$4.idata$6&:_StrNCmpIW@12__imp__StrNCmpIW@12__head_libshell32_adukis00164.o/ 1301111117 0 0 100666 610 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrNCmpIA .text.data.bss.idata$7.idata$5.idata$4.idata$6&:_StrNCmpIA@12__imp__StrNCmpIA@12__head_libshell32_adukis00163.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrNCmpA .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrNCmpA@12__imp__StrNCmpA@12__head_libshell32_adukis00162.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrCpyNW .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrCpyNW@12__imp__StrCpyNW@12__head_libshell32_adukis00161.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrCpyNA .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrCpyNA@12__imp__StrCpyNA@12__head_libshell32_adukis00160.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrCmpNW .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrCmpNW@12__imp__StrCmpNW@12__head_libshell32_adukis00159.o/ 1301111117 0 0 100666 610 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrCmpNIW .text.data.bss.idata$7.idata$5.idata$4.idata$6&:_StrCmpNIW@12__imp__StrCmpNIW@12__head_libshell32_adukis00158.o/ 1301111117 0 0 100666 610 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrCmpNIA .text.data.bss.idata$7.idata$5.idata$4.idata$6&:_StrCmpNIA@12__imp__StrCmpNIA@12__head_libshell32_adukis00157.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrCmpNA .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_StrCmpNA@12__imp__StrCmpNA@12__head_libshell32_adukis00156.o/ 1301111117 0 0 100666 604 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrChrW .text.data.bss.idata$7.idata$5.idata$4.idata$6 4_StrChrW@8__imp__StrChrW@8__head_libshell32_adukis00155.o/ 1301111117 0 0 100666 606 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrChrIW .text.data.bss.idata$7.idata$5.idata$4.idata$6"6_StrChrIW@8__imp__StrChrIW@8__head_libshell32_adukis00154.o/ 1301111117 0 0 100666 606 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrChrIA .text.data.bss.idata$7.idata$5.idata$4.idata$6"6_StrChrIA@8__imp__StrChrIA@8__head_libshell32_adukis00153.o/ 1301111117 0 0 100666 604 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %StrChrA .text.data.bss.idata$7.idata$5.idata$4.idata$6 4_StrChrA@8__imp__StrChrA@8__head_libshell32_adukis00152.o/ 1301111117 0 0 100666 632 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %Shell_NotifyIconW .text.data.bss.idata$7.idata$5.idata$4.idata$64H_Shell_NotifyIconW@8__imp__Shell_NotifyIconW@8__head_libshell32_adukis00151.o/ 1301111117 0 0 100666 632 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %Shell_NotifyIconA .text.data.bss.idata$7.idata$5.idata$4.idata$64H_Shell_NotifyIconA@8__imp__Shell_NotifyIconA@8__head_libshell32_adukis00150.o/ 1301111117 0 0 100666 630 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %Shell_NotifyIcon .text.data.bss.idata$7.idata$5.idata$4.idata$62F_Shell_NotifyIcon@8__imp__Shell_NotifyIcon@8__head_libshell32_adukis00149.o/ 1301111117 0 0 100666 622 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ShellHookProc .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_ShellHookProc@12__imp__ShellHookProc@12__head_libshell32_adukis00148.o/ 1301111117 0 0 100666 622 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ShellExecuteW .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_ShellExecuteW@24__imp__ShellExecuteW@24__head_libshell32_adukis00147.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ShellExecuteExW .text.data.bss.idata$7.idata$5.idata$4.idata$60D_ShellExecuteExW@4__imp__ShellExecuteExW@4__head_libshell32_adukis00146.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ShellExecuteExA .text.data.bss.idata$7.idata$5.idata$4.idata$60D_ShellExecuteExA@4__imp__ShellExecuteExA@4__head_libshell32_adukis00145.o/ 1301111117 0 0 100666 626 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ShellExecuteEx .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_ShellExecuteEx@4__imp__ShellExecuteEx@4__head_libshell32_adukis00144.o/ 1301111117 0 0 100666 622 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ShellExecuteA .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_ShellExecuteA@24__imp__ShellExecuteA@24__head_libshell32_adukis00143.o/ 1301111117 0 0 100666 618 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ShellAboutW .text.data.bss.idata$7.idata$5.idata$4.idata$6*>_ShellAboutW@16__imp__ShellAboutW@16__head_libshell32_adukis00142.o/ 1301111117 0 0 100666 618 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ShellAboutA .text.data.bss.idata$7.idata$5.idata$4.idata$6*>_ShellAboutA@16__imp__ShellAboutA@16__head_libshell32_adukis00141.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SheShortenPathW .text.data.bss.idata$7.idata$5.idata$4.idata$60D_SheShortenPathW@8__imp__SheShortenPathW@8__head_libshell32_adukis00140.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SheShortenPathA .text.data.bss.idata$7.idata$5.idata$4.idata$60D_SheShortenPathA@8__imp__SheShortenPathA@8__head_libshell32_adukis00139.o/ 1301111117 0 0 100666 626 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SheSetCurDrive .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_SheSetCurDrive@4__imp__SheSetCurDrive@4__head_libshell32_adukis00138.o/ 1301111117 0 0 100666 630 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SheRemoveQuotesW .text.data.bss.idata$7.idata$5.idata$4.idata$62F_SheRemoveQuotesW@4__imp__SheRemoveQuotesW@4__head_libshell32_adukis00137.o/ 1301111117 0 0 100666 630 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SheRemoveQuotesA .text.data.bss.idata$7.idata$5.idata$4.idata$62F_SheRemoveQuotesA@4__imp__SheRemoveQuotesA@4__head_libshell32_adukis00136.o/ 1301111117 0 0 100666 632 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SheGetPathOffsetW .text.data.bss.idata$7.idata$5.idata$4.idata$64H_SheGetPathOffsetW@4__imp__SheGetPathOffsetW@4__head_libshell32_adukis00135.o/ 1301111117 0 0 100666 614 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SheGetDirW .text.data.bss.idata$7.idata$5.idata$4.idata$6&:_SheGetDirW@8__imp__SheGetDirW@8__head_libshell32_adukis00134.o/ 1301111117 0 0 100666 620 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SheGetDirExW .text.data.bss.idata$7.idata$5.idata$4.idata$6,@_SheGetDirExW@12__imp__SheGetDirExW@12__head_libshell32_adukis00133.o/ 1301111117 0 0 100666 614 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SheGetDirA .text.data.bss.idata$7.idata$5.idata$4.idata$6&:_SheGetDirA@8__imp__SheGetDirA@8__head_libshell32_adukis00132.o/ 1301111117 0 0 100666 626 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SheGetCurDrive .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_SheGetCurDrive@0__imp__SheGetCurDrive@0__head_libshell32_adukis00131.o/ 1301111117 0 0 100666 620 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SheFullPathW .text.data.bss.idata$7.idata$5.idata$4.idata$6,@_SheFullPathW@12__imp__SheFullPathW@12__head_libshell32_adukis00130.o/ 1301111117 0 0 100666 620 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SheFullPathA .text.data.bss.idata$7.idata$5.idata$4.idata$6,@_SheFullPathA@12__imp__SheFullPathA@12__head_libshell32_adukis00129.o/ 1301111117 0 0 100666 630 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SheConvertPathW .text.data.bss.idata$7.idata$5.idata$4.idata$62F_SheConvertPathW@12__imp__SheConvertPathW@12__head_libshell32_adukis00128.o/ 1301111117 0 0 100666 620 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SheChangeDirW .text.data.bss.idata$7.idata$5.idata$4.idata$6,@_SheChangeDirW@4__imp__SheChangeDirW@4__head_libshell32_adukis00127.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SheChangeDirExW .text.data.bss.idata$7.idata$5.idata$4.idata$60D_SheChangeDirExW@4__imp__SheChangeDirExW@4__head_libshell32_adukis00126.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %~SheChangeDirExA .text.data.bss.idata$7.idata$5.idata$4.idata$60D_SheChangeDirExA@4__imp__SheChangeDirExA@4__head_libshell32_adukis00125.o/ 1301111117 0 0 100666 620 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %}SheChangeDirA .text.data.bss.idata$7.idata$5.idata$4.idata$6,@_SheChangeDirA@4__imp__SheChangeDirA@4__head_libshell32_adukis00124.o/ 1301111117 0 0 100666 650 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %|SHUpdateRecycleBinIcon .text.data.bss.idata$7.idata$5.idata$4.idata$6>R_SHUpdateRecycleBinIcon@0__imp__SHUpdateRecycleBinIcon@0__head_libshell32_adukis00123.o/ 1301111117 0 0 100666 646 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %{SHSetUnreadMailCountW .text.data.bss.idata$7.idata$5.idata$4.idata$6>R_SHSetUnreadMailCountW@12__imp__SHSetUnreadMailCountW@12__head_libshell32_adukis00122.o/ 1301111117 0 0 100666 640 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %zSHSetLocalizedName .text.data.bss.idata$7.idata$5.idata$4.idata$68L_SHSetLocalizedName@12__imp__SHSetLocalizedName@12__head_libshell32_adukis00121.o/ 1301111117 0 0 100666 638 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ySHQueryRecycleBinW .text.data.bss.idata$7.idata$5.idata$4.idata$66J_SHQueryRecycleBinW@8__imp__SHQueryRecycleBinW@8__head_libshell32_adukis00120.o/ 1301111117 0 0 100666 638 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %xSHQueryRecycleBinA .text.data.bss.idata$7.idata$5.idata$4.idata$66J_SHQueryRecycleBinA@8__imp__SHQueryRecycleBinA@8__head_libshell32_adukis00119.o/ 1301111117 0 0 100666 652 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %wSHPathPrepareForWriteW .text.data.bss.idata$7.idata$5.idata$4.idata$6@T_SHPathPrepareForWriteW@16__imp__SHPathPrepareForWriteW@16__head_libshell32_adukis00118.o/ 1301111117 0 0 100666 652 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %vSHPathPrepareForWriteA .text.data.bss.idata$7.idata$5.idata$4.idata$6@T_SHPathPrepareForWriteA@16__imp__SHPathPrepareForWriteA@16__head_libshell32_adukis00117.o/ 1301111117 0 0 100666 640 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %uSHParseDisplayName .text.data.bss.idata$7.idata$5.idata$4.idata$68L_SHParseDisplayName@20__imp__SHParseDisplayName@20__head_libshell32_adukis00116.o/ 1301111117 0 0 100666 664 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %tSHOpenFolderAndSelectItems .text.data.bss.idata$7.idata$5.idata$4.idata$6#H\_SHOpenFolderAndSelectItems@16__imp__SHOpenFolderAndSelectItems@16__head_libshell32_adukis00115.o/ 1301111117 0 0 100666 692 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6(@ %sSHLoadNonloadedIconOverlayIdentifiers .text.data.bss.idata$7.idata$5.idata$4.idata$6-\p_SHLoadNonloadedIconOverlayIdentifiers@0__imp__SHLoadNonloadedIconOverlayIdentifiers@0__head_libshell32_adukis00114.o/ 1301111117 0 0 100666 618 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %rSHLoadInProc .text.data.bss.idata$7.idata$5.idata$4.idata$6*>_SHLoadInProc@4__imp__SHLoadInProc@4__head_libshell32_adukis00113.o/ 1301111117 0 0 100666 654 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %qSHIsFileAvailableOffline .text.data.bss.idata$7.idata$5.idata$4.idata$6 BV_SHIsFileAvailableOffline@8__imp__SHIsFileAvailableOffline@8__head_libshell32_adukis00112.o/ 1301111117 0 0 100666 654 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %pSHInvokePrinterCommandW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BV_SHInvokePrinterCommandW@20__imp__SHInvokePrinterCommandW@20__head_libshell32_adukis00111.o/ 1301111117 0 0 100666 654 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %oSHInvokePrinterCommandA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BV_SHInvokePrinterCommandA@20__imp__SHInvokePrinterCommandA@20__head_libshell32_adukis00110.o/ 1301111117 0 0 100666 640 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %nSHILCreateFromPath .text.data.bss.idata$7.idata$5.idata$4.idata$68L_SHILCreateFromPath@12__imp__SHILCreateFromPath@12__head_libshell32_adukis00109.o/ 1301111117 0 0 100666 652 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %mSHHelpShortcuts_RunDLL .text.data.bss.idata$7.idata$5.idata$4.idata$6@T_SHHelpShortcuts_RunDLL@16__imp__SHHelpShortcuts_RunDLL@16__head_libshell32_adukis00108.o/ 1301111117 0 0 100666 646 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %lSHGetUnreadMailCountW .text.data.bss.idata$7.idata$5.idata$4.idata$6>R_SHGetUnreadMailCountW@24__imp__SHGetUnreadMailCountW@24__head_libshell32_adukis00107.o/ 1301111117 0 0 100666 654 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %kSHGetSpecialFolderPathW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BV_SHGetSpecialFolderPathW@16__imp__SHGetSpecialFolderPathW@16__head_libshell32_adukis00106.o/ 1301111117 0 0 100666 654 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %jSHGetSpecialFolderPathA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BV_SHGetSpecialFolderPathA@16__imp__SHGetSpecialFolderPathA@16__head_libshell32_adukis00105.o/ 1301111117 0 0 100666 664 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %iSHGetSpecialFolderLocation .text.data.bss.idata$7.idata$5.idata$4.idata$6#H\_SHGetSpecialFolderLocation@12__imp__SHGetSpecialFolderLocation@12__head_libshell32_adukis00104.o/ 1301111117 0 0 100666 620 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %hSHGetSettings .text.data.bss.idata$7.idata$5.idata$4.idata$6,@_SHGetSettings@8__imp__SHGetSettings@8__head_libshell32_adukis00103.o/ 1301111117 0 0 100666 632 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %gSHGetSetSettings .text.data.bss.idata$7.idata$5.idata$4.idata$64H_SHGetSetSettings@12__imp__SHGetSetSettings@12__head_libshell32_adukis00102.o/ 1301111117 0 0 100666 642 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %fSHGetPathFromIDListW .text.data.bss.idata$7.idata$5.idata$4.idata$6:N_SHGetPathFromIDListW@8__imp__SHGetPathFromIDListW@8__head_libshell32_adukis00101.o/ 1301111117 0 0 100666 642 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %eSHGetPathFromIDListA .text.data.bss.idata$7.idata$5.idata$4.idata$6:N_SHGetPathFromIDListA@8__imp__SHGetPathFromIDListA@8__head_libshell32_adukis00100.o/ 1301111117 0 0 100666 640 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %dSHGetPathFromIDList .text.data.bss.idata$7.idata$5.idata$4.idata$68L_SHGetPathFromIDList@8__imp__SHGetPathFromIDList@8__head_libshell32_adukis00099.o/ 1301111117 0 0 100666 634 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %cSHGetNewLinkInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$66J_SHGetNewLinkInfoW@20__imp__SHGetNewLinkInfoW@20__head_libshell32_adukis00098.o/ 1301111117 0 0 100666 634 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %bSHGetNewLinkInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$66J_SHGetNewLinkInfoA@20__imp__SHGetNewLinkInfoA@20__head_libshell32_adukis00097.o/ 1301111117 0 0 100666 632 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %aSHGetNewLinkInfo .text.data.bss.idata$7.idata$5.idata$4.idata$64H_SHGetNewLinkInfo@20__imp__SHGetNewLinkInfo@20__head_libshell32_adukis00096.o/ 1301111117 0 0 100666 616 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %`SHGetMalloc .text.data.bss.idata$7.idata$5.idata$4.idata$6(<_SHGetMalloc@4__imp__SHGetMalloc@4__head_libshell32_adukis00095.o/ 1301111117 0 0 100666 644 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %_SHGetInstanceExplorer .text.data.bss.idata$7.idata$5.idata$4.idata$6<P_SHGetInstanceExplorer@4__imp__SHGetInstanceExplorer@4__head_libshell32_adukis00094.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %^SHGetImageList .text.data.bss.idata$7.idata$5.idata$4.idata$60D_SHGetImageList@12__imp__SHGetImageList@12__head_libshell32_adukis00093.o/ 1301111117 0 0 100666 650 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %]SHGetIconOverlayIndexW .text.data.bss.idata$7.idata$5.idata$4.idata$6>R_SHGetIconOverlayIndexW@8__imp__SHGetIconOverlayIndexW@8__head_libshell32_adukis00092.o/ 1301111117 0 0 100666 650 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %\SHGetIconOverlayIndexA .text.data.bss.idata$7.idata$5.idata$4.idata$6>R_SHGetIconOverlayIndexA@8__imp__SHGetIconOverlayIndexA@8__head_libshell32_adukis00091.o/ 1301111117 0 0 100666 632 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %[SHGetFolderPathW .text.data.bss.idata$7.idata$5.idata$4.idata$64H_SHGetFolderPathW@20__imp__SHGetFolderPathW@20__head_libshell32_adukis00090.o/ 1301111117 0 0 100666 658 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ZSHGetFolderPathAndSubDirW .text.data.bss.idata$7.idata$5.idata$4.idata$6"FZ_SHGetFolderPathAndSubDirW@24__imp__SHGetFolderPathAndSubDirW@24__head_libshell32_adukis00089.o/ 1301111117 0 0 100666 658 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %YSHGetFolderPathAndSubDirA .text.data.bss.idata$7.idata$5.idata$4.idata$6"FZ_SHGetFolderPathAndSubDirA@24__imp__SHGetFolderPathAndSubDirA@24__head_libshell32_adukis00088.o/ 1301111117 0 0 100666 632 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %XSHGetFolderPathA .text.data.bss.idata$7.idata$5.idata$4.idata$64H_SHGetFolderPathA@20__imp__SHGetFolderPathA@20__head_libshell32_adukis00087.o/ 1301111117 0 0 100666 642 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %WSHGetFolderLocation .text.data.bss.idata$7.idata$5.idata$4.idata$6:N_SHGetFolderLocation@20__imp__SHGetFolderLocation@20__head_libshell32_adukis00086.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %VSHGetFileInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$60D_SHGetFileInfoW@20__imp__SHGetFileInfoW@20__head_libshell32_adukis00085.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %USHGetFileInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$60D_SHGetFileInfoA@20__imp__SHGetFileInfoA@20__head_libshell32_adukis00084.o/ 1301111117 0 0 100666 622 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %TSHGetFileInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_SHGetFileInfo@20__imp__SHGetFileInfo@20__head_libshell32_adukis00083.o/ 1301111117 0 0 100666 646 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SSHGetDiskFreeSpaceExW .text.data.bss.idata$7.idata$5.idata$4.idata$6>R_SHGetDiskFreeSpaceExW@16__imp__SHGetDiskFreeSpaceExW@16__head_libshell32_adukis00082.o/ 1301111117 0 0 100666 646 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RSHGetDiskFreeSpaceExA .text.data.bss.idata$7.idata$5.idata$4.idata$6>R_SHGetDiskFreeSpaceExA@16__imp__SHGetDiskFreeSpaceExA@16__head_libshell32_adukis00081.o/ 1301111117 0 0 100666 642 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %QSHGetDiskFreeSpaceA .text.data.bss.idata$7.idata$5.idata$4.idata$6:N_SHGetDiskFreeSpaceA@16__imp__SHGetDiskFreeSpaceA@16__head_libshell32_adukis00080.o/ 1301111117 0 0 100666 638 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %PSHGetDesktopFolder .text.data.bss.idata$7.idata$5.idata$4.idata$66J_SHGetDesktopFolder@4__imp__SHGetDesktopFolder@4__head_libshell32_adukis00079.o/ 1301111117 0 0 100666 644 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %OSHGetDataFromIDListW .text.data.bss.idata$7.idata$5.idata$4.idata$6<P_SHGetDataFromIDListW@20__imp__SHGetDataFromIDListW@20__head_libshell32_adukis00078.o/ 1301111117 0 0 100666 644 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %NSHGetDataFromIDListA .text.data.bss.idata$7.idata$5.idata$4.idata$6<P_SHGetDataFromIDListA@20__imp__SHGetDataFromIDListA@20__head_libshell32_adukis00077.o/ 1301111117 0 0 100666 638 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %MSHFreeNameMappings .text.data.bss.idata$7.idata$5.idata$4.idata$66J_SHFreeNameMappings@4__imp__SHFreeNameMappings@4__head_libshell32_adukis00076.o/ 1301111117 0 0 100666 622 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %LSHFormatDrive .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_SHFormatDrive@16__imp__SHFormatDrive@16__head_libshell32_adukis00075.o/ 1301111117 0 0 100666 630 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %KSHFileOperationW .text.data.bss.idata$7.idata$5.idata$4.idata$62F_SHFileOperationW@4__imp__SHFileOperationW@4__head_libshell32_adukis00074.o/ 1301111117 0 0 100666 630 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %JSHFileOperationA .text.data.bss.idata$7.idata$5.idata$4.idata$62F_SHFileOperationA@4__imp__SHFileOperationA@4__head_libshell32_adukis00073.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ISHFileOperation .text.data.bss.idata$7.idata$5.idata$4.idata$60D_SHFileOperation@4__imp__SHFileOperation@4__head_libshell32_adukis00072.o/ 1301111117 0 0 100666 630 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %HSHExtractIconsW .text.data.bss.idata$7.idata$5.idata$4.idata$62F_SHExtractIconsW@32__imp__SHExtractIconsW@32__head_libshell32_adukis00071.o/ 1301111117 0 0 100666 676 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %GSHEnumerateUnreadMailAccountsW .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pd_SHEnumerateUnreadMailAccountsW@16__imp__SHEnumerateUnreadMailAccountsW@16__head_libshell32_adukis00070.o/ 1301111117 0 0 100666 640 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %FSHEmptyRecycleBinW .text.data.bss.idata$7.idata$5.idata$4.idata$68L_SHEmptyRecycleBinW@12__imp__SHEmptyRecycleBinW@12__head_libshell32_adukis00069.o/ 1301111117 0 0 100666 640 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ESHEmptyRecycleBinA .text.data.bss.idata$7.idata$5.idata$4.idata$68L_SHEmptyRecycleBinA@12__imp__SHEmptyRecycleBinA@12__head_libshell32_adukis00068.o/ 1301111117 0 0 100666 634 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DSHCreateShellItem .text.data.bss.idata$7.idata$5.idata$4.idata$66J_SHCreateShellItem@16__imp__SHCreateShellItem@16__head_libshell32_adukis00067.o/ 1301111117 0 0 100666 686 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %CSHCreateQueryCancelAutoPlayMoniker .text.data.bss.idata$7.idata$5.idata$4.idata$6*Vj_SHCreateQueryCancelAutoPlayMoniker@4__imp__SHCreateQueryCancelAutoPlayMoniker@4__head_libshell32_adukis00066.o/ 1301111117 0 0 100666 650 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BSHCreateProcessAsUserW .text.data.bss.idata$7.idata$5.idata$4.idata$6>R_SHCreateProcessAsUserW@4__imp__SHCreateProcessAsUserW@4__head_libshell32_adukis00065.o/ 1301111117 0 0 100666 644 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ASHCreateDirectoryExW .text.data.bss.idata$7.idata$5.idata$4.idata$6<P_SHCreateDirectoryExW@12__imp__SHCreateDirectoryExW@12__head_libshell32_adukis00064.o/ 1301111117 0 0 100666 644 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %@SHCreateDirectoryExA .text.data.bss.idata$7.idata$5.idata$4.idata$6<P_SHCreateDirectoryExA@12__imp__SHCreateDirectoryExA@12__head_libshell32_adukis00063.o/ 1301111117 0 0 100666 640 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %?SHCoCreateInstance .text.data.bss.idata$7.idata$5.idata$4.idata$68L_SHCoCreateInstance@20__imp__SHCoCreateInstance@20__head_libshell32_adukis00062.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %>SHChangeNotify .text.data.bss.idata$7.idata$5.idata$4.idata$60D_SHChangeNotify@16__imp__SHChangeNotify@16__head_libshell32_adukis00061.o/ 1301111117 0 0 100666 638 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %=SHBrowseForFolderW .text.data.bss.idata$7.idata$5.idata$4.idata$66J_SHBrowseForFolderW@4__imp__SHBrowseForFolderW@4__head_libshell32_adukis00060.o/ 1301111117 0 0 100666 638 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %<SHBrowseForFolderA .text.data.bss.idata$7.idata$5.idata$4.idata$66J_SHBrowseForFolderA@4__imp__SHBrowseForFolderA@4__head_libshell32_adukis00059.o/ 1301111117 0 0 100666 632 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %;SHBrowseForFolder .text.data.bss.idata$7.idata$5.idata$4.idata$64H_SHBrowseForFolder@4__imp__SHBrowseForFolder@4__head_libshell32_adukis00058.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %:SHBindToParent .text.data.bss.idata$7.idata$5.idata$4.idata$60D_SHBindToParent@16__imp__SHBindToParent@16__head_libshell32_adukis00057.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %9SHAppBarMessage .text.data.bss.idata$7.idata$5.idata$4.idata$60D_SHAppBarMessage@8__imp__SHAppBarMessage@8__head_libshell32_adukis00056.o/ 1301111117 0 0 100666 632 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %8SHAddToRecentDocs .text.data.bss.idata$7.idata$5.idata$4.idata$64H_SHAddToRecentDocs@8__imp__SHAddToRecentDocs@8__head_libshell32_adukis00055.o/ 1301111117 0 0 100666 632 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %7RegisterShellHook .text.data.bss.idata$7.idata$5.idata$4.idata$64H_RegisterShellHook@8__imp__RegisterShellHook@8__head_libshell32_adukis00054.o/ 1301111117 0 0 100666 656 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %6RegenerateUserEnvironment .text.data.bss.idata$7.idata$5.idata$4.idata$6!DX_RegenerateUserEnvironment@8__imp__RegenerateUserEnvironment@8__head_libshell32_adukis00053.o/ 1301111117 0 0 100666 634 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %5RealShellExecuteW .text.data.bss.idata$7.idata$5.idata$4.idata$66J_RealShellExecuteW@40__imp__RealShellExecuteW@40__head_libshell32_adukis00052.o/ 1301111117 0 0 100666 642 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %4RealShellExecuteExW .text.data.bss.idata$7.idata$5.idata$4.idata$6:N_RealShellExecuteExW@44__imp__RealShellExecuteExW@44__head_libshell32_adukis00051.o/ 1301111117 0 0 100666 642 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %3RealShellExecuteExA .text.data.bss.idata$7.idata$5.idata$4.idata$6:N_RealShellExecuteExA@44__imp__RealShellExecuteExA@44__head_libshell32_adukis00050.o/ 1301111117 0 0 100666 634 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %2RealShellExecuteA .text.data.bss.idata$7.idata$5.idata$4.idata$66J_RealShellExecuteA@40__imp__RealShellExecuteA@40__head_libshell32_adukis00049.o/ 1301111117 0 0 100666 658 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %1PrintersGetCommand_RunDLL .text.data.bss.idata$7.idata$5.idata$4.idata$6"FZ_PrintersGetCommand_RunDLL@16__imp__PrintersGetCommand_RunDLL@16__head_libshell32_adukis00048.o/ 1301111117 0 0 100666 618 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %0PathResolve .text.data.bss.idata$7.idata$5.idata$4.idata$6*>_PathResolve@12__imp__PathResolve@12__head_libshell32_adukis00047.o/ 1301111117 0 0 100666 622 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %/OpenAs_RunDLL .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_OpenAs_RunDLL@16__imp__OpenAs_RunDLL@16__head_libshell32_adukis00046.o/ 1301111117 0 0 100666 656 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %.InternalExtractIconListW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DX_InternalExtractIconListW@12__imp__InternalExtractIconListW@12__head_libshell32_adukis00045.o/ 1301111117 0 0 100666 656 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %-InternalExtractIconListA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DX_InternalExtractIconListA@12__imp__InternalExtractIconListA@12__head_libshell32_adukis00044.o/ 1301111117 0 0 100666 626 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %,ILSaveToStream .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_ILSaveToStream@8__imp__ILSaveToStream@8__head_libshell32_adukis00043.o/ 1301111117 0 0 100666 626 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %+ILRemoveLastID .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_ILRemoveLastID@4__imp__ILRemoveLastID@4__head_libshell32_adukis00042.o/ 1301111117 0 0 100666 630 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %*ILLoadFromStream .text.data.bss.idata$7.idata$5.idata$4.idata$62F_ILLoadFromStream@8__imp__ILLoadFromStream@8__head_libshell32_adukis00041.o/ 1301111117 0 0 100666 616 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %)ILIsParent .text.data.bss.idata$7.idata$5.idata$4.idata$6(<_ILIsParent@12__imp__ILIsParent@12__head_libshell32_adukis00040.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %(ILIsEqual .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_ILIsEqual@8__imp__ILIsEqual@8__head_libshell32_adukis00039.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %'ILGetSize .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_ILGetSize@4__imp__ILGetSize@4__head_libshell32_adukis00038.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %&ILGetNext .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_ILGetNext@4__imp__ILGetNext@4__head_libshell32_adukis00037.o/ 1301111117 0 0 100666 602 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %%ILFree .text.data.bss.idata$7.idata$5.idata$4.idata$62_ILFree@4__imp__ILFree@4__head_libshell32_adukis00036.o/ 1301111117 0 0 100666 618 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %$ILFindLastID .text.data.bss.idata$7.idata$5.idata$4.idata$6*>_ILFindLastID@4__imp__ILFindLastID@4__head_libshell32_adukis00035.o/ 1301111117 0 0 100666 616 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %#ILFindChild .text.data.bss.idata$7.idata$5.idata$4.idata$6(<_ILFindChild@8__imp__ILFindChild@8__head_libshell32_adukis00034.o/ 1301111117 0 0 100666 608 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %"ILCombine .text.data.bss.idata$7.idata$5.idata$4.idata$6$8_ILCombine@8__imp__ILCombine@8__head_libshell32_adukis00033.o/ 1301111117 0 0 100666 618 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %!ILCloneFirst .text.data.bss.idata$7.idata$5.idata$4.idata$6*>_ILCloneFirst@4__imp__ILCloneFirst@4__head_libshell32_adukis00032.o/ 1301111117 0 0 100666 604 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % ILClone .text.data.bss.idata$7.idata$5.idata$4.idata$6 4_ILClone@4__imp__ILClone@4__head_libshell32_adukis00031.o/ 1301111117 0 0 100666 616 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ILAppendID .text.data.bss.idata$7.idata$5.idata$4.idata$6(<_ILAppendID@12__imp__ILAppendID@12__head_libshell32_adukis00030.o/ 1301111117 0 0 100666 618 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FreeIconList .text.data.bss.idata$7.idata$5.idata$4.idata$6*>_FreeIconList@8__imp__FreeIconList@8__head_libshell32_adukis00029.o/ 1301111117 0 0 100666 630 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %FindExecutableW .text.data.bss.idata$7.idata$5.idata$4.idata$62F_FindExecutableW@12__imp__FindExecutableW@12__head_libshell32_adukis00028.o/ 1301111117 0 0 100666 630 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %FindExecutableA .text.data.bss.idata$7.idata$5.idata$4.idata$62F_FindExecutableA@12__imp__FindExecutableA@12__head_libshell32_adukis00027.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %FindExeDlgProc .text.data.bss.idata$7.idata$5.idata$4.idata$60D_FindExeDlgProc@16__imp__FindExeDlgProc@16__head_libshell32_adukis00026.o/ 1301111117 0 0 100666 656 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ExtractVersionResource16W .text.data.bss.idata$7.idata$5.idata$4.idata$6!DX_ExtractVersionResource16W@8__imp__ExtractVersionResource16W@8__head_libshell32_adukis00025.o/ 1301111117 0 0 100666 620 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ExtractIconW .text.data.bss.idata$7.idata$5.idata$4.idata$6,@_ExtractIconW@12__imp__ExtractIconW@12__head_libshell32_adukis00024.o/ 1301111117 0 0 100666 642 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ExtractIconResInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$6:N_ExtractIconResInfoW@20__imp__ExtractIconResInfoW@20__head_libshell32_adukis00023.o/ 1301111117 0 0 100666 642 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ExtractIconResInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$6:N_ExtractIconResInfoA@20__imp__ExtractIconResInfoA@20__head_libshell32_adukis00022.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ExtractIconExW .text.data.bss.idata$7.idata$5.idata$4.idata$60D_ExtractIconExW@20__imp__ExtractIconExW@20__head_libshell32_adukis00021.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ExtractIconExA .text.data.bss.idata$7.idata$5.idata$4.idata$60D_ExtractIconExA@20__imp__ExtractIconExA@20__head_libshell32_adukis00020.o/ 1301111117 0 0 100666 622 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ExtractIconEx .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_ExtractIconEx@20__imp__ExtractIconEx@20__head_libshell32_adukis00019.o/ 1301111117 0 0 100666 620 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ExtractIconA .text.data.bss.idata$7.idata$5.idata$4.idata$6,@_ExtractIconA@12__imp__ExtractIconA@12__head_libshell32_adukis00018.o/ 1301111117 0 0 100666 652 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ExtractAssociatedIconW .text.data.bss.idata$7.idata$5.idata$4.idata$6@T_ExtractAssociatedIconW@12__imp__ExtractAssociatedIconW@12__head_libshell32_adukis00017.o/ 1301111117 0 0 100666 656 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ExtractAssociatedIconExW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DX_ExtractAssociatedIconExW@16__imp__ExtractAssociatedIconExW@16__head_libshell32_adukis00016.o/ 1301111117 0 0 100666 656 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ExtractAssociatedIconExA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DX_ExtractAssociatedIconExA@16__imp__ExtractAssociatedIconExA@16__head_libshell32_adukis00015.o/ 1301111117 0 0 100666 652 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ExtractAssociatedIconA .text.data.bss.idata$7.idata$5.idata$4.idata$6@T_ExtractAssociatedIconA@12__imp__ExtractAssociatedIconA@12__head_libshell32_adukis00014.o/ 1301111117 0 0 100666 620 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DuplicateIcon .text.data.bss.idata$7.idata$5.idata$4.idata$6,@_DuplicateIcon@8__imp__DuplicateIcon@8__head_libshell32_adukis00013.o/ 1301111117 0 0 100666 626 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % DragQueryPoint .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_DragQueryPoint@8__imp__DragQueryPoint@8__head_libshell32_adukis00012.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % DragQueryFileW .text.data.bss.idata$7.idata$5.idata$4.idata$60D_DragQueryFileW@16__imp__DragQueryFileW@16__head_libshell32_adukis00011.o/ 1301111117 0 0 100666 634 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % DragQueryFileAorW .text.data.bss.idata$7.idata$5.idata$4.idata$66J_DragQueryFileAorW@24__imp__DragQueryFileAorW@24__head_libshell32_adukis00010.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % DragQueryFileA .text.data.bss.idata$7.idata$5.idata$4.idata$60D_DragQueryFileA@16__imp__DragQueryFileA@16__head_libshell32_adukis00009.o/ 1301111117 0 0 100666 622 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % DragQueryFile .text.data.bss.idata$7.idata$5.idata$4.idata$6.B_DragQueryFile@16__imp__DragQueryFile@16__head_libshell32_adukis00008.o/ 1301111117 0 0 100666 614 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DragFinish .text.data.bss.idata$7.idata$5.idata$4.idata$6&:_DragFinish@4__imp__DragFinish@4__head_libshell32_adukis00007.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DragAcceptFiles .text.data.bss.idata$7.idata$5.idata$4.idata$60D_DragAcceptFiles@8__imp__DragAcceptFiles@8__head_libshell32_adukis00006.o/ 1301111117 0 0 100666 640 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DoEnvironmentSubstW .text.data.bss.idata$7.idata$5.idata$4.idata$68L_DoEnvironmentSubstW@8__imp__DoEnvironmentSubstW@8__head_libshell32_adukis00005.o/ 1301111117 0 0 100666 640 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DoEnvironmentSubstA .text.data.bss.idata$7.idata$5.idata$4.idata$68L_DoEnvironmentSubstA@8__imp__DoEnvironmentSubstA@8__head_libshell32_adukis00004.o/ 1301111117 0 0 100666 628 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %Control_RunDLL .text.data.bss.idata$7.idata$5.idata$4.idata$60D_Control_RunDLL@16__imp__Control_RunDLL@16__head_libshell32_adukis00003.o/ 1301111117 0 0 100666 656 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %Control_FillCache_RunDLL .text.data.bss.idata$7.idata$5.idata$4.idata$6!DX_Control_FillCache_RunDLL@16__imp__Control_FillCache_RunDLL@16__head_libshell32_adukis00002.o/ 1301111117 0 0 100666 638 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CommandLineToArgvW .text.data.bss.idata$7.idata$5.idata$4.idata$66J_CommandLineToArgvW@8__imp__CommandLineToArgvW@8__head_libshell32_adukis00001.o/ 1301111117 0 0 100666 620 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CheckEscapesW .text.data.bss.idata$7.idata$5.idata$4.idata$6,@_CheckEscapesW@8__imp__CheckEscapesW@8__head_libshell32_adukis00000.o/ 1301111117 0 0 100666 620 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CheckEscapesA .text.data.bss.idata$7.idata$5.idata$4.idata$6,@_CheckEscapesA@8__imp__CheckEscapesA@8__head_libshell32_ashell32.o/ 1301111084 0 0 100666 4450 ` LtV.text 0`.data@0.bss0.rdata@0@FFFFFFFFFFFFFFFFFFFFFFFFF'FFFFFFFFx5i+.bOy\`OOrOh7M]`g*0[ *0[ *0[ *0[ *0[ *0[ *0[ FFFF F@呰 חb@;>V;>V'WFAOЋ'WFAOІ[zGOPB,ɨ=Bl OUc'wj5Obb'wj5ObK7`{FLe'wj5Oba'wj5Ob6J[C0wDOb@_dP/N !:i+00O :i+00SBi+00`, :i+00 E%6 (2W]K6eJ7Eñ/%E~2]r.filegshell32.c.text.data.bss.rdata) 90M@\Po`p1EX i0~@P`p 4FWj 0@P`p !<Q`v 0@P.`Dp[r 00D@VPf`{p_CLSID_ShellDesktop_CLSID_ShellLink_FMTID_Intshcut_FMTID_InternetSite_CGID_Explorer_CGID_ShellDocView_CGID_ShellServiceObject_IID_INewShortcutHookA_IID_IShellBrowser_IID_IShellView_IID_IContextMenu_IID_IQueryInfo_IID_IShellIcon_IID_IShellFolder_IID_IShellExtInit_IID_IShellPropSheetExt_IID_IPersistFolder_IID_IExtractIconA_IID_IShellLinkA_IID_IShellCopyHookA_IID_IFileViewerA_IID_ICommDlgBrowser_IID_IEnumIDList_IID_IFileViewerSite_IID_IContextMenu2_IID_IContextMenu3_IID_IShellExecuteHookA_IID_IPropSheetPage_IID_INewShortcutHookW_IID_IFileViewerW_IID_IShellLinkW_IID_IExtractIconW_IID_IShellExecuteHookW_IID_IShellCopyHookW_IID_IShellView2_IID_IShellFolder2_IID_IPersistFolder2_IID_IPersistFolder3_IID_IFileSystemBindData_LIBID_SHDocVw_IID_IShellExplorer_DIID_DShellExplorerEvents_CLSID_ShellExplorer_IID_ISHItemOC_DIID_DSHItemOCEvents_CLSID_SHItemOC_IID_DHyperLink_IID_DIExplorer_DIID_DExplorerEvents_CLSID_InternetExplorer_CLSID_StdHyperLink_CLSID_FileTypes_CLSID_InternetShortcut_IID_IUniformResourceLocator_CLSID_DragDropHelper_IID_IDropTargetHelper_IID_IDragSourceHelper_IID_IColumnProvider_IID_IShellIconOverlayIdentifier_CLSID_AutoComplete_IID_IAutoComplete_IID_IAutoComplete2_CLSID_ACLMulti_IID_IObjMgr_CLSID_ACListISF_IID_IACList_CLSID_RecycleBin_CLSID_ControlPanel_CLSID_MyComputer_CLSID_Internet_CLSID_NetworkPlaces_CLSID_MyDocuments_CLSID_FolderShortcut_CLSID_ShellFSFolder_IID_IShellLinkDataList_IID_IFolderViewCharacterManaJ/src/Launch4JStub/w32api/libgcc.a0000644000175000017500001411265613615720000021332 0ustar paulliupaulliu! / 1350391525 0 0 0 12162 ` 1b1b24|68;.=?B.DtFzFzIIIN P^RTWdY\$^fbdg`g`ibkrmp@rHtlvpx{6}>~z,2Lnܐ>Lj r@,rB!$'),D.1d47:~>2AE.G4KlKlKlKlKlKlKlOOOOOOOOOOOssssssssssssssssssssssss"Yh"Yh"Yh"|`"~" """""""""""""""""""""""""""""""""""""""""""""""""""$ $ $ $ $$$$$$$$$$% 4% 4% 4% 4% 4% 4% 4% 4% 4% 4% 4% 4% 4% 4%%%%&&&&(N(z(z(z(z(z(z(z((((((((((((((((((((((((((((((((((((((((*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B***Ș*Ș**+x+x+x+x+x+x+x+x+x+x+R+R+R+R+R+R+R+R+R+R+++++++++++̬+̬+̬+̬+̬+̬+̬+̬+̬+̬,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.-{-{-{-{-{-{-{-{-{-{././././././././././...Ь.Ө.֤.t.@.......&..F..^..,/j//*/x/ / ///j/:/:/B/// /"/%*/'d/)/,b/./0/3:/5/7/:B/</>/A&/Cb/E/H6/J/L/O/Q/S/V/X/X/]/_/b/e/hp/k$/m/p/sl/u/x/{"/}/@//P//n///L//P///"//j/j/j/j/j/j/j/j/j/j/j/j/j/j///t/ܼ/////b/b0.000I0L0P0T0X0\0a(0e40id0mb0q0v0z00d0___chkstk__alloca___chkstk_ms___muldi3___negdi2___lshrdi3___ashldi3___ashrdi3___cmpdi2___ucmpdi2___clear_cache_getpagesize_mprotect___do_global_dtors___do_global_ctors___main___absvsi2___absvdi2___addvsi3___addvdi3___subvsi3___subvdi3___mulvsi3___mulvdi3___negvsi2___negvdi2___DTOR_LIST_____CTOR_LIST_____ffssi2___ffsdi2___clz_tab___clzsi2___clzdi2___ctzsi2___ctzdi2___popcount_tab___popcountsi2___popcountdi2___paritysi2___paritydi2___powisf2___powidf2___powixf2___powitf2___mulsc3___muldc3___mulxc3___multc3___divsc3___divdc3___divxc3___divtc3___bswapsi2___bswapdi2___clrsbsi2___clrsbdi2___fixunssfsi___fixunsdfsi___fixunsxfsi___fixsfdi___fixdfdi___fixxfdi___fixunssfdi___fixunsdfdi___fixunsxfdi___floatdisf___floatdidf___floatdixf___floatundisf___floatundidf___floatundixf___eprintf___gcc_bcmp___divdi3___moddi3___udivdi3___umoddi3___udiv_w_sdiv___udivmoddi4___dfp_set_round___dfp_get_round___dfp_clear_except___dfp_test_except___dfp_raise_except___bid_IDEC_glbround___bid_IDEC_glbflags___bid_power10_index_binexp_128___bid_reciprocals10_64___bid_short_recip_scale___bid_power10_index_binexp___bid_estimate_bin_expon___bid_power10_table_128___bid_estimate_decimal_digits___bid_recip_scale___bid_reciprocals10_128___bid_round_const_table_128___bid_round_const_table___bid32_to_binary32___bid64_to_binary32___bid128_to_binary32___bid32_to_binary64___bid64_to_binary64___bid128_to_binary64___bid32_to_binary80___bid64_to_binary80___bid128_to_binary80___bid32_to_binary128___bid64_to_binary128___bid128_to_binary128___binary32_to_bid32___binary64_to_bid32___binary80_to_bid32___binary128_to_bid32___binary32_to_bid64___binary64_to_bid64___binary80_to_bid64___binary128_to_bid64___binary32_to_bid128___binary64_to_bid128___binary80_to_bid128___binary128_to_bid128___bid_factors___bid_packed_10000_zeros___bid_convert_table_isinfd32_isinfd64_isinfd128___bid64_isSigned___bid64_isNormal___bid64_isSubnormal___bid64_isFinite___bid64_isZero___bid64_isInf___bid64_isSignaling___bid64_isCanonical___bid64_isNaN___bid64_copy___bid64_negate___bid64_abs___bid64_copySign___bid64_class___bid64_sameQuantum___bid64_totalOrder___bid64_totalOrderMag___bid64_radix___bid128_isSigned___bid128_isNormal___bid128_isSubnormal___bid128_isFinite___bid128_isZero___bid128_isInf___bid128_isSignaling___bid128_isCanonical___bid128_isNaN___bid128_copy___bid128_negate___bid128_abs___bid128_copySign___bid128_class___bid128_sameQuantum___bid128_totalOrder___bid128_totalOrderMag___bid128_radix___bid128_fma___bid128ddd_fma___bid128ddq_fma___bid128dqd_fma___bid128dqq_fma___bid128qdd_fma___bid128qdq_fma___bid128qqd_fma___bid64qqq_fma___bid64qqd_fma___bid64qdq_fma___bid64qdd_fma___bid64dqq_fma___bid64dqd_fma___bid64ddq_fma___bid_round64_2_18___bid_round128_19_38___bid_round192_39_57___bid_round256_58_76___bid64_from_int32___bid64_from_uint32___bid64_from_int64___bid64_from_uint64___bid128_from_int32___bid128_from_uint32___bid128_from_int64___bid128_from_uint64___bid64_add___bid64_sub___bid64dq_add___bid64qd_add___bid64qq_add___bid64dq_sub___bid64qd_sub___bid64qq_sub___bid128_add___bid128qd_add___bid128dq_add___bid128dd_add___bid128dd_sub___bid128qd_sub___bid128dq_sub___bid128_sub___bid64_div___bid64dq_div___bid64qd_div___bid64qq_div___bid128_div___bid128dd_div___bid128dq_div___bid128qd_div___bid64_mul___bid64qq_mul___bid64qd_mul___bid64dq_mul___bid128_mul___bid128qd_mul___bid128dq_mul___bid128dd_mul___bid64_quiet_equal___bid64_quiet_greater___bid64_quiet_greater_equal___bid64_quiet_greater_unordered___bid64_quiet_less___bid64_quiet_less_equal___bid64_quiet_less_unordered___bid64_quiet_not_equal___bid64_quiet_not_greater___bid64_quiet_not_less___bid64_quiet_ordered___bid64_quiet_unordered___bid64_signaling_greater___bid64_signaling_greater_equal___bid64_signaling_greater_unordered___bid64_signaling_less___bid64_signaling_less_equal___bid64_signaling_less_unordered___bid64_signaling_not_greater___bid64_signaling_not_less___bid128_quiet_equal___bid128_quiet_greater___bid128_quiet_greater_equal___bid128_quiet_greater_unordered___bid128_quiet_less___bid128_quiet_less_equal___bid128_quiet_less_unordered___bid128_quiet_not_equal___bid128_quiet_not_greater___bid128_quiet_not_less___bid128_quiet_ordered___bid128_quiet_unordered___bid128_signaling_greater___bid128_signaling_greater_equal___bid128_signaling_greater_unordered___bid128_signaling_less___bid128_signaling_less_equal___bid128_signaling_less_unordered___bid128_signaling_not_greater___bid128_signaling_not_less___bid_ten2mxtrunc256___bid_mask256___bid_half256___bid_Ex256m256___bid_Kx256___bid_ten2mxtrunc192___bid_mask192___bid_half192___bid_Ex192m192___bid_Kx192___bid_ten2mxtrunc128___bid_mask128___bid_half128___bid_Ex128m128___bid_Kx128___bid_ten2mxtrunc64___bid_mask64___bid_half64___bid_Ex64m64___bid_Kx64___bid_shift_ten2m3k128___bid_ten2m3k128___bid_shift_ten2m3k64___bid_ten2m3k64___bid_char_table3___bid_char_table2___bid_onehalf256M___bid_maskhigh256M___bid_shiftright256M___bid_ten2mk256truncM___bid_ten2mk256M___bid_onehalf192M___bid_maskhigh192M___bid_shiftright192M___bid_ten2mk192truncM___bid_ten2mk192M___bid_onehalf128M___bid_maskhigh128M___bid_shiftright128M___bid_ten2mk128truncM___bid_ten2mk128M___bid_ten2mk128trunc___bid_ten2mk64___bid_onehalf128___bid_maskhigh128___bid_shiftright128___bid_ten2mk128___bid_ten2k256___bid_ten2k128___bid_ten2k64___bid_midpoint256___bid_midpoint192___bid_midpoint128___bid_midpoint64___bid_nr_digits___bid32_to_bid64___bid64_to_bid32___bid32_to_bid128___bid128_to_bid32___bid64_to_bid128___bid128_to_bid64___bid64_to_int32_rnint___bid64_to_int32_xrnint___bid64_to_int32_floor___bid64_to_int32_xfloor___bid64_to_int32_ceil___bid64_to_int32_xceil___bid64_to_int32_int___bid64_to_int32_xint___bid64_to_int32_rninta___bid64_to_int32_xrninta___bid64_to_int64_rnint___bid64_to_int64_xrnint___bid64_to_int64_floor___bid64_to_int64_xfloor___bid64_to_int64_ceil___bid64_to_int64_xceil___bid64_to_int64_int___bid64_to_int64_xint___bid64_to_int64_rninta___bid64_to_int64_xrninta___bid64_to_uint32_rnint___bid64_to_uint32_xrnint___bid64_to_uint32_floor___bid64_to_uint32_xfloor___bid64_to_uint32_ceil___bid64_to_uint32_xceil___bid64_to_uint32_int___bid64_to_uint32_xint___bid64_to_uint32_rninta___bid64_to_uint32_xrninta___bid64_to_uint64_rnint___bid64_to_uint64_xrnint___bid64_to_uint64_floor___bid64_to_uint64_xfloor___bid64_to_uint64_ceil___bid64_to_uint64_xceil___bid64_to_uint64_int___bid64_to_uint64_xint___bid64_to_uint64_rninta___bid64_to_uint64_xrninta___bid128_to_int32_rnint___bid128_to_int32_xrnint___bid128_to_int32_floor___bid128_to_int32_xfloor___bid128_to_int32_ceil___bid128_to_int32_xceil___bid128_to_int32_int___bid128_to_int32_xint___bid128_to_int32_rninta___bid128_to_int32_xrninta___bid128_to_int64_rnint___bid128_to_int64_xrnint___bid128_to_int64_floor___bid128_to_int64_xfloor___bid128_to_int64_ceil___bid128_to_int64_xceil___bid128_to_int64_int___bid128_to_int64_xint___bid128_to_int64_rninta___bid128_to_int64_xrninta___bid128_to_uint32_rnint___bid128_to_uint32_xrnint___bid128_to_uint32_floor___bid128_to_uint32_xfloor___bid128_to_uint32_ceil___bid128_to_uint32_xceil___bid128_to_uint32_int___bid128_to_uint32_xint___bid128_to_uint32_rninta___bid128_to_uint32_xrninta___bid128_to_uint64_rnint___bid128_to_uint64_xrnint___bid128_to_uint64_floor___bid128_to_uint64_xfloor___bid128_to_uint64_ceil___bid128_to_uint64_xceil___bid128_to_uint64_int___bid128_to_uint64_xint___bid128_to_uint64_rninta___bid128_to_uint64_xrninta___bid_addsd3___bid_subsd3___bid_divsd3___bid_mulsd3___bid_eqsd2___bid_nesd2___bid_ltsd2___bid_gtsd2___bid_lesd2___bid_gesd2___bid_fixsdsi___bid_fixsddi___bid_fixunssdsi___bid_fixunssddi___bid_floatsisd___bid_floatdisd___bid_floatunssisd___bid_floatunsdisd___bid_truncsdsf___bid_extendsddf___bid_extendsdxf___bid_extendsdtf___bid_extendsfsd___bid_truncdfsd___bid_truncxfsd___bid_trunctfsd___bid_extendsddd2___bid_extendsdtd2___bid_unordsd2___bid_adddd3___bid_subdd3___bid_divdd3___bid_muldd3___bid_eqdd2___bid_nedd2___bid_ltdd2___bid_gtdd2___bid_ledd2___bid_gedd2___bid_fixddsi___bid_fixdddi___bid_fixunsddsi___bid_fixunsdddi___bid_floatsidd___bid_floatdidd___bid_floatunssidd___bid_floatunsdidd___bid_truncddsf___bid_truncdddf___bid_extendddxf___bid_extendddtf___bid_extendsfdd___bid_extenddfdd___bid_truncxfdd___bid_trunctfdd___bid_truncddsd2___bid_extendddtd2___bid_unorddd2___bid_addtd3___bid_subtd3___bid_divtd3___bid_multd3___bid_eqtd2___bid_netd2___bid_lttd2___bid_gttd2___bid_letd2___bid_getd2___bid_fixtdsi___bid_fixtddi___bid_fixunstdsi___bid_fixunstddi___bid_floatsitd___bid_floatditd___bid_floatunssitd___bid_floatunsditd___bid_trunctdsf___bid_trunctddf___bid_trunctdxf___bid_trunctdtf___bid_extendsftd___bid_extenddftd___bid_extendxftd___bid_extendtftd___bid_trunctdsd2___bid_trunctddd2___bid_unordtd2___gthr_win32_once___gthr_win32_key_create___gthr_win32_key_delete___gthr_win32_getspecific___gthr_win32_setspecific___gthr_win32_mutex_init_function___gthr_win32_mutex_destroy___gthr_win32_mutex_lock___gthr_win32_mutex_trylock___gthr_win32_mutex_unlock___gthr_win32_recursive_mutex_init_function___gthr_win32_recursive_mutex_lock___gthr_win32_recursive_mutex_trylock___gthr_win32_recursive_mutex_unlock___copysigntf3___fabstf2___addtf3___divtf3___eqtf2___netf2___getf2___gttf2___letf2___lttf2___multf3___negtf2___subtf3___unordtf2___fixtfsi___fixunstfsi___floatsitf___floatunsitf___fixtfdi___fixunstfdi___floatditf___floatunditf___extendsftf2___extenddftf2___extendxftf2___trunctfsf2___trunctfdf2___trunctfxf2___enable_execute_stack// 352 ` bid_decimal_globals.o/ bid_decimal_data.o/ bid_binarydecimal.o/ bid_convert_data.o/ bid128_noncomp.o/ bid128_compare.o/ bid32_to_bid64.o/ bid32_to_bid128.o/ bid64_to_bid128.o/ bid64_to_int32.o/ bid64_to_int64.o/ bid64_to_uint32.o/ bid64_to_uint64.o/ bid128_to_int32.o/ bid128_to_int64.o/ bid128_to_uint32.o/ bid128_to_uint64.o/ enable-execute-stack.o/ _chkstk.o/ 1350391525 0 0 100666 346 ` L.text0 0`.data@0.bss0QL$=r -=w) ̋p.text0.data.bss__alloca___chkstk_chkstk_ms.o/ 1350391525 0 0 100666 327 ` L.text, 0`.data@0.bss0QP=L$ r -=w) XYÐ.text*.data.bss___chkstk_ms _muldi3.o/ 1350391525 0 0 100666 512 ` L* .text( 0`.data@0.bss0/4D @0@WVSt$|$\$L$[^_ÐzR| (%AA A_ AA  .text%.data.bssD".eh_frame___muldi3.eh_frame_negdi2.o/ 1350391525 0 0 100666 476 ` L .text 0`.data@0.bss0/4,@0@L$T$څ)ÐzR|   .text.data.bss,".eh_frame___negdi2.eh_frame_lshrdi3.o/ 1350391525 0 0 100666 545 ` LJ .textD 0`.data@0.bss0/4H@@0@WVSD$T$\$t )ޅ~׈ ‰Љ[^_f1쐐zR| ,BAA Ap  AAC  .textB.data.bssH#.eh_frame___lshrdi3.eh_frame _ashldi3.o/ 1350391525 0 0 100666 545 ` LJ .textD 0`.data@0.bss0/4H@@0@WVSD$T$\$t! )ޅ~Ljƈ ։[^_Éى1zR| ,DAA Ar  AAA  .textD.data.bssH#.eh_frame___ashldi3.eh_frame _ashrdi3.o/ 1350391525 0 0 100666 545 ` LJ .textD 0`.data@0.bss0/4H@@0@WVSD$T$\$t )މׅ~ ‰Љ[^_fzR| ,CAA Ap  AAC  .textC.data.bssH#.eh_frame___ashrdi3.eh_frame _cmpdi2.o/ 1350391525 0 0 100666 520 ` L2 .text4 0`.data@0.bss0/4@(@0@S\$T$ L$D$9|~ [f9r w[Ív1[zR| $4A\ C L D C  .text4.data.bss@".eh_frame___cmpdi2.eh_frame_ucmpdi2.o/ 1350391525 0 0 100666 521 ` L2 .text4 0`.data@0.bss0/4@(@0@S\$T$ L$D$9rv [f9r w[Ív1[zR| $4A\ C L D C  .text4.data.bss@#.eh_frame___ucmpdi2.eh_frame _clear_cache.o/ 1350391525 0 0 100666 457 ` L .text 0`.data@0.bss0/4,@0@ÐzR|   .text.data.bss,'.eh_frame___clear_cache.eh_frame _trampoline.o/ 1350391525 0 0 100666 716 ` L .text 0`.data@0.bss0/4PD@0@f,D$8t\tGtJtUtXu[D$D$ T$D$4D$D$0$,Ív ʐ@뺐벐몸ːzR|  0 C0F C0H D M  4  .text.data.bss%P/ B.eh_frame_getpagesize_mprotect.eh_frame_VirtualProtect@16__main.o/ 1350391525 0 0 100666 1122 ` L.text 0`.data@0.bss0/4x@0@t Ћu ÐSt!t Ku$[Ð1ÍCuftfSt#t vKu$[Ð1ÍC uǐzR| +O[ 40FAC i AB Xx^MC u AB 2CMRhu   8\ _p.4857!, ___maint 4.text.data.bssFxP__atexit n.eh_frame___do_global_dtors___do_global_ctors_initialized.4877.eh_frame___CTOR_LIST_____DTOR_LIST___absvsi2.o/ 1350391525 0 0 100666 513 ` L .text 0`.data@0.bss0/44@0@ D$x Ð؅yzR| CK B    .text.data.bss4_abort #.eh_frame___absvsi2.eh_frame _absvdi2.o/ 1350391525 0 0 100666 521 ` L  .text$  0`.data@0.bss0/44@0@ D$T$x Ð؃څyzR| $CO B   .text$.data.bss4_abort #.eh_frame___absvdi2.eh_frame _addvsi3.o/ 1350391525 0 0 100666 529 ` L( .text, 0`.data@0.bss0/44@0@ T$L$x9„u Ð9zR| ,C[ B (   .text,.data.bss4_abort #.eh_frame___addvsi3.eh_frame _addvdi3.o/ 1350391525 0 0 100666 565 ` LL .text@8 0`.data@0.bss0/4DB@0@WVSt$|$L$\$ȉx9|9sf9|9wf[^_zR| (@AA Az AA*   .text@.data.bssD_abort #.eh_frame___addvdi3.eh_frame _subvsi3.o/ 1350391525 0 0 100666 529 ` L( .text, 0`.data@0.bss0/44@0@ T$L$)ȅx 9„u 9zR| ,C\ A (   .text,.data.bss4_abort #.eh_frame___subvsi3.eh_frame _subvdi3.o/ 1350391525 0 0 100666 565 ` LL .text@8 0`.data@0.bss0/4DB@0@WVSt$|$L$\$)څx9|9vf9|9rf[^_zR| (@AA Az AA*   .text@.data.bssD_abort #.eh_frame___subvdi3.eh_frame _mulvsi3.o/ 1350391525 0 0 100666 517 ` L .text  0`.data@0.bss0/44@0@ D$l$9u zR| CT A    .text.data.bss4_abort #.eh_frame___mulvsi3.eh_frame _mulvdi3.o/ 1350391525 0 0 100666 1033 ` L  .text  0`.data@0.bss0/4X@0@UWVS,t$@|$DD$HT$LD$T$|$T$9u9usD$T$ ,[^_]Ël$9D$ÉыD$D$T$|$x~1t$|$9uJ\$t$ D$T$ 뙉ÉыD$D$T$ |$x0x1t$|$ 9tD$T$)D$T$ )T$ )t$|$u)T$f|$x+|$x^|$u|$uD$T$ 뗃|$xx|$u|$uÉ)r\$D$ D$T$ |$R|$GD$T$)1T$T$L$ D$T$ y|$ |$D$T$))ȉyzR| <AA AAC@C AA AAA   .text.data.bssX_abort #.eh_frame___mulvdi3.eh_frame _negvsi2.o/ 1350391525 0 0 100666 525 ` L$ .text( 0`.data@0.bss0/44@0@ T$؅x „u ÉzR| (CX A $   .text(.data.bss4_abort #.eh_frame___negvsi2.eh_frame _negvdi2.o/ 1350391525 0 0 100666 557 ` LD .text@0 0`.data@0.bss0/4<:@0@SL$\$ȉ؃څx ~vu[|w򐐐zR|  =ACn AA !   .text=.data.bss<_abort #.eh_frame___negvdi2.eh_frame _ctors.o/ 1350391525 0 0 100666 454 ` L .text 0`.data@0.bss0.drectve<@0 -aligncomm:"___DTOR_LIST__",2 -aligncomm:"___CTOR_LIST__",2.text.data.bss.drectve<"___DTOR_LIST_____CTOR_LIST___ffssi2.o/ 1350391525 0 0 100666 468 ` L .text 0`.data@0.bss0/4,@0@D$t@Ív1ÐzR|   .text.data.bss,".eh_frame___ffssi2.eh_frame_ffsdi2.o/ 1350391525 0 0 100666 496 ` L .text0 0`.data@0.bss0/4,@0@D$L$t ÐtȺ!Ív1ÐzR| /  .text/.data.bss,".eh_frame___ffsdi2.eh_frame_clz.o/ 1350391525 0 0 100666 613 ` L .text 0`.data@0.bss0.rdata@`@.text.data.bss.rdata___clz_tab _clzsi2.o/ 1350391525 0 0 100666 460 ` L .text 0`.data@0.bss0/4,@0@D$ÐzR|   .text .data.bss,".eh_frame___clzsi2.eh_frame_clzdi2.o/ 1350391525 0 0 100666 488 ` L .text( 0`.data@0.bss0/4,@0@D$T$u¹ ƒ1ƒÐzR| '  .text'.data.bss,".eh_frame___clzdi2.eh_frame_ctzsi2.o/ 1350391525 0 0 100666 456 ` L .text 0`.data@0.bss0/4,@0@D$ÐzR|   .text.data.bss,".eh_frame___ctzsi2.eh_frame_ctzdi2.o/ 1350391525 0 0 100666 484 ` L .text$ 0`.data@0.bss0/4,@0@D$L$uȺ Ív1zR| $  .text$.data.bss,".eh_frame___ctzdi2.eh_frame_popcount_tab.o/1350391525 0 0 100666 618 ` L .text 0`.data@0.bss0.rdata@`@.text.data.bss.rdata___popcount_tab_popcountsi2.o/ 1350391525 0 0 100666 587 ` LN .text< 0`.data@0.bss0/4,D@0@T$ȉÐzR| ;  ( 4   .text;.data.bss,'7.eh_frame___popcountsi2.eh_frame___popcount_tab _popcountdi2.o/ 1350391525 0 0 100666 747 ` L .text 0`.data@0.bss0/4<X@0@VSL$ \$ȉ%Ɖȉ%Ɖȉ%ځЉЉ[^ÐzR|  AA A ' @ Y k w     .text.data.bss<'7.eh_frame___popcountdi2.eh_frame___popcount_tab _paritysi2.o/ 1350391525 0 0 100666 491 ` L .text( 0`.data@0.bss0/4,@0@D$1‰1Љ1iÐzR| '  .text'.data.bss,%.eh_frame___paritysi2.eh_frame _paritydi2.o/ 1350391525 0 0 100666 499 ` L .text0 0`.data@0.bss0/4,@0@T$D$1Љ1‰1Љ1iÐzR| -  .text-.data.bss,%.eh_frame___paritydi2.eh_frame _powisf2.o/ 1350391525 0 0 100666 611 ` Lh .textHT 0`.data@0.bss0.rdata$@0@/4,(^@0@D$T$Ѕx6t&ftȨtuمxÐ=Ð?zR| H>  .textH.data.bss.rdata,#.eh_frame___powisf2.eh_frame _powidf2.o/ 1350391525 0 0 100666 611 ` Lh .textHT 0`.data@0.bss0.rdata$@0@/4,(^@0@D$T$ Ѕx6t&ftȨtuمxÐ=Ð?zR| H>  .textH.data.bss.rdata,#.eh_frame___powidf2.eh_frame _powixf2.o/ 1350391525 0 0 100666 611 ` Lh .textHT 0`.data@0.bss0.rdata$@0@/4,(^@0@l$T$Ѕx6t&ftȨtuمxÐ=Ð?zR| H>  .textH.data.bss.rdata,#.eh_frame___powixf2.eh_frame _powitf2.o/ 1350391525 0 0 100666 1055 ` L .text 0`.data@0.bss0/4\@0@UWVSl$$$$$qt$DD$HT$L͍|$Pl$4vt$ D$$T$(L$,t$D$T$L$<$t$PD$TT$XL$\tt$ D$$T$(L$,l$Dl$l$Hl$l$Ll$l$4l$<$D$@T$  7   ?   o  Q  %   EX0n  8   v  3p-yD  #   j b'*  .textI.data.bss\___lttf2 " , 6 @ ___netf2 ___eqtf2 J U d.eh_frame___divtc3.eh_frame___divtf3___multf3___addtf3___subtf3___fabstf2___copysigntf3_bswapsi2.o/ 1350391525 0 0 100666 466 ` L .text 0`.data@0.bss0/4,@0@D$ffzR|   .text.data.bss,$.eh_frame___bswapsi2.eh_frame_bswapdi2.o/ 1350391525 0 0 100666 482 ` L  .text 0`.data@0.bss0/4,@0@T$ffD$ffÐzR|   .text.data.bss,$.eh_frame___bswapdi2.eh_frame_clrsbsi2.o/ 1350391525 0 0 100666 482 ` L  .text 0`.data@0.bss0/4,@0@D$xufHzR|   .text .data.bss,$.eh_frame___clrsbsi2.eh_frame_clrsbdi2.o/ 1350391525 0 0 100666 530 ` L: .textP 0`.data@0.bss0/4,0@0@T$D$u? t ҃Dft…x1Ҹ? f1ɐzR| N  .textN.data.bss,$.eh_frame___clrsbdi2.eh_frame_fixunssfsi.o/ 1350391525 0 0 100666 658 ` L .texth 0`.data@0.bss0.rdataD@0@/48H@0@D$ t$|$fD$ fD$l$$l$$|$fD$ fD$l$$l$$ÐOzR| eC x A h   .texte.data.bss.rdata8&.eh_frame___fixunssfsi.eh_frame_fixunsdfsi.o/ 1350391525 0 0 100666 658 ` L .texth 0`.data@0.bss0.rdataD@0@/48H@0@ D$t$|$fD$ fD$l$$l$$ |$fD$ fD$l$$l$$ ÐOzR| eCx A h   .texte.data.bss.rdata8&.eh_frame___fixunsdfsi.eh_frame_fixunsxfsi.o/ 1350391525 0 0 100666 658 ` L .texth 0`.data@0.bss0.rdataD@0@/48H@0@l$ t$|$fD$ fD$l$$l$$|$fD$ fD$l$$l$$ÐOzR| eC x A h   .texte.data.bss.rdata8&.eh_frame___fixunsxfsi.eh_frame_fixsfdi.o/ 1350391525 0 0 100666 569 ` LB .text8$ 0`.data@0.bss0/488@0@D$ Et\$ f$؃ڃÐzR| 5C V G T&    .text5.data.bss8# 1.eh_frame___fixsfdi.eh_frame___fixunssfdi _fixdfdi.o/ 1350391525 0 0 100666 569 ` LB .text8$ 0`.data@0.bss0/488@0@D$ Et\$ f$؃ڃÐzR| 5C V G T&    .text5.data.bss8# 1.eh_frame___fixdfdi.eh_frame___fixunsdfdi _fixxfdi.o/ 1350391525 0 0 100666 569 ` LB .text8$ 0`.data@0.bss0/488@0@l$ Et|$ f<$؃ڃÐzR| 5C V G T&    .text5.data.bss8# 1.eh_frame___fixxfdi.eh_frame___fixunsxfdi _fixunssfdi.o/ 1350391525 0 0 100666 660 ` L .textXx 0`.data@0.bss0.rdata4@0@/4<<@0@SD$ |$fD$ fD$ l$ <$l$$1ۉ$\$,$ l$ <$l$ $ȃ[Ð/OzR|  WACQA <  .textW.data.bss.rdata<&.eh_frame___fixunssfdi.eh_frame_fixunsdfdi.o/ 1350391525 0 0 100666 660 ` L .textXx 0`.data@0.bss0.rdata4@0@/4<<@0@SD$ |$fD$ fD$ l$ <$l$$1ۉ$\$,$ l$ <$l$ $ȃ[Ð/OzR|  WACQA <  .textW.data.bss.rdata<&.eh_frame___fixunsdfdi.eh_frame_fixunsxfdi.o/ 1350391525 0 0 100666 816 ` L2 .text 0`.data@0.bss0.rdata@0@/4t(@0@WVSl$ E |$fD$ fD$ l$ <$l$$1ɉ $D$,$xcEtl$ <$l$4$1ڃ[^_Ðl$ <$l$$1҉Ή)׉[^_Ív11҃[^_Ív/_zR| XAA AC q A AAB a A AAD I A AAD   .text.data.bss.rdatat&.eh_frame___fixunsxfdi.eh_frame_floatdisf.o/ 1350391525 0 0 100666 665 ` L .textl 0`.data@0.bss0.rdataH@0@/4<L@0@SD$T$Ӄ?rvAt Á؀R $1ۉD$\$l$\$D$[Ðv븐OzR|  kAC] AB >  .textk.data.bss.rdata<%.eh_frame___floatdisf.eh_frame _floatdidf.o/ 1350391525 0 0 100666 581 ` LH .text$4 0`.data@0.bss0.rdata@0@/40>@0@ L$D$1҉$T$,$ ÐOzR| #C_  .text#.data.bss.rdata0%.eh_frame___floatdidf.eh_frame _floatdixf.o/ 1350391525 0 0 100666 581 ` LH .text$4 0`.data@0.bss0.rdata@0@/40>@0@ L$D$1҉$T$,$ ÐOzR| #C_  .text#.data.bss.rdata0%.eh_frame___floatdixf.eh_frame _floatundisf.o/ 1350391525 0 0 100666 639 ` L .textPl 0`.data@0.bss0.rdata,@0@/4<0v@0@SD$L$vt%1ۉ $\$,$ 1҉$T$,$\$ D$ [OzR|  PACJA1  .textP.data.bss.rdata<'.eh_frame___floatundisf.eh_frame _floatundidf.o/ 1350391525 0 0 100666 595 ` LT .text0@ 0`.data@0.bss0.rdata @0@/40J@0@ D$1҉$T$,$ D$1҉$T$,$ ÐOzR| /Ck  .text/.data.bss.rdata0'.eh_frame___floatundidf.eh_frame _floatundixf.o/ 1350391525 0 0 100666 595 ` LT .text0@ 0`.data@0.bss0.rdata @0@/40J@0@ D$1҉$T$,$ D$1҉$T$,$ ÐOzR| /Ck  .text/.data.bss.rdata0'.eh_frame___floatundixf.eh_frame _eprintf.o/ 1350391525 0 0 100666 755 ` L.texthh 0`.data@0.bss0/4L@0@D$(D$D$$D$D$ $ÐS(D$D$Pt'|$)ފL$ L$ L$ D$P8pD$1҃,[^_]Ð9D$sfIL$Ӊ+l$멍v111v1zR| AA AAC@F AA AAC ` AA AAD  AA AAA  AA AAB  .text.data.bss&.eh_frame___udivmoddi4.eh_frame/0 1350391525 0 0 100666 1035 ` LL.text 0`.data@0.bss0/4`@0@D$ff%SL$ t8ȃ t˃ t˃ t˃ ؃t [Ív1ɋT$Ѓ Ƀ0Ѓ tttt zR|  0DX LAC D xlD   #   4H\|   0 D Wh .text.data.bssku.eh_frame___dfp_set_round___dfp_get_round___dfp_clear_except___dfp_test_except___dfp_raise_except.eh_frame___bid_IDEC_glbround___bid_IDEC_glbflags /23 1350391525 0 0 100666 9187 ` L!.text 0`.data!@`.bss0 ddd''''@B@B@Bʚ;ʚ;ʚ; T T T TvHvHvHrN rN rN rN @zZ@zZ@zZƤ~Ƥ~Ƥ~o#o#o#o#]xEc]xEc]xEcd d d #NJ#NJ#NJ#NJc-^kc-^kc-^kŭ56ŭ56ŭ56@@@@J-J-J-JHEJHEJHEJHE ҷR ҷR ҷR<П<.;<П<.;<П<.;a%>^O a%>^O a%>^O a%>^O rmCrmCrmC@tFМ, @tFМ, @tFМ, &K" 7~&K" 7~&K" 7~ſt[Am-ſt[Am-ſt[Am-ſt[Am- [8DM1 [8DM1 [8DM1d7 d7 d7 菇+MraB菇+MraB菇+MraB菇+MraBK{Η6F6F6F@" zĆZL;K@" zĆZL;K@" zĆZL;K@" zĆZL;K43333333QQS㥛 KY8m4 k)nkA!^y55sa*f)M\"pu{6*+3"[3/#ЄK86WB 7 -7+=_$Wx/e9-. "%),/36 ddd''''@B@B@Bʚ;ʚ;ʚ; T T T TvHvHvHrN rN rN rN @zZ@zZ@zZƤ~Ƥ~Ƥ~o#o#o#o#]xEc]xEc]xEcd d d #NJ#NJ#NJ#NJ !$'+.15 d'@Bʚ; TvHrN @zZƤ~o#]xEcd #NJc-^kŭ56@J-JHE ҷR<П<.;a%>^O rmC@tFМ, &K" 7~ſt[Am- [8DM1d7 菇+MraBK{Η6F@" zĆZL;K  !!!"""####$$$%%%&&&&'' !$'+.158;?BEILOSVY\`cfm4333333333333333QQQ'1Zd;OnDJY8m4 7k)mpimkA!GL^y55Jp?sa*M%>Ze)M\"\ou{6vNEi㽿*+ O2"[3/#|iʄЄK8g0!6WB 7 -RMC6+=_$kb Vx/e9"~oB-.萘̿AW$ xzJiXm;>).=F$B9/6h%YĢ1T,˽. @r<Om݉d%f[0N$NQ3&I`oNT=ʀMv']1N3xm4'"[b2|a?[ώfM2ASj`Ih ?(4!: =ˬs S`i;.eNQG3vbk,{X>t҉)NV/%;!щ*[Z2P @KLe*t; RjtP9' =y-@cR7y.Y[DcEP Yd @{c vf i% "ridn[)t@O0/'P 6 v:#hNO@H`?w­w`F"2V߄c0 c'?Bɚ; TvHrN ?zZƤ~o#]xEcc #NJc-^kŭ56?J-IHE ҷR<П<.;a%>^O rmC?tFМ, &K" 7~ſt[Am- [8DM1c7 珇+MraB2P @KLe*t; RjtP9' =y-@cR7y.Y[DcEP Yd @{c vf i% "ridn[)t@O0/'P 6 v:#hNO@H`?w­w`F"2V߄c0 2P @KLe*t; RjtP9' =y-@cR7y.Y[ c'?Bɚ; TvHrN ?zZƤ~o#]xEcc 2P @KLe*t; RjtP9' =y-@cR7y.Y[.text.data .bss$<Uq @   %___bid_power10_index_binexp_128___bid_reciprocals10_64___bid_short_recip_scale___bid_power10_index_binexp___bid_estimate_bin_expon___bid_power10_table_128___bid_estimate_decimal_digits___bid_recip_scale___bid_reciprocals10_128___bid_round_const_table_128___bid_round_const_table /43 1350391525 0 0 100666 2155864 ` L F.text< O 0`.data@0.bss0.rdata @`@/4T 8 @0@UWVS$\$0%`=`tˁ1҅ˁ99Ӄ́ρ9ρ΁p9փ<΁333ˁL9փeρUUU᪪*9΍N t1Q&~e (w|$09eD$0D$D$Ą[^_]fD$0D$D$Ą[^_]fP<?)|$49Q ``d|$dhl\$(qt$@Y\$qt$HIL$`D$4T$ƉD$PT$TD$dd$D$hT$lL$P1ۉ1҉D$ T$$L$ \$$D$D$XT$\D$(d$D$pT$tljՋD$X1҉1ۉL$8\$<D$8T$961ۉȉt$0|$4׉t$0|$49w)9!1L$\$D$T$ ډD$T$ 9w91ҋ|$l$ՋD$le5\$h\$T$Pȉh'l';L$ r;\$  |$l (t|$h9fD$hD$D$Ĥ[^_]ÐD$hD$D$Ĥ[^_]fсxxDӁ #;11D$D$& (H|$h96D$hD$D$Ĥ[^_]Ívr9~r orω|$l$˹;dv11h11911f9r11fD$ D$$T$<9T$LITD$ D$$.vT$$9T$,vt L$hӁ~@D$D$9\$t<9L$d-L$49d'\$09`'f|$lu@|$ w6 1r =ƤY @Ht$uȋt$ yfUWVS$$󥋴$$$$$с``m? l$XD$Ձl$ v $D$D$[^_]ÍvZ\$ L$ FL$ L$y4Á\$ Ձl$$ډŁl$8Ձl$<Łl$(Ձl$,Łl$PՁl$TŁl$@Ձl$DŁ̉l$0Ձl$4Ł3333l$hՁ33l$lŁ媪l$`Ձ媪l$HŁUUUU$UU9T$Hr10 9\$$-L$,9L$<;r\$(9\$8+ʋl$D9l$T(rL$@9L$Pʋ\$l9\$4rl$h9l$0ʍTT$0 t$(|$,|$X& (N $99 $D$D$[^_]Ívсxxс||D$D$=uL$ Ӂ\$$ډŁl$8Ձl$<Łl$(Ձl$,Łl$PՁl$TŁl$@Ձl$DŁ̉l$0Ձl$4Ł3333l$hՁ33l$lŁ媪l$`Ձ媪l$HŁUUUU$UU9T$Hv19\$$r 9L$ L$,9L$<1ʋl$D9l$T1ʋ\$l9\$41f|$X L$XP*zrR D$0)É$;T$w ;t$ ` ` d $X\$Hp t$xx|$hH$X\$`@$|$,D$@T$D$牄$$L$@1ۋD$(1҉D$0T$4L$0\$4D$HD$PT$TD$x牄$$D$Hd$(D$ T$$D$P1ҋL$ \$$1ۉL$X\$\D$XT$\D$xd$(D$XT$\L$X\$\˹L$p\$tD$ 1D$pT$tD$hD$8T$<$D$ T$$D$hd$($$D$81ҋ$$1Ӌ$d$(ӋD$8T$<1҉D$8T$c7lD$h!2D$l!D$0D$4D$@ D$D D$PD$TD$(D$, D$8D$< D$ D$$b+$@)ދD$8T$< t1҉D$T$D$ T$$ t1D$8T$ 9D$04 D$ \\$\\$H\t$x\|$h\$\\\$`@$|$D$@T$D$牄$$L$@1ۋD$1҉D$(T$,L$(\$,D$HD$PT$TD$x牄$$D$Hd$D$ T$$D$P1ҋL$ \$$1ۉL$X\$\D$XT$\D$xd$D$XT$\L$X\$\˹L$p\$tD$ 1D$pT$tD$hD$8T$<$D$ T$$D$hd$$$D$81ҋ$$1Ӌ$d$ӋD$8T$<1҉D$8T$vT$49T$Lrw1‰D$0D$4dv19T$D5119r 11f91f3L$$3\$ Xꁼ$vC11DŽ$|$$ |$ u l$< l$8t%5 =$u 05ڋ$˹ډD$T$D$[^_]f3L$43D$0 D$ `d$hL$Hl\$xpt$ht$x`L$`@$$11gvD$`D$dvD$@D$DvD$ D$8`RD$@(vL$( t1@+L$(t$|$ t1׋D$T$L$( t1D$T$|$c7D$h!2D$l!D$0D$4D$( D$, D$@D$DD$PD$T D$8D$< D$ D$$ f+$7#@)ދD$8T$< t1҉D$T$D$ T$$ t1D$8T$D$(D$,D$D$D$ D$$$t$ t1\$t$ É։ t1\$t$ É։ t1$t$D$ T$$$T$D$< f%|=|6fDŽ$fD$xfD$zfD$|fD$~D$8f$l$xvfDŽ$fDŽ$fDŽ$fDŽ$fDŽ$D$8f$۬$f?Hl$1L$p\$tL$p\$tL$4$$T$D$8ቄ$$D$T$$1ҋ|$l$1|$(l$,D$(T$,D$8D$(T$,|$(l$,|$Pl$TD$1D$PT$TD$ቄ$$D$@ቄ$$D$D$T$$1ҋ|$l$1|$8l$<D$8T$D$ 1D$D$D$D$\$t$ L$  t1$t$É֊L$( t1$t$É֊L$  t1\$t$ D$T$D$T$ D$lfс||fDŽ$fDŽ$fDŽ$fDŽ$fDŽ$D$hf$۬$ffDŽ$fDŽ$fDŽ$fDŽ$fDŽ$D$hf$۬$~f|$ ??\$(É֊L$( t1ۉ\$t$É֊L$  t1\$t$|$D$T$ $t$\$t$ dv9~v9D$(9v90v;L$( ;L$(9vt fDŽ$с~r =Ƥf$1f$f$f$D$hf$۬$9\$Y9L$I|$9d'as,$9`'L_vt$lcvfDŽ$fDŽ$fDŽ$SD$ t$l)t$ t$({UWVS|$$󥋴$$$$$с``? l$PD$Ձl$ vXfDŽ$fDŽ$fDŽ$fDŽ$fDŽ$$f$۬$|[^_]f\$ L$ L$ L$iÁ\$ Ձl$$ډŁl$0Ձl$4Łl$Ձl$Łl$@Ձl$DŁl$8Ձl$<Ł̉l$(Ձl$,Ł3333l$hՁ33l$lŁ媪l$HՁ媪l$pŁUUUUl$`UU9T$pr10 9\$$L$9L$4r\$9\$0ʋl$<9l$DrL$89L$@|ʋ\$l9\$,yrl$h9l$(iʍTT$(ft$|$|$PD ($9fDŽ$:fDŽ$0fDŽ$2fDŽ$4fDŽ$6$f$8۬$0|[^_]fсxxfDŽ$ fDŽ$fDŽ$fDŽ$fDŽ$$f$۬$|[^_]f=2L$ Ӂ\$$ډŁl$0Ձl$4Łl$Ձl$Łl$@Ձl$DŁl$8Ձl$<Ł̉l$(Ձl$,Ł3333l$hՁ33l$lŁ媪l$HՁ媪l$pŁUUUUl$`UU9T$pU19\$$or 9L$ cL$9L$4a1ʋl$<9l$Dt1ʋ\$l9\$,1с||fDŽ$fDŽ$fDŽ$fDŽ$fDŽ$$f$۬$vv|$P~ L$Pyo*zrR D$()É\$h;T$w ;t$ f   L$xX\$Hp $x|$pH$X\$`@$|$D$@T$DD$x牄$$L$@1ۋD$1҉D$(T$,L$(\$,D$HD$0T$4$牄$$D$Hd$D$ T$$D$01ҋL$ \$$1ۉL$P\$TD$PT$T$d$D$PT$TL$P\$T˹L$X\$\D$ 1D$XT$\D$pD$ T$$$D$8T$\$t$\$t$D$(D$,D$ D$$D$@D$D9 v9v;L$@;L$Pz9D$`QH9v9v9l$H92;|$;l$v|$9d'T$9`'oft Éс?M1w rm=DvfffDŽ$fDŽ$fDŽ$fDŽ$fDŽ$$f$۬$.v\$hM1D fDŽ$1f$%1f$f$f$$f$۬$ [8p3D$ "  ҃ l$09w09\$0&f%9r9‰%9r9‰̉̉3333%33339r9‰媪㪪%UUUUD$0UUUU9rwV;l$0wPJ1L$(?BZ t1D$T$D$D$f11o1/1+|$hl$hUWVS|$\$8%`=`ˁ1҅3ˁ99Ӄ́ρ9}ρ΁p9׃ρ333΁L9׃e߉ˁUUU᪪*9K t1Qƈ <'?)߉|$<9Q t$\yY \$(qt$@Y\$ qt$HIL$XD$nڃFV f9\$h9L$(XL$,9d'wg\$(9`'WT$L$T$L$zfD$||$|tD$D$>t$x˹D$D$ 1+\$|l$|TUWVS$$󥋄$$D$T$$$\$|с``? l$PƉׁ v9$@D$|$BB Ё[^_]   tÁ\$Ձl$ډŁl$0Ձl$4Łl$8Ձl$<Łl$ Ձl$$Łl$@Ձl$DŁ̉l$(Ձl$,Ł3333l$`Ձ33l$dŁ媪$Ձ媪l$XŁUUUUl$HUU9T$Xr@10 9\$mL$<9L$4{r\$89\$0kʋl$D9l$$hrL$@9L$ Xʋ\$d9\$,Url$`9l$(EʍTT$ CD$T$1L$\$ɉL$\$|$PD ( |$|9 $@t$|>сxxс||$@މ˹HX [^_]Ð=$^L$Ӂ\$ډŁl$0Ձl$4Łl$8Ձl$<Łl$ Ձl$$Łl$@Ձl$DŁ̉l$(Ձl$,Ł3333l$`Ձ33l$dŁ媪$Ձ媪l$XŁUUUUl$HUU9T$Xv19\$r 9L$L$<9L$41ʋl$D9l$$1ʋ\$d9\$,1f|$Py^ l$Pň L$( 'L$0l$ɉL$H\$LD$HT$L\$(+SCK t$06|$ )$9L$Lr 9D$H vD$L$p\$($|$`$\$X@$|$D$8T$T;l$.Et Éс?M1w rI=DvBf$@t$|˹HX RM1D L$\$1Ӊȉډ¸t$|$$WD$|Ɖ׉$HX $|$ [8^u6|$w, D$D$D$8D$< l$uҋD$yȿ+$$_\$ \$T$ ҃ L$L$0l$\$L$9wL9\$0Bfl$L$\$D$%9r9‹l$L$\$D$%9r9‹l$̋L$̋\$3333D$%33339r9‹l$媪\$㪪D$%UUUUD$0L$UUUU9rwR;l$0wLЍH1L$ ?Ht$|$ t1D$D$11t111c1UWVS$1҉L$\$ L$0\$41ҋt$g9ۃ9у9rىp9Ӄى333L9ӃىUUU窪*9ˍK t1s)ރ D$Y1ɋ|$0|$t^lj|$l$ 9 L$h||$ ;x \$x|$pxh l$ HL$@X\$(hl$H@D$lD$ht$ l$D$D$`T$dD$pD$xT$|L$`1ۋD$1҉D$T$L$\$D$T$D$ 扄$$D$T$ D$1ҋL$\$ 1ۉL$8\$<D$8T$@~ρ ($$9xĴ[^_]fɃ ۃ ǁ|$ׁ9w=ˉŁցǁс9K = ˉŁցǁс96 ( ˉŁ̉ց̉ǁ3333с33339  ˉŁ媪ׁ窪UUUUL$ցUUUU9rY 1 t1ÿ)΃ D$H11~ρtL$\$Ӊ˹L$(\$,k | 0XP@ $9D$r1 9T$' v@@DL$PH\$Lt$0P|$hHL$pX\$H@D$`t$,D$PD$xT$|D$D$8T$$|$,333r|$(3333 1Ҹ@Buۃ?+)\$t$ t1\$t$ |$ |$D$=@$2$k|$,fff]P|$(ffffI=$T$e_\$(t$,L$H t1\$8t$<)\$t$ t1\$8t$<\$t$L$H t1\$0t$4D$(T$, t1҉D$T$ ND$T$ t1D$T$ D$T$ 1$ lUWVS$$󥋼$$$$\$|T$t$ L$h V   ҃ t$9w#‰%9J<‰%9‰̉̉3333%33339‰%D$㪪UUUUUUUU9r?1ЍX1?H t1D$T$ D$D$U|$ D$T$   D$T$ ؃#D$#T$ Ƀ Y f Ƀˉ Ƀˉ 3333Ƀ ЩUUUU\@t$o@ (L$| |$|9 x[^_]ÐȉL$ Ƀ |$ ۃ ցt$(t$t$ 9t$W ˉсL$ƁсL$(9R rt$(9t$B ˉсL$ƁсL$(9 rt$(9t$ ˉс̉L$Ɓс3333L$(339 rt$(9t$ ˉс᪪L$Ɓ檪UUUU%UU9r 9T$} \ P|$l$)ރ 1ۅ | 8XP@ $;D$ w ;T$ @@DL$`H\$@L$x|$pH$X\$P@$|$D$0T$4D$`牄$$L$01ۋD$1҉D$ T$$L$ \$$D$@D$HT$L$牄$$D$@d$D$T$D$H1ҋL$\$1ۉL$8\$<D$8T$<$d$D$8T$ $;`')v\$ \$u D$ $taƒ ~wIs?0D$T$¸t$@˹ƤvvD$T$¸_t$@˹Tr ;xM$$pt$H $p t$0HL$ pHL$(@D$L$؉$؉D$(^|$(0t$(UT$Ut$ r!L$L$ t1҉D$T$ T$J Ju9t$ nr t$ 9`L$(`y\$D$ T$$t$ 1ҋt$ |$$1׉dy׉D$ 1ׁ $¸L$\$˹D$T$¸owf9aZv9%0vD$@Ƥ~a)?!) t1҉$T$|$#6r <$o'D$T$¸|$1$T$D$T$¸_ $˹ t1҉ N߉ t1$T$1Pl$T$UWVS$$\$X։ǁL$p :ÁɃ  Ӂ\$Á\$ډ\$9\$w ͉сL$ÁсL$9-  Ӂ\$ŁӁ\$Á9ىӁ̉\$Ł Ӂ3333\$Á339oˉс᪪L$Ł媪 UUUU%UU9r1ˍK t1)ރ D$<1|$Љك!!փۃ k f ˁۃ݉ ˁۃ݉ ˁ3333ۃ UUUUًt$3y<|$^ĉlj5Ý L$\X;h  j j\$X\$lpt$H L$ X\$8pt$(HL$@@D$hD$\D$D$`T$dD$lD$pT$tL$`1ۋD$1҉D$T$L$\$D$D$T$D$ D$xT$|D$D$T$ D$1ҋL$\$ 1ۉL$0\$4D$0T$4D$ D$0T$4L$0\$4˹L$H\$LD$1D$HT$LD$8D$T$ D$(D$PT$TD$8D$8T$@$݃1$wЍ )‰)ӍX$-p$PE+$ރyi |$(l$,yi|$l$yi|$ l$$4$' t$Xi$qt$py $i$q$y$I$ $ $։ŋD$X≄$$$扄$$$1ۋD$X1҉D$0T$4L$0\$4D$pD$8T$<$扄$$D$pD$T$D$81ҋL$\$1ۉL$`\$dD$`T$d$D$`T$dL$`\$d˹L$h\$lD$1D$hT$l$D$T$$D$PT$T$D$xT$|D$1ҋL$x\$|1ۉL$@\$DD$@T$D$D$@T$DL$\$1ۉL$\$L$P\$TL$\$D$@T$D1D$T$D$PT$T$扄$$D$HT$LD$P1ҋL$H\$L1Ӌ$Ӌt$P|$T1$$ȉډ1׉ȉډ¸D$PT$TD$H1D$PT$T$$1ۉ$$$$$$$D$0T$4L$0\$41$$L$h\$l$$D$0D$4$9wr $9wD$0D$4D$@T$D¸L$x1D$0T$4L$8\$<1ۉL$8\$<$$L$8\$79l$1vD$1T$03T$ {L$9L$ m~\$9\$`Ykv+$?~s+$$$ t111ҋ$`3{$˹@0Ӌ$`HX f$1$$ t1$$  t1׋$$ t1ҁ Iw =<Ӂ  8c7,fί,,r]rYdjV[(~['nޓ$_ +RJKvP[qʼa;<Anx,-)V4{1VW׺II]':jҫyt:}!-PySɘ$gmsmr|R9I(PUONcD}9ݥzؑ{.t/r!8N,֎~yM>?高 fv&7O WZrouU;E(YĮD4/LN>mԆK>M7svԗV2Z_+DCF?%iğϾl!!3؜LxN VMF 1 IWIqm'VKIW"xVb,+ S^gEMJ;{B?Zo@`f+/x"t,&4c7 O ƙl$2n?;kVP[;,EGrmC(r~s@OK3 sKJ? )¢Aۙ7g~,RYd .nMXZ Ft]xEc~7?cRAkS #Jnt*O?x},1G8?zGzGzGbX9v/$&†W2ı.nfF6XO4Lk^ zo  ezxʫ)tmV#W*b.Kimj}{ͷs*JUI_\ny` KP&h&\= jIhn:Yau: |]›})+s}hImdTp\du:$%'ؠcVJ*m<yM9v5"$y-@;.%IbYu/x nN%+4ۂ,$vꈚ)|5{uݧ]-Ul*;J $D#o<1:k@'|v4k凌RKBc)D)XfK1t)sZ=b[cú{NLwziĴ/y *[Zʻ%2IHT긨(9 kz-Dڹ.W6Rr\ !$'+.148;>BEHLORVY\`cfjmptwz~   $'*.148;>BEHLORUY\_cfimpx:uSƨgɟܥ k`ŗb֊ S T`鸶JgٶWNh;#)8>G#g$ܮwts߀Gf!e r v6QPaن4i>[ΛpD8e$]z/0 ’s༿6{Y Ho^+Ʊ;Hwo|KE 68(J1]c%2R l (s>w! 8Z~HW_S#Y^߯Y 'yQZ-7yHvQipelE1D"'rfAOXd˞kۢ!P?/"=~Fr6-0ƒ *dj[wJ';GLŸG꺔R̆]1 @*$bGט#?9'4.QUM4: d|RU"@$0hS>c-kS.#Q-_UpOԪO[|VsJ"|c$\_>..Jyݭ'vc*[|-3S:&c:R] X`UY~S|qtqȦn𸪯qޝh}9'Fu=p b!q&qkgTM" ŗ{`=Ui IMA2*FjP|};+*\$N;?_+B`w[za쌊`6Y78U@gz'0mx5c_f/Flk7._O>D+{b;=;K##⼺;1acמM6n; ^wl}9;^I,!J5U"SE@DnT.wAP~uu\TV Ғsi$$e@\R狽edDKN^wÿ-? ypw> ;ZJbڗ<OGpL|oꊭaнK'8Y([ Jg9E5.GpCK,΁q9 ,My%1^_B3ǣ g_0CXn >;5޹̥΁vSnʋ W+ QI}4Ud^wH~t,69he0n<*J6ڝXv%G;~"݃:QӮ Sr4 :6B5yrjR;uD.PCCo<u'mšq:p8c$S,7^L~F^{tPbM*SvdFSR&2l1+a}J8H9i$ .Bظ*/MZDs%])ɺ^d00 h16A_pnhp|iau=M==|6+ aw̫0ùҌLiv2=BzՔd7iXI?il73}ƅ!YnSr3܀#GGŧ}8gDioTN@a+eXnʡEx&1Zd;On> ףp= ףp= ףp= ףp= ףp= ף@P$ (k@C*焑 1_.@v:k #NJbxz&n2xW ?h@aQYȥo: '@ x9?P 6NgM"E@|o p+ŝ(lL672V߄@<\l: K{ΗԆ H½D PvU1P?@jкxc fҌ5]K1QkĄ)V|RAtt\^}%3l+QY 3vn;o#i{W9[qC;`JJ(0lC4Fr|MI8\2G@Y[aa9\sbp_HNa7y^Hz 7bhm>إڋyT% jvZzNNO. 1mnq9yBV-?$Ϋ)EʑF/,(lcNt)*Tyt V穌D|wA 5UaԯG[UuFRޏְx+}JM[~^9)Lo/MB_Nc ,^% B3K{R+w%1/TZT%Ҽ VM1Jo-)1, ``)>]m8t}dSZ7x\8Nttt8e Y冃U8I5Qzi&=hݴX[& f#p5(>M\Ƃb.r'ѝԟ/f!VIGq-M=\G0vFɇ{0[iY*x3Y 6i1/Dbo#/o(V =_ О%֑cq^ݝEkϦ Y E Kջ TžWFPAE$e%Hƚs*vl# RR "m7]* k(:.* uD+fh\niɹLU2B.e)22t%c';ߖVjd<^;_x^Z%1KvB'}# Wv 7fuXn}ޥSq,lfPyv 3]ʜVg| RxkgCgu@z%Y@8foFԼ~ /!QQB3|/! ,r͚{iex\@[n;)D NeA~d($>g2Q;$?h:Oo~27n@%JN, c a? FAbiC{)9y k<9K5Ib:f _Ms`(C͡IۺEJͶ`P8S Ae8nEcX{]@xқCRwT/hv?/u ~i=m:(ЎK1ǂ&)T z^S]zDuI2r^xp)r6ҰJ>%v+V|8J2k!1IGwI맛ܾ Cj\߄$ZR;\'iBn <4_&b_Js0){eq+·lVX{H?c~:N6Jy`B©lnZN*{qaz7X2 % pqጡFн}"ßeDf^F yIXDmey뜊Ҵ{UWQ!l\nHg~ߗ&D-Z^gmd]/~J|DRZ/D7y48>]~~0ˆ;UPApiFPF4;H^!j_k{24 ,`$4ׂC>,`n£#S37d`TR'镲 qhL7A`"~jtV-K7AQQQQQQgffffffffffffffffffffffffffffPd} Naz@KL^_5w|J!]RjtsH@zZИԯq Gb^X ;oDcE1uV@[klHV7|Cro7{:`c;i[_/imO@,uK@I@7voSmf+fYڒ^xYܽ9w~Q~Gd`_cAhiʸ:42ZhǷȁSlr4 rXB[/&L<^not@gAsS]!eo)=J@6p~f, < L.uw^1#pn _K\j޾gsL@ݓfd11p!Sz#vC'aO+h7i\jIN@x{̧XCB}@F Z5daނk *PhS=%"@r g7b f[T>ݒzy:R..A7v95 ~i_+y4.8F$ TfU$`k_Ԭ?C֣ ԙxe݇kO1lV?dTݔDerRMJG[n P |@nX$gq,=c%zR1dOiƑk}T88!eHA/byLQMY3 A!ش+Sh@y]DE#9?SJDjI.B@?:+B}Sj@ Fu?U2=>8 2DQȖdybFm9VPaU9KW{aDh N wE5ԦH{^Yrot:H孎cYSæ唖A؂GRՇRjrFޟ;5mAÈ[@rz~*|5:I0d‰)u_ j"S&&]@ ^lNJw%nGJnwi,n7fX_@T6eֲ_yL@WWQeEz\]yxVQżHb@wJREtNw L Sl}3po~NWd@ -{&Y !rP5yP"iР?qlT@v}2BMD!:Ii: ߠT.xi}HCMC@JЕ N{l@S tfV=@vE@l//O#oWlY,Ys= XB߉G,> G@B?v/$q5̽+ P [@*p1Vw \fH@uƣ\t@w͈|oĞ:]=:-nYK}.ZJ)J³.]Uwg}%}w_w꼗_L/3,Yhƭwa2z‰zk a) ;kZB4NݜeF][T!}rJJAɷ.Kd[m~XoTP@m$a25@@CmPHf1N6si\R^svA@W"hk;V6G[Ay4S"]-I-C.BԢkIIk|kC4m"U<$5]$9WD}:8.2n.`/آs X/SL]O)qFyzJ/*pa"_ݔ;Pr*Z@LC c !H@,vlis.# lT\X7ot#I@Zʼn=!gԟ.vr(R^K[ |1gK.3`µ>=y@Xk)ᗖ`FsMT>-!E{ @َЀk#cn3?OO@㗹1 Ч~V.@e@/w6Q@G'/ ק@2 2 sw?g[m¢_)S@gOLևB8V O6Kfrj,x^oS(U?ƂY,CH D@f7F8 2mQ@,l8`3W@Ai^6L-E3۳){Mo@HvbqKYĠ^#ZoG*zLr;ؗ7pap[/8, S&I@넖z| u@G"7E0.]9rvw%JybQbwaOt;qw_L?/]_Lq?vGeɻ2z'^͎8.bu=r`疥N2 PU/g$<} &ɉdװ4ǻ:nP'*c-/X@Zv~fH+Xe\R%v@^S]zDuI2r^u ~i=m:(ЎKnEcX{]@xۺEJͶ`<9K5Ib:f _MAbiC{@%JN, cg2Q;$?h:OD NeA~ ,r͚{ieԼ~ /!Q@Cgu@z%Y@v 3]ʜVgfuXn}ޥSx^Z%1KvB@%c';ߖVj@niɹLU k(:.* uDHƚs*vlKջ TžW%֑cq^ݝEbo#/oY*x3YVIGq-M=\G>M\Ƃb.r=hݴX[e Y冃U8I@7x\8Nt, ``)>]Ҽ VM1JB3K{R+w^9)Lo/MB_Tտ=hcL2ɦ8z@KU&:R-hbBK& b۽vNjxxqkwF_Š}"--"Ei:odNWWg-k7[XPrE]_ G@e zۘfaԯG[UuFR穌D|wAЌ?vG2DXOi٣k̑?T@OtLu]Ju]fC@5lCUBk?#9bmiwEV eOǍ_|xE@|r|" ̓mn@cNtgM@1&:>:T|<ȡ.vc@>zXs\O$d{q^[P@iP'5|e@D+H?{QF3j9df/A@ R?YӃKhfeGroS+ RIsBx%QQj@O^)@TiځpUu ͩ{ZD"GկtB,\mI5;r}W*m+ c;E?^8o@Kn#2tY %AO[Ta*G5!^UCȬr ]7 m[@ Ņ'5WdI@uf:֢mUXmu*DDWw]@j5*HB'Kݓ9.DaA=>xCa/@2`h%( L 2xޚ!{@2/C8t;0jNldiL`NY[V@!=5r{QE.hY>VPr^2>#nXSG~[˵XzFGFKpsjq \UZn: gfwCH|]; kPKt@0ynr(# ]+Z'Ra[ mJ>P53`w]2D_:-K[;56LD-aI|y$7$ƴa.SP_(0 NQ=1 |tR2d)>7]cEu[͇O$r̃Ƙ[Kf@pih0z,Q&LMb$wAR {Qh$st ~St:ºâ C@)d*90CkT7@>ZU@GF5.gD@[R>6m@|Ogu'2Wc *KFa44\D(i\ ypIйIpY]s#nsaGRZ}5,s@w4C#\@_X]ϵI@2 u@[{$ :҈m \Y^@|/ՔӊzKas"PLx)skG ` |]\zFnJM@G,h`pJ{w ib@',M vN%O6 GH%^D#~@rl~xNe(-Ve Q $lxI@@3F 8fNg)84 R lcojdB4#28BC:jfO/ގiT@@R gjTCn;F wl@XUK/8ŊWF Ao|E@vqa@co'0F3Y@A=Z?*zD1IGώ/]ee9r & _*?[Q=H8kOC,it@,AD i#Tp]W.jV=OCJd}CrV LwP<-j1i[xwK]ժ gb៻dGָN@1% }Z3QCVdOPN^3s>??4}@䖐q.gߦK71[pENjR@J<,Hjl BCe-AͪiQ芊8qUT@tS;-4''C j_H N+1l!mrUGV53$)~w>E!+ 㘿nLOzX?FGdيLsq@ՖGZlH@dGV,t@؟lz탧AE\yuYJ@[C_e5v@+5L뵠H+_@ Ak"+Ơ"L`:5Ej<y Nj"ta@qbA1gM@57"iq|Ɓc@*ưػgO Nt'n^_ػԤ)~/fZ݃r2 Q@Hl(Ξ&k@U$6ec U_O֘DNld%Xmr/Wx G*WE`ϒl8F@JfՔ[p;DRGKCCxY@ADGKNQUX[_beilosvy} #&)-037:=ADGKNQUX[_behlorvy| #&),036:=@DGJNQTX[^behlorvy| "&),036:=@DGJMQTW[^aehkoruy| "%),/369=@CGJMQTW[^aehknrux| "%),/269<@CFJMPTWZ^adhknrux| "%(,/269<@CFJMPTWZ]adgknqux{ !%(+/259<?CFIMPSWZ]adgknqux{~  !%(+/259<?BFILPSVZ]`dgjnqMRvꫨಡs'r/k}0Or,#rkiBXzBC]$F<#ݐp|k?OiS&S.mTtmLl[sFD׮zUih\',7hY bFmPl5A3qawocm3eǂԦR9YhgK뼓1:IyPfΗp $,xOV<-,V$@(-7V%Ȓ#ӗk]j59 .P2rī`zw}FY]G ͤi9d~[6V*yY9)r4d DG}Oq1v+X0D'ZG.?LNZv<ְ09TI)*r/a GXS' |OHSs<#O;Xz̶l蘗' 1Ii_Eyv%wL?G"=̱~@Cw:WU_OݙdML?P՟-I)zw1*ާR b,c% 3ZJO>%5Ѵ9'te$x޼._ѿpW]nB>L" ?0<l7gLtzC"f'4%͍<ʂ`PH^棐ZNU?Bqo6Aq|8Rd'[t&:F+M [&"=qc X6M ۽y{zx?9|yo^ $]wjw~'G%{ۥ6:LJRBiss0ǘDY/Q HjRgDP@:CAV&).Dg*216[7M9pP=@pJaHg2,_bu  PbnKyڭFΞ&kN=Z[|JGRbuIA#BF-͠0rG2'y{\yv,SZyɼNbdImpWz 7hK5q?.vHl(\ Nj"taH:x" ݭ3`:5Ej<yTZ-O$þu(L@TU Ak"+Ơ"L鰸{cmt.S_j+5L뵠H+_#ݦZhgMwTwTE[C_e5v6JuJ`+ʔTyuYJ\&Y];yt9)f؟lz탧AE\G0 5$||dGV,tyXT,4aNlHn3%c-4JSՖGZ<@&o-9A JAGdيLsqf^wHHNqɳ?FZBcλLOzXs^[& ֱP!+ 㘿n0XKQ&r@=53$)~w>E;a.J^V}!Ce-AͪiK-g25H&U0aCJ<,Hjl B2yQo|9ߦK71[pENjR!6~XD G 䖐q.g;_OJ gb'̅N^3s>??4}@6#e;#@'OP|}/l"7,Z3QCVd\ݗk1E18T]1% } cĴ>㞓T៻dGָN`n|ax_~&ڇe> gbrNCV>$50)M?{m[6ɇ4q))L6!e":m}p'BLHXMft;iQ}H `ne*QCfe]ժK>?M\87vXOQA ]Egǜᖏ`tn /E;NuhMY\y$d f:;PIf&|B-p =3v|g. v[>SX9L}[Mp s[ABz,ٮ.F ,[kb+gۮ< AgΒ~ZW7e2%F;@ڋeQݰ/&r3-ӄT46ne]c%底N-&i . -^ϔ].1p6 =prF*}OP5ey=:P [MO8t\cdd>8rLo<#鱀a`jcF3|RcG].1o<|"H;M^P'< q7crz ,L&Ja'$1_ NIً7\Jy.nP^!gŵS-v6yKF8dP $xAc^^ML<.#2_|^%vrvQ[ʾ1L_ʻCh/ Je|TT[7¬*qBL̋\b/j&)2mur:`sQPM_.di'L$7uKH5,dja&ԩ:1_-R^ZBw>./҈5d}CrV Lw/0Q@@\7 pЦW.jV=OCJ4}ePsEP,AD i#Tp]9~%P?3H8kOC,itdI 12ӇH -Q=HE+y)Zhq & _*?[,W5D>D9q&I%ώ/]ee9r{*Ϧ>  NwA=Z?*zD1IGJPN͔!Ց'0F3Y!NbQjJvqa@coO&qe@LF Ao|Er]p~PWe"jXUK/8ŊWCl̀ݖn;F wlF,J>r@R gjTCc5$ԛ2 fO/ގiT|fB->5T4#28BC:jI9ljԺ9 lcojdBi[;<-9ɫ)H,)84 RC"2JK 9JGg3Zw3F 8fNgj_Oc5s`* $lxI@ڸb0Õǐx>5(-Ve Quu{3{Brl~xNeh7b1ӎ6 GH%^D#~ Г@bC',M vN%O 'NxP,w ibp *r>zG,h`pJ{ YNϖg |]\zFnJM" w3P<ɀ)skG `+h@le `͓as"PLx[4ax0??F\`|/ՔӊzKqṦ!sx[{$ :҈m \Y^YhP<ͻ]imV2 u!-8A`Ùaqv_X]ϵIi8'4@QzHSw4C#\fAذQ(RZ}5,sܰO )z(U9]s#nsaG4bfXs)GIйIpYWA{@.гa44\D(i\ yp:6mV+s_пxT[GF5.gDH,ɞOw/T2T7@>ZUZw{ƺ#U^)d*90Ck* x6QUA}$Rt:ºâ C>uY&&$st ~Se%OYbR {Qhۤ?2`QQ7}&LMb$wAϣ4A@upih0z,QqÌ8>wП6`T̃Ƙ[KfMbDx)$r-]m\"ۤ*Eu[͇Ov90eǵtR2d)>7]c(|je s9Q=1 |B*O'.SP_(0 Nq5#1$7$ƴaO.aHN,Zvl}D-aI|ynü< c:-K[;56LI_9(u{v]2D_)rҙ{>P53`wnqZWPK#x"yn: gfwCHv.M+kW]+ \UZT:IyE4Kpsjq$,D(l?K1zFGF"-1/V03'HϨ^'YXSG~[˵X<$k'0S6q.hY>VPr^2>#nT8^T!=5r{QEe*GvlprdiL`NY[V>e048ٓ [Խ8t;0jNlGOC>h*hdVkE%>/Cga#MM5Mrꖮcc{T`9,Ibf²aaF<<ڽKe1/CD3f@F/t#PmR{gXneTP9plH4&/-ZxD~)`dy"ZNz}q!j<3 ~*L=N51L&U%ʥjvN5̡BU jo2x7m7|j5*HB'Kȕ<3wE*DDWw]:{${dnBuf:֢mUXmu ^M8%ȤNI Ņ'5WdIE@t` >M ]7 m[FWPAxzኂ5!^UCȬr6?db I̖ %AO[Ta*G/vRr:q:N['UKn#2tY:uT-N=!21{+?^8oEƿ=tk>zXs\OVΠ3UdLQ<ȡ.vcj=ۃ5`SH1&:>:T|3UbFOHir!/0]pWd>gM k4c)#;|L- Mm)"a.˅BkJL9q}QUȳjyl@jкxc fҌ5]KG0QkĄ)V|RAtt\^|%3l+QY 3v0m;o#i{W9[qC;`J<dI(0lC4Fr|MI8\K#2G@Y[aa9\s6Vap_HNa7y^Hëy 7bhm>إڋyT% jvZxzNNO. 1mnq09yBV-?$Ϋ)EʑF.,(lcNt)*Tyt V穌D|wA 5UaԯG[UuFRZNݏְx+}JM[~^9)Lo/MB_ Nc ,^% B3K{R+wDg$1/TZT%Ҽ VM1J1n-)1, ``)>]Ym8t}dSZ7x\8Ntجtt8e Y冃U8IX탸5Qzi&=hݴX[n& f#p5(>M\Ƃb.r$'ѝԟ/f!VIGq-M=\G 0vFɇ{0[iY*x3Y}Y 6i1/Dbo#/oW8'V =_ О%֑cq^ݝEmkϦ Y E Kջ TžWd HFPAE$e%Hƚs*vlM" RR "m7]* k(:.* uDVG*fh\niɹLU,Y2B.e)22t%c';ߖVj7d<^;_x^Z%1KvB'}# Wv 7fuXn}ޥSq,lfPyv 3]ʜVgmg2Q;$?h:O?n~27n@%JN, cOR a? FAbiC{qs)9y k<9K5Ib:f _MtNs`(C͡IۺEJͶ`bP8S Ae8nEcX{]@xKLқCRwT/hv?/u ~i=m:(ЎK0ǂ&)T z^S]zDuI2r^xp)r6ҰJ>%v+V|8J2k!1IGwI-|맛ܾ Cj\߄$ZR;\V8&iBn <4_&b_Js6I0){eq+·lVX{HD[>c~:N6Jy`B©lnZM*{qaz7X2 % p#MpጡFн}"ßeDf^Fk yIXDmey뜊Ҵ{UWhP!l\nHg~ߗ&D-Z^gmTd]/~J|DRZ/D6y48>]~~0ˆ;U=PApiFPF4;H^!j_kLz24 ,`$4ׂC3P>,`n£#S?߾37d`TR'镲 qhK7A`"~jtV-K7AQQQQQQQgfffffffffffffffffffffffffffffffPd} Naz@KL^_5w|J!]RjtsH@zZИԯq Gb^X ;oDcE1uV@[klHV7K~RKnG"7E0.])yC:'I넖z| u@<" ɪi89+/8, S&IPH+O{UoB;ؗ7pap[$""*Nx#*zLrUvO1+5VĠ^#ZoG V3EPkzT5+[HvbqKY(/,V$) }ݳ3۳){Moy֣0'."j0:wAi^6L-E@ׄ"č!Q@,l8`3W &+y|ihեJJf7F8 2m*˭5“aGn?ƂY,CH D5>òWW ,x^oS(U(#T_tߦ-g*8V O6KfrjzK<̀S:ngOLևBw1^K`H [m¢_)SU*B7?2#1ͳ2 2 sw?guڞIsdz(?`G'/ ק@ Fy[`O3Nx/w6QW5cWrxݣ_bV.@eB;Ԍ!kw\{㗹1 Ч~>YETJ}n3?OOVG6K]_܀ @َЀk#cMr[هÞtw!T>-!E{2p'K4:#H*4FsM.?Lq^!5AXk)ᗖ`NMQ6fn a Mґ.3`µ>=y\f-!p#K[ |1gKuo?&DyT_*Lr(R^e o)4_gZʼn=!gԟ.v{ᅜnyX7ot#IP[ZCl~aa .# lT\j!%0^H,vlis 4WT"ܗmLC c !HOg-=n)Xva"_ݔ;Pr*Z"ABxɕG3SfG=yzJ/*ph) tcL3/SL]O)qF<&?.`/آs XsqG?/ع}:8.2nAf k,q"')<$5]$9WDRjVυwW0IC4m"Ul`Cgp_bnv}[!.BԢkIIk|kC`j,3."]-I-CcT&z7=yk;V6G[Ay4S|)f04Y̧e/XlW"hF@W߈_^svA}iXŰ-kw1N6si\R܃`nD9EFCmPHfjR\6ŊcKEKm$a25@gv-|98*[m~XoTP@$xIۇ:fƴcrJJAɷ.KdP,. ۷)?̣ݜeF][T!}ۼef#ݧ_:}) ;kZB4N@,(Ցw^]%‰zk aGrJv+./3,Yhƭwa2zjnZƇie0w꼗_L/ 1哸)j'?R.}g}%}w_fLc߸&y)J³.]Uw O^k3rWA00=:-nYK}.ZJh5n@լQ gAY*p1Vw \fHʱ5̽+ P [gȔ=^{!1\B?v/$qxRz,ޑ9B߉G,> G\5WS tfVDS(BNystbmJЕ N{l۪7YY Lj}!.xi}HCMCEgB#N)%: ߠTفlvU%TtMD!:Ii\'KŃ5m]ʴM>Bq^'لxJ4\ƜmRq}v6q,]/|J aYgfA ¦B\zfzZx6Td4@rx,P}xR 8kC|N+:G7G'a*"vkYE[qň =)B{8p!K`D'K,{4Gvf90#`vY-RA%n٢QȀkB0X! Q y uL#>2 RDG[ VDivu.98FN[O1dڏ/C.+ džXZ2F> ks{'h:ʵxn%Fb7Ul^dK)E=o퉠{Յ&c_sV́~_KjNiJ'*#-}l oBBk0Ԏ8@v}2P"i|ZF;+n7{;Uv&HAgcb IZ &|.[5[rR݂ɞ흌$lGU0\q!gq>!T 05ySæ唖A؂G UړǚK%v t:H孎cYQиy.lQ 5ԦH{^Yros7#BG{aDh N wE7c0&lSӜؔ9VPaU9KW|֫Py( :QȖdybFm]fkcKrhI2=>8 2D@?JG[n P |9GytSFA Zy>erRM) .Rѱ~g`)`NtKl:Hf"vF1gny%y|W(v @ B C K [򚤝Pq& H Sl"Ö%AS^ 0MZϐhsnѕ¨"Nv1o/ (&PMZr]墝y)IJ{,Q見垤`!ɝ: s1 m\w%oo+S}j<3bNMsRjw6ST#bE3À05H;gpE'h),`j2@0X K|BZ ̖083P9<(2)p?>SZzc?=mY*FE|$(p ~;O1mM //^$XCW2h? }ݒzy:R'.,\mfjr g7b fY/[;YD3"hS=%"@/{t2JlpU~k1aނk *P\rk]S}F Z5dy(Vu3ORG\x{̧XCB}LUuɯC O+h7i\jIN_@O0P70d#vC'av#ط<) $E|}`ݓfd11p!SzJ]ZP6 NK\j޾gsLdK5op')a^1#pn _>K9ۨ1[s:V6p~f, < L.uw5w*?3(L!eo)=J nD2_]sgAsS]I\[`4y\A>otcZy (_ *n&?f EHZwYq&`W.tV @(#[k1կ p8-Bszӑ rб|q>nsC\ic,$;S"3G^JPTC|)72fi뚝Yj& yR);VOGUT pι5Y۾Rd9L4]B!T^=!/n#gnH8'4))i *6Js6Zƭz[kWsC*44bGb ,vy1z(Ju YFK䶙cAjS )ry,jS٥uɍ^$@ӼDP3K8PPԧ +X][k+i ^Fddɑ˵.W5ju(W9|Uw0~;>#w®f4S2?G[+ݬ9Xsh> ;ݕ ^"#PCe`Day&'O-߉T; WvjkX$뇔~xA0V)FEn'9,=Tf[ ZVtKט椴/ "<;&i@X ? Ρ *w/C'LCuoNAO;BpSHJsA1 i~Yن-V%'Lhڜвy}K0GkA%2ccr*l _㸹7MYF.p;5;?Ԃց=R@])! qcLLtNMgbs)4"(hB^k|_Qn +zsR3`Aí&deМl8seb Z_Q0$3~/B~:ćFRz(f1a8ln/IǠ*}bȺo $j1JAʢ{Hu@{zJ=ShtqbDE pMIHQNY*&QW9{-̝[.g&~:5A0c%ǭJ?EC:[R<}Y74lG ʕ6ٕJ%dE5z¢3H<{= B1OI /kABs@ ڌ1e#z$:dC`hI'WhOGިV$3>T=Ûl"Y n:Xk?\.Miv cf.ukc!IwF9jX)8~tX0#DZn@d^_ f")ң!n<,բ%գP5wΡ7j jJ-8Ņ7efnVRV!B"0gI҂n6w#"7gS-"[iv+<ۆ# +&h`jrTX}6 zh Ez68uhܳ˧4G['kI"FCɂ`ýQ2*Xo?*~1H|c94- Bl6.KB^`ngO5@O' ->@OGc1Xn:|!#fPP#_kI;)k$CBcG+\R4^>LM L Pٸ]ڠ3&6 Qt Ei}H]~0CH$x D>?lt#I+:=,*{0[E{fpnĈoef M$Lܒ1P j#Qa-q { [ԏ#CE~lE83/Grv _a$$'_idt#XjUz-p1]sDs'= Q,9E tx( `uPq_Le7 %(K9 ƞ\ɚz ?߻O"owiGwƳ{@ِת#G+e Y/$R62BG2޵ew{ s()ѝxݓ!|U#UЏr(tEExC*oW[/+lϡ2іVàfU W4Υ3GS $*[!Bz$`Gf!AO|(7qjoӥ-E)c@?,rRrrKH8f \3a[G3tB'/9> eeyjYtxIzڧ@N(E6_ozXɨ!+a2n]ւ˵v̢HuEE>1bZuqɿeQ*m[mi#k\'F0y7RNC/?tHCղD31W|Wm9]'!TpQ蔊&hg=VCK] S2>8@p&$Y,&3ٝ(ԾUD~NXP 0mo2 q(PšnjUM'd!W;`ME~-Q)&о&t9I !EjG9;qB,H3"$,.l4Ms# xDvfƝ7@*-{f,0 0 8EWm!&u$xYs7}]\C8I.2x@P"9s.n }>VPd+r9M 3gTi+%d֟6LrnCp?gxɀTa[K^^#", QۘIT δB92^`=߬* h%?jS!:"ǾusX5a#kqg gԔğA&hSB.[sИ7x>u&y/C_zӸ1PE~ %0XwůXBy~֛^P.iS;O9;(-e_ZrJMxơM%ny>p~ ݏa^8 a}&D._5 Uދq\sbL _9{(A(j&/e{4&Λ%$sQrE0T{~ZAØB)/-s;i%DV~[qz8DڡOis 2WuKY/='le59|ozCE)$$ '$ۉ 䙕YV^3sveM(6.Q\ 'dr]! w()4):e!(0ZNy޴iДrDH|k? *2w|lqg@W":OZ[FO,>@hVNB1N F0'Pvl:S=A/?X*$0 rJ i^ Q REվN.kE5m<=CGw"ǼCΥA)[GSKEF]bKAE&AqR(-;Q5/Y_Z3fIvp' E\!9;{(H [ .nJi8hSyMç!`%}2ZqIGFB(s ]U*.Anpb(ܟ$Ri5!4f:w C_$sѨ؞$"<Nw-4ܸPu/KJٟ-" "8A礒gǗ2ݜZ9> PgSuRlO # zARfJf Ԑȓfgzl,PNQR'Qͨ 5%8~Y0}~7's2  &At#|>O"9.Of?䫲o5R,*bł+!z6cf@OVnUf7uAvc6T t?qJG%u9u)Sy35*!2jOML{nGH3oG´}*D3da?YJ!!5 $~~ߜPgjx}6{Ώ752! $@}~)"l3^KBP#`pUn's3/'1GFo90L6Sofk bmh1IWcH<h+ 2Ʌ(:}=m|Z G!9|Bpt<2j 4]R C ~1ΘiG#L/ Q?B@zSN tހ c];'rXhbݮ`.^=O7&ûp(pAd #N0]gj` 62х~9w(ol&b<.B&BdtH+VV̧Jίҭ}`X 6P?P/N<ୣ iR"$dOsa T*YKSD} *=cP*tޔhf5L^rW: AoaaQ@!:, BqSHVN˹Te?)GI2rMا ہ,X1A)a=(_4m{0(׾\&1yD @ I S s:44OpW(˸aF;gv0IAA~cl-%3s&WfT"_]|q9e?_XN6.mt{C|X'vnaZy2ZK)?1|Jz>q52ˈ?sچBZo>LnrB f!~ӧ)CAOHi' Sx鸿ȑSncZ0X'0$oa-;>vI$<a^v\1xQ%v&wE:=t;^D}ET/ysW9 LQ= V{_;8i+år70-6%R6R4h9[XӼz79.hf>feEr.YG5%:c:?;1DD7X̻!W$qPIي&땵Ʉdf`.*jkm-*N[jeV[89oD8PGy"yv%vO#e{}#ۘ+vgT,_)#L`\,U|ݵ)v,+(9/t7koQO/`Z|o"[qF f#;6m89T4&[aKĭR+ N?ɃG-q:^5Y'6p!4^Rl\R+5QĢ[!&&vO9fuK汱N*p`}Cp1PaְS#DǿR`m4F\.*fo'>nNܷ2X2 !WiF Ա' b;ӥ?n?P)-p!HIHϜIi3F1t^ԏV_!n 3G }:Ƒ@3,2 X( t8PR$Re-@l"L0 ?o2D5Nn$c%CA ٻM}"A+.S=n=`OQj2 :3kJ*:Tp&ђdR@[њ+$" f:M[0qc&Юs-+ rguN<pEAs*w!dV9FɟUT}` $vfˈQꧭz0#bk)9߸K@%Y|:~,:sн^V_ ]7d [Nn(㎪_m϶{"r҉27JڂyE+>=&G,[,Bz8];{W:q!beg6G&Vxi{ՉlC:vT]-"دkփ:JlG`Fɧpu 4@*Λd= Q]GYWL(Qf5a!^ƥz,Xqv)[$a_!)e7O7͎TT3Ӳ#n9g)'t>o#_2)A%4Ÿێ12  2 \#rt/ @܎~˟(o37^Rm(ʓM^2ʼ@3&* a28aI?U {|qXE5}Krv = .'~+gЙ*[W{&(n\GTPLy1]D@r)JieW*>*H1'4Fa23Rmv&y51́甑>ZXs0}@b!vpPp*Y<_y ^NhT1jYa3wiFš.X%Cbbj+D Hra:rA:m/TcD(ڎjH@I;7ꑴ=YH٫-h¸! %feEe!MoV9&$Q.M~IW#j ,Dǂ.c908﯍^VB$k0қ׊qln]/$<16REѼƂ+ |5;-[Q 9>67I2YlSi?ٲZ/><"Hi%phϋHxM"+.L îs]*!~5@2O Α/n:Q:..!>dעC̪B6 5OizN*>eTUCt)MhFc,4F8od<:+  TFOE WXyԪHuK0׊֭:#)-fhkX~aœ Y5%D arմ!1w[<XuQU\;'K "jTr ! S*G4 1)dzyG̦-E t&!/ЅP1XYyQc%=p;3z חO n iyw&j%_}㔎ɘTW0XUV_.d}6?]:>)-+\;Sߛcubk,{X>t҉)c8xg63 ւR`i;.eNQG373 `)<ѵ3!: =ˬs paG37F@Sj`Ih ?(5ߟc(![ώfM2ow.ss -"[b2|a?b q2Hp|rM3xm4'T7Ma?Z7OgʀMv']1')`{ΰo#H`oNT=9Ô%琘̿AW$BMcn_|!~oB-.+m4H!I[ljb Vx/e9$L͔=2RMC6+=_$-D1?'d%g0!6WB 7 - &=8@0=b|iʄЄK8[8pP#^َ>ft O2"[3/#6r< $,2οZe)M\"K<_ZX`]OSOJp?sa* b( pn4#(#FL^y55GS=MEClpimkA!q@H0[wT 7k)o_Q|a2U0*DJY8m4S㥛 rh|?5^I +S㥛 (\(\(\(\(\(\(43333333333333333333333333333333@(2>'0 =%&/ʚ;@@%.D)5:9a$ =y-hL8o#@ h,ڂ7z"ȱ"k:^+ŭ56$ !Z*@h;4(!PXT!ridn[)3a%>^O TBc(As|2@H`?|g- jkq' [8DM1̱7=W„&lA%06Үp/< =bC-T%hUE:8/sWIS:@r34n$gR|k@-tA3g[1e9 #" hfή:2#mp B?D6d%u@'C_N*`;1@ʔia"b58J:>h:'}]!&>~q/O0M{Q"lj<qk8bݥsv%DŨ/GT;2Sz/qR)>1uX;M;O2#>>W%H 8ъT yu].ZH/)e*6Qr*9@8ssQzU"N9$P,Po/Z7")DG-,8etK1js&8"(sy?"(ح_# *KRWij+2#N7,ĭ{DE7xAIӧLZ1 o"@#בQ=߰pe^NK.+Lv":A^ 5Uh\{. hZ6:m&+!llj53Z 1oĈ5+*TZd0$B l4st>xIv٪# ُj:"NF$nܕԏUh2.)@r6FWSjWy3hGb8= mV V^؂, BzF` MqlkXu]|7(XxOBa:Gsr\uD2 wnVc5q(*R>t*> Yú9sE'5ML/tfGP~G1@U3g!¹Cٸ;ѣ2@Y]]=HuY4T겇b/Z&o 餟i0v'Zѻ/@NjYE]: ]PdU4B O)KZ$et7RcK0- {mr'Y~ۂ^p=&9@kz*d}WobP/ύf-#F"5\- {${;C1ߥ,@+Y͙YK=W7 [s5 4x^/}&VȖ"kB1fƐ^\UB^(A6akz+<4vu%%3қzz#{6{IVңi7EcAB,!?M"T̿aYܫ\ DgR)`*a*ǿ/oӖ3F+'ztpx95Jz]%Df)l7ڳH&pC!ݘMuI/եzt$G6a/L)*H{J\Yſ;3:mOͤc񌎹z0ϣcS| H-0\пy'<Ìxݻfh(̀+9s/X1o}+Gj C2V!vGkjƐ;=\ܘr?Lt" |zQ%f7wvSqħ' RW#٥./n@UxlGTh@1֎&-aOO:컉F*GYi"=F%^sqsVlz#^ׁQZչ&SaК YMKKh0}Ϧ(37Uys񰄁&Ho0Z^P]PEh7!U358f]GR_+Ae")5+»ƿUȫr$E!Av*s6j/k17VOtjр$55!EB~5ljp斤!1QV\HC߼5+̭ )ek3BӲI6P?+{4o# Ooį zR9LJ]ZX 4K,b䋵ۻri'׹4jq)A^7{j!M($ @35).bE 1JեâIw%6UR0VH APOJt [-|?Z (c xj$CQc1k9%[O%rT 2{([PŇn2#->Mm2t/c5^-\j'O OVDZFDõx0{Wk9%[Z_4ֻ0F=5F7[nCܲx^˻Nfu/&I5)>Cվ־/]~o\Zxg<`n%o;'5Lx `e,>J%4C7 _j(yfD\>7bO]X.wEˡ gjU:QtD: mZ,+Qz珳άBp.j$]MPquXgfdsHXSޕJ-`dJMu/ِ.hV;e]8q~NP)DspZ#E~zk#kb3 *1+;c+[ǬYt,pz(tkhf六7ħlX`h9>VRw"чn4Cc.ȍ+橆kR3i+I")!<9:16%`Ti=D6nZ,tpcľB4>A޿!ʢ3xבb |u끅N JoPe*{}@։M6;**:We&|Eˋ4m.%vKZMXem _&!blBv[rp%d`P c6f)>g;Sk.Y>3W3 actW!.@=;FG_=RkX ,hF9|Qi9\Jn(7@GܥG?@^fa(2E~SY0Ԝ6ޫyͲ,?+ 5A3у*)"jkl{'Lr $56t?n"EZ1reLK(wm‘CQɕ'U'樜=˧)/y L;ʒ!8M؏!&z|c*20.Y]cW[uG(Q[|?<'ݭ`W:E}Yl,iy%pTYڸ#i$ݯwgW!Eem/go)L&mԛiUA-CjV:ɕj:d <}OKh5!QZ_[>DF^# R \kj0w`M;صd,MϢЭs8։bnZIN=8%0LX%Z#;3][X%#1/|_.\l e4ή)Y+r:!93:-g 0^Zto6)5֚Q$~8x -[Į1)d*HM2oLquA4Bi ?ӧMpE0;笉@ 7lΨQAC`LGd@W !\(wĄ<ȅ:Tx }}{L)33K:'ÇiVg_KTh] @?}Goɭ4aCHoZh'ݧvrU<(Tt q1Njb*7&iQM K>$ T"}e)2_P1& שdq 9A~ $vdb0iLM&OP1`T <,/౎ܢތܰT޼&wf Y^-K-K05jzl/@gQnwXh; hY3#c krq4u!% U/";Oe[i.ePB*{+\ A7m>rnp!G: RioQ`о$&g(E6uB$_9%xxn*@ r֟WS-1EG~>% x!+%w-8:#i~Wty?:ߜwji# 쭧2_^ˡj ]kcC,PgQ#v9K=K4FZfkWx)!jYqi"YcZDYCShiƟ8Tt6*ac{k/ŕ/hD( j4][>@pZ- ѪBdy$H 4ͱP sۤ-OUj>X-ښ-9)nAdONONCxY*DM.y39 QJZq* RuKѤ|X٠&;X%ʇc"KP'ÞN˦e&;nIJiS(b^$1t!~ICS[,v,Y+(ֲ"um= dNj5jVg@;*xh2kůid& }1DÑ,YѼ4BBO3,/Mܽ,_4w/QWl;#?7;mc콒Vc>YkR6B~%T:EIXv$hm7,dF[).#i$;.HE7}{q[Hb2DUc:> wu<\yMB.&9m=O K$$Ԓ .yp #ϝa-@wqw.& GLCEz59l? ݷ ,ЩarJˠEl#*IcM ;D{:VDZ,)uh\z¼`I_OIUIjS= M,97:Iyu܍n!q#սm"'"1wSq6ʩiklJ +a(0誜+j>~Ux <†(duy2<16.5K1B9$b_eb"qbx/G᭺?nww~*[H烅VVwYYϟJU^G5XprTZc%Nw$L!7: O[雰M<ڼJՀ)pb~rg+AalZJ )4Ui{X禬Z +`2rpBxDZ+m|Ҡ}@<(58l SfM*]2[CƏGCG t8D4H5uԾ?۹ ,p&H*  A)EW'R􏬷͔0L54OP,8_1ǝgea|]!B-ev[>€#w~<@m)u G<2JLdz9)&D`씄^LPq )tR G G\_؇3u00y'%6_K3g;#Y3™D1C'g&9K)`B)N]G1ɢa@Q_$3j}a05}{ }~vz%w>!-@fKEiBy|\Z(Wi8SOA-@=̍z¶XA#h">B8L?񝧘6KsZw,ۡRFm>3Ph}Zq7(E@sydB2AznFln"s率З=Qs~U X6 +ġr LX%PQ_LC5aW3c{/uj֟!gaa9A&:-<{*g&:i|F̧o4v.5$'0ՉI w 2;zB` 0;K[U ">0II3S)=%s-(Cv'%.G5`o_3s9&nзC8԰U8K7y/ OĥmT­ +8?3&T;fs; &2÷T%@az9c Xt9Ʃ.PD$ s-Y S[ʼ Q  7T:V-N/yU 7tݢt$^8IMay{T:~+xQ Gˑ-X\!WZ]vV9fXy>8rFs!1vXz? #NGXO%(!>DyT4܏u`,%g(HW&R7NR [F4Rqg_L)72q7 ѿ[qZXƑ 3pI|)zkA=t& CEb8!Iҳ5jҠx:\rB-* a_+L*pU׀J?i"pTE_2T?4c *QsC@/Mz6hls͙%a+<H)<C,:Tc3 JͲDO.=C6 ? T^F̦GSvDi1U=R!uRjKt1E!9 !O ƿ<_i[N?| t8fLT|S7 ;Qd֩ WK*'t![oê?ϨMŢMKA|Jk~qG c;f~ o1m ͱb-; [5IlbH$^a¸#ˈt4j@z]DuEva_*Jgn;!@n%M3cq:~XL=Y)Z1:*@3vb dU{f)qt޴`9BjfǁΙQd9>ːr&1c@[.6, %iiV;ìTHV!EhiyV5LC*a(5P)/b""S tK7ЙReYOG-BGXD {9ߊil nzn^†DvXkjĊ`y3>V#@@XFixlάn &GJ|zl;dR Wʪq#Gbnջ'qг$},ُ0H}z*{&e.ܑ c}Ap2FşʚڪU}j6h^׈!b( AK,NU4|=_ٞ+jlk tG?+_VVDV)EޕxCEP!Qit"k8;M5)#-pLϋyć_ 1\:$|2'Iȭ@0T,mf{}&6>G _b m_%QIoN$]oP:[Peįyq[{jY:'e>zla^z52toiȪn\xg$uP^DgMٛCsKЅ>v_q)<@+Af00z g&pbfi 3 ק)˙w6_ g!<_%:McL`z:]8܀yGҫ3*ӰIW)ۧcyBJKۯҞ#b_7?Q1T騁GM, IS W/S5D;8%xBĵ*j/<-Qi!YcWs":J_87ESr`[YkbI(D6BU\ۦywbrr!omwA%PJ5{uY5.@i/GjTLjY"=SM(rp1+u׭H2'Es"h.[)m9Y$Kx<.|G"o{K$0S+Eܱ˰췼N'Vc6q78V$ OaqObxǃnKQ4*>!eENUSE8NckB@7>UUΙFIwD BEmTV@훧^f*veCxC;*gWC;&+q%E6tg^3ʐ7A/dC!Y3Y7ig(Lo)oG_Hc=C&&r`>۞F 2Hk&*:axxpUM``'ɻ+c M"|cIAg-mKj$lTP#7ϗ^~x,PPCKKtd-sVioM*HOxVIMmӛ a-ؘ7E}׽B Ɲv1Xjݐ<ɽ#Kڮ#:Mm\a~q=T2D1`10׵dOCpƟF^fL:_R+ :;1"0PMb+[=^TNH|f&{姓=pOaS(' \rVK!F Prxh;4goZr-\%eH(Ζ}!@ bM&,gאЃN(>ms@  d$/ 2O"|HX( 2 f'@TERۤC,Iz&:^c9[A-O4.|'}e ]S ?AQpJ{'7lw\zbh{o_.V/M} )ב*fRT'_E 1܅7,ޅ<}Ӽk;51uF7>U \!&޹4Y;[}ʗJK.*Ea;F!~61i9E,x+HщvNmԞ? u x"|Z*`hbyHxVUwL c~N3H} ܵw5J^_ м^;UNa7^w\MpcfoxF>c^! nL}3K89NoC 1 -%k8C,L7&|Iw&xk!,b6S PhKo+mU%Ck"$eG޽D4kx}Mԡc:i &/d1nJ"X;2!Jб'[|j!w [RۓIcw^=Cm,.w?-Hz]&e/ZJ՞Z ԘʕQ{~wy;6At˒R!ɱ]D 5~B3BK 25T>\ Z_ (ĩg:vvꥐ 2_k^gfsmGþ;4·[ie/_~1 2Srr|ɁGPyV+@hǶxlhA3 r$stψ)1p͸ Z?*_' |qِC0p$@yy&Ei"3$3.gq;u&m']D~xLWbтj}Nt50̹awR}  2N,q[ Sb <_E7LD#,裛ң67# |DRaB+lpLϖ7PWW4_s(FL\L^Ҧ P%PqORix@?TT`Ƈ\-)2Af=`v@g೪"j\1珈O(|BOڠl~@ΥFfHd Wn8kx}mZ ,ei1{39Vm#'t/)vE$9?? 7LĴWB.e j]yvhַ7nT-I+@$&IՇ|3[nw9M\S!7,aw2`hOVGh%Yj t9 QG\U:zAt9-"]x K-|<+Wֱ4%FWGkU[Ayy"1;€˝NoU" KԿzIIʹ!:ok.AuH!iX5*m i'z#:fFP"$Ȃ. ͐ }Pk* _f  YZոy "0S2#J5ZUaRگy]{?PuˆAbŘD],hm4X7z|iK؆WFh,Ȗs!DM%sW$7>H\$Ryr2le(Ca{.@<>BoX3c{24ٛX /[0:#{o|>~X`p62bdNF3_`fqэMA\A>b#[| +!#`5O]4%Gm&&ghEílWQl|G&$V09U9(T2wME-wǹ o-oai<'%DW?YZUE)bEa0 f"h&H8n ]:~\`01wd=J#'Rfyd;qD+ͼN|#0d Crcn Pζʳ5(%zWD" uG'F- ĺwLAI8@i,#AeciOQ\O? tr236l4SOy^#M*A~U">2N/;t0 $0PKÚY`Zso^6zLH\{ͿB^/=} 3Pdű3$Ȩw@P[K ~Ji LMkec#l᮫r#%VmR[&JhOg޽6qC 'Xrm/F(Z83tPўvZN=ʽp*JJa͆՗bH-3M8XsHN\':\Ƌ8g"!bk<`QE" -ˁor!\*>gFt}wm1x2).Hj_=6K2:pdK}<f'P<0!=` ybN/a . Y @w$86ޚD4S$n{'CPAy^?" Y),jhNozC!l"q.iN}p}NGe%Tc&qdȺ<>m0螳LmdSv)O$ZSpWHu+! ms#2̏s4WzspΎ[JM,:RAZq_0W{'MLgg> SXgdpn:ju3E_ɓp%>5n&TocUҲv_K&[ye5U.-#<"}nJNçd%Yj3>,S=Qw!5I˗nkF-Z% ]IkOF!KԹHс<ZrĤ1hTkPZZr"J ˒q*kޮD"'O{YE,0n.&~BuXOtz56z3\!Ӫ1稈Z:rAt-$<^;šZPcK+~k iB:XXe"qDn kmϫq ~%q"I_&JssZ蠲u\] *`M |1R@"DhMZ9ug9t:Ļ\hsawݔ6l}S0Zk\+K+xux-xC&/#`$Ȼ`ωYOblɳ ;-G {u콭{c?E1/eWkQZ&Tyg"pTx 햎įYA-=nEs7&ͽ$j_),Xp=|XWODX"z|Ep ezȂ0 G;l\7Ԕl/lq}ƅCwV'1I7#z ?ATOټ̹4 ٕpa]M?(V XkHSٳy#.Dz8OFsT%h9ƥotiq<X8m *Z0NƽnȫH q}} MddtS HV PPܭlGƯ"ض̿Gp8&_ҵX݌h̄Z5/`{XÀgݫ65-o4Vv):W.)x'^!pQFR=& U=Q.5=+2@qXx1 (K'-OGsޚa?HuLHl| f4_Y&CplM bΌG Մ~أ8<Ǫ!n1W&Xhx<ÔX⬆` jCϳx RR$ z_Bշq=KX :1D vNTvm Ͱ^t|So:qT)L*HCȜ/g=*:l5[IY1a#M&ێˁ3,i o4d%zg^W~ ]zrv0b԰N[d8Ol'rw|ۂ\ة#-7Zy!WHTuMOyiBuө*|˜[+jyXJ~Vʔ C1VŪ8Eo Tޝl%JvV .+9WIm-Fy!tې2󊞶C.@[~%4* ƌԹvzzFcy^/EbHIҵR K%"HyoTqtTu3YCP'%\+­ nkaMxj|Wk"`UXe/w<"IQB\ֿm"}/3ix`Fʐ$h(T`vm[,@tSSFW|#Uui8ɂf++y & f7CĬ(pz!E6#4qMkё(*', asC@D#5Հϙz6k3r.QF:8.*﯃yF-XR復X&6{Ndܭ[=* 崃WyUϖ ]ia=uQ@& lA|vF,cּ37EG+#|HE), մOnF= SMd@_rb& Դk=T>?0"2]efm[aIF pmkL]qeS"9z)K c+EG]Kн )n%Gڗp$9Nn>]Ycq־2Rv.(^+JXZT.x?FRvƮdk+ ҋP(3@DFs2ӲL68 \)up{,|}:6UM-/?+Ԫ uG1vUe]Pl'<BwNV%qWB|]ضf"+10/*(WLE)TSgyCM^TuaB5~7K/V2h-~9d.%x[S$@2~,Iv>Ou`6ɬWZFUݐC+#FHkG} .68F~1q^ɇL0v <])wNcˌ=%O!h 4z:;rhs\k.x,2}VJXc[W^4lݰ_%c!v)JZQ;^^c ɑ0+)ޟ|ArU~:}0Y!g׾wz.dMde*m]<=QL" O~o00tN#nr2&mS}80K꫷{gAxcg˔=YB-n@sE!!y30^~HHCI}4&0@ABE2њj݊ft";ɝUNp5gUm>;\/;˕(Wg/Awxz.i?zʲhpJTa i;`v p =k׬) I#|$nh>LA$ chOi;SrkȹWqv${may'м8L:{5c-Hp+/`4zO$@m"Ɛ.h:K3y Sș )taHvCGn)|5#rhu-O(,+Iv$ c" _PC= |pҖ˸H &A֓D4::{#A)m+oIixן!$A!BnLN:4Xlܲ# sҐ*UTǷҩ)EsfT!I9UT܆9V!Tؠ rax+vw\(HS_$C@h2em[Ƿ"_Q$i4eLtTQ_8]9CLܔ`_~m}I pCML$` 8F2iA)k׎v!gT #y+5r 938(o(Q, t83#25>{QY*5/Av*vj3:JD#j@J-F̪ o+A8pU]l d9#\yԛÔ:%.vIwk.ZR]Y^dJ\O~P0_QE@ A(dnf֯I^EQxY3J7(A`qΤݾ33V a> ,XFKی & 2?(t@jӘC9Sæ!'Q )hR8t7or.iƕÒra(t=]dJ{JPlNjFsե/~檳p<42U)vӖЪlܫ+7DĂg`yҚhCeaL_BSiဣ>6gfJj z?ۗA}U.38IF"dw3%(`7fnӧfse-uN7.î""K &}k5/i*kQ~YC""V&,GlNcp+rJzYMq(MvX^.G0>Z ^ Grcffq[fu1Yf zIaV^)Y404ﺥzːna]]oȷsXn%,#J:{#8q`*.x]O,U,yֲk\^0[㥋5CZIRQ +4[˨SQ=k5SStCTˠ;:48cДڤQ*wsݖU#C_\wqe-:Fݝ7qJC5J~ZC;*`09՗,-D .DFiRʗT\g00DY`YiGlZzzO:Tl#͒̐M^ z ױaDKcwnRy J-i6<Pܮ?v&]f+1k2H~Q 5y-8W1!B (ߍ |~qL>HSIZ8@ ewmxmo-vn%-L"HWe=lG'KPy#) EGuh=7H0ѐOZs HB">K+mgΉh W$}*m:9;T}'|I*շ$ dm_ݞn0/~d}9&.EcwPL1.lOhŦ֍$`ݜ?  N򍬕LweӧEt>( DL jw]vAXb i_:ΩUN;TLy>b \"dDD'vKaN}PR+AMT)?d|fiJuE>e` quKԖ?桍}%>x\ do nmjZ #&# X$UHdO0ɟywVB8wה\xέ`_fm: WIMLQ${{׵ +ֆ+vXq"\FcU+- dtfI6W;PL%:Lɕ@p׆ń2]n_HXL29̨9$!QFA<3ڃ ‘{iH3Ѥq h{xhA@Z b` # "C^ UgּHiKݱ3I ! [)L6qA|F+'4çSQI S=ܝ `Q%9apb `A YfHb>)h.,SjajBqUdao..2nhZتh}swWS0ijtiC })ͨ!8 Saj~2,Ԩ>N˺r 29 /Vr(nǩ&AKP%l!^^Ys{-~ /Y|C?N1DTG0i$ r'LjCl <[<6b+za@ZvruafI^(ĖN>c \Ԋ1(JqbZSn;:TmNDuOE .vWi+&%ZD(6ڌ!MAwUM j9IL94<fm@ѣU]/b}@{l.6/NP_z+r+]e#Ufo5k3l_!#2<VL_af=rx*G桴Ȏ8$m_͓UE낰nWlq+ޝ"&%%:Gu/ ow"w4_(~,i !et׀JπNy_sD3[JfUnPtZI;X@ HԹ,"bҬfs<;چ\iG`)kvTşNV+]IBB>x3V 3-=&NTI/d rCUNJwmϩDqp3uuIJmO*:Ws{R lz(_-AMJ|s$`Zq;¶HdW\ɧj~Ib>"ѨVE6-XoW>M_SWYHqku&t2"+A|ױP4 gcF*t;:Sȸk)$^.9A_~,vX}giW+ׯ0ru&&(׎KN~Q> Fr 18 unn)^Xf9ӺF?01pQO&At 6,33>ښ #\G\˝{OxhӤgL`TrBRp7O ԳvY, GsTW}lCuj1aCWV 6:Z$zV9_ `ax3Lo_+N`\7*/g=@&53I͓Xq3=Lnzs'0gp?!Sߘ^V6 H׷G=ޑopl۞&sy%dG_>~(aa۶1ky|۷-]Pgƿمkmvzw~kK=.5cǪE#<7stһ7D_A,c<~W6⟐e2uH@Q(93D 8ǥiaz\H.q<i^l'|i}~KW<0{$ ; 2vܧ1So^0gS~}ʳ>M X"n)2ץmF\oՋkc|UyrJׄwHwǎ;~Avdz,9rse+`.(E6`mm^{Ƹ W$1'!SD_yC9AB-eiuZi35@+4+۳!͖o*iIVN׫K~!0m+q 32}Ie}gr0 3AMZ>n1k9|ؗk|Ox0 zycrWZהǖ[AtwlE5i|TJ;kn2cw:IvHaŪԪr֤ڲ$Ӟ4JP(uԽs V A"oy'ӖJX{oIܫ ,'erGM#tQV4aVG*Ax7]kCh' '_̣/iLqRh 2!FPe8G@R 8,r73=`#( jbr4֢-R"a[{E$Nv@ >/nРJv\1;>K}'2R/&6PP>MqYb z y&Ox=ynh=ӕ )@ oV]UY77}EwG,d~=d|Y3mǠ ]lM;K+'K8Ѽ *%Z:ƵǪtFH`bklU:q69#)$nn3_!Dhd%%G]MUPGwұIWDNxYꂿl@y`Uf Wa"LDhX4iKl@p=*ȠTa!|:O262!4`1Nʴ[+(' ï" GwB,N?zቴф*7;4JT ,4&M*wTE BI_v7J!R@_i΀8BJtΰz4zh;4>ZbMҧȆ/!l{P >1٭1bSKP ߤQ2DBK}u؛zk*Z6Ns"ޡ+ cAKNu"%s *9l)-hU\x0 DRbY|n8 iNz0KZm Ko{S?_օ/oe7y~o Wǎ@e$&q1FZ2Z?3 *Dv] 뱹;i+='.Ƙ^b!1G:6 . E,h*U#5ILVS*T&NBKE9U5UC 9\k yAv:VbJI+8R+z4SXqbhb"_H*mcNv|ͯOs)s,u0qYg#X-+ZAz3&S=RIiS0pt?!&4Kq>NH$>yPOE]e@-~bRPk4Gbd@kY#x-lkf>OW|J%rF<C%FP TQ&b6ާ)ԔA+~S!>C yBeG\j Ջ럢TK+ LAO F,1!~YtM7M3S{;]dq[P.:ţ箲ta7[ *e_+f2CC՛eEpi9ޯ7*dT __3"lF+;f6cb cz`l;Ѡ.M{#_蚒"м{ 7cu/YIØ ,H*4N7\u8ysq_]`gY~UM썕1.TV=zIh$Ed?Cm PsjPi/89CҘE'\iΆF7̬}C W W@XhoAxc֌0cޣeoHK竑VL/0qyOZf%9rQPfa N U-yhEeJ}$7;dXPCk,qb_,k(7ҸL\SVM,` }vEW# v:dpfDQaiA jƳ5„ h]A<TzYαq8ݽ.q'!aJhSMIz 8q:.6IQ'^ A4*24aPG36J0,i Ri.RZ#TdpTt{OCPD&= Rq;7zAmfX,>gDEWF[7%ZSfv [X+լgѯ6MiX?7RtYu n̾D V}) )jrUdTo @T9dJf6q<ꭥ^'A]!Ne-RgNCimI{ qUa5e'WލX | K]=[=| [e{z=7Y&ƯjPa@0ŭ 8&"N-gxޢy&= hR`OYdsAsحl)H6͸[IDoaK^ד|vM|]MEv09[>0;V,m0/xEHn$2&`ms4Z7m{ ?)yb=vݘW4ǎm^?_{%dmeob$-LYNP$X֭F ^rsg/W0ș1& !#PmNpf@$E כ5oM/|Jqq%->V޼cPZiQW ҳ cO%v:@MO Q^5q?p@|U"=4WwN\eE4/g_LrʰjÕYf%8U䈰U-o,DP:D$?&z9Ԇ*M~vTwvx7w_N-q~d%/vP'\&> _@`"&4df>W;ש ˩E,o!ިm;@io曖tITg%hvKQC+_PTbrS Jv*O(0>S.F2U? d6;Q3G;^@L9b[53pIf#f: R:Ow./4QԸca?,Ƌ\zݓP.rRz@X[,cBlߔs[yVOh#d!l,~@YM#aheuU> Z*f*T\)%q$waJ@C}E;n51[x" |ؓ8O"zg y8u]B ⲉF[u=Ԟ⁐*Ai4|rg@Ug+*[e S v.><moVBXdc{HћكOy)R[9`ͺ "I2MO ؠv( Y'ν@ aL^S 3X݀k=vB#鵾hÄpK;yO :L/r$3 gq V &½'߬#yf~bOADz(Z 94Hd.6(IF! /^vJ Xunn5Z~e/|bdɶkN6+JP=߃-X$ FiBy* ))1.iRj D3! [B;F+ ЦI;sL:>s. G^"cyG9May|ǶTly ǖ0[9y4?Ԓ(re'g|vu \lU¶^6-ԘFvdmv+WCz8齶Ce)i,d'.oLX ?A9mjhFlL-̫$Dڣg^f||F7HM0uv,^ټ+f(.J'b&E$;LqdѽP/ZK2lF 2)_ш [nL@:0rOذI ?tB{>fnr)5$\-A美TH}Wod8T% bPP[IgЦ.Kcg|[rMq}ޞ`ȥ=E~&AmQde눅 wyAol9V-YhYV(-k@p1EHEf 'xj_:Paפ,UL 0FV&nGF YkXlX=+Oj{~FFd!SpsGo3\l2sw%q\J(ց-r_ ~g$(AJR{LKnQ/G E==H9$7dd_Z-`_ὥ87gev c<ќKQm\Lo A`|ʰ>GB3Jal{zrhnMa(%wqVFۖSWo,BDc5Ѷaeܐ+NM:QT^sHV -|@Npl@fKؽxV1V1noz1xC})O)kHdDz2ٺ)#mg^Pa(XzR&*_^b55RLNfjt/ 窠o!cC{/H(S"&25%lo ܁Qg(T^c%-6>ڹcMT2H.jR>x{dAuv[Ļ,ӛ+RJs`vIt9kE:ԏY*9a74)^ (cY&T FOv`MF٩;XT3>BdyC\w]}e,0CTқ%V'r0b% ZNx}J% -55dɜDąͶR,7(ڜ>wGXɶvDZy3_q[lZ` Oq*0SB=KٍCZc}-HJtο7e 3ު]k8mڢ#jxOt:Nsa t4.^N<*S .KEuoեa}^ܤ%e"~>1`nkcZTdxN%t"ᥩf QNQ!8 GFrr;(54c] ĵ@GOFL+ >%[]B˝|KAGx] Kk4t.*qD X#Zz"ОOq  ITg|LSݕRݬW[0=}jW.-L]%$xćg_GBQ6$֤k \Gvx6[*Vx}^h`UʲK V E(D"qx٨G6'HMT W> !=y2tDo8 doL.)P & MsLp Ώ䣊$5C[㲅:IIbk;#h:UHJ<= 9s@,d ,{:mxP<#a$D5scOcNLP3v"8JXVzjơ3aLik\W Jvߛ .sO^d @%\Tsz>QIQGdun,0S2\>#Yk6y(1[Scd'| IO*ӠG.#jq(vMum8XO&/3[X]$[K Q&*Xo7T:vD׿NCl$b+2QLzm[hpk.5RuZ2p%`d|Z̒&uQschH4 ʸ]t3i9چCKCbKu-H54WWӑr+EuA[t"@~R+DSj3 (x68vנd6,I+`+ɛ߳+$WWFA99Xf4M=`aQ#éM 8PYHtV}Lmӽ_*YCxzMJv1!%l{0Ϲ7>Q#/*sa,|@Y׮t-(JTjuΔ (o'i^B wdMSS!@X:2фEftFȁ@j`r?*m3~(՘CH0XsRdyDzΌF8)u{iIأk]/^vnfZ9]^a#J0Kx2݀O;65y/oÜtGi} [> Bbz~b_zѣ.e5OċqE9?4'ݸ)̆k.GT ҮQ%MLY|u%Q By(JLjIRK5.IU*@CӠwޙONՌΝKr p ^Apf%" HW1蚖nپ;뵦Ľ 5W/6 oxoYcd%YLkf9qpw-i█{,xI !C7 ,-1>CV߀Dk134'lx5Rg]a Z.KlI;\}uw]UFg~DTBVo}ЩH~VYv@JeD{^,WJ"i'Kx{7] EM+,@~jqR#eEO1Es$9GoKSPǙ9y΢ޫZs.L>#nT|"sdI#$( gAnb pR4X"pg `NJpk?loQT '"10( b>Hy25Lݬ9t;ǎ*$#);,Dl9r݄i˿-(}cV!)&f0aOW5Vq=M8?* ZNq2@M>8ORfȒ6v̗r9Bőkaz4ѧO?UV5*o!?LDxAUmgKBTK$} LvΩgPǫmڣ^؇MUc& q,˸Qqp TǧZ&o|[A *$ kGQU{y\nV%NAD-V̈́<:-ݞqcsyΔJtZ䂏>;5ZC庐L?1Hp}ыIU\i&͗<qvp[^܆%fQ fM)CJfAD!)@n7|XD};ry=1./(E/}X9E7άH7^{ #)K/ v6iBEn+u!aD7%t*6 w];/ 8%P∍*ָ`umQs>CZ4"GG|+]N*VV=?LuE Pޘ]~A8LZWShؠƱH:v#oyMkS;:.% x5#)M~Ձ٪*!DzUv2+3j /eCf ӇA7i۬]iL˸ܨl4,T|Z$.S๓!X BfM{2䬢)J5t|uC}Sc`6IC1Y:nO+.T%LxS}S q-:A*kF Ouw.4" e^,rСA[8GBx l{H5ܓ3k)Q4+UTקrbީSn(:BQn4s c0itõ\%r!] 6^}cFB>M=~O8cI%εҜOQ +o(GBJ M9Bֈ^5>t d=he*գPd/R5Tw@Pqw뺋uqfZ :<'3MZHpmD@  .[D{܋bOF]} ԳC`Ȩi"!OiT耞k?TK8ݹ"~̆`ka)Pdp#6]NTgs&Ԃ^vx)$qjʋnW2XU9|JDժֲ4.0ޞRw,I`K9ە,yY" aD-1No7lBK#5|w*.B]c͖!)O%h?#kH( ~ O#qm'9ט?lZ$P˔GVhHP7ٍ w@>Y($ 3HR2-|N\A($l 8-Ri@XIt3fV8n'tgM^?Xּ{HgEc$c1_RKJ蹈Pmb#t)AosWNT]Tgg)y?hHJ21s(QPg- \@@@pqfN͙&@ ||\)eʦy EA nԫ-IohH}!Y;Y mgc#b9G{vJOL4 ݘBoG%hl1?S<wQFյ|^k[cp R},OC<˖'2s3"_ sCb:5,KqyPV[QZ  _nM+ ]dΦS|QQyڶ:]] |S~'K[01>'4;U)0\~/Jw&d7Ű1&@;,&!p3FeD@&)Ʒligg,#rdG}z(qPlsuBa 4 *7gSva`]5^i~hM8~T/R1 XLQ}=q8myt2'-$5E9Pp?>U <(&XDdz7M@`M2Ȓ,ɚ J:Dt=K}HN6ifUꊓ/t=wD!oZ&|]d{_PЉ%}Ɇ T<Ȉn>)[ rXޞ(U  ddo^#' +Z1c؁Ig U@|lG]̚C| `åJp60=2ϷO]oY[7sr~_%e[en9+JQ"ei2oG'w0A~ Qt_TښoڅGn=F7 %(/UK,>{9&DY!(A3i30ٱT\cΏs'J+) (:ݽAXnGç(iuJFi ;7o.B@yDG*ҿ +CfdhM6`QPIXY=~^Z(/0Rě?J>t2PQ˽pޏ](@DE@cUt3m:\͵zYKNJUEUm,"κjwT$5El>b"CTdj#e ӆ9X^nrԨ8majvƽIQ2"5{q]lPčZ0K|Qss:Yoct;I))L*\kmAu<["QV$`]|V EPw K0%$uyxԾ%N) ~Tq;7PMˍ af5Q1׎k4 R82B]Tjg8JlvFR`k o#b\h^EKҡ7ưVkoN'N޽~"Y| RbT(AuϐVt^g0 &SXeM8tv^q,[|]ZV*o0`YUK& N=!K$4 عdXxvnF.mJsX6z[-<RZ+OOAHdż)s+x(9P4Q=dsI)Mmt0P) ;T׽&*IZssTE;=u rƔ< Ħ`M[8cy=v-yC5^Fl-1p0N.x&fXK2*ffF zQףlvtsmVLS))UBh$EpZv!j>^tm;MHTdKWp[9D7M9%M{#ꔹ* ɦUc9~mħw\0Wtjre][̓Ql=uJBJ=vt#CeCaSqm%qQ6duSF+P4)s*}R,|r]#0E ~KdY7(9֜1P#xsC\ڵZ^2 5&/HY8:ٺ&!n;./9v5v$2Du@++./g]U>Jp/BwkE)&Hz"Ø7\\J nlȿm~X)3OPCFTt 2NEq!j>7ˠX"_ RzEnB8!u>*o5&^~X`<ܔ˾-X.H1E1$$hֶiMl*j y]vC*;XJl5vq)cGzlՉ'?]rBB?7vITzeZ+[.y< n!h7Cc,2\u hOlVz|5F]jaJnZM(s8~H]=߸چ1 >@ϲ`';:1sbϬDp]R~^?/vIY&ET _Lkԭ7tvJ9 x%#_C5<`$OiTrjT,8xv FX/=v=V\.81\j(Y'!CGJ#aRel#~;l*kcy}v_Okdmfrӈ7/˃$SQRA~YEv75vk+ 4G(]w+x[>b%`|#.2DG-V2\T.|#FJCXʂNf8665;rM:s.3#Pq\XO׿tAOZF yzA8p`ڂgzWj" 8ňpIoPf ǝYRL[q)ڥ4FT{Qޠ3CC ET0R8^v×>ДY~5Fq~ w Xd4q(baPv]'mRU&3აw\oDs G^j,L%!F.D>igs'@TL=r"(Z{~{eX/Fh/tp[A\|Gc4gcl_J)E7Z9zeB yʻΙmHa;>F'@5p,kHW@%:\nAodF&Q|Ө%ޟxRA|<ȡKg`9NM8dna &ke{gϫ232gE?V(D)(-7 -yIPDp{a v^{Gn^R6,tanʼn*zEfXtrjT*bNw5,6:[),Ve!.|o߼  %?2.I0hJam>NxW (WN5 -<AX}p02vFVGĞ;D4r]/:"0K v@Tm.Ӫ;U{Q:q/; &//H>CKR)K3&P:yPe2 M]. QtJKX@>E9Y%fld(tG>R9jRl2&8U'='Uٱxv$q[`ߞP 'f?f1˩ C3QQ\ whcIApA}SLB5M `hpo汉kۆ_Z|0Q&#V,> O}1kMg 1tA<=ɣ#*ξFvlW_fk+J}oykU(oK1Pdڱx>fļs/0֮Ɔ16ʏ&x%*8Y$ݲ'>1 {J·1'M/i5Z3@ YӐ{>NKr™~]2L yȨ<,G<<l?%a` NoFcϬOҤfX8HO8? }:`~ʲ\32WoҪ+F)(~UE927-_(t#+&ݟG90)=klYBmh`WlyW 3B8<('Y4L-q^IreqˍKn wZ<> =$7o6&1^-AE,YZK$dΕ<Dߌa6TJe4#!QrЧMoL@[T> ^?$ Ƅ>2Po-sp8jT1(%W\T6)!Yef)^\KlSKw6/y޾K0-M~eModWבi f&BJXD(Ρ⊄m,^vJj$) ?V}m1!HJvs.xn+wJl&g#o#9Eh!XV2thZ- U LxV1Ԫ=U39$) ]TTDc.:T.'jOXaGAU%h!y5 t5( Ql=*+ oM:I5"`&qb if=i;o!QGv%9لdY VB (::x: /8Y朠j-L,[>.4Ԭ=CEp#|\CdρaOc<}ϡ?hғ6l2} AvG+ijg+}8YΗ!p0٫.'-)JY͌zX_ԭrb) .a1($~R[x1Iu↡H{kZ/[^2d?>#ΎdHq26"LQXěwѣySJjI H.i>CێIkuJ=J?"ߐv;ld;x2D F&VP,\I !Xw0NN/?M,'5q YH6 N "=#]W=|eUE]1[ J :D%,ܞajP#c^Tl O o!zsJ ®fR3l *ϋ*6|fJޱJ^cnKLobaO`% %ћP39tI -N9whmװW r,s|%Nr<+qMJcEZvn 3&ēV:ˬ4j.P#n,-^v]V;Vb*Okʊwxѻ՛ ;;tW֠/BbwmyxMYS7YIU{(RnG)c JШ X%gұTO;?ꂇ=cTzR BfȾ)jp} eTcUJpZEw3_u76d̻Zo_+P; ck/NG?̘yu qs 9 GanZpkM li%G" $y;[ QalXQIt ticA)=P39ΆʥJ`78}ŀ/0|Ԛ WGHQn^hۣl %K8AQ_9_ԡg;ACN앚.G ?z*$񤋚"Pc[{NUwlNsOH/qwG,>\ mĿ'Fq?(98v[XMfSON-H=B @TY3S7E{+\_W3kJ?Keب~ ٔQS_D2LCAJ,Ο3lg:?¥ h .O xJ@[~D}-5fH˦бpfd$ārm#&>::{aL3"cdy=ÁP."Sk `AcvI73MIA+Yn'pH5u-hx[}"WS`|H6uߒS:̴<eQR]o1AluMb~VND2l>eHErc;M"ptMb-/L)q+ҼE% @N.A֖oqAXgxT=K94y`p x(!˜4Gނ->8\K@×|e0ɚk3ormVp\[d$x9J̻|C,\YRk|]A/#mu0~g9}%$ s./<`>ojh%uNʌS+Y*zڸʗzTKb{-v~Ȳ תL2MT-cDiw$}6 y,iP0E9y瞴nP4 K]% y]_b81ּ<-ANؓZ0PRMvYS~Z)K>@+Huˮ-UoV@YxP2ͭF,l {|Wq\ưXlp42  "l[珠pF}'#a Z8\1R)շ+]3ү_Vi ~˟A&~J!xE(h7x Krlҫ,`<(z3n ¹Y`5..{hnh$X/t} ϺZ4YJ]d{eGD;鶷/iQ6^RuvJ2B*vDݜ^>m d}Nٛ9 P$>G.8oEe$`0soo%Y;n9oՇM+bE& DxCآN 7`4ϱ U]?(o:.2})8nL*J?%(dH,Xp] P& b31=qMf4'41 f 5\'SwĥfBoᜄnhu<ۿj`%s",_$gj8rGwSZflǜj,-tR]/+ Gr\JX&ۈZJ Fj*3*3=D^L4TdrjKpÉbE~<;v7—v jdJVf;x6gBl/`L-B5|u&-^Ȋ֙~G%/: PJaV @6/`f:̦_#ƿ0~=ROk8Zw2x ']Ee`Ā:}7p[Z4M3ʒ&c{Uw V҂/VN_nbh q-X@td I s)Jo:`.kׇZW&3ϋ" p=֜pb1x's>3'`)d9ɮ 31n%<׏|il0 0xBz5/ t.fB. RכR7EJP%'Ik_ٽRԱULdKwu?SUs1:b.X"vZ.F+9A'{% o8 GUͅrrY`>I um (m*W|N ٻ}0C uޘ_q9Ŭ~L0C'.W je$ giECVC{j/ 55! ?_tPԼ O<&?N .0>Āg)BYD2i렛d.4cԇ#ⶾ)OpYݟhRˇ&[ 7+.4>k\VSڈeIdx{mqp`<_ӘO3kCzl R".& DBCD-rҗ/Li-WAFYo᣺Kx48Ybe '2S6LgvSk$ 59cO)Ӳ9r>![7[1I)Y8󥯌_MBIa5dW+O9@YD(?[hzwWSlH_䞬zܵDW#s2:]"9Ծ)m(1-u9RFwWs2*INImPq++;,o$=-y~[U/Ŀ1^-Mn̊/K$F oȧᢶ8S9hѽBy٬QڗhÔGHF5l;@CmkW^/߬9ߋ0L2oA<[HCUQ&gGc3 8U?rh9RHk`wXSmmPŒ5zBr$ 9fY'M6Ɏ#(Jer{z?餃 ɷ/ӘPi_=g fe9*?Lݷi2Lw=_E@!% Lt45B[az)9?Ix.M+ia_Π ^ܛ(\=y#F|ߤd'.U(P `<۵a L<~mH^]NP d$17s~sv.;:Q1_X/ȹe)KY3AFeR[ dujpVngt]'_E% w@?awhy!w`N$3qQ,E4JmNW +Խ" 5 Fo"Kl =kCN3;ޒFBbx2/4۞ujZ\|>^kUخ:a;&~N/XR˒q0yA~d@\9@K϶fQ[aF  _OśG;|$&Fr cYcAk:OOid~5p !K62Mbz'=簭"ӵo[ S.cC^bIu#shKmĂ5)tEm k:ѰH] #m|}gIOwHW0/ 7~XV-&La=_FHW<<97xa -ٕp`@w]U=_ ?aHΚ? 3Km{ \{o?W/=nFYZ}y3M&dm[RH=xI?Mj|9d۠N2Tc|a }Tғ5SvWBvAzvШVJ_Α.Ŧ §1znSa`Z%^ug#jy"?lܣl!atμ}Mg)rʺxnqSwZJFݨZiՁo8h~aW&Y>04J){˅%*xb7ͷT h-ГVYHY<^!@z CEmG04Ḿ jCWl\4 ,DҾ:#A2ve6Pg[++ <rūw4eUu\*KDŽwCy1O9j,!X["۴~(?MI}]fKB#˔dT :rlc:16[Xg|ZSwHRdݖ{tc~(W_ef6Mmy[=6Rh< WD#ړ9 ̼E6U.pcij Xu |z&h&Rx.b `l FOX-L7#|~h'bgˆx(uKkLS H*Vy)tEWٺ~3ѩm/Ŕ1QB̯IoTtS=&Pnv?BhQ{28`7 w_Iʬd~J(EI@نkmZh0x_ÃZ@5FZ7 563H_;D&;g9bSPܚ9  D`~.ˣ6 b:42%X+ฤPaE[5_n񇁸MH+LXg`}j  ӽ`0CsF}hY1/!}ͣ ~#{l z^eޠ0cq=IY'+wkS\h,!VtmBJdzxÊ&.Hv*8,iWm+U3@#P y3Uw.gOs5d쁉X} X4no2-zŌTn44FY($k=T} sjʊA#BKn՚5%: E%H54a "U̱  =(Ӣ?LeFo d uD գK |\֡ɞ2TU}:;v c%a+ApO!0:]cvB"g.4G׽q乾9LEsDaeֱ7g6&Ԗ`gb3ܫWmASCV62#F$ 6#K :Լo_eAn.I0&Q4XX쌑 W 4MfQQq5ߡq| yU}ƀ JwJ51g4:YIuns¼XboRj)%u'a 4f*u%Tb:w[kv5b_|cmjāc!26k-h(eV$ sMGBjQx(|0rvk ɦ`+\V|\@}0TyQNbq-A> 3A'$4@{e R7+oGm437~ 'm(K)\_>w~>@x-2,eƿ3` s.y8f) rFQT3)^N (sOuc}١}by¶?$*GNah ˔l f.JfgRm%qAMV SKw߯Q %L&qڼo |,^arkft\rSf.C8 ʆ-fi`s<;Ҋֺ–b;%5#^ъj_s~@jmj\5eQNɻzv=;ےC_$W._6LPߕD%lgY^DQ#G$ş8ALlGP4}L͔8@H] n⺕Z@4 b'ObH]״jxT rAkm3y]U`A_HRX[bUͳgOVmyND\?w޽>=D& B26E  ^ ͂(2唢ślwC7Jr&zi,xn(e ]ڨXzE}{F{~jWyӛ/_cV\R@OxJa3r 6e5ylLWƷVp-,tuv>eIzUoFϲޡ3K瞪?FR4愝yQe ;/\ji}%M~$_eӷY% ɠnnx\w[^Uf`h &㱎rqs!\pZ\dٌJ'^4zn6v X\J2^+r}㡎f0We4 iD1XUkz Z)obJ %j D4wIS ),mؠBtw/Ys!yM5,["M?zJ5|?pa0#3t3sNv?q^P<^ c;(d}2oh!ԟ%]dη}{̦BP_1ɟ ^"22dc\vTJJ5D?v;In$_@O<ͥRZ(Tz pl>s뚩Ϻx Z1\H!sZI0:QmُkT{vÆOL߻Ck  cOic,{ #= Ku^z.Bs*xK~Xžk@192|h"@~*# o3ghXtF }l4) ʚ.zfh{X4H}9SDc1:0A AK0 %or o\: X8+u΂}xq>fd͏_?MxY$q>2 =`GP'e_f[oʑمGYf\B"ks^q-j:E9g)W&baaOSTߕ?M Q:rIeֿbFs=6)@.u9ӗFT3X++[=" 2R 2O~a1gцpY25jj OqZ(TZH ,wJӂH9DŅ@=`j6C ˉ;JUt5H;A/$nwjLV~%w=,e_ėHEA66F&[o %h1_ՂPp '(h0w DNn?@ڳ%q{X̙ƻ{)2X8'FpbT[?d~l`2aP#LO[9~Py˦RjiW9. BDV!otYId:,XG9ϔ*Zr6i wnH(H2$Ш$} [J@P={|n3ȏ@Ld/)P~EnGj2vXkջ[w^ج6D",ccUV[ 'Dh:E|+!>l@ZNo` GWiuJ58x3w;Ey-),s>)@o?-2T $3Me P[<1 ou^[/$ӿ*v|IUuj1_0EU D:O[<iDhq6ȥF]g'9==?b躿eԇ /fU"շBjݟ1j/fdy'0fU@Q̃nH&f l%Qy`Z᠟BMe ap{OMnE|γ,HHN 3#]Jޢ5<K:jA.ަsqKR(2cq'NkUfOrRVDrqjZ[Bhi(I*!tBRiA )1A>tb4庍rZ] moϔ'+b $YtCi"=k)=G6T"}aqd |[$s 08fݶT)CvZq$ ϑ3wP|rA\w_@l0(a%w:3IIM<&.>84J#Z<oOc{c=l%ٵyɂ?)8+o[¨7USk -G`=?AJ`gΞ/ʢ׳6w.6[t e$3bիj)L:g#~<1,C~I. vVSjʜzm ^pd1o`&mJ6L̃$;\uTp{=6yZa]Y-8lɳ“ m)N5vC`WT ^5gLSEdMk1p#3v7| Ē+m<\IRVxI~:vUZ5a#0_DHD˜O'L97'U 3RK?)KUֱDZ3Tsp ڝUO6볨?_""Se3@N/OxZK#,YQ i阽`Z63BBb|b&&@ R?PIS>z=I{W!ohȖM͔S?vmEL>LqB̑WGy$3zʔCwPK)<ȳ|&Y<ciS*wz (U7a1S?w_.bvCIf_LlB<2zc9n_;Qhc[ca/tKS,b5M<) U|`(BjAzO޹cShSUaH~aU|@=dtqwc3d5[_\*, -Hk7w޼9V(Ʊ,)WcHo8[x@qHn^Q'}%ol 0Ō#C\GNݿz6Z/u^8kfPf *cUE ''k;#~!K/LS1h[GL[#S>|OB0&LeO 9=P;;X0@\b[ɥy}@)4D62s0C) QY.#M <ɈAHG$bq0ӚT[ٶ?*C|GsI(V"P509stE Rj (|!o@cBG3Xj499.np\w1I擸ƊE+8nRv`l7$)AG "e&9 Nh9of= Q ?)(<>/EeOd4YqQlٽ02~í'b@])2";tzjSKA.wM!Jk,qONVI^ m6̭Y @ / G1O֌vY:olC [?x=j[zI'!z\% n.S{N E$iu/ߤ9%A":)CΡ/3/ L"Sz%@P 67;T֙yȩViGiT-~9T| E|Sc.ۥ#̾:vXO'svjpe+6mم^EH[ ki:nHu!]Yj$ h(" (S 蜙Uv C0# w+]3X%H {аyOC:}@Z5.ٱ 3* `I(B7=ފqXnS+ȗK'%"h:tjفA g]p#6GV4p}9xAVkbi0#s|9 h(-sSISWc)'vWYU XVjr0zQx$"!'D*nU6P LjD Ylmh6` y'tf|HaDJaaM F-nD1ΣG{ LDb|jocRazgw'+&!_B/U|LhÛ%Fws< iIQC2/8 %>?UN|DeHw 5*mtbve|[V&+QMQ8  W6߁Ha8F])E^y}8`zB~u3*7crj*cp\űO(U4f+Zb'0tj]MO q!uJ6?;'U՚o^N+̩Rww&d}X6$yvP%`semxvj!Ij_Q$-qC"eUsrρ·*vЪn)r^4wUƄ5 d,yr7`q ~ ';ܐi䗕ifr;sTPFT/O4=>YC#s+~H*d˭EEsm%e`KМk'Kȡ>xѧvhLml;S+ EV8>C;|$d'bd1[@N,z7<.hzAF_ccEbHDHkAk& +dx=cQa;P`djA c!`SDke4>RI6)r^cU+̣(! kU}E'NG\DY}9o}ٌݲ-`V(FWn5C߫ZɌ*3K"2F{ƻM8Ġ]}0 =VΕȀ1w ɠVI7U:*<&U+]õHTc~V}"5^ӭUޱd+RIAV]ydm DB)Wfv!اTw5?|ںc%C'8o =fʴυ"%ٷ-oj Gw$B! xlkI{<5(,%[v,U^SL#D~Js06e 4R1fvAJ'NM) q;+t=쌢ߴCO1*Ó$r'C|(HR3J9hskbst\N\@"JĴJ>fn[qaqy+b`'eNRP4 w:VXYCL;$H>z AZJ:urm!wC]`F mw'chZAPznʊG(g]ihkbd4C@ 'dS8T4P@6Py ͑s'M ".JѤiX51.zAN*D>.Ur[b5|D0E5{0悍jߐbib}h@6<3]$s)3kU>\TC ߰iDvϑ]=cUe*bkUC?)h"-2L_thN }!Hmç6:W+THC,VR!#ڞ+{D9hkKbj16U\xNms[+$ZJ@vo^E޽{;dY͑#Ydc=5yG[8cÐ ,lgAm9gC4$b\ Wj7 pCLv]E׌ j6 7+/,ΩpV$YvV M~xȏA!7f2Y%=HzFRh01/IkuGI9KX B5 ,oS%{4nHA/=ـ\Å|LȎ48 =^=8-mvdHLފW1G0PYN#'z׺PLUqyR z')e7w|bQXZmc$ p{ :گaY/lyAaxǪ{Iz*Bw_*nwhi:,e8b!1\PYzZfir{ZJ{T(ŘnZw'^B!%_@ M{ CT (rq/DNS=@PA>@A3@h5g2dj̹6N G) =s򟺍m dvŽ[.>92#kSa[鈃mEFfI غϊCEmy oڧxI~8\"4GK mI\.MW<8nSJLR +6"y"\+4L`Uut֕ 9Q$u!Wzf N6^Nm ]^ϞW|cʵ oY͍Ϳ+Gk>f5 " 5v֔vg.+lw n[Xtqx%, &׺P7#pCy@LwgiǪ3pO,k > ޅ*UzI7)zDy:xaX33\ ^Q5Z]M)rfmA,+HYZW4;*)"C^Xp."T~wHZX˒WBD{$vmA/PrW` kJ[\jRV_Mf)%v"*=._YRU6$LP*!p,+;n\Z/XxZ4IH&I9- u@͚֙v{f{J?b6Rvn2-ò$_Q XyW[ Mk ٯJ# "HĜ1w80xi}$g_`,tBkzL)/Cn[f/%iMR(|ģ uSK0;9,,TRE`#0WCj&n8Ϲ8Ga7y'\,QE.yR3}#tL8-u(d?z!9L9nea /**l;G@ GTKV4gۢ"SyeF/V OuY:  U+c;[Eۈ/|7K WxI:5Yc,@֡!#64{3+{\_/q)#|6z,L-W}8I.7Wg%,o2AyQTK"4uکNTnpW > &${{ƌi@yv2k=!3aEy(xMF-^4tw| ]ܒcS}ϛO45{/,f5b2)ⷸ8 -z<C( FH ^5 GD,0]"mB N1XОqӏ [YMBfKZ?quz{ \?^-f#Ũ2S6O_NS(Bߤ{ڙ4Z<1nbH6{ ʑ$[9XiqŕonA]` &B"LJbg 5OnSd;g*trO%IF_8>C p-zi>Yl$.!)#l3~`" $W\>ML&uEEqã*ߢJ1@'L|~"X=h02m2oj$ٳ&UPgËsȇQwRCoe)m9O%lSou{?%/6:B@G] w5&jH>b$ sКewJ%;æHnŷEY?U~i(Q[ޥPSpA㱄t2; ?&8:Ů(8XLfzZp򅺕(kwL`{ ôS95OGkT~)=q`69v#01&[iM`cł2'!&87HW&|`K:RrIkoK( O_.yG?A?LXz9cfg< /<[8 re..o0|n2$uX(hUP= g6aVZ Lۤ7 %P,4XL"&=Ca=\ciٖvOJT{EOcmbp L{&&y=S JMh넅n: @J*Z?hK!ɦ]U̦B4~wSeun{d,5*%;zײ!%ud]f:/[@w}a93,ciѯS?O5tYyBrS29I]ah3PRb4s]ش]{iF*:[|:C%Qz. aH;!p"WBAHNb[NϞt3_ ~ iJJ=h!n{vͬa)h+WzRPV߁QvPB$s4fMxN}ܧ->Z&y1}W7eۥ{[Rkc228McQ8T'FyA-9kgIg3 J*CN]ގ>5` 2 p*2 (p&. cQӨrU5uzxw7H^$/-J萧cmKhno|F@O$ 2Y0a頽41Q(Tg[4 S{>!*0-2x&<AY*@OH4U3ӥ)_I/Cm!~:'DoI2icb/석~t KJe]T4 P.Dճb]S}T@XgݏvSFs4y;\FMa!Ò^ iu[&B5;gsTi)>z :߇>%a.cldt fXQ"TB+Al9NChly)l4@#a iS#f8heFF/Iƹ#@>uA*\ tʧgeR3~@I+u1b΀yk"8GIrU`ʯm9 /9(q_"f $A'ĐQpP6]@GY@} 3:g4Sc<[h)f]9OHc !/}?ǥ/q<ј߮ {z게2[0PAzL!p(| hU_6@`RيDL)AX;}6pgC_Wb EϥLy3Np`sQ=.)t&b4A oס9|NMh0fg  Mq=, wU 1>V>¤qdjew"'Snto%7$j_! كz˻{|=7 ?\×+8[I"lmj,| LV$EWclM_1$6.i[﶑LT4z52&_A5[ ð"=h+kST'#}'#v aǥ9e;GӷYV]/l |qBGxKF`Q&߾[u!~ftGReѐ4uxهW<z9dnœL#ʠ$6aGeg6w4+_vVL8m+Wƿc'E8fa45*3ӔدUV2Wwh=E܎ ,}ʝ?u:GcB,y!Bw`tnZ]FBG-FrH ii*[`:`pˬIa.Z W}s,K̨e #Vo QQhEOM tAKAL0* pwYTg:g*Y,3>*=\n­Le0X bW=S<Bw2Vvsx0[^\`ШFFIu|~ =t-1\᤭ӊ2icNo(4 ~ >LKڹcexrOjVC-wy ҮX\J ܺfC/5*B}y #ED߂b"mjM6)K"i +|*OiC-wI]BW_S;xDϠJhI'gw@2.?[>+4` dxSpyzBO2CE^c5?[ϙHwJe,N %#({:lMY /QBK#f[-"R|w(=6ttc,dʭgH*8lԛDIrA`#Cj= }DM4q1ƹ@TеҴ8.m֫WG8X>$F\sp߬ ӶI(YˀBtֆG@oA]89޲H.CKӍ auXGC>={_Vic̣xK92]3O,9 !Aث ah+t߭M b]gn4Wq N SXڭP#}eHbivXa0= ʲq7Bhu  *vlrgȻDŊD[@Alw:fhp_}-YSLLd$LWB 3yX})v1yMДT1+!`N w^=Ω4:IVTX\yxCCvZh_ B{kN ev:NqGW(^x#L6y -aZK:մQ}-q×tG9K6F BM].<44syA$0Ý-u]WgJ3~;+\Y%c?Q°z2ԓwtȒ[ӖC*IjIܫsA߅غ4D߃}IJ"u ǝa!rZK RPAQHtN]_t8)6q]`ZX!x^?}& bR|ELN6c{0- ?ع+MH0DGv9\ m+ak;W\Ju#"`8 ߕШo|t=wtsߘ0{)HeM#cnhQ4>OOXh}kSt1٥F 1C OT<3ik?ٖ[fxr8Ur\_p=|''َ[}R ?Id̒)0k?|Amu02W*짅Y7[;yLj:jGY-9:#h V[u|[ұ\:]0I@[}O.Km3Hd -DZAm`j#2W.(H}͚ۧFdHѻHR_Ƀ/VmBvl*)_Ih+QJϲ:h ʋ s. u`^tg*U籺L~pUwG[pˎ'! 2Ly(eni=F_n!/} OY;*3!sG .nyrzb(9$a(Ę_T 56c |]{JM2}ɚ~/DPBDiwsSNrx)ʌ|Hr6^AD`ڶX>~BgMH5ˍhO>+<>7sJ-0{iAWuhUVM&9gE=SDx!08/L'%7M)쐱MQ !s ҄-B tg& edzU]bn4\7/:("}`~ f'2]ێZ(ȗ)%+ AuP:F!"MfĦ.8jl}5CG d\.+l;gn34|Xb%R8T.ˡǑ) wS lA $޺eq,hH7jW9Uaut-3T8fSjqfvt!CR)Ef}**;Ѷo^p5wC_)K8*,i>„o仉B295jP&P.ZvM=b 1 BbyJ%BL9aiHt {)]L/-gR@/Ұvy=Rs~y(*/!~Zo5,ȴ18U5GtT =fD`^v bdi~86Oxʘ#L]A3M-!nׂJJ4\kqW%nO)"%r!<跱(Zy2mt 4E.&);|KĜ/qC{8c<}:~O0RɨКim J3 'Tt$NM;h=8 K+ 7elյX ,˄kwmo?B_ͯ@Lb ^qYvpɏZq&IGn6vZtD K$mxr1rMo#O[@%i7 J<@BEcS V/Wq7BDbϴȿƉ7mԆF襐k_Wlk_sp"̀urQ.qo(k^(AоgJUP2":&D+}pJCSU?&{9M bj:UyP)-Oa\g"DGg {N9 d=7O/5aXIjyԭkuvj4m<̑SH=sF=nd_Jva(1$;u DPĚoM9Sp*LuH[YZ&:^5u]1aw]7ji,N,Q~B!!GcjpWܐUryk JĨw3((CC]lt߬ L6J#]̓zWM^n C-/$k8a8^Z-BH$hs6l Mx#p{R-Aag0ZbPuWg=%r.S]ŸlfX_JϼMEnlcpHmoI~[9ڮ mjXM(oUȐX L"Zt-%tցv)XUX]x^w&?,cR?Jo)3]A̡(RFi|AQhO?c4e؁Of>W\xLMc%hy=n6`8rE6%ʔ$Z+H+:;Pwq.Ts@,!qNB-[g/N 5|Rq> ĉd2u3̂c9m O .T]!Ƌ;?"3s܍8:1O.&`Jj %xtLn@"=dB=_́t/ߘHio %Lz X[!J (;ův1AQ;v'4`ɭ R%_`S) Wqo3J[ܙESY& árI7ܭ*Z:;X|n*r,Y!W]yb'* jl^wPۥnF)"ⷣkjzXR,ob"\*&VL!TB sONCh7%'Z)8ҦX1ϕQmjzD|t$UȚ}0+U ^/WVPk 9ÿE< "Uլ-7Q;-h!"*ɽ $am1~ NH?O0/"%iCYMTxgiKzeqzFoM}a+h}#>"B:Nˁ4a W 6s)מԨl\VBt#}B>1L TѶ Z7w_ `xwF7'O^PYŞS?4ݤs&91bi WhL?kՐdy ¯͆2l@Ǣ Oʥ7Qda$tnQ|tKe\Hco]_Ը2MѸݓ(`>PWۓ}S Z.RguRd{?ƨRwIJAPX SuS6gsB֊Yz45#x`Geƪhr@ȤwpL[cӃ, iWO $:8C7!&w>z.`,q!wvW'EW :8N [y;Oz  |/ .yrvxyN>^8>92hQb"I!6( o)7B5} bhdpl J(=TGگClR8H&^~h#u1ESRv87e'`VZXL!?uUpL+uk&Pf }DTb M=17 w;TL_0/,D![˓xjHX CAGW,]m548lWJHR"YhzeA|G :eNSZMw,b J^W* H%GЫ;Dfyl #niyeX7$BÐ '|55:HOv* ^{9m?z+ޙ))/~ݘa!QC۔Y.~M#3^!\EٯkTruMZE"*Q>K \:ށ0-xNI6/g9:\a% da.IBV]:W$JlrDž ;/P;llIVڕ&#AW$"=@9hP BNs0,gǹQiYN)xB yY5z_y-Q$^1(2㡺X}PKZ (bչHSH\\t`>.kAm}J$j$19;@)2c"m3u9".W|*]o NsX} )"&8E\1Qӳ`7|f䆽B,0$q j'&WLbBy74Noj\GX Ӎ|@zB>B-gRhcJ7AO`,F.Œ9gMH}mf XQh٢%v}qNϬZ G ԪwZ9OUݻ_xV{?ăD/ 2 Ҡ\.pvuM̂^*'*qp5w ժNr+o%g!:4HP,]HTPާ#}ө~oHO-& jRE>z),kˌxcI˕>γo=-8BE>-h7ԮxSQũXm2~LAx4N1G4q0T,28]׊&tV[`~;洹^ke&7 #EQTȸe,tsFwunQ))%z,jo!T7a RU@YɴDBDQmB!&n8@,MQsHГz͉>>j*dF^ޣXenmOt%G7$ xS%%.: ҼW8 t\ *Ȅ:.BC\b5`L31:viN<R);1|uS0BɩhZo0%'ȏ5ԇ *L;ٲU p/GwQqbmfތt'i'>GQwRˡlJA.zl,uoeƜ֋.Gzπ h9bn/_ZB`fҲ54RD>J*e;BjP#>=_T,@[8Vqf|Ǔ53GD~ܾ+\0$-П o ~a2L מP”Sv䰢Cwwܕ+ҟE)6-VgC<Պޅ'3@w~2؉&dzKw4;;Pȁ[.:ˀ@V t<3tx&'c{\ҬsAb`jMMW͛0"qத~BcqILV5!IWWU`ey#FDYQ{vQ@i3Y fί,,r]rYdjV[(~['nޓ$_ +RJKvP[qʼa;<Anx,-)V4{1VW׺II]':jҫyt:}!-PySɘ$gmsmr|R9I(PUONcD}9ݥzؑ{.t/r!8N,֎~yM>?高 fv&7O WZrouU;E(YĮD4/LN>mԆK>M7svԗV2Z_+DCF?%iğϾl!!3؜LxN VMF 1 IWIqm'VKIW"xVb,+ S^gEMJ;{B?Zo@`f+/x"t,&4c7 O ƙl$2n?;kVP[;,EGrmC(r~s@OK3 sKJ? )¢Aۙ7g~,RYd .nMXZ Ft]xEc~7?cRAkS #Jnt*O?x},1G8?zGzGzGbX9v/$&†W2ı.nfF6XO4Lk^ zo  ezxʫ)tmV#W*b.Kimj}{ͷs*JUI_\ny` KP&h&\= jIhn:Yau: |]›})+s}hImdTp\du:$%'ؠcVJ*m<yM9v5"$y-@;.%IbYu/x nN%+4ۂ,$vꈚ)|5{uݧ]-Ul*;J $D#o<1:k@'|v4k凌RKBc)D)XfK1t)sZ=b[cú{NLwziĴ/y *[Zʻ%2IHT긨(9 kz-Dڹ.W6Rr\{vXGFyuwb^Fo\"ndq82d[% 4sn4q vVT!/zv`m &,gVBL$!{$fMx/U!y oMBu@Vh=h^v [E_I&H@dM>NZ/qq?{MHJ' [̕ fΗDF2M>{QkU1#6hmV҉ +G4<ekTpdh|U '<;tAz>c/w4~YRlOF G#pHWY? 1%2Puz\kX> +- YU.0h@Ťm񌪹~Z*7[ ".2*%wrY+i "}zT! l`Ɨ4bM9@غ6zbI %E^QH// AG9te$N\ Ϭ̢з },H`q4MM=jv*^(SDDIj/.Enzm$xI)wa;ԁT_߀fM4ALBw !5m$(n2.+C%R+GD8Uc=EyJ%7`wh^jnkL,tVj?x'{""s2Jb])3BTV6@;phE 2g/{jM[Y:>DR+2(jdOFY׃?8>G>rB:yi8[Bz1[纜s|.l/J)#=2%5bP D+*UR MМD||}!:mdǰ ʆdvȽV9ZkP9}#:cb*#3?1ObO{\w [?~d-g+2ePW[ ks F|+3mn"9fEIZaKse(r~8Dg)o }Y#l0Gׂ#|'h0꤆D'8EHЅƝŜ7P Jވs;;+"cbl{U?v'8Ky}cRڧ<-juy./$F!?Ii^5TPX܎pU^CLqFNwK' wYs;{Uz۔5/VDt8b| ^?YcN:YГDce(Ƚ\6Q _:?Kt)W5fxPWSR\l0I- yugmKW` ĂSIr߾4z5u <]*pgFb&f .$A n y%|Oy$ pɮ U- XJv=3}թ9 JBgdZvʪTa4KVwh%UiCx_l Qhb@<*1aAq.qM4M6?%͔) >42C(߇dA+ Y kpjzG=#}vKal0+J J6z%tw>^ *Sˁ TgzEiZ: Ч7TH|'/xs[_CwX`@-kXZGxgVfZz{>- da`-F66o1ő.Hml77( mW@# XXޜ3[y~}D]uIH6h*B RT"w$qe\_PWS~4'}Q 1E1!n/O֏<`P%Y?ë ʽ@z*# 39Ӑe.8@gv %@7"P3,@@\#XI$&B6_"͔ RjH+CQt \U!_INLIDeLP:0? b B^ˆvΝȽDvN5͢8>~d^X?y O-dP~93˸sFw)k` ÞȠźCG81ۚuB_6l`'HNi+Ӂ_ E )()]f}4:q=bkȧx~yj'a/?cGL%FuROh lz*uG =#.1D;c8z'9QMƹ@.t U8.6R̙DIupaЕ|&5W c=>h"5{'371 ]bkRƭLJy"u?E8)=2%ڔú9Qͫ?6b Mpŧ%ālq uzro6?O^v[ϟ2 Um~Ip [sY{ʨ?,Rz/o³2t;]%th)[b_ֹPl@x#eUf#IO̼ l˅Bpb弢Q2n04'$_MЀTI-Lqsv;vpcr=+0ikɶ,}&T}:#1u03z*-~GW3ݟBxzy:0cjh&gK'Ya*|c"BVʮez&SC\ L:};7t-IͯakdpWc5%2kA÷Q `4L4寙yZfjTkQ&W.{!YXUNz/aV}X=.yEd)b%{jT%DoSkRTQY~۩jQ}Qrm|!"vO]? 05?e^sA̞\ )h($zdoY逄._G|$jDiKe90ĚF[;kjH!Ck|/h!M{hEc7ρK֞pQ4x{ Et,1c?$յ NiLg$#H+qRPOJڈ\҂F@ ɳ;H:ۛSz_@]9_͔ 8}`N,dܳ"3 zSm-7Q(HuWk,Vf#Sp͝nj l3nZң6"^u+r҈uQay *AuMK*g]Tӧ~Ȼ%V ulDo-pe>UjC:&& C?Eim@x 2fI-Q\c qA_~:eC&1Ub495qp!jɡ*tόCUr=9;" Ȏ鿩zѴA,:r|Tf!bt]Ga[0QC\͐lY)amIz%TË^mgiKTEK$㇛oC 6:(q~9UL^ / 1aj=8SX)[U"A`Z #j 4wY?7T|<\[,ၱD56O*.CɟCĥlhc5,7WX 9"$Z]ϚK^Arr1Ot:baa1a**PhMq!\iJ I=GH}nנ1R:1~%3LSI6 vջPCXrp^8.8h0u=3*Z{F=#k1$k)b@@"鈇NO4uAB  *> P!H s4@uv]/!%̆Ѳ%z=O`iA 䠩~w 纣?e XhO ۂ5"[tLC,U>]ps)~D`4eD_T;eTӾ^9G#Ӹhee8Geܓ  ֣'m?`D$aqx^I{PGկ''/du[ "5 I\ 脑>z;k(t::Sjt.@XS*M 'BBȈ R3W5;z5i΅34,%=T7 :)V5Fm.Tsx_;^K=Bhɫ邌k`#r!f C.D m\h/u6F߯`UAU+t8<濳L"3 zt* jQK)ݩU\nYFo#8Tw |%$ǍdAn <胃I}go\c 6:dS SYv>uNj+ш}1T{0ʦEQ*ܕo!l@J2{jo:FCzF.|tk{ʈȞ2)b;:V`hxFU7Ʋ3iVA.[A~fi)TxkJPΖ5 &ߛ-?^;??WRI{2['`|gigQw0.I %OI )r̐Y}ŀY (@Gdg4@Hlg?mm>{ÙR̽a6k ; ",IƏvޒ Vs KBIj)0A 5!5V5u5ë^u*%r6^6V]t(HXVnS:x %s{y`Aꀰ\/giXMT@35Aשv\*lYy!37 aeF[?!a|}Vf)"N▯>pe^sjYٰK\l!'IͳQFĬ׏B< H&l rфg&N(AjQ @3vFo _k+V8Jp-V˪OVa# ֻa^cYa+N(D~}~ h1tf  u@*O]1Ù3}VL@!h\foS%TZ`:Fv'aM.8xU\wp&,UX*= GC?@'nb8h24>#3,pANY >)gۤ~< =⃘;ax|Ȏ7M`0m_k /Yg$Q+CpYkRRPz:y"N«P} ]#ŏ<Jgd ʅ漙 70zp xMR&u)=DAq@܉9)cjg'3TO[!RYٙ]>k\,L[)gU2B ITcyzxΡmC[*w$ÇI|_\6mk/TJI#T&;sB[EEJR/\htѝn%_*0+q2cZ{Z(}C1OH\091Nƃ}Ɯ\\tFG{0Jkbj8˝h{ֲ<~ ,03݊>#X @Jg aR6 A[<ߚGh 2/ZsR/[K{ׇ YVOb FN Yz k ۬h":;#./BW bX 44U7U&T\򪒎DR,_(rtT%ڱ‡MnHPJϟXhk> ,F .1$fZwqpMp&'+2'91?HOFP[>!/feyCuueXuQG.l?xS+9cm2:UZ齎F@}53!/=4AM㿍d8*D4hq E<@wv R$5Q_mybڶ L`>NHDiq* ee9Bݩ¡ssh's\L\ Iybk3 3[jխRlù]WyVTj䱬ʏI.EdO㡳`ƃCvڄ킁\yki{W`%jĜ yjmQdzU$A~M9^ׇR5-=~Ӟ%]Womv/KILY$&$'L`ycB]+LB:1 [ Lgh//q⡝ 6S%276|zőVwa&tx$D,9pcmK: ?OlWɜ}dTr(n}d8gRݶ~jy(/'P$1w\XꦪZ_D}{GLi/`k6)hP߈+x٘Rrsm6[׸x|g!H`-cW7?V>?>{4 W˕?e 22;yw5IEx +5w%(C& T@Q35LG&fMap r7i-eYD[,Tė$4QGU|#@lsqkaGlzZȼn4{"b^hd%]/q U Fwjfge 83M8,[ oBQHZAXHoGPrk͚%(y]qyS-ZXwό7$F,TN: KS2rG.ـ2((9܋f^3^ ts[`y d~))InR`2fl%utD;΃ Gm, ҊV嬨otB,(%пv]DVtoK^f$/:xâoKLᄃJ5po7i(w\VЀk$u %{} R1cu"dõһLp(5^EBZY ~7h3 O)sE z^17b.NZOْ&S}P·=#YIhzkk;BSh"F"@"~8Q3tO{Z6c-ħ)~+*ke`v"3%҄"}^lޏ~7m0Ӹscd:XHu-\9H^$]}Du98$l=R'WuAL?My?TJGHݡv9Dl=JNE+a5W,sdGo U5g}ߴ>VbL*&DO?OB279(3 k;f'"yb_e4KWQ_S_[:#*kBL|aOs_(=0Y?\xX:eAДh2-Z:>ag,Ę5i1Zwx sT H,5mp)!:B*&B]jDx hJ-uyg SͤX.6W-…@{ԍVX%Q kvqFAf:'65:\,q]P?H˽h.r ˋ(1>y Ҁm<Gt P|ӑg JB &qf{;Dh H 1bcګv&Q|zTAL7>ϼ UBdXWw^5PॐSy_sĨF qY-ļkgG$\6gNql?CGRf68dĩ*Ə`S2nܵDpLnQI^&=q%m[ԱJ 4 $κODv 0 E?s^x֌uCQmK`x= +3Zb|I$ἏN~[Yn#rX:2,›Iҩ4/nV|AX%yC+G`9E>46ox^˽a~X o1AM''8h)S{?Э&yTWQJHa٠8 {yj 4 !f\* P{UOqV\ d{'Oƈ-b zX$,#pjҔ o:iqwx~R',*aD9IZܢrA=wě7tkN1,ٜ|l\iV z}09!#ZIȀ]HԵHٜ5r}fZ*(=4 ;wd/y]kx/{JNǦF/Ҙo?}׭=GY d W1 ?z9,ߍ6]mCݬo?i+WEf#& <"j>l`(jO휈t ? rE2$&vd >nc>Ѡ=G|tM09<= IO'aҪ|Ĕr0M}Ɂ Lߚud::?nLeO%FD:= KkjKZwqowT i\!Ze;}J?Hb?} sbr25Am0[t*ͽИ'g|>U#>> GR_cd28pғZw7P&u{_,Ni.됇V AJ`$Z4L PHV]ъV=sYa$wjP+Ʈ:eL+_ûsa[QpҒׅhBByy ѯg5.=tY! \aHJI *?:pWnHtU&%bkA%TٷOV4y{4]2-L O驧ѳs/TRާ\agCXB4rǛХ'l:dүsQ a\tXN<@ ' {ܓͩeޔ>窯wCO1Xb69UYֵ&j[p"[;IN|Kl,c IU nQo?{AͧMvj24DS¤^[cn6T&fn@_ij[K»9=xx,_L(10F= dk2ZPy P(LpSĬlHb~RHj# 2c۝ G>[s|Tmu1|uZyݽ*-r7}20Z!تc~,d]Ό8zU1ys6zJYUu^;G@Chw ә@99;,-{4c<~^@0~{@A3Zoeh8΅kL`3g>謹NMxH)BeKٿT>;qr/3kZPn'& (EG90Q}#kB' oAdȠ<3L:ڨt2gpa{쥐CɊ4#릗:3tDoT0l` ]%Y#PhqBJ: )B ΍pں5i__N*^]'&>EIQ˭7X%(ⵌSSCP TBuQsK E}?EQoД%f7t^QY_׶2R AOk&Yƺ?p䰁=8bY"ڃ41`ğT9gC+pDC j"Li6si-"`7WHtHL,Ejmsp#掄|iUp$)Mҙ=~:Ǩm>nd.lW|1 M WF03tu T&][lx5+Q7!EXa%H FlTюJ]$> ?$;j:0|"b3cx\b "F}|Ɔ\衁^bh-Bti0NF$húrN9Jk{PS[ \__R-t,:t{\VO[efqZJWL}n=O*3EpXd?^&yL镙p[z(_1'IFJ&9gRm^9`P;@;(5 Q߆*oh n7kF& IIf@pҠ:hO3xZ~ʏV-)@djgLH6ٞ!;@sVʥ٨շ]rSA|1CjݘAʶZ?4KC'/2$SKX,NhP v[UJ +~^JqFSJ2'ZkAwPs*%F4, ml¢`JU{Qk[V桪btX S; <@cH93@a'^cvKl3g#7+o#.hq?zULXS'. uu0Jn*hfD} G7}jl~l7ۦڗ1gcz%ׅtO75*(XRs*j8Z q~(8{ `wZo p@ŮwL:Y=Jmz)dp$Ȧ HPӰ@R> VPSfxyv 2RU&w ݵ3, <X4|ďj(z@!`v*g0@%/S`RZ,Aɷ%P]e+PsQIs[hE\O # Vq`KލCMo9\S-.#$O|Sr_u'LeQi8&R n Xï\n Xm6&JX׬8:$ &ڨ& Q} nvq7%h'+NX]s=1R>[zӰʭۥ9'o32V6KϫbQ^o'ڈA%IH:-4 uQwT-Yd Y[IԋZaImv -Ymy:r kQ)oPP=OVtgTNKa@d?xR-S :2(Qug.(7K{]XjՕkK!O"VDsO\f sz¢s (JJ(+7х}F@Z$@k HPK{ͱ"Yp /Qj[N HTNf"ID l 5:W@7^y"N5O g8[*ՠ>+"G[4 V~a::]xY2XJ_F:G(4nr @ u4kpM)xPV4NF]=,] 8>Fȫ`˝m-+s9VM<~lj"\Ɩ|wf NҫW _saRp^AVyx)Y('2uŏ)Ԇ2[jfrk(8uI6U/FYuSQ%8H^0voڍ9Xͪh&%*p\; YDCZfCK>Gx%7&R1L- L;mOl/9f?4GF\pxR2l8&A f ;gFT n8ChX` 9CCypv¸jM?5$nJ.4,꾶31!FˊC[oR6 } #V|upRaWFec۔ME8O8,9,L)\.f, ]!;C'N4\KvcErItB4֑yk[DvT.D`W6$;}V7ŕP/dx\uEs5=ǻ9R2\Vd(.E XcIW=JCWof9;%Ǖc~rJ?џDz"(7; -a^℟#ƜeOjL1.JSQ IDQ}SnѧʐdT_@P`6@ 9x` \$3 ǀ=޳ZQؚ/R)tsF+0dT]\8(' !!b-Z@Ʋt 9N$Ho~m39 Ce$졊3Ӭ)9VNr\W!-Dvx Eyi+'ߴS\I'v㡫?-SK|^V2QE-`+aYEڝ*EMYrz7KU79 %m"xxӽTMNBݑׅ,>Bҫh~AE#e#1 8}k `k1^~H5IUhK]U @&bx==3HQ&~Q9tdL †Enc\ڛ8"3Y|`( a;J !۹mnCq 3 |aWH+:&>^8YuQ{eQit/QeF M! zpxJQe|.1bɧr÷*l:(kW z]p$Ӓ{cEBGP/o>ecFKKcQ% P] eI7m69<*vXX:|T+F| 0wSc>݄t˽plJj|d&9! 60-Fp^ ]iW xG3 &RmIvQMU骉ܲ$^ w_5d +V0?C]׈U&xBJ~=ЎjNCtشt 쾏ce)TT"dLR>ݩN3W=Lm2}J}!r<$0 5Papt*@(~NXK"d8A F8~xЙ'5E{1`@矅*ɶ'3XLm?䥆GHPҮ7)?9ȠN t%L:rGP*QkbJ=%N݁xb@i!J*}@MOUn ndIW> Kڰ0s3S ZWL) %\)mn!yf`u|}}XIN+]ܖ_>l吼F1oW˷ gZWmF<hSH808 Մ@h&MfWU' ͫp"EDtų;&)F( /,%ڇk.myHKVXK.sp+E ~9&f"*dЯ"C5YlLy7$ۋqpkXa_h<OZ5̫ WC]{pE[GNzmPYIDqăW@tmP+Y͆5sLzkL AEVЧ r63C Qz(h/nn TAȆj%& XXh@qH Y@ ͍S:xG33\Mb.`l\f%- 劎d[6)ZƇ>_-uːp ԈdJA^<&=C:mp4da$t!Xyql\k2}u!+wlii_ w̺~E֌ȫG2`oW迄 F F 3j 2]Mt9:K 䄕br 7[If(ALJ_5:$%CeTH^QmKH JU~so3tv0w&Ŏ`%PI_vV(h uɍ FԪ{0X6=ݻ3zZ$]Bv\e}bBAaŗKz4g7O~&,q%LQ#6#W}piĵُy ƗE!IV\\pR5nlIEr%KnC>3?7(Ԃ x81v5}-`7'{_M1p_g?2S/N3>Q? SeAJܑ2Ӛ6_Cy\|jQ1.}Jc̻[5'X?;=H.>_UY%^`QM $ FlNVETq8#ލm!"rbI_>MkdM > 0K_gc`W@ZodOyU3H%P8ٙ5 z2V&*#a(]뻵]zI`-~U#ُ4?tNn-ZfA!æ %8{{4>N+_hd#N>nt[%_a;Dg_ru9rbew(`Nf,t%5b;/hF^'v蕂^ 3A\Q|i<E,4qNxHq-͜:#{2L.bHI$0h9Yrx2JBS z[`[U ^fTݜH6HJJzQaV6Om;pN}#$Ŧ6Z n%7Ry15%i.;i)O8n}/TT?` UZvC8Ȭ_ YOd-$mobbW֊j%0% t&h(kU*q%"Cձl9yl)Vs㞇"*ߩ[)El1 1v_ZiJ^L|dn 0(lU}EWlz15ykȆwB +7nYjh|޹euRy$!~aQL-qAp?,ȹbTyD.CDkb4iCiG7\6ǼN( i$- .suűԢo4NOs ŚΚQzҢ;7R .uVNB ]DeQj@/:m yr泬aG9_ 2Nl'xKIؑሡg޷̴n5L#0&ẚr\+pO/'IpUC?\jHH&{2-@eeshb($QwQ\ y O PfY }-f [ȸ},ϯl-ʜ7ٖrY#4X(u[՟Ndq|wrH/CWꍧ/ʒG[<s婷+) \s!Ʒ NkC9ՌI+16 (zڨ^Oh%/K ASQK Q8p4 a f2'ѽS`II[Swt1mSKIlB,]FAFSn̲kgW CXxt[U,=8y*E"ze󱏅v;Ȃ?/dhҘٚ ?#Ad_Olp{r#G2_+!6Xp9UV|u+a*GwR*E@{r\Ek38Aos~")`cΫſ61jۙXl}GVdNdeblWEP M97"'6CwINo^ՒrN~?@ (\q䯨Fs[r'kBhpH"=irL}7(Kɮ܃/_SKoϊrhPOʣ[ \۝oF AC9,"ѭ5V{XNF\ޕR~p,J%&t&-W;Wտ`* $bcyKD3A98xmgoaW 7iYƒ S<+<˭ [ iUconq|Tn%X',&t 5sGRY:zٟnG$/,g/(fʤ?mk~SEP1ڃv7Lڭ;YH6#Y^ï[}*Ys2Ͽ!)[G̯藁v=>< h]-ǘcC(;UFZEC[ArxHU^5:sw'P"lb)M>@#襇 \0e֚sA rIxgkp(U "XR&5hתi+(}qSTq dX]v#:'MPzk.v R3)tec5ڂr,/{lUԟ,byt,PnY~as}#H} %@5[{b^^{VILw{u~/Ex і,^Z0;B5#KH&b׊5|*90poI31U~m,̪6e$}#T)pUdD:A8>9Ublmu1wwbWĒH[CƒNF7Bj5Dku,?љ7V\otVm$2{hI3xWP[/YJ&+\UARQg8eØKϥYЄ9-x`J.4YQn|\b?aJaEٺIFfvhjGb\Q^ ]Ulgas1."z SJ+vZ{Xj|u;Hy9"Ǡ"_`,t`K\}V }s0Et0)3Úh;-Seh Wvg| +R0ԚNs]Oy{J iUEy TD7o-h"v@s&WSN+$U7{H+?9^ޑ̾KHtw9.\oF_%IxYgi2ՉB?Bd q8fN]Kp6 vE=MJL+ס19Vʼ;^FN.ⵒc=}|!O^u1dc^ ]"O/IW}wY{:dHgz/Vl|oUWղa*6zlox+trR&~ ~P˚u '.x {^R c-3xJT48YBqznCƁ{ZdVb@ҋٞ4+#jͶ66vT^T<r" Ӥ+k@'k܃5dVU CġPx3w9i2>YR<39 (4͓z`KȀz C;^ t43Ѯ^0*),ÙXu~TS!hbC2)wh[AXJS ]Ty[nOuW>On w K0$ļo[i Zx胲c!=œS6#hi VqTBxZlDh`{#.@_/wl̾lu_q=2gͼz*̢ObPr.fRN@'w ~Eؙf_1o=¢2ZY F\O9*w8:M{D~<y!c6g}@ h+Rd{ rAvy3:š^~.Hj{rVרDJ󔄍މy6aCPr.+M} o|Zbz'}0ID{X$Zj/IwL:KuXz?bsȰ< ^a`́cDLagglO j R7h:Gۉ_G  q8Bep֧,[`h?Qq92t'24(@4=^z\o5tʝ.a{"!O/ltrYg{VKr5@E3 z(ud)JV<^PTKe=^ ";9fDp@fEClf[-R#$|n3PcXLLS<-ϧ@ jR"Ǯ~ "uwZҋT],5obTk:m[͈\@WpI/gut3[R[e^H6R]*#ۦWPkJB"<JmɑDNn$j5B˰E~e+o7vW=_+`ZY.3RyIn%\۵w$2 /7&1llJ_E#݊U:{Cb\ NiXIlxY#i SM6S2V2M7Hr#Zς'wvH?,>Y#Ot'f3 rfQ@Jh(i'͡rlFjlq #\]DzҡHJP6*+,FBN: +"H8h sFA7@P٫ љřJGVp^{{+Nm^T>mxWw~^9ϊk}yD_eF)媅/2zP"X?ўaftsG 4N +>1f82$&҂o@Y qh&gHa@tm+Sr@l3WxVMB-#jȊ· "mZ_̣wᤥL4^Ui%4noGBkX*X^"ֲ;i,HG$s!H:P1\n}FCnJSRʞ}M$P;ʝdU^ɱK=D6{qmba:+O|5NbW؁0RrÛ߁4.PRl,eiz u#IQTN@[]dک?ӕ`ӛ*vdMgNDMܯ߃3>qc6bAd#[|9$ώ8c,jrKk)Ӈ!M8.#QUVI Jӛ* tn ܯt"<+*ͰxT*ƞ2 }\K >=/S1yǃ[CK+ybVIVNІ9Bx}x86= @~&>0 ee 2I-'@- (@R3G{ PS m̙j W4GFF"})4 E 2a)ܹ(@NhNjTOm o pf3;DQ紭&b7lAWr5ʼngC#!.<8uc%0TQ-`O&A$М8Y6/زp:(v4vhȀA#rb _  h9Ojdפ m?_}qE2pq%J'C>Nv߷[ow6>_I|Uy|^2`jɎa.0R3QD~t¡t u)h 5"%ڛMk H>GUp65m1pȟJ=#UHotNnDT%]pؕrvJZDEson35!<5OM6*ɝ$s=+xLUK2) "rގ97Qx1t@`rT]Fb3[=/:! j]39Ƴkdoj0"Ӳ|BV̖DajFg}Yҍm}X1yuq$C/'{dT5YhPSv*3Ʉss:v+Rh {#puSȺ-O{uC:b.2*(Deܪ nJEI"n6nW 7,:60QX\Yi_&ZJJME;pA7rlJZ<PGÓlrCI OL%h6qLu~t~$Cy])QdP3K@S2 :*Dꑯ5!7AYc*N_l48rws2{,hatȊa9]N8]*qmb\Hiv}Z)/_|j0tYc(!!k e E+=rojf͈2(5#{tQ&*ct{vBb]/ $t)ȓqEB7C+H6xc'۶l`y^_ I~w&Cq>Y>v G^;zϒ7yM.۪@Fy E%t38K+coh 8ܲ=MY=g`'( |3rk g0"qU M5;B9Ӏ=%!^4QKjbT^/*{C uȈfbMe*kMk<<U=o4uR#o򗖘]B%%&\Z$0@Rw|{{PKE3,v'io6)/1v+ ޿^;V Fx^drhޡzlI+bB/Wn[]C#Y%J[lh\D:KJб,Nao7"}iEXH0mjcFFRچ}*D_~pitPޜmZ) AKJWb gCHCUػD9|136?cɖ K‘e9[BD}j< HύMj0Ԙk. U/"q.DvgRt'Oi:)?XLu]plq]Y TRB}{18˿a+BDM3Nihlq\ S8+,DF+QSVWl"tǏE|JN?m-A<-/䞷^XP_fK4RG:<>H)E6Pch2^@Q[O/~ftI ~cZ[ä8NfbTrB2iv[hW[T]^5OSm!;я* @_ TRQ!KBSUQ$|uwJbhRՁ:  "6_{>=^,p&cMg#&0F@3ηyqgq.fФ+\O¤M}^ I΃ ,vyriP5ݬVwT~n?1 Xv3xּ<֊EׄSxjQFylϓwU-?VDܒw#txoǷ%~4',LelígLpL QiiR MzȂO: ӛ?SR~.TD|uQQQeXtB+'RÞ݊^IӸA\ΰ nBƍNtv'h7Ľޤ_KidAҲJJdbBPQwnih@tt,mXi| kf#$ܓ]EplC~j~u3ϵ 6v&+"ጲW\EL=Rэ~ gd&BtqT2Qg ,N>І  #1@* jO[39 l".>&G>1r0ڿl5AZZ7Y{!+#&^KhrHOH۬KvK)0peoՑXk!YB9wA?.",aG$pO5[q8nȱ%^Z`iYurR!&("~3爟EeUTr#jV=`MC(w%.gG[Xw7{l?{__/Kdc&fDkO̸Qdjy ǧ6:C\"\q  7b!rq>h5O#l,~5.,6#6^7Ek^;l _K,d{uF`Wrj1MM +"Q7 6N%%ByVŹصgQU5+Rt_AF^ e5/ұ^ 88Q]Y'P0@rhp)r` ٚQH)f(Mh5kMGtmsUxr7!Hrªƪ,n8"V÷g% ,tZIyr\H@nZ.w9%9r,>ޅ9fF2k^>i[v%e~3+RWZ;p(@AYFSo͉D{Sav ;a^WK>+W2 "Lh@۠F S]Bk4ԠܹSDoN4\&Y*JpXJeTF!@;FSPq0fצCD|FR57 c`wUK޼l;DJ= c codZЙmOd%D5DILmUAaR+mwgbWR,)&7 S W,:K7kuK=9Vbo/"VbS.f1Mz)LQ}{ b |;t806T+k$?U̡8)K:/`464և]gPˑ0KlL}EHF:3o 1n)8Xp-Wv!(l&g|*&5@|boU* N0yUf -v=Y_F+z=沞J94qQdw(]PdBGQ% 2Nnkg6?d5%R/lu2PbB#fbS&BA6{zu`5+͑b*&~ Is$Hmmn:Tڏ~c $v{2 lu:( ]7. ،FҴ_Z9+v& ^^&$^4şKmA<@$-m ,cII:>v:NvHb'?z1?sO\&ưy\yvP}'vpa + xq#盀z!9MRX.Ȥh/\: ʇ+.U`N}PKf>jb !E;x0Fij/ċ4|ݓ!T ./Rn e$q<}IJ. 'aBBv>N nԸQeGe9` QlRd=OvgFmrr+DS$1–[-"juP'hENr*,ڦRSaް+Qά Q"t Wt7MdP/x7:Ò 7N,VXkl>d[E4zs6UAe)–nN7RXpr_'g]i&m9[l`C +z[[<Pnׯe!I%UQY߿;)6B!(2f,4T#`n$7S*$w%%}'&CXd2zk&+w~Vj8("",#vj;70ZׂG/,iAy5m9XmV3ii([{ 人fɊd</bmն:$.~o6EXwXՒJy G`GApDBnapY\ hn̞ibrJBN[j8ɥS Ff\jBpQ%l")YbV;z~~\6/`bI+ZQ$V CF?C!hk0Vbh&NSR23'x2`P> ؘx6 -2+E"{;95o2Fɱac^sA(2O9=)hh;&(S kb6IQRSw|B"b:tu_07͐!QP",@AN~@,蘅VRe7kQ3Uo>1VH ÕYD>5y(?Tn>g) ;20jJ hb[t-bF;oI\*%Nt*t`ݡްSu\"x-KZNIL %C {ɢ7]Q=/ nk_Vt?X$LL' 8ƥen]2WI^·J(8.gjw@QJ,ߒ3t;Wgm™e/x 3luĠo Ms_&N/40Y?L)l&x<|2p$o-aau:PLbNG_^ցqË9Lw4(GDSW9 >Gys1<` BRA4z5Bh&Υayι.C5طiaNj&&ܛ?yJ &;3fnK<ȝKCQl% tx8т;Bc.7AcShڂ@5{@rjٚ4^j3(ňz6K[) /,Bm>#Yά>k׼1cg '[Lv&Ӳ w>* epKTsjlA owo)#iKB9s7!z2 5(uMWqԐ2/* 6ƜOpQ(_k} ~NAS D\>W1Re-ʾEA[?/neIjg13\YoX9kV(FGVx3v8lJٔ4Ċ@e-Uխ*oH9K:nyHs .VlQA%߉2tgv Lnlr+UzF p#[@.Ll;,[SD}=/r6PNC11 n&w ^s Iz %47=n;VVG5r0_(^L,6,=qG$G/v.jf9S9@Yfľ!_1CfG,5 dS z1+ ~E֔oLU`6k&V?3[FDhޝ(AgxsK~ 4g-EΙ ]ܤLon}p߀Y4;~v e\1^ @Kx;Z !WH43{̀"6ygm(OqN^R$SCw ?h9BPǓhD˦6MܝiopKW%f$X}  ʧ@:< S3;b_B):Q@/ieKaAYTML+[wFF Hkmv`'#E$yžcgRO7(`f٣%~X@1 GQF |lґop3]:#HUbztδ.k67*w}p2%$2Zd}Bn*_1i(X_Kg~ww!L<˒o,MWxpc#ou#8C'klSR#0GܼBJu8c5@6vnehHO*$Xs ݙPE=;a1fGEd/ZP<lnK x)ٖQCt`TOxt; 6x\C @YfƭEg،AWRz=0#bm&5^B@^`-1DK z傃*nx\JՅh؛Q'Gk t:,Bّx.V4ze,qyEHbW'7$6:_'hm._ zBS$%,ު啭m.pj:D tY>&+ecvd,*G2U+WᩮY7l!z_N[Bbv2B_+j,ڷ5L4"s~](OºdD:8$۱jR~|6B8AͿ^}٘A4OʤcdGS`vԭPmM$6oPI?T+'s¤YE3[GG8Q,B {q y HP飯J}O97OY*oC}I_{?ݱX[ BeJmMGQa$q@8RԈJRvml*zH j͆V.m98[BӴXD-|ydF07ɲg?_Y_#F1nRT2L㻄@!ʄt΂7W*Mhl!, ;t6Py/WŸ+X U5"=,f\Q7cz#9A_3O-0^xr&Z*$i$:F ֎e/'k;I<>Iv!:cyFP-EBW7tќ%dP㿋`!Oaom|bz]֧ "cJ~l<>^eS1fcy-bQ܍kNt gb"!KIcz<$#oQ Kbtth<)aFu%ǦJk8R}}TQ1/ n&S#?Q3y[eO'`8xKT '`LuD ؏MpKJn6?\vwe}~&Zpžʲ7R{ jG,(z,b< c')G@^DOܰ{TfliO /RT z.gLh(P-XTbXg |vWN#;WN='WJoґC/% A&6_N(>ˈ]}t+dx'JFA/*R%h;T8BlwA> _P!rzmh0L@^qa$ pp34Zp'Mgq ƸgyZ.: :a ꃕ :b!NA ȁO]50n0~h@iЌ 2br z <w6{+^!cGB}K#5-fdDAi|8<CYX.8J6/9FXv-L9;X`8 'gE'o/+R=&]&TUhudU /"mENd9 La>P\`K~ Ӹo?V×ZlK"V 5f;m XE:*/$zAľLKg :{ˣpuo ȕs HZ2+@RBk(zmUH~a$>97a2 3d0%5;s рX^*(=ϧzKX9.rgy.S%+k7.{0CA ",ΖX/g%pJKH7PHEk T1:g-jTq惈C+[D W%)> +Hז=xum߫oݠ?d`Ċ#&ME2GOp'$Q.t֥KENrPj 5MR|־1B8'3 '\5`|: S]R0+eBQԚUUc tw_D( 8TY2: JIv{FG(.nm+ɞҹXd?A1\\mDL΍6})$qq02*6GxZ`Z9)'*(UNܱԢrU{@ DIO8ݕ3$y> 9!cRL).\NOMpr1WXq??םҎ'|81% -=-F)DՄnm;ʞDjXW3c!~K6 d0w Q4Գt/~Sx@eЦ5k3ճUD_]w[jk(}+5_\x =EUp`DyGMd "vNI+ln6ڤ:elX _7&#f6t¸˘[Fu@鯞>*i>93u1d81(zZ~$[C1/6bH2kqljS$ϸ‡mqP_]Nٓ h9.JRGsJn)"Se־I@Qv·:Ox6Ydy,^ɚr`t-fH[TZ_R$/+kW&PzZrJ&u06 ]*C c.Kϝо)X9%sw T۬U)QH$ !D5PA`i ĭJ|l|\#k LcLǰ:AUiVp֡Op!P#Wieg,@ڵxRHr3H^-9ᒨ&(ٖh@>Vx 4rh"gz%5/n\>_#iXBBBOwTIhά[5 a63vHG,"Ǐ^R-'4JsMuW84=քXe U7qXQ\Mw'ӖuZm } >,uE]{$!>o-^50%LʔcRuY CYEMA6k6 tiWxQ4*!Myx*DUUpBy`H!Tj(g 5'ӴQ]Sqnfu]s}Wmab` O%F;e2u H-c GU:y |kE R cjon DAm|%%ll|-a~ #95ۖ$l:w]xV4 /,l?K9WAKb#3o`߽4<Ղ©㳲d]c3!S/~ iltH)7#:u?\5AfX-&|geQBWh0aP"ۿtMh=(ÑIf׹͆ڧ5Jnq^ )Oix꺱؁TQZaCa<~Σ@cGe kZ9CahUX.(m#g"Z5 >N{dbk5eJr/jsVkݶ叫"YN_]j%?qWyQ"ot%PD" ?Ú5Q@s5*t3@I)_sF3k60|d?K6+'l0:eeO[q.hQ #e'% A~zOQ7貫b m ʜ I;NcI5?U6RܽAqSA=2㗰͍4sҿM||]w{ɖ[ϨIb ;в7v@4^`cG*8NFإC=άfEd7yl WѕP,#38^FˁM\~ko<Ζ8uu%MqE*8VZ bb`2ݴr^mN-~M(K$1@ YEm;$0X Y=m>9/}I.|@Y?Ջ+JzyD"@.`pќKyUi.γ0FU\X SbZkIH~F<"y~ }7(5IՔ_S*PFrDg =5m[zK[K*ЊszI / I{gv8[MϏIAR++~LBiS V  D|2;G?~MWB}3U>e0.Ovs% {^Po=p:_,L/UƉ#3 5Ywk{\Ԑz_AysȲHk #*MgmKIUu X́I܈5mpn + QoM&XCUcΌ`kU)zأ" jY/Fp""_#t6L̶OGÚbØprt8Ze!'7 eڃQj,<GH6A">ő#5MM.ЧSR 9sYq@ATn(ߚ-6J*hI H^W!|: \m~A0]؈d26+KUaF:]Aՙw8}*7~g7a sCX0?M0[h>)y>QIx1T>fBS%\j4n4wvI)7钛_vF_i!MŎ9eu5|֯;tQ*b'^Niлt~ ^,)X7KTVFtqdVթ )e}BDoS6C5տ^cv+^*@~G|~$ޙc1?]A1{Z^QgZH{A8ċfA z44oZq.]\*o {;}&Q+51ɘڑyZGvx{AaȌ lw+-!55z<M^/cr~_%?\f4n0voRe8p$&%~v-p- 6+;$I{4ߊEHF"*@o|9k7T3ctaC򏼒)p]P`*ta M ]\8N$KpjX 8-N CWܧq;giF|DSZ/gyE+7| cW.z0y4:[ӾunM)S1 ~Nevs܍:q=ꑏc b'e4Qeb"r c7j+1@:_"ls֚a/F# ;\*i I#z!tԉaD*g`E9Rl kf}yu#<ﵸl1Up,׭تg&#Y>y |Rz-8,yPLEIhH- &b AmSW7QAB@;F,LIwe5R,=FI۾HjlG>dZ C>[P,68ţeM ډ^?TO >Kuw Ecs6FsحLѵ(ѽ\W?t1f}]Yd/Tȸ)1΂`!`f!r5MMdhUHkl4Swݔh ~VB_w `$`YU6{zG(ȯ*PjxlYq"@0"-E7#Y$0FO G|iؿ73Xu]y,\kNz| F7 ?M.ǪI#33te89"nO V\`X ,ܗ4&zεh]>^9Z*oI92\qtP\P P3c]@fs ~3lU0#Dی=BoOGf(jI —%sCR v6YߏA<+ŭxG?gcOV7, 3r_ezm]j2eE5"p74}i%01=%b]MQW&'d} y;iF m%/Ԯ2&Γ{KEZ~v% Q Co7H+Q;toOsE^ { K`Jbpjj MHSvݨkJv^SRHqՑ7 U~kB%pΪ1#5зZ0Zػ萦,~M_, =fը*0c0SL1'!+y;4'ksy]o0"#+(`nb峖G"" Qqth|f~N}L1jcJ+xF顪WC,c-%km89n0ĺ%U6buvTD+]p?W n cMf5pׁLNQ¯G=ؑDf&U:Q>U9R+޵bewOAsNq_ Ƃ}#@f881M^ W~4kƍ =d)ޣ/{T/&~ݿ_Y[}3~Dis+bYQ0B\h;24hg$q B* ?Oi02lJ!p(ߌ(z' @dt3*0!yP" 'yǦrָ).N >\)'iu !Ă<ހF#$6j5qdk ԑV'VJA<Xȇ0޽G7&KJhl_W;4qDE\WMoa"ya%J޿z]-Q;LKf{JW  o",w~A1B;N#,MKؤvs{o#$ɇXt5L{=;d:z*pcb%a&FBQ~:t* ɗ)Ր=:FTw sJʵZF 8\D]=<mnݖKbRWZ߮p )&1J!!( 2oSZM خ8;[C4T4^цvÙK`2KAb^<[ogyd-TCa,+daP$iMFVk @f&k"]{.r2q=XF'KtkK)"vTxb;4^45p|4\&0;.2>HZ^$(SdQ!H8K胆BPܧ8 Zxߦl :`]qƲ#՜agG~(39?Sd7w<YŃQrjiLCG/CA◩*"jY)7"4z?Og)LÕ2l (B8ß@QQțA)WA$2͙4m 8 ")|\?ýdNe_6Na|O;x5/cgF-]%i<ԢAʲD Onwp@q H%%&ޚkNzFNo~V!/I >OyDX7 <-df'qe.vG>3]~jlkؚ5dwxčjU0>1vdw܂<1艭Zn%jݤ'$W%Qb"P8tD@T\4I͆4Cma۞ hK(o/SL{ZB tK'S_*jШ* U[uWLSm~-^:=CdjI0zayUYŴf\گ5D{/k]g]Kx,sm<H -:#\d$lnڔ.x:ȴGI]!$aß!~luir#[M+ezY5q̷u/+%_*͈~` %fUL 2I}Unw~l:dDX_2sFJ9ZsbÞn_.H\e҇lsG}Su9Z ?055ij9 :!=~U@,g1>&4wښ$2HIH j("7_{fCbs3%e],54PĹİ*B a:% ЮݛMfОpX}ImqR@GZbBOrl3& +` 4 "`VwqDg'L9=aRdit-M! SfS|w|$CBqJw@K;Tˍ;,+ JEI_V2<:LDn(0.p3:J:ss1nbbW.\ZNN%g^>e:UFn>cX\O%AL}we MQ_BEj! |<<lɖjؠ0t#Jx{)5`5s4Ѩ4*)uDg *R"@!6M[lfhӊ^=gJBR%Z'V.?mV}72~xlt[˾sbE#=*aˏ\֎lC߲?b>6jA0e+]"hիf!fɧ gDV焫sRjjV)zqQM Ӽb=pC|E]>&yx0.6&n:'A%_a?gg9e'7ًӇoz ou9e:-̻C?s޷%z,\Kc.ͧU}s KXFmjֵEbVwv[1Jb@%]ʶ_Tfԁ3J_L]4)n洄1CTJRLR*jZϩugU{s!Ӑ}^$5Pqܗ騷*@pIF  sU3w&upɑgM%RX= xa9ֈ- ( gitpz !=&a\dw4 U5V̐n&/ k2:[4X.<Œ[e 7BmQh:Cyd4$ a-CP]$Lk*,Yom !zYlK Z /;  QC_p(@ PhSS =[ |SE\bۨjXH[x|Egk'H~ rmHąeԠ#:7clꩀ4O ԬC4ᄪW 8izNjlGsq-T> U#N!"r;wHub7n*KhJ:CG<8.̫9=~c61ռiDƗbÇkjkytzN6V!9DF )Z#=#5,xʵΐ67$Ǿ;^@^__Y82~gdeevV#drmPJ^gūWHs;u일+rp,cǒG7ь#8P,t=ֺ P F /ua#^L]8統ZAJXf(+xn=qDUu-[YqD|`d=Gic, .]ن8Ehs:%8!i ])` DgT/D@/7$qiW2T')܋P'm!"0!< "S/uzYp ]..wtt#+,_]xmI2޼sL:6P0.Ʌӏ*-rs$7B)),=iBB_֬Ӻι˛vyxwvoIn,E^DlYԝXv#Ӯz9nXk0g)YvLXT_VGa  e3 d Z6ʏ: HTÃn.(K- q2SoY=3']rY|GdRWk(Dxﭹa6eeqP%^v EʃY^ͦ9n~Ҝ-Dm$dH{ٷP(Ƞbzzv OPb+Hq>6Ul 'ePR.T uXK3MV!bۤJcM;fPD_ɸ:}:!;&V:euZ.M/i]HЋ iYtYms BB]Ȼ/G$)_Ls5 bR=@ Ip"^Ozʙr\ .]ꓨiXH~?Uv QѺnB1$OjO ;sXU`ٹwYM2Ū SHĄժFԨlWjwUb8 U_DDib:Ô}q!6%UfҔj5'*Q"Cr[cm֎@HsIErY59)Ov> mHc1|8Ӻ$mg'0ɍ*٠"ೋsi^ZiXIKyHg:&oCaRF5|IMusD<#-7 C"0$,plNIVt =RB$R6S |Νt+ܡrVy('?~T*n@8 $|Ug2;`ʪ^gR~b{z}案?Ɨ}jp2!Jg9Ѩ1t):J;Dj\ڵ^SB*^T+BhUoCkDιBy2)&lF:凱7P3kP ]xUsk>=k8-7`E.E:M8ѡX7h,. z_S8s4.9'$ܶ+Њ|CR0V;;92W]@/c[ \ŬJf%nC践G&1(Ԓ̧#'  S=YM2KuzK+>̙=<"]9|A0$Sc GPY/3.\%܏F,LH[|ٞp(oHK󪿮ec5m8e~ˉ;e%1YNJ nQQ'lz E xXR#* YZMUݫpqOt#Z8P*N[)ZoMeAm}Q4X&3Bcy1/v/qi8 @" RM (gg88@ U'}T3owd31,P@k>\'\#@d`,J9 VP WnHEsAF{fnRRv=1iˑf'T0h| SRY u^QǏ* if?KqP>k̽o'XKNqtGɲ A?(zBg07. X# >Og= <Od?5ȱK\KFmCu}o8x4gYi8=(BwWS_:Py _>szDhwb *d%6ʟ,"[QFšLW~ 8 ^ĩ's"j] vTrNJ}f~}D BK7d=3\P@(D\~ottsIcY4*e3;*)e@nz!{\/*9_~s*{#?.LȘmbEm(f9z $jM{ =$)G#0TvmԯFZS!7+GT<]hC_lCT}7 5՗_Wޛ}2LVTYcpfe2ӳ"R` [+bv):NgHSi 6Hmݓ凗  x}lAkZ\Lx]CǛp#JdʌЮ5lIW?o; ڋĉHo~,\y: :1Ѽ}}.TQm.p[c119 ]9ǯcB-h|*lY3KOh׶$ !VVFXm3Ȝ$,QRZ9Ja# uWe5.9@HXU;"}sNa30Ɂ>4jM\8Cmhe!I-R 8imWq yQs> BQ8Η3oq?>Fy(TY'K2)V?޷Ɨx3f~_N7- jB 0Lw̋،&<<ВVw5Vc°–$xO4Z5rg$x<>QҥX}&~@xFX*Qe͹kUtDyBD<*ݏmhLv[s$9 ?B+IL`w$ ̵# "C΋myJkSh Wǖ;BTo olEbc5K>zծo{2W.Lm\Xeiֽ6IGD>: dAg{y˽/ ͅ/1(b4}' L'?OLS+Wy̥6zJф%JM;tu4OՍb>(}*U*H?D>jى`U9GnnMtJa9X=;XEy'byWi¸r(CG[? M9i82: A2ZQD^+g[jKtU_p{Tq*2;r-Ib9_DPF[$ ais,Ӑ%B@mV~b5ő秚{[07"7{ŁJ_ 8aɖ1OfgތWOJ> 壯Sy?1hpR9OYe[S(5(BD(=j0-s+>)S9&$P=\mekTa/R"!8.%g2i`O"tg؁<)(]„7l}<iXHyYNTG.zG3 C@$t)DϙK\T\u63}_uBCK\=T ; `%X6۲/=!Q[YSc 8*tqѯTN*zѧ}\.w/Aps}4KhpgomZ]oSjdyJ͋f"8cFߠ 75ǵkl]{^#(C#/&ht*&/7S7u` ,*GO'[pG`KUQYl~okwkz#)2xݟE?k“{p3PƼCy/D09i[jLH9pTUpPZ{JFYܷ@HbA!U}gYh!( ϖ| <#ϼHrELMc soȜ`ȤJKFBP 8T›BM A['e!0j,RIPy#дX͠V)ƯgW]?qV\9E$f'E`K=&baԔ0(=bNwdsiY ,\M)!\E{FHUQ[4/!hv(Ȭ/n >S#&x{6g;1R9p-/FuY\Wk")8G^y=kcu [Uo8K;&5ސEqDӠDs_Bgnk.v%aMG|xV Xk  `ZEɹn C naUx]hoVEͧxTFߒ]:#\üPtIt0z<2eI//0(^νܮny1r1JPXnn[@F`vb>%|J&>00A  cZwZwq;OH,)򛁝sQs|4-[)A\_bÍ|}32j5`JЯ4]onKڿÕ Y \% 36:FY[)aAQkz MDΕtU /Yi lB zwmy! ϛ%(A,;%42)J쒄.*(d! mJ0MtӛC;pBR;ə'i5xGA)T uU`?AaՐw3Z5fk$@!=n%xg(#dsXl,bH`y#UKAL4)v*͝ ];!L%_knJLj"ɿI$Fũ2nx8s3b٤jb)QdM\ǩtPvq9|u+Aa0(p55< 4K*Ʌ8e(*$򞉾֪jhP?10Wc'4ymOظqxR-WPFF'-uWQr{&ȑ(bQ[p^:N mt&Kh. wqs}Cs_\dV)=Mm)I7aH5lܶmC?+_k|_6z"$Oݘy<Йetr~ǖg*1lE5ќv<"eC.b|*jӴi$p1!e &_%,i;Bmu9P#T4$x( ɐi-ot|B 95chg2mvW4q2H YKiVZ(nJz0i&:EJlKe.D4zE LoJK-b YMJUvi6m 8DUWU Hiw lF U҇_aVr2ziW?3[(Ȳw5]|S[tG5^d_~ "PLģ˞pNe Ky& qOLC`#Fn5*X,n\+0ÛKUF$Rax_~1`\岲X2v쮍(z[+G~lɱ ]X%~fV'>uQESE+3xd;Mޢ)x>5-=O ,dm10zrX:ԋ] CDo4&!i)4PNOB() reAu\?F-+I4 ]PSB+ěSsW5Q2ZE*0ѷ֧*#bM,SU@Y*3ܰb&VfJZaRu$bn{K^PQ}W}C-U& ^ioK`ThZڐ.FM<{{ XO| `qHcsZ7:  zN_|:Ք vT3#2a*U!+hNjVV+ r>#DH6Pf_gym+ i^@.UTぉ8YTptHgѠzC$g']85P>3zZq񒉳eӏ6bTuou^pqv5&(^bMO:UK> ZxDdoc4 DE-v"8_yLt^8T-LC 4 y l8DcqiOc{9Rk!yׂ;^ \Pjr|s >ˆ[<1hm|C ?G%' f2C r3N(Pid?K Ն6P F):z.3S)~\\ɟQ1,a,t'h*W[lŸ̌p ]UGj̭G39$:c9`M5>ڔ>)ugU0]!D2TTY6l[C, G^#EM;I1K}וv:toʊy\*Lr:~D\a.Ah}E΋FiS 1Ý5sPI6~ hm++C8@ )YEDt~=Net]@q{޸Jw_ʤ:'9ՃS H&:lBlq 弚\07nc*FC_WOXT =i߽ @c!;˘=ͥ/| GW *z"&016 MhoNU6>`/D[lkmP#yWt@M-hNf3 W' µ wnر4^nR[qK*X.B |'v4sej_\*4Ef8zL\+k_%҄.yn+:ۘ%"/LGG5` q>wp'e,)q#4C1F=R($9 SPhk`rjH 9iD"M(UTum`T8sSU4T۟徏/vwACL && X<<ѧД֩0j@T$)Z3߮LU9P]^dg٥}7 \9d,Ԩ)zJm:zSA)w؂aug㇒8e'Rvr4ƥ^:Q-=~ ,FmЈe?$;tȂ6̀ӛc=v+3q͆|1+ &FN -ǁs愞`NI7垀 eH2d;T OA/<w9?4ĈNY>ʭł26:[CI< 'ڳi\1DπxHAi g`^bEgR3o؛rR暨BniyI(u{ 5Ntx3tIϺb-a %;?bQ+ 3 K4Z&gٯoǐ{;"{Ys@/M-bR$|67ֻ/(rSYac!Pk2i x/sqYCj\N!Cz!ю^S>7 rC~TH4(X&dT#QtCdOA{N]-g/M~ ѥ8qCJ(@' 5iC~.7 usԠ<1qvM6Oc_=d>92JZSş?v9ߗb*wt^ .LFU_t̐Kp Te[G0-wIL94 NŒn\w&ϏM byQD1 2x򿈔jG S,QftjvQt)+QIYAd9)!D"t-4bBSI䞷g5x: ^;BD^ޟշ~GDW}ΰŸikyC&C '֛LUfUߤV2L-E±JpRj+ [_D#ޫv]j_^xhRGULT->%3Otl(4NNZ\#j >Qa᪰0"ߨ{=}NcFS]mc`͗>hbgNDf2~kq[1#?;BR]gsqeg4Rhf\]S5KB pU c[$"6up+n@[-'7),})HpT#puʪy-gvO]B.| g$DG0 阓0%ZZ> 5 HL0x9of=/x.vT1EG%`X+% rZ /:[{_ p).|/pv2O-T{rr)Z[(V1s䇮9W>mٰ7`*28;Ƒ(`'ckAD;mL"@{{)j/qS!0"I kZ@cuNDpz*k} {J.U{obQ6Xw/nN !qa~Uffo˪Yt΢7mGI ll$9L\ga<{y};fvҐa [b[^@-i `34)4I!yfՏA06QD:9IrpAQ;`u(5M鎒9,Tc !?u|Vw{n]0%v/Q*~]o#}xտ2rfު̛6z1>p0ޭ__h_$ɤ 6'Q>nߚ.ݼ?;O{XXrQFyzGDEtgA6dWioN9.z >M$:$\  ^ :a=l  \byU#լ=[9nlG(LW~#ɟAhֵ]LEs+jAέ;5SOvM>/܁U efdYIz;dn*Oƾ~PXT黥nyG !cQИ%0ÏLMZ?ѬSw{?fFw,ŘM>eYJz1G9Ҁ~5MF69-33$Yx]{# ^O?;z6qdʲ"LeKb'<N`G} 0B MH9dH<&@E{@m q37*TbJ[";y݁ rpܺix&u/us-~R3v4F e/E7i81:Z62 bK ÔSLQЫDCpbfϭR>b9[nQˁDG%tk?r`?6N1m͛gZWT 6-Qy_G! O Q|NSHӤ ex >eBz:OQ`p|Qh. fMjd.O@!჋r3FWjM6 ùwVic_$bxS!K2_7*uoG5 ?2sbUŌ |z2gAѣ0[jK_ҥU_ zjp/xQL?!»&KPGeiosI;Qਇoyrԕ M?j-7Q0|2vG@ȿɾ[}-gf 㵓15>Rq5#Z)ċr6IC<AlP*Iu8VLsyZn +-D )Ǯш6DKnm9NA:^sy(!&Jo?K}2g [Qy!<Q |M0 E=GSRqIqj'8K3w&}US ,QE\+D#t74/cix ;S, oydWm 'I.KWqJ&jZ m[(p$Px?@=ۦ2unIRC(3Wq+IB"9efN:t}Na~r1Ԛ52^n-!^giċ_$RToLZuC9SCl\Wnt7[vzA_ȯe8d͒ %<&'  N9H,;>j2ioOd DڤL%K߶朮P*t i_}X w!(\ހr 0XwEžY]&o8id)KJ%-yh anX9i..m'GFv P?ZEwi8^-Θ{7,5!F1:\I'_yfamR/r$)i&(c?VA0uDFS{27@kq8A/,̄3E5I#po\+&}_]ψ6A%pꚾYoɠU{Hezc&w=nk=hgYX,#1 jF#LNj$rE[O\ 9ֶ~Ń\C[ʠJli&o oMjVT%= :CjaWF' ˪hNmoU K ];`!&Aua_ ]"ND{ s]{Y>Э\ӏ0MI-`v٦=$fM3IjZR0rBDEgu(e5DnCKR  J%9EݕggX.D-DURuiw$uĊT,:49~.wZ`92%_Hl=MPӉ3bPTk̸:BC,/*Vp-](5XW:A;~'O{4/?\C&4zBi wYf8=n]X۫$pIbŜv=ԁ7J+E_Q)mg,QF2rctk4~[$RK]B**|E`wCaҰ~!2*,iAZ6T;x$ه!5P5lADOb )mrHIIbA\}:k4wHJd7v"v G&[{`s9Ibn)\7:1O&\aoyͶ|8}kG>0Fh2cP "&),036:=@DGJNQTW[^aehkoruy| "%),/369=@CGJMQTW[^aehkoruy| "%),/369<@CFJMPTWZ^adhknrux| "%(,/269<@CFJMPTWZ^adgknqux{ "%(+/259<?CFIMPSWZ]adgknqux{  !%(+/259<?CFILPSVZ]`dgjnqtx{~  !$(+.258<?BFILPSVZ]`dgjmqtw{~  !$(+.158;?BEILOSVY]`cgjmqtw{~  !$'+.158;?BEILORVY\`cfjmptwz~       $ ' * . 1 4 8 ; > B E H L O R V Y \ ` c f j m p s w z }        $ ' * . 1 4 7 ; > A E H K O R U Y \ _ c f i m p s w z }        # ' * - 1 4 7 ; > A E H K O R U X \ _ b f i l p s v z }        # & * - 0 4 7 : > A D H K N R U X \ _ b f i l p s v y }         # & * - 0 4 7 : = A D G K N Q U X [ _ b e i l o s v y }  #&)-037:=ADGKNQUX[_behlorvy| "&),036:=@DGJNQTX[^behlorvy| "&),036:=@DGJMQTW[^aehkoruy| "%),/369=@CGJMQTW[^aehknrux| "%),/269<@CFJMPTWZ^adhknrux| "%(,/269<@CFJMPSWZ]adgknqux{ !%(+/259<?CFIMPSWZ]adgknqtx{~  !%(+/258<?BFILPSVZ]`dgjnqtx{~  !$(+.258<?BFILPSVY]`cgjmqtw{~  !$'+.158;?BEILOSVY]`cgjmqtwz~  !$'+.158;>BEHLORVY\`cfjmptwz~   $'*.148;>BEHLORVY\_cfimpswz}   #'*-147;>AEHKORUY\_cfimpswz}   #'*-147;>ADHKNRUX\_bfilpsvz}  #&*-047:>ADHKNRUX\_bfilosvy}  #&)-037:=ADGKNQUX[_beilosvy} #&)-037:=ADGKNQTX[^behlorvy| "&),036:=@DGJNQTX[^behloruy|         " & ) , 0 3 6 9 = @ C G J M Q T W [ ^ a e h k o r u y |  !!! !!!!!!!"!%!)!,!/!3!6!9!=!@!C!G!J!M!Q!T!W!Z!^!a!d!h!k!n!r!u!x!|!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""" """""""""%"(","/"2"6"9"<"@"C"F"J"M"P"T"W"Z"^"a"d"h"k"n"r"u"x"{""""""""""""""""""""""""""""""""""""""""### #######"#%#(#,#/#2#6#9#<#?#C#F#I#M#P#S#W#Z#]#a#d#g#k#n#q#u#x#{########################################$$$ $ $$$$$$!$%$($+$/$2$5$9$<$?$C$F$I$M$P$S$W$Z$]$`$d$g$j$n$q$t$x${$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%% % %%%%%%!%$%(%+%.%2%5%8%<%?%B%F%I%L%P%S%V%Z%]%`%d%g%j%n%q%t%x%{%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&& & &&&&&&!&$&(&+&.&2&5&8&<&?&B&E&I&L&O&S&V&Y&]&`&c&g&j&m&q&t&w&{&~&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&''' ' ''''''!'$'''+'.'1'5'8';'?'B'E'I'L'O'S'V'Y']'`'c'g'j'm'p't'w'z'~''''''''''''''''''''''''''''''''''''''''(( ( ((((((!($('(*(.(1(4(8(;(>(B(E(H(L(O(R(V(Y(\(`(c(f(j(m(p(t(w(z(~(((((((((((((((((((((((((((((((((((((((()) ) )))))) )$)')*).)1)4)8);)>)B)E)H)L)O)R)U)Y)\)_)c)f)i)m)p)s)w)z)}))))))))))))))))))))))))))))))))))))))))** * ****** *#*'***-*1*4*7*;*>*A*E*H*K*O*R*U*Y*\*_*c*f*i*m*p*s*v*z*}****************************************++ + ++++++ +#+'+*+-+1+4+7+:+>+A+D+H+K+N+R+U+X+\+_+b+f+i+l+p+s+v+z+}++++++++++++++++++++++++++++++++++++++++,,, ,,,,,, ,#,&,*,-,0,4,7,:,>,A,D,H,K,N,R,U,X,[,_,b,e,i,l,o,s,v,y,},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--- -------#-&-)---0-3-7-:-=-A-D-G-K-N-Q-U-X-[-_-b-e-i-l-o-s-v-y-|----------------------------------------... .......#.&.).-.0.3.7.:.=.@.D.G.J.N.Q.T.X.[.^.b.e.h.l.o.r.v.y.|......................................../// ///////"/&/)/,/0/3/6/:/=/@/D/G/J/N/Q/T/X/[/^/a/e/h/k/o/r/u/y/|////////////////////////////////////////000 0000000"0%0)0,0/0306090=0@0C0G0J0M0Q0T0W0[0^0a0e0h0k0o0r0u0y0|0000000000000000000000000000000000000000111 1111111"1%1)1,1/1316191=1@1C1F1J1M1P1T1W1Z1^1a1d1h1k1n1r1u1x1|1111111111111111111111111111111111111111222 2222222"2%2(2,2/2226292<2@2C2F2J2M2P2T2W2Z2^2a2d2g2k2n2q2u2x2{2222222222222222222222222222222222222222333 3333333"3%3(3+3/3235393<3?3C3F3I3M3P3S3W3Z3]3a3d3g3k3n3q3u3x3{3333333333333333333333333333333333333333444 4 444444!4%4(4+4/4245494<4?4C4F4I4L4P4S4V4Z4]4`4d4g4j4n4q4t4x4{4~444444444444444444444444444444444444444555 5 555555!5$5(5+5.5255585<5?5B5F5I5L5P5S5V5Z5]5`5d5g5j5n5q5t5w5{5~555555555555555555555555555555555555555666 6 666666!6$6(6+6.6165686;6?6B6E6I6L6O6S6V6Y6]6`6c6g6j6m6q6t6w6{6~666666666666666666666666666666666666666677 7 777777!7$7'7+7.7175787;7?7B7E7I7L7O7S7V7Y7\7`7c7f7j7m7p7t7w7z7~777777777777777777777777777777777777777788 8 888888 8$8'8*8.8184888;8>8B8E8H8L8O8R8V8Y8\8`8c8f8j8m8p8t8w8z8}888888888888888888888888888888888888888899 9 999999 9$9'9*9.9194989;9>9A9E9H9K9O9R9U9Y9\9_9c9f9i9m9p9s9w9z9}9999999999999999999999999999999999999999:: : :::::: :#:':*:-:1:4:7:;:>:A:E:H:K:O:R:U:Y:\:_:b:f:i:l:p:s:v:z:}::::::::::::::::::::::::::::::::::::::::;; ; ;;;;;; ;#;&;*;-;0;4;7;:;>;A;D;H;K;N;R;U;X;\;_;b;f;i;l;p;s;v;z;};;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<< <<<<<< <#<&<*<-<0<4<7<:<><A<D<G<K<N<Q<U<X<[<_<b<e<i<l<o<s<v<y<}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=== =======#=&=)=-=0=3=7=:===A=D=G=K=N=Q=U=X=[=_=b=e=h=l=o=r=v=y=|========================================>>> >>>>>>>#>&>)>,>0>3>6>:>=>@>D>G>J>N>Q>T>X>[>^>b>e>h>l>o>r>v>y>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ???????"?&?)?,?0?3?6?:?=?@?D?G?J?M?Q?T?W?[?^?a?e?h?k?o?r?u?y?|????????????????????????????????????????@@@ @@@@@@@"@%@)@,@/@3@6@9@=@@@C@G@J@M@Q@T@W@[@^@a@e@h@k@n@r@u@x@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA AAAAAAA"A%A)A,A/A2A6A9AHBHEHHHLHOHRHVHYH\H`HcHfHiHmHpHsHwHzH}HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHII I IIIIII I$I'I*I-I1I4I7I;I>IAIEIHIKIOIRIUIYI\I_IcIfIiImIpIsIwIzI}IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJ J JJJJJJ J#J'J*J-J1J4J7J;J>JAJEJHJKJNJRJUJXJ\J_JbJfJiJlJpJsJvJzJ}JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKK K KKKKKK K#K&K*K-K0K4K7K:K>KAKDKHKKKNKRKUKXK\K_KbKfKiKlKoKsKvKyK}KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLL LLLLLL L#L&L*L-L0L3L7L:L=LALDLGLKLNLQLULXL[L_LbLeLiLlLoLsLvLyL}LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMM MMMMMMM#M&M)M-M0M3M7M:M=MAMDMGMKMNMQMTMXM[M^MbMeMhMlMoMrMvMyM|MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNN NNNNNNN"N&N)N,N0N3N6N:N=N@NDNGNJNNNQNTNXN[N^NbNeNhNlNoNrNvNyN|NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOO OOOOOOO"O&O)O,O0O3O6O9O=O@OCOGOJOMOQOTOWO[O^OaOeOhOkOoOrOuOyO|OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPP PPPPPPP"P%P)P,P/P3P6P9P=P@PCPGPJPMPQPTPWP[P^PaPdPhPkPnPrPuPxP|PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQ QQQQQQQ"Q%Q(Q,Q/Q2Q6Q9QWBWEWHWLWOWRWVWYW\W`WcWfWjWmWpWtWwWzW~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXX X XXXXXX X$X'X*X.X1X4X8X;X>XBXEXHXLXOXRXUXYX\X_XcXfXiXmXpXsXwXzX}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYY Y YYYYYY Y#Y'Y*Y-Y1Y4Y7Y;Y>YAYEYHYKYOYRYUYYY\Y_YcYfYiYmYpYsYvYzY}YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZ Z ZZZZZZ Z#Z'Z*Z-Z1Z4Z7Z:Z>ZAZDZHZKZNZRZUZXZ\Z_ZbZfZiZlZpZsZvZzZ}ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ[[[ [[[[[[ [#[&[*[-[0[4[7[:[>[A[D[H[K[N[R[U[X[\[_[b[e[i[l[o[s[v[y[}[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\ \\\\\\\#\&\)\-\0\3\7\:\=\A\D\G\K\N\Q\U\X\[\_\b\e\i\l\o\s\v\y\}\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]]] ]]]]]]]#]&])]-]0]3]7]:]=]A]D]G]J]N]Q]T]X][]^]b]e]h]l]o]r]v]y]|]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]^^^ ^^^^^^^"^&^)^,^0^3^6^:^=^@^D^G^J^N^Q^T^X^[^^^b^e^h^k^o^r^u^y^|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___ _______"_&_)_,_/_3_6_9_=_@_C_G_J_M_Q_T_W_[_^_a_e_h_k_o_r_u_y_|________________________________________``` ```````"`%`)`,`/`3`6`9`=`@`C`G`J`M`P`T`W`Z`^`a`d`h`k`n`r`u`x`|````````````````````````````````````````aaa aaaaaaa"a%a(a,a/a2a6a9agBgEgHgLgOgRgVgYg\g`gcgfgjgmgpgtgwgzg~gggggggggggggggggggggggggggggggggggggggghh h hhhhhh h$h'h*h.h1h4h8h;h>hAhEhHhKhOhRhUhYh\h_hchfhihmhphshwhzh}hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhii i iiiiii i#i'i*i-i1i4i7i;i>iAiEiHiKiOiRiUiYi\i_icifiiilipisivizi}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijj j jjjjjj j#j&j*j-j0j4j7j:j>jAjDjHjKjNjRjUjXj\j_jbjfjijljpjsjvjzj}jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkkk kkkkkk k#k&k*k-k0k4k7k:k>kAkDkHkKkNkQkUkXk[k_kbkekiklkokskvkyk}kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklll lllllll#l&l)l-l0l3l7l:l=lAlDlGlKlNlQlUlXl[l_lblelilllolrlvlyl|llllllllllllllllllllllllllllllllllllllllmmm mmmmmmm#m&m)m-m0m3m6m:m=m@mDmGmJmNmQmTmXm[m^mbmemhmlmomrmvmym|mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnn nnnnnnn"n&n)n,n0n3n6n:n=n@nDnGnJnNnQnTnWn[n^nanenhnknonrnunyn|nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnooo ooooooo"o%o)o,o/o3o6o9o=o@oCoGoJoMoQoToWo[o^oaoeohokooorouoxo|ooooooooooooooooooooooooooooooooooooooooppp ppppppp"p%p)p,p/p3p6p9pwBwEwHwLwOwRwVwYw\w`wcwfwjwmwpwswwwzw}wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxx x xxxxxx x$x'x*x.x1x4x7x;x>xAxExHxKxOxRxUxYx\x_xcxfxixmxpxsxwxzx}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyy y yyyyyy y#y'y*y-y1y4y7y;y>yAyEyHyKyOyRyUyXy\y_ybyfyiylypysyvyzy}yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzz z zzzzzz z#z&z*z-z0z4z7z:z>zAzDzHzKzNzRzUzXz\z_zbzfzizlzpzszvzyz}zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{ {{{{{{ {#{&{*{-{0{4{7{:{={A{D{G{K{N{Q{U{X{[{_{b{e{i{l{o{s{v{y{}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||| |||||||#|&|)|-|0|3|7|:|=|A|D|G|K|N|Q|U|X|[|^|b|e|h|l|o|r|v|y||||||||||||||||||||||||||||||||||||||||||}}} }}}}}}}"}&})},}0}3}6}:}=}@}D}G}J}N}Q}T}X}[}^}b}e}h}l}o}r}v}y}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~ ~~~~~~~"~&~)~,~0~3~6~:~=~@~C~G~J~M~Q~T~W~[~^~a~e~h~k~o~r~u~y~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "%),/369=@CGJMQTW[^adhknrux| "%(,/269<@CFJMPTWZ^adhknrF^M0ʼ8)DW*HXWsaW#wa"b߁)[- -9m,*V{h0[h{W!qm"D%ZJ]MxAނ8!v8Ga*Ue:,/[`ѕ(iFYLuI-rKF{"hHo/TP*_G{ q VAE:<+vq1CZN@ +VӋv}+@0bi}Ѵqvcl6d0鸞n(dާ="bѳ*CC=$932xһs@Iqk6AoHhKƪ^ gF3`hEǹ܋B^wմ4vc̮@"9ӮFuk)? yHȹaZ#`D-+M IF-Y=kP:(slxu` \wxo! F$= H9m׺v8SsJ_4 6fa^4bmCDl4*\4G7BĿgv5HuTU<43Yۦh׵/ꚒK v@E]p[Ik $AҠ2nƉ7H˶:Fұ[aFeKm@T 8l~dWG]> ІH+9)O F恠mWzUBT zQȋ<0QVD6;k栃RЩdXfK|e%#Uʏ dӥDԽ.h^۾+W)k鲏H:]ş I7u{Ba3V !&ZMaRLSkhF-p6Ka!ab:b& _hTXC̱F/ܔ }dwtgA"i.?ޣ׳׺zNl;.QQ$_:Ռ͠isbjy{!x2fwwrB CPD:)=EZ*jS v*79#&+xZsnO!mEbmˈO^m5^vJciVRjbYb?C \-씜|B=vu]N߂Ҿwq=djf>+zDYaMSX!#.|L=U{pXTzvahr|(zJ *LnywUDΓYQ7:NZ&呏$LAj)o/n!q[p^v-_8KZKcBTWz5Iucey4[JJ XSB]ӹqS^9A\u]5Q(/蒴H(Nh{(HI/tiZ&2y0Q-0! -)>HI0jLd=]x}iPt6W_zZD\_ vWVS܃d6a-wR-vqKs[6AiaC"|s[F'PrzT w!~:Tk+mP2SXi b)(IFa~hn8N9bm9{ٲi89=No{a@EzRC+UڏAFg"KyVH2jxy'TjvjsgQ%/-P4lm_"W&otVbR=2ߠCH7,V0狾,#zҘ'4=M_-T$p&k..֣+q \i0SSÝLez{pdJWTr[ B4'4şTwY =m|O2uR1)@ *7#\~X1g=-v%yHhE:c]N[~@E$X/_Z:א 2!s2P*:-#.6jr 0d\*UHJĭJPΩӞ}9:Uqm.{ =kNL `Ȭ,Rޒ MbK!xb+iגc|ʛ 4@D]C/"&K2vC;x;h A,Q4{]o]TpJImBNQw4 Qu?r\fq+ 2$Вj0(=RI2M`j嵑Z>-N$7EY<2JY Q[/a^#65amfE̾P%r<;X]`~+?mRG*t Kr/Xt8])pu2 'eYs5Zo:nF#4LSpohcQKiEBytk/EBڮ-bAn[U$ BY3i1XΐiXUIBj9q@H`B[7B7#nIϯBv2ET!*[ګ#T*%vOA|Vi W2hvKf:שѨMl t8BmA6T޻a4 M HK="gQD*zK`WI x^/+1H Hkecb^ 6{[ZڙF1=wq_E:LaZ.RYޘI( .OM 븟pIABm[2(g^c?J!e+ &8͛RRik >:6|S4UG4xC`sA:IWg3Mi/+YASPH\-A ab;yh&d 3Lyl`pMy} cūrXo H CfK+iѻV.ϞZ?ĦT1^4Tejd,CmFu* >uv8M¾i$zgy-IC& JvjszYApxۼԀy0\;T EZ5eYQW |ޮs%hԂ4+J߷I3 iv3 KMH.B\1l%џ]TnϧVѝ`Zzl W>GM/#5鉰QEpO,G1n8L$1VNK{Focڴ_|nI nZBXKA={Iv9+T^}t a xۓ%6iU[Έ5|hi$AE+ܶGCS4[ɭƒ.SN2RnՓB?䁊FQ;؏#6s%Q+#,krƒHe9h7v3sc`oe|KGx>u{aKBSvѷweZ_u=KTQW4KBƥ0;L]el;jSPq`n雇E~TepRډ?CʠD(axGߩ~ gCQlϑTU2c9]VQVT^@eGC/p(~`x*e,r20%eM; ]x:?@ <_>7ugC珚|K"{&5 OKِiw3cҎA83[^pbԝCUQQdڀu31)yJ];ߋ^7~I@.,N3tru ׮uyú%\Oyaz(!@Q]D֫͌tiFW/s\LRepFDL`G&Wzh>?ĜXU1c Yx0܇X!h^ـîFO{pK괦dyh!py:~9ۑpMFm$bй= r9)qX-THRWUízD(N24]jm5*9Xq䵠+mMpDJuG`_Mg,^auH UR)9 5;YZ6S3Ek'rd?_ . C>ؾȱ$ .~vwSdގ:!uݟs4iFh@Kʣ7tՊolCSlyA>_ Eъ8dGTE(D1Q?.Y3¸Mff5FO -((ywSLl&\`!V,'ه JN$XO tkwm0c-wЩ(WaS#-nc&F xU DT(ܠl |L'~uլ9tVC, NT!#fRn% 'յ'waF qJ#~ɔy S,d20>R6._.M8Lh7}>켍zg(3y`j=G_!C',1YvĿux%LwIhØ/wQI_k7χoJ>rHC~j>O|倂7Fi ]!Ύ#SbEK!cė4DNt@9V\.3]r TH k"t63|ϓrqE8ё&)bI%ZLu++2\8XVE6pnqP3bR_zcY@s!&T!F@i;G'wtX05Pf/ܩiXDTٔQ n+%|0;Snرڂj;=%;q{>=REN^#>JJ\GG Mg/Vul|\sY/jL'=g,v&Qn. P=!` q 7WP>`IG$#:d6*xd!GQOamdlM_YS~b tR\#䏾20WkNM+g&4,3tx*mȃbE9Y!v_AwّV{I}x${Q!Τʄ(`MMh L J*{' u B)4`!9W၁u|OnZ1(vOYAx4$,pɭ'ޏ)#w0+)KbQd-% x-;q&O4+uu]"e}y.xi0k2c7Ӧ'{Spu_ }ɅK vDXT-4fI2zYN;g^fBc1Un8[Xu@b %1,FdfrU xc5LXT=Ag¼eXjtW+^!چ4{x: ƀ5?BQ-ɵh(^2w{qSx;##:^¥Ark.>6UdS|Nhg+9{Q'Y~~A 1AAvs 0I&CT0acQ!Q}QhP4Q|$oTi|%Vieԁϛ"~(۷z7S|O%qa.YJ22HM:aOZRnMk禑8~?W p,yyc1 ' ).+^-)wW|gx0~ԣYd1ļ3f̲*M 3<>?%e$a!+=ְ̍ϲ\_ׄ%my1U;WlsLwK}* |l>~'BkXBO^ fNtyҞnMSf&6v' 1C#-\etTN>AJ@,8~b@NN\vi^tn Biw7`YG{Ls<E^^NFnG(E5R^ҟ IS5YX Yr-CzIGLQa̍agRt=[pnxiYܬ,80)〳("9Eg'V{׊ipx0}daಪGGVAkÚeL~d y|=by_kNK#_xt/ŽḰ&K[hC{"`wV7m@"KBT%"9ո##,F *ZžRiwƵCT;S6,š!Иk9Am8,gs{ vD7asKTHR̹,XP R9Ё^#i fЃPr0H|-#"N6;;fH@d'$e2<j" "ZP`(=q[m +X& N|+qdxs͘n (6vUa[6}OhxW6#ٸY,JUxNnc`^wgH#ko98dwbI"8X6EԀ!EGF=-zݕuÑA}+i o KF-]LUR4vu\6@æMʋޗ85\_`*gCtFIֽDBw|ZXkRx*Hj! 6UmQ%6j Jq ogiڏj?EOD% ]aKb\W6Rs$E;Ocnt]`˾=}yʡb69q@^2yIt8s~.ר=Jw{z&`еd~WXZ[z j)0D'^m0rRLNz21; Z^G"|gX\~D_p Y>qE:6Yj[AW4" ̃w _ ȃoHوvp3`Ԃ_ǔe@]E+pp^>YtW5fakM,xΔIoQ[!lR0XM1P1K3A3U/Dg< 'n?a3>A|b*;U޺IyM m[%QۭvIYj0W 3P(JY,,(c9wBْοd2%/W7Ე|cS;(Y}W~n{-ȅ߹<92g%WN^2+Tc@nh!P4b6SvRc6A^ \j;t^%A!@oWM{UM(c D_EJ$v) 4VmÎ0}[k.VIt lTzt|wm2:,>\Biz.$\$ HMsîfJ)j!Y}GeTMǒHsZNrE\jD\\? yZb@ /WU[sOhWppRT}s}9{(1LYڄV/`FUZRgU4hZ2D>I,;Wp;(0'+A$ՃqӉ@? +_\Im&%~Xie&$VGh4;:D7pnng÷t0kj΂*@iUD JEJbAQ|?ぬW5;bkG$+Jݨ/$N$g1.V!:Cٱ5Mt!'y~NSOiR)phF2-v*"5h!R Ds<ق4Fl?G ÎZ5A|f?!"s6GOsuQT@Ett rD#]hfQ4ykJwG>yq xj@e"BWUyWk ELP~GcY)`Nr-Fz[V, dV^Ż|J48θqrk7 ],}1[M CMӆ'w"'!NsuQ>JrYSahhiULkfza*1_Y= z-jRz *!8ꍱEY/ML@ۀ^*;e]8W/{h>{`_7pmu-{,C캚8wn"/вd $鬼sӴ`J igźP_ܼ -;z$ث8$]KCLwGfw,NI-4Gmt*;,1;)i@apLHd=a3e*G5oJw4{G_Z95 |< Xř'oq#wa-&2%@TWXG8,^չ8~A/P7*-".pOXEq38JF\{eXt*9L#o& .QlV1/?H+vTeE~03^zelvW%:`6 V<B> |/RO "!LpxSnle@Ge]ʹE/FK{C[c9#g`8FW:1T2t|_ߎ_x=i MdK{~ .ƢڊgV.BߚL;a=&<ڰ4^wb-cpR93ͅ0 7U>ghgSD@3R**9‰&S{@@>UP`t3ZP 0rkdp`Q @QUdNԌ(w[&̣hgm+g:~cZ16sXsyJlw_f`${Nf.]UTiRz9` b:(9]4u+?؇aiE{D29)gJbQAxsz M>?LAzJ%!JTRVYN`Q練.#puBn]kTax5ʾA;6J7/"婀QpÔ5=K\S|.$@h%j^ QfL ^3(m6QF.jv i_qu 9QxQ4xr9|baFSyIhee 3WG';4d:뛒7[BKq$'|-11xJA=BErQv8nH\ω2SG<&_sxFا{ \~fu.C,&Y69Xl(_T>ppU"m# `b_K#޻Z?C'fFVB4me;w^!j :1W,US=(cͦu? P)Y|mۇtv&Y1u@g& GvSiuޫWmDpUPpnةT֖uUGaL-+4 Oitj]1;`uo$ۨ>םcBWHsS=ra RݭbSMUYQ,LjhLO2GZh)4t:F]03$oBA ~p¿!4A7]?- QN^\ /*Մ+>=ugxceBvsTПt f6a_uMN)4Cؗ41}0~>O@d4ڔ2#:}́}]ScYP}xr:+$ C?+5px|x~RxJے0sIg BZ;!񐦟M)Wn]e_<$_ܲ0i-5>a` >vv4xBt)y4&1ZjoT*S$szKao(DKկ4(]Yb^9f1551J--2Sܶ1F\x>>^ba$-$8zsu1ssK3%>ە= 6\c,hSPfsH` RK$Dv{7£h\֐Z%@8&:p^`# ZŲL9ޟ 5q}X$[Ē XoȡCx'F:]D]!nqug.:TVqqXtɘ9'S5Ab'.ɬ͍ngh ~SA/iPKbSrE ]{1$,:N^VpY4?d46rZuR>-wIzkf`8x aF<5m- zCxFI[aQN?:&ΰXK=}9XT'ΈS0.^ 4{Rni$g}QX954d!J@j|{0A%y+FBA="&p[|^RSWWZ陓|ͪgfϣv81@md@XY@LPQp% ;)3 EpP_KȡM$*̮=E@lWdמ ; acVPO4l}ҺFd\08Sքrk Nys'E߳<ƭ f3Oh 1b]{PqV7?7SPzr 3~z6lM'BAY4RL`*bG91Xho_'rxeߨj${} >wqwX'R y/NL\a*G J.fg{NuSs4paYr} `3 X]z]@A"MS)(A *N (8@8 / ul:hP5YZU14b#(icot(IIBI8qI=+rC4ujRcY`;j-& ~8@B'|'J/_8:Dp+S0[2Ǭ翉T"Ugؖ\2Si+sHJU]5"N@>%/'߃Z4RCk8Q +:dg$!C&qeП]~ &--Jr0IH~# vǞ19\K|\nGPQO۬RyEG3ެ'I-)Ke%cpXggb=,c1pOy]@>k{ F=u{g>s Q+:uMH? Sо~726fI `O^44>nžwĿʺypӜPd@F;Wɾ4Kͭ}X }ѭ{^_@ e8a^lپ.EnT.bz7kOAw/CDVfeyVR}lXEUSYA:d(B9&m4 M+h%7?)S>9.Ƀ-8Ā#[A.rhM:8F rqRlrLqyo^Ǘ2gINfGΙ,۵ڲrܞ)7@IͫA Qc_/t-a)]POBPRi 68&u7s8h;_x6t4dbSpfO/+SFBwgD$}<4ƑN@l3WlSliv 6N%K76bPmS( Tq}9az$ɦ)qIi,83pg܇5z[̶=A@gQ`aLbr$Mh Au @x$y_;t/mଂJPvT1QdXwiD .BA !b^l>J|U6<ˣRj`_u=]#+Ӝhhv ,D87zӎDRt.yiBzAA? ˂b,DkH]z ؑfi }c${7wE [X 8&O5@rOJ]|YzLWqWcawd!@bqNm4Xl6"Gm9ەm(*yF(A.p3NXވ*R,,TWؑs9L@%"&oU5vt''3#0HWwEYaX$+{+z9Q+ #<Ve"nYv HmgvT+`X=l?>e9I ͻ_ʴ_~ z]Fw7d]Im4rW'>7NKUE#}c[2d.T-Ma ^l\dr_8ɜs0}MI.{*ù~ GV3k`b 4Rq4(Y$',i4.u߻z)Acx`"A_U;pw< dku,&K|h-%F~"c =R8m0t^ 7CzyZW:+oNw"<6mZsߪu#Ra{6D;LFD¬Jw=:ZDUJ WPdJqUk3ԎSr 62 2}x>f5Br'8цľ7GS߆,*|uDd1آp#hL{,.<5tSѭ c^e&SA^?!9BQEL}־OВr1E׵{עԎ Wc7"ɰ)^׭Mc晘܌ˉl/|q}9ɚ/` 8d]M_ #fn|AЯ;8W {=}XuXa6fk4@yQJmǐ DyI\& ȋ6)Z)#|! L \3t.)._3,  *jb_ s@\zh:e ;%xbqt>{vy,pD?bDKJf؈DJzQ7̡ϳ7{`!ݜ@H\[|^e~E?  [TĐ ~ [ t (ۧngyC`JTztTEo80H'ёJn ;eT80) "GZqnFvoI~iFa|_13-X;Sqge*1^VyFdgeA6k.셙VԻw]Xǀ>",TЧ:g?7lXɪGn|Gguۛy⨄ww +Ed>Ra\ӥ)TՆmF7uVMg`qT3:sGgȨEDl@ܦ3`$l+9V}i/ CQ"@x-u(;TCU oT)T%.Q(=2li3zЊiZT2+9vll3<M,kAp1*ݯulogDG@JE`stR̽tԛGKcլyiY~9W8uǏgd/ A^މ 7n /6Cj@G4;YRUg| :%SPYz- CrkQM.yh&dظEdOFzA%b`+zF}QK j¬H7=؈QmrS͚»o6giG6{iB'RIGgJQ À$eY]I_E$) e!W-aHo!:,[)Т/VQEHwqd}$Bᄋ l{D]pMW =p-H/fnGZU5 m0h&f2 l]lXUA4D|^BV~ct?q%.wAU2vk|QU/*vj"J?d7S̈́;{ɨR]ZO;u7 $s٦@E1ZaE[1mfO:PR7ѭ[ =Hir <~#_@cH&E2%\cMhN˝v|qLVN8s˟?^p@!Ꞣ^SJM߫جbPeu@W1jU]FK6`qXiS>ĪNC"(yFF  "f*01jj KPؗ\<&ڏ*P*K5/i%}źO^d}s˯3udpu;!nܼFv#Qv(mb@i ?~)Ĕ: VNII>IҞV {·3 96agdco\ۆF˙tD܎s+Dof:}i(ORϯEṼn<K~xuNgrkfw`%nrNk bN^C{#@QZqf.U6o4O"Kp!)6,PZ @9%z #VLzjC 7dFc «+eFEE}.3 B,M/HMNYK} /+wɫKN^RwZ/R]No5ջao0'qX˺GrX4Jz$jB%TҾH# wp@N@ΒOh:='dДPbPH7cɤ( yZA=+"o1ezdbŀBͲ)DW 6+ L~~~]{  kVHbE;SIO:5DUL+(̖%l ibFj_'62.G;i bCV{˕y8"]dG4M>DƪW_CD߯}62d`{=>.sxUm7þPB=*x IGkpmf1`C:w2fZeKP[k` Mn 8? $I>^$2ȸ{wMID_ 0F Kڎm[@]uVS}Lj0,>FnHY*$9HI,ר\X`umMX?4mG8 \ sҦ%! .G-+H scCH$J}iL0[Q͇j4G!|J؟TVmm"%܃_)Y]頫, f%od7&|0tAYp1:VDkR@wZ s07Fȫ*g_vqF! |W r M$ԶvR=Cw [*mFg44zYD֤@JOSF[jjxzD A\4qo1^ #}"U]2VQs͏}v+.F&\$klp{4 n["ݫI BH}W"XZG8#JXk\δS\-njn1VA. hMYdB.G֨3IKwvTAeA`XpJy֮ S!gpK(QxnLH(Χ)0ր Mi26.f_,%Z2/!t2 a 7LUD~ùN?QḄX6)l~>XJkrr4.'3)\a &lqodQsq*td%X[4Xyg?u膚H7xo.rAWĜhusgBNS(ZEVљqRPbʧrqqKIt!# y3+}HFn4\[QH+1)6:KX &4r@e6c>^3pH=A nƷ@`GHO"5`FٚF)*P~=E8YjZ!8$APs;w5݌V&نF}s*F-Qd~P B]0lx3GLL.EKs8Nr&IZ CVY!_yaܡ^`p6ܰTk{7WySJ% 615m DiCDM2ʂ6',tNw'"?!$ , YBT|#17"׎imn) LoRX6[,Ejj=8d+s -gtt;KsFw][^H&|@Quҧ DzCb~KV5u0PHQULYzޑڳޫns%dOWI8*ׄoV6`VsJXun|}-gz3qE.WIBŌNc6LM4_CsZ{*ےpebCR`7Z͢87+z}saSԋ`" Xp#x;@Lmtйhɮ[Tn0MjVJ`cEh/{Xr`mf`(E~\x>#+Y`g\]@h9Ku }8=րs%LuP˜]1gK܆ 57: a.$tOb'Lu# d J'b p)1A'M_d'ǥd/[.h f0h8h xjj4=QA ϼh"G,CI>Bb7dQϞj#X(x\gGf&ҺEeƀD%/s3B,|ЪbHܳw=$>o)W{OU{ԠՌ!Mj =QqZc* pVaNL!Th1|*ZZ7v kH !Mtq\ ܫe"!2aQ_䍳]jXV<$bHy8zC"Xr7C6Qj e*OUV=KwjF4YTk+Nԃ%Gj^Xo)Fi?Lūׯpv-Zװ,%RN^-ogO[mJK1 fh罢uKA#2~` \}P&BamKWgўϬ sZNNS\$kBKk,bSGJH1$^bg:s<;(\Z=ȁIШC~574 JrpF QD쯞'#{y7I>X- o Me[UWOWNn<me6U_ qv3v3mDKD~zɬNT@;mp4-VVz%Wj5iIY  ku 7vԂeA*BB&7UǧPSCDϟ_`~Ѵүj`Ѭ$(T=xÇ,8Xk~b2''.2i +ڴ23t#!D\Q8S\A`ѵb?@Q3%(3/RE:Ϛe')W5 F2f @fz.zvatU,E_t4@xQXǾyjw-2BPe5_.?/y.OdwEt>Rdny{bf^gN9ܥFg}!a: N]V&{PKѣ'`Ni%HF$XbS/H)A 1a83X-:;s^,^&cvzBWmW$Wpe@;ۚ(HLHDl nm~PIA93vxj۬_WZ!HI<ܳɖ9w6X]1--i:X<>C) J}Zuӛ nn]E!qLw‹Bwd>A=pt(5YW*,oמWHf0H.r^/,,5hKq-, 5>[sv*X{7w5C08yџ7h r\ZqM炊!b〯C"HG-,ve #iaVkYo9]w>ilhġzb9B,oaoCjDCc;K!EԨ~'!7 Z˔qa>ռJ^)#bW Sf[鄋0O= 8]\vq:'lNJN3W> 昆kCx8C߰]ON({.0 ?hF(xV֥Tu>?h;"&:hs:f2@C¹, >,RsBЧ7 ~A Q2hMwofr2KLe? U|,@!ϓj85g^eoV~g14UGtaB0Mk[$Oj*"yc?d|Y!1b 2-E*"uqxFX<=ۯ0h0F{G?skZ5K+'k , /&l hޞ}A+IMOPE$˺/cv`"G]c83m4~;HTFTx%L>G@&LIQU2% tyK>[* YPMCkp~n W^5 Sp`씟åLzONuI7!3fcɰ3oQ'SIOwX&[- !\ag`n׫:no83*s%]Efz,Hee4oeq`G|8qH@_t{N@M72K YZ.RZ=bK@ޡ^.6wp!t8Z]sXf=b{_+e.A.JF)Ƥ4:m7vVl"Ws5nA4  A˿~xJikmhD8*`2ߗ[NѤ!äDꆅunk'}r".U3RJF.6}LO@jpAk DfQ3e.VVqOr thڎC(eĀ^kTCu ˱2 Sq0 FԑBQ5=6?hw~o6)&% ܱRҁ'vA^˿4ot6Ck S^@Gbq]Qz5/\ib 5PٺtIf7Yí;3AsIGad)wLȘQh,r~@cOY&!fB Y<2`Doxc KpG䫹.RO/"Kf?xMm抖"|.F,n 4]ߓ]'kp5 NJ1ea]M&TQ1 w3b_m?BǣyۉpT*h*`[/މ$Gb\k5LQ̱Ɔ52ͺVzFC_e?-$w(ZCB%iV)Jl)Y3w2V7JYjw?Yy7v OmlJG?C,coUς mLœ袈]YXTw Ƶ+cNl ujIt8w 2Ǜ10C؋ԠrEH$9nn2=nF<R9nLN~tx|JCX ds"RJp-QTnJG%Hs:|&b+-3%ͅT1OE.&ZI:v=n@' Vc?:@)㔰"\ɓ&J1m$LlgUn ]NQ]AXNSV~,C5뉺xQOucQafT8u Tf,eq ORi7& i0Q7߆f{/NXe̓YB|@*&ŏ( {ax*pqRО[os20w!Yjzq^5̍HgaBCYRh~p1x".<*PU.X@Ef%=뼧x:4$yǮPy)e?% Aekyd]W\3CUR/\}X3~v  X*>Y}w[AܮN*AԐ (#N:ipHr2`SQZbtQ ()_∃ 6Z$8%8{%qYZ{5B8O i#nLGo/ƉJ chCkksJ0`\s8,]{BF/XU:&.]VFګC /V;*obmkuWkhK bt&Q ]嬺ޅ}$cIB^0oXU[(eu/91(KfT7b&c*!frn9>1bLкѪG6otDǍB: ń9XYü5pKX 9{Xco!&~7'ǭ/Er o>%Ex2^sm9t{{Ψ< 2|WVz5FmɇZ1Z~[mv<˗!BLݴ;xᫀ7^8XD R_]ɶ `EcvoUx-}T' U|d\ Q} hz[ k!:aE0#"JhmgQT|>}0qrXrU.AI)1'jeh|VyQ1>Ą{[+fe`H .,N Zvb2XDUwNQXA1hi Wb^R4!D0R|l^ AEfv;ӨUsM!H4{v sҡ =ϓ a)TLu7F \ ʷm! føhyZLAOIj!l~Gr/ 5ȟkzsKpQaǣ *GٕO;NBY^f!:ƍʘP{#bҨ)HoDvT˛ؘu~ -V}̓ *JWj}Rj^ǡV`v\lnsҾ69J2l:ݮxst d$Ccn(ФJmč]H().j 3I2WdH&6tZAtUYP{>mm-qM7hu7r~8kͱGdDNr\Fc!"@l03VXiIs/kwE%. GKrkn0(=B{+wi]= oGXE/"LmZvbAYC9ϊY.DVA+j/T6?7H9k uBncva"yr5DeCQebS\JN' |q)khWoC>T.;h\kbyP} 6br-K:Ni'_4%!nRHѽgAvn)Ԧ !FսER'!ʳP`2ᗗvK-bj4ef8$U^{RVR|_2^iB*O\}AE@(nutZf[9nbCWPx e+ঀ2~HR ;ご^mdL>U6Р*b ͵J\}&U""_zH(.zruNEw)MYZ2KbVUlU /0~q>{8ȷCzĸUP+g6C+YRjL s*!%5pnu]_bOIuinE'!5Sy!6w>moe i' u)AJZFI -cB>VfqY3'J]N81,$ #Y_HB/vt>0c ޣ 4o;mIjIB "m$HjDV[aF (S-nkH &.ڄ+,r'}We$C'G4\3=[Gp\mWXXAt?? 2YH]z- .5-oM"o8pMzl|m3|p#*iYuEF[!IvLUKSWWirmj꒦_g^+'lo+kq\ %[QX D|KkӉ6%KMsf":%U[iH8a@yȐbjTjVrg +k}:suBOǜWbsO INe{ϨJS>i:PczBhtcۡ>ZӴg|F'a$֌)Zz)%gPJ@xz RfsD2Qa^ًY?*! geNb\o'Ot);m~KqܙA%Jl=E9O!}.Tro\3!c`k4Veci:i6O 3)@ 0d{80>{6QAXZh~gMPkO]ML2f5Rn0pEf 0r#9`^uf9[ < e(}^'Nlx[׷9'%AR?i+K%HD7Loa描^Zp^@/ZE{ss$$Fr?8 vc]m.6\Tl(֍k'CII+3|ц^p6b)~M{бMCm,*MBt&;nm"iDS7ɇFTTH3U5 #FIIDl)!8j4i#E ^k+;΍cc@ k6kFC2_Aqƕ4\hPwS6~t<8b s/%3hh_e{8+hA=1=A%Ġ%A;?6BDZ'M}J &U/QA @RհuqmdPo0q5W3˺df!4Qjt Ӎd|M-~Ur¨&XuNumO*/JR̮nRMli#pj^cjӯg\*ZagKǃf, |"ʹyx| hD\'ùNzkr\0!V鲂3haX*=^)alCѢ[_~@z`cI0ڹ#E΀ZhJL8TQ諬|3!Fjٹ\_2f[}e B(mPh33w6mMf9 tGD2!`EJyVIGQ;|Cw~)V ]W) Tq3_8Hy(a) GJ#jx F`AXr3Xݏ&W-y@ƸQhϧo ޺Wx)c kdž{L hobEeΡm[] 6FyZ/`O  V~B  VRq;8ࣜilϒi|p:%6a%FWl!!C g + oXHm`jTc(@'vP{ gd]H Si^qx=JͰ) _:[+BCwVݘiHs @qyRRXUXl@P-49Zdg-M3W7ClRkc@wHx _ETGf+|62PZ(@XVt$@Q1G?d:2P.nel8 ^-Уب"e5~vdf#:1{b5iNuԢ.>$U@,)bQ: mjP|Ll@{5r訄mڐsN{pgz%DMz"% 7uPaÚ rnUJ`YDGGM˄UdytEAJg\xjE ru>lЩ+!:KfVN/ԾRN-#E`i? ^v!;6n"9kVyBC輊u735yZKQMPℵ{֋SAvIż[梴ZSrkc[ c]]2raqe~"i{|rz]ZzcGCfQJd!GYqX<Cg@2]}j@iYo&2-/ -bـot|p?|=Jd.sjm2S:zFOLj#/9ŎgYm XWQ#Dzg}'UvrA-!.xmRBV `N8(O+n]??\kD+Ͻ<rl!"642UǶB, Uw(鯫 2?]j<I^yMK=ǬBD3\;-6n!bٴ_WS~@܉iLʩ#eheX+)VSA p=UIҺ ?A.ß Ķ~+ h svϤQG ud(6'0傐CTeP}J 1r1|tT܄qph`r{C{n' CI FOANrsYiP Iܑ̯؏c2NI_ (ޘHy\Ss|ı$1-N;GVي_M{0WIaM5mxJ٫m =? qƭy:ae'(TЖHZ Oh 8y_SX`94B>MiJg1aßK]o)M ]}yʳ^su`f<犦IrG=D2rvhI\18̬I?.v-J[=0)W8nvϤ{!h\2 Ms'mIRNf)s4qH泽XۿnXA \\jgCUEY B4FNO337DATpRmXو<]Avȣ@Q)V| 21nuFz- $J]ew0Ìڵ- HEظLjǘP#y .[V zź++$lWF}kǾyhiSgwD3Tw \XLL'CaBd"_K7WNjiN|OоMUm"qAavۻc\F+ȱ2#k [R ׶ҪA|i_-lP: >+;(BRCd%d%1 Jr/A&5wZ/}7gqngY5$X-֊]N.uY;SJqUp C-ܪ.Dx,bFWfd/jГ89UֿX>2zv\]yb\| DוfLus`eוBp{3rM{@_~yxuHr?M;SMY@UF:OW!w/KZkImG(008H+kTȍJ;0ƛHYT13<'? Ef8_aq"Y\Ͳ1tό2Wc䧷}+pل9~Q0l`km\~&0İӮ~D8[}*{Ry/<#`]'UDZd?Yo& c;ml2*8=4qjiG9Xe'wxCBjD؆Gd?1~jeƔ5eGiVԇQq(SU)>{J>ãl饍g/sX'چyjm;:?Z@b2뱐W4 *W"_¶(;w H"-Bۭ]vr (ZQ=RұR4Gw]l(nL?8p 3s#/ӏl yD$op'pF7xPsX "EmL XEdHغIjV^Bzgnؿ+oޞt-t v .ڐi@&̓cDί a@א&pٻU[;xM7wVytd Vd 50 ЪzkY8%kPc H >u_(!Wª,C紆$"N5-NISvrrS!b(j-kp~!H-hU=YTCmQElal|AAʪ;*\Z&XU#yqRo}4ypz/*,:Xq;Rf%ntݚO$ '@D^-D>1%ץ>o*ҔcLp|0KP5kՍ}LON u!(` dJ{K* vNAxj28?{I}p-R-M q(UT'Ym%3N qyLMr*.)cX\.ڱot9jSwSqHi(ODňN7}"JԨrךmDP$glb_*!EEܓj+9] Sr!%-āG75jV8EvtIgu4,MBBCH6 CaݷAb҂ef [b!OBl%I{r"b~Iqnݔ2dqC W }Mۇu4NG Q:͓TO0-zQ kXL-)c;eF1?l!oP`exEs):_co!tE$Ѹ>uVxe|P'4Wx <)+Vlglum >Ƕldc7F fQǦ<2C=|@_補(??:&y6>TLУ6[jCsfoDiajbйJyB `iihݥҊ9=BSDD(6BS&d ăTOmSR7V>Vo6c $){H(g{uO<,eVG&7m-ɯ@{[3SL$m@oxhx'PZ2f'mHgq4W1e>1f^+NN̺UW~W'_?>ە:ٓ:_PT N,vhNQ LR8 -(/.;bwӞb0& &$ykIa{ķhDA=WgKa4 qÆ<M'т rA^vzNNt( d`f10?KZM"aK=}x3pϩ!y'9pܚOZf!NK͟B q>#qW!^> 1BG8|S~~M)NaMm0u'^),-Nn;sPDLIP3 9Iۂ{ D8aŊd[N#)VvהJrofY4Q;0pN4j]ʶG =%ʳ_m>43)65S"TɏJņ[}DNATi,evsg: whUQC!8q_%edϻP͔k)ræoAݞawsNq i U]Dmfq%*`DFhaspNtaJͮ(58ەZ]UX9zy sR;1znE$w %,84bDDžl*(Em Q7F/z7VXv]5rV{gDK M;JqSū9l@ %P/dy[tL?D9CB/$6*?a2OkTU;;iDM7}O@ v$ji)0D4JBe>WrWAsZ<'Vr]45>aNj-TFqR3 qt®)"txC gvN 9-;Zh{PIJh@UQ"B#QxJBZ$.yV\Pjl1fV]\i nDZz,dgeB:ǽT"uȳC펉հNY}`Min5I]P*%Tu.Wr2NN9䠃%Cgtt.w&zY"GbUlTKc‘zU6.zNÔi~{RK,|5UnG©C֒L ,y]'^7ۂI2w_)-"rش?!W5#e?nwjZUG4s6AC;6eJhqܻ.+IОD//2^]Fju_6xnĺ>^gm(u:L8Ă!"44g Q9IH_Fu+b!)WAN%€E[R69SeiC"- dBѡbGirpUT߁j o~"%쭁G Dj)W" [#9{kn gbYOgEEnlZ,Qo@i%[+-oQţC٣Emq{dʥ&koVIWttj 8fk}佷=OĴ4ʒE ,@mɈⅉc֒`[ 1DR*[k4Z7]9-hz>U&1zpoEbd#xwYLjX9L4. +yek]Up~Bn_Lu?ƴߦ[*VYk>S1_DS^!?lDh:; TD:^Q+[u'AmfJ 鶕v]%[R%KQ;I]hP$+4ᴮsbF^eu$6bEץ5k6Qn+і4_¯O}`Jm* ccOI v|A죜< M;/9UIDh#Vl6381Q/ {Y)Ջks#PG HWJ:"9e74HS_2l,&$Y RN y+N>AZ'>m^g`(DKWa*EpyZTccM;\Cռ9qeUי&M4bj9T ,yVξ*M@puPaKرDiզ @:0(ig܀F{'Ahb3eI;sw*ò[^nhRg؍"cJt gtuJa,%gֹȀNb!R]Q̀QGoSyw@QLhmEjt3%3 uzȲ/ќDd BH֟.yWMz{YU=N"[ǗzpìV?Y5+@d8q~G^&kLǗ$z* >ä2G^W{b3nA5hMX9۶h'-h;1_B\+q!?oCtxIr8!%_{iZtEf\ǑI"Gci.6E`1V RV?86̒B\T4Wkl\:㡿QUBc6sVC)HCsIj\x&xRy<9C!P,3T$܄l[0VKl)$7yj\ 3$ 5>9KxNB,?mCUqzB{$ I0jC{sKPTl^-DP[iEP-eHep6dk$r{V@y~N e-lr|- ?{V':_h! OL>S8OHb訛,qw隌b h"I#Zf "Bw໾3/{U=[TIjXl5]1MJ -#YkgurnGHO}`ڌAPkA/SC'JyCֲXBEVzTw@U􍣌+nJucխ'v |ȉ@ϸ8C:E&#SJ1: :zߥBVlzgkxAIڴĠWϙ+l烌 c¿b+vU"ɍP {dӖ!;C7(o;vj; dJљ=) T+s㺟KӦE] dEM{4*iC8'Co^DvkvZ(^+ pJ`:B vUSiq66( HR{ĈxٍlY OAC2O@7۽(g@zU S=8DIWhsѨZjzvy@*ΧEMFuBmBSD]*CSԗPR]zSDǧ-W?hɽd"2ּ>wH.g۬;}gUv_)oJ`S řOYENoN+WS" (ؕ 7}Vab!",i(0S^N2k\ND\[zUA9gS™P7 + 7 LgJ +':]3$Ub5`U]vI=ϱ@mJ?gQx U:1p!oPm(krKhd e+RZڛO]%Ab}M>v+\e)#,B~cCGu!)Jn){$yv))/LIרa\l(`Y\V4|j3t󺥬[$ z3Çxqps0lAE@Q)ϗrWK, lڔˆF&H0+2zᾔG^7(z~h/-\+5zؙyYWP6EHXλP93v|X/N@jo7!BkM]'BauCy`*-z11hBEVF4 FI'F>Lsj$Ie+M6o>j xON_^-rsvJa oD rVc}L"TOCj9 A)],|ou91:,$h%M)+s=$Xwp1o TIa~W3ʵ-.eC3 (SCy0`1jԼ*2^IAKZ~:! t?6I'Q^q#vF): dcqO><1kv'֩tYg/"^2WJٰK?pt;εæ5O]~-\^INQAt"(9s*"E0M6s &I1u rCGHQiW|f/Td~dI6SNgOXYZaeCm'%?n;)}{!Ac.Yp]GJ$a%8S$Y˾.i1"F4\mg!n60~n#z@C}=l+:XgHA DJPœLGInaOp݀^$M Rk_R[D9!mc';F&rS.g6)VYZNIpq a@Ny Dk?ѸNѭ(<(/q.11 PCONgEKz z}=gE!$T_ !yRޮِ AIYi0-ig.|f+C:K Z ͗AAz(v֫x*1 :=~ҽ+R2þYK֖ Ŕt}1Gmf19Q9w?Fvh.>rLD32@}%姚}T:= qNH_>P\hJgQM]HكxMhM`bspNd*CGݨAWa449$Ϥ``Oe! b}PL '|y<ۜQߔG]NOyK+IL41°ۗ g&zaݣ6q\'me_}ؿqzjƾQƙ8d_p.bLxnnR%Hr8F= LRyU:ݨ_ .ڎFp 5W E3&تaBYwMFf(]H,F'6*( `Kx }WJ4rtqs4 ^xM;j]Lnfd` p٢ts Oz99ʿy]ZDžHз( ,؇o~#u9g:[h%  swi) 2ljW rd)LGjr!#L"I?4ۃ6EG󁵨ΩZ,ykOdBKYBpWF"BTqfWF⢁^%\okͻ6kU[kZWE@jļӉxqH@Gu~1~W8"qkʕHV4ZZ}@l#EfSyC]+nxNbClb@XSJBVnU"{Tn2ݒzyTꗊ4jՐrKlMqK?ʛ3򞖐`BF 5Oݞ- Q`Nfϼ=ڇFRLcq9heE@l0i[Xgdp gca?;+#%>""93M@< Y$|:6b,Tn:N jQ ?Fm[>,{7 aUEIԟHenN\FmrʷWNYcL;zb[Ǿ~A9LաgP:X3e+>< OF'_]KAQ4I.S~䵍O b$4{%90]+^#qO{W~V 4{o y)$_&pEM. ZhLUW3]ᑡc̭o`h%zP0*%Y|@KxawPޱ:P79A?OvKR9җGVLIg$_vKAS^G:}I^;ş큷暓цuȔC842@4C4RIdICaҔ]?QS[\[y(bHb4OE%4qf%sKyLxW\VaOB*6=M?Ȥz mZ1qP wF'ffsD*Hdc ~yQXT;q/@`U[=n)ʮ;Pm8p% C>݄/ ^E^84ͮϡS nfS_6]t4WulJFZCher4AɀVs㮮uPejsA[gz8A ,лZӶdvQyq:)7Cd>~aT?1EfMn)Wp蕈Du-٩y)G}9R6}]5Ki}'*yLO,^ȦG BޝCS,H5gcuzҵ *TebUh޷)N Xv|L£@DZTU !1N߲ 9^)$ +P8 T=tTaߏTǵ1n5 SᎽiyY9XDaF=My64=I2Lmf 'X!DM%z"?_k Z"xj1iA^/wE82W1wX; Bnu2(deRiJ\WF4G[,.. <3}p}?]2W2?[=:4G|מ A\Dt@֠O'|YfdFCڪHO #}Y Dg+?NfuWG^= Zty!re{e$j*y}jUFԷ$ԧG+x-&6ŏuɥѭ¸&ʑY>#\R dvW;F6fQ)EkS,kʁTRZJ{d& EhtXkS%+AlGͺfR.prƀvQ H6*fz  ~}''e  ?Ә5p(9Y6ۈ0IGl!F7 J3wOIfYQ/eߩԟ>2,20.qcۿo&;>W}'!'(_>w#ʦ?yM|dR|uy@JNP>ȧlMM75&)&d^W:)Ma\!7ýp3ݢp66UsT"](cy4v&@eZ0^Autȵڌ%IK@02p؜\"Y1+s3Uaxs ~ ];ج\ZHyV)Q^GMۼ^4J+qZ lQt? 6+v q4 \,hy'T%S[) $jFrs7BaPX)nH(whX߭RXPϗ'zd-,[߲q=.W%gnR>X/f}֧wE<' Nn>”,V̑@V' 1@"JN$y*l#?koihէӰ7ZӬ@#vtbCKQfQrE/1أvЀSa;Tž?$s=Jq> LyIi9gOff^ &AdQ?ZP*#u AR =ffq،p 4Y6,>fE&߆F-g=&A8QC@ׯ&"XIR0+ /p'%TP̛b*s.uP:հ.idmm[k7$~I? z}qo$]$Yq+^ܻ',rN%؋mmNj6jjqɰBηbI;MDEķ/\ez /A PDsJXu=`$Lz2Q-3t\]RVG ¸ m__5?4fx;YuhH_wӧ_g X%P8p_WAJ7AέnNe,GLmpBу]l:υAYZ U~5Y tc"wxF+5{IݼkZBuZR[^},F*;>_Edjh'rO[n!l& uK,KXG#pf*90R&.hR^ޢ.Yn #HǑ|b7g>0R!5%{|zo+ 荝'^sv͍Ev6%bhbD5y @W:"B?\-Ct.V& ldUGF܍= ?&vmBz D/WؽkZhSqnJίKS&O# UlNmƏq>M'C]›kPjQdiiuYakCrB$Ee$S8īvtFWmKFSmgb GaQXAhFHeXggL1&|2|y,/l2?ו@1D借o[L U:ǨM{Q2Y~ar?M R ce~A:f9InONDAF!!Lwog~$(*i-đPM7Ҫ@i5O-cu4f6]I!z3ϐDcR ~i&Yu{4 mHrGZ(U!7!ɆZMPȢ`RΚ]rmBE;j{0`dz5mH"WD"}x~,[0 *DFivj5nK^r|-il4(h1X5s䣽 m^Ex =& -3Lvs1Z9+a7/ (|^/Iнk`yZ5l@  2Rv{6\EiמBP(+oAjDs4KF) U2٢E{d?p H^%rN~ &oC4 Z?#Cu!1g^sΜmrópp,*3~ 'b DVŌQZFʼns$x?#b!Jz(Ջ,_ogW?7l-V_m!rʮk7KmCzܕ{/#>͚qBy83D*ԘS֫Z+%eB)NLW@U (߲UV1vnҊ鳱ax-Yk fOYˏ?^\ qo,kzC?oϋvLttԊw-؅CنSsK.T0w m8Ngvhl7o4mN7:4GJvdC'Y)jAl"ň%fq+Q)j52-(wlY6u`fx8iJ-*U8rޕ6ீDXKÁN<9:5#"Um0 z\Ol4"b hljjg|UX3c&:1+<[NE* |ķ( }aP#XKɚ.wNf3~6~]zzaF7%.{QzUa#J?.gRe z>vcNg% '\m/}`(SFLS|f"7AM1HWyrs(X_herꅑ _m\f~P.wy!Zt{P$::Oҩ,*}Ji_)qQqdȠ'Ft]M~P>>f0 XctЮRXѠ6ǜ~^?a/;H\agn{3/{mǎ9"oZ#&Q:JHkEMDyJz]uYFo5j?7X>?2Eih_|Z$„)mEnJ? zs;ؐ2=:)_Ei rO u/.H mVcË;2O㌤R]:`U:qIelZXYNPfݹT`!T|K.W!\'@`T]7jih66LU(51bB(B*ăw*2Ca}&ARm@5$luXG%ٗp>_gDHg"dIL( J&ݛ@Uk*}&R]pPOMHbgJ5|+d#&2N2[W{\\Z(C[Ik0~ַpZѤ-4A۹y8 m%zuCNL??\R('eLOɮXWSԕb>ugqOsfof2>h1?{.-hI;{`ri&~EH= Mh %`p^ipLcYQF`^5 _.8?CL\Wxe -G~tCQjOؓՍ6KֹeMxAٝQ:asJq^K(`֑OPHMܐMօu/)7dw%1RÏM}pӑasI{'D={)&H,66l[Z11zZkm00($p:wøGrؾݗÐDd6ij=z GnVսS?ĖE6XcY2 J[0"Ki}(Ou|$Dn<p_NL^a_yQj[_El FgVbw'Bץ;2<6Z׶W:Uc_xM>l/e0sm9ӄtNˮ6lף}z>ChDaъ"e~?D oNSUy-['kOOd˟jj2s$Q<-B>/$;nߠtn$^& DZcES ;-t otJ )О- V1|]ahDf戎Y BvmQ+-6p赾1exJ;[VHKMeCbc+\~ kc E!kS.RFw#ޤlЂO. =zoUN؄ccN:"2iX 6fg]jaf}n|qUܿ)'!B@z}[ɿ#M$k/B3`p@RH9QWK*A\/mk6aEȻ@Tg%tQ󸟪{y+] (,Xt7̫ ӣJMe_0>h )$mHr"s w!B`MN3-IZfkД{*5!ضSx]!"x+q@Ý=Z>nTGR4kڔP+AF`*$4EGC0 )}f:( $vjX4mT|mASdQ}UGwݿ2]#n+rK0NJ.UюRo1,ƙIaO^a9D`2gK}rG<-ct83K{u+z**|]ES^H#i{-)[L(5M5mxX5sVrW,ڸq_rbVǮ,a!7ؤps' qNwQA=<S ).(u"g&jJe lB t9r0aH5]d/, % 'fytwҽ*-Ŕ[bz=ifߋHF4u ynJJ5b׮[ZI(t ?]oB{ ڊq-_YZIO GłI?MTȶGOuAH9wN`zXƢ۳U TLb_onoFQKmiopS rE+w~&ȃ6ˤ"Lh+GVTPź)GĊMF+_Bg0lIiFyֺ {{陧@^C`ZqXoiYcѵT0Ś e.}~˄*B|fE#i^%(J=#/u2)NE` v:BB ̙W?Ca;aW8Rj$.?9 9lqX{gc¶ -='4TF#.D G@Ws$izquwtJY}zDxL&وJxčCxUա/g Uؖov]5q"NW* K VhjGsRjz\~L]=ѰvnƵ20zBOfqJ]! 8cļ؉SO?!FpUGFtYi] Jr.Xkv,¦l˶?T:B\Cl$i>/}FT wsGx~Oq$HMtIö=,eOH"p, VM$H[t$)Jlc*͂8xl`mZ-"@$?H5ouƧ?4yYIqя\{q'ze0&(ܧ7Fų3MbǼlNqE#/Ѱ慤X :^OlH]` nrdxpT{Dq K泑#:H%E} ƩεZ0y-h贞 HênV7TBcq;PVظ"b3#tUA lչt U%5U[IǐhhCJhы8ni2x\ hTD]B>VZJDջ?V"s`7bsiz;4ux DeuG|kbh`BA4٣ B5ZV7VaY[$mR ̘-80,kn=:o0魢gG<an;[.ef$E^%Қe@`K~ 2zm"55P8x'>CLBMZd=N)V#_oq0% $Kqbr}£Uov{/Fވ[lO}N P+ TZ-$9rG\ Cbh:$ 0*Nە֭mUdGO"zֹ^[<d5я_ӕP_Lef,L6rUϯBs7H$w_ 7_3SO*Xm㊸ӷPEwf{>Z8Z1$VrRkPJ@[cvp-4ǰ=,'Y]2@w7,ӰV##ujߟL!X3P2XOb2Έ"6v5IDE)n*@>.v{#C?%+t[I u-Q ,KKTZQdr- } & 3R |tslp~G8iPo?kgj*)[ۑ_(M[_^YFyKFiu1R6twrZ 2ol,!, a)8_! @8TEG.9j*L 37pBF))FWyG_k>㎨D UTSfm(#NYi'񒘒4?X .D1gvl_Èqﭷ>On(:UGꉛ$+ je%`2%j /> 26V(ܸ-?B&h/K,9_?'{%;S0‰*qs俷H_70pZS h^p] { 4At9iGLZE(1GQ"чkVSeqY_\q2fe)~i$,/w7M ?e)lR¶))}*FGG`Ou'r$4ebX5\XC٣W 8cK-:0dBet.^ l3|fy$S~IЎ; DI .ӃM"ʴ@J [`}&R*&_]\|Rzry= Xpw[Z-ҿs ;Ke0cKp7Um(ƯoiIk^|p/LE.rgtBFGvwM]Qa} P S=@S )_BыIj7}&>W$0Χ{KƮg\مrl-<>wwsgq,f0#MJ1H!x 7T~~FϴowmmS$IdR Ԃ^)XbKm=VE #s'nBLO}}6V)$Q%uQ\K5QhD< īsm/\`ӥ ^KfBVKK $;N:s8HO aDֳ֒kR/q/61^b=qH#QYf0C;C'{M;/6Mlec5eԷ T ;,i`q lƼ~{ e i6THERܦTtԣ_CH_ADr结iɌw{#څwRA8O᪸DoUZ,>Qgf&jyeuK7\4`m@F0B0EU|Es&PX6]V\o7PfA/dmk^ 5 l3KEKC m;}%:(#MNkjOgc$ENsÂI$r1֬"V_sE#A|maPt[x ` o7HblQ Lz(n9,ܥo%K" ŽIoL6߲xISKfتLh7Wg_'.|'s?k%_B؃-@nwb^e؜cx{ISgr\QJ2#Y ; פ(%"N]yٶEot<_ "rr oStG_+EɅVȸUGt% HV÷U;g*cf3+!Y.M[aϴ"{t* {vzOq=Z yHRsl Ѭ/G>BuC3cdh&0d6qXΒR@{C 0<~:o (XmtIhZ3E~RĎEW2[\·d*uV]ؓ fq%n'=Molfg&J&'؏פFP "%lsC/?z\0s N9gdX$*"w/GPT{as`+А}n3TXdj`fiH;yĤpeC@LBh#8,6@WZ[#9 R~T]WZe&RB,FCm%1\2ks-j4pgЩۋR**d?j\\AfOU@D.4=e(Ds" \^Q9@#PU9 ⁌Vk(ʰG^f)e)9Z/n+_[$Ys~ʤéx>U2{[Bvl(WO 46[vZg凲mb|A:TT1 oOwu)v }{J#גdO6ϥ+zK%.Ml;ˍ]yC6%mXdy`%G >q%ZXtn9>x,wlf7 +8q; ;E=N_Kxx@Eu%Z TVLL"H6^5z CSHC-1i}컟Jkua^  OJިsc㤠֚Iyg7i (\k&~H\XA3 O_34ܗ{rǢ[sH鿅2`s~s5G X/'vGpɏ+GY!.LvՓͻs߾Op"՜iVHI3pM 0[J e|-`UKW1Fj DlZ@L>{ \h~8jiW U1#Pߍ{.t^Gf`[fhm#(#> zk_#l?ŒD,k'Mnvv*%PqY7,cqUF)JBTju.duegEhz|= Hh3٭u]&*[elfn&k_AnO7x4'%'զ 0yQݣDVgq^'q.ê`q |%fԌkkR(sո [6leyXȹ>oH|h(lXArOGXfB?$.d0;h[f2'#FcXO-=:}Iҽ1Bsf0؆|kQfD=nAV$_ H^jGM52e;lALl ZGvEYIja¾8?JJ@<_Ǩpj-떯wy9vXgTn[m|&YOgR Le.diJr_Iۣpځͻ-=!_J~9:D׶۲LלQayL?vcD3JiFRɯs gRJ|[7mئԯϰfM&t\T%ʲʅ*]`0 tUɾSUvX]O":xU"yH*{[@{HSWkZtRh*J{(f-FgqPSACnhMٟKF;e5(sYie΢ G=XZ~cFY~I| JVna+N71GP50gV7E2GŸuDjQe kVjdزy$c_m=O_(;q'lžkVe^[dVjCsޖlC5rnl7v ~Th駄<ᇃÆaihiœhZ%i r%4l/:>Aၶľ[\BLY.To'HH!TY"uriR* ±rꚩ*]ZO Jtp$g5|7BFGEPR:L1Tzv@4C[ҸߚV1x _=zxPv~@lHY6 W}cd^Tɠ^PĚ lD:tp|ϧ}}$[>*4hHNI񍁶逇tu-8w<]bladin!*$a#ZqgC8z㼾6qVFp*,YLl. B:PAS, 07w/ `#%IQ7ᱲ>ODU{xvDtS1k,/q+M KUT%YH-|NͶ% [])/no!h}﵁:8$_oq_BuۊzMaܵaQev%G{IIX4}YZS#VE9D~Tڛ[hnIw("GNª Zтr!5)n JKuLҹjt‘GjEI$;dcFhQ3vY#fV!\mpۗǽ+XroՔYD =GvUw9GXE[ o'.Qș~.DTW+G[Yn]Wf2_ʱyeo;L:U)-Yr 4mX{l$RD9ܱPg6@D`:/ZoG7..īgJHS%v=QU7 0 Ĺ9:]^E!m4jCtĆD1Dz͚$5@xBkuh!=՘TqmBPVQSȾFJBb,j_, a dA L 2%h=7(~ni[{<g,I?oA EJĬ#K@x[jC߂Kn]QO[,W-MVDcɴe1gwC-ygc5a.V|Hk0'|v.|]*N0yDxR#ڦ3V C~M:5/}a|I'ӝ`BR{^"z[pܠ0״HE>y_Es [UL]Y~ƉD~p{MK+2Kk8+H- ^d|6D DFǡk;&F{%x:fv +̿ҋE#׋ W`KNf$AJ.59%oǮcl.*vm8@DHqY!îXݍ5 11NPUZ9N5Vp sڮTN"~:7G>Wbp15fHrHp.݄mqvF~Yڎ(L̊zfDCM&(lP7Xc/2U.-UJu/2 $Enг?ոKpouN\]ÿ6Dn(e` 뾞$sg5/G&Vra3͐n-o~PBجk7@(|!ҸDMC{(X$P !rۆZFC' o !T2n-dhȳWW0{ˊh)ih$e>) ][},oVA,'m~CYtKtuodȴ%>xzKoY(R7q^oQ^CS}S/^MYpfGź$:w _|k6׸(mKnO>dL]F wq-ins9HPϸJ [>\ hG+02&>g]б$N ęϼ٢ut"w0QqH`׍ rzH(}ͦ!x,F:M6o-|6[ sP)7b%]S8?rG.PIPg`0ڽ}e%2t~BG99xPms8ݾ%i?Qt^DQYOHWHjHn*^oCev\&Xo2M6 RŢ%>gmQښ%yiE~ऄvK d&W=VΥ4PT:i o-LulcϠ ʨք!'e9<PiC;!ޱ\R f }"%!T DiSVug$]ik>/g)/j 3"}ՠO62 DD=9]B(Ϳ*q;l ľLX?RrouM܊GN u@5q[#oj玲gGei0Gן HD&sP@YN<]|(L]p&ˤQ!tr F hntL _DekڍQkF1ÁI:)il}qw~Ҩ s1#!)@,?mdcjO#^ki3Pi`m= 8PbȇvCC@$nhC(|Ԥ{ZJ^\*61E!Rs]Ӧ'BM|u4R}T'4@ψưh`7-TS0f)1B1Bxb`X4^9`}$Bk<.)sK{xG8hF%\7jO! * mpl#fb1Ղ ZƥDFG1bt(’iO Q:Q7WX-z6rwD#-lLCmy3ܶ鯧܁ xu' DX=?䧡QS" CS1ܡ\U̙Jjp|X=Ss8k *K g_BN}w t^OC'Id7QLLQAlqo3-P&sMxIl@fR@DLN!9wP !g[(KTMcx1Jtn. |OiR+v{}Ljݞ igcr&&zvHILD FNCA|ؗb Vͭ ̐O +4W)#iN ={ҏ,@t5$fխslCaA dz7א>RZBmbJк'GTyHHp\ЂaDg =_x׬T/L5[Zs#()zA ʦ.Lf W );_poe,rZQ|.o̬N wBEz['p2M*^]iߏkʰ8fJ=X21LcᴵtIDE\VL /[=r_"[UpHݰX&ت%v)SqGЎMM>n" E9FcBy-JE+x㖉_udX0/\2ˬQVk}6nqUȹtWZRӄ::RM^kY:Qmx`fU_3nPEo@$1SDVŷW+ޅmgUl&߶%w-V0MαRUKj`Kw 10T!O1S=BvS`<ԩ}ĺB}gS7Zh;'#I uRpAhs28ArXhF':܉(A#F4Vώo$/cƈIS, sQ.Xu,r m;^]h7eɦA#ϔCHʵ4"BEC=>>$i IR6y)SJH|Lłqv$y/qKod|X!Ml8qbnv$G1ꀶ&mt &D*>$!m%O.tI RsRnSZV&;4y@ ER<f/Ms+k0ȅ1 %K@@{`kv6(!W6o<:M PP՚8F+5T0%rD T a}~&ddvBi4#U KܙA>~}8Ή]Ԁ-aUH?J)VnN4GB;2u x+p4 VG+ b8S~KյrA+}vIz>co+礠n(IwMLs< v!"6ssda_kD%ҏ ,PКwCW90 L{C Gr\ J-\|K ZL<ق6]+9sJ[ p G#&/SDtTgdjiW,:V I)*H`-ȫfB`N[­V%8I"y<"rL0wm˄4sUG,on43ɢ%)R+Y6JL{K~/2t'uo"MoAp0-=ؒh8Ek"!= |MwSX|Wki@骧ɯUaqUyKgn[l(L(:M!<,g+Z/d%:D[2wU Lʶ0;AnI UG: T 5q}YIKjWÌ_t  h3f>3"x1~oBv-owPōBq@ֽ] S8Kz~~7qbS"qK-5gvO# JP4Xu8"=O<@ftTZs]$AnGA cQ)L'Ń1umWq&;__e3ߞqd=J@U0흭e7~yKޱnȝ5>\õ2O`ĈV^\J:Ma34i#b%*Zu\M39[@P{v7ZɂZ\7lȀSrSWMTq |pDs7`h4(`g ([LƌlGfE*9΂$sxm wM٣,V`k3V/GKV(7ՠh̷k81.!,{i^-l-y ɂGy)Y\`vσ,' $y:9I$ä;L! -~1mWgI&H2\mz 4Ug}Tm^/L?s̸@5r4Ձ$]H>DŽ?qUJacuts ZNݏ5JMS@P" I:QЋpkw$qyBNt(S5ʦ*n2bWFƧm)e؁av| :Wt~N"GzYd_Rt"Kom}qulWxΕbUD%R͒Ɔ{B{8;C<_UM/E$\]}wiaYx(夞K T 7Uk=YZh7K9'C/,K Dg-C Vdjق\e;7^(է[yS2k,m I Evrh:c;D:F0t$'&( ϮAJW!Qp.yﭲl)ނZQ {y m8jf̚yםkYdz_#1\fYWD)IĤXM/׹,|l=s 6K mRƯWP}&tĒcO(>]( g+l$S0u7wcME;ur@*覂v-ާ$|RC|P E'hQtmS#v=6N$Nkae4%(lh|Ca{!FCv;3 zR m , 3_> 9J[u_U1CLfO1 8hRFڟ}6T_@cT t1B^'eؤxañ)wH`~UO{&8?k*5zJZc#6.FuT]pvp,fLWk!lrR7G)^tjFqܿo㔃Gݴłl2HDH2oczdX"wGz~oZU?K<ӢnT٘p^Kqu V\tKeF_G賡Fl4R^5?̍GWirX JXG'?> sD9OnɲT.,@M(aix.%0J9d\E{ڐ`2Vy`/$99;X؄u`l`>+q[gˮ7k7zC6uM2g|~DFWZ{T/jK~kF0iUk]"L/_Ѳ庳 U^&B귅^`&O*9v㓯RZW%gv4XSx[gP:0M~w K !7]4g+@d> sy4F])+~tW>yI bڙ}Cck{:N@;(P]颼>Fb'qJ΢2H:e@tY˫Nk`+&6{"S͐D?F_KC[M;g(*1(gO7V1MB` A&t1@"[ĕX\-Rx@ئh;PhM4Ys ݫ~3KP+ d2;a/V^S^㱄['~ra;T@Bgu.2Xz8@oާ?4hiֳp+pIFa֑XdA *L6l[_)ߖXKv0oAҲYuCGrzK^4|)z~e>ib X`klGŠX5A[kC; #9Y6XsU^A2ផ~qT lGjp"h,hKL$eߣ, Fw"C0 E~m W$bAL =(vWԮ Hom]2e(&9҂EoDx1heD=kodžּ VC(~ULT_xFpKyh ,]졍+})sjtͻ; FCKW)38wB o.Þ1i`Mj}SRqU :sPy.!P2v;=]hfUF䊌gv_[2 *EF:ALjsXo u_wo~zϗt׈Q,`p!M6.U g@Yý e7x4E>j9X+ցe/4-?e"?$agBL$@&QAmǢOO-@ynSx!oSQSIycf87J'i(TV˞mIʨ%Wni|`Lf#nb.xn8BU[?m~IMw?h y ǒq+2] k]q4^2aUOyҜxw/N 4~y! LO71+(QwE`YK;`68*(uڅkVm6r%V;6/^IC4 %QgZZn,'v.{`Wp{x8:A[b'J:9mLZee֖v􍉑&;߬\w`>@<(q50 sKT/G~%v!~KfjH]㩢^MoT ]B҂Z5d\Tp9_K Ki5A-R&qa꾹q􎭒B,a-Iܧ34NF.نdjX#xx[ӑ@afX7N:be]//5Nw,V2HPY1npd=ZCC}=Pvq^ḚkGae݌5RSghǍvSVbF">yYA_l'g(81Tk>"f< {ѣxAÞtqC*9K\ӏ̖dtƑNTbQ.`a3sQ0!r}8vai]4SYln ]Hu1U. A&udߣht7C.~*[|/TRoi Qƅu'r[;f#A;~8 2)󘬸'Q@glS"}jU`a8/צq_6fPǕlExk+y>_Nda9bWVC&%v!}Ք3J?ר=Ӵ4уND Dt\o\(O^ ͼ\*<_$b ֌8VQ03r㕶W4bzX2v7Q^r6Ӗ2L7.\mDNx&)D`^.E_93n/aps`NUxaqzwऽs% &PHp#5J3 nխJ -$o|/dZ;Ml.|֨J٘]/Q/u;0`Gy$ {t3=-6)E^VWD;xmiIYty8tEko~uJ3Dg[ RذeLF˨cҙ ?ArFO.4?fXP*C~#jGhGY#):n[m3n$Sӝ, E֙BYolIӱH@ J ֨H8hILo#p $o-(TNTMS#/89EB,2m82a k};G+W)8U~cx<)Rgl8$O5^:u<ϑ -%s4.QF^#NBc @̉Au.tlͲ0>ɾ"vp -< }ýo^=7I ͋= xK 4 8 Ŷ^8K\Ov:WȾ^(# Pvd^s18Ꚅ6=M2Q9"9fT7H=6ŝ% ] b~jdzn|~Eu!Z'6 2/OtJ;QގyE࣊8ҩpDBH=DZHJksl6#jFՖ 9ޚSRvFP#X`8]hjofPmƣʭWLG;atŠE @t7ɲ"V=Ym_nysPQ݅{/+\wIw Є7L_ gT3KJ&DWQ^l%e1]/>_c-h>v,R`o}t,m'{m~a§t$[A3LH7$h޿cyё`@ =[gEm -կW F(yɺ&hqK$ &vZ뙹 :G7n^/{J^iqffH,I^/X] hqΉC{Rhw۵;oszq&=0"!R̵`MP@3x݀*B%oE8ΙpLj$@`d@1u6VTA_kœB .x}K~ZYR8}l)c[)qk bؗ3?cCzb3;r4 t:ν,Tz;sON g4 V_B:i,%X>0' ŕ{I1$7Bw.nV{]0M07{[!&>R +4;=^?GxѲ)pMSwgMf>[P~E暇̌CFd@` r$]֟o.~S\ױI.P6m? h3MY۹= e_5ϻx(C@U0R(L~țaa_Y9)(=В5^39Nߺ:26ʝji4rL5Gbi#h=j| _e3C`YW{!aWzaFbmG8[_j*7`M~J8;H*/27)4E[`zh>)OJWhQsHWrx2Lay1CN?Vٜ3hGKğ8i.vw? EA0t^FN}DIz3UόQ,SpM*I3'偽ʉSkNg hw5[]q^l=g" =YrRz{ dހ4D59oHqWGaH֙AYmTPֽY1:!Z:U3L[ :c.&I?K-p_tx$*}/E6˷g2nOFvQ喭t";O…UW%q-JcWrkjJ"2m'a-o~7yhԊ d$߆HPeKAJcm}:(GJQVR^dšw#ٽ:f䨻,&fu}{7k[lTP-EɇI ltpi.b^x4R<ݴOҵ(GzX5 [(׶f >cBG#K.zCϱ2$3rr@|Չ nVgR],!_GxMJ ,}A4'gt7iY"HLa]' w&BvQgbBt/B{H.Ga8®z ]~֩UOe}<09+LL+pEB0(t` |"v_.Keer%_ٕ6"L S<2x1+wN_gwۧĕgnWeZ+_ZJ"7_AU5{Jm!?o1Sα]kFVNCZ˽c.ڦAu#cRjAxAaRVsg\H2IAgg3Q֑EFP-tZJ[ͺLAA5KMLXg=1_ro(oY0/`F3{GK2KkݼɮKUvZYmދ?!xa:]{ ўjCNo,UkKB3]SB"DE7E*FȀphaaLԕBWִ2;xPNd"y\:I&mў$KRNܜ ޮYM$o%]+DG?ݦlbE^]s ?`JHQt6U~&hi;5W;Nܸ]fj!b]$/|xYQszߊB'^ z!-gl+,ŗ7S屵T鱡)R%vwؗh/Q1 (:8q)w: ~A% JRf ȼ"Eɔ6^DQooܽ翫z00IveKSᯖ3YLz8-=a~IPT ->[ov[LClL;-H2# Q/y8G}}9ZQ^ >*#2&{ŧ

i5s܃rf|KQO΢AдBӤoΌd΂S{Q/UlLu}g_fMchZC%|Ck_Aw;|b|19\Fiw(D DǷ䍽qӕ~p5ˡJ?3Րf(],MHcB >J]%4f ['4-xmajdooΜt &POx Ak|P[JH 4pdtVNrR7hG[ AL}Qo\$Ý'/B!qT!f38,GӒb%O_t@3| 8$E)?Xw #w @Fm35omJNdlvJ6F[ K>E+bݡdڲ J1^M=Vv{T}gmYԴ.d`0ͮl!*-t`"ځ1<>@͞Ctx2FxE5kP"~>MTӑު^*?N>a j$n7jD˪Ws:r$Ǽp[IBIm(ȣ~-BNٱRh 6r ҇޴p{I)&Og!•Dʜ q&nyZ@!2{ U!!M spqsP)bTKmjiȣPh#^ .%ez) Ń;κ̤#;؂l0@zn~yOB %[2$Cq\h OgXN~=h38U"tObӁ.ajfmLB)7JQ+cw{$-_p)zb3F*MmUr>}CwEr3jeu`jN+]TNn~Xz}ľxb;9EFdrw;O7 ܿn:7[Km;XqH֗-N~ #o 2^HJ.:Jb:kƸ Lfum\d򟞓2`|S\' ėI*tU=pG8$ϝ?8[h41ha=[4|` L٧FBOFq$=9#rN|g3(LIKpf `6G qa?"3_I  YOM9b^r![#gԦ4KpQ.dz_R * D/Ff\:Y!"Ur[4l[U>`W+jN뵐22Am6Nqm0sRq 9ݏ?5I$S0D;PT#yPGEsK[`Uʽ )˧QcX$VPda yk>W}:~o1BF<88˗ 6K8^}F,VSW˟ƻNܽPD 5>Xw7hC&\u$2JƛFJɢ]A/-YTn|A˱\7?ի+/ yz2A4E>3lʏʖfq:  VRՀǨ3}< I'^_W"l}|V@%nMx({sCp+lA/ɠ{>zTЙ6Dm=oriaQi~"`Cjd%|(Bi+8ԢE&.faXhR 05 ֯(mş n# g¯;D6Sm9<etFA@it@EJi_G D~QPDⷻmKF3>`ftcdHD$ۥ*@2HKMŻ} Kh_5ONjX0z[NvV>-14Q!B7#Y"YblWUy=<OkgZ{^kziVk+llZxP^M[VLotWG1̠ + `Q-W}6198J=H]nv xRbVN 8}DN) HKgC6roF]g;sޚ]AfJ RXct KAI߉ /|=uL\: SG3Phn(ɍ+Ŕ mFIF_s Z'@$킢r;qs9M;U=[7kqPm#K-O Pu  ~r"ZiNRĢIN|qvfRIUTƎGS"ܐfu ܳb *j;xrYgy֜*>R`;R95B^o :y,1'eӪC!xI[XFnEَ7w00c>)!YWr)k}<M[nSM<0mp3cnF~ؽp|P%Et %>DaLɆKO YoVMUy"`{|hTǢ(ЈS/ U0j,Q+jwFU1MS] GEUo7J3BT!h |x)Z KEӮJAMXxVPaoC]-$ ZQaVyC,EJ*єt09-IeBmS7, xYu|x[;+>n p|*XiCۭT+qOJ5~Ή9(U5CTQ)vhNck]0bB. <)pb™TOOS?"|c:R<]3}DZPBM}0tkǿJ<9dy`:;4NF!'\i+79yE [UX CIӕBf{KFֶ1pkГU[H2[঒@^׋*B>L*2(rrPEavgZC{ZPw9χG_m+I@TY1 ei6w5 v|\0t&'i!´բ3X_Ss :0fhBY}+ȜNh7(PNNI⼿7z:ӔSo.!q"R@qM-O ӌ01Ea|ZjmIkf͠pˍD|=VxzBFG )ͷt>q 'V'܌l,{Eы,И9Rqʕ Cw]ٖƮ7H'?xf= fTtS|wEZ~6za1 j?+j)4MK;վKV^bG_[BF3P!o`^{z'&¶R,-Zc՗tOY19ss[dI^Sʃ,BL[tt,r=\ )-id#ޤ?;S߭rQ:sڦ9\i bb ';rd+`GH3Ë͸׉y֗=6aY.`|'M,H_M&ipL1\`ش>6`b[pAF-`De}+xb0rGC:rY%W8xWv`D{N%Ɏm#/0jbQN 5'>r-D{tr{S!4M@q7M's18Ugߚ#Y_`6Np4kˀRk98{7Q鰷Ga>aUΰhƑt ː }\P 5+jGnA86Ks$@(?-])Z* (sdO 0s2C[ԏJ 3 1%r O>crɳf]>@h}r  #̈́ |iL]0`:Qge(aNևf{'ag6s(N|D au<%~r)Zq9D2a(d hK6nqw>4p}͇U3?y;SsH f4 5N',L0VG٠ k§ϙѨha`17_+IQƺCYaTߞ3zw0VMT*\ϔK_LcJ+/a4 4ܪz Ow8\૶;Yyȫe$BA&U':tl+<׋J]Vi|RwlˤHG..]4no7 ۔'ա2 Zc:/$zIĄz3Ki~qh~0Sv Kvo FDd7] t*XV?Eb5ѹp Q*S[UunqcURŧ=~˳]"tfrY5zIGEM2{D%Ì}\[FafLbU $/as O$`{[Fzuowa}f-x-US_ԒvP,RzŹx@IxKxg7lj7e6h%<۱]A}9lE Z>e ؠD. tR^篾\u.&IncEF?tj9&"-YIylpI<>WOaŇj) mt[LR\ ޢE\^M7roM(tN˅kT,cJZZӑ0bۡGK A!2">gi1H|;RYj^(@x C#=c yo5;oqJUfh>>E3zyvD@ rtWN/NqWl|XPN殑m wºaYMmңh玌 ]Z2O ~DĊWPD B.5M^?ciUq.vYmdUI+z,6D apIj/C;ѻ,uHT1=uBu;{q ꥷUZi}_AdS ڍ kweeۦG0+Y^=hFGjyI lN:[ /&AX׹LEXg[O!ͺoQ'j |QB}#9>\`mO \ge!46ȍsxEhcf(3>c)C:ΐ,WjC|,28GOoZS9p)Yj.{^evM7" 1U7suz!3naD HM=bkjP+icؿYy+vyk7PfbSxϫ'bDK56X#;hÖ:0ֽ^DCILt]IKmYpv2 t 4n ȽڭUOD1XSJ%!łec :;mQ+c=.\}qjUw>P1< ȥ9gsU-Sb5o*NuҞeHiFVǫy dTHH !׫#((iZiM"j($mg,rr qE:"pUb=6d@8 \煢FJֈ꺞_ D}Џ+1 3a'KX +(iwsvh::]nj9o χZj|dĶD4Ea&K+Tq A~ud9V :)0+u3$SݒkEVC)p/V(css{\C}W5m,z4'M;H2oP* 4T\B7q JZ^Tl!AiZ)__FTn611tAptc7wHX鉾fR9Z:RL;Zc,nK׮|ʣƈfPJc%#L$FM}^&|=@^.el720|o c/rMP$kz~DXY?<ϻ#/`d?D^V/ jn*:zvy}M=~tG% *kNRUڡQF;3@͝+QgChv bPo嗉 @@<A/a-zrŮ(ZH$6]LR7Vw~;pn߹+-:`OD+Ttc_&+V^J !>JWGH86iQw8;;zn f6)s-́&ⲝJ ؔ ҉28 A"|]z SF>eFdi*\gt{+ILkG?L,cšٰIޚv[_!O_FsK[AT2_T< "7:ؠTArhtһt2& fuB_dP"RG=Rꑬo?>7}jRZ'Y 4&xeo|Kn Wq ڍ0qoxkѾ-嵐V'3,FEtF.7*ʠհg@"cW4nW(| e ‰lD oYm&Q*svTTTDJXo_Q Bϔii UH:Q].K7uKG:\ÓGjcmpB)GlDSolB|ZZlBu 9凕 'SpYSRIPGk!xe`:mɧa-Mf0g- 4XK?*$iq)+]ꛠA u<)pptu%٩ŦEraifrSFIkoOwTyE"OOhl0.\FKcٔo)C]p+#c}:s l%)Gf&44}Tu.HϒIbdox1Z9BsݩmZJ\*{= 1OkȒTUT>) pڮOl8~vCnU2ǹesTF^8ƽޭ_ C98(?W5!G 8mVٙvwWiT[?GNmqlFSC' ʷa`9elWxD9yX'T1eLzxEZ>GUsnr .1f>>+ߘ0)PkENŜ))fc{7ʋF8_/aCJb"a.4@D42#y##DFYtr~m'<-G]`A7Bp*H H1e8>sc 5Z]7Oq _LVP<8QOŸqEp퀾ԅfd@q%ÒpdqGV(!I'Au=+ssw̌Xk&siq\S̔vP,n7 ±E: j{JCВRXYEEa2^q@DT72Vsz/ugM P`$ieї_⥪?\lUf}I`P&8 Ra_{ʧC].yd0Ffk$:7LژQT]Byʼ3ʐEBZ,i3}i~~tl%SijM#BlUDV~'4!mER!R%c#jո;^.1eiuyj$)WgDbG` 1ѡ/d?b ̲]&e1 OMx~i "ŝqϿ7dW륌` >;U/A8q8~jm8W2A`:)pSkjbDmcbx~ L(pHa2{UZIz*5fMk_GܚyCj{Eح ڪ0lCc{,?BFVNEƴ<G;Zh NlOzS_СKX0a;GXhZg3{X~`"e;mχ׽~BQ  7A0Aj>HiMtFKd*qQ|Q dajSά4Ġ^d5ee(1(%X!AN2Bq`?9_~9w״H=yұ񝬶POvi1 m-GWnW$| ecxsT\I}񏚁?8؅ɶm-h>d|+۴%n'}㊧s4>d`M6"h3kt@\mͶ};P.aI*BlՑ:tɵ1$]'yyZ)$%[¢(86zX/K1F3um;sͲ ..:^#d@^EjuP>_M*z v^~bz{+EvIư[ڇY3$J;{YZvBۮrm/{ϭ\. Ӭɒ6D'CE;pZCs^X/v7 H8L*n%fgHv;;oEJFtVʮZJjJy˖Xs%|+"qL(Ƃ+?zb1eoN{_J\[F_m2x#%}}> "Z}7=]3bX ?VrBݤ )ݜ4^{n[e絫ǰ- ,:Șj! 8 E1 ?a"P>jnb )bPV=9L7$kdzȹ0{:Qzk&QvHL4"~ДnCpK$P>uJT̎5pb^9!硦mmagk&MS]i@y!+t0%$ 8S2S3AשQ?}.BPRsM!Xtr&YS5%ԣ)fhDxQTA7 d%?O@;  Of1OcxB7bPMZ=dVf׼ VE{d0n/=>? ,L|T,V7Wx}Wu}=&?gʹە Nf\/tdMHjR;#tѭ bWs`ZȬldcbJ' ,E٨z/WU:{v|8:^}ݐXˇL<;q n6\5gj_˙X΋ yBW`W)Ievb Lx9{2!ܜJ'H΀9msrSQ;o ,`%D]1@IPBO% 7ˉc/.t_(TnrW~j"{VLk/E]Ivro 7ulYk{tc[ϻS fS Gfe0FGQ>,=U.Jڈ;rꌈcMw cj(h8O}Dn5eXRr'o~B29ƢՉ>H mr= SB)xK,#YMOa_S,gd+_;Gm0X0e\8}یx@% = 1n|t"V+Q.h̳AAMN}2l.kI\,ve\! \?GkHDzs~ZMw,UZLJnMMj \1RDOw*qq^WJ Qgc{( vv(\Cɨfmj&{%l-q٠0 J|Zb]})Z 3hMxɪ<ݳp(@%`"S{믃1rxèU\XmeM 2ׄ ǬucDKRGknY>p ~Wa|U~^'FQozN̙f2萏vϸ+6sޅ  1v9| \F\ɲIöVO'( >5)HW{_G\t+12MI3b-Z7Ysz<:^_yr2`PnH{ jɟ6<>x<+]#>Z^ՙĻ[5L96N 4l p[%`Z4"d}` D 4gF.] gk=f2m89X UT X^:f=5]bAkc`Ć) Oj)NAn{_FZ[f_w<:zMgqDfq27I [U >ڛ?eͅz+i1qT9mk >fhG M@"D$Chhz±럈O  n"USm 3hǪc t@J&wkhAKA#_*H>чH_hw MjA+w,l5ڍũwM $QVv}j7Pqs7Td[`(m6sf~õDʤnʂayF? 9<9@]4 a }+OR PhfGG Pt\ |BL\\6ި&> d(@n& d3ۅ8`ss.SM2?}#3#((=a)A'v)Nk#@e,#2 rDpUձ8a뷐~A#w JF!zܡjrz+y6 +R£bTLSJEZY]{d$0 ^k Y1=#a|-]u6_?XP+>Pc4=n*IyD7ON%g=N$; `[ ըFZa- pOkrZ-.]$lL]sGqk\9zt-6Ggt;6OgpY͏JxDQJjc(p^L4м*'09rγZ_cFXu_Al¿c0|`1FݻWnSQ"j2=[阓8t6ժmEScU?ّ?c)BtD8'|CiUGOvO}ftfsqvU;1Ԕ*S#k@ P7|jm$ =ڇQmBC (B^->KFh). l;T ʊ6˅S8WE)6i^}->thRc%ߙԳy\>[n†HA&xn{|W 33"JZCs.Q0kJ[m Z(~@ܰYnlңf{ݐ²(0:P'1b4 xU $oUyY^b^],6O,˪u4f|tcTw~kd[!Re|\znTSaMG%ʜ8,UPN *(/m8?7:HaB oFw]b4zAƨHyee~:j z=U`(|I ){mL9< I/-(ٌck9 (s<و_G oe{x"spB<^zpޙZ]^)VlG>7{N{[+S*L#V@q&ڕfq -G֚xoT5FAP{̧d3PUxYoKCzX'R$2=jVW8fq|KԘnY W &!6Y-5-tNE/ l'ޣ/^P;g9@9*"egV:(̒#%dJ[GB*&?l%y ;Q6~N#j9},‰1wǀCnW?="ć2aEU`TI-\-yD̥*׵Cf?:u-E7yiN|!kmY zJj˟NDi|~ AaEoΕQD)b^}fR9Rdb{KV zx;ܮ'xA-(g|L_c [11eyx[ v_̼^ ? 9 {~VV/aˌw>5g,V o2|OׄJ8Az-Ү s[# ]G_5Ns9uͮP:2~_u` L{迮i@mr$џS/IxOj '$oL߹mŇ({[VcE б ` WhȶTZri"Ol|hs6.簾=xGez>G"BI ]̖%VYĥkiz8i=nobϨG:,|!-o80&\e)E:3L7[ik4F/DV3>Wiw{rvX;_,mJsC-)C68mKEM )Dr],Pxs|6D1Hݝ"h3Ut7"eVY[=DTEȢ鱫Cjb536KYJ}Tu2O)Bb `SޝO*,"p44S 8(j Uģ (AhU#Y"U3sZƤePVA*kQ*3* ?#,6@QtFv^@5uNc7:eQj v CiӅ"% ~sB T/J)O!=~RuYOC )r`4s* ^*eY/cדT铏xAju9#f.xF aI4)S4JH,֚NW:)1ڏGT_\Zsh\ A-"mHs}NsYwsaRy0SH\5DP Ǹvbב*Hw<'5[BUfB{Mv5ZbjnD;[{vsL`z0A6KbDʱ{1Zf}'T_t|+L)FV<ZM\1itw6Q[6DsމkXvپ \K hs+6C.You.Rbݷwb^ BPTz/M֊q40ԥ5*R<%ai}tŶ&&`4hgaFAlwd0\0y>2(,h壟 R]G}NW3U$X!z/|4rS=Ea2v@S<dѻ<pAzi jb5\C!vYn&iLW eD3o_lehMO?'{j l\Kdwda"u X"o|\Y3J=gUyuk0J3o4s0[F] qSr1U]+>iH& M$vr=Rp[9m|NگL 0OLg:s81$/D q/l@ h3/G>-λٕ-]Pb;@n,PK2BX*Px450: e~R9&r5$:m!D|4i~J3.XgV>ꁤdO@9:.Il%>Ud]:),81bߪeay1\Ǯr Z7r{j|잙<' ަs'M~C$~MpP\q`mTP\ma d3i&! x'KT˔2. Ԣ+-XK] )9yh, &`手v8.^m54QE~藂&K%7_0D_l.Ƹud,NeNw; |Ip,>X"㏸寍D#[[,L7vOKNXck۳f=1FUqXrPrl75Ahi0`kKU3G7G%[*-HƒB33qP{B==%9@1٦SZ^FN$Z8nuPch׸:ܜ80V8of^YZA g *F'l](&tQqGAq&/,fq]2a] Jrn;𻯗ww. z\Z8#FDC%vOKzШRYpԬiIJ}cݘS/0 M0z0:!P蜦|> ^mQ,^d`u2"MRm۸:7NJǞ\㕵ev}C~*baH}gny3\:?Ӝf@:yhMkՋ \̈́G1H"fDLqXnbs`Tf=Z*H_X.~ {4ҏ x̰&5ZN }Tv)ݎ u .8a8L'.5LJ}5Ks2 i҄\@eL' :yFհydB\9?(@sP:1 t'bGHrio&kHƒ~@YX\^q?Q6▐WgY^88tHWFÚ9;-֒uFyڑXtaxG,O`XQnX X3 ENkT1+g<1E-N#/dP54p"eц)!Rx o~V!:BA P_s)>g(4aNp l$0oɨ˛Sqنv0&ǒCXz.%Tֽ}bԿ;xwTy.#i+Lm1{슬+Wi >"zO$̰,K{VAzGN|3:jYcV>wU|RYYb[ȁb6-M@č*b g׮9xq#սuA0x Zhtfq@΍eGdM,qK-SCR `wM'&̦q ]0d}ώ810ON`U>[|}{AyC;:U>@sOʸ0\UqGmN&y/MP&.=MI_Ubv9=ea$y `_2Kzg.j#zF޾߼u\qnLhؕ/ صb `m>N;;{.NcІoxQs'GeR~rp-FKuBeK)`UF8מeS!]3,J`XF%e֧鞘8u 3)X|Snv\OKz_\_Rc_CI9 [ _3#|w4&<7[_p+qbvylf[f$-0 Eyr;F1?K/:XͿ &ˋGʗ)^,d;p 0oh7ݣnY==#vw(>J ڰC lmo惐?"JJf_݈NwI(dE'<4r7+"o2}%VW1KAjO#ڵjڊ#~_ܮ+m. ie3pPp3V6VIM;Dicn ?dLk^zٚ* JUnCCI?O}_5L\A5èjS Zqq鑍;.d~1:HzBTTNq9c09݉=8cJS#3@=|UlWMh*2E}@vH&mVг\DA%Ai,~dwГoJɢlsnVQCwb=8 {15Neӂ%#f NZ>2yFYozч(T{Lj`$0MiiX /ũ2OۚD)4yNN6v^hAf] ˙K2ŴBZv󑢔/nV=^ZJ˵saVHj533raivknܕ [,qMZDQYS{Nwrx'0n:p8!ʲC6 J X$QČF))4}}CYP5ݲIne/X3\zɔo>j{ɾ;npxЙlŦѼ"=wD܌D@=,w|tkhs V0VPɴMvQBPk u59!ݼdF|)HCڎ0n=U)4a"/TƇs:3yg R+`ˣ i\Wܔ!~DJo`HsO{|_fAm*U>]P#\!R0HxE5+t,v$` 3ߩf-_,KiL- Jk)?+*@6bd̃|jߏ4P+u2i;d}h8sAd5}ӆ>=GDJ=y`]H"]R}NA.Dg{jNK\X-U0v­zSN9U@W^Q 3YYaF e60v&[obz$,ʩT{,!XH jsͅ}L?.w:=T)7 N)EA_L) gw|WDb!w!ϙpp3 DXqݪJ*cCLH8V.\d=F9_]{޽Tӯ_ 29̗Jtx 4l;t$E.\38+ߞ.eH"U4B] +ɑV:3@Ɠz.[ Ekqu;ܾ@=8q( 㸫g)J(4f&s϶ʼ^AK=C3v tk4DG]ayT@ؘ#ՙنLIetX&je(0l^TDYV%Ho7N5 wCXB~2ZF>osV{;ζk*gXG+0?2M%h\VH`0b#>FE:dM8] |C{,oQ|We\< a Q[ԅ8Nfmgťئsb#oQD/xljt7P獸K]gU:VǁQ:˲$a9f/kդk Sv.0S0p19B^ cC'\Ůa:TL5MvK\-m/FO,*gaT^3IxH{_Xc#[A4GcY5[wn|؈ҷ xl!0Pp M3I/W ΰ*|wdLtM!|a{!8,X$*J4[}_U*y࣍KkV: RYEۂu(L ٞ(c dH6!Ah93_PmƲ'~'ۃS`dj[ AwWw RDoX`Ѯh24~硈w`Jf =/̸6?Ak%a*\. ;&'Ď|u,[+6ta_xڂ:/aJn`{ġH$fe"fwf#{:]ɻ:795Zew?8VҗOJgL{{NZ>F*h:lq 7K/]- H"-^qx^hMIlˤC.^{x*@v à[aTC"uᖔ5PS2I+~iFjsM\z!AcqSB؄=AةucRyz/(R OZ FQX1OTjS+1Y{6U7gqX{2~t">/B@knzٶ~\]+!=zj^̻:P2 `d^?UUui̠uҿj7 dSLx5OqKӃȞ oE }4ː,'rd=#keK3gNs4.UO vS?Aob!N=¹Z6m+#XIW_h(%@ {JQfA$5-j"XG̨չIpHmj%ey3y[썗 %Nv~MDF_X2gq} .``Uu7 n`*4צzjI'AOD\zoF?Bqpcc VcYKb,XҗOjӚ*`SbM<+/:wj}DAu8h^%+U7ʄJ"i:U.+Hw#Au5+KuykjCu2UlQjCu|)dWFD+E(Fje7}EG(-#F9\>WvV ~E9Bn 9ˣFV G%˃OIOG{˾ 6vX@K߃vdcGk"Z~0OēPo$߯Z=|i_uĵO ~Zꆒswd뭸̴MD7D5cRr]qc0(Ȕ=faaEcTM||̿zTy3-KEځ}PU qSL<YKPbMƤ'[AQ]Mh_K#Mp^vE 庠c`B7,NaL|v$j'tƺ6mz2q|мό JDx]h Y)+wC\֣Et‹pWseL;f殫Y7MXC:qmcނ|QHߖ/|a..hԈmeZ痼XGA{9 1|{\I'SpEųwo H)<dঞ-ٍF2VS%?U3KmPy@PxGX;X,O*_,IGP]4WYnO)1]P»tO^Df#bsbL>ftdp*Q#*0^( 5V@lN;{5}L`Uu&lb5vr#)?k%ꬫ !z/\Uiҗ]U0'yZCDU$$(*;} kl#X0T-> #.4 `8"̅ǝ,K3AWӣ{ ]hNIVyf=Me*mp -Ȍ*itb۫W)"a!툌b%.U8/tzit՗zgѼ5c(LC~L RgY|{e_ԝ_s!&Aa==1[h_w;IhUtTgmbVag2\~](rc't~`]x@?letNnx<`Б@-y|TtVQN>s"q_≖Kɸ-Ev8Ɛx\"iVe"yk͚Z,|^^&y֓V&j~ b Fڸ ] f1V"m+ON{ѹat#akbK", PCE(zPr_sq@+{oՌ{(J+Y r:+GPM r&voNI6Y9`} \ASK15"jQ=_xoT VFϪ^A־R&K7X닛WقU摆no:a^,Ŕ5/n歏c`6(t.J Ku<|O9r>!z]nlI :ԣ?ȁN{j*UU-HB*\AISL`O:b!Eo5!Pjq<9I5s! tP/qdT0ec Hi;;c\$;jU8|ZCU] (Ʉ{.n@L+mpjvUZކu842)D[9$oaŷQFԪ5ҿhtVӱGyWmoHdY2vH=X$__muq$Ew?̣?SJ`&W wD hm"SXUO 蜨+TU(K+#"Ē6,("#LkA96uu{L'@C^WǃRyrә:bFs{SV-$'HXHGSw ^-;'PZhY5t|?v-7-5JZRr8}A#C[O^"9?C9]q;>'Qu29v6&+@GMO72Sf& U5yfQ>Fk'5]ڵa] % V.S;g[OW^uF_qt/Q#zCStfL.g Ac Q{%XzhQ=9tfIM|kTomkLR&+@;NBN!) bWH}Fß/6 a aEd;m޴;Ce lzey+qœ lr_ܣDl?I=LlvfXM,ȆTOwUGSL_0 q&`7z)i#@+'wFNxAuW$dbL !6-]XsJ%&aX b֑Rm.z(xʩ]oynK6HyYYa<&Utj E|h-W&<ե@"H@N[kY+=J#>jZ{2K`-p~6M/ìBqjmMX2wх1=IsG?ɠלSFǒp>n0PXGȗ D>zy7 N1<#dcn ~)gL VE O*-~􀟭ZVc&4ފ;VhcE:Fu1aYE,8&0ACmiWlg^kKI׎ =[}ԶC6ݞ8Ír 2ܝd]"V$TO甆"t40C>Skir1Ճ~IkH*T"Jc BνU$ʤ*Wq<ڴ) /k|箨RATjmMբ'K3;F$[RgIubP8ŸJi>$ ؤȓ@[Y{M77fp-4κP )ZLV؄1tdLi6qqE+=ѷ ~C/ܼkk;ȯڠ:mfN ƨ0$F[x b" W<-|ȩrVU +{25>[o6FqNvxlL~?|2 WSNmۨVVG:`[^O3ۅ -kH SkHxq^X쨳(v1E3 |C/s~-Kvn'7c}([@P$^]%J񷈫Ey0qzd#wuW:ܫr5˵~7s*^QvjIIV>>sЗ v[좡 LntdEGU2ŽhlTkXrE2r (_/u?vGUHG־j+Fr6{RBԱًnuYpًn2EWę'RIq.pQ&ްg?̖yp*GB]FA]ff!0ٌHؒWZ?'*|03qYemk޸BD*A P@_DF`g ?wluPg5wUW@t̕CA%A YÊj7{(ɟ)iԼsUj"&IvBګG-th jhp[hvSVI8 ׯ%%LĂThSBmO .Úqogor9*pW4AsNK`KOuHL)n Q:KЁ!^j(YIey 5$5E&^DL7!/ro!1[2Ak-C42;)OfwI| Ƹly3>?J>c@U[X{pr֦_|oHka)Z^MivEh.iMz_mq,j_6]`gI?GAWBBzC*a-A ɍEwatx`O٘Xtyh2HKXч*ÃKӇ!fp.%l^Di5ɴdE^iiv@ z.Gɡ57D/^vj].JG }!墊1=6!JĤZ\jYO?elK|~XB\MrhS0c_$7߆(nnsЮG!F34v"Kc-eCdH焚W?}jk^ٻ3y>x}Z!&Տ1N&مϪgN9tq3շ|>Jʯ@hF!_Μ|pFrP\m_X=vfi lLBάeBf+AA[_lHdI"to;}QAc( c aR %E}N%?ҲԤE0BximoJf92Z&l WM UWSUg ]췿,0Oz2Q*m+{4k@Ntw~qlԿDr:$Lm|PI!I9 @#"_[;9 qk[ShHX,Bk7rDm'C qU#yEaA-U; bG&EmI`*lVYx*ݜOy/3>8)^s5$Wi! *@-XM5Bl-UsE:h:w|3!8"Dh$yHdU7'@2$*Um幃 g*qz|'QqT?xu_jq./T "V:RmƔGk{BM:!+ Lfo1gyYyƓSฉ8j-S6 _"@ *@vد8g6fcbSbrgG)Js@o?zNAظ_:aO'Q髋~OY:MġwIc!cqe.#*Hg 6ʻҐ՛ټ'긼m~NEV a^zeXAOeCFtG$' vpEcZy&X3#Qxcm.lΪL*{d?t70v0Ӈ+!W]oz~eM~=O&QEz}/ yDtO~I7w_]LWfbeUSwޛR4-"hkcƈ/lk#9:a`389I+f+=r@RɥCV@ƫOM?vNx<0<5PV>kzgiϓ7 qk9K׮5^KP;:@} (0HMVw|^;%H 2|ZH9f0+U46Zy3d>Pqmm&@D;x@bݸ0+,>GHM0ֵ[h57HHX]`r |E:o {:!ۇ-"k($[iEI+O=j:ٓQr+VXB`ďefG8ge'kv;itl)?$. `xa*C3cEP߿Qx#bO-WzУ89t6TV$/fV8 yLHIJi5v=fc4?/M-2Bc`c?|yO{ -R|_L|O'XX0h;ybgng>?޻7P{fެ`!+@MOl_֪MV# %ظi6@P!dc+FP 'dDe)=<:c?6W(`0}3EB~:YG.|>#n#e@kNp. E٢brd:#Il~ƣb [VX(K瑸\L{THt{YP67:]y0[ kMiZQoS*1ulS`v DfgGlu|>B/S"Ghx:^b 럼¬c su AKTq3; k&;ѐYrВ^sNK@߹\ォ5VǗQ=X]\zæ=_ΫN׸eousCYt #Mew>V" '}Xib1)(ʷH5׿Ve0 g9v5h8Oã6~3aCtͯ~iBƙcj]+E:TW{"8|š:8k{+kԂXKBzt5#M=sAIFZ͉vHB5+Da^h Бۇp5s@lL2EV6y;a";鴆foP?dsHV3ACBKy#b(Ҵ$;>+@Ԓ^-elz20bMta6v.<ë^D%;C"R5J: oDWn o"Ӫ,c\\ aK#[| +;Qs(_x-4֑m{<;qukxHPr7e38Kpș ҞvZ$5>73:Lc xT;q7A̹~N' .k$ްD&vTBFQ?h^$"1-TϓկSvX%Ovj= ^y0_-9)ZT`ʛ}7nwqibf+ګh~[y۸4|^aƢE1W?6y^r4xXA]xcVKA>e-a؅NA`#(VkF_\a<7rY%U|KE9%}Cws{ ίmoce[[Ot]T@TPN:wIKE2i#tiZ? 5r6QY 5/!`,A0NŽ8%/3yCcRrFUoeàyN|WḟO:LO)Eq1_lzM-A\V]@g:iHs60y2t\_tPI0D@DMuP}}ftE.Lpڳqwk)FbyIRn2N'y(v ~NUXl6b<Dz귰n9͒`GozoϤ1SrEÉ[źLV N4r+=v_<5q>鄱}Q"<B\OvLwrSUy(s@MɯdJG5q8֯B2Qch_+n&]CRe[S^%|B6B}uSs\_"uobj5),IZ$(3K+l1x[p&tgf׆<|B9G!VrVfT8ٗH `"FETǬ2ԶuGi#[*X[WW݉$2SYhCq"75س2# S-Tok!J4u!g0?Lr4| ,EC%#|@O#[N>;WȓSoAt$О#tlJ mh]_&VO 8] Kaf>魬$S+c ilMuhɞz>dW7{[$PI3>b VP1y!zMr- zP֡lCש``80EIKG0My\yC* 3+M"oo b(-DKs{+bTq-nͿvJ Pe8ܕ^P~z}θr/fzFS{8vr ]\8&,s MIg^Ra!O54_)50wPY \\7y`BTW =|upu'Qawgrf4lPm wFQRF101:Tp9y.ЇnX&oX=DH?9ĩʻnOxEvGO *'_,^5?DcfK|ԶLupvwL,KOV\]$s f̭T(cbk}bФ:(۟T޺j]3C]M{NaHra!'i(5T`aZ)ǹTgÆrBipLH֯4|:)A`0Y<Θ#*B'I!3RozyGoKlqc@f Ռ%/aзy *h@> jG:5ť ؝V [e7PS0E흈6ENElh㲾^#duhW(h*#CWVB_. nw6+}IjV ya≶$\Ƥ Z;N1۹P:jy;[,;:MJ1aQ($W r7ʙ*^Iu03yd7VvFBͶd>eLrQ|&HQ$$"t_`u`+^%0Yba-}+Q_wI \>)eZ^x<0JM+{?R1]uIK/*iwB]o!6aY}_ {܏t|Dt㥩Ap1JH[I QZbrX,@d/2;[2Į}f?´{;o7P}ػĢqIGP9"RNg5? &G+L8h#N!3)wX\C!ض`B,*"V`jq@D,oG2N [5|&y{EupؾnX1 KC(R^V {. _9=9/i2>vl[7Mj]f{#ƃAL-߆Cr݅_tH@Z,0,JxwRdTTwZpw=VRg= jh8 33t2֏9P|g!PIG+f?yEZ7C@Ѓ-=@)ANOX)1_TP$yP]ebsR cn\s}w6jdfe=ua1;g J 3Ąr@}c~F>Tj@F.=FO riHuNR?鄐SعPc60ab~Lgk$thN{R#D"} z%Qm{Ϗ CH1gjj5H,Hl2~$M³cY,!A}Հ>p;Z7ZGe?m`|o7? !~v310>Qxp g2Aɦ* >{UK?zOcR| 24S +^nY#ޕfDƨ?Af!(+еuyy9 ?|iC[IZ%hO묉`CT`r@r [1[.z#&8Ti%JrˠRv5\,VCkA[ABWN8GHS.7+TrFIQɡaFY=h&cE6X?ܖ&; iAp|^D'± I'xze&)FH6@DZ2-|1pWkŰ} 9^e8S9[Lmdq{E.㚗?+V0D>M@P}dx6ߞC<f( ,Ι .ξ;6L%L|M.([` hɼRAW%8b OwO_w9 3er(+m.:hk#Uc7YȤ6<3HvHVXw CFlj|#%8_ \J5wE髃M /Ӷ h=ef$^a%кΈG0 D>yHCLE샞z j|SGo4Lj Ȕ_$F*[(ٲ [_Do!w"tfrr1*"`vU<<,J]D̾/#!_ZIJgjKKWu ; `ilc\'E^&: ǣ4];t!:uO8DTSM\@leH'H饇RcU iH!>Z0͚c+'׼qLZ!A)#gzYq>@q{'xs`#M !FNxN<\:xc49l`O)Xa,E@>Lj9d|IV|G8n;Mϳ+iTF/E 5`c6aL.A i#)ݯ)WzVW\t89yQeaQCls4emlWȘ}+Rl#d@_Clkn}>~ 6',w]sTʜO*y Jx-4iXDaI4ñXբEnrk !An}:g[4^Kf׉O{QFF;yROJ AZmCF@MkgחgqNh٭Xp+Hs#>n@nBSOn 6ZP)NCdP {ߴʶ0PpdtIwH"TdAcb}ON]Fb1Ⱥ%NXg3 #„&fO f^}p!{)dPb-AJѫ%q"w@(6*3=+z(bu*[b:2h@;L24;BrTڧ> `?b= W"^-)G9{Q΢9xǸ}^])C&vZ+y"_K&30qwԊqvExD/1!](p?|MMV~U{jp3usF.emPupDupm^DBfQ@Ixy{|1s#S"vҿe[NYV[О*ӊ/trg1(`9;VBmz6Ķ}ψG?e3vۭJc,DH0YDuS]kY`#ܿSR٦\y|UZ|/ݨ4oUWtG˭Z.u ={頚EtmQYK>Yqz&l#IRWR\e:l^W7p:&al!'mOڝ$o"fm|<$u8D"PiW'f mAFUt+ͤfb6D-q]ΕjB`UZ6j)#'Jf:7Ղ)\K8C"B+0ȍ}J]kI -3z FSo6<:qI4@[Km`F݈ͨh%A"f1Sbp/ĉKugAnѪu`hJzL5^+RASQʅߒmaGzdCtvveI=:c9C= N2Ȥdh,<ٜMkOEn? %TrB7R c=!FcхIxQnFJW$Hv|`nܾ+)!]݃-4.ړ/yUmjф9IwJ;4ZjҸ\h̺Q k>V LY.(oޙƂM,uCKk +K+q 3 OTHECivd{6H+"l jbiTCϓ-|=Y9CZ㵱C+玄òAi*a||%CGjO {PR/UAyz5/ل̙ᤏ{SRrYD#Z&@s%(fGwUAD7(@80['@ՅX+fZQ2PG"0 ^1PKd*ZLnv vg*t`M ް['JA*҇T ZH෎C2ӰYR+Ʃ~'Ԩ61+[e[D揶a8T^1$ SqKd$jV=Vr9G]t_gm?klK ̱~/`.Ytu7$HcH]?6;99Jo颩 y![T-i6cE TKO)xDDGV)^{# m6o=YԖـ%W9|l66(0eƷD~ 0֘ C]a0C2%ž~wHR\D~&*#59cOZ57sUsI<\T|&gb:wЪV\$!&t) {*"ʁʵ\ )W虰<9MvK5s="=# s䱤ulbT`bbj ,O^ 1n{Ӿgz)x]OS}‡$MvD׀2iKgA5#܁pibmrfm /(D^,S"L <'itZP2u[ct/t6BU85]?Ib2|rb;9Rb+iFʏ\V>ۅ;`!gH;vxa3sv\dD%Td< /u@ )bK]V`Gӵ3I $.i}KϚ{P^g3Hk8YH(\;z\ua?Z_p f0s9e,p;gV;F|G/`~xo. /$Ԋ끎lWt]喦 zzX!-f"߇mC^ԁZOHGL4u"UtD{ ,Jbj1%Yh B+a+*&Uy4)[`/+g96+ky~ma@:!yU.B0oAy2р>I] 빩S<ފ\?kD,i!N&e(h( 6zêo'? iAr}X sK ߰OՈOQtnV:l^?Lh} ks#4fQIJl 6O_œ\LEP,Kӭb#EAā{a߹O+O^GY4o6uw:WhcVcuə/6KEZ mB|*d|]jE9"`O A%󍚾yMc%0Ė98NW /p1A>Xxa.|2v|ye\Y,Nz}YNy6k?lw%ܐ "%LqWW~mFifO6Ҍ|xqG]+o+[S8m F uߊ屶2rn( MɐťXOrSS^^d?H 2G~7nsqd~T'ͺeݩ,DAEM}9)iq)@t?gTx7dZVDw_(3PQϭi؅1\6ljꛜpXl Ғ 3^vCuƒ?CnOm59TxT|FͿJRhu1&H)Gdi.DB׉ܜΩ3aUfq1y>- B9USMDB;NU~=^@W69R*hNaR oBuP~13gZCќ^/sRIIn4@:iID6{Ȑ'SkN_[ܮGݟP\tgF"7r ZWdj4%_Hʄ 9PI57hެ}@;smR4d42 s)nW N g=́~3sa-W&kb0Ur qCL?!C@~={>u'v 'g-6`jN*ftLR1*O߰sxQq`1=ay#y;6&UKeDM#x\9,v.*L"W.3X7QūK_K*49oڅR?]]E5i礘%h Q'Nd|1uRuLg_1a~AV (>)rSIY@}]]lYr̷fr].Ϩ[p0' %w5eyfr`rF~8>*7jU?X9G|YGםOĤ-T}O7BG_YڂYfME82 7yr)]/ҫo`P+X߹h‹G*./]c ;Ex$WnhPG5ZVd9zF"1efO]U03 kLFu-R6'(eg\+iXN;VҸ12~s{z8 k%GNv3p^LxNHZA]ueSd@ K6'[>bZ`?x1LB x*OZh}P p'oi+( zq QaNjV0(FCr-ٍ~NIKlCXmOhc|DByO1^txt];_Tn1dkɫ޺% !4[D ~4-A2Żn˭;*C32VQ}yѾ2j'J>1"`kz*7B}G+x^S8WC?_3hQ=h-T_2fϤX6>$&# }jdBiH8i{ߟgZP"8-VED6(^ީB-AZ15*PSVC1sUT3R1͉@}!6e_etkIf ? HԂ(B;qD( 28@N{ɉGM>~[1FPblQnmu!Gs34qjc-T9LGNǃ(# k8GYZbι<{G$TaPfh)Ƒgox Ys{SE<)GW/(߫1Yh+ W s]wYmq;V\QpB\vl7hks/FY3F1*CiEA5ɝFNs#ݿW x)dTB^;4X",l{kկ3>j:2E UÜ#-cle@3/gB7|~:d*Cal^CSEYJ#>5jIz09g )xa5FYnlz@zN3‹q\X6GQ"uhrs;/ut$kYfRe*B`ZrP e-F0T_~ܛ)|IGr\6{<#JO4`(OL 4L ' \oECA8b B_c(3K\Rr{4@ ySifIMMY-ʐSNtgT@]`eIrt  "Qҁ)p!u#VxߍmgIGgT54s#dB3)}KWHf¢Plm@{@K]^-[? _FSs dLjD@`*u8EgfL (G|Uh{Hqέ}Gk´t;;CMz~ͦШ; `6vN, CQJIڼ?bSoZvBmY[+7:hJID9oKBtyqDo}zA[^KmꝳSJ@`MQP5], d`w]Q 9cOfd1_;$wϽ8QehR<~hOۄ1Ev*6hCk9SDSOBf\~$JDBT(襇c>(lSɔFǚ.R͍wx9nW hXxA:$'@qdX`Fim\{8nhvxdf]7kb LSE&}z0FB5zW% V09aג&ȹ,p.(6Slv_ƛt廇fX9'C2$ B^$^ߪ)-dTOnPNSfum64`k=I]CiDԝ- 2id~ ۨMBLV.IPV8~="ް(S8ےgɋNgl+4!nl*-wɻ]@G6^)%JG5ջj 5]P؃A[s\X|:)+jhAbdQڳn[݌}Ŧ‘a~o/wfJh0Z%nxY 5Ln;[IN7] vChJJ౛TGdb=r@\,+SԭX)Y&{fEz_:! JW6L@Nt7HjѴ C6`UWF"cʚYկSCxk 56]3#MC% e*K:(†e5jl^anKV]IrsET*-:J^W=runRHB¡`\dAfgI~ʓQgky%3x5sA$`@[f!%L.#[|Rxr+5v/Gg_]YhLS,KGuSe^vv7 hݸY0Y>:Ir6Eo(B%FgpomkZ<+#Olbƪ^amvLkLA=u!D'=*\Dɣ&g*m % MktUxgLg\t@nIHMZmoK`rj /ÀH-MpX%/ܧBh@^x["^y `Ԍn :ӑYsS 0v񪵗hx 0Ъ H6/Phaժ (׊^}^~ A2AaU7##텶Y]fsGhpp~Qh*쫙o/h'$?rpYNe8èuˢ;,C1-Uz dP[E>)9Ak"͏O }2/z|Nt7+XKj{cN]\<2"1Ŗ5.^fű0Y|'APf?Q^;_o~+MpQ"y?:K6y7 ^6&ae j_N 2= Śoy_([2@Xj/SxyKwPK>&$QEw7gQ^j/%^D/mFI)T%I]%vbm=׺-=d/p.E [ΙTZwJ i%@yYM=; zV;l2gA)%G1\O.ׯ J,ɧ@R0tn}s1v:mGY#dD3aH|h`/s=ǪJ0zZX͂TP9y y0wq޼qlQS5t#(lk~j*( vFHݭ0&(X.|*3(,S[XfTټ/2r(7rdF2 oq(rnD]ԇ4Ԉy"ۇkfFYETʉK5ʩA ѩFy/IV?jf2sdoi ϡtT:acNCx} E:.bf!%(t`'4*K`yNOmȹi. .8kqe&]8bH ;h0z/D2Gƍ ?jquzfM$уB,ߝj4YxhgBg d#L`"nY$FSVEПgpÖB =_(ćLt$~s]SJ{CsZ3zѤ;=O}P4xX%ԭPHpo# Q$ c<2ҮoI,eLKlO1Mem{eCf`< 0Vz>P_DbM`u h|NX N$wպ`8/SҠf2b'/#^bԊxy$@ @@Px]9z]KW - P+`ִOȋtYvtv^l7~nf/$$Ed?AS쏖ͧm\ @;- V,>ϷQg3\/ xl ejfpuVeJVKi<룒?:@ɌjUlĦ+# LbVPʗVkuZӶ垵, e{`+d[,F]jp$r'h>8m6}|Y˱z"\^v#ڧg`B#N;|>^+OT,]^8LaJk~εciwFF1'zciѫvn^ P$xnNLo ? ,uF:wozT2N7@Etv ᗄJ !e=ƗEZVQi ڽ%]M?./j̷M1ǢUΜP-otܷ]ߒv~勇y">bR|Ht!%7T48+nk:fZ)Ho}E[ !@q#:qO8nˉCHZ^%6shGfceJ>lZEY EBX@GMy4lsW%4V oƒ lhfHpVDvfEx(=ԴRaLI ,>VU(WLR "T2` QP.wbAplVϗyo3"F7Ҕ<2Ijh~C+K  'Ka<7^T3^p= bwhM9o&E( 5xiz@2;f}FHJUa+'r!k/Bm?ɿXDyDdvv#ERDIU#D=D*TBdjgʍu֔J  b5\֚ԩN@= #K WPByITFP!mh>Ąlj1L`[ךdjf%޲8%\ M2Ej>_8=~B7`ʯ㹗yup?+r;cO NE8`\HLrVàO <6bǺ W.ysڶ, \G{TgS%++RH;Љ592 M)o6jmgJDlǐ?O`ft1܊W$I]Us3tcx ʶ͠ZZW-o>K"I~A|dd#$I1"/lXE.9c ^kݑ},mAz])Uy<uL#*{Qn;l9-&%*zIlS٥! JK!dQ"=Z/u[&GrP ϛ)= Je*kpLS%rx,GIga:ENHSGw!Z7!$tL(Y{U^2(A1Mf'-(#sDpm5zY2ɞ#pRhXVcNJFz~Yg~{Fy, gȂkkwymWzԂ/A^XD7πzӫUp؈~m-R+{*,ίR,\d5FoD&6edn㡴[g7s=ڊUeK=s J\ʡ%2̩]j@BZwHƶyW J{Bϛ0s+Zw[ff-殮\4ǙSB6 %s9lh$>bVs}w;1kjAc#CA(}rМ~Uʼnu|"m,`Q2D,l|G6kH08xe\_ 8_&(\CZAhD4}hPB uHEblbrۀѧ,A'PZV;p3;GO! |+񣝷6q<*Z& 儌qTzf再vNFv/hM)pA(srX-;kKtN p" O[nwte9l5J(PEõҾ9HJU;+C&3$uV_1`V4#K.H #*BӬ?m,=kmUP{ZyLG{&{CBYW`k$K-lk7Yen7YTa``oym 8m9Gp Dlpi<ksl;^<F.? CA:L߆%ېWݤJuvˏϕ_RIÖ.ui- TeMCf&k:^Q]+a'V_0YZ Z@q8ɵtvczq7<wLqPFlG;#ITX-އQ',-d0XG BF\i;o]kz1w8y}O!enQs%<J#N漿gHPj $&ܐ实ѯ 2b܁Z>5 /Zƛf$Pz)X$GA(+Y[!AvLx>itZ6Q2?v/iQp!4w_bD(T;4be9=*w8} w:*yO_`Cf EJǮ3IuW#O3Zf8h]xdZ*S-#?D祆a3?#uy`>@QSGx'_)IWxNP^h;Q11dՉs1t[ٖ%b7CϢq~=uKl[>Qr4H~W1sjiiEhgnFv)CrGA]l$1]Bs $xOYPӣ-4t H% VoRq礄~d#<)ȀMOE$M!%g,-e+|:O4 eR7WAx??6 c8i&uۂm #>'jxï_xtI:q#D9ՅLp]yDaB_Wvۈ;N,UJ&cݕlrkawj7Q>N䤥njB:EfZ\ lҒ שׁ#fD-S^:p^/Z7M+XUg=ф&0մ!~zW5o]@ R&G0[e& bC\ȳYо4:Q/Y<{v~:s #Xe3i;Np _^l1IyX+!.0&Z~~ ,"0&GlKqq WRO(jXG.uMN mr'cdf+o(vDDzqfRs" K dp{_ÿK{ɪjKs@U (΅vM6O|U`P"@2B'"`D[c۪f %*֔J* yDgn*ΔK! f{5sȩ8N!>%d RWyӲ:)kңMaBn7>ɏ&2X_s7z !7zʉ_5-5b dbL<^NhU ,RCR{}9x{_KW!Be&k}9!J'&ZS\zFWZw9UI&BN"󲎘DXy ,=dvJ2t'/+* [z_Un!wL>]?*1㐻xu^. f)~Ӕ8tȚ::Uf I"Z2.HyA~1?|Wr1:W:E\[בk}+1ْ%\νHm4V׳q';K.;!߭{YTv ˍf0H#G U kVZoI=q0;.DrxEUw?j]wO]xύ5:O5V"'?4U#kVCˆl*0 ʸ͹G@sby5lyHХ!C5g@: }LغZD*TC/P5J_iqj սPuPr dub80IfABpLJ9Nq{MF|:wURߜ(MWQlGNZMXX[R^ Wg b-pXd7y3$%xv@'4 'n>]W@QoLwmPO2qA+Nǿq0F4mh&Ye~t6"/0X-fo^~N/̈ˡ59SPհ\ON*N!;j>JGIOh4 3a{'b Uc"0PNMb\zZqrh{2fU2Q?PyL؆G!M?*~Տ:}.Ϙ.e\-hi`51!^{ ?z~sT8}GixٕJ_xE!Rag /4́RK@PqvhfS::$hQ?b'^P$zj줚 CS@ax-:"uV II~4(}!\dڐI_lO۲paܝAr2n])3[:5[vG#ySβ?Mi_nmUr VK)c,TCCGp8;@Weuu9Gԏ+;x'7)Y >J~]҇YsTJV34p y4b]TX4)=p^S3 y`]4 !:&Fu.j?j)MiȯW-..EOBEb>7\s1cB"̺m,\4M=L䱡Ik<̆0}iDTD7s| &`] $K( ~ UСɏ/  t[ l k"E)޹źr)5 )LBjU(/awaOJ3NFs4jߟS$| krZ:c:cPBׇh7MkJxDe~UCNxTA`cD]+$.6#W Q;:~5Ɉ:R7ĊlfFd'ū uƠ8(d*&Eu'Sә8[&)J|dRݺ=8Ki5t#OW2Vps E]=?f)M^B,cwkL4M%sd'8|JW/ Z``!P{HtӞ7{M,Tp)$(Z'R ZaE8ꩰv['4mIJЦA1f*Q֎y3 ä2j*@ĺoBɾ.QVjd*+eOKFxX&*`yt]6v?#KUnz`k)QV*o/-,E^S+9F[f-QZKzH9wV6_9AGΫ?pyqk&r{l"ۖ9Ĉ`kO'k{X' S4$CjG'9F#FZ.qgmpTDjkqlr&qy1likR?܎^יfk?>AK'NГrds6M@aM#]uR1ubj084a`P(9B!l4>g>}B{yVu*rT<Z(8e ^eޣNJK4\Ϭ?*K0?3_~%nLbB3םkr. d~ zҔ@ "] pD/cL].L .BP+b ML {N(_gt s$Q`LZabm9wU +ױ%2so(ܘ}}?JYUK L!o?e2c\]/+NmJUJ>.׮|4 v.uPLuNljX|F- 4͉C=IUe"9, /!\h9(@l[vIW(kG7z)3rPorJ6ʳ"UdӅG]?dļ{/kh*%!HgY4O ؚ⥾u.)$.oQVyǀ'W;D~ |/ZEkbXx0JK[, 2EMg Hm׿ƚԣeC).=~Vl߁Hw A*ZrNt)!0@+I`MUgOҴP$Y:ǧJQ1C{HK뽝xZ8ͧ-y QTZۨ^f-VI1Fv@pK'0Sv#`<;֭E(rFg)_I+x KVWg$ߣO8AΡnEp\6Vߑ,-LovcF^`B J!guYs5+;pT* |iFnt`38HZ3OJ  4S}@FZ0#at& !N }ptv.n 5vʙ"ð82hnbF&X; ǝOK=@>] (X/. M8޲XL0x2̹2n\6PCS_I6o/qS ? DwDf(ۑKS F(N(YVMRvꫨಡs'r/k}0Or,#rkiBXzBC]$F<#ݐp|k?OiS&S.mTtmLl[sFD׮zUih\',7hY bFmPl5A3qawocm3eǂԦR9YhgK뼓1:IyPfΗp $,xOV<-,V$@(-7V%Ȓ#ӗk]j59 .P2rī`zw}FY]G ͤi9d~[6V*yY9)r4d DG}Oq1v+X0D'ZG.?LNZv<ְ09TI)*r/a GXS' |OHSs<#O;Xz̶l蘗' 1Ii_Eyv%wL?G"=̱~@Cw:WU_OݙdML?P՟-I)zw1*ާR b,c% 3ZJO>%5Ѵ9'te$x޼._ѿpW]nB>L" ?0<l7gLtzC"f'4%͍<ʂ`PH^棐ZNU?Bqo6Aq|8Rd'[t&:F+M [&"=qc X6M ۽y{zx?9|yo^ $]wjw~'G%{ۥ6:LJRBiss0ǘDY/Q HjRgDP@:CAV&).Dg*216[7M9pP=@pJaHg2,_bu  PbnKyڭFΞ&kN=Z[|JGRbuIA#BF-͠0rG2'y{\yv,SZyɼNbdImpWz 7hK5q?.vHl(\ Nj"taH:x" ݭ3`:5Ej<yTZ-O$þu(L@TU Ak"+Ơ"L鰸{cmt.S_j+5L뵠H+_#ݦZhgMwTwTE[C_e5v6JuJ`+ʔTyuYJ\&Y];yt9)f؟lz탧AE\G0 5$||dGV,tyXT,4aNlHn3%c-4JSՖGZ<@&o-9A JAGdيLsqf^wHHNqɳ?FZBcλLOzXs^[& ֱP!+ 㘿n0XKQ&r@=53$)~w>E;a.J^V}!Ce-AͪiK-g25H&U0aCJ<,Hjl B2yQo|9ߦK71[pENjR!6~XD G 䖐q.g;_OJ gb'̅N^3s>??4}@6#e;#@'OP|}/l"7,Z3QCVd\ݗk1E18T]1% } cĴ>㞓T៻dGָN`n|ax_~&ڇe> gbrNCV>$50)M?{m[6ɇ4q))L6!e":m}p'BLHXMft;iQ}H `ne*QCfe]ժK>?M\87vXOQA ]Egǜᖏ`tn /E;NuhMY\y$d f:;PIf&|B-p =3v|g. v[>SX9L}[Mp s[ABz,ٮ.F ,[kb+gۮ< AgΒ~ZW7e2%F;@ڋeQݰ/&r3-ӄT46ne]c%底N-&i . -^ϔ].1p6 =prF*}OP5ey=:P [MO8t\cdd>8rLo<#鱀a`jcF3|RcG].1o<|"H;M^P'< q7crz ,L&Ja'$1_ NIً7\Jy.nP^!gŵS-v6yKF8dP $xAc^^ML<.#2_|^%vrvQ[ʾ1L_ʻCh/ Je|TT[7¬*qBL̋\b/j&)2mur:`sQPM_.di'L$7uKH5,dja&ԩ:1_-R^ZBw>./҈5d}CrV Lw/0Q@@\7 pЦW.jV=OCJ4}ePsEP,AD i#Tp]9~%P?3H8kOC,itdI 12ӇH -Q=HE+y)Zhq & _*?[,W5D>D9q&I%ώ/]ee9r{*Ϧ>  NwA=Z?*zD1IGJPN͔!Ց'0F3Y!NbQjJvqa@coO&qe@LF Ao|Er]p~PWe"jXUK/8ŊWCl̀ݖn;F wlF,J>r@R gjTCc5$ԛ2 fO/ގiT|fB->5T4#28BC:jI9ljԺ9 lcojdBi[;<-9ɫ)H,)84 RC"2JK 9JGg3Zw3F 8fNgj_Oc5s`* $lxI@ڸb0Õǐx>5(-Ve Quu{3{Brl~xNeh7b1ӎ6 GH%^D#~ Г@bC',M vN%O 'NxP,w ibp *r>zG,h`pJ{ YNϖg |]\zFnJM" w3P<ɀ)skG `+h@le `͓as"PLx[4ax0??F\`|/ՔӊzKqṦ!sx[{$ :҈m \Y^YhP<ͻ]imV2 u!-8A`Ùaqv_X]ϵIi8'4@QzHSw4C#\fAذQ(RZ}5,sܰO )z(U9]s#nsaG4bfXs)GIйIpYWA{@.гa44\D(i\ yp:6mV+s_пxT[GF5.gDH,ɞOw/T2T7@>ZUZw{ƺ#U^)d*90Ck* x6QUA}$Rt:ºâ C>uY&&$st ~Se%OYbR {Qhۤ?2`QQ7}&LMb$wAϣ4A@upih0z,QqÌ8>wП6`T̃Ƙ[KfMbDx)$r-]m\"ۤ*Eu[͇Ov90eǵtR2d)>7]c(|je s9Q=1 |B*O'.SP_(0 Nq5#1$7$ƴaO.aHN,Zvl}D-aI|ynü< c:-K[;56LI_9(u{v]2D_)rҙ{>P53`wnqZWPK#x"yn: gfwCHv.M+kW]+ \UZT:IyE4Kpsjq$,D(l?K1zFGF"-1/V03'HϨ^'YXSG~[˵X<$k'0S6q.hY>VPr^2>#nT8^T!=5r{QEe*GvlprdiL`NY[V>e048ٓ [Խ8t;0jNlGOC>h*hdVkE%>/Cga#MM5Mrꖮcc{T`9,Ibf²aaF<<ڽKe1/CD3f@F/t#PmR{gXneTP9plH4&/-ZxD~)`dy"ZNz}q!j<3 ~*L=N51L&U%ʥjvN5̡BU jo2x7m7|j5*HB'Kȕ<3wE*DDWw]:{${dnBuf:֢mUXmu ^M8%ȤNI Ņ'5WdIE@t` >M ]7 m[FWPAxzኂ5!^UCȬr6?db I̖ %AO[Ta*G/vRr:q:N['UKn#2tY:uT-N=!21{+?^8oEƿ=tk>zXs\OVΠ3UdLQ<ȡ.vcj=ۃ5`SH1&:>:T|3UbFOHir!/0]pWd>gM k4c)#;|L- Mm)"a.˅BkJL9q}QUȳjyl@jкxc fҌ5]KG0QkĄ)V|RAtt\^|%3l+QY 3v0m;o#i{W9[qC;`J<dI(0lC4Fr|MI8\K#2G@Y[aa9\s6Vap_HNa7y^Hëy 7bhm>إڋyT% jvZxzNNO. 1mnq09yBV-?$Ϋ)EʑF.,(lcNt)*Tyt V穌D|wA 5UaԯG[UuFRZNݏְx+}JM[~^9)Lo/MB_ Nc ,^% B3K{R+wDg$1/TZT%Ҽ VM1J1n-)1, ``)>]Ym8t}dSZ7x\8Ntجtt8e Y冃U8IX탸5Qzi&=hݴX[n& f#p5(>M\Ƃb.r$'ѝԟ/f!VIGq-M=\G 0vFɇ{0[iY*x3Y}Y 6i1/Dbo#/oW8'V =_ О%֑cq^ݝEmkϦ Y E Kջ TžWd HFPAE$e%Hƚs*vlM" RR "m7]* k(:.* uDVG*fh\niɹLU,Y2B.e)22t%c';ߖVj7d<^;_x^Z%1KvB'}# Wv 7fuXn}ޥSq,lfPyv 3]ʜVgmg2Q;$?h:O?n~27n@%JN, cOR a? FAbiC{qs)9y k<9K5Ib:f _MtNs`(C͡IۺEJͶ`bP8S Ae8nEcX{]@xKLқCRwT/hv?/u ~i=m:(ЎK0ǂ&)T z^S]zDuI2r^xp)r6ҰJ>%v+V|8J2k!1IGwI-|맛ܾ Cj\߄$ZR;\V8&iBn <4_&b_Js6I0){eq+·lVX{HD[>c~:N6Jy`B©lnZM*{qaz7X2 % p#MpጡFн}"ßeDf^Fk yIXDmey뜊Ҵ{UWhP!l\nHg~ߗ&D-Z^gmTd]/~J|DRZ/D6y48>]~~0ˆ;U=PApiFPF4;H^!j_kLz24 ,`$4ׂC3P>,`n£#S?߾37d`TR'镲 qhK7A`"~jtV-K7AQQQQQQQgfffffffffffffffffffffffffffffffPd} Naz@KL^_5w|J!]RjtsH@zZИԯq Gb^X ;oDcE1uV@[klHV7K~RKnG"7E0.])yC:'I넖z| u@<" ɪi89+/8, S&IPH+O{UoB;ؗ7pap[$""*Nx#*zLrUvO1+5VĠ^#ZoG V3EPkzT5+[HvbqKY(/,V$) }ݳ3۳){Moy֣0'."j0:wAi^6L-E@ׄ"č!Q@,l8`3W &+y|ihեJJf7F8 2m*˭5“aGn?ƂY,CH D5>òWW ,x^oS(U(#T_tߦ-g*8V O6KfrjzK<̀S:ngOLևBw1^K`H [m¢_)SU*B7?2#1ͳ2 2 sw?guڞIsdz(?`G'/ ק@ Fy[`O3Nx/w6QW5cWrxݣ_bV.@eB;Ԍ!kw\{㗹1 Ч~>YETJ}n3?OOVG6K]_܀ @َЀk#cMr[هÞtw!T>-!E{2p'K4:#H*4FsM.?Lq^!5AXk)ᗖ`NMQ6fn a Mґ.3`µ>=y\f-!p#K[ |1gKuo?&DyT_*Lr(R^e o)4_gZʼn=!gԟ.v{ᅜnyX7ot#IP[ZCl~aa .# lT\j!%0^H,vlis 4WT"ܗmLC c !HOg-=n)Xva"_ݔ;Pr*Z"ABxɕG3SfG=yzJ/*ph) tcL3/SL]O)qF<&?.`/آs XsqG?/ع}:8.2nAf k,q"')<$5]$9WDRjVυwW0IC4m"Ul`Cgp_bnv}[!.BԢkIIk|kC`j,3."]-I-CcT&z7=yk;V6G[Ay4S|)f04Y̧e/XlW"hF@W߈_^svA}iXŰ-kw1N6si\R܃`nD9EFCmPHfjR\6ŊcKEKm$a25@gv-|98*[m~XoTP@$xIۇ:fƴcrJJAɷ.KdP,. ۷)?̣ݜeF][T!}ۼef#ݧ_:}) ;kZB4N@,(Ցw^]%‰zk aGrJv+./3,Yhƭwa2zjnZƇie0w꼗_L/ 1哸)j'?R.}g}%}w_fLc߸&y)J³.]Uw O^k3rWA00=:-nYK}.ZJh5n@լQ gAY*p1Vw \fHʱ5̽+ P [gȔ=^{!1\B?v/$qxRz,ޑ9B߉G,> G\5WS tfVDS(BNystbmJЕ N{l۪7YY Lj}!.xi}HCMCEgB#N)%: ߠTفlvU%TtMD!:Ii\'KŃ5m]ʴM>Bq^'لxJ4\ƜmRq}v6q,]/|J aYgfA ¦B\zfzZx6Td4@rx,P}xR 8kC|N+:G7G'a*"vkYE[qň =)B{8p!K`D'K,{4Gvf90#`vY-RA%n٢QȀkB0X! Q y uL#>2 RDG[ VDivu.98FN[O1dڏ/C.+ džXZ2F> ks{'h:ʵxn%Fb7Ul^dK)E=o퉠{Յ&c_sV́~_KjNiJ'*#-}l oBBk0Ԏ8@v}2P"i|ZF;+n7{;Uv&HAgcb IZ &|.[5[rR݂ɞ흌$lGU0\q!gq>!T 05ySæ唖A؂G UړǚK%v t:H孎cYQиy.lQ 5ԦH{^Yros7#BG{aDh N wE7c0&lSӜؔ9VPaU9KW|֫Py( :QȖdybFm]fkcKrhI2=>8 2D@?JG[n P |9GytSFA Zy>erRM) .Rѱ~g`)`NtKl:Hf"vF1gny%y|W(v @ B C K [򚤝Pq& H Sl"Ö%AS^ 0MZϐhsnѕ¨"Nv1o/ (&PMZr]墝y)IJ{,Q見垤`!ɝ: s1 m\w%oo+S}j<3bNMsRjw6ST#bE3À05H;gpE'h),`j2@0X K|BZ ̖083P9<(2)p?>SZzc?=mY*FE|$(p ~;O1mM //^$XCW2h? }ݒzy:R'.,\mfjr g7b fY/[;YD3"hS=%"@/{t2JlpU~k1aނk *P\rk]S}F Z5dy(Vu3ORG\x{̧XCB}LUuɯC O+h7i\jIN_@O0P70d#vC'av#ط<) $E|}`ݓfd11p!SzJ]ZP6 NK\j޾gsLdK5op')a^1#pn _>K9ۨ1[s:V6p~f, < L.uw5w*?3(L!eo)=J nD2_]sgAsS]I\[`4y\A>otcZy (_ *n&?f EHZwYq&`W.tV @(#[k1կ p8-Bszӑ rб|q>nsC\ic,$;S"3G^JPTC|)72fi뚝YC2]mG]d)TWsԅh,/S@ojߑZLqȤS{WȰ!CEDW6qhV Z xOA0RIӯ \F΋jtom?X誙i^ m@aOBѶHnīY6H\&9R#b C5pg&Uv1=\ 3jPqf@ffQԽ734!迄q$)7zP\@VeI@iX-D/esk0kO9#!{~fbC~WaohlhA5aԍqZ Oj$;]9<9B ńI ;)b II.G=S6'e\mQ3{|4s4Mql0xR62MAMS{F<)/(JDH`1 !݉W6G\; ]UxA8_qذ* ncte9 >[/&L<^IXC0R|G+-ro]_u9.z*n^*T׬x{HseIyY 6c^5) VJ@\9+!C<sQa?ys$?7*7R1HSR'srǪ+aGazgfg>hfqOyvY 1kv@ÝQӢ:gVpLG:8J3x9^Ƥ6FB_\ "Z@?u5wW8S7ˮ8-ipm9vAeamt>{CAIkFС!H߼DQjKjq~T+جDʵ'5j$UEDބM^ A)v|A'^Ecw =dDOCHU5k 'Merǰ7<(DM}"T暪Foa~{6Oc|zf 2r+AUy/ m[n @T?]'6I&!tLzŢn-IIP)t]q*D^p)Q'_4[wKxnt+)BAvs%v*o~+IKF)M_hVJA? ^v6^/XCxPbwBe\]SBĐ6;p4J{~'tjxytz4y nT-H֗SB_;EFG1s#SED۔Ipx wVǘ|qP~s׬CwfTV-l| GnGpMK|cTn UC \WخJY0R ^ۻ~$ CrkT(3Zo'}0g*5*;dL~NFi?lX¥8N~a:B/DBOoǿ2 n)9t )|VR#o8ZŨ3gHK7&Rl*gyvӅQcX{ ^@bWsr1z@H'W&|.ڋu;-Hm~$P94q/ȴ` R9C ndeYHb脪 ~LGaᓋGI}7@]q=eʲ<ΏlƮ$£2RΎ$]?㴮M@xxm$L<}&-2'-Iuq10(_KU﯅7\?8MINNQ}<6*ut0Eu+G+[륜ˮEYG#Q  Svr-Ei?K <ύ4v`bGxaZDcCt{ Cd{Yp"ӽ<Q-_`T=oEfKL}Ro3zs|; TfEUVC蛞_MtW'Kԏ[ bWm+TBFc`Qm]3e;m%s4K~޵rғ$:V^DDOKAVcǸ1d+u}o0VU2QV+vm %jr_/S"VGH[FV5[.#2$'7VB7+rث|۲>+VSvˆV[_V(-+hCyU &Axy[X91RAsTcU椔 j4pW3GS&bQb)ιAŢTW1mez3kAv[?w>)*) b\)xc)IV*y(*Y:TyO;+Ks[tW&s)8H/^TKPXc P2'Rbt2G,;âA)^d.|uƹr_XSl% $ںMvZ8hN./hqsjLJ:-(V i>aSpFB=":M@Ei=Z,NNEy4_lIf5d0Z(bUӨ׸0yPKۿprk7+ H$^ɸoԘ O>6PW</mv8~%uhTǻaޚ1݌J7]\Qf?S)4A#7$Gd\9u3?h2)rtgxDsCI] YǨ`%y+=K߳qHHt@!L/0ҸnWv n]y`ZZy‘f*n;|gJ퓏NW yr1p [2Lz/%dNtQVkR羖F>XznY~ b+x[l'ni$ <Fd4;[ʼnWɰw!N]dt׭. k6W}A rL ~)Q(qVHFGqc%Zsh#r ] r)|Y |10Cau$g^o^MmB ʁ]i/68!EL65p<"-aCD^W˟SUɊO9jxy5!idlC~,սcOBL*4l~CTaqwJm$6r<#o&tArrT 9u2 J%ny5jH D s-buL:.cO۫iɥaB Kи߈iq"Җbf;RPzgiw*{Δ<; g r Scࡪrh =+1[@{XJU_7PA 6IG~]2Q0rá̚7$҄ӘQYt?JeN4A*D%zEf0&sdb/=~Ϝ~5`hJWlK,?eO~]M"O+AmG^7>yuk(a bwCdH53\)sFRry"{m*?z>ͧAE)GkK5GMR}V_CFx@`fJ_50l7vqX,יCxnaao"LJlF{& T"cwK J:*: VAĕ+\0(NlU^4)6{4i^N!1nl\OeS"Rl޼갈}G'stwp5tuϳX nT3ynsG}.RcBōc7)JoY;+zB6q<|a3`\K[tpQ4h0|N,PE \⹬DiHFfA!<[`b7~Ǥcr8z)$(ZWцs8* r:]3-qM!mC4HcFGDڻ]$bg@\ )5DSABN:P3uTsUUը ;^gX$#*>k P#>{s@uI2Cˣ1$ZPM3t\۠dS ϭ+q4U #3ɽa?hL֡ŮvƆA5[M uAyLwZTjxDB~c)ahE\dIQfr߼q鄖5syW\VsFf~,Z#&<]x*cm+,%`;MX`֗$Ϛk]$x<[OZr`nFaT킁ju-V 2c>xy2K!AҸJM|V)l;ZGvKI.ISpNz3Gʛ0SfƿByZdd(Laټ|oSSq=}2*fy^Ow%4ff夎_zr03Lv#x#G/[Nr<@_^k,֟Zl{_qpN51KwrXӃtGMQ˫~pjJCOR.Ȥ,XJaVL,]Lca': 7>o`\m"wFtݜxdnFnE9eIijSu H\Rh}: (VSK[뵠Ҩ Zfu!]2N|,(^*2fHSWЌqX0!4߰zڬ6Fn|;[kgbק8X!\Pvl2FA]dq;_~.GunV'y rWʃz&[n <2mL)2NE+q>Ndzip~Vv M4(=_ b~j`.Jlj`eF5Ћ4]^T\Cjܸ`XIBĮA5Ki;T%7EgxKoRu]r>DJqiwB_lc @SP+z'=ӦjFBw@mi2vb" LNI&%@JSgOk+Ǣߡ0!ۤ0nPKz]Ů(`#_yW|i| Kd^ٴvr_1XnC\e~K1d̴Đ~iJY_NI!>"w4>/wH-}bFW)"~JU 3"D'x{'YRwUXTY` bg`L1ڰL0'3jnohU{d8>.`_,ʓf!8+t}9xb*7DvC^<T[PnY $KESu q$Dkeo(]O9UN,A%[&3AcZU wQ.zrHip?U*8)BZe]*LEZ\53pDKpz@ xړ3 O I9[߀@`$xrc ?_f,\(wQ8-րO|-htS3\79bJ2#܅MBQ(@03wjڝT릶Sa5l^3f2P fjQ:*P(ѣey#|}'`bRLz_hfbK,!_]DuL'Xw_gg^^*7Qf*1&/vAAv:z򿐌ϯM޷n=9JifrZZ_Y^idδ1oCݟnͿNq۷_N)~>q%JCd7Fƶ%!*1AH(}؅SXw`Gu4a㽥ʓnNhnfm7[hR^e\ЗE} ,%Y|b ucʳAV`+ wn pnc_aS 5}kbPh e&iE:]bvAcCz$M~oìXֈ4`$!m !Z6s%fJ=.!, NXaXZhw ]D@]]y)Oˑ"ϙ oN pBAtUP @#>6kSmC hͪ >R;jdMP0rFHT À7}&ʆ}p-^ً`+i4TqypBAX>tsNx0/!6ЮvAlWQQMQbzڶ_TN1Hiez_IrHһXq;?P/ℿLUh0MJW2Źif_udxe훾C7bDj?w)P1!Zk 2t!w X"jJդ=1F܏> ,k0mW]p  3E$Z)}ơ#t&(ln|dxV8,N=E,I2*H\m}WVlx:Lc7T[,Z/mkXTI&˺E)r{Ep=!" t[^Wޓ}YG5V"MD Q5I\l>0Y8%kTeQe?7n^ci 74kN|obw/C$$UR$A!gCİEp:US-mF*'))USW%2 +x|YLF$3dlwZiKq80 n1; DU%{/qDH<>FIHUYNE{1( <}\'Rj*5]İ"+pd"FyXsBuB^t\kf_"nazkA"/Su242tVR@* ypYƿjMR>:gŸC6V)3TL۷bpӤ@ NJë3@*!%e{LQ xmticWG?_ܺAee'T׈a`:rD<-πw)쑾~4n[ju|DCǪp*37OƟ2,y#̡\5{c/2|G/?w!8߹l?ʳ{]MӌCŇᰯLj+dg^A`d[M4!Ԕ)jd6=vRx}IJ`I) , :$t'i`R-Ff֜uxY[FA3js~rܫ0<&K AgWM&RkwwӖ5=/Bn^KQ`k&FŔr ;`)S9 vϲ3alT.K]|GV%cI9Ξ:\ÙJUy.S7\dgi>dȁLI34@7Wg6Es| )I> H"vB\ Hƛ'i2QdD(Jn;ZqC`?c屽$y!Wp&*^/h6.0oz tv[F4525:< /)R.4!TW?3CkI Nzf:m *nAGBJG =,08:2 #RD t!JHRR\Hu7<Ⱦ̫Uѩ\ڦ;gc[EK>QzVP[k #yHH%@D˾ p 76CΫdZPՅs~ΪxLPVS}>@"J}ZVnt,h9ǖh5:NSxqEVrKN{AOx:Q8!=gN1N/Qk# D^;jL̦UJ"i!bfo|Fl 6hʄ8P[myĩFa #'#bOcaOd2Oc|p䫺!#9DV|?c}ռ'Vl,+Hգ,W=\|Νq8xJMe{Vi+NB GK%ɺa_Dah[[n|)zH!# zxgDkDYLp evHL"1WAa7CipA9ZhZ_kcaۚLR.pYpȘ0wcL~[<ҏ\|7&L}?a~J%]RdqwƳ04/q]]zV8gM:<"XH4wetUV`PmsOs$R]jHHeP#B7Mh%U~JRZ@66}z`n%&*$ִ%PED?]G5Rr eo0m "/d4W!Ǝ4O϶MƊ<cV؏z2~V;O:A)6}ҌN!ɊOsHlF4Dkp'j}K]a@pb)N|mS#ZXA1M\y L={zFm$T7dT׈>LOM-ś}) +NygG`dxQ§.s5T\b%b@Yx+H!=jHz]7 }HN)8Kw7ī ʉ4&a4^)'%<VDQTudc$zإK:IR.rtI }1y|m!eNވc}c:[h\]=J.?"3ka\sȐrYZf>ѼR4qg<ȝ}G11,fMWI4cs :"Y>,wN@rﭓ\`[AoAJjYf)]V4KA$v"Q<$(}ΒQstb+QkT_f˨-re믐Qf3ħ;؅)?xb5mQmL Hqg_y 39]AO?&p `(H^NA7pQc/K x2Aa!^wJBaS"p|__%T+sStgMZ7mwncI*A-kh8af`m9IJ|\CiUÅ=y.`\M]Pxau[s ^TsfK:8s44Gqe=R2u)^^HF` ][h>sv0ެvKM\Hr~Pc(&J ,JRBmesAާ$ќ|\ \RɾRg֑WmD ۳$s&(3=Ws\Ӻ&d*qCi؜oH/2Ā -Ti$=$5MDÊZ> RP8t0#akmhMmwaykt-q5GT32H^ rrDaPf+hF)LNsyd]%~x@dvkXB/4p~Q3!P^.P\cn _ ,+ ~6[1#^R~ElŨ6(w,},۫SXVGbyk&`h=kl}Rm83:Co\SA%uC|~3']Ȩj¥ؿr 3RT^ptRI3o In@6gi|3;ЎƈS-ٲaNEhaAۙJ2(bX:YVB>z@XRQ+\%?z&sW3/UJ͘3f30Yw] g[uծӣ_bU@?D0UaNрR`zjPO{$V|3bғ!g#_-8d#k G@,7'yq?"}VL#1 ||;f̑8_Nkl}[[?}3.w*b'ǜDr_c7w]PИyzTxjG/֛a*1:2 ,L{EYE#uHCbW;x_S|/z-~xlo;Jw፰`}l</RԨol%7tJYY-؇ غ&Vrd nfjG]wyii}Ewny f162Eu΍jll!ANSyn 8-Gr{"?LllZ{)ѝd{lGXN_11[tEcޚSHY@=jIqі]6紶o$Le(LfMv,BA12PDE`#26[ӥ6yҥU)U=-V0W8Dx5HOGsl.klO+Fs_*kUnJ=SDP5j1]_]*DL^(4%U .$u•8l5l tV52njG/6)ݙd$( ӕ!B{D(7sTmÛ.!!r_G{T&SߙUDei@|BH,jiN7+g,uK?A(Ͱi[A"P4[@6RxRrZ]k5d*n3QDT A$eD?4#}q@JeU~ѩܠhQm~4wl܍b#Z]~"*C Rom`*éXVX:LOxNg#(v4kHc_1vlrbT&B*A*{[&e^8jDHؽWɕDppMmZ+ZN;;"8`ލ+~ c.FZhn f x85v&3!kX6eF6FSfTΟKkOniԆ.AGh ^Ec (:%.Yδ(c)vWY Չ4lUY\%RQl~IKoo 4 /6A5^P\X+!_^"JAϺ5ds{TN=Tju!HZ)ֺAxmj BJ&Zdt0)Jf:en!G[pHY8%{BvĦP!UϬn9nFڅu0tSCT?vФEV*X XדQ<øjgS)ϓT9 ng yB@e\yahyDCͷRweXXNS'~sIyHXU`u'~n!(q5^[NXx.obwk\8E5f:b07KNB>=E=*Cs~ԆSFZgɺ7RzdW̳S^"("10|R>Bi|䈼4-"@f[wa uҁq.?2t-zʰ(i;M)!J#Qsg?h\LJ) -M+Xzl;#ofOk6]tPx öRF.ٵ;HJVl @߆tH2K9Q%m hSV#KTH]qf nB+^΄[~zIO.Rv(죶Sfqolq=sMs&RtGʵ^ -<\SfѱWX=c?X(KKs(\Eo'Qϊ99,sE =rL5+zpFWi r(bNB _6Ldn{*ӂv& M?/LBRAZ>:CZZ gy-صtݒffjx8ѿf@'N,X@~FƯQP]gp"\xzН%<fd}5xׁe' +ٞDŘ/K^}2n!&ĭG2K{_jrONUpr&56LZļiODb.yc LO_E+ǵPPgYX0_ߠ|W9㬆?e$Uon|pw6R,G%Nd'J*uoY7o tG>=]tSo%AIՄ MQ٧ %u)e(,v"0''>2(7IV?2oDZ^N"0Y?[(,$Kɞ%;9^|/.frDy{΍S=sE49Ͳ}AGB߳Z#8 KcZxugp#Dd'nc]5\T K ]IF+U=qgJ}5XEÀs)(`L-A!XvMA[]{Br2`y)nDwYm,GbN dD,K`=$;{")>kyV x^+yJL-&^ d`t՗ -k 򺋮O Fh~# YCRcdp"Aw̠0fOgչVߺѽv$!>%y@mJ(lE#XCFmm)M@nW'P\ ~]3,.ԗ#3`I-1d yaɽ+J7yDx=}Pw&Ycq<=/k[u˪akFN#o6p/|@$? EdFQ\~:al DL;Pܭ)V=n3`ޚNzȆaRT!!z(_VkGPR `pLz(SFf?Ef(_Nrz藷>9?)=3pwџLrXEX0'%b7:0@ JŇnn/҈UB(o<%qztȧ <&>qίmJH{=CsƤ+1Ghe`BkIXD]Z v~)iqxHYU<v1<㷞GsӢkd%s~?2#Ҿ (2Bi\@ gΩ>501S.}D۹sPMgBV(^ |h= )GR_6Yr%;dn`ÁM31fdUӫ9 I Q? =b'_*Ȗdr\j< ['f)z`m>{2>VsʞË o2 p܎PY9>o3Z7gO `/I@՗`G*K0foc.$?p89{[ʽ8ٴ^|Fq@ |ы'Fs$-9vc<$;FMD\ndDx@FT|KJɛXkaUvl}XUVWi[ޜJKi֞y02Θ՛! E#GL,#sBLjJB2#2lY#_!7.޲O~D%1݆/vS]9O.L K>J4D+r`SJc/P:e\A_xl\<)ӡY BePǦ"tC#v1/e4I>Hzpr`N?w;q9Rrf).ʕޟi1,*sG0ZH۞]3B>wSf udufPp5R UJh@b߳' W7HB&g(5.c O$k8ؖ"m)w@r헺albgvҎtvWl&6b^b+j+Hm=TmGX;z ƾe۠4 MdTdNREL*)Usx>N`j&]V`tXBtj+q?V;aØ}pxIw"FN"Ae<}zzo`x K*iؠak[- pY V:]aʈe z-9d/?ŽlHIDu}~uEQ=g9KCͭJIҧoWW?k(@Y[ǑK-,#FoH@}iW)r;O|m6mKJE-HVZtG c> HO]8qJp)wY!\;Q գ4PN8]Uso_39'e5|0Cƍ(|EZ`eC/@8q2^WeY8I-g1?zQɡ6m{7Mh $*c%>x>?P@$A<;'2"V}m& M"V52vOQ q!=**x'InMફi7+Tc%LiLto4'qɰlaVCû?S6)|O ¯ex%')~< ZcTO™M c-Hp ߤz< )2a|R.yI)M $$¯\K?@yFQ(:04vAΘ?7x'K2xqxjffH<<Oiֱ1^?֍/WZAKIFSƗKhv=6_]k9FZ>vJaϞ- ،Dδ74;5C؆qԁ\9yŽ&ͭ7ҕIsK%A6NAXb nEHnfBġ?M; }VZ&\05S5 zO_JO{p9ލ!Saƻ,0{u͓FUW*ب/L|(28X9)4e;Y0|nFn> Z _o ,8$e'VDNŭp1 Ω77?k)n>>Nl'V6 GLߛB~χlƳ aGk%?gk|N\x,!NCO쁧s [t6xswi"TZcgb8 r5Cŏy|Ճ+iC" ަ=kmerA~<͋Zd]RmŰ)RIz&U OOXg8{BfO W85Of\nQqr] 0@1c~m"3pLMN4$,8c0I~+nz\!eCXZ'P>l-VLL&LiA~o:1m0$M*.+ Bp_] >NI=- 9|yR w_-%Fvy7Cvs4s:\l F<ӗSTSA.CI3sW.׏W"gh1j]"-\ iOxu@^Bqex4Y<R4d"`hcDVRͲVց pfA*xAPR݂-HTk&,`f CM(IfR䦔#3_9Z)Fװ0h`=@fy ;xqu`b"_N.( rQdtKS Z #*b:ZOH f~Q^08+쵈o{%1cZ6ui\C`Yq%m=U}!IS8R!ZroH% f+~v#\Dph[[aNn?6uDՒlz"s+_Ad;opx`׹acӁK\ k8EF+?M(zWۏ`XIՂں60}H'x m6R|oWKMő "`NM u(Dæc8[Ku6%6 2Ut|F2fIcy R/V7?:kH b #ZKTSm~GA֪΂gC P!`Y^)Ti^ыUcS՜l}>*xm3bh +c*g$R`<2ѿ;ҽMrA1Uf8>43ƯG-[Qb3(|~2AY)DF~N[-mqBf;r/te3U xȿv>%grh@5,SoK7 O.`(O)!C'BٞFqKLc98rf#tJ14QuIK|$Q ֍nrt93 sNC% K* W+ ?̕1څan@ ]r5h N ?; ~7TQyEGZg!a8fǮBԒ0LUdV#i9-@IxZ<_klr~NJː1l wc~SdqQRڼ{:ZcogJ] ΥX'ɂlttZY8u hf^ǤnLK=3_ ݆h^5M;*`Xx 6(šOw,4x2 ko_B ]yYڱ ܓ K=Ѕ\nP^%8>] D'Եs&",.ǍcuhR)UJX;1d8^IBf4&tZ`+"&]Y ~~Ƶ[QX08FoY{0i~͡5]t8r2P76hY 8kMo AHGV?,%mUB\p=F~-Šh&)Y+Own6jSsLC Xr[Vs!eo{ ½bFJ(q׳gv(5E5M2m;X\rMQׁ͠wG'vWP'HJΠ%M bbU°SmRxOmn*ciSX7pE]=u%yNTDf'W uCheḚ :biU<@,̊LT VʼMŇHj&o[vtAPf70۔STB/zoKS&Q?{|~۲q:קhScFfݏZ^+ђ>$Chu?n7K-_bzkh^% )AR m9dގYF.PttQ'CEy5~Hr*Tփc:`eeSo׻IYÝ;+jd9bEvQfh)l[cOm@sGBϿ.휼nc\_p2~sPٮozF(QJ|qU@?{.H HMم ,Zss=sMtR}:Z/`gPw?1P a 'gՒ`048$T=d`yZt`[}A]xж:y\KUq+r+>dtVdIEPns^=5vgdOeMl1IPva9񑿆PއV!.^2J:ȭpnvom)gj7Yx~\I:ي TzKCL4E(psnV <&,5 K{0XHy /Jr|LBÔ ;ڟnZ"νNycЇ qVI Q8)6^gjFHnfIr\-fFoK5r^żFPX [Wg޳?[ ^5kXdnPX9bkp9V[%1zCD$B?z4LI],._n;Xe>VROyB1_:bu"InYks=~{]2SU\:nT`C/VL?'| 7Sj Ʃ޵8Tk1FieƄ(QE0;7TVc*GivUzey?S+~zA4X*gT>>IYW(=eq?R@n5؁v`/-#>>Nefum' }1KO6 Wp!A@"^HqmޞLc1]}C, RP5HƟ}gT"xh@hfdC;+Ci*PK}i,6%ӄK;ZAKeQR.pNiwɘfBVDTDcAO5"ZW]e/'i UߣCxh+0@_H&}[>)Mj예;W{.6pB =qN'j-zHD@ S!|dN"!nbXZUgI[mpVe#sdWXU,@㲦S$>,b>,Ր=-?7lQ_d8!zWN\ ZEaew}"VdY!5L2tz{I~FʐuUn,W45p.,P3O^45[mL`7Xc<®~leL!{&8LE`{e9Edm x ϢK@ܖXMnQ2s=CerV`Mu^`FJd kod.v4kxl jO_a=CsiSK򐄗#d®!6䶹d *w>T0D(j^.e}rjD$}0Ni;=U2Mv=_ΓއPJ>!EFu?PIZu8K֩ݚ\]>_Ej֗RO$4\qRuKԝ y`qw@='c-AsSWj•XK J]H˨kmuEM3{be3SSrwSTC9kw\'A&J>khd*U*C?X^#'IcA 4!mNvk0@|QLbwxL6қm_|NɷD0 -B:PƂDHv۟a|Kc :|tuxUښTzE ./SLho4I+utDLz%_#l UBRV_Xa6H*Q=R#79f+ww IJG>tY92ȟ,1RIOO6 MѯܚGw}(]gNA(~ᕲ<`ԌjN9@!XmRY;ф[ 8 0Ps>s U0 f;+S 膊dgj̈ i6h;(7-~b _S!Bf9BN27; 37'i $GSb~ g[Ed"h g(8{UwCf@>yvkҜu'̠ bMC+UTFnE1 C`vjɟ_`rhUJ >KTx̉;|gau%Z~^O 15K?,[՜s[J[B6ɢP|H^O P"bhkm({ˤڂu:RrUR9=d2-sqI6 [(NM,'SG :I=?:[q &'ٌ'b E|r2eXUvڦ]i#2/Gh A4 #usD~zieY ,;URYƴTmUWYz[>pwBkEuӠWSt+Dzw,: FqjƖRIm-h;-R6:wyWEwG!1!buh aFzycUVwTf҃ (~TM=kk?cri!L.rC,Oďj$Z[*_cOT7ϻ2w3Jn46j%JAGO>E7tp4\F;_&b%K!YֹQ : z07Ct4.%s+EANfLE_ 8ٞ3/O6vQͶx_-ڃ7d2{Sd?wik~\h"?ʻanZTgJCsμ  q魁f)`]Szwflh6xLc%@\4utLuS cbWbO`O IRdx b:-;cգfh[vGg"~ Ȋz\"8jʭ|vL"cBr~ ,syUc */&N}iGԯRMlOf"+"g;r]MDYۘ-D`5Jϴ`o^|h4y9U/^Rq\EkᭂS B*~WA,WFbYYc4( Ҵ]-ĨC\5 c9rn9eƔgwu&{)H93cI<@_{3ڰ€bi/)m6DFUH, uCGlX~AD;9Ltg] "ZMRY.L^*ARG_ ev]]ppzhSMۚ&js螺PIkFLYBoAD9F$X#`,pe`S Q\UTL#Hn<f Ftjg:y/?֔D Q&?WQdD fe ppUMՋeA H[(?Ž8LuskPuiew_V-R9yg9YCO)(C$kS%D?o+[yzOj6~mQ{JT/ܴrDYc]u (yf4ݬQ7u 1I*Z @0(%fK}yo$AcGPPremo?xQ\bײ؊m<QdH hO%:BF<ċ_}Oͩcw *\DS髅y[[O.Nآ@eĒ82]_QpšbgO=WA=NuF\tܒܕF7Cp2YHS;>Xd᳅STR S?0[w(J!KGNn gfhP(|qkgYn-vt@R@A2y)GExjT'-<f~׳آXk_iqKbF`4 oN]n[B'Gz+и˷9GpE"4I2Y@.O6ؽYVm+r>J:W-/x'DN-&Iol$IgnV|S"J{BQ|'Ct9%l[n՞*S_e[ Th$Gc.Gr^F'7 >rriV S}l>Lx"4gZgG1Ҭ8Br,ŨGN7+1A}6|R7#Z҃uAa~D[ xgc?-Nt# r@gw4bQ$}6MOwOPAdjҔSweQ # eQk(or)?M`h87dekN~ScDbq9myG0iL %Ǵ-[J}\$Mz}6H_O@!9a\s]`%D$b+wj:/s\lYtxRj޺=zZyZWIK4̢Cͤ-Dq:7mY^,A `=.Y Iބ;T/uNjP/|\<漗} sj]IߢdJk t j }HIU[ڗ˥F:)͍(DWSvBbr>kQڋRy.X􉩡=G)Ɔ5x&[ѮȎʘ-nqJMYJOxBzrh8ʍ瘜Z /poq1K 6Ȍzba^ߡ8tFJDEdso5>tWFѤW]]}Wuďf )xw R|mZڎncV{,+}JTSNxDNJ{Q Z l])h!_U-5\e(1Xc Gb3vj< ]ܨ?^hl:Q`?RB`tnyrul gejS_xwsdlc~à Nzh5p[qz*(\8HZRPLABLMY52 f:4f %QRp ~vJIGȗKf&fLksj]4_pXTذ݉xg_ brftyw4.+*O&؁oӳwʷ@`BAW94)5Rc/NbKȠ:#EGBxæ|p/}-GpJ k+̸ p+:M2z{Y ]F6;' LHMa~ZoOfL<J0Vy8@bs襱0T&g".x~ikHFLFp:b!ll j8Ag# Z^*ln6 Ec],9qqi 3[& 5#EDXLVt:x|M\Đh@1>CilVUn߫VBas%Q0@ Blk ^3IQh!2޶6H} C2F5DK#_dd5eT1B^$>/}eVCC/Vi')0)bֆnXJݕAL4|#<:J hT{kR -`A[`fI|dȯ"_*Ă'*Zg]49,ݭqXZc@tA#KGA<阁fT{|N:qA)p|P&R#!@&Y͑* 4dEMex&n~*ЯW0@v ;uA}mPck-S6>IDINf$Hd0y,/ھ5* u+WOWi]'>,{]HaV4I6-cCk5qXtf![1;_Aidxa|Viar{E{q5ɡ>JM[v|G[Frօڍ^;ʻ+!ɜ\Yg#LgpQ1bʼjvHE!oڏ`})G?)}"EdcѳϱVP~cc*dtCWb* =|C)l]<41~9_e}m}&{L-憺~_-D{nt()eq^>rdjQZ8Uc獤rR upjB$ްf['ȹ@)p BƔR-\Fݎű1ΰ:s(: 49S98[6kI"uAJh;hfoL!jm5IoK7hAIB烋ߚ\D\ɂۀEQNSZdnOU{ca~geB"vqI"H+ZV},^j$~i)f2R>N>Wd ]ֻ$ې^OZf'{m!&j"5s̓5ct1n%BZqDjp~skhV|8EpWi6kBPWo'CvwہM&נVLDSg-KӁUR`L I(l$$Ig~FD[ʱx"Dbp&ۼX<^gkbex]{̅}q,$nNz/>UZ˝?͟sN[D!Y<1+=Xahn Vi0*5LF)yZ _k²^NwAO1y LAf;]:Cr߅h".cU>{ߑ$\?TOW2kV\ V-u4Ϭ! i4_ zH )E<ɠX A5wZhssnSO2bRC@UޖqBn:{Jzf ѳ._3K)&.ѹM@ğz~7޽l-pE0zE(!#PG9]EUGg8 WVri,d5_G+ VનFl?8} {C [&16jI'$SSa'CNaoCś1Ϩ2aEPz \Cˬ߶>GVHz+rPtlK!LRn,1; _mLg$R&Hs_zw3_cr'&0ڕXal||¹8kw~88,xw^莚>׼cxJ^!7(8Vv%2A΀ A VK]hExƫWJkholtakK[@l"jfC1;Lc1H9F}2P4Xrk/@IAIyȗFd % ANƻ{P|W+qHѫW'T\U qD;Vo;-GΚVV-$"m%ƢAq,KUX9wx-_T&x <7ok1=[+G#೸ ˂E-0uJ%F fi}Vf|h}/^0_nU3'Pp9]l[@1 Aߩ:~;Ges_XzCCri>qNWT `w(TD l`;qM?n!x4Fx* j٪¸H||Ef૘kMzOoJBU]ۖXt!~X R*AHnѩP=oNgn: )dx5E#gRo9F@ N3vRVūlׁFP L!'$CMb~i&en )#y0-Wd9XڔJ^>p~g4ĨOK>|dw̼"gVOA )Nd'=}JDl롞b#RhwLf!"q:]GfJy{Vs U5>DZ`S`0,M+|a= 'TMMհ6xx']K'M.Vkch)2 ( q4^񤻺 |6³ 1ExQuLGTS7 BY0Hw?+RIaYܘ)y(EJ1&0FdѥM"X@y6p/W}eTF!aRkn1v ;T ;mn!|#]E:gdtLD[J '^i[kָ2ɼ#QƭU|\ljrΆa g+- G8k:YAg@/}[\f,BqXsIQ1P{\2@:SjD.P)=%Hh‘uIr-N妥@X`W~$^Ai36қθb)(P.hQ0DM瀺3J i0#f `Fc=34DOY*%. S ?ح|>x:݈t6v8'MEpN ]Z2jD!cga : Z[Kp٥w6{9H9.yF~ Gxmǟ bq# <LW%.Y>e:|lP b_e0n NX90 0#`$:v,?^4Ev1_QՎvPJwpuS!at8 e@.Y[kԿ\LC!̨,.<N>50,/t $ \eF"Q ^|#}Hԓ mzߋtq?"q+f!5[,qUIZɸOY׮Mj2M)qwͪTeq~1F®Gyz.j1F]H~=0sZqclJPp%"XuL1qNtK$;yC'?5ER't}TIQ~a]%1X-tVV'q$ќ;RtPhl]Yڳ8Q$lv&re *Rqc"Xh0mòCfx>XR \5Cͱ8:+|Ht_|Tj$#N?'A;霣ZQwiBU̇证j|BFؒ*BSstU-WբŦ6җɎ7uRhR80Tۢ w;<{r!gIj#tcɥv6gJZ~g#u@٢EapEQ;OW݀CpAxlP 9"W7f cymEA!]ҐQds*,?VͻȖQYtI[@{}zw< U`Ն=iY$9oNJ=lYU ak̽MVomQGhZbLǯ?F:f"@9+%lz ܭJk`H lPHLBSYGxZG$쫥W `R}Vݡ0Sl6xd펧`mU*es7ȷTQn   K׽;rQUHHtPEQWJQ]MS&kZ&~=(_d^mT&e?uP6OKxWnF'y'57GIdWD#^-~ Wj)b[>mwlL5 ^~nC,snw;rFdËy毕2Zx*GtXl8?zBsRINu6sYayحSN\:yܡo3}- KdL0jpy)Eb0_89]a_1"l>t.6[Wz"=;6 C,ŷ}lkbN2zI2m5DNBhI[ے#J_B?DGR]ry7:V=wgYOUsKYuw焈T/آjKh(o-X)njSPǥB^D9 < E5է2R O8OSu",Ǚ` @MQ`%̢#hu۽`\~H3S\%sAӰR#xsZlGh6wg3%0][Q,VKFqGYUA4eSI"kݗMWkR 0BSä~п!ԏ3Te^9sO!Yӳ3'M/Kjܣs@F1z3Pc0Ƞ1qNƵĦ ߽X $|2}d@#$Q ;HuZ:fov7XM~e}n nlIZ?KVTE'`~ɨ@ܰW-ki1;y+M/"lV ~I|.Vj)&2Ku R,:xl;J|E\>^iU!*gԒ CG\Vs[nAcv\1bTzhnr5+lID`I HfZ"q, ~`"7#}\mi$c⍷̂#鉝8Ң{kws4avv121vbcåJmojBHA]zTGf/#;<4OHKLSZY_[@mIKb^pۘO*C)ؿYsl'#ܐF#3ίboϺEGY:,5X^x[; )WC/,WBnEKY'Vyv3}[vD|^^_f_n %˲v#VԜ 5?'/j~_ɬkѹ"b]0KCE(Bq)7+R@uB4?šT'KeWwfySsAee,&iNv{1 0̝`I2OH_;6A"GT3>(=?Eb"7C&RdX)BMrd ! K[ԯfY86pǾgW2 X-@wMçLy=⬔3^9PW`ȐQ`]_7yGdlX yC!針I47"NXu%1Y}D+/tb$.BC0)XNݐ<dUʻ.{90! tae~aZ5jG|9M<ѹ]iz,n$4&lC"4LwIJcc/*eiTK+oQs_<}< d5JZi2v%we 2EΥGOwaVB"鸞JXARG$gd]ܮ.n.MK_ JxԧFYͽtJ-$kn/y|ސn@G*"L J; -|;5AJ Y;"+aGP~R9[J[ќRUoEoD{̺QVÎyxbSE ZWItrD׭VK{apmcߦ*6L$RlO^l/}`dkKZk-" ߶C#H{Gɽ.^R1ƿ+ėȾT\,;-w9vgUz,j[P@::@E|JC"Z-`u, \BrdHVԪp*GԸw5O $R}Z4,bD/ 5o gwB gyܸ[]v(0fj t(@b.爲lr؈62qQ9b" +(Ι+vD]~AeyEj.*B@6Gҥ/:<@~L ݢY&/Z)?l|m=hON /{U3"G!Ȍ Bb%by%ǚ+vY)TYӚ{W s@b8*2 25B@MN_}<-{ƴ>&|[S`؉"xL'(a~1ν0[ld2x'ႏ8];;ޠVXrxDi?qKrUocJԉIl>W^M^ΝQ+ <`Q]IkU\[ dz6u%< SڭKcD{(~II׹D/KP"`Ք2ۢ\>Mm޷!?&k+8/ :AP_Ks&05"FĈ{;rG|3)ťWXjGZ /Y\ʀ3g7B'Zf쮲E+I7rjpY~~0yԉX&Sb'BFb{f;mos"㐚y |2 JV0bW3.lIvg^O mr1@'5eq_3pӘci)}qBM7@6 y|#—%ǡV)e"Ae?10nNbh8JSUs>4+bRn>=ɁazB *ԗj6JXɝL+XE\D셉B~ނ$]ԩwDn) x{Q Xі!w$JRjHE4JߍVetp .=Tf\}VW1}PLGͧZٓ&Alq>ΓZo\LH3JXg\0ICv8w:`\s 3Fdжo8:ޕmYjvc߶MAZ~kBcD'}3JKK?)NFi|uޅ޶ُtbLJWZm[tb6SV'qs04{To2X$"ۈ$v&.GbH~`L* dnmgraNz/9&` =_HA"%Yyj:9Qz/x߸({~ϵW;̡ăRϬKgaC#cmJ?Jε['S]ݠ{B2Ψ^u@X s͘Upr ٿv€)[IDP+ٮKpj .6ρ Yo[$v^C"t ċ/pr=ש ע8SigZ罇GkL詍} Zĺr41a)ȋY_`bq~H(6qui)r}r4o;ֽOagYIqt`4E1ӓKWȢOcZ0Z rQxrW=xmz˞bp|p&!Omt| c,?cIݛm]&aL&uQD$\λݥABjE8JayoeUH-*URV[W/ Gj-7:ys6;3=wYԖ=OfgBQgםPBD  ?oeSefzg+MER60OʫC;ۏa>h_XP+Suq^K K%b?'A/$$¨ 56̝c8qQ ߺT%^M͗iÑ@EZ|FRe~3Tі驮\Y6GC4v4ְD@/B1* !d~NdߊhO;ȉ}tXu~>X@'bՖjcI:lHnDe o;,X#E|nCM4 ,MpҠf%Śt֝6Mv w nvѲLa밹ДHk'p 1_Q愄[yt_0]Ea $߳ #2K8Q<%C˞'֠/,ԇ^V%eySa'~1 Iw;4*8i_vjq!jQz [g2Tӓ$*g⬣Fw*+FP2 w@??ǸLXg%8o>ϔ&1!_n-js)0]j9I\'Dy?|A1ts^:VW 0Ԝ cR19>khi/{}:H ʬ*]CYCƅ {`]VxI#cW k5T/z7'ښt*[|BiLLĂ8`s:fkЭMQ-A<i__uF80+gɿuD8+gGS-z)v=Dz8avt͆`piY!.\LL՘@!x?lp!9_ ?7Q^_)YoO̩wdf'3{9פCQq JֽM@qszȨ rFʧ$P}]KmH`͘P\INؼ-gtOD-8t|YLsoylڿS;bsYwَoEW.7ѯ(:H10dfcՏrW"I۲|I=<@c3>PlUC;N[䀦Ec}}_8'DIkJ!ki#!g|vnUFܘ\ld)|>WXJH]JIjѫ;**\ޙq\w.MzmBlWK5PuV)q/4zB SwGm0Bl0s;#gqLr>W>iC~ph*jo`_o;@=_u- CDnԝ 87K QqRQ8SՉI/#+u^/\e?Ne'e3ŨJ웶[RH5{~P0{s!R}+y`sM0O!%ީ?SЩ\o}`иA`bjxV?ԏ|DTʜx"ERxȻ{ M4bxFab5k3K]UMCz]P⵶zX~:~{DF`rFu[c$Kr.?_&]WaxOIK@n|ײz6p]Ke#9{mJ\iE0_DLbf^>lGSr tapyqgvUzav t\Ow/^jHm)WyIoW_*Z7sl_RHD(LK.m$p]{3` *0W|d WCUF3uZ+Pu,k,`W7<9hquR;cc=8 9mk"SFSw$^&åDt+]ܨXԸ(U+bY/3d}Uu4 e+iT;\Rk @o 8Ef-w%nyCMbQYJyծ3tXS`;m'U[a;oW\@nh\D䤻3oE¶+A36<׀Z7֛r$tvzaFQ@;B1DK !1E~B-IYfʒ~zQi~8gIORa^N4c/r1Ol=b{R gG5[b;}2i~cY;KaAx a_}^|epH+B2\B2p#:N'^~{i Zm>bd._}zxe[t>H(|bl¾g=;~uL$ZHFNZ2{Bs̐>J4ZYR*4NR]KМq&V?-ؕbJPSژ3HiGp0,8N{ؗhAH]yuҹ9ƆQ{ ]R4)AgGQ釁we6t(C]A"`YgabH*hY1*.)Ow'.2]Oro^=w|yb!U'q~cb᳋aXG-nq iEf|lP=ɍ7N2 fM)2$5|G.;ġ~(޿C/a~mByp5JA2ט T>{y0P Q2(Lvla袟چt&lKK>2'G*Gh^+0^ߞ1yٴx‹nB6*gvիoK##A_&qYbڽ2 %JVJkIM/],PR\},%Z`{W%O9(!~&'s;xwPy8a,r͸VwCgVxhHJdGWF+z',G牪l6Zr[=XewYa,<$qgjyܔz/tWqWxV܊:;儥Fŗ:PY;Q-CN-ljIRN#dXA}H/ӡV|GX 1gW-",}nN_]vg{$e[q,W)Vǣ;Ec6"X8SAm>#A-Hlӹ {QVn lqu⸊ZGH=k}O @"g.,-!0oCiעyˣp`40:wxm*KTdCKH45a&&xA5^iJ8/^@.8Xu'%FA\{05o>kf:F.&Ӷqn}RRǙ< F׹ׇ$,1fbeґwxTLŸ&?"#P@z6$XFvUi߲0I 7N+dPD-.ӪaDI|ਬςែ6}dΈ?z}["ӗc 6G㞄}3]\Uu}gl-qy>2^a NҁN4\Ǹξu:z"!G"bA_4fb&Pf%D.+)٪z[M[Kzj}8ǪLE`rv^Y=U]xy_ xlFvn$6k\4rjwgËˣANɫ K#MG[NBJqAn #?̝vkrX!y]Qa ?,kO?EdE"inWt!| ߑG<^ 0du #IqI Wv"6<Ґlpr. Y= jtC?/K$A8?fG_KL<̾ nQ@Y7^GyY.%'Dzo OM#lwtE{0_;``,ǘSlyUvޫ)WZ7TpJx|h*֖XUlxA}B4Ɨ.K[NFZE^WD֑^ݣӶ=2ɓX1@5UK6Ԍ$%x"[nMXejXV7kOuJ@u3e6*RׄBkZ.,sE`FRG]'S>[đ4& fSYVL'ttg r5A9p?g6WA6~@Hg#F@MD my|4Q YVר,Q`nIDŽhaݹˁa1+ wez.#cyT>>=~ ]^q5)gMgS⮝EOO Pmms^߀9ZFccq#ZIЊb0GZBa{g&f%͝-7=쬰NiMc-n@NrPmb'ώz`8pvg@1䂲ax0u#VŠ9g5U"߈ΑK|rZS'H?:D+BvS^1h1'ɧ4 O! $ܵSh vq~Gp16穱c4ak_ISfI&#X!'a|vFwH\mFpkn?Q0%R1z[sxW,hVGs>W^[) /HB7-v_s/z^+ZLiHǤQSWQ8*T;vyp_vc3cZc; ZhFCڷTu| 1NCpX]6:1 >;!-"T nҔkkIbĞG4\UD&J:5Fzv~HAWaUm8Ⴚ9ط۝蟝s`mfnkDCȖ$B h \%C2@+SSO$˂j٨S\U?#`(G'((}#ң `h'b<[eٴ.6CckU|A`{'8_wbEjQ!]mo/7UQDtf.-ۭv}dBM ߄ɯ ]I9n'ۂ^nеatN[M;X=$#6$D#z1Q'UYP\eVw迦77;ցWޓ VLJ}ުoܤ+oPKbe8k_^2`v:ۋdqG޺> h pFwI{,~=7Ȕ^iަ54G!gTJ[Z EECHYJ/]q0&Pyj40!}B#zt'f>7 mL o\rBl.HƅnIS a25Z84ʛ(0p~A܉(qP`^NTcS\U)VG+%"b}h3bjJ{'Xv.Mkw#@]QCpio$ =*U$|z)F:#ҝ%bmELLKJj뭐o^4׈F@V__ɞDftKbvA` Vm7zl= )Oٝ(\J6"0CR _IO$3s-@+)Xj̻Bm!yV m<7JDN.zBUYil \bqz&oUikCu:kNS{GlqGe !M*rT/yHkMXMY@~#o){CmY`^9!ocYox-[%tO6 j3POx8m\WEK.Q@&$%Fv /l;l^v^zr&܄u&˿W+0[;:aH3Hu { b>tM%gd m^ MI̙o ˯ :׍ܡM=Mvh[?ˋ[E MS ?I* k`r(0_w^WUy%Ntm "|6Q?G266W>/be9 +~D&Y> ;%DFK㓊"r*p@R}D_,5n5ՇFH&"50mwwC60)Wڞ=[8}HUkTC=tmIS0B@KyyCNMUzm]uDd OSWԡhYTG `u\bU!=N#hmIHՂoq) s;j5&MK|sm~MFZ?;2%Bod[[] ޠ6wXɟJzS}Eֲr:ITSGXjvhPwN%ŏǰDQwpa0B-S֐k4Q|g̍c@eNy< uFA{[Ab@q| _'̥2\p' ,, ^h=ȦM :7q'?O?3:Mq 7wKLzIașv̈́#MU^%_DyZ"jsVu xU#,Fd;PߪL[$ Dc j,kmWY hR`1n 2 ҍQ{eҭotgp9JGTM۔ͣňIa@ ')̶W z?UyPD$p3mXW^9e+d;V-M R.mȢS"?}wD}U/0`5=D%ZuMtuNUS^k:<8{ L,0XqaRarZF+r03pb] 1IS80t(ձ{6E {kcP}[grJڲD BW; Yû\r!>Q͇J*Tu f!Y yGc%[3)5+\g)\"`XY116wu/3t\kyoYUV5, *18꘩Pc EjW',i>%d:;N@WZEmW0W7!LX}zIJ/bmYKz~6vˆaU-ǎ]=*D/^M[@T:j]*uhgx4U`Þ%rPE8Vh7/jq:7SG+Uaћaقn]?BdƘq[:D#ʴ5Sxq > 2wHshƿ&6D[Y[p߽Oɯ*RM=mAoC2z02ݪW[f@NBQϦ~@U­bbh+e9Ak2پ/U_{{{t~RMTWKҿG=,Q ZO` "*-]ǯMzbxLp1c yit85x`0{`"l.{KOHCA1hnST9H`I:!̂۝|68 0N Gy/5"c{ްlK{΍>* 0F&S[;K]^B1$K5(W'Q]Z4)W?vPވN!V2lXO.S~zҸ`4/'W7(|a\B5a D [# E2ys阐(|9;ws̋}tk_(,H$(mr ̐jF_7037ZsȬOӉLto*67EpT5G1a#opAoB{F}gM8:ˋLg'A3 XSC\Aj.=H,Apu͗[a n٠hBX5|7ͳ( 8.i>==DSWۘ( y'L VT{Ym? /37X>rqk-0ưkag"&gFC7CY=eFIy|/gNid@T$!pT̅5T";[{C&~,NYis?fe=AEλ=q7ATyWێq_@jyME R^ 銩DfwsKMvg$T~6;JO \abɪm"ʆG]Zg t؈=1| ډ%|ؙt`V*HufmeS(F7Mi'HՉ?hnHC1[f`Jada`HN]=qUZ@| <_Z ]KQa#->D|*GpPNlw P4@Q:lMU X$$@b4dHj`#3o7Veh1xmA ߘczBED~=@<`YMS;c[VձW5_ ܞK/0!( <՗l&[`熢zIC/>xYeC%br8(KYDGVY>%TkoU#+X0롎F jKE\e#'< A72%UGBG ٳqe3?l1KhD:kŽn_jROϠg?O ]B֖6JDg%hq`o'`Ǿz)E^;BSK@.x`K1yns6׵R1}P2As 38=&#6Mcd}'b~YU"ehkCE |\ݯDk~ *6#u0U"-+mJ O4اC,XS[j5tleYbkAΑ7.hc2v7 Ǿt{ ی!߇*<-(MYR#0xd~i^PE My6s`&lcm49seBJrԞR6sK)DGcdݎFòݕq4U"|l'}++tUd4%k; 1.;w 3_#BJ׌UOZ2v6SK]a p+~-x# R(Dh]OV5]&oˋcsV_L j[A4㐬t!Ԋnۏa, KEQWmk*m\mJdIyt(sfc- VHu눳]]pX5R"Ì}5#)5p%ZV|FWasUO0OXݦ9lB̮!9*cAѝ$6\~zthLoE⾍DsXRA|Hj_ 6).n&]QpN4lEvGY {1%&8a&z ckMJ%2hl~/ƐWXi݈<\_.lO?/[tVtoӱd=1R9pR@izIUJߚH: vKH޽G #gaٛ8ZI^UlY49dBFa`qN9$H{UDa@4I9l+>=F!9H-kq9QAMf2CHGLXiG@Mb w}HE'?Sٳnl`sdp}fjNK[`ntgК3Eʇ8}*q'8AVF54#@Bf;N&l*2蓾V3sQB/WC4מ~8.AglP fxTF'yQfd7@ i!j0pR*D>"hjA`)<6wό#t t+á~RUp!ҝxqQb4gSjy_"ƓTO+} 2`Vsr@gt3)Xj89*L#v(o+xPQF3.Ac4 f(6Բde y"Gh'ȗxǾĻ}?ů5c;a^K<-_ZNOيy^6 Ms]Vb~wߨ+v9Nд^Lz/ƹ~ʪIz飚R1[qЯL7h^}ۚBL=uBMś`E6:]SadR: U xkd@>T*L\Kl1J: o!El5~X`s9sh]8ܶ{xEi\V.z%8&:uIRmvu"ݙ"]l#|WDIƛtܦTfS~s_xT@ktGݫg[‘ ?]PwV*jQV!+#{r;\¦': R vzSBD0GIrq]ɌlYҼ r.k3pY'Xiδ/pXo윹ˎz|F@oQ|FńB?I,E$A|BA|e9_[?$7WWQN!#^t>Cr72v-mL=aIպuǧb ;jd; ]/WQl1h=[p]wXNG5zem>[GLr4T'm`R/zRAapA\HVG ԉ|S]FReZz,Y7J[Ko;KAe1Xfw\rb‹ QY=n K_^M}YW7oD({oKz@ /-yxK= V2&ctZZ^]J#)O{xV9ǝLkI)[z_pydM/IC\vS3 $ݽ VC{T(і[.a-NUZZ"iwC*p|=*PUIQLxAߕ E57\U4jpPf6 "RVHBEsopkXN"(f]P E&?Pڕ 7+@[tdE0l}4%Q{Ng6Pr n%0"eCdlh6 Jpn"Zt}a6kA>iT} ~{&8.Um*+TN 52ⱎ] FRGj u|8a h¾Z^ \ٟWK"Fndz9zYtF o T  :s9ɷ|n(j٦[/Fq<0~6d< E-XYBPY̻6MK D}˕gQ[R$4npjDt +%\>{r6SgDD樜 :7-3Ѹot@@֏esC THKP>N8ǔ LiZƐ,C=e̦Nb4 4!~@(w.-<@hw^/uz-OP2z]t\8K1QBf,Ŕ6b{9#b~457w /$Sl ne1oY`捎DUz' 5S=KfpjU\ү*"׿8]aa=9T&5?Fj^uk21GJt w HoWuE6k\ѐ(О mi+n;+doXڂZB@noDDI 6=a.Ć#_&Ia U#\HK w:utl7Dy`N1ke9 p84DIqcgnLBВ.AM&rJ_;S7z0x8x*{ORaa6&h|2X7颊4[ ul+YR]O!@N.K2eQڗiv/'9cР!izf>vyѽT{q|UM cOgRO뢶-M'E ;'}K.Yh}a ( p\^M pBD8'yvg61ņxƹb[p|) +8*L3TH_SD}vh8(q[34_@7hkɄFg:YokCLw A"abkπO 0;aJ:LQkGF5'g#X \I嚐璺wD #@,#n%{7t`Л% JIyHqd ±C.3=_sJzX5Z=D7Wv3ވ  7]k7YBB~qx)$ܛ&g"*wiˬ)"FP-3t4 .BKSDXّAS4 {hBnf(螉4a%GLaIEE6@9:BnSnp1Nn VCxnLWɒIJ^=hIWcホ7i~%hRgWwzto؆U7Bd.fA-XQ*gR}kF%P@@x.mW{.ufA9g.L2h[7]!$G _] ਢ@!g>RB2)dж4 SPfED^Ӿz!t(~q'd6v$Ձ6.@Y*ݍ]ձ~I8%Q$"JXz{%NZ\d$oejZ$h3)ٵpbq}ʾXq(a tO) {'n>wWfl=n+L0kU-Lg\h`L4< ohA}6"`+R8_`sx_A Tˊ‘*xV#t[sj;1Q'>}1K',Q2EdJX=%˰:\oQi]qw>TVd;\ȱ3W= Yu0jOUeMdO7ƅXIE#qV&Pb[8'![:lENfOoHI0ϔ{rqrSc🱳E-}BMG3 Goq<&Ii@EjBa M` YNJboXC'S: @@L`xo8E1v{AJvxB$s(/Wx0kuX{Pt菶G_sц6K [C~.Z$>ѫ3/7P#(1T^8$(#zV@ E۫2U)c>i;ct68 <Hlݲni˨?sA |DNj[Z ,ȔVCJx8R ەԕӸӽ2V 7yGԽw]fݤz3~hb<*rT<@!meMW{Kח3N5/yiKPWQ~ a-Yͽ~aRWIC^dfhAFL3e@m0:ù'u}7cs ?Hc^K8LiNڹ|OZu G bP<+㰶z6i#z2„l! ӀO7.,DB!o*L妝!iZ(a#17Ւ^]c_:o8qrI9F7hօ64w˄c*C'.Σ+v2&JvLKh6/ԁ8dZ y]};^(/IbF=\ tOeռzY<n0LdN_g I> ?W/uE$g v޴{}ԧ OR6@ T[Z|9-ѯ聣Q()IqJa1[x<(cbG[EXeWrM"C9q˷ zoYԱT~S'0pIı>~޲wݬ$3-O|(1r5^]*:br=uCQtC|gn V_Ɵ{gޯ9#'/k.#7r>SYb^ %5Ă3^AuuּsWR q \ۈ)Ij8 PmBA)`_K3)t,\|Fפk!.O_%87֥47s{ig]㴐C}q㻐b 8ǓHqZ4tMt#ƏpiZ qASa%z@2KCpC6 PS|W4Lh.SP`RFS}SC$h $[-D_Bg6eTWg:](Ten8 8Go~6*mDZT$lZ'4oCk;aDp)?G01K@wފ!CU /YY|}]9&Յx8Mk&XX!5Xm*S ~4xC0.aŮ)B.a *?t(VSfSǼyvyT%r+h3V$SXyTKCAoI~A{4l-( W)9bKkQZ A sКm td6XǖSUfiMZ6鏄^ /y<颦gְapx[}z~{e%@O zV2n/ UN>7F/ScO0;t{KdLbW8u(|f's(-~ʃ0D(tCIN^@1 sZd핲4*Rau= 1Ώe=@h;p6fyyIz[R>&(!+B1q>LrgaXY֤`rifv=M)N_foH xea)Lj!wlӟ܁:MjiaE$Z G{NS"CC-V[׿ X3"hr/ i2nL`rk|E\skg݌!WE`ZdFC.VбX*VXxff9,D^87B \w5Yl . $:bif3C :(>2-Ӣ $?T26>I;myƇ  !fim@ 4k'4VIt,!BWr}8Iyk1uwRΜT,HҗBW4}db0vTgT"4 nm㞉2}[i-^S֔@*OjH, ?C~]Uĸ5 P"uJZC7ԝ2Fnk&CdjҙF1Tʄd JEXJƲӚ"~#;"tEN]׮ovĠNGc,!+!n4Z b|70ܑ8)3L<02k-{"3*[} : p eQLX1\H }mdҿ;`0/p&q>Z O\/_#>8ǯJx~mh2pxfi1}5&q.KT^?ý]RCgSiq]+u O4@&A쌨ByuMJAvif@yXXIBkIz/.v?c)Qn"ے#[:Ss%> +"w7rfo|sS}}h7҆ƌ8[u"G3@ۼ鵐hܜBņ9RjY@n,d'&DvH[^g*p(ʄZ J y9`C:"FenBQwq/ Nh؇8*,W{ Ɣ {˃8b)QF 8?5gmk?'ܸLMb_Rc}!rWVG`DƘ\1;:&UhOm?,d!yU~t+I٠ǘ 0SBH7Hj[/ڎ(>·|%qrK fiB?B1;\o ]50xS4_o6B2I3_ːOBodxȾ4=Vh>bilzLQ?K=W@5AVaCLJ`_v _Q(i f%aOH7erY'A@_TPG:3cҚE]S'$9)[lZR~ KOvg1->EV3j1: ]vހcB~m'+_ h`u1Sa|mANiXRfb;v%Ral\̭Mc"E?";JfEy?+aiuL+&$ϪJa*+WiL>ُvy•wVjJ\B 8AAK22grO;!mLRݫa(^HF>'fq'7ߦ&zv?j !`eΡXµKDFX/"JONAAJ(|3^"Wno;u\##S]'}"2*\LIKRs[ڥEsX?9J4oeHP?.Lr< JH`k |pZR.%0ŏq:ߎ Z882 Lq<>KyGUrA8csF0  ReWNCQr<א"s`X9'(Z EMD!FBˑ|[+ަ-1r "1NVa! >*uto=[2PB9Jαjk4f I%lQyߑ]rcN6!/bmCB:!h+K/\`WWλz?[HT҈@)Bs-3{YrZidYiǜIHy"G}@|=MhK{pdjcgU~N7Ѣ[`+BF .}/HbE<(0bK2߀96ӕ)];ںV q2zs3O0aE];:e4fşLP_|\V 5QO`~HN{_dehP%cyapw?X:h [krޜ(=JN.GIqu}6jn&sw%]h۲>~^B2%EGJB6t-?/;iZ17ln)R-I8ڏ {҉,D6ʳsD"a[s:G7!&==fk9rRb1pB՗r2ud+B cG%z*5>~X=K_YSDw>f e! ԛh\(UnŹοZKwB!$s1aj̈́+4Wv9*橽|BRf!-~SǮ5`-(\:iSgsjOyl~(yCxY82HqDg@#Oe=Ig7c?`*@P*hƾOLlA se~>drjcni7IWK~ޟM">0#•`}OBOPև)2`/2{3Ÿܡvercs~j{VwSJ~O{%or {"]?pJZpt_/fMJ؈k@{O ]p7;+r`Q2բ+bZcOtP xr?Ņn麤S]RCƑ'YK,_O6gʣ %#7vq{^6#3AV dQ<#mkPMv[U޲Bdt=1uor[IGb)/S}ь= Sd OrE\c~;p{hg="&IVsM>6.PiX`[x@HCz31 |eagQLDDpTυ@IGy `>ojeF 7*CbɘWx߆LD9 0k +WtQ`ub~##W_wE-vvm٬\]oLu^[ꊽxQ D9KXWijd4sY3fKBgP)qC ?ޠ-bn  d3\E݈VlOzIl0Bw }ZXm-:q < ^'N0&/IPZud=B1#+aർz[ q뒽q_*پ,v,z,yf (u{#'[ޚG{%RLnK x(rR0Jg_IV2gz!'o_kwAwUR.iv8V%={{hJ;&\'b#kDo 3Z/CL%+] 3z츆Ͽ1HSutng Uf3t-|#H{'7J踈qgV8JidžH0'eɳxb.s5OQc B3BxZZpyuвЀKC,%Rqp; yؒaTw /{BSpggg&EȬ)L۲ og @@pVWwW4˻ }< 9P -UmggwG¾%N\9KNve6J'wy@AUrn/kb^"yTD~[BM`ixjyHem_'WO]cd?ʕSBKO۶lV44jsIGABQ)Wj gJl{93PDQR+nЙ\@+|Ube&>iυpD3) PKoku; Y$ǡ}曀*X#R2%c)O6Fp8 p 5n08f>sfcSX(nj$h‰<)F^Y@|24y?.ۗj hM?ߗNK߰} &X EaA}z}ڇ])(\VF=/F2y踦Pus.9b9VKQ,K7#gP'egY"PȺ,f^q>AxD^Гdz!?`vN(ˊUkb\?4.&G6Jd"}*{՞gOA4o*\}%+oݨZY Q 9t5s:\e80KxI"$hAyHFݾ#F1Q+-ÑZ#l?fc}|չb%v 3v=q#no'Q`~j^m%]IniFiZ{,WJKqed~A./5M9XxX1~}fs{z{`2Ȭnn^҂@%3;~Q+eEKvp!\@jegv>4eVݓi?h?}m?sNkj'W2#*-70Cӧq?X?y+g"u8E"}2^TfQ͝Ee.;Xj?@Fvi@S¡KG}9%0TYq'kAgH3י܇%"#w3N1dR,L)*.k,Uf*0X$ZڒV_]E#5`^@5u,q%6{- !߈oz#06Wt% oׁFm<=tUL+~ϼbAQXS"X߈$Gq,X e.k`'ql^vd9O½wȬ$yBIZ2>ރsqVJVKp gA@Z|d?㦝l ^w 5 >COŻi:v+ࡨak6&]ؑa*[udIm6X::#uypN6V~ ]\D|w ,Yӗ18r^סݐ us>.e;/mZc&&)H'%Y9leg ;ֵ# 1xeDLckK=;R pxQLpm6)5\ >]#O=7eF/xFHsB3(o4_ >;XY`d73gzA۷P&Nlnxj>AK `k LHr0c¹^DkP^\8BR }f29V[f53Ƨ&VjQ?b#kC!O~ۨC70g=]v4CGO/TN Eu|T?[U`"!N6R=ig|FYuy,2sH0f ;Aҗ7C83~ m"ݚ-?u| Rub"~[}ES@=MDyf}.ng4=20J˙1t@܊zCJL-?|<>=QP'-Y-⡟<9O ŋ+nN]$d0x/ TZGGj#GNn b-}(Գx,Il"VŬ+1F=51qVz1u*m j5gL WӼfvWL},_L6)f,#GDT-? ܵwCaw<_4uaЊT|g MʜJ nk2wA"fz'Ozmj[@\ YC]I?YҪXx刣DPsPot(c%xʟ7֍5jO运EHrw_~/ի[K|5u !M#^7Wܺ-Vmrmi)D&5hB¶ɔ>VdGBK gW3կ[B3s!"s$kY;Z A-ʛRyÇ-{jƬCpBe'I^W"RW4yL9K*F~qU[#4Ⱦm&p;SG޴W^8*2,#{. Up(~J(m;ZX U45F9.U)P4ND p1{P,k—b2z3dU ;(d!}@1JkqVE9 Pw/H_.BbVHQ)$8Fb3jl1U{SWlJ%I3-ƗS&>+yђth]؆ZHXA "!%PӒNY(qpݮQMKjn$7oaiW `frI@!-jŊ˹m^ߙ8MB:- C0\b6TrxDŚ+yqCpiOa9I<:j'鎖v6BYMT̃cx^H) Ʉp2:!DpS`ir||!x͙r{&ݤ$*&mܡ'M \>@Om:/~S±_a d Q sIA {]kb3y2lLAmɥEmjCL~R?G ߱Qb@;EI%s_Xq^&Y(Vx溫 ӹJ'WZ.~Pvx7Q TkJ#x!NRJJ}`Q֓_ *,qc_i\x:&fޠMGxM^׶9 tbWE[2*Ьk]qFRaH:ݭ_rH؝҅5*N[DyZUYINEGc´!r*ק[q0շIZpo7PH~UYڽHF%|%ܰLˉ$7U*IoMQm X.=/>l47$2[QՅtˠ聳n0+OÀV @R)~gU110E<2# K,8Wse}=|V!d/l1]tsQ-XqLl c(r/$cg- CN=.^A2O;-b< TuT_h.,I[#K2i; @F6VV{׬VApȊyYe+ZS XllzR1z+%+xKo~~0n9g?lt[q+/Ko1Prʤo@NQ2t%N`ǚ=ft6񛴋PѮZ99yA=M|AZ¡dZd.P1 _Dwo3J}؏#P&[X䊪E-G)6J`nN3ld&Yarn-<#\RbM*}ppZzy 7,sv,zytpzNFxӻIO+MZ;z>ѩ$:GOb\n'Y޵v0N[ʿRFԭxlY'IqUc,_aoWIo7F^\/[|7q֥\E#ŁU#5!4\ LϬLSWt7"Gk)_d؟1p(mgbu 4@jλ/j9DAXSCYnjF;4EpA`GUQ.(jwÔA"rJV v`Rj3Y*55ÓgI|3{8B0dJ8;l{g˼('Ąa(@JYxM tlOqb%%;z2P/B/I֠~ѿGc?socJd{۱ :^\Ư|4M%>\o?Dδ,)崙& M"#`M43KN&x)R`ꫢa}JJ0Ve)gk41yre[ưx2n.5t%z шKO?pTN5URXX^5L<(+4&_۾0%YvnIAj5R z`xI~w5Iɛ"eD¦طVb%12Bv\6<s^u%&:bn?ӓsWmNHB[)WW@ddG6dE~Qfc(xNua$wކM R((v@|2!0fT_zw[KtH,'JZ=Uy˿{L2^8_\0qWGy_YJ!F75)\+(tf4.kM:qFN؏ln;g'H9BF!ҒMaγ8aI ,[16җ N`IFDzLnq,=")zEqiTdVVBe䢤$pQì&i} l9Rξ>?L*U -%~WroЭGgA%:B(vDz%܌@]hs3yȃTyx,PU)uP+ Xd鲥Wږ\9ekq3d` n齣]-|u?~x>iVs9Ḻ|mi̇ON{E^ЇgQɃib¶7"yЊL{+-?uu688'ǖoi-{o#هbsIRDx7i[YJ0DGK\_C6UٯY^4y7QgԞ+TH*]JЛap0+kDCAf:z.b=F=9v˔וY?X7AWaO\TyM;l25/h)Rm1?L%#}=3]cYD%~6N_TnlqR< 4Y0xUb "IȄigTA+p<,ko}&u2!2h t  B07 pVo Eˡ7_SY$S.k "O>7ɩhèwFkD#K VfvcjAe|U1$ѨInT2Q߰~궞=mgeH\ɡi5f^da7HZ3R<@CBD.1{{\X87"m`e~jS OԹYZ0tίE+H 8 cIh[}I>=Z[Hx*&F~EE쒮|.!YNFJxY9 `B+QoKMyi;w]֯hэ9Rv%K^obyaCk˛E5 z{yg >zDy_0D, 'LͣzΘ GW~*7b}bwp0_@L-% :I܆;ە v(Oa|/z Vy;c9wƥ?nX?xU^R *'rQ?PnBEb9֪ %Nb%OILV:̶/~U Pnb]b] 8l?r:w5oiz4]C{e Ղŋ.,ZJ(ًTp~MRr?8"2YϮi&HopD'7N2gCSΩ5A B)L~AŠR\_[-6obR sm|4g}AYa sm]O}EOh@(@ؿ:OoSzȴa\HcWߘ.PrQo vK !:sp-5zdX˛T^"?ۤyHaԺ~}yqW/Y__zu g1jwT1J/zgNM-{/7RI=/p=`XlbMY%0 {ZfsM{d;#$Hў> x> ,0^.R L>J^蚅FN" N(74`u&d轢'*(aE{6th%xsiJ>a'͚p}o HACK]>]$GypfB\KNʚ“]EtS3Tb4}xTuq0 i-X, u@3p UI\yoB9nM)@LN[{ #4W I5r(EtP;rV,WNa`hӞL9hke GklqH꣡9!9C_E-wƾPY$6M iGS*Cxdo!peHl^t257* _ELj K~_GrvᇿaM6kW߄]}7Ui/CqzDFm sZ"_"H)6'l9ʌKDwDUY*C ˱ %e/^Um0=^MH~J{u`jYНDqP\Z ~mIB)EE!d Jq,2[{^S,AsKKjr]8SU26h^ov:Ÿr7u_!At 5 c2M2fOyS](wDjQVͻI?Yc~+@cE׶ӧteU҃+*/^6_ 6Ψc2q 5.f#k[ƁO3S)f'y/9Er 8bc·~cq!b{3ȱf :|R5P>U=ouMI oJFa3M@EM^-c Ҡ[h d]H9@ aVtQC^}r tZfQyZڬq[^塮q(tqK㢗Nd^J { 3> ^,nTPcKVdFQ}yvAwMŴ"hbc@̲ JJ;CaZ.,+;s|0c>Q.\V׉aTHt9h{ %_GsJv&46$ݚ1:}xwlOHݓ\3تCDm~0YVU‡cZԸ@gT"<tpSa%yT];Շe  ɝFfhN_zn)[To)PVǓ^M;EX"՘J a=1?*3$,8 VnAu/NH$ԏ8g^sqTD{fGbZn3_vH٪P\3Vp6Wa@pE@ȶAgZ{dk|ǜvKuR=Mz8wQXC" CȃSRV^&Bf.T)+Ù(Td蕴7',tvxG9iz`u>Ђ JoYKl?Ac afRY/O5R&|(W]dZfL@t'I/㽻UӣfNv\z/hLVuAJd9@yhYݞ;BD&YT]HPECy0ïFRp-XpWGZd\lT9XB}̸ nLهp}}P)$IPsO$m_fNV3L_ c " nȄaq^nč(_Swu_';crrkbS7l^Swb$]>JvD'Q)+t*~Jz6n)L%ID!]u]ĉqd39`[Ÿnۏdh4WjU"/t#Y#%Yd>Amvbu5QI3 !&,coIlncp)Y ҂iD[h/;[J||TEt i^<rUɝz_EtM'4NMGlkY<ƶgCR!!jy_!YGFkp xAK`߁NWi]=2Wio C&$Zd/+(aZf_ږE-0~H=;vreLg?< W+dH 8sԚߨ5 =ly]>땢MH c )Q'FD4Bf;T`h;Kqt;&WU@ iйx3ñ B/om@jH#kh>B"R+FiRs+eDhBmxB+'6Z'۶UUSg (vCq~0ڤ$+ gMiO*dzBzW@\YGw2]>4=ȂFSʐY-GQb/ 'Ns z4!xYTe>;{_K򱡶PϪY܇"<%*o~L{Hko7%rr tRe!WIf)OIFFKS7r &$?p_bfW>AY҂ΐ/P.$(OLw{ "0xÑ;=,3㱏NMhu+=V4vĉ!)M'ǀD\\3`BycWk5is U3!NxM,_X|3"H4tSKg7g}7oۉ*Z|ѫhT^^xEJRpA3!lVЂuP !x nkfq }<6I&%Wv*VJ RK_Dz2nT(\ol~5!]H0&^Sw՘Žti2s7,375:-j!GGxˆxm!!If_B4sY`A&ȩiw@RՒpv];d6TC#iIk-W&֙iaEe^ l)T. CF,3(KRֈ`ʙsZS7?2^p xEh<>gM=oZchh"g!;pjkPP&؅ t>{AoALEF1p/N' 󞍙rQJfxd = ޻!qPկ?QfW}M͑xP*j[HSn.P {vR}Zbئ^9MSO -CfdTօvzP`q(c Sx?}b K'Гԭ䣩|{s?=qbܤ PnjxNmZPiOkL!Nz$ D肋aUD#/!`FYU Ufjyo| c 7X,UHɢY;LN,ʵb˼$L?o7!k/| 0J_7=pm.K;[wMnB;uȋ,4}+(:JGY۾Xݍkl\WB]YW vr;߄4ptn8Ùv$VI ' S ƈUE4@ԫ:\h qfΧ|jbVAPD%IstITlV,)=K7@cS{CwF͙y>K) ߻hudTWU`@({2:#g8}#G< .Zp wL# c\YK9@qP7`q^ k "(9tW0^HȐoe&ExSygVGz -}%"+KH([W+ZRYNx!&]Z"1y6!@1g1ac)Z~c(tuy?  Ⱦ5=[X'/>hINOznۘ||U /񺍿[""2oJ?[@kz)qorEdOnkFUl %G&Ks)V=IFgʃFh/Y3 \\au~V$i:pR[a뇹<V4"Fc'Tz n' ԒB*W<阨 `1X_݉wr5s'cm.+_ W.lA[* l$it #d^;b6XJ'ᚧ䡆Qhh9:늣b@v1pCWvw#Dǽ1D6lQZc}OT,9- >Ň=b~0<)8e|cxZ=SL*{M 3d~[|4 TwvQol4l7pMԁ˭)>(e 9ůGE؈'aIb>Y.4l;NgNG]1V+nqyn#O֠l~~R ڤnKɼ5Ĉl# [}3NJ^&CflN넲If5 v}SI_JA[ J\hvtWwƷ3r`9=\s|*RU蟷%ЀL4!~s<2.SZSuÒYԯbH>0hWtw3e/{Ze~"=Bm)RDe>;m,q5fI$YS ?eֵ+;FRDkCÿ[.]0͆OHK6\X&F6yt(GwVicg7ߍrw>=ph J& A#jAW1OYM ݮp5(M;KR엛đƬA0g`/X,LuCr f>ޥ)~@oP)jTJ@導!.V@PKj\ Dw]P]Y깺+ $DNsu u9tdfdhCh-UFPXG] }XO?)zJ <5l%ƒ2nLG{NێYPZBǮV0$I]bZܒo^Ĥ.yZl.t $zʛLM֫TocLu jHl̖4֩c'ܚK|_kR'Qɇ=Clo:C{09IGwi}g֚ME C }TKCA!W˓ޘZ O\icLĝzQ"?l_8t "  ܆`5sOgDvmFPTKAYƸТcUT\IyE%d/')W]f;\jKK=mXrv֟{Z 2UeyB"P_=.T~̇q"LwS*qeG*t靿HaR> VgP,ZT(jӘS'@A䨯Yq2^'1I3%QQ &c5 ˞q}@,^oeMw/;?Ch63A}FB\"P5~!ǝxg)9lz?Os\8VfQ[t@#ؚ6ci$q%r!ָlAur{pvt GW"/B$"cM ^rX~-krbn;Cgn7Skki`(/v_xI ȁ,I(Fƃxy #[CadͿ1c˺υJ2@>!us\[y@Cg~}B']>Ѝ'qkRP4=T+qt'&3r`.Ơ4Nh=j,"9Hf#N8H!B(ŒqjGWZ]}q$52R2feEmqZNdУ-HaO_s?B@`_/Ga} L8Z%$A9#PRvP87;Xm^K_"ǰ.-g4$Seŭ& oY{u|.=|ap1#gEq/jڒzL`eXytތ!W~Vۻwd>hmqlheSyͦ* 66'$*C"`i>WSP=,qa'Tsy>LĨےhhru7E9 q2iTs( z){`AAgxBK $0B)rΐ[s# Q^(-hR44DuPiL'!̺urxBkgk!ρ3‏ع8fGՉ\@ikC"aN9z@kf#K3PX27DFpa9`b )YkƟ?]@d9DW̹G Js/ՌOg5?~UKug ,\G-XӴ`AvjN*睞LSA"( 4y."Eb`E*r vqKPV 9&XI{\ Z' &/vFcJN{ M3Xs18Yn]R;aZu}Q`ܯ/}-Goiʎ.Texmdvn| >YYPt<?KdKr"/fo ^+rlOe2q#@EvXyuV[Ag4 1Q '}wk ט,|I,AR =&_pʔILz  7[VᑟP^}6/#*[r2,#hZnU 8=q9݋BkBGG ,X(s_Maa͇n)FYvԷn.(P!p?䲹+Grrt ^nmFO;vԙU7;vnHۙWbI{'"cI+dF_5od Rm^mX3-:W[ۅ^~&P3pD5QH{9&moR'v/%@U fZZ0GkpRI 'S%[.Pj8X~^ gNBhE.#^LH@fbYz-7SGxj׹+Rv)ƚQ|DMmh,}&\[k8ڻeԕKDAw\.K0 42p`L$J{]ܴQ]| >9(%y힞[u"ev{pxu[NqNG26nWQFƣ挲Ry9*MFk)lO0)[fB32Ots7H2HWڣNG4R~G?c؝P?LbYg]}|;[rRg0ps=ؠzyxo)M 2Qs'҈Á<9L5 ٗV˳Aa~%P0k4Q;pQg=, yo"`Ebj,ᠡvTKJ%+%;oW J)^D\{v0g\^ 'cu`\4v}L R~5>\tI׹|p3J8|0ßN81w[L L\Fȴ[a<&³G"0a62`"_s.+P\WYl~E⻟|*;vHzv<4z߭oȚͻfڪ"tʓZ_vXWzjۑQ8q<9x?wC Bz5);KrvFz ]GV=UT'fS`| ڗTtXN4LSj)q~@h"\dpE=in@]/Wt&NO(A>wˢfEݰ;sm[h!cr gηU~K@aV!ʁq%]^Лk5-Q%Qr] 10A:ba@|CTJfe/Eδ Q}}_ɺyP[Tfݿ>*cן"L\Suߢ'|)$ri%`7}ѻAOҘVAF/IjyE z#a !>wh,aRM;6^G[SwV6Ylyh)9U>wf0 jF6·Kṯ(=R[@*^O9EܞYsJ &WrP#gֶķHϓpP+,d*#3@)d8 7S$6,}ș~py#gi֡*4Ny۸:1vDXlflaL4A4bW+gI0VSDUn,۽Qz7v[k-V*Ybt/ ҸLSX9/Vla2^zQ; ;S\_nY+ǹ"A5%K hwqQ7)Tt W6/#!p}Jͥޅs*"'$! ] {G)L]AOVg0m 05F2Y3߄u@Zp簒>>k8?s *ImpL!]7N]ފYFo!O`Pίu[eIi4šqɀK*cxSrm#@} G~0oD~>.YsGW +b'9t Ր~zPY̶%/pHUŻM| 5Y)oL?ҡw=͢c5*[-'{9EFՌī3xC<p]9W @VT`q^c7O<$JmPR1^4L_i8qB%L$V$D$' ubA; QFSX/_m-UpKm-;\J$H;hgyjU&dyK. /\r}Bj4U}&Xyՠ\PiRA\!.SAG+W]U szъiGg {Vzt˴5Ǧ]Ȯb֢l@/!yuz{sK;Q7C 'F}CT_oޠ9AjeT~;V_`t I=~5V/%1-RO)ǭM&"TOBf5,{VR{#X8o-+)cVBgBl".0_ hv{͉:P)pU/F~gg*xMWA,I` 4*AA4`bԭQw[yO?p: JGQH y *YҲ`'9(Cl2 YK7u8,ӱGF/^gÅRhGG7kH٨4{5vXklit+)plIx{G4 L+Y\*N7i3Y9c6:ps˺$"5e8@0!ra$&H~e5 ;k¢`F$})fHz/Zc s8➀Qnsw)c;ؘpko 'cMc&Si/?uFK%^ |\'5 ex%{FkiX˞.Sv(s1qC%~C3n4?#-{o,*@3&J7ZF[ DlxZ17QoE1" V1=cVw=ks/kk>ߴ/sij:6 1Cb$PfL~nȃCLSQ0z:.$pc_]` .Vh3ڡL\&>[s:||DDAGnQ4ĜM2IU13Rgw%AaC?T"Dˀf1(֠jHy2Q Vi@= IEݣlYJP-ͥ,PjgxNEN]y@#x dĀ"B< 9W\tAõlі(}{NUC Nyh^qC^9NߔP%$*dNӵaId ډe.-Ö3~a,H9z,ʁO](O&O;U>{7WwJuI\wfqVcyGxE"魙Jtf9W,uXUzHX#<-Zkc@]2m7MK;Y[.,0Ft[4ius7VsޫHq4MícR϶7,˘[F2P!4;t'ȃ$'D%7q8<Ҕ'h]vK<ש^$G&Z1^% MT65XmxoQrv9HeN`)oDa2UҶn dyM 71qzE{Rݙ ?=SVPg; dUMN N" ǎl3$^5P6QL1.tSWZeR $qC_o@G'9&(~vZglGOF{mEht 9.꩘@GdeIWܯ)uG9dԾPK!}`[Rs,Ǹ}.eמ-[&x[%+`~F<{;HfWjh9[7j[tN[ZJ6mŭGrjDrbr~x= 6YYuj{3OFjBśO);E"Mx"Z!:( ,k`8?ϓqT_dc%mIq xՇDau 3~gSK )>zHaЦ-]8՝](^=VXj֪@JAӲu0vwP:\ʎR3$%N# ďIJм`JIw}2"mU.9"lU [\ȸH Y`y**Nrks}BrTtܽ2zpeGhcF\##NiݷSm?kkYBWt%z("9ĵgեHU>pH̓Y`gi)@5_'Fd_ҰL3PC6WY=Lᶲ[˟Gg@$SmL$ Vz7}gZrD`FDݯ`+R\\qIUxtYu&ϗ ۸fggsAn k7 xd3Y (I`$dBaz& ֙9k@p(2T[.=SYtpkk֎K@L>)r&yhH&#)yL]iB<$SV\]b_gUuCSd ĔSrItx:E8`U)Joޅ<2rqH¸aV'9Lٞ?MɃZ\+qZf+qGF&e_CVqh1X`]l4|7il}TF ntA[jo4 DܲXX3=SQPċA`_Qnw`@0UrKZ(|%^=|۲N-EտxGN݇15snvL_xVIml"e}Т VwlUNă<Ч$尛S>CV땡a2L^2B/ꨕ;UqT+f ?_5VkYn"fDS${5Bi=F‡[/Yu_ t;댖aAgW!YiY{uRwp Q&0<#wRƁi/ 0ZR\'P,߱0&ˋ5[B<&NvdAKT*IojZB,ahSˁpNbF=%^i/u{n(z/C(> z|FWڡ=))Y_mÄ sYL)fGL,-~Q ss/H%o/}tޙ` 8#^LpPPZqoKzQpVx:0F2ئE]Zp6xKʃ 8׾VW0@ C]d znlòlC2вjԻ0utǓLcBD`Hj?rIdu>I>R^Ҩ+UxD3[`ΦYGjC%Òomqr@PȰynlIwc๻eG;Qdu ޢY=is{U|X*MhY88d|K㯌PjnRov㞣mx=/E^72r"!SYETsL[ {i>%zkif/IPW)Cg۲+ Lscw2YM\$m:*`8O"Z տ[;6Dt&y#*tzEM_ʯthDUQjph+5Qm -!#j,yMME\lb6846N܆K&䠠Vs /O{daaRf^ H,((z"T}X4:ZTvԲ}ZYuU4%Nw`$Kx\Iݘ_oTk`ib!U+y^sgr\*lg?˜7K* "j*vG{slODSSFUPکyM0a9HG~r$(j"QT-h|GZ{Ot 3=keib9#ܧp4@ s(L'_epFsBc߁cF'Ar ۷F~ 01Ŝ@>Wba 3+;dpe4ϥ8E~Pq4f :*FI}mfxuCzz))Ԝ?Td9NN@,aS`t3 DOi~/a + 9hO^ߨxQ Uϣ<^;:Zzz 3$ῑ2i20'}aFE{cedxLY@m/6C?pxY~}_ +ϻ"ԏO;y WNpk|w6UZaUbUE8KhV0& JR+jT:V^(VVFÍX]Xm&h uH414tW*a糉OsN4FbhKHmuNA9q l#PbAz˜Xq([Rbtk)G,d\ʎ>& qS-PH5 y>W׌7GB8$\(B.`s- ʁYעSFBA3#~=9rfyY\=bfGoEK) n$$JgY׊YfE8W^tK% -A#oV6Q.Qo_. Jxhld`l$,BҼ%MRj+~L\V4v};YBN {&!Wg>m$_k\J\pe׌xٖG wxXz:F$m?! jх6T"VoWlH)+\VlF'kʦmD򺊹I6zPVR@J#>(c8Dwi'X%8,x>gІN{Ut1nJ.F7Z$"H^(k(z1Y܋}RwNUM:B s5D&*.[]6ӄ US.iςO>[4f JHMjlhQ68<FNMpcgA,b2a))1 +ߠCXH` cnmrU-|9Tvlgn0td^pUMX) ?Ex= }Ҩui5 k.qͰV N |SĂPEDIfA:&aR3lȰat.QҘ(g3 BCz>9q1)V=3 7@RT8N}?!UD{BPRgiUf1u.c=74 dr B+L@`d}FH:ļ xYMN R5_xضH`7^x"m4azbh0g;z kGMy ".;5lA~@btWp<C B$ѝPE %mx2 mpFd8RI2noʘ8L; }Mm]%~?ѽu\Ow/5EN pȱ"G^E-3d{Vʦhb_:Ib,6w@=\;#|{a۽n}QX^JHeNL:R흃&x S5]ڏM`l{2`h/i(`!H xehan}Ne!z9b< m ?wK>9b:U?En؇?{ OZN]3H**] ipbOujD m:~z)%&E!I,nQIUh;ٳxo \x 2(-.|[ jJ;%ĉV S sV3>rR9rgЂELA}Tg@g3G5R=#[iA4P@EYe\['ײU#[R"S^o:pX֫Əx@:ԑtEf/ḨVd;#W:YIIpyőgW@;Z~l} lJ5`6vAm%kRch3 N}MAiFHDJn~EL'R5h%1Z$[U܉TW{BT ~D vqj*( vx iQ6f4BM:|`֐e2Xx=7|[SoHx9 5>nc E[e1h a'Y4!.&( Y>_,A^2P9qoya iUMf7wfQ&,Mع,n!k1@Ue0w'l!>NhxtB=+00w~ Әf0!+ ii&:v~OMj}i5;PCCB E^c:e 5˞ EDJJ$TOFSh5|e?4?Ck4iBT uM~`O߆ViY) !쁏R a8qɗ聫E7Gp4R)gb'WLyb-^110 b,&K yxK;Gh}hH$4^IeY6\:$| |1kBZ.tvNy6 .SwGc vϼ1J!uMČ訮(U<\A$Ti>\L#`7#SrKQ-T)'ѭs\sȇS.bl LHg3SƳw)gɗ@{_Z@跠Ud05)t\A4=/p(r5>>ƑJ,MךF2@B΍1@e;86]U}!AXT?DB=p`>Iƃt$iQn'Z?XCjɶ&Qw&[)B6Dy0O.T{d_&pɴe0V 9)}oڋ F[!ak -[h+m]=uUCPU95 BryB=,8ɴ'R+Ļ*TBXWQ h7q0'65igʔ),C'b3=G~AA4ӱqۀ؝N]e1R|0B& oG^)/NEZf`N^e([QkM16@บ!BM$Qs5%`DPgң\ey!?.fԏ%L^UdT̳{Vι.$5_^k}є_0W 6'R!4]X}ֹπpscN^w)ku\8LaLaY;tD]t1sF_DY_tzz1T=%J:Kh{w+ȌLv>+H{Ȭ'^ oZ6_v0*WKU" ,{H7w8\=J^Po5VL Ǣz{JF8eJ(܊$sPCpP ;tyKYq]S3\2듭$Td'IWPtwzr|lٖמ1.•IU٦Xq&y3pLDq".Pe

0Wy˗b/w3*Q*}lNm,ߞPݽj`@er yDƤdUmx>Si)%DZLUQĐD&-2q)pIdCM'LfUhKd0fx&2?3L \}T,!9!f!>4@ Xǻ`YδnO`iZ=B._xbadc8/ARg%jklez|q7I[`wndBlv N3EȄ[9F!J#nacVer*H\\]lwxyy~uljmyYJ+8LK~_9lyGɰpe4qs6F_ޥ]xGٙ ]~,KNPwF: Ҍ&(@hλNG02nJ) m02Vb*c+ ]sH >Mrgs nul.6MtB}(ͅa5' hyDjAH@9pѴֈq )הDD?RZC/;aHLDC M v UfqS]mŪ-ﶳnD3JC><Fn`"tMT3J-BܞT iIj`) cx]wiȅf0B':]bkzs*vB:S Yb:Yu#R ѾkW6-w h(YGUzxKgBwDVA|ʦ&XAތE,uLs@OLFR}P0͡JWwRPP"X_&bdv)A-g$d+6юz}+U,tѬ!ex).~۔MBY,.D,u.?4NzXrٷ@!U ¢VbnOxkxjKsd언YU.#{^E1+Cjb(S^W\1,BL5g/ӊ3c.#;򌹮52}3`ܺ}mk .gbCHyY?!ݢe@xɔ.uD=|*4ʅ|(K9:UL[f3:t}OYAqU$| ÈwZ#/"DR1S`jDGzJ]j3Bxtq棒:Tb]6c#n:E@;qSc ׿X L7Ii+taMh~fW !j9輂 vJv0Aݡm 43Ać2#l㎎-Uxݓ|Q%XUdʵ)+G2x*XԸe.KW<#XC.b R.X_7}.%GfO$W:\ t.lzoxc--fVIsOij4Ǧ^V|<^   `TR닼CЏ{S7ծlygG\t.rוtm9-F*EK@ s;ROMeI.[Wsu^_Of*) *Vq}"vqѨ>)v7LǰwZ\N938EP,E\a$qΩcu` #P%[஋ڼFA7b8+U2rnolcYXQ م;;6Mjֈ>A Zonӥze6%39Bp"S_hF@l4ҵEG?cR '"X>FFV󵾎$o$Qi^փ%AHBV A1GvYS䢮̤0ʠ5/:RifwGRJ=/hK =W@'fN&'haBoP޿ &Н}t=HH@0]eҨ/D^L4iZP+ⴾ׭]˫;F`CpdvlbM5w:X94IadQό}C#Q/6݊$ף-f3jxNӼl++j[łoM9%8':s1 E9G..Hk#,ϭyh}_ɨ*W0YG+7C(B\]3l\LЛe{TYR;@Der5 ?S@JuUNpp^   5k,FU naα##W^( `` ~jAl/vͦyxV~~NItB <ًV݉@h K:"S[QG%>. UlPct^fE!'%xmN:'7PjEv`ԧX Uėx"r<3kI8>3Q//sM}b] kFV=\ <&ώHT[#4%OUҽXثLsAY 6@wu6 X0|7gH v5|PZ.2SL n<[AZsSWCw0t~UJ%g_e Fߘph8p*~Ԉ4ouN[5G/_FF9+ u 2 "!2?w;nW"GëvPR֨}jj+UD _Jm Z+Jr)MI"{_)+f{ND0Np|d?ZFCYsbm?ZBU과bL0=Ie0ҊakrUnό͵L{?>gtƁCBl0"8A#"Z %&8"t4SGflD**a0CQA0*Ah*߂Ք󊫺h,T޻z?HAt :ѰmV~|#8jY:QѲ| 㤱[+c/hf Cm)́Xu#KOrB]3w[E @ϓkARgO5TRNP¸JZgWV{w1ꦼ_df,I80AYBULsHЫw }X-sH0xHM^fb*BF!NnX+-Z/$֫u;~җauU-;˖ċXbzu+5 }EL?ZW_x~ʝ~LL[Tv̲Vϕ1-wVE=C__0,B}PFԅ7wW|֯#^{ Nc򤳂Jm[lhr̛ӚDLl"bp2՝.`#]H2" sU_z P |KE8ltm_uFarj-OkoHI9%Q2zտv"JZeG/4e&3/,T7]q1k@_?ޝT^Ry GF9>u7Vu#'lXGR>~$C&3d=^AovlȆE/svp+ޓ&HdESG0{()`;Pg6G&k82pV(Yr3 do9 > Q!Xml2=' {)f Z8赃g<%WC?&M1ٳ ILqFbd QoolTo`=bРofPg( :̽aN%K iE|f=@q@ǤP -B9ZW_̢5!VG\\MJ/aDkQ^($g@N`z@*@\eCP!: y^3X.4%6)a d * 7MUI56N:nsy99~Go% yP 7N!a-qU2C NJ /c㗤:FġY*^xTv?T(b]r<ܽMɗ6 2TTϚ jrD{:ǥ^aP_`T M9TDv0['VxbyM`xgIi:irG1Zx.ף`x S-!u;*8 }fFՆu-yx.e/~FyIay7BU*_yni2pXb[WĒ@u!̷.^[jʃf?".=;rV Ht߲˂^G=EG̩B#߻a~#Yz]GVY'@Te}j9^tkp,+䭮";ӺKhF6]YZxJe^locJB4WF\vpVV-~SvJx|R{m6(, ЕU<"r.-XmDC27Omx|E;sk2q{=_U[IJjPF~IyKjEe>MnBn߷˰kzo0B[Oi JvqzY|]zS2oqẎPM >D(/Yih&FߔjRˆȦ*L 9 AAI :tzPubK NQf[ ƠՑRge|=@rQ*Kv M'(i!*ft-&h'<5G헐Tڟz8Oy!0BJKij轴@'GFc)]UYX+ba $ř?Xw|&{Z2xYW3]4=n6'MTc!q-"&uLaU"=aKaڻk8oҡą*."yX\,5hJ_#ʅ#\u)K.twš7Da,4=glaف83^WQsDy7 E9]Oavv|R76XKЧCq%|X0JKC"ѝV%.1Ûn\xbjFŻ,06T@ z}TBsL[ეm4li6sHX_3E/vUڤ", 7Z*/7SiĦ^ 8+x̄$4qz}"T:(MO6#F+)jIrI!7ùſpX5nBi4({3hžn{ZIaIuӕ Ai cE,;ZSH;4i7@R0ġWGl|^V^B0hJCEf<5-kr$΢)~P0J+BEav4pyC B4fR0WTh2c]BcgxWmi `zsF -oA=8ȹEٓ0mxK]R|b G:(ϸN|-"+8k,f] hSjl$9c̐)\U5f;Y@4Bm-b05Q3*#@ۊoP.gRgH {z<@ &`u,Pmdb7V#gK/$8bH}`PX@?/m; N {3'"2I%% dKE)0bhZZհjin.GϽ^TA3zRPxpa$/!Lv8L>'Gd&Z z{iF`&Jq= _J<0XmX \9d w~ OnXWhWH#H^J*S|W /imlyil>ڵ]g[-G~\zN2؃-Q u Y|Eo7,z=Z@g%P'I7iogK،p6C.7%ؗq[CKAg  hׄ.}WNr3 oHkO !x$ݠpG-Tן )ai-WIZ4MY=*GnntLnmYpoo;K:,iSJ;ҔPE HxÚ]F_\+]+ e5Wf[VtKsζ}(U56hmV_xҵNnzPEFA}NU9U!!Dw(G" mWJYj$*U k?eM I휅4J)tjAw_MӠN9 BFpTwtașbIP|'+S(Y q)lWy:@{J[ʛtRg^9 Xnu=:֋$^s*@G(P̈M̮-J0RgI%k$8QYd{D`\&#$2.e Z U8askp+-Cj!~V5p(CX;iuPO+uOdÌ/J{JR %cl6b"=}/}f!eK{ Du8d"N}QnJ4tM$%(# G!Iwrf`B ]*`%mR 蘼jՔ9ZLt yswߕM"1c Py1KEURuWj}F|X $ =^.Xk\R-:X;4/^0v#} ÙS\(,{6^[XIle3hs_z\37{6rU\#~@pBТ !ejks4VRς()Ś8;Om4:I"#H&O2wsqc;4+Zc O#'aaSAl$d,>p2"xB>v9GmJhCq-}MC *VӣjnHTMCF%aTnpLȉɿ i3LҌ<AeQkFOCyݷ0tRb?B@p o%#פs:R. 7.,y J,֠ gTj^?K=Xbg|VkXŽ{Ӆ@)8fL:v$rrxZH_P3c@ߩ!U(qge'h|W1WaxMikrg2\͙a@u[~M [Ҷ3_$^gOb:ѫF[t̒u =eck, 9 ݨӈܲI1 ƟtK;FI7OGOk“[}"RNkʗ#cٷE[xr/ҼUb4URc>粞 pfGd,+{恪5'vݗ\kա_NLV@Y8> 5`"1k<Խ3J'"'kP:pe|5ŒeVnXuxkCr$F8( ۂhJ>]Nlk d9VFԎW?ّݭa [7Wm:d=(;!lv+8#(䘢֕DI= MMTv9ך, ?L{}U gn SӨ5\k7gdLU$q!%2#yOSB~6ki.6kWghSOG]GF_fsF-0h$+o9JBT_LSA#WG]pSڑw_ o*Ql-`)uLQvU7 f#9xa.dt_ *EX*M2땖k#6{o:Kw:spO\D%$jZҹu  LcNsg/mDeUFҋ Z g|1gmܠ_#V,)cwGsM} u%p7llws /_ߡNL,{IU̴,/ 6WJb{}5Y\ 7jzQ Dm:9*?"J"L 2oI!%HɜuُTݢ+_PF/ϳ֩' vwrruIl*s]@}a*&8="WJaܖO%[t\z> y]>y|2ICۻOW+ug7,-&mwBP.?8Eiuɑ%g;IAE7So2/I~$Gg;6t/A[ ?{ڗV^xY^A}tCQlr.Hg>-:”HΨ^}.GCA)xɢ 浡yk|WeY a{K _#JoXQ4\mDoM:/f-/ZVEwrf͵NfຯHuwVZ!TAcb%7ZXF޾՚k84}Xa~=I8DJp@C6y6 ̣UtLTC qHd*!d4ieE 'GCt~Tl AA>sT2YXԶX)ľKR  *b9ps.$ec4uݸfGZ}:$<\-c@ 31#@dٰ[IKJ<̼K0m+P}v#\K^k)u^|]6dTl046QFUsv@D}/ܴD~9/ r_)jJN] ׻rw'"j>tIlaiZGJu*~ROUNћ&H UzflNIJBծ2b!x-4uLr@ǾolZ)E8_yScv-10f*V!wwZ VS~o>)q䀼~SP]tJN;,] Ctk^0U],:btJ%c5 Sdvbg0Vt[d]bԂĉ >6vHr*2u1Ǟ{#V5S<%[짵~"xFk,,bB\#Xq1/՞ h[}^)㙗p4G1:4WBҲ+[=o{g7M5YBe !.(lSaӶr KZABoI_TY2ӴkDRfG nHSEۭϩc/u? Yh (VRC<;ER J>0J-!2l1Ek9.V_'N\#UyJCOGFMJؙ@ro+FOIöS'c 8N@%ո| ɶc\s'1|(bn5Aw U|{ sgfX_M¬=eh*g(1x͆jGz-6Rψ`B="(0Y!0Ħk]-"3!V͋kr !]xzz8]: xe*v`*:L.pLǍiso?IWJڐa9 _8kDPKbQ\fE⊙'GPxU$sBc)t*k?8 ZtT1 GޙHu!+Vqi}bKzUZRQi52"^{okOkpq21wlğ}Ly:[%NCFֈƔʵz .s"naӟX kl9rƫZCzuPJ'DY¥drΎ}Ǣ1dkU23>\f|y > W}RW>~I9*"+eֶN^'d Dukȴ*0x8gdbv1AcoRIUSa5|4z?v <]-d L$SsgdgH𸋴 !&P1`w(PA쯪=A-!Lgodx̊yƐ@F*|( ^VKן#qY-`{5rPzX<ؠ]Gȫ`ͯ86 9BX`9o IKu,]k\ma cAَ7܃%'OXNIx4sXI\|:rE[jg[Drv3*XjTrbm@MkR= pAŢ:LWGHH=`EQ QvKI-?|YZ Sy}K%eXFSgxpoxSK.~*?jmoBq@ FE(*2^eNH拱>}cWȼN3/Fbo h}ٕDpi-ha)tQ'd%Y+fbA9%\ѲeI%1lBnY=յzcQ.14z@n},IkdVKBYe)z=h>Cʜ7G,k_o+ZlxPi=ެ~W%{OpVS$y9Y~rCȒ^wm+YcL ,mׇoOT?z7vﰘIj0|Iesrڬ⩕nEBMC7bM "?yIsX[;Jiaũ;gaNBU؛f.r|XtHGy-Jeyj5D[,֋=X@ 8XGErˮ`/VMn5nh$v#LњMR? ݋NVDV ڂSVBAG!Q'PU.7k,V+\틐h'i%dDچkYtW:_H0ajHRCB`pQq~:e̫.UZa'TRx̥(;N%|!c|{~VGj\91i3˟gP U|-7vt`l"ľA7%Ї\j.y ۚœxehu.Ren<ũDyVezWfp 2EJkw1`r1֝vK4@r?6\W9N*KWT^APo3cUwJ}ⴭfipmQdK;DDp+秜je"YFL c#f}/LdJv&;bQ+Xү]_N:_U;-cZJ;g6ƛaɭl&l N ĩVruzC)ꄏËV{R8juL3%fs],DφૡD 2S__+z#?ajuVC UwXv'|br*lRѦGN5) ]Jq_8S=4>m]x[N1F(S OZc&/rt+:J .jG}jq\>.7]Hv75N]_ "wy 5a=[S{45 Kd&2pAX*h rT1ͰmRMl(wzGG)}d61\'[W  EY3v@ds3}m /ZY)m`oib1F6.DR]_9DEX{Rfl\XoeGmu~MHUWnl|֋E:^u}a*lep4C)N=fw $,`Zi|C>"As?U%.7~*HAT*RR'zʿO?/DWޝ4Ú7jzsXL@י1ebBqPnM@o~>嫴UiRAdfJ EKa #[!+I"1DgN& <8WK&Zͤj@Xb2̤xۮomcF Qn{kVɸ ɁKek>Qna~f7aΦe;=~^ >B:K]œH?Ae&L#O50Scl +ŞtHQjgk0bB"I(|uvƑdD>&{JmS\ ̷TGO]xHM\0#Iz3 ^:)cIu`sk۩? [yH0H=mt߻,~8e"k[I 7g܈0n:㫷kїp$ \ 2 ܖ%HFU(}df /n()s0FI~K5,hDG7@IF_QEBÿZp/%$4NEVW@!S;qL-1.bVRlmȒ'ի WU^\=\#Dzw=XeE̸SԭkL㜠,UTY.Q~hIYU$w@kW2@}56q_hWI֔#zJCʭN?āBNwYZ[% ,S6ٔ]S~ۘh/1ӛP('3B_|bR9]kv/Gc}Gw}C_QŒS]n ^tkJ\;6VEf`ww(W5¢译]-tɊDF8TrKmr \Htd?=,A:׉qi,RLu)NĄ&*F8d Ox?Ӓ&RXa%;uXˤc%q7Gg. r/RnrcqF!G"TSOEfWM}EMFb1>@$iJ|(V@=,!N$?;MPm V\KlXtUQJw͖R$wC n`ѪTI^,g7H`UTI:y4eg۵#؈0[*im@sm>[&eYqg 2GgdFEG7_sVR?sK`E_Œ@=H7,'е8^PL>\tEDf5ܴ6dN3R?Wٴ  =]L > bD~(pQq4.'F:ŦLNs%)IAzpH` wl~bZ?/zy4?̝ [88͔Ǻz{x݇]ˀa6kߟ8#Cxܼ LV\Tt`FG"S@/`l.jI$R>WLhP|g;x#X]V$Ǔ]6u eAohZ%K,ZY,4_(t~Ɖt]ٱo7)6w%2Qȵq8QHC]ju(ϥbyPbjw21Tl JzbIBOsEo) Y/Ȑ[# چKJ3h/;ߩr"4U EgH4smdQl+GkBgkCoSkٰyμ勞5g.Ehts)]RO *G):{W3fSN'c qC'Zm7῜b?S0a)t?xXQEXDmC{h|v qI3OVnUbԬxE c[XOj=aM aLɽ,Y ap qn9wp3BMl:X`hy;w/NL`U̝mSb`InxW'hT'ꑼI?0Ih>DٖVp+2nG{-AM )f;ZZ6Mv`Q.yQ 4Q+ӫ8&;ye(%䠶`k,JXMp$rxb*wҠˆ>;c?\M@UAc*<_O3:a`D+IBH;V> #ȞgyjJ) j%۵ Mg29x=KkI5)sP:ŮQ#O೐ ^6tᄐvnK&c^ 1v<͙ Sڎ$:> 99۳E~J B@"}8 O Tޟ\}RPM+!5ׅe;Q#i\so325 ٦_"4< \H~>AaPpl*v#Z tZ-pI%Gu!Tݽ0bX1&qb!n-0LTk^=:uOFG_IR9+#T̈RcfUXwܸG;vh($j*0jn휉&?闙eCV^@(,UOA}3?g|?k S|XUӑI. dCg9&ڮ?c*sHJ9HZވ=TaJ cRH},+EMi}N5eƌh^R3mZKA5[T0w&*dR1^DRS2)$><'p0*5r~[vfX4z]&2p:AާH̎wiE@@xnX > &MZrwVPPQnh[NoEK1ʕuldo #$[|<!sf=}%uͮ欖a7'W^qݻtN+<4'XʅH%]vDHb*Kq!x'n{h='o.X!nZezΠP$MaxTMx|%KuLI $nF j:]NS_fUC[QXI|j!(߶wS?` 9LU;WWڢb9yKJ'OL }z -햐 slqBZWކ]bfihYV8 yt )1tسA5K K >]IL D1uIc3KYZLތhN!U[6䕽S1<p_ui"+rʡ)}bu)%•[)!AZG\m= J|`H/p3;s1Y a`$9jǰ ;LJ46(~op\@c|/@cb#"ӮEk4Q!-;`z?j7W0%djqJDyYO6XE*l|p7V~B*+!WKsʺ D&1Mū:$(Zvm,}Uءp}VIF9} %%TSj'cfN$2MTo-%intBqaKai 9%jw!S/ XCVێ`MD+,*gݯnt,TLZIYT \:ӳ@*Q5ߛoi  Qʒ BD#œK41A2/ fe|:O3,Cc^AiW~8~md8x HBoTXf8OYQ6<}Xq:Fp¾K.cC[ I[,! so]ԧ:e{G=@ _!hg9%ED]MqL̶'jBSozIrQX`Ϳ_\W]' YN]Gۨnx׻ҙV'IQZ )KjȪG@ !)1&0j+Psp^NEzYP'iWi/}kE6$& vp"l71!a3.Á֏ʗIMVŶ&JL*RgL}:3bfJ3}9\F+&{wdm]ߴ'I0\,Gs,l7|>d -w; H7G"X}αN\$ZFB=!2 e'_ru-pG2kQ2TiZx{G<̔i\FY9hg9qVZY W/uTrA y/meڷtt˓}_)OqDr=U>[Q%Q!S*8B]3#oV Uό Doz6ƒ4 ]kHe 1B,2U@g٫hk*C>sC~ .UR~jNBiS O ,zl'eEVWU!bHhrhl)k[82VT7<mA>hއ Er/e; lEBpQ1MqO{Ȯ?JWG9~ScfK$UM}j#&z_ə]8~16UPN"V2l$:#O?Zj!`kͯ>%"u,vcϽq%]*85e\".lYk뒷|(ág7sztA?X ըZ#ӻRN3J@[%O jga\T_ٲnE♮HܥSyEz/e- m>E0l8PILv W!yҹ{>f79hشpwYV73$~b)p$߈zd$ Gμ@;{&.뙙X3,_0!*z<ݿez)o`{;/MZ% q? aEa G;Ip?c=L O(g@BV&RgJhM^ PzćhlX`SΛ05[cr,>@ QƒCnxh`!!2<#Yr*MhTIirKl/5r%aT$ž]iXnQ')ogV9ë*B &Z$ EWsˢAaVRj̦/>q] @cP-~ fz a'cg?滺lF>-A/GK@@O:xjn9Z]W~ϫvP㈺)mML9Zu]Vd+ivtȠ! LGh5t4~ 5_rH}5f/e̮aȳ4NPJ)2NCE›?{~Bɺ bô"TײO^Au(|XN?{*0YbƯQК,Iw/M49YZf6 whvU{uI`Af)0C@桘T?*[xl5. */euZc9KVBȉ; g5{>@ҝuq^,yS:,-gF, 髉u\<,tͅȀh|BL棨q vIrK7*:k ASdN[O0ɷFNQ9١9c''qr2s>Q2Ъr#'[~x8,GG?e?'UO,q(v\>Y~zq*cw"Ho<8SM6p!W۬e&44FQ,TyE K+AlbWg$i ז]b e0wm`β&F^@Z]3Ht~jD8ܩy"صH9ѰJ5:XU.Tc*N֚]B_ej} E&t#Z)bde)'~BEjRQ 4p{>Rt]Sڃv!z5mf׬ ALlf 5dhbIhr;U,AoA2?A_\OJdxQHҒ EQxaQw$YZZw.MeV9eUs|mKO|1iz,WIo5N(͌D/1UaMLl]{6O)arXs~ꛩ.`_4o$rc32n۩T87w!%ϭr|x`\VE1G)j2ρtt;v4wMxoV}Bu$%ɗ9aV WlX=E\ E_y߮BJy56BCWOWƹ |[KiKCegcmu8r;>^kX~YA<=ȒFRm<ͮvx& t6tk6?c+Jl䊤Fz='+_DFQܟvC|\1M vU%bGTT[=4+=aPm:*E}YiiXEfh R$rN_d:K|A&yW4׋;Ëf-,v"$NZRS1XmAn .8SN=Uf4rW(?Æ0xROQw5 V@Kl3ft|$V$gCע²O0lPn3қk s_cJBe[A|S^?\{U`Ο]F{?!E[6KҚ%kuL| dgD95aoPÀB;$I_[A0"~9c95$$`n[7raRμj&{iPC--1lIrc|S?\(9&JUdL3o~5VhkUkIbEKF~ IMO6lB*۳'ܿbV\ cdH8wҠ%>"s { ijѲ U-ESG_qM#N@D$ŅM͜b\+I,yhJw!`bPUm6g D24v[wBRpԩy =RUd )IRSF % K ͦj} MXt?U&WOL^FP&˺tGhnQ0|-ٟ+v q+PR;LbA[咙[^m-CIM6&J1ߺQ?/^{9R\@wDcjǗ)&_ockfseJbi~ws锽%QP H~*}i>~Uw$,}&"d((ZuܔysN9Dkus9ŕ80M+'~2p2 rso c)C}l#0>{؎_oF;L~OPJŜͻ3GMԙr7 X^J_^c$.BYgVl`I@2On{5<"zjPÝ-hQDrbm ̪fdT`4S9B%U t|& ~ )k`́W/yk$ܑioE M8Ԏbrɼk,Cm#T6#DN;aF2{glSH,C+~!e+?ڧ:V;hqd;U{̧(d\6$eA*=BBYѿ"=nGQ?QJͬ ta/ a$ fGsNl<33\ >p@b2V#qR@sO0̉wNLPʓz-u6,,? ,Pc<@lbd8bZSoD7PMw$| Pǚ:'}v_ݳŊZ!R`jS-2N=TKv-##gD(ȒȥaLi fkE7V<7{7&;Or/zY{cpu&q]LD/L'H/fZ6L.[S&CXK06Mu_ՠ;_t1pV1(S.^_URwk^ԟ&:+<YKovܺUۄuJfv,Gpɻ6 g/ 1)R8]cxKY @ =%gt=K Gg€{7Hd ^koAb/Jzےj` [u"FKR;0IX7fA1Aqwzu+C oIQ}WMwB(j;(GRS6pF\-lUjIXYϦ(}D# PXhyD6ܮ} oApq 2p+OINtEQw{Sl X-bV}80p+>$?hGMc| îl#޾Mhۦv'ZLPQ́9mCt.!1BPTp_U&\AbHyT;zB=RӶdLkw]/J{ZXidIfDމ /87?f7 ^h{:a?ؿ?Ŷ'u4LDŽpG;XСI;.$- %>) VM/E [Aar:m8hwMMd YP|b r|DD#P9s׌2MhGUlId>rP 0?];,}YǛZ}'NΎ Jw\5pp\XA]Ўٕ!FSՌTme?(?2=PW(  p |*RȾuO2(SZ&L$`mFZ3=q_YYEtwϯVt|D'ťW06 NhVU[lUB7j7}O!傜[ut+ruk׉bBndı4AI) BM,q{Ӊ/~5?CFI DS`[NZ_HlefvQbpՀhzp;:ʙYFrwb)PAC7~:=2pؤGegsQυ0,L`>Әz_ fxCeXw_8,Nuq?nqѷSD+?b*;ېFe'RTʺOb{5 du/l>!gF0}cW;ZSB:rm =tWR;>U.SX|ܓ|etidgd(vQX4iM\~C=}RTX &!w2,-o%ASaf2gio锧?yAnQeye_? rCȇ:R? L~f7:O6NXBrT)_V)If#' _@ȣC4bҎk)t7@rvȓ{]Fn`nCIXz("AJx ոTʔw\X̊ru+nI\ML )|y)opTS6?tbQJof0Zm>l=8zol1b駁HY NL؎BqKbZ)_d!rn ` n^]zMqz; DRZ兜\[[lFXʩ7W f4I^s2xŇXJ5y.׶n#p&&skچXk7}F'E1p,0\pg}rƬؖlqVC>Wxݻǧ#:B7`ޑj}z\2jYHdh"*{"N3VPnJ[׽++Y>FbkIu]!ѲL)sprz zX.i 'ïP,Y9GL繙.t"N d' \_a(@:)+ES  =e&,vб 3̾w=hĪL; tƔ{(F@\J"?7Ju р}PtŸ]oQv(1A~%%0iS&uÐ R$JJo27|Ǯ"("Y8IO'̭gj$ [yZ+*qp[W1#\1?كm>F1^u hr6_Eg@sĮ@bϮ1[iG^^/luVZVIaYudy'zU,$}$Bo Xlث*[4ԶvVEq;GD VurAdT`қIWX iʮ2ȚŶϑ}i—BmW@>-Xѫ+!;A[^ 1Dmg@80Ɩ& .jr+6L=U*~'QYw0*f"=OPөemH ?=S~Mu@' c$HT3zNS h0/>\Kt?w%@TA[Msbm\ؑʗծiJQq)=fsN烽[FZe+t9UmHj,-1DyuD)D@ BJm <,bOWb]3UN@ӜH˻FU;clr;H[: 5jag Z׽5bh* |$B'% y'!<@F*a=AUZMqnPp)4;&iXf_Pd5*G`XW $3Ja5p?wdB5!yVH6^`֎\!&^ fA4K=lڋ xr+V)}#m#^LѮ53),a.O6![nt,o/Iv_"KvBݻ|p8bzޙvqMSOgތe0_'F:mV@\6hoc~|7"XwJlPBKws*JF#ۀm~ i}L?%+f=p93g=IG@(;H B4ʀk]a ='6^J((/`jfƴL C5<s<3ʻB;9x!(_O"t-Տ?^ZÄKR;YśQh<-9'"Te]'Zw/x^15d+]q5ue,1[d!UicvJN`>.oAi53=",Ή0&I),iˑCj>gD[̪=A,*=0_4w9u>v=PqM&Rt <黀*C ,Fèxo-WG& `iҀ78-8/ٖ/%ibyx]!Ă uFg9)|;] +ΤTJ12 _<-%b%tφv)ܸ)xv̠Py.Rӂ(tIZA$'=W_~T$Ȥ:5PQmlIvN$$5kb.S4(|Z/Txb-.^_+Fg)A2i0;)I8&zٹ-dUk 4i!R^>ŹSt#oO(9=b*҆;C?浕6()R,KcrhcbT`#0Drbf7oa~Կ1T6l4j0"z]c=!ĕ*Ǐ B3DFE%a6z}M_k7j]':dDf,6]T^hE 41H畊E<g4Q u^v=MְVp%QAGRjo:q& ElL!!q5'B 0NdVjvi)oIM&g%NyMx 㡗X%]~{<Z^a J\7.]*JZ\%K更qy!Rl˅: zZ.YthISXS$gg&0HH'›n-A_m0|bGܰ6B"X f_WH9[D^ `p. wƟ6[#r%9,.:,ϚhtG-FEo7ph#)e87`LK"frr!u$"lqk]4ԉfmÉU M*ǍCyAI,@gH4,$rY58j 0qo!ɭ@M݊W!DRMi;"`@-)u*R@ >D?Դx+Cxh ^Y4I%KZ3HhԦjqK:iK!6؏ *0@& P%FMzxDγ(j=%㫤 <e$$׵2ʱZL1/ܿMH Xۭ~L#K?~I0-v,_o$n'r[Ku| !T]6-J}12]h)4ȵnyy`\>)gߪ#o9bojA%ًۤ4Sv&$z [.@Ϯ*7SN0-=ىN6+PD(֢b|8'7l{C& rmP+'ťM#[mDGZ/zS pO7-!,&pɻ.1r V3#Sx)7آo ΍]uϼ^GIh<@s63y"N A*`Rl6ڂPf+qn~ݙ4b'nc"5e;{* bM:.!-㫰!H 5>{%ɽ$;zi֜*w>:`B^gv0I<؃ H4-gDX| IHUTE4~gۇR Unۣ)L[j-V])P) [7I t@cy#Y2GФ_32nHSH[+ x? !?Iڧ"(նVUw>ø"(_/\Qrlnn+*U׍f+27;D&IJM 7wujM1@>0npf Bu^n1'nC 4k7%,==`fۤRg נ XC.TZF&Kn@N'j d .Թ#w=1;l/ޠEЖ!qP }9IC$Ԍ=I;ZkVBz'-Ivx*a%0ei=b\װ4yTXY.Gzs  6Wj9#g:pWeLL] (avKq4΀$LB~_tI]TD2U^-"w^\(u5nA 9ucI9]Ͳd>ɥ#R[M0%)`c=u%;,g G)<]oAI[48ie,oa}q 7!ot9F /½;;bh"镋?H;Qۻ2J~ʺĂ%(+c{uO %!j[}i&u2d6 qo80vâO?Y28)N!eP"FSqt#Ti(~*~*.X^Qnr+*/g ʲ!{5κ!}Tk) 7'[z@TO 3!jj)90D[PG2)#otTp#:n.c>3me#3ȔrF5փU}M-G)Hk t+?쿢9F;!%W4Qц(kNoKy>eWӊin7Om`2"Kʗ `~-J#>R?;lž~ncMyutBN3i'JGsF JU LjCU v: D 'ߑOsn) ڎn ̃;0Vv#Pd8rX? dJ<E)2L^Zd)CG/&h~n&Fs>?vFqlɁ]<0B/ːBͬY;_t{|:Lbl;gha]le(Ϳ7%A9$!z?5']r@ᴅ.gXhnkqKC|"':k+t.ja|x.eԅYNmPuX$5Dy֙zIg9"Hn-\XBL@aG,g+"YM78r]Ow/ ج{ Xb~#qδU#Փ;P,y(34],GH"elxʨd>bʝ) zu7XmA5~~邞Ƹ=ZFAl"'ȑe%%^.ޣ#F~& 3FQS+:6fnՌ5&p%(6:79."rFї؎泾s! ]HFG~zٍŽ2`O*yZ%X왷OqV[7m2?4"l٥83rv8B';p[!*Oƣݤ@p2՟aS?Se_JQ)# PLjh>A]?2n3SQ'̀DBv ) IgH s&q!3V;S] L(OۀAZ(0l@8+ (tI 0#p2F<Ƨ 26[&/VYV ? 1Do:f)hGacA+g'O} ɿ3W:Q|϶ucoA1M؃;jH=ڂ>S<]=kmgRDeB &wz{&_%TJgRн\:!Y0Hꜫ:'S7Esɧ,KY ȹufcJiծ7a\mV'F&( ~=bE "C2/X}W p$2ͺտ+(ۯ;;n\ݝPm?`iʯ6ׄ/_Ylxg+g<-" 7c{ƶNVTMAKl23V*xdk,*ƞ 3a^2g5m[='4JNy؜̃ԨZ?h چ !;ùB !*0و1OB塚( 4(U(S>E ̷v4|+ӴR2c ArVVke[eb?h@umj,%t_VD0'B)5sHE}wnq8ļ1dP[\J/gpƻ+>3<?,{2bM@fY[ys&@KdUѿWP0ޕvFykgY.Wůkp_m<ʪILO+C\VM ۻN%?}r>6\c!5c,R!䧎un/ZC3'0pYգ#+յaͲA& ?<>x<̯ʌ5e]/<:gg^@߭ !>Vt;ˈ}AA6Os إjWYM !*Ւk j\ݑB_#hNOEs}aO4x;ڡY*ʝbZa͐Q h̵ ֶ QJx3=T;%?c*F$)d \|@,r()ʊ@rb4Wm3^M[G9Yh AV$ vbx`2G mwVBd`l-(0-6elbUEB'x82<ٹfLy_OkzW;ǰ-V>'4<ϫbl\,q%*|[<'1AKV;fv3w \;Er 1%~^t,"Tj@i#~ON=ʺBBHx7څo%ήP&}):I.aRZ&łPg tK./0ݳi!:p^w$AQ^"y;>-jp,5)<E$vW*SB k%Z3ZVm4TA"S'.oe1d.B9ǝ'ͱJ7[Bw:/eߞ>vkPi1dŜB8 $:9?FNkT;==C0GZ2C+,-I=awfJ5X6w9e)&'S NAؿ wWl-J#Bphq @?Q/8_,Ǹ",5ӭ+  ;w/fk7lD;ƙH j/YcʲVZ[ ."͇Jf8Z\q{|Ճ,qrsz+BFpq5Z[<\gʤ(έYs6),&pr٠̙"4Y0 ^w x?1*EHoؤڱ)>Z+~?7=rP3+']]z{Zbf\t pY1)?@1BW [(41`OpR- 2ΪY~,|qct ns2LAogc? Q6!lx0ix/4=$ eG(Y CAϧa&M}r5x09Lz&=sĠ\0 i}O:C|Gߘo4s<ᬮQB Eݭ i ]]%XlJLVdUon/jNYu:/ 7]߫ J&1Y"%@ ;\Ԕ Bk+aG]>swŭ5h$s :MuӀF6*d=:qtP6B.ϋGR!4̈ONjdlCۦ9bWUl3g@Nˬ#ײkcI$:j'H9".5"Wc.쌟U[ -XE1Z BAyª-'pGHjL8UW^8T)t{> =,mP0#+-~vFԪQg-M"w$+u aDÕ/$6I ?\,v͏|2y+ģR4L\"8Ns[sW5LgEV4*""P P_m>L@֫B5#GRgnTȗi[eRɎ!&NiwrŐ޼b?TD{)'Apq)t84#l; jo4x) t9lAI#aGbp >U 9`̀ql9ٺX(S*"U :_H:9"``43)`tļ5UH;mcuʸX%Fqgk89.>bKbҭ&WW!̦iÓûQ':ݺ(%GY,m)0Dx*5XT=0Hf,xq=Uan =MWKX"FL,]L&&G|m@z/㝲. =xEd^=/X8X{A[E߶:= XM!WFv]M;7]UhhYK~FWtV9iZA%3b](/nޅXll=UHgq.!t# V'$gkE6:~GwO?n pK8&b$J2k7 =ωL^Ưz-^@Lj>C[8JpZ | ` Rه#zj\MX?àp(xi,D[%t#E`.􈽌2b:\VC7f Y(6+|u }Y;"?M/6;ܫ}S @T_+Oq!{lJVq])ҧb&8<)76F̣2BD֮fY袊J=z!_X1ճZQ0K+ [*wn:>oGV/q@e<㋞v{R4 &Mu~FHncQZmE3`+!pMsggmX/Iݻ|Ȗ@8\)ŜЙA*zP33)a" )x̜qz̽[P gy*(D`^0ZvYS?m-rd(q52U8vAo}2^'~jF\;-?Q 43y?29<%/3U]d}\=kr'~v3苮4LO1Vr.ܺՁ@Ӱ4`\Ȣ="vǜQM]ɔM3%1sZ 9&kSCytX`n=q%*)+,'0Egȑn{8:!ʌNTͮt50Ian ]5/j(3&|A/ ]6^(a#sd}8:((Iz^nҰm)$2`B˫NzMI -t8ጘt'P 2`mJ H?A>>Nޮ)1-e`<Zӏwqs<>k9ڄLt=jZ;p4f9gc/ɚf%Ln@֘|F}a{A^.<\dD1԰I 9QK9sʞmbg1t)d(3X9$P}%sIY;AsQW4}?.kH-dH8v 0jbY&m8 侁X ,-Jb^ Jb7q!`#.ܺ{zEEr*8,RDJd瓩 Y]JsdցF7jnqpҗNWz%)EP"`aJƮ{HǽabR~ot'Wd/+,wo 9-:z);^$Ql=530/) +{-HfU3Xj{FSy {3Q;zKl ~6`u2 ~ w K, b&|Y: ݨD^"8(Hj&Ufמ"[ R{6+F2kڄVG?1vr('p>{ics2S.v G)kGXRF'< 繓"YV'n4燆1 La8+klq)^=9VD?=iZCov,)[&Cg_0lCA1ԣٜI4ɷ`/Aw<ڲoT5=Ɍ>I\8p;)ʅTa{'zes&0#u%X=C98ݰ,>}zsG.. u |w'N TYن:6d4, }m-7G$$}AR!$xOHɸ՞`!hY-mѦ-Vc Ƹk['~'9)Cu|@]|d#XcNθ#5SStܢ[0>llPr,C謝(xOZqMGo*;[7ɖ`QX;<_.Ǖ5EOxy"g|/˸6VeI 8&a#+{WīKt8ꡫp"܋݁60A-ɼ^Z+?ID2Ekەi*"|xkvzL1NA~RCHu*۵V_ bWG" ':51v\[VJ5X]`SD!srzlE Bnct8h)xЎ}[cVDunwJ|Fq3lKBy.49 ^ l '} Gޒz}G uv LN-U!5p(ٕwXxk2]ٳBQߡx`82O{.?Wx` V%9$@pt?m;}cϘK|O%Ev>.#vf(ƨ'nVƉ\)<ޢ#[o얔%1 lz831 1\ ̘A8Χ. =LKP:=39̆(\tѺ&g^dp) H Hh_?c$Qi0'/v} s PB7b;me]VL ,Kƾ= G/0 j20/oNzl_n&xL 5;Gba~}2qףizI# O($%:x܆~͌ٛ+MJcrqtb+.oTIVx(p/0EBU΍;94Uk\ي!)3 r^$xiK+ư-}1 ɶ%^-tC8T(ei>o 4"|$[8WfbD4 2Ő`Kҕvy9#kGzU~́Vxt8F,?I?b3Q5bƕ: 7{0DzglWRa]E]O& f"!!y_V5c/*Qitj,2X7 1;ia,Drg{5Ӂ["T7P*a 1j ﻗ!G"W+2<+)E>6zM}Bh),_ vsV2XCW6 }4)VRazb@M- ySy94&cX]rz\`)Xgc9Gl7{KT3$'B3WR#hՂZmY9nߔpxwX $ |p㨱ȯI┮ ((n!` ()4Ln޺9/\:2)8r3'߉㗕H#!;3@>H' 6+6~ 4ms`e}h'1w`϶é|B*ƏB0a=dӔ84TRt\t{fC=[-]f]y(MS0u 0&a9y?&E4 q:s h<@ /6pVA%h;mINǏ(KVP2;SԴA"Hi!堄AjYY1/B6rK%g btҪ ]iD)SN.ia44f;_shit")F:Y4kt!mkeA1k$/|BiHgf4I1;"І-zf'9'.B +8+;c18'6IGR#6ݜ6E}#q cBu,oDX]}DYZ+]H|&7*Wډw@J;M"w0AQ,v=ʨ`Vj+2|e,;Ԍ63;*e0E6z2xC{/eگ}?+!爩YG$;V$`Բ {]υcf*!0Ak- _h>b4C'4r o-44cFxF!HZ8e|_أI*퀬g)ڞs~q1?[wLLUt(Wn3HC(~M 'H$>Y T2~^a'M4u4o(!]J] 0 A oaGq2i. #( }P BK [9Y^M.?"&=vx/NE`0GJy-$;Z|'o\ɺF{8؜8 q,\1z3{)}ZD< h̗#7==լ( kY`/ƒrhT>ָ& % #r_hp8f$+ g40O ά4*^@m2=@A<,`D:(Lm̂f9%.wQՐI2ץ#R/9TS(7e LOk_,I'~:B&yIQ.k2خ$69Tϫp'lFZ-A`*Ö&L0qyX/U 6.^2qv9hzdN9^GO T=z#Bx5Y~c01n)8Yo,4}:]||1Rs<0 /8< @pm\_%j|#K?ѱ ƅc)A t6:mz<-+EEޏ7's vDfJ6ry-K깂oU:Bb=AtW@"ehj aVS|M Q-"* wBL~ L+(܎jfd`XF2L*5hjio9o{I>,c MKe(۽t2ˏo%?M ރM 3R{ksKeB`Jd!?S-Y8>mdMSFK2.&IHc7 W+ӽ>:0n5R[<(|~%cHm"NWI<$p]ayEYo\>MDՐ֍&.:X]ؙJu` 5L1/9qH.Y42N<qF:MB=j;?Gd<@{I1s%n3lDpf"%dY(Њٛ=nNJ@Uk$k..>S2maM- bH]j-:3sMZf)B(OwSdi&D%܅_v5eaVR-FOKQ'4ce&9W <‡[qӿ̊/-( i8^#-9Kk;$ܞWЗ蕁ݵQpEo%-Em}9c!U#\VK.7D95UPp} Y[".S+jJ 37]NF#gf6bYU3R.Bu6ת@"{>r/p!+?1c:8D;Р*N;5_a>j I5@fdT.-M!UԻ3"-~S}zE b4! )EqQ`Fkݓ&WzM 4K2g9,ICj\xmЅ  mw8c''mD(s?kbzMHeT"f;q2fPk{`j'{ :[?@9lS| WIҢP]-F6AY'H(֭ۆ\ ?/1 E$Zr¢Lh&4NNu;>8&Vx'ϟ[ /8 MXuOQ)%&UlV1(ÇA:FhR%tnv0ɸkkִ)RW^bUZ' ! <~S#~BWzSvQF{]ug5J%](e.GX(`oԥڴ~bݧS/t2>W虺n28˺IOb7nq#ԑ(;P?614pbJ+'$[$k$iOy=ȁf D327.EmCWL:"@tjnG973i9$ pd B,"M@b8$íwtO+Sͷ*Mvzc"-4oQsl#gleuAITHDj8eHod{_Iɭ B#a>L8[E;a#SX l,^:﫝}a _^O:hz7[RubtsjN[/NqӒmjLo"fR.{W*lQ"2#A +Y48U~u*ڬjuRJf5m80Y!&M&Ɨr޻%'_F;-}`M]K07[8e#`,RS_Qm%Ae5+=9?V_js;tRd7i;w_:&COC,n Bg=[C U/"T7/J5tV^\w2L*%;쬽]N# VS[p:0U%'-9,@k~(m@% |.0^)r 8ntE9OK$۲U::;Q #r/Uidȏu$ `%)̫u`ZCZ4-_o3{GR%0--q8}ם%`7fl3(@jΚ#\M/ſG^;B@3 ,&:6,YO7h7p$S{U!ybB ?2aÓ-"-]G)㗎X~9xv+"c,=o*[كlH6T6]ύPfυR3mgCL!{H2soC_T@C'9g'۔"q*ϢKwiqA15HŰo|A2Kt?+(!2KUeҬWz&MU^s)z4bmDp*_[p3LsS}*i_Fz[yq;8a ' PgI'4uCwŞuWMYw hJUz(1($1dRv 9Jna_(P!Q<$^sfj8R_Q6E!;tP3%5P c&偌^Vj$X/Cd܀=л&x$_k%mG-.:奄p&b5Kw{ōz#r7,$}$kT. BT6qĦXOEw#m.|9\iUꐄunAlÅ9 1!UKrxIB4&^C5#q>%`O* 6ےNuR€,U .xtUdu3̒7i>g:,8UpIr)b-Oˆ@O#j^ R c~3jb~c+v] &z@j[Ef; !ջ-63jX{`,zh"YkR )-5e5t<=I" .lk/gh yB*E>EǀN#nuo5mj t8O |AV$| ͅ{! F,|#N %Y5j .K@g) MN5X7ۘl qVnoD^Q4',n2Q!#kT ;C; 0,  [B+|LBEѐ&"q>dH[Gd"Xbaf)R50jc3Xjŗ;F<"/~0W3۾|%X0(l&9=ʺ\ln .n<2ݔ/ })@2<2th{6 8z;-H9{hEٟ|!bW,6?CM,%69Z9jBiœ_m`w.ǰDŽ@|yR@87Iu2Ҩ8:|V-RqMк tCM$7l } ׫`gbN3k' Q`-֢E\8aa)F1Ne8ƥኋ$@<i>oJQss#7m-($gT`lM%PP, 92mrā1i8G ed7[E#?'~s AlMSb("rW,Oeq5a^L (̹nF+lwp͂Xv_(2?(j 6#J&&s"%n9Y'9$!+@ݯ0Pu|khIzH0_q8nXB*6=ԛ+)[BܘM nz4"&eA:; ]C,!JH_Kk4D[7E)T],-~J5m5F9h򏅖3Upܝ%NAdZW;Q-/$y> : SgQ!1m%:mauXM($SPƪ ,j=HoYUaȹn`2$SxkϷ +h0k9%:h7 >>H3k=~A" D$b['2 &9ѽ }mIw21{)ox XVFfQZLf=?a)En0UK,r]Qo&6h\yd׉|-H*u^7&vCe+% 02"=MJ9tR6E~3S"?v.jXX{|Jk:aSaLB.O׳%NnnC0hOIħy_:f%w1SmKŅ$/6 -FսeI.FI^ b-C9QgKmb۹۵<<7;/F9U*2&r OD۝W)>#4L0R,bR3\_π'CԾ,%F &w昀+r37a7W t?5*F (_0[GzvS"QdC(2tw1o ʓ[+S%>=>Q{~ʿ#6`Tdυ/R= wq6vW#"+ x)ur}B'HxК~ Sch-* sD1:WѯALKh{19W5ekJ=^`ф*qkV!:jƏFMWv&[/wӂu߮$)  &/oU@2-4f3S]_4tx}O<}w55΃h| ?g^4wA#!fc\ՂB!(hOvՑui@<#3Mgi]xǢ2Bc@"AJzP˙`mn!tVyK? >hU1$iٻs`\7X+'Mª=mjj&xsڨ8j1rH_+Ռ0Vl'S*n~>g-Xr;X5 gszϐ{&8XOU2uZ0/.iicy[,i+tUBBUrwC1<]WH!^,!o5i2ߧ*j%<5m#,ZwbrBãzQDVF`/H#TQerw~SYMW8;Qkr]) /We6%\h3KW^Q:\m?D.{>(rsBlmhgVN9A'Y') dd.g5KpK#%$q/13p }vl^ {l.-VM{`@Pܤ}hԡGu?a%z8#Vm N$Ŭrc|#DL#kTk(mWϓݛV,i_w& n -+'Ί+'72dPx߯䅸yJ;ř6{x"&q"d?=BdV[]{X* 68q+o +=̒ +rv5Q4h,DS@5f:ٿ~;j2 !!*SxS!ϯBx^Jq?hZiB5hVh* [S\5N? Bl4mZiNZ?i쁃a ZqA(vCJْOgb)ܢqJgQȲj`+mw#e{]x]3N` 3OLB|=;0D*/l:Kp <(xcR[] 0tV'.+Pݎ=`(OqF0'5}G#,LxbvbʘW0yWwTy9/`SH~m;=+nj+2 mM}n ]o$E&V$s 6f?(${ɠP-|MB~ f.[퐎8[;EdEdyn@e:FYYrŬD÷kOޫc$3EsH$o9a/DV{F֖|?^-}ˇ9;u,=;!Og49.E-[ѸsAŐu1qUyL#DxgБ@Mm ص_,.ֻVjǀD64Fo!f N췰7!e5vs|`BL%r"pjTeʸ0SKjI%X/+ )oحtE'GV..8Ub6'y%p숙+o^xFsLõ!tcUB!o.L'Ju=4#j ǘ1!R]ed4_"`Nhw>~)4/&^he VbB3}ox0a2T+;aT9Sv}I 3j "\ |)9izܛ (j4[Ʀ۷Ds9I %_h2qwe>IG5? 37+P?۳J d0LG5'h@`輱 YCyv1"oU<#,Sd4#=5ԥ„e4oϾ &i(XI{"{eݗH~KjM0p1әhwp}\$*E*a<抒w& # RpJʨ*Vk%-wp,& ݏ5NBRu?7xg+/)8R0vOR&RE'WH:ŐRc3މޱd7֨)x N$btr;U,V}N`  A.13pQJ0kUbxlηpYOQ9|`Y.RUR=K22qѲ80#>8$/yK' M@%΅F|,NF-{)1Џb PXAgX;8:Luy9,gy=t믕2 ^A%#H_cXH_f[6MQ;PH6]+7 q ?<%ڃ56p]hT0BR-fEhҐaR" uºi|Hge>?M*MRts)[%xxs>\ Hr5p(2Y+f8'y:4QzmGs!L2b@/ݵ?V*!q:؆HH)9_z_{TthHYNI^4D;LjaIXMsX Db7:X!5)@ #.(JzH.41Q(lf$3,֝ڹ$#hJe2ǔ?LB_dL(Vq~N?\',Ow}3! \0Rg"_7z#gw.Ȯzϓ5Rh Ϛv'YT%@zkzZYBB΂A20&ֆҁQe*gׄ'l-$ D%Пe F@ 1tn%86>*/C?gHȇe|#D )TTO`&'fZiJ>!\,Qs9Dj)%bc@o( kxݍ*s7J9W>V^喙BkI"LjM}Z X;u?7^Q+DXܔqJ IgEG6w&63*7 .. ,'\)+Ulbk !D]L(R(0|u*: N*p3t_8Q)4ߛq CG4ݨoC=Ak',2, !> WKb H]0w_<8P)Nhϭ7۹^Z,E8TswF31)4?uJI?g ?DM ,z,>;ǭ nWEf' jHwڑY'48S|a$p 9I?1ZQ/qAhRy- M?X̏=u钸!Qk'gċay&ңIXoxmxaDi%Ȇ1A9W0ƌe[.ֈ9.zh=! i#cjm^$yC!/F}hvͷR|Zªs-tX2Ӻ%g1ױsBtU9I_YaπJk&Oh]J h#{ƷoV:k~!]b ,,br,xDi1s7GǛa "vK7izh"wL:ν=rkgfGW++=hA-UNFI-D?6;f!&nڋI[ZM*>2.>H\ 2 +re5֯<gJA4n=-0"[Wn~%4Cdfvsq*rI>>8od9[,9* i GN2 4rw(YxEQbR NU32A0~?JrOZ?;Q1,;??)&=$}ܧcqXҾ[J'EjM)Fj]jnIvsNF㩺1WŠ}4I+1J/S)_D\T)>t{d/s3^iY`j{*&n=9I PjIpDڞI0M  *B:N#et.[6֐a\<-p HZ$56?Ђ#o5%8 (ڰmOJʧZ'!C,l/F\F FzbeL] E1qi7"H;o*Ml̺]O+˾b %+ Z>_a)5PG+}n`E0xZP.Nbq9is%6SsnWmt1BAo%J4_/ u7)s$q^Ɉ3~WNr vx@OqjSm vS]")WblEf0KTh1h2k3iv*/Ƚ)+)@/}v_4!'>q" c7::Du3Э{T7ہizY͡+(<لɈpS@DZ?$)R@j62KE&NLhP?1OmsDO%l.|E[>Ow*/AR~Q$Qn :'#UuUu{Ѧye- %}DlINg 1*k6ҪRڅVL=ioUG!K= bêsSϕw3ơŁn)XO&ztB{UsB8 7Ws./1$YҺ4Aj쐀RĚ;7E4L“Zv|i%g-1!GA_z8qt逬%. 'q~X/$Xnt:x{hQMk7Lt P$$VZǂ]jftC!E_{Eu$5nD-0y#~uzQG5$V]m 9+nlLn֓#HVl.ͭ#8ʫG{ Ix, :域A,Y.YךWt\&鈈އGH7&=6Wc@ș_rBU,ͺ"#fp-m?;mS&%w+4}9{6J`uI篳UQڕq6Ϸ@BQI.\ MՒ]l"å5Dh|&9cmauW*4E$VBB[0SUdym5WRim*5quiZaa3䕵>dva:!(cNVL+']b$gTHz%)rkȴvx=!H4P-ځin3>m0j ok`T=3\(G%s ቍHX<WJYx 9w@srmj(YZn,~vpK?2o']1[Jgԉ 'J˝`?8x̠ %6G]Xn"'Ɛ>*I7MC15FF²144@H 2j=@Vr=R( S, -4O?³y(5ǧ&&b)Jjh7P8"v`nBZ0_aBEdu2Tx>D'Cq<I )ӟ4MQ%$lo70iAo{`/N|8/O|-=}C9 Z#9{X;M.|6yF.*6dxMw!$au:P7XBعC=xWfD ).e E$ERN衔_?Uh #wt9೫E!601弻A 5u$נV&0}}W !`z- Ic"煯|&WFNmv)8XJ8 ~~˰ wV}TTQ].#.#z iAi'ed$H+W洛>hR/8Dr&!6sϦz!:Iqfl7GG4U["|P٩C #}*HE*uYjj*#Oj"6ޔk54 "5ƱĂ ] X1a A55#c!e8uJM .4~yGQ \)?:USa19ݗ 4l40qg=ØȈYb {MM!"ȓ>_Hz(ڠg ajغ86N(7e]23 f(5SF^2brE&a?EP9aTTQ:{_}6|W`X'Wyi)XwfW Z\QD4\85/1l]3.@-0峥SAh~> dfZ< HqW>oG4e. pΓ\' 59wqZ+N tY y ́40M,@0hѭѯq~X?v =$MHs\e g@Ohg-WJ%&zm`Z(UV[р#5C\@/CVT3q-òk6(љ;Uնe&sWdV""@%CK+b$oO#s>䡻j\+.ыc, (?M]E364:ұTcs>[GPz5ߡ`$&G#); +G?kw8_ω+6!΋ꕆd{ׁ7C`\0TY*znd;=ZMbTx3u.|48ED%fXp]k`@/悍-!;VUfn+n49hxk{D<[)k )*f,J6 A HtFU- 3cڿ@!T?Im)l51|pGO <$<Vѯ"i*飏[JA J>Lc(K-K [+Dus\: ͨ# Ÿ{2](26UERp/Q~lT?bynAUkFj=1CԚϴp';jS W*F QbL1(̆6W{ u>@Iqaz6={9?tTB6Imȹ '=Ih83 "&O钅:(0a[l*%0-"yѣe*I2Z@"HG3u.<\"byZmxtLG@ %b+xqjg)I_㖑"M[YK/`; Es755,8gp1l\vZBa 8lOF^2D9ҏK6)#اm&㑗NUvbdz ެsd+Ĩ p\v=>d*; Xe}6{)!ifm0~rsz5"s^xPC9ydGZ*chv;ris5b$ ~JEǼ\%ÞcVMh!"e]Qotlگ`)y?fteD܁4p&243?i) [8Ş* bi]۟ @Ob[C?tq4SvF9Ng(٣:2PFcArA!2S|L(>%bl>Q:qn8?M0=!W]S=7φ!sd$y#'!|' 94( Xp$HW1i[qP'$A/PEoLb<)m9>?F'i#lůn 諤0&ض^pCuǶ[m8<0у᲎dvMN*hyrT-'L5d<4)3;] {Q{,&&G!<LAvp o*AZ>&؅** Yғ0 } @2Z u?ͯ+O'4'rxcd'nh_X&ǶmpGA{8 NV|;ݱ BwvpyXLڵ-)]bk[}iU,ZL iPcx3z]3#ya;+MܯBrMÿ]>+ 4lFjwJ~v`ӛ! /u6(BGij!{D2R FC[T%{錠Ci;>3xr T3,XD pkE.E'@V)*n "LVz1+}3i`tf5fI М*w,\=fb;..V`?1{Y&;90bJ!lُmJ尿Z/h:#k\x&oCR l:G$t/dKfcQDž q-T>^@s|W9KoN%9RJ+0UmVo8pQ#h9gWшv'Qk : s,FLsfG%,B AM4Iq|&ˏ-@n7)Hm2 #X5߹ "3YZoܯ0 8,Whf٘ gF+1M|>Yl656rpwd .?tYbiY "ĎL<zNDMK*XuR6k6b`q85nϣ,̃;jO]]!`C! r5"l#wd2cʚEt+è8)*Gb|W%QF3zmwܾ E/e]̎]Hu9ckɩ?N⑕(Y;_ ?yqOI>p-{=$PLޏ)Np$m[!Lcu).5es]! AI+jw ӳ9AehЋ m/a[B`J ;c$!TzĮO;u{9R |-(C)Xd v#;SǮg6P7&Y8Iɹlj@V6t< 78#p<(v}V9"ʏ6E,"K\$l]H$H5+@!3Rv7ߕ7oOc:;M{m4VBAd"W{Kch|0I\وkH8`*-;<:\ t2+yFhU5\H51AeمHE꺋/+[aU!sZCB~e Pn;qE)1Ӗ58?$QA TJstΖgz4,QD~!Ҩtn06A` !Uweci.-d,˪ CJ8)iվJez8=} ԸE)@3ENVBLCnn'넓y "e"R7 i@ձv&f8c>% (뚵\>w''Ʌ:MJ^M 2xp;' D<5u{ꤏ>mg ) &UEA쬶'IYf|ANsȓ +Hi+3GES6_ke NҺx6ezc[C61u pt Y cS|!>?Sqb⋯WLQNoŸ2C,&qW^IGO~S8S3*:/n ?LQl@<#(@5UP#IN6lCfGLY+2 $kd!,*܁C?DՁ6ޔ[)m*eǏJ%bí>" bôs2BtR~;޹3n;4Y*ѨT{2K]UDfJ5M9eaͷnϰz5ij>ΰ5q!#Z I9H:IJ]N )ܬph)>hH1OoDcaB@4 lF!&Am5e\OL0="%{f{^tR&_|HQ.Z|v'30&wך0m湳aȪ q]%{<*`>/TjgZL&չuqM;iTĴ@l15 )`5/}K(Ӎ6w汊iPA}"Q3xqg;./$06a9<0>H &' %z̞"%.Zn0KbUi.Y5Fk9qu ^+qQn;bk,T:X!  g 'F$PER; B$)CE+di/.֦LR-4TT6mZ>9M`@8.l63CDW\h#98q'U0@fhUJB,HZNqh<N@ 9ajpZUS7 ІaF1H|"b_fX"ˏV6(`=Zb ,;9+3lt)U Za6WImw2gQ'|CKQ}54bv"a%HHDzxiNī UO9S+ :-{`.y0Ca\L*qv8)ոg|aWbs bԡ3U;SӀt휖JU yE$%4 +J(g(D{%@X]!-kNWun4B7N՚.(B+9WO'Cr!3QM:r:Իiv,#1ԎDrW6߀%1 *DXlTixul=KDjaʋp4=%*#ԡkc&EQtL mAlJJŻ/{e9lڟ+pؚɑ2ǟF;]5-X~ߪcrFǠ Jr}%8]hO \\/_.ai5M<B]7L^b] t36:&bAԍ@ vz]M]$/JTA̫ a@-K)Fݩ4uY2PWyP#498} *@ 5؊7JdKN#\CNY"+Kő57ކ ,3Tjyvu"Xt7j-E(O7IՂ- j Qb!^Q"[a68=[|R[{{m7g+r::n> ۞'_bZeI 6dDq1GHWkIX{}x0-ۅ"}5X-.ڜVQg4= *pp=`"zDw&AF5,ʜ_&f<ӲU ?L!\& co-~ ,5N)d/jKHyUސx6~"4o_y@*Ipb/͋- Žu kv%tD;{-؍r(F`.4Q pZ9wyN1#2} Xx:A 1MWҚ?nP7hO/W>0%6~À'J$fB{mQN|n&^1rn?*ӭ O ta %u1Y>ʧgO%х0Qƛsm eA#\Q~y놐zşb:+,sEr] 4*Nv(G;j3.7-Whk,h`Jy c"0m"lBF \8#ŧP6Z+|T +6ӗ |Ʋl7Uу.lċ165">O-»Bcr'Za|J!kޜc︲Lr&qt1Vzہ*DR<+g_& 8̺R}bXR4Íj{[3inxwsE 41EȉǙ$kVKxU )}V:l9*߭eFk`.jLM3qv#zJ ~K5KG ,fYo\#kws+(vK3ìFyFUP6246뾞+'H6BkgDS>BbMS7CVn^}-NB 4$'ɣ:9!(ln2Csp A0L 4)rHd- S6P(= Y_T^ܝnlҷfwBZ9&qhr0 -XvSE(pyR / N|Kp%SVl8ZIg蝹;a-/fDu4)v}3X؍@T% 3O?0S\]d@nN].)Lfμ;a(&t}IѶr5DS:?xIV:=dٗhN"B g t$Ow<`&LϽ,⪁'MI -`UKaVpCbp C2P8onUV/5&KJzM=FiaR# J +W|\ࠌ4XqD,m[k/!A7\O:$Pct ݽxUs"O.cHm$|4rU"+t+lfI!.u ݂Obh+\ 5TQ6D.|*!ʱq}j@g$!9$5.W <yu<šAo*Jny +˥d6ʔқ<` 5.E˄ cdaAKc%=vqwf/х'q&)$\1g tMU8;tMFg1 4d-@IIF]ߊ= Vf*-ͤr5,O쮘&k53:TyNBc~#>0m (wׁ!!,QN<<qA0&1,<%Y,ujRÎe|p-r>`[Ka/ 0?'t≯59lݣ:4~'+cWs3(cxj2$]{j-v_r<Z>.4 nxDw`݋d*]9ad{k=*J|ԡj~a.Dx#9V >ZL]IJE^k9,8" Rb5ܜ06y \I*8U(s a "^K&m#ŋk QiዪUڌ:pP +.܅Ho,(!8OZ'.s0FI K62SI*Ҭta\i b35쨜=ĦحS?k z!d'ù^̂P;vN=\u)}4hvBɓ_3WSN4m{ /Ή+^ܒŻMMC Ʉ4YJ .:?l\ej6}&9 Ih *4 4kC>',0*Hh4A>AEƄM3< -!lCI(QhGҤ0O &WNxi݇t r%BYδb/mbԩ$NnS/.0{bw;e$ CQA0^ @mU}*%|8e?<3Ȫpu.q0\??2>67 3pz,:F'SQ_\Ab0FplK$`#%w3Zgd{Eg\ۡM"ۑʍ)^Mv=WHsR D+wR6=N _D蠤 mZqbPܫL6Av1_h*F(؆=iН!mpw}ٷBjuX2DDA* Ǖq%i"Ů~N"&=F4gg7/"5;-q8f0! ˁe*ũ48RMN|$C)=bD<Aiu6 !'b^3fTb $+hT-X=DT< HlӢ&im!6!肩xL)K(ZKpCL.=x)ڟ ^2pyk^LTSz;$峊܈mVGy >3Ct7v~o։թ˧"Z'@éyTN^\LJԅW01{4Ru/'b5s_]Ign"p.-|= ޠ3}XLڍݛn&4U%Ƀ`*Q@GS 0.ZXDW 6suПY( <*f8Ðj(6[hi5pq%4u_teDC)-DMC'N.u 1Ҿ&Osh!T:{CZ^C7xLyR-ц CYk89T6ߠ"(ؔC9B%6meu#$wdp_#VSqu?4SrbݕHL,,M"yJ,SOh]U;a[' 57˦:!<04"bT ~PA\cj#L|Z\~*+;֩K@9wGkD,_sWnf᫜6%J_ȃ:}P{l!"^7$$4Zb]rRHf*5B_m߫-^;tMg_[T5iÝ۱kKhi9RU!B3lR%Fav 2bvgg)ƀU&Jc;)T4|ddMW.Xn|'Cř(! .}} -Y:+e6 si(Yܜ9ixUil6&HC0Lσ28T2p\*+;#D>X(T<ä?t&95&n7psfF'Q//G–w9N];I7Mg"gX1?&X*s|'!W5f @.>:ݜwmuVaM`S P&e9_d[;a8hᘷT0YZw{v!yFͩBm2?2$)'S,-2ӡM“ ξ=1w8#%Y)se_A4Z^J#l\o7?= >q,?Z3K$ "%VLIv#$7'En@yV&CJ)׵/-x@ HH w"qVfW[춱pƓL{) 3+t-r$ 80 ZX'5Èh\ sCS8Z@A!j''3Ѣ OT%yFQ*ccaolHln443v>p3ߕU!DTK O q=NLW;QU(SD&ńD^`rQ{CGxN8=5c__`L/m8 Q C&<77$9`{rN@&ϼMn/ SmG#8L+ol0Ĭ;. pa% O`6Z}μTϮ[pLlMOŋUt1!6K\ T,)ZLq_G%c+* ={*s(<#qRo7nI̥^?xvžخ>E_Pp&'/dST|wZ!Ρ)Xw3 1:=h[2B A ۔M@',k>D&XMҪi gu }PT'oY oTKel:*0{ z 7)p^ET4<-_HJΈO,g"0C#ڞ<ۤ@&6W3kckF f=/-@uTE<5F4XĎ PQu;"HtE;o!:~2`w4%+#~J Hd?>Ӂ. ]f#k@N H": zkЧۓ ,32H@V~mU$Xđ?[Ћ, " j-5vtorĮ7j E{8CɨdZUI:ً͂Bpl{#2YxGxyn8y Lf)HZ,9epG=]y%V$c׫`܃" ߿3p7?&LFkw>fkiggW`"eo FME@+7Q@Amx*P+> >AWg6Dc6&_5$6AZ'(S_Ԧ=6B W.!H01'wM@+}-VRyIL*}ԫT`6ua!(Q'[4#n5e4&B<#g^(N)y Cͯv,C673Bp~?ʻ>1ۏBPSE VrQ& X~^ϼGd3$=¨V(%oP ?6l^@oXnRl2B/~ϥU1g6g?.lGb`6›-͠d'1"{+&òB\8q=1':908GY-Qt_sMbA;=nX#~L93OatEx&nhp@7a"cy KV0,%0  ƅ98M=<\.Wq>b ț#s.PQ"fjs%-f(N>znϊ:RE.oyS91M*Fʕh,贃-I VD:+#pk]!QrMhs( $6Z&tS bU+aB䬐c -/QhPtG"rvR4S922 Hl>*Su#+˜& ))DWu, "yppK3g4?R.]!7/+Y tL Yo5WjD";6N+2h#H0evjUE+">">+,q<{!ŪƵ*ͪcT6wb Z/*$wU<8c5JK"`~RtG]' wj%^!p=A*gQYq")T@F5v@*)Zf=2Zv"4U}ihYXC`ǵfB)ϕ @jfYD)pnT89c@SvB(LTp`C3 Ji|ri2i8@,h nnmp?#Sy6¿ DzF'%,بIJOBCYFqu17u+ʾ/g;@ e޼&>{2C[>Wn:}C%' H( 6& m 2I+ Z&݈C0^nQH8~vĪ9*mppԱyi6Gw8ZfdlN.M`\X׀e|DpF}909ʊ݆p͂KOƮlVoD-$@<+}픨L/#Ǧm^tw% ڕ8- 6J({ax vQaP8a.Y켓KᩭeVY5T#Ah9o0(x7WY;~4VB),Qx=2DoYʸA37s|Kp^,fFMKx~3>;"\Mu?Aa]?q^D+J +T S'N<{W}v{]5ZS4SipFyiVI l:!p(Aa(9MQ;\h@֩0*LasG%Rซ} g&JsK87FиtA]nkƃR9'G6Zض z5RiIFdX![1Xgwp Н&F"ۗ}2I=zنx({9X%UmM ̿M&iH}HK:H.W)ȣa\R//R3)Ee=>7 F]NA90ؠ{ ?F"; txQ`E<ZΆj؋+ BWN. fx!: Q+hn6FV#\J? T6Q!R=A"+^յl-4LݩN7j%Fhi)*~6J8ATԦ!ĮWBMw5(5(|ÈDH4:vɬrO!9!^)\jUZ;\O[#j)7K_3sZ0ʂ( 4#V$2D3Yz3^Qkvq rzr7-몀{c=(t,Js`ڄ|_)ͱ2PS $LЧs'  ۻ3T@^?Z4ᖏrHXeeꦛGiR4'yk|3[Ү~qBÊgA1]])r[ZM?4,tm: =YRX9#-WhdF&@(dQ0)gͮGllt!A"=tX0P2e|Y6g$ i+d"MnT/З$s^5[rm6  A]M);=.v4rkX!l D(Oѕ7GI5 9% Biה*lѢ=BD8NAH$LA9D b z\'uDž ^7pUơQ-ڟ!WGU3qR9gN6xEL97 @H8tLtZ? 1"kbƏ(-#91Oph@=Eįr+6G/Vb6UΐL9e{`6D!=U޽BCf͸QgZ"Ej̩zUU2!G'ɫ*ք?o*f};7iXbȬ5],k/.a87xΉ5N!ǟѷ}yEy&ck::GjŻB¡lC)%]Wa*;ĶjR3GTj46ě76Nv};¡H`ެ D @bD ݎ^3ZYb(cPE5{wP;|6fqvN:03zn<4ڊa*d9JDW TaI? ť@'Aoރ*6t 'O6Rz4D6R5DF1`UAe -mXW_|>n[\UrH0Zǂ|edSv ' rt?.=0y~Ͻ(=T*0̑O`Qnz|WB^BrLu=1\IM>0[Iϩi#&)>3`͘Y+N<\9̹CC/a 29H/o a{.LG?TyT;pٿCy-`e(^ Ќ'K>% ϯOظ(8VdPpq#[:.'b ycr(_l}deM|1:X]hWZ),hGydsc^?/ Ɨ_$tB3=ę=P6cǜfv-(% 5̢d&|" ea7a]lF F {w|Ҕů"KG'u:rXYU?f[+'qFR)Ɏ.sA*M26{,'lӹ=g):o0U!SE,GH(_CY\ڋ|*W*h>%+.XZrpw{ {*Ю5t4pwn4~wxG*Y NBM1 i!LA^VOuo0>} LY)6Zj:ϣKS|q 3W"3xas? s%jgM *؀VRލ>Py}HϮDA8ja(ubz$V13%XWCڕQy2R{PI..-Ԉ$Q5?[?hLa<܄!o'rȏǟ.\)L2dW)J1кø97J3=m= T09zӴopF&4i|X sKLMKXM(#0A/o[nMe/^!a^+<}2[#?}!('lw%vϲ&(0s9g|U/&T__0'snd&znHj&:ܔ;&>[8 Em0IAҹ$zʽ_ypvr}$O}QG-KF=56P 8a\Yb9l_KFaH"_2߇L C4|nyox#G7Wy֩bӢAbf,ر ,V-kL: |7N 80U'Bz0v5GK-"I6G#3+ϻ[Y!ҝ^y[k+vêرi<ҦGʼnCE2bFDϹ6iBj' eCL6>_=l!4"0hEB2?TldfԷ 'G)*<Ö5'X5itq5F9~L|_Y@tXWf!^ȝ_aov:S 7?/k"|1)u:7R: hĖf+04t"~DbsDGҬ;~Z6M ݫ`;G ~$q9k (8JZ_p ޘ2<-+@F2K[!\1w̋.?PW Ϣ?y)_wm})oRCVhez'SLtz7HS\\* 'cl11'_}4f h3.0|3>O7>9r*߀!P} V=Qw^&Nn8 U)% .}ݗ650x"] \Fh3ÒnyO=c2k^ Tv9$a'Ae. / fxcY[R6$m9q̆;o{@V|!0ArD-3ɇ5~h=eyl)N@͕8tNOF-`#)5mJC ]#0!Fl 5,|@ W F7:GJ$JB7 VH6rҋb,X[&n"^l|Ď.{28OZr4++Rvuky٤>[pM[(5$=aw<'xrf5996!pԭeAlUܮK27m(*I7hRj,ܒ>Hdi4o"r" 'S vKkak+%30ŤXV0+)ӱysFbk}v3C$/S#AyV]8R#1Cu*9* T,#?R gN"u&l谔R8U4("̀>Wkx0,"9g"kA2x+ !J-ckT(y> 4YQΉcݝR4C' Rpf qBAU@n1bBQf :L S|&ap"/Y=}gSO^* U*]W&{hc8pB5&L.IS/ZIpc /_%:2p;mQyp\>4}[Wdq%NX8MAP]2m=`.qoZppњ~l mlgL:E kӓ8F@XOC4ģ0;$Ǹ" /TA"-wxfͧ0+;^++{"9!JK\@r>3|_e _ӵ#Bios{b\79H,5~ˤ%ޏY3e>@BZ(H7</O+ 4?&h 8-֐"he#6 A0‹_ u+}~)!?hwNR}63yV K/TdD/Gg (qS"@J,ހh)~{I rM*23!]aJ:o`1`b654rzx&|ҹ0~ЗpEܞa|A!GhڼĽV`|)kSKX,e|36,883WHkw;-A#Uqz _dmZyF2qIm /9XRk*{ (ws;JzGt5~jQ2JP ߀]JY٩)RH%o?vNҢVrfp.'jYs[mw'"K@ h:ͱ0PߝՎ1H+h^OIgAE<:W=U @ "ѽkN1VC͖&9*bF- N"5~,|e0Dv2r72L ;}Ý7~<+u͉_b?^OJk$ ͊.sDI%u@l7Q;ݻ6F!n-@C/8QG% jDI~az;lLsWª ܌sLR ٌm$MP]vs6x~*p5fO'. 'WSк>DS5D@#,k9{4ǘfVy44uT ^$ٵ>Qe3sFvn-P#BN0ٗqoBa0lm BW8V21~>I'={b,D6#+\L"<7Y,,|,JQb-t_0_+˟ Jp77Z OS];{TG.ƬoBc"0ɧ?uÒ%)8 *μѕ\dQRt7=/Ch T`ƨ}5Yݹ3Bɀp4@|! Uh.ۿ(R|̱A;QgR*)bNj2'!;?%?x4Q}CqA<dALKvWC0aGq \ Q \'=^d6աS-T|yM(s[&3q vx6Jը8i)=3ab*j nvLji! yB ܸJ7 TC4j W(u۽' '2 TDL!(m 2ށRذ[g~dO%U)( >+Q죻Sl_.|wO Zo%'u%茪hG)귿~x[a${0'/0"0B>#ܱJ:=DR>?US")n4ה-&6O9+苫Z A`am /9AP1DcWvnlR8;(Ҡ KũMΔ:3t5 ZH%IFE A6D:9udB0._Hۗ@UWOC Id}^j4Nƒ]@_ב:NK'";!![xtwyNLv}+ ڝ+ljd)qV5W\vkPn6832Va喞lF*DWRC"V 9F<@}v&jq.l(>kȖG#P>KԨ0YD(/:2 z|M䑮$ |o[q)?ȃQm2Se/-eDw&uy'e?4tiax{$߄$ՏpX1]??$bDsyzVZmZʳ =9 aW vxTKx^gˌ&^N9Qdmmm⮏ֿvy/0㉡eAs8/dF[Og;<m.t_)}}@Hߝ~/( A~%V3Q[sPWE^;2ORਂ/ks&2f o5"&&S#:ViX8: te,a>uo'ط֝$$n ϧH#h~ WSK1ΥK--$ g,^x,(A&q9|V& [q[G\قx##/,ٲ 1Y3c#\V+,0xN~/;s,3+ȶ8Ep\ZH=# d)`%N+bn+@="W< &lb%d<ơ 45|'z }&*V0-1 ;e_Opk&}8]r3+N( D2fa>%c#̦!ƭpN6=3 վZ_<,K8ٌCbp+[?(Ex ǻ{OJr/8* =2X'r^*ZN t'9o1\|v4h21" Q~aq G>9 (aٿU:<O&G>Dokye *LH+0ٍ; E4ؾ \5LƦ6<0XkɽHZ5暫 GWY;(b&<#;0IŸ-a)]J:/ʆl^w}۲" #_xŦ^Ie;?JV +.Du;+nQ|Ȑ;JM%N9A]˵yzaS etJ*R!g.]64>#X;9#KTZ-KSG4tZO^p{tVaUM7+y*8(+lXA1uԙl 6 \QoÉȪ$cHj4!O{%JUW4l {U~ .m|Za4*".!cw]+-%A+904VHtj:t7r#oDAw J-~þN'JY*ݖOU_UÎzQ^t!14t|cJֶ*tا ui=AD\H/-SFOfǯJ/b&23&t {TŪ^j?!]//ᙩ'w,፶qE܏[" vj;Wb-xj{gq95(Y{%1m;g8pc؞@dx·Cr,.~H F\ |F }iN+:Nm,D b1NBgD;$냢7rx DQQ -$ ڄ:%%*-GWJZ(29B^)}wW:9nWY#Դn(Sʷ埵35]HS/ /,# b%)h;9-7E}weѰi C?"$|5{U&^8Uq T+#ۂz5qGTc" u)yً6Vȑ4l~Փ xILI ,h"3;zoaA8[ی'7B*ʣ[YmzMp2`DD5@^Flpu}^Tf n˟J!ƥLvyܽ)D}C8W/kS)4 .J]vkFdqOwCST z f4T#&Xi-"Uhi(CA5/|ĸAnwkjC^2Ɣu?4TT旻ٛ&IUş`?|aK>hYX#N#ۣ ';ܓQ92y^o.ь+{F 1Iǖ@vW22 :J/hp6X>{<^oϩv_hGN$&eZuj BTTwBY%d-cr0Vp>EΌSi)kqZ.Af)=9 8~topuD3m!#;<&.>yօS/E$ >]+LSfhԥy{ c3.MBfq6? IX;;9q 3 G8brԑ wh_E$IXO I6˔ŽV-U[`nH+bckieCT9srelHf8 ^k A>gwiTT?gC?#hZ߷ЩR A\Ugi)OjA,1ץjddDT QQ+ADJ۹7~¾>PXjZ%(ml"IQsnչR.RZqN/%3!+%% ZKd'i9 "{Yik5JF/➸a(TH,3!!z]& 62鱚2?k[*lӝr4BxCCc^A?Ͻ岆4D*[a)KnS*:/ڈU$/ "qMIIdƻkaxJLk; )k r |pU\"*-y]ƨK3FthfyUͼ:ܥ .{I6 #I RA"تl_IS"[\(,^ fѮp+(3zrs25 /~L "!IمOж>agצxU5ͧ1B"'a$pck֌_+9" 60u(- W~< u$k1m&=IYgPҷwq7&o$Cd%lU&VΫ͉/9J/BAl ;1 /tlVsk󽤩39CtR%V|zߑ,䝆ko ْT.lۀWv7t:/^Ehh`9P:#ŢZ+d\s#r$l[tdv˪31v}3ߙӬh&-1Hgr=T~A\WtB8zfn-SV$9`6HIh֗#fh1gklmHC28 },BgI) ^HZTAF?7Y6[^:$|-O"?)[ DabG"XAW-.bv`q:r+֮QIln3yrpNSO6VF 3 d%kR}\[#Gt!Пq=X.w32,G#(n*0RL9`hЃ>ϙZu}, 5|H4$OoPME:1/  v'%^oB1eqRPk$z4rhq5 qahe`? g$.B§/ KMXy=9cр9lB}OHtO0׋9ƃ9ނp̚# ;ZlQcoǕ,}xӉoqo&|;Ɋ9{o'8jδN+$֤d-%2*ߥ+#5b"6  &нx.4m\5EW4+Dm=:/#V-346JR UJDuN`56`aF"&gM;k](b,ñǸ*\w@%! F*:2{4&5*f]HTk:NzpE<\x!@?b%"ۡ LKs)zja^eHTQ@VL4? 2si3v7ʵ 7iWXNDjIvt, '$,3K24凭Ma3\w#ig1,>$9@]vUlCX>|z(~^3"Q+$O/i#P&k6&v- #xĢ$0a_FCp%I cTRG u;n<[;3G*f-Mt,'3R~)f &2Jٴ?%9$Qq/%@nkmYifk(q`հpu;w1"I4#yF\u3)%Uu6`lMWDgX&js.neYBDAGHUmف.`D`:dWϩ*;ia,MЮd'<*OVMyRD_7K|G0'|Ƙ#p( +ܛ"^[#:~pp"[~쨌2a~`5B+5lك^ ⯶'/y@6ag5{+2-2}_+|bs5!:oKZ6Ρi\]76;BB?*SJAag44I4-4xtRvi@[b-@k!,g7a]F*,:WPA)X9 uTqtw '%:b83!}ף"(iF)j &*Wd=c; bi\oL+r@Isd/l >я]>-I~]ais4Efp~X'@tt`Ï;M.102N4Rii8ij!`Ez=r^pрrJSM[8alZP8y|Vkl&6!OB )ZzGLqdm컗0]@G$ҨnXY'y~"=h <;":V)Ř5aחxuЊ&%ʪH?F,s{}>f-pY.|ڔϗq7@M Q@8/:nB0WڈH2h߽͒$J,P,ڢR?B*wsW-{]@$ix;hUˣJ'taUohA9͐rAKg%̥:_x\5el#5A"$n? OֱD#(,A368eq^L,a^97ij,"C߆txN揄W#,"í(qQ?"q#-,+3/Geؼ7@&[ Ad6o}_xw)X( 3 "Kf7sճJ%)oO@ឨ*޿]kdܜZ`. "6R5"r:b~ \"=fUb S! _:ސޞjL86z()d_Sv%I!1/}TI4F?jʹ-=T uo$͟ŋ WD%bVyE͑%qNR -o%((nז@ncH&+y"˱d23;!гJښul>*??2e[~ub=`璦ڞ'yO~eN{\ TĠ7PF1^Xc ~JoE"ؙ`Б9wE5>;>Үߎek'@<" <mәu!?& M>0P$ VHHSVN0Lk)=w=~e8nmkZZkb"s""е=Mʷ_ a6!,%:Nٺ72dZ<7,)8/(ȡ>/&, 8Y3|Qb]rym;G6n]C{y[ ۥpLvd6xl E|4TW2ɳ(Rό CMOWA~ %2&pdY4y{I #b|E^h>*"le-5׽;){-'vϢ5q+fh9qCM-qʑ>A0cK.WM‡Mx =jܧtqa\ .!_NQb_H t&s,ďz)9෺&PnE#IF:wЍ7sG3$4dkmvτJ`X BQg -A.>j &].ύsheҿ(WE 9Oo}:CqB/26uF(Mf#f$ɏ4SJ?BiT 6|1wS'i/{_4UqTbr1vC;~! Z7!B\ufjCRA >jR=n e-%/.TU iHf]&} Mxy)>Th gD[zcXI0M)ar!U{n!\<10TN >]Ot 5qu_X 唹%><#I{V4Km|wP'/M Md,l <ƞH䀗\:'~nQP〇;cYMg;$0\I{ea X\`ʚA . =[ c |L9&|qohzS&~RUk8Hz@0#"ͨ!,话*Fk),OQ*^.C EQ' t683KzZCm1 RjAh-R"##1:|laʹ(Q+aI_HY;}s6R6K?n[v SE@k<XO"IPͨ)ƅڡP.f*WCmnSLt58g>d,Q Ԟ)?5`I%೯h!rD:/ԧ!$2E٠Pj;)6B*e3YEʉ;Z4,ɳk;/X L06坸 |C>`{JH :.&P^([ 6N븷t ](ɹѦo<$v 3r C "& KO`;(޳c?I*TwϦb1Qz%S:7kL\'a4ʕjP;=>Q&n݅19S=;E$ p o"J#KFTW i>K1TEVf'y֑'=GVqWk@ZֹJvL!0Ơٛki)N-F61`Lhݓ#<|$$8.hAC0PyB\/ajkV&--9 eEr&3{씝/y72Yl(T>~݇7fV';K"߭cl&. 5eX3%kW|ǿpZ$"~n.+&j[/ *of_$J:W~7a zEV@SRS$a4H RWk(}jh-FC/{խ̆roa 8Iʻ}xI⠜pm?LA|<4y#?ܼ C!?O 9R[ LnX,Olh̒a8{Oģ h&r&qn7cпi#ٱZFU7]yk2!66CQM^sA5+_c7!{T;.O5I:waa67_J*)XY #5}w'4YVw92Fq\DV2"nc*Kگ8 !` +I~tkIL)xv[E`_w"n\;rŒ3S|yv*\@>ܛdeg-[C lۗSuP\sNB _>2T("od3"vT8j2(+>GGK5>@*j(u)?چLmlOO&ZByUb'񷑨 H#0CV_'|j;1%W=P$ ƔHl$1E=ױV&Ws5|#6* ykv&MjltP vC;RlDH>iWU0 E[ SJgUCGj6@C7'=bd"W["j}" 6"}_}f Ƹ*D\+-iBew[q)X@YЦfU6IR03I/Y77BZU)"+fb{`DRRzq*6oے;{Zx&v؍Jmd`5\0%;_KKETN䩊\!s||of)]~CWt>b]TmƳ)Ï[Kj-@u4\V$ ҅κtIn 49AobHɠUo,4VFiDs P {#xgNj7X1cĤ)(duY: VAnm{ 2dS@p g!aZ r"?T(8s=>0]x窤6'&ŲO! N|:H4w c1pcwc$aIZļ) K{%$>d&C~Kqڶ m؀U)Zbm&E]V&$Ld!yQ🂻H=0I-_d+RiWffGcL<}qNkPv|[[ӡ ~% ƙ'Ն [1HJ1h/T7qh``>\ۦS=H0C;պ"@VWF0 9-Q<ү!,Zm.$De\כ|qxeh*1Ht:>ѳNBtT>a4anȗD +b0qhT*Fݳ nغUux{|Ϳ0j>!` ) )-+CW|n.j0ӪM@t s7'I!pma qga8˕P1 se?饌{ZPMy ԕ >F=чJhDZ7ssR@7 |;&L&\B9h;gE չ I0/6dZC ՀEU(QJhM;~EثCi!pK#r.aI ^f%JV.T%[-jLrlAgzyT.ݕ쁜9-qTE#Aؗ)o:3D|5g4⫋a\Y$ՀEAږ[ 3~u-Z BZ+֒CQ $|U&ǻcQs),+4f ptSM۪0𸪼%P3ȉl6r?hejnl"-O;~YT{{`e[^ Ǥ˄*Byϣ to*چ>rD%5ɫa/eCZH`3gl7!hepZ!8Ae ޮ)jR=? )F@{`8 ˥3aґSWas%V,:MO'pp 3:QGvgi9.Rk7z`uĠŌ(&ٓH消Fث8d H2o8[Z%i*F}2[b[?<yXSXAZAFLx]yA' L0bDW+/h.%RᦰW?4Sב1_z-:zD-W (Mv=iݛl-dA - .`қ|6d)H9&C*8SQO89D}R4AGlV0th-&c G#x"\gY9l<6\|Q+5x@%E+DsEujP4h5TZ4/6UϖHӼdARCp޼,.;AA~Q h nFV <$BaҝI{ 6+3$Q.6=FTf*3 *Dζq@ 9DBf\Li`9UuG@G.$scBH*MS@%X갱:-_P'ǚ)u n $^(E8;8 C!':Iɩeg7}+#ʶƌՔ2@0[Y;Ta>ĆQ_+܈}d :?'#j/JM:rvԷD6u>F:6] pdIX"zXefVcCA ==!*"XS,?:L%6)~}w+ >:bI1'H.T\͕`6Ⱥ;`1Z٦:ie tSASzy>G?4(u{:nut˶쩑d 'Y'5xO2 KRɒQ~g64>j!0B=W\`;|݁C`=)Vzj/J*?ʘ|!&'dG^F]cY[#uG/1}^u`tQ2lؔ;$0?*I|t=Mq5=%-1\\Q#^ `d :apI.8B~r8i3&ݫ69d}]ћ#z[/:G8_7jqމnbAL_]$D"rƂ鷱D =LV, #=`t-*Mx%iQkLu*lL8?8:sO+nr%?kO/g#wIP# )FL+pAd,[q%#qSZXv9'R}7eF*KW&ذ4cjc2XS"|{mH0A<}DΣ>/Y+2ڈZ|RT֋U,lLN:b06L0Iňóte၂d=!_|F&ijQ>?MZ"c+U*w[ipX Kv}?4+y.BqhYrYYJ/n!ubzuҏoo/T0'W)R +|qK;ojwq,)m3T(Lc{\&;P%Bꆐ.ĕL h20&]71Rl<7oLA6ċ`{&V45 תwA0hkӸ/3(J6"5NEΌQjN%kiZXw~A'j"}"y`7. 'of^q.b1kF(ya9J[+vE ze[V=j_;C/9qiKHN]V&6J`"'<RM"0D^Z`_/Ĝ\0 90'*<08=w;p9ے($~̚ECVp%y y72&@>kdl.(v~E< ·:ajԔ"O/+N+e 6ᴏ$jFD :"vw?ʺp%k-X)?lX2y#eTU1}埊 9WYCşWG3,VT!?@sV#- p@kiPLl,8 [YX$ wkTyB4$&`7z*'d*˦"k!wfve0~Tã+?*~c1}ng*45-(ziksfHÈ@!C>TDP*@vV )jᵗ۔iշ&mГ A,?i3> 2 Lb#R:8db\;y _Kl :lHSzsJ9\(w'r^G_fDI!'a#So_/<'ʼn{~I&l'u; qZ6lwc0D_=u4y N CՒU|j^7Ip$Ş}%΄]vjb[L%.(`w@FH+dp@NǑC(;2_9 | uMB {3*db $C NB.QScYt7>?㢺-A':T(oǼ\pQ KT8p\" MXTby9F6ShA5#jK aoo)){#_(CV,oEKp @tZvrf7FBs&I~(8SC'0fda"qHہ2Ƭ謹1<=H*M,R"FW">K`Lڸ5ZgPsՋ>en'/ p!,0^p:%ʮ2R5Jqq:j)|!v .} a2œ͍z $/v4ɧrP0}?Vk= g)J[DO4}\xȾg', (\+qc3zA1;3.Y%gjA@W ~V zolQUERmxBOP{y|(XX&+[[f>ISc$藛W2.nu2Vhu[fw|}m>)iL5wWp 9Jnlq'^tr#}WaUmK/ՒpY%0uO,eg\-乪i; kn.=j;Y.j7ayE(z UV+&ߣŝ 0pC:aŢ VdY\FX/ 7E:~I6ý6L0vS:TrKg$Djx4m߱v0}-3֢ՄWޫH#{d b4f8}%Pujk-^Eߌ#X7Ɨ=RjEƸd3TdH$p,.[ND!=@)`4~ڻ7:=p )uZ&(nhH" L8&^Msq\02 똊º Iwe+ `ƯI!s> %?s)>6ۍ-j85gwGK1E!=dRRF:HUY^bg}a*L๧me'D/z`Y\4P,ԈdXQpp@ʽ$LX!;7 =Ǯe~L&P=`b) ݄ yp$MˉBgFq(H":hv(g7P6!P^)j&bm$癓^D)53f4ޏȚ-a8/qV3]szAo9MZ)=P2U o@78+f#sL$lG̊РJE,ܶ*(,_-*&ItB80b[<>pM^3E'#rV:N *+vߒ+j9SO~5b5%oNs嶓0–`\6Γua]Aw?hOR\^92;"ҹ՞aO§fm?u8{*FwYG!V㲑@p9IOZy}5ˋX,1uD4Ra(&čDkn!.x}JUQz5"U)mz^cq`HImEskꁈ<4 [j2} G|ooCnqt (2Qե 16jX[sKɍQ#J(C~u)nd/2P^;@N3r]E}wڊ-_6*?Ǥ{ UN4V1ъva)n'MyZ#hb=zkz` 1wףy%_BLXyF99 FME>f7˳{.Ő l#t~9ѳe3>&h|Zk7='4?$H`>/rE0 |G qN-N0m»#cm'HV

Y9]m\%fؗQxae#sM"Vsu^#z/e9>,Ӡ,[+ҀvjYB}KBeN7z$kKsƒBI/EI?3", ]Tܙ_{5+eiW͹bKuiS7|6)lߡV O%!4b !WJ,!F(9,nc*A\{?2*Hawו sGwJtQ31-qξ4{\ɦ' C`?CA t|e|/0͓USexNkh5)R?&~TJZ;|*`>p"U33H/tntMxw]Փu1 H5{6aVaG*=( RZٟ,ĆRژvGM2l̡0ZG7u(thK%?o >%8BIyZH!OWk&d7`L'g.4Fzq""-E&3~Ex1:ex!mx= kG0]aWVg=A.?ԪDqƧ2FC>faڜ`&FQ& Ѣ!:0z>Dt/2Ji&)HUQ;3+ڲ_ٯTx-rRz%^*R[)x.uHu#+!-ANt1R m :1M)z tO+xg.$t$}렳J("]RQ#~:-ѿ-f]& @%{k&H&Ҙ\wx/9X`UdH,XK0ߙQU ۽#n%k}5n^}^dW@*NR,6wܟwy+l\~;@qlKoQK&CWv%vJ +H˥^p0xip%!K]Ƕ=v#ll<\oA,0kF,f=HG0LZ֊>!#|ؖ7+`&,/DVg.uf-"Gj"5o>;Uww@:Ji_+ؽ+CRN&gTWhV';7vN-5yw2U֪I: ZQ|!dX}0 &[e*}|h( ԇ*\jɞor?4M!uf՚9A93>åqg RhZiҷ@gF"iRuC 4ϒiN)f إ:R 0U1gI3b4Ab౺B I'{3Q߁QM{mX^)ƞX(XvYd %W  A7xƮ2nmp} M-rZϨN#{jpEx>%ܤDfN4P\Ԙi OQl"f+ '.aAd3 Ϣh3pgeѭ,0AQ=a~d B@LtEw#=ߏS&p%?2g)h?*6&>ֳ/nʦ14k}/i~ ;_}P>1>BƘI. ;"mv[NƸJ|?8\P%B{Ÿjf3x&][O1_.@z@@٭o0 527~I7gN:LHL(ȧLH5r>(a-q$__2_+Nr9jyN@-v焇 (7zQsߓBb̐8TZwLLdkINZ#iy1ϒ[@/`j:>{, W;}ʃwr;Ig6˙g7F޶Z%^G 6;%-%`"ؕdP2^mٌ yq[&y q+M]*徳p,jNH^M2[s0fKM6z:OW0r [H@[pHfO!U:< #mTw5R(rL?&H@cl*H_kkjoUyKfrP0Z|5 _C5AeիM9gsihc^8$!Ф6 !YH`dЃwum)4ND9]n}\CoZ=$Ô{'O3A"s@eq8<- x] TAPdxùt889Eu(1%64~RQP~V4FCM2Z?hog]fdlAb6[SJ =7?X'֒-r`zh!8]t.4'3q 'x?_w|*t:'c1@0o5W6wu&!ѕ=`~e/j  =nx1 ]w&*9޾!" Ỏ :0dB.*jk'_b?,L=Nb_I<_d]"x2;̝O_7qD%}d8|J?7̈́s/$%%~1G[~^Q5c&3:7w.2~L`OIRr)r~$_#C--Eh>0UwSv'8ao~9l`'> t&|[8 0#` $wq[ru,&1/gۭTS3jS {%8)X~s`/ TW g`"匀#3.^ެ*{ϭEi̭Kƀ*I`+yDT5uZC`?u'ܸ6 UA8]o$)qD"e(H "sk0*~rvӨ1Lda2Y05OKgIuo +I> I^Uw!#sAK@RˆvӥK>#vI+)Q]PC'~(THOr^;vJ4!:TKOt%|q[p#Kdщ nkYɖ*.M1\MlkνE,(J{W/m;>A`GFB-W3G^!n'yVȉ R8هג,?Z~@TuK%ո 6T3[<'$VRn ; )!b2" S1-nUE PrwM3!zfU>\dSk&rdžj T &3"e3h0 Oy>(e0}mk~@C<袗R2:$>_zjtnEw0t $wMu&)Jj/tu| `gSpr;4 >. 0+( ^& #'%UqMyPc52Y(9/lq.Aw+XqQA$|~r;& :*W2,)ߖՉ-:ا\x78H$+hm?wJss֦EZ-urbU]'B g8!yݿ)5Ux{WJfo#l)0&B/ti:fh6mJ,c4<;3DVq%Ca(gw]7\X^ƕ$qS/ՏF6>BdD+ LDd%F{S vuךE@wV';+hɨ~R\WP,Y,1 6BTB3- =| xw=a45cՕh6Q@<(-j&8Ve|DJfPKZ0ƨ> d$ޮqT7;[m<|)N1+`ORؾA"'J ǔYP%ڳP97f#.𳃌9CFod. }3%b)@1%w:T&.@W _4t7bJ~6$9 vAQE8۹p- HT5߸6ԑ'R:DEUƌ?9n4 )b${'8;D3**Kwc#*UbnHLYJMU<,l":Y"0t&d%vM҇7sFoצ*<0=>foqcQhDƩP* rP5 p0J޲ *L~FgXR!w% <(ݕOq_|^nw).LrT{ף͢7v%Jՙ^!4rV} o>fʢ_iWN%ETj &Kc NYX0O}ED.(0^!V'^%Z?ĜEk*wƍ!41.A1!JІY81L''ک>2~yb.B þ pX(&~>{IER_s %oDI}0H\yhmwO4 땛<"IЅ*$zJrlfk=%#k[D5Wɪ_}ݎ-pSI@F YZ/Er!&mb|w _r99LۢWh0;kgt!mj(껜ã/Ie6A$FQu*,ɘoᴌ{;s;>.HNf:ux~&ߝoZ P9-V, +]/?x/Pxf{r $wu4NVVc:h5@](-TM+k3(v"ιf!T ՛e+t"P9F@SjgBh)?G)XPB{?6+GWО+ES0/4n|Z"5N6BcI;sQXo. ֘r!i Ův9 1;*Z5u=E_wxs~ 4qQrw)` YClA? OJSmB8.0T9I_v)A_Vp Ɓ:<)IUՇW3.yHQ[GŹzl ykInU([0`2Yc 7(#(W3܉NkѲ<8/"Drī #2?S,"o_L}_;kkĵVA˫>[c{##cE1(Bk_+'1 ʼa묙b;4 @F70=ILI_kHIQ:&@J1_Q3=ƭύ[~Cr2 >_q,ᛤn/[@&8Cq]@J? wMJq/ ouaT\O%C$qՏ3!)z;|hesUQ f99R Z%¾9$^lV=&u Wd^H!fO.CsUGlXo,}pvZl*z@#]: 1LCWNZLz$[ Jh~__fmXg*f⇬$q_e-mr\7Y.s۩WmMlp8y7 YH(6dDן#ePq|ïZhpZ|}4!Տ͇,dNN'[f'q'$ qߛu=i7P )kiF^"0>-6礵O3fv|QBm"v|+;͢bwe -xK`5ǟ5_Ej%|wd/1vn#܃-!p`V0EEW/[U=RJlax)L xtelR-K 993xi.i}1:^O3FjoYD2|:Ya^qlW.E-$/vxv]SK!&-}:E .{yTԴ^oȝV(Hg9m˴1{o1k㓉Us9f#HEYfD<,Z @~Z|0>}w& y息&48y&莘MFJ0lZ؍FO 0-8 #0 >VY]<qN1#!|9Ƭ+J_ΫYNt I =^`d׎W6` 51(MH|FN"=r:9^)a&&Ɠg*oǑ,/U@0rx}~5e@{ =՛(E'qKNsP0B!DOv²eqqc"P:%+R)t\Уs0}s[0W *ulgX4nHg :beȄ>.sY~Vޚɣ@ I~%9Po l:AZ"([azyAȶ$׋% Ѯ*T32\]ZwJfWRz̮HKy??yzQs̮@k  Ќg'9Ρ-G\%В1?B Y.tQ >x9wRf†f>gi.020'C꽓39'w>:|Ē`?`ed"G0 \%u8;m}*ؙ/v @B K)5\3^/l{ 鐆ѝ3)C̚Į8n\ ;B ʅ @T3u0xݨ6!y KS(<(`**AzB8.-gkİp3u&1~*Q09b@c'MS0ݭu#vu} AȺ7ǻ0>3q`<)֯OjIn()\u~<$G<Q%<˛j[ss XK.렾-2glP"aN :)/W_:^$ѱ"|Cr~Gyj$=6$FF+[C^XX5ؔ|:-C&)qo"݉u B&IN9`O:5*1 fH\n#%c3ô}KLX$[s>),5^/tJՆz]_n1JH(I's6;aݰ6@QsGƆ߮KR-Y]?"xb\+("cfPwhަxQ4Ϫ8,6*tɤϕB=AV^tf"i0^5ơI]BĺUqE$*˜:[!;8 b[u YV>毠 )|LӵDzmӣ a4m#TQϼ$d 6k'-k KI,i -ސFqyfݷ([wC&O yQ}uvE׏22UԸ0t#żh{\ͳfI??s(֌u> y{V.`0@6'xe pzIbWF9x<"q1V3[` YHܱ!XgHK+5!>_#7)|,5b@=2;&@wlk*ěw:h [70"_UG5B`s1Ĭ<j⼵Y(A)<y" %Dj,cp_4aX^f/D"{ n$n&c:$ޥ6B@;kuz :EgZ}^֪')s%ِbvJ.8wW*q^mE]}39x)7:i24#ռZv@*$U$Us]ڐC?AU\ l^4-kmjд&kd@f3m9v8c"M*rÌYh2 whBQ#{%kDCU`fu]O/pB>ǕÅ\䰓%,j4c JN9c4s.7HsBvՄp-5kWh2b[}"аCD ft*8Em:+Axϕẉuւ)g n5 " _vP+I`Ʊ9=k!˾6 =$v[x7q(Y_^ *}V!ěLL8%SrUrZ/w*4-֔Z/PP#*7Lto}qT R :ٛ;d$D_QK3-Qi)fЂJ}-1kS>dxQcd3(Y‘Nn|&mGF_k>k/ r^26V wL>7PFm&(N[5=Zl"_Mg02 " tq+חa5a^vx=>TUWgz?P\]ibk5'*P(Н̳!Wy;HZE1Su(7D HB[ӿ lڰD=TI9bwJ- wT~D.J&;UY8 Lܕ^V*1/ɕ@+/%Eo+T\$Q (~;V{=7Tj3G}湖@qd%nEl DY`ho X͏.FV=PH#V@2p#x{h3m:=$& i 5&1OpalXr$oMgpĐKCj}p# ͹n- A*/*tԄoRiLlP@* 9h?]:x :aC2(@ZVTW#cH_˷Hڛ>rk),Cs27%ڸ‰s7D@ <ȵhwPsA #T\H_"U K:?C|eePj3[1+is7+j}H~䋅@}vCDj6,YɈ6nw(n;** k"sJf%JUXrzgJʴ*O$.%%#jIYC#56bi8}~t[6 76! >--^\6!^ĺ^ yJCŃx)vu$F<20tTﰖ&33jIq%~i[n._o c\ !︧Zy];%ۊ(|3aQ*1$`Z4(2F#V=xZ(pʱX?mx8lG|uFlx nY`Ϛ'ɫFyٻ?=kVʯw '悁}1V<Ϫҏ x~)A2JQ=5% ,3I?VΒ:C. &#`r\ *ۣϫv7 yT0쪡κsD9n6 #GW 3}X:p_G$h$ D17MA2L~ }Eh%*w>'QЗЂ-nk_}aWz ' cS[%:IaƉ90;(ZZIV96=gf'\c7lS(_=q%Yט ]Aqco4Uy; &n/ OQ\0պtt X._fW@W~JX"<őhw",:{9@H֖#.wUZE8\$Goڋ|2jQ⹱Irs-YԊvѮ8/&g+[(O'8#v@_BMwcv3w 8ْaQ8#+uUSՕ9;fgb,_4)khpfJbisuw{7Xs "A=!hI ^,""0F/k R"*›SֿuwX+w9: j0/R.6+3D־ˤx0(t)B^۰Qq߽S!?ՋM<2QG35MWm̨T*.Z~!ɼ~eދ@eHV!R 4>]U?ojH? :ũ4l!v@t*"}+KEc6AǢpV)бdj\/಴Bö$#'u­OU<꽇Rs-#qw}3Ỵj%YeiuGP缐]9LVk W._bwX_ b,rvz#+h,.:O;e'.wzݔ,HH#>T3 eBzX_8F-tqyyV\&jIML[#8^B83ycGDߛ`}2+ RF]窀 YU8g?6h+Zcrjnf5yqG1"111\I*.$Gxdod۶M42>m\7^wL˾q9I2~S&qP 5U:`}.ζHf۾`(0bK! 6HxHOZ@.y<]FOp-KmaQRx_h=[%u:6ȹfYwBb rns/N /"5w:(&|dzN=ʄP;K/k?1t"j$yc-^ìQfR%E=,-;k!EmW|N9vx`V.yx idImǓ!"9/xK;M$Q\&U3o 3$;WVʷVamso:B+eO@- dk5eKcyNP v>n8&_GcA t=7 GK%Z#06a{վь>>X؛Y1,|+V9ZnRGUXNnBF`=7ٲcSidL5_k"Q|v\f([d}5uF11(+t&ӵ2er=\GCRe=C=5~Q;Q?g jS?Fb hJf!{ƍ%J fs_Pu(غ ?%*f81VPӶ䶰5&Bԏ4ޕaDNrNC) sVh>V!bTwt]`()&,:9G]zqєQHuxr34X~[(z Y@2MI' Amr'̎Ԉ§Cwn1(ie& +kބTUI=2F~ʂp7_&>*+ <>:QFoPs3IfJAE@'V 3. c:&$PxȀ[5QV1˿^0-dV 6`1@lT=Lԫ`=;>|nHG,]T&Vո MC~K7B[nY3E/Le{ E[ [*ajr%mI9MuFDZ1& ;154}‚>"7ĚCP j`)PXf97?!CscQDuAT W6dx)_P%giά&)3D /qם#k6b,h.> mFw {{MM션z^7>:CnP X(4Yڠgu ԁʵ .2} _HAQ.ӟ#5| I"=㍎i?;}-CVΦm5S)'RX;ݸ8{/+%rP‡^1fnZZ;;vNdT{65`=ŒqlPDL> -.-B\\&@v ddU^FLx]zY8nssa0Su}k੽W`FjpF9HOy"3#Y\XU3Nw*,/F 51_0dbׅ'7>/\-n3;~Z8lhd`"8qEޤQl-}*͟B=lf8*㜶5\Kd3?Ip_c "!44^=@،OD' Mux) yLp4cU1TAA:L %;5Ut4/o x^$C/4;A ψˋ T;&(+j;n5ca8̹pA-0693Z"eRZ7e0AotN0G;'싑I29tX*ST 0[HU_Fʠf;xukhr%O =Py9W~@{Kz)Cgwe*&*"؇p,{k!zYA՝a/tN+Ω7*7J:?;  : cb\ZmbNCgE%K_I(pD!|z;B"Te.JVݷ \s90;*Y*q<:zmn>@$=e7ú)e$KjMXu NPm8EMt)8-Db}.f${aa/>318 k=$y<ݿ|+f݆b^,(cld#Lm*(o4(\66l"u7{pƇ=n,@H42ɋA2CpklzS ̉7cM` ^hwZT&,T; "*9ߐ55Cn7) ɗc+u7a[- J,MO=<6d.ّl/YnHnvx3;Q!Sx?yOG{o2J V@J;&R_*(VO5}XsZK\P 9lP]qI&4,QANnObCf/-x!!*cuԶ*@+9a)zFj,5du*v[3̧k‚;$4 ^iqJB\S scq-="A5F ݠԳh(/kOy髫F—u.4QIʠ27兺c;hqD?V6:́eY#?BT%ƊN6GKD q՝Zv'enx-Q4^UhM]KS1l&dɿָZDj M=D'9?7Ϙي9Xy4P"&qG>g.^AZ++0ZMgCKy}zD6Q Y13Z6Sy`8[%n2W =e ThVx /5_F~ 0l:vcދ?nK1Ka7$<"ݛ'WnsO۳'@QZ-HjԂJP#Q-`氖}8ѧ5pl9-t.R|&.~n∹ #lo5Q=cg3Js'38 ,GKpch|^3:8SI*mjar5 j>{56]C( 6 K!xQIQm!t%#fsI *YeEH)uQ"܏?eHZ:4ɱduUZ.wpD=B>su>"R z@lf|JJ&$ВqeNfX'6wݟ0lJa;U.1TIy Dcԇb$<䲲N@?FE5C*nkv 唽6&__bBtlƱ9 GlD/7zԲ=lDZOc!fyXEVCN\ְޢ|0*爿Wo"R! ˢ՛4'׶,ՅS=%C'4>e dUKè Kn" /Y3)) =%+ Y]=2.03YO&ڲI*R9XZfœ$0 0#Q2%4\EGG?om%<(&k> #vW/tS)K4 /K20ƞNϫS-{Q(=Y`Ot],>\<#aKTX2918Hq[1¼J'=t lP:^i;(Jt>FޚM7k1LQǺȵCJ_Sd=hQjn׊rPS9PsX FJ^#2=uMdhg$}.~fKʒu, ҵ4aBm4@|TS7gGͣQ\ɐ` 2"Áə d-4|5y#Yq+4;Ͻ9;B^`W՝ /_`M6`m%x֡e Iz} \".t(J9LDKCNKPt]zs*Iz\+H߬խ~TM"^dՏ!@5ЌT ,S>TpպH!]kapNj iC_8)aXz ҪQуO|vƠ4,SwGê9s-cҲqtlE |d wU(tH }(]j;sz/  h1G 2)5 E Y;h! ŴBbDBz?:vk%a'ʞgP j'T]n909F|}A/岎,S1G 5n:X{Z_w=r3D 9ެu4D$ 1{ rI&O. c\V%ZYn0b0O ;9;))4.|/\`10R<>~qTb:CŹ뭝fܞ^36%ݍ)D6(fhF2K/@Us+i":D2%_`8ؾѰ;Hv(PUjV3CQ<#GW0$)r%kkME+e #*/.A9oa.Š6@9>'_蹬t9I 0<{$"c\hx;1}$[|;L哚Y*RH|3!V=&;-1S4\Je8If(\#쌭a89àN1`9qxl6<# lrm􈓑=Gl| < ,>b |/1k MȦY^{ K7GGdB9&0=?D C%1i" -*/|LO&達ho}+M|&__4;ߨ-ocB\L5yrm,x;l`TI%~ !7V :HyF;1!~*&k댸I]S]RЊH)Q4>:b[Xn0f4z3v0]y[s H;2.@r}@XӋ)/ۣ>9Pfp[P..oCG3]h>~K2,9?=}\ P^8?wGnB'B0/d("QDD%UY* SsR:}/2*]UsRg]g\;~>#GUeͼs? aTN'ȫ~=[O>KhK`9ਫ਼"0vUWT ] ^GXTF =4FJr`Goaס;, 4&,\ G]zL η/ O =xYI 6^%;0Cl:FQK >GWO%_~kGĖu2@oZ-C`w>%^F=v,Kcm? -P 18*h ԣ˧nT"'4xr{ʦޔ#4; ʌQ`<Һm+1AO}Pz, D.fxicIv}`䛘7A*2?+atIɍna"'5d};e8soj*R^jU~P5U2 F5 a1zq5zPRaubK#!m ð3)d$ySo;l)\8َ-6>'W&'Kg&39GyWxXɆ8 onx\ z#ʖ{F s(& !},F`}L7 V5ɫ# t5}+֓)eMkBXVrтo67f3:z'37I5vȩC"ı  K%S:T3F2g*_5^*=]gI)5p;z`dKupFu! NJN~IIA l)x-b/|}`#'\-IFF:RGH4k\ nNvy+ҷvB3 /, b bW6.um:x(gEz8⣠8_`~y I3X8.}%H97K;?1nLӗu& eM(tNS>ToI~I?X(?/2: &m\'cOZ{>\!MJ0S>Dp<}qZiNi oZ<&5ōi.Ќf£$P3BteX &a8Ce71Ho90B$R/y,T?=JGfX-p}*p;{nGsfL@0&%9J4iB. 2F1HT@_w;*wL<qN=ZiwvE֕4OzJj'UfA j= #z'g5,HE+N;êDf V>)X-`w1^ & t?S3k׎޺ YTMh4:8 F#k&!Ap`kX F(0_&OjR f8RVL X2ɾgvjbDf?''Zl >>]ܠ<ʡB*'ex6U' uu ;$ah+Y. HZ? p NI7dQzB6bHR(";1jbbνzlhp'2jъo3Fzb'B-t¼aM?vj%K,XI|s返2N'sֺ.(Ů[[P&M?y_iCu'Q&'uvÉ7yjC*S=&C{0qS^S4jTmo<'zt;/OHb. dL%PQ bZ -~x;`HQ7}X`X/-Z̹ Qx+VJx8.&x.;<ǿϸT2+"v.K -"$ $ 'DODa;3j-M<.NĐqv#svx"&9xggUa9Hz&E*v/ ^_7#Vx`$0 ״S;57ʅ-l8 &-b`| (ʬũ=;h9G p8NHeY!H%ჄUl,oi(bF#Ô>K,n٤j,Z@kd7RAEid_7X8<@RLc6 bhhaۻr"nFKf" {;VBd>5j+R ^+(dڀ{JʃkS(C!h(E5ϺRHn^2#UTAyt !mǂiga7䞪0 kjwYQ *JHyC9EFՙc)ٕ{uQ4.+n?DK"L%`70_$[޹=Mi/3 z N*.xvEvU)p$LI5{[([Kc_ 4Z 2r{iCɞ#"' "=CV5'%.Z ;@V)'qp 霪l ԫ[yqWՊ I,0P#DՇhVC2Mm;U\71=JTA=J_P$vy>&;͛\?vdm?"s/|DZ³T yO+t;C8YPՙTv}"8[nUJY%1!TF&pJ@ jzF+.ꜯ.S=^*/M]PX^K}%[:tU{6wP:٢UoOn2y$k*î`+KI=-u`tڸ{sn_v HQ\ _8 qՈ3Дx Z3[g[# S j@:/Jz|Y1'A,O`q(UP;<1[Do,>Pn7rF٠USRS$E*?9orC"5 +&.vg` Oz+s~S50RS s4yb9Y6G3/ae^TTH@x Mc!;5 iiP"#i`.0ռu*Q h~ClLlC&2| ,i53YU/Z,+$_!,!?#w1h**w),\r鹡uc@]Ou >3ӛYM1e)P^(1ie3f!e d a>Y>.3PV}>wi-_~(}zhM:@].\tN02FYwqkaW :4Czbsb jL;+o%WK5Kj&\  . $/$x$B50w sOEl:ekIxa% ^򊦶jK 7)$t? \ֹ̓-PdiPED3 .QKhj9d&i$\WS.9 BFw/ί^6x 0#mҗU{!ۜLC~r?1T,u`/}\+dԛO`Oc=;28I<}[(2 ker1q^Ɖd#\"CBq~&.ц^!=S|7(>+3.kRX_0Cz(-B E' 63hRilSٹ\I1ݷL"s5C}GOF\J}ԥ*P@ԨaeYcXY3JOZ`Ǘ5j5h\w;~n)`q~!Gñ¡.bU0JZ4Ó)4^3 ߘ9;M<Eq%vn18V4q|`fNEF- $p [!?ntVԗsh~ ML&m(M\(p2)I?Kl}`Epr`33 ?~C];lTqŢ9WW*8@?h'PxqA\E D&r%zY#'AeO BN*$<=/,1C[Aƣ` PӬ\-K ;c>{lD~y[or6y N(as&դޗ@NJDgPb2&&0 Nֽym,ƀ%Sjh*v#_ƢLx]@gtM,T,XwxK`V~sEka7i7wJ+ UJoyh n9y3"oj{˗BLWDÿJ+J'Y&=Ӂf~'- m#o6q8G%$8ljeHhU2Ϟq5_'Am9~|~σV;pé71yH\,^$+ʁ/M4=[K( ZL 5[= dus&ߏpm\eMR0]2\׳LaS4, nd`&vRlg<{fe:>p>4؉%Yz3>$*MNVN#'BNl./ߠMm+>;a/b"a:>_؋ĐP:YŜ]m3}#Tt$Mwήdݫ/IHMz8lĩ'Q-3bl{DZ@5qK9lM_D#-ik8(|t$go#&״:'|X-FuCɂ9;V\fZ& "ɚ1[)91R{dl00j{Fsw&>>gyZ |G?=<">O܊H)&,Gf%@Nk(cғ-Zخ&&d/P"r]PxҎZ00p?>;Փg:rc]|6oC8DqmhgF%V"xNt[.ˬ;ڡH.A{bQ":yo8i+KQ9Բ^& 3sUĬ&E!61or($_oKOMkB04jfz2-jK^, =u=8zxfԻ rIpSϖFO#KVɪe͙޶[L(< X{#,?,T'{J@/r_K(.,7çۍZlmm.(`F{wF/YC]@{"R91&H3:2YUبZ{/t+ 6>&6Y;5ԁuUx=4*ۼ!I*WLkt YՁ>rڄ5^D*JY PYJbNU4NTnjw@Wn!AϙyNm |IȰ-Y,jSCm )gc\T+89uT ԟb3 yrTCI4] -i2k&BpK5 %(9~L򃞾PERL^TP.2MWǝ$FYPB£\gubX>QK7)YF=w.4'%C&268xdF 4:1ի`FvDF *PA=e Pn\nh^֚1^ryH&"?&~ |~ʬnY2//Թ]L0ܞW-m/;S$4*\dI#3vV?2X5q<İ=?c%Y-.s쿽,>KuM.6yy|#/Yp2k: .[u=4p!9$&2a]lMA QV)1ȋGۤgH-g_p*qO5ǠQO嫳>n 9;FQ!|QoKf4Oڧ#4ʗSiRi%K^tt#6\ё,+}t uu!֬E71;NIH.aZ,m"; ڂ,_cqwJ/tf+|ʊȍػ (N:5h6͵[X;rɚg0P-Ą "Acn|.w{0/}-"Ūڮ~^xd½T7 aMj6A85H-oúL Zn"ԇ0[(#j՚Jt_?4: +أv弋+Ċ]7$,Ou;$Ln6Һ8bVx)vD+U"i46K,몧_tNxvf*AA*yuz^ bISu5qr=Jmэ ʇ! /~ϫAi9OTXEh)z+^Ö\$,G{$ĩ;B (-d4,:z; XJ%j-~BL9 ȭXJ/|BPĸSIGC(u:;dC&')3kt|* } 䉼PpbI?#.F0NՇ.p+)ڝ',:i8A)K3& P 1ZCۆѨV,J=:3दht>57I􂉶˵[Np)rI 'h'OÔ[+>N[0 0"f6MLo!B²J2 <ŕ8\IBhxUi/DQ"&6Fs`3[R,kdCç;i檣M/j8rgEPÃ=ԔJ;CBZ#@'+nZ21q9%0,1H ~EA@tj!n aF9vvE.+ER*(sJC:ux!H^zյV4mAD`K5$DF{l1E!^*|eR8 CmZpڵsWT)v*zjѓq˝PyPm3%:1RI_ Fb\w4b{lRI ,wҏW{NU Gog]\(wls-ddZ`b& l| ts2U&4ڸ8}"q{MQ?QsCn޵FiWcqiml63j' ] Aejc Vc|#e-ÈDD1oL{I+|[l>T9+U=ed7 #؊CU}&Xhѫ)PR6mT++#0.'B5)5el$<}8/`,v_I;OٹAÖ%;xIwʱ> b-JrP(t.IV[<^{\Rdڑ:xUg{?9S~/(;$֤i+AgQ_9ʎpzK^- Dv&7}*^46o,[9Lj"9wEE旺Ma#*e#k_GEV9r=!XE:,Au~E7" ׫NWI$8he 8) oسŸhgf c\6<ʙ`jՈy1YMT{K=89G kS|X/>8ʵ_-x]Y{&ÃL;"M&FM=ٶ8y/Z.0+!!!0 S[ע0B:< ڧl̈vii,j<^ii4N\Eu^i%nH[%vÃb?8 Z"ߚdZq/T4;O=l^ N;.%#>crQVM%EbR\A.5'Ο2t|ϥv>?F,!T.X9y)G/oCOWBi79\hף#ٌ];%hᖲɡb2$sB+Rp55j™<-ǘn'LDgտ3 '8[@>| `W XgQ4Y#@r͐/\gns>HM#m(.~f/,Du;3JN6[&!lgVy!da;7Y )@Ѱ.֕"3p hs]lBỳK{':^d&+@h~, 꺐߇[Hzm/(>͐^5w犌^irZ_;2ip5 䠭/$Mq>A aU1VbjԒ>'iY:|k9?U~+,\Sŷ7K1gH0\]63lQ= ڵgt$~ ڇЉ Mү-Μոݵ-ѩM4$DE Xn59v"!󸪑" }儁\#kif0gkHޞ%xEamT*Hn8NH:r2=/<ז!z"OOډ9b;x ;F~*Uub1ݐg(4 d}h%=i$'ujE{ n<ueC!.1NeEGڐ Z1ǟbQCsjp49P+ ˌޫtx#ܣs wƌ` $%_/*yQV  * -\sAuWullPZT6P8TzH~UwV ã(Tr84ڸyI"2#8"*S 2; E۪+$?Qu@hS(2`LVΒU6v3S}IP/4YҾ{^"T[If;/gl]k3ڲ*驻|V?₊aG)F]_52J?c釵͑Y0,pں!|#0A64d?p|w%7 )C"v,]}CA}O[DOS%r4uJV5;F1bHny7Y]eQyTW k';4hɗ])-(VF Ak,:QganQisx73D6cc )ҡy~H U'U& ;f|hs6>Yd O,qy  zcB'Xp] wMb,KX* ʨlX}0m4=PT"{]4O҇n{]B=x&uC-%mz(&?0Xi9Z"yn+/\V%7!ǰY jJ϶Ÿ;ƹ 5BgT4M|HNAC%7wCe9j>)PK;Д.ER2UBd$FP&tF a>{he$Hz>S}-W$yR3Е* BEW~-Z2H 8Kv R _ZH 1n\P#dӋ& EqZL-s$gpJcl,}M.0MMq |9am"퀌M|7o=R}f\D5wP"l猤l(@\s|\Bĕa+G! {Qfg2P# 54O:6PV†AOq!"(1է+=sQcB:]*^+3+V}Qv bf<&bY4O[;U1J嗦E!cp1 Q1ܼF=ԍ\_)|Y \/&fߧ,@QWMI33Ytk=3oVNR '/kͿ&o l4[b g(qJv #(W 2"{2\zwlS+l0h"!?xʬjO#A`[ A2t'[8W"lQ192m$6?Q1ir]s+,ȥ}~dH\ֈ O[=*$,\( <~w5Lbq^&b (7sO) ^xߺ )0bKro"c#:>VC)u4<U/GjO^opBaֱD:ɠ%e*5 KޝhH ,~h/9'ťu\Uł xg»::9 IZU8Y$fG[5?1+* Z-@N&bH(۵H; \qwj9W}mίAyVP{ .F#gr@.PPzX\-,hv y^@Xn8 yg얯%j(~^ ;*o0%p; #Lف|2?6Izr|.L +MPb[%NMf$Bز:ߌ630rbyͨw_Q bǏMWMQ 8"@ΔUe<;%l`0ee6*Pkz *%/ .ǧ0yy5A:wGoh5e7?;k!Q/Ҏ Ul`[>>ʊ)\&{XK*(rn؃Yƒ|-84LyoZ }Eg&m 5 y%X 1NܧHQf5+C&pR(vCh,..Na[j/LUk2GTT7,:HqE;a+?t[$g2]4']Yrm!@V?fi!A1MZF5.`ψ"h+=b\i@>pKaM5RjAb{f=P&$#-QN;IL$h0/ks 6& "P\_mIi<0tZCTH7U~9[$Π!%J7ػ4V1cU4-m\>XgcQ"«hk/U<, .A1+ 0Bz' Kwk0 zQ+_5qgt/.0Q*C"{!MQ=}Hb׶2-OçY.*eo*(^Z;፤%^H"fMh49IXBŬ؆ך{0 E'aGN׎hsRՙ1)V~p9ar7a3ܢ FvJbيw#$)^I'K(IW k';&V;H`*yDUU!>:t 9 z:ٷD 15Gg$-bCșۏϥ~M}B -EvzyT:ҳN3kCOv{>#_+9+3*t$c0l#"* cVXj#4-t||G쭫t]D,~8Yg֑w)o*V75%:Aɐ3&bj9]E"vTtt@> ٧-'Q{+T驷u:Mhϑkv:@rp%Z6.2rcd[0!;hf7$"a|; =| ]BB@E*(O[J(ͮۋd sSV.=5ytX.y.@~i׾'.yi(?4+F!-^z:0Cxz׃2Ov,^)NƧXHՔ0.Y$Lu33*Wb]^|Ww?|կ  @lFumTOk˞(0حHXq)#"F~23NM@l*mx?U@OKQ0[\xj:T/'kc.^ꥰq3VVEI)ו1@|:4d{NG=@hM=p-j 1`LSs+Fza&bnXP=xg(PyTl0J0gFoLVׁ% O~&j<.gdFJ R3?=;9YX sGlCiH@$HtI3/0֐Yлq,..Y{< uQ0ydt!*l79b,'U0)̾Ԓژɢ$8gq-k|3"7in\|-q*fA4NI[ls[:_8O͌39`SJc3ES6(;#)_#upG8<Cre ,s7,_ `YF"LN] 7([\d#'kƓ/Q EQh"2kr3%>jlaq:xvP%['+E.O@Dȹ HxIVja5|1hRk Z pOv o]5ݮ!&=EN$LfUʴS*Z0S0amg߿X*3sag9!48Sy~&]` mWwvh> h0,ptxgLHl)8=<ޣ%W__iZTr E3Cjƒ`ְ{ҼUsIG4 ԇFxw} RN+@Y()VܢNDA""6qYb2;4Ȉ b+PC!/;>}5<ϰ]JD[~K}.cRQ'ΘV - YF0(kDd+nL|LP^=a<2~m;S!eP͏ft2A2&9cbUH i>@f/ ~0 ,0Ж־;.h/nBFw]M%ҦZ) ˜.:k $ӥ;.跇g>}I=G]:>I:T` Wg-#xyzfm$$Q(~-{1j9~, 2Nt-\$nwf>xaڽǝ>]pb8֤ D#|ڜR){b# N  m&RDsU`;x,_l[ g 0Cg!P+0aa "zJ7d#'- >q;5v_20C3T%Hh b^T1?t~B*5T#'IF}94$:'Q)^tB)\1TAt0B _1?5iS:4'tR="Ӊ(˶=GDs3L KW$$[v?&Y1,͠j@b8̝blS60ZpqInG{F?EȘbL(D<8R3dSj G }=ߏTѪ%Ɵt)>OoNT\ sw/Ѭ`JM"fcʟ i3I̐q:Ӽ< ˊp!-| $ }ʧuD!*0 P- Bݘ-i V4|ghy9fP)Iߚ|o!ǵQ꠭ P+'#)l *o9#$ ٨B0#,p4HSnKS4 8X M>e"Mބ$<2@~#O jXfl]+M5bXᾅ2튩߭GIEu&6p="MSq˟ř?NK B" & k }Jt~C X.f;jAq&vuC^TiO4yNIJ 3rK 0huigDңfAibp"uοN< ajjc&hAO=D5#7J&N dpE/pt-lم@/b7V;L~˿I:39Om;~*@}.jfnܑ/ $%v3%[܎J@םTt{Xm.TҀ"/rrViM Q :tui'a"*PS)ͦq.s mE$RD1K*4$dhshdW-fͱk޸uA-}ސ =8` =~n I<9ZZ{&l#'x<'MJm J[.q16G,1 q \52>y$+CX7ߝEFtYZQ4kvXF#"VךPXQa1O& +j=+ƌde:zH!9 6,d>Avoni6dH/!65>p}?wiӓ JZ9*zeNL]'rGDx%[qjjx4C,"$XgmjQ} "7j5K S>/Wť\NO'ý(#ԝ<)(e ـzj6!#&3Iŋ39_'RPb,a8$عw@wsN[7 7qgd{yr-N(֔PUP!2E(ɄMs =oZe[(Oba ;k$~V2 1 I  >rz& mT>"Mh\.gS X\#YsdS'aB3Q@'Mn3l>w(1 @U8qI@GN왞r=_Hg o:G- 14 g&vKstXE{9O}dSA0ӟ`1}+ǔ(gQGbj-JnT7Ό*+#V-x:=tP"p(,%h8V=I}B@+ )s}2x6/Bƫc`0t͐6g? ]F\76>\[:"bR֍⴫X3_MŊ I*vfRL1._w5!ow-hL5͉PP%^3؛jʥj!O!@`ƃ>5$„Y=OCiu)8Qgx$NC%6n fnR 4Ò  3bq) 1]D%Dź thͿ: _l4O=Va/v(QJoI϶=kc:;l;2s[Ӄ!r̿SJGJ ?'ChO_d2UW?STEl}妵'S"~*m)ױBݞ1sg(7#uMɉbsL >Y(uy26L(Sd&Ep0ӪDC@%g{$;>y0wW 7cn_ՕǐAdɍeax :fV/k rGM1-R>jbycdp;Ə1w,;cH'ALPt ?|L >&Y~J${q`$NyԎimoR]`:.axm"ʖ g\_ft9\# kdU>>QwzEYǽH$slЅȽV|΍{ٖ/90%-ӐD:-rlBZ|{(= Bn8ԊD<ϣM#QVȘ-T9&{ D#%AU !l{,Oyة/ZN$,o|XG+OiǎN{I7͓ `ѡ<4S6-+Lq"QxyvF,p7xfh5 +֬CV7oLEc&:¡v5WLꕎ P 8 '*b!d;ψ$GN65`fzM *">ʞ묜!ءsGBa 40>f>C#5 ׈'=Zl)*݇ <́ԚglB kqp=uԩ )9,A ǹpxIR3׻hep  htFk ~3 (f (#~zo(sP~#-sMbl'K2+џd޺k ^{ǚe>LYs*-tXCt(a:S('ۜ>'.za`r("0+TDqw}6: 6oz&y\O8 .=4u׋ꨦjb_Ɓ A˙UG*=&+XR.%SPz78OQ>F+[u/zg6٢ƚON6ޱ;%Uh &DžE`:0AY+W%njO2q09g4Wgk.=\B/. ~|?-&7AzLvAY:G&ENoح wCC*UIw$Y\[G!NiX,)CZTtjT-os2K-xG0* )8&ӿgo\5+ iQzm@F+Y9ߜ#/ȯA ߳W56P%H?o,`1C$䮇ŝ7uTQ@-YNʹspyBx1"%ЧkI~T<#WBSVM}x+F=ő6Z,jʀl>W6lFb2["~C qk ҆! 0!z^qn4TNM?(t* 3l1ػshg+Ip_xZ x@=cgQqHa@ .[z+LLXsK&;ZgX:z6_1`]C0qr1hf5/=i3=T<殧`Ía}U}b&;k@Fݴ%T@46Kjq]36ɊЗ_"/H)&]4Dl|-}w:1Jqp|!@m隮$1h9 is[@)P4cAZG.+A}‡QCP0p3k< Ұ9Ht2[*2ח:1åG.+#ڙIJg=IH(/Z3$5,Q \~a.@[ZxC/83F2|xH8yxt3l+ #?S0[<7ZV j@Gi+mgrK=g=N36աd/ x]'#`k:Zgu:K"J={%1w4ɰpj *< [n}W3H DX5 FHBR,Jq %oاjߧ(Gfg+^hP6&>pQ3٨$@Au/aNL.B"M?&VTH鑉 oȽ\']'/꣬iIc :;+1D[lu1Uaa芄6\>2Ra>.}X'߅ ] VFM&zbcnVht] W0^>;2D,тQso=ou,' a6)QpaV^'zzh߳`@9+51*!_!m ?]h=HDq;dzjM05Dt'3q&GZMʧoXʹ`U.L 6?&LW94"=PJƂFτR%"/Grkh +2pxO2Tf*fqOе~$V`>?? lQZ5Z]@y1S11'rX!t 7|裟h9֟1y)ܑ)ݍE[?㌇a=m~34)Dyx֜ \ڜĮ>2` [|i N5ĵvZ>x(p^r^Ê%"_7.v漬So4G=&D~vETU( *0J(W'M_k~P'B=څM ۋȵ#' 8QW<'$LcQ `Ү:cw2x)2 %- 1-&!Z <'?@>xN}8ΓuϷ [؅E8煨0'P5Q+[QN#R![qNFap%6~rY!,'4_1>g"/:QSw<~)J!ČzuӉҏy(U ۞][e]*/gRH,s`WrjБ>5~!4$4π3{\(Ṡ" "Ga/T wasrC|(ֿ)+!٘9*PI)՘Dy>S/2ejԤ[{`3K$PjhOߝ?iDGM f'Խ^Y#W& D?V-Ƙ_`#(@1Im(76kv0 ϫw~w8,2}ĥÙܛ'X<`Q–է^F>z.aGi!EqUr9~1[2'z&݁ X)Sj:$/0g2U)n5t(Ex3I:e}>=c@?udΊ9p++mD_\G&ɫӤ1.$-[2Jy$88!Íy-0 9yO˶Cс9t85^l^#W'~dtEb Frµv^գ,-1\r#zW*0Vq(3cvH 7~zVV[ƬvzYF)mw"kX#+hU,@ᕄ+ƹ,綸Yk+~(8P!.}Ze64M{PrӵRa#,o#v!"NH#h9߫ ^z*bkHb,Bi}HgV ^X5d }[ɪaNΑF62 3!P? t{A6]؃ʡ?y})ޢ,%NښxC{5$=Ob3˅|#9s.=%'OBM' iM[&l֓V! ay1Á!G wB@% )c=xQT ̅<)43LGӦ&ƒae)u@ _3@` .xՈP0W\~:t҅(Ph d<ƶ33AL2s %x$jTa(6M =w./֖-pcD"S 0P O:F~سpm& @O*E~4DR(]eq$؝CL ymuAfr.M~`h O[<-ZNa.q9Q̎8]tCt}E_LfwE&+ K'#Ѷt @?bV5iβ+IYEє4)׏ZkkkCgPe67N.X zB}r##BR_T"!:.fYCTL1`\$O쫬p&w*5**ɹ/Ti=xpsbL>ԣ5aZםԡ&=KfShԝP0;'e!(%MI$p omw@hI [)8-sn;6ܬ-֕P {ZLa4C%$ ~ť]rm!挸O> TIn %r6Yɩh%l e((z tY ϚSB;.(\'3S ѯЂZ^SJs2s~?p?mx;P5P)'KOQ[ 3.?Vz%"!JBC 1 &˿~,WjԔy8 q>WO\oɋݢOエ8'p-#{ 4X[dE#R<0Li%LޕA.r}kWy.|,L I+bEqTe;3S&5Pi]sT_8%Z?@٨p,%"XD4~ӏ6*w. % $x*n0sP(:/%{ d ^b]h Y$:Ix(ZbMX?;t-_9_Po-uF\V+21Sa#Cw$8=?H}I6V)[d~#dMxA;[ Z=`#B}EƫHB|T+qh~ΰLxkIA\QlZzR)6;G/ kC3x! SqR!E\ /hoWXP*Lߧ 7(zAWͺB |힤4h"y4 AFmT& !t&k(+TLoXm)pPR)UE=M5#)lr&Պnm3ÌE3 KFByx]s׮H #W%#e Vv\]5Z(p -9Wb,akeBv1AZq2gKQY{nypbSH}Ѱ ?I;3%47,L&]Ԍh'` .A^XDw!o4%% M#B1s zu. )֋nn ,Oᔬ^=mhT =ͯ ZRf%{ +|&pU i LL:Q?5UFhP!0̪+#MC_߈beͬ)Qdt! V XKG=>z: %\y1Rgs'. } Ib/X,> @oߟJQM_pn7&( ҟR%< q/0沆RƇyatBb9i;]6#ǬodODO?G0$>߉DR49}֊c b%Y=- WfAu*( 8So^8shE਩yԑw6Եv?5xW#V,ai>JvCIcʎzƩ-,3Mlw9]|9}2#897"poCj).(;,;R57|}~Nc392 7񴊅PCE[*n찱m]!<>"vj y:bēu%<'k\]T4yNz8Ҳ]J.? 1Rti"]{#{Ɔ5Xqݸ:OO=&tAO!N5?,N<3!fQ&`0,c{`3aKm/x| ZVKx@&:#@X's;mz]fmzW~ln(UGk%>ƪ?v~mr*Y.{xtT*K?[Ʉ ,ulB6x:8Mk J9t~R{)Ƀ)V"$ ƐuHQjrIOo_bs-cy g)KPݠe9iQ~' Ïta z\ڜr$߯#{a]0Գmߎ33D#_-jכ,ڹ^ ɠ (I~ҶD7(4[7&ޫ}dԱV/Op-CrJ"2ů}I^'1bxpN]0+C\uqg{"u'vMX'j]0a\iP3fc /vjtTT\ʃgkZ^UґBjE+΀NiwSFD 6(hljYR챖ka]"T2ZHoM$^gg^|E*ʩbKqc)$a-_`5Av57xW"5&Uޙv|;\)"vU!_pU@[Js0t!U*)Yf7 ekP4ZeXPk9=Yeko4!'Cқ`X?7 D"xu *GK6y.Cw+[w(^XxsRE,KX=n.SjvS3QM'ei '[E*h`@B 0u5Cִ; #CxPϘ =iW|W;7/Qe( KƁ?<7'&D!bc \- G~_sLkޖ7bO /&(;LƩN7|:#NF;8=Lt[o r"mKB%LߐK hOt4UI ޒ.J5_^˜cQdgN7:sN.oISHIy?#N0z[LЕ̓A!L_,MN2Xd6" /ֵ;S^u*CWU:T@7kr@[i6~V’w|$q(D-ܗrwպ-#T9UNΔ25f8}OՊh9<#$@qW"?}?Q #˻lmܐMA됏M:vtN,*Gz /R݂&uSEO98le,dOS8)P4b,+L^ݱc #d=gw=#<3dz5ߵT޻6+ALjAU/ ,"̛g@qYuW*8lD6o^=[_@HW)b.Ê7"\ vLjzP୳wtm*3x_Ԟ9_Y%.Y`hٮv5 !ǻD$ cW<«_%H =j!Mi-;- 3wRBT.)bgeEFy_U64D`1+۹>Kj51t >9gQhN*: >y0(|sf"o6пuv#v5$2/rI[ C/kB-#?]v9 ҆A3EdIr'T@5a X6TQV=D:L\o1ib!!LH_3xK=>BtC?O +/Dr&X%{ la㰏yp":0){ Y< 93[L +bv4(:$#nz6Om@SAjwΓArI(I-ɝH'Q>[r8 by-rBƸUۍq=ruMy;Cay'a#E4&R `Ot8ӠW Wq9,j ǵ%:m8c G7WNhqW u"im̃!E:0+hCC$ Nei6 5{G n6*=Q-<&#=I!Yٌ,+5̂27,*06Vζ#cc8Xp"64~ 5B96VAAb/#S! Aomëns:G|J/)RaKt] N *ٲ&\{3I5.ڕ0Γf|BEz+/,- o- 9RP18EX6;xx&8(G#$*~,F` èpF2 v!#Xڵ\R=;>K'2m7ۨ9SF?W vG's3$r (5sHnrWׅvmS1W@NrP֗zO-Mg3Hs_=H,H Q᭐ `; H[&<4Zw-v(~f{Zٴ(8J/ h1ac"rG^?2Ɯj;gy>;~ߧzgI!3]u%cיfݺבۧ-\Bzt4 .a'}p2l͛+wԠׂv`4:m6JUX]n׀/<$"Bu8Ʈ%TTO* 7 \8{$stq->j :#ZO]m3c y;糢 ~N Eя,%9^_IvxQקJ`bhų 7}.q-8ʝ樮)S=~[f"\tQ R9<7 SZa\w]r\+y货&Ey4s50! 0 zz+@65 Y9H!|MUYXv-5?Z\PGZ)c;{x3$}4ie*;u9FvQ f>&(N5#zheǗ!R%G4*d)/#-).Yȁ4B3]sg!|Z?2>(]$8@ X5Sb5*1>9Ψ'rdt-d-U (+z a}ѸxFEk2hZb6Yq#r9]F>B7@8UVcٺzc+T '|Pq+ἏiY|5Ѧ0FGNvïĹ=cr=DRqï OKxT12SJc1&V/M[A*s^Q!i/+aQ5>[j).=#d+;Hܤ|D'ҊyYGL", <2;L%:Dq-=/Y*7̇;I.HʘqQ<[:xL{/iO~G:dM~F*Y$`}~lql$D^DGomu++H"VB-5ユlv^6DYq8U,PCb K3$#*5u\$j螸z@`v,6ƒu&l]-g*ݗ]@( PĚPY%/ǴI5^@:}(`1VRE$}pm !8&vPRr'^鸽V# Y;M`th)oN䦫CO(#'P,-)P`x+3NHKіQv8,hVgL2.VO]G40Gޚo}=9*k쾣4YA<`_j/)3dASW?% 8q;kT)g( /(=5vRM ) tİd<rgs:Y+$Sp$?zG`JmH$0mYlh 0 zR.ٿ-^-o漩igٟ&e4/y*aw9Uݥ#8a2򺺜#U ,cy{Z%ViC,9[*Cx%x™NdžW.*,o8/y)kj]q59}-1w@ !C4&zN%<2?ϪA !yvIty{s rرb.J‚ iTIё+XZ(NޝJ}svdDbEv6pT 3#UxncPA}d)?VOUk O%>Ln4f:',c+9m͢B3ʔ&/Hv1;D5&HK9B_{N>zU-0o =$vih&Nm]F8NuM)Dbh0PTXF6bYhӠX3t{¨ckG!ω<:EA`JٵBdap6 /uB, VQO㗢XпS2_2Q'fgBįhz?t7[j&1wgNS~[9YOpQ2p=iiJ߀|SlQ1RCf&]@a[&τOZ'_}/Dt:9]r[]Q(&|01ٶe;񪈄CڕXڒ|97nLG%ժP{i&۟AȲE1nnb.6 %*uRzkW  ;i:vmi(b&Wh:iDssFġ$ȃlC_LW@ 6J- $_+cktw_mP79%v{Yt|QFhlrs2I#TZb^=R嗵4ox,ulfRbA:^7(+Rּc@֓}N-E{k~X"f ,|PxVVJ\%]xZn+oc7dN}]3kZuEJ6%>is_s+Qn/ atk"?M>eϙqPv ! {3R*~ųC@u^L)NZmI5鰬o[P* nD.D8-N!#Jr4"KCy6F,)lԍݎªn3횔TZrX8' 4Ĥ~JyR*e^?4?GrX ͞gu5O Ƹ^=O(reݐ~CK"&3_ cM2!H~q]Tg?+Mwϻd?!n-9~sq$&au 'iZJSxQޏQt.\01qRhVIecճ;Qj9s<hw> >SM>1er/rȅ`*&KhVK!=~\Uc:'*I8w0]aL3z+8t'b  #-0:XԐ^{h'`[SNk8JQ^: ;S;LaSX71qC#u '%yhc.}M,_ӦjBLq^oY,&sZC#w®f4S2?G[+ݬ9Xsh> ;ݕ ^"#PCe`Day&'O-߉T; WvjkX$뇔~xA0V)FEn'9,=Tf[ ZVtKט椴/ "<;&i@X ? Ρ *w/C'LCuoNAO;BpSHJsA1 i~Yن-V%'Lhڜвy}K0GkA%2ccr*l _㸹7MYF.p;5;?Ԃց=R@])! qcLLtNMgbs)4"(hB^k|_Qn +zsR3`Aí&deМl8seb Z_Q0$3~/B~:ćFRz(f1a8ln/IǠ*}bȺo $j1JAʢ{Hu@{zJ=ShtqbDE pMIHQNY*&QW9{-̝[.g&~:5A0c%ǭJ?EC:[R<}Y74lG ʕ6ٕJ%dE5z¢3H<{= B1OI /kABs@ ڌ1e#z$:dC`hI'WhOGިV$3>T=Ûl"Y n:Xk?\.Miv cf.ukc!IwF9jX)8~tX0#DZn@d^_ f")ң!n<,բ%գP5wΡ7j jJ-8Ņ7efnVRV!B"0gI҂n6w#"7gS-"[iv+<ۆ# +&h`jrTX}6 zh Ez68uhܳ˧4G['kI"FCɂ`ýQ2*Xo?*~1H|c94- Bl6.KB^`ngO5@O' ->@OGc1Xn:|!#fPP#_kI;)k$CBcG+\R4^>LM L Pٸ]ڠ3&6 Qt Ei}H]~0CH$x D>?lt#I+:=,*{0[E{fpnĈoef M$Lܒ1P j#Qa-q { [ԏ#CE~lE83/Grv _a$$'_idt#XjUz-p1]sDs'= Q,9E tx( `uPq_Le7 %(K9 ƞ\ɚz ?߻O"owiGwƳ{@ِת#G+e Y/$R62BG2޵ew{ s()ѝxݓ!|U#UЏr(tEExC*oW[/+lϡ2іVàfU W4Υ3GS $*[!Bz$`Gf!AO|(7qjoӥ-E)c@?,rRrrKH8f \3a[G3tB'/9> eeyjYtxIzڧ@N(E6_ozXɨ!+a2n]ւ˵v̢HuEE>1bZuqɿeQ*m[mi#k\'F0y7RNC/?tHCղD31W|Wm9]'!TpQ蔊&hg=VCK] S2>8@p&$Y,&3ٝ(ԾUD~NXP 0mo2 q(PšnjUM'd!W;`ME~-Q)&о&t9I !EjG9;qB,H3"$,.l4Ms# xDvfƝ7@*-{f,0 0 8EWm!&u$xYs7}]\C8I.2x@P"9s.n }>VPd+r9M 3gTi+%d֟6LrnCp?gxɀTa[K^^#", QۘIT δB92^`=߬* h%?jS!:"ǾusX5a#kqg gԔğA&hSB.[sИ7x>u&y/C_zӸ1PE~ %0XwůXBy~֛^P.iS;O9;(-e_ZrJMxơM%ny>p~ ݏa^8 a}&D._5 Uދq\sbL _9{(A(j&/e{4&Λ%$sQrE0T{~ZAØB)/-s;i%DV~[qz8DڡOis 2WuKY/='le59|ozCE)$$ '$ۉ 䙕YV^3sveM(6.Q\ 'dr]! w()4):e!(0ZNy޴iДrDH|k? *2w|lqg@W":OZ[FO,>@hVNB1N F0'Pvl:S=A/?X*$0 rJ i^ Q REվN.kE5m<=CGw"ǼCΥA)[GSKEF]bKAE&AqR(-;Q5/Y_Z3fIvp' E\!9;{(H [ .nJi8hSyMç!`%}2ZqIGFB(s ]U*.Anpb(ܟ$Ri5!4f:w C_$sѨ؞$"<Nw-4ܸPu/KJٟ-" "8A礒gǗ2ݜZ9> PgSuRlO # zARfJf Ԑȓfgzl,PNQR'Qͨ 5%8~Y0}~7's2  &At#|>O"9.Of?䫲o5R,*bł+!z6cf@OVnUf7uAvc6T t?qJG%u9u)Sy35*!2jOML{nGH3oG´}*D3da?YJ!!5 $~~ߜPgjx}6{Ώ752! $@}~)"l3^KBP#`pUn's3/'1GFo90L6Sofk bmh1IWcH<h+ 2Ʌ(:}=m|Z G!9|Bpt<2j 4]R C ~1ΘiG#L/ Q?B@zSN tހ c];'rXhbݮ`.^=O7&ûp(pAd #N0]gj` 62х~9w(ol&b<.B&BdtH+VV̧Jίҭ}`X 6P?P/N<ୣ iR"$dOsa T*YKSD} *=cP*tޔhf5L^rW: AoaaQ@!:, BqSHVN˹Te?)GI2rMا ہ,X1A)a=(_4m{0(׾\&1yD @ I S s:44OpW(˸aF;gv0IAA~cl-%3s&WfT"_]|q9e?_XN6.mt{C|X'vnaZy2ZK)?1|Jz>q52ˈ?sچBZo>LnrB f!~ӧ)CAOHi' Sx鸿ȑSncZ0X'0$oa-;>vI$<a^v\1xQ%v&wE:=t;^D}ET/ysW9 LQ= V{_;8i+år70-6%R6R4h9[XӼz79.hf>feEr.YG5%:c:?;1DD7X̻!W$qPIي&땵Ʉdf`.*jkm-*N[jeV[89oD8PGy"yv%vO#e{}#ۘ+vgT,_)#L`\,U|ݵ)v,+(9/t7koQO/`Z|o"[qF f#;6m89T4&[aKĭR+ N?ɃG-q:^5Y'6p!4^Rl\R+5QĢ[!&&vO9fuK汱N*p`}Cp1PaְS#DǿR`m4F\.*fo'>nNܷ2X2 !WiF Ա' b;ӥ?n?P)-p!HIHϜIi3F1t^ԏV_!n 3G }:Ƒ@3,2 X( t8PR$Re-@l"L0 ?o2D5Nn$c%CA ٻM}"A+.S=n=`OQj2 :3kJ*:Tp&ђdR@[њ+$" f:M[0qc&Юs-+ rguN<pEAs*w!dV9FɟUT}` $vfˈQꧭz0#bk)9߸K@%Y|:~,:sн^V_ ]7d [Nn(㎪_m϶{"r҉27JڂyE+>=&G,[,Bz8];{W:q!beg6G&Vxi{ՉlC:vT]-"دkփ:JlG`Fɧpu 4@*Λd= Q]GYWL(Qf5a!^ƥz,Xqv)[$a_!)e7O7͎TT3Ӳ#n9g)'t>o#_2)A%4Ÿێ12  2 \#rt/ @܎~˟(o37^Rm(ʓM^2ʼ@3&* a28aI?U {|qXE5}Krv = .'~+gЙ*[W{&(n\GTPLy1]D@r)JieW*>*H1'4Fa23Rmv&y51́甑>ZXs0}@b!vpPp*Y<_y ^NhT1jYa3wiFš.X%Cbbj+D Hra:rA:m/TcD(ڎjH@I;7ꑴ=YH٫-h¸! %feEe!MoV9&$Q.M~IW#j ,Dǂ.c908﯍^VB$k0қ׊qln]/$<16REѼƂ+ |5;-[Q 9>67I2YlSi?ٲZ/><"Hi%phϋHxM"+.L îs]*!~5@2O Α/n:Q:..!>dעC̪B6 5OizN*>eTUCt)MhFc,4F8od<:+  TFOE WXyԪHuK0׊֭:#)-fhkX~aœ Y5%D arմ!1w[<XuQU\;'K "jTr ! S*G4 1)dzyG̦-E t&!/ЅP1XYyQc%=p;3z חO n iyw&j%_}㔎ɘTW0XUV_.d}6?]:>)-+\;Sߛcubk,{X>t҉)c8xg63 ւR`i;.eNQG373 `)<ѵ3!: =ˬs paG37F@Sj`Ih ?(5ߟc(![ώfM2ow.ss -"[b2|a?b q2Hp|rM3xm4'T7Ma?Z7OgʀMv']1')`{ΰo#H`oNT=9Ô%琘̿AW$BMcn_|!~oB-.+m4H!I[ljb Vx/e9$L͔=2RMC6+=_$-D1?'d%g0!6WB 7 - &=8@0=b|iʄЄK8[8pP#^َ>ft O2"[3/#6r< $,2οZe)M\"K<_ZX`]OSOJp?sa* b( pn4#(#FL^y55GS=MEClpimkA!q@H0[wT 7k)o_Q|a2U0*DJY8m4S㥛 rh|?5^I +S㥛 (\(\(\(\(\(\(43333333333333333333333333333333@(2>'0 =%&/ʚ;@@%.D)5:9a$ =y-hL8o#@ h,ڂ7z"ȱ"k:^+ŭ56$ !Z*@h;4(!PXT!ridn[)3a%>^O TBc(As|2@H`?|g- jkq' [8DM1̱7=W„&lA%06Үp/< =bC-T%hUE:8/sWIS:@r34n$gR|k@-tA3g[1e9 #" hfή:2#mp B?D6d%u@'C_N*`;1@ʔia"b58J:>h:'}]!&>~q/O0M{Q"lj<qk8bݥsv%DŨ/GT;2Sz/qR)>1uX;M;O2#>>W%H 8ъT yu].ZH/)e*6Qr*9@8ssQzU"N9$P,Po/Z7")DG-,8etK1js&8"(sy?"(ح_# *KRWij+2#N7,ĭ{DE7xAIӧLZ1 o"@#בQ=߰pe^NK.+Lv":A^ 5Uh\{. hZ6:m&+!llj53Z 1oĈ5+*TZd0$B l4st>xIv٪# ُj:"NF$nܕԏUh2.)@r6FWSjWy3hGb8= mV V^؂, BzF` MqlkXu]|7(XxOBa:Gsr\uD2 wnVc5q(*R>t*> Yú9sE'5ML/tfGP~G1@U3g!¹Cٸ;ѣ2@Y]]=HuY4T겇b/Z&o 餟i0v'Zѻ/@NjYE]: ]PdU4B O)KZ$et7RcK0- {mr'Y~ۂ^p=&9@kz*d}WobP/ύf-#F"5\- {${;C1ߥ,@+Y͙YK=W7 [s5 4x^/}&VȖ"kB1fƐ^\UB^(A6akz+<4vu%%3қzz#{6{IVңi7EcAB,!?M"T̿aYܫ\ DgR)`*a*ǿ/oӖ3F+'ztpx95Jz]%Df)l7ڳH&pC!ݘMuI/եzt$G6a/L)*H{J\Yſ;3:mOͤc񌎹z0ϣcS| H-0\пy'<Ìxݻfh(̀+9s/X1o}+Gj C2V!vGkjƐ;=\ܘr?Lt" |zQ%f7wvSqħ' RW#٥./n@UxlGTh@1֎&-aOO:컉F*GYi"=F%^sqsVlz#^ׁQZչ&SaК YMKKh0}Ϧ(37Uys񰄁&Ho0Z^P]PEh7!U358f]GR_+Ae")5+»ƿUȫr$E!Av*s6j/k17VOtjр$55!EB~5ljp斤!1QV\HC߼5+̭ )ek3BӲI6P?+{4o# Ooį zR9LJ]ZX 4K,b䋵ۻri'׹4jq)A^7{j!M($ @35).bE 1JեâIw%6UR0VH APOJt [-|?Z (c xj$CQc1k9%[O%rT 2{([PŇn2#->Mm2t/c5^-\j'O OVDZFDõx0{Wk9%[Z_4ֻ0F=5F7[nCܲx^˻Nfu/&I5)>Cվ־/]~o\Zxg<`n%o;'5Lx `e,>J%4C7 _j(yfD\>7bO]X.wEˡ gjU:QtD: mZ,+Qz珳άBp.j$]MPquXgfdsHXSޕJ-`dJMu/ِ.hV;e]8q~NP)DspZ#E~zk#kb3 *1+;c+[ǬYt,pz(tkhf六7ħlX`h9>VRw"чn4Cc.ȍ+橆kR3i+I")!<9:16%`Ti=D6nZ,tpcľB4>A޿!ʢ3xבb |u끅N JoPe*{}@։M6;**:We&|Eˋ4m.%vKZMXem _&!blBv[rp%d`P c6f)>g;Sk.Y>3W3 actW!.@=;FG_=RkX ,hF9|Qi9\Jn(7@GܥG?@^fa(2E~SY0Ԝ6ޫyͲ,?+ 5A3у*)"jkl{'Lr $56t?n"EZ1reLK(wm‘CQɕ'U'樜=˧)/y L;ʒ!8M؏!&z|c*20.Y]cW[uG(Q[|?<'ݭ`W:E}Yl,iy%pTYڸ#i$ݯwgW!Eem/go)L&mԛiUA-CjV:ɕj:d <}OKh5!QZ_[>DF^# R \kj0w`M;صd,MϢЭs8։bnZIN=8%0LX%Z#;3][X%#1/|_.\l e4ή)Y+r:!93:-g 0^Zto6)5֚Q$~8x -[Į1)d*HM2oLquA4Bi ?ӧMpE0;笉@ 7lΨQAC`LGd@W !\(wĄ<ȅ:Tx }}{L)33K:'ÇiVg_KTh] @?}Goɭ4aCHoZh'ݧvrU<(Tt q1Njb*7&iQM K>$ T"}e)2_P1& שdq 9A~ $vdb0iLM&OP1`T <,/౎ܢތܰT޼&wf Y^-K-K05jzl/@gQnwXh; hY3#c krq4u!% U/";Oe[i.ePB*{+\ A7m>rnp!G: RioQ`о$&g(E6uB$_9%xxn*@ r֟WS-1EG~>% x!+%w-8:#i~Wty?:ߜwji# 쭧2_^ˡj ]kcC,PgQ#v9K=K4FZfkWx)!jYqi"YcZDYCShiƟ8Tt6*ac{k/ŕ/hD( j4][>@pZ- ѪBdy$H 4ͱP sۤ-OUj>X-ښ-9)nAdONONCxY*DM.y39 QJZq* RuKѤ|X٠&;X%ʇc"KP'ÞN˦e&;nIJiS(b^$1t!~ICS[,v,Y+(ֲ"um= dNj5jVg@;*xh2kůid& }1DÑ,YѼ4BBO3,/Mܽ,_4w/QWl;#?7;mc콒Vc>YkR6B~%T:EIXv$hm7,dF[).#i$;.HE7}{q[Hb2DUc:> wu<\yMB.&9m=O K$$Ԓ .yp #ϝa-@wqw.& GLCEz59l? ݷ ,ЩarJˠEl#*IcM ;D{:VDZ,)uh\z¼`I_OIUIjS= M,97:Iyu܍n!q#սm"'"1wSq6ʩiklJ +a(0誜+j>~Ux <†(duy2<16.5K1B9$b_eb"qbx/G᭺?nww~*[H烅VVwYYϟJU^G5XprTZc%Nw$L!7: O[雰M<ڼJՀ)pb~rg+AalZJ )4Ui{X禬Z +`2rpBxDZ+m|Ҡ}@<(58l SfM*]2[CƏGCG t8D4H5uԾ?۹ ,p&H*  A)EW'R􏬷͔0L54OP,8_1ǝgea|]!B-ev[>€#w~<@m)u G<2JLdz9)&D`씄^LPq )tR G G\_؇3u00y'%6_K3g;#Y3™D1C'g&9K)`B)N]G1ɢa@Q_$3j}a05}{ }~vz%w>!-@fKEiBy|\Z(Wi8SOA-@=̍z¶XA#h">B8L?񝧘6KsZw,ۡRFm>3Ph}Zq7(E@sydB2AznFln"s率З=Qs~U X6 +ġr LX%PQ_LC5aW3c{/uj֟!gaa9A&:-<{*g&:i|F̧o4v.5$'0ՉI w 2;zB` 0;K[U ">0II3S)=%s-(Cv'%.G5`o_3s9&nзC8԰U8K7y/ OĥmT­ +8?3&T;fs; &2÷T%@az9c Xt9Ʃ.PD$ s-Y S[ʼ Q  7T:V-N/yU 7tݢt$^8IMay{T:~+xQ Gˑ-X\!WZ]vV9fXy>8rFs!1vXz? #NGXO%(!>DyT4܏u`,"ۮ.P9B4Ҁy7H-R&] r8 dҩ+~d؃K"+o4+FXm~vq}Τ^u+f64RXQX k q,R6:9@l`37uemBC#R ۱!GPG518SMvTκRp*jY$F@& zTW.#g 5ⷶq],wht46u'!ietu7U, Hm{Ȝq)CRRZk1 !͚ZCy3joS{s5`Ey8| a DxvU(ޛ _BVNy(UV.T +ತB`4 R,gbl29i5MSxPg {=?s3A!74K}6QRѠ[8v'O@5֜Ef!Ib؝h1cZ #G2.ζN=>9禸bp[6Oc w<@r)QP&Ц)=M#|Os%"?0Ʉy+yYЮ*O<@R8lXL[[}7 WyB:%PFn1:ŲDOE-XI&/$db!X)JGQv#c9ݷۯ:~ 7YvkVXn2M$<ެNԚl+i\hcq.X!l_ۉ9GvèjsŽM9 w)$e)z“N9cՕ#w0bzijb3m~gS8bꇧJ\,TI }l`;g^(ik3+8MC&#q%d`@LL/bcRr#J!ԯlߍc.}xv-_㺚;+)eWqy4U86iJ06]Qt=!ޠ5#EPuo^H"(%5RG8M? lV"ړ5R v*r"o&Y [;j8#ap5u9-Ttbb|9P9z!G8iA(_vzecG@HGW)=ERS~j|eYQO4xT,)4ksWztHm#Xr/̱ i7bFP협3,mI/,^;?(vDz X(/x;뷩6 3v .)n~; %T$B?E|'dW/|坴-Ư6 'Wۤ7e,~-;6\^!aD0L1,]~7Cٗ6j-:DU<\>\ˠ|;^ 2b!\&3HcZ[ j*sMU#g0=|1E=3JPn}ŕϠ< ޶-K .n Y&=HbQ$G.8JwMM//M%em7N yhB ;湒x;pL7%F#쇁mid/[+%z/Mm,{j20O,Vh**"}M\.?b75laQۺNPqc+/ޝ"#ǹeu)"Em$a8TN_8(Yk myF!w;h*6t#y#y8TƦ% 1u*7p*!hnlW,vF)w?~!A*Gη>3eiW2&?j'#4AL,R'?@_İaCrvegU!7_wgNIT]>v+D)7Ab3)M}T63={;B1/@f|9PA= ZJ{+>:PH H6?rL(8 ]hwIdZ0QZς_2,ƋPtB[p|?ӣł#Ҥ>f.\׸IeY dGdfn61VZ'BH:3 gF꛾E8=Y ą*+x11SBkWUY 5'6}=H4Po~Ls7'8,BYn&ZA ^C$ LТiqO 0p5T-(_1 s74Iew <[pg%BfxTy>3秢 .х*s%qLicWQKyeyEgG.FqZ& LXyOW:s"ٺ-RNeWڬɑ(sq^Oz D9vͥL[F;0a1 #< 0-G@ ߇IGx!, }Y ^uY\(/07Lj"Nץq@&R>=9T^*3"*!`MOeЯ&+%`LG-e?+*xq![ܶq.xcy26M%?Z9nIG[ /@ _y""' rc:>7u*qYϨN9| ];IDU59篗)-g#e U!sՕ  s9AUamYUvx)I}JOaDHRg-ɯ|+G[4!Ѽ*m m-{ 9*sRJlZFH +Uף)_(1^bWZbvw 6X2= x-EޔD?g:W\ /y)^O6}xm]& -K{9vKCWV40*L8#Z}&H ԢܴDSy-'l6w"WNXe |EA~5+9b>WnT$|-܅5Dd,U}^,\5ͨ!<(4F#\XbX673R>*(;aK63הl2tz;&MX64ļs݃,u8r0ב3 S7PkHdJ xeF>Lv)'$Z >y C~ ;p2\39[Xにk fnO%l\ r\bNw :uJ`. ({"fHU@N]xLhS (2+d7k:ZСte8( >[>p$Rr"~ ғykG/'1G ã-\k]_oWF06Wг 9a 4i4ъ%9=7b[;H6b<ᤣï:v[+D&:2JڟzK0Y! tT豮6/uɾug缠Ri T.c^Z;=Wv 3"z^%d u,,BQPy$2|f7.P!+! 81zv06%>,@@c:vr:5#j^L[*|/oA7~, (H[~$OjDysv4[ VyH #2-+dػT.2VF5Ϋn9 [a?gu(]A_8Ss`+w$e#91zrw.A9m>,ExRqWh!gⰺDF3N7uv{Ӧ6@Ek\`Ő"RTenPS 8JG0ڡE"sx+)Bdŧ e5P UꚐV42a6!Z`?^H_ur&``!l8;6z sp:xc99{*՜:ÊNagv%O IVI75$:&i1NjՍմ0!mʥ]h\]o4D}WniK13K })(=uA\=gUCZI39)1PUwY9IYҘXi Gs=,*կATpa #o.p(PfMwNuiiyҨKn:2^' V3?92{ IgN?X0w4M+%⟲'oc.^C'nꕁ#Gd #$iM'=_֙#M)3_!<- U2DI`0 Kl^agr_ܷ)Q>[Z3/Wq+h8,\Wďol=mFI|#7s`ĭӋ`njxnb[,E.e (y;6. q7<+ed=]of7e6"8 Hv^k4K8{Y@Ee?YP+&QF^oV~?OC0%65]AXY# E.QQ*~.!BIQn\?0,oqQq$!bנL*"3O< Rͥ7n: .d"841R#Nfu?ŪFj"}JM<=y,EzG*,, U1lNx& mX&xVٓij57\ 4=`2b0N/l_E i:z<1ݍ"!/ p-[,N%S}ZrUq~b)꺅 82a.ΪuKe)'O Yǖ c%z9:Vx SOzXkqwp<W죰$c^q/(#﬈. E`ӕm-uX̾;*ت>7o>WfHH!T9΀?WEw*gŠ63@ #-TaUxsJ(@P,8BSX\j2kX2PdE 7394Yق2pƿlCw۱?^P"4FG%#? GbURެ6dY+W`A.sNYE%X=6ASG35R\, +"ܷ?#R@NbgsLdALx*ӥ,* !$;CP5Q0d5Og݉;"0j`R!3~^!cTl !j:4)etԘ2)i qw`i?I3쥶t~ӟ #4v67$ȲJ6GX'r:f'W -z_P]Ċ oʪI݄?(Ev=Xw4uO^RX}f!-2]ӌ.A&q-ՊfÙ?Si8?eP=} gKM ]Wr1%UIB&|^Y( ю;{5}nuS۩S0J3(?JڂB S(RѲ< پNQIR&/4Y\1%EmSx \:o;/k//(3r ɏa; F;fe=mpa_H&Y[l%4$ %̹wڷp|U0rGeF4d-O.?%(ZjOWA)279;'Y7½H>K-$rYq'Y]o{39 R9-L-ϯ,Nq/4 2egZȷQ_8P|/G?8P%!`2PT#cYZǠF$SWnr>d),51^}O42 މ"Y1m^K; DZ!u]c& ŷaV,kDB 6ʸ 8*-W4!O%k 4ĥO#ǥ4kVW|s1V<]v [rnvm[LЦk .Iaul!)V HrӄxFNDzṒ|xi3t%ImCS k,j,-M." Ѯ演ۧHT̅7']wA8 ~*(ZZ y!@gqfQIei52'p(gG#T$*FaJ>ge>Fy@E0ᕴV8LdVs:cDi^k7^>2pU+}"J$x|$6F>++6c{" Q-[+ɾ_ #+f"U(j|L6,q_5PjA/α5'7ٻ!oCq 3Q!lb"8BzЪ6#˓Ô W*ue){+ƒD}T<lzx,&Zu~Xo6r-δ w8W[LOP"ϸ"OcTFCmkr#$$C*U}'"|G Ok>.)5.bXҕm8BvLdp#cՂO@X̙'dOyt ڼP=@q1>ܣџ;lm\6YMP@ =ϦiC}pWc3/ 02H&xjJ۔l|52x;)>ZbY040B)#Q3ko<,-#RKT ^59?9{% 3&^i;`;i˚C! J7/(VCXJbJr9D~A);hٙZ6Q*.}ncy1$O\gOQ L*vS O$Qy_;~!a$͓Y(Gqcmu7ʝ@iYV-\!^ X|YȎMS<Őw+I8xG[H~7=yTE{:Jv-#WXĚ}rB^酌)zɐS*+luݟΙҵdoYX`t6@ #!񆃞epWbZ"E%$l)@ h$:Lzcd_US*GT.m3бقw %Y|=_+5<$] "qe߅wc m!gU2L-MWtB9e?WgU & (a)Aa>x mRSvq>-jo r[:k4ScK4SGIK)"+%GRy= 'i<^A(Yq3fu'Q] (q˵r5f@fS*_%138TNd>#JOq4e??nθk<%BEf}2=s+̴_'Å#%d0P/m P"0I`l4g-j-7?=${ ꑇt=zÀ\|,vM}n82$& ס4OTߠ-4 /~1ذmMAc)c, dM;2&`ɭdpGy]>`Ͼ0?%.}l);} fU 8.wzdzަO?\Pk`r}$2:*\0KQ¹9c|K.bV|_$?s]R$2{[mSz%lۢw-r{f?z̴Z h.8'A:mY`gMxSG}T;w#V:oxA>a?Vٙi f,=6V!ҍ9,xsPVL7S5T5U+G2XµoV" 2)*@5>"3 l\+("Kt#54Q[vs`Ω36Y2ȒT6ಲ5*H<!Ji4!rza_4Z`_]AX*[O羑Y%9D7cG0#4Q4QPW/jyޞSd.!%$-=:Mm[#P[h{/I/Z)o7nTxy̆H2,1;{34?Udm&*?B%A-{uN OOqkHB0a7ΒnxYxkb("sM)S|97JZVz2cG agۇ&_c\1dGu=?AVl x^BLio'VdŇѧ9K$6i#V5z0K1k'N^C ØXb.O<==6* ZL2kDyhw|q&'& ̎ĖtMvq߾`X'B<܍o#0uѨ[M9x. LS1m m ,$'D%Ds;4fBmDNlBhN0U /P ܂FaASBX+(}: 2F1L@[=%t)[e9JWl$<>߶ײLGo ܱ1m-4 tÍ5M0T^9~dHIc9,-3Gh)vpP{ > #xR`$Ʊ9@,?x;'pP I.7HTD# 8+2F2Z&l Voz#Hin~/>)uWa+ ُ+v dP:4 RmNpMϳ6!ABt@sqqta4"i|'_wmѵPzЍEy*\ȱ=6HWFX$D"rSr59fsOB V^MUG?tg!/O0re}#+OQ)ݩ;#7 =~SZgluߢ14*C%_"4ƮA/tX O˅ %,.q+w ;(c>g(n9zNvϨ։5/e9{2 WȨp[SL” \Q?6}i&PmظᳯίG/܃nMEY)3&›Y;p1$ 5ih0XJL%> L*I\~Cl<.᦮Oo(<尺9/9%nP#82])HԺt/@Xx/$g l.-fsZQ;P oV;퀦C.$9M}ܿPS1%ro%t)!ж9m\dhNs>Wʆ[.QSs)dIH3+"Yz}h9Ҟ9.Ui]]^Aʸ4xKlN7$b@y@t4&AV^aE-]z)(:P566<5 8LQ$/R9[a90(XuecF4^#`ez&<j?< 2;X5,8nny^ZDOKI1C7Nw E l~?ފ/)? "bc ;y[F ^>z)~,+$1{<yW{Έ5BhYB45e>vf ua!7ú!d>h}.dTP_Hs)*M\/@r8:}G$r7 г4phGcDlYbҰV"0b w%B|i1z,Q+!= {,))@JY= 칫IĪw%vfLw3]謻ȮW3T jQ/1* t"0{Zh@)p~Yi}EMdf{=p5(=+>1kЂ ޯܖ`LB2ֵ |`ct ՛C`>+@M\[3HmyexuC /D'6>`-[I׾SSp| ;1CēcN"9pYoyޯ籛.|(h< cZ=Z˗WBA 6iv򉷝_y%k;FX0߾V6Uj7›?M:lr%Xnnl]+92c7HG#.<44uǾ;<`c:F56ed $O ]#N@~J /v#9>vR &z66=NN2[g}=h# u振ă-1\H|o),P ISQ p^hK.~~sZ[@7g&2&I3&;s!I vx""?o{R<Ҫ^ߞ++ VkK"lD'‹9U6F5~6/oĵXY7t%Dԩ"E o 5U/.r"&I*Y}Kj{uz:\@75NCI^oq@ Ր_B!="9*6Mސ = w*)*y24 >Z!}$4N N3 f4-XHq (pw-z pg<)9sLy-ɮM2Ly("Srs 2x{cᑾ8ZAW%2+TanP 6 WAY6FH.p?{w!D҅p)thvlT,+,'YUi3#m͎XJ8Y9v^2 "2֓rfȀr5\wPH.P(>48W +Gd6:> 2VA- 95Y'ĈU`>_T 168z5'3jw)4FrD^TE ;0gER퀎u@8 =`@pKeX٦y鑨~9F4.&xPL~nHeйTdl$wBGX/dE'ʚ>D)cՕz(Y1;ޞRX *1:+~nt,\ I%uH~F7'5f.:(@$M!{O!3ל~_KZ&#X(ga\KVS=hfD#IN:9i/ Ttl&BQlۤH0;e8hDL00eGN[ПJJ]FTbq<<|?pluNlqM]'%ZOGT-'LbBհ/1#?p=VF+a8*" ɋ:u'fj& L <àܛ&^7$~SQEB 9 iGA5E-^Wf@RlְBN1kQĈ\ゖr9;? B)Dz5 #+sOb't ۿ_ЎA,l: Tȱ :Zү8vDφRo*8d9oEc]0#xaa5~6\GHwt<+時ۣ:ѝ§DaYU~K6'01iKĢ4Vw2;="%<~^uKA! 7lTԕB C*/K]4R ) ·iI;_ә̓5rnvG $_\p!ϼ iXwzJWrZQ&"-ws)l YCŜ՟0ʭ/k8U?4c?c_p#o>{"H>'׵/4jbl,KU&8L;?cɘE:}٠GI0- f2?ve[4<|D 9IV]_!i&y=߇[4_9Km?1Dgn!/QLi2ugdi=AQiAf;&&! yFr%7yboiHvVZaszg.`E g\;CӀ0p:YO:܎kf@3_*5Г$6l)A$rW`6tC8+sQ-7l˿4fƏةeuХ8 D{Z`˿nY'_iDtg#K159oc pSilCVA,GG`Lǭ m Lh&GQ7Jl`\L'U/|LL44"&Xx%15+i{6A% !8+/nVp/9ִg}vCځCc.h)HtB6:*6`)j(1 i!7ȴ\G1radY`mı4*S3Fwn>%yoxe54Uxus{֣Q/~w]N'*VC {b^մQ"15fxR jRj=R -3FÂb&'ٯ"Zx(,,^sc/co[+DќqVß27u>P|d;EbV )ڣ_[jx 's|%t׺,BMˆЌ7rV#؞.Q巒 $jpN&f񎆒:S[ׂf;KYtDV$gvlr㷃?u^~X/'Uy-GGrqܥd/pjg39"콌KƩ˹"rf׾#kgs8>hg+\Fm!j4X!#l r&B6e`}yɩI((,GN.s0~F;ň"[*1<d[[Lf{Uwy'_-%u=2qߤ΍*W+侁8{P/dDMNpB1uʭ6.$;k$?΀ɾlZB"]ND$-n?,5!{n+jاbU4.xzNwB)7 !Qj9,DQYPނZtL!$u@7'<# R0Wb\-%1K@^{lh}C f<:3g8"\y1cla.%Ԥx@#W%a| 0o& Ζ,i;UƦn!W z[9x  P7"E;h,6tGLv#K1|nul"jJw0X=[ 5E<+<⎕<%/h u0L5MyE'k}]a#HI^r?o!0=TͱB9,uaOO]Qf * } *]@#"GR9#?4b4uH::f{VUOr$x {uH7@*c/g-s׬! )12S8ڊE W;rA^xfP f`L3(_3v+tVyo^; @ 6t%{T!6 ж& (?.ٙc IKČ|0褖2ŎAzO<0~^]<"N>;H18  O[-:Xeհ5#'7> EB"w#(IY 06m"MvhSUl7s0oM'=BdCՇ0)U=/+()~enb8&S=)|AULyLr3~\ {/L9=[ rgjWzN@;Cx_9,Fv,Bߓ1C S%VGi*!t78W=bS(ԧ.Ƀ,]uu魑yE h{%2Q: 9^;0ri kh$!mWs$K (cF.-i-/-9xM ;sI´C":WJhz8pkme*sUd춒.a k#L b7m-O9kp§d7z9Ѕ~,ߧ >: =G/D'7cɔTS}[gwDF{}"<&z\2AzVKZ!2s+m{(T~vcٚ^),~XrP6Gߵ$LԟcX)@ӈ=b&OwG!W-'ɇ|.D B"Un*,\0/U!K8%z Sk 5 ٛJQM.CMZ rKʙ&!Bf"e+!% ӏ$=@p)j?vi^XĜ3-I&mLP3c2Ybۛsa]`7/_ "?ݗc:adBтPyt8+Ew(};yҚVI鑆vcj2I ׼Agg\^c6(T<=K:?*Nƍ!ݴEOф'4]8q 201}jO""Df1v[uj|^=& Ey+=9J;@Y tm\[W&2  ,;&J N|C߾o 3H($=0\tN5b[ÿW[~qtm M<|(!QalM__7q&0Rɋ%%`ridf 7ЅLη&]]//!x=5E'e\alp4j5;:a: ,O#Ax+_ڼC`0$6K]kVv|A.P8kt ƕYT_e59z>[?l&R_)0#GY͡Nz2#"'},X pZAJ"D|,r, b(8Wf񰭬Khnfo[qgֽ#m-ٗ^:C@K׹97L-+m/yd=у|ZSMhaE86%˞9c하Y4205$ `cF"/ ~J`Fi~ p|?| 4 8<*zPX\x Cj[Oˣi GK׎5M29t?jÉwi_h OFy!WJ. R3lUCYb)>\9&Ƴ@G!+I/Gb{~M4gz#)[pT/,9}В2 7o l3vrw~( q1H_/dzU9.?f5Nƭ3hpf=Z6s{z=~9eϿŅ7?a `f8nG(oD_'yIr$K#%``71t 8-H^lڈP/x>8Y>O9فMO1U f#&"b7 2VO"c #*%͈?,e0Y;E6ώ>z,*|諴-oN4^kOw~l< EAgMq|Q࢑ #& ^f߀zeM&F%i! 6¬/Zvao' oniUv;{y'x셥[%9R0)%ױwTq(Wg2g/{Sf.I&zL5-񕼑\HE"Y'޶:c]oٻD_:~n+sVk/1d Jny5JPAF{=ޅkacmP&2Sn*Rf2'" m&V*9<r' p.+O0:,!:8H Og0\aLb>M8b o=7G0c}%i4l0е-LY{+P.1e2B=EbfaGoZ6$:?_"( [%V$oӷAU_nwJ-ȥloon7$>ٴ]WB9^'6%S%Ƣ$Q-:v#tqlB$燐wKI%VIԻ,t.(HDžRQU^c('kq\檹7ݯxS2s>y!M "J[W_xhಡi 8 m+Y]2,wk q=~(FPH6Xڽ&YpSfR9 !"P/=0LOwHg2wQ*({  zPMGT!A@+mAv0; N@$gJ!Y)JvQHaPi4oI3LWcy%>6l'WԲx@<?q ʱ'&1TmߖP $wuoMFX=q0ha>Ok$&Rg GWť<](sK g쟛%8d+-. Vc=E'h/'=v8JZV0]FxOav=I#x+l[n&Wy>e i`,C ,zNYPRx#7E-TzjpݯLvR+v"G8qԛeŵ7x'+QY#_M!?diC6V簣53vǵTaށmp.c-vۇر<\R3nTz,-'x{0TҩN^2L3',bx1w0=i/GTu?@1Mm$x?{R7=2ơ}tŇPD ^MB&ڴ 7 i¦dܕIO!8/LM$rڼS[tS);JQrcs#GѶV}(nx]%p[<<׫PkY粉ID.l 2'L4 姝moӡ,[Va:Ϙ_'@n)%$œ}|$ 61Љl*+S/mxg3 -76^q=D '{CA9#;{rygLN$)# ZVxP'X7&im3b,ր;akV:~^1aDHZII@70WWv5 =+--K"|ƬdS/НP ufoA9$+}he:DEGdO;&@ˑ6^6caͤJlYZ݇A$))Wg-7bN;U ."Lo4cxEM7:o"jId6=9/LlxK"󠄅UA#{G%*Vj^4k0;[Y~w,Y5牴Ov }; 78x<0L0бsw%.cFϵr"#K|& EPU4$pyf|eCc+{^p0YNŤjAmL>#NOH3$<[belg؛5k$o W-%x] kUg3!m 0֬jTd*4*)jN>U ضEi bwu1p[41G3UG )aHߝjފ& ztCmz*vN3eWEţ-p(Q>?u"@x?ۭL8L!3f S*VRY<_;G?߳vhws?ӷ'`§ՔꐡHlS%Obo1 y9 :%G(:%j>FD79VO VЄ G9wW'ԥX+clJј|U0tJ7 IϮZf{`'J<"ԣA3zM̐ xtcWnjI&+2+ `ÖQ$c]Ѡc'>VQ]roq_)V4֬-e<1{"͕lYf?ˍ`t 9F=cGYI@X:43YcR7 Kw&[nCI S/ɚ&E0[J rxJ[aM'{{pCemY8 St)^_owW#G[ /KhI!47ۛ/ Ylhݵm4S sO{2Po,U#[Yq(:(!â?$K9w*l1q2htݤN흇z5Gf2~d1?;R(_ MQ”L-^ر~'|g6`Nea#y_vN^^S1[^Db9pl׉7=#(%>~8*s=e$F&BL9&:@>{M3Ӈ(h0ӈHjI0d}J`@i2J.ah[{amٝXo7-vK]nO O]کSyTZw*_ݵ 2cBQ"*14{VYTpP}ɲ[Q ?= ,jF3*b{߫Dz͎) ĚWF;g͗Zז ّx'g3tX @ ŘF'ss p6oOбN>}!tPt )($fKD>ZNN]m*d4 R4Q32!m֕`4p u}Af%>4DPpi¥ֈ|- %i()p8'5BջdLB3e! x_oè_*s3M1’}R)ϕf7KO@^G=+zkػ1:L&Bn_vװ 'kjaw>I/QI@nTW NL&Et9 ;$Ĕ(j:qD:f%1"9²]zӤ֢N"qɸ.]~qsHsEfXN j@bp::&KHN `7Ű7ĜtH=]$ ]b-ZLt4-#l 6<&4G8` 6=`A9_6dx\eKb#&7mx@ l eB|)QB8Ʀ+t>ߴNǡbLSseo(wmm6(Sn qʰ=ihe[yJ*d" IN \d.MYB4}*^QܡP<QVz/$ɾ-}&5[5Ӏ)e->3vLĝ=|NMI8!ns _5E [$"bE\)nIJ2'xV\PrzW3B·6A xZ9gLep qY)}DDf 1VjȞW՟6(A/H2tUF[+{.zFaG2;>Xtz&X{Xٽ\?#YeH:W7+P tWV'l~yɚU-[k@d\QR,`1G[a{k?y2F=tfwx= f Yg%JnK&OC(2d+:E/HI^W0#Trg2`J}5\P72;T5m<65֧sX|9bdഩA%yHˑS2aאnr\2 F;*~"R5/Dڲ>v~9 5JN zz *;/IQC(an%qXGLf"$-ƺ`%TrnM. Y/"5K'.w:y%w|Yz<0; k枓9+bWRʍ~,xL%~S%OC.^$eԵ=17Pt.#Tu-~Icdi {%őRz\,)j)F8S !i xs[.0slYC,#'kmV (|PX4ၐ[*ZT+$E8|Ztq5q6*67-+JONKcэx{ b:Y"g؄-"zEcډΈ*Mv y?E+]6Q,+9k5x'*nn?{~p5²[#!T Jmr)9)*!5; e%COGԵfi42Z*ׁ}L\,w/i1 ~uzM 6_se'To >X(&,ZL7>4*jDhM.3ewWq_EE-´DVB.&J?ϖۓky\juWN,'qmxFVW7E>ӓ]1M!Ix4N,-} tIiz>QFd;~ ]:*mM*=ע)&TJf4rؤ:dpq"& |i݆s*!sI} )/,qwV$ϞRЛOѕ;{ *6]i,A "b=%kHaڋEuE"wOH̹#Y2 .B+dU[?)N0:BUCN ;^N.j')4VW=1^$C7ԡ Iq3+u-8I>LEdZM@Yve,8X C6n@8M0זJ/?#n ܐSVQb <d,aJ5 u(8[D{ (9~7}z'+IsY MINY.-"Xqwvߋ/+MigZ9!(9Z+MT׮uJabCK1k)rD16&2P3tFZ<&BY!~@],,,pr0щ}V*[ QFu7/97?#8|E4`"L ꂲalm![ԸR+ˤ~#׉ HOIvX)r 'MގcnMlZݣۻ>3e ZJShfeIXjFi5M a,6ph­S~D[c`(9̏*3ـg)~tC|x2rue35^fab4nQ?GetI?X@Zگܐ]!tz!n'~ћno4AiߣةI1?3-"X2BJ4ֳN=誻!3 z<}w_i:f@&*?hr Y *#]Uɢؘ!0 ;OO/0k*{ k*$/XB(y`l1K5r½eRMm:IWC)*EPu]LP$-su#$CA?|_pd-8yPQ|lFDHRO[w"`9K2M{*t m.ʗ#sކ WOH:9"V?,_ah*ƬrdvcZ*6Ȫ+,a8<]iP)~x"J{; c#8| cK)y~)jlʻO+F";3Md!E\AǤЃck6^ ɕ_B@58IfbrJ^GC3"vO;{S\pC d5*S# ZehT lcԂg"Tp5VFXSdx'$1ɀǒ+f!W.}V15~Ux3)>n`=@i*:WefI@ƈx/44\D&(!ZjV߭fx{U A3 U+v.0@}q,WY*(S~+:Ԑ͢/o <[2`~^Hk Sȴ~( ?PQf_ P&Q070?WF٥w'&y?Уoe =1P1o^iG]˾K%,)9?W凫וo4Oה&ygG-iM{_#oP 08X[׀GRV Z6dqx<#Yц,;A3;MT49ZK%\I@ѭci6NJ1^v/'4zWv\Eـ<6by/S;Ӭ9zˇkѡkʝuŖy%ؒ2/% GƏ#/sNIaTH1%~B';{/ٷsl#'UJm8j}./1 ZϥGF( W=Fg |W  R|'3V&X^ԢxɎl'˨f[/uA|2cH|R@;5?.4 n Mp07-*3hCp%"d9pg^S` @B0.*=Ba;3Mh4yO<  .|::)t@~i'0 \M$O)t2<P1^@1Q t`-3?ˆdEU.D5V>e&`R 1y!9UFj?T^Kڪ1AO|#WpEN&6'3l~Hz[P&,m̖{S?XqgZ7?>E4N<ـëo/)ǀ8"۵ύV !j}KHY+QC1NrTiڮ\:07I8{6F _Xq܂ԁH-R~-#v "|v6MI}zgE3Ӑ*} x J&55o1g<̡8/9Z^%A! Lu{G'J[n),e=xbT!.؏j9mc3<_ƌd$՜yϏ$~y /=m DmXa@j$obó({cMN)h` ByD] ; 2rZ3xJPS*7Ih_m?A'ظu,E`Q.r6tZ,0‰ Όu'1'wV%.Dqx=a3:w1Uwl&hUY9@l, U=Ujx t+}U#Kû%5&#pavjvKF,*a*oBd0,! UETޗ|34fza R}<tx3'Uk|<|ޭC\S%!Vq*K[V/T'`vA/eVk@ gr O{?*1b;ICH(рSgr3*mgDp{}$KTZr'zϝtiUL]&.Pc_^#FYq!YCEPBjk߀D9VAJ6\cr B"Ъ $#6Q &:3΋ꋮv-&)C&/ ţH@..U8^YKw=]&[mMo9}tO]֤5#u&,Ռt!T7 xJ"Qt ,0~2 )il(V.*&w7 S#3%*WU^ nZ9"1s⮺<3GWnƨ:vDŽc AM ` Sz7رS(^(y9 ϲ7wO.kـ~lŶN( 2vrׇЂ_'Uy!#vzůr>T±{.l"ܩ<Όۭ''lQ 2jhښ9+Sq|R0eEŤygINn,?-=?ƗKqDV{ȿ,&}9A8Y)-+mbZ÷/ds&&v*QsV S봥;?8鮺~ "óMHS?ZNIG%&OMZ)M a(KDbIXu.w8aM'f+h 'պ[#?:nIJ\N?L#p[T!Ts8T֬g$۩sbO,L)M*) ܁-R%%{#'7l3tt34(tS8,zlYvxK D:H ) ȼVt#dR |<3vdic!9ȊbTΣt'qϛӘ>|c)Ǜz-{QH rÂ[3]Kl1ӖMH'tdnewIbU ];h~`(V >S;'k(!25iJ^;`ݲ|| (B 2~݂rZ7&042R5Ln'?*1"q#AQ?ݯAx'<ΝCd0,%ON՛&R,V1omATT=<׷˜f=edeI4 U& cZ-y_.@`ы&B>gAO/'wJyN.X9PV.0lA" r1;\9.uHdv:n.`]s>v9R$oQB2} :x5>Nb礪Z-~#AHFBNM);!NU1p9tC5WEPl<QpE V,P#QSc6-mR1+d >p%) a<"yHy'%(lӃ[ZN̮̐/z*Wq}s}2ǘdr#1btX~5.hnԟl|_~ /4^()un!pH0:LJ[^:c2gsR)ZȂ컹i2kge`?Ab=4us?oҀ}?$-)j] !&&,bKmjO mx(oa?;]%HYI`Ť#KV%W3K 59 H.[`,^*lX?<3Ƈ/IM1]M93;J{CT' ;G}t0蠫1'%dЊY| "V`YaSQF>n>#8%ֵV~f&fr=rܽ,QisK#&[$0?-́S'Z3CPif%`qmk&.bH4u W!46++D zZ(_mj6{ҵJꤨdؐ[o[D>DY!G#]%uJ2UMNF2*x! G}V[Rݾ2ࡊ4f Lgysk~Jj, osx&YPߑWPFtwN4v5)J-0Wv>mWfd/gb-3/no gʿ}`MX,-1 t@uo>'ow8{>( ő  qJN2#OW7v?W+Qu ;:>6XϱlG v^RxI$z$UM'DnC[P6fg[1mjE 1 wqؙÚ@̲= Vh=%fʤo_Zf'@`HH%;6a&K@1xIa3V8Ƀ/ݚ?|q5m.y=#a9@kk;3Aݲ+zuafDz%QE1P[cEy3.<VӺߥVy$~$2мAmE`:Eԫ'֮֫V_.0R\ $Fɖ֡8,[cm:Ug-br|~L /Fc20>|+ߴ09XO}ͽ"o8P~uUަ-P q#.\9Am `iF/]dN ,˳Hè{1e^5ɇeTw$7|_ZG0 Szi>Zݔ>e"[wY|C+1zg2:}+1bp[!6R.~o/>w6?}=&uasCҎ``w]/"\؇=o\A@:P8/9J25(-*sKFRHdy)f~:s8C5O!XXOoXl3yK\vJQHJ!cJn.#nGXgX^t9e)S -JYp ߀$:HYo_ 4BF|\7&qug$ͷT4G R!W[oRAT"dmeji٢(Nb-rp2ˀٽ10Ds3A2!T `FPP-~>P@5s~?u3)h'+ R.] mHa'bYR_3BƓ^fe5a9ɚ1f`7!ldv"5@8y54+_|>uV@"4ls5!(ëݻ&RkPC+AGP"u~)%@*)q0&x$OLYj`)w0$Qus< Ԗѱo΂Hn0] zʝu)h% ?FKec~ډ|+=EFdG3N/UQׅb]Qv^W="";Kk]߽:K) 1V}U$>4W-mџPS&2.mMNx;G%'|hCU9dP0:!lK]#8,ܰg!*$}$6}5)G'a#{-mH܂a"(HX2ԡd8$1sN*B$3?#-XG<~b|mZX1hem@, y/Y35{K12<=>8 |7 s~-ןV9'ŭk"ϬFBx랂w0Ch47Yq+5RVF#~ɔ!M-fXD0!'0XޡnՂg|0#(!eVo[ mu#ȁ +w$=9 (uu%ِa&d)7/{6&[dzr$o9/Ļdm}/2`W_JSrHe{0j>Hz`;s|vi;/tGMkޱv LQ%c ;Q gV^à_+.t"y<U͉+Wp5 7ZO: ɰ˥U 6{VwPF5Pⱘq$K>O[k,յ Ϡ[-:K#߅ w'K=|>ͫ~8SnUϫRt 8`#gMJ+c+ÖxgնYUBc 8%|,;swUdj*xMn՛7y yy5nu֞kY\]e"F^: %FyY#z vlpq+|3Xv> 4L//lLa.N6.  DžTn杣 9 /,=!!948+*n`L_ 0HO;w pjm*G"jt0<#z  Y5mUa_H>V3sreU̵&'7%!ȪywMs.mK,@~lk?cp,ln)zX P$QAI^7RGF|7k'3l 7V<"3)싉ͷtX^ Є^l ;AUeQu(@vGʉV[`&1?4fj27Sّ[;Ngf^ ه3+' azQ 2דJ%"Pic1)Ey4;n&8Fnj#3%C=9gd"0?R0&*U&`&jXuTg<;0m>rt0x.bS)˅JnY":[ZY&WZIʩ!,_u)|$n,nL]|@#P◣snĒѲB&F% ,}̍JuW]n &8ΨΟXڶV0|:o%#[2SR&Td,<Jg`8+y*0}7 b;*yם6WŐZ"}Gt@ dE"-%/y4-5Zk\sdШO*>y.TzW5m9g03пYSR#5 qǬVaq z3 ◾E.s}w!NqNWݤ@=.uP )gb5m(Ҟ QRQyRMeh${PK4]HźCCrR S0+?L vMRg\QOg(hq4("Ac&s@Y%cj| {A3*XRɼpaT`!/caoQ?w`Pyxgt6(/W2]7H',Ӝ{Dr0Gs;/"sj|/MϨjG^LB(%<@E߰~:{ Ӭ-E5Rr.KfT]I'|tyO:ʿm. bx`( PI$I6Er zV̸ƚ-[-e'k΋g5l&ߔwAfU*8KFaWQ`_< hS5`uژo#/$?L9esw6Nl%C}BK,;y&_8'oDobRSfW^^7ET xTobe%*K(0ċSGA+8hMr:|Z4.w^YW(6K\c;pXN1}J,[4aY!^3< AAgLX~qA>$/>*5@ vA'ןY ctM4!ljxCl@VUtB !PlI!*9lժT ѫjbmKKdǛ@)|~H)U*mQVŅ;HI=B3 OvOR;V3%mBNƳɑ: mѢ "(ޝ'+n@X!o <6I(ȅ扫U .iH(˃[2:gc_lnkd˨tzڤ- d>^*j눴,~W'e5\Et&᷶ʨ#e^-1pW#CV֜edlmax=HVO5 0 $bM^cqk&!ک#pn #ao|+|N0)PWr>MtP)lv tp6Y%S&zA585C1$6b"'!4Z-mIf~h/V"x#p).v<amŽ*%s񬺁狻bsB@HVFsrlQ5&47`p7{z( jR!/ AyExYM"՚Srhj)r)LVLe&kA?BsfQ4ϺF^0.t?$Hɇ)Z9 is9QO-#4q Ǯ(St+%,* @ ~y2*$h5˦wګ5?)uQra? W!{ኩaRu?hA*2zG'ͬٙRO%B9t1dP阸P'nbi^HQ^,>>2_sͨ^$:-U,C&2>v7vS$ux%+"~0pNSEdc nXCҫT<q6T$p>Djc+~dq%;]U D)m N D<%".W_M[/JKwjIS[U#em- 1;j*=P 4D7_6$ t|rt0$^]uL$3-[8g? >.F_U[fNiQս90l[O;V\;RͷQ5!$.=Gr# l_߉N$%)-Iz T̯G6WV줥Qbm1Os8ņߍ,JEgr]~nH#IW7g"tףht@,k/x<ଢ଼+QáD+!7y%¿+Bb}t" Uk>//u7 jgc`veY\+NjNSEDt|5/d5qA܀`CITPM{L.]r! CQ")d:!]zaM~*ѓ+Y;z[<~Hع2^4c|O=perNi$'t {[#MM~@sm1W!)Zu`^k&92GSI}p^W3xdCLc߳  zGԍnq,{ V&}S_<XYIqV?(,j0N]dH( كf Obqu#26t}NP$\'͒Ѭ>hy:1y@jKΔ[,'nH[*]D J~20-^u^5]lt#U&V\4=\Po[ [AĈw6x!uQ_@&$ ױ˱j4WM*Gӥ9/mL>]%qH`;ֲ"ңz0w+!l t\ u[%E_njQYsTv)OS#3NR.nW&/%0P5%TLao!=Nbr/ߕ\UKRd_dx*Q a̝;ĜN{Wf=w}5 -( ">!-DkU:HK`j.!o92hd$HNyjU8ƣ\j\}ɻ^'y)>}-1jܻjuq3[hvݖ=cZFa|-ũƎzH0rD[NJ 0y[-y6Tx2Z<ˊUpG~woP+,9 4%}7ͱYCS%D^U$6wn&/Nݨ@0Ш$ֵ*UɆV2=Iy:QQ}S)֥ڌL"=v?f L$\h%sL^jJMSϿmQ .&t6ې(/ɥ֎9iQv^u{~#bOٽ9F#CXe+q^zwP-IǗ,SmevQ3mvW٢x}58,d?@Pj %d +Ji?W ?<6b譗^TL;㙒&NΡ'eGt"kG;N"`^{b=v) \@7AqXEJ{O*5y sEZ eZ5a`G*QxkQ΀!*z,'x/fVzG\f)1V=r[ZrkErBY4qU'}y8J'cW'hCɷ MooV럤qܗq_?g%|m+R?J+FMvHsƿGc`M$3/Y']݆6u`lв|8i{o15hyx8!ߦ <\iYg>]˒PwTUÔKH '1V~w%U֩*9^1)IPr0k!^cnKT5qG[}s%Ny^j<P #$aw;fxGUPVB=լ۶*2%VYXK+ޠ+~` C~.d"_p.6ؿ V޶]a; 9>ݔb:u;!7J:5<Ȇ R$xSGG76 H${(7Mg-Yy$Y7 -`E8)" 42G\Q.S\ y##ɤ=+X43%9g3NW,lz` Dy?oAڀ_HA;"m7Q(hK;m%)Xe5" Fe+2:PC^TWn3BM+`>vHd&}ipIYn 6W8kIw7}&p%Bf3.$\!l;F`X{0 `W96.sI*G !y* }7$<Y_=1ȥ4m+f" ;[Ga !cڡ6bZ:Iraxf {K) PJdp0V@ܭy3dr&ޕ~uVl! p1)C DZn4pDV0ޒk"*Lk>S(IB+:fyM#h2Vh۷lRʶ,{\;Xֱoۦ l-?6!1>rlq%%%Ica'i4:ȍ@|`tBo[y|{:1C+m-}I:P)RK89[=o7[d,\qmna;ZKn#1$?yu& } ju W90]J}l=펗0L/]e sͬ|t-b]`l,/ x18?$NѸ>9] ]7G ^Vְ8CG0"i嘋ɥ+dQ 'c1--ԨY@+cN2hTL,أP!; Hk LS?Pj!gf2L?Ud C'oE4'>_:,:?j,~JjVA1%6H 7 2H]X]E~">7ҡ&imfb8i?bMzW} &FJp ;`7hYx]0v\LDA ihJg8ï(OsB­ l@%9k^2,3so+]*ǥ0C(~*$b>wPBKv^8|T]5-缈cA Rޓv+3T8v5(-3GkL*I3qQ#<#slI;]cVz L&,z3돇@gJq|/7L5i󹔋RÀ.G$.ܓ_j}"B@Cpyqgj z:n9xw/Ef+GSTbjNn1IWU{ֿ5 4=OdirceV ! B=.D+N1FZߵ*S =ЛFmM\:-b V@VqtWc4N&&bALdyD͹\5֦^ƨ ⯯Q#_}@:CPR)aۛ[)&출#Pݗ ʯge3 iAٗSAtrnX-  eNdÑO}nҋϰW~uVa'(a=4vcD .N^S-fHSa912}LS|DKx:CCY>Xm O7wn^isZ t6'o!ɔb`T CqT 1i{) FTT)NE="=0M;p\:fC0L8T,.K&ijL| J @T<_i6՜/PP\//Pi ZDT x;VRxa=k!gҨuke%^&ֹcMX=dGf#S(ž.6$0fL|@`L}$Aɇ@l3wn:(=/M(OU}TQNw $JeL{ca2;i\䪊j! M-^]_ZI\DֳU5i_jh9[b\?n ePUb{tA#:*&3ɐhelj 1Qg,.I B|B>GKt, F&7EIM6ߩ9ଁ[l",AmWeib2s1G+w}٤mY$JO g`(k6*Vr@Ӣ\1Ծ>/@" %ݵ쑎3>ns;PX*#nLTOUg6j+ OJ,%.$5Q.bLw`8[Fq;&=6!c +hey(:+”8\ =p )<6xOr! 6Fʈ@MLO38&b9!?84l~7[Hѝo ǯ!"7NFAZbrZ%F([(GqĤ:kqf2 2bT%MU F)RM$Ú=Z?tOT׹Ӽ YS&@'c)MTS.쏷>0h\t 0P~15w<+G>ht`"* seN]2!*#:IsK}]-\̺[ ~~fj+@PC8s_‱65p#Twݍ/W":[nL,ijkTG*: `~ӆ4WX^.5d7Z"3Dۏa7G!'~sC1?U(K,jD:,)Pɓc揪07x+E VgH7g4qRr]|~|" aیKȕ@d KGuk@esM9p^:P0(ҘR}?Pf ,3FeI? ~ ]O俉y3$'?Kߍdf)v0W'q9]'W=#-^>G 41dӥly݀dYO>/x>28gndkp_S.!8͑Kga '/?F4[6yisAv0Η;+HؿDbCf1]=\^6teAO-j=gr"c &Ѿ#b z{f]/ @^.֫z6Y1OAXYZ=U;OZ[e מ](Ϙ&<%02XT?֏x006.2>n)31H2/@ep>=-:O$>16ya_mH?:GU\$#'-!^9w``fHRT%w vSs-pxDuNxfKӥTh8Fʉ 1%]Kp()m̙ea4#8G=K}n42Xt??y!A!c,F{YM/?njOp{7B*PQg}䚢18 F6-q"15$\3Ag]!A >)yX+b~B-Ѳgn]3Yw/6[]Îɬ`+Cxe@9JOa!1 5t8S7lA G>T*=hBz(^=)tٍ 4&jռ,H\d95ۢƙn1!p{ 7Zs tK8юJIV)v 'E1. &'Qv^Fp[2l3 Hjh8 < Ɨ +&?BK 'ڄFK}]2g_oxϒٴ^(&#Iis%@7?K5Wbv2&+Fĺn>O捞-d?Jؽu~IҺ4AL/*!^y|l']N-S[WAlx> *CÛG162-cR79y֎ӣ}=9eP?q~d07 !Fxdΰ&>:ZO+^6=%EOƢ'0(Έ1#u&}.&Sx}B'<ـ?G{ 8wE4+w.>%K ;]jW: T..StRKЎb9uID3!i*:Ak/BC J 1``P"Z\$ɿCkFg_.ՔcQ]O=xSk""q3-vjwAy z4Lf!(jM^9 N:F̕4Xb0#J)mJ%+I/X?{gk%BϜU{<,3u;.ڧa.ҙ+KI8B Vו")|IF<ݢ#@Z@#S+M!k"t-["K_DX,"qC+gv f+Ѹ%wU.y7ԓ#6JT4㺂ײrj ͢23d<1"a\iAXicx_2OK~K*ʳQD|2"q7Sv?b`߭]m5^P[ _Ǐ=r{6d!v/"bPq5MOֽ֗)7ٻJkZue{$D #=aK-4|gMXi͖JhQTJvƜ3O b Cig<]:qfSGÜc(r.)MC #ԨY;2mNzsy ], So3J?$aq,Hd ' Ev`'mZ7Z;Zмy*֓8]?Z1g0[mq,̸4"3>n6{OߞƂ vYn3Ԁ& D>#ƝxcPM? _@ !L0Z? 6 <8V OkwKY*L$RP|+>#|O>7HV.=-8ͫ Ô?P+"2[, 6 yO$\=(+aur7Cyhgw:q\pXc#$5?]˄Ab rY{F^L!kQQ{Huu80u;6%*%k~_fe0BXF ^SJkk4%F_`^ \uԺÒe S.=Ě7 3#i8xs> ))LuAvCGPNOs31|2Ȼc\*&nzsjkm|R( =#|oكJYEg'sg2( _i[0$] pTgkOr>2J|wgn-qOB> 3Wĸq/0tq@'@YpickmuNg:=#1 3|o"AdlU=t&`B- %pL|KվwMcU&rY0Roj9O;/_۬*~`cc ~ȣUA̺ёB`Kǎ$8P+ eiHE6S8y-;Gd;TeE߃he9ꄬh5B:򡟗%uk fn#ݯ%WfTnnRfBGJ,r{ m鼊?䒿c\7eqyoҧ&^λWX:"@ 00]c)ªm;Չ+-Q*8F%<|{|>hksI kKy6t!IKxͭ'Pn#hm" "Hi@pI, V *&FDْfR -^\^ A25xjO%ܺWk?!6-WE"0Q.ȓ)@-HJ)ìg+tL:3۠8ȟ3Rj+f }Hodt{ j#Cx '<]o> ZӋ}Q,]kT(EcB4 0ˆ 2\=nR9)vPv{p@AUu!)r ?/˘S' SZ)VL;TP?nt#WB10ɵ/$)$_O`,~B0 O|;lp$.`6#8x(u[ ꇌ9TCq#9Ii/vyw $S!NVD/9h=/ʕ-LcҨ+gi({OH <{S8F~ m11Mjv1͝R-4#"[]LH:Y}~@E!rG8,jrNuݮ_Tm uNY7CQiJ{յ$1obϣebz*`"IJJ#m= ; ?$Y+u0*6DpA[Ɍ N9 v63}5[!٪zH swT!AQ4AC@! jU یvOveA5AlY)D0ģ|QD0u4 1 Z-}lZ1C5*> Xœ_y1 SEr"(\|I}TNtk"q:3zTVr>2&Ntw)F( X=hN걇~I}b(cӧd)ޛZF7{2o &5pѾYZf/C%f,p'boBWK7KmAA 0:'t Sݭ&E,_u=(瓿,X`2;_S[+I+&xo7nYJ7(%kjƵ/On/W w0;E#C^o]C8;ofdJ~/EkoSe#3*F%. n]{֢FKs,t.Q (wΑd=:3 Ta7G.zzH9 ![6_f$fBHϩyt0uM-Ͽ@SMrCFO}?IwӠcD8wAt0p' B1S)*D#ڕRLϾSil15=n,P;Ƀ(ka!8}KPش7Q *^mb>#N"V&& %Vȷl/kDUb ^I]d+쯯dOQQn"lzG n+L{茶t=6 u.tE%MRh!pA/yѧP9іS`*̑Sgi&QCpApW{]`T ,B2ګLfAS yRL#jtxi(~߿h: Pgȟ{Ѝփ2e\mU/ $݀ޙDš6$?cYd5LMň6<+6%v'{HpB_U *Ĭ 6p}ąbT19ZZl׷ ̴5! C:5'Ym=$X#l A&g9DΨ#~ +B2霄? ,]BA #ĥIEێY w98zI >Zt{F/7N IךFC #$[h~p};!NA+mrBx-a>5!uQ~6)kS!!la Uq6.XS:"ާ)+PPU4,Lͣ:.h*p'4$ejA8\9|5%`9P6hr# dm!72N-HoPO,OO%?)>"kv9ZŊ$ccbݣn5;4;GcXVm~J8j&) Q|ʒjEQ=,p>tA(6M%R}7׊eT w dN3nGg%]f~)EF?S$Ō|,Z xT9^d e)>k'gm[u0h)kȵY(Qf1R'<I:#=s 1C>yx ԯR}hldS& ɛΓ%Bۇa&=0HNfx`D&g*//@L"{% /*ZKdbX&Wڮv~Ma;HUZ8tpuIwHH- o%걎qQ7ƃ*R 4[̊d.@e^r HE&ŷ$uD&cP69HzM}6 =@8o#>$YaJ M]ۢunBFoM-.]_ve _Ӏ UlXn8M}:X*,;g,CP%d#+t? A"4xd=, udkj*RxOMjAYM*PM7ȥ~Z3s!)pڞR":|#K^1ӏsCinB& Fg4+u 5=ȳePC SP56 &0]?<*;4΁R!!c&aJZ0|tt˴YJAb,1*$l16%R =?}L;JaY\GcǮ"&N - J*yI.]:4ٳ|:ĵy$_ qg  f_wH5-vxLw9d'lD&7"b8ˏ 7BM᠁7=#U3ML~&xE b ,! 5]c$L_׏ l`-07 lP4!^VC֍YCs4pܞj"M d)WA+mLqsB`pyALǓF+ 6IMSx̗,R85 Hm cX͵03R][s#硛!,\{2A3u2xP`*8s*=!?d',4\ ϹP`p枠"k] *C伫m8`ߌ/HkFaƦ"{)/tT"IF8p;HkxPH3htՒ+[,&%-cmmCK3 %C:Ҋwr#onżH I?T(Ȇm$`qOv vV?i[Oi2 {-M2XT,C>uL0؛sXM9jWF'<㷔1onJD0N&3( ys!^4 ]$ *4[7>/tvAx ŪgMmP*u2ŕ; J%k&PDzzi*A?iO%\'okr.i0d6{ueC.J:l}DՒB>TL:L0+I:3n϶ֲ)kś馴p$_DZ[t mdb4E С-w{30%0 0LH}o{OWdD8+- >ׅ^oc/(M"k>s#u8 M'6 ;{X(r(6*z,FQ ƊfnrC{rP507l2N6S o̱YF GR!~""GV?akhhf?yLp٦-o++@n%`̏K6g{-sCQ褡 Y,òr!xA19P,"f WsOk*еW}GdηL@Εm,PGw#5&V [Ბ T}*#!# ֲُ6ј%i" ?/l)썧gгf@.!kKc{3@b0HRc_"!)G%\ z<f<9Z[e_>t(]9K g1w1N2^!Oށ"^xWU5?wqu*6lk^Vu'FӡA)^ҭu5|:HNa16 H 1FBHwcW`=WtmFcqY YSmmT|&, Vp4LZai90w1 +މlL&B0z* )'+DH<*+Ï-XPbj%5?־xi˴8k.>eot:BA/#ϋVY0Ǚ>Fɒ6R:aaU&?e~ Dͯ"̽b$s9][5!#(UȴU[+?:-)䲂2~,rgbj2XKI}9ϯ3n[<}BYYϭ1#` nlJ2))әW/B,̖{=]zs<3/RGm{-$8@>T0mFz/l],pA<#!Mi|ؘ;:4`*85LC+I*Dah\ }B4F¶֍T6n2ho~%9jO)9r`ӥD" A1hIB 2nDaJȎ8H*K n>B[Jp]zF`5gkQλWԙz/l[|v!Q%kwfD*qI@-o;lvr)䥮x@' 'nAt{!fWՐhh1621WJHR$ک?mv / $>RT>w.mwBӊ(G*'qjVG:&zH-YpNń)k|I08S+1ͤa3KX<`Nk.?qoL4~ &8ȢvqF9NH, >`cR{^/zKEM |bZQMa|M'"q;,|K^=֘m0mXб&%R\^46yH| ?cȫW,nDcp.0uZ-{mwa{ :~X8A)j4f* }voG$B%$^^#3HŰMMԎY-l/w6Ȭu@gra#r08=* "˰Ih Rn# Mj\&C3!#{FI,#M\P&1>$H){\7Q692DM>35ץ-v 7:3hM牙"C>HafQM专H@ a?+T#z Ceq!xhy6 V P? Irh+왹(—!NkOdq 3B6g(sIl<*F#}Q㼨32 } 4 vN|R8v)cP@a4N5 bbgƑsd]I?)r偪8v?}8([1EŽ3*G5ݼ/ I}Q᧕΄C^099 4{5M[;nf7v :fŚ0n_떯Njx U'̧l wɿvlH$M:nS*)9S/r*5U 3-\Ih.;+5èLj=9ڌ.aX^;)!yo"kxz#y9dFSƉ,ti^ 9Ե,,G4gc87veG=>J# 7lq>b J$f"o >RR ~s2Lǯɫ+ (Hm/^P?lǀvb6gYv}hj:rԇES|5"PvݰŔɎiDbܨd¥*8SC'{;Ջ{¹'2O5-j0x:|wre7-+3Q!!*fxE IpN>8G ߥ)?WKW\͊"Yh2W4oQ+(?8!ߖ $œ)K$`%6prV2O鮇(m4-C,~@磚i26#S9fToPLĬ?NpL֧wJlbS* Ѐ'&bˑܟ&]A't!1{p>Ǟp4I:qđEiLn>@MF|}`ɨFm3(^ SރcIku@WmH!2z6g4dQ`S%87-W>0 4> =T*\6qt`*'X. X#)#s5s:>Q04a_-/yzksЫ%ɍYec72=[|L,[#b׶b?&r۬2,q2:neeE;/$OXR?xG "ɾ>vt ;wq wϓrLh>7QjNY%MΔpx)O_B%# 9_.AJ /kQFK_$w\:I,AgXfmuܓUvy$xQNIbRDS*sj=-R֥mf(g M8sSE13]` `e) '#1ee[|猪tPոw:0,D>r[+S,٠$% g#=W7wl7g'7fv 666"ߥ֕GAq %!4'T'{+WOL{FMW8i7* Fqq1eZ6z6lbkd632?!S'44B"(ưI,v*{h޿Aj9d[p>7xF5mS-WIb?2o"C,!H,]̦t%3(-|Tw)Z7_5"QnJ.@e9)3xKp"[auO"sTNt|hܷ:e V^ DzRфB*\$ӥDH(uyh'cJH&4s-ocH Zʞ2fSC_X'B1\K|I|F? ;Xaz D;|:='(l {~:.(!3bJ[=́o1rMl9Ͼr!2bg?=$вbAW=R_]`8gEŞ& .Ȅ%a2&$y2wF09egn&)Vi/?M1n-rX<H<}G0/ߤu\Ƿ %@@&P3[a]YNR3g$/7Ї/$2~Qov':gTⴝ@r%MPJx$hB"E1EpB`\7 .BRccjV#<}k;9 Sxt̅fp9js^VLF="C3k(ܟ@#DYkNLfkT2Ӈз,UDFG"d*gdǩ%38*.Wl~z`_z.Ұ*#bym:5#%ܻ?7+"X\IyU~5lhHjhO6 7ZOmABQ 7M""$PQg0cbDȑدu f0*.A;:U:S"<053˜y8c~Eu1a3{&~h!ChIFc&]~Z B)T=<< =')MaEW4puY1&%wP긹P.Y1 l fү6oag%'yd (I6 :0"^Xk|3qb[wq*u.VGK?w=>JtQEi: Õs'U ?]ѥIJ(cK4ГZ1jhq4=3FO Aur^ ĸCd>BA@3'uQEAzS&"Ujqr%R,Y|ܾ0skjT j`8.OH&8!p";Ph }8ƭQc/JdB#3,7ٵpy&; uv1I g@{§qF 0%(qӵ\}#cښX,|.rMHsI]R; x nǒ=:g0 nMzstGPKʤҼ{yQ$9|bX!ю9%^IM`e-+oD|I?,}! W!xN8u0)U/9ANeEHRb<+C9ĨmqJ_ˌs]%J("2iKeX G7(д.8ݻr*~Wfם~Pؙ+:CjS*ϦBSm'~WB $~ĢR+__P(S_r1`B^-- v "''v7$g=x9L9)DZuYO>Z&ۣR#78OK"5!ΰI &0,dE17b,Ρ^ȓk\l &07_~ %;]< ! $"6~)it mL ɝ n+d~VtXWjQ]SEO_;ǍI6HB (ڵC8ǑEcM'"ALj~=Ҳ/PT9vb|v!**ޞwaLC_$̩/`i]5J{Y  `e<]|$bZ!t=Bگ| $t'-):$RJۻ\fQ1SyY94^Nbi ӛC &)d86⁻"[?χԶ(o3>C*[btsrZ)>{3`2K@MQVO4 Z?/P[9%Ղj=H8ы';$20F do#mͮ֟ծ-*>r}h<=v%-&mN+2Byo0-a!"%aYW:<ͥ0Qw< -%@|JUa$Kc@Y8>e/ eY8_+y|UoM$W87?;'79yP;.lMzv6%teHT-%3JA:a/$cI.L~Z)My]95:9쏤B9 >1Dos]8/#tU)$MNHN#>tF+Ѫ3- !_bZulg5xv8{}XM+{"AC +\js]P#ڜ`khDt$,ZD&I9<c-AF&|0V-7Q8j ͣ%{^, Fz޵B{|"fƔ-(& /v"8?Y"Vc+y/yo:*S+a=*+<5; dDGۣ\FhC%_!ICtU(Cv*/]Xvo=cm}"Sª141:wlkeD$xnUeԟ~ UU-dO+!h%^)Ji\w^x#v^޻ .kvc3tn^=™ ?Rj 41V {RkF9* 2@&ҫEK'ƚ%(+(?Q,^?w}!/2v3_O \xL26Oܓ >WJ?꛱p9 $1/% jH4'\ތq_> 'n1(tMwMg IqX[ieB=aBr viGY"֐7ZI&Jrΐ4-]jI uŮ/oOu8V_4B[ORw^;f1!QQFqI[qqc%rG~i;%`FMGMX Ҽ.OyD/$YaPl:ѧjiLNq &l2$MQ~V쟫 d+<e-7&Gކk燖=i 6K>uX 9wJ4c~!R^~3$o>Gyo#ە]7-8Pir] W},R{%$Ctu&YsQ\.7*Ss 6GĉhIh|"XuUm(̺5[wg8+nӪ2"E|CWr"UӁFh6%ʟ𱋉-q)5# "nft{l,9;l* ҬY!F&7#0I%m"5T {.ukRxy>%nEȷ5!)%zgsBdր]) @3򮁡bdS=1| t)_3@W do=}>SF_ͧ zCn  P-> QvOӊXԉ( ٤ NØ-<s11#I2Y&Μ8˂[q},X \W?˩@$XqoFn[wJ'>Pf9n/.Nˏj v?|1N:!u! oZdO=3D̜V0i#h%ĸ&$ eYl|w,=)fiVS0e [Ĕrj,h< LA*hcP4b8Pp%(5B{g9l){Fd,cb1/vx]v~bGGX}:WIk޹+j)̀M،8Wmzݔ$m5Vs!y Fu:.>BkR䵐@i'/OX h`ț9ǽ 4qZȡ]ȋAq1AI`]$9-d`q:J&nuLGQ\\-8ou}Q ܩij@= %ss!B8Ue!NS)jH&)|(0U)#*!g}"/_32 |+4f2WXp{B 6A"-Larfb@0]V"j8ߔW#B%JhcoŐk!}*FzRBU=?RӲdT'pF+Ky7ȗ l'_V}ȩ1(R D%2r&H1j+]:u>YϹ kW?^z{mw| '/Bhs΅9|-^ ^JYH)0;Ȟ|SBBG2u 8Z<<%=-t)Z YwI•ŸC&n \9ѳ0,PkW0x[43Cl/7$m<ʲ갔{&Gِ;t{ ecž0@< xLq":%#RK|5_w}6* +*.,݄^[47D4{ѵt+:< 0X<bBM)<([$YFP ⵘ`Ս:;e U)wgN p*X$K+[F2K1I~E3]qD[@Nw[lξ-)kJ @'Q5e$Nr!UrG.*b]( pmq~!tjNo#zz!qGt2L5N#*eBQJX%cYiMY?P@֊O:i"ˮkW7;bj'1ĐmCG~F-uzčE1 zHn&dAxJ|5=V > 8(_ÎV~&zB`PGP$ƾ6ntIq0S88YYd-'xĉWg%<64x^< ;jA`%oD/rdfv M.Eѩ48. Օź}˧SXVa z WvF!:' 4yn3w iCJcF]y#mZHvunNbCWY)D^, 7 qړ{ I;T $-DbvN8eMhl-LFԅM! x#Y27!Ө;8ߗQI'4C`j}L+ScJ=A1A(yE۳6~n\d&/]+r@i0"co.ޘsOp{^TO̐*| lc̄ZiQtk5mGmC~89%4n!Fc!]HYHԂ_g{)t7!㤙eZwv27tI4,) |j)06tYV&ıQܢAwZDjwDQ05: UgQD`˫4P&g<;G+5`%Sg.K} _ w % v3'z ǝ6&U0ir/}U$Mgq8՛oSjk=YO; nCo2PgC[,e%t"#,b%bttT %A_rwQ/+U.|{Qё)>inwN.&{%E)9-"LMQjQlO72$xy`&9Bg$5Ȏh>?-)if8oG-CzrÆM8z@|C¥c*9 iDZ9tY#z)\2ϫ|u(no9kH90,'H3s֯[SeDžgH<7ø 9M1wuߜ@"kbW_HoS'+ :m-J(^XG5of3 w6X.1'L1! !@C.0ӫ+{z]t-$*LiP!l}9ǖYa=mѬ}94z2䬴\c$<:\F7$C Dr?a k. =̥H gXeT')ߎ$Nz{yPL?Z~$*q3EKp$4K-7$;V& ٞ -ޞsJEUD 3h0(OpIylcFJj6h@'<23hcdS} AD&\%=8J2FZvF?'hQխfqt!oyMݾ$"i`U1¥JoJ m]jR=οE"Ү2dRS&(Q/WN.]ɨ'|ed0?m$'`ۃ/2my4V(1~} BOM9;I.|mY?/d!i⍒#%!JuW{:sd޴OIE6NA$}=DsB~9~S\-B9U#֛ŽD^PHh9B)1DU8e։K9:2V!#s=KIL,垇o~@ۯ)m,wЌ:ᦷ/\_wi׋/|4q 7KDM2s #f} cJc"I`zB+qJ@xp`+-[[X v ]&:$Lߌ8ew6=r9[8j(::E8 XC "̎;_}rƄȐGVMs.G*r 7\E%da!9٘05f• K wyhtJÇ_>!s)3^?̩UcB0R.i)39<6O??5be8lw`RCw/Su@Ԍ  G!4wG&UE pHc)UOxܘ0y*1 [|Xs4A]ˉ4rZl~q үKi!E(YMG9rYu6SŊkK8FYD'H$v-:!njwnڕ0Zw-R8Su^f~l_wQ;=jʑd$Ž5$`Y~"ƣ J4OE1pN0Ҙ"b+# ] A4h=L}ɂ3=1;6vz !&~Om@dR !ihi-G >=gP>^*kDFYÓ%t\ĸ3ٌ A4dÊ $Y<1ȹzSxا1g!tY #yMTOp!&NQb/:;+çZ`)cAi'10o%t;;/ q6ڨ8ɡE(E9"Sxg;f*}ӃWBfrF,׳*ԇHh֘A|Y5]}dҿly5T \hMW!%ZN^ -l!g?~aiv !?9)bAylkS3O*94S݈r*LB^d} joq !Fި+5_3S %6D a"(RcLCq i>Q*b2MGPd|"F[?|,>M@,|) xǒ'T#vEpa7C3OVy91),fcFVfy4DX#GWuU A>ۿ< y uVi5&f_n'ϥoX>X~Â0 >@I>CN.x+t#H<}t\SGv(:VGt9+%(?%3(ٓɁ,Y](dys[/v@r8 df;|8V(e?5/ ߮MJ74c#5=+2\2t?d&E,<,{vf?>Q39==AQdVK7Q/` iAXǒĝF(ӏ"&;LQ .y 5En3~;2+I4fyWܟhVξƹ] @55ѓrVc@wtzfh!SŸOV3:">j/*3碲l,Z{UICzk5 #E4)ZPХ[Mpu *,c5 HpELCwr^`tqN2) `s&vxѵq*^M~3I x,-mIB[L/  { Vx;[Z ֈA!/r\/ ;(A;cdlJ{0 Q3;I2x@|~;\V(UӮap=fG@nI'I3.l+6vHxk@Y,19_5*QĸkʅoD7c=daz@6SŪ^&=hwY0&oE(w/e 8CpGOpo5ק"Z;(aJ=L1fm%wŸw%a?3p(`:̂7 `! ].9@2Hcz*J*oPP3: MG/^ԅՌZneyp2$ }!л5ʷI? 0 a` -ގ\aBi*C%|mL8n+9K|ɡ)ɎɈmsAv#; iy|2|])ꈵPi0L6S, qė?|3%=6{7|>q nQGr2KZM"5nr\\TAդenC)wa\  @@OvqޗPظ'PKEysP1Q \+ֽ e1QJX0}H3K-LP=GF0+p&s.7x:inGQO>&W5 %F/(JrW&c$m0m{C86[{Xe;?';dVf<$-s\MMWeLuu+T@%mk3\_ -g>kqN~S6iJ/3~+.3r˚SQSi@i(15'OmRy!jbq곞.;!tYI*⢺ >`F*ѭ*a k'K)Ӎx43><Nsz~ j@ϹXx˝ W!PK?6Cn͖ޟh>);1㾢)d&Sʀ~ND_@F(ʖWjOCħ ޅ7'׮R2|\-###V'[71čZx>~CY<[[6b֕ 8P'WAdp UK6?CKF0.~L*1J+jޗqn ^= պ~[\Sb6E5ǚ3&ӄv+_iڂq3rHy/C&#GN@OO;Cס;J/Zt:v0hq*h&eN%5 3ɓ'=6d . Æ,p.S$,i,xqrQ"}s7 ~J:SaϛuƿsN _Hɢǎn$t+SyϢQ w{y2-`ݵhtϦك NZ82˻\q)AH'h2Qn#S΁GmR0\e!ٴ6Jx,'mՍ0AbT >ib^27yodX^i 5e&9F0I:["Wu@O~#X l n+,lj"ᾜ,JSn;D NjmI6"\8~M[?%J\!5+]9AC uَnN]b4]͊i*`^/X8nThoV2 zt5_7C4_F̬ȱpt"!v2xaV);ތk)T*J?}sh_=3uZEӣ[3.-|K[  [ qaȌrٿ98[^g#r(Vm9//$}ti Gu22B;ns-DΘ2?kE)f{YZe%h2D%Iknꀟ'Ɩs@T~Z.?+n 2%a_1w|j,]^f6{;J~n9)ͷ=M*lJ;?79-en9&=4#ݲʸD!;BxR470k_&)jR~|t<BJ~Ejm=nRJz6{&.k ' ǃ 6ڗX)Zد0f2k(zqι$͠Dѽ.5tv<[T &G 6ʢ6}pa &r`#(D}K"ʊ̹/8D,t+n_tzW*6G,s6̭BueRDY7a@QolIx?³"s~[yHz% SGVϲ`վ>+F^]ژ{ (Yh,߸n 6z~XM IFt!g'}YÿyjPWѧQzn`\:*@q/ofE$ҭ_E]FxT4}KʈV[+kV+ z8dDHB],̿2),66 J=)F ڒ%7oZs[ttÌ3 L6E۸ץ(9hHeRZ7 '(W'z}cMrB:ME(rhpٜ N_B -wPW2 O(C FP7h%>GϑI(ZZ-,rE"喣A%07T'C6Rw\2`,0m9Ζk|b.D)1a&>8w-=ve$sr SskENQ[SM-pOhPXV.&2֯t!.;9ZBa{&R=WQT#(1.,Zu;pE-g_)#Vd<,r}؈8RJ^ѯ0޷l}7gntgU# sm8Rxc._"@*͚yY[ gV+u5gU/Ys|t6ѳT:\ 5]OHM" ]础,7tha5#"8apb 0*(aʠDClr@+y ;0)L5y,Q}~d˚ɳgg$=P!wZ}Z bdA!-M#)Nq Z݁pz!=.9@ , 4"E&#TX*Q&l4#,] #(; p㖅git9,w ,2yJ(L7* SȲ1÷~2ĻbDf3;gz6=Գe^]?ZubB] K0F ߀adZL'8=W(@$Gzk}tߣ1 ]׹1@%Jm2q]XDQ/. >tt&HWo"guJ&A0&홥eQyi|z0UQ|k`h>Q%A%+2딳5ӊ<ղ-cXntKuS+o5aWj8RoMQ5Fܞa0Rc:#0!W(z]Dp<5[˄l *d239>uUKB]q2eGS4~#U?+GiE18qIچ߾! ] ^l* F=kSGܐhgi!)P63t(YB=TiS3$;hfCy,IfYRԁE ob#nJ`f$קw@fIV( ;׬I]8#-y$ӟܚ2 tF,le@V ՠ > & LRؾ('/5R "x?˨b1<M:0|o&kWR;u>a 3/=<%:@IÌl% <_=&rHQ {X.E̸# AWX%'ecԁuBOwC%Bm.RqA>|Ib'Yqs#SRZ:35mw#'GD6m ܓEx$I!iĦU0YՃH0$V-dDTuk'`ʤZ#"=n8qZI8<V5hes#|3f5=N?,ܤYОOBЄ,Z!7~8>턆V#p*79طuO2'P;&:"G%gҡv"$yd y+AGJľ+>\]"݂C+ !X6'al|:7>;TG951*/VV!qWyڛ J)ZJ<+,t*M&aWBK6sqzawE5\UiwAl=Nx4*2j+J+!sL2DUkrQRCaVEv)gP?*S?+9·an3GcOP]g|cDQfnFd .wȹDѼczuy[W< X}(+:(,l|]taԫsm 28I207яM.ʖH֟C?rc<n\d4 Y+㹜p\]>^4g'N|KI=tK/[Ì4m1a[^MѼ broqA]BvB=:l*VGT؇ E,PzN)&dI]5+/jPwW LYcsD0=%9BedvB$%U-5 )/$|U:׈~pe4k: ~!e8T +7~AtIJЛ)~,k)еՅQH' łT4a[˻m5zS+ f31 y2*I  hMP$@*~R(o{mu[6I`$P?3iZ/R2ðFp`_p$y)e!?"sy.RFnƶk 2?5'\,P:WWɕwNE^E1%>x$--$ <{Mh#t"vIWb>,'Kw#c%m}0!앨%v&T.CFȜ|)g%7Kd1Լ05meijTX@j^= <4Ad=Ђew|ZihZՀZƅ&Q=gʄ@ @?K at;8g/ ` e zb$nÝ]MyJ~;称oj]$Z/%ќ VĿ @#qĦˉz.yZ',+lu>,%:,?1cҋM[cxI;@O$7$W{~BE!2SO)m| c-[4,yj'cvt5M$8w}u{Q\<S, m=[f<ݝ՜AR[|esh7tcde/)B (Q"Q|ekUzsZX''pI+f[Ma?_*tY(71.q]w. 6YP97 y4Wf.!go2RijLslAzE*A]m&q[B؇@NYg4 wZ7o'3ꉡ)Tˠ!XqE&l xp?d jza HH).Y/GέM7}g 1ٹQv>[3>XV},0¶'4 y@ Nn _'ɷ)=gsdڰQ.1ƫoHP(9(緄q%tLA9}qd2ZM*/mRpzF;U^b ^'즖 leb0Q]`61P}P ={f-e9&|t=h ]hOt `<dm/{r&%/uKtB#'Hx 'H\Sh0fn2^рpZV0Y=:4h<:4%LXۂ0fM݅Q ̋%H@ ..lg(x$7[%P^&"S&o1Uei-4r.$̜H0H+!Z|}羃D9Ά^:-Z< [t -umָ-wPW8A{D|8o%qKx 'T[2/%톽QٙU[c/D^ p7*znO+2g(־<;;mfbZW Ei4o1Z fE%% z!P0-P˝9>1OuG.o+0*$:}{4[=Mƒ#]R9%;Xg{^VDNn٘F^M6z'$I.A@l!6A?DĬnv*X1-jyQN3QJJ@NUW TVun:~8)0DnC2UvUYN#34/=Upk UZyz唭qI",@{jLMvN\[E+7Ƞ:͗O'$pFGS3}/Pݹ8* {"H=#1- 7h\;$lU(.+80 l}8Ģ^ Bd۠3J=jqA5Ak>cN%:TD`N&;(!DN !)o{ISfUa/plc !3*L|*]2Jڛ?kv:;G<#M4} :znhA\%g6 10XǎQaEDD)h>+}.y2-3& i*UQa3 c;.]?Tn&Wʺ U%2 Oaz>k$WT(9j'ftj/3'SX_NҙvF&lir/۱7d08/7VF@د);QFUD?=}uM, ]biueKLJޯG&v[`7``~⯳^/19xt^Vۛ`6G)Uz;1|.C;\qia :Lb%=7fJM$y[y{ڮߺ. ĸvOGPX24X+*i:H {s@,쑒,2w w6;($YX$h61T蔬]i~-Dp-%>f>*"ׅq/b 9*t\"fUԦQ]#,lc۳!RkX,$5EH< %@S'ƫU۴7! eTn[\-/umK "twE?鞝Ia 2&ݳ{HK+Qa2\VN 9jMgoۅf6ӼMJQ&$dbńLp#"l!xe*0zM8+* aV 4|\BX!u6 5fܑ54cMzW4n|2A"4!S6C\D`d>r US4j//@Ln`NƢq%)VZؠ6c+hTE:vQXg58T $+e;n+@%P%/"=a7*N.8w_?I.$Hj^Ĵa9 қg_ l x¿M{ #$ƂiBaD<öǐ$b/!9U,m0x yU t;{|Bj?8D+.lRk8%Di)'#ygڨzRfb.hs:[+J_#xS"'z J6o~ toߴXqg/ET"rKQȋ"n!NA;9[**ٞDSaJ5閫GCLTi4Ͱ2}Q K*!|%`)kD0]K\[RL㹊\)N/U@437\h1b4`ϐSserC`W(B:a pǽ g"#ҘOT8myL9(%31I YTƎr>Žl^ڸG 1nRw7I<'7pd( ﴧ5yYO UD"\0،} *0,*3nGtQ亂|8%iGE d/]כ@Q8Oiu9.- =;C4A7OD):o- >'K@y"1*Y$ y GP0k+\i#p-NAQ1 eY{51U+E dlФ9A:$ Cpڂ}*6R׃chv)q!VY䎂<b_:2Q*,*0L 2 Jk{ɑ~4/EgpnON \DTc=r o!;pJksU)(vϋJS) gLn_]/2\Ϫ3믲S^3+f[]?yDJO:U{I  x+65\r]oc* W[((V1/ct*,r2ύr#zz$ãqou"?GsތYgoA!Ce3i'Yt@gR>0LC1|p/$ &=_=MLfm3ʾ#@h-8S|&aߑ_@C}.VϬ%P8g(09Wvws5+/ $dHƷ2"<͊3ᣊQTo> X{ϕ%$t@LSf)z,'<nWuZC.-Y<迳s0˱IxR1:׌a d_Wpg-kL$l p'G =mLA*|x_-wLc7P %if-m5wg֔Y9v޿"'q\D`6]#mo$Zߍ3UAG4,IKV.0̺Wq@?^ YAj8[0@_lF+{fhb#Y*=7kXjYnaB+XtLF0gk;s@ù6cɯ+^O -[H6~ȳcT."yڱå i*1R`$\`Q^4E:iCji5_rѹ :U)ˑ!ja!L8ktF(n;gZB=v[5[)4sX2/ʝ 1,pSP(4T`4 w];Gf`t (yA TEKH>u Y)xQ=8(VבTL*r^ۍM/z4֥ 12_,MidNuQ1W AHLOl8!?;"Qi~6t(C>|'JljCD1R?sY2\1U]UEL;L;C (7}6x OFi&VJ KЅD֋ף"lD_ 0%1, y޳D#ˮL+߸<~{NБr k H6e?m?{tmR%e^bD6΅έڃ>Hԙ'np/uz3[6BuBY$sIpNL;)leaG-~q%.4;?w뻍 9H S.:yV*qh@KGC&9@ ))VOкa AhᎬiW`jw1$e[t+civNQ™mD=-3E?r{僶j2@E^6J8@Ё$zmo򬩂2NX#nD߭H .Tf'j$QZEb., # W<:)@~&B97]UFGf䲙arTW.<"{u w`W̙#zԪ){K%+Д8?lFa߄'!+5ȃ]'̜ PoDv=x8Y#!$C4ۉ1$L/l"*SAR,L>$—&;(#;4tijF;W8~l%y{vp ޑ 笏&FnW̦%)UMHc~Q 3Y,xJm!o3yp ER? ]}NO*c% sX}gNR\.bY.(.,\ݕb"~O󹺆Fʺj:23z?x2T 4]#Qphi(X}飮>`'=]FAq&='xWm,ZN@E-cW+Yߤ.jpp 1VwnIp/bPqx<-6vNOP=V r]}Ҧ^EUpB׷1R&kM^\$P6fKWS~Tn%/FqTs?-@^&B@m;Itmhn2W)b}Dl%o`\ш ѡ?cFc;U. y3+LMEb xX< D%+y:GB+PPkief K7$X 6@Ŝy!d$$"eD ^?Ů-nW5D*}-k;5AevT9EV*zgL:n$|Ho]z!It#IÀȉ-/faj,`;lA!?1O:E!7玡=k;4Q>q3kM&Q" C*ʡߍe tpJ+IoL-'ԴomzN=JV~( u60OMQfnCVO'3 "c(FBIԋ,c\hѱ䀋**<̢+ \ɮ{Ea.5楿KϞ6l9e=z-A몲#!g.ۚe?IXwŐXS`Mt Iɀ':\.to`-@xc @lM`1Hy4CJ8|hk\P :9= 8`; #̫sN!q|Tñ&F/ 9ʌhjg,5913x4^0;OEnD$ @Ҥ#u<!˰Z t7CM-%l*{}\6'b!gsy;/_ܟd=] 1Vɱ^)AW ;%^ӣ/:($nŢϊ4iaVs a_D4| .vDCD+OyjwU`[9>*7rxB1{jXYv $Ď/7TZb{fK  -2vrlJĚt@vMךN8@߉'4PH"j@=1#Wlq7L!䜌Re[+lǍE_ j/U~#֥Ų666x[Hⶒ}v+/B!^"nrښd7Q!Ti@*Gt\: =Y_&3jД5-ydfFsq N2x"r!86;S9?P!N&>kDKC)JO 3ۅSp4\BmdF -J K ascTS ҩ}7L\(5њ^hЀ|)"(GTݻz-Ej `srAv§a+3+63ά4*jlkboqhi`E ⇫_{ jM0cCR(Nui.ca{S\f2nZSR|9`@zyZhCBNC>Ltm9$<( ,،}!t00*D'-Q`G-Kߏnwܩ$N$=408HPfe83J,Tԭ6bmL끊 =#-_?`Jf`n Nj,b]3'&l7 .8jPnͷt5̱/f Dߠvd{h 3ZeѢB?;ks$M_ؘ1eˉB% ɺml.Ɠ5{)( ً*^Nlj8:Q\\AyEgcPEMC[`5Vc$Yes3h`'WA{!raƸ[+|->P@vv 8lԚM U)f68-'2 jQ$BĀ/չ!Z #>bb&t{Jg)q(ߝBk,7]z%/cX3v])2VE7B:>>]‰0zX8ژMV ̳"8q5|m =M02X:o+`+]B;Qa|? ^4ٶ86etZ ]ŲߩχfSEGC!~aq0LvW+q)@a֓z\*<&bTmvM44PR:849؅Wt=j r3d|%?!HNgȭ칑]̈́ȨN@} /_O^)g":g(Rbf]R:9w3P@qGs}_zģDQ dⴵ!O`Y'МCX %f(},"#juc01 5okK2wR|#|}KjFç^?ªr뺳 jm.#iH ;s'sNO j<[艢P1z"h;%(K+ Eqc,ˤ=L퉄aW;X1K%'&si幘x,x] .)y0g(0Wσ_辖74eG zs~E*Xi2<6an;Q7>Ag,nk:x՟%Dg^J%w[GǗA7RJVMB/n6է2ո"G;wҼ:3 T˜娿> ;5 k$و f8eJD$P&-[OS(wƑQ\-olhei9j4y-7*^ZC#TDuqv㹯Cj , ;[a 7V [[\DˋW8 hdr\hg9I9 : K/|_W #(t[;̪ǂHO;[7e+⤽1$ziy7 2~ )6 Y_p+ƭB/F?o8"($pWeo7l؊ *a3-L~t#K8[ȓة-w5]?O,OhtvQ/醳 ]\'x|j!4Oc"T/&COh Lt3,R{)A#d<)c͂(_Qwl|&64 dEQj5]Qy2p%XH ;.%8JCchu0W? t.n(M.`|’vOOѭ 2a=8-8#sT#QhsFY)L?&|hzRK-3!יO'd: 㹛Bz+Q'^#s) M1H[BSMvh&߳.a`>>Sa9 T3JlPk?<& i@fg&K٠0FiO5_< Bora[B_5spPm;%oN˕y\򒝷+C%HI}/N".=;B3.ea:E.Y\;?q|e)?|s.}\zN$\@ >% PHN܀Oyq&tM&`. #dڭb#0jc0t/9p~l,h ?R~";$b;7d]3kmmKgI-/;Elj``5ݨ^8dVK럻!vQ\!{ 9a#q=k*e)lOK*:,}'FV)q? 4\.28ƢH7X+:\' \eQp"Hng󹶈-4ؐ1M3*% 0+ڐN@ph8A} ./M5@Q(FΒ(Іl{Y}0 !P*A\%qw"sgڄȿگd<-*tQ_ cOR)oL40]NѠʧ bio R|$b"pI0 J4pK0)'k+ H,<dAL޻|3wpM Jm# qj- ~/৏"IIPRn,M9Dr9(zّCk[g[I8INxwG2@OvF2rsaY)bT>_Ikg8輑34Z}Ѝ H'wm\FF",66°\&EK 1,e$p+)"*o`=-5Fz+ZzR,1j~Txi\&)VCYxwv)փ/[t,T׃\ߠÚ%TYd;fr vjD+>v%R9I֣.'3HRZu #H{t,̙oˆ:J -sXIX_ ͈ iy$]h8.oƬ`PD'0(׺-$u4Pv8d%1<)96ar>Jw?7e"m?e#SBy1hUN~jH?v,ef璗Jr8*&Ȏ7лNGcfѱJؖ=ً؜"g#jF!EaX]|Ϯ+tAlvZK +*08'pZ6?j/Z~48O!&x+G"D:A(),Vؖ*wsU. %tR 4r}[d3<5+HUY2uҼ%s]g.sE!5x},jP.(4 zgO) ֣.]*l9j=hEXڴ#3ze=+=:eښc.dbf1akQ@qg6~ I v<:==9% QJMĝ(!J>K*p/^7oP圠52~*txLrt {0vBv?MH ){Mމ&zEi'V!3=w+)M=Uy7ٖÕ1q U3S!pc6Ykï셏|4= D(Ykf8?& $rr0 }rKP PAk01֨@8ކ#(A<_RI,ihWCrEK!G}ɂ%盺wO lc^#?H{H/BU##ΈBw$lOZ;q,ɉP`64:~vqPw$w@< =ˆ#}]d,.pPKN4UZIBr9f]HJA2l unig90$ֲ5aQ?#hC3~$-ﱌ_eqO79㻔ɿml]86`񓿱1Xa4nޗß:#y[x/^>.B2=G ,eOW)Wu9{?kJ 㡙 77z| _pN-@g"6<~\(]7X"̘Kbjay+aCrt`E1+5ĹT55 oZܹH\4z_5Ԙ!TFm 1}TZ3&Y7A!R ))HN=li1.0]R]j+~4O_Pcr ح9>c>"zSz"{? #(b&N ͪXll)pr޳ {n"eGC3kP[>H' Bۼr4YD/̸!'M ZPՉoJ(lo{2'xr0Jl ]2Ga?0O\= X#'z/$n 8(p'xm2&PX;-٩2L1Vhȃ/'.xOl?;%$;a38J]Vȉ#ʇVAKEWL%{F:ǜ+:l,*Ki$ .H_զI,-E\#H:-{{WREr|}9 m$8ZdVagBB]keL- #ǁq`AsE~_8ufiJRT.i;쇥xQT{#_cS]agi/zCJ&*w,7x؀(Dt_9CXa2L_'A7"ur}iX u8 "=S\?JCLRktž)Ol+e 3ԏ*^'ֆt' shcG6_IdvDDL(EԨX|!wJ[}]@U[!_NW O g* uP$ڱnr"ˇ^LN~5-Ra&I(RZ5Lߔr&!!&kzpɴfB:+2vWi)fL8!7 ]lvX?T3@ p[="4:XFlbJTLZ УQ L2 $+HWn}I2jp(>O0mav-9ic۾D2kԖcVӭQdy<-|Ӓ]0?WE]| + 5E--:~'- Bec-K%_6OV#v9b"]1u9K?xr٬Ӈbj:=郙cuW#5Xz' LݢD&sJW*-.V\d\m$ j]udcc'Qx9]YvAO*:I^V^=^m2#1#h.puԑʑCH۩̵f,!+:̒I{=vڳRTf?*@8~[AymɬQhҳ #^Qzi`WQ\a鉁!j+-p[ك x3Xzv dD6Yg&g+XFw JT3-j9A"S0pWuokW\).Ň*g<:LC,:KKm\z٠ 5edjpn,PP$hs!1aL 58dd-),:ck% &DVCF}}Y9u3{k-7,?[4fV{)lyҋ|B;~'Z%6#fb3X)W 1Ǯʝ1nq:gF@3mO=yǰ=E O> /Ƃi`,L`Q|F+t&(zxc6x"`x )26ѭ0qVCdK+x'uJ3>ElئX=pU#%X<&.Nдn!M )؃l..1̯)bʩe [U9Ϥ:<^M7ZB}? hfՃD$DKv`Wa\Y0lOŸ&U-S8yJG#]v8jC ,.6W]S ϴ ezW*k#~T7\-57"QcnYE,,晞)DD( yB tcjɯ(rW7L0  *i{HNb>mY"_< u'Øm7;[U/Q<+wK66 S2>hQZI A{e 6*o 'z_YrMCFKUm!аZr&V/@N!uʝH8*]Ο,{73)]=E!4#Víʗº/`zuFKŰt 3櫐4٬:Xs;(EYzܑ;)ִ-}I.ГJfrXE4Tv3KJ /< b?7ς6 G:i)zCꏓ-{cq,D(^֙&% >3MYsc ;7U2"L@DދMe뀠o ސ&w|q>ٕ/(TkwPPŊZxJZ-]!gR'P{;۠%*F$d5_w-p0py@8'1#Zʞ 7x \=̗!Qq=Vx>eОaB,lf&l(ƹ[$ff総>G`L0/r&8(}r7|s=ΨY8+`<kI#gl".Gh 8<% k_+rG+vzY !K._2C=F7aYj6!hَ5]:{IwE1!w"0$G$a:$Z\܏V/[~i*,T&_,rIO%Wi(mM7zov7qQ6"/B9d©EV"9NC&kDk=bG43$+!m 9;Gw,@&.6 u0d-O-ȝ @\"Pd]<D /zy:E P4*d(5 4UV(LK{ލׁJ5_9!S@ն`SR/: &Q^.N!'r$Ÿ&p,f)tq4Om_¢DtN3x 4Dr.'Z{e6 ׈?s+W 0E-p'Æ +Ol(G8}Y9 itеF32.GOE>RD#C@*n?|2ԑ ,gӀ 6nihڤ'?I|1[&@!EJkΡ13 06²Jip4%WCA >M9i)>wu¹Aƀs7Jh&[tfՒUr3[B PE<x0i IRN@5)* <".@sR1hCY'nCZZ%srPP9d=BT2I0)3U/xd$H}*>,Y\ -}*;Kjپ ,ֺ*Í@w0%<.$ďnLQدi54@אO/939.3eΛC܁ 5k#=9Q``'u")q *(ATx&]$Afd?aqkht K5r(*4lpt#-=' ׅPε4Al8Xh289tD#ۓ Hn[#? +qjުɵ,Ҹ(Zgv2ꋅv <#}F7sYx- 0џSdIrwj(}6Zlp"doxNdƇNU3Ñp +} [Sj%h4L5ZgNm_ w,lɡ!1i6`O|պ8XC< *}ÁʺgD9R="ۊ9.Tˌ4.Ԡ*dxxã|5 Y`5 /=0({tV )iL r;cLi̚#s~Q3nR7¿M;ȓ u ӨyʆŲbhJ8(y(HSB}bN v+1m{ٰ膙2W2R^"?aTv}H3>7_pu==ijNm*2e''wkŰ) SIC0짴~h0o\̧[oT(ʪaB/-=uHŴu0#22<&D,w@!~8nk ,^>/HޕH݁?uǧ<'5o;E]**܈"]4+iV%WX*]uyu+/++}uvF{.6B[tR: ]SҁS$uW:,b xMɰħy't#1֥`Ov$ 'נZøp(X Ql=aL8cp-d I1:ĵ挔#2henjy|8)^X*Yd^A.a=6?0)\^4?fgHS=P ]Z'{@3vϿ6$N_"11ZI/@cCx>O!үaj_>8"$]4k %U㍹ b&F/lm'P5Fmo*\O˺0UOI1l69cI 5c!v~<U͞cTb7$' '4mՉ\&+,c*TFF|:EpYUpXJ3k/54!Xۣ(ͯ! \|;zzi^9୊# T6g^-%"d1>kGXYm,hɩN@vx.jYjY7;TbEqГ:ɖJCmbYt]xbܩrN$ |<6!}]SY6@b4~ {STb-Ki4貈[0C{;[BYh)8@F !o595*:-eJyCb*8t##n2Li˂-ôx?4YQ,kw ?ö~c9>z*o3f7cjfC:2/{8*ΦrRIR">@iմPf8ZmfG+k'N {) bA"$ @0SH)6d0: F(iUoHk|3!!}nМs?@ T)D*DRzJ'OdVh=P(34Qӌ:P豞Wcjd2I@!&0>#I$b^<@&~'\F)/ ^l[m X/<60v^1s435#YĦNb`i6 ? 1el:klou+8wzUN(}~G˒6 ֦Ϯڂj:;엚"]'QP؃Z{#EǢJ=A+eS41ed$1ulyK;Fav>h=^r>٨,}%$댲\ 'p&kd).&0s=p 0SBqsazy0$M_<_\i>'oL1L]6;%wsDe1"7Uß='-Dt'.U$Q}D.j WGq8UQ1:u5"6?SJ$hl7GCx$*4聝Y7T.G>-s5AbgpF9m)ܜ H94hHK} @&>* C #A)רּt4 (oT]J,2a-EVk٪-ȩt/K]7 [,U[ KAqiJVH`N:"P$re+2y͝+H$[ȳ+d߈Ou?>S@p6dqk6^̋Q14HÙB>Φ4p#t$"%7v"a4@ј΁ Ll-*So=KAS!AP*W?B;B _ǸX5[JY;Դ(rzVcgid g|3W!q&>0Jk ,<Þ@[)QηpMzM_R7tвr4rƆѓ,{s,¯G /xsƸԼZxô* Fٻo({ \qaMЪK2Y_;m ' pr!H^?;?iqj3g~4M r;'~ {?E@!SO!X" 12eQV""a% ')n4^>3!5U4]!WKF&?`o 4I,wGr0O8KU# T3Γ+<nU1AH<Ha<%#|4J۾jF}ZEJ$Lpy a/,.nҵq!\-_ XF:;7Eu#W-c5S-Y@`BK E㶮ܞwN~!eƪxo!S ][dړFq*RxC!,WTi竨IN48ZUΚ43keʔ{ԡpk `w񙞂#?X sy JLƋX8m@FcN'ɮ2)w>|!߷#J|"q{Z-_3Z M 2uvlU⎭&o| p\!P(9Bcp~["(UQd0 3A/{\^n*2o@cY=+t\˿yr͚ >FhJ/.IgM9f1'W;~VȁXӔֵ:W.&ԁ0a&ȿ0-[CTl:.Lc 9/I,}/l==Tޞd%Et%4ƽm;]dF&;FwndVQדU/A7-zuI/ Id; m%*{fx{=b;f%/}(v~7`S+ ~cQ`%Yfz2%^nE`9!8(vP,.` C.VG*F$d+w(g:? @9>6[lKkO~Vq{Jy$ lS8HFc<Mڙ-lHh9.G<%P9Cv-&}l-S%Gw2 sv#q,CxIn0W'q/?Ԏ,أSۉ|m)W*ONN7}gze)֍$y:z`b]qm"v]xqKqn< uY-E͈{+ԴMMYKүOyG!kYd6忐m$ūw6o 2b*!EU1lܯK\AƎ0~4f~*+2Ge]wr'<:5^f[Lc㊧pdٿ2!F-?2 /B!ԛm/Mo)uzZ(8)Ʌ>{ K3_SA_)ь8k4M4LZk 6hvsWF{(- `A0s(Df\hXřrL`_2 (XsB'6@OR#ʦ\R?š9Sx7凉,"q>Ȓ}L'6 zWhV*fNNz(x1X- &VVf'b~L7Xr'=sWWE+صNv_xh@ΏbWqDzإ&P-m+a6NcS*3p͓yNO07xH!%Y|݈WP#p@x%AhMao%,`V<s-/Wł!b8eig.78:עQTݛc_e?}cۓq܁$*ΩԂ|>q@G;MTb.o.OBԉwesxkPw!9=q$6FqjG+)ng>d4\#GEӭ× E?CEAoN$,YHP\ ;y 6'xa6oOz^50T]9݊B~WA|?E5lG;vƧP[>v(b"]Q[~BGʸ$2ަe&3{Q%2]3<&>*t? W]0,gZ7^Z['4t-!\u<1 021f)|۳K55A}2^p>8QN$Y~-i;O@H2?6_;'e"d-X|y %ڑ~701+29nlWC .UQ6;ļ{°SHUГjnc"N X$JNyZ~hZNk8kJj" ^")n-ܡ0$&!Y]g8*ŮbUW6sYG$x٪ ~#tvZdḘJo Y`z֏")],q=jeW?Y\%˟Ak3t7ffbwY7[(n?_6#"W;G|UR015Ii^w,bS+m Y'f|6_ T c7\;(6DR AzMc%!U]#g0b&ZX!s `nO*k4줁|5h@CwN.I鏻 I4Bp3mA  .59;!SL@^HEA), z,AnɑQ)h_е;RF4wP]wщ*i=<3S;Q+ >eSJRo"aG &v#>(~ x;)_Y(,}Sl1N2 ޔ E| ֎vp2wphGX*hVې2%e*p-c3ҙPR:``M.~l=d{5 Sv-"1 rӨ6fWì zT*ak}Kφa;@-")0g5 "acn`A}#Z%H|Ji~`!jL:8QI*ll.ZZ"D)2H{p]0dD+&4?3 +H zt^ ;mc%; P6 PCqGǖ͉HI(*epfh2ڔ#Ny<AZkj2Wu~%z{_ZQW1S?`V wXkaK/ ś>ؒ#3'U.K:]{NB7?I1~3`45}pcQlrE/ [+>Y/h@A`m$g9&B: F<ѱ&dAImߑ0RlI0Jc*XE!oǽ)曈jW<.~_~iwJ:E#oa%q)Dԧ݈$-Dܫ˹:Ktn/ȯ'Ute3Q+8U>h ^J;ݍ8hh@L3*zCD;'J%Uq+2 C'tY֙ qYwQ.M(1XK9a9L/T9yn_5 v/`|O=/$lXJwW|fS;x &cX`;-؇.U @"r(JMop|08T|1U:UGY-pE m^ [V#!jb~jIR*i9LM77Q6α,,B\`&ukG ͅeA^77 2!8/ڌc4#s6Ẑ"HLlAc)sp|,P`q#+Z_Gx7$'8 N_5ۘ+UЗ7)abv8ǐ!osv7v[k}C qst *KTS2E6Nfз99h7ը4FO/T[tsARP@@ $b+ #)rQPffePК)m4;v#)% @~d]dsȫl3'407(_TξpH] ^ $ w|Ewin/ i&4NMv-(^qZ֮ՃɝJ#J{PASR82i; 1Ҧ_;E$02 R(g>"周~CpnEKQ^_F3<'j^RTLvff<+6_ 1c%Zߚn} ܶ@M=y/X e΁ WIR"ڰP&3ƜͻohA,jgݾ/@jʭ>~ x㒠EAV;zB,ŽP +[Hs̵j%sflrrdǵreڐ?cb.}@5+1~8#ruv:WN({iDL~VA* 4$Vb÷*V]+oܹu¬-u2дe<+Wuev֊S(S9 \5EQ{Vii643oPՠ#ckBu/%CĤwD ,= a [9Չtg)֭tZ Wp 19bKQ 3hCX9uf;!I!#] P4t 'CTw\PleA(S陹Wj9RAI2n4c({m;:ŞMIǚ2-b?I>,a$RD;C""ßٝ'M@7ximg *ʳSP13RaEwt 5e& h=c<*ʂuA"8v}&&`<e}*0+F/q0\0x q?]L5 OGa;fSTRUV#.`}gGp]'*^Yc,U9N{nf yzԺQ,$a >W(a)&7 -ƩmrC:]*쳯2YoL84J w8D@G?jD:sЭf/#ANޕUτՀe ҐDm+̣U;()kT K5*/I6_%”ϦLWO$ZM\"nG[n'y>-m96-!*IYI1pΞg 2R]gxiŰ5N9*7gF@@{G3uB@a{!GāZ熀if:)#36"LCVS WCcȠn4gaojJyU]a4dit*]}$ Wzqh6Az?jm(phY>FĂqέñI 43@%'9 Iٵ QW)V3hdqɧir*~Y (a\]xPh%+s+MQauS/2zt$n,*9~SRջ>,ޖ9E_$YyD&/t3e!'7,mwxpՁ M:QZ0E{*ؖ eKEL`en =T핚 GǾ"o/ v? ONN?&&. h;Lfynʘ;SOϢ!ϯ/ycB߿OKJs>| Vr(#KF[›;,i`/O=^uG1 yYA% 649MiM"&618SwsNG.$C_ዹ[યU=U"X6::JlSzMrUo5ʖ5a$[Hg=D||l%Fz-#ӈ2ߌ~Ǯ8O}vNد qM*/xAe<͆#Tbb:ϛNB:֑6hi,^#)zj B!VKvDƒ7_ydC݌i;8O^IGmY"#=0_(DJ3J#5k8 ^+,Lw2ܷc(66}?rQ-3S+!&_mv8#QȨ7mZ*701hзH33l0d4">YAr 8 BcO~{S!/`fњhFȏRe#.Zi&\)dq;BVX3~ELjR3>&%0"M5wT(/u |N3NUP Yp}0jcizRy۲vjd(p jx|l3jC%k=-UZ ,ǫ .ZU7r {u&XQx_@*NxҞ0n॰VT5g@7\uvBQt,UaSXB!͸zXRN>,%ʍS!N~yhM_jgM7^.`Z!9VYNybi A6tSxH6gj|49$wÁYy*m|DgH-@ݩ4bSׅuUw*`ͦsIe}'iA`#m$$Л~qvCQ8,Ymm7B^=ΙT4ԂsfF7E=xJ{| @V1" YMM) )ЫH6> /+[P OT!pe4 "h3Ŗ 59mlgрf?@(g!0;޿h!G ?P^[) +*y4k1G .!ѱ3~{<˫C߶4~̅W O9#O_KʖзK ۿ?gm΢Ib@6|ĥ.)>o#g\ {>y5Oz3Ǯx561yfH ˚A, y\!ö1ШY~ m7(3I)t\= :AmZɶE2]so%h\UR{$>n0A(E,{tٝu[QNvF'|Q=W]OS%14n -ujX鴿M7أ^`/*ˠ^=ALOe(ݛd-|R3in| $ͳI[lJ8gs!-á%\3rx]j`4kB+'9x$U5@ާkCBZ`~nPW{#`fmOC4p]+$-,#TDKF7G7M&tݶm@77%p b)%wiJDs("\o$ a./{qtA.oe+xƊ-+ٍ9g>D4_6/v|Ztp|7="# >";kۣqL[LҶ+h{QC,`*K y εŲ߆vBRʔ xV:5OȠу/K&P iPS[vD!vnd;^0L1$(Q>Dp)L權8h<=-rMU:) 3vS~REF\gPu9h| #WT(difDށ&f%3Aۤ5Hz(,li2U"?\.^NBr2xrJ*5!Ӑs? ]bgӚYN8!s4Q j'L:s҇2aF=e%)ڎ16_ a>lws]n%=q":s2nh(M7%pw&BMj ~Րn}930!. si06w) tL j-C@|i&:OaZ<\L9y&1X<%s"e*X}p>#~>{inF/Ok~ 5SbV^F;>L).Hn=d-,$62h`I/=k.[pZn =9*.u?j [!h{ q Bɐ2 b9+gABSbC'6~?H$$uR٧ZT1{Om-YS1ϑ0)D'~5ea5r[84;߳!;\Ώ1rnրA'9# :I37f@9 1q,e dpſ쐎32GOY ^~~N 7o 9`?2Oe".g8aG8O1u>z"E*]vl{AbF39Y=l7S)gC5 T ㅦـ4sm!xƓ(#\'LIa!eI)9R+^."341D[Ti;T|4sdwۺ \Г "eV O=0U)Np8MɘjY)c^L#K` a>. A3\Rzxom5YT]G\ -iVˈC#)pi+5wQ (o-bxC!?,*<4vN%289{VTNٵKA4cg-m"u> 4ERqofψ `<$5 '_D֦57N @k5hxK0vUt\"E{!łV(cXE=ꬵyW! -!1M9ZbU>Wk0&$:zdMx= ,*>E -/-ޛI(da̭w!V젪eQ;je,46ʗ2HK%Ł)|7%"M}.6t3[_E߮b$k',]}ɡE:[bmn [+@KvM;Z?k$^{(].26PɞA ef-*6rC{^< )`lC8 a08\sWF < yO\}D0#Qz&!^_Q5Lˎs|f*\ג0DgU8da_~rہ4&i[j5[G:)!J^oE7ILkҹrrوsg)uKfoF}GhkЄ3I5Ÿ,3qfb5d,aɽBX [O&w n;VUC}w99<-Z/o(C1*\ՇGp24>|+ 05ḭj-?l&-i[ƙ/yk5S,B|'pxC7{WC"h\8 ZS͹[1i۾ WE`ZjrނOF0@="ItD+|X\Ă1ii(&j 䕢6n1suc=>vóSfr30DbrL];KBʽR;h`(?$Ox@6n~CbuƯj+걻#Cf&?`ĉԺ6E9ej,oTbhɫ0+y5%i֣*E%zeH+3urkTT-N!BۙjS&E5*8qT( W"tRɷBͭaZKi#Fc4(3B+FV@Y0^D,pA?v3vՠX+6,o{8u#U7_5igCqid{ɡs%MC)6"7C gCAd?Ħ=;)o :+ ArR NuT,S($ 6<>o8QI*4hV! eӃiHw4r:'Ý$7*ЍNU>-‘r 䟱q44Q&n0MQKFA ^p | c߁|'ĂU9)}Nߌk(W$v#2P32 8coay5ӳv@)Tߊ25 ~u|ʹWu`)ѮL *턧~B(6p=Rdx _sZ_(fQS2ĕvLYg96&ʷI1<>o`f?"BnЗP'mdeK{$@ϪRfZI}+%1Aн>,.U{5]vn=)6G_kTqvm~U}%Az e&sJ7$dκGUnؕL/(]Em#UY UԓO; 9Zoۺ$6.>0vecի~%L0n˧魃g:Hm.=NW~CUV.IQc$Iz!lj]ԧ+|:z߶;m(EuHγ$7֗ Vga -IӅ˽MK+/,w>c塨h69dCPt{{ aW$gT^/e>#}GdQPm5{+,| ݰX%HƯ7,(cQ|"7&n- +Ǣ}lB,u"0,$j_|]Rx*RR+=ܷwtkE3W.uOgfg62* p <$-`ÿ`"o9uK Lj 4m#8yl*S_(AozF]W?H5M,81 hoC KND'UM!`7MܰCKNga!A|q)8V}ab^!AV:iQ 4C-2?na{>1/ ÷΀8jȄ?IE 4R~]22+c" 'V,-dw4Oe~vp*O1Clw8}nUiZۢ~toCb>JC"MY%Ϩ+^7&iLԁkdfJv;ǵӅOu0$Ib?ݠԉ 8#3H'^}|0|j ld "a[b!fAN<n?}sr&{*?I! bv `8A]$2i2m4"UqGO#!IV?] 9kj,xdZjh,bߋH )a1ſ89}WD1:n\ZO3#>Wc~k_Fř E2lXҭ%%ZEf^v%6(>;FMzopSň:/>D~2J*j6OaY L(#9 MU Z^>InZ"ќGpa9/v P5Tz%'^ .XTGػ 5Bi05RL#efo?YΪXPM$*=aOL6$_mgjWrah<:&9c Ȏ 6qE?y"@/H]'(!E18:P,Kߵ64r)V@(e3H%w^jWc\ıQ36(Vo|M2 0_{yqa Cr_lL|=7KpR y(N7n>[ ] гu2uC W?NqO{X5M0j >?i2Jjf0(1NW0B{'C|!}XIՃSÙh1Ti/-ʮ+dh4=t u(=}\> w> L&O2kPpTI)m@0v@w_ưpdLphn[3P<*蝹2|NR/7wiU%t傍?柪gAf0/!^ўpGUvtҿʴ'ѥ:IhCCI`Lu 9ʈX'$a)C1x'HMje>dۋ1.9RI>CW1H S*>=94dxia`{3fCF#A=ogf0xz@yk@b,L|Kbā5.IWŵP9{,8/m`oq![]n&_+q #V8$a$D h5Dw+źm6@d-r 5SCCU6K+ľbt<LJQ2 򂻵H"6uzRՋ饨)>c*c)*ej'5-ˮ'd"/A5,HK>ո]y 8{!?8vʦܻp+? MAuXeZ )NƐ}jL·^>1P4{}Nʝ^ĂY{h-G޸T @"22.k'^ᴴּ҄[, i?491f rk8@U~DO=#]>P-ğ>凫'#iHΊ@q$&I6&xGmik >oø0͖^HW!\F$A_hG͙K<2@7{(z/Lz @oY&>0dZ X;Wjɟ?(KDo/MD.<==. m n2]y;SZEFX8]&dմZ+%\mZn/b5 "Mv."]q͓ {{v*9ұ:p5f`w wU-:*˜ZkÄ#L$̺SÐ@xG@ȴ>1%*`-(Vj a5ro58iq;\P>E<-y֒a!s#kĿ^ cJcڃO=Wy90O,oB$£ mEWouec7trbWY'dcVreIun"EUì1=p.ξƒo F+E)M|kW~L :Bx 6Y#b>HT?'!.0{-ZV)V1fB* sP T!&t1vU$^s$Dy5$N$D)0ѽj--zޭam 3rV :z|ML+Q ]$N= nKlu#6[/a9ueOt!:M(I^R",z2{9gGX>\cjl`25yxeAY.N3ǫ>Y{ s?c\k['/քM_PO"κ5dZt{<3F21И^ 1k7$㪁)CQK~=uǏk Is@Fo&c穹^FD3tMmxEڄ܏^ 0;a wW՞@᠈Sӳ7vR Gds/%O|ZkM9(Y},[lP.p#UWqmGr,r$z:Xp5.M1lV,w$n <9$.]`I>GirwxщlT-3H׭yt"ۍd;g OEG5E9~l ̈S8 bQLa#^$h0ꢨӎfF(l,u-M<Ӿ˒2W,#)ύ3<87i<ѥZDG[7z8#"KpFOq}z'@bzF>k+d^'ZZ_Y1zMYpN|XFηt68˘l7ZMw>2#"Foj&~ҍO!N'?ʫ*.r EѬ0G1P5ei!qNV5]Ggx'l>"7s5R2߁Q6V!4V}!'V@b`ë)_!m]Ĉ%tPgzt"޴4۔dzp׃P,W~̈3 1 zh2Mͤd6!,M(D=ÏN>5x2+¥,2` sȀ!eΛ#C/ɷ?-6cPc}4`omk}+ޒ'|d,?! cdI/FpݻҶ1[÷Ž' {wXj${5>^Rsڲ9XʃhamVJĢl!&wM&¹-?vˉ400Tu'j*M3 dS>A:< lpTX⤚ fa iF%PN߇ ƩNh>'zNM_/;!ש7¦,4"`7;E/u&ʹ\ eOP9hP{n a%{cGd_SJQM:;C.KB` |٢7蜥gɞ9)piovU榈mDž~"g=$$4 CˣSk9'ԛkbX L.-Ay(FȄ%+tɂ:2_y8L˂rHmj[K#_Z'~ONr-EZEr,p^"rA epKr&7F7W4KUhMSFEI'+x"AXm)v+!àG(؁j5+REqLu̴xY2N"UE}bm5N,+ǯPeq[wp5UK]$Z!!0vd? d?2U͂*t*)1D_+]#U.؜4ϳ|rˆi*>ߖي;:06\b ~C. [qVO4Ѷ(2&a"^JSNN ,#A&>L&}U%;N~xP,./'߯^Cܪ D❖1-Rzw͈0[6TUj 6ZE}x`YT\+G:=Of|uXN )Sw ӌD&w9Z.m"NgjP"p/ۯ=0[!Atl *T ~;-&,}>T9 6h#'ϚĆ._%c/iXݩMByuhy.-toT)dS'1Xd:|HRo%٣>5t8L.ٮ~$d{'ˮ\{̯B;G-B=Z}ښ%2u W ,4\9ɘfض|XW{o6s;=#>d-+ y̢v,N A96tˬ6741T^i#_[C)./"",=)36^C,e72J:&+Y6Tw>d"Ԉ}Ld 0Mb6 8W uτune4w>PM!F v9P*S \VN|*gs)=G'|"+NBa5afI,&U Lw{Uqi]]1!lb(\oj&7?tUڪ̓@t}) {23 0߭oP"3T?G'guci߫%zfZO5j ,j1pffRm?7ض1„(=LS_fd\IK25M(h0b@}egӲbpO?Asyr!^w.PaW ď]^'RtPϩ1bO:m(3_L5v1f$ B:;H x2prwrC~=%ڶʩVM}ۇe`'.<&.$w=F`m/~:KM0:Lɟg-2{79pQv$KlMgO n# BfӲċrtOA!Aa ,n}pZQ iT̽;8S31eNAjv$#ܯ@!~_v-ǒ_zE'@"HT++Rː~w8}yw1|+Z)6DdҎՄZ^`.[R"Uy,e f)VU5YqNP*f(_ ?SmwOwb;5Ryg/櫊$BkJ In%!VHnX@!;VsMl.),'鐊ؘYG!}z^4㻺X(԰k}T$ jne ]y6AhF=%ש(ţ mLQCMo(MC$3L._-˓B@d!2`yT?[O@Pۄ2^\.)?KT'cP,&v 4R|dj1|dKjTp[ӟ8~m>^zU4F[8p!kch֚'XvY3.+]CFݼB20-!/upX?dglRC?1<=> "cU5&̍~%+ g3*}QFol/>1ޮ5;ztAjuI틣ǣf;Ǿ!Ke (bɩMt7/\F:5%y.dpB~O"3;aQ HX.:dL]#V?dJyVay9 [.$:ND_o~ ܓ'#V$b6ˎLKUŽ xT"7Dl-J~k@frr ] iDU8z[Sc^҇e'bBK|#brY2sÄ'Q+ycwnsk &n+CM%6,Y](%sHvfKD) л!}0HhrSd$@^VЛy$ĪM*$<2Ê3h{`l-u46eIraԈ9;Múi !Zh$܎pe + `t)žO)u1j-L\xA 8ѳrΣ3~q9?Hk%cԢ/YaF ^L F\{ {W(&Mvqc"{sx ~X3LknZm2pS lZ֋ . 1"v ?Fl@C8f#bC^e'W PdƠ?=k$I;OJd?1-g <NLΆ-fJc]==`.e0OAt!n<^n^Zy&+.y*ts#Q) 0y$PJ|+ us4l>s3<.ViɮY:ȇ2 7@4%Wz,w\|/BI{?hEPX.طŔsa[(Z8C(W.: R1<(\t;_ΘVy%=$ yi9LrsѢϷ?aFdHn-OÉ}HЅKmå~zW}ډT9f*NK3O$9l~2(#6pA&c92G p#[,C@ # >ʟ &.^7*UUClXutMV&O̒I(> rMٻ iPZaD Lw}z&NgϪM䋱y Uҧُ00"H!H^p+[`dϳ<^P{rfJLjB&{3 a%ϔ9(bꨑ'YȀ kzl/cppBHrD; %v1lp`\G;рAt)m EhIC٢U %f! @RsHyMVw>ԧiD*O.F)(Ц␚ԲNÝɑDt98BMl/b  r.$E?`R0pGH8{@KF:-O8G$|YZƣں^V1]s8n1w[tJ*U5k'\U#$}~t*z[fDF1*,< nӣy;yVXSf_57F8)id+u L+qo=4["%5'vDvMeLÿ!+MguCFتrܧӠo5@)J>WL ǪH$PWYS!Q mן1x9$[$-DoD*1APH~G)$m>4H'l2MncL4/6D[v% A`vJ;`{@D2aԘW/")amx]JYP~ ?-j3 ]Lkc C,.8R S$fǻ" Mt FrWEwED ~s}>C:K{fsV˰ PguX/8]:'wԕ @,\BxV $.;"$j1I@=7mq72K= }wgPsZUl0Ck*b<%N&}Q\U$qk7Sk#r5P{m./e-T ED(FH$Z>Io; Th٫+ mVM%i%'\Mi>UЖvKȅl8C+o.y144,+Y`Jӭנz#Z%>n]ykHٹ ICq٘,Zdfn0͉cX&%O O7S.E^{ 1Q>sx W11|i"fy5K~ l0~|VXD+?cL^Q258%"ݬ'np6>zJr?CWՕ 9e]"p sUO lZJ; 6u* ~O>P[v# YXо*)5Γ13'&*wg7RVBK47:!y8[VߥUwň)?],WܡpmGCWjB3WDG{*e& ,N*LvM.r me٨tMͷ4_zyd(eZ}S!{kaN% h}t2{}ԧ 14hFQ`?Wn2}^<mkq^3'd >8v#ވ 8a_Ɖ%Uv?1̡-N׆S-x97QS=ǣ ܐFF S srTω&L&hf5XX㍩7$C,Z0/@XB\,nmTp<]hwL+ ~v|ܤ([wĔr%fBd# v][rq98/"R,yrޗ5"s;iUSIQ\PG$&ucb[_%&o3>13%޾.#;2ضoʓO$|`_@9 VeG2ͅ^\M\;u$#m>~@zvsN.`SJbe-lCW!QT/9phpݺJ8#FJtcҏ4J-O#fAf4_N.#Ƭלb4Tdz8c++ {H:* \ P=ͯgṼ.t`??GW*(Y+ RF6`A'-B55WXAV:1S޸.KÚ2mAD{ui~>P9= j ])'%n'EP{MXBc0w`HlY"kLW$`ҩj`s=K V B㗲VHp#"e$&];<=4dlZL;ʬT+##ҭ/4Jt4#T #A}q_)^F;a7ThYH&ڑS+?%يGeŻi MQ~Pv(6.wm *'QPa4yT3:Kze73Ҽ  obM`$ݘ?^A[l¿\ ̊+b`x-_v2Ƈ>o']Pmȶ:x8m K?1Ee8zoop=d #Hg=D~X w͋vg,/L  =2Vr7=ݝO_&-[K8VL"0BT#pױA'3 !]+}Sf3|4ΌM^O(1y@hi46,N0)s@t-D19 (!a A2fMɰPYkp'(%{!~M"=?Md]L1r ZaZkYp :t,Y=H?}J,1(|fhYȻȃ&IZ~,w 3@p4$0۠]CxR! Pf*jm-!}QԸ$F{㵅S}s}2]pf '-(z[#(1~t 8d9yL(ovhU-v<X#2ʟª'8nnK .|L,x|8s;$ʷy)& 8?퐫mThNjV޲ A[k#؏(uu *¼v%_Ѡr6F+γr 4kK.g{wu]6acg@w#DP} ꮙ }ωr:?5"yi<xUUhX C, ** SjQkÂN!OPTR2s5?BZNTŢc`-`1g!"gb@w{(Vx^):خ)bU~͚6kֆ &m6g241$4U*n PFT7 puc /.'ej%u $WiE(Rs(yaqn_ ,S-e;&2gP2*ع >v ׶%'Dx =}^A+Ĥ?'fFr* w߰&&_='0z`,9?T]c7c Bx1}gx7Tr*]tֻV9><0_"5e@:Ap;fuP&K7V+~Y!:YLʿ˜0^++6?"i߼oW!%<j[ۡ+'+b>- ֥4J%ĉ2RK :TxKO y/Z5,, pdI#)rcBfW;x{7" `P)O%ZEþwV#(obH\.,Vs.lmu,g{Z9Ի.g0d[ON#U?;8$jˁJŽp28+*OȍF-n|>"]+7 j[v:1\8m)g5ZzBHҢyp. %D>^#6I 0iSچߗO/UuNgy6,[1q|য়hn׽]#{"vD72&.2cZֵiKJ"Sn0'ANPLcQu403-+^艼hn;adiA|:F51֕%z6rER#/"| QTO!K{DA&llz*[Ne#**bu0YjqWc䬴4u,S"H3W~)xb9V2%W Ug+E[~m'-)*x `f7iZ`۩Iur*h px3k9Q+raCA) N(eF+ Ň%sG3:T>+kcjaY'6(YdHֵvƅĹ/1C2/%Wx cLck,8g+<6~>>r,^6K@\g !I]D' =P^ œ3A_j4|1PL$s%c߅NE[QabD[=gsQ q }9k6Y&[AuS%NwNd 0_AI/rq&D! =|X_\e;熛Cr) 5M1%$Ys%yhT-sP@~.=*0.-T^% i͒5:&ֳye}{a{l$-Z^̠RBñaz -0)vHg^54-\QL$9s٩[luRb %^ٲ#.PZ4gC;XK5Wk,Ŕ9dyI0xpJ.mt7MRy^L*p!Ĩ":Lf,WV+#)5c*$+I;{g+X4BtG`n6%lWSztscۉ,o"Q.GmԧQ6qF85/_ŷ rP2CC vEC!;%HcȫVԌؓ) de$o`+ݠ<+fY, p3^v|A۟4&,Fр{ (6oƭ[:3]; /"Ja(8i59Ii=G2?o"^7<3*2q&Čԙ7q?t+ł${ܢZ؈$¦'Q6vbݓ _L1o+ .ps12 T[iPxΒwuw9L=AoAhAR ޖ/ڸ& o' "OҦfNz$< Tg0J16P]K8pԀ<@*APNT2@OLU$) #%qfSBQa>&c,*nt˫'WD/ #@be]N4p|GIQ;(|_zT& frLy-6$br%[oݨ?zYoZĽq ).Q;NX15/ʷ15c M93De%14?n컁tAt^($?n4aJ?*ba};}>Rv2-:n<9OV|?Y8e7qq>m =lǯ7#&~'Ebq #^&LG,/]1NA`U` M!¬3+6~$ 7>Ǎ _k=P\5\(TKNad" 916fUdBs2^Qz*P}Aćjo:>`?v0@[cؼ5tHڴ& jG|1Jޏd5^!*e 0#DܽճJU~6)$! ?법 SS`a}+kz48Uf*}ӏSSt\\.r2 ME@!!y]hٞA7((fViirt0px?39'6GtT.Fc 1xZbI8jx 'n;' (I=`_Shc1  2^Lx\7{hB| cM>L/Y bEAA)h0˖I^PBl'*jp|3|"q~|dIuR0zOL[jrv+Y R'=p¬QPy½1IJEWBVQ|¸.&" &3-~\&mz!%󦈺/k/]b Y)/*;C]t/xOzK7;zn*mºI%Zc3uQ;#8]vʔuh s).1<%[,^Sg3C:%W^ ܳZyta@W]=ܛYaj$/t |yP%mI5\M0Wz-_:h%)۝En,ɛB 옠8<ĺ!+&Ż] p5_#u)ge8S#p* Y$ywes,gy>(Y du" rnW>7 d88g ^gi'ѤVE'"(}F;ƽDl)zrqNh+?s Iq8HpٱtO>ΆaW\B6oߦFCmS-P&(@Y! :JT!I(X/ * Q1D$E$c\3'Hmx=KQ%>`eɳ>5FW qu. ^SnNBVt-m(b*t 5O -b6ڮo#2Sk82q5Q8BLÐZ%kKmG+?0g2_#im0|zX"+c,z'|q6N.>|Y11NDWbb_qzATGߣ[=ސv]Ɲۆ%0ٔkFY &]Uu-Դ)8.J|o10["9 4&\ ~3=dc1ks9e>C"PF(AkF^~4# Ԫ X2vRo9PA,} UM'KgGz~Gs;D8HvU8P,UWlLCLŮlohG#jdw*mvڇʊB}+Ј8>uH)dߺ'G)}-?&]06Ru#F-I͙Ը":nW+:^>"Rī|x@@ [4Wȉ-*yg֛VP'~̐rA-:lZ:s5D`1f!7vy2ŤMSp!'񸽿!#S`")-'/$n2gk(u 8cj@4N|8̝qJ,r#u9;}B F?ELDNl҇ʳY9S(BVD&DfbiL_`TU3S2,W/?:8۩j ?Eʟ{v1m}ssq)Fe'[V}^a6]LxͳT#1)!I+t*D),>I>w2 M32STBҨszx,4&U.?!>g)*,;v ©0bjp4ȷtӟ| 2<3\}|!YT^Cmtr&?'H'jo,!9/+vݔsIϓDž/b!Dwiy x9g; ɽ.#7U $,QMXby % ]# œ"8FB.3aY HTwJcBlK8+!+R9y*.0\LZ)G6u[}g9-}7$kjN!^RȲ\⸰݁.O\E텧b5*fzDTz bf4hg4ZkptŨl-hD[}*0^j p8r*5ȼɘ!8)=(R9KN=udB,+#'*3Xu&Y3\ QF~|]_X3 p/$s+i{ޓ:\z4w,@(YL;0V2?%KOvA}8IX:*Q2/JGtV 0BzuF>=rSUS_,qn$VDg4~il LO'N+(_b%x , #1bb5.֐hYmV[98e9k=}=a4݅ړW(,#CXApc&L:xT'm[xdQL/1 ו)qwPɆ2}; f_; 4blfcJ=] .%ϟ}% h@FMً>uynu Çb.Sqi TƨP;nҋ){:SaH{Q\_A7 OcW,$h`zڧV3w5<Y88-ј6f#[ً[F49Yk" 3y 9bWU1gW4#/F[c܀h6:mp}A-+A礰,b2f<aDzL]C>O!7}_~i\jU-j[Yq"8]yG#"g:kD2*0M +4ueWdjfAVվ4|cKL6,@i֏^KܐE-lτ"7 QDG3v WcK]5 H*Ke Y(,;R5X2\K'OF53O&wX\ jRS!wy1PPѲK!#p}nwCsŞ'Tz6e)&:Jv1$*N_~ g4XSd.e B ^V:Qֻoh* .h~ݦ9 6.Hgj׊Ȋ4(9ޔ{}^3P]9'~E-z2ǂڜ*F6 t5prޖK"?qMڋ"h!6K^{χOU',`JѮ*' iN$h{Zi1-@503b-^U14DL><Ha~qB]#\YS[ذO-&W87bfH4,/(]Hs0E~{xA;^Qz߶ɿ@Q/hךK0'-v7:z$V%;HR]~`JܩbH Mz$ڦIj6ST{[mL[JJY5.\6Rr7Th)1H)򜙝9ZRSg겢rY/͙S­$wp'(A_9Yp@( 3 --/M17>Cp }~=QrDh8m=^L;&)'3o2 A#cL6+ fp^ x?>yBX,d_%6Y@ v%$ VK0®7[!7hגȕ`/[9m"f2=3jE9$f7:8(E+_ D\sײuHpEn z:W,5<0ƏIMwfK"E]Dsv!æ?xl A<~N(k2} {4˰(obbX: '%aԓLQ06rF " N%ˉkMk;hA S:3QU:/@wQ4hN,tS+[( *VH@1?c4D~12l|\3e4[`MCc }_H8KnHmǝ|3ՋG8~8ą>4DZ0lmibG26H$ч әl A $\$Ii4v<0 T]+=Sxi~R3 %0D΅c Z?7q,H5g_hO\s"3r~T }P((5R=?)@SS0 3PyB, 2M۝yHWHL]K.EĠjpEo$zG+N_*0/U? LnXJB<6mXvx7e.(w+%Kis'\6b n޾B|+l$˛n,U#x vxC/#ҁZbӨїWJYOgHu8SWu(q6f"w}4&7ΎQ`1 gjA OWn;h9FX /Uy YsD${s몙:8gG8,Cȅxƌɟbk|`8 nND3Z(_iDjY vPR!8/sX^@QZ "3 ꧮ\@zN}3-A@gJeWg?g_a2+:M$y f]ص`:Q}+|XXA u"h,ׯ' _h X߿`Sd&9zBP5ۯeT5Y|YZQYH#zW AD1өЯ4ՀZ_֦3{?/ *Z6~)KƘKpdCCɨh&!isSśCڗo,|)|-HF&:!tECmk70n@]ɢkHI"ęn9e;t*&}xcDp+{cUȀ&OY"g$ssw*"BQRCYz6eoRܧ5ϭ.A~P| ĥ$ysdo0k}5 d{+nh+<\2,g|"0[~c$&¯7-2 tpYHΨL'iKG^ Jp{RKo(/uo K{LeeDpP607'tO+\6XLՌ,PW מ@F;Ed]͉8\+q:{ NiZȁmgm{g$xR\IWrmZu:H:-#W|HP^9ȅLm@) ex!竿D!FfPA#f~8 L5ekY@Ĭ,]"˜4K,8o}vBzZ/ldŮt.i6yы|þN.NysUr.òPD8tX[EsۜZ(<=yjӗ:lTvN~r..EUШ};UMA8 `LpTVyV1;gJ.'ax'/Rl.'?`LP $y꾑4=@9t {ʙ.ȹZMB+w\g.j9q_5YUDǍjEG":eD FNPYQ(ozؕ ]YbXH|tǕ(Zʾw Htz(C_}ʇ,fp.d ޤl2Qq~~#0ȁSl{"}.Z8cv#N >0+%'״TkuocEiA2!&q(+L4֑{tv]ާ c^5+^us]dmиcTmDfs-QtWQÊ ,y٧hվ7 ̏ qƧdw ?='SmPp,10Шs#ѵ2DA^e$*L56K9=4;0슫[t]/xXn9"m(,$ԪDWN]nT61KX$lx+4Fq%yShq-iZJPk{3; @[ސߓ?_RxyfH@C-a.fGϭ[MX7"! ?;Z%u4Mo2ccQ\ Y(*jOw`%swCj$L"Ώ,i\6qr J-pWO·usm 53V!A$=͜x40?hq}`Obg,2s{>?KeSNRf}j#opMzV鼿j&q?,F!̻f2hz,q 8JS<#]B_( `;݂5LDuf$TykD(w6 #f\يӴr'# |GgB*NN[5 X[6f}i6x-_땸#N!,)OU߂>~0 #2bDSemnyʔ$5%aP`uw)!NĒv4q \u^4U]E_Q1.2 ) a%n2oTQX`SE&ā:&Qv7q4(XAZR LК{:p^:+<y"jq{2Dw|UxHhb(XLj@5Vlmg{iRx;#_A&_藟N-画RwlWeY"۩,=}DEEo|!i7͞QuBQQ+{dOUB$0Vy饪 ?φEa0؇=k0γ^@''x\QèH`tӀw TrOk>3v[ J`33 ԢVcQj/qA#GEԚZO4*\G2IW"P|9(nǬNszszR* uLFbA(8kgSXV+rtxdYl*_(-PYv@n,ĤlQO@#E'?8$,FVR{,) ^jYfTw!QXT539QNF.V \ s>^&(yX~a2HC~ x`V1σs81d{,ߍri\`7像ɚ׎r{`<&~rҏx,L01A ,8 '4o>`p mT0ݐX $ݙ(Z{RP{ H<dL%3@-PpfWW 9yy4Q—%)t )R)PŻ tv1n,IS Ȫ ѵ#u;c:"f@^<1gKON xl@?><w3Le\v% [B [l XILⱉy΀ȑ }4ԧ?#f<ۗ62j|y2ѷYdCba``Y8>u`ΐRθUxZ~$w1]qE x~P_taNJ905J}S'8ġBg04o-6NՋ5`TW߈3 @3$nVKp0 H ٮIZ3=[tJB]͢R^}|]}B1BJ^r1yIF'(CڗP[B=>TKiߦїPRr4@DdUTح ƯϪvq 8&Ɯ?" wa@Xdoz&c3 (np8y{U4#`?wõO/8Y9|ՃGmF7tcD6Wplm+p>g" w]d :+]F}ɛS X V|P 6ps;+X0>Ğ4]dZjVxBqUEjX'9?t""y2wxN[s|_3s=`(7VvdKOŶzO4O;*? ɍ3p@5:*֠'\g^4ԥV|GmA*0Y$}Upgq=(r>Dq>32ЍK0ذLI?y|x6pV'` Zlzԫ:4@!F.kf]siMkMxو}3!qq5 zmd Z%+@:zVΐ ytAl.Es)4gwX735!>rX"r z3XIl (Ea\?z: 6`eȵ) DQć2jAE{j9Tt+©(Uh)5V_Sw T7DLhbo!ẋ;sp/✕\䆈{D}Dӊ*,6/"a˅DpU#,X kݵH"}q4xt,q, -]#SqtBO-Tj=9WCS1.d-|mZ|{kODBavC A->՛{ip,dQ,9 r2sd:59җP*đa "DOϋU {2iM٥<DhM>]!׭0m@iA|(f?T0? \TCe ;;BJ#"oE+6KBOHYj}vtF/ܟ`^ed>qe3͗P,tu)Lqy'f=%Z2x1dn\?ձFV']DGESk-Py䝉lnQE1'[:BfA)pܘ6T~`Wb1o\M4>'bq1)Sm $k9sIޜPSV m{ Y1(Ο$Fʏ)@uDS?f2Ґ<BDfWR\…u 6jX=`o""MFd}b@8P <P`sJx"4Rէ1c)Zk@; #"g/VE~7h>4E'uLe, e[\7@BAA^pVIfpjhh0b0SN|XKbv3Nzarc(2jռ*gσT[(c-R trWlh~$pXGڽ0_̧l{1 GqKb4؎NWD7\>ȬzaF2.-tJN>M~{k l>J1" 1n')>3~e uc5)zpu83^-*TY^`~ \ 0dk`=zSDc1\a>hO{>Z!N`2 Kj,K863y| VߢƑ&T.:'cELHҧ%^;tPEnt~/$6æz)Nu5R>3"" !sl 谁րn$ef}Ā4EXl; /ΰT*,b;wvT#2y)_wOs$t1LP:UnI<t Z 45md]^WPZ~Wa$6KfHM8$E q Z`Ӷ̤e)Cn)ˣPQh\ѶmM5O I_T]?>' ꯬e4d\z8y@$66EGr V * epT>>gHp˯wd˅tgdF$ԫo\`⸶zP`K2cԏ;yq^l /_3T=[F&vqL_ b;GmN`G/ZdulYjZĎG\"0HTJo?-jlC;2$/N4}ɉ(P)L/єu(tp w" T$6l>C:<PT#^tt/CEbn]%%|l@6O0fwš?PL,2@xGw<?&Lrtv9,cC2^Vi_y881teRZoȐJܮbs,zկ<+ajzRiJ-Ӯ/$H/B~KέL2ios$[$V6I6gP+ԑ,cJ$UvA岝OH:Ś[C`s0n_R qDX*B8;'4}("hb732X_g0Ñ}FD*ܶ8Ze{j^%Y$8{GQ! zvPg`/9tcNi2ŦRhmn4j(?Ƌ8tU2Lk 6m$@\FEB#\΃bm}cjKU|hnŁ)]FU-@ؾ7κɌR>bp~BP6 t6mՃ;\wib>1п_1]OךSMJ 4yP=v}q= .Xɠ@zXmMQ:F$q3/`>RԁR$^ieWuCP!ay5ػr$~y'380o¨1 S`v5F9-3̞>I.|Xup"˴Y(:bM):o]yGN^{u~(ر@*ieDzzfU6$Gb8hx"r5Ved8^}.빐j6}\01}\5w.|tD1*<Ѝ:-˘jNI,Z)q3K!-S.f y pxwjlPnr8?Z`x!# %Xp)(UT{Dk9w+x CU$wV9-՜V Thqv_Qh.'EtZ %87<]H` a 0x@yM:W][.q,4a} H'%#T Or;<}tq/Lcxqf=ߟX | dPm؄͸Pd?sW$n…|MmQklä`4σFrd5! pټ[>̰|ڮi|Gǣp̐u$?9HsP^$`æ~T[fi 1T, tuħ~v_Ő4)G^,j XpBw H&o_p":D&ab쬥mQ5y8N#A.-|&~T2j4hX!$ߧE6h<S745+ zR!zB,*h*7mGwi ",$9,?tT:fN2f*p}(G/WZd_1@YL)˚)P1!<4?5؍03$gį^,l&Yn 4&~~#I1O$2O(>RA젶6N1sS˭Ag#^؍BDUuY1h60""sRo Sƛ%᯹kIvItgyu(ۖ(s?] @|E \fM7mSؒY{X$CzuGe*ݠ8Q9wZpX9.n_{H> $X`/m32l*;'(LHRP@("R{ pA@Nc Lf3GL+>K <<WBKɇ@^$jxv BF8ӜUBSkFOL !u[V8T n~rIrƩ l51vP vwvxSzZ+ Ē+pLi{p"T_,d$6JVK^;xsz*_RqE<<^pe`df#k=hR4KVh2C6yۃTxT(^:rφ-ܹI/( pBo~szhwY/bH| FF6: ·TF g*n_6Ѹ(>}!O:+OJedphK]xsrgqYS<tw 5 -v?0: ^' W+}Xn&"d\4oJ z7 |7*ln@0T# \N%/k$ݵ=qݿUعb8X2 fw0^,B彫3jcԍP"m#LGC>sNWhh=l1 YS @ /u;'f%$z^$RbK䠶PE%TP(s7vt{_s,eT}U昸 k A1DƳUd>Z7jws]%d 7:|Qʖ,ȝ0 ;̓dvl >'cL|l:MqkVȡњ'7xx[{d:5rQ+*Ơp*p)#"UkM]6R9=+X]amdFÚ,h؄Dk36VS7^U6?,0"B$3tDjWt)ygJEڨ\:C(~ 2JȭjwnW}k_լͰ}@0#>Z1g)Oګ8z ;㐬Zr*5OV \eĥxwa!0։%)q?i\J__5{w7D^;/9yF6A&k$@&ֹ]  xaFo>zLKkGE>7D1ttdjk'Îpp-wUH?P念=L1@'YR K<0 Sz;nog0Q*_I O=Q"Lѫń ]X1@<jpJY/ ؆3A ~8qݨd|'5ObAU 0]?ͩDÀ-~ׇLF6h|c2{Y.#]2czGJLO]:bl{2;p敐G}_lJ`jHoҳvm@#RdWxfy2  Q*.X@̏FUĺ sTI/|=nvY@iIj$_B!L+UD<,#f4sIq X pux{x-ڟi/`\\,W&4NcOG(OsO9zQB\L?)6=$`;,+ _bopU/:L+YU)]zI|"Qd;BڑΕQdήtۂ" !hlǃI;x*n/\)HvL}L Aljy,Ьoϲ4[zCy%[9].i|}X4zM^EDh]S[b oqKйJܱ֤oP)T$nOk h$U&#.>SpD~csbSYh˂L{(B;Bh֕S/X5`AvLi.o0L[F+=cP%~p"d3Od:DnK5ܜ@o 0.䚫HgXH NB3oA: :)gA*r&6yrŔH.H5@`:X@AUd4ōf]Y44D`) R<5!iAPcLW.^i <TZu \Ve!hv3{mSȒd1PZV'xswHx 5h,\,loF*GH`Gh 99 EUn$DT =|mcd Wyv4 TڪC I^$ B^9e D QT |6\qv<3Ay0W`5#-)E Rg͒hZH>**ƱT绠[)ɳP|GP= إ{ζ.dzQ _9$|ȵ#1-09C6:^'hl&X5~RS>ȄӀiĘ:)ngTL.T@? XC ;f'FƮ+fsT8 (~LS-ИL&7 RM' %u|1Cp*HI~9":dcf )9G hT@5I"@ SCAe7vzg0 _8L)/}(S,B'<nDuK@; -eRl9boAT,kO;UΉFxJ(.zB-9Չ Xp$B x9 DTqo(.6Kuf${:=,if=|,7N/M+6rY0j1^[z:D5,^;bĉK$<|bijF4mn(t~eX !Wo#fv=x^P1~u~͈~s1cڀ1($'g Dn$ֺ4 ؎|kJ:pĺNCJd.n>hÿf% c2 ٪8pw ǭwgpWf_47VFPY<:S%@@ͩ CE,ЮIcb_p%mO80CW -|^I'\`y~yR]Y38udr/jzΓ[Jۿ!/>vxtF~[1 =jhZ8}GAT-<994TͷƖ) P~p8anB eA N|ЮgH0s%N[5?$4=^hعV} D.Eނ Η{%jϞפ bw~dy8Re9~&PtF2QЇ%K+oOeh@<6&e38KcmHKPظ&EsxxH菓g8@zB( ðj2H qHiPU 94P= AM(hcHH 9||WZa ɞ \'cn hN)`o`>TEL4a$Ke)pϻ1:<"XZ//@ʁFTQ{%SkC.e<(ES򨷖fzu C(,R8J]88 &U .=WŇ䋖ܞd_y7[Fox`1[ 0,v'LoI(;-+: ($LV8$]-F S,P3K$|8d ٥0g` U óNq(KoӞ;r'@SohlF4%K2Z#)ZSG\i>a8,J+@A!huwlT;fg˴*%gWRǻ-RvP?Er^p@$-~󙶡WJemhdR5KnAd<@-,z08 z*@,ģIAbuU*-RdѲX"$uP}ԋOQ6*a(HrKKmُ4[<<$Q4?\f0cڡ3d׳f8*P3y)RL-,"`t`T LT|g^a<4s@0YWg(RxSg=g|26 ЗR0y(`Ə B-,?FbH3IH>a78:ˑ̴,0Z.< |䙍ICWc+?{ioh2ȶ/ YuPt$4({I** Hc bG}v6 ksf75&r2;rdR(-B|N`ԃAH 4X<Ǹ!J),0l-!GpH+@{&$:@2P%w0(`y^o}摧`4R)[DoHB>vnPKtˑՁsU r~'{s\PķPcّRɯ_ L?w z?G1% `bZ380iN{9MQ >7zyze:bǮ]*6 ~3zp%FB j/U7!_J򇡴.M[(o[N]yྱ I+ ͗ODۆ n&rCj8p6DQy!Y-y;[±&-ub[QXĸ]g 5GlUcQfPܪhL ,e7sSh:#_ B q*%9lVVf"B.Wxvtih"jBګ=8Gڇ-t ;f{9\LaF+,=Z[sM8Vv9xqEa&XFi=P;D҉/D;FH\+m}^ pt||zӗKԌ\@davy<BJ=1m^c3 h;0N l{FtfX -w/]u $,uY~jJ4VBycz5bha@{>4IOSTN31$}vp~RR`ʞ1MuWHu^npE9K|;^ѺX֦0cKt\ ]D h'fXӮ)Zs tulX!`}z\WT+.3OX*,x5\?LfVeB'Eۜ 9k7R1_aDV,Bl.di4%3@BTbd<34}v3 )d8?N*x8XmDP''~ $q<is0W!)8g$%u[ -׷V @}4O^̍=91uB]ر(bZ}0*ϴ{18Y"(s]U'+~o6@Ȼ#̥W^YC^MGE@:Ky~oщvIeOT7$m w_ٴ$د$o\\|2|`zP6MDȮ^61k6@r~>d%S#ӽLZ1euO~d ]5*ŘP6D(Z?lD4jSH̅qPf]B kL\賣+R)J8S x!-ܑ5M L.X H`{D=|=!yx `Vc! `Iiq:3 'bMvqxsivz\zT+|/Av>8cHgDgs>˓Q719(W3z8w2,>- a`_(x`eoL#ML `gKa6+H3t4J悐I`o$~v=M48+͗~?y=FeP2|4Ĵ` Q` E8*Դ3mt.4;\WXT^qv.·B[X,<^ՠZeƭ4@Hk^:Mf6'1_me{G>W%mD>TYH0UUjeMt1٘) e]@'D 5[hKɸ{j B0t@"qE/N'UYrd6_}!#Pm4yOsEU,a4 )Iz)pmwu. G CM*I.|9pMqm[/Z%0h&5׍/]&H& Gc{P0Iub@LP`YƤ{sOsp{kem)!ZxV#J|uTj-ttz"J㴫_t$_Dv8Ec!@+-XOf'VW?HKcqV%R;2Mlk8oOQە["-?AwIj{5jYZzlUuS^z{?wc^x~_D8ۨʘ_V`; Lx4GMČNMe z}H Ԣw{dJ?EOŪ/MjUYDf:޻[%:=*ltȱT#\@:C`Ng{) ?mlbP!dB̉ѤWs5tFYM6?.kğ 嘾9ctj;7GeaOdGI`~1PLݤmv1-ZsѰP^{k8ONVhUt`-rg E4D(VynRD #N)$ d餺<P <P05M%F`8MU$ĵ-< $0y&_gCM \lᄢik M"pOl6Gф<TQ^&ʱ&xKLw Fь7<ѽ/r_L4ʅt1&x 7]F]> !& ;/gKs<DM/ )04 Y#z S()3+B T"@H؛LSݥA1:$=%.řPk1$VD4i"y"v>*Tp7h\jOlnc_Sr/'s<&w%Rn̎qY"?zRz~8Pq /It1҇@1Ch$t9QZܚDSP z]}m)/] otW`)V!.~ ( MTpXҸpx{H]'/lWf, &ĸ:Ѯ mbWZ.JߩHЋ=v6[懠<$5#ţ 4!4<ĵ \c j@/SJdZ!Alf7&ܡ8*idXp, IPzu;rM@a\^/pHcͲ'HÛ[ฝ355yI[`YR"zu|Hd.*"c@9Dҥ]a; jSuQzM!*A~l4kADhDA18*rԲ!0š}8)6gM*Aq]0[F)&[$85޺R&!dd)kPt}*~T)=1 <.hvcKBNp^<?-Kݖ|8LHEW1{8LzumyS,pKDz?ow,[(͈ G%G6 z|tz98`װȖ. AEFZmEi%0 v~=6B(p^Ǘ^wE%:NTF9Fj>O[pww!"s|9O,6o`”rVgXjvPrWsUi@(êTL~sTkD}x|ʲȦm}s{tb5RAKNv1BB\ ņ'h4  M뺆xw|z5cPK4'c9" 3aF> \]\ʘ|CTa2db[C㮃 4I*%6 K :$kVG3x*Mtj, "!T:I#+T]+NƿlhߑqkuA@'ҖUZ^t$f4>P #)S:<Zȇn.`az{{lXT%;N,_z f >ud.qNۂ(dGMf؝h@Xؾܯ>Z dϚ1HԷ4MOf{lCƃl#[S8=9[a%Q-CX-dtWyW@#h+~\e4 >e\L_2 `{XfrFc{Z7/[/A̒~ZI`ː3eHo 7{4uP:ה _KLFz̫BY2bZ8G厞E&OI`|Kvr42ǠE5#,(P97ĵi4 a{~7*Lh0a&?CS' NlfT6p>iCt1k1(U?>uwg] o|]&v~oy+eD݊ǖ#ʼJxܥD.De'|Q5jkJb޾iBdtTnˇ4 T-r2YSGsZJf49H-Ӻ\誠V66xȫIx+dxR?grRq͓9?B̅(%Zr2hHtaQ :)kA.J@`VHgI%mLJK:hn vxq5%z؀FA'`ePyj8+Ho*2*V @UG,B!x?vq֢9%keWʹxs5Yg,U:)GxVSU]N Z8}SQuEkmt:&L"by}\QⴅmN۵j$%?FɈwm; BA7&k,F)n[ʛ!̭|8@\lGI-'4m@A$P]+$iQs@AS_3N5mᨎ]Q\ |^W rQ|+yyót \8x`Ǜ1b-0˨9N$QFA^"#} ͩK Y1M⧤T =뢑=hjmaxѵ4 US-A^mB4WgKWt7AثSw,$FVL"~rxp\ѩ"PY4Jt!Nso1OF`) )Yэ8J$5yOIġ Eaؐ?8Nwp6@Ѥ̩I]{g:v\nwR /HX,fߠXs@2 qhghy(S aSgdf Q лPXJB/ɓH9:CwzJT(]Ѿh$bݭSͧ 9cvpds)%x#P\TaH?@ }C,.S}eG38##u P7dcO+ U'NFH<t Q }pc:no& R0iԿn $ܻ}J PdlpՁ >Y;gPt)bv?(y|kź72." w@~jƄ*$?˂U| `X0՛wcڋ=wIF{ (o[V+0&e EPr&|!3Qzm((ോ3| ا<*cS-s!OP\vB4Q5a[)s\HNpIT)\d]tۆxv*IrJyp:8nw)ٍ~%&>!QM#޼,NF\OEI~ jfQٝ:dbT.wmTdZ\~$客whsJX_`sRf)a ( :# ؀ȭ74ι,4G@Iqa=>]qf=Ih12eBdT49[Qh V 6^ګ0o.>7#nI&̾Aee,wfH1i_odhZY$'PPEBzzS 7Q8Kxy _6xoCSfaѿR6QϿ'6*V`R!ETBuIflT,VbB>c}|pr1yd0t*B>:IWS?D}1;BCbR1}ȉhkkSvk>}bv  cedŢЉoen)skݏuX \}*h` $zhS*;g90b !CX2RhkV}D"'*_E,_3p!LD-N6tzjI .;'8܋z~4|b-]\<xJȬWȜzX;0GT3ng%A1N)jXQg'ypzχy#ktyaP*WKٰ\e[\tE<'Jt}bɩnS]d|8vհl-`|^DZ-H~6H$x:4ʸ$ :) Y\;=̳ 8|O._1\9,0N`a!ef*X̷3{jHRR+w;NB",1V*/SZLT&6{u*GEZĕ#tl7P{w# /I,}Ϙ@` AqG'4uw 4D9Z*,`]5 "4#tf8!йHlK4 ȠRT<XP|gCT5f_CQl{B}(6ЧV .V |pF1Gs%ޙ<&AKOq0 4 h/yJm&¯n~iG9RX?^GD052T]'68%ٱvt`/_|Q+yztW]-4կB.j c|gt˖#t * "@4!Ok|(dNCzr=fx|8]K/ gu0-!;`^ a+` `h8Ni<>Hqc =(2}됂g(Vjrb^KػKUyx_ؒngD۾RЩ3毘VfvL@$ ஑g ]%f\^},o d50E4Y(L}PCZ7&E 1 & %\<ݴa,_2RoH}c>[%U:dyeD^ U]`[E }! GJlpho>D7y$9SjY-7.1- zk$X|ܼ٘xu0fj-9Wd^Wst~3lR)T#<G.~@FтBʥC61mڛnQi'4{,,B2'@|QĠg^qkSAؚڤXd{zwTVr@/aLi,ؼx[Bz&. 4h5͓<_]Gb*2>v` )cm#Lz<;Ot+pb{)"PRt$[jsO@i2|X")̹+clߑ'+G]| l{QLcqPjVYyҵkW-[$V3 !XIhP6pVxW#"~tSRdGP =a} @T dJh "4נ/D%n 5$+׈f}<#+M>/dO>D%8=8kcHO#cذqIf9_dܞ(e=73%b}S,\NdB,xzmJmm'kib$ս"MkDn|lylhVw8;Tr Eƕ?Pn V3Eas{XoEj 8L)F%7 "u3so;&i[Pr*(YT|C^n5XZAs% d^T+N;HcU ?89l7D`֘-d#h,:-4p|t\BrW+w\n5x( F$%oSs{}CbxОS 6?!O`duVRi~j +E HïU7$ DoBΈ: W%5t?:ٷ]^m281s[ƍN6);_kqؑ/#OZ/&޲OӨ@Y(xufG ZT[d, ?)+)mDVo2$NHW%_E[ lٷ5eM Hf)& cWHuL:Qy*@.`tIR="ОJ bh@;MS ^J0(f : ~;s#uQ3h\PU+j} ͈UĊ.ڐ6+3hվE~@^(TD2% p :0c)1.0'ie>4%PZT4e;r nE/FaE%&Hҝ)NQ<@r:r(ffx(كޔR` w gSk'Xڟ^)K3"Ey{KToN7/)F~P|Ssc9>WjZֻ\] *%Ǔ.jzP@ula8Ueܱ9=#!־p1t!+O ǹWHla5eFM=R:G#P8 1Q]gٞXN3޴tmr>~]\V(J.z/@aX%fSFOu~@Ʉ2*e$;n~__,3eψeL,TWP  @Qp#VNqvlEؽ'4j $Mrd="ᶠmZli_M]ޮ#/HZ~KN0(2EKuq2&x]4UZ؎8iZK:H !Aos 3F!4s|5]\0#ϧĭH&9:ItY[M0yb]`1>P8.Ұ}$1@TT c:hx Cn p,  _=OZ$k1ϼ UX!soQofD(1 uܲpfI٧N!L}vrdMup$6k/ MC 0Z`:i+3n"NZ{{f]xIjN+_z}S-5V"B$F^2 k7mSq0QU_W pY@ D0EAI :{ҺA]./u4Et}9Xw:aOj(_@wK{7AenlLi['}w;[`⅂d,TIfP͸i gdi (" LJոޓ`lr57k1(!#`v D2w@³$_46 >МƀG+d{4s}@jzL޹_/g)K.LKsMpoj\;eޓ@U p"NksIu(QJs*aԧn#h)&쾂@4>z1ѰP>]y. 'e{ W _%)YLH }LLF mKq1H pkZ*:xe"+ZgDs(舮Rx6@).KwmXu+!ذ޾qx3|fXVH=eRha^:Ճ&t16nix4AV+KtXTV*TZH 4[9EA1*|ǝ̚b!nѵv/$*4+U \j_Tw\?jL,w`°2 դ'NsҝLnD26 .j(H^oJl+A@w($y}fzSK=PV1{u.uLW}`F kͻ/c<=T7%#f$%)lh/@t^!S;<&,~f/yc Oę8n2 \,X(4 vI Z 90\>Dנ{&|ECeRc<]#8Ճd̖JVfx}fMs~l'a n 1RNp>du> J /ZlU231]w[IJr& ԡ <E䖞$7ZCK gHdCFqGtZPLik#'93-@pR?Ocr?)dem 2TKSWp( o2{ @ 峷H_,g3zԷ\~e.@-Pdr%|OQڈ0 N&xF?H> ==6L椗qxpo n&Yd̗2~5q ]'Ր _L2?e~seU0lhu_eN2W U~{q׎]9!wPK ǜ_Tֶ@ 8J_<$9'ݎ.1BaxPǭؾh@lVSz$b41+lFd.P]'1#ڦ0nLE fFj_ S~)Pv8DP"רt^` ]y'~T|/H?0˸jPefBo-" UE44WTՎȡH!% be:NQ:AKִa A)4DwiEsɄ Ғ7|\b4ڗuul,0}viN$)&TDZ4eU8ˏ h$"'E1/O\D`r/MJu0G=.|V9(hl_$0 {ޡ d aw:D3ep.ܺ$9 @^Jblg:®c6b$6/<G}ŁXce9T4`S';8(u $:4P^LcBPC;)U~|T3wZC0 '2 ? mYا$4즅}ef:/*zqobp]8_Z}LTpHp|*BC3t-w#Nl)3@r#yu8!@)]Ι۹Gi {|a ҟ69ob^; Z-t򁓘H$gĎvF{<1S~3>={dh&1td/4@ömC,T.l$Q6q8ƬTeϮxOzn5L|A` y%֍c -f  :֤h 7DV$n u,pTjϫL П&=!^|2pai[˛0|/!I<\*Hv0⅁DXtgWњ2Fߡ;gt6Wx U#%";k0h,=wOb1'par_Y$d1Gk4-< oI!I$4 %mNn:Ȑ:SQ >r.NQKOHcPLt>,] AZ(e#|:GlH@]újLFit{k֝8wbEsrѡc: [(7O;+5}`?TL Vk)/v xkUT^UwCl^g1¼(YF[.SG8qX4ClS-dCOZe!ezH5 QД7m3 +p ]sݒ4xIN|L\@VU<,Bfmԫު0PJ@4Fw.U)Rds]k,݇P\U#<娱 `m`ltOx4M$Vv- x/SQz$ȹnĠTla ~SiM#;KeXv[=#_}5 .43mHH*ď^QWYthO00 Æ?TZ62C`gru/lH@^&V:4=bmx3ݔvYHZRȇI${/~.Al~P/Y1M%g#m~[嵮;@cv Q^%fOD~R8SF 1'Q= M hBp )GH}4qH_wt0~]'m+)B<$ dzmhIb_3W| j=iiM(Td T~w? :d$e收NLQ@Q+rkrvn/_,C8LX36-)V.)|s"rX&{'OLSVyrգB0eߧ"Y?QLt0 16\}\B;CǵV0yb+ PZ`?Upw e0+N%o{&0V շ 1c',g>pdQ,J7ePXJn_ +\vJ22w\ᔬ~w`N B9{xnߜ[x_긬 %-!#[5QGDWwl,j:%c+%P["IQs^N Y<\$|(.F' pPc؆}&OkdD`a<3FZ46 \)8Hl4]%FD|9A*8pVar #0(mM(!f $׹wNS R9b9I\OԝL|v֕lhPa m"M׈}񍵩G> qćd f#@?ЃfKY@6 E hA^Aί)l&~σgDrY!0RriDLPEQB:=IępsAh0’핍lJdg$w6K%w9+{ԍf 9\ns0,S-"+9GEIyV-6Y7L*.fk^G|F5D.>oC08i1zi!)Z([}a4>h1+RA. 'A4`ܦˀ.g|ΰ68)- ^?ل`.TrFK̭$=8Ԇ c1`CzPrDZCM/ *6{= Lw,yFwD _1#̖`8,nL'pEM`#GM a|0'=p 4cLd)C*<ְmivxHjT +l`1" P VOajV43-GzލQȟbq'0nt̝&S )=~Q)X!dˌHA'9>G}4~l>]LsrFewdӀpgtD_P$Vv^Ӹhscx+q=`@29bNA4h[->]e(ČeSΰ\@0)GoPHf sO@<@€[~\ ș.3(e֐JډnM$Ng ;@HnXqLb34fFP'7R =1qL,0HZ:><(9HqHU2٩='Nfd4+{&_xlPLU/Q%~L "N)0>D'Hͮ5S*f@~ )Cago hw%;E.RY~KQ5Fogt |;F&Eq>\a]+= aHn"d7E;)qM@.(Y,}H+G X [m̿x~D+!f̽ eQp1ԔqFi:%)Y nK}\X~0A}WHezlDt#4.1}98`}4I,xM)XnG4 ,qdB\oNmO#2~}Hin`21mOz܇!%ZW|aXlċ`ZiPzF{צD8k‹c6kuc"z>6˰exaj}˞~x^0,{`l>JӘvdDu䗹'ptiR#7_uOf,$Z U׻ p/oyWYTf&:F5p=zrkrZd3b(xЈ[tHP\ }`S:s`Es){Cj:+{\U b{d,`U +WtjMD$n! *U6P5pF!:$MEW*Ba f΅5@`t oo?V4)XD!Dz(6<9]ڑ~zV0}{Aerx(dz9c4+ɼS~RtjAN9Y2 TVBa$G(|x $nPsun@r XC0hp""?k\S4'Fe?U,R >U<2}g>1D0(d<91& Pp,\zy D.!an {XȴJ򡕋 اwP6E`qƦ^c<)+k\jr!Ua}Ҭ+"LYNd#VH {:z,+=/x.#8h%$Ǿ9r,c98 Gs!7?~9._71qf,؂Ael)GKgfXd!lq Qyŵ (7^횈=C= LQݒ~Wh71F0 0%*UZr 0[M2c3h Z[On {VwfoW`Q E$Fk-۩(kUeܥYAxXVQG4`I  ,]6U|̉Gp.R$/x9k >\5(EdX@2^g!nPU[K@NsĨp̯Vf 6 Hѽc>)|@AS!0lghFQc4:ꌒ\L28tO.=u]&KM !\UBM<ɴ u`1P$4B~M `l|JeL_WPP`lTȜJzC<3 ǜ Eep֨q1K|JɄ@e<0=Ir&:jne`A^؋/JU_&|Ze'!p Բ;`AS>S(j~ڨR 1!! ʐtC5hn *B}hH=- ?1-@ciNHf-T9`TRIWJoya˲ȏ5RT z"[m*6 aD񭈆DcGi ;It 49\Tg)\\`;CH絤T"s: P.0V6 ચk' )4]/?U4\K~u2=U*XJ<*ݱǩ&UwTcDkbr$'V0AB xp{W->zK/yW @2/ܢ VYi P%jwV>Q۬Ϣ*@|I O""m;<=?_iΔI-$Lt!q:/o8= / &@q-0eOt*黯NKjh/&q $c(1;TVkT'DK/Ai)%K4BE}̺r Y,kK=b(=Gh`UoNa8r@"z%x-2Qv ^ܯ9 i؊0J-i|;Cԉ$T0c'66\Զ6&؉#-W\v9~!by1柑dNOhy̵m5O#[|76S2Nص003u[ \2G^QVx,q0|*SmA-T40U~Pq\*LhNN-<mSqw5T0L*Cfz/!D (RȆYCju GR!)^ q>˥*A='eoQTg>H1PPRxNF?2v'|2[_,v[sIL#yEfFeYS[U|Q|K0@ -nnfC|$L;Zq̶ {{?nB_/d5Vu$֫%|EᐃNWoPdLDr% I]eypK (p: & UZx69Rp)Isܿ'W(rXlmci)}xS(VW!!d- s`9uˏ>.ȇDGPAγ|g#[RH2Fi|}xLmC[ks0}r>8ūظeji;3Q"f޺zL5->PapϐV11b ?1Z{ f{'؞I9_ _ dj%: ?:ҷe|n2."ڢ`J,<աiZ|NHwTHAl#@%ຳg#9ZZ {O<cc p 66maY(đި$szSЧK(}ĸ*9@/Qu`_zft.-< S\ "2JGp\͎n?sҵE,`~J2%pP\ k#wsLU>U U-pddpTD$9 ~,x+!pfeM5 >T$懑OmRp~}lt8ٽ$e}1Vn 聏}Dyݏmg --L ֤7d$GcDW0 i?yNMT8!g>>T5q < ]ΐ nx7n|r4r >`,Xd xͳzPh,XDz\@ Glrdq yU/PDٟwۿf6_<3 q9!vVIkkEx;VܮA70V)[vwxן||?,#0eOnq90o厤LZ~/?H@2=&\~2h@Ͷ<`tqŋm%BgZWR?hRHt A꦳.,Gid=g6%$#!Pdɓ POkPmeRGCo IBl%H[@Ή?d3Je0|!&k0`ت9pUqM$޵\'"O+lHفy"8V蓤|g)7@:=  ,{38vd缙e,DŶm7?vdUD!fN֋'XDdtȈhzFAOV. 5$*n|ֲ?8Z%%dx6~2`{'W0f%/lR&,Q3aـ)Ps8RܗkUu"}@^*)VO7A3l8~XhX Ăn, 2q6<[Wvzo^%]O?Qn yzXPN1 ˣ\ÐYM}(xl c=d }`p&痶ddM=Ь =mmhdspd$όZ~\$Ѫ,47l*tUC#_#U;:DwGiOs貂bԾK ݝp| J~`TCi0 oPܽ%E 0 g:<T$x̖pVlNV9֫#-p$FO;#n˯щٕEoY D5E7G4Z^|"·Y\sHclNwlMz9 Ca3Ψxɩq>T hE|ЩIt5 ߪ@7L"z]s;:j*ÚuD^ZwkUGL~H,.iG˺Ӊ:i"tw*av*ut(zML+U}/>p, c:nq~OS*38ZGٙu!d؎\OUn,PЏɓ%AT?F;vtz8^D5fZ@Ug fwfаТ%RS{zxB<:#?/wF52+T7/[@w__GYKIcM8_LLȥ[Eu91zlQI3jNra 6 ٚfPhWE\ @xyQZ}ѕ.dkL.AHdtZQn1V8ę1t&9)1]a$Wh V͓MlxP=vP>3P0#疳\mL~tDx\}+-2E!ǓU˫$($#4ROc&uRr?_ OeĮACg& ~t_oii8r, [x\<ΡL V`|Ic *DޠoTwvgLj!2&/$;_=j!,Tx <_ Hs|dcwl+\B1_Dd`%ј CpJI GMee"(:,> )ÏQ6F0ew=8+kP,ܓzH,Vs bx)?q?-Ow&nDtX%z|$&xp]*OmZ3B{):D/b|a+7`L04ѓ}ϫ ft?Ve=@Qh/"Ipzx%Df:.}WXk+ЎE5cBo@r*׿mNr=Hi$`ڎ28TP{U2X,U~j8FX4 &Gt\k D=؆],.̲io1k A?p2| ܿd^_3걒8*(8p/seA^T~޿ g3v^* R\[Ţ_ }j$3,\#vFt7XvŞBv,L[8Wj#p|`߁&X'iLLVhhFh>zWut  eSCYyxLBWi/{ǒs`H%Yu呥5Q8G꧷_Vvlڅ`6"Sޑ{H*iQė,83 ,K)o>fVBLʾ-Xqh, ˇ$\'ulPP|oTzMt@0Y=(YG| (1DH)rzى!(͞@b{;5)k N`C/PfӍ3~ sB>nOpʏh˝sX z  v K(攣 ϭA{t{ׇu s:q)+\m0muBr"g瑯.SwR&:JC$_>Z;Pl:`)f 1E(t#LT='%Sk(/ש"˅6U u%v7x Ҝn!ȿdrun2!;$PlxbXّ#3Oz+J_UxCe5r86`]C*3UťIU~ 6Tw!o߼"EQck Q7tOU3`kEdAD\!Uk2ju&Nij$8V }޽ "ޡy a3DsAPTgA<hšzvg}hb+j%ScڻiADz hDOHT6:74 mCPg+ŽH9MCFA vupĞ]573:1gB$/R6% ;oLƏ#[_Nm=8#Q]j$1`>+EGU2qj%p-C2-'s}6_M)1.J+[|N;pIH0>!VZ%YW2DE )\%- ; x!8}!{$pbwx={`_bP_+*e57R6 "f2AR(t4`zYSE3*ȟuG7l\l^`INƉ(0R^B}p8V U1=)do/xbLT!`%Yߤ蹣f!uLap=6x#Ghu4ʑƚ 'fէk^#t yUcglùhPmpݵ*#iaMPsW.K^UkT ͋~wIC=1Ct˱_u6'j)Dog^pIUX!~5uz|fIT_۔0A:Hñ,MhZ:pi#`qS iД&!n'TT5kJZgr=]R(I$4H۹mPo^, ˒\|E`>_=ou742|Ld*x, sDL8e~ͳ1>vx }oVp`2 d5IxnvPp*M- wSIu\)]0 ?J\]tqD|jI]=0Ux}q@![*k3|Җ)dC3cxԲ#)S-[$A`_.nLX%8X<wd,xF0TbKl{Zo# @/)\ &dYJhpۇ{g5όlchqs}ĥpV\d0o\A&\}g+O.{R?XcSMDQ-̦'2`Bi:=Rس^5߇03e]^#X`삢*7?NFxOa)`t sKO =o¢>f?j 1:$f.'/LP8 XF>,#xpF8Og`T#rMta|\1 '8!C`KC{M?6lMd5 i/dkqĉ]%px/r`N<}Y[8EO0C cG|j?igh9Ƹ!7-(Gғo`WuY4  V0) u(pD zԂ jE.y'vU1 J(h|ݍN չ?ܪL#m_ˆDTԑu oܧf7ϰ?I ק G^L<ne DfMEL$uQCIv ;hmwvnb*v%?7^$pocxAXGi(` 4KHpl!ȳ<É\ #9m)Җ;}<{|u$ar0A *iP`N(g Ի5> ax풯\NKWBY}VGB έD9l&7uNG:_qph`^XSp o1Z\Z$Nfvv\>d"n$,nmJԋ߾$'w ˃Z@m? %pyl*BTeo،VDC!G 9m8qpnب$-$3"sY5 \\4Ryͩ+`ΏmT]ݞ ăJclpMg0@ Sl&<\36usV`8W8&*DžǬɓub8`%DZZC >(Plpׯh Ss@Y : ˀ"C\ (/h{y478-hڱ/aƽ[&۞dllH =,h":W1{x0R̺71c_EP^Lq@v~p'3P+e&~ :vy;<0_/0$@wL&8+ FMfg\VVפk׵8.DF"y(}/n`C-տ>$DfTeDhTS9o7OBX,8_?$i kŒg]< #=nRTͰR:O|%vb? 얷E 蜘yF%ɤ yv1ԃ.B+A~viP9$@UduMQaAw?P^*Mhg_AsH>p]6KJ|z C+CqnahQ[X\a6|NF/QЏ̲qV%lta sDQP _{A; /M1c᠕mD&9JPGW|@{R"ycbs (s9w|\i@nۏKadvT%¯ M Գfn;歉|Dn$%5Wch+P+fܫ xGĉ|1<CdFږBvukgHP, Lilpu=Y{2 Zj\i5[Ht|{Ǽ ch lF 3Rּʘ|l)̷Êw`!<ƯqoNSsB$dGiFZ9lT8L߮gYyt- K-]I vEe|lԙqITDC,[wӞe^b&$ #Os2}"냎*r؄ޟ},PRJw~#sX o_P2dNy⏯\L xn ~pt7֨`XpYLS ScVA4ZM\<ܡuO̫q;J$0+wZMT EX*| nZƒyaJdXHhitamlF{j#3^_plj~/&ͺh!%\%]? ϱ,1;2, [8FD[#<1>5-x8ph,-N0UH#$>9gOS霩ffRdBp=2-vh*b18_D+5Nl1";@cy.ÐDc&7-%N1k)|;@Hk>l[Tc8>ϨYC,-1"(J9-lb'-$d1>8#w!13lf 0(# ^p\e頱JPjgOD!@wI?}:]hrmkٗHTOA[X!Lv^`lJnzqA^5$gh4F!|r @N+[vn9>x| .0-iZk:yRaV?aY 9^fGw6,Kʏc=r)+nقzuY:ch bUqPAz<w+[4Ȳ0__VF{A9|0f-3qk\R.(zZ`VpSӔ{D놘' ST_Rd3yqZܝCL`-I~ֹ+ĀôHB\6n4 h;}#<=E!ʂ2˕{ jJwm0~Ui+@,WdDII4EYB( 9NQ} XNr ׬/G U %~ wx 4eu k{U8פo=g"Eq(%n>j;%` ΎLx6eu>rDU -nUʶ4mHHH1ݡfdlЍ+#ⰵRo%15uTY+85q/?G ~ӈq#SAעH(2[dug8S[f^\`q|LF'1|gA. I҅Z0+5;uѮKPx">Jg - O72ib&b}=||PPidc4hF斩8npߺ.Q K\A8/Fe"hqXkNCP1">a |7()6Lc, <T+XصVAF" 6+)nN%_t㛡I~~~!|gNe2@20]2 Q(̶POa]+>ڥRN5BSRƘ>Ѓ:5Axq:萻']ZRSbs#O\e/~Nkk~|Q?& 9eIfo:Yv ^xÎ0b{$`iɶPh|:|疧llc#S]P0xfVvVRxI^P]>?>dM}1+|e)#0QGzLQ7rj ap",nHYz~s(ouSYH/+ vؿUWY:= %X2X.݌ =n%j%d% ^vTP D$az+@8z.E01#35TbX7Pym1 V@ DzZo9ڏed[1%ǝ?QUi ?5fDVUBDf+Eνll6҈k&xGz&QACRD9@4H6B7o)V@=KBM>Li'Ypu >bDtC+1=7jJj(%Z T5EuX9g<T% o0\#`Ԣٿ>|z8=EW}fu(;%b j\xP88>cD\r/8*VFe"!x_$]ţ{L,K 5ulJl-C[4;~$b%)*8bc˶I,(BUDsJl1>;XX@z. @2 F3]JIξyV4n ;qe!yX\VM/`hD^D86S(jϓ^٧{$5Ǐ )i,Y!z;8 .b,QM hJkEOu|XMSm"ѩ*Acuڇ䄈%VRi*m ĝ DQMq6~</Zd`KIԳFwַtw)k?__w)hs1f'TF Z ROYm"KoM[B G$5<%q 8sU_sov`%IE+"sr^e"7wz<ʝВFk,k0K@BG#Di"<hn 9upX<]dftk`yHKP Vo\b xIh>;3;ڌx*2 cpH6!-8rl+sJW `[\q)E L.uoD3WF@^g̵g~c"y 7! sE?=a쯩O Rf|>P=Π@d[>TfgneT=r}𝜬@d;nJ?4P$1K,ì֭Gl*^$"fdl#Wd%T*g%XmmAvKrꬊw$%_LqI ~"N|dZZFȆL}9!.C71 X|llX ֬:0##F䤫.'TOWV%viEȉHo3Žwrіi且_(AC!C(AkiG86=6 2^'0w^7<[Kd|,Q& }P,=<֩t.MN ߇]X?[>dL ~j69*4ܗacV*8GOx)*?eB&_<d]̈5}ӞƓc|R1lhtu'|v(5Iʤ&k+fUCo E=ZݹMnj;uJ.*3!]xJpib   6!I,7, =>:h̕[c8g* GK !]]4֡UY5}DN]|/r3w4C6D L*pb{+pH7 悬u),iVvVܺ~rEܼxHSЛƟ,˜wl;vg@k_H#_(A @4fz^ i)*qp휙Ӽa}H!KRaϻD/V<GBV6L05x B"!M'Woܜf\pLFTR*  PMDp☽ODZL=Yr' IᗦDο=T{U 8|̗v/wM M & `ԨAnBYRh:5Jj(^tJb+ĀU )w"3ml!T!%7CDtQ_3CIH0*J:8 *v`/ ޿9j#Ɣ"T0UQqT78y}ۍC,`H>i#o*c6t0u4軵^ **p]SK<=Uȅ^!rgDxZkɴR`gT-s q$w@ hfVN'g? <#J'r AkƞEJ( 4Pё;85 ~T,4$hVb%*P/>&E!su }16R2;'xe5md$?jQE$eһi|P\<:,A5 J<Ln9:^,/s0J(]01~5SM5'Xe\tup RQ0J="'޴RB2~]A|}%JdP6EĽEtxA6j(VA56g/_ˈhWKxt2 rS<(MYvBWL+#7%b^tQ괾VotgBU*2x>ri=1l9 0 |ܼ6?y PZs0aa$e(*RXMP"!.|kѴ `2G&sO!8)MT`t.гB]Wk5 LjȳQ0{-"m)ffiA/x񴽺Q\&[!*&`]lN t,'}ONΤXLV?JZ]ҊF&F;Huopѕbm Y@VWHxF}E: Ǟ͇d~y. l厤ltp°fyԭ J iaDFC;؏ iˏƦgxL8R*D7tAT?_WҫT 6m!2eKPyt;+$;=զ"PgbKw>Z߾;c(coq@z2o8βLg{Aȩ pI ~/ET Z|p!Lm˴3xȯav|Uk`瑟X"LpS:rF|؄ +&ffFj}`B둅kf9c1u5E[8P\57߯@b ^L&gfNXgc%pzp UZ&ipƃDǛ_m&uki>T{Ր!teݕw FNߨҳ8D=k NԎޫq:H_4rCrKV[8)(i[H\`| uųf|0p*яt1Od\5z s' ԓ{*M?Txbj CĺO["@pIJ3,j4E‰J5ph@]蓢ڛ"ȕNu[`}*?z4k" e#4%obk(̷-Ob5T,U2"Crrc*kG0hQѶPһY٧cUcu{>ODXpD9*C1YK0aG@N /~5*ә>4c"1ʦr2'`n(s(TLj RڹJGdDOЀ9$6H|9N.P_9-(=nqgMe$ 'ph<;o`ŻSg_ć7\Mwl@,I_QnzޭBm2bߎ.Fo`IղؾLsKZ1wBpP /{'T?9 ݔvk[Hb!d5#PU(r"yD H.%j*h3~r_թ8C )[L8-T=`K3bq`\A[MRHJ|)5gOy! 8YA~_ W(y`͕oS?.5 >Fv$#40 e켘lY4WNXhyD*x;v>s C9V̏.γϙ>ѫn?y}%؏ {2tX2;z^P (*cf P?UOxz'z#Jz,+48byXfғdg$Rw5S8gf"}fN?: =iFc 28b|1T8xBOvΥ| ~<+_9n1UC-6ʰz+|>Z"*pFy!iE-s!/A~cwc|Q7GctO@`f^ulON3h=ʻKW}H/JAaXC&HOMMc [+dpU N!CZؖ?hş"ޝ1 lϏN'X4\?? ( SS8(fd ߄8SP=J.U.ڙ\ v>]),d8&2lY@^l wq1P:`-ZV<_1.{` pmpxFMςXԛѓ ٛײ Ƶ,_tVL_\3E\ =f҄;- ap0nBc!N:$L7xM #8sAHo`)taʿ?!k3f5(" ?.Ns7( `Ge59 6eHcZn9-3%-W":#%j+\P"y~LEYijb1=8jU4-PUDv]+W@DYm }&{8Y|{,EQKS#㖱< u'Z} "?˧ty?xL*a٦, LMp#LDhyԟc=ЩAY) L肗&ڇ4!T= ] 4@<հzMW*af9mh@.q!aWtvR~4,qŖu5#ː xĢ^Oo r/jKhYܻR0[ Tcue]T jѻXg<ΕHt׌˧Fɡ ߣӢU̟Rѭ$Dݶ DAhd:7F- @O5'kW d>'y%xFcesA?,ҕQ\.ܒ42"N-Ʒ>$Hv._SJ2PKs%LЧ" p"O-:׀2%إ9gnKNP ,M %DkD> ?Pn0`gV6":X Fay3fLL>ҝU(rFbI-(1Խ—sjZ/b<&\K I~i Moī:0J˺:H(+M^ľ 62??Cn D>~˞S}Z8oZ dHXyO{my[~rbp}<+ 07zC05&,_ɜ2$0^{n}(3.[pD8$Q_^UmDkPA fEhEMFd7K޿>|;<NvecIq[=omQuxO5H*-AmEf)z.gWkh㱴4Xmn"[]]F$%u7JJUP} C#BN%c>p!qIUF'*pCU=e:'khwaGrtJ\_~n,q2z_T8X;[6}ODb+da<-;L^'\i]ȽiV|9d(Ѽ09y:@P.[(4ŧXg|S_Xɐj=DHs$jx  /;Zz<̌bs2a80[6= [7-,$CL_%ő(#hPwptXTOS@,}h&_Ffaڣ2[r(hLya7)*( ahYv {Sd^'$Rs{.hl82,Qo-(81^'Wyƍ~?X}/)p|XʾY'#Glʴ6F\8Hs`ӱ\96&?a+gȸ)ſt[Am-g ,{v:#hNO*_ȵ>x !L y?y\v?.̀-}+$ "mgvR@Kdu3<ӻ5c-^k?O$9VY['vMpI1O9'(F?Ys?dfffffffffffffQQQA`"~jtt^)Ǻ|~!<8b-> N1Mc{-1H#+еYiw#c^GT@, K@r nu7̩(M{W%Y^_p!=_FzK`e5/-Cp]p  &$zJ&_ |fչLCua o"4MH%Qs9tt`OY) S`5إGT׈$C(P^ෟvӦX4&eHx);Ql ȓT$ک#jԉ*vv=TWIJ+10z&C@pT^lP="wKѬVhJ, ;|VZbu,m>ӥ)j}lVWleև]:1Xx߉UӾa'$Z2v<mi^(K$!Qо 㢢P@d=9j>hPd_`KUqYb1݉ [x)6b[qBȺŁ0h?lt'Sue,YQ!"/FMkP&Un8X 3pU}D۸Nh  ͛8n<Ch{,4.{#$~w@5*_ۃ6Y.l#4a Te#ՂF!(n2 ݛkvwi4, ,_T&#FtuuV۲vsU ]p0X)*m(FZqԺUUg$ A{Hwwhcwt Ct%=)M)=QC8JTץTe6TcvغPF5Q 1@8MA4cO9I5ѣt,sum*Rv^_Z!tjWʣãMi Ǭn<6Ih%8XTc+;;=C'ӫ&Hd 6씜uUj҃o^#wm`U삶c%%35췵\iT~,^}oh0 lWEmণpVky7$@3(Dd k\&2Ґu"F}AڦjUZ<6]qݵ/H0J2JĿYn|N2~JrCmL+2e5h 2 0sCPH\Kw)%GsU>|o_T|K20.L<(opd j2[8ߞk$F2(|(e1к=@b9J <Jg3-;, 0w؛R@ 3yIu3x\ta]\;r^JT5/,#acD.Vw"}9 򘫒{d NCEŐH+; iϚ۞U/4nUL.u\$Jڈz0^G.ؖҁXM)=xBf7ͬ` 4jcd{@Ox;P/ fO1F&H>[)#d>ifzhPOT.e*O }F?&nݱc4pnDZ%9ZXpnYd/ 4y LoQ?ÑۣWA3tUQvS `B@eI"<153`!^f4ĒLdKʐ6Bq5v`s4@K7$gUTyӢw3hjި+_l)@ڗte4 S(_ӈ1v7@\c%4h {DEfv El~61^d;q<2Ck/͖[oh#\>%I$6k CU>^m5DBr%F5\;,Y.)Cۼb$6HWe!Og?+;Tlke!f]n#%i0JBo?nr^X;h2X(xByDyS,Vט)7: ګG!,ļ 8r0z 'uQb)gT7;A!|vg,8bgSz!^ ʥ´o'⿎H 6f 9 լфM5P (#7-7iɟXHX{zLEm[$cXbj$XF)rʓ$צ܉_wPFR}NV5u2i *@Tطyn6C(G ǾUJ6 lk |DT#yEB@OjLbvhbE ^ <=KV8sv6?0qlnydH4AaP^m$:*M@̶a||Nz$iBf>x/TXd5ey\6Xao2^da^ z[KP&a *ƫZSjl+"@T?w+Vsf$ZC+X*y#P{ϭ`k<b MyV؝DG/y叽KMj` b=(繼,pDl̆R.#&em0{P}C9`q;WWy 1ib;,F-qZ4/feI iTERmS6<[Au+xd9IfAOVH rg?xpDr|[,IZc_m֘A]MIqL$Ez4=ԍ'ϣ.]]1 ~pL9$}.x0-PbtGWsÊ9"1&R2_lD]'A(0i?R4 Q&2TiPR3cq+Q BtKOU4( I=j)R]cO/[TO Y~D-reĄI<7Ѡ67S/6_H_^ sL 0de2RqRJz Bۡv.] h+%4+@ߡzw@3XflLN,b$3\Sy뉣>im.\CP!UXAn| ZacٷX0ci95[Yi}*|Gp(ÃUcls@ll"fG7#Av\R8ȣ,]Ŏȃ`azsVJli w$!R>V/+0Ū5HQвޑw9ts~A]NМE\ĘgQr<5Z?򴃥Cd2(s ( ,kNC@@~U5xLfCF^CͰp{nkKqb`%M߫{7jب6S{,Hm! f_EVӽH4p~nW}<&;e2%і1AP(uګ'4 y.9w"ٹ8`4uza)<BM`N C`,SϜ,><m#ܥ(20 {#&&nh Mlk } ذ=@#;dffO9&rVw84F[x_^t}!婱>tbJЏ C1eIe?5|s|3dz!S᠒aL@D%7TNp,TE JM2gbn'n BW4̾^5yd~ƀvaI=Z3+1\#Rn[?XkSD4FB؈E74%23h)QX˽ P<x!yo1>F@0T`%1̞nYChfU+΂H)D Btho]hYBYKRotWuM|N&I?]x2+|- u&FɸtoBӜ8ԓ7ARa'RX(3;5MDH>pu&&ۖPI⫏({@2Ujrt+g "@UMXf_$w YU=e/pgzJiRTbGpX)uCL9 nŊ"s)F3q o4ҵ\'o6A^}WHӟϖȘ E} Gp7u0E L8f"kyPEN_קּsg$z`W9Rlc3]Ya_1jβ^*P Rmd~M}JvIQPF dq;%nFi PE=u ŒO@D ϣ?xe>3{xr2`둽Y۷fmVz|1/cknOulu"hX ]N7y1?~XHk/Y{Dd9%;ЭۃƌQC?lRTz81#uCJa@=*i#:rK 1$ 锎7ooN9~u!X}4S.d4MF9BXPqϊ8d.jMMF"=,^Z ߗVK$LH5w3&$:ͬhKP۔&>z֥KsRˡcbJ#EMxp,oO5-}#?tUF^WS}LF ֖X%.27%߫Q#ܷ•(LV '"\#B|[@#qL3hx'7Gsw&+?P ~눖 kڛTmxD* 'P!8>3wR+ U `_H+";nDfQQumtGp7C]Ҋg]l8 %P /zZxhķ!s .Q-n־ $8W1Ix-DŽELWcͦlW]=Tk>/m.*ewXSTsmB'wWP<1 % Zȣ̎԰xH \ai=q( v1K `T"?e'o L8l1C ͲxV|Vt (Д]4~PAgP!Oc?{! t?k5fMٖqO2XB6[nhd*ohuz%e@U4o.8c(sDN&q%F쬡\qLaHaM4{% !#*tb J \Հ\hn9."а@ Pa$@Zf+x2P}x-c'< 25OXȅ<[%* Lk0|qUֵD-UWΪj:bF2@NZzػ.ѩ(**G_,vTqE!lgR܍7G7B0orX-XDR&y-ys taLda\TNn50=AIMrt&fd:o,w=Ӌ^%C~_8'C{B}`@t^j132P4KZOfa 9{?d RG#A\ƘӣP}lO+GBsW4?l)ye`lFriXq*#DX"{4Z^s}UHFwϤYHo3P(A;[ք+<<|oTgHx\I%@c:`cʰ:dlol]NTY}3UqEܙGd\D'i7\?:&rۃx2a2CRgf`[uQg,!!gJ2*.dVnظ)og(,$l<'B?yKn0Zy2H. %HLǎ%PH :ZJԹ>הvzEx^Xw!# Zb1Z%OiClk`'H4rω ]rd  aEl6QQP<|N^rqdH<$ko tЪHkmY9}l:[^=tz^cd}wd.q__PX''6Fz4_?8 \2 =nZJ(Ez8{; aG- +,_͜:5ٮuV3.|X*EEXctXF4.nju!| gZ1U-(ңr]ZwSObJX򮒯RjwY۝̆U36TI~p‘Tu0;c,O`>D&/!~ Yn-8B8ΰI8y`/g5 3m)*p.3bP#;6~O+4gDe$ ,VeIJA$ 8 B.DvvPn`h?^+@X y2("f2\P@XWIJs35yK@+#ԡ؏`<q'$RP=lhJ gu@dgVt=qUL3m\dUZD( )$Q:ZiS; ql<] $I~somXx'R) &W,ZZ?Pu Fn*Ip[lXDwzm~IXgɨsLkiFi  ż>!qI8D;adhjsrqЕ \(@ޮ}p6I 4h0~/w棉CfSYR6B@G<`t+`5γ>**Jv0\fzn|k@bXOc.j5':Kl-h=^.18%0Pdծ1&(nJD̋8^6V=r`-ӰK VVQHRpM˫J:AHm\;AgӽSfjǒs 7 "9B)}<ޒbp4TcT 824i(5 |TGS4^ǯȜ\ : >AaPJlMMeGg ՉוcEQl!v"8%NĎ`DrW Sj:IE$̄otT7 6]E0=+Msj k%H]CD9iV723;!Idũ(\g}b< v "?}̡m^<0q1p$喲Y<'ϠnWKa 羺wy_oYQ Dz*?&AtߒQ?QD\ i r qzHu^ 8[]#Ysf&h᫵Ez@QSPNVu4x^JԴ,#PKL{n|v]\a

^il&3G\ˍtχ#|oq4?,RS"3=#mX]\:$xqbKˌNViEo=N»7DrVhҒ6\fDtu췷:o d$}o_nuPp/Of$p"(iRQP28᧦r`jԐWsg~͋sZ\! LH4Pxt C٧<&sRySaIuuZBUUri{c}j}b1E ]ѓN_X?>A#ecHέ淂[ly\eV |#a<7c&^Z8=.L'^.W %p]dvX1x& W^'`8! dSF357l EZ}{*,Hݤ],gnP_DVAW@tE͆)hh! 쉈x\t`\6<"TbTq|+0vݍd&4Ⱔzl-u G!j+Wc;ןD"FAEi4kvp`ۢuŹ#W OjaO<3RD?TлQQP:e ,N=M>dp/{ez1m)k$IuDV(ɤ붃]8nWl*/rV.&H+N܎[QU آ|k@u Z--y}ft( 2-1S* 1jܤ!hsYAݓ5Jv+JT^{hՑs"@;0ʒ ZKRj3lx YBjf Fݠ4?Udh/3{xŌ>֋ 8j=eKLo^AqDbdg'N+ +S MQV!FyEh|FHhHu?\^z>Թ3J4aP)qNUfv 3tZ ?d(9 t\̑-DWלI֧`|ӾXaOS?L0?UCY0MP"@wyY3C Ee?.6xno]eh!yȾ&>:&leao&IҼϻ]ߧXmQc?[9ǯ1fQ,J[ز֫xڼy.Ec* lO4퟈2(\L@tklQ=$3g_E*?#Ad(坪!2l:ЧF/Dask6kBl|U=Ys5L?#b܊29+?#c©IS.eOO耧IiuKTnTO.<$&js"i=oЩ9Eİdss!Xa78'h%k>#w ;p Q"esXztykT_,,\xgܑfs">2\N@G 1grpFp-3&508Fbr\+l'=-J)S}l6UTۨ;ZDfTŧŖ)Cj;xT㜜v"bK-5^4^,ѫ{"9~#tt-e:wė%yX9pe&01.xNX|&ͪ(r)0qU}Lup X*+$F)K$!\Cx0sTyh(TќS 3XkrD`њԦ \CikH>u:Ii:k]ۋexFE~SIz5iѝ:9B/*T,[xOKw@I`Д _\<5;:s֠Ln^*͸Wzt~s ͠f(C׳aF  RC oDjn¨VB짤%!%5Υ$?աMi;oPwb ̰,.\ZaR (ZB<ߨ黜w]&˧BX*}svYBQLdGt (0?{XG+̽QKuxr ca oBB KE5gr- n2r]c3[8LQP( ,ZpO6ΖVnV{S?>ޕ<`eVew [ך+noYzt|{ $;m.cL4/$W%GOU&77٩'N_z!nA>P ]}\@zJhʪIov..oS:?Xa㱸s~3' 3Jhe>+sC3@A0E_Hkw™Nj"}{H "d7@i^nw6"KlͥKH^SL=9(kur ¦;Vw)hc!w93jUM$)gAVեP> { V@ED ep3LgjkX0yCCV#yiC Ep$O/h sw8Q2Yj̜Nx>:5!G -eR8rxH;,đ)ƾ,ViA8DET4ZgZ8n Ϭ{-a#٦e)N҉2w/)>3pH>n4[-UT1$)\&Vmi]X$iT$bƇK~APCpWq cζr$iּO>(uPcٹ]Pg[)ٍJC\@SuITG>546mClx~8xG'T12%Œ`W-[Z[E$dd^%ioW;SKx/<.2\A%r,J<,G}#}0!#!d0 hɜ=ӳRmB%k$+x^rDQʃ 7LvAtg$BJ Ś* 4D;7niľ6~]~}9xqhvded'^F-PPb{2NMM@yPɢ[ q5?G-ͦ:L E^8>6GAS֖x6BxEg~ ^H5`R<1dxt3:%7F0gQ_k6mL2VP |A p04eV݀;\!}Bni)CH\1?]~c 7{x1}WfobmajrĜ$!U(f4JD J{儃}Cl^8/6D&W$`6EPߘ!0$m& 2][Iz>ΰhq*?Zh7S eS,uuTs`VĂv+G4B$w:ѠW~ٶ(h@F1+ iب/g{ZAZAL+ >4g{gFVnvQSOEL<tuc?=(c skl. ŷxB L-$scճh; iB=$QzlU+u6btw{*I6M$*Ԓmj^=A!-shа4 )UEm@Z]'nѽW*b7, DDOhj,<rPX*"tVcϰ[lrvՇN,zďD"؉.sϜ1OܬԾKGT1I`Mdҟv'P+%fuxHB,BlN#h__ ˣປ?!CԨLbIeL ju(vgCTĆ6._50BiUH#+j22fX+P0Ah"t@"> @NͧC|K~f?l,'||jQXV`R@NUA୫53JU|=6,Vowʲd+D`x?(UM CکÜ}HLHi}lFh%ߖpg@upCqnW ]D&-ύoyZRWsq@4Ajg4c`U_1[]9-KP| OD e;O?t p}nH/ 3C}~MiʪH29p2`}oUm[ebh~U_S >eDDWڨX i_y{~ W2 ?4LzPf)tԎ 3%/ Fv7(~{n2s Ҋ%bX(\޷R@<|dBN6H.YM˝םH"3D<~*Km\wn'czD+`% rO6`A#ؘ(a!_̒'th *GQ4ƻi^ޔhN8c!tdJ=~ oM +o,XT>X| [햓, Fd5I,+L~quIy˴m<a<*W036R& SWP=S$ pB@F@dPP`fk3P  g R P ? 㪉7)vvܒ+@Ct"#RlDŽTA,+d=slCHg#KP06R0<ZsVvfI|^(;lH"JV$ 7PVq_s Tiލ q!=qʯE7CP_ g Z٧S!9l[[Є@G`#jI|G>ST1H6{4tTBQVs(ÚC$ !{E` 0{M/)_mK¡H!\oSl7>Ao̿BhXh2Ѧ$zSr0(t@mHSj w $\:4iUl;-*f˳W2%<&b1*|q~D!2U>9 &?ÃN[w2(E+еtum&V[^WxKDY]YY}G<{[@痟F:/IDfJ ]~ Aex^vNQΘLS,0}hNF5`v#Sؽqh8łfd'\;p5GL{/a ' XGNmqR9QIr_YܠJ[LWB Hr=W"JɤrYH}n[18[`%9_I( Y_{pz>r<WeC(Dp/뉜t07jz~svg<1ĸF+mLyD''~GӎWLD*CrQp ?"#BAd8[-82ビ5W-@r(vxϊf[hQGA`kVڿKLx TO[9Uq=\`p-D<Yl|Nq)Z>|$xn؍Px L-EyqlXeZzFն\;ekw5f!V,U-ߐZRD!1NS4:MN[ +vG\p I-#y`o:节$(4ywj n )Ŕ{!$V!7/aNwX3W5ivx Ee|oD_ ЭQ0Ϳ6C <pioD‹dr_P$*Q6/8li$׻ %,\!  ?&khwxdCD핽_8GiߧнD1-R69TLmV(F=̖LjE $ Z.j1^}C2uiZKd[LKV^4 }B=Q|s>r:e, QLZ;rWE t_ E╎7\>;7wزܜ`1žHJ8汍jepԡz`[qj*g%^@ly( j,. fF`}{)|> tMC/Y!0nN(>hMଋ SL€qM< 4pj4O-uBw*p@5h/4ƾ"3UKPڜ ٮH%bEHJ5~ዠGNm;c4dٖ{OhBxcZj i!``mUh3B6( C  <#47pd1,TXB è<#&mS]ʁ $R(KIjCiB9PE:Gk bU>=6RQ1}"qHut:\u0*-=J0DHX@vWiyF8bB.-4Agh$>P`2Esj;^#@yHޤ#:e0ӕcs2h\CDO) 8uղsB*9(m47=T-|"$]_0 B,I`jÂ.2´Ή:L%(h]0.hrpJn䙉ڃM`%9{Ԯwq[^^~LCZ|KeĴ"lP ^-&i]sL!*n\<TǓ4[3B]UE܂*4hv\@Y$_hzzy& .Ya+.eRJ(ՃoS%xQ 8CB|n`~j`:g I42ֻa߸ (n/c-ن|7~L,O;GroLcml(Y0gpGފLk| qMrE ĸ=(1jK6l՜`]pX"<|Uag0{'j[dDRDb4v\66]'9Y,SRz7=n7NTʉ%}6 6;n:+@,}m_i> V 1XBdg>Dx4ɌZ `pHv vٞ&mmVY_؏d?>H҈'#ƒHdA:hi.y2:9|)[G8$ʺl溯run|=^LV:}UʱiDȉ 8އ;qv\ lbN팂H@yءW f#znqE9𥉆\jYn8&3"9~]4si[0qVT !I;Z'vLfʼ+3 Lmn"T)|hz㛵/kSusd "*)D9Y< 9>(ha2 uHl֔ĦL:줥#~-f=,.^ zX+^2n}HPx 05sYVᖼG`WDzr`CYr[Q['{|nID0t}upj)9z13~U-ZdJUm ^wWLD! 7P~H^ey}I5'E1=DnuR/klX"QhXQlc䯉Ӥ kp:܃n(.-ԕNJS?wx;C<1/k;kFI܈K/~V[H: !&0vID]=_d!4gʙϲ|,P.;?8cx ,}i'bGOnV#*?Xx2ӂ~2jp1P=j;h&T 5p!~ {ɴqV͡]0 DEq$x<@Mig7Ͷpͮ+ oY >"B!OY,G0ݞ]5| aYoT~Jl ?D;HXAKcfk27lsix8 ߃3T``;i<5CbR&k3|pK؈c@cTYO5gݭJ):qE.Bx[ݾtݎ96\mgb&Z; 2ղ]Ac(ܪ7܈/"hh -%H:Sz=WKD<}g8FxoK0dpbmM ˝0Sj= 5<~u"d;1eFܠx,%r< |M-?+2ʡAd0?"(n4pmwe( h_G6PZa;mp9,^s{WNH(+-\^yVV$|-MEht-wᶡ͒_ܤd l|2O,*l9(lry&WŻh RaEc g%e<)Jf d ]*MBL}Be*Ǥvhؽ0mhd9^ e{ Jndʄg=nP4ln2_.P7̣)vczX _Z,JOF >WXjT; m=ET!TF{Քo ρܝ8C=4*pYÔYkT3ʩ$5G> T+lceKԴC]8xL"RƁ` Wbu؍t'4MBAF] 1TH֦ Fv= 0k oxUaFPP'wAshsCgAe 55[ho}ShzIxYY&1naQ'D[Xxi4 m֌,!0]+pX|J'& Vq+o3ڔUP%Uwt٦VUlPjՊ)^K l UK;!ձFgDX"g rqIzgX' ;R]AmgG+ ήȺrU( H wGml cr,9g{ O5~c+L&إS˂#,HzQN֛̟B,L;#pR(YVrB dIxd4Obm'׃- @* Wxi$FJ&zا gbQSMHNDɤ=tpEoa({L7'vES9m=]<7-W,/”[|m1&hIBWOnOԛrt%J[!WPQMkt@t]qVIޱ93F3e8\50?AUDvXoI:<6Y:bg~a3^ hg)Ms , D9ata.Z_)S6J8{' u^;@ȕį6?b3temL4Wh靸ɷ$=oT~`hds$&1M?@bs/á#x,3>rƚg 0}>2 o&dJ'd[ ~ o'~40G =7YlxD{(g`f@ w4c, pHxxp3׌+wƺ,FX >ЪvVky; @"f_xYA.=bOKu0襢\֑x*2XJxAQ-U({Y,ZHX4z#@{:YQ:baX6NmH I}@b1r/ GC3 NZ[ <)IUċ,1pi K/b6SvTԾo B습S!D#oB1o5#s8c]U&\FțցjlIYnr{#zHɋwtQJ,l*_Au%(AV|*&G9] .QJ;Ͼ5`;&c_M_qke&H~P'*pmQԒrw2 tꣿޘh[)Uf~#3)Tw+fRW< }EpZ0<#;a &eIm~\ KW`ݚ>G&ZpL{"V97k&yD緰,8$asSrYz+v[]FЇ"H+}w 8 |-tx[kbhp$"![vfTPsN4IQjǷ>AlUl4yD`Fe]l\mB?;bWh/蝩hߙ 2g@B&\>p?QG}?s,2MZhHt2\lt!- lӀ2C v͎RH#hPІsL5 OX\6"UGǓVtNwk9<? 9\"acKd<xAs̀' F)=`,84 ꪱ)llsvBs^K )A h\ 9 4" )J-@ιuCg4kFg6g*iYy9V8!TLG8)#ZOyiSz s_aTܽy,<+NM}1aJ<DCxncD{m`X178|ֲ'-D¿3Ȑ8J 5f)Lsơ؟!=BѵYLM @^X=4g ; gKȆ?!+~F ߆k2Uke8<BV0*U2xVMӸګ 麫c`1~*{$"Z_B9,k#x΅&"@t`P(rvTz 8+-NICH+{ 5Bx+w0V%h7{%",ttHQŕO#! +<8 ]cDKo~24j<@Ip鉷C4ԍ&EQ!;ulvqj`BVLWMo]795qF~ǍېZ̋e ؓlq<;z&ɕ.LwX7⸌rGe# TYZ%7G(9OovGH,-r^li4FR@Gt\{~283rI/e(<.Ln -]aK?[%qJX;C;}bg/ ?l@&i2@$fhvxT(*JÓC 8wCN1Hf3g`_q'^BR\}~4((@ dr约 9鶎/R>+rLAD2™GeӶț> ܰQ_ЯCˡt' LLlx։㎕PE v?@@sfdټ`NR Gʳ5>3ۡ ՏF^A)|48!@>u5\Q05uçeĕ,+8}ߚomal`&WyMȀy̪Q';FH (G> :H= T2`n. ԥܗB>C(bsQvۏoA,u|,\Sj*0Qzr!0[86]},~oLL Y1[vd\itzx#Pua`кgI7&aŴRő q=QOf}^BA$Oτ'حD4K%PB|hMQ#~>5 e+|LV0&t]p& *3B "$L])h߰pGbuseX|͛Пj*)Q4G= t-0Hf_)i,Nx@=2On>` %2z?%3<tfR^1Qѕ[wADA-rH,M6hHP 5{GS(ܐb e 8} P YH Շ {5#+w9uĵUkq!YΧm"lMGh|äҹVbf|x:\D5=/?٫}5#_JdbZѩGjPrNHAҭs  mgu¾4\KHҥx"O l۷ 4x:G#Ip]؞lֲCԂqyV|ER68ܛ'jlda+c+az?KVCl^Ha4YDfoW8)Qx, C L~45p7d1̞ ,O%{dȭ78?bP )W278o8(F3 ZL{OxDm/rk`j&S{LBQֹr"#A 4E.NO{5.J+TYJy_Zb2^vGaؖxwr@W_piix[IA-c͠ eRϮ݄Hu Lݤ8"^= ~&70b0/LN7Y(pp,zz< NZ)ye^ȩq{FN8'ҞR (^mug T(I"oyruyކ:X.*@V8{4"h؊P!_b!Fsô骍Jk5*z|; FVV}%^AExs.k4-)_%UT !mU<`=>wL d'[2,9 G=ple Ńq$#Q<76]ZPctc_+THǹ82Ndt؝EǓ$?P3K۟>阦Bo4`1u=KrZwg1PJ 83{_t썦*ok,|  p7#8;Xmp-/JO`H D4NYM\muz?^rG*; KD{(+zcB~e .\6Jh@J; 9C_ˌvz}qGo=ad蛍&1im 8Q ȤWuzm]lFPSvvJx^GCXK_9 8ߢRG k BqBbpy> 6xy5N&a: *YRyȥAWwZ)>s<Q!\0/`-+Y[+E_^N9 UFu>^U?<h".ۙ|3^asŏz0ݢKJE7JoÛQD-8@ւx60`Ih +PY?Ml͠" 6ˮg7ҋ`dyWBH\]Ϝ#~;2VQܫZD5edLߕĻԆUh=lck9z"6Oy~ab.V:NXa?1FFUf'< rp1Hc܈=Z86lO HqHޢy >\r( /xݬ&z%|-b>;{у\5٪V4A6*]ubC:p}cL4Z410G)Z/0Op*!H&sbN Rx@|P; @(|hVwvpf0,.Y꼀=LXZ!t=s=1Lii4PõG !]?5^ecăM2H^K [ӱ6y_ѽ Q"{LJdW <$qinF0lT/p@Xwdx23\}Oz[(IL]bj w<䁯#ǘ["}c&G|dtܟ8<դ`g}cw۞@z.G,0*#z̼1(EO cTj_مE-(Ao]ZUS48Y{wW")`G _&۝f3~u̯^z*<&KEݡvy@AC^3\ .6g'*6Tv\CW ݉S8ty}jT(a};ℤlX @;9Gzd_wBib-l{/!${%oi̠Oyhֳ`Npl a\+?LGqaux8|[Mדo`}-0H > CY {30My8L cX& EF Rsx`; `LՔ$Kq,@wP VNMEhdKj >1U֬<6G![h"$q&$Cϑx .[Pi?+%|Te (?F *x28waVl(`3EH~kڙ*{y$HxU/aD%v`DC1862[P'%鸊P~j ;)bN"7kM cfFG0VK(M1i9 =PIgTfA\ r&=rH0{n(bXx;/o &N1囙s) yG쏇 '^x~פAD&t%y2>alnTnL䮉$EIMʋIm}4CFDyB9cX JVi DUWX!6D WFda;jfxkPD 'Ztg6Hb(9+mӹE`kn$q,:HΫ`\ӁuzNqg.i:'3Sۋ. 5A&ߐwD=4~ Zc]D2%3qH'Զn̖u_%{* Lb1^{Fm*aO ~Kѽ?\qo gAf}T'L#ca/ 4'dro)y,zPΘ-#w. Mr G$LF %BC hMh  >٫Ifkz̠#nU#/!nXDX`f9]4pCR#~)l3i۩Or0{RB,I./uS-ωv%]ܽ^ Ff/ !I܄k8&Ԁ7]QC˼$Xs>EavF|1T7v8M'r\XH?(nmn̾,% XpeabdYmNOcYv>صBⰭ+eS+WTT^S>.Iv\]e N˰z2~.̇NP0JphJli 2& յ#] p(U.jF3%NٗmL%kGFH$=V y98.m FO\\ ;krfx;(g&R\#k_ A O广:gS=߇ Y2 /ulc+멱FVPX!8x[ک8礓Ԍ42=?x=]-@,1J hqM3Hw OwYlԹ,M xGvp;]-aN9W_8H%rmux j+3H2#'بUrm[OlS!:XَW|?L#ųMN[%FR|(?|'<ҝ۩c`209A~Tl(-neP&s3IhnM=L&SX@9 Ā1y{-n4')\@+lvgXYH+W>YzGvF|8[ߢ46z0 `|x&aLaAعOeݛg| Q| 0ؓzN]/-|Ƭ&qYS0W/[BPX(nIZ@yw XC.1Fh}O8g te/rx*sRH3](u}f@UV=3pF#Dx{1\x*-Z5h1l^#6䝵ۣPT>5; zKO 1+aAO O-4~pwslY,\\DK2{#@`%^,8+*K ,"L } =#0<D䧕u.9dS^X7a3l4 )TV ƯY{]۹j֞ɒK=ݠqdaAl,F/4#HGrʿ4Yt cw" GT j^X:Ӻ߯~۬ި]mztH~,(kՓeVo<ܪ`~-]-eZ2.K4])x1cOMbrJ}Dr AO( j0عݗ!OZ?٪bY5(wg@]OŘd5?jgBs) xv< g\T#coF%}C8peGfk5`[Pl땉 qs#n\, #k|-bLVV|c$ NxW!~ ZXd!NˆM{n 礢8q/I1ԝZKu䮆 sH1|~Xn z,}>L$' : xWRo.\R ;G LBu8"z$'-~HeP$2lZ P(XG L$z4I>c=Ra53Ѡ Aϓ"k|a<jؗcxrz4U0[*Tf8uph?e]e'}Ptb}n%d (95 Df ֒}:AkJQ#b*h8nHڵ! -Xl7Z!i^)!p=ܘi,?|The.{HȢxJ_jlm#WRmouW/PXmL#\ @ڕֵG%3HxlOTٖZyVxP=5x8 d%v,l]bNb]}䑵>ܰ^&˞|Ig}ĸK!S0Rd(NhӅ8 &hj ܤ_7Q?SI,еڸBݗ2?@^ `5ߎ2WfKԘ؎VFqEZaZ{<׶xLiZ=+`jv|Ds:cz^4.&{$-KU=t+$< dö˼Hf=_ @$^K~fjXPm1˻ 4ٽwo<TM\ɪ5.yqmU=:$|a$1tȱ|5:贆 "abD.k)4tX;S$^`$مY:bk@NTZNHf DH_rEs l@.N*X;P5Kō`"\}_xigHdL`T~Ju A4;C3f:/(Ȉ5\!/(ڨ^fK~s{a UD/lp0Y)r(rgaR| (ټ a۵0lc=-&GΟȞ4ѿ l KtPpVB Pz@W7|9xw,0jn0w@q-&jaZH(CxRNi]@: {-u A?!hL]gԨ1 Gbu4z <].au蟺˝/LgOFȣs$ \P;[b4 p Q+/!lX>Cͧ"#1 S5{QU8,Wо"l-xC@2>%Y54 i>< üJ <cnvMw ;0lrO(ЫB_Ш shWjLAܤY G<Ქe֦M·PQx6Zv|M;{K+[>ď@/ 1?+tfhH! {8wO(̌hL] $o= ~SpPʡ1EY(w;Ea)zfb7a6\֦4\K#_[."T$>յv\+>f42ht"=ÝhDAY.9 @.G-x6JӉ(")y%̊iT ( oТTxtD3N)$Gj ) 88oF>oِBs- c(z [<T hr|Z5}T wQCCDq~=_tom6] c/[ Dp`Zd&|/pՀLH؃%LwJ& {{DUHRkV:WɎ6D@A}:6Ri`dɈ4*$4}=\${Jb ɗ+~rq{ud297d[ätЫkiæ~/@ 2KLY3Hdw2 lB?^xmYœC,!& 2=J9x-daK` 6 4P=m Lp+LbH*GMj߹أ ! Ο UL.F;>n#fwWOt(RET_qmL7Lka>W( T5v({aA_dS/ N4Lt؃ %FxR{x.ҽ\BB /O\AX?V}T^Wd~uC oPY֘qY6XaWeN^EE45TVrK+C77~*t$PE8%C sk—i`\|݈"'ߛ̛-q_G L.c@o9poXOz~@eĐxPfi Nl Ƕ)Nʦ%N9҇>>qA}u9eO2T^Or(K~?(}/oDOʖYJ&yF٭kz/o`>Edx'kL]ყƚ"poRkJ [e;tp_IBi)Ly84w,Z,!?wVCrH`bV5[PmNWTG "-HR`F9dBuL8Ц-nhk*i>|}s%F\10)1UJXY>}D@Ch\l:i׆gJ# ydKg[; lfXȡ bHgn״n sMK |MTaq ` =P'5m:n0!s?zJ*(5a4]}\TSX6bǃTHa%ODq96ݝL[Ij6-t͒\xJ0)SZIg&Te5۬ٸJRC w*Х^ZDFX4M^i8UT !y`DPb5(L@Du"N}ĹEui]qj{E^|܋ɻ%l^+<I:hV8c/x F-yxTY. -(CTGH%n񪽹6UmYq! H%Tl[^.pwZ$賱$/O\-)P s}lT 2>ʒuxv>cLHl`1Ђp%@#M`h܌̞3J G|p徏n8aK ߓG _C劬gll5DG Gr$%B^*7j8(hKx- x_|TiJ6Lvq>2_'[n?^'e(LHX@˞?hy Cf{a48r `[^o;r/\u{DWBPx-",6JpM8[*a4u&uNXi%T=" vʄvy9q4.^;.ZN~d-`5gP$8Wft6FHRTD=$) ڶtef]T/ZnB(iQ1Y{`TtEsz/ Tź8ϢuVqix7b- Oi]x'!_0tC]dM{ "s_i yRѴH;ǖњ *wD>*\_IE&h72S":>ÉTRƺdv 821> k^Hc} ~lT8j|jyCx,cǖiFIJlmlE!ApGG4@6lCNIC*d-/rQio|Ckش+l%5"+z]IV0+pV}Elwb#F,VtwVgޝ >/ 8a4nY?c:G%P]f $q5V NpeӐ &Q`,ޤKnF~~TO 2@WzeC٭pz8[yiGaxgetٖt`qkjzEh]#["1a|/ų74.@jj)ƹts4}ºsF_$cjRZkGCjU!36ٯLhsL4=xSŽ=0} r۽MKyPµ0㗤N+ܶ|.ۤ4$a@~+n!&eEPϮ݄SP0х ?JjB@qt @@fw06A3vq8,b)Z`#8*^mV4r=][Lh yZ=d%d]}# L)„rlL!7[P WL$65;p7G>X,DlqF@/T"ܨx8YC .|`Гfz Xkp]pb)H#' #ZTR'rpfAk4rM 7qt\K>,AՍ4⚲8VI=7^`:ldf.Ir@-hC53E% *)EMA*_|FmT 0m8$5H'm" g8{/O7\ij& (nǃBBD<965h'j{L*SE?./1!ܝ2 b0Eך;Gra_j{vŘMhLHweAP "l_ܚ: XL{45f V!U 4vѨNqMwS(ZA ~q_܁&hhde-6Tܝq.RI!/,u^O|blY#Ehsrc$YESt\x(5V\oS&tۏАIĿ t i8jH['=@\QJ31DM5kn-c\8"EJI0#ݴn۠&OC-WK*~X|MsϽ!#8A =R,T%nAxڝWIFx1S wr-u'[`HhX  ^֟9 F<7iLakc_yv\yG5Rkee]$e*#Q?xtf' , ?PK>#o늬1O3<DGSU.}Ą]5~7sѰ*T嘻$5ND E1P|>э"s_c _vtqvl !e O V;PdM?H؄7R Dj$AxnR;GvmϾY}_nDWJy%Ayv;|[4,-^AmxE|O 2&'F7`K}10q ׾IT&Pyev RD-QxT$:]Im`Abx$EMi(Zkm;B)؊/F4H4Ӓo6kK*BB݆~ޫC1j.>hW1ϙXFy'(?׮/R ٩Ijh4z T.9=TC(M5pl@ĥ/&f'з0Rܥv&`|QZzM88dt7Mj -L/ 6@Ye^73gm?_ \٦a`euepM5F^8=*8,D6&.Б䈸=%Xpp=ڧm`1Fr_F H9 +kum{ xhU^$`pABoAqAX4hCY̌;vHϭ֣7/{=|W9K|4K,dao3?M&)_:a[ I-pd]XfN|?>J|d=Ync;$Z~镶 w 4ew:_ԈP1҂hx\u5E])V]71$jj{ZwP2ʘ8O /iٕ(G- ǿ aDlҽ h?/{u!3&g/i0+©QS)&4!"xvOu`h6+ٝK{OJL UG~< j;3Vc T9nj@vkha/ӣCU4A,LP\geVsÌR|xO3\pL`:'Ǔ Bx4y5p^yӬ7*3CK)zvSRruvV Bdmy`^e )gF pk84JӠXGV()(rt>A4 [ )eg|3‡R(aRr<Ä`T3A@A>[0D\fgZ㦸8-2pxL)׍,$(`Z`  {lبǙf-PGZAR7sX 9H40LtS(Z ]db!t{v ݴL/+9V}]psд.s]94YfъQ(}zitնtkD0.V)_]6$'J(܁.:4e1Pcb&*['@R9j%>m!QA {qStogZ"p^Sh ǧ貁&u[- ̟[R$puHƛ:/v"lkI!.tY+"Xz]8e0YLN>~  '=y ԸtZ )oތu/{(ey K %T-ݳ ֡AXD|Rܼ5\&860ɨ +| Ƚ+mxp"P"/y3I7`\\ {F MҐqbXB >sh5`0͒3Aϸ!m=B\g?$d 1JaDiNzGi=j :!C4!9 9bwM'66c ? hY d2of g}zP-Y3r]r*"{GߏJ(\"< *Kj,j"juN}~Aص͕H@<(s>AˌL \8go==qgZ>.h3~]TL\˪͘]ҘX5G-b:AKޤq td |Zs;lÛ# N.74qX,aQW}2>qB]$g qʎZh[?eZGf‘@n]\ *˟5X}6KNd+}AE%;䮊gg7bXҸV,N_`E ydZnB fJd(\ыּ nSt pvTTB#P)jV2C5@<lջ( I30D#Dxk9m8:^UXa$-0>wc$dYRe9ԋz:v akb /_޵571:N^TP.4Pرs T8ƴ'j|t^UDTBvn8QR("s1$ 6 n{+| ܣ}jK/ɾpn]J!hXc~;SZ G8B]>1n-Ή eW/?nDsY;:y~lG`(իT .SwFaVYB$q&YKXpF51@|wOLnX7k_ =\mt_ d H(ۘ.cLfZc%{O<!޷2b T{GrA/yp6bT% .#c]x׷ Xׂu(YYu&jjTډ(G};v"/g D/U̽^{='3ic8[dR{ Hإbn(t)|QJS*!|0A;|tҤ@Mc Q+I0IkM?"ԝ:T=̅HOC~L{L@űk0p_.B'V$%xU@ޙ&G~{4=\DlKqc0>弢Z_Z#0dp731*҉Yv,Џ~TTVsi(T}[1C"|',,nuҬc:K"Gl $P^şVD RӐ6=@Qv j^ß 0#вdfy(O@ƒ7e). ?̟3hi,'$4FR@Bz }8B5B9M4O-h3l5d>ILMsỆj:Xn=\c"n񵻗jNwX#%$ȵ"Q+@L҈>3L*s|PB dHd@\5p98!IYHP!,T:)V^hJ )k op(2V,Z+ 3w0"T 0M،NCPZ+|WzҦ*_F\by!I9aX ܦ\hh  h *׆;CSnxx}}fXXuZɵi@*yI :^! `Աwnȱ4OKJtD3.Jo;@sX;/@3ԅx1F3uCZk*aL~8UMh6VmSl1Cg7ēVhѧA,hB$tehP 锐S@tTs,Sv3@TCRf8ܰwʓd]hSp/BA췅Ld44L,5f)#vE^׻lܙY#o0VB~u%#xv1pOf)cM TفFD뺵 M$C8S+̝~cUeU#g<~OD4QR`0'Lm WjR]uUUpJTms7 SŅڔ|VISԨ^HcxGB$1mvClj@qZ;^ "'1VdD.Q #`~ m,qJAVz'5x0 U|+`p Dc9Vϳ& Z&.K HL)=\o;wӭp&Y䡌Q$ZlG':UMzh bs)zIq9"b_rj LDG&s(UDlХl(}qkzM t{.PV MV]; ; Eɤ>CZ(άC82wP Wϭj$) #ЇK4Dbݠ@o7l}ML琾F/pRC+K% [i@Tˬ;_uwo/@s*QJ_fw» xdoْ ĠPK22w@<(Ldy6u,|]-#0gpvIH縟RcmLB`ul#C=fL`Clk@sp?ɳ2"mje{:NWjDzVi ".ϫyԴ}XGq/'r8(d9Y(-XQFaF- $aA8J|S[3fi5SdwHTuRT=Dd^htCЗ+B8mFh!]6uSJ^tF`@۽Dƭ0|>(H51xV8.a/WRɋπ}A: gd@DrpRp9P’(hX5BwH_)g !JI(W}?@]wye 2b%OP8Q?x iL_` Th$ t<=h& nR/Ms-1YY2(e+NI&~^9Nm:~Ad@-X$ UWne>!{y,9<ʖ^(XPvnE}2D\m@7dl({&C3N=Rω v)uR@0A ;:+!AhMx5T -},A(s;W#|B \q(@'aeѨi쨤M q vh|>|ͩ$q\"0!c>-Z1X55HاP ^'oX^àS} RFiMܨnTQet-~}@ QP)ݴW t4@@T_~]yo13YSe#­BO"@H5n٥8th"MQ{,\ =tO^H$Pė޲@OiyK'r`3 uj o=+)3Bְ%\5 (h/',"'ts餖$0SDPEuo9js7šKvnԧ{ 5e/=]ے[QZbŷ sHDIj (܆v6]Uո Dk#bU9$OD$* Ш4q  $H9.o"|>]mL;Y\bG`yޢND } (j0?eܗ<{ 1{0ZT ր)t Mgܺմ ÜA}T|5e<n=80dL0od49JG:M|S.9D>>8_`Ψ9iwLSeaT,pZ; z{_-ΘML8 ߴ$x>w̪ -:0-u2/b3L(CK^XxSձF$!x6ڛՖ5yT{I&3`ONQ9+s_ߧ֚(YD{T槎(mpǗ,D>%N&^9F4`8akf'D;dΫX0RDi # r(H]^t΅<9~K Q1 xWAȔ?A{>=P8 b>1p@ )!f|yZ=*`ڏ*RZDdsA{O8hb\Pg)c ,  : HՒH |Avrmtg+p (\E"yNօO<>xv*K8pV2`tf"<(缃3>*1kl71&Vx d:| `>` +;TnޜwHplca@u꼝4#e]JJRq;𧴩KQ=cƆFÇ$ |ffd1FӚ`=RLH4.APMM^؝( qK(״W=DD>|dI*@Eceݩ.y<7S H:~!>`0l_81&мNـق Ma䎎4l?lov}2Db_Kb$gK`8oɜqⰉQ;Jٸ 2uv(n S^h 7S Xx4>tZc [=1FhHXv0Hˍ8SD:xDIZ`aG}Va6hNMT-Rr %>dt?E;0Mm}\̑T7 I$1֧ݑ,0n:P' 9/J*M,-^[ Q Z@,iu*U|"a^UD0qWN7bYZ$)E{@ (xrJͅ0ܳuP:۪kM8a"4aNMh\{ӖꞤv 05$mWN^75s$y{r~_@N/PʘX3bS{ @GF\JyNepf88-裸'퍳|;$x `m0,!a1rWm!W\詄%h@J| >HYFf;0M/6˱9w&'._|y m"MSfm0an_=Q$݋;|I.F_(-ײDx6TCH~(Ҟ'*_CT6@e#sd?تS4O\Bd6Iiz5PBz)?.]8c8q4IfJ$ǵjXSK;"H C|E։kbO8MjԶN؅fjCJ-<h LoW  be~^LseXP) K)zLu#f:vBh*O끕^Xuι޾@UΪK]K2 Ύ&߶VL ?UucR՘hDľO"`'DA:mdL ѱ̓p064Ƚ= l1x1;GZN!'65'qܬjڎ7h1H|Hr$eZv/tP:p<*_\@Y0Zx\JmYӮ$`fh)R(FL;> !' 4-6XL |^! Ld0uz$E+i.xk)4U3aދ<\))<$9@&Jh0 vIl''^>\}M2LJ[<ᇧZ{F(|cjɦ+}nR!"d  5ks/ĹۈT&\F6.Z.)>2xaՂ!2xu2eI\ʤT*i^H_ }9_U%SJpM[;DeH%r</`i]m `–ޠ佒z ㏌c@6˗bsp8O.4޴Y`?@Qc!qUfe8)SAZDT,T}{v?gʮ/sa&P $qJLRQ{} 5ߧ/p]$?S5&$0cl˾􄈣fDGoe]jOi6nJ?eGsRS;E2"Ap=^Y-#,i\iuM1*1>4/t㌑w~& hڒRtI{udhHv,ԣ L^VOA>KE?4xy[iLo(?C<Mrfޖp(RKx S߶)@4MoHi+g YHl?3$gR9>EP-U 9sWChhԘij\S HClma 8# T){nn,0(|۩,T7w&t0|!x__)Zw0n$&NX5BP˸>8s@y̤+`.؃TU&wge%(TU=YBsá1z\D6NTj Lb|IБ> {Г )s>n\UG1lxXh"?=P<Tȸhbf$@0tӓ|HYs$še1.@LkZfw^H"m}~,ҝ0id[J !^pca6tZ2MMTBI]Xth';l} r( VPU[h4(0h_ T) nZϠSxLDTXH B`p:Bf7ͳ8ahøvF=NLS`Ğd+(B;nd:eTBV/XPthVɐKJ=$B tVUjd))58܁ܩnk!04VH&(kySx#U/0),uOD&d!4*U٥ڜP)U^aW1 ]貱y'TH~ΆZHC}U^US o ˶wKDe tMMo_(trX/噔Jx(=1 탍Տ& ЗZ z bLsyH o.U=Hsz~}Rj\qbt6JwB˧Һdx @*s`p3ЇUay)@d͸(nq-JpE: [9'Խn^ Tɚ/{~ C{/ae,SiiC4Q5x\fb=AI#- 7bgip$,9(S؇~lVS.Q͌ HWtף <:8!EZX]0jHa#L@)}C絭p3TzkWvRQb4Fj&$eQ!QG2 t겧8[@} jK&.M?ڈQU47Q e{mtwA՘{6=ZT/o0TjYIY,'UL^f|³G |Q05ylP0Q*W灰rfd=a6+H)d_ x)pAuK<?6˫`T]<0l2#nQC\>~cƠ 6d)؞' ԓ%͠?x:)C׳,/Th@#(^çXf脞T$z~LxPLsep=$oGż ճҝ0£Ѫ\m 23B~tU}W1cT"b { 7C贎F5hS*rמUWtP7FwSyg]ڰl ,8(B6{{Ns7N$H/v _Wz;++EFs3Ep Ju\`Ht9/i NPKnw}hZ@r<@%חSH4f`mTi$X|g}FHt3kCGA8iBVu,+x+q|)|~&DhKcT"L7 <؂C x< (jFs`PܴU8\4 }]?`!wS-}24=HWl/c4jf%_\*뉘L0FڸC'49VhؾlIٮ1/g$FB]~ ^6ٶˢ8eFA+_<X׶*߹1b6xxŻI{L.Nl,`c %>|]&cd|qݺP0s}KN^{G|g~#clc$0 en0Z37z9ݒP^2vێ J٢$;OlBgqXɩJ#5並4TQյ]-RxNU/HP5n>m 2b2 l t(`уDCSZ\jRHh|2zT%B@=t._{;g$LbtbsP)/O\|ܔ{.E#e-0~S1 <ի܊`6d܍#;eM( R@8nZ%DXD{ ZjϦqH b<!ZN0z<KM`h*aoIk M %ԭ8ɷS@ӽ'u? 3ܗ쐣Ewl@U,ˤ-9P̽w#<ꊦOe p1Ƃ; e=L7W;G; x>pOxߨ/l/`\| aSY#YL`-G SGMk:>-q;uHb?4!Os>'D- ) Ry$| i0#9R~5e?9}9JP(?kYN\SG=|_Ey10lT}e3CB.&So}j¤*&1T σ8K"sݙ@}lS*1hP#8zUC(,Ȫ^`xTFӻKSpRud|)CaIJÔMjf?7IvU jŕӠ wKUpwZvMt, UMm{Tz4w &cCgnm܄20KUH"aQ)N=w!+6 -y$cN|8B h>h4 /f#1 /TFju39BP^<L߂\ʓ#}p5}.KG;v\12B:ɑ|'jxj O! CQ4X.9QALŹQ"kzE7.^}NqLYj_~ d%[\0l< ZژWcꏭEPuK4#~h]KfwShQ 7QPs9VfXN\dDTRPUbjCan$!jk@$4{Xl}3PåF@;d5`>^|dSɩ=CvhYn!̢d[xϑzj_Ze*UlHķG̪V(":,<"a3#h֊H5R쁟m6AgL$@+2j֝3:h/)h$T*˿!DThbݽ:6/UlG6.zt|d3ӑ28"bcPܸ~}&E7гH0j_s).'jJICoIn;zζn/Ф$ U?~$n<0G)4$IUAGeԡ4;JnlbSi|E*QZNji0wt{IDuMX+ܖZ"=XV J{,y2on ‘x~}7~5ǒ7$.*4F8}kw@<Ɨa_\beV]D&1IНu|ZDbc]E9%~77 h _s,4xAz&_)`4pMf*WTl>ۻEG 0^$ZCYw2ϵG_9lL?5lWpfW+e &9EDzt{Fxلő*ˊ0,ftD"<N:ii0@ .4!P!I 5Gtg+^S98>*l'Su.`!HqM#?x[Q̵IDH0|v.;]$ ߤ~h2xjS@(-U'X SO3EA@S=efud?bKRoleXd7F,Wi"Tҭ8KiܰA2v-N|iOCD\](qcT?|v|nYWR̔q0?zFCqύPkgoQLIq"Myp|NGaH>4a,J ʆr:5>;f~>ªDA؜w;Ŵ6o㒟j]1S+dLDUB#p|<6DP>5Y>G9M!Mf$1l'p <DE"05e<5I^^.]Ϡ~]H6$K yJ޵[z>Mt.e ~ܘӪםþ dZ?ڿ/ldtH̉U3&ɐ˟=nDDTn q.}mKfT}2ZXW<ʪYHEy3z,Ao(aL +_=&D> QWz64~ɷdD0u!'>o HMb2NܾHeЃֺL2b:kpP/Niڸr& u}@`'9ThZ1i-U{'$F#*/;T{ Bt,;ۇ{<h*uH/dKS<ɠa&lE` DYv4dϣ7Mp6O$KU='ũ?p/ͤnܕZUOY׃XD|pwsGYQr-/Nạ$Cÿq<_ Y6't,2W\ƭ?(![YFk2 nI| &ZJB-gpaL$oR66+%I}\ő"$ u䔝;y:9w'c hŔJ_PRkx ֺ涄xe`/~eRJQLPA1Qk =N )F"LRre^ сlEpngWX|'"^Sxē5K6k*<+Z:*#|LB{P!Ȁ={^i3dG/ ۚsB\߶%e|a5-rW<`"ϻW[py c{f|f=Otj}` /(ᖴ%M*c1i\|PC;ZT5@|j 0{f8cݰԄp%~:K Sw6ג+ (Q15 t[Q1* _$T.z8Ѳ*䶩U $/-tDŇDԱU~k?'hjv8e̅vg @gp^`O?B4% eP'pR6s&uydVhYK U)PxS#u -vJ s*uWxMcUUIK׵@Du<+bRl Vi3ۃDȔ~!XH61RjC M'$ANPҮ1>Ԛ X& w{P'cLp /S2' \3&eu`mRp<5'sYܖ$S(n̯}E,u G!z˵yҭMӴoH.u /( :tUҲ IDhtȨ(i,ۜÞST ldHWCռ%=E6D+§8uʝnHf#mFr'%bOW@ksOrߙ")؉ˏjہBo*4X&||GCXp,`?oDre78jRHX9DꖎA "&),036:=@DGJNQTW[^aehkoruy| "%),/369=@CGJMQTW[^aehkoruy| "%),/369<@CFJMPTWZ^adhknrux| "%(,/269<@CFJMPTWZ^adgknqux{ "%(+/259<?CFIMPSWZ]adgknqux{  !%(+/259<?CFILPSVZ]`dgjnqtx{~  !$(+.258<?BFILPSVZ]`dgjmqtw{~  !$(+.158;?BEILOSVY]`cgjmqtw{~  !$'+.158;?BEILORVY\`cfjmptwz~       $ ' * . 1 4 8 ; > B E H L O R V Y \ ` c f j m p s w z }        $ ' * . 1 4 7 ; > A E H K O R U Y \ _ c f i m p s w z }        # ' * - 1 4 7 ; > A E H K O R U X \ _ b f i l p s v z }        # & * - 0 4 7 : > A D H K N R U X \ _ b f i l p s v y }         # & * - 0 4 7 : = A D G K N Q U X [ _ b e i l o s v y }  #&)-037:=ADGKNQUX[_behlorvy| "&),036:=@DGJNQTX[^behlorvy| "&),036:=@DGJMQTW[^aehkoruy| "%),/369=@CGJMQTW[^aehknrux| "%),/269<@CFJMPTWZ^adhknrux| "%(,/269<@CFJMPSWZ]adgknqux{ !%(+/259<?CFIMPSWZ]adgknqtx{~  !%(+/258<?BFILPSVZ]`dgjnqtx{~  !$(+.258<?BFILPSVY]`cgjmqtw{~  !$'+.158;?BEILOSVY]`cgjmqtwz~  !$'+.158;>BEHLORVY\`cfjmptwz~   $'*.148;>BEHLORVY\_cfimpswz}   #'*-147;>AEHKORUY\_cfimpswz}   #'*-147;>ADHKNRUX\_bfilpsvz}  #&*-047:>ADHKNRUX\_bfilosvy}  #&)-037:=ADGKNQUX[_beilosvy} #&)-037:=ADGKNQTX[^behlorvy| "&),036:=@DGJNQTX[^behloruy|         " & ) , 0 3 6 9 = @ C G J M Q T W [ ^ a e h k o r u y |  !!! !!!!!!!"!%!)!,!/!3!6!9!=!@!C!G!J!M!Q!T!W!Z!^!a!d!h!k!n!r!u!x!|!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""" """""""""%"(","/"2"6"9"<"@"C"F"J"M"P"T"W"Z"^"a"d"h"k"n"r"u"x"{""""""""""""""""""""""""""""""""""""""""### #######"#%#(#,#/#2#6#9#<#?#C#F#I#M#P#S#W#Z#]#a#d#g#k#n#q#u#x#{########################################$$$ $ $$$$$$!$%$($+$/$2$5$9$<$?$C$F$I$M$P$S$W$Z$]$`$d$g$j$n$q$t$x${$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%% % %%%%%%!%$%(%+%.%2%5%8%<%?%B%F%I%L%P%S%V%Z%]%`%d%g%j%n%q%t%x%{%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&& & &&&&&&!&$&(&+&.&2&5&8&<&?&B&E&I&L&O&S&V&Y&]&`&c&g&j&m&q&t&w&{&~&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&''' ' ''''''!'$'''+'.'1'5'8';'?'B'E'I'L'O'S'V'Y']'`'c'g'j'm'p't'w'z'~''''''''''''''''''''''''''''''''''''''''(( ( ((((((!($('(*(.(1(4(8(;(>(B(E(H(L(O(R(V(Y(\(`(c(f(j(m(p(t(w(z(~(((((((((((((((((((((((((((((((((((((((()) ) )))))) )$)')*).)1)4)8);)>)B)E)H)L)O)R)U)Y)\)_)c)f)i)m)p)s)w)z)}))))))))))))))))))))))))))))))))))))))))** * ****** *#*'***-*1*4*7*;*>*A*E*H*K*O*R*U*Y*\*_*c*f*i*m*p*s*v*z*}****************************************++ + ++++++ +#+'+*+-+1+4+7+:+>+A+D+H+K+N+R+U+X+\+_+b+f+i+l+p+s+v+z+}++++++++++++++++++++++++++++++++++++++++,,, ,,,,,, ,#,&,*,-,0,4,7,:,>,A,D,H,K,N,R,U,X,[,_,b,e,i,l,o,s,v,y,},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--- -------#-&-)---0-3-7-:-=-A-D-G-K-N-Q-U-X-[-_-b-e-i-l-o-s-v-y-|----------------------------------------... .......#.&.).-.0.3.7.:.=.@.D.G.J.N.Q.T.X.[.^.b.e.h.l.o.r.v.y.|......................................../// ///////"/&/)/,/0/3/6/:/=/@/D/G/J/N/Q/T/X/[/^/a/e/h/k/o/r/u/y/|////////////////////////////////////////000 0000000"0%0)0,0/0306090=0@0C0G0J0M0Q0T0W0[0^0a0e0h0k0o0r0u0y0|0000000000000000000000000000000000000000111 1111111"1%1)1,1/1316191=1@1C1F1J1M1P1T1W1Z1^1a1d1h1k1n1r1u1x1|1111111111111111111111111111111111111111222 2222222"2%2(2,2/2226292<2@2C2F2J2M2P2T2W2Z2^2a2d2g2k2n2q2u2x2{2222222222222222222222222222222222222222333 3333333"3%3(3+3/3235393<3?3C3F3I3M3P3S3W3Z3]3a3d3g3k3n3q3u3x3{3333333333333333333333333333333333333333444 4 444444!4%4(4+4/4245494<4?4C4F4I4L4P4S4V4Z4]4`4d4g4j4n4q4t4x4{4~444444444444444444444444444444444444444555 5 555555!5$5(5+5.5255585<5?5B5F5I5L5P5S5V5Z5]5`5d5g5j5n5q5t5w5{5~555555555555555555555555555555555555555666 6 666666!6$6(6+6.6165686;6?6B6E6I6L6O6S6V6Y6]6`6c6g6j6m6q6t6w6{6~666666666666666666666666666666666666666677 7 777777!7$7'7+7.7175787;7?7B7E7I7L7O7S7V7Y7\7`7c7f7j7m7p7t7w7z7~777777777777777777777777777777777777777788 8 888888 8$8'8*8.8184888;8>8B8E8H8L8O8R8V8Y8\8`8c8f8j8m8p8t8w8z8}888888888888888888888888888888888888888899 9 999999 9$9'9*9.9194989;9>9A9E9H9K9O9R9U9Y9\9_9c9f9i9m9p9s9w9z9}9999999999999999999999999999999999999999:: : :::::: :#:':*:-:1:4:7:;:>:A:E:H:K:O:R:U:Y:\:_:b:f:i:l:p:s:v:z:}::::::::::::::::::::::::::::::::::::::::;; ; ;;;;;; ;#;&;*;-;0;4;7;:;>;A;D;H;K;N;R;U;X;\;_;b;f;i;l;p;s;v;z;};;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<< <<<<<< <#<&<*<-<0<4<7<:<><A<D<G<K<N<Q<U<X<[<_<b<e<i<l<o<s<v<y<}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=== =======#=&=)=-=0=3=7=:===A=D=G=K=N=Q=U=X=[=_=b=e=h=l=o=r=v=y=|========================================>>> >>>>>>>#>&>)>,>0>3>6>:>=>@>D>G>J>N>Q>T>X>[>^>b>e>h>l>o>r>v>y>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??? ???????"?&?)?,?0?3?6?:?=?@?D?G?J?M?Q?T?W?[?^?a?e?h?k?o?r?u?y?|????????????????????????????????????????@@@ @@@@@@@"@%@)@,@/@3@6@9@=@@@C@G@J@M@Q@T@W@[@^@a@e@h@k@n@r@u@x@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA AAAAAAA"A%A)A,A/A2A6A9AHBHEHHHLHOHRHVHYH\H`HcHfHiHmHpHsHwHzH}HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHII I IIIIII I$I'I*I-I1I4I7I;I>IAIEIHIKIOIRIUIYI\I_IcIfIiImIpIsIwIzI}IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJ J JJJJJJ J#J'J*J-J1J4J7J;J>JAJEJHJKJNJRJUJXJ\J_JbJfJiJlJpJsJvJzJ}JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKK K KKKKKK K#K&K*K-K0K4K7K:K>KAKDKHKKKNKRKUKXK\K_KbKfKiKlKoKsKvKyK}KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLL LLLLLL L#L&L*L-L0L3L7L:L=LALDLGLKLNLQLULXL[L_LbLeLiLlLoLsLvLyL}LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMM MMMMMMM#M&M)M-M0M3M7M:M=MAMDMGMKMNMQMTMXM[M^MbMeMhMlMoMrMvMyM|MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNN NNNNNNN"N&N)N,N0N3N6N:N=N@NDNGNJNNNQNTNXN[N^NbNeNhNlNoNrNvNyN|NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOO OOOOOOO"O&O)O,O0O3O6O9O=O@OCOGOJOMOQOTOWO[O^OaOeOhOkOoOrOuOyO|OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPP PPPPPPP"P%P)P,P/P3P6P9P=P@PCPGPJPMPQPTPWP[P^PaPdPhPkPnPrPuPxP|PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQ QQQQQQQ"Q%Q(Q,Q/Q2Q6Q9QWBWEWHWLWOWRWVWYW\W`WcWfWjWmWpWtWwWzW~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXX X XXXXXX X$X'X*X.X1X4X8X;X>XBXEXHXLXOXRXUXYX\X_XcXfXiXmXpXsXwXzX}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYY Y YYYYYY Y#Y'Y*Y-Y1Y4Y7Y;Y>YAYEYHYKYOYRYUYYY\Y_YcYfYiYmYpYsYvYzY}YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZ Z ZZZZZZ Z#Z'Z*Z-Z1Z4Z7Z:Z>ZAZDZHZKZNZRZUZXZ\Z_ZbZfZiZlZpZsZvZzZ}ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ[[[ [[[[[[ [#[&[*[-[0[4[7[:[>[A[D[H[K[N[R[U[X[\[_[b[e[i[l[o[s[v[y[}[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\ \\\\\\\#\&\)\-\0\3\7\:\=\A\D\G\K\N\Q\U\X\[\_\b\e\i\l\o\s\v\y\}\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]]] ]]]]]]]#]&])]-]0]3]7]:]=]A]D]G]J]N]Q]T]X][]^]b]e]h]l]o]r]v]y]|]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]^^^ ^^^^^^^"^&^)^,^0^3^6^:^=^@^D^G^J^N^Q^T^X^[^^^b^e^h^k^o^r^u^y^|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___ _______"_&_)_,_/_3_6_9_=_@_C_G_J_M_Q_T_W_[_^_a_e_h_k_o_r_u_y_|________________________________________``` ```````"`%`)`,`/`3`6`9`=`@`C`G`J`M`P`T`W`Z`^`a`d`h`k`n`r`u`x`|````````````````````````````````````````aaa aaaaaaa"a%a(a,a/a2a6a9agBgEgHgLgOgRgVgYg\g`gcgfgjgmgpgtgwgzg~gggggggggggggggggggggggggggggggggggggggghh h hhhhhh h$h'h*h.h1h4h8h;h>hAhEhHhKhOhRhUhYh\h_hchfhihmhphshwhzh}hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhii i iiiiii i#i'i*i-i1i4i7i;i>iAiEiHiKiOiRiUiYi\i_icifiiilipisivizi}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijj j jjjjjj j#j&j*j-j0j4j7j:j>jAjDjHjKjNjRjUjXj\j_jbjfjijljpjsjvjzj}jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkkk kkkkkk k#k&k*k-k0k4k7k:k>kAkDkHkKkNkQkUkXk[k_kbkekiklkokskvkyk}kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklll lllllll#l&l)l-l0l3l7l:l=lAlDlGlKlNlQlUlXl[l_lblelilllolrlvlyl|llllllllllllllllllllllllllllllllllllllllmmm mmmmmmm#m&m)m-m0m3m6m:m=m@mDmGmJmNmQmTmXm[m^mbmemhmlmomrmvmym|mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnn nnnnnnn"n&n)n,n0n3n6n:n=n@nDnGnJnNnQnTnWn[n^nanenhnknonrnunyn|nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnooo ooooooo"o%o)o,o/o3o6o9o=o@oCoGoJoMoQoToWo[o^oaoeohokooorouoxo|ooooooooooooooooooooooooooooooooooooooooppp ppppppp"p%p)p,p/p3p6p9pwBwEwHwLwOwRwVwYw\w`wcwfwjwmwpwswwwzw}wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxx x xxxxxx x$x'x*x.x1x4x7x;x>xAxExHxKxOxRxUxYx\x_xcxfxixmxpxsxwxzx}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyy y yyyyyy y#y'y*y-y1y4y7y;y>yAyEyHyKyOyRyUyXy\y_ybyfyiylypysyvyzy}yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzz z zzzzzz z#z&z*z-z0z4z7z:z>zAzDzHzKzNzRzUzXz\z_zbzfzizlzpzszvzyz}zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{ {{{{{{ {#{&{*{-{0{4{7{:{={A{D{G{K{N{Q{U{X{[{_{b{e{i{l{o{s{v{y{}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||| |||||||#|&|)|-|0|3|7|:|=|A|D|G|K|N|Q|U|X|[|^|b|e|h|l|o|r|v|y||||||||||||||||||||||||||||||||||||||||||}}} }}}}}}}"}&})},}0}3}6}:}=}@}D}G}J}N}Q}T}X}[}^}b}e}h}l}o}r}v}y}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~ ~~~~~~~"~&~)~,~0~3~6~:~=~@~C~G~J~M~Q~T~W~[~^~a~e~h~k~o~r~u~y~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "%),/369=@CGJMQTW[^adhknrux| "%(,/269<@CFJMPTWZ^adhknrczRzϧ4BGjR;aY $'X5zсӊR|f^e<}1׉v[Wa,#qLĶOm3s&@~MJ2yk_u# I0P@d^S=raW9Xp],h[ ІH+9)O F恠mWzUBT zQȋ<0QVD6;k栃RЩdXfK|e%#Uʏ dӥDԽ.h^۾+W)k鲏H:]ş I7u{Ba3V !&ZMaRLSkhF-p6Ka!ab:b& _hTXC̱F/ܔ }dwtgA"i.?ޣ׳׺zNl;.QQ$_:Ռ͠isbjy{!x2fwwrB CPD:)=EZ*jS v*79#&+xZsnO!mEbmˈO^m5^vJciVRjbYb?C \-씜|B=vu]N߂Ҿwq=djf>+zDYaMSX!#.|L=U{pXTzvahr|(zJ *LnywUDΓYQ7:NZ&呏$LAj)o/n!q[p^v-_8KZKcBTWz5Iucey4[JJ XSB]ӹqS^9A\u]5Q(/蒴H(Nh{(HI/tiZ&2y0Q-0! -)>HI0jLd=]x}iPt6W_zZD\_ vWVS܃d6a-wR-vqKs[6AiaC"|s[F'PrzT w!~:Tk+mP2SXi b)(IFa~hn8N9bm9{ٲi89=No{a@EzRC+UڏAFg"KyVH2jxy'TjvjsgQ%/-P4lm_"W&otVbR=2ߠCH7,V0狾,#zҘ'4=M_-T$p&k..֣+q \i0SSÝLez{pdJWTr[ B4'4şTwY =m|O2uR1)@ *7#\~X1g=-v%yHhE:c]N[~@E$X/_Z:א 2!s2P*:-#.6jr 0d\*UHJĭJPΩӞ}9:Uqm.{ =kNL `Ȭ,Rޒ MbK!xb+iגc|ʛ 4@D]C/"&K2vC;x;h A,Q4{]o]TpJImBNQw4 Qu?r\fq+ 2$Вj0(=RI2M`j嵑Z>-N$7EY<2JY Q[/a^#65amfE̾P%r<;X]`~+?mRG*t Kr/Xt8])pu2 'eYs5Zo:nF#4LSpohcQKiEBytk/EBڮ-bAn[U$ BY3i1XΐiXUIBj9q@H`B[7B7#nIϯBv2ET!*[ګ#T*%vOA|Vi W2hvKf:שѨMl t8BmA6T޻a4 M HK="gQD*zK`WI x^/+1H Hkecb^ 6{[ZڙF1=wq_E:LaZ.RYޘI( .OM 븟pIABm[2(g^c?J!e+ &8͛RRik >:6|S4UG4xC`sA:IWg3Mi/+YASPH\-A ab;yh&d 3Lyl`pMy} cūrXo H CfK+iѻV.ϞZ?ĦT1^4Tejd,CmFu* >uv8M¾i$zgy-IC& JvjszYApxۼԀy0\;T EZ5eYQW |ޮs%hԂ4+J߷I3 iv3 KMH.B\1l%џ]TnϧVѝ`Zzl W>GM/#5鉰QEpO,G1n8L$1VNK{Focڴ_|nI nZBXKA={Iv9+T^}t a xۓ%6iU[Έ5|hi$AE+ܶGCS4[ɭƒ.SN2RnՓB?䁊FQ;؏#6s%Q+#,krƒHe9h7v3sc`oe|KGx>u{aKBSvѷweZ_u=KTQW4KBƥ0;L]el;jSPq`n雇E~TepRډ?CʠD(axGߩ~ gCQlϑTU2c9]VQVT^@eGC/p(~`x*e,r20%eM; ]x:?@ <_>7ugC珚|K"{&5 OKِiw3cҎA83[^pbԝCUQQdڀu31)yJ];ߋ^7~I@.,N3tru ׮uyú%\Oyaz(!@Q]D֫͌tiFW/s\LRepFDL`G&Wzh>?ĜXU1c Yx0܇X!h^ـîFO{pK괦dyh!py:~9ۑpMFm$bй= r9)qX-THRWUízD(N24]jm5*9Xq䵠+mMpDJuG`_Mg,^auH UR)9 5;YZ6S3Ek'rd?_ . C>ؾȱ$ .~vwSdގ:!uݟs4iFh@Kʣ7tՊolCSlyA>_ Eъ8dGTE(D1Q?.Y3¸Mff5FO -((ywSLl&\`!V,'ه JN$XO tkwm0c-wЩ(WaS#-nc&F xU DT(ܠl |L'~uլ9tVC, NT!#fRn% 'յ'waF qJ#~ɔy S,d20>R6._.M8Lh7}>켍zg(3y`j=G_!C',1YvĿux%LwIhØ/wQI_k7χoJ>rHC~j>O|倂7Fi ]!Ύ#SbEK!cė4DNt@9V\.3]r TH k"t63|ϓrqE8ё&)bI%ZLu++2\8XVE6pnqP3bR_zcY@s!&T!F@i;G'wtX05Pf/ܩiXDTٔQ n+%|0;Snرڂj;=%;q{>=REN^#>JJ\GG Mg/Vul|\sY/jL'=g,v&Qn. P=!` q 7WP>`IG$#:d6*xd!GQOamdlM_YS~b tR\#䏾20WkNM+g&4,3tx*mȃbE9Y!v_AwّV{I}x${Q!Τʄ(`MMh L J*{' u B)4`!9W၁u|OnZ1(vOYAx4$,pɭ'ޏ)#w0+)KbQd-% x-;q&O4+uu]"e}y.xi0k2c7Ӧ'{Spu_ }ɅK vDXT-4fI2zYN;g^fBc1Un8[Xu@b %1,FdfrU xc5LXT=Ag¼eXjtW+^!چ4{x: ƀ5?BQ-ɵh(^2w{qSx;##:^¥Ark.>6UdS|Nhg+9{Q'Y~~A 1AAvs 0I&CT0acQ!Q}QhP4Q|$oTi|%Vieԁϛ"~(۷z7S|O%qa.YJ22HM:aOZRnMk禑8~?W p,yyc1 ' ).+^-)wW|gx0~ԣYd1ļ3f̲*M 3<>?%e$a!+=ְ̍ϲ\_ׄ%my1U;WlsLwK}* |l>~'BkXBO^ fNtyҞnMSf&6v' 1C#-\etTN>AJ@,8~b@NN\vi^tn Biw7`YG{Ls<E^^NFnG(E5R^ҟ IS5YX Yr-CzIGLQa̍agRt=[pnxiYܬ,80)〳("9Eg'V{׊ipx0}daಪGGVAkÚeL~d y|=by_kNK#_xt/ŽḰ&K[hC{"`wV7m@"KBT%"9ո##,F *ZžRiwƵCT;S6,š!Иk9Am8,gs{ vD7asKTHR̹,XP R9Ё^#i fЃPr0H|-#"N6;;fH@d'$e2<j" "ZP`(=q[m +X& N|+qdxs͘n (6vUa[6}OhxW6#ٸY,JUxNnc`^wgH#ko98dwbI"8X6EԀ!EGF=-zݕuÑA}+i o KF-]LUR4vu\6@æMʋޗ85\_`*gCtFIֽDBw|ZXkRx*Hj! 6UmQ%6j Jq ogiڏj?EOD% ]aKb\W6Rs$E;Ocnt]`˾=}yʡb69q@^2yIt8s~.ר=Jw{z&`еd~WXZ[z j)0D'^m0rRLNz21; Z^G"|gX\~D_p Y>qE:6Yj[AW4" ̃w _ ȃoHوvp3`Ԃ_ǔe@]E+pp^>YtW5fakM,xΔIoQ[!lR0XM1P1K3A3U/Dg< 'n?a3>A|b*;U޺IyM m[%QۭvIYj0W 3P(JY,,(c9wBْοd2%/W7Ე|cS;(Y}W~n{-ȅ߹<92g%WN^2+Tc@nh!P4b6SvRc6A^ \j;t^%A!@oWM{UM(c D_EJ$v) 4VmÎ0}[k.VIt lTzt|wm2:,>\Biz.$\$ HMsîfJ)j!Y}GeTMǒHsZNrE\jD\\? yZb@ /WU[sOhWppRT}s}9{(1LYڄV/`FUZRgU4hZ2D>I,;Wp;(0'+A$ՃqӉ@? +_\Im&%~Xie&$VGh4;:D7pnng÷t0kj΂*@iUD JEJbAQ|?ぬW5;bkG$+Jݨ/$N$g1.V!:Cٱ5Mt!'y~NSOiR)phF2-v*"5h!R Ds<ق4Fl?G ÎZ5A|f?!"s6GOsuQT@Ett rD#]hfQ4ykJwG>yq xj@e"BWUyWk ELP~GcY)`Nr-Fz[V, dV^Ż|J48θqrk7 ],}1[M CMӆ'w"'!NsuQ>JrYSahhiULkfza*1_Y= z-jRz *!8ꍱEY/ML@ۀ^*;e]8W/{h>{`_7pmu-{,C캚8wn"/вd $鬼sӴ`J igźP_ܼ -;z$ث8$]KCLwGfw,NI-4Gmt*;,1;)i@apLHd=a3e*G5oJw4{G_Z95 |< Xř'oq#wa-&2%@TWXG8,^չ8~A/P7*-".pOXEq38JF\{eXt*9L#o& .QlV1/?H+vTeE~03^zelvW%:`6 V<B> |/RO "!LpxSnle@Ge]ʹE/FK{C[c9#g`8FW:1T2t|_ߎ_x=i MdK{~ .ƢڊgV.BߚL;a=&<ڰ4^wb-cpR93ͅ0 7U>ghgSD@3R**9‰&S{@@>UP`t3ZP 0rkdp`Q @QUdNԌ(w[&̣hgm+g:~cZ16sXsyJlw_f`${Nf.]UTiRz9` b:(9]4u+?؇aiE{D29)gJbQAxsz M>?LAzJ%!JTRVYN`Q練.#puBn]kTax5ʾA;6J7/"婀QpÔ5=K\S|.$@h%j^ QfL ^3(m6QF.jv i_qu 9QxQ4xr9|baFSyIhee 3WG';4d:뛒7[BKq$'|-11xJA=BErQv8nH\ω2SG<&_sxFا{ \~fu.C,&Y69Xl(_T>ppU"m# `b_K#޻Z?C'fFVB4me;w^!j :1W,US=(cͦu? P)Y|mۇtv&Y1u@g& GvSiuޫWmDpUPpnةT֖uUGaL-+4 Oitj]1;`uo$ۨ>םcBWHsS=ra RݭbSMUYQ,LjhLO2GZh)4t:F]03$oBA ~p¿!4A7]?- QN^\ /*Մ+>=ugxceBvsTПt f6a_uMN)4Cؗ41}0~>O@d4ڔ2#:}́}]ScYP}xr:+$ C?+5px|x~RxJے0sIg BZ;!񐦟M)Wn]e_<$_ܲ0i-5>a` >vv4xBt)y4&1ZjoT*S$szKao(DKկ4(]Yb^9f1551J--2Sܶ1F\x>>^ba$-$8zsu1ssK3%>ە= 6\c,hSPfsH` RK$Dv{7£h\֐Z%@8&:p^`# ZŲL9ޟ 5q}X$[Ē XoȡCx'F:]D]!nqug.:TVqqXtɘ9'S5Ab'.ɬ͍ngh ~SA/iPKbSrE ]{1$,:N^VpY4?d46rZuR>-wIzkf`8x aF<5m- zCxFI[aQN?:&ΰXK=}9XT'ΈS0.^ 4{Rni$g}QX954d!J@j|{0A%y+FBA="&p[|^RSWWZ陓|ͪgfϣv81@md@XY@LPQp% ;)3 EpP_KȡM$*̮=E@lWdמ ; acVPO4l}ҺFd\08Sքrk Nys'E߳<ƭ f3Oh 1b]{PqV7?7SPzr 3~z6lM'BAY4RL`*bG91Xho_'rxeߨj${} >wqwX'R y/NL\a*G J.fg{NuSs4paYr} `3 X]z]@A"MS)(A *N (8@8 / ul:hP5YZU14b#(icot(IIBI8qI=+rC4ujRcY`;j-& ~8@B'|'J/_8:Dp+S0[2Ǭ翉T"Ugؖ\2Si+sHJU]5"N@>%/'߃Z4RCk8Q +:dg$!C&qeП]~ &--Jr0IH~# vǞ19\K|\nGPQO۬RyEG3ެ'I-)Ke%cpXggb=,c1pOy]@>k{ F=u{g>s Q+:uMH? Sо~726fI `O^44>nžwĿʺypӜPd@F;Wɾ4Kͭ}X }ѭ{^_@ e8a^lپ.EnT.bz7kOAw/CDVfeyVR}lXEUSYA:d(B9&m4 M+h%7?)S>9.Ƀ-8Ā#[A.rhM:8F rqRlrLqyo^Ǘ2gINfGΙ,۵ڲrܞ)7@IͫA Qc_/t-a)]POBPRi 68&u7s8h;_x6t4dbSpfO/+SFBwgD$}<4ƑN@l3WlSliv 6N%K76bPmS( Tq}9az$ɦ)qIi,83pg܇5z[̶=A@gQ`aLbr$Mh Au @x$y_;t/mଂJPvT1QdXwiD .BA !b^l>J|U6<ˣRj`_u=]#+Ӝhhv ,D87zӎDRt.yiBzAA? ˂b,DkH]z ؑfi }c${7wE [X 8&O5@rOJ]|YzLWqWcawd!@bqNm4Xl6"Gm9ەm(*yF(A.p3NXވ*R,,TWؑs9L@%"&oU5vt''3#0HWwEYaX$+{+z9Q+ #<Ve"nYv HmgvT+`X=l?>e9I ͻ_ʴ_~ z]Fw7d]Im4rW'>7NKUE#}c[2d.T-Ma ^l\dr_8ɜs0}MI.{*ù~ GV3k`b 4Rq4(Y$',i4.u߻z)Acx`"A_U;pw< dku,&K|h-%F~"c =R8m0t^ 7CzyZW:+oNw"<6mZsߪu#Ra{6D;LFD¬Jw=:ZDUJ WPdJqUk3ԎSr 62 2}x>f5Br'8цľ7GS߆,*|uDd1آp#hL{,.<5tSѭ c^e&SA^?!9BQEL}־OВr1E׵{עԎ Wc7"ɰ)^׭Mc晘܌ˉl/|q}9ɚ/` 8d]M_ #fn|AЯ;8W {=}XuXa6fk4@yQJmǐ DyI\& ȋ6)Z)#|! L \3t.)._3,  *jb_ s@\zh:e ;%xbqt>{vy,pD?bDKJf؈DJzQ7̡ϳ7{`!ݜ@H\[|^e~E?  [TĐ ~ [ t (ۧngyC`JTztTEo80H'ёJn ;eT80) "GZqnFvoI~iFa|_13-X;Sqge*1^VyFdgeA6k.셙VԻw]Xǀ>",TЧ:g?7lXɪGn|Gguۛy⨄ww +Ed>Ra\ӥ)TՆmF7uVMg`qT3:sGgȨEDl@ܦ3`$l+9V}i/ CQ"@x-u(;TCU oT)T%.Q(=2li3zЊiZT2+9vll3<M,kAp1*ݯulogDG@JE`stR̽tԛGKcլyiY~9W8uǏgd/ A^މ 7n /6Cj@G4;YRUg| :%SPYz- CrkQM.yh&dظEdOFzA%b`+zF}QK j¬H7=؈QmrS͚»o6giG6{iB'RIGgJQ À$eY]I_E$) e!W-aHo!:,[)Т/VQEHwqd}$Bᄋ l{D]pMW =p-H/fnGZU5 m0h&f2 l]lXUA4D|^BV~ct?q%.wAU2vk|QU/*vj"J?d7S̈́;{ɨR]ZO;u7 $s٦@E1ZaE[1mfO:PR7ѭ[ =Hir <~#_@cH&E2%\cMhN˝v|qLVN8s˟?^p@!Ꞣ^SJM߫جbPeu@W1jU]FK6`qXiS>ĪNC"(yFF  "f*01jj KPؗ\<&ڏ*P*K5/i%}źO^d}s˯3udpu;!nܼFv#Qv(mb@i ?~)Ĕ: VNII>IҞV {·3 96agdco\ۆF˙tD܎s+Dof:}i(ORϯEṼn<K~xuNgrkfw`%nrNk bN^C{#@QZqf.U6o4O"Kp!)6,PZ @9%z #VLzjC 7dFc «+eFEE}.3 B,M/HMNYK} /+wɫKN^RwZ/R]No5ջao0'qX˺GrX4Jz$jB%TҾH# wp@N@ΒOh:='dДPbPH7cɤ( yZA=+"o1ezdbŀBͲ)DW 6+ L~~~]{  kVHbE;SIO:5DUL+(̖%l ibFj_'62.G;i bCV{˕y8"]dG4M>DƪW_CD߯}62d`{=>.sxUm7þPB=*x IGkpmf1`C:w2fZeKP[k` Mn 8? $I>^$2ȸ{wMID_ 0F Kڎm[@]uVS}Lj0,>FnHY*$9HI,ר\X`umMX?4mG8 \ sҦ%! .G-+H scCH$J}iL0[Q͇j4G!|J؟TVmm"%܃_)Y]頫, f%od7&|0tAYp1:VDkR@wZ s07Fȫ*g_vqF! |W r M$ԶvR=Cw [*mFg44zYD֤@JOSF[jjxzD A\4qo1^ #}"U]2VQs͏}v+.F&\$klp{4 n["ݫI BH}W"XZG8#JXk\δS\-njn1VA. hMYdB.G֨3IKwvTAeA`XpJy֮ S!gpK(QxnLH(Χ)0ր Mi26.f_,%Z2/!t2 a 7LUD~ùN?QḄX6)l~>XJkrr4.'3)\a &lqodQsq*td%X[4Xyg?u膚H7xo.rAWĜhusgBNS(ZEVљqRPbʧrqqKIt!# y3+}HFn4\[QH+1)6:KX &4r@e6c>^3pH=A nƷ@`GHO"5`FٚF)*P~=E8YjZ!8$APs;w5݌V&نF}s*F-Qd~P B]0lx3GLL.EKs8Nr&IZ CVY!_yaܡ^`p6ܰTk{7WySJ% 615m DiCDM2ʂ6',tNw'"?!$ , YBT|#17"׎imn) LoRX6[,Ejj=8d+s -gtt;KsFw][^H&|@Quҧ DzCb~KV5u0PHQULYzޑڳޫns%dOWI8*ׄoV6`VsJXun|}-gz3qE.WIBŌNc6LM4_CsZ{*ےpebCR`7Z͢87+z}saSԋ`" Xp#x;@Lmtйhɮ[Tn0MjVJ`cEh/{Xr`mf`(E~\x>#+Y`g\]@h9Ku }8=րs%LuP˜]1gK܆ 57: a.$tOb'Lu# d J'b p)1A'M_d'ǥd/[.h f0h8h xjj4=QA ϼh"G,CI>Bb7dQϞj#X(x\gGf&ҺEeƀD%/s3B,|ЪbHܳw=$>o)W{OU{ԠՌ!Mj =QqZc* pVaNL!Th1|*ZZ7v kH !Mtq\ ܫe"!2aQ_䍳]jXV<$bHy8zC"Xr7C6Qj e*OUV=KwjF4YTk+Nԃ%Gj^Xo)Fi?Lūׯpv-Zװ,%RN^-ogO[mJK1 fh罢uKA#2~` \}P&BamKWgўϬ sZNNS\$kBKk,bSGJH1$^bg:s<;(\Z=ȁIШC~574 JrpF QD쯞'#{y7I>X- o Me[UWOWNn<me6U_ qv3v3mDKD~zɬNT@;mp4-VVz%Wj5iIY  ku 7vԂeA*BB&7UǧPSCDϟ_`~Ѵүj`Ѭ$(T=xÇ,8Xk~b2''.2i +ڴ23t#!D\Q8S\A`ѵb?@Q3%(3/RE:Ϛe')W5 F2f @fz.zvatU,E_t4@xQXǾyjw-2BPe5_.?/y.OdwEt>Rdny{bf^gN9ܥFg}!a: N]V&{PKѣ'`Ni%HF$XbS/H)A 1a83X-:;s^,^&cvzBWmW$Wpe@;ۚ(HLHDl nm~PIA93vxj۬_WZ!HI<ܳɖ9w6X]1--i:X<>C) J}Zuӛ nn]E!qLw‹Bwd>A=pt(5YW*,oמWHf0H.r^/,,5hKq-, 5>[sv*X{7w5C08yџ7h r\ZqM炊!b〯C"HG-,ve #iaVkYo9]w>ilhġzb9B,oaoCjDCc;K!EԨ~'!7 Z˔qa>ռJ^)#bW Sf[鄋0O= 8]\vq:'lNJN3W> 昆kCx8C߰]ON({.0 ?hF(xV֥Tu>?h;"&:hs:f2@C¹, >,RsBЧ7 ~A Q2hMwofr2KLe? U|,@!ϓj85g^eoV~g14UGtaB0Mk[$Oj*"yc?d|Y!1b 2-E*"uqxFX<=ۯ0h0F{G?skZ5K+'k , /&l hޞ}A+IMOPE$˺/cv`"G]c83m4~;HTFTx%L>G@&LIQU2% tyK>[* YPMCkp~n W^5 Sp`씟åLzONuI7!3fcɰ3oQ'SIOwX&[- !\ag`n׫:no83*s%]Efz,Hee4oeq`G|8qH@_t{N@M72K YZ.RZ=bK@ޡ^.6wp!t8Z]sXf=b{_+e.A.JF)Ƥ4:m7vVl"Ws5nA4  A˿~xJikmhD8*`2ߗ[NѤ!äDꆅunk'}r".U3RJF.6}LO@jpAk DfQ3e.VVqOr thڎC(eĀ^kTCu ˱2 Sq0 FԑBQ5=6?hw~o6)&% ܱRҁ'vA^˿4ot6Ck S^@Gbq]Qz5/\ib 5PٺtIf7Yí;3AsIGad)wLȘQh,r~@cOY&!fB Y<2`Doxc KpG䫹.RO/"Kf?xMm抖"|.F,n 4]ߓ]'kp5 NJ1ea]M&TQ1 w3b_m?BǣyۉpT*h*`[/މ$Gb\k5LQ̱Ɔ52ͺVzFC_e?-$w(ZCB%iV)Jl)Y3w2V7JYjw?Yy7v OmlJG?C,coUς mLœ袈]YXTw Ƶ+cNl ujIt8w 2Ǜ10C؋ԠrEH$9nn2=nF<R9nLN~tx|JCX ds"RJp-QTnJG%Hs:|&b+-3%ͅT1OE.&ZI:v=n@' Vc?:@)㔰"\ɓ&J1m$LlgUn ]NQ]AXNSV~,C5뉺xQOucQafT8u Tf,eq ORi7& i0Q7߆f{/NXe̓YB|@*&ŏ( {ax*pqRО[os20w!Yjzq^5̍HgaBCYRh~p1x".<*PU.X@Ef%=뼧x:4$yǮPy)e?% Aekyd]W\3CUR/\}X3~v  X*>Y}w[AܮN*AԐ (#N:ipHr2`SQZbtQ ()_∃ 6Z$8%8{%qYZ{5B8O i#nLGo/ƉJ chCkksJ0`\s8,]{BF/XU:&.]VFګC /V;*obmkuWkhK bt&Q ]嬺ޅ}$cIB^0oXU[(eu/91(KfT7b&c*!frn9>1bLкѪG6otDǍB: ń9XYü5pKX 9{Xco!&~7'ǭ/Er o>%Ex2^sm9t{{Ψ< 2|WVz5FmɇZ1Z~[mv<˗!BLݴ;xᫀ7^8XD R_]ɶ `EcvoUx-}T' U|d\ Q} hz[ k!:aE0#"JhmgQT|>}0qrXrU.AI)1'jeh|VyQ1>Ą{[+fe`H .,N Zvb2XDUwNQXA1hi Wb^R4!D0R|l^ AEfv;ӨUsM!H4{v sҡ =ϓ a)TLu7F \ ʷm! føhyZLAOIj!l~Gr/ 5ȟkzsKpQaǣ *GٕO;NBY^f!:ƍʘP{#bҨ)HoDvT˛ؘu~ -V}̓ *JWj}Rj^ǡV`v\lnsҾ69J2l:ݮxst d$Ccn(ФJmč]H().j 3I2WdH&6tZAtUYP{>mm-qM7hu7r~8kͱGdDNr\Fc!"@l03VXiIs/kwE%. GKrkn0(=B{+wi]= oGXE/"LmZvbAYC9ϊY.DVA+j/T6?7H9k uBncva"yr5DeCQebS\JN' |q)khWoC>T.;h\kbyP} 6br-K:Ni'_4%!nRHѽgAvn)Ԧ !FսER'!ʳP`2ᗗvK-bj4ef8$U^{RVR|_2^iB*O\}AE@(nutZf[9nbCWPx e+ঀ2~HR ;ご^mdL>U6Р*b ͵J\}&U""_zH(.zruNEw)MYZ2KbVUlU /0~q>{8ȷCzĸUP+g6C+YRjL s*!%5pnu]_bOIuinE'!5Sy!6w>moe i' u)AJZFI -cB>VfqY3'J]N81,$ #Y_HB/vt>0c ޣ 4o;mIjIB "m$HjDV[aF (S-nkH &.ڄ+,r'}We$C'G4\3=[Gp\mWXXAt?? 2YH]z- .5-oM"o8pMzl|m3|p#*iYuEF[!IvLUKSWWirmj꒦_g^+'lo+kq\ %[QX D|KkӉ6%KMsf":%U[iH8a@yȐbjTjVrg +k}:suBOǜWbsO INe{ϨJS>i:PczBhtcۡ>ZӴg|F'a$֌)Zz)%gPJ@xz RfsD2Qa^ًY?*! geNb\o'Ot);m~KqܙA%Jl=E9O!}.Tro\3!c`k4Veci:i6O 3)@ 0d{80>{6QAXZh~gMPkO]ML2f5Rn0pEf 0r#9`^uf9[ < e(}^'Nlx[׷9'%AR?i+K%HD7Loa描^Zp^@/ZE{ss$$Fr?8 vc]m.6\Tl(֍k'CII+3|ц^p6b)~M{бMCm,*MBt&;nm"iDS7ɇFTTH3U5 #FIIDl)!8j4i#E ^k+;΍cc@ k6kFC2_Aqƕ4\hPwS6~t<8b s/%3hh_e{8+hA=1=A%Ġ%A;?6BDZ'M}J &U/QA @RհuqmdPo0q5W3˺df!4Qjt Ӎd|M-~Ur¨&XuNumO*/JR̮nRMli#pj^cjӯg\*ZagKǃf, |"ʹyx| hD\'ùNzkr\0!V鲂3haX*=^)alCѢ[_~@z`cI0ڹ#E΀ZhJL8TQ諬|3!Fjٹ\_2f[}e B(mPh33w6mMf9 tGD2!`EJyVIGQ;|Cw~)V ]W) Tq3_8Hy(a) GJ#jx F`AXr3Xݏ&W-y@ƸQhϧo ޺Wx)c kdž{L hobEeΡm[] 6FyZ/`O  V~B  VRq;8ࣜilϒi|p:%6a%FWl!!C g + oXHm`jTc(@'vP{ gd]H Si^qx=JͰ) _:[+BCwVݘiHs @qyRRXUXl@P-49Zdg-M3W7ClRkc@wHx _ETGf+|62PZ(@XVt$@Q1G?d:2P.nel8 ^-Уب"e5~vdf#:1{b5iNuԢ.>$U@,)bQ: mjP|Ll@{5r訄mڐsN{pgz%DMz"% 7uPaÚ rnUJ`YDGGM˄UdytEAJg\xjE ru>lЩ+!:KfVN/ԾRN-#E`i? ^v!;6n"9kVyBC輊u735yZKQMPℵ{֋SAvIż[梴ZSrkc[ c]]2raqe~"i{|rz]ZzcGCfQJd!GYqX<Cg@2]}j@iYo&2-/ -bـot|p?|=Jd.sjm2S:zFOLj#/9ŎgYm XWQ#Dzg}'UvrA-!.xmRBV `N8(O+n]??\kD+Ͻ<rl!"642UǶB, Uw(鯫 2?]j<I^yMK=ǬBD3\;-6n!bٴ_WS~@܉iLʩ#eheX+)VSA p=UIҺ ?A.ß Ķ~+ h svϤQG ud(6'0傐CTeP}J 1r1|tT܄qph`r{C{n' CI FOANrsYiP Iܑ̯؏c2NI_ (ޘHy\Ss|ı$1-N;GVي_M{0WIaM5mxJ٫m =? qƭy:ae'(TЖHZ Oh 8y_SX`94B>MiJg1aßK]o)M ]}yʳ^su`f<犦IrG=D2rvhI\18̬I?.v-J[=0)W8nvϤ{!h\2 Ms'mIRNf)s4qH泽XۿnXA \\jgCUEY B4FNO337DATpRmXو<]Avȣ@Q)V| 21nuFz- $J]ew0Ìڵ- HEظLjǘP#y .[V zź++$lWF}kǾyhiSgwD3Tw \XLL'CaBd"_K7WNjiN|OоMUm"qAavۻc\F+ȱ2#k [R ׶ҪA|i_-lP: >+;(BRCd%d%1 Jr/A&5wZ/}7gqngY5$X-֊]N.uY;SJqUp C-ܪ.Dx,bFWfd/jГ89UֿX>2zv\]yb\| DוfLus`eוBp{3rM{@_~yxuHr?M;SMY@UF:OW!w/KZkImG(008H+kTȍJ;0ƛHYT13<'? Ef8_aq"Y\Ͳ1tό2Wc䧷}+pل9~Q0l`km\~&0İӮ~D8[}*{Ry/<#`]'UDZd?Yo& c;ml2*8=4qjiG9Xe'wxCBjD؆Gd?1~jeƔ5eGiVԇQq(SU)>{J>ãl饍g/sX'چyjm;:?Z@b2뱐W4 *W"_¶(;w H"-Bۭ]vr (ZQ=RұR4Gw]l(nL?8p 3s#/ӏl yD$op'pF7xPsX "EmL XEdHغIjV^Bzgnؿ+oޞt-t v .ڐi@&̓cDί a@א&pٻU[;xM7wVytd Vd 50 ЪzkY8%kPc H >u_(!Wª,C紆$"N5-NISvrrS!b(j-kp~!H-hU=YTCmQElal|AAʪ;*\Z&XU#yqRo}4ypz/*,:Xq;Rf%ntݚO$ '@D^-D>1%ץ>o*ҔcLp|0KP5kՍ}LON u!(` dJ{K* vNAxj28?{I}p-R-M q(UT'Ym%3N qyLMr*.)cX\.ڱot9jSwSqHi(ODňN7}"JԨrךmDP$glb_*!EEܓj+9] Sr!%-āG75jV8EvtIgu4,MBBCH6 CaݷAb҂ef [b!OBl%I{r"b~Iqnݔ2dqC W }Mۇu4NG Q:͓TO0-zQ kXL-)c;eF1?l!oP`exEs):_co!tE$Ѹ>uVxe|P'4Wx <)+Vlglum >Ƕldc7F fQǦ<2C=|@_補(??:&y6>TLУ6[jCsfoDiajbйJyB `iihݥҊ9=BSDD(6BS&d ăTOmSR7V>Vo6c $){H(g{uO<,eVG&7m-ɯ@{[3SL$m@oxhx'PZ2f'mHgq4W1e>1f^+NN̺UW~W'_?>ە:ٓ:_PT N,vhNQ LR8 -(/.;bwӞb0& &$ykIa{ķhDA=WgKa4 qÆ<M'т rA^vzNNt( d`f10?KZM"aK=}x3pϩ!y'9pܚOZf!NK͟B q>#qW!^> 1BG8|S~~M)NaMm0u'^),-Nn;sPDLIP3 9Iۂ{ D8aŊd[N#)VvהJrofY4Q;0pN4j]ʶG =%ʳ_m>43)65S"TɏJņ[}DNATi,evsg: whUQC!8q_%edϻP͔k)ræoAݞawsNq i U]Dmfq%*`DFhaspNtaJͮ(58ەZ]UX9zy sR;1znE$w %,84bDDžl*(Em Q7F/z7VXv]5rV{gDK M;JqSū9l@ %P/dy[tL?D9CB/$6*?a2OkTU;;iDM7}O@ v$ji)0D4JBe>WrWAsZ<'Vr]45>aNj-TFqR3 qt®)"txC gvN 9-;Zh{PIJh@UQ"B#QxJBZ$.yV\Pjl1fV]\i nDZz,dgeB:ǽT"uȳC펉հNY}`Min5I]P*%Tu.Wr2NN9䠃%Cgtt.w&zY"GbUlTKc‘zU6.zNÔi~{RK,|5UnG©C֒L ,y]'^7ۂI2w_)-"rش?!W5#e?nwjZUG4s6AC;6eJhqܻ.+IОD//2^]Fju_6xnĺ>^gm(u:L8Ă!"44g Q9IH_Fu+b!)WAN%€E[R69SeiC"- dBѡbGirpUT߁j o~"%쭁G Dj)W" [#9{kn gbYOgEEnlZ,Qo@i%[+-oQţC٣Emq{dʥ&koVIWttj 8fk}佷=OĴ4ʒE ,@mɈⅉc֒`[ 1DR*[k4Z7]9-hz>U&1zpoEbd#xwYLjX9L4. +yek]Up~Bn_Lu?ƴߦ[*VYk>S1_DS^!?lDh:; TD:^Q+[u'AmfJ 鶕v]%[R%KQ;I]hP$+4ᴮsbF^eu$6bEץ5k6Qn+і4_¯O}`Jm* ccOI v|A죜< M;/9UIDh#Vl6381Q/ {Y)Ջks#PG HWJ:"9e74HS_2l,&$Y RN y+N>AZ'>m^g`(DKWa*EpyZTccM;\Cռ9qeUי&M4bj9T ,yVξ*M@puPaKرDiզ @:0(ig܀F{'Ahb3eI;sw*ò[^nhRg؍"cJt gtuJa,%gֹȀNb!R]Q̀QGoSyw@QLhmEjt3%3 uzȲ/ќDd BH֟.yWMz{YU=N"[ǗzpìV?Y5+@d8q~G^&kLǗ$z* >ä2G^W{b3nA5hMX9۶h'-h;1_B\+q!?oCtxIr8!%_{iZtEf\ǑI"Gci.6E`1V RV?86̒B\T4Wkl\:㡿QUBc6sVC)HCsIj\x&xRy<9C!P,3T$܄l[0VKl)$7yj\ 3$ 5>9KxNB,?mCUqzB{$ I0jC{sKPTl^-DP[iEP-eHep6dk$r{V@y~N e-lr|- ?{V':_h! OL>S8OHb訛,qw隌b h"I#Zf "Bw໾3/{U=[TIjXl5]1MJ -#YkgurnGHO}`ڌAPkA/SC'JyCֲXBEVzTw@U􍣌+nJucխ'v |ȉ@ϸ8C:E&#SJ1: :zߥBVlzgkxAIڴĠWϙ+l烌 c¿b+vU"ɍP {dӖ!;C7(o;vj; dJљ=) T+s㺟KӦE] dEM{4*iC8'Co^DvkvZ(^+ pJ`:B vUSiq66( HR{ĈxٍlY OAC2O@7۽(g@zU S=8DIWhsѨZjzvy@*ΧEMFuBmBSD]*CSԗPR]zSDǧ-W?hɽd"2ּ>wH.g۬;}gUv_)oJ`S řOYENoN+WS" (ؕ 7}Vab!",i(0S^N2k\ND\[zUA9gS™P7 + 7 LgJ +':]3$Ub5`U]vI=ϱ@mJ?gQx U:1p!oPm(krKhd e+RZڛO]%Ab}M>v+\e)#,B~cCGu!)Jn){$yv))/LIרa\l(`Y\V4|j3t󺥬[$ z3Çxqps0lAE@Q)ϗrWK, lڔˆF&H0+2zᾔG^7(z~h/-\+5zؙyYWP6EHXλP93v|X/N@jo7!BkM]'BauCy`*-z11hBEVF4 FI'F>Lsj$Ie+M6o>j xON_^-rsvJa oD rVc}L"TOCj9 A)],|ou91:,$h%M)+s=$Xwp1o TIa~W3ʵ-.eC3 (SCy0`1jԼ*2^IAKZ~:! t?6I'Q^q#vF): dcqO><1kv'֩tYg/"^2WJٰK?pt;εæ5O]~-\^INQAt"(9s*"E0M6s &I1u rCGHQiW|f/Td~dI6SNgOXYZaeCm'%?n;)}{!Ac.Yp]GJ$a%8S$Y˾.i1"F4\mg!n60~n#z@C}=l+:XgHA DJPœLGInaOp݀^$M Rk_R[D9!mc';F&rS.g6)VYZNIpq a@Ny Dk?ѸNѭ(<(/q.11 PCONgEKz z}=gE!$T_ !yRޮِ AIYi0-ig.|f+C:K Z ͗AAz(v֫x*1 :=~ҽ+R2þYK֖ Ŕt}1Gmf19Q9w?Fvh.>rLD32@}%姚}T:= qNH_>P\hJgQM]HكxMhM`bspNd*CGݨAWa449$Ϥ``Oe! b}PL '|y<ۜQߔG]NOyK+IL41°ۗ g&zaݣ6q\'me_}ؿqzjƾQƙ8d_p.bLxnnR%Hr8F= LRyU:ݨ_ .ڎFp 5W E3&تaBYwMFf(]H,F'6*( `Kx }WJ4rtqs4 ^xM;j]Lnfd` p٢ts Oz99ʿy]ZDžHз( ,؇o~#u9g:[h%  swi) 2ljW rd)LGjr!#L"I?4ۃ6EG󁵨ΩZ,ykOdBKYBpWF"BTqfWF⢁^%\okͻ6kU[kZWE@jļӉxqH@Gu~1~W8"qkʕHV4ZZ}@l#EfSyC]+nxNbClb@XSJBVnU"{Tn2ݒzyTꗊ4jՐrKlMqK?ʛ3򞖐`BF 5Oݞ- Q`Nfϼ=ڇFRLcq9heE@l0i[Xgdp gca?;+#%>""93M@< Y$|:6b,Tn:N jQ ?Fm[>,{7 aUEIԟHenN\FmrʷWNYcL;zb[Ǿ~A9LաgP:X3e+>< OF'_]KAQ4I.S~䵍O b$4{%90]+^#qO{W~V 4{o y)$_&pEM. ZhLUW3]ᑡc̭o`h%zP0*%Y|@KxawPޱ:P79A?OvKR9җGVLIg$_vKAS^G:}I^;ş큷暓цuȔC842@4C4RIdICaҔ]?QS[\[y(bHb4OE%4qf%sKyLxW\VaOB*6=M?Ȥz mZ1qP wF'ffsD*Hdc ~yQXT;q/@`U[=n)ʮ;Pm8p% C>݄/ ^E^84ͮϡS nfS_6]t4WulJFZCher4AɀVs㮮uPejsA[gz8A ,лZӶdvQyq:)7Cd>~aT?1EfMn)Wp蕈Du-٩y)G}9R6}]5Ki}'*yLO,^ȦG BޝCS,H5gcuzҵ *TebUh޷)N Xv|L£@DZTU !1N߲ 9^)$ +P8 T=tTaߏTǵ1n5 SᎽiyY9XDaF=My64=I2Lmf 'X!DM%z"?_k Z"xj1iA^/wE82W1wX; Bnu2(deRiJ\WF4G[,.. <3}p}?]2W2?[=:4G|מ A\Dt@֠O'|YfdFCڪHO #}Y Dg+?NfuWG^= Zty!re{e$j*y}jUFԷ$ԧG+x-&6ŏuɥѭ¸&ʑY>#\R dvW;F6fQ)EkS,kʁTRZJ{d& EhtXkS%+AlGͺfR.prƀvQ H6*fz  ~}''e  ?Ә5p(9Y6ۈ0IGl!F7 J3wOIfYQ/eߩԟ>2,20.qcۿo&;>W}'!'(_>w#ʦ?yM|dR|uy@JNP>ȧlMM75&)&d^W:)Ma\!7ýp3ݢp66UsT"](cy4v&@eZ0^Autȵڌ%IK@02p؜\"Y1+s3Uaxs ~ ];ج\ZHyV)Q^GMۼ^4J+qZ lQt? 6+v q4 \,hy'T%S[) $jFrs7BaPX)nH(whX߭RXPϗ'zd-,[߲q=.W%gnR>X/f}֧wE<' Nn>”,V̑@V' 1@"JN$y*l#?koihէӰ7ZӬ@#vtbCKQfQrE/1أvЀSa;Tž?$s=Jq> LyIi9gOff^ &AdQ?ZP*#u AR =ffq،p 4Y6,>fE&߆F-g=&A8QC@ׯ&"XIR0+ /p'%TP̛b*s.uP:հ.idmm[k7$~I? z}qo$]$Yq+^ܻ',rN%؋mmNj6jjqɰBηbI;MDEķ/\ez /A PDsJXu=`$Lz2Q-3t\]RVG ¸ m__5?4fx;YuhH_wӧ_g X%P8p_WAJ7AέnNe,GLmpBу]l:υAYZ U~5Y tc"wxF+5{IݼkZBuZR[^},F*;>_Edjh'rO[n!l& uK,KXG#pf*90R&.hR^ޢ.Yn #HǑ|b7g>0R!5%{|zo+ 荝'^sv͍Ev6%bhbD5y @W:"B?\-Ct.V& ldUGF܍= ?&vmBz D/WؽkZhSqnJίKS&O# UlNmƏq>M'C]›kPjQdiiuYakCrB$Ee$S8īvtFWmKFSmgb GaQXAhFHeXggL1&|2|y,/l2?ו@1D借o[L U:ǨM{Q2Y~ar?M R ce~A:f9InONDAF!!Lwog~$(*i-đPM7Ҫ@i5O-cu4f6]I!z3ϐDcR ~i&Yu{4 mHrGZ(U!7!ɆZMPȢ`RΚ]rmBE;j{0`dz5mH"WD"}x~,[0 *DFivj5nK^r|-il4(h1X5s䣽 m^Ex =& -3Lvs1Z9+a7/ (|^/Iнk`yZ5l@  2Rv{6\EiמBP(+oAjDs4KF) U2٢E{d?p H^%rN~ &oC4 Z?#Cu!1g^sΜmrópp,*3~ 'b DVŌQZFʼns$x?#b!Jz(Ջ,_ogW?7l-V_m!rʮk7KmCzܕ{/#>͚qBy83D*ԘS֫Z+%eB)NLW@U (߲UV1vnҊ鳱ax-Yk fOYˏ?^\ qo,kzC?oϋvLttԊw-؅CنSsK.T0w m8Ngvhl7o4mN7:4GJvdC'Y)jAl"ň%fq+Q)j52-(wlY6u`fx8iJ-*U8rޕ6ீDXKÁN<9:5#"Um0 z\Ol4"b hljjg|UX3c&:1+<[NE* |ķ( }aP#XKɚ.wNf3~6~]zzaF7%.{QzUa#J?.gRe z>vcNg% '\m/}`(SFLS|f"7AM1HWyrs(X_herꅑ _m\f~P.wy!Zt{P$::Oҩ,*}Ji_)qQqdȠ'Ft]M~P>>f0 XctЮRXѠ6ǜ~^?a/;H\agn{3/{mǎ9"oZ#&Q:JHkEMDyJz]uYFo5j?7X>?2Eih_|Z$„)mEnJ? zs;ؐ2=:)_Ei rO u/.H mVcË;2O㌤R]:`U:qIelZXYNPfݹT`!T|K.W!\'@`T]7jih66LU(51bB(B*ăw*2Ca}&ARm@5$luXG%ٗp>_gDHg"dIL( J&ݛ@Uk*}&R]pPOMHbgJ5|+d#&2N2[W{\\Z(C[Ik0~ַpZѤ-4A۹y8 m%zuCNL??\R('eLOɮXWSԕb>ugqOsfof2>h1?{.-hI;{`ri&~EH= Mh %`p^ipLcYQF`^5 _.8?CL\Wxe -G~tCQjOؓՍ6KֹeMxAٝQ:asJq^K(`֑OPHMܐMօu/)7dw%1RÏM}pӑasI{'D={)&H,66l[Z11zZkm00($p:wøGrؾݗÐDd6ij=z GnVսS?ĖE6XcY2 J[0"Ki}(Ou|$Dn<p_NL^a_yQj[_El FgVbw'Bץ;2<6Z׶W:Uc_xM>l/e0sm9ӄtNˮ6lף}z>ChDaъ"e~?D oNSUy-['kOOd˟jj2s$Q<-B>/$;nߠtn$^& DZcES ;-t otJ )О- V1|]ahDf戎Y BvmQ+-6p赾1exJ;[VHKMeCbc+\~ kc E!kS.RFw#ޤlЂO. =zoUN؄ccN:"2iX 6fg]jaf}n|qUܿ)'!B@z}[ɿ#M$k/B3`p@RH9QWK*A\/mk6aEȻ@Tg%tQ󸟪{y+] (,Xt7̫ ӣJMe_0>h )$mHr"s w!B`MN3-IZfkД{*5!ضSx]!"x+q@Ý=Z>nTGR4kڔP+AF`*$4EGC0 )}f:( $vjX4mT|mASdQ}UGwݿ2]#n+rK0NJ.UюRo1,ƙIaO^a9D`2gK}rG<-ct83K{u+z**|]ES^H#i{-)[L(5M5mxX5sVrW,ڸq_rbVǮ,a!7ؤps' qNwQA=<S ).(u"g&jJe lB t9r0aH5]d/, % 'fytwҽ*-Ŕ[bz=ifߋHF4u ynJJ5b׮[ZI(t ?]oB{ ڊq-_YZIO GłI?MTȶGOuAH9wN`zXƢ۳U TLb_onoFQKmiopS rE+w~&ȃ6ˤ"Lh+GVTPź)GĊMF+_Bg0lIiFyֺ {{陧@^C`ZqXoiYcѵT0Ś e.}~˄*B|fE#i^%(J=#/u2)NE` v:BB ̙W?Ca;aW8Rj$.?9 9lqX{gc¶ -='4TF#.D G@Ws$izquwtJY}zDxL&وJxčCxUա/g Uؖov]5q"NW* K VhjGsRjz\~L]=ѰvnƵ20zBOfqJ]! 8cļ؉SO?!FpUGFtYi] Jr.Xkv,¦l˶?T:B\Cl$i>/}FT wsGx~Oq$HMtIö=,eOH"p, VM$H[t$)Jlc*͂8xl`mZ-"@$?H5ouƧ?4yYIqя\{q'ze0&(ܧ7Fų3MbǼlNqE#/Ѱ慤X :^OlH]` nrdxpT{Dq K泑#:H%E} ƩεZ0y-h贞 HênV7TBcq;PVظ"b3#tUA lչt U%5U[IǐhhCJhы8ni2x\ hTD]B>VZJDջ?V"s`7bsiz;4ux DeuG|kbh`BA4٣ B5ZV7VaY[$mR ̘-80,kn=:o0魢gG<an;[.ef$E^%Қe@`K~ 2zm"55P8x'>CLBMZd=N)V#_oq0% $Kqbr}£Uov{/Fވ[lO}N P+ TZ-$9rG\ Cbh:$ 0*Nە֭mUdGO"zֹ^[<d5я_ӕP_Lef,L6rUϯBs7H$w_ 7_3SO*Xm㊸ӷPEwf{>Z8Z1$VrRkPJ@[cvp-4ǰ=,'Y]2@w7,ӰV##ujߟL!X3P2XOb2Έ"6v5IDE)n*@>.v{#C?%+t[I u-Q ,KKTZQdr- } & 3R |tslp~G8iPo?kgj*)[ۑ_(M[_^YFyKFiu1R6twrZ 2ol,!, a)8_! @8TEG.9j*L 37pBF))FWyG_k>㎨D UTSfm(#NYi'񒘒4?X .D1gvl_Èqﭷ>On(:UGꉛ$+ je%`2%j /> 26V(ܸ-?B&h/K,9_?'{%;S0‰*qs俷H_70pZS h^p] { 4At9iGLZE(1GQ"чkVSeqY_\q2fe)~i$,/w7M ?e)lR¶))}*FGG`Ou'r$4ebX5\XC٣W 8cK-:0dBet.^ l3|fy$S~IЎ; DI .ӃM"ʴ@J [`}&R*&_]\|Rzry= Xpw[Z-ҿs ;Ke0cKp7Um(ƯoiIk^|p/LE.rgtBFGvwM]Qa} P S=@S )_BыIj7}&>W$0Χ{KƮg\مrl-<>wwsgq,f0#MJ1H!x 7T~~FϴowmmS$IdR Ԃ^)XbKm=VE #s'nBLO}}6V)$Q%uQ\K5QhD< īsm/\`ӥ ^KfBVKK $;N:s8HO aDֳ֒kR/q/61^b=qH#QYf0C;C'{M;/6Mlec5eԷ T ;,i`q lƼ~{ e i6THERܦTtԣ_CH_ADr结iɌw{#څwRA8O᪸DoUZ,>Qgf&jyeuK7\4`m@F0B0EU|Es&PX6]V\o7PfA/dmk^ 5 l3KEKC m;}%:(#MNkjOgc$ENsÂI$r1֬"V_sE#A|maPt[x ` o7HblQ Lz(n9,ܥo%K" ŽIoL6߲xISKfتLh7Wg_'.|'s?k%_B؃-@nwb^e؜cx{ISgr\QJ2#Y ; פ(%"N]yٶEot<_ "rr oStG_+EɅVȸUGt% HV÷U;g*cf3+!Y.M[aϴ"{t* {vzOq=Z yHRsl Ѭ/G>BuC3cdh&0d6qXΒR@{C 0<~:o (XmtIhZ3E~RĎEW2[\·d*uV]ؓ fq%n'=Molfg&J&'؏פFP "%lsC/?z\0s N9gdX$*"w/GPT{as`+А}n3TXdj`fiH;yĤpeC@LBh#8,6@WZ[#9 R~T]WZe&RB,FCm%1\2ks-j4pgЩۋR**d?j\\AfOU@D.4=e(Ds" \^Q9@#PU9 ⁌Vk(ʰG^f)e)9Z/n+_[$Ys~ʤéx>U2{[Bvl(WO 46[vZg凲mb|A:TT1 oOwu)v }{J#גdO6ϥ+zK%.Ml;ˍ]yC6%mXdy`%G >q%ZXtn9>x,wlf7 +8q; ;E=N_Kxx@Eu%Z TVLL"H6^5z CSHC-1i}컟Jkua^  OJިsc㤠֚Iyg7i (\k&~H\XA3 O_34ܗ{rǢ[sH鿅2`s~s5G X/'vGpɏ+GY!.LvՓͻs߾Op"՜iVHI3pM 0[J e|-`UKW1Fj DlZ@L>{ \h~8jiW U1#Pߍ{.t^Gf`[fhm#(#> zk_#l?ŒD,k'Mnvv*%PqY7,cqUF)JBTju.duegEhz|= Hh3٭u]&*[elfn&k_AnO7x4'%'զ 0yQݣDVgq^'q.ê`q |%fԌkkR(sո [6leyXȹ>oH|h(lXArOGXfB?$.d0;h[f2'#FcXO-=:}Iҽ1Bsf0؆|kQfD=nAV$_ H^jGM52e;lALl ZGvEYIja¾8?JJ@<_Ǩpj-떯wy9vXgTn[m|&YOgR Le.diJr_Iۣpځͻ-=!_J~9:D׶۲LלQayL?vcD3JiFRɯs gRJ|[7mئԯϰfM&t\T%ʲʅ*]`0 tUɾSUvX]O":xU"yH*{[@{HSWkZtRh*J{(f-FgqPSACnhMٟKF;e5(sYie΢ G=XZ~cFY~I| JVna+N71GP50gV7E2GŸuDjQe kVjdزy$c_m=O_(;q'lžkVe^[dVjCsޖlC5rnl7v ~Th駄<ᇃÆaihiœhZ%i r%4l/:>Aၶľ[\BLY.To'HH!TY"uriR* ±rꚩ*]ZO Jtp$g5|7BFGEPR:L1Tzv@4C[ҸߚV1x _=zxPv~@lHY6 W}cd^Tɠ^PĚ lD:tp|ϧ}}$[>*4hHNI񍁶逇tu-8w<]bladin!*$a#ZqgC8z㼾6qVFp*,YLl. B:PAS, 07w/ `#%IQ7ᱲ>ODU{xvDtS1k,/q+M KUT%YH-|NͶ% [])/no!h}﵁:8$_oq_BuۊzMaܵaQev%G{IIX4}YZS#VE9D~Tڛ[hnIw("GNª Zтr!5)n JKuLҹjt‘GjEI$;dcFhQ3vY#fV!\mpۗǽ+XroՔYD =GvUw9GXE[ o'.Qș~.DTW+G[Yn]Wf2_ʱyeo;L:U)-Yr 4mX{l$RD9ܱPg6@D`:/ZoG7..īgJHS%v=QU7 0 Ĺ9:]^E!m4jCtĆD1Dz͚$5@xBkuh!=՘TqmBPVQSȾFJBb,j_, a dA L 2%h=7(~ni[{<g,I?oA EJĬ#K@x[jC߂Kn]QO[,W-MVDcɴe1gwC-ygc5a.V|Hk0'|v.|]*N0yDxR#ڦ3V C~M:5/}a|I'ӝ`BR{^"z[pܠ0״HE>y_Es [UL]Y~ƉD~p{MK+2Kk8+H- ^d|6D DFǡk;&F{%x:fv +̿ҋE#׋ W`KNf$AJ.59%oǮcl.*vm8@DHqY!îXݍ5 11NPUZ9N5Vp sڮTN"~:7G>Wbp15fHrHp.݄mqvF~Yڎ(L̊zfDCM&(lP7Xc/2U.-UJu/2 $Enг?ոKpouN\]ÿ6Dn(e` 뾞$sg5/G&Vra3͐n-o~PBجk7@(|!ҸDMC{(X$P !rۆZFC' o !T2n-dhȳWW0{ˊh)ih$e>) ][},oVA,'m~CYtKtuodȴ%>xzKoY(R7q^oQ^CS}S/^MYpfGź$:w _|k6׸(mKnO>dL]F wq-ins9HPϸJ [>\ hG+02&>g]б$N ęϼ٢ut"w0QqH`׍ rzH(}ͦ!x,F:M6o-|6[ sP)7b%]S8?rG.PIPg`0ڽ}e%2t~BG99xPms8ݾ%i?Qt^DQYOHWHjHn*^oCev\&Xo2M6 RŢ%>gmQښ%yiE~ऄvK d&W=VΥ4PT:i o-LulcϠ ʨք!'e9<PiC;!ޱ\R f }"%!T DiSVug$]ik>/g)/j 3"}ՠO62 DD=9]B(Ϳ*q;l ľLX?RrouM܊GN u@5q[#oj玲gGei0Gן HD&sP@YN<]|(L]p&ˤQ!tr F hntL _DekڍQkF1ÁI:)il}qw~Ҩ s1#!)@,?mdcjO#^ki3Pi`m= 8PbȇvCC@$nhC(|Ԥ{ZJ^\*61E!Rs]Ӧ'BM|u4R}T'4@ψưh`7-TS0f)1B1Bxb`X4^9`}$Bk<.)sK{xG8hF%\7jO! * mpl#fb1Ղ ZƥDFG1bt(’iO Q:Q7WX-z6rwD#-lLCmy3ܶ鯧܁ xu' DX=?䧡QS" CS1ܡ\U̙Jjp|X=Ss8k *K g_BN}w t^OC'Id7QLLQAlqo3-P&sMxIl@fR@DLN!9wP !g[(KTMcx1Jtn. |OiR+v{}Ljݞ igcr&&zvHILD FNCA|ؗb Vͭ ̐O +4W)#iN ={ҏ,@t5$fխslCaA dz7א>RZBmbJк'GTyHHp\ЂaDg =_x׬T/L5[Zs#()zA ʦ.Lf W );_poe,rZQ|.o̬N wBEz['p2M*^]iߏkʰ8fJ=X21LcᴵtIDE\VL /[=r_"[UpHݰX&ت%v)SqGЎMM>n" E9FcBy-JE+x㖉_udX0/\2ˬQVk}6nqUȹtWZRӄ::RM^kY:Qmx`fU_3nPEo@$1SDVŷW+ޅmgUl&߶%w-V0MαRUKj`Kw 10T!O1S=BvS`<ԩ}ĺB}gS7Zh;'#I uRpAhs28ArXhF':܉(A#F4Vώo$/cƈIS, sQ.Xu,r m;^]h7eɦA#ϔCHʵ4"BEC=>>$i IR6y)SJH|Lłqv$y/qKod|X!Ml8qbnv$G1ꀶ&mt &D*>$!m%O.tI RsRnSZV&;4y@ ER<f/Ms+k0ȅ1 %K@@{`kv6(!W6o<:M PP՚8F+5T0%rD T a}~&ddvBi4#U KܙA>~}8Ή]Ԁ-aUH?J)VnN4GB;2u x+p4 VG+ b8S~KյrA+}vIz>co+礠n(IwMLs< v!"6ssda_kD%ҏ ,PКwCW90 L{C Gr\ J-\|K ZL<ق6]+9sJ[ p G#&/SDtTgdjiW,:V I)*H`-ȫfB`N[­V%8I"y<"rL0wm˄4sUG,on43ɢ%)R+Y6JL{K~/2t'uo"MoAp0-=ؒh8Ek"!= |MwSX|Wki@骧ɯUaqUyKgn[l(L(:M!<,g+Z/d%:D[2wU Lʶ0;AnI UG: T 5q}YIKjWÌ_t  h3f>3"x1~oBv-owPōBq@ֽ] S8Kz~~7qbS"qK-5gvO# JP4Xu8"=O<@ftTZs]$AnGA cQ)L'Ń1umWq&;__e3ߞqd=J@U0흭e7~yKޱnȝ5>\õ2O`ĈV^\J:Ma34i#b%*Zu\M39[@P{v7ZɂZ\7lȀSrSWMTq |pDs7`h4(`g ([LƌlGfE*9΂$sxm wM٣,V`k3V/GKV(7ՠh̷k81.!,{i^-l-y ɂGy)Y\`vσ,' $y:9I$ä;L! -~1mWgI&H2\mz 4Ug}Tm^/L?s̸@5r4Ձ$]H>DŽ?qUJacuts ZNݏ5JMS@P" I:QЋpkw$qyBNt(S5ʦ*n2bWFƧm)e؁av| :Wt~N"GzYd_Rt"Kom}qulWxΕbUD%R͒Ɔ{B{8;C<_UM/E$\]}wiaYx(夞K T 7Uk=YZh7K9'C/,K Dg-C Vdjق\e;7^(է[yS2k,m I Evrh:c;D:F0t$'&( ϮAJW!Qp.yﭲl)ނZQ {y m8jf̚yםkYdz_#1\fYWD)IĤXM/׹,|l=s 6K mRƯWP}&tĒcO(>]( g+l$S0u7wcME;ur@*覂v-ާ$|RC|P E'hQtmS#v=6N$Nkae4%(lh|Ca{!FCv;3 zR m , 3_> 9J[u_U1CLfO1 8hRFڟ}6T_@cT t1B^'eؤxañ)wH`~UO{&8?k*5zJZc#6.FuT]pvp,fLWk!lrR7G)^tjFqܿo㔃Gݴłl2HDH2oczdX"wGz~oZU?K<ӢnT٘p^Kqu V\tKeF_G賡Fl4R^5?̍GWirX JXG'?> sD9OnɲT.,@M(aix.%0J9d\E{ڐ`2Vy`/$99;X؄u`l`>+q[gˮ7k7zC6uM2g|~DFWZ{T/jK~kF0iUk]"L/_Ѳ庳 U^&B귅^`&O*9v㓯RZW%gv4XSx[gP:0M~w K !7]4g+@d> sy4F])+~tW>yI bڙ}Cck{:N@;(P]颼>Fb'qJ΢2H:e@tY˫Nk`+&6{"S͐D?F_KC[M;g(*1(gO7V1MB` A&t1@"[ĕX\-Rx@ئh;PhM4Ys ݫ~3KP+ d2;a/V^S^㱄['~ra;T@Bgu.2Xz8@oާ?4hiֳp+pIFa֑XdA *L6l[_)ߖXKv0oAҲYuCGrzK^4|)z~e>ib X`klGŠX5A[kC; #9Y6XsU^A2ផ~qT lGjp"h,hKL$eߣ, Fw"C0 E~m W$bAL =(vWԮ Hom]2e(&9҂EoDx1heD=kodžּ VC(~ULT_xFpKyh ,]졍+})sjtͻ; FCKW)38wB o.Þ1i`Mj}SRqU :sPy.!P2v;=]hfUF䊌gv_[2 *EF:ALjsXo u_wo~zϗt׈Q,`p!M6.U g@Yý e7x4E>j9X+ցe/4-?e"?$agBL$@&QAmǢOO-@ynSx!oSQSIycf87J'i(TV˞mIʨ%Wni|`Lf#nb.xn8BU[?m~IMw?h y ǒq+2] k]q4^2aUOyҜxw/N 4~y! LO71+(QwE`YK;`68*(uڅkVm6r%V;6/^IC4 %QgZZn,'v.{`Wp{x8:A[b'J:9mLZee֖v􍉑&;߬\w`>@<(q50 sKT/G~%v!~KfjH]㩢^MoT ]B҂Z5d\Tp9_K Ki5A-R&qa꾹q􎭒B,a-Iܧ34NF.نdjX#xx[ӑ@afX7N:be]//5Nw,V2HPY1npd=ZCC}=Pvq^ḚkGae݌5RSghǍvSVbF">yYA_l'g(81Tk>"f< {ѣxAÞtqC*9K\ӏ̖dtƑNTbQ.`a3sQ0!r}8vai]4SYln ]Hu1U. A&udߣht7C.~*[|/TRoi Qƅu'r[;f#A;~8 2)󘬸'Q@glS"}jU`a8/צq_6fPǕlExk+y>_Nda9bWVC&%v!}Ք3J?ר=Ӵ4уND Dt\o\(O^ ͼ\*<_$b ֌8VQ03r㕶W4bzX2v7Q^r6Ӗ2L7.\mDNx&)D`^.E_93n/aps`NUxaqzwऽs% &PHp#5J3 nխJ -$o|/dZ;Ml.|֨J٘]/Q/u;0`Gy$ {t3=-6)E^VWD;xmiIYty8tEko~uJ3Dg[ RذeLF˨cҙ ?ArFO.4?fXP*C~#jGhGY#):n[m3n$Sӝ, E֙BYolIӱH@ J ֨H8hILo#p $o-(TNTMS#/89EB,2m82a k};G+W)8U~cx<)Rgl8$O5^:u<ϑ -%s4.QF^#NBc @̉Au.tlͲ0>ɾ"vp -< }ýo^=7I ͋= xK 4 8 Ŷ^8K\Ov:WȾ^(# Pvd^s18Ꚅ6=M2Q9"9fT7H=6ŝ% ] b~jdzn|~Eu!Z'6 2/OtJ;QގyE࣊8ҩpDBH=DZHJksl6#jFՖ 9ޚSRvFP#X`8]hjofPmƣʭWLG;atŠE @t7ɲ"V=Ym_nysPQ݅{/+\wIw Є7L_ gT3KJ&DWQ^l%e1]/>_c-h>v,R`o}t,m'{m~a§t$[A3LH7$h޿cyё`@ =[gEm -կW F(yɺ&hqK$ &vZ뙹 :G7n^/{J^iqffH,I^/X] hqΉC{Rhw۵;oszq&=0"!R̵`MP@3x݀*B%oE8ΙpLj$@`d@1u6VTA_kœB .x}K~ZYR8}l)c[)qk bؗ3?cCzb3;r4 t:ν,Tz;sON g4 V_B:i,%X>0' ŕ{I1$7Bw.nV{]0M07{[!&>R +4;=^?GxѲ)pMSwgMf>[P~E暇̌CFd@` r$]֟o.~S\ױI.P6m? h3MY۹= e_5ϻx(C@U0R(L~țaa_Y9)(=В5^39Nߺ:26ʝji4rL5Gbi#h=j| _e3C`YW{!aWzaFbmG8[_j*7`M~J8;H*/27)4E[`zh>)OJWhQsHWrx2Lay1CN?Vٜ3hGKğ8i.vw? EA0t^FN}DIz3UόQ,SpM*I3'偽ʉSkNg hw5[]q^l=g" =YrRz{ dހ4D59oHqWGaH֙AYmTPֽY1:!Z:U3L[ :c.&I?K-p_tx$*}/E6˷g2nOFvQ喭t";O…UW%q-JcWrkjJ"2m'a-o~7yhԊ d$߆HPeKAJcm}:(GJQVR^dšw#ٽ:f䨻,&fu}{7k[lTP-EɇI ltpi.b^x4R<ݴOҵ(GzX5 [(׶f >cBG#K.zCϱ2$3rr@|Չ nVgR],!_GxMJ ,}A4'gt7iY"HLa]' w&BvQgbBt/B{H.Ga8®z ]~֩UOe}<09+LL+pEB0(t` |"v_.Keer%_ٕ6"L S<2x1+wN_gwۧĕgnWeZ+_ZJ"7_AU5{Jm!?o1Sα]kFVNCZ˽c.ڦAu#cRjAxAaRVsg\H2IAgg3Q֑EFP-tZJ[ͺLAA5KMLXg=1_ro(oY0/`F3{GK2KkݼɮKUvZYmދ?!xa:]{ ўjCNo,UkKB3]SB"DE7E*FȀphaaLԕBWִ2;xPNd"y\:I&mў$KRNܜ ޮYM$o%]+DG?ݦlbE^]s ?`JHQt6U~&hi;5W;Nܸ]fj!b]$/|xYQszߊB'^ z!-gl+,ŗ7S屵T鱡)R%vwؗh/Q1 (:8q)w: ~A% JRf ȼ"Eɔ6^DQooܽ翫z00IveKSᯖ3YLz8-=a~IPT ->[ov[LClL;-H2# Q/y8G}}9ZQ^ >*#2&{ŧ

i5s܃rf|KQO΢AдBӤoΌd΂S{Q/UlLu}g_fMchZC%|Ck_Aw;|b|19\Fiw(D DǷ䍽qӕ~p5ˡJ?3Րf(],MHcB >J]%4f ['4-xmajdooΜt &POx Ak|P[JH 4pdtVNrR7hG[ AL}Qo\$Ý'/B!qT!f38,GӒb%O_t@3| 8$E)?Xw #w @Fm35omJNdlvJ6F[ K>E+bݡdڲ J1^M=Vv{T}gmYԴ.d`0ͮl!*-t`"ځ1<>@͞Ctx2FxE5kP"~>MTӑު^*?N>a j$n7jD˪Ws:r$Ǽp[IBIm(ȣ~-BNٱRh 6r ҇޴p{I)&Og!•Dʜ q&nyZ@!2{ U!!M spqsP)bTKmjiȣPh#^ .%ez) Ń;κ̤#;؂l0@zn~yOB %[2$Cq\h OgXN~=h38U"tObӁ.ajfmLB)7JQ+cw{$-_p)zb3F*MmUr>}CwEr3jeu`jN+]TNn~Xz}ľxb;9EFdrw;O7 ܿn:7[Km;XqH֗-N~ #o 2^HJ.:Jb:kƸ Lfum\d򟞓2`|S\' ėI*tU=pG8$ϝ?8[h41ha=[4|` L٧FBOFq$=9#rN|g3(LIKpf `6G qa?"3_I  YOM9b^r![#gԦ4KpQ.dz_R * D/Ff\:Y!"Ur[4l[U>`W+jN뵐22Am6Nqm0sRq 9ݏ?5I$S0D;PT#yPGEsK[`Uʽ )˧QcX$VPda yk>W}:~o1BF<88˗ 6K8^}F,VSW˟ƻNܽPD 5>Xw7hC&\u$2JƛFJɢ]A/-YTn|A˱\7?ի+/ yz2A4E>3lʏʖfq:  VRՀǨ3}< I'^_W"l}|V@%nMx({sCp+lA/ɠ{>zTЙ6Dm=oriaQi~"`Cjd%|(Bi+8ԢE&.faXhR 05 ֯(mş n# g¯;D6Sm9<etFA@it@EJi_G D~QPDⷻmKF3>`ftcdHD$ۥ*@2HKMŻ} Kh_5ONjX0z[NvV>-14Q!B7#Y"YblWUy=<OkgZ{^kziVk+llZxP^M[VLotWG1̠ + `Q-W}6198J=H]nv xRbVN 8}DN) HKgC6roF]g;sޚ]AfJ RXct KAI߉ /|=uL\: SG3Phn(ɍ+Ŕ mFIF_s Z'@$킢r;qs9M;U=[7kqPm#K-O Pu  ~r"ZiNRĢIN|qvfRIUTƎGS"ܐfu ܳb *j;xrYgy֜*>R`;R95B^o :y,1'eӪC!xI[XFnEَ7w00c>)!YWr)k}<M[nSM<0mp3cnF~ؽp|P%Et %>DaLɆKO YoVMUy"`{|hTǢ(ЈS/ U0j,Q+jwFU1MS] GEUo7J3BT!h |x)Z KEӮJAMXxVPaoC]-$ ZQaVyC,EJ*єt09-IeBmS7, xYu|x[;+>n p|*XiCۭT+qOJ5~Ή9(U5CTQ)vhNck]0bB. <)pb™TOOS?"|c:R<]3}DZPBM}0tkǿJ<9dy`:;4NF!'\i+79yE [UX CIӕBf{KFֶ1pkГU[H2[঒@^׋*B>L*2(rrPEavgZC{ZPw9χG_m+I@TY1 ei6w5 v|\0t&'i!´բ3X_Ss :0fhBY}+ȜNh7(PNNI⼿7z:ӔSo.!q"R@qM-O ӌ01Ea|ZjmIkf͠pˍD|=VxzBFG )ͷt>q 'V'܌l,{Eы,И9Rqʕ Cw]ٖƮ7H'?xf= fTtS|wEZ~6za1 j?+j)4MK;վKV^bG_[BF3P!o`^{z'&¶R,-Zc՗tOY19ss[dI^Sʃ,BL[tt,r=\ )-id#ޤ?;S߭rQ:sڦ9\i bb ';rd+`GH3Ë͸׉y֗=6aY.`|'M,H_M&ipL1\`ش>6`b[pAF-`De}+xb0rGC:rY%W8xWv`D{N%Ɏm#/0jbQN 5'>r-D{tr{S!4M@q7M's18Ugߚ#Y_`6Np4kˀRk98{7Q鰷Ga>aUΰhƑt ː }\P 5+jGnA86Ks$@(?-])Z* (sdO 0s2C[ԏJ 3 1%r O>crɳf]>@h}r  #̈́ |iL]0`:Qge(aNևf{'ag6s(N|D au<%~r)Zq9D2a(d hK6nqw>4p}͇U3?y;SsH f4 5N',L0VG٠ k§ϙѨha`17_+IQƺCYaTߞ3zw0VMT*\ϔK_LcJ+/a4 4ܪz Ow8\૶;Yyȫe$BA&U':tl+<׋J]Vi|RwlˤHG..]4no7 ۔'ա2 Zc:/$zIĄz3Ki~qh~0Sv Kvo FDd7] t*XV?Eb5ѹp Q*S[UunqcURŧ=~˳]"tfrY5zIGEM2{D%Ì}\[FafLbU $/as O$`{[Fzuowa}f-x-US_ԒvP,RzŹx@IxKxg7lj7e6h%<۱]A}9lE Z>e ؠD. tR^篾\u.&IncEF?tj9&"-YIylpI<>WOaŇj) mt[LR\ ޢE\^M7roM(tN˅kT,cJZZӑ0bۡGK A!2">gi1H|;RYj^(@x C#=c yo5;oqJUfh>>E3zyvD@ rtWN/NqWl|XPN殑m wºaYMmңh玌 ]Z2O ~DĊWPD B.5M^?ciUq.vYmdUI+z,6D apIj/C;ѻ,uHT1=uBu;{q ꥷUZi}_AdS ڍ kweeۦG0+Y^=hFGjyI lN:[ /&AX׹LEXg[O!ͺoQ'j |QB}#9>\`mO \ge!46ȍsxEhcf(3>c)C:ΐ,WjC|,28GOoZS9p)Yj.{^evM7" 1U7suz!3naD HM=bkjP+icؿYy+vyk7PfbSxϫ'bDK56X#;hÖ:0ֽ^DCILt]IKmYpv2 t 4n ȽڭUOD1XSJ%!łec :;mQ+c=.\}qjUw>P1< ȥ9gsU-Sb5o*NuҞeHiFVǫy dTHH !׫#((iZiM"j($mg,rr qE:"pUb=6d@8 \煢FJֈ꺞_ D}Џ+1 3a'KX +(iwsvh::]nj9o χZj|dĶD4Ea&K+Tq A~ud9V :)0+u3$SݒkEVC)p/V(css{\C}W5m,z4'M;H2oP* 4T\B7q JZ^Tl!AiZ)__FTn611tAptc7wHX鉾fR9Z:RL;Zc,nK׮|ʣƈfPJc%#L$FM}^&|=@^.el720|o c/rMP$kz~DXY?<ϻ#/`d?D^V/ jn*:zvy}M=~tG% *kNRUڡQF;3@͝+QgChv bPo嗉 @@<A/a-zrŮ(ZH$6]LR7Vw~;pn߹+-:`OD+Ttc_&+V^J !>JWGH86iQw8;;zn f6)s-́&ⲝJ ؔ ҉28 A"|]z SF>eFdi*\gt{+ILkG?L,cšٰIޚv[_!O_FsK[AT2_T< "7:ؠTArhtһt2& fuB_dP"RG=Rꑬo?>7}jRZ'Y 4&xeo|Kn Wq ڍ0qoxkѾ-嵐V'3,FEtF.7*ʠհg@"cW4nW(| e ‰lD oYm&Q*svTTTDJXo_Q Bϔii UH:Q].K7uKG:\ÓGjcmpB)GlDSolB|ZZlBu 9凕 'SpYSRIPGk!xe`:mɧa-Mf0g- 4XK?*$iq)+]ꛠA u<)pptu%٩ŦEraifrSFIkoOwTyE"OOhl0.\FKcٔo)C]p+#c}:s l%)Gf&44}Tu.HϒIbdox1Z9BsݩmZJ\*{= 1OkȒTUT>) pڮOl8~vCnU2ǹesTF^8ƽޭ_ C98(?W5!G 8mVٙvwWiT[?GNmqlFSC' ʷa`9elWxD9yX'T1eLzxEZ>GUsnr .1f>>+ߘ0)PkENŜ))fc{7ʋF8_/aCJb"a.4@D42#y##DFYtr~m'<-G]`A7Bp*H H1e8>sc 5Z]7Oq _LVP<8QOŸqEp퀾ԅfd@q%ÒpdqGV(!I'Au=+ssw̌Xk&siq\S̔vP,n7 ±E: j{JCВRXYEEa2^q@DT72Vsz/ugM P`$ieї_⥪?\lUf}I`P&8 Ra_{ʧC].yd0Ffk$:7LژQT]Byʼ3ʐEBZ,i3}i~~tl%SijM#BlUDV~'4!mER!R%c#jո;^.1eiuyj$)WgDbG` 1ѡ/d?b ̲]&e1 OMx~i "ŝqϿ7dW륌` >;U/A8q8~jm8W2A`:)pSkjbDmcbx~ L(pHa2{UZIz*5fMk_GܚyCj{Eح ڪ0lCc{,?BFVNEƴ<G;Zh NlOzS_СKX0a;GXhZg3{X~`"e;mχ׽~BQ  7A0Aj>HiMtFKd*qQ|Q dajSά4Ġ^d5ee(1(%X!AN2Bq`?9_~9w״H=yұ񝬶POvi1 m-GWnW$| ecxsT\I}񏚁?8؅ɶm-h>d|+۴%n'}㊧s4>d`M6"h3kt@\mͶ};P.aI*BlՑ:tɵ1$]'yyZ)$%[¢(86zX/K1F3um;sͲ ..:^#d@^EjuP>_M*z v^~bz{+EvIư[ڇY3$J;{YZvBۮrm/{ϭ\. Ӭɒ6D'CE;pZCs^X/v7 H8L*n%fgHv;;oEJFtVʮZJjJy˖Xs%|+"qL(Ƃ+?zb1eoN{_J\[F_m2x#%}}> "Z}7=]3bX ?VrBݤ )ݜ4^{n[e絫ǰ- ,:Șj! 8 E1 ?a"P>jnb )bPV=9L7$kdzȹ0{:Qzk&QvHL4"~ДnCpK$P>uJT̎5pb^9!硦mmagk&MS]i@y!+t0%$ 8S2S3AשQ?}.BPRsM!Xtr&YS5%ԣ)fhDxQTA7 d%?O@;  Of1OcxB7bPMZ=dVf׼ VE{d0n/=>? ,L|T,V7Wx}Wu}=&?gʹە Nf\/tdMHjR;#tѭ bWs`ZȬldcbJ' ,E٨z/WU:{v|8:^}ݐXˇL<;q n6\5gj_˙X΋ yBW`W)Ievb Lx9{2!ܜJ'H΀9msrSQ;o ,`%D]1@IPBO% 7ˉc/.t_(TnrW~j"{VLk/E]Ivro 7ulYk{tc[ϻS fS Gfe0FGQ>,=U.Jڈ;rꌈcMw cj(h8O}Dn5eXRr'o~B29ƢՉ>H mr= SB)xK,#YMOa_S,gd+_;Gm0X0e\8}یx@% = 1n|t"V+Q.h̳AAMN}2l.kI\,ve\! \?GkHDzs~ZMw,UZLJnMMj \1RDOw*qq^WJ Qgc{( vv(\Cɨfmj&{%l-q٠0 J|Zb]})Z 3hMxɪ<ݳp(@%`"S{믃1rxèU\XmeM 2ׄ ǬucDKRGknY>p ~Wa|U~^'FQozN̙f2萏vϸ+6sޅ  1v9| \F\ɲIöVO'( >5)HW{_G\t+12MI3b-Z7Ysz<:^_yr2`PnH{ jɟ6<>x<+]#>Z^ՙĻ[5L96N 4l p[%`Z4"d}` D 4gF.] gk=f2m89X UT X^:f=5]bAkc`Ć) Oj)NAn{_FZ[f_w<:zMgqDfq27I [U >ڛ?eͅz+i1qT9mk >fhG M@"D$Chhz±럈O  n"USm 3hǪc t@J&wkhAKA#_*H>чH_hw MjA+w,l5ڍũwM $QVv}j7Pqs7Td[`(m6sf~õDʤnʂayF? 9<9@]4 a }+OR PhfGG Pt\ |BL\\6ި&> d(@n& d3ۅ8`ss.SM2?}#3#((=a)A'v)Nk#@e,#2 rDpUձ8a뷐~A#w JF!zܡjrz+y6 +R£bTLSJEZY]{d$0 ^k Y1=#a|-]u6_?XP+>Pc4=n*IyD7ON%g=N$; `[ ըFZa- pOkrZ-.]$lL]sGqk\9zt-6Ggt;6OgpY͏JxDQJjc(p^L4м*'09rγZ_cFXu_Al¿c0|`1FݻWnSQ"j2=[阓8t6ժmEScU?ّ?c)BtD8'|CiUGOvO}ftfsqvU;1Ԕ*S#k@ P7|jm$ =ڇQmBC (B^->KFh). l;T ʊ6˅S8WE)6i^}->thRc%ߙԳy\>[n†HA&xn{|W 33"JZCs.Q0kJ[m Z(~@ܰYnlңf{ݐ²(0:P'1b4 xU $oUyY^b^],6O,˪u4f|tcTw~kd[!Re|\znTSaMG%ʜ8,UPN *(/m8?7:HaB oFw]b4zAƨHyee~:j z=U`(|I ){mL9< I/-(ٌck9 (s<و_G oe{x"spB<^zpޙZ]^)VlG>7{N{[+S*L#V@q&ڕfq -G֚xoT5FAP{̧d3PUxYoKCzX'R$2=jVW8fq|KԘnY W &!6Y-5-tNE/ l'ޣ/^P;g9@9*"egV:(̒#%dJ[GB*&?l%y ;Q6~N#j9},‰1wǀCnW?="ć2aEU`TI-\-yD̥*׵Cf?:u-E7yiN|!kmY zJj˟NDi|~ AaEoΕQD)b^}fR9Rdb{KV zx;ܮ'xA-(g|L_c [11eyx[ v_̼^ ? 9 {~VV/aˌw>5g,V o2|OׄJ8Az-Ү s[# ]G_5Ns9uͮP:2~_u` L{迮i@mr$џS/IxOj '$oL߹mŇ({[VcE б ` WhȶTZri"Ol|hs6.簾=xGez>G"BI ]̖%VYĥkiz8i=nobϨG:,|!-o80&\e)E:3L7[ik4F/DV3>Wiw{rvX;_,mJsC-)C68mKEM )Dr],Pxs|6D1Hݝ"h3Ut7"eVY[=DTEȢ鱫Cjb536KYJ}Tu2O)Bb `SޝO*,"p44S 8(j Uģ (AhU#Y"U3sZƤePVA*kQ*3* ?#,6@QtFv^@5uNc7:eQj v CiӅ"% ~sB T/J)O!=~RuYOC )r`4s* ^*eY/cדT铏xAju9#f.xF aI4)S4JH,֚NW:)1ڏGT_\Zsh\ A-"mHs}NsYwsaRy0SH\5DP Ǹvbב*Hw<'5[BUfB{Mv5ZbjnD;[{vsL`z0A6KbDʱ{1Zf}'T_t|+L)FV<ZM\1itw6Q[6DsމkXvپ \K hs+6C.You.Rbݷwb^ BPTz/M֊q40ԥ5*R<%ai}tŶ&&`4hgaFAlwd0\0y>2(,h壟 R]G}NW3U$X!z/|4rS=Ea2v@S<dѻ<pAzi jb5\C!vYn&iLW eD3o_lehMO?'{j l\Kdwda"u X"o|\Y3J=gUyuk0J3o4s0[F] qSr1U]+>iH& M$vr=Rp[9m|NگL 0OLg:s81$/D q/l@ h3/G>-λٕ-]Pb;@n,PK2BX*Px450: e~R9&r5$:m!D|4i~J3.XgV>ꁤdO@9:.Il%>Ud]:),81bߪeay1\Ǯr Z7r{j|잙<' ަs'M~C$~MpP\q`mTP\ma d3i&! x'KT˔2. Ԣ+-XK] )9yh, &`手v8.^m54QE~藂&K%7_0D_l.Ƹud,NeNw; |Ip,>X"㏸寍D#[[,L7vOKNXck۳f=1FUqXrPrl75Ahi0`kKU3G7G%[*-HƒB33qP{B==%9@1٦SZ^FN$Z8nuPch׸:ܜ80V8of^YZA g *F'l](&tQqGAq&/,fq]2a] Jrn;𻯗ww. z\Z8#FDC%vOKzШRYpԬiIJ}cݘS/0 M0z0:!P蜦|> ^mQ,^d`u2"MRm۸:7NJǞ\㕵ev}C~*baH}gny3\:?Ӝf@:yhMkՋ \̈́G1H"fDLqXnbs`Tf=Z*H_X.~ {4ҏ x̰&5ZN }Tv)ݎ u .8a8L'.5LJ}5Ks2 i҄\@eL' :yFհydB\9?(@sP:1 t'bGHrio&kHƒ~@YX\^q?Q6▐WgY^88tHWFÚ9;-֒uFyڑXtaxG,O`XQnX X3 ENkT1+g<1E-N#/dP54p"eц)!Rx o~V!:BA P_s)>g(4aNp l$0oɨ˛Sqنv0&ǒCXz.%Tֽ}bԿ;xwTy.#i+Lm1{슬+Wi >"zO$̰,K{VAzGN|3:jYcV>wU|RYYb[ȁb6-M@č*b g׮9xq#սuA0x Zhtfq@΍eGdM,qK-SCR `wM'&̦q ]0d}ώ810ON`U>[|}{AyC;:U>@sOʸ0\UqGmN&y/MP&.=MI_Ubv9=ea$y `_2Kzg.j#zF޾߼u\qnLhؕ/ صb `m>N;;{.NcІoxQs'GeR~rp-FKuBeK)`UF8מeS!]3,J`XF%e֧鞘8u 3)X|Snv\OKz_\_Rc_CI9 [ _3#|w4&<7[_p+qbvylf[f$-0 Eyr;F1?K/:XͿ &ˋGʗ)^,d;p 0oh7ݣnY==#vw(>J ڰC lmo惐?"JJf_݈NwI(dE'<4r7+"o2}%VW1KAjO#ڵjڊ#~_ܮ+m. ie3pPp3V6VIM;Dicn ?dLk^zٚ* JUnCCI?O}_5L\A5èjS Zqq鑍;.d~1:HzBTTNq9c09݉=8cJS#3@=|UlWMh*2E}@vH&mVг\DA%Ai,~dwГoJɢlsnVQCwb=8 {15Neӂ%#f NZ>2yFYozч(T{Lj`$0MiiX /ũ2OۚD)4yNN6v^hAf] ˙K2ŴBZv󑢔/nV=^ZJ˵saVHj533raivknܕ [,qMZDQYS{Nwrx'0n:p8!ʲC6 J X$QČF))4}}CYP5ݲIne/X3\zɔo>j{ɾ;npxЙlŦѼ"=wD܌D@=,w|tkhs V0VPɴMvQBPk u59!ݼdF|)HCڎ0n=U)4a"/TƇs:3yg R+`ˣ i\Wܔ!~DJo`HsO{|_fAm*U>]P#\!R0HxE5+t,v$` 3ߩf-_,KiL- Jk)?+*@6bd̃|jߏ4P+u2i;d}h8sAd5}ӆ>=GDJ=y`]H"]R}NA.Dg{jNK\X-U0v­zSN9U@W^Q 3YYaF e60v&[obz$,ʩT{,!XH jsͅ}L?.w:=T)7 N)EA_L) gw|WDb!w!ϙpp3 DXqݪJ*cCLH8V.\d=F9_]{޽Tӯ_ 29̗Jtx 4l;t$E.\38+ߞ.eH"U4B] +ɑV:3@Ɠz.[ Ekqu;ܾ@=8q( 㸫g)J(4f&s϶ʼ^AK=C3v tk4DG]ayT@ؘ#ՙنLIetX&je(0l^TDYV%Ho7N5 wCXB~2ZF>osV{;ζk*gXG+0?2M%h\VH`0b#>FE:dM8] |C{,oQ|We\< a Q[ԅ8Nfmgťئsb#oQD/xljt7P獸K]gU:VǁQ:˲$a9f/kդk Sv.0S0p19B^ cC'\Ůa:TL5MvK\-m/FO,*gaT^3IxH{_Xc#[A4GcY5[wn|؈ҷ xl!0Pp M3I/W ΰ*|wdLtM!|a{!8,X$*J4[}_U*y࣍KkV: RYEۂu(L ٞ(c dH6!Ah93_PmƲ'~'ۃS`dj[ AwWw RDoX`Ѯh24~硈w`Jf =/̸6?Ak%a*\. ;&'Ď|u,[+6ta_xڂ:/aJn`{ġH$fe"fwf#{:]ɻ:795Zew?8VҗOJgL{{NZ>F*h:lq 7K/]- H"-^qx^hMIlˤC.^{x*@v à[aTC"uᖔ5PS2I+~iFjsM\z!AcqSB؄=AةucRyz/(R OZ FQX1OTjS+1Y{6U7gqX{2~t">/B@knzٶ~\]+!=zj^̻:P2 `d^?UUui̠uҿj7 dSLx5OqKӃȞ oE }4ː,'rd=#keK3gNs4.UO vS?Aob!N=¹Z6m+#XIW_h(%@ {JQfA$5-j"XG̨չIpHmj%ey3y[썗 %Nv~MDF_X2gq} .``Uu7 n`*4צzjI'AOD\zoF?Bqpcc VcYKb,XҗOjӚ*`SbM<+/:wj}DAu8h^%+U7ʄJ"i:U.+Hw#Au5+KuykjCu2UlQjCu|)dWFD+E(Fje7}EG(-#F9\>WvV ~E9Bn 9ˣFV G%˃OIOG{˾ 6vX@K߃vdcGk"Z~0OēPo$߯Z=|i_uĵO ~Zꆒswd뭸̴MD7D5cRr]qc0(Ȕ=faaEcTM||̿zTy3-KEځ}PU qSL<YKPbMƤ'[AQ]Mh_K#Mp^vE 庠c`B7,NaL|v$j'tƺ6mz2q|мό JDx]h Y)+wC\֣Et‹pWseL;f殫Y7MXC:qmcނ|QHߖ/|a..hԈmeZ痼XGA{9 1|{\I'SpEųwo H)<dঞ-ٍF2VS%?U3KmPy@PxGX;X,O*_,IGP]4WYnO)1]P»tO^Df#bsbL>ftdp*Q#*0^( 5V@lN;{5}L`Uu&lb5vr#)?k%ꬫ !z/\Uiҗ]U0'yZCDU$$(*;} kl#X0T-> #.4 `8"̅ǝ,K3AWӣ{ ]hNIVyf=Me*mp -Ȍ*itb۫W)"a!툌b%.U8/tzit՗zgѼ5c(LC~L RgY|{e_ԝ_s!&Aa==1[h_w;IhUtTgmbVag2\~](rc't~`]x@?letNnx<`Б@-y|TtVQN>s"q_≖Kɸ-Ev8Ɛx\"iVe"yk͚Z,|^^&y֓V&j~ b Fڸ ] f1V"m+ON{ѹat#akbK", PCE(zPr_sq@+{oՌ{(J+Y r:+GPM r&voNI6Y9`} \ASK15"jQ=_xoT VFϪ^A־R&K7X닛WقU摆no:a^,Ŕ5/n歏c`6(t.J Ku<|O9r>!z]nlI :ԣ?ȁN{j*UU-HB*\AISL`O:b!Eo5!Pjq<9I5s! tP/qdT0ec Hi;;c\$;jU8|ZCU] (Ʉ{.n@L+mpjvUZކu842)D[9$oaŷQFԪ5ҿhtVӱGyWmoHdY2vH=X$__muq$Ew?̣?SJ`&W wD hm"SXUO 蜨+TU(K+#"Ē6,("#LkA96uu{L'@C^WǃRyrә:bFs{SV-$'HXHGSw ^-;'PZhY5t|?v-7-5JZRr8}A#C[O^"9?C9]q;>'Qu29v6&+@GMO72Sf& U5yfQ>Fk'5]ڵa] % V.S;g[OW^uF_qt/Q#zCStfL.g Ac Q{%XzhQ=9tfIM|kTomkLR&+@;NBN!) bWH}Fß/6 a aEd;m޴;Ce lzey+qœ lr_ܣDl?I=LlvfXM,ȆTOwUGSL_0 q&`7z)i#@+'wFNxAuW$dbL !6-]XsJ%&aX b֑Rm.z(xʩ]oynK6HyYYa<&Utj E|h-W&<ե@"H@N[kY+=J#>jZ{2K`-p~6M/ìBqjmMX2wх1=IsG?ɠלSFǒp>n0PXGȗ D>zy7 N1<#dcn ~)gL VE O*-~􀟭ZVc&4ފ;VhcE:Fu1aYE,8&0ACmiWlg^kKI׎ =[}ԶC6ݞ8Ír 2ܝd]"V$TO甆"t40C>Skir1Ճ~IkH*T"Jc BνU$ʤ*Wq<ڴ) /k|箨RATjmMբ'K3;F$[RgIubP8ŸJi>$ ؤȓ@[Y{M77fp-4κP )ZLV؄1tdLi6qqE+=ѷ ~C/ܼkk;ȯڠ:mfN ƨ0$F[x b" W<-|ȩrVU +{25>[o6FqNvxlL~?|2 WSNmۨVVG:`[^O3ۅ -kH SkHxq^X쨳(v1E3 |C/s~-Kvn'7c}([@P$^]%J񷈫Ey0qzd#wuW:ܫr5˵~7s*^QvjIIV>>sЗ v[좡 LntdEGU2ŽhlTkXrE2r (_/u?vGUHG־j+Fr6{RBԱًnuYpًn2EWę'RIq.pQ&ްg?̖yp*GB]FA]ff!0ٌHؒWZ?'*|03qYemk޸BD*A P@_DF`g ?wluPg5wUW@t̕CA%A YÊj7{(ɟ)iԼsUj"&IvBګG-th jhp[hvSVI8 ׯ%%LĂThSBmO .Úqogor9*pW4AsNK`KOuHL)n Q:KЁ!^j(YIey 5$5E&^DL7!/ro!1[2Ak-C42;)OfwI| Ƹly3>?J>c@U[X{pr֦_|oHka)Z^MivEh.iMz_mq,j_6]`gI?GAWBBzC*a-A ɍEwatx`O٘Xtyh2HKXч*ÃKӇ!fp.%l^Di5ɴdE^iiv@ z.Gɡ57D/^vj].JG }!墊1=6!JĤZ\jYO?elK|~XB\MrhS0c_$7߆(nnsЮG!F34v"Kc-eCdH焚W?}jk^ٻ3y>x}Z!&Տ1N&مϪgN9tq3շ|>Jʯ@hF!_Μ|pFrP\m_X=vfi lLBάeBf+AA[_lHdI"to;}QAc( c aR %E}N%?ҲԤE0BximoJf92Z&l WM UWSUg ]췿,0Oz2Q*m+{4k@Ntw~qlԿDr:$Lm|PI!I9 @#"_[;9 qk[ShHX,Bk7rDm'C qU#yEaA-U; bG&EmI`*lVYx*ݜOy/3>8)^s5$Wi! *@-XM5Bl-UsE:h:w|3!8"Dh$yHdU7'@2$*Um幃 g*qz|'QqT?xu_jq./T "V:RmƔGk{BM:!+ Lfo1gyYyƓSฉ8j-S6 _"@ *@vد8g6fcbSbrgG)Js@o?zNAظ_:aO'Q髋~OY:MġwIc!cqe.#*Hg 6ʻҐ՛ټ'긼m~NEV a^zeXAOeCFtG$' vpEcZy&X3#Qxcm.lΪL*{d?t70v0Ӈ+!W]oz~eM~=O&QEz}/ yDtO~I7w_]LWfbeUSwޛR4-"hkcƈ/lk#9:a`389I+f+=r@RɥCV@ƫOM?vNx<0<5PV>kzgiϓ7 qk9K׮5^KP;:@} (0HMVw|^;%H 2|ZH9f0+U46Zy3d>Pqmm&@D;x@bݸ0+,>GHM0ֵ[h57HHX]`r |E:o {:!ۇ-"k($[iEI+O=j:ٓQr+VXB`ďefG8ge'kv;itl)?$. `xa*C3cEP߿Qx#bO-WzУ89t6TV$/fV8 yLHIJi5v=fc4?/M-2Bc`c?|yO{ -R|_L|O'XX0h;ybgng>?޻7P{fެ`!+@MOl_֪MV# %ظi6@P!dc+FP 'dDe)=<:c?6W(`0}3EB~:YG.|>#n#e@kNp. E٢brd:#Il~ƣb [VX(K瑸\L{THt{YP67:]y0[ kMiZQoS*1ulS`v DfgGlu|>B/S"Ghx:^b 럼¬c su AKTq3; k&;ѐYrВ^sNK@߹\ォ5VǗQ=X]\zæ=_ΫN׸eousCYt #Mew>V" '}Xib1)(ʷH5׿Ve0 g9v5h8Oã6~3aCtͯ~iBƙcj]+E:TW{"8|š:8k{+kԂXKBzt5#M=sAIFZ͉vHB5+Da^h Бۇp5s@lL2EV6y;a";鴆foP?dsHV3ACBKy#b(Ҵ$;>+@Ԓ^-elz20bMta6v.<ë^D%;C"R5J: oDWn o"Ӫ,c\\ aK#[| +;Qs(_x-4֑m{<;qukxHPr7e38Kpș ҞvZ$5>73:Lc xT;q7A̹~N' .k$ްD&vTBFQ?h^$"1-TϓկSvX%Ovj= ^y0_-9)ZT`ʛ}7nwqibf+ګh~[y۸4|^aƢE1W?6y^r4xXA]xcVKA>e-a؅NA`#(VkF_\a<7rY%U|KE9%}Cws{ ίmoce[[Ot]T@TPN:wIKE2i#tiZ? 5r6QY 5/!`,A0NŽ8%/3yCcRrFUoeàyN|WḟO:LO)Eq1_lzM-A\V]@g:iHs60y2t\_tPI0D@DMuP}}ftE.Lpڳqwk)FbyIRn2N'y(v ~NUXl6b<Dz귰n9͒`GozoϤ1SrEÉ[źLV N4r+=v_<5q>鄱}Q"<B\OvLwrSUy(s@MɯdJG5q8֯B2Qch_+n&]CRe[S^%|B6B}uSs\_"uobj5),IZ$(3K+l1x[p&tgf׆<|B9G!VrVfT8ٗH `"FETǬ2ԶuGi#[*X[WW݉$2SYhCq"75س2# S-Tok!J4u!g0?Lr4| ,EC%#|@O#[N>;WȓSoAt$О#tlJ mh]_&VO 8] Kaf>魬$S+c ilMuhɞz>dW7{[$PI3>b VP1y!zMr- zP֡lCש``80EIKG0My\yC* 3+M"oo b(-DKs{+bTq-nͿvJ Pe8ܕ^P~z}θr/fzFS{8vr ]\8&,s MIg^Ra!O54_)50wPY \\7y`BTW =|upu'Qawgrf4lPm wFQRF101:Tp9y.ЇnX&oX=DH?9ĩʻnOxEvGO *'_,^5?DcfK|ԶLupvwL,KOV\]$s f̭T(cbk}bФ:(۟T޺j]3C]M{NaHra!'i(5T`aZ)ǹTgÆrBipLH֯4|:)A`0Y<Θ#*B'I!3RozyGoKlqc@f Ռ%/aзy *h@> jG:5ť ؝V [e7PS0E흈6ENElh㲾^#duhW(h*#CWVB_. nw6+}IjV ya≶$\Ƥ Z;N1۹P:jy;[,;:MJ1aQ($W r7ʙ*^Iu03yd7VvFBͶd>eLrQ|&HQ$$"t_`u`+^%0Yba-}+Q_wI \>)eZ^x<0JM+{?R1]uIK/*iwB]o!6aY}_ {܏t|Dt㥩Ap1JH[I QZbrX,@d/2;[2Į}f?´{;o7P}ػĢqIGP9"RNg5? &G+L8h#N!3)wX\C!ض`B,*"V`jq@D,oG2N [5|&y{EupؾnX1 KC(R^V {. _9=9/i2>vl[7Mj]f{#ƃAL-߆Cr݅_tH@Z,0,JxwRdTTwZpw=VRg= jh8 33t2֏9P|g!PIG+f?yEZ7C@Ѓ-=@)ANOX)1_TP$yP]ebsR cn\s}w6jdfe=ua1;g J 3Ąr@}c~F>Tj@F.=FO riHuNR?鄐SعPc60ab~Lgk$thN{R#D"} z%Qm{Ϗ CH1gjj5H,Hl2~$M³cY,!A}Հ>p;Z7ZGe?m`|o7? !~v310>Qxp g2Aɦ* >{UK?zOcR| 24S +^nY#ޕfDƨ?Af!(+еuyy9 ?|iC[IZ%hO묉`CT`r@r [1[.z#&8Ti%JrˠRv5\,VCkA[ABWN8GHS.7+TrFIQɡaFY=h&cE6X?ܖ&; iAp|^D'± I'xze&)FH6@DZ2-|1pWkŰ} 9^e8S9[Lmdq{E.㚗?+V0D>M@P}dx6ߞC<f( ,Ι .ξ;6L%L|M.([` hɼRAW%8b OwO_w9 3er(+m.:hk#Uc7YȤ6<3HvHVXw CFlj|#%8_ \J5wE髃M /Ӷ h=ef$^a%кΈG0 D>yHCLE샞z j|SGo4Lj Ȕ_$F*[(ٲ [_Do!w"tfrr1*"`vU<<,J]D̾/#!_ZIJgjKKWu ; `ilc\'E^&: ǣ4];t!:uO8DTSM\@leH'H饇RcU iH!>Z0͚c+'׼qLZ!A)#gzYq>@q{'xs`#M !FNxN<\:xc49l`O)Xa,E@>Lj9d|IV|G8n;Mϳ+iTF/E 5`c6aL.A i#)ݯ)WzVW\t89yQeaQCls4emlWȘ}+Rl#d@_Clkn}>~ 6',w]sTʜO*y Jx-4iXDaI4ñXբEnrk !An}:g[4^Kf׉O{QFF;yROJ AZmCF@MkgחgqNh٭Xp+Hs#>n@nBSOn 6ZP)NCdP {ߴʶ0PpdtIwH"TdAcb}ON]Fb1Ⱥ%NXg3 #„&fO f^}p!{)dPb-AJѫ%q"w@(6*3=+z(bu*[b:2h@;L24;BrTڧ> `?b= W"^-)G9{Q΢9xǸ}^])C&vZ+y"_K&30qwԊqvExD/1!](p?|MMV~U{jp3usF.emPupDupm^DBfQ@Ixy{|1s#S"vҿe[NYV[О*ӊ/trg1(`9;VBmz6Ķ}ψG?e3vۭJc,DH0YDuS]kY`#ܿSR٦\y|UZ|/ݨ4oUWtG˭Z.u ={頚EtmQYK>Yqz&l#IRWR\e:l^W7p:&al!'mOڝ$o"fm|<$u8D"PiW'f mAFUt+ͤfb6D-q]ΕjB`UZ6j)#'Jf:7Ղ)\K8C"B+0ȍ}J]kI -3z FSo6<:qI4@[Km`F݈ͨh%A"f1Sbp/ĉKugAnѪu`hJzL5^+RASQʅߒmaGzdCtvveI=:c9C= N2Ȥdh,<ٜMkOEn? %TrB7R c=!FcхIxQnFJW$Hv|`nܾ+)!]݃-4.ړ/yUmjф9IwJ;4ZjҸ\h̺Q k>V LY.(oޙƂM,uCKk +K+q 3 OTHECivd{6H+"l jbiTCϓ-|=Y9CZ㵱C+玄òAi*a||%CGjO {PR/UAyz5/ل̙ᤏ{SRrYD#Z&@s%(fGwUAD7(@80['@ՅX+fZQ2PG"0 ^1PKd*ZLnv vg*t`M ް['JA*҇T ZH෎C2ӰYR+Ʃ~'Ԩ61+[e[D揶a8T^1$ SqKd$jV=Vr9G]t_gm?klK ̱~/`.Ytu7$HcH]?6;99Jo颩 y![T-i6cE TKO)xDDGV)^{# m6o=YԖـ%W9|l66(0eƷD~ 0֘ C]a0C2%ž~wHR\D~&*#59cOZ57sUsI<\T|&gb:wЪV\$!&t) {*"ʁʵ\ )W虰<9MvK5s="=# s䱤ulbT`bbj ,O^ 1n{Ӿgz)x]OS}‡$MvD׀2iKgA5#܁pibmrfm /(D^,S"L <'itZP2u[ct/t6BU85]?Ib2|rb;9Rb+iFʏ\V>ۅ;`!gH;vxa3sv\dD%Td< /u@ )bK]V`Gӵ3I $.i}KϚ{P^g3Hk8YH(\;z\ua?Z_p f0s9e,p;gV;F|G/`~xo. /$Ԋ끎lWt]喦 zzX!-f"߇mC^ԁZOHGL4u"UtD{ ,Jbj1%Yh B+a+*&Uy4)[`/+g96+ky~ma@:!yU.B0oAy2р>I] 빩S<ފ\?kD,i!N&e(h( 6zêo'? iAr}X sK ߰OՈOQtnV:l^?Lh} ks#4fQIJl 6O_œ\LEP,Kӭb#EAā{a߹O+O^GY4o6uw:WhcVcuə/6KEZ mB|*d|]jE9"`O A%󍚾yMc%0Ė98NW /p1A>Xxa.|2v|ye\Y,Nz}YNy6k?lw%ܐ "%LqWW~mFifO6Ҍ|xqG]+o+[S8m F uߊ屶2rn( MɐťXOrSS^^d?H 2G~7nsqd~T'ͺeݩ,DAEM}9)iq)@t?gTx7dZVDw_(3PQϭi؅1\6ljꛜpXl Ғ 3^vCuƒ?CnOm59TxT|FͿJRhu1&H)Gdi.DB׉ܜΩ3aUfq1y>- B9USMDB;NU~=^@W69R*hNaR oBuP~13gZCќ^/sRIIn4@:iID6{Ȑ'SkN_[ܮGݟP\tgF"7r ZWdj4%_Hʄ 9PI57hެ}@;smR4d42 s)nW N g=́~3sa-W&kb0Ur qCL?!C@~={>u'v 'g-6`jN*ftLR1*O߰sxQq`1=ay#y;6&UKeDM#x\9,v.*L"W.3X7QūK_K*49oڅR?]]E5i礘%h Q'Nd|1uRuLg_1a~AV (>)rSIY@}]]lYr̷fr].Ϩ[p0' %w5eyfr`rF~8>*7jU?X9G|YGםOĤ-T}O7BG_YڂYfME82 7yr)]/ҫo`P+X߹h‹G*./]c ;Ex$WnhPG5ZVd9zF"1efO]U03 kLFu-R6'(eg\+iXN;VҸ12~s{z8 k%GNv3p^LxNHZA]ueSd@ K6'[>bZ`?x1LB x*OZh}P p'oi+( zq QaNjV0(FCr-ٍ~NIKlCXmOhc|DByO1^txt];_Tn1dkɫ޺% !4[D ~4-A2Żn˭;*C32VQ}yѾ2j'J>1"`kz*7B}G+x^S8WC?_3hQ=h-T_2fϤX6>$&# }jdBiH8i{ߟgZP"8-VED6(^ީB-AZ15*PSVC1sUT3R1͉@}!6e_etkIf ? HԂ(B;qD( 28@N{ɉGM>~[1FPblQnmu!Gs34qjc-T9LGNǃ(# k8GYZbι<{G$TaPfh)Ƒgox Ys{SE<)GW/(߫1Yh+ W s]wYmq;V\QpB\vl7hks/FY3F1*CiEA5ɝFNs#ݿW x)dTB^;4X",l{kկ3>j:2E UÜ#-cle@3/gB7|~:d*Cal^CSEYJ#>5jIz09g )xa5FYnlz@zN3‹q\X6GQ"uhrs;/ut$kYfRe*B`ZrP e-F0T_~ܛ)|IGr\6{<#JO4`(OL 4L ' \oECA8b B_c(3K\Rr{4@ ySifIMMY-ʐSNtgT@]`eIrt  "Qҁ)p!u#VxߍmgIGgT54s#dB3)}KWHf¢Plm@{@K]^-[? _FSs dLjD@`*u8EgfL (G|Uh{Hqέ}Gk´t;;CMz~ͦШ; `6vN, CQJIڼ?bSoZvBmY[+7:hJID9oKBtyqDo}zA[^KmꝳSJ@`MQP5], d`w]Q 9cOfd1_;$wϽ8QehR<~hOۄ1Ev*6hCk9SDSOBf\~$JDBT(襇c>(lSɔFǚ.R͍wx9nW hXxA:$'@qdX`Fim\{8nhvxdf]7kb LSE&}z0FB5zW% V09aג&ȹ,p.(6Slv_ƛt廇fX9'C2$ B^$^ߪ)-dTOnPNSfum64`k=I]CiDԝ- 2id~ ۨMBLV.IPV8~="ް(S8ےgɋNgl+4!nl*-wɻ]@G6^)%JG5ջj 5]P؃A[s\X|:)+jhAbdQڳn[݌}Ŧ‘a~o/wfJh0Z%nxY 5Ln;[IN7] vChJJ౛TGdb=r@\,+SԭX)Y&{fEz_:! JW6L@Nt7HjѴ C6`UWF"cʚYկSCxk 56]3#MC% e*K:(†e5jl^anKV]IrsET*-:J^W=runRHB¡`\dAfgI~ʓQgky%3x5sA$`@[f!%L.#[|Rxr+5v/Gg_]YhLS,KGuSe^vv7 hݸY0Y>:Ir6Eo(B%FgpomkZ<+#Olbƪ^amvLkLA=u!D'=*\Dɣ&g*m % MktUxgLg\t@nIHMZmoK`rj /ÀH-MpX%/ܧBh@^x["^y `Ԍn :ӑYsS 0v񪵗hx 0Ъ H6/Phaժ (׊^}^~ A2AaU7##텶Y]fsGhpp~Qh*쫙o/h'$?rpYNe8èuˢ;,C1-Uz dP[E>)9Ak"͏O }2/z|Nt7+XKj{cN]\<2"1Ŗ5.^fű0Y|'APf?Q^;_o~+MpQ"y?:K6y7 ^6&ae j_N 2= Śoy_([2@Xj/SxyKwPK>&$QEw7gQ^j/%^D/mFI)T%I]%vbm=׺-=d/p.E [ΙTZwJ i%@yYM=; zV;l2gA)%G1\O.ׯ J,ɧ@R0tn}s1v:mGY#dD3aH|h`/s=ǪJ0zZX͂TP9y y0wq޼qlQS5t#(lk~j*( vFHݭ0&(X.|*3(,S[XfTټ/2r(7rdF2 oq(rnD]ԇ4Ԉy"ۇkfFYETʉK5ʩA ѩFy/IV?jf2sdoi ϡtT:acNCx} E:.bf!%(t`'4*K`yNOmȹi. .8kqe&]8bH ;h0z/D2Gƍ ?jquzfM$уB,ߝj4YxhgBg d#L`"nY$FSVEПgpÖB =_(ćLt$~s]SJ{CsZ3zѤ;=O}P4xX%ԭPHpo# Q$ c<2ҮoI,eLKlO1Mem{eCf`< 0Vz>P_DbM`u h|NX N$wպ`8/SҠf2b'/#^bԊxy$@ @@Px]9z]KW - P+`ִOȋtYvtv^l7~nf/$$Ed?AS쏖ͧm\ @;- V,>ϷQg3\/ xl ejfpuVeJVKi<룒?:@ɌjUlĦ+# LbVPʗVkuZӶ垵, e{`+d[,F]jp$r'h>8m6}|Y˱z"\^v#ڧg`B#N;|>^+OT,]^8LaJk~εciwFF1'zciѫvn^ P$xnNLo ? ,uF:wozT2N7@Etv ᗄJ !e=ƗEZVQi ڽ%]M?./j̷M1ǢUΜP-otܷ]ߒv~勇y">bR|Ht!%7T48+nk:fZ)Ho}E[ !@q#:qO8nˉCHZ^%6shGfceJ>lZEY EBX@GMy4lsW%4V oƒ lhfHpVDvfEx(=ԴRaLI ,>VU(WLR "T2` QP.wbAplVϗyo3"F7Ҕ<2Ijh~C+K  'Ka<7^T3^p= bwhM9o&E( 5xiz@2;f}FHJUa+'r!k/Bm?ɿXDyDdvv#ERDIU#D=D*TBdjgʍu֔J  b5\֚ԩN@= #K WPByITFP!mh>Ąlj1L`[ךdjf%޲8%\ M2Ej>_8=~B7`ʯ㹗yup?+r;cO NE8`\HLrVàO <6bǺ W.ysڶ, \G{TgS%++RH;Љ592 M)o6jmgJDlǐ?O`ft1܊W$I]Us3tcx ʶ͠ZZW-o>K"I~A|dd#$I1"/lXE.9c ^kݑ},mAz])Uy<uL#*{Qn;l9-&%*zIlS٥! JK!dQ"=Z/u[&GrP ϛ)= Je*kpLS%rx,GIga:ENHSGw!Z7!$tL(Y{U^2(A1Mf'-(#sDpm5zY2ɞ#pRhXVcNJFz~Yg~{Fy, gȂkkwymWzԂ/A^XD7πzӫUp؈~m-R+{*,ίR,\d5FoD&6edn㡴[g7s=ڊUeK=s J\ʡ%2̩]j@BZwHƶyW J{Bϛ0s+Zw[ff-殮\4ǙSB6 %s9lh$>bVs}w;1kjAc#CA(}rМ~Uʼnu|"m,`Q2D,l|G6kH08xe\_ 8_&(\CZAhD4}hPB uHEblbrۀѧ,A'PZV;p3;GO! |+񣝷6q<*Z& 儌qTzf再vNFv/hM)pA(srX-;kKtN p" O[nwte9l5J(PEõҾ9HJU;+C&3$uV_1`V4#K.H #*BӬ?m,=kmUP{ZyLG{&{CBYW`k$K-lk7Yen7YTa``oym 8m9Gp Dlpi<ksl;^<F.? CA:L߆%ېWݤJuvˏϕ_RIÖ.ui- TeMCf&k:^Q]+a'V_0YZ Z@q8ɵtvczq7<wLqPFlG;#ITX-އQ',-d0XG BF\i;o]kz1w8y}O!enQs%<J#N漿gHPj $&ܐ实ѯ 2b܁Z>5 /Zƛf$Pz)X$GA(+Y[!AvLx>itZ6Q2?v/iQp!4w_bD(T;4be9=*w8} w:*yO_`Cf EJǮ3IuW#O3Zf8h]xdZ*S-#?D祆a3?#uy`>@QSGx'_)IWxNP^h;Q11dՉs1t[ٖ%b7CϢq~=uKl[>Qr4H~W1sjiiEhgnFv)CrGA]l$1]Bs $xOYPӣ-4t H% VoRq礄~d#<)ȀMOE$M!%g,-e+|:O4 eR7WAx??6 c8i&uۂm #>'jxï_xtI:q#D9ՅLp]yDaB_Wvۈ;N,UJ&cݕlrkawj7Q>N䤥njB:EfZ\ lҒ שׁ#fD-S^:p^/Z7M+XUg=ф&0մ!~zW5o]@ R&G0[e& bC\ȳYо4:Q/Y<{v~:s #Xe3i;Np _^l1IyX+!.0&Z~~ ,"0&GlKqq WRO(jXG.uMN mr'cdf+o(vDDzqfRs" K dp{_ÿK{ɪjKs@U (΅vM6O|U`P"@2B'"`D[c۪f %*֔J* yDgn*ΔK! f{5sȩ8N!>%d RWyӲ:)kңMaBn7>ɏ&2X_s7z !7zʉ_5-5b dbL<^NhU ,RCR{}9x{_KW!Be&k}9!J'&ZS\zFWZw9UI&BN"󲎘DXy ,=dvJ2t'/+* [z_Un!wL>]?*1㐻xu^. f)~Ӕ8tȚ::Uf I"Z2.HyA~1?|Wr1:W:E\[בk}+1ْ%\νHm4V׳q';K.;!߭{YTv ˍf0H#G U kVZoI=q0;.DrxEUw?j]wO]xύ5:O5V"'?4U#kVCˆl*0 ʸ͹G@sby5lyHХ!C5g@: }LغZD*TC/P5J_iqj սPuPr dub80IfABpLJ9Nq{MF|:wURߜ(MWQlGNZMXX[R^ Wg b-pXd7y3$%xv@'4 'n>]W@QoLwmPO2qA+Nǿq0F4mh&Ye~t6"/0X-fo^~N/̈ˡ59SPհ\ON*N!;j>JGIOh4 3a{'b Uc"0PNMb\zZqrh{2fU2Q?PyL؆G!M?*~Տ:}.Ϙ.e\-hi`51!^{ ?z~sT8}GixٕJ_xE!Rag /4́RK@PqvhfS::$hQ?b'^P$zj줚 CS@ax-:"uV II~4(}!\dڐI_lO۲paܝAr2n])3[:5[vG#ySβ?Mi_nmUr VK)c,TCCGp8;@Weuu9Gԏ+;x'7)Y >J~]҇YsTJV34p y4b]TX4)=p^S3 y`]4 !:&Fu.j?j)MiȯW-..EOBEb>7\s1cB"̺m,\4M=L䱡Ik<̆0}iDTD7s| &`] $K( ~ UСɏ/  t[ l k"E)޹źr)5 )LBjU(/awaOJ3NFs4jߟS$| krZ:c:cPBׇh7MkJxDe~UCNxTA`cD]+$.6#W Q;:~5Ɉ:R7ĊlfFd'ū uƠ8(d*&Eu'Sә8[&)J|dRݺ=8Ki5t#OW2Vps E]=?f)M^B,cwkL4M%sd'8|JW/ Z``!P{HtӞ7{M,Tp)$(Z'R ZaE8ꩰv['4mIJЦA1f*Q֎y3 ä2j*@ĺoBɾ.QVjd*+eOKFxX&*`yt]6v?#KUnz`k)QV*o/-,E^S+9F[f-QZKzH9wV6_9AGΫ?pyqk&r{l"ۖ9Ĉ`kO'k{X' S4$CjG'9F#FZ.qgmpTDjkqlr&qy1likR?܎^יfk?>AK'NГrds6M@aM#]uR1ubj084a`P(9B!l4>g>}B{yVu*rT<Z(8e ^eޣNJK4\Ϭ?*K0?3_~%nLbB3םkr. d~ zҔ@ "] pD/cL].L .BP+b ML {N(_gt s$Q`LZabm9wU +ױ%2so(ܘ}}?JYUK L!o?e2c\]/+NmJUJ>.׮|4 v.uPLuNljX|F- 4͉C=IUe"9, /!\h9(@l[vIW(kG7z)3rPorJ6ʳ"UdӅG]?dļ{/kh*%!HgY4O ؚ⥾u.)$.oQVyǀ'W;D~ |/ZEkbXx0JK[, 2EMg Hm׿ƚԣeC).=~Vl߁Hw A*ZrNt)!0@+I`MUgOҴP$Y:ǧJQ1C{HK뽝xZ8ͧ-y QTZۨ^f-VI1Fv@pK'0Sv#`<;֭E(rFg)_I+x KVWg$ߣO8AΡnEp\6Vߑ,-LovcF^`B J!guYs5+;pT* |iFnt`38HZ3OJ  4S}@FZ0#at& !N }ptv.n 5vʙ"ð82hnbF&X; ǝOK=@>] (X/. M8޲XL0x2̹2n\6PCS_I6o/qS ? DwDf(ۑKS F(N(YVMRvꫨಡs'r/k}0Or,#rkiBXzBC]$F<#ݐp|k?OiS&S.mTtmLl[sFD׮zUih\',7hY bFmPl5A3qawocm3eǂԦR9YhgK뼓1:IyPfΗp $,xOV<-,V$@(-7V%Ȓ#ӗk]j59 .P2rī`zw}FY]G ͤi9d~[6V*yY9)r4d DG}Oq1v+X0D'ZG.?LNZv<ְ09TI)*r/a GXS' |OHSs<#O;Xz̶l蘗' 1Ii_Eyv%wL?G"=̱~@Cw:WU_OݙdML?P՟-I)zw1*ާR b,c% 3ZJO>%5Ѵ9'te$x޼._ѿpW]nB>L" ?0<l7gLtzC"f'4%͍<ʂ`PH^棐ZNU?Bqo6Aq|8Rd'[t&:F+M [&"=qc X6M ۽y{zx?9|yo^ $]wjw~'G%{ۥ6:LJRBiss0ǘDY/Q HjRgDP@:CAV&).Dg*216[7M9pP=@pJaHg2,_bu  PbnKyڭFΞ&kN=Z[|JGRbuIA#BF-͠0rG2'y{\yv,SZyɼNbdImpWz 7hK5q?.vHl(\ Nj"taH:x" ݭ3`:5Ej<yTZ-O$þu(L@TU Ak"+Ơ"L鰸{cmt.S_j+5L뵠H+_#ݦZhgMwTwTE[C_e5v6JuJ`+ʔTyuYJ\&Y];yt9)f؟lz탧AE\G0 5$||dGV,tyXT,4aNlHn3%c-4JSՖGZ<@&o-9A JAGdيLsqf^wHHNqɳ?FZBcλLOzXs^[& ֱP!+ 㘿n0XKQ&r@=53$)~w>E;a.J^V}!Ce-AͪiK-g25H&U0aCJ<,Hjl B2yQo|9ߦK71[pENjR!6~XD G 䖐q.g;_OJ gb'̅N^3s>??4}@6#e;#@'OP|}/l"7,Z3QCVd\ݗk1E18T]1% } cĴ>㞓T៻dGָN`n|ax_~&ڇe> gbrNCV>$50)M?{m[6ɇ4q))L6!e":m}p'BLHXMft;iQ}H `ne*QCfe]ժK>?M\87vXOQA ]Egǜᖏ`tn /E;NuhMY\y$d f:;PIf&|B-p =3v|g. v[>SX9L}[Mp s[ABz,ٮ.F ,[kb+gۮ< AgΒ~ZW7e2%F;@ڋeQݰ/&r3-ӄT46ne]c%底N-&i . -^ϔ].1p6 =prF*}OP5ey=:P [MO8t\cdd>8rLo<#鱀a`jcF3|RcG].1o<|"H;M^P'< q7crz ,L&Ja'$1_ NIً7\Jy.nP^!gŵS-v6yKF8dP $xAc^^ML<.#2_|^%vrvQ[ʾ1L_ʻCh/ Je|TT[7¬*qBL̋\b/j&)2mur:`sQPM_.di'L$7uKH5,dja&ԩ:1_-R^ZBw>./҈5d}CrV Lw/0Q@@\7 pЦW.jV=OCJ4}ePsEP,AD i#Tp]9~%P?3H8kOC,itdI 12ӇH -Q=HE+y)Zhq & _*?[,W5D>D9q&I%ώ/]ee9r{*Ϧ>  NwA=Z?*zD1IGJPN͔!Ց'0F3Y!NbQjJvqa@coO&qe@LF Ao|Er]p~PWe"jXUK/8ŊWCl̀ݖn;F wlF,J>r@R gjTCc5$ԛ2 fO/ގiT|fB->5T4#28BC:jI9ljԺ9 lcojdBi[;<-9ɫ)H,)84 RC"2JK 9JGg3Zw3F 8fNgj_Oc5s`* $lxI@ڸb0Õǐx>5(-Ve Quu{3{Brl~xNeh7b1ӎ6 GH%^D#~ Г@bC',M vN%O 'NxP,w ibp *r>zG,h`pJ{ YNϖg |]\zFnJM" w3P<ɀ)skG `+h@le `͓as"PLx[4ax0??F\`|/ՔӊzKqṦ!sx[{$ :҈m \Y^YhP<ͻ]imV2 u!-8A`Ùaqv_X]ϵIi8'4@QzHSw4C#\fAذQ(RZ}5,sܰO )z(U9]s#nsaG4bfXs)GIйIpYWA{@.гa44\D(i\ yp:6mV+s_пxT[GF5.gDH,ɞOw/T2T7@>ZUZw{ƺ#U^)d*90Ck* x6QUA}$Rt:ºâ C>uY&&$st ~Se%OYbR {Qhۤ?2`QQ7}&LMb$wAϣ4A@upih0z,QqÌ8>wП6`T̃Ƙ[KfMbDx)$r-]m\"ۤ*Eu[͇Ov90eǵtR2d)>7]c(|je s9Q=1 |B*O'.SP_(0 Nq5#1$7$ƴaO.aHN,Zvl}D-aI|ynü< c:-K[;56LI_9(u{v]2D_)rҙ{>P53`wnqZWPK#x"yn: gfwCHv.M+kW]+ \UZT:IyE4Kpsjq$,D(l?K1zFGF"-1/V03'HϨ^'YXSG~[˵X<$k'0S6q.hY>VPr^2>#nT8^T!=5r{QEe*GvlprdiL`NY[V>e048ٓ [Խ8t;0jNlGOC>h*hdVkE%>/Cga#MM5Mrꖮcc{T`9,Ibf²aaF<<ڽKe1/CD3f@F/t#PmR{gXneTP9plH4&/-ZxD~)`dy"ZNz}q!j<3 ~*L=N51L&U%ʥjvN5̡BU jo2x7m7|j5*HB'Kȕ<3wE*DDWw]:{${dnBuf:֢mUXmu ^M8%ȤNI Ņ'5WdIE@t` >M ]7 m[FWPAxzኂ5!^UCȬr6?db I̖ %AO[Ta*G/vRr:q:N['UKn#2tY:uT-N=!21{+?^8oEƿ=tk>zXs\OVΠ3UdLQ<ȡ.vcj=ۃ5`SH1&:>:T|3UbFOHir!/0]pWd>gM k4c)#;|L- Mm)"a.˅BkJL9q}QUȳjyl@jкxc fҌ5]KG0QkĄ)V|RAtt\^|%3l+QY 3v0m;o#i{W9[qC;`J<dI(0lC4Fr|MI8\K#2G@Y[aa9\s6Vap_HNa7y^Hëy 7bhm>إڋyT% jvZxzNNO. 1mnq09yBV-?$Ϋ)EʑF.,(lcNt)*Tyt V穌D|wA 5UaԯG[UuFRZNݏְx+}JM[~^9)Lo/MB_ Nc ,^% B3K{R+wDg$1/TZT%Ҽ VM1J1n-)1, ``)>]Ym8t}dSZ7x\8Ntجtt8e Y冃U8IX탸5Qzi&=hݴX[n& f#p5(>M\Ƃb.r$'ѝԟ/f!VIGq-M=\G 0vFɇ{0[iY*x3Y}Y 6i1/Dbo#/oW8'V =_ О%֑cq^ݝEmkϦ Y E Kջ TžWd HFPAE$e%Hƚs*vlM" RR "m7]* k(:.* uDVG*fh\niɹLU,Y2B.e)22t%c';ߖVj7d<^;_x^Z%1KvB'}# Wv 7fuXn}ޥSq,lfPyv 3]ʜVgmg2Q;$?h:O?n~27n@%JN, cOR a? FAbiC{qs)9y k<9K5Ib:f _MtNs`(C͡IۺEJͶ`bP8S Ae8nEcX{]@xKLқCRwT/hv?/u ~i=m:(ЎK0ǂ&)T z^S]zDuI2r^xp)r6ҰJ>%v+V|8J2k!1IGwI-|맛ܾ Cj\߄$ZR;\V8&iBn <4_&b_Js6I0){eq+·lVX{HD[>c~:N6Jy`B©lnZM*{qaz7X2 % p#MpጡFн}"ßeDf^Fk yIXDmey뜊Ҵ{UWhP!l\nHg~ߗ&D-Z^gmTd]/~J|DRZ/D6y48>]~~0ˆ;U=PApiFPF4;H^!j_kLz24 ,`$4ׂC3P>,`n£#S?߾37d`TR'镲 qhK7A`"~jtV-K7AQQQQQQQgfffffffffffffffffffffffffffffffPd} Naz@KL^_5w|J!]RjtsH@zZИԯq Gb^X ;oDcE1uV@[klHV7K~RKnG"7E0.])yC:'I넖z| u@<" ɪi89+/8, S&IPH+O{UoB;ؗ7pap[$""*Nx#*zLrUvO1+5VĠ^#ZoG V3EPkzT5+[HvbqKY(/,V$) }ݳ3۳){Moy֣0'."j0:wAi^6L-E@ׄ"č!Q@,l8`3W &+y|ihեJJf7F8 2m*˭5“aGn?ƂY,CH D5>òWW ,x^oS(U(#T_tߦ-g*8V O6KfrjzK<̀S:ngOLևBw1^K`H [m¢_)SU*B7?2#1ͳ2 2 sw?guڞIsdz(?`G'/ ק@ Fy[`O3Nx/w6QW5cWrxݣ_bV.@eB;Ԍ!kw\{㗹1 Ч~>YETJ}n3?OOVG6K]_܀ @َЀk#cMr[هÞtw!T>-!E{2p'K4:#H*4FsM.?Lq^!5AXk)ᗖ`NMQ6fn a Mґ.3`µ>=y\f-!p#K[ |1gKuo?&DyT_*Lr(R^e o)4_gZʼn=!gԟ.v{ᅜnyX7ot#IP[ZCl~aa .# lT\j!%0^H,vlis 4WT"ܗmLC c !HOg-=n)Xva"_ݔ;Pr*Z"ABxɕG3SfG=yzJ/*ph) tcL3/SL]O)qF<&?.`/آs XsqG?/ع}:8.2nAf k,q"')<$5]$9WDRjVυwW0IC4m"Ul`Cgp_bnv}[!.BԢkIIk|kC`j,3."]-I-CcT&z7=yk;V6G[Ay4S|)f04Y̧e/XlW"hF@W߈_^svA}iXŰ-kw1N6si\R܃`nD9EFCmPHfjR\6ŊcKEKm$a25@gv-|98*[m~XoTP@$xIۇ:fƴcrJJAɷ.KdP,. ۷)?̣ݜeF][T!}ۼef#ݧ_:}) ;kZB4N@,(Ցw^]%‰zk aGrJv+./3,Yhƭwa2zjnZƇie0w꼗_L/ 1哸)j'?R.}g}%}w_fLc߸&y)J³.]Uw O^k3rWA00=:-nYK}.ZJh5n@լQ gAY*p1Vw \fHʱ5̽+ P [gȔ=^{!1\B?v/$qxRz,ޑ9B߉G,> G\5WS tfVDS(BNystbmJЕ N{l۪7YY Lj}!.xi}HCMCEgB#N)%: ߠTفlvU%TtMD!:Ii\'KŃ5m]ʴM>Bq^'لxJ4\ƜmRq}v6q,]/|J aYgfA ¦B\zfzZx6Td4@rx,P}xR 8kC|N+:G7G'a*"vkYE[qň =)B{8p!K`D'K,{4Gvf90#`vY-RA%n٢QȀkB0X! Q y uL#>2 RDG[ VDivu.98FN[O1dڏ/C.+ džXZ2F> ks{'h:ʵxn%Fb7Ul^dK)E=o퉠{Յ&c_sV́~_KjNiJ'*#-}l oBBk0Ԏ8@v}2P"i|ZF;+n7{;Uv&HAgcb IZ &|.[5[rR݂ɞ흌$lGU0\q!gq>!T 05ySæ唖A؂G UړǚK%v t:H孎cYQиy.lQ 5ԦH{^Yros7#BG{aDh N wE7c0&lSӜؔ9VPaU9KW|֫Py( :QȖdybFm]fkcKrhI2=>8 2D@?JG[n P |9GytSFA Zy>erRM) .Rѱ~g`)`NtKl:Hf"vF1gny%y|W(v @ B C K [򚤝Pq& H Sl"Ö%AS^ 0MZϐhsnѕ¨"Nv1o/ (&PMZr]墝y)IJ{,Q見垤`!ɝ: s1 m\w%oo+S}j<3bNMsRjw6ST#bE3À05H;gpE'h),`j2@0X K|BZ ̖083P9<(2)p?>SZzc?=mY*FE|$(p ~;O1mM //^$XCW2h? }ݒzy:R'.,\mfjr g7b fY/[;YD3"hS=%"@/{t2JlpU~k1aނk *P\rk]S}F Z5dy(Vu3ORG\x{̧XCB}LUuɯC O+h7i\jIN_@O0P70d#vC'av#ط<) $E|}`ݓfd11p!SzJ]ZP6 NK\j޾gsLdK5op')a^1#pn _>K9ۨ1[s:V6p~f, < L.uw5w*?3(L!eo)=J nD2_]sgAsS]I\[`4y\A>otcZy (_ *n&?f EHZwYq&`W.tV @(#[k1կ p8-Bszӑ rб|q>nsC\ic,$;S"3G^JPTC|)72fi뚝YC2]mG]d)TWsԅh,/S@ojߑZLqȤS{WȰ!CEDW6qhV Z xOA0RIӯ \F΋jtom?X誙i^ m@aOBѶHnīY6H\&9R#b C5pg&Uv1=\ 3jPqf@ffQԽ734!迄q$)7zP\@VeI@iX-D/esk0kO9#!{~fbC~WaohlhA5aԍqZ Oj$;]9<9B ńI ;)b II.G=S6'e\mQ3{|4s4Mql0xR62MAMS{F<)/(JDH`1 !݉W6G\; ]UxA8_qذ* ncte9 >[/&L<^IXC0R|G+-ro]_u9.z*n^*T׬x{HseIyY 6c^5) VJ@\9+!C<sQa?ys$?7*7R1HSR'srǪ+aGazgfg>hfqOyvY 1kv@ÝQӢ:gVpLG:8J3x9^Ƥ6FB_\ "Z@?u5wW8S7ˮ8-ipm9vAeamt>{CAIkFС!H߼DQjKjq~T+جDʵ'5j$UEDބM^ A)v|A'^Ecw =dDOCHU5k 'Merǰ7<(DM}"T暪Foa~{6Oc|zf 2r+AUy/ m[n @T?]'6I&!tLzŢn-IIP)t]q*D^p)Q'_4[wKxnt+)BAvs%v*o~+IKF)M_hVJA? ^v6^/XCxPbwBe\]SBĐ6;p4J{~'tjxytz4y nT-H֗SB_;EFG1s#SED۔Ipx wVǘ|qP~s׬CwfTV-l| GnGpMK|cTn UC \WخJY0R ^ۻ~$ CrkT(3Zo'}0g*5*;dL~NFi?lX¥8N~a:B/DBOoǿ2 n)9t )|VR#o8ZŨ3gHK7&Rl*gyvӅQcX{ ^@bWsr1z@H'W&|.ڋu;-Hm~$P94q/ȴ` R9C ndeYHb脪 ~LGaᓋGI}7@]q=eʲ<ΏlƮ$£2RΎ$]?㴮M@xxm$L<}&-2'-Iuq10(_KU﯅7\?8MINNQ}<6*ut0Eu+G+[륜ˮEYG#Q  Svr-Ei?K <ύ4v`bGxaZDcCt{ Cd{Yp"ӽ<Q-_`T=oEfKL}Ro3zs|; TfEUVC蛞_MtW'Kԏ[ bWm+TBFc`Qm]3e;m%s4K~޵rғ$:V^DDOKAVcǸ1d+u}o0VU2QV+vm %jr_/S"VGH[FV5[.#2$'7VB7+rث|۲>+VSvˆV[_V(-+hCyU &Axy[X91RAsTcU椔 j4pW3GS&bQb)ιAŢTW1mez3kAv[?w>)*) b\)xc)IV*y(*Y:TyO;+Ks[tW&s)8H/^TKPXc P2'Rbt2G,;âA)^d.|uƹr_XSl% $ںMvZ8hN./hqsjLJ:-(V i>aSpFB=":M@Ei=Z,NNEy4_lIf5d0Z(bUӨ׸0yPKۿprk7+ H$^ɸoԘ O>6PW</mv8~%uhTǻaޚ1݌J7]\Qf?S)4A#7$Gd\9u3?h2)rtgxDsCI] YǨ`%y+=K߳qHHt@!L/0ҸnWv n]y`ZZy‘f*n;|gJ퓏NW yr1p [2Lz/%dNtQVkR羖F>XznY~ b+x[l'ni$ <Fd4;[ʼnWɰw!N]dt׭. k6W}A rL ~)Q(qVHFGqc%Zsh#r ] r)|Y |10Cau$g^o^MmB ʁ]i/68!EL65p<"-aCD^W˟SUɊO9jxy5!idlC~,սcOBL*4l~CTaqwJm$6r<#o&tArrT 9u2 J%ny5jH D s-buL:.cO۫iɥaB Kи߈iq"Җbf;RPzgiw*{Δ<; g r Scࡪrh =+1[@{XJU_7PA 6IG~]2Q0rá̚7$҄ӘQYt?JeN4A*D%zEf0&sdb/=~Ϝ~5`hJWlK,?eO~]M"O+AmG^7>yuk(a bwCdH53\)sFRry"{m*?z>ͧAE)GkK5GMR}V_CFx@`fJ_50l7vqX,יCxnaao"LJlF{& T"cwK J:*: VAĕ+\0(NlU^4)6{4i^N!1nl\OeS"Rl޼갈}G'stwp5tuϳX nT3ynsG}.RcBōc7)JoY;+zB6q<|a3`\K[tpQ4h0|N,PE \⹬DiHFfA!<[`b7~Ǥcr8z)$(ZWцs8* r:]3-qM!mC4HcFGDڻ]$bg@\ )5DSABN:P3uTsUUը ;^gX$#*>k P#>{s@uI2Cˣ1$ZPM3t\۠dS ϭ+q4U #3ɽa?hL֡ŮvƆA5[M uAyLwZTjxDB~c)ahE\dIQfr߼q鄖5syW\VsFf~,Z#&<]x*cm+,%`;MX`֗$Ϛk]$x<[OZr`nFaT킁ju-V 2c>xy2K!AҸJM|V)l;ZGvKI.ISpNz3Gʛ0SfƿByZdd(Laټ|oSSq=}2*fy^Ow%4ff夎_zr03Lv#x#G/[Nr<@_^k,֟Zl{_qpN51KwrXӃtGMQ˫~pjJCOR.Ȥ,XJaVL,]Lca': 7>o`\m"wFtݜxdnFnE9eIijSu H\Rh}: (VSK[뵠Ҩ Zfu!]2N|,(^*2fHSWЌqX0!4߰zڬ6Fn|;[kgbק8X!\Pvl2FA]dq;_~.GunV'y rWʃz&[n <2mL)2NE+q>Ndzip~Vv M4(=_ b~j`.Jlj`eF5Ћ4]^T\Cjܸ`XIBĮA5Ki;T%7EgxKoRu]r>DJqiwB_lc @SP+z'=ӦjFBw@mi2vb" LNI&%@JSgOk+Ǣߡ0!ۤ0nPKz]Ů(`#_yW|i| Kd^ٴvr_1XnC\e~K1d̴Đ~iJY_NI!>"w4>/wH-}bFW)"~JU 3"D'x{'YRwUXTY` bg`L1ڰL0'3jnohU{d8>.`_,ʓf!8+t}9xb*7DvC^<T[PnY $KESu q$Dkeo(]O9UN,A%[&3AcZU wQ.zrHip?U*8)BZe]*LEZ\53pDKpz@ xړ3 O I9[߀@`$xrc ?_f,\(wQ8-րO|-htS3\79bJ2#܅MBQ(@03wjڝT릶Sa5l^3f2P fjQ:*P(ѣey#|}'`bRLz_hfbK,!_]DuL'Xw_gg^^*7Qf*1&/vAAv:z򿐌ϯM޷n=9JifrZZ_Y^idδ1oCݟnͿNq۷_N)~>q%JCd7Fƶ%!*1AH(}؅SXw`Gu4a㽥ʓnNhnfm7[hR^e\ЗE} ,%Y|b ucʳAV`+ wn pnc_aS 5}kbPh e&iE:]bvAcCz$M~oìXֈ4`$!m !Z6s%fJ=.!, NXaXZhw ]D@]]y)Oˑ"ϙ oN pBAtUP @#>6kSmC hͪ >R;jdMP0rFHT À7}&ʆ}p-^ً`+i4TqypBAX>tsNx0/!6ЮvAlWQQMQbzڶ_TN1Hiez_IrHһXq;?P/ℿLUh0MJW2Źif_udxe훾C7bDj?w)P1!Zk 2t!w X"jJդ=1F܏> ,k0mW]p  3E$Z)}ơ#t&(ln|dxV8,N=E,I2*H\m}WVlx:Lc7T[,Z/mkXTI&˺E)r{Ep=!" t[^Wޓ}YG5V"MD Q5I\l>0Y8%kTeQe?7n^ci 74kN|obw/C$$UR$A!gCİEp:US-mF*'))USW%2 +x|YLF$3dlwZiKq80 n1; DU%{/qDH<>FIHUYNE{1( <}\'Rj*5]İ"+pd"FyXsBuB^t\kf_"nazkA"/Su242tVR@* ypYƿjMR>:gŸC6V)3TL۷bpӤ@ NJë3@*!%e{LQ xmticWG?_ܺAee'T׈a`:rD<-πw)쑾~4n[ju|DCǪp*37OƟ2,y#̡\5{c/2|G/?w!8߹l?ʳ{]MӌCŇᰯLj+dg^A`d[M4!Ԕ)jd6=vRx}IJ`I) , :$t'i`R-Ff֜uxY[FA3js~rܫ0<&K AgWM&RkwwӖ5=/Bn^KQ`k&FŔr ;`)S9 vϲ3alT.K]|GV%cI9Ξ:\ÙJUy.S7\dgi>dȁLI34@7Wg6Es| )I> H"vB\ Hƛ'i2QdD(Jn;ZqC`?c屽$y!Wp&*^/h6.0oz tv[F4525:< /)R.4!TW?3CkI Nzf:m *nAGBJG =,08:2 #RD t!JHRR\Hu7<Ⱦ̫Uѩ\ڦ;gc[EK>QzVP[k #yHH%@D˾ p 76CΫdZPՅs~ΪxLPVS}>@"J}ZVnt,h9ǖh5:NSxqEVrKN{AOx:Q8!=gN1N/Qk# D^;jL̦UJ"i!bfo|Fl 6hʄ8P[myĩFa #'#bOcaOd2Oc|p䫺!#9DV|?c}ռ'Vl,+Hգ,W=\|Νq8xJMe{Vi+NB GK%ɺa_Dah[[n|)zH!# zxgDkDYLp evHL"1WAa7CipA9ZhZ_kcaۚLR.pYpȘ0wcL~[<ҏ\|7&L}?a~J%]RdqwƳ04/q]]zV8gM:<"XH4wetUV`PmsOs$R]jHHeP#B7Mh%U~JRZ@66}z`n%&*$ִ%PED?]G5Rr eo0m "/d4W!Ǝ4O϶MƊ<cV؏z2~V;O:A)6}ҌN!ɊOsHlF4Dkp'j}K]a@pb)N|mS#ZXA1M\y L={zFm$T7dT׈>LOM-ś}) +NygG`dxQ§.s5T\b%b@Yx+H!=jHz]7 }HN)8Kw7ī ʉ4&a4^)'%<VDQTudc$zإK:IR.rtI }1y|m!eNވc}c:[h\]=J.?"3ka\sȐrYZf>ѼR4qg<ȝ}G11,fMWI4cs :"Y>,wN@rﭓ\`[AoAJjYf)]V4KA$v"Q<$(}ΒQstb+QkT_f˨-re믐Qf3ħ;؅)?xb5mQmL Hqg_y 39]AO?&p `(H^NA7pQc/K x2Aa!^wJBaS"p|__%T+sStgMZ7mwncI*A-kh8af`m9IJ|\CiUÅ=y.`\M]Pxau[s ^TsfK:8s44Gqe=R2u)^^HF` ][h>sv0ެvKM\Hr~Pc(&J ,JRBmesAާ$ќ|\ \RɾRg֑WmD ۳$s&(3=Ws\Ӻ&d*qCi؜oH/2Ā -Ti$=$5MDÊZ> RP8t0#akmhMmwaykt-q5GT32H^ rrDaPf+hF)LNsyd]%~x@dvkXB/4p~Q3!P^.P\cn _ ,+ ~6[1#^R~ElŨ6(w,},۫SXVGbyk&`h=kl}Rm83:Co\SA%uC|~3']Ȩj¥ؿr 3RT^ptRI3o In@6gi|3;ЎƈS-ٲaNEhaAۙJ2(bX:YVB>z@XRQ+\%?z&sW3/UJ͘3f30Yw] g[uծӣ_bU@?D0UaNрR`zjPO{$V|3bғ!g#_-8d#k G@,7'yq?"}VL#1 ||;f̑8_Nkl}[[?}3.w*b'ǜDr_c7w]PИyzTxjG/֛a*1:2 ,L{EYE#uHCbW;x_S|/z-~xlo;Jw፰`}l</RԨol%7tJYY-؇ غ&Vrd nfjG]wyii}Ewny f162Eu΍jll!ANSyn 8-Gr{"?LllZ{)ѝd{lGXN_11[tEcޚSHY@=jIqі]6紶o$Le(LfMv,BA12PDE`#26[ӥ6yҥU)U=-V0W8Dx5HOGsl.klO+Fs_*kUnJ=SDP5j1]_]*DL^(4%U .$u•8l5l tV52njG/6)ݙd$( ӕ!B{D(7sTmÛ.!!r_G{T&SߙUDei@|BH,jiN7+g,uK?A(Ͱi[A"P4[@6RxRrZ]k5d*n3QDT A$eD?4#}q@JeU~ѩܠhQm~4wl܍b#Z]~"*C Rom`*éXVX:LOxNg#(v4kHc_1vlrbT&B*A*{[&e^8jDHؽWɕDppMmZ+ZN;;"8`ލ+~ c.FZhn f x85v&3!kX6eF6FSfTΟKkOniԆ.AGh ^Ec (:%.Yδ(c)vWY Չ4lUY\%RQl~IKoo 4 /6A5^P\X+!_^"JAϺ5ds{TN=Tju!HZ)ֺAxmj BJ&Zdt0)Jf:en!G[pHY8%{BvĦP!UϬn9nFڅu0tSCT?vФEV*X XדQ<øjgS)ϓT9 ng yB@e\yahyDCͷRweXXNS'~sIyHXU`u'~n!(q5^[NXx.obwk\8E5f:b07KNB>=E=*Cs~ԆSFZgɺ7RzdW̳S^"("10|R>Bi|䈼4-"@f[wa uҁq.?2t-zʰ(i;M)!J#Qsg?h\LJ) -M+Xzl;#ofOk6]tPx öRF.ٵ;HJVl @߆tH2K9Q%m hSV#KTH]qf nB+^΄[~zIO.Rv(죶Sfqolq=sMs&RtGʵ^ -<\SfѱWX=c?X(KKs(\Eo'Qϊ99,sE =rL5+zpFWi r(bNB _6Ldn{*ӂv& M?/LBRAZ>:CZZ gy-صtݒffjx8ѿf@'N,X@~FƯQP]gp"\xzН%<fd}5xׁe' +ٞDŘ/K^}2n!&ĭG2K{_jrONUpr&56LZļiODb.yc LO_E+ǵPPgYX0_ߠ|W9㬆?e$Uon|pw6R,G%Nd'J*uoY7o tG>=]tSo%AIՄ MQ٧ %u)e(,v"0''>2(7IV?2oDZ^N"0Y?[(,$Kɞ%;9^|/.frDy{΍S=sE49Ͳ}AGB߳Z#8 KcZxugp#Dd'nc]5\T K ]IF+U=qgJ}5XEÀs)(`L-A!XvMA[]{Br2`y)nDwYm,GbN dD,K`=$;{")>kyV x^+yJL-&^ d`t՗ -k 򺋮O Fh~# YCRcdp"Aw̠0fOgչVߺѽv$!>%y@mJ(lE#XCFmm)M@nW'P\ ~]3,.ԗ#3`I-1d yaɽ+J7yDx=}Pw&Ycq<=/k[u˪akFN#o6p/|@$? EdFQ\~:al DL;Pܭ)V=n3`ޚNzȆaRT!!z(_VkGPR `pLz(SFf?Ef(_Nrz藷>9?)=3pwџLrXEX0'%b7:0@ JŇnn/҈UB(o<%qztȧ <&>qίmJH{=CsƤ+1Ghe`BkIXD]Z v~)iqxHYU<v1<㷞GsӢkd%s~?2#Ҿ (2Bi\@ gΩ>501S.}D۹sPMgBV(^ |h= )GR_6Yr%;dn`ÁM31fdUӫ9 I Q? =b'_*Ȗdr\j< ['f)z`m>{2>VsʞË o2 p܎PY9>o3Z7gO `/I@՗`G*K0foc.$?p89{[ʽ8ٴ^|Fq@ |ы'Fs$-9vc<$;FMD\ndDx@FT|KJɛXkaUvl}XUVWi[ޜJKi֞y02Θ՛! E#GL,#sBLjJB2#2lY#_!7.޲O~D%1݆/vS]9O.L K>J4D+r`SJc/P:e\A_xl\<)ӡY BePǦ"tC#v1/e4I>Hzpr`N?w;q9Rrf).ʕޟi1,*sG0ZH۞]3B>wSf udufPp5R UJh@b߳' W7HB&g(5.c O$k8ؖ"m)w@r헺albgvҎtvWl&6b^b+j+Hm=TmGX;z ƾe۠4 MdTdNREL*)Usx>N`j&]V`tXBtj+q?V;aØ}pxIw"FN"Ae<}zzo`x K*iؠak[- pY V:]aʈe z-9d/?ŽlHIDu}~uEQ=g9KCͭJIҧoWW?k(@Y[ǑK-,#FoH@}iW)r;O|m6mKJE-HVZtG c> HO]8qJp)wY!\;Q գ4PN8]Uso_39'e5|0Cƍ(|EZ`eC/@8q2^WeY8I-g1?zQɡ6m{7Mh $*c%>x>?P@$A<;'2"V}m& M"V52vOQ q!=**x'InMફi7+Tc%LiLto4'qɰlaVCû?S6)|O ¯ex%')~< ZcTO™M c-Hp ߤz< )2a|R.yI)M $$¯\K?@yFQ(:04vAΘ?7x'K2xqxjffH<<Oiֱ1^?֍/WZAKIFSƗKhv=6_]k9FZ>vJaϞ- ،Dδ74;5C؆qԁ\9yŽ&ͭ7ҕIsK%A6NAXb nEHnfBġ?M; }VZ&\05S5 zO_JO{p9ލ!Saƻ,0{u͓FUW*ب/L|(28X9)4e;Y0|nFn> Z _o ,8$e'VDNŭp1 Ω77?k)n>>Nl'V6 GLߛB~χlƳ aGk%?gk|N\x,!NCO쁧s [t6xswi"TZcgb8 r5Cŏy|Ճ+iC" ަ=kmerA~<͋Zd]RmŰ)RIz&U OOXg8{BfO W85Of\nQqr] 0@1c~m"3pLMN4$,8c0I~+nz\!eCXZ'P>l-VLL&LiA~o:1m0$M*.+ Bp_] >NI=- 9|yR w_-%Fvy7Cvs4s:\l F<ӗSTSA.CI3sW.׏W"gh1j]"-\ iOxu@^Bqex4Y<R4d"`hcDVRͲVց pfA*xAPR݂-HTk&,`f CM(IfR䦔#3_9Z)Fװ0h`=@fy ;xqu`b"_N.( rQdtKS Z #*b:ZOH f~Q^08+쵈o{%1cZ6ui\C`Yq%m=U}!IS8R!ZroH% f+~v#\Dph[[aNn?6uDՒlz"s+_Ad;opx`׹acӁK\ k8EF+?M(zWۏ`XIՂں60}H'x m6R|oWKMő "`NM u(Dæc8[Ku6%6 2Ut|F2fIcy R/V7?:kH b #ZKTSm~GA֪΂gC P!`Y^)Ti^ыUcS՜l}>*xm3bh +c*g$R`<2ѿ;ҽMrA1Uf8>43ƯG-[Qb3(|~2AY)DF~N[-mqBf;r/te3U xȿv>%grh@5,SoK7 O.`(O)!C'BٞFqKLc98rf#tJ14QuIK|$Q ֍nrt93 sNC% K* W+ ?̕1څan@ ]r5h N ?; ~7TQyEGZg!a8fǮBԒ0LUdV#i9-@IxZ<_klr~NJː1l wc~SdqQRڼ{:ZcogJ] ΥX'ɂlttZY8u hf^ǤnLK=3_ ݆h^5M;*`Xx 6(šOw,4x2 ko_B ]yYڱ ܓ K=Ѕ\nP^%8>] D'Եs&",.ǍcuhR)UJX;1d8^IBf4&tZ`+"&]Y ~~Ƶ[QX08FoY{0i~͡5]t8r2P76hY 8kMo AHGV?,%mUB\p=F~-Šh&)Y+Own6jSsLC Xr[Vs!eo{ ½bFJ(q׳gv(5E5M2m;X\rMQׁ͠wG'vWP'HJΠ%M bbU°SmRxOmn*ciSX7pE]=u%yNTDf'W uCheḚ :biU<@,̊LT VʼMŇHj&o[vtAPf70۔STB/zoKS&Q?{|~۲q:קhScFfݏZ^+ђ>$Chu?n7K-_bzkh^% )AR m9dގYF.PttQ'CEy5~Hr*Tփc:`eeSo׻IYÝ;+jd9bEvQfh)l[cOm@sGBϿ.휼nc\_p2~sPٮozF(QJ|qU@?{.H HMم ,Zss=sMtR}:Z/`gPw?1P a 'gՒ`048$T=d`yZt`[}A]xж:y\KUq+r+>dtVdIEPns^=5vgdOeMl1IPva9񑿆PއV!.^2J:ȭpnvom)gj7Yx~\I:ي TzKCL4E(psnV <&,5 K{0XHy /Jr|LBÔ ;ڟnZ"νNycЇ qVI Q8)6^gjFHnfIr\-fFoK5r^żFPX [Wg޳?[ ^5kXdnPX9bkp9V[%1zCD$B?z4LI],._n;Xe>VROyB1_:bu"InYks=~{]2SU\:nT`C/VL?'| 7Sj Ʃ޵8Tk1FieƄ(QE0;7TVc*GivUzey?S+~zA4X*gT>>IYW(=eq?R@n5؁v`/-#>>Nefum' }1KO6 Wp!A@"^HqmޞLc1]}C, RP5HƟ}gT"xh@hfdC;+Ci*PK}i,6%ӄK;ZAKeQR.pNiwɘfBVDTDcAO5"ZW]e/'i UߣCxh+0@_H&}[>)Mj예;W{.6pB =qN'j-zHD@ S!|dN"!nbXZUgI[mpVe#sdWXU,@㲦S$>,b>,Ր=-?7lQ_d8!zWN\ ZEaew}"VdY!5L2tz{I~FʐuUn,W45p.,P3O^45[mL`7Xc<®~leL!{&8LE`{e9Edm x ϢK@ܖXMnQ2s=CerV`Mu^`FJd kod.v4kxl jO_a=CsiSK򐄗#d®!6䶹d *w>T0D(j^.e}rjD$}0Ni;=U2Mv=_ΓއPJ>!EFu?PIZu8K֩ݚ\]>_Ej֗RO$4\qRuKԝ y`qw@='c-AsSWj•XK J]H˨kmuEM3{be3SSrwSTC9kw\'A&J>khd*U*C?X^#'IcA 4!mNvk0@|QLbwxL6қm_|NɷD0 -B:PƂDHv۟a|Kc :|tuxUښTzE ./SLho4I+utDLz%_#l UBRV_Xa6H*Q=R#79f+ww IJG>tY92ȟ,1RIOO6 MѯܚGw}(]gNA(~ᕲ<`ԌjN9@!XmRY;ф[ 8 0Ps>s U0 f;+S 膊dgj̈ i6h;(7-~b _S!Bf9BN27; 37'i $GSb~ g[Ed"h g(8{UwCf@>yvkҜu'̠ bMC+UTFnE1 C`vjɟ_`rhUJ >KTx̉;|gau%Z~^O 15K?,[՜s[J[B6ɢP|H^O P"bhkm({ˤڂu:RrUR9=d2-sqI6 [(NM,'SG :I=?:[q &'ٌ'b E|r2eXUvڦ]i#2/Gh A4 #usD~zieY ,;URYƴTmUWYz[>pwBkEuӠWSt+Dzw,: FqjƖRIm-h;-R6:wyWEwG!1!buh aFzycUVwTf҃ (~TM=kk?cri!L.rC,Oďj$Z[*_cOT7ϻ2w3Jn46j%JAGO>E7tp4\F;_&b%K!YֹQ : z07Ct4.%s+EANfLE_ 8ٞ3/O6vQͶx_-ڃ7d2{Sd?wik~\h"?ʻanZTgJCsμ  q魁f)`]Szwflh6xLc%@\4utLuS cbWbO`O IRdx b:-;cգfh[vGg"~ Ȋz\"8jʭ|vL"cBr~ ,syUc */&N}iGԯRMlOf"+"g;r]MDYۘ-D`5Jϴ`o^|h4y9U/^Rq\EkᭂS B*~WA,WFbYYc4( Ҵ]-ĨC\5 c9rn9eƔgwu&{)H93cI<@_{3ڰ€bi/)m6DFUH, uCGlX~AD;9Ltg] "ZMRY.L^*ARG_ ev]]ppzhSMۚ&js螺PIkFLYBoAD9F$X#`,pe`S Q\UTL#Hn<f Ftjg:y/?֔D Q&?WQdD fe ppUMՋeA H[(?Ž8LuskPuiew_V-R9yg9YCO)(C$kS%D?o+[yzOj6~mQ{JT/ܴrDYc]u (yf4ݬQ7u 1I*Z @0(%fK}yo$AcGPPremo?xQ\bײ؊m<QdH hO%:BF<ċ_}Oͩcw *\DS髅y[[O.Nآ@eĒ82]_QpšbgO=WA=NuF\tܒܕF7Cp2YHS;>Xd᳅STR S?0[w(J!KGNn gfhP(|qkgYn-vt@R@A2y)GExjT'-<f~׳آXk_iqKbF`4 oN]n[B'Gz+и˷9GpE"4I2Y@.O6ؽYVm+r>J:W-/x'DN-&Iol$IgnV|S"J{BQ|'Ct9%l[n՞*S_e[ Th$Gc.Gr^F'7 >rriV S}l>Lx"4gZgG1Ҭ8Br,ŨGN7+1A}6|R7#Z҃uAa~D[ xgc?-Nt# r@gw4bQ$}6MOwOPAdjҔSweQ # eQk(or)?M`h87dekN~ScDbq9myG0iL %Ǵ-[J}\$Mz}6H_O@!9a\s]`%D$b+wj:/s\lYtxRj޺=zZyZWIK4̢Cͤ-Dq:7mY^,A `=.Y Iބ;T/uNjP/|\<漗} sj]IߢdJk t j }HIU[ڗ˥F:)͍(DWSvBbr>kQڋRy.X􉩡=G)Ɔ5x&[ѮȎʘ-nqJMYJOxBzrh8ʍ瘜Z /poq1K 6Ȍzba^ߡ8tFJDEdso5>tWFѤW]]}Wuďf )xw R|mZڎncV{,+}JTSNxDNJ{Q Z l])h!_U-5\e(1Xc Gb3vj< ]ܨ?^hl:Q`?RB`tnyrul gejS_xwsdlc~à Nzh5p[qz*(\8HZRPLABLMY52 f:4f %QRp ~vJIGȗKf&fLksj]4_pXTذ݉xg_ brftyw4.+*O&؁oӳwʷ@`BAW94)5Rc/NbKȠ:#EGBxæ|p/}-GpJ k+̸ p+:M2z{Y ]F6;' LHMa~ZoOfL<J0Vy8@bs襱0T&g".x~ikHFLFp:b!ll j8Ag# Z^*ln6 Ec],9qqi 3[& 5#EDXLVt:x|M\Đh@1>CilVUn߫VBas%Q0@ Blk ^3IQh!2޶6H} C2F5DK#_dd5eT1B^$>/}eVCC/Vi')0)bֆnXJݕAL4|#<:J hT{kR -`A[`fI|dȯ"_*Ă'*Zg]49,ݭqXZc@tA#KGA<阁fT{|N:qA)p|P&R#!@&Y͑* 4dEMex&n~*ЯW0@v ;uA}mPck-S6>IDINf$Hd0y,/ھ5* u+WOWi]'>,{]HaV4I6-cCk5qXtf![1;_Aidxa|Viar{E{q5ɡ>JM[v|G[Frօڍ^;ʻ+!ɜ\Yg#LgpQ1bʼjvHE!oڏ`})G?)}"EdcѳϱVP~cc*dtCWb* =|C)l]<41~9_e}m}&{L-憺~_-D{nt()eq^>rdjQZ8Uc獤rR upjB$ްf['ȹ@)p BƔR-\Fݎű1ΰ:s(: 49S98[6kI"uAJh;hfoL!jm5IoK7hAIB烋ߚ\D\ɂۀEQNSZdnOU{ca~geB"vqI"H+ZV},^j$~i)f2R>N>Wd ]ֻ$ې^OZf'{m!&j"5s̓5ct1n%BZqDjp~skhV|8EpWi6kBPWo'CvwہM&נVLDSg-KӁUR`L I(l$$Ig~FD[ʱx"Dbp&ۼX<^gkbex]{̅}q,$nNz/>UZ˝?͟sN[D!Y<1+=Xahn Vi0*5LF)yZ _k²^NwAO1y LAf;]:Cr߅h".cU>{ߑ$\?TOW2kV\ V-u4Ϭ! i4_ zH )E<ɠX A5wZhssnSO2bRC@UޖqBn:{Jzf ѳ._3K)&.ѹM@ğz~7޽l-pE0zE(!#PG9]EUGg8 WVri,d5_G+ VનFl?8} {C [&16jI'$SSa'CNaoCś1Ϩ2aEPz \Cˬ߶>GVHz+rPtlK!LRn,1; _mLg$R&Hs_zw3_cr'&0ڕXal||¹8kw~88,xw^莚>׼cxJ^!7(8Vv%2A΀ A VK]hExƫWJkholtakK[@l"jfC1;Lc1H9F}2P4Xrk/@IAIyȗFd % ANƻ{P|W+qHѫW'T\U qD;Vo;-GΚVV-$"m%ƢAq,KUX9wx-_T&x <7ok1=[+G#೸ ˂E-0uJ%F fi}Vf|h}/^0_nU3'Pp9]l[@1 Aߩ:~;Ges_XzCCri>qNWT `w(TD l`;qM?n!x4Fx* j٪¸H||Ef૘kMzOoJBU]ۖXt!~X R*AHnѩP=oNgn: )dx5E#gRo9F@ N3vRVūlׁFP L!'$CMb~i&en )#y0-Wd9XڔJ^>p~g4ĨOK>|dw̼"gVOA )Nd'=}JDl롞b#RhwLf!"q:]GfJy{Vs U5>DZ`S`0,M+|a= 'TMMհ6xx']K'M.Vkch)2 ( q4^񤻺 |6³ 1ExQuLGTS7 BY0Hw?+RIaYܘ)y(EJ1&0FdѥM"X@y6p/W}eTF!aRkn1v ;T ;mn!|#]E:gdtLD[J '^i[kָ2ɼ#QƭU|\ljrΆa g+- G8k:YAg@/}[\f,BqXsIQ1P{\2@:SjD.P)=%Hh‘uIr-N妥@X`W~$^Ai36қθb)(P.hQ0DM瀺3J i0#f `Fc=34DOY*%. S ?ح|>x:݈t6v8'MEpN ]Z2jD!cga : Z[Kp٥w6{9H9.yF~ Gxmǟ bq# <LW%.Y>e:|lP b_e0n NX90 0#`$:v,?^4Ev1_QՎvPJwpuS!at8 e@.Y[kԿ\LC!̨,.<N>50,/t $ \eF"Q ^|#}Hԓ mzߋtq?"q+f!5[,qUIZɸOY׮Mj2M)qwͪTeq~1F®Gyz.j1F]H~=0sZqclJPp%"XuL1qNtK$;yC'?5ER't}TIQ~a]%1X-tVV'q$ќ;RtPhl]Yڳ8Q$lv&re *Rqc"Xh0mòCfx>XR \5Cͱ8:+|Ht_|Tj$#N?'A;霣ZQwiBU̇证j|BFؒ*BSstU-WբŦ6җɎ7uRhR80Tۢ w;<{r!gIj#tcɥv6gJZ~g#u@٢EapEQ;OW݀CpAxlP 9"W7f cymEA!]ҐQds*,?VͻȖQYtI[@{}zw< U`Ն=iY$9oNJ=lYU ak̽MVomQGhZbLǯ?F:f"@9+%lz ܭJk`H lPHLBSYGxZG$쫥W `R}Vݡ0Sl6xd펧`mU*es7ȷTQn   K׽;rQUHHtPEQWJQ]MS&kZ&~=(_d^mT&e?uP6OKxWnF'y'57GIdWD#^-~ Wj)b[>mwlL5 ^~nC,snw;rFdËy毕2Zx*GtXl8?zBsRINu6sYayحSN\:yܡo3}- KdL0jpy)Eb0_89]a_1"l>t.6[Wz"=;6 C,ŷ}lkbN2zI2m5DNBhI[ے#J_B?DGR]ry7:V=wgYOUsKYuw焈T/آjKh(o-X)njSPǥB^D9 < E5է2R O8OSu",Ǚ` @MQ`%̢#hu۽`\~H3S\%sAӰR#xsZlGh6wg3%0][Q,VKFqGYUA4eSI"kݗMWkR 0BSä~п!ԏ3Te^9sO!Yӳ3'M/Kjܣs@F1z3Pc0Ƞ1qNƵĦ ߽X $|2}d@#$Q ;HuZ:fov7XM~e}n nlIZ?KVTE'`~ɨ@ܰW-ki1;y+M/"lV ~I|.Vj)&2Ku R,:xl;J|E\>^iU!*gԒ CG\Vs[nAcv\1bTzhnr5+lID`I HfZ"q, ~`"7#}\mi$c⍷̂#鉝8Ң{kws4avv121vbcåJmojBHA]zTGf/#;<4OHKLSZY_[@mIKb^pۘO*C)ؿYsl'#ܐF#3ίboϺEGY:,5X^x[; )WC/,WBnEKY'Vyv3}[vD|^^_f_n %˲v#VԜ 5?'/j~_ɬkѹ"b]0KCE(Bq)7+R@uB4?šT'KeWwfySsAee,&iNv{1 0̝`I2OH_;6A"GT3>(=?Eb"7C&RdX)BMrd ! K[ԯfY86pǾgW2 X-@wMçLy=⬔3^9PW`ȐQ`]_7yGdlX yC!針I47"NXu%1Y}D+/tb$.BC0)XNݐ<dUʻ.{90! tae~aZ5jG|9M<ѹ]iz,n$4&lC"4LwIJcc/*eiTK+oQs_<}< d5JZi2v%we 2EΥGOwaVB"鸞JXARG$gd]ܮ.n.MK_ JxԧFYͽtJ-$kn/y|ސn@G*"L J; -|;5AJ Y;"+aGP~R9[J[ќRUoEoD{̺QVÎyxbSE ZWItrD׭VK{apmcߦ*6L$RlO^l/}`dkKZk-" ߶C#H{Gɽ.^R1ƿ+ėȾT\,;-w9vgUz,j[P@::@E|JC"Z-`u, \BrdHVԪp*GԸw5O $R}Z4,bD/ 5o gwB gyܸ[]v(0fj t(@b.爲lr؈62qQ9b" +(Ι+vD]~AeyEj.*B@6Gҥ/:<@~L ݢY&/Z)?l|m=hON /{U3"G!Ȍ Bb%by%ǚ+vY)TYӚ{W s@b8*2 25B@MN_}<-{ƴ>&|[S`؉"xL'(a~1ν0[ld2x'ႏ8];;ޠVXrxDi?qKrUocJԉIl>W^M^ΝQ+ <`Q]IkU\[ dz6u%< SڭKcD{(~II׹D/KP"`Ք2ۢ\>Mm޷!?&k+8/ :AP_Ks&05"FĈ{;rG|3)ťWXjGZ /Y\ʀ3g7B'Zf쮲E+I7rjpY~~0yԉX&Sb'BFb{f;mos"㐚y |2 JV0bW3.lIvg^O mr1@'5eq_3pӘci)}qBM7@6 y|#—%ǡV)e"Ae?10nNbh8JSUs>4+bRn>=ɁazB *ԗj6JXɝL+XE\D셉B~ނ$]ԩwDn) x{Q Xі!w$JRjHE4JߍVetp .=Tf\}VW1}PLGͧZٓ&Alq>ΓZo\LH3JXg\0ICv8w:`\s 3Fdжo8:ޕmYjvc߶MAZ~kBcD'}3JKK?)NFi|uޅ޶ُtbLJWZm[tb6SV'qs04{To2X$"ۈ$v&.GbH~`L* dnmgraNz/9&` =_HA"%Yyj:9Qz/x߸({~ϵW;̡ăRϬKgaC#cmJ?Jε['S]ݠ{B2Ψ^u@X s͘Upr ٿv€)[IDP+ٮKpj .6ρ Yo[$v^C"t ċ/pr=ש ע8SigZ罇GkL詍} Zĺr41a)ȋY_`bq~H(6qui)r}r4o;ֽOagYIqt`4E1ӓKWȢOcZ0Z rQxrW=xmz˞bp|p&!Omt| c,?cIݛm]&aL&uQD$\λݥABjE8JayoeUH-*URV[W/ Gj-7:ys6;3=wYԖ=OfgBQgםPBD  ?oeSefzg+MER60OʫC;ۏa>h_XP+Suq^K K%b?'A/$$¨ 56̝c8qQ ߺT%^M͗iÑ@EZ|FRe~3Tі驮\Y6GC4v4ְD@/B1* !d~NdߊhO;ȉ}tXu~>X@'bՖjcI:lHnDe o;,X#E|nCM4 ,MpҠf%Śt֝6Mv w nvѲLa밹ДHk'p 1_Q愄[yt_0]Ea $߳ #2K8Q<%C˞'֠/,ԇ^V%eySa'~1 Iw;4*8i_vjq!jQz [g2Tӓ$*g⬣Fw*+FP2 w@??ǸLXg%8o>ϔ&1!_n-js)0]j9I\'Dy?|A1ts^:VW 0Ԝ cR19>khi/{}:H ʬ*]CYCƅ {`]VxI#cW k5T/z7'ښt*[|BiLLĂ8`s:fkЭMQ-A<i__uF80+gɿuD8+gGS-z)v=Dz8avt͆`piY!.\LL՘@!x?lp!9_ ?7Q^_)YoO̩wdf'3{9פCQq JֽM@qszȨ rFʧ$P}]KmH`͘P\INؼ-gtOD-8t|YLsoylڿS;bsYwَoEW.7ѯ(:H10dfcՏrW"I۲|I=<@c3>PlUC;N[䀦Ec}}_8'DIkJ!ki#!g|vnUFܘ\ld)|>WXJH]JIjѫ;**\ޙq\w.MzmBlWK5PuV)q/4zB SwGm0Bl0s;#gqLr>W>iC~ph*jo`_o;@=_u- CDnԝ 87K QqRQ8SՉI/#+u^/\e?Ne'e3ŨJ웶[RH5{~P0{s!R}+y`sM0O!%ީ?SЩ\o}`иA`bjxV?ԏ|DTʜx"ERxȻ{ M4bxFab5k3K]UMCz]P⵶zX~:~{DF`rFu[c$Kr.?_&]WaxOIK@n|ײz6p]Ke#9{mJ\iE0_DLbf^>lGSr tapyqgvUzav t\Ow/^jHm)WyIoW_*Z7sl_RHD(LK.m$p]{3` *0W|d WCUF3uZ+Pu,k,`W7<9hquR;cc=8 9mk"SFSw$^&åDt+]ܨXԸ(U+bY/3d}Uu4 e+iT;\Rk @o 8Ef-w%nyCMbQYJyծ3tXS`;m'U[a;oW\@nh\D䤻3oE¶+A36<׀Z7֛r$tvzaFQ@;B1DK !1E~B-IYfʒ~zQi~8gIORa^N4c/r1Ol=b{R gG5[b;}2i~cY;KaAx a_}^|epH+B2\B2p#:N'^~{i Zm>bd._}zxe[t>H(|bl¾g=;~uL$ZHFNZ2{Bs̐>J4ZYR*4NR]KМq&V?-ؕbJPSژ3HiGp0,8N{ؗhAH]yuҹ9ƆQ{ ]R4)AgGQ釁we6t(C]A"`YgabH*hY1*.)Ow'.2]Oro^=w|yb!U'q~cb᳋aXG-nq iEf|lP=ɍ7N2 fM)2$5|G.;ġ~(޿C/a~mByp5JA2ט T>{y0P Q2(Lvla袟چt&lKK>2'G*Gh^+0^ߞ1yٴx‹nB6*gvիoK##A_&qYbڽ2 %JVJkIM/],PR\},%Z`{W%O9(!~&'s;xwPy8a,r͸VwCgVxhHJdGWF+z',G牪l6Zr[=XewYa,<$qgjyܔz/tWqWxV܊:;儥Fŗ:PY;Q-CN-ljIRN#dXA}H/ӡV|GX 1gW-",}nN_]vg{$e[q,W)Vǣ;Ec6"X8SAm>#A-Hlӹ {QVn lqu⸊ZGH=k}O @"g.,-!0oCiעyˣp`40:wxm*KTdCKH45a&&xA5^iJ8/^@.8Xu'%FA\{05o>kf:F.&Ӷqn}RRǙ< F׹ׇ$,1fbeґwxTLŸ&?"#P@z6$XFvUi߲0I 7N+dPD-.ӪaDI|ਬςែ6}dΈ?z}["ӗc 6G㞄}3]\Uu}gl-qy>2^a NҁN4\Ǹξu:z"!G"bA_4fb&Pf%D.+)٪z[M[Kzj}8ǪLE`rv^Y=U]xy_ xlFvn$6k\4rjwgËˣANɫ K#MG[NBJqAn #?̝vkrX!y]Qa ?,kO?EdE"inWt!| ߑG<^ 0du #IqI Wv"6<Ґlpr. Y= jtC?/K$A8?fG_KL<̾ nQ@Y7^GyY.%'Dzo OM#lwtE{0_;``,ǘSlyUvޫ)WZ7TpJx|h*֖XUlxA}B4Ɨ.K[NFZE^WD֑^ݣӶ=2ɓX1@5UK6Ԍ$%x"[nMXejXV7kOuJ@u3e6*RׄBkZ.,sE`FRG]'S>[đ4& fSYVL'ttg r5A9p?g6WA6~@Hg#F@MD my|4Q YVר,Q`nIDŽhaݹˁa1+ wez.#cyT>>=~ ]^q5)gMgS⮝EOO Pmms^߀9ZFccq#ZIЊb0GZBa{g&f%͝-7=쬰NiMc-n@NrPmb'ώz`8pvg@1䂲ax0u#VŠ9g5U"߈ΑK|rZS'H?:D+BvS^1h1'ɧ4 O! $ܵSh vq~Gp16穱c4ak_ISfI&#X!'a|vFwH\mFpkn?Q0%R1z[sxW,hVGs>W^[) /HB7-v_s/z^+ZLiHǤQSWQ8*T;vyp_vc3cZc; ZhFCڷTu| 1NCpX]6:1 >;!-"T nҔkkIbĞG4\UD&J:5Fzv~HAWaUm8Ⴚ9ط۝蟝s`mfnkDCȖ$B h \%C2@+SSO$˂j٨S\U?#`(G'((}#ң `h'b<[eٴ.6CckU|A`{'8_wbEjQ!]mo/7UQDtf.-ۭv}dBM ߄ɯ ]I9n'ۂ^nеatN[M;X=$#6$D#z1Q'UYP\eVw迦77;ցWޓ VLJ}ުoܤ+oPKbe8k_^2`v:ۋdqG޺> h pFwI{,~=7Ȕ^iަ54G!gTJ[Z EECHYJ/]q0&Pyj40!}B#zt'f>7 mL o\rBl.HƅnIS a25Z84ʛ(0p~A܉(qP`^NTcS\U)VG+%"b}h3bjJ{'Xv.Mkw#@]QCpio$ =*U$|z)F:#ҝ%bmELLKJj뭐o^4׈F@V__ɞDftKbvA` Vm7zl= )Oٝ(\J6"0CR _IO$3s-@+)Xj̻Bm!yV m<7JDN.zBUYil \bqz&oUikCu:kNS{GlqGe !M*rT/yHkMXMY@~#o){CmY`^9!ocYox-[%tO6 j3POx8m\WEK.Q@&$%Fv /l;l^v^zr&܄u&˿W+0[;:aH3Hu { b>tM%gd m^ MI̙o ˯ :׍ܡM=Mvh[?ˋ[E MS ?I* k`r(0_w^WUy%Ntm "|6Q?G266W>/be9 +~D&Y> ;%DFK㓊"r*p@R}D_,5n5ՇFH&"50mwwC60)Wڞ=[8}HUkTC=tmIS0B@KyyCNMUzm]uDd OSWԡhYTG `u\bU!=N#hmIHՂoq) s;j5&MK|sm~MFZ?;2%Bod[[] ޠ6wXɟJzS}Eֲr:ITSGXjvhPwN%ŏǰDQwpa0B-S֐k4Q|g̍c@eNy< uFA{[Ab@q| _'̥2\p' ,, ^h=ȦM :7q'?O?3:Mq 7wKLzIașv̈́#MU^%_DyZ"jsVu xU#,Fd;PߪL[$ Dc j,kmWY hR`1n 2 ҍQ{eҭotgp9JGTM۔ͣňIa@ ')̶W z?UyPD$p3mXW^9e+d;V-M R.mȢS"?}wD}U/0`5=D%ZuMtuNUS^k:<8{ L,0XqaRarZF+r03pb] 1IS80t(ձ{6E {kcP}[grJڲD BW; Yû\r!>Q͇J*Tu f!Y yGc%[3)5+\g)\"`XY116wu/3t\kyoYUV5, *18꘩Pc EjW',i>%d:;N@WZEmW0W7!LX}zIJ/bmYKz~6vˆaU-ǎ]=*D/^M[@T:j]*uhgx4U`Þ%rPE8Vh7/jq:7SG+Uaћaقn]?BdƘq[:D#ʴ5Sxq > 2wHshƿ&6D[Y[p߽Oɯ*RM=mAoC2z02ݪW[f@NBQϦ~@U­bbh+e9Ak2پ/U_{{{t~RMTWKҿG=,Q ZO` "*-]ǯMzbxLp1c yit85x`0{`"l.{KOHCA1hnST9H`I:!̂۝|68 0N Gy/5"c{ްlK{΍>* 0F&S[;K]^B1$K5(W'Q]Z4)W?vPވN!V2lXO.S~zҸ`4/'W7(|a\B5a D [# E2ys阐(|9;ws̋}tk_(,H$(mr ̐jF_7037ZsȬOӉLto*67EpT5G1a#opAoB{F}gM8:ˋLg'A3 XSC\Aj.=H,Apu͗[a n٠hBX5|7ͳ( 8.i>==DSWۘ( y'L VT{Ym? /37X>rqk-0ưkag"&gFC7CY=eFIy|/gNid@T$!pT̅5T";[{C&~,NYis?fe=AEλ=q7ATyWێq_@jyME R^ 銩DfwsKMvg$T~6;JO \abɪm"ʆG]Zg t؈=1| ډ%|ؙt`V*HufmeS(F7Mi'HՉ?hnHC1[f`Jada`HN]=qUZ@| <_Z ]KQa#->D|*GpPNlw P4@Q:lMU X$$@b4dHj`#3o7Veh1xmA ߘczBED~=@<`YMS;c[VձW5_ ܞK/0!( <՗l&[`熢zIC/>xYeC%br8(KYDGVY>%TkoU#+X0롎F jKE\e#'< A72%UGBG ٳqe3?l1KhD:kŽn_jROϠg?O ]B֖6JDg%hq`o'`Ǿz)E^;BSK@.x`K1yns6׵R1}P2As 38=&#6Mcd}'b~YU"ehkCE |\ݯDk~ *6#u0U"-+mJ O4اC,XS[j5tleYbkAΑ7.hc2v7 Ǿt{ ی!߇*<-(MYR#0xd~i^PE My6s`&lcm49seBJrԞR6sK)DGcdݎFòݕq4U"|l'}++tUd4%k; 1.;w 3_#BJ׌UOZ2v6SK]a p+~-x# R(Dh]OV5]&oˋcsV_L j[A4㐬t!Ԋnۏa, KEQWmk*m\mJdIyt(sfc- VHu눳]]pX5R"Ì}5#)5p%ZV|FWasUO0OXݦ9lB̮!9*cAѝ$6\~zthLoE⾍DsXRA|Hj_ 6).n&]QpN4lEvGY {1%&8a&z ckMJ%2hl~/ƐWXi݈<\_.lO?/[tVtoӱd=1R9pR@izIUJߚH: vKH޽G #gaٛ8ZI^UlY49dBFa`qN9$H{UDa@4I9l+>=F!9H-kq9QAMf2CHGLXiG@Mb w}HE'?Sٳnl`sdp}fjNK[`ntgК3Eʇ8}*q'8AVF54#@Bf;N&l*2蓾V3sQB/WC4מ~8.AglP fxTF'yQfd7@ i!j0pR*D>"hjA`)<6wό#t t+á~RUp!ҝxqQb4gSjy_"ƓTO+} 2`Vsr@gt3)Xj89*L#v(o+xPQF3.Ac4 f(6Բde y"Gh'ȗxǾĻ}?ů5c;a^K<-_ZNOيy^6 Ms]Vb~wߨ+v9Nд^Lz/ƹ~ʪIz飚R1[qЯL7h^}ۚBL=uBMś`E6:]SadR: U xkd@>T*L\Kl1J: o!El5~X`s9sh]8ܶ{xEi\V.z%8&:uIRmvu"ݙ"]l#|WDIƛtܦTfS~s_xT@ktGݫg[‘ ?]PwV*jQV!+#{r;\¦': R vzSBD0GIrq]ɌlYҼ r.k3pY'Xiδ/pXo윹ˎz|F@oQ|FńB?I,E$A|BA|e9_[?$7WWQN!#^t>Cr72v-mL=aIպuǧb ;jd; ]/WQl1h=[p]wXNG5zem>[GLr4T'm`R/zRAapA\HVG ԉ|S]FReZz,Y7J[Ko;KAe1Xfw\rb‹ QY=n K_^M}YW7oD({oKz@ /-yxK= V2&ctZZ^]J#)O{xV9ǝLkI)[z_pydM/IC\vS3 $ݽ VC{T(і[.a-NUZZ"iwC*p|=*PUIQLxAߕ E57\U4jpPf6 "RVHBEsopkXN"(f]P E&?Pڕ 7+@[tdE0l}4%Q{Ng6Pr n%0"eCdlh6 Jpn"Zt}a6kA>iT} ~{&8.Um*+TN 52ⱎ] FRGj u|8a h¾Z^ \ٟWK"Fndz9zYtF o T  :s9ɷ|n(j٦[/Fq<0~6d< E-XYBPY̻6MK D}˕gQ[R$4npjDt +%\>{r6SgDD樜 :7-3Ѹot@@֏esC THKP>N8ǔ LiZƐ,C=e̦Nb4 4!~@(w.-<@hw^/uz-OP2z]t\8K1QBf,Ŕ6b{9#b~457w /$Sl ne1oY`捎DUz' 5S=KfpjU\ү*"׿8]aa=9T&5?Fj^uk21GJt w HoWuE6k\ѐ(О mi+n;+doXڂZB@noDDI 6=a.Ć#_&Ia U#\HK w:utl7Dy`N1ke9 p84DIqcgnLBВ.AM&rJ_;S7z0x8x*{ORaa6&h|2X7颊4[ ul+YR]O!@N.K2eQڗiv/'9cР!izf>vyѽT{q|UM cOgRO뢶-M'E ;'}K.Yh}a ( p\^M pBD8'yvg61ņxƹb[p|) +8*L3TH_SD}vh8(q[34_@7hkɄFg:YokCLw A"abkπO 0;aJ:LQkGF5'g#X \I嚐璺wD #@,#n%{7t`Л% JIyHqd ±C.3=_sJzX5Z=D7Wv3ވ  7]k7YBB~qx)$ܛ&g"*wiˬ)"FP-3t4 .BKSDXّAS4 {hBnf(螉4a%GLaIEE6@9:BnSnp1Nn VCxnLWɒIJ^=hIWcホ7i~%hRgWwzto؆U7Bd.fA-XQ*gR}kF%P@@x.mW{.ufA9g.L2h[7]!$G _] ਢ@!g>RB2)dж4 SPfED^Ӿz!t(~q'd6v$Ձ6.@Y*ݍ]ձ~I8%Q$"JXz{%NZ\d$oejZ$h3)ٵpbq}ʾXq(a tO) {'n>wWfl=n+L0kU-Lg\h`L4< ohA}6"`+R8_`sx_A Tˊ‘*xV#t[sj;1Q'>}1K',Q2EdJX=%˰:\oQi]qw>TVd;\ȱ3W= Yu0jOUeMdO7ƅXIE#qV&Pb[8'![:lENfOoHI0ϔ{rqrSc🱳E-}BMG3 Goq<&Ii@EjBa M` YNJboXC'S: @@L`xo8E1v{AJvxB$s(/Wx0kuX{Pt菶G_sц6K [C~.Z$>ѫ3/7P#(1T^8$(#zV@ E۫2U)c>i;ct68 <Hlݲni˨?sA |DNj[Z ,ȔVCJx8R ەԕӸӽ2V 7yGԽw]fݤz3~hb<*rT<@!meMW{Kח3N5/yiKPWQ~ a-Yͽ~aRWIC^dfhAFL3e@m0:ù'u}7cs ?Hc^K8LiNڹ|OZu G bP<+㰶z6i#z2„l! ӀO7.,DB!o*L妝!iZ(a#17Ւ^]c_:o8qrI9F7hօ64w˄c*C'.Σ+v2&JvLKh6/ԁ8dZ y]};^(/IbF=\ tOeռzY<n0LdN_g I> ?W/uE$g v޴{}ԧ OR6@ T[Z|9-ѯ聣Q()IqJa1[x<(cbG[EXeWrM"C9q˷ zoYԱT~S'0pIı>~޲wݬ$3-O|(1r5^]*:br=uCQtC|gn V_Ɵ{gޯ9#'/k.#7r>SYb^ %5Ă3^AuuּsWR q \ۈ)Ij8 PmBA)`_K3)t,\|Fפk!.O_%87֥47s{ig]㴐C}q㻐b 8ǓHqZ4tMt#ƏpiZ qASa%z@2KCpC6 PS|W4Lh.SP`RFS}SC$h $[-D_Bg6eTWg:](Ten8 8Go~6*mDZT$lZ'4oCk;aDp)?G01K@wފ!CU /YY|}]9&Յx8Mk&XX!5Xm*S ~4xC0.aŮ)B.a *?t(VSfSǼyvyT%r+h3V$SXyTKCAoI~A{4l-( W)9bKkQZ A sКm td6XǖSUfiMZ6鏄^ /y<颦gְapx[}z~{e%@O zV2n/ UN>7F/ScO0;t{KdLbW8u(|f's(-~ʃ0D(tCIN^@1 sZd핲4*Rau= 1Ώe=@h;p6fyyIz[R>&(!+B1q>LrgaXY֤`rifv=M)N_foH xea)Lj!wlӟ܁:MjiaE$Z G{NS"CC-V[׿ X3"hr/ i2nL`rk|E\skg݌!WE`ZdFC.VбX*VXxff9,D^87B \w5Yl . $:bif3C :(>2-Ӣ $?T26>I;myƇ  !fim@ 4k'4VIt,!BWr}8Iyk1uwRΜT,HҗBW4}db0vTgT"4 nm㞉2}[i-^S֔@*OjH, ?C~]Uĸ5 P"uJZC7ԝ2Fnk&CdjҙF1Tʄd JEXJƲӚ"~#;"tEN]׮ovĠNGc,!+!n4Z b|70ܑ8)3L<02k-{"3*[} : p eQLX1\H }mdҿ;`0/p&q>Z O\/_#>8ǯJx~mh2pxfi1}5&q.KT^?ý]RCgSiq]+u O4@&A쌨ByuMJAvif@yXXIBkIz/.v?c)Qn"ے#[:Ss%> +"w7rfo|sS}}h7҆ƌ8[u"G3@ۼ鵐hܜBņ9RjY@n,d'&DvH[^g*p(ʄZ J y9`C:"FenBQwq/ Nh؇8*,W{ Ɣ {˃8b)QF 8?5gmk?'ܸLMb_Rc}!rWVG`DƘ\1;:&UhOm?,d!yU~t+I٠ǘ 0SBH7Hj[/ڎ(>·|%qrK fiB?B1;\o ]50xS4_o6B2I3_ːOBodxȾ4=Vh>bilzLQ?K=W@5AVaCLJ`_v _Q(i f%aOH7erY'A@_TPG:3cҚE]S'$9)[lZR~ KOvg1->EV3j1: ]vހcB~m'+_ h`u1Sa|mANiXRfb;v%Ral\̭Mc"E?";JfEy?+aiuL+&$ϪJa*+WiL>ُvy•wVjJ\B 8AAK22grO;!mLRݫa(^HF>'fq'7ߦ&zv?j !`eΡXµKDFX/"JONAAJ(|3^"Wno;u\##S]'}"2*\LIKRs[ڥEsX?9J4oeHP?.Lr< JH`k |pZR.%0ŏq:ߎ Z882 Lq<>KyGUrA8csF0  ReWNCQr<א"s`X9'(Z EMD!FBˑ|[+ަ-1r "1NVa! >*uto=[2PB9Jαjk4f I%lQyߑ]rcN6!/bmCB:!h+K/\`WWλz?[HT҈@)Bs-3{YrZidYiǜIHy"G}@|=MhK{pdjcgU~N7Ѣ[`+BF .}/HbE<(0bK2߀96ӕ)];ںV q2zs3O0aE];:e4fşLP_|\V 5QO`~HN{_dehP%cyapw?X:h [krޜ(=JN.GIqu}6jn&sw%]h۲>~^B2%EGJB6t-?/;iZ17ln)R-I8ڏ {҉,D6ʳsD"a[s:G7!&==fk9rRb1pB՗r2ud+B cG%z*5>~X=K_YSDw>f e! ԛh\(UnŹοZKwB!$s1aj̈́+4Wv9*橽|BRf!-~SǮ5`-(\:iSgsjOyl~(yCxY82HqDg@#Oe=Ig7c?`*@P*hƾOLlA se~>drjcni7IWK~ޟM">0#•`}OBOPև)2`/2{3Ÿܡvercs~j{VwSJ~O{%or {"]?pJZpt_/fMJ؈k@{O ]p7;+r`Q2բ+bZcOtP xr?Ņn麤S]RCƑ'YK,_O6gʣ %#7vq{^6#3AV dQ<#mkPMv[U޲Bdt=1uor[IGb)/S}ь= Sd OrE\c~;p{hg="&IVsM>6.PiX`[x@HCz31 |eagQLDDpTυ@IGy `>ojeF 7*CbɘWx߆LD9 0k +WtQ`ub~##W_wE-vvm٬\]oLu^[ꊽxQ D9KXWijd4sY3fKBgP)qC ?ޠ-bn  d3\E݈VlOzIl0Bw }ZXm-:q < ^'N0&/IPZud=B1#+aർz[ q뒽q_*پ,v,z,yf (u{#'[ޚG{%RLnK x(rR0Jg_IV2gz!'o_kwAwUR.iv8V%={{hJ;&\'b#kDo 3Z/CL%+] 3z츆Ͽ1HSutng Uf3t-|#H{'7J踈qgV8JidžH0'eɳxb.s5OQc B3BxZZpyuвЀKC,%Rqp; yؒaTw /{BSpggg&EȬ)L۲ og @@pVWwW4˻ }< 9P -UmggwG¾%N\9KNve6J'wy@AUrn/kb^"yTD~[BM`ixjyHem_'WO]cd?ʕSBKO۶lV44jsIGABQ)Wj gJl{93PDQR+nЙ\@+|Ube&>iυpD3) PKoku; Y$ǡ}曀*X#R2%c)O6Fp8 p 5n08f>sfcSX(nj$h‰<)F^Y@|24y?.ۗj hM?ߗNK߰} &X EaA}z}ڇ])(\VF=/F2y踦Pus.9b9VKQ,K7#gP'egY"PȺ,f^q>AxD^Гdz!?`vN(ˊUkb\?4.&G6Jd"}*{՞gOA4o*\}%+oݨZY Q 9t5s:\e80KxI"$hAyHFݾ#F1Q+-ÑZ#l?fc}|չb%v 3v=q#no'Q`~j^m%]IniFiZ{,WJKqed~A./5M9XxX1~}fs{z{`2Ȭnn^҂@%3;~Q+eEKvp!\@jegv>4eVݓi?h?}m?sNkj'W2#*-70Cӧq?X?y+g"u8E"}2^TfQ͝Ee.;Xj?@Fvi@S¡KG}9%0TYq'kAgH3י܇%"#w3N1dR,L)*.k,Uf*0X$ZڒV_]E#5`^@5u,q%6{- !߈oz#06Wt% oׁFm<=tUL+~ϼbAQXS"X߈$Gq,X e.k`'ql^vd9O½wȬ$yBIZ2>ރsqVJVKp gA@Z|d?㦝l ^w 5 >COŻi:v+ࡨak6&]ؑa*[udIm6X::#uypN6V~ ]\D|w ,Yӗ18r^סݐ us>.e;/mZc&&)H'%Y9leg ;ֵ# 1xeDLckK=;R pxQLpm6)5\ >]#O=7eF/xFHsB3(o4_ >;XY`d73gzA۷P&Nlnxj>AK `k LHr0c¹^DkP^\8BR }f29V[f53Ƨ&VjQ?b#kC!O~ۨC70g=]v4CGO/TN Eu|T?[U`"!N6R=ig|FYuy,2sH0f ;Aҗ7C83~ m"ݚ-?u| Rub"~[}ES@=MDyf}.ng4=20J˙1t@܊zCJL-?|<>=QP'-Y-⡟<9O ŋ+nN]$d0x/ TZGGj#GNn b-}(Գx,Il"VŬ+1F=51qVz1u*m j5gL WӼfvWL},_L6)f,#GDT-? ܵwCaw<_4uaЊT|g MʜJ nk2wA"fz'Ozmj[@\ YC]I?YҪXx刣DPsPot(c%xʟ7֍5jO运EHrw_~/ի[K|5u !M#^7Wܺ-Vmrmi)D&5hB¶ɔ>VdGBK gW3կ[B3s!"s$kY;Z A-ʛRyÇ-{jƬCpBe'I^W"RW4yL9K*F~qU[#4Ⱦm&p;SG޴W^8*2,#{. Up(~J(m;ZX U45F9.U)P4ND p1{P,k—b2z3dU ;(d!}@1JkqVE9 Pw/H_.BbVHQ)$8Fb3jl1U{SWlJ%I3-ƗS&>+yђth]؆ZHXA "!%PӒNY(qpݮQMKjn$7oaiW `frI@!-jŊ˹m^ߙ8MB:- C0\b6TrxDŚ+yqCpiOa9I<:j'鎖v6BYMT̃cx^H) Ʉp2:!DpS`ir||!x͙r{&ݤ$*&mܡ'M \>@Om:/~S±_a d Q sIA {]kb3y2lLAmɥEmjCL~R?G ߱Qb@;EI%s_Xq^&Y(Vx溫 ӹJ'WZ.~Pvx7Q TkJ#x!NRJJ}`Q֓_ *,qc_i\x:&fޠMGxM^׶9 tbWE[2*Ьk]qFRaH:ݭ_rH؝҅5*N[DyZUYINEGc´!r*ק[q0շIZpo7PH~UYڽHF%|%ܰLˉ$7U*IoMQm X.=/>l47$2[QՅtˠ聳n0+OÀV @R)~gU110E<2# K,8Wse}=|V!d/l1]tsQ-XqLl c(r/$cg- CN=.^A2O;-b< TuT_h.,I[#K2i; @F6VV{׬VApȊyYe+ZS XllzR1z+%+xKo~~0n9g?lt[q+/Ko1Prʤo@NQ2t%N`ǚ=ft6񛴋PѮZ99yA=M|AZ¡dZd.P1 _Dwo3J}؏#P&[X䊪E-G)6J`nN3ld&Yarn-<#\RbM*}ppZzy 7,sv,zytpzNFxӻIO+MZ;z>ѩ$:GOb\n'Y޵v0N[ʿRFԭxlY'IqUc,_aoWIo7F^\/[|7q֥\E#ŁU#5!4\ LϬLSWt7"Gk)_d؟1p(mgbu 4@jλ/j9DAXSCYnjF;4EpA`GUQ.(jwÔA"rJV v`Rj3Y*55ÓgI|3{8B0dJ8;l{g˼('Ąa(@JYxM tlOqb%%;z2P/B/I֠~ѿGc?socJd{۱ :^\Ư|4M%>\o?Dδ,)崙& M"#`M43KN&x)R`ꫢa}JJ0Ve)gk41yre[ưx2n.5t%z шKO?pTN5URXX^5L<(+4&_۾0%YvnIAj5R z`xI~w5Iɛ"eD¦طVb%12Bv\6<s^u%&:bn?ӓsWmNHB[)WW@ddG6dE~Qfc(xNua$wކM R((v@|2!0fT_zw[KtH,'JZ=Uy˿{L2^8_\0qWGy_YJ!F75)\+(tf4.kM:qFN؏ln;g'H9BF!ҒMaγ8aI ,[16җ N`IFDzLnq,=")zEqiTdVVBe䢤$pQì&i} l9Rξ>?L*U -%~WroЭGgA%:B(vDz%܌@]hs3yȃTyx,PU)uP+ Xd鲥Wږ\9ekq3d` n齣]-|u?~x>iVs9Ḻ|mi̇ON{E^ЇgQɃib¶7"yЊL{+-?uu688'ǖoi-{o#هbsIRDx7i[YJ0DGK\_C6UٯY^4y7QgԞ+TH*]JЛap0+kDCAf:z.b=F=9v˔וY?X7AWaO\TyM;l25/h)Rm1?L%#}=3]cYD%~6N_TnlqR< 4Y0xUb "IȄigTA+p<,ko}&u2!2h t  B07 pVo Eˡ7_SY$S.k "O>7ɩhèwFkD#K VfvcjAe|U1$ѨInT2Q߰~궞=mgeH\ɡi5f^da7HZ3R<@CBD.1{{\X87"m`e~jS OԹYZ0tίE+H 8 cIh[}I>=Z[Hx*&F~EE쒮|.!YNFJxY9 `B+QoKMyi;w]֯hэ9Rv%K^obyaCk˛E5 z{yg >zDy_0D, 'LͣzΘ GW~*7b}bwp0_@L-% :I܆;ە v(Oa|/z Vy;c9wƥ?nX?xU^R *'rQ?PnBEb9֪ %Nb%OILV:̶/~U Pnb]b] 8l?r:w5oiz4]C{e Ղŋ.,ZJ(ًTp~MRr?8"2YϮi&HopD'7N2gCSΩ5A B)L~AŠR\_[-6obR sm|4g}AYa sm]O}EOh@(@ؿ:OoSzȴa\HcWߘ.PrQo vK !:sp-5zdX˛T^"?ۤyHaԺ~}yqW/Y__zu g1jwT1J/zgNM-{/7RI=/p=`XlbMY%0 {ZfsM{d;#$Hў> x> ,0^.R L>J^蚅FN" N(74`u&d轢'*(aE{6th%xsiJ>a'͚p}o HACK]>]$GypfB\KNʚ“]EtS3Tb4}xTuq0 i-X, u@3p UI\yoB9nM)@LN[{ #4W I5r(EtP;rV,WNa`hӞL9hke GklqH꣡9!9C_E-wƾPY$6M iGS*Cxdo!peHl^t257* _ELj K~_GrvᇿaM6kW߄]}7Ui/CqzDFm sZ"_"H)6'l9ʌKDwDUY*C ˱ %e/^Um0=^MH~J{u`jYНDqP\Z ~mIB)EE!d Jq,2[{^S,AsKKjr]8SU26h^ov:Ÿr7u_!At 5 c2M2fOyS](wDjQVͻI?Yc~+@cE׶ӧteU҃+*/^6_ 6Ψc2q 5.f#k[ƁO3S)f'y/9Er 8bc·~cq!b{3ȱf :|R5P>U=ouMI oJFa3M@EM^-c Ҡ[h d]H9@ aVtQC^}r tZfQyZڬq[^塮q(tqK㢗Nd^J { 3> ^,nTPcKVdFQ}yvAwMŴ"hbc@̲ JJ;CaZ.,+;s|0c>Q.\V׉aTHt9h{ %_GsJv&46$ݚ1:}xwlOHݓ\3تCDm~0YVU‡cZԸ@gT"<tpSa%yT];Շe  ɝFfhN_zn)[To)PVǓ^M;EX"՘J a=1?*3$,8 VnAu/NH$ԏ8g^sqTD{fGbZn3_vH٪P\3Vp6Wa@pE@ȶAgZ{dk|ǜvKuR=Mz8wQXC" CȃSRV^&Bf.T)+Ù(Td蕴7',tvxG9iz`u>Ђ JoYKl?Ac afRY/O5R&|(W]dZfL@t'I/㽻UӣfNv\z/hLVuAJd9@yhYݞ;BD&YT]HPECy0ïFRp-XpWGZd\lT9XB}̸ nLهp}}P)$IPsO$m_fNV3L_ c " nȄaq^nč(_Swu_';crrkbS7l^Swb$]>JvD'Q)+t*~Jz6n)L%ID!]u]ĉqd39`[Ÿnۏdh4WjU"/t#Y#%Yd>Amvbu5QI3 !&,coIlncp)Y ҂iD[h/;[J||TEt i^<rUɝz_EtM'4NMGlkY<ƶgCR!!jy_!YGFkp xAK`߁NWi]=2Wio C&$Zd/+(aZf_ږE-0~H=;vreLg?< W+dH 8sԚߨ5 =ly]>땢MH c )Q'FD4Bf;T`h;Kqt;&WU@ iйx3ñ B/om@jH#kh>B"R+FiRs+eDhBmxB+'6Z'۶UUSg (vCq~0ڤ$+ gMiO*dzBzW@\YGw2]>4=ȂFSʐY-GQb/ 'Ns z4!xYTe>;{_K򱡶PϪY܇"<%*o~L{Hko7%rr tRe!WIf)OIFFKS7r &$?p_bfW>AY҂ΐ/P.$(OLw{ "0xÑ;=,3㱏NMhu+=V4vĉ!)M'ǀD\\3`BycWk5is U3!NxM,_X|3"H4tSKg7g}7oۉ*Z|ѫhT^^xEJRpA3!lVЂuP !x nkfq }<6I&%Wv*VJ RK_Dz2nT(\ol~5!]H0&^Sw՘Žti2s7,375:-j!GGxˆxm!!If_B4sY`A&ȩiw@RՒpv];d6TC#iIk-W&֙iaEe^ l)T. CF,3(KRֈ`ʙsZS7?2^p xEh<>gM=oZchh"g!;pjkPP&؅ t>{AoALEF1p/N' 󞍙rQJfxd = ޻!qPկ?QfW}M͑xP*j[HSn.P {vR}Zbئ^9MSO -CfdTօvzP`q(c Sx?}b K'Гԭ䣩|{s?=qbܤ PnjxNmZPiOkL!Nz$ D肋aUD#/!`FYU Ufjyo| c 7X,UHɢY;LN,ʵb˼$L?o7!k/| 0J_7=pm.K;[wMnB;uȋ,4}+(:JGY۾Xݍkl\WB]YW vr;߄4ptn8Ùv$VI ' S ƈUE4@ԫ:\h qfΧ|jbVAPD%IstITlV,)=K7@cS{CwF͙y>K) ߻hudTWU`@({2:#g8}#G< .Zp wL# c\YK9@qP7`q^ k "(9tW0^HȐoe&ExSygVGz -}%"+KH([W+ZRYNx!&]Z"1y6!@1g1ac)Z~c(tuy?  Ⱦ5=[X'/>hINOznۘ||U /񺍿[""2oJ?[@kz)qorEdOnkFUl %G&Ks)V=IFgʃFh/Y3 \\au~V$i:pR[a뇹<V4"Fc'Tz n' ԒB*W<阨 `1X_݉wr5s'cm.+_ W.lA[* l$it #d^;b6XJ'ᚧ䡆Qhh9:늣b@v1pCWvw#Dǽ1D6lQZc}OT,9- >Ň=b~0<)8e|cxZ=SL*{M 3d~[|4 TwvQol4l7pMԁ˭)>(e 9ůGE؈'aIb>Y.4l;NgNG]1V+nqyn#O֠l~~R ڤnKɼ5Ĉl# [}3NJ^&CflN넲If5 v}SI_JA[ J\hvtWwƷ3r`9=\s|*RU蟷%ЀL4!~s<2.SZSuÒYԯbH>0hWtw3e/{Ze~"=Bm)RDe>;m,q5fI$YS ?eֵ+;FRDkCÿ[.]0͆OHK6\X&F6yt(GwVicg7ߍrw>=ph J& A#jAW1OYM ݮp5(M;KR엛đƬA0g`/X,LuCr f>ޥ)~@oP)jTJ@導!.V@PKj\ Dw]P]Y깺+ $DNsu u9tdfdhCh-UFPXG] }XO?)zJ <5l%ƒ2nLG{NێYPZBǮV0$I]bZܒo^Ĥ.yZl.t $zʛLM֫TocLu jHl̖4֩c'ܚK|_kR'Qɇ=Clo:C{09IGwi}g֚ME C }TKCA!W˓ޘZ O\icLĝzQ"?l_8t "  ܆`5sOgDvmFPTKAYƸТcUT\IyE%d/')W]f;\jKK=mXrv֟{Z 2UeyB"P_=.T~̇q"LwS*qeG*t靿HaR> VgP,ZT(jӘS'@A䨯Yq2^'1I3%QQ &c5 ˞q}@,^oeMw/;?Ch63A}FB\"P5~!ǝxg)9lz?Os\8VfQ[t@#ؚ6ci$q%r!ָlAur{pvt GW"/B$"cM ^rX~-krbn;Cgn7Skki`(/v_xI ȁ,I(Fƃxy #[CadͿ1c˺υJ2@>!us\[y@Cg~}B']>Ѝ'qkRP4=T+qt'&3r`.Ơ4Nh=j,"9Hf#N8H!B(ŒqjGWZ]}q$52R2feEmqZNdУ-HaO_s?B@`_/Ga} L8Z%$A9#PRvP87;Xm^K_"ǰ.-g4$Seŭ& oY{u|.=|ap1#gEq/jڒzL`eXytތ!W~Vۻwd>hmqlheSyͦ* 66'$*C"`i>WSP=,qa'Tsy>LĨےhhru7E9 q2iTs( z){`AAgxBK $0B)rΐ[s# Q^(-hR44DuPiL'!̺urxBkgk!ρ3‏ع8fGՉ\@ikC"aN9z@kf#K3PX27DFpa9`b )YkƟ?]@d9DW̹G Js/ՌOg5?~UKug ,\G-XӴ`AvjN*睞LSA"( 4y."Eb`E*r vqKPV 9&XI{\ Z' &/vFcJN{ M3Xs18Yn]R;aZu}Q`ܯ/}-Goiʎ.Texmdvn| >YYPt<?KdKr"/fo ^+rlOe2q#@EvXyuV[Ag4 1Q '}wk ט,|I,AR =&_pʔILz  7[VᑟP^}6/#*[r2,#hZnU 8=q9݋BkBGG ,X(s_Maa͇n)FYvԷn.(P!p?䲹+Grrt ^nmFO;vԙU7;vnHۙWbI{'"cI+dF_5od Rm^mX3-:W[ۅ^~&P3pD5QH{9&moR'v/%@U fZZ0GkpRI 'S%[.Pj8X~^ gNBhE.#^LH@fbYz-7SGxj׹+Rv)ƚQ|DMmh,}&\[k8ڻeԕKDAw\.K0 42p`L$J{]ܴQ]| >9(%y힞[u"ev{pxu[NqNG26nWQFƣ挲Ry9*MFk)lO0)[fB32Ots7H2HWڣNG4R~G?c؝P?LbYg]}|;[rRg0ps=ؠzyxo)M 2Qs'҈Á<9L5 ٗV˳Aa~%P0k4Q;pQg=, yo"`Ebj,ᠡvTKJ%+%;oW J)^D\{v0g\^ 'cu`\4v}L R~5>\tI׹|p3J8|0ßN81w[L L\Fȴ[a<&³G"0a62`"_s.+P\WYl~E⻟|*;vHzv<4z߭oȚͻfڪ"tʓZ_vXWzjۑQ8q<9x?wC Bz5);KrvFz ]GV=UT'fS`| ڗTtXN4LSj)q~@h"\dpE=in@]/Wt&NO(A>wˢfEݰ;sm[h!cr gηU~K@aV!ʁq%]^Лk5-Q%Qr] 10A:ba@|CTJfe/Eδ Q}}_ɺyP[Tfݿ>*cן"L\Suߢ'|)$ri%`7}ѻAOҘVAF/IjyE z#a !>wh,aRM;6^G[SwV6Ylyh)9U>wf0 jF6·Kṯ(=R[@*^O9EܞYsJ &WrP#gֶķHϓpP+,d*#3@)d8 7S$6,}ș~py#gi֡*4Ny۸:1vDXlflaL4A4bW+gI0VSDUn,۽Qz7v[k-V*Ybt/ ҸLSX9/Vla2^zQ; ;S\_nY+ǹ"A5%K hwqQ7)Tt W6/#!p}Jͥޅs*"'$! ] {G)L]AOVg0m 05F2Y3߄u@Zp簒>>k8?s *ImpL!]7N]ފYFo!O`Pίu[eIi4šqɀK*cxSrm#@} G~0oD~>.YsGW +b'9t Ր~zPY̶%/pHUŻM| 5Y)oL?ҡw=͢c5*[-'{9EFՌī3xC<p]9W @VT`q^c7O<$JmPR1^4L_i8qB%L$V$D$' ubA; QFSX/_m-UpKm-;\J$H;hgyjU&dyK. /\r}Bj4U}&Xyՠ\PiRA\!.SAG+W]U szъiGg {Vzt˴5Ǧ]Ȯb֢l@/!yuz{sK;Q7C 'F}CT_oޠ9AjeT~;V_`t I=~5V/%1-RO)ǭM&"TOBf5,{VR{#X8o-+)cVBgBl".0_ hv{͉:P)pU/F~gg*xMWA,I` 4*AA4`bԭQw[yO?p: JGQH y *YҲ`'9(Cl2 YK7u8,ӱGF/^gÅRhGG7kH٨4{5vXklit+)plIx{G4 L+Y\*N7i3Y9c6:ps˺$"5e8@0!ra$&H~e5 ;k¢`F$})fHz/Zc s8➀Qnsw)c;ؘpko 'cMc&Si/?uFK%^ |\'5 ex%{FkiX˞.Sv(s1qC%~C3n4?#-{o,*@3&J7ZF[ DlxZ17QoE1" V1=cVw=ks/kk>ߴ/sij:6 1Cb$PfL~nȃCLSQ0z:.$pc_]` .Vh3ڡL\&>[s:||DDAGnQ4ĜM2IU13Rgw%AaC?T"Dˀf1(֠jHy2Q Vi@= IEݣlYJP-ͥ,PjgxNEN]y@#x dĀ"B< 9W\tAõlі(}{NUC Nyh^qC^9NߔP%$*dNӵaId ډe.-Ö3~a,H9z,ʁO](O&O;U>{7WwJuI\wfqVcyGxE"魙Jtf9W,uXUzHX#<-Zkc@]2m7MK;Y[.,0Ft[4ius7VsޫHq4MícR϶7,˘[F2P!4;t'ȃ$'D%7q8<Ҕ'h]vK<ש^$G&Z1^% MT65XmxoQrv9HeN`)oDa2UҶn dyM 71qzE{Rݙ ?=SVPg; dUMN N" ǎl3$^5P6QL1.tSWZeR $qC_o@G'9&(~vZglGOF{mEht 9.꩘@GdeIWܯ)uG9dԾPK!}`[Rs,Ǹ}.eמ-[&x[%+`~F<{;HfWjh9[7j[tN[ZJ6mŭGrjDrbr~x= 6YYuj{3OFjBśO);E"Mx"Z!:( ,k`8?ϓqT_dc%mIq xՇDau 3~gSK )>zHaЦ-]8՝](^=VXj֪@JAӲu0vwP:\ʎR3$%N# ďIJм`JIw}2"mU.9"lU [\ȸH Y`y**Nrks}BrTtܽ2zpeGhcF\##NiݷSm?kkYBWt%z("9ĵgեHU>pH̓Y`gi)@5_'Fd_ҰL3PC6WY=Lᶲ[˟Gg@$SmL$ Vz7}gZrD`FDݯ`+R\\qIUxtYu&ϗ ۸fggsAn k7 xd3Y (I`$dBaz& ֙9k@p(2T[.=SYtpkk֎K@L>)r&yhH&#)yL]iB<$SV\]b_gUuCSd ĔSrItx:E8`U)Joޅ<2rqH¸aV'9Lٞ?MɃZ\+qZf+qGF&e_CVqh1X`]l4|7il}TF ntA[jo4 DܲXX3=SQPċA`_Qnw`@0UrKZ(|%^=|۲N-EտxGN݇15snvL_xVIml"e}Т VwlUNă<Ч$尛S>CV땡a2L^2B/ꨕ;UqT+f ?_5VkYn"fDS${5Bi=F‡[/Yu_ t;댖aAgW!YiY{uRwp Q&0<#wRƁi/ 0ZR\'P,߱0&ˋ5[B<&NvdAKT*IojZB,ahSˁpNbF=%^i/u{n(z/C(> z|FWڡ=))Y_mÄ sYL)fGL,-~Q ss/H%o/}tޙ` 8#^LpPPZqoKzQpVx:0F2ئE]Zp6xKʃ 8׾VW0@ C]d znlòlC2вjԻ0utǓLcBD`Hj?rIdu>I>R^Ҩ+UxD3[`ΦYGjC%Òomqr@PȰynlIwc๻eG;Qdu ޢY=is{U|X*MhY88d|K㯌PjnRov㞣mx=/E^72r"!SYETsL[ {i>%zkif/IPW)Cg۲+ Lscw2YM\$m:*`8O"Z տ[;6Dt&y#*tzEM_ʯthDUQjph+5Qm -!#j,yMME\lb6846N܆K&䠠Vs /O{daaRf^ H,((z"T}X4:ZTvԲ}ZYuU4%Nw`$Kx\Iݘ_oTk`ib!U+y^sgr\*lg?˜7K* "j*vG{slODSSFUPکyM0a9HG~r$(j"QT-h|GZ{Ot 3=keib9#ܧp4@ s(L'_epFsBc߁cF'Ar ۷F~ 01Ŝ@>Wba 3+;dpe4ϥ8E~Pq4f :*FI}mfxuCzz))Ԝ?Td9NN@,aS`t3 DOi~/a + 9hO^ߨxQ Uϣ<^;:Zzz 3$ῑ2i20'}aFE{cedxLY@m/6C?pxY~}_ +ϻ"ԏO;y WNpk|w6UZaUbUE8KhV0& JR+jT:V^(VVFÍX]Xm&h uH414tW*a糉OsN4FbhKHmuNA9q l#PbAz˜Xq([Rbtk)G,d\ʎ>& qS-PH5 y>W׌7GB8$\(B.`s- ʁYעSFBA3#~=9rfyY\=bfGoEK) n$$JgY׊YfE8W^tK% -A#oV6Q.Qo_. Jxhld`l$,BҼ%MRj+~L\V4v};YBN {&!Wg>m$_k\J\pe׌xٖG wxXz:F$m?! jх6T"VoWlH)+\VlF'kʦmD򺊹I6zPVR@J#>(c8Dwi'X%8,x>gІN{Ut1nJ.F7Z$"H^(k(z1Y܋}RwNUM:B s5D&*.[]6ӄ US.iςO>[4f JHMjlhQ68<FNMpcgA,b2a))1 +ߠCXH` cnmrU-|9Tvlgn0td^pUMX) ?Ex= }Ҩui5 k.qͰV N |SĂPEDIfA:&aR3lȰat.QҘ(g3 BCz>9q1)V=3 7@RT8N}?!UD{BPRgiUf1u.c=74 dr B+L@`d}FH:ļ xYMN R5_xضH`7^x"m4azbh0g;z kGMy ".;5lA~@btWp<C B$ѝPE %mx2 mpFd8RI2noʘ8L; }Mm]%~?ѽu\Ow/5EN pȱ"G^E-3d{Vʦhb_:Ib,6w@=\;#|{a۽n}QX^JHeNL:R흃&x S5]ڏM`l{2`h/i(`!H xehan}Ne!z9b< m ?wK>9b:U?En؇?{ OZN]3H**] ipbOujD m:~z)%&E!I,nQIUh;ٳxo \x 2(-.|[ jJ;%ĉV S sV3>rR9rgЂELA}Tg@g3G5R=#[iA4P@EYe\['ײU#[R"S^o:pX֫Əx@:ԑtEf/ḨVd;#W:YIIpyőgW@;Z~l} lJ5`6vAm%kRch3 N}MAiFHDJn~EL'R5h%1Z$[U܉TW{BT ~D vqj*( vx iQ6f4BM:|`֐e2Xx=7|[SoHx9 5>nc E[e1h a'Y4!.&( Y>_,A^2P9qoya iUMf7wfQ&,Mع,n!k1@Ue0w'l!>NhxtB=+00w~ Әf0!+ ii&:v~OMj}i5;PCCB E^c:e 5˞ EDJJ$TOFSh5|e?4?Ck4iBT uM~`O߆ViY) !쁏R a8qɗ聫E7Gp4R)gb'WLyb-^110 b,&K yxK;Gh}hH$4^IeY6\:$| |1kBZ.tvNy6 .SwGc vϼ1J!uMČ訮(U<\A$Ti>\L#`7#SrKQ-T)'ѭs\sȇS.bl LHg3SƳw)gɗ@{_Z@跠Ud05)t\A4=/p(r5>>ƑJ,MךF2@B΍1@e;86]U}!AXT?DB=p`>Iƃt$iQn'Z?XCjɶ&Qw&[)B6Dy0O.T{d_&pɴe0V 9)}oڋ F[!ak -[h+m]=uUCPU95 BryB=,8ɴ'R+Ļ*TBXWQ h7q0'65igʔ),C'b3=G~AA4ӱqۀ؝N]e1R|0B& oG^)/NEZf`N^e([QkM16@บ!BM$Qs5%`DPgң\ey!?.fԏ%L^UdT̳{Vι.$5_^k}є_0W 6'R!4]X}ֹπpscN^w)ku\8LaLaY;tD]t1sF_DY_tzz1T=%J:Kh{w+ȌLv>+H{Ȭ'^ oZ6_v0*WKU" ,{H7w8\=J^Po5VL Ǣz{JF8eJ(܊$sPCpP ;tyKYq]S3\2듭$Td'IWPtwzr|lٖמ1.•IU٦Xq&y3pLDq".Pe

0Wy˗b/w3*Q*}lNm,ߞPݽj`@er yDƤdUmx>Si)%DZLUQĐD&-2q)pIdCM'LfUhKd0fx&2?3L \}T,!9!f!>4@ Xǻ`YδnO`iZ=B._xbadc8/ARg%jklez|q7I[`wndBlv N3EȄ[9F!J#nacVer*H\\]lwxyy~uljmyYJ+8LK~_9lyGɰpe4qs6F_ޥ]xGٙ ]~,KNPwF: Ҍ&(@hλNG02nJ) m02Vb*c+ ]sH >Mrgs nul.6MtB}(ͅa5' hyDjAH@9pѴֈq )הDD?RZC/;aHLDC M v UfqS]mŪ-ﶳnD3JC><Fn`"tMT3J-BܞT iIj`) cx]wiȅf0B':]bkzs*vB:S Yb:Yu#R ѾkW6-w h(YGUzxKgBwDVA|ʦ&XAތE,uLs@OLFR}P0͡JWwRPP"X_&bdv)A-g$d+6юz}+U,tѬ!ex).~۔MBY,.D,u.?4NzXrٷ@!U ¢VbnOxkxjKsd언YU.#{^E1+Cjb(S^W\1,BL5g/ӊ3c.#;򌹮52}3`ܺ}mk .gbCHyY?!ݢe@xɔ.uD=|*4ʅ|(K9:UL[f3:t}OYAqU$| ÈwZ#/"DR1S`jDGzJ]j3Bxtq棒:Tb]6c#n:E@;qSc ׿X L7Ii+taMh~fW !j9輂 vJv0Aݡm 43Ać2#l㎎-Uxݓ|Q%XUdʵ)+G2x*XԸe.KW<#XC.b R.X_7}.%GfO$W:\ t.lzoxc--fVIsOij4Ǧ^V|<^   `TR닼CЏ{S7ծlygG\t.rוtm9-F*EK@ s;ROMeI.[Wsu^_Of*) *Vq}"vqѨ>)v7LǰwZ\N938EP,E\a$qΩcu` #P%[஋ڼFA7b8+U2rnolcYXQ م;;6Mjֈ>A Zonӥze6%39Bp"S_hF@l4ҵEG?cR '"X>FFV󵾎$o$Qi^փ%AHBV A1GvYS䢮̤0ʠ5/:RifwGRJ=/hK =W@'fN&'haBoP޿ &Н}t=HH@0]eҨ/D^L4iZP+ⴾ׭]˫;F`CpdvlbM5w:X94IadQό}C#Q/6݊$ף-f3jxNӼl++j[łoM9%8':s1 E9G..Hk#,ϭyh}_ɨ*W0YG+7C(B\]3l\LЛe{TYR;@Der5 ?S@JuUNpp^   5k,FU naα##W^( `` ~jAl/vͦyxV~~NItB <ًV݉@h K:"S[QG%>. UlPct^fE!'%xmN:'7PjEv`ԧX Uėx"r<3kI8>3Q//sM}b] kFV=\ <&ώHT[#4%OUҽXثLsAY 6@wu6 X0|7gH v5|PZ.2SL n<[AZsSWCw0t~UJ%g_e Fߘph8p*~Ԉ4ouN[5G/_FF9+ u 2 "!2?w;nW"GëvPR֨}jj+UD _Jm Z+Jr)MI"{_)+f{ND0Np|d?ZFCYsbm?ZBU과bL0=Ie0ҊakrUnό͵L{?>gtƁCBl0"8A#"Z %&8"t4SGflD**a0CQA0*Ah*߂Ք󊫺h,T޻z?HAt :ѰmV~|#8jY:QѲ| 㤱[+c/hf Cm)́Xu#KOrB]3w[E @ϓkARgO5TRNP¸JZgWV{w1ꦼ_df,I80AYBULsHЫw }X-sH0xHM^fb*BF!NnX+-Z/$֫u;~җauU-;˖ċXbzu+5 }EL?ZW_x~ʝ~LL[Tv̲Vϕ1-wVE=C__0,B}PFԅ7wW|֯#^{ Nc򤳂Jm[lhr̛ӚDLl"bp2՝.`#]H2" sU_z P |KE8ltm_uFarj-OkoHI9%Q2zտv"JZeG/4e&3/,T7]q1k@_?ޝT^Ry GF9>u7Vu#'lXGR>~$C&3d=^AovlȆE/svp+ޓ&HdESG0{()`;Pg6G&k82pV(Yr3 do9 > Q!Xml2=' {)f Z8赃g<%WC?&M1ٳ ILqFbd QoolTo`=bРofPg( :̽aN%K iE|f=@q@ǤP -B9ZW_̢5!VG\\MJ/aDkQ^($g@N`z@*@\eCP!: y^3X.4%6)a d * 7MUI56N:nsy99~Go% yP 7N!a-qU2C NJ /c㗤:FġY*^xTv?T(b]r<ܽMɗ6 2TTϚ jrD{:ǥ^aP_`T M9TDv0['VxbyM`xgIi:irG1Zx.ף`x S-!u;*8 }fFՆu-yx.e/~FyIay7BU*_yni2pXb[WĒ@u!̷.^[jʃf?".=;rV Ht߲˂^G=EG̩B#߻a~#Yz]GVY'@Te}j9^tkp,+䭮";ӺKhF6]YZxJe^locJB4WF\vpVV-~SvJx|R{m6(, ЕU<"r.-XmDC27Omx|E;sk2q{=_U[IJjPF~IyKjEe>MnBn߷˰kzo0B[Oi JvqzY|]zS2oqẎPM >D(/Yih&FߔjRˆȦ*L 9 AAI :tzPubK NQf[ ƠՑRge|=@rQ*Kv M'(i!*ft-&h'<5G헐Tڟz8Oy!0BJKij轴@'GFc)]UYX+ba $ř?Xw|&{Z2xYW3]4=n6'MTc!q-"&uLaU"=aKaڻk8oҡą*."yX\,5hJ_#ʅ#\u)K.twš7Da,4=glaف83^WQsDy7 E9]Oavv|R76XKЧCq%|X0JKC"ѝV%.1Ûn\xbjFŻ,06T@ z}TBsL[ეm4li6sHX_3E/vUڤ", 7Z*/7SiĦ^ 8+x̄$4qz}"T:(MO6#F+)jIrI!7ùſpX5nBi4({3hžn{ZIaIuӕ Ai cE,;ZSH;4i7@R0ġWGl|^V^B0hJCEf<5-kr$΢)~P0J+BEav4pyC B4fR0WTh2c]BcgxWmi `zsF -oA=8ȹEٓ0mxK]R|b G:(ϸN|-"+8k,f] hSjl$9c̐)\U5f;Y@4Bm-b05Q3*#@ۊoP.gRgH {z<@ &`u,Pmdb7V#gK/$8bH}`PX@?/m; N {3'"2I%% dKE)0bhZZհjin.GϽ^TA3zRPxpa$/!Lv8L>'Gd&Z z{iF`&Jq= _J<0XmX \9d w~ OnXWhWH#H^J*S|W /imlyil>ڵ]g[-G~\zN2؃-Q u Y|Eo7,z=Z@g%P'I7iogK،p6C.7%ؗq[CKAg  hׄ.}WNr3 oHkO !x$ݠpG-Tן )ai-WIZ4MY=*GnntLnmYpoo;K:,iSJ;ҔPE HxÚ]F_\+]+ e5Wf[VtKsζ}(U56hmV_xҵNnzPEFA}NU9U!!Dw(G" mWJYj$*U k?eM I휅4J)tjAw_MӠN9 BFpTwtașbIP|'+S(Y q)lWy:@{J[ʛtRg^9 Xnu=:֋$^s*@G(P̈M̮-J0RgI%k$8QYd{D`\&#$2.e Z U8askp+-Cj!~V5p(CX;iuPO+uOdÌ/J{JR %cl6b"=}/}f!eK{ Du8d"N}QnJ4tM$%(# G!Iwrf`B ]*`%mR 蘼jՔ9ZLt yswߕM"1c Py1KEURuWj}F|X $ =^.Xk\R-:X;4/^0v#} ÙS\(,{6^[XIle3hs_z\37{6rU\#~@pBТ !ejks4VRς()Ś8;Om4:I"#H&O2wsqc;4+Zc O#'aaSAl$d,>p2"xB>v9GmJhCq-}MC *VӣjnHTMCF%aTnpLȉɿ i3LҌ<AeQkFOCyݷ0tRb?B@p o%#פs:R. 7.,y J,֠ gTj^?K=Xbg|VkXŽ{Ӆ@)8fL:v$rrxZH_P3c@ߩ!U(qge'h|W1WaxMikrg2\͙a@u[~M [Ҷ3_$^gOb:ѫF[t̒u =eck, 9 ݨӈܲI1 ƟtK;FI7OGOk“[}"RNkʗ#cٷE[xr/ҼUb4URc>粞 pfGd,+{恪5'vݗ\kա_NLV@Y8> 5`"1k<Խ3J'"'kP:pe|5ŒeVnXuxkCr$F8( ۂhJ>]Nlk d9VFԎW?ّݭa [7Wm:d=(;!lv+8#(䘢֕DI= MMTv9ך, ?L{}U gn SӨ5\k7gdLU$q!%2#yOSB~6ki.6kWghSOG]GF_fsF-0h$+o9JBT_LSA#WG]pSڑw_ o*Ql-`)uLQvU7 f#9xa.dt_ *EX*M2땖k#6{o:Kw:spO\D%$jZҹu  LcNsg/mDeUFҋ Z g|1gmܠ_#V,)cwGsM} u%p7llws /_ߡNL,{IU̴,/ 6WJb{}5Y\ 7jzQ Dm:9*?"J"L 2oI!%HɜuُTݢ+_PF/ϳ֩' vwrruIl*s]@}a*&8="WJaܖO%[t\z> y]>y|2ICۻOW+ug7,-&mwBP.?8Eiuɑ%g;IAE7So2/I~$Gg;6t/A[ ?{ڗV^xY^A}tCQlr.Hg>-:”HΨ^}.GCA)xɢ 浡yk|WeY a{K _#JoXQ4\mDoM:/f-/ZVEwrf͵NfຯHuwVZ!TAcb%7ZXF޾՚k84}Xa~=I8DJp@C6y6 ̣UtLTC qHd*!d4ieE 'GCt~Tl AA>sT2YXԶX)ľKR  *b9ps.$ec4uݸfGZ}:$<\-c@ 31#@dٰ[IKJ<̼K0m+P}v#\K^k)u^|]6dTl046QFUsv@D}/ܴD~9/ r_)jJN] ׻rw'"j>tIlaiZGJu*~ROUNћ&H UzflNIJBծ2b!x-4uLr@ǾolZ)E8_yScv-10f*V!wwZ VS~o>)q䀼~SP]tJN;,] Ctk^0U],:btJ%c5 Sdvbg0Vt[d]bԂĉ >6vHr*2u1Ǟ{#V5S<%[짵~"xFk,,bB\#Xq1/՞ h[}^)㙗p4G1:4WBҲ+[=o{g7M5YBe !.(lSaӶr KZABoI_TY2ӴkDRfG nHSEۭϩc/u? Yh (VRC<;ER J>0J-!2l1Ek9.V_'N\#UyJCOGFMJؙ@ro+FOIöS'c 8N@%ո| ɶc\s'1|(bn5Aw U|{ sgfX_M¬=eh*g(1x͆jGz-6Rψ`B="(0Y!0Ħk]-"3!V͋kr !]xzz8]: xe*v`*:L.pLǍiso?IWJڐa9 _8kDPKbQ\fE⊙'GPxU$sBc)t*k?8 ZtT1 GޙHu!+Vqi}bKzUZRQi52"^{okOkpq21wlğ}Ly:[%NCFֈƔʵz .s"naӟX kl9rƫZCzuPJ'DY¥drΎ}Ǣ1dkU23>\f|y > W}RW>~I9*"+eֶN^'d Dukȴ*0x8gdbv1AcoRIUSa5|4z?v <]-d L$SsgdgH𸋴 !&P1`w(PA쯪=A-!Lgodx̊yƐ@F*|( ^VKן#qY-`{5rPzX<ؠ]Gȫ`ͯ86 9BX`9o IKu,]k\ma cAَ7܃%'OXNIx4sXI\|:rE[jg[Drv3*XjTrbm@MkR= pAŢ:LWGHH=`EQ QvKI-?|YZ Sy}K%eXFSgxpoxSK.~*?jmoBq@ FE(*2^eNH拱>}cWȼN3/Fbo h}ٕDpi-ha)tQ'd%Y+fbA9%\ѲeI%1lBnY=յzcQ.14z@n},IkdVKBYe)z=h>Cʜ7G,k_o+ZlxPi=ެ~W%{OpVS$y9Y~rCȒ^wm+YcL ,mׇoOT?z7vﰘIj0|Iesrڬ⩕nEBMC7bM "?yIsX[;Jiaũ;gaNBU؛f.r|XtHGy-Jeyj5D[,֋=X@ 8XGErˮ`/VMn5nh$v#LњMR? ݋NVDV ڂSVBAG!Q'PU.7k,V+\틐h'i%dDچkYtW:_H0ajHRCB`pQq~:e̫.UZa'TRx̥(;N%|!c|{~VGj\91i3˟gP U|-7vt`l"ľA7%Ї\j.y ۚœxehu.Ren<ũDyVezWfp 2EJkw1`r1֝vK4@r?6\W9N*KWT^APo3cUwJ}ⴭfipmQdK;DDp+秜je"YFL c#f}/LdJv&;bQ+Xү]_N:_U;-cZJ;g6ƛaɭl&l N ĩVruzC)ꄏËV{R8juL3%fs],DφૡD 2S__+z#?ajuVC UwXv'|br*lRѦGN5) ]Jq_8S=4>m]x[N1F(S OZc&/rt+:J .jG}jq\>.7]Hv75N]_ "wy 5a=[S{45 Kd&2pAX*h rT1ͰmRMl(wzGG)}d61\'[W  EY3v@ds3}m /ZY)m`oib1F6.DR]_9DEX{Rfl\XoeGmu~MHUWnl|֋E:^u}a*lep4C)N=fw $,`Zi|C>"As?U%.7~*HAT*RR'zʿO?/DWޝ4Ú7jzsXL@י1ebBqPnM@o~>嫴UiRAdfJ EKa #[!+I"1DgN& <8WK&Zͤj@Xb2̤xۮomcF Qn{kVɸ ɁKek>Qna~f7aΦe;=~^ >B:K]œH?Ae&L#O50Scl +ŞtHQjgk0bB"I(|uvƑdD>&{JmS\ ̷TGO]xHM\0#Iz3 ^:)cIu`sk۩? [yH0H=mt߻,~8e"k[I 7g܈0n:㫷kїp$ \ 2 ܖ%HFU(}df /n()s0FI~K5,hDG7@IF_QEBÿZp/%$4NEVW@!S;qL-1.bVRlmȒ'ի WU^\=\#Dzw=XeE̸SԭkL㜠,UTY.Q~hIYU$w@kW2@}56q_hWI֔#zJCʭN?āBNwYZ[% ,S6ٔ]S~ۘh/1ӛP('3B_|bR9]kv/Gc}Gw}C_QŒS]n ^tkJ\;6VEf`ww(W5¢译]-tɊDF8TrKmr \Htd?=,A:׉qi,RLu)NĄ&*F8d Ox?Ӓ&RXa%;uXˤc%q7Gg. r/RnrcqF!G"TSOEfWM}EMFb1>@$iJ|(V@=,!N$?;MPm V\KlXtUQJw͖R$wC n`ѪTI^,g7H`UTI:y4eg۵#؈0[*im@sm>[&eYqg 2GgdFEG7_sVR?sK`E_Œ@=H7,'е8^PL>\tEDf5ܴ6dN3R?Wٴ  =]L > bD~(pQq4.'F:ŦLNs%)IAzpH` wl~bZ?/zy4?̝ [88͔Ǻz{x݇]ˀa6kߟ8#Cxܼ LV\Tt`FG"S@/`l.jI$R>WLhP|g;x#X]V$Ǔ]6u eAohZ%K,ZY,4_(t~Ɖt]ٱo7)6w%2Qȵq8QHC]ju(ϥbyPbjw21Tl JzbIBOsEo) Y/Ȑ[# چKJ3h/;ߩr"4U EgH4smdQl+GkBgkCoSkٰyμ勞5g.Ehts)]RO *G):{W3fSN'c qC'Zm7῜b?S0a)t?xXQEXDmC{h|v qI3OVnUbԬxE c[XOj=aM aLɽ,Y ap qn9wp3BMl:X`hy;w/NL`U̝mSb`InxW'hT'ꑼI?0Ih>DٖVp+2nG{-AM )f;ZZ6Mv`Q.yQ 4Q+ӫ8&;ye(%䠶`k,JXMp$rxb*wҠˆ>;c?\M@UAc*<_O3:a`D+IBH;V> #ȞgyjJ) j%۵ Mg29x=KkI5)sP:ŮQ#O೐ ^6tᄐvnK&c^ 1v<͙ Sڎ$:> 99۳E~J B@"}8 O Tޟ\}RPM+!5ׅe;Q#i\so325 ٦_"4< \H~>AaPpl*v#Z tZ-pI%Gu!Tݽ0bX1&qb!n-0LTk^=:uOFG_IR9+#T̈RcfUXwܸG;vh($j*0jn휉&?闙eCV^@(,UOA}3?g|?k S|XUӑI. dCg9&ڮ?c*sHJ9HZވ=TaJ cRH},+EMi}N5eƌh^R3mZKA5[T0w&*dR1^DRS2)$><'p0*5r~[vfX4z]&2p:AާH̎wiE@@xnX > &MZrwVPPQnh[NoEK1ʕuldo #$[|<!sf=}%uͮ欖a7'W^qݻtN+<4'XʅH%]vDHb*Kq!x'n{h='o.X!nZezΠP$MaxTMx|%KuLI $nF j:]NS_fUC[QXI|j!(߶wS?` 9LU;WWڢb9yKJ'OL }z -햐 slqBZWކ]bfihYV8 yt )1tسA5K K >]IL D1uIc3KYZLތhN!U[6䕽S1<p_ui"+rʡ)}bu)%•[)!AZG\m= J|`H/p3;s1Y a`$9jǰ ;LJ46(~op\@c|/@cb#"ӮEk4Q!-;`z?j7W0%djqJDyYO6XE*l|p7V~B*+!WKsʺ D&1Mū:$(Zvm,}Uءp}VIF9} %%TSj'cfN$2MTo-%intBqaKai 9%jw!S/ XCVێ`MD+,*gݯnt,TLZIYT \:ӳ@*Q5ߛoi  Qʒ BD#œK41A2/ fe|:O3,Cc^AiW~8~md8x HBoTXf8OYQ6<}Xq:Fp¾K.cC[ I[,! so]ԧ:e{G=@ _!hg9%ED]MqL̶'jBSozIrQX`Ϳ_\W]' YN]Gۨnx׻ҙV'IQZ )KjȪG@ !)1&0j+Psp^NEzYP'iWi/}kE6$& vp"l71!a3.Á֏ʗIMVŶ&JL*RgL}:3bfJ3}9\F+&{wdm]ߴ'I0\,Gs,l7|>d -w; H7G"X}αN\$ZFB=!2 e'_ru-pG2kQ2TiZx{G<̔i\FY9hg9qVZY W/uTrA y/meڷtt˓}_)OqDr=U>[Q%Q!S*8B]3#oV Uό Doz6ƒ4 ]kHe 1B,2U@g٫hk*C>sC~ .UR~jNBiS O ,zl'eEVWU!bHhrhl)k[82VT7<mA>hއ Er/e; lEBpQ1MqO{Ȯ?JWG9~ScfK$UM}j#&z_ə]8~16UPN"V2l$:#O?Zj!`kͯ>%"u,vcϽq%]*85e\".lYk뒷|(ág7sztA?X ըZ#ӻRN3J@[%O jga\T_ٲnE♮HܥSyEz/e- m>E0l8PILv W!yҹ{>f79hشpwYV73$~b)p$߈zd$ Gμ@;{&.뙙X3,_0!*z<ݿez)o`{;/MZ% q? aEa G;Ip?c=L O(g@BV&RgJhM^ PzćhlX`SΛ05[cr,>@ QƒCnxh`!!2<#Yr*MhTIirKl/5r%aT$ž]iXnQ')ogV9ë*B &Z$ EWsˢAaVRj̦/>q] @cP-~ fz a'cg?滺lF>-A/GK@@O:xjn9Z]W~ϫvP㈺)mML9Zu]Vd+ivtȠ! LGh5t4~ 5_rH}5f/e̮aȳ4NPJ)2NCE›?{~Bɺ bô"TײO^Au(|XN?{*0YbƯQК,Iw/M49YZf6 whvU{uI`Af)0C@桘T?*[xl5. */euZc9KVBȉ; g5{>@ҝuq^,yS:,-gF, 髉u\<,tͅȀh|BL棨q vIrK7*:k ASdN[O0ɷFNQ9١9c''qr2s>Q2Ъr#'[~x8,GG?e?'UO,q(v\>Y~zq*cw"Ho<8SM6p!W۬e&44FQ,TyE K+AlbWg$i ז]b e0wm`β&F^@Z]3Ht~jD8ܩy"صH9ѰJ5:XU.Tc*N֚]B_ej} E&t#Z)bde)'~BEjRQ 4p{>Rt]Sڃv!z5mf׬ ALlf 5dhbIhr;U,AoA2?A_\OJdxQHҒ EQxaQw$YZZw.MeV9eUs|mKO|1iz,WIo5N(͌D/1UaMLl]{6O)arXs~ꛩ.`_4o$rc32n۩T87w!%ϭr|x`\VE1G)j2ρtt;v4wMxoV}Bu$%ɗ9aV WlX=E\ E_y߮BJy56BCWOWƹ |[KiKCegcmu8r;>^kX~YA<=ȒFRm<ͮvx& t6tk6?c+Jl䊤Fz='+_DFQܟvC|\1M vU%bGTT[=4+=aPm:*E}YiiXEfh R$rN_d:K|A&yW4׋;Ëf-,v"$NZRS1XmAn .8SN=Uf4rW(?Æ0xROQw5 V@Kl3ft|$V$gCע²O0lPn3қk s_cJBe[A|S^?\{U`Ο]F{?!E[6KҚ%kuL| dgD95aoPÀB;$I_[A0"~9c95$$`n[7raRμj&{iPC--1lIrc|S?\(9&JUdL3o~5VhkUkIbEKF~ IMO6lB*۳'ܿbV\ cdH8wҠ%>"s { ijѲ U-ESG_qM#N@D$ŅM͜b\+I,yhJw!`bPUm6g D24v[wBRpԩy =RUd )IRSF % K ͦj} MXt?U&WOL^FP&˺tGhnQ0|-ٟ+v q+PR;LbA[咙[^m-CIM6&J1ߺQ?/^{9R\@wDcjǗ)&_ockfseJbi~ws锽%QP H~*}i>~Uw$,}&"d((ZuܔysN9Dkus9ŕ80M+'~2p2 rso c)C}l#0>{؎_oF;L~OPJŜͻ3GMԙr7 X^J_^c$.BYgVl`I@2On{5<"zjPÝ-hQDrbm ̪fdT`4S9B%U t|& ~ )k`́W/yk$ܑioE M8Ԏbrɼk,Cm#T6#DN;aF2{glSH,C+~!e+?ڧ:V;hqd;U{̧(d\6$eA*=BBYѿ"=nGQ?QJͬ ta/ a$ fGsNl<33\ >p@b2V#qR@sO0̉wNLPʓz-u6,,? ,Pc<@lbd8bZSoD7PMw$| Pǚ:'}v_ݳŊZ!R`jS-2N=TKv-##gD(ȒȥaLi fkE7V<7{7&;Or/zY{cpu&q]LD/L'H/fZ6L.[S&CXK06Mu_ՠ;_t1pV1(S.^_URwk^ԟ&:+<YKovܺUۄuJfv,Gpɻ6 g/ 1)R8]cxKY @ =%gt=K Gg€{7Hd ^koAb/Jzےj` [u"FKR;0IX7fA1Aqwzu+C oIQ}WMwB(j;(GRS6pF\-lUjIXYϦ(}D# PXhyD6ܮ} oApq 2p+OINtEQw{Sl X-bV}80p+>$?hGMc| îl#޾Mhۦv'ZLPQ́9mCt.!1BPTp_U&\AbHyT;zB=RӶdLkw]/J{ZXidIfDމ /87?f7 ^h{:a?ؿ?Ŷ'u4LDŽpG;XСI;.$- %>) VM/E [Aar:m8hwMMd YP|b r|DD#P9s׌2MhGUlId>rP 0?];,}YǛZ}'NΎ Jw\5pp\XA]Ўٕ!FSՌTme?(?2=PW(  p |*RȾuO2(SZ&L$`mFZ3=q_YYEtwϯVt|D'ťW06 NhVU[lUB7j7}O!傜[ut+ruk׉bBndı4AI) BM,q{Ӊ/~5?CFI DS`[NZ_HlefvQbpՀhzp;:ʙYFrwb)PAC7~:=2pؤGegsQυ0,L`>Әz_ fxCeXw_8,Nuq?nqѷSD+?b*;ېFe'RTʺOb{5 du/l>!gF0}cW;ZSB:rm =tWR;>U.SX|ܓ|etidgd(vQX4iM\~C=}RTX &!w2,-o%ASaf2gio锧?yAnQeye_? rCȇ:R? L~f7:O6NXBrT)_V)If#' _@ȣC4bҎk)t7@rvȓ{]Fn`nCIXz("AJx ոTʔw\X̊ru+nI\ML )|y)opTS6?tbQJof0Zm>l=8zol1b駁HY NL؎BqKbZ)_d!rn ` n^]zMqz; DRZ兜\[[lFXʩ7W f4I^s2xŇXJ5y.׶n#p&&skچXk7}F'E1p,0\pg}rƬؖlqVC>Wxݻǧ#:B7`ޑj}z\2jYHdh"*{"N3VPnJ[׽++Y>FbkIu]!ѲL)sprz zX.i 'ïP,Y9GL繙.t"N d' \_a(@:)+ES  =e&,vб 3̾w=hĪL; tƔ{(F@\J"?7Ju р}PtŸ]oQv(1A~%%0iS&uÐ R$JJo27|Ǯ"("Y8IO'̭gj$ [yZ+*qp[W1#\1?كm>F1^u hr6_Eg@sĮ@bϮ1[iG^^/luVZVIaYudy'zU,$}$Bo Xlث*[4ԶvVEq;GD VurAdT`қIWX iʮ2ȚŶϑ}i—BmW@>-Xѫ+!;A[^ 1Dmg@80Ɩ& .jr+6L=U*~'QYw0*f"=OPөemH ?=S~Mu@' c$HT3zNS h0/>\Kt?w%@TA[Msbm\ؑʗծiJQq)=fsN烽[FZe+t9UmHj,-1DyuD)D@ BJm <,bOWb]3UN@ӜH˻FU;clr;H[: 5jag Z׽5bh* |$B'% y'!<@F*a=AUZMqnPp)4;&iXf_Pd5*G`XW $3Ja5p?wdB5!yVH6^`֎\!&^ fA4K=lڋ xr+V)}#m#^LѮ53),a.O6![nt,o/Iv_"KvBݻ|p8bzޙvqMSOgތe0_'F:mV@\6hoc~|7"XwJlPBKA)"vfi O#w''$ǔS8[cݡ,U0u-S9F]v̜|lU75-=I140BKUV7ޔXZ/R:!+:"ͫk{1;HDˢr;Mu-`˳w>M;W%`Zգ~YO a]7x08`TL .8L^>B4| j߱̚!X:#&VC@eލf[D+ow$Z+0DU1yrՊ@ڔ-6I|}=`4ϊ-+8^"}n-.& oviJ#°dQ2ixN-0q4tDj#],s:Uä{x9%=yADl47~D/Fm~]N룽8zà"T ҕzp u' {ƕHx+EF;Y澊r PS1贾hڏ81[V6K wRPvM21wY!^Og$e ) fUԡb0D>ws*JF#ۀm~ i}L?%+f=p93g=IG@(;H B4ʀk]a ='6^J((/`jfƴL C5<s<3ʻB;9x!(_O"t-Տ?^ZÄKR;YśQh<-9'"Te]'Zw/x^15d+]q5ue,1[d!UicvJN`>.oAi53=",Ή0&I),iˑCj>gD[̪=A,*=0_4w9u>v=PqM&Rt <黀*C ,Fèxo-WG& `iҀ78-8/ٖ/%ibyx]!Ă uFg9)|;] +ΤTJ12 _<-%b%tφv)ܸ)xv̠Py.Rӂ(tIZA$'=W_~T$Ȥ:5PQmlIvN$$5kb.S4(|Z/Txb-.^_+Fg)A2i0;)I8&zٹ-dUk 4i!R^>ŹSt#oO(9=b*҆;C?浕6()R,KcrhcbT`#0Drbf7oa~Կ1T6l4j0"z]c=!ĕ*Ǐ B3DFE%a6z}M_k7j]':dDf,6]T^hE 41H畊E<g4Q u^v=MְVp%QAGRjo:q& ElL!!q5'B 0NdVjvi)oIM&g%NyMx 㡗X%]~{<Z^a J\7.]*JZ\%K更qy!Rl˅: zZ.YthISXS$gg&0HH'›n-A_m0|bGܰ6B"X f_WH9[D^ `p. wƟ6[#r%9,.:,ϚhtG-FEo7ph#)e87`LK"frr!u$"lqk]4ԉfmÉU M*ǍCyAI,@gH4,$rY58j 0qo!ɭ@M݊W!DRMi;"`@-)u*R@ >D?Դx+Cxh ^Y4I%KZ3HhԦjqK:iK!6؏ *0@& P%FMzxDγ(j=%㫤 <e$$׵2ʱZL1/ܿMH Xۭ~L#K?~I0-v,_o$n'r[Ku| !T]6-J}12]h)4ȵnyy`\>)gߪ#o9bojA%ًۤ4Sv&$z [.@Ϯ*7SN0-=ىN6+PD(֢b|8'7l{C& rmP+'ťM#[mDGZ/zS pO7-!,&pɻ.1r V3#Sx)7آo ΍]uϼ^GIh<@s63y"N A*`Rl6ڂPf+qn~ݙ4b'nc"5e;{* bM:.!-㫰!H 5>{%ɽ$;zi֜*w>:`B^gv0I<؃ H4-gDX| IHUTE4~gۇR Unۣ)L[j-V])P) [7I t@cy#Y2GФ_32nHSH[+ x? !?Iڧ"(նVUw>ø"(_/\Qrlnn+*U׍f+27;D&IJM 7wujM1@>0npf Bu^n1'nC 4k7%,==`fۤRg נ XC.TZF&Kn@N'j d .Թ#w=1;l/ޠEЖ!qP }9IC$Ԍ=I;ZkVBz'-Ivx*a%0ei=b\װ4yTXY.Gzs  6Wj9#g:pWeLL] (avKq4΀$LB~_tI]TD2U^-"w^\(u5nA 9ucI9]Ͳd>ɥ#R[M0%)`c=u%;,g G)<]oAI[48ie,oa}q 7!ot9F /½;;bh"镋?H;Qۻ2J~ʺĂ%(+c{uO %!j[}i&u2d6 qo80vâO?Y28)N!eP"FSqt#Ti(~*~*.X^Qnr+*/g ʲ!{5κ!}Tk) 7'[z@TO 3!jj)90D[PG2)#otTp#:n.c>3me#3ȔrF5փU}M-G)Hk t+?쿢9F;!%W4Qц(kNoKy>eWӊin7Om`2"Kʗ `~-J#>R?;lž~ncMyutBN3i'JGsF JU LjCU v: D 'ߑOsn) ڎn ̃;0Vv#Pd8rX? dJ<E)2L^Zd)CG/&h~n&Fs>?vFqlɁ]<0B/ːBͬY;_t{|:Lbl;gha]le(Ϳ7%A9$!z?5']r@ᴅ.gXhnkqKC|"':k+t.ja|x.eԅYNmPuX$5Dy֙zIg9"Hn-\XBL@aG,g+"YM78r]Ow/ ج{ Xb~#qδU#Փ;P,y(34],GH"elxʨd>bʝ) zu7XmA5~~邞Ƹ=ZFAl"'ȑe%%^.ޣ#F~& 3FQS+:6fnՌ5&p%(6:79."rFї؎泾s! ]HFG~zٍŽ2`O*yZ%X왷OqV[7m2?4"l٥83rv8B';p[!*Oƣݤ@p2՟aS?Se_JQ)# PLjh>A]?2n3SQ'̀DBv ) IgH s&q!3V;S] L(OۀAZ(0l@8+ (tI 0#p2F<Ƨ 26[&/VYV ? 1Do:f)hGacA+g'O} ɿ3W:Q|϶ucoA1M؃;jH=ڂ>S<]=kmgRDeB &wz{&_%TJgRн\:!Y0Hꜫ:'S7Esɧ,KY ȹufcJiծ7a\mV'F&( ~=bE "C2/X}W p$2ͺտ+(ۯ;;n\ݝPm?`iʯ6ׄ/_Ylxg+g<-" 7c{ƶNVTMAKl23V*xdk,*ƞ 3a^2g5m[='4JNy؜̃ԨZ?h چ !;ùB !*0و1OB塚( 4(U(S>E ̷v4|+ӴR2c ArVVke[eb?h@umj,%t_VD0'B)5sHE}wnq8ļ1dP[\J/gpƻ+>3<?,{2bM@fY[ys&@KdUѿWP0ޕvFykgY.Wůkp_m<ʪILO+C\VM ۻN%?}r>6\c!5c,R!䧎un/ZC3'0pYգ#+յaͲA& ?<>x<̯ʌ5e]/<:gg^@߭ !>Vt;ˈ}AA6Os إjWYM !*Ւk j\ݑB_#hNOEs}aO4x;ڡY*ʝbZa͐Q h̵ ֶ QJx3=T;%?c*F$)d \|@,r()ʊ@rb4Wm3^M[G9Yh AV$ vbx`2G mwVBd`l-(0-6elbUEB'x82<ٹfLy_OkzW;ǰ-V>'4<ϫbl\,q%*|[<'1AKV;fv3w \;Er 1%~^t,"Tj@i#~ON=ʺBBHx7څo%ήP&}):I.aRZ&łPg tK./0ݳi!:p^w$AQ^"y;>-jp,5)<E$vW*SB k%Z3ZVm4TA"S'.oe1d.B9ǝ'ͱJ7[Bw:/eߞ>vkPi1dŜB8 $:9?FNkT;==C0GZ2C+,-I=awfJ5X6w9e)&'S NAؿ wWl-J#Bphq @?Q/8_,Ǹ",5ӭ+  ;w/fk7lD;ƙH j/YcʲVZ[ ."͇Jf8Z\q{|Ճ,qrsz+BFpq5Z[<\gʤ(έYs6),&pr٠̙"4Y0 ^w x?1*EHoؤڱ)>Z+~?7=rP3+']]z{Zbf\t pY1)?@1BW [(41`OpR- 2ΪY~,|qct ns2LAogc? Q6!lx0ix/4=$ eG(Y CAϧa&M}r5x09Lz&=sĠ\0 i}O:C|Gߘo4s<ᬮQB Eݭ i ]]%XlJLVdUon/jNYu:/ 7]߫ J&1Y"%@ ;\Ԕ Bk+aG]>swŭ5h$s :MuӀF6*d=:qtP6B.ϋGR!4̈ONjdlCۦ9bWUl3g@Nˬ#ײkcI$:j'H9".5"Wc.쌟U[ -XE1Z BAyª-'pGHjL8UW^8T)t{> =,mP0#+-~vFԪQg-M"w$+u aDÕ/$6I ?\,v͏|2y+ģR4L\"8Ns[sW5LgEV4*""P P_m>L@֫B5#GRgnTȗi[eRɎ!&NiwrŐ޼b?TD{)'Apq)t84#l; jo4x) t9lAI#aGbp >U 9`̀ql9ٺX(S*"U :_H:9"``43)`tļ5UH;mcuʸX%Fqgk89.>bKbҭ&WW!̦iÓûQ':ݺ(%GY,m)0Dx*5XT=0Hf,xq=Uan =MWKX"FL,]L&&G|m@z/㝲. =xEd^=/X8X{A[E߶:= XM!WFv]M;7]UhhYK~FWtV9iZA%3b](/nޅXll=UHgq.!t# V'$gkE6:~GwO?n pK8&b$J2k7 =ωL^Ưz-^@Lj>C[8JpZ | ` Rه#zj\MX?àp(xi,D[%t#E`.􈽌2b:\VC7f Y(6+|u }Y;"?M/6;ܫ}S @T_+Oq!{lJVq])ҧb&8<)76F̣2BD֮fY袊J=z!_X1ճZQ0K+ [*wn:>oGV/q@e<㋞v{R4 &Mu~FHncQZmE3`+!pMsggmX/Iݻ|Ȗ@8\)ŜЙA*zP33)a" )x̜qz̽[P gy*(D`^0ZvYS?m-rd(q52U8vAo}2^'~jF\;-?Q 43y?29<%/3U]d}\=kr'~v3苮4LO1Vr.ܺՁ@Ӱ4`\Ȣ="vǜQM]ɔM3%1sZ 9&kSCytX`n=q%*)+,'0Egȑn{8:!ʌNTͮt50Ian ]5/j(3&|A/ ]6^(a#sd}8:((Iz^nҰm)$2`B˫NzMI -t8ጘt'P 2`mJ H?A>>Nޮ)1-e`<Zӏwqs<>k9ڄLt=jZ;p4f9gc/ɚf%Ln@֘|F}a{A^.<\dD1԰I 9QK9sʞmbg1t)d(3X9$P}%sIY;AsQW4}?.kH-dH8v 0jbY&m8 侁X ,-Jb^ Jb7q!`#.ܺ{zEEr*8,RDJd瓩 Y]JsdցF7jnqpҗNWz%)EP"`aJƮ{HǽabR~ot'Wd/+,wo 9-:z);^$Ql=530/) +{-HfU3Xj{FSy {3Q;zKl ~6`u2 ~ w K, b&|Y: ݨD^"8(Hj&Ufמ"[ R{6+F2kڄVG?1vr('p>{ics2S.v G)kGXRF'< 繓"YV'n4燆1 La8+klq)^=9VD?=iZCov,)[&Cg_0lCA1ԣٜI4ɷ`/Aw<ڲoT5=Ɍ>I\8p;)ʅTa{'zes&0#u%X=C98ݰ,>}zsG.. u |w'N TYن:6d4, }m-7G$$}AR!$xOHɸ՞`!hY-mѦ-Vc Ƹk['~'9)Cu|@]|d#XcNθ#5SStܢ[0>llPr,C謝(xOZqMGo*;[7ɖ`QX;<_.Ǖ5EOxy"g|/˸6VeI 8&a#+{WīKt8ꡫp"܋݁60A-ɼ^Z+?ID2Ekەi*"|xkvzL1NA~RCHu*۵V_ bWG" ':51v\[VJ5X]`SD!srzlE Bnct8h)xЎ}[cVDunwJ|Fq3lKBy.49 ^ l '} Gޒz}G uv LN-U!5p(ٕwXxk2]ٳBQߡx`82O{.?Wx` V%9$@pt?m;}cϘK|O%Ev>.#vf(ƨ'nVƉ\)<ޢ#[o얔%1 lz831 1\ ̘A8Χ. =LKP:=39̆(\tѺ&g^dp) H Hh_?c$Qi0'/v} s PB7b;me]VL ,Kƾ= G/0 j20/oNzl_n&xL 5;Gba~}2qףizI# O($%:x܆~͌ٛ+MJcrqtb+.oTIVx(p/0EBU΍;94Uk\ي!)3 r^$xiK+ư-}1 ɶ%^-tC8T(ei>o 4"|$[8WfbD4 2Ő`Kҕvy9#kGzU~́Vxt8F,?I?b3Q5bƕ: 7{0DzglWRa]E]O& f"!!y_V5c/*Qitj,2X7 1;ia,Drg{5Ӂ["T7P*a 1j ﻗ!G"W+2<+)E>6zM}Bh),_ vsV2XCW6 }4)VRazb@M- ySy94&cX]rz\`)Xgc9Gl7{KT3$'B3WR#hՂZmY9nߔpxwX $ |p㨱ȯI┮ ((n!` ()4Ln޺9/\:2)8r3'߉㗕H#!;3@>H' 6+6~ 4ms`e}h'1w`϶é|B*ƏB0a=dӔ84TRt\t{fC=[-]f]y(MS0u 0&a9y?&E4 q:s h<@ /6pVA%h;mINǏ(KVP2;SԴA"Hi!堄AjYY1/B6rK%g btҪ ]iD)SN.ia44f;_shit")F:Y4kt!mkeA1k$/|BiHgf4I1;"І-zf'9'.B +8+;c18'6IGR#6ݜ6E}#q cBu,oDX]}DYZ+]H|&7*Wډw@J;M"w0AQ,v=ʨ`Vj+2|e,;Ԍ63;*e0E6z2xC{/eگ}?+!爩YG$;V$`Բ {]υcf*!0Ak- _h>b4C'4r o-44cFxF!HZ8e|_أI*퀬g)ڞs~q1?[wLLUt(Wn3HC(~M 'H$>Y T2~^a'M4u4o(!]J] 0 A oaGq2i. #( }P BK [9Y^M.?"&=vx/NE`0GJy-$;Z|'o\ɺF{8؜8 q,\1z3{)}ZD< h̗#7==լ( kY`/ƒrhT>ָ& % #r_hp8f$+ g40O ά4*^@m2=@A<,`D:(Lm̂f9%.wQՐI2ץ#R/9TS(7e LOk_,I'~:B&yIQ.k2خ$69Tϫp'lFZ-A`*Ö&L0qyX/U 6.^2qv9hzdN9^GO T=z#Bx5Y~c01n)8Yo,4}:]||1Rs<0 /8< @pm\_%j|#K?ѱ ƅc)A t6:mz<-+EEޏ7's vDfJ6ry-K깂oU:Bb=AtW@"ehj aVS|M Q-"* wBL~ L+(܎jfd`XF2L*5hjio9o{I>,c MKe(۽t2ˏo%?M ރM 3R{ksKeB`Jd!?S-Y8>mdMSFK2.&IHc7 W+ӽ>:0n5R[<(|~%cHm"NWI<$p]ayEYo\>MDՐ֍&.:X]ؙJu` 5L1/9qH.Y42N<qF:MB=j;?Gd<@{I1s%n3lDpf"%dY(Њٛ=nNJ@Uk$k..>S2maM- bH]j-:3sMZf)B(OwSdi&D%܅_v5eaVR-FOKQ'4ce&9W <‡[qӿ̊/-( i8^#-9Kk;$ܞWЗ蕁ݵQpEo%-Em}9c!U#\VK.7D95UPp} Y[".S+jJ 37]NF#gf6bYU3R.Bu6ת@"{>r/p!+?1c:8D;Р*N;5_a>j I5@fdT.-M!UԻ3"-~S}zE b4! )EqQ`Fkݓ&WzM 4K2g9,ICj\xmЅ  mw8c''mD(s?kbzMHeT"f;q2fPk{`j'{ :[?@9lS| WIҢP]-F6AY'H(֭ۆ\ ?/1 E$Zr¢Lh&4NNu;>8&Vx'ϟ[ /8 MXuOQ)%&UlV1(ÇA:FhR%tnv0ɸkkִ)RW^bUZ' ! <~S#~BWzSvQF{]ug5J%](e.GX(`oԥڴ~bݧS/t2>W虺n28˺IOb7nq#ԑ(;P?614pbJ+'$[$k$iOy=ȁf D327.EmCWL:"@tjnG973i9$ pd B,"M@b8$íwtO+Sͷ*Mvzc"-4oQsl#gleuAITHDj8eHod{_Iɭ B#a>L8[E;a#SX l,^:﫝}a _^O:hz7[RubtsjN[/NqӒmjLo"fR.{W*lQ"2#A +Y48U~u*ڬjuRJf5m80Y!&M&Ɨr޻%'_F;-}`M]K07[8e#`,RS_Qm%Ae5+=9?V_js;tRd7i;w_:&COC,n Bg=[C U/"T7/J5tV^\w2L*%;쬽]N# VS[p:0U%'-9,@k~(m@% |.0^)r 8ntE9OK$۲U::;Q #r/Uidȏu$ `%)̫u`ZCZ4-_o3{GR%0--q8}ם%`7fl3(@jΚ#\M/ſG^;B@3 ,&:6,YO7h7p$S{U!ybB ?2aÓ-"-]G)㗎X~9xv+"c,=o*[كlH6T6]ύPfυR3mgCL!{H2soC_T@C'9g'۔"q*ϢKwiqA15HŰo|A2Kt?+(!2KUeҬWz&MU^s)z4bmDp*_[p3LsS}*i_Fz[yq;8a ' PgI'4uCwŞuWMYw hJUz(1($1dRv 9Jna_(P!Q<$^sfj8R_Q6E!;tP3%5P c&偌^Vj$X/Cd܀=л&x$_k%mG-.:奄p&b5Kw{ōz#r7,$}$kT. BT6qĦXOEw#m.|9\iUꐄunAlÅ9 1!UKrxIB4&^C5#q>%`O* 6ےNuR€,U .xtUdu3̒7i>g:,8UpIr)b-Oˆ@O#j^ R c~3jb~c+v] &z@j[Ef; !ջ-63jX{`,zh"YkR )-5e5t<=I" .lk/gh yB*E>EǀN#nuo5mj t8O |AV$| ͅ{! F,|#N %Y5j .K@g) MN5X7ۘl qVnoD^Q4',n2Q!#kT ;C; 0,  [B+|LBEѐ&"q>dH[Gd"Xbaf)R50jc3Xjŗ;F<"/~0W3۾|%X0(l&9=ʺ\ln .n<2ݔ/ })@2<2th{6 8z;-H9{hEٟ|!bW,6?CM,%69Z9jBiœ_m`w.ǰDŽ@|yR@87Iu2Ҩ8:|V-RqMк tCM$7l } ׫`gbN3k' Q`-֢E\8aa)F1Ne8ƥኋ$@<i>oJQss#7m-($gT`lM%PP, 92mrā1i8G ed7[E#?'~s AlMSb("rW,Oeq5a^L (̹nF+lwp͂Xv_(2?(j 6#J&&s"%n9Y'9$!+@ݯ0Pu|khIzH0_q8nXB*6=ԛ+)[BܘM nz4"&eA:; ]C,!JH_Kk4D[7E)T],-~J5m5F9h򏅖3Upܝ%NAdZW;Q-/$y> : SgQ!1m%:mauXM($SPƪ ,j=HoYUaȹn`2$SxkϷ +h0k9%:h7 >>H3k=~A" D$b['2 &9ѽ }mIw21{)ox XVFfQZLf=?a)En0UK,r]Qo&6h\yd׉|-H*u^7&vCe+% 02"=MJ9tR6E~3S"?v.jXX{|Jk:aSaLB.O׳%NnnC0hOIħy_:f%w1SmKŅ$/6 -FսeI.FI^ b-C9QgKmb۹۵<<7;/F9U*2&r OD۝W)>#4L0R,bR3\_π'CԾ,%F &w昀+r37a7W t?5*F (_0[GzvS"QdC(2tw1o ʓ[+S%>=>Q{~ʿ#6`Tdυ/R= wq6vW#"+ x)ur}B'HxК~ Sch-* sD1:WѯALKh{19W5ekJ=^`ф*qkV!:jƏFMWv&[/wӂu߮$)  &/oU@2-4f3S]_4tx}O<}w55΃h| ?g^4wA#!fc\ՂB!(hOvՑui@<#3Mgi]xǢ2Bc@"AJzP˙`mn!tVyK? >hU1$iٻs`\7X+'Mª=mjj&xsڨ8j1rH_+Ռ0Vl'S*n~>g-Xr;X5 gszϐ{&8XOU2uZ0/.iicy[,i+tUBBUrwC1<]WH!^,!o5i2ߧ*j%<5m#,ZwbrBãzQDVF`/H#TQerw~SYMW8;Qkr]) /We6%\h3KW^Q:\m?D.{>(rsBlmhgVN9A'Y') dd.g5KpK#%$q/13p }vl^ {l.-VM{`@Pܤ}hԡGu?a%z8#Vm N$Ŭrc|#DL#kTk(mWϓݛV,i_w& n -+'Ί+'72dPx߯䅸yJ;ř6{x"&q"d?=BdV[]{X* 68q+o +=̒ +rv5Q4h,DS@5f:ٿ~;j2 !!*SxS!ϯBx^Jq?hZiB5hVh* [S\5N? Bl4mZiNZ?i쁃a ZqA(vCJْOgb)ܢqJgQȲj`+mw#e{]x]3N` 3OLB|=;0D*/l:Kp <(xcR[] 0tV'.+Pݎ=`(OqF0'5}G#,LxbvbʘW0yWwTy9/`SH~m;=+nj+2 mM}n ]o$E&V$s 6f?(${ɠP-|MB~ f.[퐎8[;EdEdyn@e:FYYrŬD÷kOޫc$3EsH$o9a/DV{F֖|?^-}ˇ9;u,=;!Og49.E-[ѸsAŐu1qUyL#DxgБ@Mm ص_,.ֻVjǀD64Fo!f N췰7!e5vs|`BL%r"pjTeʸ0SKjI%X/+ )oحtE'GV..8Ub6'y%p숙+o^xFsLõ!tcUB!o.L'Ju=4#j ǘ1!R]ed4_"`Nhw>~)4/&^he VbB3}ox0a2T+;aT9Sv}I 3j "\ |)9izܛ (j4[Ʀ۷Ds9I %_h2qwe>IG5? 37+P?۳J d0LG5'h@`輱 YCyv1"oU<#,Sd4#=5ԥ„e4oϾ &i(XI{"{eݗH~KjM0p1әhwp}\$*E*a<抒w& # RpJʨ*Vk%-wp,& ݏ5NBRu?7xg+/)8R0vOR&RE'WH:ŐRc3މޱd7֨)x N$btr;U,V}N`  A.13pQJ0kUbxlηpYOQ9|`Y.RUR=K22qѲ80#>8$/yK' M@%΅F|,NF-{)1Џb PXAgX;8:Luy9,gy=t믕2 ^A%#H_cXH_f[6MQ;PH6]+7 q ?<%ڃ56p]hT0BR-fEhҐaR" uºi|Hge>?M*MRts)[%xxs>\ Hr5p(2Y+f8'y:4QzmGs!L2b@/ݵ?V*!q:؆HH)9_z_{TthHYNI^4D;LjaIXMsX Db7:X!5)@ #.(JzH.41Q(lf$3,֝ڹ$#hJe2ǔ?LB_dL(Vq~N?\',Ow}3! \0Rg"_7z#gw.Ȯzϓ5Rh Ϛv'YT%@zkzZYBB΂A20&ֆҁQe*gׄ'l-$ D%Пe F@ 1tn%86>*/C?gHȇe|#D )TTO`&'fZiJ>!\,Qs9Dj)%bc@o( kxݍ*s7J9W>V^喙BkI"LjM}Z X;u?7^Q+DXܔqJ IgEG6w&63*7 .. ,'\)+Ulbk !D]L(R(0|u*: N*p3t_8Q)4ߛq CG4ݨoC=Ak',2, !> WKb H]0w_<8P)Nhϭ7۹^Z,E8TswF31)4?uJI?g ?DM ,z,>;ǭ nWEf' jHwڑY'48S|a$p 9I?1ZQ/qAhRy- M?X̏=u钸!Qk'gċay&ңIXoxmxaDi%Ȇ1A9W0ƌe[.ֈ9.zh=! i#cjm^$yC!/F}hvͷR|Zªs-tX2Ӻ%g1ױsBtU9I_YaπJk&Oh]J h#{ƷoV:k~!]b ,,br,xDi1s7GǛa "vK7izh"wL:ν=rkgfGW++=hA-UNFI-D?6;f!&nڋI[ZM*>2.>H\ 2 +re5֯<gJA4n=-0"[Wn~%4Cdfvsq*rI>>8od9[,9* i GN2 4rw(YxEQbR NU32A0~?JrOZ?;Q1,;??)&=$}ܧcqXҾ[J'EjM)Fj]jnIvsNF㩺1WŠ}4I+1J/S)_D\T)>t{d/s3^iY`j{*&n=9I PjIpDڞI0M  *B:N#et.[6֐a\<-p HZ$56?Ђ#o5%8 (ڰmOJʧZ'!C,l/F\F FzbeL] E1qi7"H;o*Ml̺]O+˾b %+ Z>_a)5PG+}n`E0xZP.Nbq9is%6SsnWmt1BAo%J4_/ u7)s$q^Ɉ3~WNr vx@OqjSm vS]")WblEf0KTh1h2k3iv*/Ƚ)+)@/}v_4!'>q" c7::Du3Э{T7ہizY͡+(<لɈpS@DZ?$)R@j62KE&NLhP?1OmsDO%l.|E[>Ow*/AR~Q$Qn :'#UuUu{Ѧye- %}DlINg 1*k6ҪRڅVL=ioUG!K= bêsSϕw3ơŁn)XO&ztB{UsB8 7Ws./1$YҺ4Aj쐀RĚ;7E4L“Zv|i%g-1!GA_z8qt逬%. 'q~X/$Xnt:x{hQMk7Lt P$$VZǂ]jftC!E_{Eu$5nD-0y#~uzQG5$V]m 9+nlLn֓#HVl.ͭ#8ʫG{ Ix, :域A,Y.YךWt\&鈈އGH7&=6Wc@ș_rBU,ͺ"#fp-m?;mS&%w+4}9{6J`uI篳UQڕq6Ϸ@BQI.\ MՒ]l"å5Dh|&9cmauW*4E$VBB[0SUdym5WRim*5quiZaa3䕵>dva:!(cNVL+']b$gTHz%)rkȴvx=!H4P-ځin3>m0j ok`T=3\(G%s ቍHX<WJYx 9w@srmj(YZn,~vpK?2o']1[Jgԉ 'J˝`?8x̠ %6G]Xn"'Ɛ>*I7MC15FF²144@H 2j=@Vr=R( S, -4O?³y(5ǧ&&b)Jjh7P8"v`nBZ0_aBEdu2Tx>D'Cq<I )ӟ4MQ%$lo70iAo{`/N|8/O|-=}C9 Z#9{X;M.|6yF.*6dxMw!$au:P7XBعC=xWfD ).e E$ERN衔_?Uh #wt9೫E!601弻A 5u$נV&0}}W !`z- Ic"煯|&WFNmv)8XJ8 ~~˰ wV}TTQ].#.#z iAi'ed$H+W洛>hR/8Dr&!6sϦz!:Iqfl7GG4U["|P٩C #}*HE*uYjj*#Oj"6ޔk54 "5ƱĂ ] X1a A55#c!e8uJM .4~yGQ \)?:USa19ݗ 4l40qg=ØȈYb {MM!"ȓ>_Hz(ڠg ajغ86N(7e]23 f(5SF^2brE&a?EP9aTTQ:{_}6|W`X'Wyi)XwfW Z\QD4\85/1l]3.@-0峥SAh~> dfZ< HqW>oG4e. pΓ\' 59wqZ+N tY y ́40M,@0hѭѯq~X?v =$MHs\e g@Ohg-WJ%&zm`Z(UV[р#5C\@/CVT3q-òk6(љ;Uնe&sWdV""@%CK+b$oO#s>䡻j\+.ыc, (?M]E364:ұTcs>[GPz5ߡ`$&G#); +G?kw8_ω+6!΋ꕆd{ׁ7C`\0TY*znd;=ZMbTx3u.|48ED%fXp]k`@/悍-!;VUfn+n49hxk{D<[)k )*f,J6 A HtFU- 3cڿ@!T?Im)l51|pGO <$<Vѯ"i*飏[JA J>Lc(K-K [+Dus\: ͨ# Ÿ{2](26UERp/Q~lT?bynAUkFj=1CԚϴp';jS W*F QbL1(̆6W{ u>@Iqaz6={9?tTB6Imȹ '=Ih83 "&O钅:(0a[l*%0-"yѣe*I2Z@"HG3u.<\"byZmxtLG@ %b+xqjg)I_㖑"M[YK/`; Es755,8gp1l\vZBa 8lOF^2D9ҏK6)#اm&㑗NUvbdz ެsd+Ĩ p\v=>d*; Xe}6{)!ifm0~rsz5"s^xPC9ydGZ*chv;ris5b$ ~JEǼ\%ÞcVMh!"e]Qotlگ`)y?fteD܁4p&243?i) [8Ş* bi]۟ @Ob[C?tq4SvF9Ng(٣:2PFcArA!2S|L(>%bl>Q:qn8?M0=!W]S=7φ!sd$y#'!|' 94( Xp$HW1i[qP'$A/PEoLb<)m9>?F'i#lůn 諤0&ض^pCuǶ[m8<0у᲎dvMN*hyrT-'L5d<4)3;] {Q{,&&G!<LAvp o*AZ>&؅** Yғ0 } @2Z u?ͯ+O'4'rxcd'nh_X&ǶmpGA{8 NV|;ݱ BwvpyXLڵ-)]bk[}iU,ZL iPcx3z]3#ya;+MܯBrMÿ]>+ 4lFjwJ~v`ӛ! /u6(BGij!{D2R FC[T%{錠Ci;>3xr T3,XD pkE.E'@V)*n "LVz1+}3i`tf5fI М*w,\=fb;..V`?1{Y&;90bJ!lُmJ尿Z/h:#k\x&oCR l:G$t/dKfcQDž q-T>^@s|W9KoN%9RJ+0UmVo8pQ#h9gWшv'Qk : s,FLsfG%,B AM4Iq|&ˏ-@n7)Hm2 #X5߹ "3YZoܯ0 8,Whf٘ gF+1M|>Yl656rpwd .?tYbiY "ĎL<zNDMK*XuR6k6b`q85nϣ,̃;jO]]!`C! r5"l#wd2cʚEt+è8)*Gb|W%QF3zmwܾ E/e]̎]Hu9ckɩ?N⑕(Y;_ ?yqOI>p-{=$PLޏ)Np$m[!Lcu).5es]! AI+jw ӳ9AehЋ m/a[B`J ;c$!TzĮO;u{9R |-(C)Xd v#;SǮg6P7&Y8Iɹlj@V6t< 78#p<(v}V9"ʏ6E,"K\$l]H$H5+@!3Rv7ߕ7oOc:;M{m4VBAd"W{Kch|0I\وkH8`*-;<:\ t2+yFhU5\H51AeمHE꺋/+[aU!sZCB~e Pn;qE)1Ӗ58?$QA TJstΖgz4,QD~!Ҩtn06A` !Uweci.-d,˪ CJ8)iվJez8=} ԸE)@3ENVBLCnn'넓y "e"R7 i@ձv&f8c>% (뚵\>w''Ʌ:MJ^M 2xp;' D<5u{ꤏ>mg ) &UEA쬶'IYf|ANsȓ +Hi+3GES6_ke NҺx6ezc[C61u pt Y cS|!>?Sqb⋯WLQNoŸ2C,&qW^IGO~S8S3*:/n ?LQl@<#(@5UP#IN6lCfGLY+2 $kd!,*܁C?DՁ6ޔ[)m*eǏJ%bí>" bôs2BtR~;޹3n;4Y*ѨT{2K]UDfJ5M9eaͷnϰz5ij>ΰ5q!#Z I9H:IJ]N )ܬph)>hH1OoDcaB@4 lF!&Am5e\OL0="%{f{^tR&_|HQ.Z|v'30&wך0m湳aȪ q]%{<*`>/TjgZL&չuqM;iTĴ@l15 )`5/}K(Ӎ6w汊iPA}"Q3xqg;./$06a9<0>H &' %z̞"%.Zn0KbUi.Y5Fk9qu ^+qQn;bk,T:X!  g 'F$PER; B$)CE+di/.֦LR-4TT6mZ>9M`@8.l63CDW\h#98q'U0@fhUJB,HZNqh<N@ 9ajpZUS7 ІaF1H|"b_fX"ˏV6(`=Zb ,;9+3lt)U Za6WImw2gQ'|CKQ}54bv"a%HHDzxiNī UO9S+ :-{`.y0Ca\L*qv8)ոg|aWbs bԡ3U;SӀt휖JU yE$%4 +J(g(D{%@X]!-kNWun4B7N՚.(B+9WO'Cr!3QM:r:Իiv,#1ԎDrW6߀%1 *DXlTixul=KDjaʋp4=%*#ԡkc&EQtL mAlJJŻ/{e9lڟ+pؚɑ2ǟF;]5-X~ߪcrFǠ Jr}%8]hO \\/_.ai5M<B]7L^b] t36:&bAԍ@ vz]M]$/JTA̫ a@-K)Fݩ4uY2PWyP#498} *@ 5؊7JdKN#\CNY"+Kő57ކ ,3Tjyvu"Xt7j-E(O7IՂ- j Qb!^Q"[a68=[|R[{{m7g+r::n> ۞'_bZeI 6dDq1GHWkIX{}x0-ۅ"}5X-.ڜVQg4= *pp=`"zDw&AF5,ʜ_&f<ӲU ?L!\& co-~ ,5N)d/jKHyUސx6~"4o_y@*Ipb/͋- Žu kv%tD;{-؍r(F`.4Q pZ9wyN1#2} Xx:A 1MWҚ?nP7hO/W>0%6~À'J$fB{mQN|n&^1rn?*ӭ O ta %u1Y>ʧgO%х0Qƛsm eA#\Q~y놐zşb:+,sEr] 4*Nv(G;j3.7-Whk,h`Jy c"0m"lBF \8#ŧP6Z+|T +6ӗ |Ʋl7Uу.lċ165">O-»Bcr'Za|J!kޜc︲Lr&qt1Vzہ*DR<+g_& 8̺R}bXR4Íj{[3inxwsE 41EȉǙ$kVKxU )}V:l9*߭eFk`.jLM3qv#zJ ~K5KG ,fYo\#kws+(vK3ìFyFUP6246뾞+'H6BkgDS>BbMS7CVn^}-NB 4$'ɣ:9!(ln2Csp A0L 4)rHd- S6P(= Y_T^ܝnlҷfwBZ9&qhr0 -XvSE(pyR / N|Kp%SVl8ZIg蝹;a-/fDu4)v}3X؍@T% 3O?0S\]d@nN].)Lfμ;a(&t}IѶr5DS:?xIV:=dٗhN"B g t$Ow<`&LϽ,⪁'MI -`UKaVpCbp C2P8onUV/5&KJzM=FiaR# J +W|\ࠌ4XqD,m[k/!A7\O:$Pct ݽxUs"O.cHm$|4rU"+t+lfI!.u ݂Obh+\ 5TQ6D.|*!ʱq}j@g$!9$5.W <yu<šAo*Jny +˥d6ʔқ<` 5.E˄ cdaAKc%=vqwf/х'q&)$\1g tMU8;tMFg1 4d-@IIF]ߊ= Vf*-ͤr5,O쮘&k53:TyNBc~#>0m (wׁ!!,QN<<qA0&1,<%Y,ujRÎe|p-r>`[Ka/ 0?'t≯59lݣ:4~'+cWs3(cxj2$]{j-v_r<Z>.4 nxDw`݋d*]9ad{k=*J|ԡj~a.Dx#9V >ZL]IJE^k9,8" Rb5ܜ06y \I*8U(s a "^K&m#ŋk QiዪUڌ:pP +.܅Ho,(!8OZ'.s0FI K62SI*Ҭta\i b35쨜=ĦحS?k z!d'ù^̂P;vN=\u)}4hvBɓ_3WSN4m{ /Ή+^ܒŻMMC Ʉ4YJ .:?l\ej6}&9 Ih *4 4kC>',0*Hh4A>AEƄM3< -!lCI(QhGҤ0O &WNxi݇t r%BYδb/mbԩ$NnS/.0{bw;e$ CQA0^ @mU}*%|8e?<3Ȫpu.q0\??2>67 3pz,:F'SQ_\Ab0FplK$`#%w3Zgd{Eg\ۡM"ۑʍ)^Mv=WHsR D+wR6=N _D蠤 mZqbPܫL6Av1_h*F(؆=iН!mpw}ٷBjuX2DDA* Ǖq%i"Ů~N"&=F4gg7/"5;-q8f0! ˁe*ũ48RMN|$C)=bD<Aiu6 !'b^3fTb $+hT-X=DT< HlӢ&im!6!肩xL)K(ZKpCL.=x)ڟ ^2pyk^LTSz;$峊܈mVGy >3Ct7v~o։թ˧"Z'@éyTN^\LJԅW01{4Ru/'b5s_]Ign"p.-|= ޠ3}XLڍݛn&4U%Ƀ`*Q@GS 0.ZXDW 6suПY( <*f8Ðj(6[hi5pq%4u_teDC)-DMC'N.u 1Ҿ&Osh!T:{CZ^C7xLyR-ц CYk89T6ߠ"(ؔC9B%6meu#$wdp_#VSqu?4SrbݕHL,,M"yJ,SOh]U;a[' 57˦:!<04"bT ~PA\cj#L|Z\~*+;֩K@9wGkD,_sWnf᫜6%J_ȃ:}P{l!"^7$$4Zb]rRHf*5B_m߫-^;tMg_[T5iÝ۱kKhi9RU!B3lR%Fav 2bvgg)ƀU&Jc;)T4|ddMW.Xn|'Cř(! .}} -Y:+e6 si(Yܜ9ixUil6&HC0Lσ28T2p\*+;#D>X(T<ä?t&95&n7psfF'Q//G–w9N];I7Mg"gX1?&X*s|'!W5f @.>:ݜwmuVaM`S P&e9_d[;a8hᘷT0YZw{v!yFͩBm2?2$)'S,-2ӡM“ ξ=1w8#%Y)se_A4Z^J#l\o7?= >q,?Z3K$ "%VLIv#$7'En@yV&CJ)׵/-x@ HH w"qVfW[춱pƓL{) 3+t-r$ 80 ZX'5Èh\ sCS8Z@A!j''3Ѣ OT%yFQ*ccaolHln443v>p3ߕU!DTK O q=NLW;QU(SD&ńD^`rQ{CGxN8=5c__`L/m8 Q C&<77$9`{rN@&ϼMn/ SmG#8L+ol0Ĭ;. pa% O`6Z}μTϮ[pLlMOŋUt1!6K\ T,)ZLq_G%c+* ={*s(<#qRo7nI̥^?xvžخ>E_Pp&'/dST|wZ!Ρ)Xw3 1:=h[2B A ۔M@',k>D&XMҪi gu }PT'oY oTKel:*0{ z 7)p^ET4<-_HJΈO,g"0C#ڞ<ۤ@&6W3kckF f=/-@uTE<5F4XĎ PQu;"HtE;o!:~2`w4%+#~J Hd?>Ӂ. ]f#k@N H": zkЧۓ ,32H@V~mU$Xđ?[Ћ, " j-5vtorĮ7j E{8CɨdZUI:ً͂Bpl{#2YxGxyn8y Lf)HZ,9epG=]y%V$c׫`܃" ߿3p7?&LFkw>fkiggW`"eo FME@+7Q@Amx*P+> >AWg6Dc6&_5$6AZ'(S_Ԧ=6B W.!H01'wM@+}-VRyIL*}ԫT`6ua!(Q'[4#n5e4&B<#g^(N)y Cͯv,C673Bp~?ʻ>1ۏBPSE VrQ& X~^ϼGd3$=¨V(%oP ?6l^@oXnRl2B/~ϥU1g6g?.lGb`6›-͠d'1"{+&òB\8q=1':908GY-Qt_sMbA;=nX#~L93OatEx&nhp@7a"cy KV0,%0  ƅ98M=<\.Wq>b ț#s.PQ"fjs%-f(N>znϊ:RE.oyS91M*Fʕh,贃-I VD:+#pk]!QrMhs( $6Z&tS bU+aB䬐c -/QhPtG"rvR4S922 Hl>*Su#+˜& ))DWu, "yppK3g4?R.]!7/+Y tL Yo5WjD";6N+2h#H0evjUE+">">+,q<{!ŪƵ*ͪcT6wb Z/*$wU<8c5JK"`~RtG]' wj%^!p=A*gQYq")T@F5v@*)Zf=2Zv"4U}ihYXC`ǵfB)ϕ @jfYD)pnT89c@SvB(LTp`C3 Ji|ri2i8@,h nnmp?#Sy6¿ DzF'%,بIJOBCYFqu17u+ʾ/g;@ e޼&>{2C[>Wn:}C%' H( 6& m 2I+ Z&݈C0^nQH8~vĪ9*mppԱyi6Gw8ZfdlN.M`\X׀e|DpF}909ʊ݆p͂KOƮlVoD-$@<+}픨L/#Ǧm^tw% ڕ8- 6J({ax vQaP8a.Y켓KᩭeVY5T#Ah9o0(x7WY;~4VB),Qx=2DoYʸA37s|Kp^,fFMKx~3>;"\Mu?Aa]?q^D+J +T S'N<{W}v{]5ZS4SipFyiVI l:!p(Aa(9MQ;\h@֩0*LasG%Rซ} g&JsK87FиtA]nkƃR9'G6Zض z5RiIFdX![1Xgwp Н&F"ۗ}2I=zنx({9X%UmM ̿M&iH}HK:H.W)ȣa\R//R3)Ee=>7 F]NA90ؠ{ ?F"; txQ`E<ZΆj؋+ BWN. fx!: Q+hn6FV#\J? T6Q!R=A"+^յl-4LݩN7j%Fhi)*~6J8ATԦ!ĮWBMw5(5(|ÈDH4:vɬrO!9!^)\jUZ;\O[#j)7K_3sZ0ʂ( 4#V$2D3Yz3^Qkvq rzr7-몀{c=(t,Js`ڄ|_)ͱ2PS $LЧs'  ۻ3T@^?Z4ᖏrHXeeꦛGiR4'yk|3[Ү~qBÊgA1]])r[ZM?4,tm: =YRX9#-WhdF&@(dQ0)gͮGllt!A"=tX0P2e|Y6g$ i+d"MnT/З$s^5[rm6  A]M);=.v4rkX!l D(Oѕ7GI5 9% Biה*lѢ=BD8NAH$LA9D b z\'uDž ^7pUơQ-ڟ!WGU3qR9gN6xEL97 @H8tLtZ? 1"kbƏ(-#91Oph@=Eįr+6G/Vb6UΐL9e{`6D!=U޽BCf͸QgZ"Ej̩zUU2!G'ɫ*ք?o*f};7iXbȬ5],k/.a87xΉ5N!ǟѷ}yEy&ck::GjŻB¡lC)%]Wa*;ĶjR3GTj46ě76Nv};¡H`ެ D @bD ݎ^3ZYb(cPE5{wP;|6fqvN:03zn<4ڊa*d9JDW TaI? ť@'Aoރ*6t 'O6Rz4D6R5DF1`UAe -mXW_|>n[\UrH0Zǂ|edSv ' rt?.=0y~Ͻ(=T*0̑O`Qnz|WB^BrLu=1\IM>0[Iϩi#&)>3`͘Y+N<\9̹CC/a 29H/o a{.LG?TyT;pٿCy-`e(^ Ќ'K>% ϯOظ(8VdPpq#[:.'b ycr(_l}deM|1:X]hWZ),hGydsc^?/ Ɨ_$tB3=ę=P6cǜfv-(% 5̢d&|" ea7a]lF F {w|Ҕů"KG'u:rXYU?f[+'qFR)Ɏ.sA*M26{,'lӹ=g):o0U!SE,GH(_CY\ڋ|*W*h>%+.XZrpw{ {*Ю5t4pwn4~wxG*Y NBM1 i!LA^VOuo0>} LY)6Zj:ϣKS|q 3W"3xas? s%jgM *؀VRލ>Py}HϮDA8ja(ubz$V13%XWCڕQy2R{PI..-Ԉ$Q5?[?hLa<܄!o'rȏǟ.\)L2dW)J1кø97J3=m= T09zӴopF&4i|X sKLMKXM(#0A/o[nMe/^!a^+<}2[#?}!('lw%vϲ&(0s9g|U/&T__0'snd&znHj&:ܔ;&>[8 Em0IAҹ$zʽ_ypvr}$O}QG-KF=56P 8a\Yb9l_KFaH"_2߇L C4|nyox#G7Wy֩bӢAbf,ر ,V-kL: |7N 80U'Bz0v5GK-"I6G#3+ϻ[Y!ҝ^y[k+vêرi<ҦGʼnCE2bFDϹ6iBj' eCL6>_=l!4"0hEB2?TldfԷ 'G)*<Ö5'X5itq5F9~L|_Y@tXWf!^ȝ_aov:S 7?/k"|1)u:7R: hĖf+04t"~DbsDGҬ;~Z6M ݫ`;G ~$q9k (8JZ_p ޘ2<-+@F2K[!\1w̋.?PW Ϣ?y)_wm})oRCVhez'SLtz7HS\\* 'cl11'_}4f h3.0|3>O7>9r*߀!P} V=Qw^&Nn8 U)% .}ݗ650x"] \Fh3ÒnyO=c2k^ Tv9$a'Ae. / fxcY[R6$m9q̆;o{@V|!0ArD-3ɇ5~h=eyl)N@͕8tNOF-`#)5mJC ]#0!Fl 5,|@ W F7:GJ$JB7 VH6rҋb,X[&n"^l|Ď.{28OZr4++Rvuky٤>[pM[(5$=aw<'xrf5996!pԭeAlUܮK27m(*I7hRj,ܒ>Hdi4o"r" 'S vKkak+%30ŤXV0+)ӱysFbk}v3C$/S#AyV]8R#1Cu*9* T,#?R gN"u&l谔R8U4("̀>Wkx0,"9g"kA2x+ !J-ckT(y> 4YQΉcݝR4C' Rpf qBAU@n1bBQf :L S|&ap"/Y=}gSO^* U*]W&{hc8pB5&L.IS/ZIpc /_%:2p;mQyp\>4}[Wdq%NX8MAP]2m=`.qoZppњ~l mlgL:E kӓ8F@XOC4ģ0;$Ǹ" /TA"-wxfͧ0+;^++{"9!JK\@r>3|_e _ӵ#Bios{b\79H,5~ˤ%ޏY3e>@BZ(H7</O+ 4?&h 8-֐"he#6 A0‹_ u+}~)!?hwNR}63yV K/TdD/Gg (qS"@J,ހh)~{I rM*23!]aJ:o`1`b654rzx&|ҹ0~ЗpEܞa|A!GhڼĽV`|)kSKX,e|36,883WHkw;-A#Uqz _dmZyF2qIm /9XRk*{ (ws;JzGt5~jQ2JP ߀]JY٩)RH%o?vNҢVrfp.'jYs[mw'"K@ h:ͱ0PߝՎ1H+h^OIgAE<:W=U @ "ѽkN1VC͖&9*bF- N"5~,|e0Dv2r72L ;}Ý7~<+u͉_b?^OJk$ ͊.sDI%u@l7Q;ݻ6F!n-@C/8QG% jDI~az;lLsWª ܌sLR ٌm$MP]vs6x~*p5fO'. 'WSк>DS5D@#,k9{4ǘfVy44uT ^$ٵ>Qe3sFvn-P#BN0ٗqoBa0lm BW8V21~>I'={b,D6#+\L"<7Y,,|,JQb-t_0_+˟ Jp77Z OS];{TG.ƬoBc"0ɧ?uÒ%)8 *μѕ\dQRt7=/Ch T`ƨ}5Yݹ3Bɀp4@|! Uh.ۿ(R|̱A;QgR*)bNj2'!;?%?x4Q}CqA<dALKvWC0aGq \ Q \'=^d6աS-T|yM(s[&3q vx6Jը8i)=3ab*j nvLji! yB ܸJ7 TC4j W(u۽' '2 TDL!(m 2ށRذ[g~dO%U)( >+Q죻Sl_.|wO Zo%'u%茪hG)귿~x[a${0'/0"0B>#ܱJ:=DR>?US")n4ה-&6O9+苫Z A`am /9AP1DcWvnlR8;(Ҡ KũMΔ:3t5 ZH%IFE A6D:9udB0._Hۗ@UWOC Id}^j4Nƒ]@_ב:NK'";!![xtwyNLv}+ ڝ+ljd)qV5W\vkPn6832Va喞lF*DWRC"V 9F<@}v&jq.l(>kȖG#P>KԨ0YD(/:2 z|M䑮$ |o[q)?ȃQm2Se/-eDw&uy'e?4tiax{$߄$ՏpX1]??$bDsyzVZmZʳ =9 aW vxTKx^gˌ&^N9Qdmmm⮏ֿvy/0㉡eAs8/dF[Og;<m.t_)}}@Hߝ~/( A~%V3Q[sPWE^;2ORਂ/ks&2f o5"&&S#:ViX8: te,a>uo'ط֝$$n ϧH#h~ WSK1ΥK--$ g,^x,(A&q9|V& [q[G\قx##/,ٲ 1Y3c#\V+,0xN~/;s,3+ȶ8Ep\ZH=# d)`%N+bn+@="W< &lb%d<ơ 45|'z }&*V0-1 ;e_Opk&}8]r3+N( D2fa>%c#̦!ƭpN6=3 վZ_<,K8ٌCbp+[?(Ex ǻ{OJr/8* =2X'r^*ZN t'9o1\|v4h21" Q~aq G>9 (aٿU:<O&G>Dokye *LH+0ٍ; E4ؾ \5LƦ6<0XkɽHZ5暫 GWY;(b&<#;0IŸ-a)]J:/ʆl^w}۲" #_xŦ^Ie;?JV +.Du;+nQ|Ȑ;JM%N9A]˵yzaS etJ*R!g.]64>#X;9#KTZ-KSG4tZO^p{tVaUM7+y*8(+lXA1uԙl 6 \QoÉȪ$cHj4!O{%JUW4l {U~ .m|Za4*".!cw]+-%A+904VHtj:t7r#oDAw J-~þN'JY*ݖOU_UÎzQ^t!14t|cJֶ*tا ui=AD\H/-SFOfǯJ/b&23&t {TŪ^j?!]//ᙩ'w,፶qE܏[" vj;Wb-xj{gq95(Y{%1m;g8pc؞@dx·Cr,.~H F\ |F }iN+:Nm,D b1NBgD;$냢7rx DQQ -$ ڄ:%%*-GWJZ(29B^)}wW:9nWY#Դn(Sʷ埵35]HS/ /,# b%)h;9-7E}weѰi C?"$|5{U&^8Uq T+#ۂz5qGTc" u)yً6Vȑ4l~Փ xILI ,h"3;zoaA8[ی'7B*ʣ[YmzMp2`DD5@^Flpu}^Tf n˟J!ƥLvyܽ)D}C8W/kS)4 .J]vkFdqOwCST z f4T#&Xi-"Uhi(CA5/|ĸAnwkjC^2Ɣu?4TT旻ٛ&IUş`?|aK>hYX#N#ۣ ';ܓQ92y^o.ь+{F 1Iǖ@vW22 :J/hp6X>{<^oϩv_hGN$&eZuj BTTwBY%d-cr0Vp>EΌSi)kqZ.Af)=9 8~topuD3m!#;<&.>yօS/E$ >]+LSfhԥy{ c3.MBfq6? IX;;9q 3 G8brԑ wh_E$IXO I6˔ŽV-U[`nH+bckieCT9srelHf8 ^k A>gwiTT?gC?#hZ߷ЩR A\Ugi)OjA,1ץjddDT QQ+ADJ۹7~¾>PXjZ%(ml"IQsnչR.RZqN/%3!+%% ZKd'i9 "{Yik5JF/➸a(TH,3!!z]& 62鱚2?k[*lӝr4BxCCc^A?Ͻ岆4D*[a)KnS*:/ڈU$/ "qMIIdƻkaxJLk; )k r |pU\"*-y]ƨK3FthfyUͼ:ܥ .{I6 #I RA"تl_IS"[\(,^ fѮp+(3zrs25 /~L "!IمOж>agצxU5ͧ1B"'a$pck֌_+9" 60u(- W~< u$k1m&=IYgPҷwq7&o$Cd%lU&VΫ͉/9J/BAl ;1 /tlVsk󽤩39CtR%V|zߑ,䝆ko ْT.lۀWv7t:/^Ehh`9P:#ŢZ+d\s#r$l[tdv˪31v}3ߙӬh&-1Hgr=T~A\WtB8zfn-SV$9`6HIh֗#fh1gklmHC28 },BgI) ^HZTAF?7Y6[^:$|-O"?)[ DabG"XAW-.bv`q:r+֮QIln3yrpNSO6VF 3 d%kR}\[#Gt!Пq=X.w32,G#(n*0RL9`hЃ>ϙZu}, 5|H4$OoPME:1/  v'%^oB1eqRPk$z4rhq5 qahe`? g$.B§/ KMXy=9cр9lB}OHtO0׋9ƃ9ނp̚# ;ZlQcoǕ,}xӉoqo&|;Ɋ9{o'8jδN+$֤d-%2*ߥ+#5b"6  &нx.4m\5EW4+Dm=:/#V-346JR UJDuN`56`aF"&gM;k](b,ñǸ*\w@%! F*:2{4&5*f]HTk:NzpE<\x!@?b%"ۡ LKs)zja^eHTQ@VL4? 2si3v7ʵ 7iWXNDjIvt, '$,3K24凭Ma3\w#ig1,>$9@]vUlCX>|z(~^3"Q+$O/i#P&k6&v- #xĢ$0a_FCp%I cTRG u;n<[;3G*f-Mt,'3R~)f &2Jٴ?%9$Qq/%@nkmYifk(q`հpu;w1"I4#yF\u3)%Uu6`lMWDgX&js.neYBDAGHUmف.`D`:dWϩ*;ia,MЮd'<*OVMyRD_7K|G0'|Ƙ#p( +ܛ"^[#:~pp"[~쨌2a~`5B+5lك^ ⯶'/y@6ag5{+2-2}_+|bs5!:oKZ6Ρi\]76;BB?*SJAag44I4-4xtRvi@[b-@k!,g7a]F*,:WPA)X9 uTqtw '%:b83!}ף"(iF)j &*Wd=c; bi\oL+r@Isd/l >я]>-I~]ais4Efp~X'@tt`Ï;M.102N4Rii8ij!`Ez=r^pрrJSM[8alZP8y|Vkl&6!OB )ZzGLqdm컗0]@G$ҨnXY'y~"=h <;":V)Ř5aחxuЊ&%ʪH?F,s{}>f-pY.|ڔϗq7@M Q@8/:nB0WڈH2h߽͒$J,P,ڢR?B*wsW-{]@$ix;hUˣJ'taUohA9͐rAKg%̥:_x\5el#5A"$n? OֱD#(,A368eq^L,a^97ij,"C߆txN揄W#,"í(qQ?"q#-,+3/Geؼ7@&[ Ad6o}_xw)X( 3 "Kf7sճJ%)oO@ឨ*޿]kdܜZ`. "6R5"r:b~ \"=fUb S! _:ސޞjL86z()d_Sv%I!1/}TI4F?jʹ-=T uo$͟ŋ WD%bVyE͑%qNR -o%((nז@ncH&+y"˱d23;!гJښul>*??2e[~ub=`璦ڞ'yO~eN{\ TĠ7PF1^Xc ~JoE"ؙ`Б9wE5>;>Үߎek'@<" <mәu!?& M>0P$ VHHSVN0Lk)=w=~e8nmkZZkb"s""е=Mʷ_ a6!,%:Nٺ72dZ<7,)8/(ȡ>/&, 8Y3|Qb]rym;G6n]C{y[ ۥpLvd6xl E|4TW2ɳ(Rό CMOWA~ %2&pdY4y{I #b|E^h>*"le-5׽;){-'vϢ5q+fh9qCM-qʑ>A0cK.WM‡Mx =jܧtqa\ .!_NQb_H t&s,ďz)9෺&PnE#IF:wЍ7sG3$4dkmvτJ`X BQg -A.>j &].ύsheҿ(WE 9Oo}:CqB/26uF(Mf#f$ɏ4SJ?BiT 6|1wS'i/{_4UqTbr1vC;~! Z7!B\ufjCRA >jR=n e-%/.TU iHf]&} Mxy)>Th gD[zcXI0M)ar!U{n!\<10TN >]Ot 5qu_X 唹%><#I{V4Km|wP'/M Md,l <ƞH䀗\:'~nQP〇;cYMg;$0\I{ea X\`ʚA . =[ c |L9&|qohzS&~RUk8Hz@0#"ͨ!,话*Fk),OQ*^.C EQ' t683KzZCm1 RjAh-R"##1:|laʹ(Q+aI_HY;}s6R6K?n[v SE@k<XO"IPͨ)ƅڡP.f*WCmnSLt58g>d,Q Ԟ)?5`I%೯h!rD:/ԧ!$2E٠Pj;)6B*e3YEʉ;Z4,ɳk;/X L06坸 |C>`{JH :.&P^([ 6N븷t ](ɹѦo<$v 3r C "& KO`;(޳c?I*TwϦb1Qz%S:7kL\'a4ʕjP;=>Q&n݅19S=;E$ p o"J#KFTW i>K1TEVf'y֑'=GVqWk@ZֹJvL!0Ơٛki)N-F61`Lhݓ#<|$$8.hAC0PyB\/ajkV&--9 eEr&3{씝/y72Yl(T>~݇7fV';K"߭cl&. 5eX3%kW|ǿpZ$"~n.+&j[/ *of_$J:W~7a zEV@SRS$a4H RWk(}jh-FC/{խ̆roa 8Iʻ}xI⠜pm?LA|<4y#?ܼ C!?O 9R[ LnX,Olh̒a8{Oģ h&r&qn7cпi#ٱZFU7]yk2!66CQM^sA5+_c7!{T;.O5I:waa67_J*)XY #5}w'4YVw92Fq\DV2"nc*Kگ8 !` +I~tkIL)xv[E`_w"n\;rŒ3S|yv*\@>ܛdeg-[C lۗSuP\sNB _>2T("od3"vT8j2(+>GGK5>@*j(u)?چLmlOO&ZByUb'񷑨 H#0CV_'|j;1%W=P$ ƔHl$1E=ױV&Ws5|#6* ykv&MjltP vC;RlDH>iWU0 E[ SJgUCGj6@C7'=bd"W["j}" 6"}_}f Ƹ*D\+-iBew[q)X@YЦfU6IR03I/Y77BZU)"+fb{`DRRzq*6oے;{Zx&v؍Jmd`5\0%;_KKETN䩊\!s||of)]~CWt>b]TmƳ)Ï[Kj-@u4\V$ ҅κtIn 49AobHɠUo,4VFiDs P {#xgNj7X1cĤ)(duY: VAnm{ 2dS@p g!aZ r"?T(8s=>0]x窤6'&ŲO! N|:H4w c1pcwc$aIZļ) K{%$>d&C~Kqڶ m؀U)Zbm&E]V&$Ld!yQ🂻H=0I-_d+RiWffGcL<}qNkPv|[[ӡ ~% ƙ'Ն [1HJ1h/T7qh``>\ۦS=H0C;պ"@VWF0 9-Q<ү!,Zm.$De\כ|qxeh*1Ht:>ѳNBtT>a4anȗD +b0qhT*Fݳ nغUux{|Ϳ0j>!` ) )-+CW|n.j0ӪM@t s7'I!pma qga8˕P1 se?饌{ZPMy ԕ >F=чJhDZ7ssR@7 |;&L&\B9h;gE չ I0/6dZC ՀEU(QJhM;~EثCi!pK#r.aI ^f%JV.T%[-jLrlAgzyT.ݕ쁜9-qTE#Aؗ)o:3D|5g4⫋a\Y$ՀEAږ[ 3~u-Z BZ+֒CQ $|U&ǻcQs),+4f ptSM۪0𸪼%P3ȉl6r?hejnl"-O;~YT{{`e[^ Ǥ˄*Byϣ to*چ>rD%5ɫa/eCZH`3gl7!hepZ!8Ae ޮ)jR=? )F@{`8 ˥3aґSWas%V,:MO'pp 3:QGvgi9.Rk7z`uĠŌ(&ٓH消Fث8d H2o8[Z%i*F}2[b[?<yXSXAZAFLx]yA' L0bDW+/h.%RᦰW?4Sב1_z-:zD-W (Mv=iݛl-dA - .`қ|6d)H9&C*8SQO89D}R4AGlV0th-&c G#x"\gY9l<6\|Q+5x@%E+DsEujP4h5TZ4/6UϖHӼdARCp޼,.;AA~Q h nFV <$BaҝI{ 6+3$Q.6=FTf*3 *Dζq@ 9DBf\Li`9UuG@G.$scBH*MS@%X갱:-_P'ǚ)u n $^(E8;8 C!':Iɩeg7}+#ʶƌՔ2@0[Y;Ta>ĆQ_+܈}d :?'#j/JM:rvԷD6u>F:6] pdIX"zXefVcCA ==!*"XS,?:L%6)~}w+ >:bI1'H.T\͕`6Ⱥ;`1Z٦:ie tSASzy>G?4(u{:nut˶쩑d 'Y'5xO2 KRɒQ~g64>j!0B=W\`;|݁C`=)Vzj/J*?ʘ|!&'dG^F]cY[#uG/1}^u`tQ2lؔ;$0?*I|t=Mq5=%-1\\Q#^ `d :apI.8B~r8i3&ݫ69d}]ћ#z[/:G8_7jqމnbAL_]$D"rƂ鷱D =LV, #=`t-*Mx%iQkLu*lL8?8:sO+nr%?kO/g#wIP# )FL+pAd,[q%#qSZXv9'R}7eF*KW&ذ4cjc2XS"|{mH0A<}DΣ>/Y+2ڈZ|RT֋U,lLN:b06L0Iňóte၂d=!_|F&ijQ>?MZ"c+U*w[ipX Kv}?4+y.BqhYrYYJ/n!ubzuҏoo/T0'W)R +|qK;ojwq,)m3T(Lc{\&;P%Bꆐ.ĕL h20&]71Rl<7oLA6ċ`{&V45 תwA0hkӸ/3(J6"5NEΌQjN%kiZXw~A'j"}"y`7. 'of^q.b1kF(ya9J[+vE ze[V=j_;C/9qiKHN]V&6J`"'<RM"0D^Z`_/Ĝ\0 90'*<08=w;p9ے($~̚ECVp%y y72&@>kdl.(v~E< ·:ajԔ"O/+N+e 6ᴏ$jFD :"vw?ʺp%k-X)?lX2y#eTU1}埊 9WYCşWG3,VT!?@sV#- p@kiPLl,8 [YX$ wkTyB4$&`7z*'d*˦"k!wfve0~Tã+?*~c1}ng*45-(ziksfHÈ@!C>TDP*@vV )jᵗ۔iշ&mГ A,?i3> 2 Lb#R:8db\;y _Kl :lHSzsJ9\(w'r^G_fDI!'a#So_/<'ʼn{~I&l'u; qZ6lwc0D_=u4y N CՒU|j^7Ip$Ş}%΄]vjb[L%.(`w@FH+dp@NǑC(;2_9 | uMB {3*db $C NB.QScYt7>?㢺-A':T(oǼ\pQ KT8p\" MXTby9F6ShA5#jK aoo)){#_(CV,oEKp @tZvrf7FBs&I~(8SC'0fda"qHہ2Ƭ謹1<=H*M,R"FW">K`Lڸ5ZgPsՋ>en'/ p!,0^p:%ʮ2R5Jqq:j)|!v .} a2œ͍z $/v4ɧrP0}?Vk= g)J[DO4}\xȾg', (\+qc3zA1;3.Y%gjA@W ~V zolQUERmxBOP{y|(XX&+[[f>ISc$藛W2.nu2Vhu[fw|}m>)iL5wWp 9Jnlq'^tr#}WaUmK/ՒpY%0uO,eg\-乪i; kn.=j;Y.j7ayE(z UV+&ߣŝ 0pC:aŢ VdY\FX/ 7E:~I6ý6L0vS:TrKg$Djx4m߱v0}-3֢ՄWޫH#{d b4f8}%Pujk-^Eߌ#X7Ɨ=RjEƸd3TdH$p,.[ND!=@)`4~ڻ7:=p )uZ&(nhH" L8&^Msq\02 똊º Iwe+ `ƯI!s> %?s)>6ۍ-j85gwGK1E!=dRRF:HUY^bg}a*L๧me'D/z`Y\4P,ԈdXQpp@ʽ$LX!;7 =Ǯe~L&P=`b) ݄ yp$MˉBgFq(H":hv(g7P6!P^)j&bm$癓^D)53f4ޏȚ-a8/qV3]szAo9MZ)=P2U o@78+f#sL$lG̊РJE,ܶ*(,_-*&ItB80b[<>pM^3E'#rV:N *+vߒ+j9SO~5b5%oNs嶓0–`\6Γua]Aw?hOR\^92;"ҹ՞aO§fm?u8{*FwYG!V㲑@p9IOZy}5ˋX,1uD4Ra(&čDkn!.x}JUQz5"U)mz^cq`HImEskꁈ<4 [j2} G|ooCnqt (2Qե 16jX[sKɍQ#J(C~u)nd/2P^;@N3r]E}wڊ-_6*?Ǥ{ UN4V1ъva)n'MyZ#hb=zkz` 1wףy%_BLXyF99 FME>f7˳{.Ő l#t~9ѳe3>&h|Zk7='4?$H`>/rE0 |G qN-N0m»#cm'HV

Y9]m\%fؗQxae#sM"Vsu^#z/e9>,Ӡ,[+ҀvjYB}KBeN7z$kKsƒBI/EI?3", ]Tܙ_{5+eiW͹bKuiS7|6)lߡV O%!4b !WJ,!F(9,nc*A\{?2*Hawו sGwJtQ31-qξ4{\ɦ' C`?CA t|e|/0͓USexNkh5)R?&~TJZ;|*`>p"U33H/tntMxw]Փu1 H5{6aVaG*=( RZٟ,ĆRژvGM2l̡0ZG7u(thK%?o >%8BIyZH!OWk&d7`L'g.4Fzq""-E&3~Ex1:ex!mx= kG0]aWVg=A.?ԪDqƧ2FC>faڜ`&FQ& Ѣ!:0z>Dt/2Ji&)HUQ;3+ڲ_ٯTx-rRz%^*R[)x.uHu#+!-ANt1R m :1M)z tO+xg.$t$}렳J("]RQ#~:-ѿ-f]& @%{k&H&Ҙ\wx/9X`UdH,XK0ߙQU ۽#n%k}5n^}^dW@*NR,6wܟwy+l\~;@qlKoQK&CWv%vJ +H˥^p0xip%!K]Ƕ=v#ll<\oA,0kF,f=HG0LZ֊>!#|ؖ7+`&,/DVg.uf-"Gj"5o>;Uww@:Ji_+ؽ+CRN&gTWhV';7vN-5yw2U֪I: ZQ|!dX}0 &[e*}|h( ԇ*\jɞor?4M!uf՚9A93>åqg RhZiҷ@gF"iRuC 4ϒiN)f إ:R 0U1gI3b4Ab౺B I'{3Q߁QM{mX^)ƞX(XvYd %W  A7xƮ2nmp} M-rZϨN#{jpEx>%ܤDfN4P\Ԙi OQl"f+ '.aAd3 Ϣh3pgeѭ,0AQ=a~d B@LtEw#=ߏS&p%?2g)h?*6&>ֳ/nʦ14k}/i~ ;_}P>1>BƘI. ;"mv[NƸJ|?8\P%B{Ÿjf3x&][O1_.@z@@٭o0 527~I7gN:LHL(ȧLH5r>(a-q$__2_+Nr9jyN@-v焇 (7zQsߓBb̐8TZwLLdkINZ#iy1ϒ[@/`j:>{, W;}ʃwr;Ig6˙g7F޶Z%^G 6;%-%`"ؕdP2^mٌ yq[&y q+M]*徳p,jNH^M2[s0fKM6z:OW0r [H@[pHfO!U:< #mTw5R(rL?&H@cl*H_kkjoUyKfrP0Z|5 _C5AeիM9gsihc^8$!Ф6 !YH`dЃwum)4ND9]n}\CoZ=$Ô{'O3A"s@eq8<- x] TAPdxùt889Eu(1%64~RQP~V4FCM2Z?hog]fdlAb6[SJ =7?X'֒-r`zh!8]t.4'3q 'x?_w|*t:'c1@0o5W6wu&!ѕ=`~e/j  =nx1 ]w&*9޾!" Ỏ :0dB.*jk'_b?,L=Nb_I<_d]"x2;̝O_7qD%}d8|J?7̈́s/$%%~1G[~^Q5c&3:7w.2~L`OIRr)r~$_#C--Eh>0UwSv'8ao~9l`'> t&|[8 0#` $wq[ru,&1/gۭTS3jS {%8)X~s`/ TW g`"匀#3.^ެ*{ϭEi̭Kƀ*I`+yDT5uZC`?u'ܸ6 UA8]o$)qD"e(H "sk0*~rvӨ1Lda2Y05OKgIuo +I> I^Uw!#sAK@RˆvӥK>#vI+)Q]PC'~(THOr^;vJ4!:TKOt%|q[p#Kdщ nkYɖ*.M1\MlkνE,(J{W/m;>A`GFB-W3G^!n'yVȉ R8هג,?Z~@TuK%ո 6T3[<'$VRn ; )!b2" S1-nUE PrwM3!zfU>\dSk&rdžj T &3"e3h0 Oy>(e0}mk~@C<袗R2:$>_zjtnEw0t $wMu&)Jj/tu| `gSpr;4 >. 0+( ^& #'%UqMyPc52Y(9/lq.Aw+XqQA$|~r;& :*W2,)ߖՉ-:ا\x78H$+hm?wJss֦EZ-urbU]'B g8!yݿ)5Ux{WJfo#l)0&B/ti:fh6mJ,c4<;3DVq%Ca(gw]7\X^ƕ$qS/ՏF6>BdD+ LDd%F{S vuךE@wV';+hɨ~R\WP,Y,1 6BTB3- =| xw=a45cՕh6Q@<(-j&8Ve|DJfPKZ0ƨ> d$ޮqT7;[m<|)N1+`ORؾA"'J ǔYP%ڳP97f#.𳃌9CFod. }3%b)@1%w:T&.@W _4t7bJ~6$9 vAQE8۹p- HT5߸6ԑ'R:DEUƌ?9n4 )b${'8;D3**Kwc#*UbnHLYJMU<,l":Y"0t&d%vM҇7sFoצ*<0=>foqcQhDƩP* rP5 p0J޲ *L~FgXR!w% <(ݕOq_|^nw).LrT{ף͢7v%Jՙ^!4rV} o>fʢ_iWN%ETj &Kc NYX0O}ED.(0^!V'^%Z?ĜEk*wƍ!41.A1!JІY81L''ک>2~yb.B þ pX(&~>{IER_s %oDI}0H\yhmwO4 땛<"IЅ*$zJrlfk=%#k[D5Wɪ_}ݎ-pSI@F YZ/Er!&mb|w _r99LۢWh0;kgt!mj(껜ã/Ie6A$FQu*,ɘoᴌ{;s;>.HNf:ux~&ߝoZ P9-V, +]/?x/Pxf{r $wu4NVVc:h5@](-TM+k3(v"ιf!T ՛e+t"P9F@SjgBh)?G)XPB{?6+GWО+ES0/4n|Z"5N6BcI;sQXo. ֘r!i Ův9 1;*Z5u=E_wxs~ 4qQrw)` YClA? OJSmB8.0T9I_v)A_Vp Ɓ:<)IUՇW3.yHQ[GŹzl ykInU([0`2Yc 7(#(W3܉NkѲ<8/"Drī #2?S,"o_L}_;kkĵVA˫>[c{##cE1(Bk_+'1 ʼa묙b;4 @F70=ILI_kHIQ:&@J1_Q3=ƭύ[~Cr2 >_q,ᛤn/[@&8Cq]@J? wMJq/ ouaT\O%C$qՏ3!)z;|hesUQ f99R Z%¾9$^lV=&u Wd^H!fO.CsUGlXo,}pvZl*z@#]: 1LCWNZLz$[ Jh~__fmXg*f⇬$q_e-mr\7Y.s۩WmMlp8y7 YH(6dDן#ePq|ïZhpZ|}4!Տ͇,dNN'[f'q'$ qߛu=i7P )kiF^"0>-6礵O3fv|QBm"v|+;͢bwe -xK`5ǟ5_Ej%|wd/1vn#܃-!p`V0EEW/[U=RJlax)L xtelR-K 993xi.i}1:^O3FjoYD2|:Ya^qlW.E-$/vxv]SK!&-}:E .{yTԴ^oȝV(Hg9m˴1{o1k㓉Us9f#HEYfD<,Z @~Z|0>}w& y息&48y&莘MFJ0lZ؍FO 0-8 #0 >VY]<qN1#!|9Ƭ+J_ΫYNt I =^`d׎W6` 51(MH|FN"=r:9^)a&&Ɠg*oǑ,/U@0rx}~5e@{ =՛(E'qKNsP0B!DOv²eqqc"P:%+R)t\Уs0}s[0W *ulgX4nHg :beȄ>.sY~Vޚɣ@ I~%9Po l:AZ"([azyAȶ$׋% Ѯ*T32\]ZwJfWRz̮HKy??yzQs̮@k  Ќg'9Ρ-G\%В1?B Y.tQ >x9wRf†f>gi.020'C꽓39'w>:|Ē`?`ed"G0 \%u8;m}*ؙ/v @B K)5\3^/l{ 鐆ѝ3)C̚Į8n\ ;B ʅ @T3u0xݨ6!y KS(<(`**AzB8.-gkİp3u&1~*Q09b@c'MS0ݭu#vu} AȺ7ǻ0>3q`<)֯OjIn()\u~<$G<Q%<˛j[ss XK.렾-2glP"aN :)/W_:^$ѱ"|Cr~Gyj$=6$FF+[C^XX5ؔ|:-C&)qo"݉u B&IN9`O:5*1 fH\n#%c3ô}KLX$[s>),5^/tJՆz]_n1JH(I's6;aݰ6@QsGƆ߮KR-Y]?"xb\+("cfPwhަxQ4Ϫ8,6*tɤϕB=AV^tf"i0^5ơI]BĺUqE$*˜:[!;8 b[u YV>毠 )|LӵDzmӣ a4m#TQϼ$d 6k'-k KI,i -ސFqyfݷ([wC&O yQ}uvE׏22UԸ0t#żh{\ͳfI??s(֌u> y{V.`0@6'xe pzIbWF9x<"q1V3[` YHܱ!XgHK+5!>_#7)|,5b@=2;&@wlk*ěw:h [70"_UG5B`s1Ĭ<j⼵Y(A)<y" %Dj,cp_4aX^f/D"{ n$n&c:$ޥ6B@;kuz :EgZ}^֪')s%ِbvJ.8wW*q^mE]}39x)7:i24#ռZv@*$U$Us]ڐC?AU\ l^4-kmjд&kd@f3m9v8c"M*rÌYh2 whBQ#{%kDCU`fu]O/pB>ǕÅ\䰓%,j4c JN9c4s.7HsBvՄp-5kWh2b[}"аCD ft*8Em:+Axϕẉuւ)g n5 " _vP+I`Ʊ9=k!˾6 =$v[x7q(Y_^ *}V!ěLL8%SrUrZ/w*4-֔Z/PP#*7Lto}qT R :ٛ;d$D_QK3-Qi)fЂJ}-1kS>dxQcd3(Y‘Nn|&mGF_k>k/ r^26V wL>7PFm&(N[5=Zl"_Mg02 " tq+חa5a^vx=>TUWgz?P\]ibk5'*P(Н̳!Wy;HZE1Su(7D HB[ӿ lڰD=TI9bwJ- wT~D.J&;UY8 Lܕ^V*1/ɕ@+/%Eo+T\$Q (~;V{=7Tj3G}湖@qd%nEl DY`ho X͏.FV=PH#V@2p#x{h3m:=$& i 5&1OpalXr$oMgpĐKCj}p# ͹n- A*/*tԄoRiLlP@* 9h?]:x :aC2(@ZVTW#cH_˷Hڛ>rk),Cs27%ڸ‰s7D@ <ȵhwPsA #T\H_"U K:?C|eePj3[1+is7+j}H~䋅@}vCDj6,YɈ6nw(n;** k"sJf%JUXrzgJʴ*O$.%%#jIYC#56bi8}~t[6 76! >--^\6!^ĺ^ yJCŃx)vu$F<20tTﰖ&33jIq%~i[n._o c\ !︧Zy];%ۊ(|3aQ*1$`Z4(2F#V=xZ(pʱX?mx8lG|uFlx nY`Ϛ'ɫFyٻ?=kVʯw '悁}1V<Ϫҏ x~)A2JQ=5% ,3I?VΒ:C. &#`r\ *ۣϫv7 yT0쪡κsD9n6 #GW 3}X:p_G$h$ D17MA2L~ }Eh%*w>'QЗЂ-nk_}aWz ' cS[%:IaƉ90;(ZZIV96=gf'\c7lS(_=q%Yט ]Aqco4Uy; &n/ OQ\0պtt X._fW@W~JX"<őhw",:{9@H֖#.wUZE8\$Goڋ|2jQ⹱Irs-YԊvѮ8/&g+[(O'8#v@_BMwcv3w 8ْaQ8#+uUSՕ9;fgb,_4)khpfJbisuw{7Xs "A=!hI ^,""0F/k R"*›SֿuwX+w9: j0/R.6+3D־ˤx0(t)B^۰Qq߽S!?ՋM<2QG35MWm̨T*.Z~!ɼ~eދ@eHV!R 4>]U?ojH? :ũ4l!v@t*"}+KEc6AǢpV)бdj\/಴Bö$#'u­OU<꽇Rs-#qw}3Ỵj%YeiuGP缐]9LVk W._bwX_ b,rvz#+h,.:O;e'.wzݔ,HH#>T3 eBzX_8F-tqyyV\&jIML[#8^B83ycGDߛ`}2+ RF]窀 YU8g?6h+Zcrjnf5yqG1"111\I*.$Gxdod۶M42>m\7^wL˾q9I2~S&qP 5U:`}.ζHf۾`(0bK! 6HxHOZ@.y<]FOp-KmaQRx_h=[%u:6ȹfYwBb rns/N /"5w:(&|dzN=ʄP;K/k?1t"j$yc-^ìQfR%E=,-;k!EmW|N9vx`V.yx idImǓ!"9/xK;M$Q\&U3o 3$;WVʷVamso:B+eO@- dk5eKcyNP v>n8&_GcA t=7 GK%Z#06a{վь>>X؛Y1,|+V9ZnRGUXNnBF`=7ٲcSidL5_k"Q|v\f([d}5uF11(+t&ӵ2er=\GCRe=C=5~Q;Q?g jS?Fb hJf!{ƍ%J fs_Pu(غ ?%*f81VPӶ䶰5&Bԏ4ޕaDNrNC) sVh>V!bTwt]`()&,:9G]zqєQHuxr34X~[(z Y@2MI' Amr'̎Ԉ§Cwn1(ie& +kބTUI=2F~ʂp7_&>*+ <>:QFoPs3IfJAE@'V 3. c:&$PxȀ[5QV1˿^0-dV 6`1@lT=Lԫ`=;>|nHG,]T&Vո MC~K7B[nY3E/Le{ E[ [*ajr%mI9MuFDZ1& ;154}‚>"7ĚCP j`)PXf97?!CscQDuAT W6dx)_P%giά&)3D /qם#k6b,h.> mFw {{MM션z^7>:CnP X(4Yڠgu ԁʵ .2} _HAQ.ӟ#5| I"=㍎i?;}-CVΦm5S)'RX;ݸ8{/+%rP‡^1fnZZ;;vNdT{65`=ŒqlPDL> -.-B\\&@v ddU^FLx]zY8nssa0Su}k੽W`FjpF9HOy"3#Y\XU3Nw*,/F 51_0dbׅ'7>/\-n3;~Z8lhd`"8qEޤQl-}*͟B=lf8*㜶5\Kd3?Ip_c "!44^=@،OD' Mux) yLp4cU1TAA:L %;5Ut4/o x^$C/4;A ψˋ T;&(+j;n5ca8̹pA-0693Z"eRZ7e0AotN0G;'싑I29tX*ST 0[HU_Fʠf;xukhr%O =Py9W~@{Kz)Cgwe*&*"؇p,{k!zYA՝a/tN+Ω7*7J:?;  : cb\ZmbNCgE%K_I(pD!|z;B"Te.JVݷ \s90;*Y*q<:zmn>@$=e7ú)e$KjMXu NPm8EMt)8-Db}.f${aa/>318 k=$y<ݿ|+f݆b^,(cld#Lm*(o4(\66l"u7{pƇ=n,@H42ɋA2CpklzS ̉7cM` ^hwZT&,T; "*9ߐ55Cn7) ɗc+u7a[- J,MO=<6d.ّl/YnHnvx3;Q!Sx?yOG{o2J V@J;&R_*(VO5}XsZK\P 9lP]qI&4,QANnObCf/-x!!*cuԶ*@+9a)zFj,5du*v[3̧k‚;$4 ^iqJB\S scq-="A5F ݠԳh(/kOy髫F—u.4QIʠ27兺c;hqD?V6:́eY#?BT%ƊN6GKD q՝Zv'enx-Q4^UhM]KS1l&dɿָZDj M=D'9?7Ϙي9Xy4P"&qG>g.^AZ++0ZMgCKy}zD6Q Y13Z6Sy`8[%n2W =e ThVx /5_F~ 0l:vcދ?nK1Ka7$<"ݛ'WnsO۳'@QZ-HjԂJP#Q-`氖}8ѧ5pl9-t.R|&.~n∹ #lo5Q=cg3Js'38 ,GKpch|^3:8SI*mjar5 j>{56]C( 6 K!xQIQm!t%#fsI *YeEH)uQ"܏?eHZ:4ɱduUZ.wpD=B>su>"R z@lf|JJ&$ВqeNfX'6wݟ0lJa;U.1TIy Dcԇb$<䲲N@?FE5C*nkv 唽6&__bBtlƱ9 GlD/7zԲ=lDZOc!fyXEVCN\ְޢ|0*爿Wo"R! ˢ՛4'׶,ՅS=%C'4>e dUKè Kn" /Y3)) =%+ Y]=2.03YO&ڲI*R9XZfœ$0 0#Q2%4\EGG?om%<(&k> #vW/tS)K4 /K20ƞNϫS-{Q(=Y`Ot],>\<#aKTX2918Hq[1¼J'=t lP:^i;(Jt>FޚM7k1LQǺȵCJ_Sd=hQjn׊rPS9PsX FJ^#2=uMdhg$}.~fKʒu, ҵ4aBm4@|TS7gGͣQ\ɐ` 2"Áə d-4|5y#Yq+4;Ͻ9;B^`W՝ /_`M6`m%x֡e Iz} \".t(J9LDKCNKPt]zs*Iz\+H߬խ~TM"^dՏ!@5ЌT ,S>TpպH!]kapNj iC_8)aXz ҪQуO|vƠ4,SwGê9s-cҲqtlE |d wU(tH }(]j;sz/  h1G 2)5 E Y;h! ŴBbDBz?:vk%a'ʞgP j'T]n909F|}A/岎,S1G 5n:X{Z_w=r3D 9ެu4D$ 1{ rI&O. c\V%ZYn0b0O ;9;))4.|/\`10R<>~qTb:CŹ뭝fܞ^36%ݍ)D6(fhF2K/@Us+i":D2%_`8ؾѰ;Hv(PUjV3CQ<#GW0$)r%kkME+e #*/.A9oa.Š6@9>'_蹬t9I 0<{$"c\hx;1}$[|;L哚Y*RH|3!V=&;-1S4\Je8If(\#쌭a89àN1`9qxl6<# lrm􈓑=Gl| < ,>b |/1k MȦY^{ K7GGdB9&0=?D C%1i" -*/|LO&達ho}+M|&__4;ߨ-ocB\L5yrm,x;l`TI%~ !7V :HyF;1!~*&k댸I]S]RЊH)Q4>:b[Xn0f4z3v0]y[s H;2.@r}@XӋ)/ۣ>9Pfp[P..oCG3]h>~K2,9?=}\ P^8?wGnB'B0/d("QDD%UY* SsR:}/2*]UsRg]g\;~>#GUeͼs? aTN'ȫ~=[O>KhK`9ਫ਼"0vUWT ] ^GXTF =4FJr`Goaס;, 4&,\ G]zL η/ O =xYI 6^%;0Cl:FQK >GWO%_~kGĖu2@oZ-C`w>%^F=v,Kcm? -P 18*h ԣ˧nT"'4xr{ʦޔ#4; ʌQ`<Һm+1AO}Pz, D.fxicIv}`䛘7A*2?+atIɍna"'5d};e8soj*R^jU~P5U2 F5 a1zq5zPRaubK#!m ð3)d$ySo;l)\8َ-6>'W&'Kg&39GyWxXɆ8 onx\ z#ʖ{F s(& !},F`}L7 V5ɫ# t5}+֓)eMkBXVrтo67f3:z'37I5vȩC"ı  K%S:T3F2g*_5^*=]gI)5p;z`dKupFu! NJN~IIA l)x-b/|}`#'\-IFF:RGH4k\ nNvy+ҷvB3 /, b bW6.um:x(gEz8⣠8_`~y I3X8.}%H97K;?1nLӗu& eM(tNS>ToI~I?X(?/2: &m\'cOZ{>\!MJ0S>Dp<}qZiNi oZ<&5ōi.Ќf£$P3BteX &a8Ce71Ho90B$R/y,T?=JGfX-p}*p;{nGsfL@0&%9J4iB. 2F1HT@_w;*wL<qN=ZiwvE֕4OzJj'UfA j= #z'g5,HE+N;êDf V>)X-`w1^ & t?S3k׎޺ YTMh4:8 F#k&!Ap`kX F(0_&OjR f8RVL X2ɾgvjbDf?''Zl >>]ܠ<ʡB*'ex6U' uu ;$ah+Y. HZ? p NI7dQzB6bHR(";1jbbνzlhp'2jъo3Fzb'B-t¼aM?vj%K,XI|s返2N'sֺ.(Ů[[P&M?y_iCu'Q&'uvÉ7yjC*S=&C{0qS^S4jTmo<'zt;/OHb. dL%PQ bZ -~x;`HQ7}X`X/-Z̹ Qx+VJx8.&x.;<ǿϸT2+"v.K -"$ $ 'DODa;3j-M<.NĐqv#svx"&9xggUa9Hz&E*v/ ^_7#Vx`$0 ״S;57ʅ-l8 &-b`| (ʬũ=;h9G p8NHeY!H%ჄUl,oi(bF#Ô>K,n٤j,Z@kd7RAEid_7X8<@RLc6 bhhaۻr"nFKf" {;VBd>5j+R ^+(dڀ{JʃkS(C!h(E5ϺRHn^2#UTAyt !mǂiga7䞪0 kjwYQ *JHyC9EFՙc)ٕ{uQ4.+n?DK"L%`70_$[޹=Mi/3 z N*.xvEvU)p$LI5{[([Kc_ 4Z 2r{iCɞ#"' "=CV5'%.Z ;@V)'qp 霪l ԫ[yqWՊ I,0P#DՇhVC2Mm;U\71=JTA=J_P$vy>&;͛\?vdm?"s/|DZ³T yO+t;C8YPՙTv}"8[nUJY%1!TF&pJ@ jzF+.ꜯ.S=^*/M]PX^K}%[:tU{6wP:٢UoOn2y$k*î`+KI=-u`tڸ{sn_v HQ\ _8 qՈ3Дx Z3[g[# S j@:/Jz|Y1'A,O`q(UP;<1[Do,>Pn7rF٠USRS$E*?9orC"5 +&.vg` Oz+s~S50RS s4yb9Y6G3/ae^TTH@x Mc!;5 iiP"#i`.0ռu*Q h~ClLlC&2| ,i53YU/Z,+$_!,!?#w1h**w),\r鹡uc@]Ou >3ӛYM1e)P^(1ie3f!e d a>Y>.3PV}>wi-_~(}zhM:@].\tN02FYwqkaW :4Czbsb jL;+o%WK5Kj&\  . $/$x$B50w sOEl:ekIxa% ^򊦶jK 7)$t? \ֹ̓-PdiPED3 .QKhj9d&i$\WS.9 BFw/ί^6x 0#mҗU{!ۜLC~r?1T,u`/}\+dԛO`Oc=;28I<}[(2 ker1q^Ɖd#\"CBq~&.ц^!=S|7(>+3.kRX_0Cz(-B E' 63hRilSٹ\I1ݷL"s5C}GOF\J}ԥ*P@ԨaeYcXY3JOZ`Ǘ5j5h\w;~n)`q~!Gñ¡.bU0JZ4Ó)4^3 ߘ9;M<Eq%vn18V4q|`fNEF- $p [!?ntVԗsh~ ML&m(M\(p2)I?Kl}`Epr`33 ?~C];lTqŢ9WW*8@?h'PxqA\E D&r%zY#'AeO BN*$<=/,1C[Aƣ` PӬ\-K ;c>{lD~y[or6y N(as&դޗ@NJDgPb2&&0 Nֽym,ƀ%Sjh*v#_ƢLx]@gtM,T,XwxK`V~sEka7i7wJ+ UJoyh n9y3"oj{˗BLWDÿJ+J'Y&=Ӂf~'- m#o6q8G%$8ljeHhU2Ϟq5_'Am9~|~σV;pé71yH\,^$+ʁ/M4=[K( ZL 5[= dus&ߏpm\eMR0]2\׳LaS4, nd`&vRlg<{fe:>p>4؉%Yz3>$*MNVN#'BNl./ߠMm+>;a/b"a:>_؋ĐP:YŜ]m3}#Tt$Mwήdݫ/IHMz8lĩ'Q-3bl{DZ@5qK9lM_D#-ik8(|t$go#&״:'|X-FuCɂ9;V\fZ& "ɚ1[)91R{dl00j{Fsw&>>gyZ |G?=<">O܊H)&,Gf%@Nk(cғ-Zخ&&d/P"r]PxҎZ00p?>;Փg:rc]|6oC8DqmhgF%V"xNt[.ˬ;ڡH.A{bQ":yo8i+KQ9Բ^& 3sUĬ&E!61or($_oKOMkB04jfz2-jK^, =u=8zxfԻ rIpSϖFO#KVɪe͙޶[L(< X{#,?,T'{J@/r_K(.,7çۍZlmm.(`F{wF/YC]@{"R91&H3:2YUبZ{/t+ 6>&6Y;5ԁuUx=4*ۼ!I*WLkt YՁ>rڄ5^D*JY PYJbNU4NTnjw@Wn!AϙyNm |IȰ-Y,jSCm )gc\T+89uT ԟb3 yrTCI4] -i2k&BpK5 %(9~L򃞾PERL^TP.2MWǝ$FYPB£\gubX>QK7)YF=w.4'%C&268xdF 4:1ի`FvDF *PA=e Pn\nh^֚1^ryH&"?&~ |~ʬnY2//Թ]L0ܞW-m/;S$4*\dI#3vV?2X5q<İ=?c%Y-.s쿽,>KuM.6yy|#/Yp2k: .[u=4p!9$&2a]lMA QV)1ȋGۤgH-g_p*qO5ǠQO嫳>n 9;FQ!|QoKf4Oڧ#4ʗSiRi%K^tt#6\ё,+}t uu!֬E71;NIH.aZ,m"; ڂ,_cqwJ/tf+|ʊȍػ (N:5h6͵[X;rɚg0P-Ą "Acn|.w{0/}-"Ūڮ~^xd½T7 aMj6A85H-oúL Zn"ԇ0[(#j՚Jt_?4: +أv弋+Ċ]7$,Ou;$Ln6Һ8bVx)vD+U"i46K,몧_tNxvf*AA*yuz^ bISu5qr=Jmэ ʇ! /~ϫAi9OTXEh)z+^Ö\$,G{$ĩ;B (-d4,:z; XJ%j-~BL9 ȭXJ/|BPĸSIGC(u:;dC&')3kt|* } 䉼PpbI?#.F0NՇ.p+)ڝ',:i8A)K3& P 1ZCۆѨV,J=:3दht>57I􂉶˵[Np)rI 'h'OÔ[+>N[0 0"f6MLo!B²J2 <ŕ8\IBhxUi/DQ"&6Fs`3[R,kdCç;i檣M/j8rgEPÃ=ԔJ;CBZ#@'+nZ21q9%0,1H ~EA@tj!n aF9vvE.+ER*(sJC:ux!H^zյV4mAD`K5$DF{l1E!^*|eR8 CmZpڵsWT)v*zjѓq˝PyPm3%:1RI_ Fb\w4b{lRI ,wҏW{NU Gog]\(wls-ddZ`b& l| ts2U&4ڸ8}"q{MQ?QsCn޵FiWcqiml63j' ] Aejc Vc|#e-ÈDD1oL{I+|[l>T9+U=ed7 #؊CU}&Xhѫ)PR6mT++#0.'B5)5el$<}8/`,v_I;OٹAÖ%;xIwʱ> b-JrP(t.IV[<^{\Rdڑ:xUg{?9S~/(;$֤i+AgQ_9ʎpzK^- Dv&7}*^46o,[9Lj"9wEE旺Ma#*e#k_GEV9r=!XE:,Au~E7" ׫NWI$8he 8) oسŸhgf c\6<ʙ`jՈy1YMT{K=89G kS|X/>8ʵ_-x]Y{&ÃL;"M&FM=ٶ8y/Z.0+!!!0 S[ע0B:< ڧl̈vii,j<^ii4N\Eu^i%nH[%vÃb?8 Z"ߚdZq/T4;O=l^ N;.%#>crQVM%EbR\A.5'Ο2t|ϥv>?F,!T.X9y)G/oCOWBi79\hף#ٌ];%hᖲɡb2$sB+Rp55j™<-ǘn'LDgտ3 '8[@>| `W XgQ4Y#@r͐/\gns>HM#m(.~f/,Du;3JN6[&!lgVy!da;7Y )@Ѱ.֕"3p hs]lBỳK{':^d&+@h~, 꺐߇[Hzm/(>͐^5w犌^irZ_;2ip5 䠭/$Mq>A aU1VbjԒ>'iY:|k9?U~+,\Sŷ7K1gH0\]63lQ= ڵgt$~ ڇЉ Mү-Μոݵ-ѩM4$DE Xn59v"!󸪑" }儁\#kif0gkHޞ%xEamT*Hn8NH:r2=/<ז!z"OOډ9b;x ;F~*Uub1ݐg(4 d}h%=i$'ujE{ n<ueC!.1NeEGڐ Z1ǟbQCsjp49P+ ˌޫtx#ܣs wƌ` $%_/*yQV  * -\sAuWullPZT6P8TzH~UwV ã(Tr84ڸyI"2#8"*S 2; E۪+$?Qu@hS(2`LVΒU6v3S}IP/4YҾ{^"T[If;/gl]k3ڲ*驻|V?₊aG)F]_52J?c釵͑Y0,pں!|#0A64d?p|w%7 )C"v,]}CA}O[DOS%r4uJV5;F1bHny7Y]eQyTW k';4hɗ])-(VF Ak,:QganQisx73D6cc )ҡy~H U'U& ;f|hs6>Yd O,qy  zcB'Xp] wMb,KX* ʨlX}0m4=PT"{]4O҇n{]B=x&uC-%mz(&?0Xi9Z"yn+/\V%7!ǰY jJ϶Ÿ;ƹ 5BgT4M|HNAC%7wCe9j>)PK;Д.ER2UBd$FP&tF a>{he$Hz>S}-W$yR3Е* BEW~-Z2H 8Kv R _ZH 1n\P#dӋ& EqZL-s$gpJcl,}M.0MMq |9am"퀌M|7o=R}f\D5wP"l猤l(@\s|\Bĕa+G! {Qfg2P# 54O:6PV†AOq!"(1է+=sQcB:]*^+3+V}Qv bf<&bY4O[;U1J嗦E!cp1 Q1ܼF=ԍ\_)|Y \/&fߧ,@QWMI33Ytk=3oVNR '/kͿ&o l4[b g(qJv #(W 2"{2\zwlS+l0h"!?xʬjO#A`[ A2t'[8W"lQ192m$6?Q1ir]s+,ȥ}~dH\ֈ O[=*$,\( <~w5Lbq^&b (7sO) ^xߺ )0bKro"c#:>VC)u4<U/GjO^opBaֱD:ɠ%e*5 KޝhH ,~h/9'ťu\Uł xg»::9 IZU8Y$fG[5?1+* Z-@N&bH(۵H; \qwj9W}mίAyVP{ .F#gr@.PPzX\-,hv y^@Xn8 yg얯%j(~^ ;*o0%p; #Lف|2?6Izr|.L +MPb[%NMf$Bز:ߌ630rbyͨw_Q bǏMWMQ 8"@ΔUe<;%l`0ee6*Pkz *%/ .ǧ0yy5A:wGoh5e7?;k!Q/Ҏ Ul`[>>ʊ)\&{XK*(rn؃Yƒ|-84LyoZ }Eg&m 5 y%X 1NܧHQf5+C&pR(vCh,..Na[j/LUk2GTT7,:HqE;a+?t[$g2]4']Yrm!@V?fi!A1MZF5.`ψ"h+=b\i@>pKaM5RjAb{f=P&$#-QN;IL$h0/ks 6& "P\_mIi<0tZCTH7U~9[$Π!%J7ػ4V1cU4-m\>XgcQ"«hk/U<, .A1+ 0Bz' Kwk0 zQ+_5qgt/.0Q*C"{!MQ=}Hb׶2-OçY.*eo*(^Z;፤%^H"fMh49IXBŬ؆ך{0 E'aGN׎hsRՙ1)V~p9ar7a3ܢ FvJbيw#$)^I'K(IW k';&V;H`*yDUU!>:t 9 z:ٷD 15Gg$-bCșۏϥ~M}B -EvzyT:ҳN3kCOv{>#_+9+3*t$c0l#"* cVXj#4-t||G쭫t]D,~8Yg֑w)o*V75%:Aɐ3&bj9]E"vTtt@> ٧-'Q{+T驷u:Mhϑkv:@rp%Z6.2rcd[0!;hf7$"a|; =| ]BB@E*(O[J(ͮۋd sSV.=5ytX.y.@~i׾'.yi(?4+F!-^z:0Cxz׃2Ov,^)NƧXHՔ0.Y$Lu33*Wb]^|Ww?|կ  @lFumTOk˞(0حHXq)#"F~23NM@l*mx?U@OKQ0[\xj:T/'kc.^ꥰq3VVEI)ו1@|:4d{NG=@hM=p-j 1`LSs+Fza&bnXP=xg(PyTl0J0gFoLVׁ% O~&j<.gdFJ R3?=;9YX sGlCiH@$HtI3/0֐Yлq,..Y{< uQ0ydt!*l79b,'U0)̾Ԓژɢ$8gq-k|3"7in\|-q*fA4NI[ls[:_8O͌39`SJc3ES6(;#)_#upG8<Cre ,s7,_ `YF"LN] 7([\d#'kƓ/Q EQh"2kr3%>jlaq:xvP%['+E.O@Dȹ HxIVja5|1hRk Z pOv o]5ݮ!&=EN$LfUʴS*Z0S0amg߿X*3sag9!48Sy~&]` mWwvh> h0,ptxgLHl)8=<ޣ%W__iZTr E3Cjƒ`ְ{ҼUsIG4 ԇFxw} RN+@Y()VܢNDA""6qYb2;4Ȉ b+PC!/;>}5<ϰ]JD[~K}.cRQ'ΘV - YF0(kDd+nL|LP^=a<2~m;S!eP͏ft2A2&9cbUH i>@f/ ~0 ,0Ж־;.h/nBFw]M%ҦZ) ˜.:k $ӥ;.跇g>}I=G]:>I:T` Wg-#xyzfm$$Q(~-{1j9~, 2Nt-\$nwf>xaڽǝ>]pb8֤ D#|ڜR){b# N  m&RDsU`;x,_l[ g 0Cg!P+0aa "zJ7d#'- >q;5v_20C3T%Hh b^T1?t~B*5T#'IF}94$:'Q)^tB)\1TAt0B _1?5iS:4'tR="Ӊ(˶=GDs3L KW$$[v?&Y1,͠j@b8̝blS60ZpqInG{F?EȘbL(D<8R3dSj G }=ߏTѪ%Ɵt)>OoNT\ sw/Ѭ`JM"fcʟ i3I̐q:Ӽ< ˊp!-| $ }ʧuD!*0 P- Bݘ-i V4|ghy9fP)Iߚ|o!ǵQ꠭ P+'#)l *o9#$ ٨B0#,p4HSnKS4 8X M>e"Mބ$<2@~#O jXfl]+M5bXᾅ2튩߭GIEu&6p="MSq˟ř?NK B" & k }Jt~C X.f;jAq&vuC^TiO4yNIJ 3rK 0huigDңfAibp"uοN< ajjc&hAO=D5#7J&N dpE/pt-lم@/b7V;L~˿I:39Om;~*@}.jfnܑ/ $%v3%[܎J@םTt{Xm.TҀ"/rrViM Q :tui'a"*PS)ͦq.s mE$RD1K*4$dhshdW-fͱk޸uA-}ސ =8` =~n I<9ZZ{&l#'x<'MJm J[.q16G,1 q \52>y$+CX7ߝEFtYZQ4kvXF#"VךPXQa1O& +j=+ƌde:zH!9 6,d>Avoni6dH/!65>p}?wiӓ JZ9*zeNL]'rGDx%[qjjx4C,"$XgmjQ} "7j5K S>/Wť\NO'ý(#ԝ<)(e ـzj6!#&3Iŋ39_'RPb,a8$عw@wsN[7 7qgd{yr-N(֔PUP!2E(ɄMs =oZe[(Oba ;k$~V2 1 I  >rz& mT>"Mh\.gS X\#YsdS'aB3Q@'Mn3l>w(1 @U8qI@GN왞r=_Hg o:G- 14 g&vKstXE{9O}dSA0ӟ`1}+ǔ(gQGbj-JnT7Ό*+#V-x:=tP"p(,%h8V=I}B@+ )s}2x6/Bƫc`0t͐6g? ]F\76>\[:"bR֍⴫X3_MŊ I*vfRL1._w5!ow-hL5͉PP%^3؛jʥj!O!@`ƃ>5$„Y=OCiu)8Qgx$NC%6n fnR 4Ò  3bq) 1]D%Dź thͿ: _l4O=Va/v(QJoI϶=kc:;l;2s[Ӄ!r̿SJGJ ?'ChO_d2UW?STEl}妵'S"~*m)ױBݞ1sg(7#uMɉbsL >Y(uy26L(Sd&Ep0ӪDC@%g{$;>y0wW 7cn_ՕǐAdɍeax :fV/k rGM1-R>jbycdp;Ə1w,;cH'ALPt ?|L >&Y~J${q`$NyԎimoR]`:.axm"ʖ g\_ft9\# kdU>>QwzEYǽH$slЅȽV|΍{ٖ/90%-ӐD:-rlBZ|{(= Bn8ԊD<ϣM#QVȘ-T9&{ D#%AU !l{,Oyة/ZN$,o|XG+OiǎN{I7͓ `ѡ<4S6-+Lq"QxyvF,p7xfh5 +֬CV7oLEc&:¡v5WLꕎ P 8 '*b!d;ψ$GN65`fzM *">ʞ묜!ءsGBa 40>f>C#5 ׈'=Zl)*݇ <́ԚglB kqp=uԩ )9,A ǹpxIR3׻hep  htFk ~3 (f (#~zo(sP~#-sMbl'K2+џd޺k ^{ǚe>LYs*-tXCt(a:S('ۜ>'.za`r("0+TDqw}6: 6oz&y\O8 .=4u׋ꨦjb_Ɓ A˙UG*=&+XR.%SPz78OQ>F+[u/zg6٢ƚON6ޱ;%Uh &DžE`:0AY+W%njO2q09g4Wgk.=\B/. ~|?-&7AzLvAY:G&ENoح wCC*UIw$Y\[G!NiX,)CZTtjT-os2K-xG0* )8&ӿgo\5+ iQzm@F+Y9ߜ#/ȯA ߳W56P%H?o,`1C$䮇ŝ7uTQ@-YNʹspyBx1"%ЧkI~T<#WBSVM}x+F=ő6Z,jʀl>W6lFb2["~C qk ҆! 0!z^qn4TNM?(t* 3l1ػshg+Ip_xZ x@=cgQqHa@ .[z+LLXsK&;ZgX:z6_1`]C0qr1hf5/=i3=T<殧`Ía}U}b&;k@Fݴ%T@46Kjq]36ɊЗ_"/H)&]4Dl|-}w:1Jqp|!@m隮$1h9 is[@)P4cAZG.+A}‡QCP0p3k< Ұ9Ht2[*2ח:1åG.+#ڙIJg=IH(/Z3$5,Q \~a.@[ZxC/83F2|xH8yxt3l+ #?S0[<7ZV j@Gi+mgrK=g=N36աd/ x]'#`k:Zgu:K"J={%1w4ɰpj *< [n}W3H DX5 FHBR,Jq %oاjߧ(Gfg+^hP6&>pQ3٨$@Au/aNL.B"M?&VTH鑉 oȽ\']'/꣬iIc :;+1D[lu1Uaa芄6\>2Ra>.}X'߅ ] VFM&zbcnVht] W0^>;2D,тQso=ou,' a6)QpaV^'zzh߳`@9+51*!_!m ?]h=HDq;dzjM05Dt'3q&GZMʧoXʹ`U.L 6?&LW94"=PJƂFτR%"/Grkh +2pxO2Tf*fqOе~$V`>?? lQZ5Z]@y1S11'rX!t 7|裟h9֟1y)ܑ)ݍE[?㌇a=m~34)Dyx֜ \ڜĮ>2` [|i N5ĵvZ>x(p^r^Ê%"_7.v漬So4G=&D~vETU( *0J(W'M_k~P'B=څM ۋȵ#' 8QW<'$LcQ `Ү:cw2x)2 %- 1-&!Z <'?@>xN}8ΓuϷ [؅E8煨0'P5Q+[QN#R![qNFap%6~rY!,'4_1>g"/:QSw<~)J!ČzuӉҏy(U ۞][e]*/gRH,s`WrjБ>5~!4$4π3{\(Ṡ" "Ga/T wasrC|(ֿ)+!٘9*PI)՘Dy>S/2ejԤ[{`3K$PjhOߝ?iDGM f'Խ^Y#W& D?V-Ƙ_`#(@1Im(76kv0 ϫw~w8,2}ĥÙܛ'X<`Q–է^F>z.aGi!EqUr9~1[2'z&݁ X)Sj:$/0g2U)n5t(Ex3I:e}>=c@?udΊ9p++mD_\G&ɫӤ1.$-[2Jy$88!Íy-0 9yO˶Cс9t85^l^#W'~dtEb Frµv^գ,-1\r#zW*0Vq(3cvH 7~zVV[ƬvzYF)mw"kX#+hU,@ᕄ+ƹ,綸Yk+~(8P!.}Ze64M{PrӵRa#,o#v!"NH#h9߫ ^z*bkHb,Bi}HgV ^X5d }[ɪaNΑF62 3!P? t{A6]؃ʡ?y})ޢ,%NښxC{5$=Ob3˅|#9s.=%'OBM' iM[&l֓V! ay1Á!G wB@% )c=xQT ̅<)43LGӦ&ƒae)u@ _3@` .xՈP0W\~:t҅(Ph d<ƶ33AL2s %x$jTa(6M =w./֖-pcD"S 0P O:F~سpm& @O*E~4DR(]eq$؝CL ymuAfr.M~`h O[<-ZNa.q9Q̎8]tCt}E_LfwE&+ K'#Ѷt @?bV5iβ+IYEє4)׏ZkkkCgPe67N.X zB}r##BR_T"!:.fYCTL1`\$O쫬p&w*5**ɹ/Ti=xpsbL>ԣ5aZםԡ&=KfShԝP0;'e!(%MI$p omw@hI [)8-sn;6ܬ-֕P {ZLa4C%$ ~ť]rm!挸O> TIn %r6Yɩh%l e((z tY ϚSB;.(\'3S ѯЂZ^SJs2s~?p?mx;P5P)'KOQ[ 3.?Vz%"!JBC 1 &˿~,WjԔy8 q>WO\oɋݢOエ8'p-#{ 4X[dE#R<0Li%LޕA.r}kWy.|,L I+bEqTe;3S&5Pi]sT_8%Z?@٨p,%"XD4~ӏ6*w. % $x*n0sP(:/%{ d ^b]h Y$:Ix(ZbMX?;t-_9_Po-uF\V+21Sa#Cw$8=?H}I6V)[d~#dMxA;[ Z=`#B}EƫHB|T+qh~ΰLxkIA\QlZzR)6;G/ kC3x! SqR!E\ /hoWXP*Lߧ 7(zAWͺB |힤4h"y4 AFmT& !t&k(+TLoXm)pPR)UE=M5#)lr&Պnm3ÌE3 KFByx]s׮H #W%#e Vv\]5Z(p -9Wb,akeBv1AZq2gKQY{nypbSH}Ѱ ?I;3%47,L&]Ԍh'` .A^XDw!o4%% M#B1s zu. )֋nn ,Oᔬ^=mhT =ͯ ZRf%{ +|&pU i LL:Q?5UFhP!0̪+#MC_߈beͬ)Qdt! V XKG=>z: %\y1Rgs'. } Ib/X,> @oߟJQM_pn7&( ҟR%< q/0沆RƇyatBb9i;]6#ǬodODO?G0$>߉DR49}֊c b%Y=- WfAu*( 8So^8shE਩yԑw6Եv?5xW#V,ai>JvCIcʎzƩ-,3Mlw9]|9}2#897"poCj).(;,;R57|}~Nc392 7񴊅PCE[*n찱m]!<>"vj y:bēu%<'k\]T4yNz8Ҳ]J.? 1Rti"]{#{Ɔ5Xqݸ:OO=&tAO!N5?,N<3!fQ&`0,c{`3aKm/x| ZVKx@&:#@X's;mz]fmzW~ln(UGk%>ƪ?v~mr*Y.{xtT*K?[Ʉ ,ulB6x:8Mk J9t~R{)Ƀ)V"$ ƐuHQjrIOo_bs-cy g)KPݠe9iQ~' Ïta z\ڜr$߯#{a]0Գmߎ33D#_-jכ,ڹ^ ɠ (I~ҶD7(4[7&ޫ}dԱV/Op-CrJ"2ů}I^'1bxpN]0+C\uqg{"u'vMX'j]0a\iP3fc /vjtTT\ʃgkZ^UґBjE+΀NiwSFD 6(hljYR챖ka]"T2ZHoM$^gg^|E*ʩbKqc)$a-_`5Av57xW"5&Uޙv|;\)"vU!_pU@[Js0t!U*)Yf7 ekP4ZeXPk9=Yeko4!'Cқ`X?7 D"xu *GK6y.Cw+[w(^XxsRE,KX=n.SjvS3QM'ei '[E*h`@B 0u5Cִ; #CxPϘ =iW|W;7/Qe( KƁ?<7'&D!bc \- G~_sLkޖ7bO /&(;LƩN7|:#NF;8=Lt[o r"mKB%LߐK hOt4UI ޒ.J5_^˜cQdgN7:sN.oISHIy?#N0z[LЕ̓A!L_,MN2Xd6" /ֵ;S^u*CWU:T@7kr@[i6~V’w|$q(D-ܗrwպ-#T9UNΔ25f8}OՊh9<#$@qW"?}?Q #˻lmܐMA됏M:vtN,*Gz /R݂&uSEO98le,dOS8)P4b,+L^ݱc #d=gw=#<3dz5ߵT޻6+ALjAU/ ,"̛g@qYuW*8lD6o^=[_@HW)b.Ê7"\ vLjzP୳wtm*3x_Ԟ9_Y%.Y`hٮv5 !ǻD$ cW<«_%H =j!Mi-;- 3wRBT.)bgeEFy_U64D`1+۹>Kj51t >9gQhN*: >y0(|sf"o6пuv#v5$2/rI[ C/kB-#?]v9 ҆A3EdIr'T@5a X6TQV=D:L\o1ib!!LH_3xK=>BtC?O +/Dr&X%{ la㰏yp":0){ Y< 93[L +bv4(:$#nz6Om@SAjwΓArI(I-ɝH'Q>[r8 by-rBƸUۍq=ruMy;Cay'a#E4&R `Ot8ӠW Wq9,j ǵ%:m8c G7WNhqW u"im̃!E:0+hCC$ Nei6 5{G n6*=Q-<&#=I!Yٌ,+5̂27,*06Vζ#cc8Xp"64~ 5B96VAAb/#S! Aomëns:G|J/)RaKt] N *ٲ&\{3I5.ڕ0Γf|BEz+/,- o- 9RP18EX6;xx&8(G#$*~,F` èpF2 v!#Xڵ\R=;>K'2m7ۨ9SF?W vG's3$r (5sHnrWׅvmS1W@NrP֗zO-Mg3Hs_=H,H Q᭐ `; H[&<4Zw-v(~f{Zٴ(8J/ h1ac"rG^?2Ɯj;gy>;~ߧzgI!3]u%cיfݺבۧ-\Bzt4 .a'}p2l͛+wԠׂv`4:m6JUX]n׀/<$"Bu8Ʈ%TTO* 7 \8{$stq->j :#ZO]m3c y;糢 ~N Eя,%9^_IvxQקJ`bhų 7}.q-8ʝ樮)S=~[f"\tQ R9<7 SZa\w]r\+y货&Ey4s50! 0 zz+@65 Y9H!|MUYXv-5?Z\PGZ)c;{x3$}4ie*;u9FvQ f>&(N5#zheǗ!R%G4*d)/#-).Yȁ4B3]sg!|Z?2>(]$8@ X5Sb5*1>9Ψ'rdt-d-U (+z a}ѸxFEk2hZb6Yq#r9]F>B7@8UVcٺzc+T '|Pq+ἏiY|5Ѧ0FGNvïĹ=cr=DRqï OKxT12SJc1&V/M[A*s^Q!i/+aQ5>[j).=#d+;Hܤ|D'ҊyYGL", <2;L%:Dq-=/Y*7̇;I.HʘqQ<[:xL{/iO~G:dM~F*Y$`}~lql$D^DGomu++H"VB-5ユlv^6DYq8U,PCb K3$#*5u\$j螸z@`v,6ƒu&l]-g*ݗ]@( PĚPY%/ǴI5^@:}(`1VRE$}pm !8&vPRr'^鸽V# Y;M`th)oN䦫CO(#'P,-)P`x+3NHKіQv8,hVgL2.VO]G40Gޚo}=9*k쾣4YA<`_j/)3dASW?% 8q;kT)g( /(=5vRM ) tİd<rgs:Y+$Sp$?zG`JmH$0mYlh 0 zR.ٿ-^-o漩igٟ&e4/y*aw9Uݥ#8a2򺺜#U ,cy{Z%ViC,9[*Cx%x™NdžW.*,o8/y)kj]q59}-1w@ !C4&zN%<2?ϪA !yvIty{s rرb.J‚ iTIё+XZ(NޝJ}svdDbEv6pT 3#UxncPA}d)?VOUk O%>Ln4f:',c+9m͢B3ʔ&/Hv1;D5&HK9B_{N>zU-0o =$vih&Nm]F8NuM)Dbh0PTXF6bYhӠX3t{¨ckG!ω<:EA`JٵBdap6 /uB, VQO㗢XпS2_2Q'fgBįhz?t7[j&1wgNS~[9YOpQ2p=iiJ߀|SlQ1RCf&]@a[&τOZ'_}/Dt:9]r[]Q(&|01ٶe;񪈄CڕXڒ|97nLG%ժP{i&۟AȲE1nnb.6 %*uRzkW  ;i:vmi(b&Wh:iDssFġ$ȃlC_LW@ 6J- $_+cktw_mP79%v{Yt|QFhlrs2I#TZb^=R嗵4ox,ulfRbA:^7(+Rּc@֓}N-E{k~X"f ,|PxVVJ\%]xZn+oc7dN}]3kZuEJ6%>is_s+Qn/ atk"?M>eϙqPv ! {3R*~ųC@u^L)NZmI5鰬o[P* nD.D8-N!#Jr4"KCy6F,)lԍݎªn3횔TZrX8' 4Ĥ~JyR*e^?4?GrX ͞gu5O Ƹ^=O(reݐ~CK"&3_ cM2!H~q]Tg?+Mwϻd?!n-9~sq$&au 'iZJSxQޏQt.\01qRhVIecճ;Qj9s<hw> >SM>1er/rȅ`*&KhVK!=~\Uc:'*I8w0]aL3z+8t'b  #-0:XԐ^{h'`[SNk8JQ^: ;S;LaSX71qC#u '%yhc.}M,_ӦjBLq^oY,&sZC#w®f4S2?G[+ݬ9Xsh> ;ݕ ^"#PCe`Day&'O-߉T; WvjkX$뇔~xA0V)FEn'9,=Tf[ ZVtKט椴/ "<;&i@X ? Ρ *w/C'LCuoNAO;BpSHJsA1 i~Yن-V%'Lhڜвy}K0GkA%2ccr*l _㸹7MYF.p;5;?Ԃց=R@])! qcLLtNMgbs)4"(hB^k|_Qn +zsR3`Aí&deМl8seb Z_Q0$3~/B~:ćFRz(f1a8ln/IǠ*}bȺo $j1JAʢ{Hu@{zJ=ShtqbDE pMIHQNY*&QW9{-̝[.g&~:5A0c%ǭJ?EC:[R<}Y74lG ʕ6ٕJ%dE5z¢3H<{= B1OI /kABs@ ڌ1e#z$:dC`hI'WhOGިV$3>T=Ûl"Y n:Xk?\.Miv cf.ukc!IwF9jX)8~tX0#DZn@d^_ f")ң!n<,բ%գP5wΡ7j jJ-8Ņ7efnVRV!B"0gI҂n6w#"7gS-"[iv+<ۆ# +&h`jrTX}6 zh Ez68uhܳ˧4G['kI"FCɂ`ýQ2*Xo?*~1H|c94- Bl6.KB^`ngO5@O' ->@OGc1Xn:|!#fPP#_kI;)k$CBcG+\R4^>LM L Pٸ]ڠ3&6 Qt Ei}H]~0CH$x D>?lt#I+:=,*{0[E{fpnĈoef M$Lܒ1P j#Qa-q { [ԏ#CE~lE83/Grv _a$$'_idt#XjUz-p1]sDs'= Q,9E tx( `uPq_Le7 %(K9 ƞ\ɚz ?߻O"owiGwƳ{@ِת#G+e Y/$R62BG2޵ew{ s()ѝxݓ!|U#UЏr(tEExC*oW[/+lϡ2іVàfU W4Υ3GS $*[!Bz$`Gf!AO|(7qjoӥ-E)c@?,rRrrKH8f \3a[G3tB'/9> eeyjYtxIzڧ@N(E6_ozXɨ!+a2n]ւ˵v̢HuEE>1bZuqɿeQ*m[mi#k\'F0y7RNC/?tHCղD31W|Wm9]'!TpQ蔊&hg=VCK] S2>8@p&$Y,&3ٝ(ԾUD~NXP 0mo2 q(PšnjUM'd!W;`ME~-Q)&о&t9I !EjG9;qB,H3"$,.l4Ms# xDvfƝ7@*-{f,0 0 8EWm!&u$xYs7}]\C8I.2x@P"9s.n }>VPd+r9M 3gTi+%d֟6LrnCp?gxɀTa[K^^#", QۘIT δB92^`=߬* h%?jS!:"ǾusX5a#kqg gԔğA&hSB.[sИ7x>u&y/C_zӸ1PE~ %0XwůXBy~֛^P.iS;O9;(-e_ZrJMxơM%ny>p~ ݏa^8 a}&D._5 Uދq\sbL _9{(A(j&/e{4&Λ%$sQrE0T{~ZAØB)/-s;i%DV~[qz8DڡOis 2WuKY/='le59|ozCE)$$ '$ۉ 䙕YV^3sveM(6.Q\ 'dr]! w()4):e!(0ZNy޴iДrDH|k? *2w|lqg@W":OZ[FO,>@hVNB1N F0'Pvl:S=A/?X*$0 rJ i^ Q REվN.kE5m<=CGw"ǼCΥA)[GSKEF]bKAE&AqR(-;Q5/Y_Z3fIvp' E\!9;{(H [ .nJi8hSyMç!`%}2ZqIGFB(s ]U*.Anpb(ܟ$Ri5!4f:w C_$sѨ؞$"<Nw-4ܸPu/KJٟ-" "8A礒gǗ2ݜZ9> PgSuRlO # zARfJf Ԑȓfgzl,PNQR'Qͨ 5%8~Y0}~7's2  &At#|>O"9.Of?䫲o5R,*bł+!z6cf@OVnUf7uAvc6T t?qJG%u9u)Sy35*!2jOML{nGH3oG´}*D3da?YJ!!5 $~~ߜPgjx}6{Ώ752! $@}~)"l3^KBP#`pUn's3/'1GFo90L6Sofk bmh1IWcH<h+ 2Ʌ(:}=m|Z G!9|Bpt<2j 4]R C ~1ΘiG#L/ Q?B@zSN tހ c];'rXhbݮ`.^=O7&ûp(pAd #N0]gj` 62х~9w(ol&b<.B&BdtH+VV̧Jίҭ}`X 6P?P/N<ୣ iR"$dOsa T*YKSD} *=cP*tޔhf5L^rW: AoaaQ@!:, BqSHVN˹Te?)GI2rMا ہ,X1A)a=(_4m{0(׾\&1yD @ I S s:44OpW(˸aF;gv0IAA~cl-%3s&WfT"_]|q9e?_XN6.mt{C|X'vnaZy2ZK)?1|Jz>q52ˈ?sچBZo>LnrB f!~ӧ)CAOHi' Sx鸿ȑSncZ0X'0$oa-;>vI$<a^v\1xQ%v&wE:=t;^D}ET/ysW9 LQ= V{_;8i+år70-6%R6R4h9[XӼz79.hf>feEr.YG5%:c:?;1DD7X̻!W$qPIي&땵Ʉdf`.*jkm-*N[jeV[89oD8PGy"yv%vO#e{}#ۘ+vgT,_)#L`\,U|ݵ)v,+(9/t7koQO/`Z|o"[qF f#;6m89T4&[aKĭR+ N?ɃG-q:^5Y'6p!4^Rl\R+5QĢ[!&&vO9fuK汱N*p`}Cp1PaְS#DǿR`m4F\.*fo'>nNܷ2X2 !WiF Ա' b;ӥ?n?P)-p!HIHϜIi3F1t^ԏV_!n 3G }:Ƒ@3,2 X( t8PR$Re-@l"L0 ?o2D5Nn$c%CA ٻM}"A+.S=n=`OQj2 :3kJ*:Tp&ђdR@[њ+$" f:M[0qc&Юs-+ rguN<pEAs*w!dV9FɟUT}` $vfˈQꧭz0#bk)9߸K@%Y|:~,:sн^V_ ]7d [Nn(㎪_m϶{"r҉27JڂyE+>=&G,[,Bz8];{W:q!beg6G&Vxi{ՉlC:vT]-"دkփ:JlG`Fɧpu 4@*Λd= Q]GYWL(Qf5a!^ƥz,Xqv)[$a_!)e7O7͎TT3Ӳ#n9g)'t>o#_2)A%4Ÿێ12  2 \#rt/ @܎~˟(o37^Rm(ʓM^2ʼ@3&* a28aI?U {|qXE5}Krv = .'~+gЙ*[W{&(n\GTPLy1]D@r)JieW*>*H1'4Fa23Rmv&y51́甑>ZXs0}@b!vpPp*Y<_y ^NhT1jYa3wiFš.X%Cbbj+D Hra:rA:m/TcD(ڎjH@I;7ꑴ=YH٫-h¸! %feEe!MoV9&$Q.M~IW#j ,Dǂ.c908﯍^VB$k0қ׊qln]/$<16REѼƂ+ |5;-[Q 9>67I2YlSi?ٲZ/><"Hi%phϋHxM"+.L îs]*!~5@2O Α/n:Q:..!>dעC̪B6 5OizN*>eTUCt)MhFc,4F8od<:+  TFOE WXyԪHuK0׊֭:#)-fhkX~aœ Y5%D arմ!1w[<XuQU\;'K "jTr ! S*G4 1)dzyG̦-E t&!/ЅP1XYyQc%=p;3z חO n iyw&j%_}㔎ɘTW0XUV_.d}6?]:>)-+\;Sߛcubk,{X>t҉)c8xg63 ւR`i;.eNQG373 `)<ѵ3!: =ˬs paG37F@Sj`Ih ?(5ߟc(![ώfM2ow.ss -"[b2|a?b q2Hp|rM3xm4'T7Ma?Z7OgʀMv']1')`{ΰo#H`oNT=9Ô%琘̿AW$BMcn_|!~oB-.+m4H!I[ljb Vx/e9$L͔=2RMC6+=_$-D1?'d%g0!6WB 7 - &=8@0=b|iʄЄK8[8pP#^َ>ft O2"[3/#6r< $,2οZe)M\"K<_ZX`]OSOJp?sa* b( pn4#(#FL^y55GS=MEClpimkA!q@H0[wT 7k)o_Q|a2U0*DJY8m4S㥛 rh|?5^I +S㥛 (\(\(\(\(\(\(43333333333333333333333333333333@(2>'0 =%&/ʚ;@@%.D)5:9a$ =y-hL8o#@ h,ڂ7z"ȱ"k:^+ŭ56$ !Z*@h;4(!PXT!ridn[)3a%>^O TBc(As|2@H`?|g- jkq' [8DM1̱7=W„&lA%06Үp/< =bC-T%hUE:8/sWIS:@r34n$gR|k@-tA3g[1e9 #" hfή:2#mp B?D6d%u@'C_N*`;1@ʔia"b58J:>h:'}]!&>~q/O0M{Q"lj<qk8bݥsv%DŨ/GT;2Sz/qR)>1uX;M;O2#>>W%H 8ъT yu].ZH/)e*6Qr*9@8ssQzU"N9$P,Po/Z7")DG-,8etK1js&8"(sy?"(ح_# *KRWij+2#N7,ĭ{DE7xAIӧLZ1 o"@#בQ=߰pe^NK.+Lv":A^ 5Uh\{. hZ6:m&+!llj53Z 1oĈ5+*TZd0$B l4st>xIv٪# ُj:"NF$nܕԏUh2.)@r6FWSjWy3hGb8= mV V^؂, BzF` MqlkXu]|7(XxOBa:Gsr\uD2 wnVc5q(*R>t*> Yú9sE'5ML/tfGP~G1@U3g!¹Cٸ;ѣ2@Y]]=HuY4T겇b/Z&o 餟i0v'Zѻ/@NjYE]: ]PdU4B O)KZ$et7RcK0- {mr'Y~ۂ^p=&9@kz*d}WobP/ύf-#F"5\- {${;C1ߥ,@+Y͙YK=W7 [s5 4x^/}&VȖ"kB1fƐ^\UB^(A6akz+<4vu%%3қzz#{6{IVңi7EcAB,!?M"T̿aYܫ\ DgR)`*a*ǿ/oӖ3F+'ztpx95Jz]%Df)l7ڳH&pC!ݘMuI/եzt$G6a/L)*H{J\Yſ;3:mOͤc񌎹z0ϣcS| H-0\пy'<Ìxݻfh(̀+9s/X1o}+Gj C2V!vGkjƐ;=\ܘr?Lt" |zQ%f7wvSqħ' RW#٥./n@UxlGTh@1֎&-aOO:컉F*GYi"=F%^sqsVlz#^ׁQZչ&SaК YMKKh0}Ϧ(37Uys񰄁&Ho0Z^P]PEh7!U358f]GR_+Ae")5+»ƿUȫr$E!Av*s6j/k17VOtjр$55!EB~5ljp斤!1QV\HC߼5+̭ )ek3BӲI6P?+{4o# Ooį zR9LJ]ZX 4K,b䋵ۻri'׹4jq)A^7{j!M($ @35).bE 1JեâIw%6UR0VH APOJt [-|?Z (c xj$CQc1k9%[O%rT 2{([PŇn2#->Mm2t/c5^-\j'O OVDZFDõx0{Wk9%[Z_4ֻ0F=5F7[nCܲx^˻Nfu/&I5)>Cվ־/]~o\Zxg<`n%o;'5Lx `e,>J%4C7 _j(yfD\>7bO]X.wEˡ gjU:QtD: mZ,+Qz珳άBp.j$]MPquXgfdsHXSޕJ-`dJMu/ِ.hV;e]8q~NP)DspZ#E~zk#kb3 *1+;c+[ǬYt,pz(tkhf六7ħlX`h9>VRw"чn4Cc.ȍ+橆kR3i+I")!<9:16%`Ti=D6nZ,tpcľB4>A޿!ʢ3xבb |u끅N JoPe*{}@։M6;**:We&|Eˋ4m.%vKZMXem _&!blBv[rp%d`P c6f)>g;Sk.Y>3W3 actW!.@=;FG_=RkX ,hF9|Qi9\Jn(7@GܥG?@^fa(2E~SY0Ԝ6ޫyͲ,?+ 5A3у*)"jkl{'Lr $56t?n"EZ1reLK(wm‘CQɕ'U'樜=˧)/y L;ʒ!8M؏!&z|c*20.Y]cW[uG(Q[|?<'ݭ`W:E}Yl,iy%pTYڸ#i$ݯwgW!Eem/go)L&mԛiUA-CjV:ɕj:d <}OKh5!QZ_[>DF^# R \kj0w`M;صd,MϢЭs8։bnZIN=8%0LX%Z#;3][X%#1/|_.\l e4ή)Y+r:!93:-g 0^Zto6)5֚Q$~8x -[Į1)d*HM2oLquA4Bi ?ӧMpE0;笉@ 7lΨQAC`LGd@W !\(wĄ<ȅ:Tx }}{L)33K:'ÇiVg_KTh] @?}Goɭ4aCHoZh'ݧvrU<(Tt q1Njb*7&iQM K>$ T"}e)2_P1& שdq 9A~ $vdb0iLM&OP1`T <,/౎ܢތܰT޼&wf Y^-K-K05jzl/@gQnwXh; hY3#c krq4u!% U/";Oe[i.ePB*{+\ A7m>rnp!G: RioQ`о$&g(E6uB$_9%xxn*@ r֟WS-1EG~>% x!+%w-8:#i~Wty?:ߜwji# 쭧2_^ˡj ]kcC,PgQ#v9K=K4FZfkWx)!jYqi"YcZDYCShiƟ8Tt6*ac{k/ŕ/hD( j4][>@pZ- ѪBdy$H 4ͱP sۤ-OUj>X-ښ-9)nAdONONCxY*DM.y39 QJZq* RuKѤ|X٠&;X%ʇc"KP'ÞN˦e&;nIJiS(b^$1t!~ICS[,v,Y+(ֲ"um= dNj5jVg@;*xh2kůid& }1DÑ,YѼ4BBO3,/Mܽ,_4w/QWl;#?7;mc콒Vc>YkR6B~%T:EIXv$hm7,dF[).#i$;.HE7}{q[Hb2DUc:> wu<\yMB.&9m=O K$$Ԓ .yp #ϝa-@wqw.& GLCEz59l? ݷ ,ЩarJˠEl#*IcM ;D{:VDZ,)uh\z¼`I_OIUIjS= M,97:Iyu܍n!q#սm"'"1wSq6ʩiklJ +a(0誜+j>~Ux <†(duy2<16.5K1B9$b_eb"qbx/G᭺?nww~*[H烅VVwYYϟJU^G5XprTZc%Nw$L!7: O[雰M<ڼJՀ)pb~rg+AalZJ )4Ui{X禬Z +`2rpBxDZ+m|Ҡ}@<(58l SfM*]2[CƏGCG t8D4H5uԾ?۹ ,p&H*  A)EW'R􏬷͔0L54OP,8_1ǝgea|]!B-ev[>€#w~<@m)u G<2JLdz9)&D`씄^LPq )tR G G\_؇3u00y'%6_K3g;#Y3™D1C'g&9K)`B)N]G1ɢa@Q_$3j}a05}{ }~vz%w>!-@fKEiBy|\Z(Wi8SOA-@=̍z¶XA#h">B8L?񝧘6KsZw,ۡRFm>3Ph}Zq7(E@sydB2AznFln"s率З=Qs~U X6 +ġr LX%PQ_LC5aW3c{/uj֟!gaa9A&:-<{*g&:i|F̧o4v.5$'0ՉI w 2;zB` 0;K[U ">0II3S)=%s-(Cv'%.G5`o_3s9&nзC8԰U8K7y/ OĥmT­ +8?3&T;fs; &2÷T%@az9c Xt9Ʃ.PD$ s-Y S[ʼ Q  7T:V-N/yU 7tݢt$^8IMay{T:~+xQ Gˑ-X\!WZ]vV9fXy>8rFs!1vXz? #NGXO%(!>DyT4܏u`,"ۮ.P9B4Ҁy7H-R&] r8 dҩ+~d؃K"+o4+FXm~vq}Τ^u+f64RXQX k q,R6:9@l`37uemBC#R ۱!GPG518SMvTκRp*jY$F@& zTW.#g 5ⷶq],wht46u'!ietu7U, Hm{Ȝq)CRRZk1 !͚ZCy3joS{s5`Ey8| a DxvU(ޛ _BVNy(UV.T +ತB`4 R,gbl29i5MSxPg {=?s3A!74K}6QRѠ[8v'O@5֜Ef!Ib؝h1cZ #G2.ζN=>9禸bp[6Oc w<@r)QP&Ц)=M#|Os%"?0Ʉy+yYЮ*O<@R8lXL[[}7 WyB:%PFn1:ŲDOE-XI&/$db!X)JGQv#c9ݷۯ:~ 7YvkVXn2M$<ެNԚl+i\hcq.X!l_ۉ9GvèjsŽM9 w)$e)z“N9cՕ#w0bzijb3m~gS8bꇧJ\,TI }l`;g^(ik3+8MC&#q%d`@LL/bcRr#J!ԯlߍc.}xv-_㺚;+)eWqy4U86iJ06]Qt=!ޠ5#EPuo^H"(%5RG8M? lV"ړ5R v*r"o&Y [;j8#ap5u9-Ttbb|9P9z!G8iA(_vzecG@HGW)=ERS~j|eYQO4xT,)4ksWztHm#Xr/̱ i7bFP협3,mI/,^;?(vDz X(/x;뷩6 3v .)n~; %T$B?E|'dW/|坴-Ư6 'Wۤ7e,~-;6\^!aD0L1,]~7Cٗ6j-:DU<\>\ˠ|;^ 2b!\&3HcZ[ j*sMU#g0=|1E=3JPn}ŕϠ< ޶-K .n Y&=HbQ$G.8JwMM//M%em7N yhB ;湒x;pL7%F#쇁mid/[+%z/Mm,{j20O,Vh**"}M\.?b75laQۺNPqc+/ޝ"#ǹeu)"Em$a8TN_8(Yk myF!w;h*6t#y#y8TƦ% 1u*7p*!hnlW,vF)w?~!A*Gη>3eiW2&?j'#4AL,R'?@_İaCrvegU!7_wgNIT]>v+D)7Ab3)M}T63={;B1/@f|9PA= ZJ{+>:PH H6?rL(8 ]hwIdZ0QZς_2,ƋPtB[p|?ӣł#Ҥ>f.\׸IeY dGdfn61VZ'BH:3 gF꛾E8=Y ą*+x11SBkWUY 5'6}=H4Po~Ls7'8,BYn&ZA ^C$ LТiqO 0p5T-(_1 s74Iew <[pg%BfxTy>3秢 .х*s%qLicWQKyeyEgG.FqZ& LXyOW:s"ٺ-RNeWڬɑ(sq^Oz D9vͥL[F;0a1 #< 0-G@ ߇IGx!, }Y ^uY\(/07Lj"Nץq@&R>=9T^*3"*!`MOeЯ&+%`LG-e?+*xq![ܶq.xcy26M%?Z9nIG[ /@ _y""' rc:>7u*qYϨN9| ];IDU59篗)-g#e U!sՕ  s9AUamYUvx)I}JOaDHRg-ɯ|+G[4!Ѽ*m m-{ 9*sRJlZFH +Uף)_(1^bWZbvw 6X2= x-EޔD?g:W\ /y)^O6}xm]& -K{9vKCWV40*L8#Z}&H ԢܴDSy-'l6w"WNXe |EA~5+9b>WnT$|-܅5Dd,U}^,\5ͨ!<(4F#\XbX673R>*(;aK63הl2tz;&MX64ļs݃,u8r0ב3 S7PkHdJ xeF>Lv)'$Z >y C~ ;p2\39[Xにk fnO%l\ r\bNw :uJ`. ({"fHU@N]xLhS (2+d7k:ZСte8( >[>p$Rr"~ ғykG/'1G ã-\k]_oWF06Wг 9a 4i4ъ%9=7b[;H6b<ᤣï:v[+D&:2JڟzK0Y! tT豮6/uɾug缠Ri T.c^Z;=Wv 3"z^%d u,,BQPy$2|f7.P!+! 81zv06%>,@@c:vr:5#j^L[*|/oA7~, (H[~$OjDysv4[ VyH #2-+dػT.2VF5Ϋn9 [a?gu(]A_8Ss`+w$e#91zrw.A9m>,ExRqWh!gⰺDF3N7uv{Ӧ6@Ek\`Ő"RTenPS 8JG0ڡE"sx+)Bdŧ e5P UꚐV42a6!Z`?^H_ur&``!l8;6z sp:xc99{*՜:ÊNagv%O IVI75$:&i1NjՍմ0!mʥ]h\]o4D}WniK13K })(=uA\=gUCZI39)1PUwY9IYҘXi Gs=,*կATpa #o.p(PfMwNuiiyҨKn:2^' V3?92{ IgN?X0w4M+%⟲'oc.^C'nꕁ#Gd #$iM'=_֙#M)3_!<- U2DI`0 Kl^agr_ܷ)Q>[Z3/Wq+h8,\Wďol=mFI|#7s`ĭӋ`njxnb[,E.e (y;6. q7<+ed=]of7e6"8 Hv^k4K8{Y@Ee?YP+&QF^oV~?OC0%65]AXY# E.QQ*~.!BIQn\?0,oqQq$!bנL*"3O< Rͥ7n: .d"841R#Nfu?ŪFj"}JM<=y,EzG*,, U1lNx& mX&xVٓij57\ 4=`2b0N/l_E i:z<1ݍ"!/ p-[,N%S}ZrUq~b)꺅 82a.ΪuKe)'O Yǖ c%z9:Vx SOzXkqwp<W죰$c^q/(#﬈. E`ӕm-uX̾;*ت>7o>WfHH!T9΀?WEw*gŠ63@ #-TaUxsJ(@P,8BSX\j2kX2PdE 7394Yق2pƿlCw۱?^P"4FG%#? GbURެ6dY+W`A.sNYE%X=6ASG35R\, +"ܷ?#R@NbgsLdALx*ӥ,* !$;CP5Q0d5Og݉;"0j`R!3~^!cTl !j:4)etԘ2)i qw`i?I3쥶t~ӟ #4v67$ȲJ6GX'r:f'W -z_P]Ċ oʪI݄?(Ev=Xw4uO^RX}f!-2]ӌ.A&q-ՊfÙ?Si8?eP=} gKM ]Wr1%UIB&|^Y( ю;{5}nuS۩S0J3(?JڂB S(RѲ< پNQIR&/4Y\1%EmSx \:o;/k//(3r ɏa; F;fe=mpa_H&Y[l%4$ %̹wڷp|U0rGeF4d-O.?%(ZjOWA)279;'Y7½H>K-$rYq'Y]o{39 R9-L-ϯ,Nq/4 2egZȷQ_8P|/G?8P%!`2PT#cYZǠF$SWnr>d),51^}O42 މ"Y1m^K; DZ!u]c& ŷaV,kDB 6ʸ 8*-W4!O%k 4ĥO#ǥ4kVW|s1V<]v [rnvm[LЦk .Iaul!)V HrӄxFNDzṒ|xi3t%ImCS k,j,-M." Ѯ演ۧHT̅7']wA8 ~*(ZZ y!@gqfQIei52'p(gG#T$*FaJ>ge>Fy@E0ᕴV8LdVs:cDi^k7^>2pU+}"J$x|$6F>++6c{" Q-[+ɾ_ #+f"U(j|L6,q_5PjA/α5'7ٻ!oCq 3Q!lb"8BzЪ6#˓Ô W*ue){+ƒD}T<lzx,&Zu~Xo6r-δ w8W[LOP"ϸ"OcTFCmkr#$$C*U}'"|G Ok>.)5.bXҕm8BvLdp#cՂO@X̙'dOyt ڼP=@q1>ܣџ;lm\6YMP@ =ϦiC}pWc3/ 02H&xjJ۔l|52x;)>ZbY040B)#Q3ko<,-#RKT ^59?9{% 3&^i;`;i˚C! J7/(VCXJbJr9D~A);hٙZ6Q*.}ncy1$O\gOQ L*vS O$Qy_;~!a$͓Y(Gqcmu7ʝ@iYV-\!^ X|YȎMS<Őw+I8xG[H~7=yTE{:Jv-#WXĚ}rB^酌)zɐS*+luݟΙҵdoYX`t6@ #!񆃞epWbZ"E%$l)@ h$:Lzcd_US*GT.m3бقw %Y|=_+5<$] "qe߅wc m!gU2L-MWtB9e?WgU & (a)Aa>x mRSvq>-jo r[:k4ScK4SGIK)"+%GRy= 'i<^A(Yq3fu'Q] (q˵r5f@fS*_%138TNd>#JOq4e??nθk<%BEf}2=s+̴_'Å#%d0P/m P"0I`l4g-j-7?=${ ꑇt=zÀ\|,vM}n82$& ס4OTߠ-4 /~1ذmMAc)c, dM;2&`ɭdpGy]>`Ͼ0?%.}l);} fU 8.wzdzަO?\Pk`r}$2:*\0KQ¹9c|K.bV|_$?s]R$2{[mSz%lۢw-r{f?z̴Z h.8'A:mY`gMxSG}T;w#V:oxA>a?Vٙi f,=6V!ҍ9,xsPVL7S5T5U+G2XµoV" 2)*@5>"3 l\+("Kt#54Q[vs`Ω36Y2ȒT6ಲ5*H<!Ji4!rza_4Z`_]AX*[O羑Y%9D7cG0#4Q4QPW/jyޞSd.!%$-=:Mm[#P[h{/I/Z)o7nTxy̆H2,1;{34?Udm&*?B%A-{uN OOqkHB0a7ΒnxYxkb("sM)S|97JZVz2cG agۇ&_c\1dGu=?AVl x^BLio'VdŇѧ9K$6i#V5z0K1k'N^C ØXb.O<==6* ZL2kDyhw|q&'& ̎ĖtMvq߾`X'B<܍o#0uѨ[M9x. LS1m m ,$'D%Ds;4fBmDNlBhN0U /P ܂FaASBX+(}: 2F1L@[=%t)[e9JWl$<>߶ײLGo ܱ1m-4 tÍ5M0T^9~dHIc9,-3Gh)vpP{ > #xR`$Ʊ9@,?x;'pP I.7HTD# 8+2F2Z&l Voz#Hin~/>)uWa+ ُ+v dP:4 RmNpMϳ6!ABt@sqqta4"i|'_wmѵPzЍEy*\ȱ=6HWFX$D"rSr59fsOB V^MUG?tg!/O0re}#+OQ)ݩ;#7 =~SZgluߢ14*C%_"4ƮA/tX O˅ %,.q+w ;(c>g(n9zNvϨ։5/e9{2 WȨp[SL” \Q?6}i&PmظᳯίG/܃nMEY)3&›Y;p1$ 5ih0XJL%> L*I\~Cl<.᦮Oo(<尺9/9%nP#82])HԺt/@Xx/$g l.-fsZQ;P oV;퀦C.$9M}ܿPS1%ro%t)!ж9m\dhNs>Wʆ[.QSs)dIH3+"Yz}h9Ҟ9.Ui]]^Aʸ4xKlN7$b@y@t4&AV^aE-]z)(:P566<5 8LQ$/R9[a90(XuecF4^#`ez&<j?< 2;X5,8nny^ZDOKI1C7Nw E l~?ފ/)? "bc ;y[F ^>z)~,+$1{<yW{Έ5BhYB45e>vf ua!7ú!d>h}.dTP_Hs)*M\/@r8:}G$r7 г4phGcDlYbҰV"0b w%B|i1z,Q+!= {,))@JY= 칫IĪw%vfLw3]謻ȮW3T jQ/1* t"0{Zh@)p~Yi}EMdf{=p5(=+>1kЂ ޯܖ`LB2ֵ |`ct ՛C`>+@M\[3HmyexuC /D'6>`-[I׾SSp| ;1CēcN"9pYoyޯ籛.|(h< cZ=Z˗WBA 6iv򉷝_y%k;FX0߾V6Uj7›?M:lr%Xnnl]+92c7HG#.<44uǾ;<`c:F56ed $O ]#N@~J /v#9>vR &z66=NN2[g}=h# u振ă-1\H|o),P ISQ p^hK.~~sZ[@7g&2&I3&;s!I vx""?o{R<Ҫ^ߞ++ VkK"lD'‹9U6F5~6/oĵXY7t%Dԩ"E o 5U/.r"&I*Y}Kj{uz:\@75NCI^oq@ Ր_B!="9*6Mސ = w*)*y24 >Z!}$4N N3 f4-XHq (pw-z pg<)9sLy-ɮM2Ly("Srs 2x{cᑾ8ZAW%2+TanP 6 WAY6FH.p?{w!D҅p)thvlT,+,'YUi3#m͎XJ8Y9v^2 "2֓rfȀr5\wPH.P(>48W +Gd6:> 2VA- 95Y'ĈU`>_T 168z5'3jw)4FrD^TE ;0gER퀎u@8 =`@pKeX٦y鑨~9F4.&xPL~nHeйTdl$wBGX/dE'ʚ>D)cՕz(Y1;ޞRX *1:+~nt,\ I%uH~F7'5f.:(@$M!{O!3ל~_KZ&#X(ga\KVS=hfD#IN:9i/ Ttl&BQlۤH0;e8hDL00eGN[ПJJ]FTbq<<|?pluNlqM]'%ZOGT-'LbBհ/1#?p=VF+a8*" ɋ:u'fj& L <àܛ&^7$~SQEB 9 iGA5E-^Wf@RlְBN1kQĈ\ゖr9;? B)Dz5 #+sOb't ۿ_ЎA,l: Tȱ :Zү8vDφRo*8d9oEc]0#xaa5~6\GHwt<+時ۣ:ѝ§DaYU~K6'01iKĢ4Vw2;="%<~^uKA! 7lTԕB C*/K]4R ) ·iI;_ә̓5rnvG $_\p!ϼ iXwzJWrZQ&"-ws)l YCŜ՟0ʭ/k8U?4c?c_p#o>{"H>'׵/4jbl,KU&8L;?cɘE:}٠GI0- f2?ve[4<|D 9IV]_!i&y=߇[4_9Km?1Dgn!/QLi2ugdi=AQiAf;&&! yFr%7yboiHvVZaszg.`E g\;CӀ0p:YO:܎kf@3_*5Г$6l)A$rW`6tC8+sQ-7l˿4fƏةeuХ8 D{Z`˿nY'_iDtg#K159oc pSilCVA,GG`Lǭ m Lh&GQ7Jl`\L'U/|LL44"&Xx%15+i{6A% !8+/nVp/9ִg}vCځCc.h)HtB6:*6`)j(1 i!7ȴ\G1radY`mı4*S3Fwn>%yoxe54Uxus{֣Q/~w]N'*VC {b^մQ"15fxR jRj=R -3FÂb&'ٯ"Zx(,,^sc/co[+DќqVß27u>P|d;EbV )ڣ_[jx 's|%t׺,BMˆЌ7rV#؞.Q巒 $jpN&f񎆒:S[ׂf;KYtDV$gvlr㷃?u^~X/'Uy-GGrqܥd/pjg39"콌KƩ˹"rf׾#kgs8>hg+\Fm!j4X!#l r&B6e`}yɩI((,GN.s0~F;ň"[*1<d[[Lf{Uwy'_-%u=2qߤ΍*W+侁8{P/dDMNpB1uʭ6.$;k$?΀ɾlZB"]ND$-n?,5!{n+jاbU4.xzNwB)7 !Qj9,DQYPނZtL!$u@7'<# R0Wb\-%1K@^{lh}C f<:3g8"\y1cla.%Ԥx@#W%a| 0o& Ζ,i;UƦn!W z[9x  P7"E;h,6tGLv#K1|nul"jJw0X=[ 5E<+<⎕<%/h u0L5MyE'k}]a#HI^r?o!0=TͱB9,uaOO]Qf * } *]@#"GR9#?4b4uH::f{VUOr$x {uH7@*c/g-s׬! )12S8ڊE W;rA^xfP f`L3(_3v+tVyo^; @ 6t%{T!6 ж& (?.ٙc IKČ|0褖2ŎAzO<0~^]<"N>;H18  O[-:Xeհ5#'7> EB"w#(IY 06m"MvhSUl7s0oM'=BdCՇ0)U=/+()~enb8&S=)|AULyLr3~\ {/L9=[ rgjWzN@;Cx_9,Fv,Bߓ1C S%VGi*!t78W=bS(ԧ.Ƀ,]uu魑yE h{%2Q: 9^;0ri kh$!mWs$K (cF.-i-/-9xM ;sI´C":WJhz8pkme*sUd춒.a k#L b7m-O9kp§d7z9Ѕ~,ߧ >: =G/D'7cɔTS}[gwDF{}"<&z\2AzVKZ!2s+m{(T~vcٚ^),~XrP6Gߵ$LԟcX)@ӈ=b&OwG!W-'ɇ|.D B"Un*,\0/U!K8%z Sk 5 ٛJQM.CMZ rKʙ&!Bf"e+!% ӏ$=@p)j?vi^XĜ3-I&mLP3c2Ybۛsa]`7/_ "?ݗc:adBтPyt8+Ew(};yҚVI鑆vcj2I ׼Agg\^c6(T<=K:?*Nƍ!ݴEOф'4]8q 201}jO""Df1v[uj|^=& Ey+=9J;@Y tm\[W&2  ,;&J N|C߾o 3H($=0\tN5b[ÿW[~qtm M<|(!QalM__7q&0Rɋ%%`ridf 7ЅLη&]]//!x=5E'e\alp4j5;:a: ,O#Ax+_ڼC`0$6K]kVv|A.P8kt ƕYT_e59z>[?l&R_)0#GY͡Nz2#"'},X pZAJ"D|,r, b(8Wf񰭬Khnfo[qgֽ#m-ٗ^:C@K׹97L-+m/yd=у|ZSMhaE86%˞9c하Y4205$ `cF"/ ~J`Fi~ p|?| 4 8<*zPX\x Cj[Oˣi GK׎5M29t?jÉwi_h OFy!WJ. R3lUCYb)>\9&Ƴ@G!+I/Gb{~M4gz#)[pT/,9}В2 7o l3vrw~( q1H_/dzU9.?f5Nƭ3hpf=Z6s{z=~9eϿŅ7?a `f8nG(oD_'yIr$K#%``71t 8-H^lڈP/x>8Y>O9فMO1U f#&"b7 2VO"c #*%͈?,e0Y;E6ώ>z,*|諴-oN4^kOw~l< EAgMq|Q࢑ #& ^f߀zeM&F%i! 6¬/Zvao' oniUv;{y'x셥[%9R0)%ױwTq(Wg2g/{Sf.I&zL5-񕼑\HE"Y'޶:c]oٻD_:~n+sVk/1d Jny5JPAF{=ޅkacmP&2Sn*Rf2'" m&V*9<r' p.+O0:,!:8H Og0\aLb>M8b o=7G0c}%i4l0е-LY{+P.1e2B=EbfaGoZ6$:?_"( [%V$oӷAU_nwJ-ȥloon7$>ٴ]WB9^'6%S%Ƣ$Q-:v#tqlB$燐wKI%VIԻ,t.(HDžRQU^c('kq\檹7ݯxS2s>y!M "J[W_xhಡi 8 m+Y]2,wk q=~(FPH6Xڽ&YpSfR9 !"P/=0LOwHg2wQ*({  zPMGT!A@+mAv0; N@$gJ!Y)JvQHaPi4oI3LWcy%>6l'WԲx@<?q ʱ'&1TmߖP $wuoMFX=q0ha>Ok$&Rg GWť<](sK g쟛%8d+-. Vc=E'h/'=v8JZV0]FxOav=I#x+l[n&Wy>e i`,C ,zNYPRx#7E-TzjpݯLvR+v"G8qԛeŵ7x'+QY#_M!?diC6V簣53vǵTaށmp.c-vۇر<\R3nTz,-'x{0TҩN^2L3',bx1w0=i/GTu?@1Mm$x?{R7=2ơ}tŇPD ^MB&ڴ 7 i¦dܕIO!8/LM$rڼS[tS);JQrcs#GѶV}(nx]%p[<<׫PkY粉ID.l 2'L4 姝moӡ,[Va:Ϙ_'@n)%$œ}|$ 61Љl*+S/mxg3 -76^q=D '{CA9#;{rygLN$)# ZVxP'X7&im3b,ր;akV:~^1aDHZII@70WWv5 =+--K"|ƬdS/НP ufoA9$+}he:DEGdO;&@ˑ6^6caͤJlYZ݇A$))Wg-7bN;U ."Lo4cxEM7:o"jId6=9/LlxK"󠄅UA#{G%*Vj^4k0;[Y~w,Y5牴Ov }; 78x<0L0бsw%.cFϵr"#K|& EPU4$pyf|eCc+{^p0YNŤjAmL>#NOH3$<[belg؛5k$o W-%x] kUg3!m 0֬jTd*4*)jN>U ضEi bwu1p[41G3UG )aHߝjފ& ztCmz*vN3eWEţ-p(Q>?u"@x?ۭL8L!3f S*VRY<_;G?߳vhws?ӷ'`§ՔꐡHlS%Obo1 y9 :%G(:%j>FD79VO VЄ G9wW'ԥX+clJј|U0tJ7 IϮZf{`'J<"ԣA3zM̐ xtcWnjI&+2+ `ÖQ$c]Ѡc'>VQ]roq_)V4֬-e<1{"͕lYf?ˍ`t 9F=cGYI@X:43YcR7 Kw&[nCI S/ɚ&E0[J rxJ[aM'{{pCemY8 St)^_owW#G[ /KhI!47ۛ/ Ylhݵm4S sO{2Po,U#[Yq(:(!â?$K9w*l1q2htݤN흇z5Gf2~d1?;R(_ MQ”L-^ر~'|g6`Nea#y_vN^^S1[^Db9pl׉7=#(%>~8*s=e$F&BL9&:@>{M3Ӈ(h0ӈHjI0d}J`@i2J.ah[{amٝXo7-vK]nO O]کSyTZw*_ݵ 2cBQ"*14{VYTpP}ɲ[Q ?= ,jF3*b{߫Dz͎) ĚWF;g͗Zז ّx'g3tX @ ŘF'ss p6oOбN>}!tPt )($fKD>ZNN]m*d4 R4Q32!m֕`4p u}Af%>4DPpi¥ֈ|- %i()p8'5BջdLB3e! x_oè_*s3M1’}R)ϕf7KO@^G=+zkػ1:L&Bn_vװ 'kjaw>I/QI@nTW NL&Et9 ;$Ĕ(j:qD:f%1"9²]zӤ֢N"qɸ.]~qsHsEfXN j@bp::&KHN `7Ű7ĜtH=]$ ]b-ZLt4-#l 6<&4G8` 6=`A9_6dx\eKb#&7mx@ l eB|)QB8Ʀ+t>ߴNǡbLSseo(wmm6(Sn qʰ=ihe[yJ*d" IN \d.MYB4}*^QܡP<QVz/$ɾ-}&5[5Ӏ)e->3vLĝ=|NMI8!ns _5E [$"bE\)nIJ2'xV\PrzW3B·6A xZ9gLep qY)}DDf 1VjȞW՟6(A/H2tUF[+{.zFaG2;>Xtz&X{Xٽ\?#YeH:W7+P tWV'l~yɚU-[k@d\QR,`1G[a{k?y2F=tfwx= f Yg%JnK&OC(2d+:E/HI^W0#Trg2`J}5\P72;T5m<65֧sX|9bdഩA%yHˑS2aאnr\2 F;*~"R5/Dڲ>v~9 5JN zz *;/IQC(an%qXGLf"$-ƺ`%TrnM. Y/"5K'.w:y%w|Yz<0; k枓9+bWRʍ~,xL%~S%OC.^$eԵ=17Pt.#Tu-~Icdi {%őRz\,)j)F8S !i xs[.0slYC,#'kmV (|PX4ၐ[*ZT+$E8|Ztq5q6*67-+JONKcэx{ b:Y"g؄-"zEcډΈ*Mv y?E+]6Q,+9k5x'*nn?{~p5²[#!T Jmr)9)*!5; e%COGԵfi42Z*ׁ}L\,w/i1 ~uzM 6_se'To >X(&,ZL7>4*jDhM.3ewWq_EE-´DVB.&J?ϖۓky\juWN,'qmxFVW7E>ӓ]1M!Ix4N,-} tIiz>QFd;~ ]:*mM*=ע)&TJf4rؤ:dpq"& |i݆s*!sI} )/,qwV$ϞRЛOѕ;{ *6]i,A "b=%kHaڋEuE"wOH̹#Y2 .B+dU[?)N0:BUCN ;^N.j')4VW=1^$C7ԡ Iq3+u-8I>LEdZM@Yve,8X C6n@8M0זJ/?#n ܐSVQb <d,aJ5 u(8[D{ (9~7}z'+IsY MINY.-"Xqwvߋ/+MigZ9!(9Z+MT׮uJabCK1k)rD16&2P3tFZ<&BY!~@],,,pr0щ}V*[ QFu7/97?#8|E4`"L ꂲalm![ԸR+ˤ~#׉ HOIvX)r 'MގcnMlZݣۻ>3e ZJShfeIXjFi5M a,6ph­S~D[c`(9̏*3ـg)~tC|x2rue35^fab4nQ?GetI?X@Zگܐ]!tz!n'~ћno4AiߣةI1?3-"X2BJ4ֳN=誻!3 z<}w_i:f@&*?hr Y *#]Uɢؘ!0 ;OO/0k*{ k*$/XB(y`l1K5r½eRMm:IWC)*EPu]LP$-su#$CA?|_pd-8yPQ|lFDHRO[w"`9K2M{*t m.ʗ#sކ WOH:9"V?,_ah*ƬrdvcZ*6Ȫ+,a8<]iP)~x"J{; c#8| cK)y~)jlʻO+F";3Md!E\AǤЃck6^ ɕ_B@58IfbrJ^GC3"vO;{S\pC d5*S# ZehT lcԂg"Tp5VFXSdx'$1ɀǒ+f!W.}V15~Ux3)>n`=@i*:WefI@ƈx/44\D&(!ZjV߭fx{U A3 U+v.0@}q,WY*(S~+:Ԑ͢/o <[2`~^Hk Sȴ~( ?PQf_ P&Q070?WF٥w'&y?Уoe =1P1o^iG]˾K%,)9?W凫וo4Oה&ygG-iM{_#oP 08X[׀GRV Z6dqx<#Yц,;A3;MT49ZK%\I@ѭci6NJ1^v/'4zWv\Eـ<6by/S;Ӭ9zˇkѡkʝuŖy%ؒ2/% GƏ#/sNIaTH1%~B';{/ٷsl#'UJm8j}./1 ZϥGF( W=Fg |W  R|'3V&X^ԢxɎl'˨f[/uA|2cH|R@;5?.4 n Mp07-*3hCp%"d9pg^S` @B0.*=Ba;3Mh4yO<  .|::)t@~i'0 \M$O)t2<P1^@1Q t`-3?ˆdEU.D5V>e&`R 1y!9UFj?T^Kڪ1AO|#WpEN&6'3l~Hz[P&,m̖{S?XqgZ7?>E4N<ـëo/)ǀ8"۵ύV !j}KHY+QC1NrTiڮ\:07I8{6F _Xq܂ԁH-R~-#v "|v6MI}zgE3Ӑ*} x J&55o1g<̡8/9Z^%A! Lu{G'J[n),e=xbT!.؏j9mc3<_ƌd$՜yϏ$~y /=m DmXa@j$obó({cMN)h` ByD] ; 2rZ3xJPS*7Ih_m?A'ظu,E`Q.r6tZ,0‰ Όu'1'wV%.Dqx=a3:w1Uwl&hUY9@l, U=Ujx t+}U#Kû%5&#pavjvKF,*a*oBd0,! UETޗ|34fza R}<tx3'Uk|<|ޭC\S%!Vq*K[V/T'`vA/eVk@ gr O{?*1b;ICH(рSgr3*mgDp{}$KTZr'zϝtiUL]&.Pc_^#FYq!YCEPBjk߀D9VAJ6\cr B"Ъ $#6Q &:3΋ꋮv-&)C&/ ţH@..U8^YKw=]&[mMo9}tO]֤5#u&,Ռt!T7 xJ"Qt ,0~2 )il(V.*&w7 S#3%*WU^ nZ9"1s⮺<3GWnƨ:vDŽc AM ` Sz7رS(^(y9 ϲ7wO.kـ~lŶN( 2vrׇЂ_'Uy!#vzůr>T±{.l"ܩ<Όۭ''lQ 2jhښ9+Sq|R0eEŤygINn,?-=?ƗKqDV{ȿ,&}9A8Y)-+mbZ÷/ds&&v*QsV S봥;?8鮺~ "óMHS?ZNIG%&OMZ)M a(KDbIXu.w8aM'f+h 'պ[#?:nIJ\N?L#p[T!Ts8T֬g$۩sbO,L)M*) ܁-R%%{#'7l3tt34(tS8,zlYvxK D:H ) ȼVt#dR |<3vdic!9ȊbTΣt'qϛӘ>|c)Ǜz-{QH rÂ[3]Kl1ӖMH'tdnewIbU ];h~`(V >S;'k(!25iJ^;`ݲ|| (B 2~݂rZ7&042R5Ln'?*1"q#AQ?ݯAx'<ΝCd0,%ON՛&R,V1omATT=<׷˜f=edeI4 U& cZ-y_.@`ы&B>gAO/'wJyN.X9PV.0lA" r1;\9.uHdv:n.`]s>v9R$oQB2} :x5>Nb礪Z-~#AHFBNM);!NU1p9tC5WEPl<QpE V,P#QSc6-mR1+d >p%) a<"yHy'%(lӃ[ZN̮̐/z*Wq}s}2ǘdr#1btX~5.hnԟl|_~ /4^()un!pH0:LJ[^:c2gsR)ZȂ컹i2kge`?Ab=4us?oҀ}?$-)j] !&&,bKmjO mx(oa?;]%HYI`Ť#KV%W3K 59 H.[`,^*lX?<3Ƈ/IM1]M93;J{CT' ;G}t0蠫1'%dЊY| "V`YaSQF>n>#8%ֵV~f&fr=rܽ,QisK#&[$0?-́S'Z3CPif%`qmk&.bH4u W!46++D zZ(_mj6{ҵJꤨdؐ[o[D>DY!G#]%uJ2UMNF2*x! G}V[Rݾ2ࡊ4f Lgysk~Jj, osx&YPߑWPFtwN4v5)J-0Wv>mWfd/gb-3/no gʿ}`MX,-1 t@uo>'ow8{>( ő  qJN2#OW7v?W+Qu ;:>6XϱlG v^RxI$z$UM'DnC[P6fg[1mjE 1 wqؙÚ@̲= Vh=%fʤo_Zf'@`HH%;6a&K@1xIa3V8Ƀ/ݚ?|q5m.y=#a9@kk;3Aݲ+zuafDz%QE1P[cEy3.<VӺߥVy$~$2мAmE`:Eԫ'֮֫V_.0R\ $Fɖ֡8,[cm:Ug-br|~L /Fc20>|+ߴ09XO}ͽ"o8P~uUަ-P q#.\9Am `iF/]dN ,˳Hè{1e^5ɇeTw$7|_ZG0 Szi>Zݔ>e"[wY|C+1zg2:}+1bp[!6R.~o/>w6?}=&uasCҎ``w]/"\؇=o\A@:P8/9J25(-*sKFRHdy)f~:s8C5O!XXOoXl3yK\vJQHJ!cJn.#nGXgX^t9e)S -JYp ߀$:HYo_ 4BF|\7&qug$ͷT4G R!W[oRAT"dmeji٢(Nb-rp2ˀٽ10Ds3A2!T `FPP-~>P@5s~?u3)h'+ R.] mHa'bYR_3BƓ^fe5a9ɚ1f`7!ldv"5@8y54+_|>uV@"4ls5!(ëݻ&RkPC+AGP"u~)%@*)q0&x$OLYj`)w0$Qus< Ԗѱo΂Hn0] zʝu)h% ?FKec~ډ|+=EFdG3N/UQׅb]Qv^W="";Kk]߽:K) 1V}U$>4W-mџPS&2.mMNx;G%'|hCU9dP0:!lK]#8,ܰg!*$}$6}5)G'a#{-mH܂a"(HX2ԡd8$1sN*B$3?#-XG<~b|mZX1hem@, y/Y35{K12<=>8 |7 s~-ןV9'ŭk"ϬFBx랂w0Ch47Yq+5RVF#~ɔ!M-fXD0!'0XޡnՂg|0#(!eVo[ mu#ȁ +w$=9 (uu%ِa&d)7/{6&[dzr$o9/Ļdm}/2`W_JSrHe{0j>Hz`;s|vi;/tGMkޱv LQ%c ;Q gV^à_+.t"y<U͉+Wp5 7ZO: ɰ˥U 6{VwPF5Pⱘq$K>O[k,յ Ϡ[-:K#߅ w'K=|>ͫ~8SnUϫRt 8`#gMJ+c+ÖxgնYUBc 8%|,;swUdj*xMn՛7y yy5nu֞kY\]e"F^: %FyY#z vlpq+|3Xv> 4L//lLa.N6.  DžTn杣 9 /,=!!948+*n`L_ 0HO;w pjm*G"jt0<#z  Y5mUa_H>V3sreU̵&'7%!ȪywMs.mK,@~lk?cp,ln)zX P$QAI^7RGF|7k'3l 7V<"3)싉ͷtX^ Є^l ;AUeQu(@vGʉV[`&1?4fj27Sّ[;Ngf^ ه3+' azQ 2דJ%"Pic1)Ey4;n&8Fnj#3%C=9gd"0?R0&*U&`&jXuTg<;0m>rt0x.bS)˅JnY":[ZY&WZIʩ!,_u)|$n,nL]|@#P◣snĒѲB&F% ,}̍JuW]n &8ΨΟXڶV0|:o%#[2SR&Td,<Jg`8+y*0}7 b;*yם6WŐZ"}Gt@ dE"-%/y4-5Zk\sdШO*>y.TzW5m9g03пYSR#5 qǬVaq z3 ◾E.s}w!NqNWݤ@=.uP )gb5m(Ҟ QRQyRMeh${PK4]HźCCrR S0+?L vMRg\QOg(hq4("Ac&s@Y%cj| {A3*XRɼpaT`!/caoQ?w`Pyxgt6(/W2]7H',Ӝ{Dr0Gs;/"sj|/MϨjG^LB(%<@E߰~:{ Ӭ-E5Rr.KfT]I'|tyO:ʿm. bx`( PI$I6Er zV̸ƚ-[-e'k΋g5l&ߔwAfU*8KFaWQ`_< hS5`uژo#/$?L9esw6Nl%C}BK,;y&_8'oDobRSfW^^7ET xTobe%*K(0ċSGA+8hMr:|Z4.w^YW(6K\c;pXN1}J,[4aY!^3< AAgLX~qA>$/>*5@ vA'ןY ctM4!ljxCl@VUtB !PlI!*9lժT ѫjbmKKdǛ@)|~H)U*mQVŅ;HI=B3 OvOR;V3%mBNƳɑ: mѢ "(ޝ'+n@X!o <6I(ȅ扫U .iH(˃[2:gc_lnkd˨tzڤ- d>^*j눴,~W'e5\Et&᷶ʨ#e^-1pW#CV֜edlmax=HVO5 0 $bM^cqk&!ک#pn #ao|+|N0)PWr>MtP)lv tp6Y%S&zA585C1$6b"'!4Z-mIf~h/V"x#p).v<amŽ*%s񬺁狻bsB@HVFsrlQ5&47`p7{z( jR!/ AyExYM"՚Srhj)r)LVLe&kA?BsfQ4ϺF^0.t?$Hɇ)Z9 is9QO-#4q Ǯ(St+%,* @ ~y2*$h5˦wګ5?)uQra? W!{ኩaRu?hA*2zG'ͬٙRO%B9t1dP阸P'nbi^HQ^,>>2_sͨ^$:-U,C&2>v7vS$ux%+"~0pNSEdc nXCҫT<q6T$p>Djc+~dq%;]U D)m N D<%".W_M[/JKwjIS[U#em- 1;j*=P 4D7_6$ t|rt0$^]uL$3-[8g? >.F_U[fNiQս90l[O;V\;RͷQ5!$.=Gr# l_߉N$%)-Iz T̯G6WV줥Qbm1Os8ņߍ,JEgr]~nH#IW7g"tףht@,k/x<ଢ଼+QáD+!7y%¿+Bb}t" Uk>//u7 jgc`veY\+NjNSEDt|5/d5qA܀`CITPM{L.]r! CQ")d:!]zaM~*ѓ+Y;z[<~Hع2^4c|O=perNi$'t {[#MM~@sm1W!)Zu`^k&92GSI}p^W3xdCLc߳  zGԍnq,{ V&}S_<XYIqV?(,j0N]dH( كf Obqu#26t}NP$\'͒Ѭ>hy:1y@jKΔ[,'nH[*]D J~20-^u^5]lt#U&V\4=\Po[ [AĈw6x!uQ_@&$ ױ˱j4WM*Gӥ9/mL>]%qH`;ֲ"ңz0w+!l t\ u[%E_njQYsTv)OS#3NR.nW&/%0P5%TLao!=Nbr/ߕ\UKRd_dx*Q a̝;ĜN{Wf=w}5 -( ">!-DkU:HK`j.!o92hd$HNyjU8ƣ\j\}ɻ^'y)>}-1jܻjuq3[hvݖ=cZFa|-ũƎzH0rD[NJ 0y[-y6Tx2Z<ˊUpG~woP+,9 4%}7ͱYCS%D^U$6wn&/Nݨ@0Ш$ֵ*UɆV2=Iy:QQ}S)֥ڌL"=v?f L$\h%sL^jJMSϿmQ .&t6ې(/ɥ֎9iQv^u{~#bOٽ9F#CXe+q^zwP-IǗ,SmevQ3mvW٢x}58,d?@Pj %d +Ji?W ?<6b譗^TL;㙒&NΡ'eGt"kG;N"`^{b=v) \@7AqXEJ{O*5y sEZ eZ5a`G*QxkQ΀!*z,'x/fVzG\f)1V=r[ZrkErBY4qU'}y8J'cW'hCɷ MooV럤qܗq_?g%|m+R?J+FMvHsƿGc`M$3/Y']݆6u`lв|8i{o15hyx8!ߦ <\iYg>]˒PwTUÔKH '1V~w%U֩*9^1)IPr0k!^cnKT5qG[}s%Ny^j<P #$aw;fxGUPVB=լ۶*2%VYXK+ޠ+~` C~.d"_p.6ؿ V޶]a; 9>ݔb:u;!7J:5<Ȇ R$xSGG76 H${(7Mg-Yy$Y7 -`E8)" 42G\Q.S\ y##ɤ=+X43%9g3NW,lz` Dy?oAڀ_HA;"m7Q(hK;m%)Xe5" Fe+2:PC^TWn3BM+`>vHd&}ipIYn 6W8kIw7}&p%Bf3.$\!l;F`X{0 `W96.sI*G !y* }7$<Y_=1ȥ4m+f" ;[Ga !cڡ6bZ:Iraxf {K) PJdp0V@ܭy3dr&ޕ~uVl! p1)C DZn4pDV0ޒk"*Lk>S(IB+:fyM#h2Vh۷lRʶ,{\;Xֱoۦ l-?6!1>rlq%%%Ica'i4:ȍ@|`tBo[y|{:1C+m-}I:P)RK89[=o7[d,\qmna;ZKn#1$?yu& } ju W90]J}l=펗0L/]e sͬ|t-b]`l,/ x18?$NѸ>9] ]7G ^Vְ8CG0"i嘋ɥ+dQ 'c1--ԨY@+cN2hTL,أP!; Hk LS?Pj!gf2L?Ud C'oE4'>_:,:?j,~JjVA1%6H 7 2H]X]E~">7ҡ&imfb8i?bMzW} &FJp ;`7hYx]0v\LDA ihJg8ï(OsB­ l@%9k^2,3so+]*ǥ0C(~*$b>wPBKv^8|T]5-缈cA Rޓv+3T8v5(-3GkL*I3qQ#<#slI;]cVz L&,z3돇@gJq|/7L5i󹔋RÀ.G$.ܓ_j}"B@Cpyqgj z:n9xw/Ef+GSTbjNn1IWU{ֿ5 4=OdirceV ! B=.D+N1FZߵ*S =ЛFmM\:-b V@VqtWc4N&&bALdyD͹\5֦^ƨ ⯯Q#_}@:CPR)aۛ[)&출#Pݗ ʯge3 iAٗSAtrnX-  eNdÑO}nҋϰW~uVa'(a=4vcD .N^S-fHSa912}LS|DKx:CCY>Xm O7wn^isZ t6'o!ɔb`T CqT 1i{) FTT)NE="=0M;p\:fC0L8T,.K&ijL| J @T<_i6՜/PP\//Pi ZDT x;VRxa=k!gҨuke%^&ֹcMX=dGf#S(ž.6$0fL|@`L}$Aɇ@l3wn:(=/M(OU}TQNw $JeL{ca2;i\䪊j! M-^]_ZI\DֳU5i_jh9[b\?n ePUb{tA#:*&3ɐhelj 1Qg,.I B|B>GKt, F&7EIM6ߩ9ଁ[l",AmWeib2s1G+w}٤mY$JO g`(k6*Vr@Ӣ\1Ծ>/@" %ݵ쑎3>ns;PX*#nLTOUg6j+ OJ,%.$5Q.bLw`8[Fq;&=6!c +hey(:+”8\ =p )<6xOr! 6Fʈ@MLO38&b9!?84l~7[Hѝo ǯ!"7NFAZbrZ%F([(GqĤ:kqf2 2bT%MU F)RM$Ú=Z?tOT׹Ӽ YS&@'c)MTS.쏷>0h\t 0P~15w<+G>ht`"* seN]2!*#:IsK}]-\̺[ ~~fj+@PC8s_‱65p#Twݍ/W":[nL,ijkTG*: `~ӆ4WX^.5d7Z"3Dۏa7G!'~sC1?U(K,jD:,)Pɓc揪07x+E VgH7g4qRr]|~|" aیKȕ@d KGuk@esM9p^:P0(ҘR}?Pf ,3FeI? ~ ]O俉y3$'?Kߍdf)v0W'q9]'W=#-^>G 41dӥly݀dYO>/x>28gndkp_S.!8͑Kga '/?F4[6yisAv0Η;+HؿDbCf1]=\^6teAO-j=gr"c &Ѿ#b z{f]/ @^.֫z6Y1OAXYZ=U;OZ[e מ](Ϙ&<%02XT?֏x006.2>n)31H2/@ep>=-:O$>16ya_mH?:GU\$#'-!^9w``fHRT%w vSs-pxDuNxfKӥTh8Fʉ 1%]Kp()m̙ea4#8G=K}n42Xt??y!A!c,F{YM/?njOp{7B*PQg}䚢18 F6-q"15$\3Ag]!A >)yX+b~B-Ѳgn]3Yw/6[]Îɬ`+Cxe@9JOa!1 5t8S7lA G>T*=hBz(^=)tٍ 4&jռ,H\d95ۢƙn1!p{ 7Zs tK8юJIV)v 'E1. &'Qv^Fp[2l3 Hjh8 < Ɨ +&?BK 'ڄFK}]2g_oxϒٴ^(&#Iis%@7?K5Wbv2&+Fĺn>O捞-d?Jؽu~IҺ4AL/*!^y|l']N-S[WAlx> *CÛG162-cR79y֎ӣ}=9eP?q~d07 !Fxdΰ&>:ZO+^6=%EOƢ'0(Έ1#u&}.&Sx}B'<ـ?G{ 8wE4+w.>%K ;]jW: T..StRKЎb9uID3!i*:Ak/BC J 1``P"Z\$ɿCkFg_.ՔcQ]O=xSk""q3-vjwAy z4Lf!(jM^9 N:F̕4Xb0#J)mJ%+I/X?{gk%BϜU{<,3u;.ڧa.ҙ+KI8B Vו")|IF<ݢ#@Z@#S+M!k"t-["K_DX,"qC+gv f+Ѹ%wU.y7ԓ#6JT4㺂ײrj ͢23d<1"a\iAXicx_2OK~K*ʳQD|2"q7Sv?b`߭]m5^P[ _Ǐ=r{6d!v/"bPq5MOֽ֗)7ٻJkZue{$D #=aK-4|gMXi͖JhQTJvƜ3O b Cig<]:qfSGÜc(r.)MC #ԨY;2mNzsy ], So3J?$aq,Hd ' Ev`'mZ7Z;Zмy*֓8]?Z1g0[mq,̸4"3>n6{OߞƂ vYn3Ԁ& D>#ƝxcPM? _@ !L0Z? 6 <8V OkwKY*L$RP|+>#|O>7HV.=-8ͫ Ô?P+"2[, 6 yO$\=(+aur7Cyhgw:q\pXc#$5?]˄Ab rY{F^L!kQQ{Huu80u;6%*%k~_fe0BXF ^SJkk4%F_`^ \uԺÒe S.=Ě7 3#i8xs> ))LuAvCGPNOs31|2Ȼc\*&nzsjkm|R( =#|oكJYEg'sg2( _i[0$] pTgkOr>2J|wgn-qOB> 3Wĸq/0tq@'@YpickmuNg:=#1 3|o"AdlU=t&`B- %pL|KվwMcU&rY0Roj9O;/_۬*~`cc ~ȣUA̺ёB`Kǎ$8P+ eiHE6S8y-;Gd;TeE߃he9ꄬh5B:򡟗%uk fn#ݯ%WfTnnRfBGJ,r{ m鼊?䒿c\7eqyoҧ&^λWX:"@ 00]c)ªm;Չ+-Q*8F%<|{|>hksI kKy6t!IKxͭ'Pn#hm" "Hi@pI, V *&FDْfR -^\^ A25xjO%ܺWk?!6-WE"0Q.ȓ)@-HJ)ìg+tL:3۠8ȟ3Rj+f }Hodt{ j#Cx '<]o> ZӋ}Q,]kT(EcB4 0ˆ 2\=nR9)vPv{p@AUu!)r ?/˘S' SZ)VL;TP?nt#WB10ɵ/$)$_O`,~B0 O|;lp$.`6#8x(u[ ꇌ9TCq#9Ii/vyw $S!NVD/9h=/ʕ-LcҨ+gi({OH <{S8F~ m11Mjv1͝R-4#"[]LH:Y}~@E!rG8,jrNuݮ_Tm uNY7CQiJ{յ$1obϣebz*`"IJJ#m= ; ?$Y+u0*6DpA[Ɍ N9 v63}5[!٪zH swT!AQ4AC@! jU یvOveA5AlY)D0ģ|QD0u4 1 Z-}lZ1C5*> Xœ_y1 SEr"(\|I}TNtk"q:3zTVr>2&Ntw)F( X=hN걇~I}b(cӧd)ޛZF7{2o &5pѾYZf/C%f,p'boBWK7KmAA 0:'t Sݭ&E,_u=(瓿,X`2;_S[+I+&xo7nYJ7(%kjƵ/On/W w0;E#C^o]C8;ofdJ~/EkoSe#3*F%. n]{֢FKs,t.Q (wΑd=:3 Ta7G.zzH9 ![6_f$fBHϩyt0uM-Ͽ@SMrCFO}?IwӠcD8wAt0p' B1S)*D#ڕRLϾSil15=n,P;Ƀ(ka!8}KPش7Q *^mb>#N"V&& %Vȷl/kDUb ^I]d+쯯dOQQn"lzG n+L{茶t=6 u.tE%MRh!pA/yѧP9іS`*̑Sgi&QCpApW{]`T ,B2ګLfAS yRL#jtxi(~߿h: Pgȟ{Ѝփ2e\mU/ $݀ޙDš6$?cYd5LMň6<+6%v'{HpB_U *Ĭ 6p}ąbT19ZZl׷ ̴5! C:5'Ym=$X#l A&g9DΨ#~ +B2霄? ,]BA #ĥIEێY w98zI >Zt{F/7N IךFC #$[h~p};!NA+mrBx-a>5!uQ~6)kS!!la Uq6.XS:"ާ)+PPU4,Lͣ:.h*p'4$ejA8\9|5%`9P6hr# dm!72N-HoPO,OO%?)>"kv9ZŊ$ccbݣn5;4;GcXVm~J8j&) Q|ʒjEQ=,p>tA(6M%R}7׊eT w dN3nGg%]f~)EF?S$Ō|,Z xT9^d e)>k'gm[u0h)kȵY(Qf1R'<I:#=s 1C>yx ԯR}hldS& ɛΓ%Bۇa&=0HNfx`D&g*//@L"{% /*ZKdbX&Wڮv~Ma;HUZ8tpuIwHH- o%걎qQ7ƃ*R 4[̊d.@e^r HE&ŷ$uD&cP69HzM}6 =@8o#>$YaJ M]ۢunBFoM-.]_ve _Ӏ UlXn8M}:X*,;g,CP%d#+t? A"4xd=, udkj*RxOMjAYM*PM7ȥ~Z3s!)pڞR":|#K^1ӏsCinB& Fg4+u 5=ȳePC SP56 &0]?<*;4΁R!!c&aJZ0|tt˴YJAb,1*$l16%R =?}L;JaY\GcǮ"&N - J*yI.]:4ٳ|:ĵy$_ qg  f_wH5-vxLw9d'lD&7"b8ˏ 7BM᠁7=#U3ML~&xE b ,! 5]c$L_׏ l`-07 lP4!^VC֍YCs4pܞj"M d)WA+mLqsB`pyALǓF+ 6IMSx̗,R85 Hm cX͵03R][s#硛!,\{2A3u2xP`*8s*=!?d',4\ ϹP`p枠"k] *C伫m8`ߌ/HkFaƦ"{)/tT"IF8p;HkxPH3htՒ+[,&%-cmmCK3 %C:Ҋwr#onżH I?T(Ȇm$`qOv vV?i[Oi2 {-M2XT,C>uL0؛sXM9jWF'<㷔1onJD0N&3( ys!^4 ]$ *4[7>/tvAx ŪgMmP*u2ŕ; J%k&PDzzi*A?iO%\'okr.i0d6{ueC.J:l}DՒB>TL:L0+I:3n϶ֲ)kś馴p$_DZ[t mdb4E С-w{30%0 0LH}o{OWdD8+- >ׅ^oc/(M"k>s#u8 M'6 ;{X(r(6*z,FQ ƊfnrC{rP507l2N6S o̱YF GR!~""GV?akhhf?yLp٦-o++@n%`̏K6g{-sCQ褡 Y,òr!xA19P,"f WsOk*еW}GdηL@Εm,PGw#5&V [Ბ T}*#!# ֲُ6ј%i" ?/l)썧gгf@.!kKc{3@b0HRc_"!)G%\ z<f<9Z[e_>t(]9K g1w1N2^!Oށ"^xWU5?wqu*6lk^Vu'FӡA)^ҭu5|:HNa16 H 1FBHwcW`=WtmFcqY YSmmT|&, Vp4LZai90w1 +މlL&B0z* )'+DH<*+Ï-XPbj%5?־xi˴8k.>eot:BA/#ϋVY0Ǚ>Fɒ6R:aaU&?e~ Dͯ"̽b$s9][5!#(UȴU[+?:-)䲂2~,rgbj2XKI}9ϯ3n[<}BYYϭ1#` nlJ2))әW/B,̖{=]zs<3/RGm{-$8@>T0mFz/l],pA<#!Mi|ؘ;:4`*85LC+I*Dah\ }B4F¶֍T6n2ho~%9jO)9r`ӥD" A1hIB 2nDaJȎ8H*K n>B[Jp]zF`5gkQλWԙz/l[|v!Q%kwfD*qI@-o;lvr)䥮x@' 'nAt{!fWՐhh1621WJHR$ک?mv / $>RT>w.mwBӊ(G*'qjVG:&zH-YpNń)k|I08S+1ͤa3KX<`Nk.?qoL4~ &8ȢvqF9NH, >`cR{^/zKEM |bZQMa|M'"q;,|K^=֘m0mXб&%R\^46yH| ?cȫW,nDcp.0uZ-{mwa{ :~X8A)j4f* }voG$B%$^^#3HŰMMԎY-l/w6Ȭu@gra#r08=* "˰Ih Rn# Mj\&C3!#{FI,#M\P&1>$H){\7Q692DM>35ץ-v 7:3hM牙"C>HafQM专H@ a?+T#z Ceq!xhy6 V P? Irh+왹(—!NkOdq 3B6g(sIl<*F#}Q㼨32 } 4 vN|R8v)cP@a4N5 bbgƑsd]I?)r偪8v?}8([1EŽ3*G5ݼ/ I}Q᧕΄C^099 4{5M[;nf7v :fŚ0n_떯Njx U'̧l wɿvlH$M:nS*)9S/r*5U 3-\Ih.;+5èLj=9ڌ.aX^;)!yo"kxz#y9dFSƉ,ti^ 9Ե,,G4gc87veG=>J# 7lq>b J$f"o >RR ~s2Lǯɫ+ (Hm/^P?lǀvb6gYv}hj:rԇES|5"PvݰŔɎiDbܨd¥*8SC'{;Ջ{¹'2O5-j0x:|wre7-+3Q!!*fxE IpN>8G ߥ)?WKW\͊"Yh2W4oQ+(?8!ߖ $œ)K$`%6prV2O鮇(m4-C,~@磚i26#S9fToPLĬ?NpL֧wJlbS* Ѐ'&bˑܟ&]A't!1{p>Ǟp4I:qđEiLn>@MF|}`ɨFm3(^ SރcIku@WmH!2z6g4dQ`S%87-W>0 4> =T*\6qt`*'X. X#)#s5s:>Q04a_-/yzksЫ%ɍYec72=[|L,[#b׶b?&r۬2,q2:neeE;/$OXR?xG "ɾ>vt ;wq wϓrLh>7QjNY%MΔpx)O_B%# 9_.AJ /kQFK_$w\:I,AgXfmuܓUvy$xQNIbRDS*sj=-R֥mf(g M8sSE13]` `e) '#1ee[|猪tPոw:0,D>r[+S,٠$% g#=W7wl7g'7fv 666"ߥ֕GAq %!4'T'{+WOL{FMW8i7* Fqq1eZ6z6lbkd632?!S'44B"(ưI,v*{h޿Aj9d[p>7xF5mS-WIb?2o"C,!H,]̦t%3(-|Tw)Z7_5"QnJ.@e9)3xKp"[auO"sTNt|hܷ:e V^ DzRфB*\$ӥDH(uyh'cJH&4s-ocH Zʞ2fSC_X'B1\K|I|F? ;Xaz D;|:='(l {~:.(!3bJ[=́o1rMl9Ͼr!2bg?=$вbAW=R_]`8gEŞ& .Ȅ%a2&$y2wF09egn&)Vi/?M1n-rX<H<}G0/ߤu\Ƿ %@@&P3[a]YNR3g$/7Ї/$2~Qov':gTⴝ@r%MPJx$hB"E1EpB`\7 .BRccjV#<}k;9 Sxt̅fp9js^VLF="C3k(ܟ@#DYkNLfkT2Ӈз,UDFG"d*gdǩ%38*.Wl~z`_z.Ұ*#bym:5#%ܻ?7+"X\IyU~5lhHjhO6 7ZOmABQ 7M""$PQg0cbDȑدu f0*.A;:U:S"<053˜y8c~Eu1a3{&~h!ChIFc&]~Z B)T=<< =')MaEW4puY1&%wP긹P.Y1 l fү6oag%'yd (I6 :0"^Xk|3qb[wq*u.VGK?w=>JtQEi: Õs'U ?]ѥIJ(cK4ГZ1jhq4=3FO Aur^ ĸCd>BA@3'uQEAzS&"Ujqr%R,Y|ܾ0skjT j`8.OH&8!p";Ph }8ƭQc/JdB#3,7ٵpy&; uv1I g@{§qF 0%(qӵ\}#cښX,|.rMHsI]R; x nǒ=:g0 nMzstGPKʤҼ{yQ$9|bX!ю9%^IM`e-+oD|I?,}! W!xN8u0)U/9ANeEHRb<+C9ĨmqJ_ˌs]%J("2iKeX G7(д.8ݻr*~Wfם~Pؙ+:CjS*ϦBSm'~WB $~ĢR+__P(S_r1`B^-- v "''v7$g=x9L9)DZuYO>Z&ۣR#78OK"5!ΰI &0,dE17b,Ρ^ȓk\l &07_~ %;]< ! $"6~)it mL ɝ n+d~VtXWjQ]SEO_;ǍI6HB (ڵC8ǑEcM'"ALj~=Ҳ/PT9vb|v!**ޞwaLC_$̩/`i]5J{Y  `e<]|$bZ!t=Bگ| $t'-):$RJۻ\fQ1SyY94^Nbi ӛC &)d86⁻"[?χԶ(o3>C*[btsrZ)>{3`2K@MQVO4 Z?/P[9%Ղj=H8ы';$20F do#mͮ֟ծ-*>r}h<=v%-&mN+2Byo0-a!"%aYW:<ͥ0Qw< -%@|JUa$Kc@Y8>e/ eY8_+y|UoM$W87?;'79yP;.lMzv6%teHT-%3JA:a/$cI.L~Z)My]95:9쏤B9 >1Dos]8/#tU)$MNHN#>tF+Ѫ3- !_bZulg5xv8{}XM+{"AC +\js]P#ڜ`khDt$,ZD&I9<c-AF&|0V-7Q8j ͣ%{^, Fz޵B{|"fƔ-(& /v"8?Y"Vc+y/yo:*S+a=*+<5; dDGۣ\FhC%_!ICtU(Cv*/]Xvo=cm}"Sª141:wlkeD$xnUeԟ~ UU-dO+!h%^)Ji\w^x#v^޻ .kvc3tn^=™ ?Rj 41V {RkF9* 2@&ҫEK'ƚ%(+(?Q,^?w}!/2v3_O \xL26Oܓ >WJ?꛱p9 $1/% jH4'\ތq_> 'n1(tMwMg IqX[ieB=aBr viGY"֐7ZI&Jrΐ4-]jI uŮ/oOu8V_4B[ORw^;f1!QQFqI[qqc%rG~i;%`FMGMX Ҽ.OyD/$YaPl:ѧjiLNq &l2$MQ~V쟫 d+<e-7&Gކk燖=i 6K>uX 9wJ4c~!R^~3$o>Gyo#ە]7-8Pir] W},R{%$Ctu&YsQ\.7*Ss 6GĉhIh|"XuUm(̺5[wg8+nӪ2"E|CWr"UӁFh6%ʟ𱋉-q)5# "nft{l,9;l* ҬY!F&7#0I%m"5T {.ukRxy>%nEȷ5!)%zgsBdր]) @3򮁡bdS=1| t)_3@W do=}>SF_ͧ zCn  P-> QvOӊXԉ( ٤ NØ-<s11#I2Y&Μ8˂[q},X \W?˩@$XqoFn[wJ'>Pf9n/.Nˏj v?|1N:!u! oZdO=3D̜V0i#h%ĸ&$ eYl|w,=)fiVS0e [Ĕrj,h< LA*hcP4b8Pp%(5B{g9l){Fd,cb1/vx]v~bGGX}:WIk޹+j)̀M،8Wmzݔ$m5Vs!y Fu:.>BkR䵐@i'/OX h`ț9ǽ 4qZȡ]ȋAq1AI`]$9-d`q:J&nuLGQ\\-8ou}Q ܩij@= %ss!B8Ue!NS)jH&)|(0U)#*!g}"/_32 |+4f2WXp{B 6A"-Larfb@0]V"j8ߔW#B%JhcoŐk!}*FzRBU=?RӲdT'pF+Ky7ȗ l'_V}ȩ1(R D%2r&H1j+]:u>YϹ kW?^z{mw| '/Bhs΅9|-^ ^JYH)0;Ȟ|SBBG2u 8Z<<%=-t)Z YwI•ŸC&n \9ѳ0,PkW0x[43Cl/7$m<ʲ갔{&Gِ;t{ ecž0@< xLq":%#RK|5_w}6* +*.,݄^[47D4{ѵt+:< 0X<bBM)<([$YFP ⵘ`Ս:;e U)wgN p*X$K+[F2K1I~E3]qD[@Nw[lξ-)kJ @'Q5e$Nr!UrG.*b]( pmq~!tjNo#zz!qGt2L5N#*eBQJX%cYiMY?P@֊O:i"ˮkW7;bj'1ĐmCG~F-uzčE1 zHn&dAxJ|5=V > 8(_ÎV~&zB`PGP$ƾ6ntIq0S88YYd-'xĉWg%<64x^< ;jA`%oD/rdfv M.Eѩ48. Օź}˧SXVa z WvF!:' 4yn3w iCJcF]y#mZHvunNbCWY)D^, 7 qړ{ I;T $-DbvN8eMhl-LFԅM! x#Y27!Ө;8ߗQI'4C`j}L+ScJ=A1A(yE۳6~n\d&/]+r@i0"co.ޘsOp{^TO̐*| lc̄ZiQtk5mGmC~89%4n!Fc!]HYHԂ_g{)t7!㤙eZwv27tI4,) |j)06tYV&ıQܢAwZDjwDQ05: UgQD`˫4P&g<;G+5`%Sg.K} _ w % v3'z ǝ6&U0ir/}U$Mgq8՛oSjk=YO; nCo2PgC[,e%t"#,b%bttT %A_rwQ/+U.|{Qё)>inwN.&{%E)9-"LMQjQlO72$xy`&9Bg$5Ȏh>?-)if8oG-CzrÆM8z@|C¥c*9 iDZ9tY#z)\2ϫ|u(no9kH90,'H3s֯[SeDžgH<7ø 9M1wuߜ@"kbW_HoS'+ :m-J(^XG5of3 w6X.1'L1! !@C.0ӫ+{z]t-$*LiP!l}9ǖYa=mѬ}94z2䬴\c$<:\F7$C Dr?a k. =̥H gXeT')ߎ$Nz{yPL?Z~$*q3EKp$4K-7$;V& ٞ -ޞsJEUD 3h0(OpIylcFJj6h@'<23hcdS} AD&\%=8J2FZvF?'hQխfqt!oyMݾ$"i`U1¥JoJ m]jR=οE"Ү2dRS&(Q/WN.]ɨ'|ed0?m$'`ۃ/2my4V(1~} BOM9;I.|mY?/d!i⍒#%!JuW{:sd޴OIE6NA$}=DsB~9~S\-B9U#֛ŽD^PHh9B)1DU8e։K9:2V!#s=KIL,垇o~@ۯ)m,wЌ:ᦷ/\_wi׋/|4q 7KDM2s #f} cJc"I`zB+qJ@xp`+-[[X v ]&:$Lߌ8ew6=r9[8j(::E8 XC "̎;_}rƄȐGVMs.G*r 7\E%da!9٘05f• K wyhtJÇ_>!s)3^?̩UcB0R.i)39<6O??5be8lw`RCw/Su@Ԍ  G!4wG&UE pHc)UOxܘ0y*1 [|Xs4A]ˉ4rZl~q үKi!E(YMG9rYu6SŊkK8FYD'H$v-:!njwnڕ0Zw-R8Su^f~l_wQ;=jʑd$Ž5$`Y~"ƣ J4OE1pN0Ҙ"b+# ] A4h=L}ɂ3=1;6vz !&~Om@dR !ihi-G >=gP>^*kDFYÓ%t\ĸ3ٌ A4dÊ $Y<1ȹzSxا1g!tY #yMTOp!&NQb/:;+çZ`)cAi'10o%t;;/ q6ڨ8ɡE(E9"Sxg;f*}ӃWBfrF,׳*ԇHh֘A|Y5]}dҿly5T \hMW!%ZN^ -l!g?~aiv !?9)bAylkS3O*94S݈r*LB^d} joq !Fި+5_3S %6D a"(RcLCq i>Q*b2MGPd|"F[?|,>M@,|) xǒ'T#vEpa7C3OVy91),fcFVfy4DX#GWuU A>ۿ< y uVi5&f_n'ϥoX>X~Â0 >@I>CN.x+t#H<}t\SGv(:VGt9+%(?%3(ٓɁ,Y](dys[/v@r8 df;|8V(e?5/ ߮MJ74c#5=+2\2t?d&E,<,{vf?>Q39==AQdVK7Q/` iAXǒĝF(ӏ"&;LQ .y 5En3~;2+I4fyWܟhVξƹ] @55ѓrVc@wtzfh!SŸOV3:">j/*3碲l,Z{UICzk5 #E4)ZPХ[Mpu *,c5 HpELCwr^`tqN2) `s&vxѵq*^M~3I x,-mIB[L/  { Vx;[Z ֈA!/r\/ ;(A;cdlJ{0 Q3;I2x@|~;\V(UӮap=fG@nI'I3.l+6vHxk@Y,19_5*QĸkʅoD7c=daz@6SŪ^&=hwY0&oE(w/e 8CpGOpo5ק"Z;(aJ=L1fm%wŸw%a?3p(`:̂7 `! ].9@2Hcz*J*oPP3: MG/^ԅՌZneyp2$ }!л5ʷI? 0 a` -ގ\aBi*C%|mL8n+9K|ɡ)ɎɈmsAv#; iy|2|])ꈵPi0L6S, qė?|3%=6{7|>q nQGr2KZM"5nr\\TAդenC)wa\  @@OvqޗPظ'PKEysP1Q \+ֽ e1QJX0}H3K-LP=GF0+p&s.7x:inGQO>&W5 %F/(JrW&c$m0m{C86[{Xe;?';dVf<$-s\MMWeLuu+T@%mk3\_ -g>kqN~S6iJ/3~+.3r˚SQSi@i(15'OmRy!jbq곞.;!tYI*⢺ >`F*ѭ*a k'K)Ӎx43><Nsz~ j@ϹXx˝ W!PK?6Cn͖ޟh>);1㾢)d&Sʀ~ND_@F(ʖWjOCħ ޅ7'׮R2|\-###V'[71čZx>~CY<[[6b֕ 8P'WAdp UK6?CKF0.~L*1J+jޗqn ^= պ~[\Sb6E5ǚ3&ӄv+_iڂq3rHy/C&#GN@OO;Cס;J/Zt:v0hq*h&eN%5 3ɓ'=6d . Æ,p.S$,i,xqrQ"}s7 ~J:SaϛuƿsN _Hɢǎn$t+SyϢQ w{y2-`ݵhtϦك NZ82˻\q)AH'h2Qn#S΁GmR0\e!ٴ6Jx,'mՍ0AbT >ib^27yodX^i 5e&9F0I:["Wu@O~#X l n+,lj"ᾜ,JSn;D NjmI6"\8~M[?%J\!5+]9AC uَnN]b4]͊i*`^/X8nThoV2 zt5_7C4_F̬ȱpt"!v2xaV);ތk)T*J?}sh_=3uZEӣ[3.-|K[  [ qaȌrٿ98[^g#r(Vm9//$}ti Gu22B;ns-DΘ2?kE)f{YZe%h2D%Iknꀟ'Ɩs@T~Z.?+n 2%a_1w|j,]^f6{;J~n9)ͷ=M*lJ;?79-en9&=4#ݲʸD!;BxR470k_&)jR~|t<BJ~Ejm=nRJz6{&.k ' ǃ 6ڗX)Zد0f2k(zqι$͠Dѽ.5tv<[T &G 6ʢ6}pa &r`#(D}K"ʊ̹/8D,t+n_tzW*6G,s6̭BueRDY7a@QolIx?³"s~[yHz% SGVϲ`վ>+F^]ژ{ (Yh,߸n 6z~XM IFt!g'}YÿyjPWѧQzn`\:*@q/ofE$ҭ_E]FxT4}KʈV[+kV+ z8dDHB],̿2),66 J=)F ڒ%7oZs[ttÌ3 L6E۸ץ(9hHeRZ7 '(W'z}cMrB:ME(rhpٜ N_B -wPW2 O(C FP7h%>GϑI(ZZ-,rE"喣A%07T'C6Rw\2`,0m9Ζk|b.D)1a&>8w-=ve$sr SskENQ[SM-pOhPXV.&2֯t!.;9ZBa{&R=WQT#(1.,Zu;pE-g_)#Vd<,r}؈8RJ^ѯ0޷l}7gntgU# sm8Rxc._"@*͚yY[ gV+u5gU/Ys|t6ѳT:\ 5]OHM" ]础,7tha5#"8apb 0*(aʠDClr@+y ;0)L5y,Q}~d˚ɳgg$=P!wZ}Z bdA!-M#)Nq Z݁pz!=.9@ , 4"E&#TX*Q&l4#,] #(; p㖅git9,w ,2yJ(L7* SȲ1÷~2ĻbDf3;gz6=Գe^]?ZubB] K0F ߀adZL'8=W(@$Gzk}tߣ1 ]׹1@%Jm2q]XDQ/. >tt&HWo"guJ&A0&홥eQyi|z0UQ|k`h>Q%A%+2딳5ӊ<ղ-cXntKuS+o5aWj8RoMQ5Fܞa0Rc:#0!W(z]Dp<5[˄l *d239>uUKB]q2eGS4~#U?+GiE18qIچ߾! ] ^l* F=kSGܐhgi!)P63t(YB=TiS3$;hfCy,IfYRԁE ob#nJ`f$קw@fIV( ;׬I]8#-y$ӟܚ2 tF,le@V ՠ > & LRؾ('/5R "x?˨b1<M:0|o&kWR;u>a 3/=<%:@IÌl% <_=&rHQ {X.E̸# AWX%'ecԁuBOwC%Bm.RqA>|Ib'Yqs#SRZ:35mw#'GD6m ܓEx$I!iĦU0YՃH0$V-dDTuk'`ʤZ#"=n8qZI8<V5hes#|3f5=N?,ܤYОOBЄ,Z!7~8>턆V#p*79طuO2'P;&:"G%gҡv"$yd y+AGJľ+>\]"݂C+ !X6'al|:7>;TG951*/VV!qWyڛ J)ZJ<+,t*M&aWBK6sqzawE5\UiwAl=Nx4*2j+J+!sL2DUkrQRCaVEv)gP?*S?+9·an3GcOP]g|cDQfnFd .wȹDѼczuy[W< X}(+:(,l|]taԫsm 28I207яM.ʖH֟C?rc<n\d4 Y+㹜p\]>^4g'N|KI=tK/[Ì4m1a[^MѼ broqA]BvB=:l*VGT؇ E,PzN)&dI]5+/jPwW LYcsD0=%9BedvB$%U-5 )/$|U:׈~pe4k: ~!e8T +7~AtIJЛ)~,k)еՅQH' łT4a[˻m5zS+ f31 y2*I  hMP$@*~R(o{mu[6I`$P?3iZ/R2ðFp`_p$y)e!?"sy.RFnƶk 2?5'\,P:WWɕwNE^E1%>x$--$ <{Mh#t"vIWb>,'Kw#c%m}0!앨%v&T.CFȜ|)g%7Kd1Լ05meijTX@j^= <4Ad=Ђew|ZihZՀZƅ&Q=gʄ@ @?K at;8g/ ` e zb$nÝ]MyJ~;称oj]$Z/%ќ VĿ @#qĦˉz.yZ',+lu>,%:,?1cҋM[cxI;@O$7$W{~BE!2SO)m| c-[4,yj'cvt5M$8w}u{Q\<S, m=[f<ݝ՜AR[|esh7tcde/)B (Q"Q|ekUzsZX''pI+f[Ma?_*tY(71.q]w. 6YP97 y4Wf.!go2RijLslAzE*A]m&q[B؇@NYg4 wZ7o'3ꉡ)Tˠ!XqE&l xp?d jza HH).Y/GέM7}g 1ٹQv>[3>XV},0¶'4 y@ Nn _'ɷ)=gsdڰQ.1ƫoHP(9(緄q%tLA9}qd2ZM*/mRpzF;U^b ^'즖 leb0Q]`61P}P ={f-e9&|t=h ]hOt `<dm/{r&%/uKtB#'Hx 'H\Sh0fn2^рpZV0Y=:4h<:4%LXۂ0fM݅Q ̋%H@ ..lg(x$7[%P^&"S&o1Uei-4r.$̜H0H+!Z|}羃D9Ά^:-Z< [t -umָ-wPW8A{D|8o%qKx 'T[2/%톽QٙU[c/D^ p7*znO+2g(־<;;mfbZW Ei4o1Z fE%% z!P0-P˝9>1OuG.o+0*$:}{4[=Mƒ#]R9%;Xg{^VDNn٘F^M6z'$I.A@l!6A?DĬnv*X1-jyQN3QJJ@NUW TVun:~8)0DnC2UvUYN#34/=Upk UZyz唭qI",@{jLMvN\[E+7Ƞ:͗O'$pFGS3}/Pݹ8* {"H=#1- 7h\;$lU(.+80 l}8Ģ^ Bd۠3J=jqA5Ak>cN%:TD`N&;(!DN !)o{ISfUa/plc !3*L|*]2Jڛ?kv:;G<#M4} :znhA\%g6 10XǎQaEDD)h>+}.y2-3& i*UQa3 c;.]?Tn&Wʺ U%2 Oaz>k$WT(9j'ftj/3'SX_NҙvF&lir/۱7d08/7VF@د);QFUD?=}uM, ]biueKLJޯG&v[`7``~⯳^/19xt^Vۛ`6G)Uz;1|.C;\qia :Lb%=7fJM$y[y{ڮߺ. ĸvOGPX24X+*i:H {s@,쑒,2w w6;($YX$h61T蔬]i~-Dp-%>f>*"ׅq/b 9*t\"fUԦQ]#,lc۳!RkX,$5EH< %@S'ƫU۴7! eTn[\-/umK "twE?鞝Ia 2&ݳ{HK+Qa2\VN 9jMgoۅf6ӼMJQ&$dbńLp#"l!xe*0zM8+* aV 4|\BX!u6 5fܑ54cMzW4n|2A"4!S6C\D`d>r US4j//@Ln`NƢq%)VZؠ6c+hTE:vQXg58T $+e;n+@%P%/"=a7*N.8w_?I.$Hj^Ĵa9 қg_ l x¿M{ #$ƂiBaD<öǐ$b/!9U,m0x yU t;{|Bj?8D+.lRk8%Di)'#ygڨzRfb.hs:[+J_#xS"'z J6o~ toߴXqg/ET"rKQȋ"n!NA;9[**ٞDSaJ5閫GCLTi4Ͱ2}Q K*!|%`)kD0]K\[RL㹊\)N/U@437\h1b4`ϐSserC`W(B:a pǽ g"#ҘOT8myL9(%31I YTƎr>Žl^ڸG 1nRw7I<'7pd( ﴧ5yYO UD"\0،} *0,*3nGtQ亂|8%iGE d/]כ@Q8Oiu9.- =;C4A7OD):o- >'K@y"1*Y$ y GP0k+\i#p-NAQ1 eY{51U+E dlФ9A:$ Cpڂ}*6R׃chv)q!VY䎂<b_:2Q*,*0L 2 Jk{ɑ~4/EgpnON \DTc=r o!;pJksU)(vϋJS) gLn_]/2\Ϫ3믲S^3+f[]?yDJO:U{I  x+65\r]oc* W[((V1/ct*,r2ύr#zz$ãqou"?GsތYgoA!Ce3i'Yt@gR>0LC1|p/$ &=_=MLfm3ʾ#@h-8S|&aߑ_@C}.VϬ%P8g(09Wvws5+/ $dHƷ2"<͊3ᣊQTo> X{ϕ%$t@LSf)z,'<nWuZC.-Y<迳s0˱IxR1:׌a d_Wpg-kL$l p'G =mLA*|x_-wLc7P %if-m5wg֔Y9v޿"'q\D`6]#mo$Zߍ3UAG4,IKV.0̺Wq@?^ YAj8[0@_lF+{fhb#Y*=7kXjYnaB+XtLF0gk;s@ù6cɯ+^O -[H6~ȳcT."yڱå i*1R`$\`Q^4E:iCji5_rѹ :U)ˑ!ja!L8ktF(n;gZB=v[5[)4sX2/ʝ 1,pSP(4T`4 w];Gf`t (yA TEKH>u Y)xQ=8(VבTL*r^ۍM/z4֥ 12_,MidNuQ1W AHLOl8!?;"Qi~6t(C>|'JljCD1R?sY2\1U]UEL;L;C (7}6x OFi&VJ KЅD֋ף"lD_ 0%1, y޳D#ˮL+߸<~{NБr k H6e?m?{tmR%e^bD6΅έڃ>Hԙ'np/uz3[6BuBY$sIpNL;)leaG-~q%.4;?w뻍 9H S.:yV*qh@KGC&9@ ))VOкa AhᎬiW`jw1$e[t+civNQ™mD=-3E?r{僶j2@E^6J8@Ё$zmo򬩂2NX#nD߭H .Tf'j$QZEb., # W<:)@~&B97]UFGf䲙arTW.<"{u w`W̙#zԪ){K%+Д8?lFa߄'!+5ȃ]'̜ PoDv=x8Y#!$C4ۉ1$L/l"*SAR,L>$—&;(#;4tijF;W8~l%y{vp ޑ 笏&FnW̦%)UMHc~Q 3Y,xJm!o3yp ER? ]}NO*c% sX}gNR\.bY.(.,\ݕb"~O󹺆Fʺj:23z?x2T 4]#Qphi(X}飮>`'=]FAq&='xWm,ZN@E-cW+Yߤ.jpp 1VwnIp/bPqx<-6vNOP=V r]}Ҧ^EUpB׷1R&kM^\$P6fKWS~Tn%/FqTs?-@^&B@m;Itmhn2W)b}Dl%o`\ш ѡ?cFc;U. y3+LMEb xX< D%+y:GB+PPkief K7$X 6@Ŝy!d$$"eD ^?Ů-nW5D*}-k;5AevT9EV*zgL:n$|Ho]z!It#IÀȉ-/faj,`;lA!?1O:E!7玡=k;4Q>q3kM&Q" C*ʡߍe tpJ+IoL-'ԴomzN=JV~( u60OMQfnCVO'3 "c(FBIԋ,c\hѱ䀋**<̢+ \ɮ{Ea.5楿KϞ6l9e=z-A몲#!g.ۚe?IXwŐXS`Mt Iɀ':\.to`-@xc @lM`1Hy4CJ8|hk\P :9= 8`; #̫sN!q|Tñ&F/ 9ʌhjg,5913x4^0;OEnD$ @Ҥ#u<!˰Z t7CM-%l*{}\6'b!gsy;/_ܟd=] 1Vɱ^)AW ;%^ӣ/:($nŢϊ4iaVs a_D4| .vDCD+OyjwU`[9>*7rxB1{jXYv $Ď/7TZb{fK  -2vrlJĚt@vMךN8@߉'4PH"j@=1#Wlq7L!䜌Re[+lǍE_ j/U~#֥Ų666x[Hⶒ}v+/B!^"nrښd7Q!Ti@*Gt\: =Y_&3jД5-ydfFsq N2x"r!86;S9?P!N&>kDKC)JO 3ۅSp4\BmdF -J K ascTS ҩ}7L\(5њ^hЀ|)"(GTݻz-Ej `srAv§a+3+63ά4*jlkboqhi`E ⇫_{ jM0cCR(Nui.ca{S\f2nZSR|9`@zyZhCBNC>Ltm9$<( ,،}!t00*D'-Q`G-Kߏnwܩ$N$=408HPfe83J,Tԭ6bmL끊 =#-_?`Jf`n Nj,b]3'&l7 .8jPnͷt5̱/f Dߠvd{h 3ZeѢB?;ks$M_ؘ1eˉB% ɺml.Ɠ5{)( ً*^Nlj8:Q\\AyEgcPEMC[`5Vc$Yes3h`'WA{!raƸ[+|->P@vv 8lԚM U)f68-'2 jQ$BĀ/չ!Z #>bb&t{Jg)q(ߝBk,7]z%/cX3v])2VE7B:>>]‰0zX8ژMV ̳"8q5|m =M02X:o+`+]B;Qa|? ^4ٶ86etZ ]ŲߩχfSEGC!~aq0LvW+q)@a֓z\*<&bTmvM44PR:849؅Wt=j r3d|%?!HNgȭ칑]̈́ȨN@} /_O^)g":g(Rbf]R:9w3P@qGs}_zģDQ dⴵ!O`Y'МCX %f(},"#juc01 5okK2wR|#|}KjFç^?ªr뺳 jm.#iH ;s'sNO j<[艢P1z"h;%(K+ Eqc,ˤ=L퉄aW;X1K%'&si幘x,x] .)y0g(0Wσ_辖74eG zs~E*Xi2<6an;Q7>Ag,nk:x՟%Dg^J%w[GǗA7RJVMB/n6է2ո"G;wҼ:3 T˜娿> ;5 k$و f8eJD$P&-[OS(wƑQ\-olhei9j4y-7*^ZC#TDuqv㹯Cj , ;[a 7V [[\DˋW8 hdr\hg9I9 : K/|_W #(t[;̪ǂHO;[7e+⤽1$ziy7 2~ )6 Y_p+ƭB/F?o8"($pWeo7l؊ *a3-L~t#K8[ȓة-w5]?O,OhtvQ/醳 ]\'x|j!4Oc"T/&COh Lt3,R{)A#d<)c͂(_Qwl|&64 dEQj5]Qy2p%XH ;.%8JCchu0W? t.n(M.`|’vOOѭ 2a=8-8#sT#QhsFY)L?&|hzRK-3!יO'd: 㹛Bz+Q'^#s) M1H[BSMvh&߳.a`>>Sa9 T3JlPk?<& i@fg&K٠0FiO5_< Bora[B_5spPm;%oN˕y\򒝷+C%HI}/N".=;B3.ea:E.Y\;?q|e)?|s.}\zN$\@ >% PHN܀Oyq&tM&`. #dڭb#0jc0t/9p~l,h ?R~";$b;7d]3kmmKgI-/;Elj``5ݨ^8dVK럻!vQ\!{ 9a#q=k*e)lOK*:,}'FV)q? 4\.28ƢH7X+:\' \eQp"Hng󹶈-4ؐ1M3*% 0+ڐN@ph8A} ./M5@Q(FΒ(Іl{Y}0 !P*A\%qw"sgڄȿگd<-*tQ_ cOR)oL40]NѠʧ bio R|$b"pI0 J4pK0)'k+ H,<dAL޻|3wpM Jm# qj- ~/৏"IIPRn,M9Dr9(zّCk[g[I8INxwG2@OvF2rsaY)bT>_Ikg8輑34Z}Ѝ H'wm\FF",66°\&EK 1,e$p+)"*o`=-5Fz+ZzR,1j~Txi\&)VCYxwv)փ/[t,T׃\ߠÚ%TYd;fr vjD+>v%R9I֣.'3HRZu #H{t,̙oˆ:J -sXIX_ ͈ iy$]h8.oƬ`PD'0(׺-$u4Pv8d%1<)96ar>Jw?7e"m?e#SBy1hUN~jH?v,ef璗Jr8*&Ȏ7лNGcfѱJؖ=ً؜"g#jF!EaX]|Ϯ+tAlvZK +*08'pZ6?j/Z~48O!&x+G"D:A(),Vؖ*wsU. %tR 4r}[d3<5+HUY2uҼ%s]g.sE!5x},jP.(4 zgO) ֣.]*l9j=hEXڴ#3ze=+=:eښc.dbf1akQ@qg6~ I v<:==9% QJMĝ(!J>K*p/^7oP圠52~*txLrt {0vBv?MH ){Mމ&zEi'V!3=w+)M=Uy7ٖÕ1q U3S!pc6Ykï셏|4= D(Ykf8?& $rr0 }rKP PAk01֨@8ކ#(A<_RI,ihWCrEK!G}ɂ%盺wO lc^#?H{H/BU##ΈBw$lOZ;q,ɉP`64:~vqPw$w@< =ˆ#}]d,.pPKN4UZIBr9f]HJA2l unig90$ֲ5aQ?#hC3~$-ﱌ_eqO79㻔ɿml]86`񓿱1Xa4nޗß:#y[x/^>.B2=G ,eOW)Wu9{?kJ 㡙 77z| _pN-@g"6<~\(]7X"̘Kbjay+aCrt`E1+5ĹT55 oZܹH\4z_5Ԙ!TFm 1}TZ3&Y7A!R ))HN=li1.0]R]j+~4O_Pcr ح9>c>"zSz"{? #(b&N ͪXll)pr޳ {n"eGC3kP[>H' Bۼr4YD/̸!'M ZPՉoJ(lo{2'xr0Jl ]2Ga?0O\= X#'z/$n 8(p'xm2&PX;-٩2L1Vhȃ/'.xOl?;%$;a38J]Vȉ#ʇVAKEWL%{F:ǜ+:l,*Ki$ .H_զI,-E\#H:-{{WREr|}9 m$8ZdVagBB]keL- #ǁq`AsE~_8ufiJRT.i;쇥xQT{#_cS]agi/zCJ&*w,7x؀(Dt_9CXa2L_'A7"ur}iX u8 "=S\?JCLRktž)Ol+e 3ԏ*^'ֆt' shcG6_IdvDDL(EԨX|!wJ[}]@U[!_NW O g* uP$ڱnr"ˇ^LN~5-Ra&I(RZ5Lߔr&!!&kzpɴfB:+2vWi)fL8!7 ]lvX?T3@ p[="4:XFlbJTLZ УQ L2 $+HWn}I2jp(>O0mav-9ic۾D2kԖcVӭQdy<-|Ӓ]0?WE]| + 5E--:~'- Bec-K%_6OV#v9b"]1u9K?xr٬Ӈbj:=郙cuW#5Xz' LݢD&sJW*-.V\d\m$ j]udcc'Qx9]YvAO*:I^V^=^m2#1#h.puԑʑCH۩̵f,!+:̒I{=vڳRTf?*@8~[AymɬQhҳ #^Qzi`WQ\a鉁!j+-p[ك x3Xzv dD6Yg&g+XFw JT3-j9A"S0pWuokW\).Ň*g<:LC,:KKm\z٠ 5edjpn,PP$hs!1aL 58dd-),:ck% &DVCF}}Y9u3{k-7,?[4fV{)lyҋ|B;~'Z%6#fb3X)W 1Ǯʝ1nq:gF@3mO=yǰ=E O> /Ƃi`,L`Q|F+t&(zxc6x"`x )26ѭ0qVCdK+x'uJ3>ElئX=pU#%X<&.Nдn!M )؃l..1̯)bʩe [U9Ϥ:<^M7ZB}? hfՃD$DKv`Wa\Y0lOŸ&U-S8yJG#]v8jC ,.6W]S ϴ ezW*k#~T7\-57"QcnYE,,晞)DD( yB tcjɯ(rW7L0  *i{HNb>mY"_< u'Øm7;[U/Q<+wK66 S2>hQZI A{e 6*o 'z_YrMCFKUm!аZr&V/@N!uʝH8*]Ο,{73)]=E!4#Víʗº/`zuFKŰt 3櫐4٬:Xs;(EYzܑ;)ִ-}I.ГJfrXE4Tv3KJ /< b?7ς6 G:i)zCꏓ-{cq,D(^֙&% >3MYsc ;7U2"L@DދMe뀠o ސ&w|q>ٕ/(TkwPPŊZxJZ-]!gR'P{;۠%*F$d5_w-p0py@8'1#Zʞ 7x \=̗!Qq=Vx>eОaB,lf&l(ƹ[$ff総>G`L0/r&8(}r7|s=ΨY8+`<kI#gl".Gh 8<% k_+rG+vzY !K._2C=F7aYj6!hَ5]:{IwE1!w"0$G$a:$Z\܏V/[~i*,T&_,rIO%Wi(mM7zov7qQ6"/B9d©EV"9NC&kDk=bG43$+!m 9;Gw,@&.6 u0d-O-ȝ @\"Pd]<D /zy:E P4*d(5 4UV(LK{ލׁJ5_9!S@ն`SR/: &Q^.N!'r$Ÿ&p,f)tq4Om_¢DtN3x 4Dr.'Z{e6 ׈?s+W 0E-p'Æ +Ol(G8}Y9 itеF32.GOE>RD#C@*n?|2ԑ ,gӀ 6nihڤ'?I|1[&@!EJkΡ13 06²Jip4%WCA >M9i)>wu¹Aƀs7Jh&[tfՒUr3[B PE<x0i IRN@5)* <".@sR1hCY'nCZZ%srPP9d=BT2I0)3U/xd$H}*>,Y\ -}*;Kjپ ,ֺ*Í@w0%<.$ďnLQدi54@אO/939.3eΛC܁ 5k#=9Q``'u")q *(ATx&]$Afd?aqkht K5r(*4lpt#-=' ׅPε4Al8Xh289tD#ۓ Hn[#? +qjުɵ,Ҹ(Zgv2ꋅv <#}F7sYx- 0џSdIrwj(}6Zlp"doxNdƇNU3Ñp +} [Sj%h4L5ZgNm_ w,lɡ!1i6`O|պ8XC< *}ÁʺgD9R="ۊ9.Tˌ4.Ԡ*dxxã|5 Y`5 /=0({tV )iL r;cLi̚#s~Q3nR7¿M;ȓ u ӨyʆŲbhJ8(y(HSB}bN v+1m{ٰ膙2W2R^"?aTv}H3>7_pu==ijNm*2e''wkŰ) SIC0짴~h0o\̧[oT(ʪaB/-=uHŴu0#22<&D,w@!~8nk ,^>/HޕH݁?uǧ<'5o;E]**܈"]4+iV%WX*]uyu+/++}uvF{.6B[tR: ]SҁS$uW:,b xMɰħy't#1֥`Ov$ 'נZøp(X Ql=aL8cp-d I1:ĵ挔#2henjy|8)^X*Yd^A.a=6?0)\^4?fgHS=P ]Z'{@3vϿ6$N_"11ZI/@cCx>O!үaj_>8"$]4k %U㍹ b&F/lm'P5Fmo*\O˺0UOI1l69cI 5c!v~<U͞cTb7$' '4mՉ\&+,c*TFF|:EpYUpXJ3k/54!Xۣ(ͯ! \|;zzi^9୊# T6g^-%"d1>kGXYm,hɩN@vx.jYjY7;TbEqГ:ɖJCmbYt]xbܩrN$ |<6!}]SY6@b4~ {STb-Ki4貈[0C{;[BYh)8@F !o595*:-eJyCb*8t##n2Li˂-ôx?4YQ,kw ?ö~c9>z*o3f7cjfC:2/{8*ΦrRIR">@iմPf8ZmfG+k'N {) bA"$ @0SH)6d0: F(iUoHk|3!!}nМs?@ T)D*DRzJ'OdVh=P(34Qӌ:P豞Wcjd2I@!&0>#I$b^<@&~'\F)/ ^l[m X/<60v^1s435#YĦNb`i6 ? 1el:klou+8wzUN(}~G˒6 ֦Ϯڂj:;엚"]'QP؃Z{#EǢJ=A+eS41ed$1ulyK;Fav>h=^r>٨,}%$댲\ 'p&kd).&0s=p 0SBqsazy0$M_<_\i>'oL1L]6;%wsDe1"7Uß='-Dt'.U$Q}D.j WGq8UQ1:u5"6?SJ$hl7GCx$*4聝Y7T.G>-s5AbgpF9m)ܜ H94hHK} @&>* C #A)רּt4 (oT]J,2a-EVk٪-ȩt/K]7 [,U[ KAqiJVH`N:"P$re+2y͝+H$[ȳ+d߈Ou?>S@p6dqk6^̋Q14HÙB>Φ4p#t$"%7v"a4@ј΁ Ll-*So=KAS!AP*W?B;B _ǸX5[JY;Դ(rzVcgid g|3W!q&>0Jk ,<Þ@[)QηpMzM_R7tвr4rƆѓ,{s,¯G /xsƸԼZxô* Fٻo({ \qaMЪK2Y_;m ' pr!H^?;?iqj3g~4M r;'~ {?E@!SO!X" 12eQV""a% ')n4^>3!5U4]!WKF&?`o 4I,wGr0O8KU# T3Γ+<nU1AH<Ha<%#|4J۾jF}ZEJ$Lpy a/,.nҵq!\-_ XF:;7Eu#W-c5S-Y@`BK E㶮ܞwN~!eƪxo!S ][dړFq*RxC!,WTi竨IN48ZUΚ43keʔ{ԡpk `w񙞂#?X sy JLƋX8m@FcN'ɮ2)w>|!߷#J|"q{Z-_3Z M 2uvlU⎭&o| p\!P(9Bcp~["(UQd0 3A/{\^n*2o@cY=+t\˿yr͚ >FhJ/.IgM9f1'W;~VȁXӔֵ:W.&ԁ0a&ȿ0-[CTl:.Lc 9/I,}/l==Tޞd%Et%4ƽm;]dF&;FwndVQדU/A7-zuI/ Id; m%*{fx{=b;f%/}(v~7`S+ ~cQ`%Yfz2%^nE`9!8(vP,.` C.VG*F$d+w(g:? @9>6[lKkO~Vq{Jy$ lS8HFc<Mڙ-lHh9.G<%P9Cv-&}l-S%Gw2 sv#q,CxIn0W'q/?Ԏ,أSۉ|m)W*ONN7}gze)֍$y:z`b]qm"v]xqKqn< uY-E͈{+ԴMMYKүOyG!kYd6忐m$ūw6o 2b*!EU1lܯK\AƎ0~4f~*+2Ge]wr'<:5^f[Lc㊧pdٿ2!F-?2 /B!ԛm/Mo)uzZ(8)Ʌ>{ K3_SA_)ь8k4M4LZk 6hvsWF{(- `A0s(Df\hXřrL`_2 (XsB'6@OR#ʦ\R?š9Sx7凉,"q>Ȓ}L'6 zWhV*fNNz(x1X- &VVf'b~L7Xr'=sWWE+صNv_xh@ΏbWqDzإ&P-m+a6NcS*3p͓yNO07xH!%Y|݈WP#p@x%AhMao%,`V<s-/Wł!b8eig.78:עQTݛc_e?}cۓq܁$*ΩԂ|>q@G;MTb.o.OBԉwesxkPw!9=q$6FqjG+)ng>d4\#GEӭ× E?CEAoN$,YHP\ ;y 6'xa6oOz^50T]9݊B~WA|?E5lG;vƧP[>v(b"]Q[~BGʸ$2ަe&3{Q%2]3<&>*t? W]0,gZ7^Z['4t-!\u<1 021f)|۳K55A}2^p>8QN$Y~-i;O@H2?6_;'e"d-X|y %ڑ~701+29nlWC .UQ6;ļ{°SHUГjnc"N X$JNyZ~hZNk8kJj" ^")n-ܡ0$&!Y]g8*ŮbUW6sYG$x٪ ~#tvZdḘJo Y`z֏")],q=jeW?Y\%˟Ak3t7ffbwY7[(n?_6#"W;G|UR015Ii^w,bS+m Y'f|6_ T c7\;(6DR AzMc%!U]#g0b&ZX!s `nO*k4줁|5h@CwN.I鏻 I4Bp3mA  .59;!SL@^HEA), z,AnɑQ)h_е;RF4wP]wщ*i=<3S;Q+ >eSJRo"aG &v#>(~ x;)_Y(,}Sl1N2 ޔ E| ֎vp2wphGX*hVې2%e*p-c3ҙPR:``M.~l=d{5 Sv-"1 rӨ6fWì zT*ak}Kφa;@-")0g5 "acn`A}#Z%H|Ji~`!jL:8QI*ll.ZZ"D)2H{p]0dD+&4?3 +H zt^ ;mc%; P6 PCqGǖ͉HI(*epfh2ڔ#Ny<AZkj2Wu~%z{_ZQW1S?`V wXkaK/ ś>ؒ#3'U.K:]{NB7?I1~3`45}pcQlrE/ [+>Y/h@A`m$g9&B: F<ѱ&dAImߑ0RlI0Jc*XE!oǽ)曈jW<.~_~iwJ:E#oa%q)Dԧ݈$-Dܫ˹:Ktn/ȯ'Ute3Q+8U>h ^J;ݍ8hh@L3*zCD;'J%Uq+2 C'tY֙ qYwQ.M(1XK9a9L/T9yn_5 v/`|O=/$lXJwW|fS;x &cX`;-؇.U @"r(JMop|08T|1U:UGY-pE m^ [V#!jb~jIR*i9LM77Q6α,,B\`&ukG ͅeA^77 2!8/ڌc4#s6Ẑ"HLlAc)sp|,P`q#+Z_Gx7$'8 N_5ۘ+UЗ7)abv8ǐ!osv7v[k}C qst *KTS2E6Nfз99h7ը4FO/T[tsARP@@ $b+ #)rQPffePК)m4;v#)% @~d]dsȫl3'407(_TξpH] ^ $ w|Ewin/ i&4NMv-(^qZ֮ՃɝJ#J{PASR82i; 1Ҧ_;E$02 R(g>"周~CpnEKQ^_F3<'j^RTLvff<+6_ 1c%Zߚn} ܶ@M=y/X e΁ WIR"ڰP&3ƜͻohA,jgݾ/@jʭ>~ x㒠EAV;zB,ŽP +[Hs̵j%sflrrdǵreڐ?cb.}@5+1~8#ruv:WN({iDL~VA* 4$Vb÷*V]+oܹu¬-u2дe<+Wuev֊S(S9 \5EQ{Vii643oPՠ#ckBu/%CĤwD ,= a [9Չtg)֭tZ Wp 19bKQ 3hCX9uf;!I!#] P4t 'CTw\PleA(S陹Wj9RAI2n4c({m;:ŞMIǚ2-b?I>,a$RD;C""ßٝ'M@7ximg *ʳSP13RaEwt 5e& h=c<*ʂuA"8v}&&`<e}*0+F/q0\0x q?]L5 OGa;fSTRUV#.`}gGp]'*^Yc,U9N{nf yzԺQ,$a >W(a)&7 -ƩmrC:]*쳯2YoL84J w8D@G?jD:sЭf/#ANޕUτՀe ҐDm+̣U;()kT K5*/I6_%”ϦLWO$ZM\"nG[n'y>-m96-!*IYI1pΞg 2R]gxiŰ5N9*7gF@@{G3uB@a{!GāZ熀if:)#36"LCVS WCcȠn4gaojJyU]a4dit*]}$ Wzqh6Az?jm(phY>FĂqέñI 43@%'9 Iٵ QW)V3hdqɧir*~Y (a\]xPh%+s+MQauS/2zt$n,*9~SRջ>,ޖ9E_$YyD&/t3e!'7,mwxpՁ M:QZ0E{*ؖ eKEL`en =T핚 GǾ"o/ v? ONN?&&. h;Lfynʘ;SOϢ!ϯ/ycB߿OKJs>| Vr(#KF[›;,i`/O=^uG1 yYA% 649MiM"&618SwsNG.$C_ዹ[યU=U"X6::JlSzMrUo5ʖ5a$[Hg=D||l%Fz-#ӈ2ߌ~Ǯ8O}vNد qM*/xAe<͆#Tbb:ϛNB:֑6hi,^#)zj B!VKvDƒ7_ydC݌i;8O^IGmY"#=0_(DJ3J#5k8 ^+,Lw2ܷc(66}?rQ-3S+!&_mv8#QȨ7mZ*701hзH33l0d4">YAr 8 BcO~{S!/`fњhFȏRe#.Zi&\)dq;BVX3~ELjR3>&%0"M5wT(/u |N3NUP Yp}0jcizRy۲vjd(p jx|l3jC%k=-UZ ,ǫ .ZU7r {u&XQx_@*NxҞ0n॰VT5g@7\uvBQt,UaSXB!͸zXRN>,%ʍS!N~yhM_jgM7^.`Z!9VYNybi A6tSxH6gj|49$wÁYy*m|DgH-@ݩ4bSׅuUw*`ͦsIe}'iA`#m$$Л~qvCQ8,Ymm7B^=ΙT4ԂsfF7E=xJ{| @V1" YMM) )ЫH6> /+[P OT!pe4 "h3Ŗ 59mlgрf?@(g!0;޿h!G ?P^[) +*y4k1G .!ѱ3~{<˫C߶4~̅W O9#O_KʖзK ۿ?gm΢Ib@6|ĥ.)>o#g\ {>y5Oz3Ǯx561yfH ˚A, y\!ö1ШY~ m7(3I)t\= :AmZɶE2]so%h\UR{$>n0A(E,{tٝu[QNvF'|Q=W]OS%14n -ujX鴿M7أ^`/*ˠ^=ALOe(ݛd-|R3in| $ͳI[lJ8gs!-á%\3rx]j`4kB+'9x$U5@ާkCBZ`~nPW{#`fmOC4p]+$-,#TDKF7G7M&tݶm@77%p b)%wiJDs("\o$ a./{qtA.oe+xƊ-+ٍ9g>D4_6/v|Ztp|7="# >";kۣqL[LҶ+h{QC,`*K y εŲ߆vBRʔ xV:5OȠу/K&P iPS[vD!vnd;^0L1$(Q>Dp)L權8h<=-rMU:) 3vS~REF\gPu9h| #WT(difDށ&f%3Aۤ5Hz(,li2U"?\.^NBr2xrJ*5!Ӑs? ]bgӚYN8!s4Q j'L:s҇2aF=e%)ڎ16_ a>lws]n%=q":s2nh(M7%pw&BMj ~Րn}930!. si06w) tL j-C@|i&:OaZ<\L9y&1X<%s"e*X}p>#~>{inF/Ok~ 5SbV^F;>L).Hn=d-,$62h`I/=k.[pZn =9*.u?j [!h{ q Bɐ2 b9+gABSbC'6~?H$$uR٧ZT1{Om-YS1ϑ0)D'~5ea5r[84;߳!;\Ώ1rnրA'9# :I37f@9 1q,e dpſ쐎32GOY ^~~N 7o 9`?2Oe".g8aG8O1u>z"E*]vl{AbF39Y=l7S)gC5 T ㅦـ4sm!xƓ(#\'LIa!eI)9R+^."341D[Ti;T|4sdwۺ \Г "eV O=0U)Np8MɘjY)c^L#K` a>. A3\Rzxom5YT]G\ -iVˈC#)pi+5wQ (o-bxC!?,*<4vN%289{VTNٵKA4cg-m"u> 4ERqofψ `<$5 '_D֦57N @k5hxK0vUt\"E{!łV(cXE=ꬵyW! -!1M9ZbU>Wk0&$:zdMx= ,*>E -/-ޛI(da̭w!V젪eQ;je,46ʗ2HK%Ł)|7%"M}.6t3[_E߮b$k',]}ɡE:[bmn [+@KvM;Z?k$^{(].26PɞA ef-*6rC{^< )`lC8 a08\sWF < yO\}D0#Qz&!^_Q5Lˎs|f*\ג0DgU8da_~rہ4&i[j5[G:)!J^oE7ILkҹrrوsg)uKfoF}GhkЄ3I5Ÿ,3qfb5d,aɽBX [O&w n;VUC}w99<-Z/o(C1*\ՇGp24>|+ 05ḭj-?l&-i[ƙ/yk5S,B|'pxC7{WC"h\8 ZS͹[1i۾ WE`ZjrނOF0@="ItD+|X\Ă1ii(&j 䕢6n1suc=>vóSfr30DbrL];KBʽR;h`(?$Ox@6n~CbuƯj+걻#Cf&?`ĉԺ6E9ej,oTbhɫ0+y5%i֣*E%zeH+3urkTT-N!BۙjS&E5*8qT( W"tRɷBͭaZKi#Fc4(3B+FV@Y0^D,pA?v3vՠX+6,o{8u#U7_5igCqid{ɡs%MC)6"7C gCAd?Ħ=;)o :+ ArR NuT,S($ 6<>o8QI*4hV! eӃiHw4r:'Ý$7*ЍNU>-‘r 䟱q44Q&n0MQKFA ^p | c߁|'ĂU9)}Nߌk(W$v#2P32 8coay5ӳv@)Tߊ25 ~u|ʹWu`)ѮL *턧~B(6p=Rdx _sZ_(fQS2ĕvLYg96&ʷI1<>o`f?"BnЗP'mdeK{$@ϪRfZI}+%1Aн>,.U{5]vn=)6G_kTqvm~U}%Az e&sJ7$dκGUnؕL/(]Em#UY UԓO; 9Zoۺ$6.>0vecի~%L0n˧魃g:Hm.=NW~CUV.IQc$Iz!lj]ԧ+|:z߶;m(EuHγ$7֗ Vga -IӅ˽MK+/,w>c塨h69dCPt{{ aW$gT^/e>#}GdQPm5{+,| ݰX%HƯ7,(cQ|"7&n- +Ǣ}lB,u"0,$j_|]Rx*RR+=ܷwtkE3W.uOgfg62* p <$-`ÿ`"o9uK Lj 4m#8yl*S_(AozF]W?H5M,81 hoC KND'UM!`7MܰCKNga!A|q)8V}ab^!AV:iQ 4C-2?na{>1/ ÷΀8jȄ?IE 4R~]22+c" 'V,-dw4Oe~vp*O1Clw8}nUiZۢ~toCb>JC"MY%Ϩ+^7&iLԁkdfJv;ǵӅOu0$Ib?ݠԉ 8#3H'^}|0|j ld "a[b!fAN<n?}sr&{*?I! bv `8A]$2i2m4"UqGO#!IV?] 9kj,xdZjh,bߋH )a1ſ89}WD1:n\ZO3#>Wc~k_Fř E2lXҭ%%ZEf^v%6(>;FMzopSň:/>D~2J*j6OaY L(#9 MU Z^>InZ"ќGpa9/v P5Tz%'^ .XTGػ 5Bi05RL#efo?YΪXPM$*=aOL6$_mgjWrah<:&9c Ȏ 6qE?y"@/H]'(!E18:P,Kߵ64r)V@(e3H%w^jWc\ıQ36(Vo|M2 0_{yqa Cr_lL|=7KpR y(N7n>[ ] гu2uC W?NqO{X5M0j >?i2Jjf0(1NW0B{'C|!}XIՃSÙh1Ti/-ʮ+dh4=t u(=}\> w> L&O2kPpTI)m@0v@w_ưpdLphn[3P<*蝹2|NR/7wiU%t傍?柪gAf0/!^ўpGUvtҿʴ'ѥ:IhCCI`Lu 9ʈX'$a)C1x'HMje>dۋ1.9RI>CW1H S*>=94dxia`{3fCF#A=ogf0xz@yk@b,L|Kbā5.IWŵP9{,8/m`oq![]n&_+q #V8$a$D h5Dw+źm6@d-r 5SCCU6K+ľbt<LJQ2 򂻵H"6uzRՋ饨)>c*c)*ej'5-ˮ'd"/A5,HK>ո]y 8{!?8vʦܻp+? MAuXeZ )NƐ}jL·^>1P4{}Nʝ^ĂY{h-G޸T @"22.k'^ᴴּ҄[, i?491f rk8@U~DO=#]>P-ğ>凫'#iHΊ@q$&I6&xGmik >oø0͖^HW!\F$A_hG͙K<2@7{(z/Lz @oY&>0dZ X;Wjɟ?(KDo/MD.<==. m n2]y;SZEFX8]&dմZ+%\mZn/b5 "Mv."]q͓ {{v*9ұ:p5f`w wU-:*˜ZkÄ#L$̺SÐ@xG@ȴ>1%*`-(Vj a5ro58iq;\P>E<-y֒a!s#kĿ^ cJcڃO=Wy90O,oB$£ mEWouec7trbWY'dcVreIun"EUì1=p.ξƒo F+E)M|kW~L :Bx 6Y#b>HT?'!.0{-ZV)V1fB* sP T!&t1vU$^s$Dy5$N$D)0ѽj--zޭam 3rV :z|ML+Q ]$N= nKlu#6[/a9ueOt!:M(I^R",z2{9gGX>\cjl`25yxeAY.N3ǫ>Y{ s?c\k['/քM_PO"κ5dZt{<3F21И^ 1k7$㪁)CQK~=uǏk Is@Fo&c穹^FD3tMmxEڄ܏^ 0;a wW՞@᠈Sӳ7vR Gds/%O|ZkM9(Y},[lP.p#UWqmGr,r$z:Xp5.M1lV,w$n <9$.]`I>GirwxщlT-3H׭yt"ۍd;g OEG5E9~l ̈S8 bQLa#^$h0ꢨӎfF(l,u-M<Ӿ˒2W,#)ύ3<87i<ѥZDG[7z8#"KpFOq}z'@bzF>k+d^'ZZ_Y1zMYpN|XFηt68˘l7ZMw>2#"Foj&~ҍO!N'?ʫ*.r EѬ0G1P5ei!qNV5]Ggx'l>"7s5R2߁Q6V!4V}!'V@b`ë)_!m]Ĉ%tPgzt"޴4۔dzp׃P,W~̈3 1 zh2Mͤd6!,M(D=ÏN>5x2+¥,2` sȀ!eΛ#C/ɷ?-6cPc}4`omk}+ޒ'|d,?! cdI/FpݻҶ1[÷Ž' {wXj${5>^Rsڲ9XʃhamVJĢl!&wM&¹-?vˉ400Tu'j*M3 dS>A:< lpTX⤚ fa iF%PN߇ ƩNh>'zNM_/;!ש7¦,4"`7;E/u&ʹ\ eOP9hP{n a%{cGd_SJQM:;C.KB` |٢7蜥gɞ9)piovU榈mDž~"g=$$4 CˣSk9'ԛkbX L.-Ay(FȄ%+tɂ:2_y8L˂rHmj[K#_Z'~ONr-EZEr,p^"rA epKr&7F7W4KUhMSFEI'+x"AXm)v+!àG(؁j5+REqLu̴xY2N"UE}bm5N,+ǯPeq[wp5UK]$Z!!0vd? d?2U͂*t*)1D_+]#U.؜4ϳ|rˆi*>ߖي;:06\b ~C. [qVO4Ѷ(2&a"^JSNN ,#A&>L&}U%;N~xP,./'߯^Cܪ D❖1-Rzw͈0[6TUj 6ZE}x`YT\+G:=Of|uXN )Sw ӌD&w9Z.m"NgjP"p/ۯ=0[!Atl *T ~;-&,}>T9 6h#'ϚĆ._%c/iXݩMByuhy.-toT)dS'1Xd:|HRo%٣>5t8L.ٮ~$d{'ˮ\{̯B;G-B=Z}ښ%2u W ,4\9ɘfض|XW{o6s;=#>d-+ y̢v,N A96tˬ6741T^i#_[C)./"",=)36^C,e72J:&+Y6Tw>d"Ԉ}Ld 0Mb6 8W uτune4w>PM!F v9P*S \VN|*gs)=G'|"+NBa5afI,&U Lw{Uqi]]1!lb(\oj&7?tUڪ̓@t}) {23 0߭oP"3T?G'guci߫%zfZO5j ,j1pffRm?7ض1„(=LS_fd\IK25M(h0b@}egӲbpO?Asyr!^w.PaW ď]^'RtPϩ1bO:m(3_L5v1f$ B:;H x2prwrC~=%ڶʩVM}ۇe`'.<&.$w=F`m/~:KM0:Lɟg-2{79pQv$KlMgO n# BfӲċrtOA!Aa ,n}pZQ iT̽;8S31eNAjv$#ܯ@!~_v-ǒ_zE'@"HT++Rː~w8}yw1|+Z)6DdҎՄZ^`.[R"Uy,e f)VU5YqNP*f(_ ?SmwOwb;5Ryg/櫊$BkJ In%!VHnX@!;VsMl.),'鐊ؘYG!}z^4㻺X(԰k}T$ jne ]y6AhF=%ש(ţ mLQCMo(MC$3L._-˓B@d!2`yT?[O@Pۄ2^\.)?KT'cP,&v 4R|dj1|dKjTp[ӟ8~m>^zU4F[8p!kch֚'XvY3.+]CFݼB20-!/upX?dglRC?1<=> "cU5&̍~%+ g3*}QFol/>1ޮ5;ztAjuI틣ǣf;Ǿ!Ke (bɩMt7/\F:5%y.dpB~O"3;aQ HX.:dL]#V?dJyVay9 [.$:ND_o~ ܓ'#V$b6ˎLKUŽ xT"7Dl-J~k@frr ] iDU8z[Sc^҇e'bBK|#brY2sÄ'Q+ycwnsk &n+CM%6,Y](%sHvfKD) л!}0HhrSd$@^VЛy$ĪM*$<2Ê3h{`l-u46eIraԈ9;Múi !Zh$܎pe + `t)žO)u1j-L\xA 8ѳrΣ3~q9?Hk%cԢ/YaF ^L F\{ {W(&Mvqc"{sx ~X3LknZm2pS lZ֋ . 1"v ?Fl@C8f#bC^e'W PdƠ?=k$I;OJd?1-g <NLΆ-fJc]==`.e0OAt!n<^n^Zy&+.y*ts#Q) 0y$PJ|+ us4l>s3<.ViɮY:ȇ2 7@4%Wz,w\|/BI{?hEPX.طŔsa[(Z8C(W.: R1<(\t;_ΘVy%=$ yi9LrsѢϷ?aFdHn-OÉ}HЅKmå~zW}ډT9f*NK3O$9l~2(#6pA&c92G p#[,C@ # >ʟ &.^7*UUClXutMV&O̒I(> rMٻ iPZaD Lw}z&NgϪM䋱y Uҧُ00"H!H^p+[`dϳ<^P{rfJLjB&{3 a%ϔ9(bꨑ'YȀ kzl/cppBHrD; %v1lp`\G;рAt)m EhIC٢U %f! @RsHyMVw>ԧiD*O.F)(Ц␚ԲNÝɑDt98BMl/b  r.$E?`R0pGH8{@KF:-O8G$|YZƣں^V1]s8n1w[tJ*U5k'\U#$}~t*z[fDF1*,< nӣy;yVXSf_57F8)id+u L+qo=4["%5'vDvMeLÿ!+MguCFتrܧӠo5@)J>WL ǪH$PWYS!Q mן1x9$[$-DoD*1APH~G)$m>4H'l2MncL4/6D[v% A`vJ;`{@D2aԘW/")amx]JYP~ ?-j3 ]Lkc C,.8R S$fǻ" Mt FrWEwED ~s}>C:K{fsV˰ PguX/8]:'wԕ @,\BxV $.;"$j1I@=7mq72K= }wgPsZUl0Ck*b<%N&}Q\U$qk7Sk#r5P{m./e-T ED(FH$Z>Io; Th٫+ mVM%i%'\Mi>UЖvKȅl8C+o.y144,+Y`Jӭנz#Z%>n]ykHٹ ICq٘,Zdfn0͉cX&%O O7S.E^{ 1Q>sx W11|i"fy5K~ l0~|VXD+?cL^Q258%"ݬ'np6>zJr?CWՕ 9e]"p sUO lZJ; 6u* ~O>P[v# YXо*)5Γ13'&*wg7RVBK47:!y8[VߥUwň)?],WܡpmGCWjB3WDG{*e& ,N*LvM.r me٨tMͷ4_zyd(eZ}S!{kaN% h}t2{}ԧ 14hFQ`?Wn2}^<mkq^3'd >8v#ވ 8a_Ɖ%Uv?1̡-N׆S-x97QS=ǣ ܐFF S srTω&L&hf5XX㍩7$C,Z0/@XB\,nmTp<]hwL+ ~v|ܤ([wĔr%fBd# v][rq98/"R,yrޗ5"s;iUSIQ\PG$&ucb[_%&o3>13%޾.#;2ضoʓO$|`_@9 VeG2ͅ^\M\;u$#m>~@zvsN.`SJbe-lCW!QT/9phpݺJ8#FJtcҏ4J-O#fAf4_N.#Ƭלb4Tdz8c++ {H:* \ P=ͯgṼ.t`??GW*(Y+ RF6`A'-B55WXAV:1S޸.KÚ2mAD{ui~>P9= j ])'%n'EP{MXBc0w`HlY"kLW$`ҩj`s=K V B㗲VHp#"e$&];<=4dlZL;ʬT+##ҭ/4Jt4#T #A}q_)^F;a7ThYH&ڑS+?%يGeŻi MQ~Pv(6.wm *'QPa4yT3:Kze73Ҽ  obM`$ݘ?^A[l¿\ ̊+b`x-_v2Ƈ>o']Pmȶ:x8m K?1Ee8zoop=d #Hg=D~X w͋vg,/L  =2Vr7=ݝO_&-[K8VL"0BT#pױA'3 !]+}Sf3|4ΌM^O(1y@hi46,N0)s@t-D19 (!a A2fMɰPYkp'(%{!~M"=?Md]L1r ZaZkYp :t,Y=H?}J,1(|fhYȻȃ&IZ~,w 3@p4$0۠]CxR! Pf*jm-!}QԸ$F{㵅S}s}2]pf '-(z[#(1~t 8d9yL(ovhU-v<X#2ʟª'8nnK .|L,x|8s;$ʷy)& 8?퐫mThNjV޲ A[k#؏(uu *¼v%_Ѡr6F+γr 4kK.g{wu]6acg@w#DP} ꮙ }ωr:?5"yi<xUUhX C, ** SjQkÂN!OPTR2s5?BZNTŢc`-`1g!"gb@w{(Vx^):خ)bU~͚6kֆ &m6g241$4U*n PFT7 puc /.'ej%u $WiE(Rs(yaqn_ ,S-e;&2gP2*ع >v ׶%'Dx =}^A+Ĥ?'fFr* w߰&&_='0z`,9?T]c7c Bx1}gx7Tr*]tֻV9><0_"5e@:Ap;fuP&K7V+~Y!:YLʿ˜0^++6?"i߼oW!%<j[ۡ+'+b>- ֥4J%ĉ2RK :TxKO y/Z5,, pdI#)rcBfW;x{7" `P)O%ZEþwV#(obH\.,Vs.lmu,g{Z9Ի.g0d[ON#U?;8$jˁJŽp28+*OȍF-n|>"]+7 j[v:1\8m)g5ZzBHҢyp. %D>^#6I 0iSچߗO/UuNgy6,[1q|য়hn׽]#{"vD72&.2cZֵiKJ"Sn0'ANPLcQu403-+^艼hn;adiA|:F51֕%z6rER#/"| QTO!K{DA&llz*[Ne#**bu0YjqWc䬴4u,S"H3W~)xb9V2%W Ug+E[~m'-)*x `f7iZ`۩Iur*h px3k9Q+raCA) N(eF+ Ň%sG3:T>+kcjaY'6(YdHֵvƅĹ/1C2/%Wx cLck,8g+<6~>>r,^6K@\g !I]D' =P^ œ3A_j4|1PL$s%c߅NE[QabD[=gsQ q }9k6Y&[AuS%NwNd 0_AI/rq&D! =|X_\e;熛Cr) 5M1%$Ys%yhT-sP@~.=*0.-T^% i͒5:&ֳye}{a{l$-Z^̠RBñaz -0)vHg^54-\QL$9s٩[luRb %^ٲ#.PZ4gC;XK5Wk,Ŕ9dyI0xpJ.mt7MRy^L*p!Ĩ":Lf,WV+#)5c*$+I;{g+X4BtG`n6%lWSztscۉ,o"Q.GmԧQ6qF85/_ŷ rP2CC vEC!;%HcȫVԌؓ) de$o`+ݠ<+fY, p3^v|A۟4&,Fр{ (6oƭ[:3]; /"Ja(8i59Ii=G2?o"^7<3*2q&Čԙ7q?t+ł${ܢZ؈$¦'Q6vbݓ _L1o+ .ps12 T[iPxΒwuw9L=AoAhAR ޖ/ڸ& o' "OҦfNz$< Tg0J16P]K8pԀ<@*APNT2@OLU$) #%qfSBQa>&c,*nt˫'WD/ #@be]N4p|GIQ;(|_zT& frLy-6$br%[oݨ?zYoZĽq ).Q;NX15/ʷ15c M93De%14?n컁tAt^($?n4aJ?*ba};}>Rv2-:n<9OV|?Y8e7qq>m =lǯ7#&~'Ebq #^&LG,/]1NA`U` M!¬3+6~$ 7>Ǎ _k=P\5\(TKNad" 916fUdBs2^Qz*P}Aćjo:>`?v0@[cؼ5tHڴ& jG|1Jޏd5^!*e 0#DܽճJU~6)$! ?법 SS`a}+kz48Uf*}ӏSSt\\.r2 ME@!!y]hٞA7((fViirt0px?39'6GtT.Fc 1xZbI8jx 'n;' (I=`_Shc1  2^Lx\7{hB| cM>L/Y bEAA)h0˖I^PBl'*jp|3|"q~|dIuR0zOL[jrv+Y R'=p¬QPy½1IJEWBVQ|¸.&" &3-~\&mz!%󦈺/k/]b Y)/*;C]t/xOzK7;zn*mºI%Zc3uQ;#8]vʔuh s).1<%[,^Sg3C:%W^ ܳZyta@W]=ܛYaj$/t |yP%mI5\M0Wz-_:h%)۝En,ɛB 옠8<ĺ!+&Ż] p5_#u)ge8S#p* Y$ywes,gy>(Y du" rnW>7 d88g ^gi'ѤVE'"(}F;ƽDl)zrqNh+?s Iq8HpٱtO>ΆaW\B6oߦFCmS-P&(@Y! :JT!I(X/ * Q1D$E$c\3'Hmx=KQ%>`eɳ>5FW qu. ^SnNBVt-m(b*t 5O -b6ڮo#2Sk82q5Q8BLÐZ%kKmG+?0g2_#im0|zX"+c,z'|q6N.>|Y11NDWbb_qzATGߣ[=ސv]Ɲۆ%0ٔkFY &]Uu-Դ)8.J|o10["9 4&\ ~3=dc1ks9e>C"PF(AkF^~4# Ԫ X2vRo9PA,} UM'KgGz~Gs;D8HvU8P,UWlLCLŮlohG#jdw*mvڇʊB}+Ј8>uH)dߺ'G)}-?&]06Ru#F-I͙Ը":nW+:^>"Rī|x@@ [4Wȉ-*yg֛VP'~̐rA-:lZ:s5D`1f!7vy2ŤMSp!'񸽿!#S`")-'/$n2gk(u 8cj@4N|8̝qJ,r#u9;}B F?ELDNl҇ʳY9S(BVD&DfbiL_`TU3S2,W/?:8۩j ?Eʟ{v1m}ssq)Fe'[V}^a6]LxͳT#1)!I+t*D),>I>w2 M32STBҨszx,4&U.?!>g)*,;v ©0bjp4ȷtӟ| 2<3\}|!YT^Cmtr&?'H'jo,!9/+vݔsIϓDž/b!Dwiy x9g; ɽ.#7U $,QMXby % ]# œ"8FB.3aY HTwJcBlK8+!+R9y*.0\LZ)G6u[}g9-}7$kjN!^RȲ\⸰݁.O\E텧b5*fzDTz bf4hg4ZkptŨl-hD[}*0^j p8r*5ȼɘ!8)=(R9KN=udB,+#'*3Xu&Y3\ QF~|]_X3 p/$s+i{ޓ:\z4w,@(YL;0V2?%KOvA}8IX:*Q2/JGtV 0BzuF>=rSUS_,qn$VDg4~il LO'N+(_b%x , #1bb5.֐hYmV[98e9k=}=a4݅ړW(,#CXApc&L:xT'm[xdQL/1 ו)qwPɆ2}; f_; 4blfcJ=] .%ϟ}% h@FMً>uynu Çb.Sqi TƨP;nҋ){:SaH{Q\_A7 OcW,$h`zڧV3w5<Y88-ј6f#[ً[F49Yk" 3y 9bWU1gW4#/F[c܀h6:mp}A-+A礰,b2f<aDzL]C>O!7}_~i\jU-j[Yq"8]yG#"g:kD2*0M +4ueWdjfAVվ4|cKL6,@i֏^KܐE-lτ"7 QDG3v WcK]5 H*Ke Y(,;R5X2\K'OF53O&wX\ jRS!wy1PPѲK!#p}nwCsŞ'Tz6e)&:Jv1$*N_~ g4XSd.e B ^V:Qֻoh* .h~ݦ9 6.Hgj׊Ȋ4(9ޔ{}^3P]9'~E-z2ǂڜ*F6 t5prޖK"?qMڋ"h!6K^{χOU',`JѮ*' iN$h{Zi1-@503b-^U14DL><Ha~qB]#\YS[ذO-&W87bfH4,/(]Hs0E~{xA;^Qz߶ɿ@Q/hךK0'-v7:z$V%;HR]~`JܩbH Mz$ڦIj6ST{[mL[JJY5.\6Rr7Th)1H)򜙝9ZRSg겢rY/͙S­$wp'(A_9Yp@( 3 --/M17>Cp }~=QrDh8m=^L;&)'3o2 A#cL6+ fp^ x?>yBX,d_%6Y@ v%$ VK0®7[!7hגȕ`/[9m"f2=3jE9$f7:8(E+_ D\sײuHpEn z:W,5<0ƏIMwfK"E]Dsv!8> }q5 =-1eQJsHAkIo#.-x=`X1uV.nM&gxZ*% "42eg&PUks} As|2M"E@|oſt[Am-`F"c aoB{pEX.Lh4[q| 6Үp/<(&j2,ʾY'a\)cʡZ7иy(ŷ ]ٖqNZ/F ~& R?YӃKh)A%4_I fԎ/xs$^F3j9df/A^v [E/r;V-@D+H?{Qu@Vh=h:@+Ok4yiP'5|e!y oMBI⼆׷&$d{q^[Pa28aI?[laepI>-} 62$>zXs\O8z"b@ۍry=PC1]?<ȡ.vc/ǘH(RΗcLu}t_1&:>:T|ieW*>}|_ j÷6>|HipWd>gM2[76Eέ["RDL- Mm)"a2EV!Ϫ?BrAgL9q}QUȳjyPp*Y<ϒ?K3t/gɟܥ k`ŗfҌ5]Kw qm{T`鸶tt\^dUGR&p|FH#)8>G#g$Y 3vjH@I;^lA m( r v6W9[qC;`J7Q'r[ΛpDFr|MI8\da$:l%p+0 ’sY[aa9\s,Dǂ.c9޼Vcsswz!o^+Ʊ;Hw7y^Hll]q[Q 9>676Ȗ=7*~d˞k eOǍ_|xEDzċmZY"=~Fr6-?#9bmiwEV՘;"U [j[w5lCUBks]*!~5?%1u)եv ŸG꺔R̆OtLu]Ju]fCf1G~JsJOPGט#?9'٣k̑?T@3c? dЌ?vG2DXOihFc,4`О2}*G0hS>穌D|wA xQVnUI_UrE]_ G@:]]նnU:cAj[n*NWWg-k7[XPDZZE du"--"Ei:odŭ] |% +.jxxqkwF_Š}5 -z0m9MFU=Ķ{sBK& b۽vNMx/U{$f0K=eMq32ɦ8zgvOwdSL=PW2F{?Tտ=hcL{0-4 rRޖ_xۏ^9)Lo/MB_ |,Kmf>|VsB3K{R+wc%=p;H&λ[51OP+yݭ'vcҼ VM1J0b$v X`UY~S|, ``)>]!M\Ƃb.rm&.cΊ 19[% 4s`w[zVIGq-M=\Gndq82dY78U@gY*x3Y^Fo\"/Flk7._bo#/oKKz7{vXGFyuwb=;K##⼺;1a%֑cq^ݝE.W6Rr\ ^wl}9Kջ TžW kz-Dڹ5U"SHƚs*vl$cMeT;q6긨(9wAP~uu\T k(:.* uDʻ%2IHT Ғsi$$niɹLU*[ZDKN^wÿ-%c';ߖVjђWoK+5wziĴ/y  ;ZJbڗ<x^Z%1KvB[cú{NLꊭaнK'fuXn}ޥSK1t)sZ=bg9Ev 3]ʜVg`i;.eNQG3)XfpCK,΁Cgu@z%Y@RKBc)DMy%1^_BԼ~ /!Q@'|v4k凌Xn >;5 ,r͚{ie1:knʋ D NeA~"[b2|a?D#o<Ud^wH~tg2Q;$?h:OUl*;J $*J6ڝXv%%JN, c{uݧ]-݃:QӮAbiC{`oNT=,$vꈚ)|5yrjR;uD<9K5Ib:f _M/x nN%+4ۂ<u'mۺEJͶ`%IbYu$S,nEcX{]@xĢ1T,˽. @r<-@;.{tPu ~i=m:(ЎKyM9v5"$yd^S]zDuI2r^ؠcVJ*m<l1+a}J6ҰJ>%vxzJiXm;\du:$%'Cb.2:]!1IGwIs}hImdTp I62wj\߄$ZR;\|]›})+yh.L[Mľ<4_&b_Jsb Vx/e9n:Yau: K7٬:|·lVX{H= jIhS\ 5$y`B©lnZ` KP&h&\e(KB.X2 % p|iʄЄK8\ny.D?ˈPo ̼ßeDf^Fs*JUI_9i$ Ҵ{UWj}{ͷZDsD-Z^gm\ou{6*b.Kim h16A_pJ|DRZ/DtmV#W6+ aw̫]~~0ˆ;U ezxʫ)iv2=BzՔ4;H^!j_kL^y554Lk^ zo I?il7`$4ׂCfF6XOr3܀#GGŧn£#S&†W2ı.nN@a+eX'镲 qhDJY8m4bX9v/$1Zd;OnV-K7AzGzGzG= ףp= ףp= ףQQQffffffffffffff33333333333333??Oc|>8?NOaG#z=,1?KL?x}^_O'k5wɚ;*|Jnt?C!]JRjtC)5:S #)焑sHAk ?zZ?cR1_ϘԯqgL8~7 G]xEc.b^Xt?v:k ;oڂ7 F#NJDcEXZax0uV.nMz&?[klŭ56Yd n2xGV7f+/K{Ηϥي=K` =@v5{ӆ H½iCm] ^x6Үp/<(&j2,D Pv?" zĆZL;K?/b֡I(xU1P?Ϫ싘u(q ^VK52]%Or ǧusWIS:ɕC|oq%ʡZ7иrP-ߛghwI<{[  NWo?=J'ƫւ[ 92ao-͜mCưfζ!c[rsA3g[1e9CG߸e#o\{2~A7.=gGYE5f,݋]?E@yr ߮Y?Zo@`M7svԗv9oOS|͜]u7emԆKSG6j%p #hyrp B?(YĮD4/LN>,BbE"&'OJ!" OrouU;E:MB֪"[i&!kUwxcO WZeҋ+ӲDpjp•u|ia"b58J:>?高 fv&7Ucw 3;LO*汻BM֎~yM>kqk<զIx㸵_j1uX;|R9I(t>$_E^:TeG|}"/J$gmsmrS69u ǩ~Yw[\-PySɘq`D]ȩdL8Tm0.T2se*6Qr*9ҫyt:}!FUJ:D^%urH{1VW׺II]':jck݈^̱յnDRR׉Zx,-)V4~<MXdv?KKc&M,2q1js&8;<AnT슠p`~~vEP8[FRJKvP[qʼa)C_%;Ȍ8eްҒVdF2oX'nޓ$_ +I[$lWCnĭ{DE7djV[(~[xl2i5n--<6cE,,r]rYI{9.˃a$l\Vfί{^t3ڇzd/{Gk^ 5{vQ@i3Y =(i贙]д~mtLVxCey#FDYQh 2ļ#"׬ubވkVT!IWWU`Ð? +֫* aHUli0$B l4LV5yg&yeǃPȁ[.:?(d b{-Ku=r`疥NdzKw4;;O2Х;qB]'^͎8.b؉&~De wetq?vGeɻ2z;ѣ2@Y]]='3@w~2N~ _jhL?/]_LC<Պޅ!?vjE¿aOt;qw_ҟE)6-VgNŢybQbwSs(f;䰢Cwwܕ+rX;JЕ  !!!""""###$$$%%%&&&&'''((())))***+++,,,,---...////000111222233344455556667778888999:::;;;;<<<===>>>>???@@@AAABBBBCCCDDDEEEEFFFGGGHHHHIIIJJJKKKKLLLMMMNNNNOOOPPPQQQQRRRSSSTTTTUUUVVVWWWWXXXYYYZZZZ[[[\\\]]]]^^^___```aaaabbbcccddddeeefffgggghhhiiijjjjkkklllmmmmnnnoooppppqqqrrrsssstttuuuvvvvwwwxxxyyyyzzz{{{|||}}}}~~~H+O{UoB;ؗ7pap[ёVKlw /o.w.# ytAEUqrV_p&&K~RKnG"7E0.]δ}*.܎En*(aʩ]D Si, TJ]8/]U>P”Sv@:>Yp^r;)|)v@!r]ޖ!XJrX;JЕB亲-;C%䰢Cwwܕ+ue+{[vbK(aELJ+AW;xFybQbw/wd58NŢ:^k@q< ҟE)6-Vg4߀@I?ӐaOt;qw_hJ'+~!?vjE¿Д~&OVI'LC<ՊޅnCiD3eL?/]_L e҈fPN~ _jh@ ͠R='3@w~2Tp J#A.{8=O,f|egB:sf`=F 8:Lqm|{ q<3tx&'װ4ǻ:nPe14k;7!DZ=aci9wuܠ3chvnBc{\ҬsA gЬ܄Y8q/,[1XOTxa Z^@;_Xh b`v$8#l`>Q-ky3 mV7Zv~fAg$o^&L&ϫ ^,H1Z ߼jMMW͛t$=E,H+Xe\Rg?Hz8YpWR?Vʸ~ Wӑq0"qத~BcqIP#)daD]IX*S"ayg&yeǃ EܧLV5@L1GO!imj8"@=OȀaHUlizSi Ð? +֫* =8<- !IWWU`0պkgubވkVTau h 2ļ#"׬d`cWey#FDYQȆƮ^385 F_(N'Vߣq=(i贙PO"?G{vQ@i3Y 8XE~~Ƶ좀kf ؙDtLd/{Gk@3ى2{^t3ڇz`g1e fίF#7z*˃a$l\V\Gn GTI{9.@ ,,r]rY4rPY 'Yd%M*7Cxl2i5n--H J>UndjV[(~[4} ɤոP(P7=LU_[$lWCnon{I@0U}='nޓ$_ +@Tŗ奔ҒVdF2oX/K)C_%;Ȍ8eްQ_ZwRJKvP[qʼa2../ }젶"3yoC^R [8Tm0.T2sh!q`D]ȩdLBzI1,l-PySɘ@Ap ǩ~Yw[\ ʃD+S69u@V$gmsmr*H8NڐZ;6Mjt>$_E^5wl|R9I(j4*?s|yQb+%1TS}bѱvVHKcL'1cPUONcDQ_vwvd!G^7mR=CNo$.F}9ݥzؑ{@H]rK#C9:@AWuV:qXk.t/]./]Zh?a_'EE?y 6%zE9NF'lJދr!8N,|㸵_juO*汻BMs/눟Ucw 3;L@^?高 fv&7Ͻ#~W120Mn)YӲDpjp•u|)Sާeҋ+RdO WZz[i&!kUwxcT~:MB֪"rouU;El2J!" Oِe,BbE"&'O !(YĮD4/LN>@dCQ]h^<}@G#hyrSG6j%p imԆK9H"OS|͜]u7erDv9o >M7svԗ J4kQ( j+R-Ǖh"!PV2Z_+DCF4dHܿW\ˇ !zD@HC?%$9~J< qZgghmAePKڞiğ/[H(6'S S$g_QlN@< HϾl!!3؜LxNd}BBfF90PG+ڦGAqfc VMF @hǭ@lk"HR94URj֘Erh髤81 IWIq"=u)wIUzEz Sﶓm'V4;NN:ji $+v؈KIW ) >4̯a#/n=(#ym@_v f+/?6˅ M@<\l: x"t,&4pEX.Lhc aoB{2V߄d7 q&b(lL67P ƙl$2nZN p+ŝ@;kVP[;w­w&K" 7~M"E@|o,ERo3ddNgH\PP 6rmC@/\<@ x9?(r~&Peg: 't@O ҷRȥoK3 sKJ f@斾@aQY@ )¢REevf iBۙ7+ TW ?hh~,R^)Xn2x Yd @@[klz&.nM1uVbxXZ#NJ F'+ ;o@v:k tb^X.]xEc~7&o8Иԯq1_@cR@zZ Ak҃*焑T #FRjt J!]@Cnt* T5w(kP^_ @x}-1Zbz$HaP N@8q}dP@gffffffffffffffffffffffffffffQQQQQQ> ףp= ףp= ףp= ףp= ףp= ף{GzGzGzGzGzG(\(\(\(\(\(\nʡEx&1Zd;On0$ClMbX9v/$_I +S㥛 rh|?5^I 37d`TR'镲 qh}8gDioTN@a+eX:pΈ QI&†W2ı.n>,`n£#S3}ƅ!YnSr3܀#GGŧf B ܺ:fF6XOdu7Oup>?md7iXI?il7o4(ȯb4Lk^ zo ֓GߤiP4`_? 'i֦PApiFPF4;H^!j_k0ùҌLiv2=BzՔCasåA6 ezxʫ)7y48>]~~0ˆ;Unhp|iau=M==|6+ aw̫hzzztmV#WΣ4ڬ4;F1%])ɺ^d00 h16A_pIRu5Ȯa`*b.Kimt'jx]T#*\}%Q!l\nHg~ߗ&D-Z^gm.Bظ*/MZDsA]qU" ~_6j}{ͷ yIXDmey뜊Ҵ{UW4>8H9i$ 4i'a}q呮s*JUI_hӀO"j(#]T=,/C{e;E.D?ˈPo ̼3Av1맋\nyg 5cO/#B%02N*{qaz7X2 % pT;oe(KB.8 w$s` KP&h&\?c~:N6Jy`B©lnZ}3tmS\ 5$ g8!(= jIhAqBQ2{N=`s%p1 `6S8ʐW K7٬:|blq!M n:Yau: 4L(C^A(/t>du@'iBn <4_&b_JsNH#'lqyh.L[MľG O5~gS|]›})+맛ܾ Cj\߄$ZR;\ mO7}‡ I62wns*s}hImdTp,=\?4U7 R&$ђȨ%vFSR&2l1+a}J&ϧL P=0yM9v5"$y96L}z`r#kDH!7^L~F^{tP6JoIQ-@;.kz1E x)[OiAv\P8S Ae8nEcX{]@xšq:p8c$S,CtO')pƺ%IbYus`(C͡IۺEJͶ`.PCCo<u'm] 6'/x nN%+4ۂ)9y k<9K5Ib:f _M Sr4 :6B5yrjR;uDh t+lj,$vꈚ)|54L3g2Q;$?h:OW+ QI}4Ud^wH~t/V?A㓔hD#o<^\'D')T=z!GFyx\@[n;)D NeA~޹̥΁vSnʋ sKl1:kQB3|/! ,r͚{ie3ǣ g_0CXn >;5eˏG -`@'|v4k凌8foFԼ~ /!Qq9 ,My%1^_Bsl?Y1RKBc)D(4|c4 4 Sx 5.GpCK,΁j\3H1)Xf8 fc];R>-:q,lfPyv 3]ʜVg8Y([ Jg9EqƳaµ3U9V7+ƲuC.? ypw> ;ZJbڗ<fA|{,}"wziĴ/y  LYD,k*i_2B.e)22t%c';ߖVje@\R狽edDKN^wÿ-ˀ ,{Љ*[Z+fh\niɹLUV Ғsi$$<-# sʻ%2IHTXy47C[ToG&BWG/wKKΥeE@DnT.wAP~uu\T0HI$, w\긨(9aIYlRhYCqQQs FPAE$e%Hƚs*vl;^I,!J5U"Sv B5 BYB kz-DڹkϦ Y E Kջ TžWcמM6n; ^wl}9Ů=*l d5v5.W6Rr\]{6U j(j 4(x]m*O>D+{b;=;K##⼺;1aX1|V@|v*@{vXGFyuwb:bT,Ą- 6i1/Dbo#/oz'0mx5c_f/Flk7._/N`k^Fo\"0vFɇ{0[iY*x3Ya쌊`6Y78U@gY'lm=ndq82d3*N>\߃M{dWqe$N;?_+B`w[zGGwR4Wd[% 4s8|i0 ɶJ:ߍli):& f#p5(>M\Ƃb.rIMA2*FjP|};+*\ eTՠn4q vVT!5Qzi&=hݴX[qkgTM" ŗ{`=Ui F1멦 D/zv`mmĭ韍bSM44_D#W5}9'Fu=p b!q&rN?ҍ":{ &,gVBL$$Evu)LX*7ęHm8t}dSZ7x\8NtqtqȦn𸪯qޝh'БMi!]*[|-3S:&c:R] X`UY~S|UZftLt0b$vrl7N阌Hu5`aUeNIJ"|c$\_>..Jyݭ'vcDH|R]pk]PH&λ[51OP+(p}ֺ*Mwjb؍VNc ,^% B3K{R+wD8:`eAYJ@Dmf>|Vs:qtȳx |,K>}JM[~^9)Lo/MB_}81n3нrRޖ_xۏp);b6m)f{0-4 e0 z˒ Tտ=hcL aHC%)@F{?T/葊.KRPW21,_#];Ad=oUyӝT32ɦ8zz 6;9%{$fDBKC\KU&:R-hb/;+#S-&Q?Mn;t:mY9ܪtƂ ݻu|c7 例ػ>_U w-n}w#~}.S2t[f@/.bG|U]8ޏְx+7| SEсXI`О2}*GnKVAȣ=Oe$T任}˨SVЌ?vG2DXOi4.QUM4: di\.OiZu@3c?ʮE Ul ٣k̑?T]1 @*$bGט#?9'(%bV?THf1G~JsJOPOv-J8Ĭ*d]c甞J';GLŸG꺔R̆x|Nxw4}vi?%1u)եv r+i2 JcRK2~]Rc2 ɇ]5lCUBk0ƒ *dj[wU'waJ%T($v՘;"U [Km(ԟ?#9bmiwEVۢ!P?/"=~Fr6-w,;EC P^DzċmZY>XwHo@AɉkK۴,rfAOXd˞kb,MMs6Ȗ=7*~%yY<cm-{:nU<#(;(4xrg2G|r|" ̓mnvQipelE1D"'(7ɝيbD00O6/,(lcNtw! 8Z~HW_S#Y|2CF Zq8)Ge+78h!q^}M)Rd5zNNO. 1mnq1]c%2R l (a>. #89=E,`ǴKdAPz 7bhm>إڋyT% jvZo|KE 68(J1X߈`j/5ll]q[ΛpD&5+., i*|7Q'rLjVFA]YfTl5:#;o>Nܮwts߀Gf!e r v6]W!B^lA m(p}IC*ق/2P}%3l+QY 3vJgٶWNh;#)8>G#g$ח$mFvdUGR&p|FH1QkĄ)V|RAtt\^b֊ S T`鸶DP[%JAw qm{Z+&&LK $P=-x:uSƨgɟܥ k`ŗuBQ;4ϒ?K3t/UMvhP%6sf$_BkJL9q}QUȳjy ڕ6ù?BrAgw ѯ+ms2EV!Ϫl4c)#;|L- Mm)"ah/4SFwhaέ["RD_i<2[76EVbFOHir!/0]pWd>gM ŌB8_`>|HiWA=!Ʌpпt5}|_ j÷63zBJ j&9#Նomj=ۃ5`SH1&:>:T|zMk3*ΗcLu}t_%nրMgT"/ǘH(R3UdLQ<ȡ.vcBgnq_9\ ry=PC1]?Tr3qGv8z"b@ۍƿ=tk>zXs\O5!:%{`-} 62$iCtK-[laepI>Ұ7쁥[$_ӷ)g7Ú|ĉ.( flQ/MT$d{q^[P]Pآ^$I⼆׷&',E4QIP!y oMBjgXSo%viP'5|eBϰ WFXj,t`c}Y|s }jiꍰX6x.|7 n ^aЁme%\n7RcK0-I+O{UoB;ؗ7pap[VKlw /o.w$ WFXj,t`c}Y|s }iiꍰX6x.|7 n ;^aЁme%\nu7RcK0-H+O{UoB;ؗ7pap[ґVKlw /o.w# WFXj,t`c}Y|s }iiꍰX6x.|7 n 3:^aЁme%\nft7RcK0-HT!YU>G ggb“uaʒ$ .C|!@Ί Ą' |Ô%I]PdU4B O)KZ$=" ɪi89+/8, S&I@% :cH3;)qRo"CQWJ@twǐIgwRF:D.B<!`奈uBK\>E]:LgORyZ䦨E 2ՙϒ@ԅѵMQ%L9hd3c%?J %kJrj."וmB5.$[] (D+[۲3k\BI+:>tp] P\Weg!ָVt|n9;t%leoBq %9rvw%J "|G\ڈ>\,JYl:@E,B})Xbbu@NjY Yú9sE'nj f29.EZ%qVJxd>r\J㬔71| iKY) k wnVc5q(*R>c`Pќ;W69 @ ,'H0ǣ9Cw 9mr"XxOBa:Gsr\uD2PCsr6fx_ l=#0fm&85l,:.BzF` MqlkXu]|7(ڑhB[D` #1񅅶`++ /lX hGb8= mV V^؂, ЎpG{ڂ'*c-/X@|fAjUk"no 9̂dͫDy5߼@r6FWSjWy3@}cw%cK p5IO' #7J*4Vُj:"NF$nܕԏUh2.)1->m|f]p<b9Z}: AxIv٪# )h0}kCnk] $PyhEq_|ֆ<ֺ.H 8ъT yu].cӤN瓪ϱOUE PsǦI'UcȋM;O2#>>W%@&w:TeG|}"/J@\lԽ>ztOL#: {} Ud:FtqR)>1uX;}#v1.Î = Fbԗ]z)DŨ/GT;2Sz/dtZ<Xwi~ 8芵vy~JG9qk8bݥsv% +qźK+8K`S^d9qb1@D(}QrbM{Q"lj<_vSm' jd8n헧?O>~q/O0?I_-;L^'\i]2%}Zv.X NҺ eJ0\zpu@ʔia"b58J:>@P{+$d /r /VZIZ^C_N*`;1 YF"$vP$yar "EH:HDD6d%u@'t:@P.[(H[=um#/6\PБzF^Amn#mp B? IdiO+ @~3gW`M}$ݧ)>fή:2Ҡ!rz\&r-2 Am%CMZ>dJJTq%ȵ|(BI((4$Q!=P1PiHC<'Q{c ҐD=xO@@At?NK_v 9~@j@s8-ف334@}e d p $23Iٗ-$df))udmzn66ZoE(>nllԑߊQ|ܺh!#ÿmӣ uBmYI*J#] T 0}G 5f$`*)t5WGР8n; @HAq va^A*XL2bYm?Md~~bC36"d4҇f;lDeôGe? (ˮi:~^Pė]7u6 gi]9PИ o%Һrȡ1@J,uCAc+@,BoRT-PYޤ[' IQ@igO#fz"oΞFzP*Rd 3TH BgK 8(ڽ8O!5 PP{q\Ck" hlMh@x|̱7=V0d#qS `F" [8DM1Y Z n|g- jkq'h ,{d)XR$@H`?@tFМ, 錠9Y>As|2Uks} |!1TBc(D@0/'a%>^O J|@B @q3\[V 42ridn[)JHE(,*(!PXT!PB ,B!< yCx@h;4@{c J-Z*&gxM$ !HV7 2 ( @ 43333333333333333333333333333p= ףp= ףp= ףp= ףp= ףp= HzGzGzGzGzGz(\(\(\(\(\(&1Zd;OnʡEx&1MbX9v/$ClMb rh|?5^I +S㥛 L7A`"~jtV-K7AׁsF_LJ46MEClpimkA!{24 ,`$4ׂC 3ȸ=.ȴF`)+W^Mk 2fq{87\i#RWHc( pn4#(#FL^y55G;ǗXçk FqǼ v /-,OfA90y<_ZX`]OSOJp?sa*ӕr8EvSsYJk+p>YW#Q-沔& .JW|Fu? L%>Ze)M\"d]/~J|DRZ/D"˭oф@4W[o E[%ҙe Qˁhַ|6.J3F\ou{6"O> /tSQxJ D|QG_:4_dy< $,2οft O2"[3/#qጡFн}"ßeDf^FJe`O #9Lk _Z2@$4@ Gr1 @ evIh%'=8@0=b|iʄЄK8Q?>sO F8LH8͕PMB }星q3p+ D1?'d%g0!6WB 7 -@f3e 9nz`p s fGr B~)!V瞯M͔=2RMC6+=_$0){eq+·lVX{H4%琘̿AW$+V|8J2k!1IGwI o4N>up eQ.=RViۧ@h"|@ģ\ z<=f4ҶOɃD8G xzJiXm;Xڤ2eYAXkʱK!IP ͱ IeהcQ]#B cAjʔga=).=F$B9/RzsHg4ॼno?Mq Ջ)hKy݂~}O G!;S4р6h%қCRwT/hv?/u ~i=m:(ЎK*C~NTyBbg[bјd*^ 9r| 2XĢ1T,˽. @r<~e098)xSp[w(Y  1ahsqR⁧DQ@-c ![Om݉d%f[01%G#P\ax-T'g&I,SGL bJF@†Z&ORMXjWĔzhyw=hg؏7q@~{P'}`{ΰo#H`oNT=bÏV2dS݉eWb a &0 ƍ3Pe_ɦRˮ@8Ma?Z7OgʀMv']1rBy GSL&uyM j8$ 8>IL<6 q2Hp|rM3xm4'e.}pBpT^lP=\`m?֩ؠ 0(_{8;9ێ íSyA`Ppw.ss -"[b2|a?X~+\;Sߛcubk,{X>t҉) 2; wgK$}Nd:w'b}'^VIL2t|/ܝONV/%;!d<^;_x^Z%1KvB_Pȥ,ey[FNdUyx=J (KY| hɫz{P@!bo:ђWoK+5 mQa௞ ]P--9IB ˣڢz;0_==:z[Zr.-DGs3Evazz.tuBy\Z& *AJ $AdMK}d WWEE΁ HbE.ʯB))6.]5_]:"# RR "m7]* k(:.* uDh9hX{nY%r<} Ts@+4I%D ܲJx8OA栁Wh2K$cMeT;q6wTaS ᶣРuɾzؗ ڳ¦AVmGQA}n-U/ٵgSMێB%[b_+ŊCB+Sڳ:2b,ΫÇh4xWlggudXWw'&l+ hNhȈ8NL"(V =_ О%֑cq^ݝEwӆ7\?FhRmĶ6z C o& ۈmm% = L4sMKKz7Ψ8p}fk7u#_a~& 6Qqo#F8(Ll;=ߴG֍,|qn.}ٔW5λm:e}6?]:>)-yG̦-E t&!/l~ATœ Y59Xͽ?'hU'E%X$ MVG )r,{OnѪNHKKH~QA@SXb5ܢU`4Y72 wD 4SDꬶep ZirءYmV33*,OCږíJg,(>_н;o]7v@+Uu{{w2ozw{W<|!Cev "xįWՅ# By:rE]_ G@1_bVҔg,A/ycSVU c5,0J)`Y^6&hkX~a:$_ʷ 2UDy*#ѧ"}tG8od<:+  TFOE p>)*Tyt V穌D|wAPr_~JӪ@K) 2!:U4с 1S?eTUCt)MhFc,4ڵ( B"6{t9SSz kQ!fU!CDls4=DeעC̪B6 5OizN*Ss»s˴N+)qK.l\wHӗi7VS(S]R]jO Α/n:Q:..!o%:ޝ#M_tZOtLu]Ju]fC: Sj,BF!܁uyJz `urXrABaWa.P.L îs]*!~5` !-"g$'^-nӲ Cz[4 EHNX[ݦe%phϋHxM"+/mdhjA鸱V_,6)4klqcA3YlSi?ٲZ/><"e~9o @S eOǍ_|xEH|O w]_VCO$y 2Jz# (HdceF<3u}#>[Q 9>67Pڞpm ߩ5rΚǎ ¡=K}$/2 Sk5Ck{I^d1|` :k;+,8s12ZЊy5H9rp.c^12s4rF`}}L"imGV5}$ eh䌤cD(ڎjH@I;'j0ڊ/Q*{@\k MZ11a _T$9x0l ׶bbj+D Hra:rA:m/WZ7o!A}y] V| =Z'n*C@,󰙻4#aMz ^NhT1jYa3wiFš.X%@jкxc fҌ5]K1@{X~]i3#)'/* yV-b~> Zf8G(SN\_T8hZ}@b!vpPp*Y<fbLs9e$~ܺ!)-E$ ŘsH-,ӹu }C`SD[H61́甑>ZXs0 R )M.jT R\ LW#06|;m+H1'4Fa23Rmv& Sn=X6eQtc"C|JPt{l<|9DZGG#ZO` ؔyF%r+E@r)JieW*>u;ʵ 9cn L-+=wkA.*r( Ǽљ*[W{&(n\GTPLy1#w\n|Mҧ`Ck.K =DGd,"O9\{|qXE5}Krv = .'育`D%A=LB5 5 91e-ꥉJ{ a/kx}kqb ʂ[K0 ^0$@3&* a28aI?. kͣWn/ FA [ԛGv 6_ZhIy&/߃v37^Rm(ʓM^2)׈F6݋/(cg/ |SwI9m__ Qn R^\#rt/ @܎~˟(2xm+oh@7L%cm W oKƸێ12  2 qk'_!cdF3j9df/A}HWlaFLzzj4A 'kqzz 8BÌ@hOo#IAksHQJe-1 =5 q}33= h8)=2b] bu1B. AƭLJy"u?E?z{%f<q=ӽ3zHOQ71 ]bkRڮ15GMg Hm׿ƚԣe>h"5{'3¿4=߁Hw Mwϻd?&5W c=Wb1Ϟ+I`MUgOupaЕ|:pVJ>v\`X+t%AcR̙DIDI\l $$sx.6}|Qj9s<hw> >@.t U8.6  H BU$Mz'9QMƹ=蜨&Z tNTrjq`1D;c8L"ҝp1Tq bN8*y8t'b <*uG =#.uObt:ǧJQ1C{HK%FuROh lzr:L'Qy QTZۨ^a/?cGLNL1a#K'0SvS~L);=bkȧx~yj'5S<<5g)_I:qfCCh AΡnEp\E )()]f}4"C.>`B J!guYs0!%Őˬ9+Ӂ_ ҌR/gp |iFnt`38H6l`'HNih$q  4S}@FZCG81ۚuB_ mM:N }ph'`[SNk8 ÞȠźEaOqdb "ð82hnbFsFw)k`և9}5Q>] (X93˸ia ese0x2̹2nsZC~d^XfQb?PN/S F(N(YVB^ˆvΝȽDvQ!/eC;N^";ಡs'r/kT pι5:0? b t PN{iBXzBCINLIDeLP$~L]"2&iS&S.mT \U!_] /D׮zUikWsC*4+CQtČ(j] bFmPl5A6_"͔ RjH/frM5m3eǂԦR$&Bb{u}OFB1:IyPf^$@ӼDP3@\#XI}wm[ X I-,V$@P3,@\krn \j59 .Pgv %@7" ILsY]G ͤi9dӐe.8@`i2Տ4d DG}Xsh>@z*# 39\ B噜.?LNP%Y?ë ʽsRU^9TI)*r/a!n/O֏<`RxZGvHSs<#O;Xz9,=4'}Q 1E1Ҿ("JIi_Eyv%wLqe\_PWS~82t/)@Cw:WU_B RT"w$)?Z;SP՟-I)zwAO;IH6h*$YJeefX,c% 3ZJ[y~}D]u- y]v>ᮺx޼._ѿpW] XXޜ3y,,SoΊߙZ<l7gLt 6ԛwV:77( mW@#Ky+ؑ%͍<ʂ`PHő.HmllHFq6No6Aq|8Rd'[-F66o1#MDz [&"=qF-fc8a`0rxjmzx?- dQ^3-O\(ާOKwYkXZGxgV5x,#Gf+@<֑#YEoy Kʢ7_CwX`@-!P;LvU0 &;*}E7TH|'/xs[*$Jߓk<ܭ _ɋ5\VEiZ: Ч4mx݅KbSQֶk%1l(Mk[5^wT6ˁ Tgz@drk3o=qԇr F295ՙ8C>^ *SQhˌɩ~4JeTJ6z%twf%H;^ $]wjYF.p;5al0+J `0Kmtv{ۥ6:LJRBpjzG=#}vK85A>~;ΥQ HjR Y kLR5]JBCAV&).Dg +zsR3(߇dA+CszΕ9pP=@) >42CIBbu  PM4M6?%͔ww&Ԧ`f;p jSO }3e*1aAq.qU 8GJLXDhK\~U%&,H"4%.@?hb@<U]_nUc^s /7*XF9OUiCx_l Q4!b/6UĐu1HbKVwh%u{+ջC:ҽ!Z{u@{zJ=JBgdZvʪTa4%!3G-;eUk٣*U5Mv=3}թ9 niԜ]`LD_ujN` XJCpv,n% DH!u8`;"x:[R<$ pɮ U-^j8dW*͖/5Im+CfK n y%|Oy7Ƽ>'uzc^ :@^f .$A3DJkqc"%F8Iu1e#z$:gFb&jz~X1[D}5YQ?-Iu <]*pغ`YLhrlu,&O~4 \SIr߾4z5)$oE=ǔCܷ"g sc!IwF9mKW` ĂyԶӥk0bЏΞ&k6.KB^`ngO5wK' `%NFbuIA#BpU^CLqFN *!&8#Xl{\yv,Si^5TPX܎ fo(,nGz 7hmkQ4!?IȟPEyۤ̂Hl(ƝŜ7 CgNwjbqbA1gM'8EHЅ͓A"vE$ Nj"ta꤆DxuRCkVy`:5Ej<y0^К"U{<'h0xk DV4AE Ak"+Ơ"L0Gׂ#|Vk# kAV+5L뵠H+_o }Y#l췆,k6[C_e5v/qĚ {;e(r~8Dg)2{9?yuYJaKs?O㥃؟lz탧AE\9fEIZ@"\$XdGV,tlt#I+:s F|+3mn"¹ #6l7lHePW[ k2( ԫ-DGՖGZ~d-g+2?2 GdيLsq#CE~lE8O{\w [?g٧=;Ѝ?F#3?1ObA͙J'DLOzX#:cb*CV@@11!+ 㘿nPq_Le7kP9}kf5(HR>}53$)~w>E ʆdvȽV9ZeC2f;^!mrUGV|}!:mdǰ@>Ծ@J6Vc j_H N+1l/$R6 MМD|DwZhN"uO>tS;-4''C D+*URqZS Q芊8qUT5bPD[Z U1(\QCe-Aͪi2іVàfU W4)#=2% yX葀J<,Hjl Bs|.l/J9MnbfߦK71[pENjR[Bz1[纜-!= -@s]䖐q.grKH8f \3:yi84f|hN^3s>??4}@׃?8>G>rBr#j9OPjdOFYf'NDGCZ3QCVd>DR+2(bK"1% }HuEE>{jM[Y:=`?woɦq៻dGָNphE 2g/M8U"|&ڇe> gbBTV6@;`FS*~+T0)M?{Q蔊&hg=])3Dt.Oe":m}p'BL""s2JbU9zc%C1}H `tVj?x'{~U5yX=]ժKUc=EyJ%7`w<%vXOQA ]R+GD8y^Fˋ#w" /E;Nup^jȝ:2.+C% _uv f:;PI>m$(ng6]I3v|g. v[Oo -P8'᷂Yys[ABz,`qA5pP [MO8t\c9Hcƌ$g鱀a`jcF3|X001#>Ƽ#6]BcyDבv@.1o<|"H;M%+0ml(!Y6VM6z ,L&Jae/|W‡r){[o>+zCً7\Jy֛^P.<Y2 Nٔ9/,Z[lgŵS-v6yKUbNza{*xP1r'0Ac^^Hj~I{by$5VN1J<_|^%vrvI/>iS;O9;m+6m\'(6w6^FʻCh/ JQ 31/&rY{U(¬*qBL̋\_5fM/3&t~Wmur:`sL _9޻0p-!]?OH8oꖐ.di'L$7uKH| JyikuzcZ :1_-R^Z%Ч⏛YImMc$&pDV~[qz8wW[z9f-qd`38^r{NxFU-{;iYraMy4,9U˦^Nb@XAϊ@UgAwG*~kx#Pn?5 l`Ɨ4bM9t60c1Ü:1cwaN "}zT!D۾`w"m_~;UHa*%wrY+iHU;մ}I\֊jxzREվN.kE5m<=Z*7[ ".2M-u-ŖL@Ťm񌪹~xZbҶxF\P<-j1i[xw +=5]zW.jV=OCJ%2PuY`tWF,AD i#Tp]pHWY? 1?p8+׬XҘ8kOC,iti5!4f:OF G#'Fc{#TwQ=Hc/w4~YRlL;,)Ud & _*?[<;tAz>_ wsj=ώ/]ee9rgǗ2ݜZ9h|U 'r{~T>*bA=Z?*zD1IGG4<ekTpd#Oa鍲5*g8'0F3Y b>d1vqa@co8~Y0}~7xqx"xӍ@~8<<F Ao|EbVI,p+\HP$^p8G XUK/8ŊW6I[w 2ܵ$֭;vڍn;F wlf7uAvc6Kʓ/HQ ץLԨ@R gjTCB?x;S!Lϟ^ fO/ގiT@Vi Gv+eṗt4#28BC:jJ!!5Sv~ A);?Ȅ lcojdB /KRqh w )84 R̀)㘅r;f@qUy3F 8fNgP#`pUn's33'?X@HLƿՓ $lxI@@[q_qO.DPZ/8'(-Ve Q#Mw 9٦;rl~xNe;,!`z\mJJ0F.D6 GH%^D#~G#L/ Q?e4]|*9<2NY.>vJ',M vN%O~ ߁t5N?@'Dw ibͳWQa*Y+(0TG,h`pJ{yJ4J0b8L%=2`vs})50tx>ݔ |]\zFnJM?xlϭe`)t<6Rj20:)skG `O͉Cxc3'Dܡ?as"PLx9w(ol&b<t VSoO+-^:)巧`|/ՔӊzKm푨+K#%peyHtޥ[{$ :҈m \Y^h6"#/̾d4[IV֑f2 uVFՃu:}b+Kv?& ʕ%Οk_X]ϵI݁zwӄp@OQ]=;i‡Fw4C#\T"FKifS* k)XRZ}5,sJh)-l 9t ᏸͅ4G]s#nsaGBڳ&A'gieg!YsۓIйIpY}`pq1>ih0PҸa44\D(i\ ypOp ."4.<8t1<.:BAsUrsOc *KF=%˟՝ȠFz_NdP#|Ogu'2WnKHXJFE߃b}$l[R>6mҭ}`X 6euN-2kr]ΖKGF5.gDd~^R "h=W2?/nO|T7@>ZUED7 {S ȢUra)d*90Ckޔhf5Y z ' _,tuEt:ºâ CnGp"XΥ-1O#8H,RA$st ~SJY +AOGv,ZQ;R {Qh)a=(_4η05{& sMH=&LMb$wA|뵿VG`>_ Xfpih0z,Q2 cfo!,1ѷ?̃Ƙ[Kf?)ӟwIFwϻ$r_]|q9e?m7ê?ӛa՟Eu[͇O]Jtk.dȂS|ntR2d)>7]cG{6zƣz={ch iQ=1 |sچBZo>LB} Z|BL,8\ ->!Qa.SP_(0 N柟ܐp7OInHi$7$ƴa߇GL⇽'ãۉZ&ޓD-aI|yvI$<봌R,otָ0uZF)v:k\m:-K[;56L&/gw( g}񗳻e 3R]2D_@πMWX}jtYg+>P53`wV{_;hHQ/np)WN¨@8H۔+Z'Ra[ mJĚ%׻ɡ4$tlabMPF0ynr(# ]uA`*<ʯA- wfנ|]; kPKtr.YG5%::(e I"t `2$^n: gfwCHH&$3pUQ[kk$ \UZ/!~%2F`#Kpsjq89oD8=9/W?ʏūzFGFbMazgm-b0ksXSG~[˵XgXAy]|d|F.hY>VPr^2>#n,+(9/t7u}XD:Bzk ,!=5r{QE1ق ;%g]"nZҘl.JdiL`NY[V~Љ:{qDw`zd8t;0jNlq:^5Y'6Zɮ9" dGJ|l_bVkE%>/C{1[6uR= -]:rꖮcc{T!:hhNJy4yxF<<'=z19T=JgHϜIi3~j qS͘9?Z}5)fCD3f@aQMhTBϰʨ&4*cgXneTP'g`iyݓR04`D~)`d@Xwp~XCx g|A8?,!j<3 ~5_| ?T (mRO7;KK6)U%ʥjvN˼<bR "e^y 1c2xɜ]"ܰh<!tLt# ,j:U&Nj5*HB'K _QlMwU (&*DDWw]ՙXVʷeGWatE+۲uf:֢mUXmu:3kJ*:%vޒ\%ɋ ;oOFkȒ Ņ'5WdI.vݜw/ n@n ˻z ]7 m[: {U;!j B̽ܝY5!^UCȬrs*w!dV9$R?mSJFTW %AO[Ta*G-E0'ʨ[f"GdeT-Kn#2tYx'WzRH+~xY~)p$w?^8o^V_ ]7x֯l3U{QkU&½RցO^)@TiځpUfΗDF2F3mKR|Dx%QQjL(Qf5HJ' [̕ V @po-+ RIsBqq?{MkPLˎ帟ߦfeGroS&H@dM>NZ/F ~& R?YӃKh)A%4_I fԎ/xs$^F3j9df/A^v [E/r;V-@D+H?{Qu@Vh=h:@+Ok4yiP'5|e!y oMBI⼆׷&$d{q^[Pa28aI?[laepI>-} 62$>zXs\O8z"b@ۍry=PC1]?<ȡ.vc/ǘH(RΗcLu}t_1&:>:T|ieW*>}|_ j÷6>|HipWd>gM2[76Eέ["RDL- Mm)"a2EV!Ϫ?BrAgL9q}QUȳjyPp*Y<ϒ?K3t/gɟܥ k`ŗfҌ5]Kw qm{T`鸶tt\^dUGR&p|FH#)8>G#g$Y 3vjH@I;^lA m( r v6W9[qC;`J7Q'r[ΛpDFr|MI8\da$:l%p+0 ’sY[aa9\s,Dǂ.c9޼Vcsswz!o^+Ʊ;Hw7y^Hll]q[Q 9>676Ȗ=7*~d˞k eOǍ_|xEDzċmZY"=~Fr6-?#9bmiwEV՘;"U [j[w5lCUBks]*!~5?%1u)եv ŸG꺔R̆OtLu]Ju]fCf1G~JsJOPGט#?9'٣k̑?T@3c? dЌ?vG2DXOihFc,4`О2}*G0hS>穌D|wA xQVnUI_UrE]_ G@:]]նnU:cAj[n*NWWg-k7[XPDZZE du"--"Ei:odŭ] |% +.jxxqkwF_Š}5 -z0m9MFU=Ķ{sBK& b۽vNMx/U{$f0K=eMq32ɦ8zgvOwdSL=PW2F{?Tտ=hcL{0-4 rRޖ_xۏ^9)Lo/MB_ |,Kmf>|VsB3K{R+wc%=p;H&λ[51OP+yݭ'vcҼ VM1J0b$v X`UY~S|, ``)>]!M\Ƃb.rm&.cΊ 19[% 4s`w[zVIGq-M=\Gndq82dY78U@gY*x3Y^Fo\"/Flk7._bo#/oKKz7{vXGFyuwb=;K##⼺;1a%֑cq^ݝE.W6Rr\ ^wl}9Kջ TžW kz-Dڹ5U"SHƚs*vl$cMeT;q6긨(9wAP~uu\T k(:.* uDʻ%2IHT Ғsi$$niɹLU*[ZDKN^wÿ-%c';ߖVjђWoK+5wziĴ/y  ;ZJbڗ<x^Z%1KvB[cú{NLꊭaнK'fuXn}ޥSK1t)sZ=bg9Ev 3]ʜVg`i;.eNQG3)XfpCK,΁Cgu@z%Y@RKBc)DMy%1^_BԼ~ /!Q@'|v4k凌Xn >;5 ,r͚{ie1:knʋ D NeA~"[b2|a?D#o<Ud^wH~tg2Q;$?h:OUl*;J $*J6ڝXv%%JN, c{uݧ]-݃:QӮAbiC{`oNT=,$vꈚ)|5yrjR;uD<9K5Ib:f _M/x nN%+4ۂ<u'mۺEJͶ`%IbYu$S,nEcX{]@xĢ1T,˽. @r<-@;.{tPu ~i=m:(ЎKyM9v5"$yd^S]zDuI2r^ؠcVJ*m<l1+a}J6ҰJ>%vxzJiXm;\du:$%'Cb.2:]!1IGwIs}hImdTp I62wj\߄$ZR;\|]›})+yh.L[Mľ<4_&b_Jsb Vx/e9n:Yau: K7٬:|·lVX{H= jIhS\ 5$y`B©lnZ` KP&h&\e(KB.X2 % p|iʄЄK8\ny.D?ˈPo ̼ßeDf^Fs*JUI_9i$ Ҵ{UWj}{ͷZDsD-Z^gm\ou{6*b.Kim h16A_pJ|DRZ/DtmV#W6+ aw̫]~~0ˆ;U ezxʫ)iv2=BzՔ4;H^!j_kL^y554Lk^ zo I?il7`$4ׂCfF6XOr3܀#GGŧn£#S&†W2ı.nN@a+eX'镲 qhDJY8m4bX9v/$1Zd;OnV-K7AzGzGzG= ףp= ףp= ףQQQffffffffffffff33333333333333??Oc|>8?NOaG#z=,1?KL?x}^_O'k5wɚ;*|Jnt?C!]JRjtC)5:S #)焑sHAk ?zZ?cR1_ϘԯqgL8~7 G]xEc.b^Xt?v:k ;oڂ7 F#NJDcEXZax0uV.nMz&?[klŭ56Yd n2xGV7f+/K{Ηϥي=K` =@v5{ӆ H½iCm] ^x6Үp/<(&j2,D Pv?" zĆZL;K?/b֡I(xU1P?Ϫ싘u(q ^VK52]%Or ǧusWIS:ɕC|oq%ʡZ7иrP-ߛghwI<{[  NWo?=J'ƫւ[ 92ao-͜mCưfζ!c[rsA3g[1e9CG߸e#o\{2~A7.=gGYE5f,݋]?E@yr ߮Y?Zo@`M7svԗv9oOS|͜]u7emԆKSG6j%p #hyrp B?(YĮD4/LN>,BbE"&'OJ!" OrouU;E:MB֪"[i&!kUwxcO WZeҋ+ӲDpjp•u|ia"b58J:>?高 fv&7Ucw 3;LO*汻BM֎~yM>kqk<զIx㸵_j1uX;|R9I(t>$_E^:TeG|}"/J$gmsmrS69u ǩ~Yw[\-PySɘq`D]ȩdL8Tm0.T2se*6Qr*9ҫyt:}!FUJ:D^%urH{1VW׺II]':jck݈^̱յnDRR׉Zx,-)V4~<MXdv?KKc&M,2q1js&8;<AnT슠p`~~vEP8[FRJKvP[qʼa)C_%;Ȍ8eްҒVdF2oX'nޓ$_ +I[$lWCnĭ{DE7djV[(~[xl2i5n--<6cE,,r]rYI{9.˃a$l\Vfί{^t3ڇzd/{Gk^ 5{vQ@i3Y =(i贙]д~mtLVxCey#FDYQh 2ļ#"׬ubވkVT!IWWU`Ð? +֫* aHUli0$B l4LV5yg&yeǃPȁ[.:?(d b{-Ku=r`疥NdzKw4;;O2Х;qB]'^͎8.b؉&~De wetq?vGeɻ2z;ѣ2@Y]]='3@w~2N~ _jhL?/]_LC<Պޅ!?vjE¿aOt;qw_ҟE)6-VgNŢybQbwSs(f;䰢Cwwܕ+rX;JЕ9rvw%J]U>P”SvEn*(aʩ]DG"7E0.]e4ZMy(*2 -&r<u넖z| uuBK\>E]:LLx7LYҚ$_p&&Q,x^oS(UX1<,գ˩pl8V O6Kfrj+'ztpx95 מ=g(~Mn3?OO*e;BjTၲQ5F @َЀk#c4RD>J|Z"e B‹T>-!E{F*GYi"=`fҲ5xu3_FiYWFsM9bn/_ZBdR7/-Xk)ᗖ`Gzπ h#]gk}{x .3`µ>=yHo0Z^<l,uoeƜ֋.6@2cPMEK[ |1gKwRˡlJA.z;P fr(R^i'>GQzBΨ?]Zʼn=!gԟ.vG连3O;bmfތt'6l3oߌGX7ot#Ip/GwQq]DG #٨.# lT\*L;ٲU tY l*,vlis]Epi;[ Ĵ9Zo0%'ȏ5ԇ h7ȇCLC c !H1|uS0BɩhØE)wyTa"_ݔ;Pr*ZR);m)^TjyzJ/*pu[ =vrZ8L31:viN<X_4'R/SL]O)qF\b5`.]^E.`/آs XȄ:.BCCupv]dB!}:8.2n>P]PEh78 t\ *yJIj~Ir<$5]$9WD.: ҼWcۇiEC4m"UxS%%<]ҩE֒P.BԢkIIk|kOtjр$55t%G7$ E# ś[["]-I-CXenmOhwl26hk;V6G[Ay4S*dF^ޣ C2d#DW"hP?+{4Гz͉>>jIDvja5^svA8@,MQsHbl _ӨŹ1N6si\RQmB!&nzÇ67hCmPHf!M($ @3YɴDBD,TIIdZk"!"m$a25@o!T7a RU@k*[m~XoTP))%z,j唔o=]S5rJJAɷ.Kd>tsFwunQ9#wˌ:BݜeF][T!}n2#->(Tj R8Sv*xri) ;kZB4N2 'K'h %‰zk a̰dޅ1_fX~ь[e/3,Yhƭwa2z_4ֻ0F=^p2^~1?w/8y/w꼗_LU }UJXg}%}w_Tt+ ~\tUS*g].)J³.]Uw`n%o;(eA/hU*{tZݲ\*=:-nYK}.ZJ5#){rtq߈=9tauw͈|oĞ:]Uo.s%V7zGѹuƣ\tjU:QtD:X%pEhW# Ub"*p1Vw \fHb0T/VB-lM1k{W+5̽+ P [A );8~Z픝_vIB?v/$qhV;e]8}'([X}AB߉G,> GK\eݲ8f2c%زnYzdұWlY,Ys= X]ƿ@3{?َ_o_Fl//O#okhf六7rKwG H{%;#=@vE!4O5^ӕ @YN[VJ ,S tfV)BW6H; P!Q+(JЕ N{l%`Ti=D6ॉ! E5U]D"y.xi}HCMCX,tjPV~*St:5(+EWA: ߠT"/7,Z^$Bu-/MD!:Iie&|Eˋ4uk*n\65ai .|]|]ʴM>BsJsi7Ki~C%94›4\ƜmR)]$e^g.²/|J aYgY>3u7:ꉖr_º}DKaa]wzװ@Tȸe,1G4'WT[r+OVŭOQ9Mc{ɕ'U'樜=ũXm2~LAx4xT6c? <<{q*V̱CM-h7ԮxSQjW<Ϗ( +?Te`8BE>Dme PQυi~xG(Q[|?<cI˕>γo=-JdCYxķXr%ϡ,<[OK>z),kˌx ]=apeFϮC082#^ jREU Yy "WhZԬ<~uUA-CjV:HO-&B$ ˇuj!I#}ө~oSm ξTSܷũgt_[P,]HTPާmh.$*(6Td4@r*2c t9!:4HDi}nVyu|N+:G+o%g܁7UD`גa*"vkYw ժNr{S⻅jU'9p=)B{8pnZIN=8*'*qp5xtmbCFfbA> iytc1 ޴мOGXx{RMh, XQ=`&4c4Noj\VpEa75 .of+MӢ0|7&iQM K>LbBy7 @v`|BǼ ;0SeXcM'&WГj]Ig5Ua$q jĸR5V b\{y1`T <f䆽B,0z3zrS!{ZE=a祖y- L\1Qӳ`7|.YOt֨Y,`':k, _"&8Eyob dp7xo 28wvXh;X} )EV݊>ԅ"nEhBJ.W|*]o Ns+>m.7Jʶp\m3u9"̶șŇnfF}LCt7m>rnp!G:$19;@)2c" @Ա  ILPmXHm}J$j ж%YJ^Mh[߁? %Z\\t`>.kAdD.:0ܵB2W"KZPq!+%w-8չHSH\$~sީqDivu.98FX}PKZ (b,>%t]V C.+ džXQ$^1(2㡺(N/ukP{'h:ʵxn=K4FZfP"iD( j4Vڕ&#AWF JM +Uv&HA/P;llIVM`]hk &|.[5[rR:W$JlrDž ;`%6BU0\q!g*DM.y3V]Bk|+x郮Ҁ5y*Q>K \:`(.AwJREtNTruMZE"*Ny\]yxVQżHb^!\EٯktgiXˊ׵WWQeEzY+(ֲ"um=QC۔Y.~M#3mʬe󦑙T6eֲ_yL/~ݘa!X ?n̰i,n7fX_ޙ))LKݎܔw%nGJnw;#?7;* ^{9m?z+dJٜ = ^lNJ|55:HOvmDLLv_ j"S&&]BÐ 'm!aȄU_S0d‰)u[Hb2DUc:iyeX7$<2,Uktrz~*|5:I;Dfyl #n"3?wjۂFޟ;5mAÈ[J^W* H%GЫ?#RՇRjrCEz59NSZMw,b M)-;Sæ唖A؂GA|G :eQ >t#[Dzt:H孎cYJHR"Yhze%k$M,4x5ԦH{^YroIjS= M,97m548lW¶@{aDh N wEjHX CAGW,]s$ Уr9VPaU9KWD![˓x-ČV<QȖdybFm(duy2<16L_0/,ez|/~qe2=>8 2D17 w;Tݍ~ Fu?U}DTb M=>"t*U1Vx?:+B}SjϟJU^G5+uk&Pf :5k\(3JDjI.BuUpLh*VFsy]DE#9?S`VZXL!?Ciu+-,W!ش+ShlZJ )4SRv87e')b);gjMY3 Ah#u1EIB_HA/byLQClR8H&^~!6p$wqBv/?T88!eTGگӌ# SiƑk}4H5uԾ?dpl J(=J286c]ɞ%zR1dO} bh>CH|Y{nX$gq,=c( o)7B5ځoJG[n P |-ev[>92hQb"I!6|(1 Zy>erRM>^8>ca/r}c~g`yrvxyNz.`,q;uj= bڸɝ: s1 m\$:8C7!x g <3bNMs™D1C'g&9WO f+'E}ajE3À05H[cӃ, i-`A@0X K|BZr@ȤwpL9sx^QdһS8P9<(2)p(Wi8Geƪh#d{H ۲~cU4=mY*FYz45#x`,=Α_^jIM //^$XB֊x@AvukS\PVh\pI0_+y4.8F$ T]_Ը2Mo.s/j\&7v95 ~iW4coS1ȷ]ُ]X..AnQ|tKe\H|>%2t.[T>ݒzy:Rʥ7Qda$t_(o?0:r g7b fW3ʛ1N3Ǣ O[cрyϧz^KDhS=%"@dy ¯͆2l@2üfQ6^Uaނk *PWhL?kՐ+Gٍ@4õjF Z5d1bi OP4cx{̧XCB}?=S,T!X>>4ݤs&9Vnع^O+h7i\jIN_ kpG/ O 5#vC'aNvOʅLX'a'bbLBݓfd11p!SzII3S)=.q9q{z18}K\j޾gsLzYYC~c G,ݬ@!^1#pn _0(0 lXxP]6p~f, < L.uw8?3&T;<o*C 7 RzR!eo)=JK -1NuT%`ϖgAsS]T]pH@*.G|$ Py\A>otʼ Q  7T::f-#W3L~tґn&?f EH[&;9\l?GQ.GV @(#[01CwX嘡c rб|q]vV9fXy>8O^8 WD^/gS"3GʣʘY~kvdQe,s?5;2fi뚝YL🞗^~OK /S@oҀy7O^_ # ]"'aB.WȰ!CE5s&O[y9'zխx\; ]UxyYЮ*O<ah𔽚j-04x^M Ɩn[/&L<^8ȱu~-W[wߺn+-ro]_uc9ݷۯ:mr#UiJo|&b47>{HseIIkwOlB+p'6r J@\FUcvDm" ;~"6Qa?ysèjsŽM9KtB O:!UWʏR'srǪ+aGŞS?1L TѶhۘs*hm9vAeam6iJ06Bt#}BC?C:ԑy!С!H߼D)מԨl\VkO jHI6.iDʵ'5j$UW 6syF㌄ 9ND"B:No!]eǷȁS+h}qKguDid>hiʸ:42Zh|eYQO4oM}a÷&`0ǂ~Gd`_cAgiKzeqzF%{=rxYڒ^xYܽ9w~QCYMTx!oߦ*|6j-:DU<\>E< "Uլ-7"pjNDOCHU5k 'MWVPk 9ÿ+E5U"T暪Foa+U ^/W?ڗr+AUy}ŕϠ<t$UȚ}0Omv*dMB>'6I&!tLQmjzD|( T܉65RNq*D^p)Q'_8ҦX1ϕs iS,J)BAvs%vB ;湒x;ONCh7%'Z)'!ѓnM_hVJ!TB s*BxعxPbwBe\\*&VLi.tIuV+&N4J{~'tK%]DݽՊI:zXR,ob"= ,Z7^1nT-H)"ⷣkjBcwSŵ}!FھZ^wPۥnFSٻTRF7#j*v)nqkn5jH8'* jl h56ʍʂDEF!W]ybF.<|a}#dxaXn*r,Y7rbcJ\l1 ~V1nM\.?b7:;X|Bs|xwV>_;E& árI7ܭ*ZP9}$VIpx wVo3J[ܙESY-̢ZCwfTV-lmyF!w;h*6%_`S) Wq/0ԩ8cTn UCv'4`ɭ Rw;I0~$ CrkTv1AQ;UJ;w\ɘ H*;dL~NFiW2&?j'#4 (;ůu}_W :B/DB%Lz X[!JR&=P]w,ۭ )|VR/ߘHio oL47QTK7&Rl*g)M}T63=_́tů@c:Wsr1z@Ln@"=dB&l[ I2-Hm~$P`Jj %xt0Grh5< :~R9C nd1O.&N' H~LGaᓋGI}?ӣł#Ҥ>;?"3s܍8:xX kΏl>>>???@@@AAAABBBCCCDDDDEEEFFFGGGGHHHIIIJJJJKKKLLLMMMMNNNOOOPPPPQQQRRRSSSSTTTUUUVVVVWWWXXXYYYZZZZ[[[\\\]]]]^^^___````aaabbbccccdddeeeffffggghhhiiiijjjkkkllllmmmnnnoooopppqqqrrrrssstttuuuuvvvwwwxxxyyyyzzz{{{||||}}}~~~                    !!!"""####$$$%%%&&&''''((()))****+++,,,----...///0000111222333344455566667778889999:::;;;<<<<===>>>????@@@AAABBBBCCCDDDEEEFFFFGGGHHHIIIIJJJKKKLLLLMMMNNNOOOOPPPQQQRRRRSSSTTTUUUUVVVWWWXXXXYYYZZZ[[[[\\\]]]^^^^___```aaabbbbcccdddeeeefffggghhhhiiijjjkkkklllmmmnnnnooopppqqqqrrrsssttttuuuvvvwwwwxxxyyyzzzz{{{|||}}}}~~~                    !!!""""###$$$%%%%&&&'''(((()))***++++,,,---...////000111222233344455556667778888999:::;;;;<<<===>>>>???@@@AAAABBBCCCDDDDEEEFFFGGGGHHHIIIJJJKKKKLLLMMMNNNNOOOPPPQQQQRRRSSSTTTTUUUVVVWWWWXXXYYYZZZZ[[[\\\]]]]^^^___````aaabbbccccdddeeeffffggghhhiiijjjjkkklllmmmmnnnoooppppqqqrrrsssstttuuuvvvvwwwxxxyyyyzzz{{{||||}}}~~~Lj"Nץq@&R>=9T^*3"EfKL}Ro3zs|; TfE#8_H &f PvxЋ>\Ŭft/:e,lvU }Y ^uY\(/07p"ӽ<Q-_`T=oh#jgPl$#^XyOW:s"ٺ-NNQ}<6*ut0Eu+G+[v܁CL# R"*ka #W;oSFETb F Gȟwަ$q10(_KU﯅7\?8MIbaPQ- _ ]o0"qx#8k&"v ,k߯ lLIKRFqZ& LƮ$£2RΎ$]-?3P*mSQpO9[pg%BfxTy>3秢 .х*s%JB8}fOE;A\ ?UK9lRqm̜wD~9 HRe…b~$tѲqp5T-(_1 s74Iew QXbi{,ƋPtB[p|?ӣł#Ҥ>eYHb脪 ~LGaᓋGI}HxFkˆ.$2-TPgA/8 ]hwIdZ0QZς_294q/ȴ` R9C nd-=I b($΄v $s9I& ZJ{+>:PH H6?rL(H'W&|.ڋu;-Hm~$P/h)NzL\@!w&l[ I2={;B1/@f|9PA= yvӅQcX{ ^@bWsr1z@ ưů@c:bc V1jR>*7Ab3)M}T63#o8ZŨ3gHK7&Rl*g̳qx'[ {]Bʤ.e7_wgNIT]>v+D)Ooǿ2 n)9t )|VRHe;ARsR&=P]w,ۭAL,R'?@_İaCrvegU!?lX¥8N~a:B/DB2Kq}uÆu}_W LkţVI̙JjJi+iGη>3eiW2&?j'#4(3Zo'}0g*5*;dL~NFiU47R;L;n?zB hnlW,vF)w?~!A* \WخJY0R ^ۻ~$ CrkT@]aAw;I0t#y#y8TƦ% 1u*7p*!| GnGpMK|cTn UC.ݎP /0ԩ81&o_,5k<ŝY4U cL>8(Yk myF!w;h*6ǘ|qP~s׬CwfTV-lQܲȔ}"6e0*/zݪ#ǹeu)"Em$a8TN__;E֤OEklVv:ŇBs|xw+^evVi|D>R.[̂U~Vh**"}M\.?b7xYjUUEПJ\l1 ~V1nꑫTDcDڶBXHp5ep'xc#W]ƈ:m1?>j20O,JGڻRujb|a}#dxaXލV\w"#ԶŴF.<-O߽.WdZeAM"r#Y;{ ]ʂDEFwx?}HO_ h56ʍs1WtX]Zf5{ ]f[{/0bԯR&kn5jH8_`Ũ_Iӥb Ltij*v)nqe߬eTF5Qb,n*~;Y詌P!kã#XTvtqm_-֗SBS>_L%(ܾJgPu@r=|1E=3JPn}ŕϠ<~{6Oc|zf 2r+AUy1l-Oz QS_}e3[3HcZ[ j*sMU#g0erǰ7<(DM}"T暪FoaeP}WQ>/t1Q.RU|\ˠ|;^ 2b!\&A'^Ecw =dDOCHU5k 'Mm- Nx)@{Ȉ"pjN .BNK[R"*.,]~7Cٗ6j-:DU<\>X$< n(;9f/mmNKZtx>|mR؛2?ؖoްN"Wۤ7e,~-;6\^!aD0L1IcoX `[vl¿Cro7{:`c#l2|NKZrE|'dW/|坴-Ư6 ':O;zɀ^;i[_/imOuwf_wҶ^ 'JKfycK]*Pfv .)n~; %T$B?C'+,]Rܚ揱w,uK@I;by,RO<䍝TAvDz X(/x;뷩6 36숊B#AHQ?_7voSmf+f 1`@#v y^wGΝoi7bFP협3,mI/,^;?(+nhO1#34fYڒ^xYܽ9w~QV݈ўAcFfh̳%{=rxxT,)4ksWztHm#Xr/̱ XS i4(~Gd`_cASh]Q = ÷&`0ǂC쇞")y)l?5ZZ2n鬎('=ERS~j|eYQO4Gzthiʸ:42Zhti#~ /}21#r G8iA(_vzecG@HGW)ӥ͏LqҢPǷȁS;KE|!o!]eu9-Ttbb|9P9z!K sp/[1lr4 rXB^PcN @iR97aWCgv5h0as{8ljr"o&Y [;j8#ap5EDބM^ A)v{CAIkFС!H߼DvE}Z0x֌C?C:ԑy!Δ ò8}ZP3pgpc}TI }l`;g^(ik3+8 1kv@ÝQӢ:gVphj^1=Yٙ63ZY1S^]ww0bzijb3m~gS8bꇧJ\,azgfg>hfqOyvYφFʁ{ 2TI'ĜܱJX w)$e)z“N9cՕ#$?7*7R1HSR'srǪ+aGH~65*oT oc O:!UWʏ ,q6ϯ#aT5v9aOD&X!l_ۉ9GvèjsŽM99+!C<sQa?ysroV'm ؿWjMJvF.?б<ެNԚl+i\hcq.yY 6c^5) VJ@\Kޅ,Gfy 5+^,7\ug~ 7YvkVXn2M$9.z*n^*T׬x{HseIr\.Tܼf92UYb47>~21,(_D1z[r$db!X)JGQv#c9ݷۯ:IXC0R|G+-ro]_uesVCObYd'ȢI$PFn1:ŲDOE-XI&/7zY>cte9 >[/&L<^Q ~)E6,}>O٫O`E hЦ)=M#|Os%"?0AMS{F<)/(JDH`sSC1-1 e;on L>9禸bp[6Oc w<@r)QP&|4s4Mql0xR62Mhhm()hPMX-ucVr;s3A!74K}6QRѠ[8v'fbC~WaohlhA5aԍqZ Oņ,DIFj¢l㴒4&)OA0RIӯ \F΋jO#eBُ_d g]Vxt\)O8GPG518SMvTκRp*9jbq e?~&:uYMqgRD+o4+FXm~vq}Τ^u+DW6qhV Z xDyT4܏u`,^JPTC|)72fi뚝YOy#Wj;, NT=rFs!1vXz? #>nsC\ic,$;S"3G}憸PaYHv WD^/g[Lk\,.N+t.3t<{X\!WZ]vV9fXy>8k1կ p8-Bszӑ rб|q]VI$զðK*g(#^8IMay{T:~+xQ Gˑ-ZwYq&`W.tV @(#[YE~nF'ʗot 0xEWל`rT@az9c Xt9Ʃ. nD2_]sgAsS]h|@bL y}a[@JOfs; &2÷T%5w*?3(L!eo)=JEkT~f2PC 7 RzR`R6*cwL܄  K OĥmT­ +8?3&T;>K9ۨ1[s:V6p~f, < L.uw7RMq! EJjت|Lu<nзC8԰U8K7y/dK5op')a^1#pn _zu׹|jj;9%s-(Cv'%.G5`o_3s9&J]ZP6 NK\j޾gsLԫ V mVAx8}Ĉ%-ϪhI_@$lYL)\Ȕ;K[U ">0II3S)=v#ط<) $E|}`ݓfd11p!Sz$ ; LP =!w0ՉI w 2;zB` 0_@O0P70d#vC'a@vUjpk4C>fzJ7M;k&:i|F̧o4v.5$'LUuɯC O+h7i\jINR뀓_㇦53Vnع^ULߓT8=*)*fP=Կ'p{T?=S,T!X>y(Vu3ORG\x{̧XCB}fnD/!ܚC`AT~(sV ܈_Cf5.Qv#p2\rk]S}F Z5d%\}6ߚCLf l8*ƫ =J:m%6*l50oApTW(/{t2JlpU~k1aނk *P](e꫰b2üfQ6^Un,b"elX4`^ Y/[;YD3"hS=%"@^÷vೈgE*[cрyϧz^KD/',WYn\zMFBY_NY6j\ozW3ʛ1N3'.,\mfjr g7b fo𢿅E|*_G^z΅E E{T\}*~-*nI < )~U*[T>ݒzy:Rr--SqU^|>%2t.e<7lb<-weU˪T mpc axnxZ˪U..AFܰ܍U-~S1ȷ]ُ]X3AN0$,QD<"epE+Dg3Ph}Zq7CW2h? }B8L?񝧘6KsZw,E|$(p ~;O1mM //^$XHP@2wb,=Α_^jISOA-@=̍z¶XA#?>SZzc?=mY*FL<-}07~#d{H ۲~cU4C 4L!<>.-+Lzw 4@fKEiBy|\Z(Wi8 ̖083P9<(2)p\Q >Z 0̾>?V;=Ȓ;3j}a05}{ }~vz%w>!-;gpE'h),`j2@0X K|BZ]i'ணd peD0/L K)`B)N]G1ɢa@Q_$Rjw6ST#bE3À05H+J mF8w$f+'E}ajo]ۛTq3~ZOL3tͻ7ŕvOf>™D1C'g&9w%oo+S}j<3bNMsKԯ|;b')HlrNB\B=_wTrOR0GZυ치6.J{,Q見垤`!ɝ: s1 m\KoC&ʆ!TfV(rWhg^Jp5|ކL C?&@Pr9rμj$1o/ (&PMZr]墝y)Ib^z2Q6L<0B吻E;Rz,FkpCqBi fS3$[t0X̦ gH9~JaTg'; 0MZϐhsnѕ¨"NvVk&i'5T BȰeIT):nyMNj8p$)6a˒ oRtR/ [򚤝Pq& H Sl"Ö%AS^U, ]C`5t|:@! XAr`jv!@ou!B%|W(v @ B C K3bQ^=؅An /楙,gg[4@I0y'%6_K3g;#Y3erRMr A}ѷԍ&|(13˲0].O[;p-Tǝgea|]!B-ev[>;Ϥg/tC>JG[n P |Pr)TG[fJX ۧx(Y/vR􏬷͔0L54OP,8_1?ɥPYo5)ab-6jhnX$gq,=c aEqnzoQHIdžޠ}+۹ ,p&H*  A)EW'2ԷsYM轑FU %zR1dOdo3(u{#@J286c]ɞ!ϣ#}K:"@upqazj[CƏGCG t8D4H5uԾ??/piƑk}?炆)jo|N3&d.Ng58l SfM*]2kpL؞ ,9T88!eu^h8!<"-q6Rw>iP>XS+`2rpBxDZ+m|Ҡ}@<(8VezW=HA/byLQoE i{IB_Ui{X禬Z ͫOߑ9MY3 A#W ;;#s)b);gjmDh1?3ra¢e6npb~rg+AalZJ )4 ȅW–!ش+ShW`'-MX&m^W%QjwN7: O[雰M<ڼJՀ)n^u07ayxy]DE#9?Sܼ48 2D,%2 Вez|/~qe5*<Ԇa aÃN<}Gj>~Ux <†(duy2<16|֫Py( :QȖdybFmɩ8456v0dztU1wSq6ʩiklJ +a(0誜+7c0&lSӜؔ9VPaU9KWn`MN (9)s$ Уr:Iyu܍n!q#սm"'"s7#BG{aDh N wE$1q7nF%T¶@:4.=a^$[Ԃd$)ҞW)uh\z¼`I_OIUIjS= M,97Qиy.lQ 5ԦH{^YroD$d&R |C"=ćRyX*IcM ;D{:VDZ, UړǚK%v t:H孎cY6DP[[B~Ti9et"l? ݷ ,ЩarJˠEl#C ~lo QY>Sæ唖A؂G!**t&|@M)-;W;8;І#LiTuTr@wqw.& GLCEz59Y\LBR0RՇRjrMejEk wu<\yMB.&9m=O K$l,|xʹ\Mrz~*|5:I؆;X$s5- <2,UktDma-$1 p1{J#i$;.HE7}{q[Hb2DUc:Fb-I'w\nⶐ0d‰)u*z$u,;~2WZnT:EIXv$hm7,dF[).8uԱInX_ j"S&&]T}]1u^I1W)Cmc콒Vc>YkR6B~%`Sv#{%| ^lNJCGJZ dJٜ ='^ /ۂ𗨫iۑRrMܽ,_4w/QWl;#?7;{Y6,hl _ w%nGJnwEqHSh^eK!ۍ }1DÑ,YѼ4BBO3,/bʼn# XN%yi,n7fX_2zj'53m ,lPñT%KѤ|X٠&;X%ʇc"KP'IEqo=AMn'CwJREtNdBN&ôQ{Ѿw L Sl}@ݸL~ܛS&)( =q1 7?T+LR2P?(:R{tb3po~NWdDfsnv)'JF_p˞IBD ܰRN=,̅9A( =F ̹aۥ)| -{&Y !rPz6söK9S7[L0B$Z9 QJZq* Ru!T 05yX-ښ-9)gcb IZ &|.[5[rR7B1/m ?VM`]hk][>@pZ- ѪBdy$H |ZF;+n7{;Uv&HAqm8ivWnv2F JM +ꃱ1fή^ 4A"ۃbac{k/ŕ/hD( j4`͇^xy+_($o>P"iZ´d~-O)44rvk*:jYqi"YcZDYCShiƟ8Tt6*hҳ ӒE<Р?qlTϪg%dkye MA9\S٨7!HjGB >kWx)! oBBk0Ԏ8@v}2 ks{'h:ʵxnSESit / б! 쭧2_^ˡj ]kcC,N[O1dڏ/C.+ džX"*Jc|xWG_,>%t]V :#i~Wty?:ߜwji#t>DG[ VDivu.98F|,;]\$~sީq肢#?W̕E㒻T1EG~>% x!+%w-8c |^.KB2W"KZPq0GSlrnp!G:$*TjW,ΕnfF}LCtm{XoQzŧ-@4 U/";Oe[i."^2E`wDIʶp\h4Uypڬ򙑱 uj[|8 hY3#c krq4u!%GT%kgF6"nEhBJ@6ʃKfόm+EV݊>ԅ@ Uz\OO|; [,a ]@gQnwXh; +TϢr==7xo 28wv;],/٥% 5= 6~wf Y^-K-K05jzl/3vwZ.&,`':k, _qXKkXxzQE nQoFOn{*do^,/౎ܢތܰT޼&`Y _,cE%E=a祖y- L X_:Ӌ*Jpz3zrS!{Zh&j&'rnI~_jiLM&OP1`T <Ѣ(1zL& b\{y uRÜ zYk21U שdq 9A~ $vdb0S'I:sRIg5UaVXn`>i}2vq/V(w$ T"}e)2_P1&HXb9EnGH ;0SeXcM,Rrs܎I @v`|BǼv'JJgO1uPPJ(L%Njb*7&iQM K>#۝()?U6CAof+MӢ0|ӌR;* ]Dq |oX* 8ݧvrU<(Tt q1O3K x2w54Q=`&4cܣ7BlKЍp0X !7-4}Goɭ4aCHoZh'r黓[,A7^itc1 ޴мOgw'XnӄbA> iy%4%N*.rYH K:'ÇiVg_KTh] @?)KtN,Ҭξ8к83?gd!q=kzwĄ<ȅ:Tx }}{L)33 y uL#>2 R90#`vY-RAI*7Nj 4}Js4aF윳&E[hnq2S&BJ7f&: d*HM2oLquA4n5 ?LUd)]߀k47|h 9I=sBDh;,-Zb@r{ 愈6=(vXY+> -[Į1)$; m{PV|Zh]_cSI v4"L@ae(l8/5=:u1 @Uˡ]XYq!_jb{tb@$'3C{+:B3;ŀINgV-VtubeDž> Y"ȝZv{D <}OKh5!QZ_[>DF^#x,P}xR 8kC|N+:GY(?.qּDi}nVyuESe;c^ 1ЅD} v.E=s-~i*2c t9%M]>fzZx6Td4@r;B/y $Oe]q=7jv<;_8\I˺T[{o:/-xv p1<{uũgt_[J5| X QbPZ$4{bɕj:d)80f(KxT6c? g;Sk.Y>3q}v6q,]/|J aYg}\I6!-^o2o0W1gFxblBv[rp%d`P c6f)q^'لxJ4\ƜmR ㊽N mzÕi~C%94›m.%vKZMXem _&!\'KŃ5m]ʴM>BOk&/iں5ai .|]|ev &gn +2qQH΢ER{}@։M6;**:We&|Eˋ4فlvU%TtMD!:IieeQHSw:wJBe72ʢ3xבb |u끅N JoPe*EgB#N)%: ߠT#+^G2չSJt:5(+EWAnZ,tpcľB4>A޿!۪7YY Lj}!.xi}HCMCUohٳҡɏB]D"y%S@0*te"I")!<9:16%`Ti=D6DS(BNystbmJЕ N{lC7ZsܱFBT5]чn4Cc.ȍ+橆kR3i+jhiq>\5WS tfVF } 7jVJ ,ħlX`h9>VRw" Oٰ !r|s|*=@vEaAB 䂥TX H{%;#8SF@ Qdw5Km 4pz(tkhf六7 L5PFyl//O#o51ҙ hv[-c\,C:kb3 *1+;c+[ǬYt, G9AY j#sX}AZ02ilHmO.s`dJMu/ِ.hV;e]8gȔ=^{!1\B?v/$q&(r339p$)f sJo%]MPquXgfdsHXSޕJ-ʱ5̽+ P [Y6-(YPgV! \]Yv5 mZ,+Qz珳άBp.j$aڴXV> gAY*p1Vw \fH*4iD}?΂: Ub";"t³ W5Fb(:W"wEˡ gjU:QtD:\Ç'C f .\uƣ\tx/s5kϏ<]3".'.N4C7 _j(yfD\>7bO]X.h5n@լQJ% O^k3rWA00=:-nYK}.ZJ?ꟼ<g0"`a{tZݲ\*.S7 -amyy0JEEW]~o\Zxg<`n%o;fLc߸&y)J³.]UwB_z$nɏKYj_u_ kI5)>Cվ־// 1哸)j'?R.}g}%}w_-{ZnvKtJ}(C7gn~WUH{([PŇn2#->P,. ۷)?̣ݜeF][T!}2< 5^(1혵RPxc xj$CQc1k9%[O%rT 2@$xIۇ:fƴcrJJAɷ.Kd]K'_NGBus[`-UAPOJt [-|?Z (gv-|98*[m~XoTPZB=r*=-pTlk*5).bE 1JեâIw%6UR0VH jR\6ŊcKEKm$a25@Ӥl5d(U&݉,TIIdZk"!" X=GnwQiQou&amA^7{j!M($ @3܃`nD9EFCmPHf`%t1l ]94A t8W4K,b䋵ۻri'׹4jq)}iXŰ-kw1N6si\R/a[/n9 bl _ӨŹo# Ooį zR9LJ]ZX F@W߈_^svA3<;.IDvja53_  MV!iY $a@lH=ek3BӲI6P?+{4|)f04Y̧e/XlW"h(+ M!oރ펕QVPM1QV\HC߼5+̭ )cT&z7=yk;V6G[Ay4SǨFYqM nz hwl26h!EB~5ljp斤!C`j,3."]-I-C8 M Xf\E# ś[[:Y5ܗ]GVP:hZRs6j/k17VOtjр$55l`Cgp_bnv}[!.BԢkIIk|ks]*z|U9Lms {AH)5+»ƿUȫr$E!Av*RjVυwW0IC4m"UԬ V#ahcۇiE!U358f]GR_+Ae"Af k,q"')<$5]$9WDWXEtO;NSyJIj~IrD\k} vC~ήL"49ֈ# O܇>P]PEh7sqG?/ع}:8.2n}iAd? ؋<= \raӂ syz@lѹ,<&?.`/آs XŅ{O 0$yL.]^E[Ҕ^p:u&֗)y&F.͉8#h) tcL3/SL]O)qFkJS?<{֙ fX_4'RIsrьQzߺ-ҋ ;C- Q!<ʣ)3u[ =vrZ8"ABxɕG3SfG=yzJ/*pن@K[A z4t?bW7;/ ,h~0fnFw^(9-Og-=n)Xva"_ݔ;Pr*ZC8ե6DePrXC}\qK_mb 6Z &$ 4WT"ܗmLC c !Hri.} &E'/h7ȇCkZH,he=יVq|_O沅7}X˔{3G连3O;e o)4_gZʼn=!gԟ.vm)Ie# Q՗ {x'?:R7F@=ySܩz|0Fhu,Z &r%4SaК YMKKh0.?Lq^!5AXk)ᗖ` I/98ҹ + 6n(-\F%^sqsVlz#^ׁQZչ&2p'K4:#H*4FsMeNrxitFƑUXixu3_FiYWkGaᰧ'DH#OK䣬4AHx֎&-aOO:컉F*GYi"=Mr[هÞtw!T>-!E{U瑁R7?`F_ O)8Lt" |zQ%f7wvSqħ'>YETJ}n3?OO-Y}2 E3g(~MpN55ce.{nLBiV!vGkjƐ;=\ܘr?B;Ԍ!kw\{㗹1 Ч~U fؕ^9`j5!à+9s/X1o}+Gj C2W5cWrxݣ_bV.@eDQGS.̼aw<]3sMH-0\пy'<Ìxݻfh( Fy[`O3Nx/w6Q&"8ȟrAf83^Iwm:mOͤc񌎹z0ϣcS| uڞIsdz(?`G'/ ק@A=53:gQ~`?~On_Ot?P=OvL L*H{J\Yſ;3U*B7?2#1ͳ2 2 sw?gn馺?X=:hp&sݘMuI/եzt$G6a/L)w1^K`H [m¢_)SvcN7%TёFۄEk0SJz]%Df)l7ڳH&pC!zK<̀S:ngOLևB+q_wQytk2#1ݷiKJ#ÓR=:Ya*ǿ/oӖ3F+'ztpx95(#T_tߦ-g*8V O6KfrjnmO߰,Uc3 hG0JT̿aYܫ\ DgR)`*5>òWW ,x^oS(UitkS}2eqr3ԟYFK4>Q{IVңi7EcAB,!?M"*˭5“aGn?ƂY,CH DTu[k'Y%J 1X4ADJ{;xZu麒=N=@<4vu%%3қzz#{6 &+y|ihեJJf7F8 2m53cH/`l*!/Bu 05=kB1fƐ^\UB^(A6akz+@ׄ"č!Q@,l8`3W E(ǘCzcsU yYqg [s5 4x^/}&VȖ"y֣0'."j0:wAi^6L-E:7 lGa4O\D`tylX![ Ay C@},%|xӫ@+Y͙YK=W7(/,V$) }ݳ3۳){MoLԚ^.hʖ=`RF"5\- {${;C1ߥ, V3EPkzT5+[HvbqKYw=tvS kի71F@kz*d}WobP/ύf-#UvO1+5VĠ^#ZoG롳bVXk^A$G?7ߎȆbD∬smA/sq {mr'Y~ۂ^p=&9$""*Nx#*zLr2:^aЁme%\net7RcK0-PH+O{UoB;ؗ7pap[.C|!@Ί Ą' |Ô%I ]PdU4B O)KZ$@<" ɪi89+/8, S&IxtAEUqrV_p&&E]:)yC:'I넖z| u2ՙϒ@ԅѵMQ%L9hd3c%?J %kJrj.Tg>K~RKnG"7E0.](D+[۲3k\BI+:>tp] P\Weg!ָVt|n9;t%leoBq %9rvw%J@!r]ޖ!XJrX;JЕ@E,B})Xbbu@NjY Yú9sE'T ,|X7;u=r`疥NЩOXov?(d b{-K71| iKY) k wnVc5q(*R>@?ܬk&2 PU/g$<}@ ,'H0ǣ9Cw 9mr"XxOBa:Gsr\uD2%3#t &ɉdl=#0fm&85l,:.BzF` MqlkXu]|7(װ4ǻ:nPe14k;7!DZ=aci9wuܠhGb8= mV V^؂, ЎpG{ڂ'*c-/X@/,[1XOTxa Z^ 9̂dͫDy5߼@r6FWSjWy33 mV7Zv~fp5IO' #7J*4Vُj:"NF$nܕԏUh2.)t$=E,H+Xe\Rg?Hz8YpWR?Vʸst>xIv٪# )h0}>W%@&w:TeG|}"/J;6Mjt>$_E^ {} Ud:FtqR)>1uX;b+%1TS}bѱvFbԗ]z)DŨ/GT;2Sz/Q_vwvd!G^8芵vy~JG9qk8bݥsv% +qźK+8K@AWuV:q@D(}QrbM{Q"lj<'EE?yjd8n헧?O>~q/O0|㸵_j)YӲDpjp•u|/VZIZ^C_N*`;1z[i&!kUwxc"EH:HDD6d%u@'l2J!" Oِe,BbE"&'OБzF^Amn#mp B?@G#hyr@~3gW`M}$ݧ)>fή:29H"OS|͜]u7eAm%CMZ>dJJTq%ȵ|( J4kQ( j+R-Ǖh"!iHC<'Q{c ҐD=xO@@A !zD9~@j@s8-ف334qZggh$23Iٗ-$df))/[H(6'S S$g_QlN@< ԑߊQ|ܺh!#ÿmӣ uBPG+ڦGAqfcT 0}G 5f$`*)t5@lk"HR94URj@HAq va^A*"=u)wIUzEz Sﶓ~bC36"d4҇f;lDji $+v؈(ˮi:~^Pė]7u6/n=(#ym o%Һrȡ1@J,uCAc+X8K!ƔWA+p֕C) IQ@igO#fz"oΞF4"&EE=!d 3TH BgK 8j7PpPP{q\Ck" hAs|2Ro3dd|!1TBc(\PP 6a%>^O J|@@ x9?@q3eg42ridn[) ҷRȥo(!PXT!PB ,B@aQY yCx@h;4vf iJ-Z*+ TW ?h$ !HV7}2d(P @43333333333333333333333333333333gfffffffffffffffffffffffffffffff{GzGzGzGzGzGz(\(\(\(\(\(\(QQQQQQQأp= ףp= ףp= ףp= ףp= ףp= ףS㥛 rh|?5^I +S㥛 K7A`"~jtV-K7AOnʡEx&1Zd;On鷯( 0* h"lxz,C6o_Q|a2U0*DJY8m4?߾37d`TR'镲 qh Tƿϸp $ yCnah㈵q@H0[wT 7k)3P>,`n£#S=f2}ƅ!YnSr3܀#GGŧGS=MEClpimkA!Lz24 ,`$4ׂCMd7iXI?il7l1fq{87\i#RWH b( pn4#(#FL^y55=PApiFPF4;H^!j_kkv /-,OfA90yK<_ZX`]OSOJp?sa*6y48>]~~0ˆ;UQ/mhp|iau=M==|6+ aw̫ IW|Fu? L%>Ze)M\"Td]/~J|DRZ/D&$])ɺ^d00 h16A_p"E[%ҙe Qˁhַ|C46.J3F\ou{6hP!l\nHg~ߗ&D-Z^gmH9C|QG_:4_dy6r< $,2ο8H9i$ 믒[8pP#^َ>ft O2"[3/##MpጡFн}"ßeDf^FEnC{e;E.D?ˈPo ̼A|@ Gr1 @ evIh% &=8@0=b|iʄЄK8M*{qaz7X2 % pі}星q3p+-D1?'d%g0!6WB 7 -D[>c~:N6Jy`B©lnZ@fGr B~)!V瞯$L͔=2RMC6+=_$6I0){eq+·lVX{Hk0 `6S8ʐW K7٬:|ζ iy[-w651ׅi+ؗ+m4H!I[ljb Vx/e9V8&iBn <4_&b_JsE _1_Z?7!FFBMcn_|!~oB-.-|맛ܾ Cj\߄$ZR;\7<犁!hZsHE_砫C]rnx+C>%琘̿AW$+V|8J2k!1IGwI;W pdD2ϟCb.2:]1?h"|@ģ\ z<=f4ҶOɃc~D8G xzJiXm;xp)r6ҰJ>%v('̱ IeהcQ]#B OOcAjʔga=).=F$B9/0ǂ&)T z^S]zDuI2r^S/SՋ)hKy݂~}O ^F!;S4р6h%KLқCRwT/hv?/u ~i=m:(ЎKz7^L~F^{tP8T>NTyBbg[bјd*^ 9 1 q| 2XĢ1T,˽. @r<bP8S Ae8nEcX{]@x1ahsqR⁧DQ@-:'c ![Om݉d%f[0tNs`(C͡IۺEJͶ`~ܜaJF@†Z&ORMXjW9ÔIL<6b q2Hp|rM3xm4'̹d($>g2Q;$?h:OsW+ QI}4Ud^wH~t7;9ێ íSyA`Pow.ss -"[b2|a?x\@[n;)D NeA~OƱx ft-gG^Z5ߟc(![ώfM2j?QB3|/! ,r͚{ie?80v@Q)5o$4KHpaG37F@Sj`Ih ?(8foFԼ~ /!Qq9 ,My%1^_B73 `)<ѵ3!: =ˬs m+\;Sߛcubk,{X>t҉)'}# Wv 7fuXn}ޥST OGpL|oꊭaнK'ޛ2t|/ܝONV/%;!7d<^;_x^Z%1KvBvo? ypw> ;ZJbڗD+{b;=;K##⼺;1a`VB o& ۈmm% =ƅ L4sMKKz7}Y 6i1/Dbo#/o5Qqo#F8(LVk;=ߴG֍,|qM\Ƃb.rg nMljIr'j7,Aܚ(f=4AHCXO4rnZ-X탸5Qzi&=hݴX[6/$q#(N`rV`U,$DlV _IGQdw]g:2rXH$جtt8e Y冃U8IY-|9'Fu=p b!q&Wxo>n.}ٔW5λm:d}6?]:>)-]=Io'U4o༻Un 3z חO n iyw&j%Dg$1/TZT%Ҽ VM1JI"|c$\_>..Jyݭ'vcaG?yG̦-E t&!/<>}JM[~^9)Lo/MB_M?a8Lux$qը|oX'~ òq=ReI QO&3e0 z˒ Tտ=hcLe1 aHC%)@F{?2=[FUbt' f3L)`)dzœ Y5t:uj}'VjxxqkwF_Š}伇)r,{OnѪNHKKH~QAy?SXb5ܢU`4Y72~ȱj_USc5,0J)`Y^6&-fhkX~a)*Tyt V穌D|wAJ$F|RU"@$0hS>B2!:U4с 1S>eTUCt)MhFc,48|˨SVЌ?vG2DXOihqkQ!fU!CDls4=D>dעC̪B6 5OizN*}ɮE Ul ٣k̑?T@]1 @*$bGט#?9'@2O Α/n:Q:..!d8n%:ޝ#M_tZOtLu]Ju]fCpJ';GLŸG꺔R̆I_urXrABaWa.P.L îs]*!~53'}]Rc2 ɇ]5lCUBk4nCz[4 EHNX[ݦeHi%phϋHxM"+ҸKm(ԟ?#9bmiwEVqۢ!P?/"=~Fr6-I2YlSi?ٲZ/><"ۓd~9o @S eOǍ_|xEL'rfAOXd˞k2Jz# (HdcCeF<3u}#>[Q 9>67=,:(4xrg2G|r|" ̓mn@o ¡=K}$/2 Sk5hCk{I^d1|` :k;+,.,(lcNtw! 8Z~HW_S#Yr0S6qxL۸DFmEإڋyT% jvZUF{?+!SkE867wi08﯍^VB$k0қ׊qln]/$6Vap_HNa7y^Hl༿6{Y Ho^+Ʊ;HwH&`+5PAFcVXXrM~IW#j ,Dǂ.c9K#2G@Y[aa9\sYR2 "2ې7gсyq(feEe!MoV9&$Q.<dI(0lC4Fr|MI8\ lznpH,UA4aܐ؆7ꑴ=YH٫-h¸! %0m;o#i{W9[qC;`J``ۮwts߀Gf!e r v6zF*_}}L"imGV5}$ eh䌤TcD(ڎjH@I;|%3l+QY 3v!LZ11a _T$9x0l ׶Cbbj+D Hra:rA:m/G0QkĄ)V|RAtt\^0<Z'n*C@,󰙻4#aM_y ^NhT1jYa3wiFš.X%l@jкxc fҌ5]Ky>x:uSƨgɟܥ k`ŗLra~> Zf8G(SN\_T8hZ}@b!vpPp*Y<.˅BkJL9q}QUȳjy=`ŘsH-,ӹu }C`SD[Hy51́甑>ZXs0 k4c)#;|L- Mm)"aLhR\ LW#06|;m*H1'4Fa23Rmv&3UbFOHir!/0]pWd>gMgB ŌB8_`>|Hi/{@"ZO` ؔyF%r+]D@r)JieW*>j=ۃ5`SH1&:>:T|3L-+=wkA.*r( Ǽ~+gЙ*[W{&(n\GTPLy1VΠ3UdLQ<ȡ.vc=DGd,"O9\U {|qXE5}Krv = .'>ƿ=tk>zXs\OW}4!:%{`-} 62$epb ʂ[K0 ^0$ʼ@3&* a28aI?yÉ.( flQ/MT$d{q^[P~QZԛGv 6_ZhIy&/߃vo37^Rm(ʓM^2EigXSo%viP'5|e`et{SwI9m__ Qn R^\#rt/ @܎~˟(}MF%0^|}@D+H?{Q*ۛrKaoӽ2/r;V-Ÿێ12  2 1qk'_!cdF3j9df/Ab"o;NпB( fԎ/xs$^:7BÌ@hO't>o#_2)A%4N| Fҿb 3eS R?YӃKhݔ_ÌfG]*wi)e7O7͎TT3Ӳ#n9g)rS~o3o \uܵfeGroS㦔<f6;RkPLˎ帟ߦa!^ƥz,Xqv)[$a_!BK4YJ+ RIsB{Ji`ŕ-V @po-MfȮ#ЬZ+ h|ITo(Λd= Q]GYWL(Qf57 z"@j$x%QQj5KSm%#i0#SW:Uv \دkփ:JlG`Fɧpu 4@*_׬/uNfPO^)@TiځpU`Y^j+O&½RցG&Vxi{ՉlC:vT]-"LXq4 u ͩ{ZDXᥱU'> iSux#-w?f+23W>=&G,[,Bz8];{W:q!beg6{zMXXޅ pv"GկtB,\m~B9DDMʛI%~dmARļ}` \r҉27JڂyE+ 7e*o&I5;r}W+3I''oTL*#k "kwd [Nn(㎪_m϶{"Eebk)9߸K@%Y|:~,/vRr:q:N['UKn#2tY*>YB;eDBI(V=UJFɟUT}` $vfˈQꧭz0#6?db I̖ %AO[Ta*Gm$VQɂ%ؙ-#JFTWD9:'^BMAW2+ rguN<pEAs*w!dV9FWPAxzኂ5!^UCȬru3-~h9ayw@[" f:M[0qc&Юs-E@t` >M ]7 m[*As}Wh`?2SR yqa-hYTp&ђdR@[њ+$ ^M8%ȤNI Ņ'5WdIO ýpFK Iɋ ;oOFkȒ7g5ۅPh|[vtV[S=n=`OQj2 :3kJ*::{${dnBuf:֢mUXmu"r]Gi|ѦJ> QD|CA ٻM}"A+.ȕ<3wE*DDWw]N[-fr=8! @MD7[{zqz B>D5Nn$c%7m7|j5*HB'Kn"l97#%/oj:U&NP:/'Iidή nXPO,$A+JIt^*O*F*ɜ]"ܰhxtD@%D:燅aH Tpoo[@ՄF,}:Ƒ@3,2 X(F/t#PmR{gXneTP^ Gچ;~{&ϰʨ&4*cF1t^ԏV_!n 3G 8b*>ڽKe1/CD3f@pT |{b_R?Z}5)f8L]$g$XF?ELg$մG-p!HIHϜIi3YC0unNܷ2X2 !\TܣߤO| ݜ(,oeeBqGwIs9QX*r`K68!XKRYdkXة_)F06qp`}Cp1PaְS#DǿR`m4`9,Ibf²aaF<<h*hdVkE%>/C>"<|xIUвrIdGJ|l_bP 'NAD#u8L N?ɃG-q:^5Y'6>e048ٓ [Խ8t;0jNlڭ8 q6x*Y-ذSr%V[qF f#;6m89T4&[aKĭR+e*GvlprdiL`NY[Vn-Tش SҘl.JkoQO/`Z|o"T8^T!=5r{QEԋ7Fq?Mk:Bzk ,+O>I?M{ ~U|ݵ)v,+(9/t7<$k'0S6q.hY>VPr^2>#nrm̋; 3I/wvrm.ۘ+vgT,_)#L`\,"-1/V03'HϨ^'YXSG~[˵XC[nc^afNQN|0ksPGy"yv%vO#e{}#$,D(l?K1zFGFiCIXQ~tc?ʏūx-v^}Q+?Z"cd*N[jeV[89oD8T:IyE4Kpsjq޸ `$l~U׊dB23_qPIي&땵Ʉdf`.*jkm-v.M+kW]+ \UZ` SП^HEYYݐ+c:?;1DD7X̻!W$ł%Nu@wb>x"yn: gfwCHK|E.t `2$^O4B3bɍA9_ά£hf>feEr.YG5%:;|&7&|]; kPKts)L)f 4d-Li^rHCBR6R4h9[XӼz79. 0mi, А r0ynr(# ]\4Th9\։Ti8i+år70-6%nqZWPK#P53`waW;"J/k"rv׾"pF*wE:=t;^D}ET/I_9(u{v]2D_q0/O;.~N(Ngk a^v\1xQ%v&nü< c:-K[;56Lyy!suZF)v:k\m,f铁K7˰[}xt;Q$~{_|X'0$oa-;>vI$<O.aHN,Zvl}D-aI|yg!Qa> %=leDvxTϹgo mC!7|Jz>q52ˈ?sچBZo>(|je s9Q=1 |e;]0L-zi}q-ݥYpMWvnaZy2ZK)?1v90eǵtR2d)>7]c/,~ 'pW6iz}Qz?>_XN6.mt{C|X'-]m\"ۤ*Eu[͇O|a[8ڸDIU3ӛa՟:qX@A*^ /.ø2ys&WfT"_]|q9e?MbDx)$re0#3g $ 1f6ǒ˸aF;gv0IAA~cl-%3qÌ8>wП6`T̃Ƙ[Kf?M~)bqFw\'^lu@ I S s:44OpW(ϣ4A@upih0z,Q$G'iL3`>_ Xfm{0(׾\&1yD ۤ?2`QQ7}&LMb$wA1IldDo\"sMH=$u|9G&S@ŰBt?j/GI2rMا ہ,X1A)a=(_4e%OYbR {QhPzj$gv'\*2:, BqSHVN˹Te?)>uY&&$st ~S| ֳ<.MLU#9[M7#8H,RAL^rW: AoaaQ@!* x6QUA}$Rt:ºâ C0Ux)ljqH6__,tuEݞn(H}taoJYJNt3=cP*tޔhf5Zw{ƺ#U^)d*90CkK'0e*L%)>s$dOsa T*YKSD} *H,ɞOw/T2T7@>ZUX=_,,Sde2?/nO|P?P/N<ୣ iR"V+s_пxT[GF5.gD@@W8#𨺃2kr]ΖKtfs+ǿqST%W{TuVV̧Jίҭ}`X 6ͽ ͭMOS_[R>6m)Y"'CQ!S2Y݉ jRpEx?OR=!>&BdtH+d ~2z )CD}L|Ogu'2WGd>IRNdP#u[Y2181P\%#:R]QrGy9ݮ`.^=O7& YNϖg |]\zFnJM F 3-eX0tx>ݔ4h7=<}%%1h8Oo{ {rE[9yJ4J0b8L%=p *r>zG,h`pJ{ISh,41;1.?0<HyZㄨrXhbvJu5.?g̴BR ȅj 4]R C ~1ΘiG#L/ Q?h7b1ӎ6 GH%^D#~^i6^>>!t@:S:}=m|Z G!9|Bpt<2uu{3{Brl~xNe6}$+p1$O J`gBbmh1IWcH<h+ 2Ʌ(ڸb0Õǐx>5(-Ve Qq$c_a+!|jPZ/8'/'1GFo90L6Sofk j_Oc5s`* $lxI@*Pk0U@HLƿՓRC%! B0Y*9"l3^KBP#`pUn's3C"2JK 9JGg3Zw3F 8fNgi B{b K >Ba $@}~)i[;<-9ɫ)H,)84 R6vxH[rؓWSXRqh w $~~ߜPgjx}6{Ώ752!I9ljԺ9 lcojdB+9|sCyusA);?Ȅ_PqOj U, dn D3da?YJ!!5|fB->5T4#28BC:jG '&=Lw#Ӌq@a>2jOML{nGH3oG´}*c5$ԛ2 fO/ގiTŨ=jH?71ueL!Lϟ^ T t?qJG%u9u)Sy35*!F,J>r@R gjTCS1 ƍ*Y.| ץLԨ=13'nol*aĺuǎ ]1!z6cf@OVnUf7uAvc6Cl̀ݖn;F wl@'\TUYŷ)j hb9.Of?䫲o5R,*bł+r]p~PWe"jXUK/8ŊW?ʂ/EHP$^p8G 's2  &At#|>O"O&qe@LF Ao|ECMʀ;&Ӎ@~8<<(((fԄ]@,c>?PNQR'Qͨ 5%8~Y0}~7!NbQjJvqa@cogR TS3%3zCjHuI33QFe G zARfJf Ԑȓfgzl,JPN͔!Ց'0F3Ykʳ)a6]Pn֏ʧ^Qp> PgSuRlO #{*Ϧ>  NwA=Z?*zD1IG,\CUM}H!#Ar{~T>*bx mjsRɳKWDnN" "8A礒gǗ2ݜZ9,W5D>D9q&I%ώ/]ee9rp t?qn\: yG%"<Nw-4ܸPu/KJٟ-E+y)Zhq & _*?[Yt;~̅/Hh`lπyn?w C_$sѨ؞$dI 12ӇH -Q=HǢc.d}@Z'Fc{#Tw _81G  l)4zK3Anpb(ܟ$Ri5!4f:9~%P?3H8kOC,it?M_-8$sQA#!9 l.Q*C\}2ZqIGFB(s ]U*.4}ePsEP,AD i#Tp]=L$- %4ռځU{(H [ .nJi8hSyMç!`%/0Q@@\7 pЦW.jV=OCJ]a lo(M=5]z/S|$I;8".qߐUSY_Z3fIvp' E\!9;NMgƓ$&N>d}CrV LwuZ8k OZLϨAqR(-;Q5/'2*rׅk$㤮1P<-j1i[xw3 ѫF B'  p-k'TZw|lqg@W":OZ[FO,>΀D-D t/+le59|ozCE)tAy|rks:Bl))0R jB} tRx SaUP5禲0Ҽ-^}/iO7 k*Mea0y[6,#!0^ҞToAQA!T`J:xmYGB`=ހD@ݸ[Fu>"~dx[ڬ%T UL@qq}D^?طYK4 wn5,~o9hP1T3ij`-q8ʘNoP`>{a 3bZ,p10_}zoS!* 4głX+c:aAަZC)ThPk!VtzMSkvHZè+/Yܽ4!\j5i .d˘.W^{iTC>j"xk]1]dqӨ#%+Hm3{fQpfRfXGdEJLW"gͤ͢X߱`r!5D"H}ӛE5IcBkOQϏøY#&Gln nˇqHq GLmM+:F%j??:jg:.VtJ6~t/"u(19b7]K%״L$a֟'\m'=FR* y"Jiy2I¬?O"NbC z|UD*;_2eYDrĆ`I,Tr6F*ʣzPt8;lTGl#f?`?5y6B\ٻ-qd`3НrKq4b X"+ }z-y=s;i%DV~[qz8Bw>./҈5b"ny>p~ ݏa^8 a}&D.e|TT[7¬*qBL̋\b/-Dl9wx%&n&u(-e_ZrJMxơM%Q[ʾ1L_ʻCh/ J ȷ}i!b`˹ +6w6^F6${F95)FltIr&k I/>iS;O9;ML<.#2_|^%vrv.΃6/8B? ^gmjpP*F#]m2_Rq(~ ޿1T B/ a/F8dP $xAc^^>6ŭƩ2Wٝ%TkMyO}l[ۍS7e ;Kf;<%.nP^!gŵS-v6yK<])nm7Nݔ&/B,Z[l@;IB,Su&RcG].1o<|"H;MˣMƎ 鋻l]BcyDבv@9 !6ӛ.OHl)y@z,`ژ 2sA2B9l7]RX001#>dd>8rLo<#鱀a`jcF3|.hMGـ>}^㾥m#!3VF6(\К}}KFB(gf&'l:1P5ey=:P [MO8t\cD3eK >MC)x8ܴܤJ g.8}kR@qiI#' -^ϔ].1p6 =prF*}OZ4.)\bWmJ{&T9EX hn%`Dkf'Z`!aqrJX'_PNBBU?]c%底N-&i .a7mNjLٮ.F ,[kb+gۮ< A S~Yd}]]X=vWζ]y<6CED$^r'~߱ k2hW Xk6I6N"c48e.BFmxmʝE+~0hz呂fII ;[iI9EM ̀ z:0 w2Ҭ)ޓrًk$u`$7dlYS'Գ}7,0&HH/oJa#kqg gԔğA&]m (29s.n }>VPd+ s2'\H݄;4A 7Ĺt})<$fWteO whnsXmSx@I̮}]\C8I.2x@P"<<(m7)4p6.]d^!0PEwuyrQ -.nSh$m\,B`A֋JJ+H:|<,Y ٹ0 0 8EWm!&u$xYs7_,+a(ApXB MIӳd53goSX9L}[Mp s[ABz,!W;`ME~-f&|B-p =3v|g. v[:3@oW#0#=YN2Tu4pg&,?M\87vXOQA ]Rٟ&S# e*xv춦?MFwR%%7bURmM%IKeL26JJ`_o,Ūڱۚ:>K4eHmX4/UKc5u|&[ 8_PYYDo&}mo2 q(PšnjUM'd8@p&m[6ɇ4q))L6!e":m}p'BLڶZmiSR,u%NmBDt.O,⶜}I (tJoe3W|Wm9]'!TpQ蔊&hg=rNCV>$50)M?{#_}X!ޗr: jY"s™F0y7RNC/?tHCղD31`n|ax_~&ڇe> gbF1ϸ߲(l6ٴ51bZuqɿeQ*m[mi#k\' cĴ>㞓T៻dGָN4Lji}='=F=`?woɦq7.k{Z ;fQ UW ?~I$""}n]ւ˵v̢HuEE>\ݗk1E18T]1% }_ߋ"/Hpb = DLd鐕h0E6_ozXɨ!+a2|}/l"7,Z3QCVd ;_OJ gb'̅N^3s>??4}@w!nAN$ә 4f|hMQ9@)B9Q%Gac@?,rRrrKH8f \3!6~XD G 䖐q.g'>@f8_5ǷM\AO|(7qjoӥ-E)2yQo|9ߦK71[pENjR=d4;r9MnbfΥ3GS $*[!Bz$`Gf!K-g25H&U0aCJ<,Hjl B5ZekN]/Lla† yX葀طҭvouyPhKaP*+joW[/+lϡ2іVàfU W4]߮>J^V}!Ce-Aͪi_ BߪY*mf@"N@\Ukj!|U#UЏr(tEExC*~%2~Fe᫴Q芊8qUTJdVWiC?6qZS 2BG2޵ew{ s()ѝxݓ!eek˄HQtS;-4''C (xז 5̑DwZhN"uO>3in, \PȇHJv e Y/$R6<:Փ߫ $+pA j_H N+1lr74#;ٽlHFlkՑowiGwƳ{@ِת#G+;a.E_62.LL.{r%kf5(HR>}֢Bul<:z C8/9E tx( `uPq_Le7s^[& ֱP!+ 㘿n}xjh*vИ.99Si(XjUz-p1]sDs'= Q,ZBcλLOzXcū=PCW鵴ÅƜwA͙J'D3/Grv _a$$'_idt#f^wHHNqɳ?F˼5|yg٧=;Ѝ8[=KNPRg-G!"?"\q { [ԏ#CE~lE8<@&o-9A JAGdيLsq[ nI`o iR@TAze訰Lܒ1P j#Qa-n3%c-4JSՖGZ=M=Su3C87bķ23ۆ&=,*{0[E{fpnĈoef M$yXT,4aNlHY"h6:Y둤 yC#}>D>?lt#I+:G0 5$||dGV,t1tlNmeN'^itP<b.iٮ<:3O6sx"x.\&Y];yt9)f؟lz탧AE\*n]x?䊷22z^~/c]@t%Tܺz%~0oeJe ^Ǻ,%6JuJ`+ʔTyuYJlPq W)2{9?I/ZbYwUq8b͆nS-^;;"/qĚ {;#ݦZhgMwTwTE[C_e5v;,X{,D~x yz-=uXܽ6:)RY/T&Z{/鰸{cmt.S_j+5L뵠H+_Vo *1Uo-qBaКȊ1*'aߺAU&c*Z 5 cP&TZ-O$þu(L@TU Ak"+Ơ"LZ,H}QTxk DV4AE"$<gCwL!"NjhMڪ=O@tCH$x Sڮd?]6 Qt Ei}H]~0k@mA>\ Nj"ta|cj˦SOW]a(lXmP̙}LM L Pٸ]ڠ3&𙊏9.N<}_vqbA1gM3Ss\6'0%x2 CgNwjbj9Eq ˿h e`Hz\/GrTa>$CBcG+\R4^>只}H&.V57"iq|-7t'D=qa)[ohhO{n}gu@]`1Q ЗОX Ɓc%,Q*]9x51,2.6YTK 4Y Tr?2k:cXd]l}ϳ',h@Ft et*ưػgOO=,Y4dRˬTaw 6=ϪE\G(f[aw䉛ח? !*Q ':z7/??d#]s BTo Nt'n^_ػ9Q\YN,5}ʃ2M[A;%.r!t;,XjRC_e3vJ\hCvFqYd9Ԥ)~/fB`3s.~tV Lo=|g/f6\#(JAC9e(z^}lϹэGPZ݃r2 Q s([Aa6:2CM|eN *!&8#Xl@O' ->@OGc1Xn:|!N=Z[|JGRbuIA#B<|{4q?`%NFf? $1s!Zy%/0~1H|c94- Bl6.KB^`ngO5c)rhZjm]>Ξ&ke#Gdi(р^IaMXnFCɂ`ýQ2*Xo?*{dFzU$6ec UZ/9M' N FɌH cmƚp8uhܳ˧4G['kI"$FqBѸgOi._O֘DH`?ׅq ,: \":1n1'u`?^S\5o *>=YI4V"=n&h`jrTX}6 zh Ez6 MxNrռ.Nld%XmB)v-4m"7gS-"[iv+<ۆ# +Cn [DʷX&r/Wx G*Wܜ'OoM^o(TŅ7efnVRV!B"0gI҂n6w#i oR|_BE`ϒl8FޔZIZ %I qjђQXTExЛYcu5%բ%գP5wΡ7j jJ-8ګEKGaQk2CoJfՔ[p_"ABUv7 2/ 3ҐP7xDZn@d^_ f")ң!n<,| U9݀ȼ(6;DRGKCCxYL5D^,Ԕ ?vtu @,jX)8~tX0#0a{:SSF+pT=Ûl"Y n:Xk?\.f|{7kaElu,&O~4 \{!0H+4#|_}Vo+phdC`hI'WhOGިV$Ɇђ"OЀ}5YQ?-I֓ %E⿟\<!jz~X1[D^5 ƌE mƘH~=NtkABs@ ڌ1e#z$:x.j34?cc"%F8Iu̢k=a GW§dE5z¢3H<{= B1OI /Ǻ3jEg2yzc^ :@^,{NVd {KMҀGyP}Y74lG ʕ6ٕJ%\oh9Y7َ+/5Im+CfKes";oس-(W^j8dW*͖1Vm|^DyH؎ŭD)c%ǭJ?EC:[R<ƄK[y)~!u8`;"xm+߽KN-m3?W QW9{-̝[.g&~:5A0s|[.!;B]`LD_ujN`)g48J1"ߢͦ$$yFeJvMShtqbDE pMIHQNY*&(ň|b7٣*U5MO9}Q5n6%!3G-;eUk ]LCee=|:=tozwVJAʢ{Hu@{zJ=?t19 E7:ҽ!Z{sq6ڗ¤cP>1d]>a8ln/IǠ*}bȺo $j1|̩Zqj_ AUĐu1HbLIU{yhˍJp,kwqW铪:lMUחmX,'0='U9uؚ/7*XF9O_z^Or&.C5U]_nUc^s ~'FTv֒sV$G$Oa%*HU%&,H"4%.@?IQ!XKUZJLXDhK\~Rgv+m^DlSBLf1~;Υ;?Ԃց=R@])!w~'G%{ۥ6:LJRB8NP ZWK`0Kmtv`6/qܛOE&_۬dWBI~l _㸹7MYF.p;5L0qso>9|yo^ $]wjѨYIJj L#͠`193QF铔,L>0GkA%2ccr*fG2f')Y-|0a~4JeT(FeOR0U[`Qhˌɩ)zkC dZk9#[O!RlOSz"&r F295ՙ8C ؞ &D|Mh@drk3o=qԇ!.5VlTi@UpI }*B@#]jب.:Rë(Mk[5^wT6FXQ]RuWQֶk%1lN#]V!yg}wCW{b=fOG~V B t z.w+6͞vZAA _ɋ5\Vk=ZɃ8=*$Jߓk<ܭe޽qe] kk Ⱦ"= {gg,&;*}E{d{ƕYv1̯!P;LvU0 Ocd)ΐ)Jp¼uwled[ dR!Soy Kʢ7:ɶɒ8C8z+ @<֑#YEo?(Ђ[!sT K&5kӒA~P|:BDMjLKoӧ%W;,@ nu`Q-/(ާOKwY@Mvo<ġ_V2 ,b&L" ?0<l7gLtOI u4mΉ]h<ɾ7G/U'Lhڜвy}K%5Ѵ9'te$x޼._ѿpW]ev )$z4KX lÌBpSHJsA1 i~Yن-V%1*ާR b,c% 3ZJ&cUO!) $YJeefXhw&Yvӡ7ӏg' E'BzGzC'LCuoNAO;OݙdML?P՟-I)zw QGu_s,c]u;i@X ? Ρ *w/?G"=̱~@Cw:WU_*?--+:kLsRrc]DTf[ ZVtKט椴/ "<;&̶l蘗' 1Ii_Eyv%wLNm.hY 1/O\cҾ("JCQ|+Eh "C7ROkV)FEn'9,= GXS' |OHSs<#O;XziD+;O5,LvUCJ?ʠ xO-߉T; WvjkX$뇔~xA0Zv<ְ09TI)*r/aT\fxJV/ ĉ֑ Dϡ20< ;ݕ ^"#PCe`Day&'Oq1v+X0D'ZG.?LN23ctW*za$N\ B噜 ֣JnVyNv9 YQQ?G[+ݬ9Xsh>~[6V*yY9)r4d DG}M>;q;}VaQt3i)bW9|Uw0~;>#w®f4S22rī`zw}FY]G ͤi9dq/#JˍUy2byM5ẁ ^Fddɑ˵.W5ju((-7V%Ȓ#ӗk]j59 .P{QZnJΓ%G/\krn \K8PPԧ +X][k+i Ηp $,xOV<-,V$@/@HXn CAQ&xb}wm[ X I<`sx|5٩:FL~Nih"Try,jS٥uɍ^$@ӼDP39YhgK뼓1:IyPfaL\,E]{Xk%rLY YFK䶙cAjS )3qawocm3eǂԦRgf) ?R_/frM54bGb ,vy1z(Ju h\',7hY bFmPl5AЈN!Yo2вČ(j]]%v9E-\-+^E6Js6Zƭz[kWsC*4tmLl[sFD׮zUiI3H7$ϓ@ɔKD[/n#gnH8'4))i *]$F<#ݐp|k?OiS&S.mTHyG!~$~L]"2&Y۾Rd9L4]B!T^=!}0Or,#rkiBXzBCam Ja.NXF2t PN{G|e5u`<a**lh܉Kdj& yR);VOGUT pι5MRvꫨಡs'r/k*vR.T,SJ ;"UR3 ߥ]ީY +wDf(ۑKS F(N(YV*TI(Pn#|JwyfQb?PN/o.cD¡$8Oᩅ o"\6PCS_I6o/qS ? Dm ln_<2@(riS5N!&8,9- !L=sn_ӦjBLq^oY,&sZC] (XKv";'t'zև9}5QJQ^: ;S;LaSX71qC#tv.n 5vʙ"ð82hnbF<+Ey/\Lj3EaOqdb Aa xB,jH/=t4C)z_'50:XԐ^{h'`[SNk80#at& !N }p}:c!midv$ZhuzC~ȆI)> #-Z3OJ  4S}@FZy=v/d_=X z^8*um4#7{:T$5+;pT* |iFnt`38HkWwx T׵ҌR/gp#w$KK`5ӛݘWbYeG+G^Hvk71#0!%Őˬ96Vߑ,-LovcF^`B J!guYs ނRƶ|FЬshm}Qx9奌m3Q'YP7r8.+x KVWg$ߣO8AΡnEp\ ώukw{: ʶܤ#|痧|0֊"tAmIGs /O$q@&R>=9T^*3"LL}Ro3zs|; TfEH &f PvxЋ/U2LIA̡(R^d"/zуCQ2C/T=Dj_0'61ʷKe^vzԾ`OmFboG R8 }Dی*ߎ/zإq@&R>=9T^*3"KL}Ro3zs|; TfE`H &f PvxЋ.U2LIA̡(R]d"/zуCQ2C/T=Dj_0'61ʷKe^uzԾ`OmFboG R8 }Dی*ߎ/zץq@&R>=9T^*3"KL}Ro3zs|; TfE_H &f PvxЋ.U2LIA̡(Rl]d"/zуCQ2C/T=Dj_0'61ʷKe^uzԾ`OmFboG ZR8 }Dی*ߎ/zץq@&R>=9T^*3"gKL}Ro3zs|; TfE_H &f PvxЋ.U2LIA̡(R5k]d"/zуCQ2C/jT=Dj_0'61ʷKe^ԬuzԾ`OmFboG YR8 }Dی*ߎ/zOץq@&R>=9T^*3"fKL}Ro3zs|; TfE9_H &f PvxЋr.U2LIA̡(R4k]d"/zуCQ2C/iT=Dj_0'61ʷKe^ӬuzԾ`OmFboG YR8 }Dی*ߎ/z#Nץq@&R>=9T^*3"FfKL}Ro3zs|; TfE8_H &f PvxЋq.U2LIA̡(R)4k]d"/zуCQ2C/RiT=Dj_0'61ʷKe^ӬuzԾ`OmFboG EYR8 }Dی*ߎ/z"Nץq@&R>=9T^*3"EfKL}Ro3zs|; TfE$8_H &f PvxЋGq.U2LIA̡(R(4k]d"/zуCQ2C/QiT=Dj_0'61ʷKe^2ӬuzԾ`OmFboG dDYR8 }Dی*ߎ/z@Ї1lYŵn~W1+!b:˳N!k?FգAbVB`ugC~6J G "zD }X{ ۋh"hEY<>7s+pa9 ]n}m$`)B2\c U WL 1?sh8Ԭn@. 5DD-Z_?jX{+,Y݀\XkZ88.԰VIWP( =h}qZp\a ECX%4j?W{|"efJ9i~ƽ$'E( )b s:Ө\{I N$P F,r]2b̂c9m; qY.veXŘPsRjSou T\uʰ1 椶զ޺6 4eڕac,CImMu_/3pf^@\B^Ig[}''XpD- )@"}?PV?(,|r4 ϡوcmЅvDSʡJ,p%C .L 9*C1YK$P;j k/ Y_jT.>3}Ptw^ P\|Lg Yl}S*FM9C^1TGeS9@ؘ/UwZ!-(=nqgMe7ʯt|BB[Qz,ʪ 38q[V/R$ڦLCœ\o[Uep8.<2e_HM$ 'ph?qnY]xdʾHh2IOrnU \?E[Y u7v)&-,Xc[)><;o`ŻSnM[XƶnemS|(y>wwۚt (bmNP|NΊV;(܇TbY/vavZ_%Q$g_2;+Z JHrsS)-fϪ?F 8VZ=rޕhSC &û oz䪽+Q-LJ7\MwXiU{W*1Nm[L!o$ 28 Kn =B|EO6U$R/ (7&黗@zڅl@,I_QnLzw/y =?ـVYPH=(`^vi+z&z~QFc/FJ.k`KLfVSK݌tp_4]*DzޭBm2 +iT.-3[M.et3--<< 1REMoGZ7k}=*!xyxbߎ.o2z*#TC(H1q7]\W W|ˣK(g00t7jYlxDG!PN``Fo`Iղؾ\-/.UOC& Ӎe} F<6O C#SY\*&VLxm"qFT%M[;(X?%D iLgMsKZ1wB,Q~Jf=ΚRI4Qwob W۴zrC *cSei<=4qP /{'T#^nFyzh>*t_N Ty[I*_b4~HƟnJFOBR淒Th0?9 ݔvk So%8|a erB)= J l-)mqNFӭ8ҦX1ϕٺ[Rvd [q-M c+Ju:A:/M[Hb!d*呮7@ŝhS .% jސmrd"O>ٍH5 ` !۶vDE|m?T!kBA0zCm꧋_y'm% pB NtIqk?߱O0/"%i;Yi`,7c+`^BEJ,u.;%ŭYoRW<Yhd]vK[1xy (IbGT!E_ ~j3;\1ĎX/4Bycg6fvPbQ^h<)' ms v#F{ hՎ13Җȹ?F432Ccf-酗s~ڍi0T;fdo*5q̥.4k}\Ws8|Sk0wK]D h#p 4d<QBT ".6&%1iy/ X)0E\lLJ`cvӐH_G P6+@ml +0X<-zC}fURB>f-(W`3 >yZZ xM +G<+6;wF=5#~xʫ WLxVlv{jGLWiA45LG-,).; pרQ90bARƞ*<鄘;V] +?Qyr`x#=E/Ux 1'wV~g]FF=I{^bNXu%a0aN A8FUcvDm"\%apd7;'DK8k;18nUvN0s8qvbp‘0;윰'"oaMJIiȅV:7ǛI`>ZҀm%= t,n976|+&JZ{b#ZX܀ r׻Pq,oWfދF:.ӔLүw5ˑYޮBu͊ˍtV CdPnl H&kw'^0sM*vUi|LANa?ܑU( !@#>ܝxex4>5#PUA>F2!}^#;ʆh|krGV0J  m$?0LH}AN=p(MluY[9)T0v|  {Pzٺ벶b!rR`il`C#ŋJ`!b+e> |1F 1+s C9V}b b/V+(uAs kFjoDknLJUuefҡ߈͏.γϙ>ѫn& CC5V]g3)}W "e @& 럼G=D,EʤANgL:?y}%؏ {2tX;RI;"t*xJ dw)w9E2T^`?2A%bj;"Kڸ.Dcy?=/ (z%cvEJq5G]2;z^P Iƶ,jjew4@ uUTHiOG1KX E5;'}Ӟ(*cf +VS jvO"=QU,2c]3 )oD0wJCme!٩'<\=yp9Sވ`67ĕ6BS?UOxz'z#J1xœkKVߖ2k|?G ]p&ZwS=L?[c60L>^Q!5z,+48tm`h}CkNXV0l9hq 7yHLS@a"1x<,3| HIUm._<~3D^byXfғ\4y 1Ng&>x- 'U x &.l2vnMX0(0 L\Fe)ܚб3caQ`@u)S57ceg$RwS0q)g;pknBόGIե'[ };8#?!HI [)tNTv\qG~B`5S8gf"l&"%5lk>p:D S:/X-Ђ2Ymq]rT>3c^u._ZehĻ}fN?J\`@ fĉwQ̜~ BXb򬊦h(NvOʅLľYMP ) c4#1 1b}˳*@R: =iFc 2bgU4EC/u{Ҍ,&.dJzZp@ *<':1 ûNu@8b|1T8xBO iubwÝ& pbpX; ȮJN~fgL|ZiFIcRxMr]Z?4͐ϨvΥ *85~h!Q3=i&K 5 XսϤ=Hݣr1bi @{I{2 ?Gc>B?ҌbU>d Nt| ~<+Ū}&@*o xH3V̍:d[s2ȟϯe7ј~ת!u,e?_9n1UC@37"Yn! ?rDc9\ ڣӖQb[ _ GexUGI-W_ ෦-6ʰfN[F oM!&3[~m6aU {ځ"&Yn=E>y-mEL>,R z+|>Z">|k>|fY2< W|DK}|1̲He6py,0Tkudj6Vۭ|Ko8H4#"9Fm뭶[*pFy!iEŗEr,[m^U.&C # ^PtOWyݢ@ӹo`oWůE-s!8xB">W߯_w[R/=OB ]s&r7_VO v g?va 0MnjY/A~-`t OxYղ_<|%؅5Y261ex?K8 ky&ȣ %2G 1qeHLG?> Kecwc|Q7 ~|^'("28ƕo" Fnd¡iZɣq1'Q|=@91<<ȄCGctO@{rcyx NKk%D Qz~vu!13:'[Rf>1a<}8c6Bbf^ulON3{bFyqƦlՅ̼؞lKgMذ yձ= ڗ:5M*`OĉU]+>\38T.j=ʻKW}Hg6q\*+=q?'V zw:"s 2g }xoM };5~Qedޚv"j/JAaǜ+!51eD_4FB# RdX9 =G6/t*,!ꦌm&hȰs~z.l^TXC&HOMM9J"a*\ټЩL2>qE UB-7VE3~*Ԁ=|lia[of dT)'ϥyEINᘆl( S3Uܓ?$6Qs{.f z{mD09Dj %C*K OېarՄJ.U.ڙ\ !e 3P+\\3/%> bT7'6`6Uh=CEW :8Ũ| n(N(mlzD;XwFuqQPPT v>]),d=58B`}-RYj$3W@b8b, v*E'-II gp:&2lYP[|av ;-"m^8{yrvxyNw[bEڼ4q3>s(&DĦ㋴yi&ag9}9 PLމnMiLs3-s$5NIuB'}pՏ}8Si *.!N{p<;%T\B ?:/W?L * 8rDߦR7 rd)DBlTpM7n4ȠSFL/'07}nJh2ȑA+ϧ^N <,  ( o)7B5y&?{Y)P:RvknpjL:~, @;S(t4~ rteY._wȧP@hxK٭J.JzL kTCs"9e\ V&b)0Erˢ3(*#F3%LS S`<,ΗEg ;̠"mB4)Qt%{D};wAEۄiTR!7(EJv0"8\ 7Ҩ $CcCoP>Fѕ 2~<:>Wh!TGگ6dy4t}~ICN3_S7LO;lh|_PfinwאB%:88~M0=_c\0eY miؤqL ٽ,aʲ> I {Yy sAÔe5}>b A2q'd .+ 'Ge?F' }cdl]W.NH|eܣԝO( غL\4G;4(EP,) h^%x 윟8pnڟOѼJ9?moOqKܔ?S9yp)s~;2ǟ ù)kV?!rD*~S`wd?A,esSL~B -'wF.̽ խ^B@a.ZO\{/(lM[ia!2x6\"0_P2VBxe  Ş [ģ$*Z X s=}GUIT03+N{&,os6h5`;'g ռ'7aKeկ}>V"T{׬Mr yNn¢B_:9|DԩYB)?V>܄E/VurXS]6Ʌ2S}}8 ^* ~Qڻfm e戔>Xhn5ЩTXzT)|jjx.3++S+7#R`~]fVV'BRcWoQ 1*2yުcn@v7zw=TcsUe(U܀n_Syǀ窘/Qx߹ l2[_(CK"a_X&!1ef)=FQ(D,3}ؿL,CalR"z~)P-XgaX`sٚDRFZL/c2 '^08CA lxЉB\'3Z=hNo ap@l.OF'fzzj0A' r]>Oh ~79'`ƦΑ CYq3nr*NF95yM#a% ]tf TrjR;GJ 2 =*g ǘ_ݸ8R &Bkhpپ;.()81q3-=.qM}w\]ORpc~wf[{\Hu/l d<:Hđ^6ZCquSƥ' tdZP6Eڳʒ}KO,9*Y#Img%K0/Xs-jAUFiB+K ҞTJWN ?$!5S)Uy]}( A&,Н@❋IhCj4SPQ@*9^M)ٸL-A{ 2 w0ܩn FESrqZrуe:aS4f25t*!2sf-hq `pWSΕ״(n˰ToI7'ᮎ+iQȥ$a\nO]O9W^ӢKIN[/R/F' JM&yqF*ۋBÐ 'hM>"Ttӷ$!NT5F}O%-6r}rEo/n I C&jRIZl6䎋0RM^L8Q=BESeOvBjPku>21^(Iˎ톅ՠh| "=ebNQ:? Z A@Dzd jݶ 9+i58U@*es~(W6~mt.x:{OVګiЃ_ eٰ- *`ޙ))˲aEc[puU3-w;R*sSοeƶ.%ꪀ?xgZvT禜w/ˆm]KU[δHM9(N7Iu*ͫLc)$_t1B/FQo8%0T"WRHvcC_8p$K`֩D42 a AFO_fuF )]ZϛFfIA"wHyGmSf-7=E6 ڦZvk=o 48 ORĞbqc^!\Eٯkhp4=lҝBb-+_0=iH{jَ;K{pZVda{Ґ"Kw *~][YlZfOʛ;"(Eٳiٴd ! ?QՕ7wjEP̋$gӲiC<)~+o*I M*{χ jr;U|8* uz)Tփ 0v2tDp,UD7@p R4(?`6dVXn v U;" jFqbGށ0-xNI6vE6Ռ܃ŎaZfm)T$l2LŹ x´!:%SIdV3s;iCtJͷcAёzޣ^π{sJu$%|!#* rt(%e)Lho:x9}UMmd$4g;uIҏ w8-țIiv4\(ɥ2 p[7Shֹ &QbK?.d@ $ P0M*R^X5vu٢ْG9!`nT)jBE[%'|s,C,B6@KSxaՄځefKN 2Y_q*+M6G$lNev!0ZUhWl"I\Qؖ#Vhg}fo'C`Ю4D >-G 8NhU]i<$qE}W<l>_\B&HD y{rРALx |xo텗7M@A-Yl /o|q  AZ1 W,5֯I54`YΎsMEgW-=+0-Y$k_˓(kh :皊FZzV\aZHX'Qtg9;5 xx^v)Ұ볖qםR0&$V CSag-J;8$axMH(:x2HîZǕ>^wJqHƛPtZe$ #N!] +}ZRvJcEhW:Ph;L/`Ɗ(ѮtR ?w~_:kI )QP]@~ģ0 r{5nOS.T@4/pkݞX] h2f_9g?m=tsOPd6s ( /I^76Cjfí $[J)P_nKm..}S̆[|IR3$yȗ\\ +3o)@)fI/MU3nW%gRJ zu0oWXdݣ8IDcQeCu,3`߮=gɸGqxƨ\ˌ3TYfȧ]a-zΒqw$QG qz*!E~\}еvAXQ86TTC:b9A-k킰plé"{4:WqurZBaE !:p\weJ'JsyƑ6Ctd5<`.OgW"N#mχ"akpyߕ*](ϮE7GёEv4+U[f~+'*$JM R]8WVnm3u9"'U)Wept36#grDMRHev"\Y!fmG .>@T_ ErClۨ\|!Py/ #J\\T8(q!B%^}G^l wq1P:6C@K7(isqS|ct ->ڀ*.YU>32Y-w+/GSRZ|MU\6|fdlC]a-ZV<_1.h-0A.:}gސ%"r1dc@idf+z̻ owtV[SW 4Noj\DI鬶) *~3[i 0;݉YmSL]e3Tf҄;- apux%⧘f(l wZ&xS~Xj!Wœ!(!KE7'`4cB'CpQ\CC0nBc!N:ib\O.`>,݄Bu {FMߝ` N<}0?;5t5&L7xM `!~6}wrk%k8Mn,қ /]9>L~H:ZB-gRZ_s2|`fuI9[ tId0"k #8sAHf}aE'ZGpl9,$HLȃ\(0cA7ǔqMo:0P`Z4 ##o`)ta1!riGFBD{8S5 :p팊4tt@t_  Y5sট-9*h ʿ?!kM?[3*rTЕ-B+d!4 & ;}))\ sΚm )MRGwTS S3f5("Q2|Ï@ܧ4Gsf$9k"PE*4IeSM&Oi"HsDhTpۭ1NaB$CH\̄^D[c TI ?.Ns7m8䇩 R !pm3~\xo $'I'`Nh3݃mвEKHN|Of+ `Ge59$`G9!t VB-ks R۳>S\$9Y[Չ:A&g}@.Hr"[< {pkJe \ ʄ<5^b٫93ѵUNUj13&@ ykIJWKsdgƣk4bep L(xeΌGV9)V;iQ& ^-͑rRwWӈ,j:Έc(F<\POU4ÁY<u:Qxأ-T:iԳyt;#upAG?%[Vux!̰?:} 80Vs&T]K6"{Cʙa ~t@p``ML"blC3"Z9|SEv-8 td7dYCtZiՑ>Go)u=$J pˇȫ#}ϑOSg{HiWG]P4U3v.kKP,]HTPާhlg1]3뗶"Y<OsATcvg/mCEFx t!QAy.傢vQ\ _چfB>]ȳS#\ߛ+NG08SMrg G+S7yYWjk`pMN!<Wr}o8N5} \ZO?!JL#V ğ&`/v[L?R <~VC,G"?M^>~rhy>(1Y(X-D|]o1 M}8{Keg"6nO jREqDlFVE2f1_2-ezS?6eHcZc;[.; t~ZmPː/G+ߎb_m1}ſUGq}. O"V1 b%j+\E&bV|V*JV0P"y~LEYoEc7zw2}jAvE |K,ًSdh~4%OI0cGY2ijb1=iK.aƎdg/Nj9cz£ {(cZBozN1G4-Pƴrgn&9\yR*n}bi[i ܾM8r(9jU4Cʝ}pPsrIժ9*il$,ЎXLR`Ca*"XdqIXN=!?-PUDv]+.zBB;~`1I ݏ[`!V P#~@ ?4=MM "謶wFF~2h&zP8%W@DYm }B5dL 6qJ6 @fטz }洹^ke8ͮ1QٝPIis , q/]c٣;+&{8Y_6ԳGgwVC=L$5ͅ*p^,4-yX]AG~Ds?=MnF(hZH~{,EQдbw)Fw. 뺃ot-徆k l|*$\u'Z} !HA4UH P'WOCi1pOX|h)5,s{0=%fxSH <lg`zJ9`͢٥"?˧ty?x#&sEK?E~O~ !,+ +:&d% WB 0loAWuMnK.L*a٦,?$ݖ\7\ 7?T˜M#Y ?^bP,EhׄU&um>XhSFlvCdJ8E1<"|0G'&Ц ] 4@qbxE)`NLM Ai Q}FK3t;1ܨBhjX+06ЍfwcQs<հzMW*af9mBm-9ǀ r yaTr A|ʆ ) ^Sa5 yZ+ R ,7ǧj@.q!aW)$@.Xz9oOՀ]Ch=®S6,HH\r4 )wϻ}z]g`A0J_λf;~)f~yTP%a>ٝwvR~4^#J(]};6i !F:S#?b˺eq̚eHrCtC%feG~,qŖu5#ː䚇L4;JʎX-1kG! B4 gN$5Ŭa]^Z !̌,|IkYܻR0[ XB}]9֙Y8wzaja ЦŲQ8x8 *WK2ЮFWMe%JpqԙUcue]BCJG,3\..,B s (B_-`-rc??T+a^>F|#~W0WwE!/|7EGʥP:` dto6>tO-ێeܽ dVb~m|螖[{yɬ{M=-l;s.Y ]2_)WҺ̰dޅ19e2)MQة_ʥq*[f.;}eSw Sƫ%KMTv,]vDX6EA`WK( D$\oJ$0އ/>tsFwunQbqI޾NIa_|-3ܢ p}+3rHs*'K2>10SR JtY"O  OBd}c6aL;f-|D.A/xPlØvZNI)(e\Ftϑ]TZA~`>Dݶ DAh|׍#Gڃ7|m 0q6 LĂ.mAX+&qX|N x] ۂ|v{W1Md:7F- 0  bc bun:Z+@ p6F'}|ص m |5q=@O5'kW =j+{kNa׮V3{'7W~=לî]-fKa6*d>-d3 U^ G͗|mCU|ZV5f>'y%x/ &k0Ty} O6J$ e5Ի1${P\ݱ9 ۠ɟ>F5ʊkwcHxFcesA?{jRǐ7Aqv(s+(o& P+4/'PcqɦJ(.onIn18ġVh_O2M-ҕQ\.ܒ42bpCt@e%Z+9 \%ie"X~q?ˌK6HWrDqAxsKp(`:sk tJ XKJB][O6tV e-fѷ"N-Ʒ lZͮգo+E(Z4`-) uo S|.k[E*I]tnyo;hf\xyUD>$Hv._K o=>&6vѹ}H] C\5cXccѥ?8Nq)%%ɹT&jư,KqBSJ2PKs%L qՌa%YD:őd$JPK.w u#O)@M/IΕ2k8Boa~}u u\p:'q>iЧ" tN"5}Ӿ;O?TgE&q v=-h1??w{k/@{Z!c~s"O-:׀]؁C2rE[t F+MYe[g2a}gbtҜxJ3VNG?d02%إ9g4eól`eJѱKs)%.Zig/8: ˔<cSJ cNY[SzQa'w$*ǜ\y4>ef}ԳnKNP %HT9h}g=oݖBOEܡ;hq0H[ƘG cat煒Su!ae1ݏ,M %lC- n=c1Y䫛rѝJNE &(ٞl`"JNkA+NsuM@5Q,=}FkD> ?P"WWjXd{z|(9A~> DR{ xz#*L;ٲU V )f@͗GUd7ve@LR"I镛/n0`gV66X-D&+7_IW`Ζ1mD<:R,g u,^fxu:X& ":X F^jKtH#,LEt{? 8/t#ڰͼ3&Nq*^F럧 ay3fLL>ҝT<Ӎ?O#pk6f͘|; M6-D?ÂV^|i'>GQl.[~~ӇL:*N| 9t2\ ZyrOuU(rFbdl!M2L8Q>'#%|1l$ʣRab烙C]\GJcRHGI-(1MǤ(K=ZeP bv 'T6n.Xˌ9C5]9-Ozm]7Խ—sjZ/,rZ>P <ndc{ /3 մ^t <}6E٘+% 4IGzπ hxl1sSW8Khv1%ec*p.0$b<&\K)MU^\<,aI:xLG a;ZF`rZK$^w"Zs I~i )k=>D}c#:Ak-px9 ;]?G:Wa7|e]k)wKN32tJMoī:0J˺:R$wFgd\ވW7u`uu w4mNf{zaM4RD>Jhb<>þii|& /b$:y}8I}7H(+M^ľInu0pӓn"ʧ%QV $} u|J<2]TPvDX|Ajyd`#  62*Fv PA(Pcmd eM*0(Ukvsi7G|zʚUDaPO/??Cn 5'*à^T 0~@ ;ZS3p_T,@niwf Y#eύX>-*hMvG>~˞S}ZU?xњ1dk|2=7b! =GLַrqT2$,}U0v%=z+f9oZ dHX3`J{ Vr0[QȐ 4 #w[t,1w<_y[~rbp}NS3XR*ɕَiaI[?])TzcO+3<+ 07zCJRƞ'Wfd;yVA&ano ۍ9TR]GGrT ndN~s.饺V05&,_ɜ2n7tS]KuQaxk4MX 9e ̯}E]Bav=xʌd>_I x?&0^{n}(0uu ~JM`,>)3 P_~%=."3xY|Sf$Gr6mi=Pi$bxYG7S2BEmz&H>cdTn/e۴LC|NJf,^N ҭMŽu@TPf-zF[7,{u똁̂7Zv?RG6'oX*1QAo~J# B]nd+=vsQ4$bB!|_#<*Vz4h,H2 B^wFxU"hGX#eO r$DXѴ !Fҟ&i0YOc@.]WR2 97ih`ށV]dAzs@Oo sd%=t]I 怞A &cf U%EdaǟtM(B9 JȋP4f?vM?sPr106W: h~ ܀=+dp@ya"1>Oa螵ߜٞOoz|hEb}7=k9=Ky Њ ~sf{>e a)Z˥^ٲGc?]h5SK5_s1eado:(jjM/jbxeގuP 0w) ήBַ{Yaz&hb~;h]]oZcM %9bѬvڻ: Y)f՛KrsYl؋h,;M$*821 ٰVY,w›HU>p-e.Wc@/a/X78"|o[\$_d^D[e o"qDV߶8\EIZFGZyګz#,5: 1,> WFXj,t`c}Y|s }jiiꍰX6x.|7 n aHVO#Yq~dao5Iģ **F#31:0eIkGT!YU>G ggb“uaʒ$ D9xw t{'e4ZMy(*O s9 Nh\'ԛPU1s읔ѸNh7硨P@?% :cH3;)qRo"CQW@:>Yp^r;)|)vLu}'P)uvt-rST@ SN"LgORyZ䦨E ue+{[vbK(aELJ+AW V !PÊ-gqW"וmB5.$[] :^k@q< ҟE)6-Vgtߑ#׀6x@;?Rl[ξx#GmPwJ.,X} "|G\ڈ>\,JYl:)LN cxۉ @S <9X$3 nDW+z09xrH:g2n'V. Tp J#A.{8=O,f|e. 0F4J]pzXBUER]-`(h<򅾫 Y<؉&T%Bhv wt pB`_|."@D=fӅ@9$ ]'E @?M`q5;,]tN‡5A!kX#vnY 4kfBְ.Gܲt pGˀ@V tr7f5^3"|8+%anj f29.EZ%qVJxd>r\J㬔()x4g0!UMN$P1 0R(Lh`BnHc`Pќ;W69 gЬ܄Y8q@([Y۹ 9q KqPCsr6fx_ v$8#l`>Q-kyH pG|a-؊ | [0ڑhB[D` #1񅅶`++ /lX $=Ylcy՚0<&x7Hz> h5|5`j7y^M7o|fAjUk"no P#)daD]IX*>1\MGSˆ U%@}cw%cK @L1GO!imj8"bqC6>3.[pD81->m|f]p<b9Z}: AkEMFd7|b=޳֯N o *{4g4_6d'c%{pk>_NDǔ1HK޿>|;;)cE7ý}w~ 4rPY 'Ydh:r9'<NveurTO@ey7,d 4} ɤոP( /(iTcIq[=omQ@:^Pr3&VzBۢtSfM&mEJazO:'IdWt~sTuxO5*涇9?q$j_ 2../ }젶"3yDe\|i]^J*-AmEf)ʸҺ2UZڊ̈S 莾1*P=wx+5}cTz.gWk;ƨ/C\Ϯ v@wQ_깼Ã]֯@~ʂCPFXZS67ibni㱴4Xmn") AciiLܤE&e bu#Nt []]F$%u!< 4ۋ9֍HJ:Q ؛=7W%*t>C7{n7JJUP} Ncoo^ȫӡ@ BzI1,l-PySɘbXZơnu!1M@ %ŰC#BN%c>Kaakʻ FԅJ4}*H8NڐZ T'Zp!q<N"8/>kCnk] j4*?s|yQܱiR{IUF'*cӤN瓪ϱOUE PUONcD[!u/2SLj .B^rCU=e:'k@\lԽ>ztOL#:@H]rK#C9:hhwaGrtJ}#v1.Î = ]./]Zh?a_2b]_~ndtZ<Xwi~ lJދr!8N,(ؔ8/*BqXP){/q2z_T8`S^d9qb1 C헬ǭT>'} @/Y;[6}O_vSm' Ͻ#~W120Mn͟{YGb+da?I_-;L^'\i]2%}Zv.X NҺP=J4 YvËz˽iV|9@P{+$d /r @dCQ]h^<}Ȇ,d(Ѽ09y YF"$vP$yar imԆK:VOA -t:@P.[(H[=um#/6\PA}o 3/$4ŧXg|S_ IdiO+ 4dHܿW\ˇ@iP[ɐj=DҠ!rz\&r-2 $9~J< ! Is$jx BI((4$Q!=P1P=ݏ?C-=Ch{/;Zzt?NK_v d}BBfF90 >̌bs2a8@}e d p @hǭ:2[6= [7-udmzn66ZoE(>nllb[cAʡHWĶ,$CL_%őmYI*J#] 4;NN:+#hPwptXWGР8n; ) >4̯a#@VOS@,}h&_FXL2bYm?Md~E|u30QGkfaڣ2eôGe? YZW94[r(hLy gi]9PИ 0Лy v0a7)*( a@,BoRT-PYޤ['ހ,TxԀiYv {zP*R*v/ΓkvTd^'(ڽ8O!5 q9=$Rs{ : Hƥ, 92ao-@4seZ.hl82,]ٖqwk8>e@X}/)p|X_RVe_ĬCPʾY'Z}%NC QL#6BeY$GlʴHD1AP ig =@v5{Pzl#j6F@m! @|.V$9_\8Hs4[q| pEX.Lh`ӱ\c0 d7 o[}96& sl>lMh3Hd@a+gȸ)V0d#qS w­wſt[Am-Y Z ,E4Yh ,{d)Xz;4'' v:#hNO@tFМ, @/\<*_ȵ>x Uks} &P"L D@0/'<П<.;y?y\vB f@斾@.̀-}+\[V REe% "JHE(,*3;oOmgv!< ^)XR@K@{c @du3<&gxM]ܚ\cԻ5wqkr c-^k Z '+@O$9VH0r=`X-xY[d (vP+ &o8 Mp@7yƤ~I5҃1Hb^ FP9'rN J@R(FQJt; T/P P@Ys Zbh H @B@ 5 q  @  4333333333333333333333333333333gffffffffffffffffffffffffffffff (\(\(\(\(\(\QQQQQQ> ףp= ףp= ףp= ףp= ףp= ףp= @5^I +S㥛 rh|?5^I jtV-K7A`"~jtx&1Zd;OnʡEx&1MbX9v/$ClMb"u&S:M Oec]FC9#J{/L F%u^)ǺׁsF_LJ46?m23.&pnꐛ|~!<8b->d*g\8LYW#Q-沔& .EarD:l4!j9V:ouVt7}hBr nu7"˭oф@4W[o )gӀO"j(#]T=,/RΐEQGΩ(M{W%Y^_!O> /tSQxJ jg 5cO/#B%02t j+Ǭ.r!=_FzK`eN?1WY?]Bt{I-~8ctlG~ȅ'-oRH#ȗL8. MQ!ߤ2'ߑG}5/-Cp]p BIe`O #9Lk _Z2@$4!AqBQ2{N=`s%pA(@9ld &$zJ&hQ?>sO F8LH8͕PMB H4L(C^A(/t>du@4i Q7P_ |fչg @f3e 9nz`p s lG O5~gS|]›})+6!M3ŸtkΦ&0m7RVmBf)?`MMCua o"4 gۄ4MH%QptӘW/|HDKj#z \12Q_<tuH:KN߹b`eȇ$#ys9ttsʐGIF4-9$"s!.9 &ϧLup eQ.=RViۧe96L}z`r#kDH! s,HmR,@ 5إGT׈$C(Xڤ2eYAXkʱK!IP ejz1E x)[OiAv\(9$uGbf3R^ෟvӦQzsHg4ॼno?Mq QCtO')pƺ%IbYu鐟*OR,uK,LŲ$"F!!?UXX4&eHCB*C~w v2Dzkx);Ql  }e098)xSp[w(Y  3L3zhyBuqt +TjwbٕHf?G+q TWIJ+10bÏV2dS݉eWb a g]\'D')T=z!GFy͜Z~sKl1:kq}{2>8rO!bu*/6( e.}pBpT^lP=\`m?֩ؠ 0(_{82`[| N`%hK+q,?%d>"wKѬV'X~-:cqp@ 8v;|VZbuL8/A qt wHH?2q_0Yhe99gyf3jl-+cxRz>rl=fFZW ,m>ӥ)j}z83͌ Xڎ}KS .~>aµ3U9V7+ƲuC.[|G?pkg{snVWleև]:1~ TXݬ֭ݻtb LYD,k*i_|AXx߉UӾa'/ 2; wgK$}N_d:w'b}'^VIL¬r)KY/-;yUARY/ (R<_-#C'Z2v<mi& ^Pȥ,ey[FNdUyx=J ;Wy47C[ToG&BWG/wKKΥevhnގ0LWOυ^(K$!Q\ mQa௞ ]P--9IB /haIYlRhYCqQQs ^$ % &pߥrѾ 㢢P@IAJ $AdMK}d WWEE΁xAHbE.ʯBL@4j(z&)(A2[VOsgi44P MRf Qd=9j>-h9hX{nY%r<} p3]{6U j(j 4(x]m*fl)@pQ@hPd_`KUq vTaS ᶣРuɾzؗ 9bT,Ą-sb!Z! ۩Yb1݉ [ ĊCB+Sڳ:2b,ΫΉÇh4xWlggudXWw'&lj\M3|!{޸D~|ո;iÛf#B4{)6b[qB0qwӆ7\?FhRmĶ6z pU3*N>\߃M{dWqe` cgT|ȺŁ0h?UΨ8p}fk7u#_a~& '8|i0 ɶJ:ߍli):M"qI(^amt'SuD4?Q,$*67N eTՠn4q vVT!qH'51˨ Ai2쬨Cp6Nj2bQA0We,YQ!"m d/`wۧXB Elĭ韍bSM44_D#W5>[?Ŭ&hi/FMk}6YO5M$_|\k g$Evu)LX*7ęHj9IH7AS&Un8X 3—sn]كL0a9p*g" &БMi!{$fCy+بJ̳,}fTI6LVQg?)A5Y.l# `*1~SƒjS]&G0SQ ֏L%Z0_2yԑjAr)YADJn!45a Te#ՂF!Q?Mn;t:mY9ܪtƂXN;}V)"vtuuV۲vsU wD 4SDꬶep R2t[f@/.bG|U]8/dޝ̮^ ]p'J=_н;o]7v@+UuOz{w2ozw{W<cv~ƣX鯕4,KKĔU6m /G_+i3X)*m٩1_bVҔg,A/ycSVU ^epOD] ~8jݪ3k=oYZun)FZqԺUUg$z!{޲F?2uR#4uH mKVAȣ=Oe$T任#1LGb%!A{HwwEb/[*"JB:h#_ʷ 2UDy*#ѧ"}tӸ\FW5=DҴf4;:!:ƒJсçqjzN?ihcwt Ct%Or_~JӪ@K) 3Nv-J8Ĭ*d]c甞gZpYUrP!=)M)=QC8ٵ( B"6{t9SSz $q+i2 JcRK2HV99eM8JTץTe6 ǭSs»s˴N+)qK.l [wHӗi7VS(S]R]j:8N”K.QH>1w`;lE^tpW܅)5\P!|UcvغXwHo@AɉkK۴,)} @y3/֖viYdR` !-"g$'^-nӲ ޞ$yY<cm-{:nU<#(=I6 x 45 [tXxŇGPu{/mdhjA鸱V$_,6)4klqcAb1QF)_o;]ח9Ő``llsbRH'w/sg+!'<PG|O w]_VCO$y vA8Tg/EFawj ܠ#p~mR_8ɋ6lAgcGz7Pڞpm ߩ5rΚǎ qe+78h!q^}M)Rd5 ˘W -ophCR9j7s12ZЊy5H9r3o.c^1NAԬ6Mjt GwD}#,YufmHS@)8 G Mo}IC*ق/2Pv\=0 ){U_7d6zG7 z$maR g 0n`lC hח$mFvdUGR&p|FHH+1/Id^9ȪLWbl__>ȶrEۑUM H99#i=#ؾ|&m{4#>2s4rF@:Z+&&LK $P=-tVLLBmŗ(I=Lz[.Hǵ&j0ڊ/Q*{@\k fUMvhP%6sf$_9ī 7FР>KSn=X6eQtc"C|J= Pt{l<|9DZGGr"}gr6q@Etp :SEvym聊1o7t;ʵ 9cn `Ѱ7쁥[$_ӷ)g7Ú|aёo;.KHoSn5%G#w\n|Mҧ`Ck.K ]',E4QIP!y oMBͻN tAY0czi&!C؋^ߚw9育`D%A=LB5 5 3r81e-ꥉJ{ a/kx}k/J =Úz.!K<){._z5ѫ]BjZyR^]\(- kͣWn/ FA no5.)M<$XAًXޔk]R#~חyxH۱o2)׈F6݋/(cg/ pX;^8A #00P;!0{ w6~q7FFa`4v|C&a'a1xm+oh@7L%Mbm W oKCF_0[h(Mɚ|^B獾`$+0#P&==5 58=h }HWlaFLzzj4A 'kqzz Rkt|SK=@53-;~~80#Q]{jfZv-6oJٯaFMk.̴[m Be\*BWoX1½N+-˸TZO+tnb"{+$l1W+Yῗq& V\bD V:IbW/Ri=M}Ŋt\iL֓uU%ʹ/JeVzӀ'!*4!J7i;_:%ʬ3YOBTdhV-Bo4v$*u7JY f=xs6{D< f| JYJuzRT[mx5DWΩ4j)+e*_; ebƺW60QЮc,oGlN " /uw:m`H]Xގ؜E^>^u#FA!9U/@$+4}ܽG!vC`y;bs^opIJ.Wӵ9ڬ~"Vfyje]Okg/rYJ'.DP˻П^N^hN\X噫 X('(()Sy3ď-HQPN:QzGQ KๅJ2 jVl;_ټg۩/Ls eQAԲvZy0S_)*ʸ׃e[ų~ealR2-Tj'7qGկQ˶gi=N}\n$usNX0ֻǸ}gIts朰;~aw &hNj-,G&uJJ$/.%?"KKМpՄ3Z2XLꔔH^\yK~2ZsE9>ܫ gd))d, q ,{zV9]ՙXVʷeGWa&X&sp3ӱoˎjM2)YMv!Tgc-Z)ߖ]VUgd`ySԳBLZR-; E౜ݐ(/T)'$ؾ\9>(c9#!{Q_RO$HTE}7r|PrFvC4hSpHbn" jL CTTF2:Ya˹aO/N/yAHÇ?Pө2эd,t-–s39ž^^QSeXd " ZQJ RyRy0PvODCJ`42i9u! $hE))KIh@er=B IЊRR(ʓʃрʤ{2gׅ7,'v([][ǽ {4>o8 r Qn4f{1"i|$p:@A nitnb(EH >s _@`S_IH)99F;/AXXg}@:.R,rrv^r! Ṕ|MuN}%!]XBca (M3ܳJ:T-k/yk9QfgReu@%V[(^5M q4p*JPP0j.GiUJZm_{a7][3dd2-w]QSE|Syy*ĤΏE *d>Z Pջ.TI%(9T|ޡwDMM]J8?)P bqƆfu70.Q.Uۤ nvT cʹn`R%\\nI<ǩ"ƚiJDT n2x ![4'7k:Y@Xwp~XCiPF5Q eΰq$mC귷zo -|jB? bS)IX.~Ih  1s(R+]1@8MA4cQL'@W`i,%WcphJO:vvYKG7ь#B ˨Q:=S!#8QO9I5ѣt z.3BGp,"&3sjڣG 6KfT p@| :] {Sk>6ͨ:DA,sum*|.mQ%ulXNt)O9T mf&}cDa};//-CE=M͉Rv^_Z!{t4"  aC#.n3s7iC7' KEy,~i†7aI 3 l ;5Bt+&NoÒ.f*,;vjWʣãMX,%)\,TXv5,G#G8 9,n\o~=ob4cVtmrVY6B$T#{i Ǭn<6I䬲@#lIpF@Yҵyll |A%UA&%]sE,*|4KMKj%8XTc+;#3iT-,JvqV%vGg8Ӑ/ Z6Y.(bQK*ۀϞlZK҃o^#wm`Uxڛj >|>ش#߼F`"{Ƶ7(||i-UGHy޷ET'];{owA򱂒Aw˓O⯻v10ec%%3'_wFc`&m? JKg Rnyb9AzF:Ś?Zrb3su5췵\E6Ŋf$k;;ok6 %aq'Gag]b{4*?r^7J(O?iT~,^}o7Q~Gw!9} kٱ߇GL⇽',}2p Crfֲc3n'j{OYd2eg~N2% eXˎ>0)??%!6?o W-h9썡m(BI}@'[f03sCPHO\ 2a;g<߳7֛mEWp /?# N*m3 S8@Z_~\Kw)%GsU>.gq^= RJ,8禫| oj&MWYϘ/Oo>LJU %M1}o_T|Kd4]e=c޾n?V 7ѿ7U?)ӟwo5n8(>H%K%S?Dj,Vq&~L/4'7[,džՎJDD2+̦`i|^hOnY R-eWX#M2l9V;*1ZJˠF0e18kDr=EuG cqr+J׈:uzyO>40W(J!tճ&|h j -#Ӱd7*W&:Mӂ$[( V;F:anUL.u\'HPv8S;t:N \\6 gA6J w}BZh6"#/̾BmޕJkl%mDX=XG^}sۼ+-ܕa i%Jڈz0^:< yWZ+JFa`ya 5$wx/'#QWyFlKkj)I|_N \3c#6~n-H 5-0Vrx=8ce 3tSji0Z`0夝l)/{pʀūg`Xa8I;R^O+WM y&x[ؓ+ͳWQa*M&P'WT;gD#TR )M`obO~+w4r_F F S4BŞ\QVGhSIu9)w &s'eǿ6OkuqR MN %"O) m8!.)4ϝJtE؟SY>ZL?fϧڊ}r! 8rxBsdT!a3fVOWq:\-=Bf7ͬ`  ȗ[z SoY=)[##p  )7zR5QZjQ::$dѺ5R1 Wv2=%-ԐttkI>u7jcd{I[Fi!Gג}FnH!,\ɜ !mAaO^PLAbIA'<_(CڂÞ:Ē@Ox;P/n|k!=yu@1%F|w|_ L9N }́gKS#_sLfO1F&0781Z7@͞c,ML|`??oqb(3n<>=eXL4j?NI| ٭2Qh&Բ,ZCG8K>[)#d>0Le8Y'*q2|dRG|HG !Խn0}43=zv4(LۧGQCI{-`ifzhPOڣzS[80m P N7dxTY*\2'_>SA1nTr.T.e*O }F?>8bܨQg]p]T|AL{*q:ĸQ%ţϺPẔ<g>f$m\%lvX1dk7f1D} ImJ&nݱc4pnbГt7rMbݺchݘ RkJ* Q#BXz-V,(Х8 |U|-FZ%9ZXpOKq*,[D JbsX  }27+`tO7zD, @dnWD0$nY?<$ #`I=;7~y蓹I\wG{wo>'g%uیPS| {3);J$ /5d/ 4eSvI@_l3jBM._@1Lh P*ujdFpH !!ϡM4qN*yv|*(ͩ|s5^CCC'hTUQvS jÇ?65N9 ~7A.X?NqBÍ U^0!h T\ı⮅`B@eI"c:ϟ8] 7.T{˒REg Nzg؏>Eiq153`-:a?Bf }b4j0gNӢw3EFEpz-uЃ|5E-&m gT ut/|K<\*q4Tto/D\dN_xȹ4(e Uhjި+_l)ѝ1/siPRѽQW[U!rֵK*z ӫŞwMM)7J4"W=)ڛ6 Rn5h {DE1L{S޵7m4,k(,< apBVK!w,pH3;_^6?BX+%Efv El~6 YE/ܱ_WHJ"@8{l YhoZFtNmbseϳV?1^gj'jy5~n;=͡ `-c:B[~;O2kvj{C[(.{ ُ@Lrܐp0{2,~H@YEo5$"䂹!`dXd;q<2Cka?ID2sCɰ!vyfe G3 s&X[#fK74NYLgPM,F0/͖[oh#Π6(7`Yn`N_-8eF \Sqn* )ygy. z TSYk\>%IrMŹ, 4zq|$Kړ 8+(䚊sSYLi^g>sH'p wѨGd }A*I(q7.VQ]Ȣ'6k CU>" Pn\ܭF~EO2<-m*|& 9C-"X  g6"LAsZ,XE2^m5DB X8beL7?(0WTk0 hWO lu! \ pw{NѮV [Br%F5]&<-օ,p3 Kw9j6GZM$xZ`o Y2f@˕,st%m~xF|, Lʌ,]IJ$R47Y\;,Y.ӕHioz(f3)3w#X\Hw 6*Q ᖿ|W;סpmVtmTA|-0v)CۼbۨDmG[a\,R\#y[} U@|M˔ANfyvZЃm$嫲'$݁)$$$6HWe!OSI5-/S9II$WIlhABtkZ^ r0ϓHЂl#)_<JHEyTZ65wJqt WC.}Vlke!f!Ad\:?jٔIC̒ OT6 -se^đsƒ4@;)mγ5XZ]n#%i:QvSڜgk.̕zGKn 6tЧ9`]h+{w%ܞl3\q)FQKd%O79/tgR"XãD1JBo?nr^]sǥ8EGb,>a)0%'[T 3AN?j,YR`.JNf zOZ;h2X(\lQ-:Vw0ePK Rvo͝Rؽw!Kdjm)s^ꢏMqoq 5y|vg,8bgSEvMj+ΒYpΦK)2:H7 KWdaX7PB@e u“@owS?&´o'#4~L.T/_icdC ! ,7;:,/uqRǶdY k i |r_'i(4R{ѢuALǿO|mP (#7-7iE%uڦPGnZnH TtV:Ljv*+-׭ul?0u O ,$,TPuO5VZ[ 2`ɟXHXk\ e"5T?-PAx6Gm&=wPvs- +xm"72M{zLEm[V6Dn&eB&&ݷ $w`+t|ҽz)1,1Q^\,G>,IW{pS&cXbj$X|YѯQKLưhGHR{q, LfMvu1b`!Z#]9vI9#͚ bBF)rʓq0G5A&'ňpkSlwlە'#`ʏP7kLO ٶ+OGy(vq6hkS/^;vAP*4|km4&צ܉_w Uhp?"hMM{ S^ ^{ #п'c+͚>))`0A@RFR}NV5|RN={wS3`{큤B4k v?w&pFMKTis4p ~d/L4ጚ3u2i *A_ܙh5/gP .e U3ф3j_ϠJ]ˤ/|̀V2=¬) Bj*y[<7Ud:G{*Y'S@Tطyn.ZtƏTNo.V OhL!#c_ͪF$a3韊!zܙ6C(G ǾUH6f?C>3mPX}7 Ot*'>?gs X I%xe>"TN| /J6 lk |D<5ө^2`)$l@ॗxjS9 !83dRH*ـ%K//H!w Ӥ0S z&AՑ"YBoiB3IaLT#yEB!-,fNL)0ꙨUGf Y M_< yzp Ghhf){Tr~g.8̸SWP6?038cw钠hOdSOnU}gql%AѮt ]GwhcD &{d'6/|])VJŕLj@2L`Ol_S q ܙ?7+dجuQgX* 9s[>OR+GD8.r8= |3(p+Vx-/܉p[p{nV?AgPVK2Z^tT,3~ΠZe>r'©=_i"¹Y췫z Jn {Dͅsx oW)܀#| f߮)S2( [*djd!QRzcѼ,V/ՎXT.CjƢyY ^3jO]FI EXT;v[Sgb |PE*uOtVj?x'{v+SU6++V!~bOVB!8mVV>[CuۭLB/ Tq۬|ZU>"M l2I"LWEDd荕 %EdF7vE+Ip75Ɍnv'#0_7V2 jI>[OIԕ`: /iS> gj|Hb+tj_&v|"n&&n=%RW&ĿLDND( *n:I ZwBTV6@;wUܖuB!NlRv視-$1juCR3 R[٤ Uq[NIb܇f:ⷲI`w+u43_N4>T-Ad^8 &WVigi¡}ZȜp&Lލ>ԁ|9҄CP,9{L Ѩ_#U[ ܽ&>uQ8FL391J{M6m}dB~qVgsocJ6sVl tw_ŰcPu>DR+2(e-8p\a,|/^WdPεZp}ÎYC_IȠHkr-(+$z]A{Q$`% Nlg՚: &HK-zC5?u:d%::LE͗[$8"Vk&2tJt4t W)E؉:p}} ,Om3R1/i?t"^Q ZYfc`'^~D!9) zUz9;yLg.tҘ9q # tr&v \13s@C{GVLA2Kcfǁ0ӭ#șɃd:s̜M2 "*(^(>J (cu9clETP P}@n Qlr&z(ң?? ~Sˡ6]ق+?^ 7١>ΗCmtW4(@?o JCM}/t&f hxQ ]j9sٯ9u@2 R+aGV{dfKr(_szdRe 6WB̖ tQfɤ&lH鯐 X푙-AR˙~ͩI-Lؐ_! =#3[vQͶQ<*mi5 jVŠpEMtemx9T&jԬAኚG 7:DV5}^K;\hyќIyB rD+gFBrHKeA~@7~Wή;$<>qln]×w I =.y}#]9/0@z\/uR2y o jP E<2$[Vd<d~ߒԠdydH4Hy-%'A3#Ȑl?[i.uK- m! U (ʠ0(P?>[?BCP>F'p=b@oRxAχG||Nz$iBF2d4,HҊ6ΚɣO1d3k<*%m25۵Gg[ٟӟbf>x/TKd:kk'ζ?? \}4^: RBŭ W\VTZP\p R[^LLXG .^ r[Rj=/Cq}ñ. :K uj%F5}'QQo }Y#l6EK?kN*<.Gٰmŋ|GuGUd5ey\6XaoT-1B;ꎪ~klfkos"OU[a20XGZ7F2E*K2^da^ zwoeT "?Ume<`i j|"YDQe:%N( ZY0abD8[7tLU[KP&a *KdqطnE 蘪80hMdET C"cI+|6tΔ"꤆DDVln)=DI )R[  ',:SzƫZSj COZY䳡uW'5Hm՞' :j@EX6OqT 6?$su9m+"@m~9?Hbs)aW?w+Vsf>S15eө}S+î06tW6(̾ @ [!;ZP JވT-G(C24!4vw,ICZ*lQ܇dhBhh%ZC+X*y#QUآЄJ2WTF$ =3ݽ_wVw05 Vf{ " }9 Q{ϭ`k<tDr:A[Y8P0Xy d@2J+g/S1E&<~aɢ& dJW^fMb MyVÒEM(̚N{`s Ptu(QR`6v'8Ky}c"Pl~=Npo wBlf3|ŏn<?\^I87fxE=(繼,p o9?R{PsyY&7 7^q?%4C"6fC)n2 m_JijDl̆R.#&e{ &E٘ \GM,1hM\珋)駩1J(pYHu#On6kE{$Fwm0{P}C9`q;Z+ I? 2J`Zrv 1oi 5=9+ʫ`b$ #ёjz+sWWy 1ib;HFn#3W$o+bҎ3v tS: w:#8O ۣŧt(u,F-qZ4/ɷGCkO(QXV[?)h_oQ Ա~i~RO7Cb Vk3$v4Y;Ɵo !AfeI iv?BM[ͼ˒Їd l?4,8 6%3Ы"))k_í{h:Ypl7Jf4WERmS6<[t4poh@0ۦly| 2\=+|(Hs p~Ɯ$c.{V`QAu+xd9I(s]( %VsQlP4YSGAKD#׭5$OlNjv -wA@ug'+Pm ,W[ fAOVH;A/)Xi͂$+C ssV?ZR$>7sE4 ^ m̘[]f .$ALp$Tۘ1)ޯ]6Iz 2H1cnH3vA1&R2_lD]/ePmc"g6cLdxvو' YPC|',:ȳ J=(ZOXt)Ñg'A(0i?Y{fQ@ 񵞰 R#^OpP`+~R ߗzCsɊav\yI(o]4[/枓yÞhAR4 Q&2Ti{_ ='+=тr&i@Mvel /i?nV)J XJ1&<^ܪKS4(۱(!bLx=U[)h(QR3cq+Q BĘxI{qR>/OP<glV@0uWr ){f'Ss=`01wS tKOU47z`ԕc^u%s@薶 왉Ni ?FG/F[ٔ$U®i};_ȷ.v) I=j)R]3woQ\fS<#{ԲSV P 8T&8P3GKVwh%qLp,gTԱTJC)HP@Yt|#cO/[R.&ǡ2F>RPǞ^R;D+qdN:S=VRt 'v@Ȝ9uzͭ0TO Y~D-9usX8N[Ka1Js.bZ qx>ʙx/Tu}V 2źx..*}R3q^Zre]\U*g<[SF[%85 'y`De{`-Y?WiE*1aAq.qO$Z~ҊTUb‚$B]I"쁵d\ĄI<p?ɓ#*;DkJ+RU #xt s[n 3˾;݁hPm~J)-ԙJgă}w7Ѡ67SZm3O6ψ/ntwnAm )o U C>)g /S@|h$eW+;|&S_/6_H_WT) wL%_lN񡑔! VD1ܺm2O&PFɆ9W&"#8ccusdL^ sL XEF!p:p沷<@>4'\ Bteoy22z}hN6TϹ21$,| 2H8w)% =G Yk[:ʭ3de2RqRJz h׷u[g(d ^ܥ( Pk8$Jxz!FP;67\9#qIn© Bۡv.>mnsF(+S;C\ @||8A-8jo_-.aWڕx}qZp:޾Z] h+%Ώu }vcF_iWJ jQ@xj v)ӿҮ`9{{lJ P s7Sɗ6+@ߡ08nͧ"g/mV+! C 81k>ITm c|D;T,36&Gq4*c(}zw@3XflLNhTƬQ$% S&fP ؘ `{'v:ԛM61μQTOx0u7!lBk-b$3\Sy뉣> aPoB7لZH&g:G}S=ԡބo LpMu'4ݥƊ*#5Ҵu\u.Oe h$KU%5_Gjxim.\CHv+6Kj*Jq]$> jtk "$On*}O^roתDHP!UXAnӑ߮U+<>B=yƃ ]P;P?Wf0@-0ٱV[,#߻w6~6̲a~ ZacٷXGvAwl@l\edZor2~ـٸ2.5jyɎ dbJpL,2[ NⱴΚ,zl+,Y3d㭷0ci95[Y(V1Yg[o%8a^:r;k wZp#{jxIԤFyʹ>}Zr#VGՂIi}*|G h9%Q5iU _H"ib͓݃819Elİݛ'q(ÃUclsMC ئa7OtP^/C3әćX>vlJ6-F66o1f3щ7Z|ؔlZ llb66鉏 iLgnbر)ٴ@ll"D'>hcSi0D'>2\rZ{ #]ő ;e> N$][!fG7#AvC|rRIj'B(&(toGjd t(L7}(uX1;/)nnQۮbGQn>TQ*bvMC_R8ȣ,]Ŏ0}aUěqGYl 7 0 FD' XXޜ3 ota2ANqA`O9+~gj@&d ˃`azsVJMȇ@!6":=‚M?)9q -'ٷ4uSRiMs@Z6Ooi wɧ:6ā.ldϛe# ͎!T>ZV/+0Ū3;PRj\~PLB|_VaFU ?vge7{3xvB RT"w$~$n:Tf~DhYHZOѻ)ڝIt 5HQвޑwQ ;,Pݛje#i=Ew$?.aeйzrH~~] ˘9ts~A]N#@䯇91s.Cʝ gee%@Ǽ>QpiNJ@.b̳(clvAJyi}ӜE\ĘgQrٖ킖D59)1. ŷbMQf0*2t=!n/O֏<` ?oŚ>aTd{BJ^iyߊ5E}¨<5Z?򴃥"(k"4Q )u{yj~iKnHpe究ΡJ~HW{;jSm Cd2(Sw"NÕ&;*!^eP< ]!8:r9TFgr!cR C$qus ( ,*.3Ck(41 eDi*9OF\[rU#ɡfX=\7pˈrcUr,92}F^CͰp{nƪ<YrdrmU&ap !a- E}zݵ%nF`1&} B‚w[ 0akKqb`%M0aŠ'wזJ% ma((ÄO-q 54 lϒF;;]Z܈I=M 5/؜%_vv*;߫{7j]9ڨ6S{,Hm!~&.lC},Qm,XTC $: | f@bLoW3jd^w GuAŘ. f_EVӽ$%&-1]^Ą-{51I#1KMZczQ[|=%[Mkl`:geܚ7z%vE?7ԫBHFtFQ˸5Wo0~K4p~nW};霍qkahP " #6ra醄{_y2H2vh˘Fm> xd<&;e2%і1Aș}~x MwdJ%-c +(8Ocɔ[Ku`~(B:lWP tq:,2)P(uګ'4׶t>Ye$Sn-MׁPWOhm_A) |HZC*in̐'#ltT_E ;{\_YM!O*eG騾 y.9w"ٹ$ 0CTʎQ}\6sD%s #R%5@ݎ]*j0Eq}@:BGJjFr9T;`4uzaHԌv;rwtwh)% 2A*JrY~}Q~Z&elU84`v)<BMph+fE!Sxj!'"8 "TWCBOE7rQ5m)Db0!0sg qkTS:-aN C`,SϜ,E״u[ œY97X Y^W8}R^Z6RDq9$<><m#ܥkgy]!sBIyIxh}x3GKa_ Es1uKS=őAu74^)ʋ@'}abPc)20 {#&&nhRN-N9Sd`G-MLx(/􅝋[Br0) Z!30OE 酰&pb5E넾0BFga? aMlk } ` ΰ~Zi1ސ4a{;FwʿH Ǯ^ᅣ2,P_VK3rKA_]3 GeY⿮ffO9fxe{@][/͞,r Y9z~G[3ٍyE )()]f}4rdi lfz3RPR 9hdnf7f&rVw8ʑ;%ݚn+LHAI12q[P^ض:#|u u-/ /muuF=*4F[x_^oAy)c{T> #h94ԍ( ٱn.bODٖ4:{>אOXOƳcZ]Ğ1-7it}!婱>gǺ⻈=ce[n\C>Sc}> [%XG᫯a/?cGL5k)J⍱6 W_^:1%NDŽ!d7 q&bn4YNgTBc(D@t@O ҷR(,*3;oOW ?h$ !Ի5XZDcEd 4&k1T #D)5:t; T5w$0 d(&1.nSZ̫\"_F@]1 @*$bGט#?9':p4.QUM4: dJ$F|RU"@$0hS>\b-kS.#Q-_ULpOԪO[}81n3нrRޖ_xۏ>C8:`eAYJ@Dmf>|VsI"|c$\_>..Jyݭ'vc(c*[|-3S:&c:R] X`UY~S|{qtqȦn𸪯qޝhY-|9'Fu=p b!q&8qkgTM" ŗ{`=Ui "IMA2*FjP|};+*\ID#N;?_+B`w[z[a쌊`6Y78U@gz'0mx5c_f/Flk7._ܯpN>D+{b;=;K##⼺;1a bמM6n; ^wl}9:^I,!J5U"Sٽ D@DnT.wAP~uu\TU Ғsi$$W0e@\R狽edDKN^wÿ-vo? ypw> ;ZJbڗ;5 \޹̥΁vSnʋ sW+ QI}4Ud^wH~tP,69he0n<*J6ڝXv%៤G;~"݃:QӮ Sr4 :6B5yrjR;uD .PCCo<u'm!(ġq:p8c$S,z7^L~F^{tP:?aM*Svd弉ϏFSR&2l1+a}J;W pdD2ϟCb.2:]#Z mO7}‡ I62wpMH#'lqyh.L[Mľk0 `6S8ʐW K7٬:||3tmS\ 5$*T;oe(KB.EnC{e;E.D?ˈPo ̼@4>8H9i$ <.Bظ*/MZDsۧ&$])ɺ^d00 h16A_pQ/mhp|iau=M==|6+ aw̫%d{0ùҌLiv2=BzՔ֗Md7iXI?il7=f2}ƅ!YnSr3܀#GGŧH}8gDioTN@a+eXOnʡEx&1Zd;Onأp= ףp= ףp= ףp= ףp= ףp= ף@P$ (k@C*焑 1_.@v:k #NJbxz&n2xW ?h@aQYȥo: '@ x9?P 6NgM"E@|o p+ŝ(lL672V߄@<\l: K{ΗԆ H½D PvU1P?]%OʡZ7и@=J'ƫ͜mCư#o\{2~,݋] 7 n0b/54"&EE=!A+p֕C)@_v J5~9[qSvzq&RHc7B9ؑ2~(1 J/,u K3B(NSd+H _E>NMKebq ^ jAPlZת˙"?b ~p#P0 O˘]+ε0Q%0r_s;1@ll,MGk#ZWkXWڥ N|4ql >iJԓj b}122q#2It_{+ɑӈ/=*VۈWㆦdwSfw.>SU9zc%C1SyIuNa4l]|d|F@?N 9{476l3oߌGǁ x=Lݍ~ "4}oDg'̈́58-BLeXPT\eƑ"sL-ѐkN'u.⊬J Vq6kK|M4wgBװm?lͨ?n]7Q^5*/A5# ,+{Ҷ$ukRP(= e uuvDnxM]+8$b;<@A$,.^[n,SY ګ55UWGޏ /lښr /wwL;WB䧓9;5!,Vq`E[ %wx Cڌcy4HQ8x{!;p@-J Dȋǧ0S!Iv7;LK/_eLwO뻗1jRΚ2(M]=];pa6'jQcmjOF5LP?oA2 .QP'88d֨Hhi39)wz gS졹ln{RɂFR@wA˚n74[QתBYh.7CZw~Ynb5bݦ?g#7[ځ'x8-"䛘S*SZឩlm8 /V7"-Z!qJg&J$xmWX/?Ѕ"~951,(z$vrmid` \WSO J FA=9 !#4%&(0*+-+/0~2'45z7#9:u<>?qAzR| % AA AAF+ AA AAC U AA AAC B AA AAB  AA AAA , zAA AAFL AA AAB U AA AAC  AA AAD  AA AAA ,AA AAF AA AAD  AA AAD 1 AA AAC  AA AAA .^ AA AAC= AA AAD d AA AAD m AA AAC  AA AAA <7: AA AAF. AA AAD g AA AAA  AA AAC ? AA AAA 4C+AA AAF AA AAB ~ AA AAB Q AA AAC  AA AAC XL`Z AA AAF  AA AAB  AA AAB XheAA AAF0 AA AAB S AA AAA Lv,AA AAF AA AAC Q AA AAC e AA AAC  AA AAC z AA AAB lxL AA AACb AA AAC q AA AAC  AA AAD pęAA AAF AA AAA D AA AAD  AA AAB KAA AAF AA AAA  AA AAB  AA AAD  AA AAB @ AA AAF AA AAA lTAA AAFJ AA AAD  AA AAD Q AA AAC lLAA AAF AA AAA y AA AAC  AA AAD 4pAA AAF AA AAB  AA AAD  AA AAA g AA AAA m AA AAC TAA AACh AA AAA  AA AAB @,P AA AAF AA AAB <pAA AAF AA AAB @-AA AAFh AA AAB TpE"AA AAF8 AA AAB  AA AAC TL (h&AA AAFW AA AAC y AA AAC T r'AA AAF AA AAB  AA AAA X 4 2AA AAF# AA AAB g AA AAA DEk@r@@@@@@E@ @bD@@@@"@,@2@DD*DD@@ D @ @: @@ @F @E@@FDDED%D6Dl@r@x@@@D@+@[DD%E@ @Z@`@f@%E&@&@a&D(D(D'(D^(@d(@j(@w(@(@(@(@+@,@,D~,D/D/EY0@`0@z0@0@0@0@0@3E3@3@24D4@4@4@4@5@ 5@5@6D6D6D7D7@7@9@9@ :@:@:@":@(:@Z=E=@=@=D>D>E@D@D$@Dw@@|@@@@@@@@:BDB@B@BDEDEEG@G@VH@\H@iH@sH@}H@H@H@H@PEQ@Q@mQD&SD1SDESDS@S@S@S@S@S@S@S@DT@LT@AW@WW@rWDWDV[@][@y[@[@[@[@[@\_Ey_@_@_D`@a@ a@aDaDbDdDe@3e@h@h@)h@3h@9h@`h@fh@lh@oE4o@:o@oDyqDqDqD r@r@r@ uDu@u@xDyE{@{@|@ |@|@E@@gD*D5DFD@@@ć@·@7@<@މDE@[@vDk@r@@@@E@@D@@@@@-@C@DDȖDJDS@\@f@p@v@@@@9EY@_@ģDΥD٥DDT@Z@`@FD @@XD_Ew@@@@@@@@,@1@E@@3D@@Һ@غ@@@@@@@л@ػ@+D6DJDDDD4@B@X@^@E@@DDi@@DDD$@*@@@@@;D@@@@@@9E\@b@DDE$Dy@@@@@@@@WDbDD@@i@@@ @DDED@@@ @&@0@:@D@E@@D@+@N@T@Z@d@DD5Db@h@@B@@@DODDEAD\@c@@@@@@E@ @[D'D@@J@P@V@DDD;@A@@@o@t@D~D@@@@ E @ @ D D @ @ D D D @ @ @ @U @ @D@@@@*EJ@P@DD@@@@QD\DnD@@}@@DEDD@@@@@@A$Ed$@j$@$D%DA'@W'@z'@'@'@'@'@'@!(D,(D>(D)@)@)@)@O*@T*@+D1D2@2@2@2@3D3EW4D-5@25@b5@h5@q=E=@=@>D>@>@6?@>]|(|(2<<FPP[ 6e 6e Uo ty ty  ї..Mll&&Edd%//9C C M!X"X"=b#\l$\l${v%&&'ؔ(ؔ()**5+T,T,s-../0012-3-3L4k5k5"6,7,768@9@9K:%U;%U;D_<ci=ci=s>}?}?@ߑAߑABCC<D[E[EzFGGHIIJKK4LS MS MrNOO)P3Q3Q=R HS HS,RTK\UK\U)W]\Y1)ZPR$\bR^̸6 `UH a){ cgHѮ ;e {  Z>f Ĥ .  qh  l> ֤j @  q k _4 ɚ3mgq4oۚEgqd*ΐr8] tv* Jv]!i wӆ=#Sy{ %{OS'|n|(B~I*|T,I s -rG?/ r1Y?2xhL45 6 h ^ 58!!}!^9"Q"+"%;##^#c=$+$$>%T%V%!@&*&&TB'h'!'~C((J([E))/~)G*K*m*bUGـ̫!w(,hWFaΩr;[e X.KYo> 1\$U? 0Z/S vg1o#\I7#}p3Kc^jV׮Icj=0 =#5~`0 ^D 6Wab1 w x(8{cRnFbKUH %[;: .e ! lo  F ҍ; ??f ԑ Ǽ S  `= gh Y# z 3m 7` S? zFj K9 T,  Mj A 'k ~ 0 n ےHDBmAbxvkDb(^oQ<DF85+F[q| Vo 0Gr)?pSIJvtgiC#]PC 76K)vdK>!7jLwϢ~~/X#ŒN2Dy*l@%/;Uv}_kYـRihw̫F=I#9A,04Х,_BW#}mUc )HNGr;9eeX.C`hKY/n>SSM1kF>$xkm5 0ĄE SZ^Xwpqj29^%$;QvrYD1i]w7G\*r=>#A0)w_#}}UX p3)HHCc^GsV;.eО|I=`]/O)SHMB?ܻTk5jF3xw(kb5 S^Mq{+@2.nV|ka%;ۖvgTǵYGiRw;=3#.-BA!X0Кml_Һ# }UM )tH8Gg.;#eZDqYMoDŽ`R@/3S=M&kF(xl0ɺ F [kW5qy S^Blq^! ShB9k5 dxs'D֦jASMc~/O` m6dZW+zFH)eU5 6|Vb^ޟxp@Ao=4#ڪU{JvLvXWֵ):܆WdJupؑ?b'R)LI4ԜjmY4&jЧ4HLx?i.AͲ҃NJ<czhFɽ)Ύ؉(U&6 ;{ʙC]]`ζ1~?o"Ǥ:k|<+\u }Wï8ȩv9G/E[q|oR #ϝQ~.»-3O].:q if-ڣhK9N s-"psD/"޲bMԖ[E~ oO' h! ƱzuBZ$\+cͨ>P!e6]A tb吟jVpǛA8wE@.text.data.bss.rdata!- B___bid_factors___bid_packed_10000_zeros___bid_convert_table_isinfd32.o/ 1350391525 0 0 100666 573 ` L" .text  0`.data@0.bss0/40@0@D$ $$T$ÐzR| C [    .text.data.bss0" 4 C.eh_frame_isinfd32.eh_frame___bid32_to_bid64___bid64_isInf _isinfd64.o/ 1350391525 0 0 100666 499 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss," 1.eh_frame_isinfd64.eh_frame___bid64_isInf _isinfd128.o/ 1350391525 0 0 100666 581 ` LL .text@8 0`.data@0.bss0/4DB@0@WV$D$0D$D$4D$D$8D$D$f1Ð% f #rwρowfƤwÍvD$%|=|ÍvD$T$ÍvT$D$ÐT$D$ÐD$T$% ‹D$fUWVST$0l$4%|=|/%x=x7%`=`щ %ߋ4$T$D$T$D$T$ $1ҋt$|$ 1׉׋ $\$1L$\$1Ӊ ¸L$1ځ~w~r=Ƥwu0%щÁ Љڃ#r`vWv[^_]Á~1~[^_]Ív [^_]Ív[^_]Ð=ow%fD$T$||tlс||tjxxt`сxxtJ``tT%с``tH9f||t1Ívxxu%f붐UWVSDT$X|$\l$`D$d||W||51É1 L$8;xxƁxx``L$T$(t$, T$(D$8`Ɓ`cl$ L$$ |$88D$9t$t1|<D[^_]Ív9t$}ND$$9D$,rLT$ 9T$(>fD[^_]Ív|x|t1D[^_]ÃD[^_]Ðx~~Á~~8bщ։߃~Br Ƥ4ǁ~nr =Ƥa9N9Av%x=xv~΁~~~8l$ %D$$L$ \$$L$(\$,~ar ƤSщЉڃ~r =Ƥ;\$$k;L$  \fl$ T$$T$ L$$T$0L$4#|$8L$$9L$,`9t$D$)+L$9t$t$,l$(< D$(T$,D$0T$4D$8T$.text6<( 0`.data@0.bss0/4l7>@0@WVt$ D$ ^_ÐUWVS<|$ t$PL$(t$,%x=xȉ|$ l$$  A``-U1ۉL$\$l$\$L$\$ 1fIL$L$ˋu@\$\$ \$9 \$13D$ f1=<[^_]Ð whs^Ӂ  uc7wJ``t:D$T$l$\$L$\$ 1f=v1<[^_]fD$;hKw ;x@A:f|$l$l$\$L$\$ 1;D$AUWVS<|$ t$PL$(t$,%x=xȉ|$ l$$  A``-U1ۉL$\$l$\$L$\$ 1fIL$L$ˋu@\$\$ \$9 \$13D$ f1=<[^_]Ð whs^Ӂ  uc7wJ``t:D$T$l$\$L$\$ 1f=v1<[^_]fD$;hKw ;x@A:f|$l$l$\$L$\$ 1;D$AWVt$ D$ %x=x^_UWVSt$0L$D$ xxtV4$|$ v [^_]rwՁ ˁ t%`=`t u t1[^_]Ác7w%`=`t1WVt$ D$ xxt 1^_f%|=|^_fWVt$ D$ %~=~^_WVSt$ $|$L$D$ ||tVxxtz v 1[^_Ðsv  tz%`=`[^_Ívu%?=M1rv_5M1D u [8w뙐% u [^_Áryvc7^uvDvfWVt$ D$ %|=|^_WVD$ t$$^_WVSD$ t$$T$\$ \$ PX [^_fWVS\$ t$$T$D$ %D$ SC ؃[^_ÐWVS \$0|$t$4t$DT$L$D$ % ȉD$t$SC ؃ [^_UWVS|$p$\$xL$|%|=|%x=x΁l$p|$t vČ[^_]Ð 5 %`=`t u t%? D$D$HT$ T$8D$ T$$D$8D$0T$4D$HD$(T$,T$ T$@D$DD$(T$,1҉D$T$D$@T$DD$T$D$8D$T$D$ T$$1҉D$ T$$D$0T$4D$ T$$D$T$1D$ T$$T$T$0D$D$\D$T$D$\D$@T$DD$0D$`T$dT$T$hD$lD$`T$d1҉D$PT$TD$hT$lD$PT$TD$\D$PT$T|$l$1|$@l$DD$PT$T1ՋD$T$¸D$T$D$(1D$T$|$l$;l$rw;|$v D$ T$$D$HD$(T$,D$8D$T$D$HD$HT$L|$(11҉D$@T$DD$8D$@T$D|$@l$DD$(T$,1҉D$(T$,D$T$D$(T$,D$@T$D1D$(T$,D$0D$T$D$\D$hT$lD$0D$0T$4T$T$8D$<t$0|$41D$\t$8|$|$M1t$D  t$(|$Ł~~~~8n 9\$w 9L$D$1؋T$1 9|$49t$0r D ݁M1ρD :|$ vc7с``dD$`f\$ \$( m9L$0\$89\$@s w9r\$@3\$81 9L$0+L$0!ǃL$HL$P\$H \$pd$D$XT$\d$D$hT$ld$(D$`T$dD$X1ҋL$`\$d1ۉL$0\$4D$0T$4D$pd$(D$0T$4L$X\$\1L$h\$lD$0T$41ӋT$HT$XD$HD$xd$D$HT$LD$xd$D$T$D$Xd$($$T$H$DŽ$$$1҉D$hT$l$$D$hT$lD$xd$(D$hT$lD$HT$L1҉D$(T$,D$T$D$(T$,D$hT$l1D$(T$,D$0T$4¸D$0T$4T$`T$D$D$T$D$0T$4D$(T$,D$0T$4D$49rw T$09T$(vD$8d$PD$HT$LD$8d$pD$(T$,D$PD$PT$TT$HT$D$D$PT$T1҉D$`T$dD$pD$`T$dD$T$D$`T$dD$HT$L1҉D$HT$LD$(T$,D$HT$LD$`T$d1D$HT$LD$8d$XD$(T$,D$8d$xD$8T$f%?D$Hv?\$0D$`\vr|$DLt$M1t$ t$D t$ tN~~%~=~8t&9\$r 9L$D$(T$#v9|$ [8뢁 [89t$9L$09t$\$ 9\$( 11D$D$D$0D$411r L$PD$HD$0T$4D$Hd$@D$`T$dD$XT$\D$01ҋL$X\$\1ӋD$Pd$@ӋD$0T$41҉D$0T$4D$`T$dD$0T$4ȉډ1D$0T$4D$Hd$ D$`T$dD$HD$HT$LD$Pd$ D$ T$$T$`T$hD$lD$ T$$1҉D$@T$DD$hT$lD$@T$DD$PD$@T$Dt$`|$d1t$H|$LD$@T$D1׉˹D$X19rw9v D$0T$4T$4 T$0{T$81ډ1 9\$8 Y9Lf\$P L$HD$0T$4d$8D$`T$dD$XT$\D$01ҋL$X\$\1ӋD$Pd$8ӋD$0T$41҉D$0T$4D$`T$dD$0T$4ȉډ1D$0T$4D$Hd$(D$`T$dD$Hd$D$HT$LD$Pd$(D$(T$,T$`T$hD$lD$(T$,1҉D$8T$;D$01/D$(T$,¸L$01ڋ\$1ӋL$ 1 ;T$;D$ 1;\$tH;\$;L$01;\$t.;\$;L$ w1;L$0u1;L$ uXWVt$ ^_ÐzR| (AA C W AATH$AA AACP AA AAB u AA AAC T4AA AACP AA AAB u AA AAC (D,AA C d AAT$pAA AAC0D AA AAA w AA AAA 4|FAA C f  AAC S AA(\,AA C d AAXAA AC Q A AAB e A AAD H A AAA (<,AA C d AA(h$AA C \ AA0>AA AC tA AA0 ?AA AC uA AA0`\AA AC0RA AA0rAA AAFd AA AAB  AA AAA Q AA AAC I AA AAC D0AA AC0 A AAD S A AAB 0/AA AAF AA AAA K AA AAA ^ AA AAB a AA AAC l`%<AA AAF AA AAA X AA AAD  AA AAD (6AA C U AAG U / : m{R`Y d !!e'o''(,,D-N-w2233 L(@l4 !  40 J@ ]l n ~X      \   , !, 6\% N6 .text6(.data.bss^hy.eh_frame___bid128_isSigned___bid128_isNormal___bid128_isSubnormal___bid128_isFinite___bid128_isZero___bid128_isInf___bid128_isSignaling___bid128_isCanonical___bid128_isNaN___bid128_copy___bid128_negate___bid128_abs___bid128_copySign___bid128_class___bid128_sameQuantum___bid128_totalOrder___bid128_totalOrderMag___bid128_radix.eh_frame___bid_nr_digits___bid_ten2k128___bid_ten2k64bid128_fma.o/ 1350391525 0 0 100666 76494 ` L%,.text$  0`.data @P.bss0/4 `$@0@UWVSL|$ t$`D$ D$L$$L$D$(D$l$,L$0L$ L$4|$8\$< 8l$͋2J9rv 'L[^_]f9w11 t@ uӰEL[^_]ÐrJ9rw;t$ w13t$ uЋrJ;L$rw;t$w3L$3t$ uL$9JrwL$9JvfD$ uDL$ ulL$T$r 9 S@I9vރL[^_]f9w;T$ 'L[^_]Ív 9w]r;T$wU13T$ t.|$t$J9D$9wrċL$9 vvL[^_]Ív13T$ ^ 9Sr ;D$G13D$ 1D$9)D$9f9[11 t@3'L[^_]Ð9zr0L$9Jv"vUWVS\$<3{kl$k l$u l$8 ,$l$l$l$l$ l$l$T$0l$Pv|$8 (T$ _c7{G u D$T$ L$ T$ qd7 al$8!,$T$8BT$81 [8D$DD$ M1,$l$ t  ҉Չl$ l$ M1T$D  [8 T$$T$8$l$8Ml$8c7D$D$ vl$0l$4vl$4) vD$T$ $3{C|$ ׉{ [^_]Ãt+t& ߾c71x11뺍v111몍vD$T$ l$0u UWVS͋$$$$$\$|$$$$󥍼$$󥋜$$$$$$$$$$$$$$\$pt$t$$\$Xt$\$$\$Pt$TDŽ$DŽ$DŽ$ DŽ$DŽ$$@|$x$(+$)D$HD$L$119$fT$t1D$p1 d$$+T$XL$\T$`L$d9$$$!A+L$P\$TL$X\$\90L$p\$t$$+D$HT$LD$HT$L9$w )t$`|$d$$D$XT$\$$t$H|$L$$$$ uD$L D$HuT$\ T$X#v$" T1ہÉ\$H$ L$\ \$| \$X щ$H$Lt$`|$d$@$D$u(Y $$$$ $v u^߃ =|$Ht 0$3$$ $$$(t$xļ[^_]ÍvDŽ$(DŽ$, $$ $$L$T|$PD$HT$LD$hT$l$D$`T$dD$H1ҋt$`|$d1t$P|$TD$PT$T$D$PT$TT$HL$L1ɉT$HL$Lt$h|$lt$H|$LD$PT$T1D$HT$L|$\L$XD$XT$\牄$$$D$hT$lD$X1ҋL$h\$l1Ӌ$Ӌt$X|$\1$$ȉډ1׉ȉډ¸D$XT$\D$h1D$XT$\T$PL$TѺT$PL$TD$`1D$PT$Tt$P|$T;|$Tw ;t$PD$HT$Lv& 9&\$h$L$Pቄ$$$1ҋ$$1ۉL$H\$LD$HT$L\$\$L$X$Ɖ׋D$hቄ$$1ҋ$$1ӋD$h$Ӊȉډ¸D$`T$d$1D$`T$dD$`T$d$0$4$1҉1׋$$׋D$Td$hD$HT$LD$HT$L¸׉ȉډ1׉$8$<T$d$($ ,$D$HT$L$D$XT$\D$`㉄$$D$H1ҋ$$1ۉL$P\$TD$PT$TD$`$D$PT$TL$H\$L1ۉL$H\$LL$X\$\L$H\$LD$PT$T1D$HT$L $ $$$D$hT$l$D$XT$\D$`㉄$$D$h1ҋ$$1ӋD$`$ӋD$hT$l1҉D$hT$lD$XT$\D$hT$lȉډ1D$hT$lȉډ¸D$XT$\$1D$XT$\L$P\$T˹L$P\$T$1D$PT$TD$hT$lD$PT$TL$T9r3D$HT$L$D$`T$d$ቄ$$$扄$$D$`1ҋ$$1\$ht$lD$hT$l$D$hT$l\$`t$d1\$`t$d$$\$`t$dD$hT$l1D$`T$d$ቄ$$$ቄ$$$牄$$$1ҋ$$1Ӌ$Ӌ$$1$$ȉډ1׉ȉډ¸$$$1$$D$hT$l¸$19rD$`T$d$$\$Pt$T\$Pt$T19$w ^11ڋt$H|$L׉t$H|$L919qt$`|$d$3$D$|3$ ;|$tw;t$pfD$XT$\+$$D$`T$dL$\9r \$X9 D$PT$T+$$D$XT$\9T$T D$HT$L+$$L$H\$L9w 9 +L$p\$tt$`|$d$$D$XT$\$$t$H|$L$$$$$|$|$$ fPމT$P& 9$T$<$ T$8$T$4$T$0$T$,\$(|$\$P\$$$$$8$<$$T$`L$d$0$4l$P$$u 1ɁL$Ht$`|$d  $ \$| $H$L$@$D"f)ꋴ$ t$p$|$X$$$$DŽ$ DŽ$DŽ$DŽ$9x$($,\$`t$d$ $$$L$,$ L$($L$$$L$ $L$$@t$|$$ T$$$H$LD$Pׁ|$T$KL$P\$T$($,$@$D$ $$á㉄$$ 1ҋ$$1\$`t$dD$`T$d D$hT$lቄ$$D$h1ҋ$$1ס׉¸$1ډ$@$DL$h\$l1ۡ Ӊ1Ӌ$1ӋD$T%D$`T$dt$`|$dL$P߁|$TD$P D$|T$T $$H$Lt$Xu$b$c$@$D$@$D!ADŽ$DŽ$ $$1v9$$$$@\$ l$D$4$$$$$ $G&$$$$$!AL$p\$tT$HҋD$LЉT$HD$LDŽ$ \$|$H$$LDŽ$@DŽ$D111vT$L9$k $3T$L$3D$H g\$T9$6wD$P9$#$3T$T$3D$P %T$\9$L$X9$\$Ht$L$`$dT$XL$\$X$\\$`t$d$P$T$T$4$ T$0$T$,$T$($T$$$pT$ |$$PT$PT$$$x$|$8$<$p$tT$`L$d$0$4T$`\$T$t$Pt$hD$HT$Lቄ$$牄$$D$H1ҋ$$1\$Pt$TD$PT$T$D$PT$T\$Ht$L1\$Ht$L$$\$Ht$LD$PT$T1D$HT$Lt$\$D$X$D$XT$\ቄ$$$牄$$D$X1ҋ$$1ӉӋt$X|$\1$$ȉډ1׉ȉډ¸D$XT$\$1D$XT$\L$P\$T˹L$P\$T$1D$PT$Tt$P|$T;|$Tr7 D$HT$LT$` D$hD$`T$d$ቄ$$D$hD$hT$lD$`1ҋ\$ht$l1$$$$$$$\$`t$d1\$`t$d$$\$`t$d$$1D$`T$d$ቄ$$$ቄ$$$牄$$$1ҋ$$1Ӌ$Ӌ$$1$$ȉډ1׉ȉډ¸$$$1$$$$¸L$h$DŽ$$$9rZ D$`T$d\$Pt$T$$\$Pt$T1L$T9$w 11L$H\$LӉL$H\$L94&19w r9w11ېt$`|$dnvL$d L$`1$v 1҉} $H щ$LDŽ$@DŽ$D$(t$xv9$f9v$$$$$!AL$p\$t D$PЉD$XT$T҉T$\ID$PT$TD$P#D$T@D$HT$L!A$щL$X$Ӊ\$\v\$|$H$ x$LDŽ$@DŽ$D$(t$x (ļ[^_]r 9D$PPD$HT$L!A?$҉T$H$щL$LFf$@0 \$|$( ‰$,\$`t$d$ $$$ D$ D$$D$$$$$ $$,%1=É\$H$8$<$0$4T$`L$d։f\$Xt$\$($,T$`L$d$ $$$T$,$ T$($T$$$T$ $T$$0T$|$$ \$P\$$$8$<$0$4T$`L$d$9\$|&fD$XT$\$$D$`T$d9$$$ $$$$L$p\$t uD$PT$TD$XT$\$$D$HT$LD$L9r )D$`T$d$$D$XT$\$$D$HT$L$$$$>f9$ $$L$P\$TӉL$X\$\9L$p\$t79d1g91|$\|$PD$XZ $D$hT$l1ҋt$h|$l1t$H|$LD$HT$L$D$P扄$$D$XƉ׋$1҉1Ӌ$d$XӉȉډ¸D$`T$d1t$`T$dt$`|$d$0$4D$h1ҋ$$1׋$d$P׋$d$Xv$8$<t$`|$d$0$4H9r 93D$d3T$` DŽ$1ҸfDŽ$@DŽ$D$$$$L$p\$t +Jv1l$p$u{$tt$ $ql$X$ 1ɋt$p$11$u]1t|$pi$Z$$ L$H9$Uf$$@$D$@$D u$H$LDŽ$DŽ$$ 15f\$P9v9vgvt$P9$f9$f;t$P9vr911|p 9|w9r11 ?DŽ$DŽ$@DŽ$D11\$|$H$$L$1,T$H9$f9O1vf$H$L v[$L$$$ L$ $L$$L$$L$$L$\$`t$d\$t$ T$$$$$@$DD$PD$T1;D$d w ;T$`fDŽ$ 1 T$Xu<$u1$$ 1vDŽ$ DŽ$DŽ$DŽ$DŽ$ DŽ$DŽ$DŽ$1ҹ11ADŽ$ 1%DŽ$UWVS$$$$$󥍼$$󥍼$p$󥋄$$$$$$$$$$$$$$$p$t$$$x$|$$$|$|DŽ$DŽ$DŽ$DŽ$DŽ$ց||$||$|$|$$$$$x$``ADŽ$$$ wJd݁ $́$$ $,$c7DŽ$DŽ$11Éс?M1*с1DŽ$DŽ$с~~|$%?$$$$$$%~=~X $%~=~A $$$$$t$|󥋄$Č[^_]Ë$$%?=M1V$%DŽ$$DŽ$DŽ$$%~=~$$$%?$$$$$$$%?=M1 5M1D  $%~=~$$%?$$$$$$lr =DM1D $ [8r D5M1D $ [8s$$DŽ$݁$DŽ$DŽ$11ۉՁ$$Ձ$x Ձ``y DŽ$Ձ$$ " x$ $5  vDŽ$$$$$$$x $%`=`, DŽ$$%$$  $ $5  $$$$DŽ$$3$$$xx x9$$$/=(  $$$$¸$$ u$ $$ $u$ $|  $h$l߬$hݜ$$$1%-HuW 9w911 u+$9Pw$9hq$ $t ߬$ݜ$$$1%-$$ ;$ w$9$ 3$$3$ u4$$9Pw $9P v$ $ ߬$ݜ$$$1%-$$$$ ;$ w$9$ 3$$3$ u2$$9Pw $9P u$ $t($ $$ $$9$ "$$+$$+$9~$$$$˹$$)ډ% $$$ $$v$ $p$ $\$$;$rw ;$v$$$$$9$>=$ $DŽ$DŽ$#vx$ $L$ $8DŽ$DŽ$|DŽ$DŽ$ $- $$$#&z4$$$$$$㉄$$㉄$$ቄ$$$1ۉƉ׉1ߋ$$׉Ѻ$$$1$$$$$$$$$ʉ$$$$$$$1$$1$$E ;$.r ;$.$1ً$1 ZDŽ$0DŽ$4DŽ$(DŽ$,f$ $8 $ $$ $"#]ރ&iO9\M$($,$$$$$$ $$$$$D$4$D$0$D$,$D$($D$$$ D$ |$$\$,$$ $$$$$($,$$$$$>""=B#MDŽ$$x$DŽ$DŽ$( $$$$$$$$$$t$|f$c7 vDŽ$DŽ$DŽ$DŽ$v$c7 vDŽ$DŽ$DŽ$DŽ$v$$$$DŽ$DŽ$sx"DŽ$$x$DŽ$DŽ$nfDŽ$DŽ$9DŽ$DŽ$$ [8^v$%DŽ$$DŽ$DŽ$"v $%?$$$$$vDŽ$DŽ$$$DŽ$Ձ$DŽ$DŽ$DŽ$DŽ$vx| f$ $R DŽ$Ձ$DŽ$DŽ$DŽ$DŽ$$ $$$$1҉$h$l߬$hݜ$$$1%-$$ $L$$$1҉$h$l߬$hݜ$$$1%-$B$ $$$$1҉$h$l߬$hݜ$$$1%- $$$%?$$$$$v$cGf$rfv$$$$$$$ʉ$E;w$; DŽ$0DŽ$4DŽ$(DŽ$,DŽ$DŽ$IDvDŽ$11r$9$ $ $$$$ Љ$$$$$Ov$lEvfFf߬$ݜ$$$1%-$߬$ݜ$$$1%-$?߬$ݜ$$$1%-w$9$DŽ$'v$$)+$$^c$$$ $$$$$$$ۉ$"9$+$9}"$ $$$$$$$$$!"9e$$$$$$$$$$$@$D$$$H$L$($,$P$T$0$4$X$\$t$X$D$T$D$P$D$L$D$HD$D|$$$@|$$󥋜$\$ $\$$\$$\$$$$ꋄ$7$!9$}$+$" 9f$$$$$$t$`|$d$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$t$`|$d$$$$$$$$$$L$ $$$$$$$$!+$!"x "}f $$%?&DŽ$$ x$DŽ$DŽ$vx$DŽ$9}x$DŽ$DŽ$4$$$$$$$$$$$$$$$$$$$$$$$$$$$$ŋ$$$$$$$$$$$$$"$$=_:$ $!T%"+$9}@s@$$$$$ $$ $$$ Љ$1DŽ$ $3$$3$  $t$ $l$$T$$$$$/f$9$ $ $y$o7$$,扄$$扄$$㉄$$$1ҋ$$1׉׋$$1҉$$$$$$1$$$1׉$$.'/9# `@$$$$㉄$($,㉄$$$ቄ$$$(1ҋ$$1׋$$׋$($,1ɉ$($,$$$($,1$($,$$$㉄$$$㉄$$$ቄ$$$1ҋ$$1Ӌ$$Ӌ$$1҉$$$$$$ȉډ1$$ȉډ¸$$$1$$Ѻ$$$1$$$$$$$9XEw$9GE$($,$($,DŽ$0DŽ$4]؉;$,&r ;$(&$,1$(1  ;$r&r ;$c&;$$($,|5$胼$F"6"+$"$$$$)߉$+$$$$$$$$3$$3$ Ɖ$$ݐ<$$$$$$$$$$$$$$$$$$$$$$$$$$QS$$)Ӊ$$$$)$$9$wr 9$s$$$|1M1Bw =D5ׁM1ƁD s$$$aDŽ$DŽ$$$$$G?DŽ$$)$$$$DŽ$DŽ$DŽ$DŽ$$$$ G`$$9&9$r&&$IIBa$4a$|$gu $t=DŽ$DŽ$DŽ$DŽ$1틴$g$DŽ$$$u"$u1ۋ$u $tу ;$$ 5 J$ $ $ $ ȉ$8$~>$$$ x$DŽ$DŽ$ ($*$$$$$$$t$|$$$$$$$EDŽ$DŽ$DŽ$DŽ$DŽ$v$$&0$9$($,$$$$$$ $$$$$D$4$D$0$D$,$D$($D$$$ D$ |$$󥋜$\$$$$%$($,$ $$$$$$m$#$$$$$ $$$$$$$HDŽ$L$$1$H$L$׋$$1$ $$1ډ$$$$PDŽ$T$P$T$$4$$$$$$$$$扄$$$$8DŽ$<$$1$8$<$Ӊȉډ¸$$@DŽ$D$@$D$$<$$Nj$扄$$$$$$$$1$$1$$$$$$L$ $$$$$$$$]ރ&(9&!$($,$$$$$$ $$$$$D$4$D$0$D$,$D$($D$$$ D$ |$$\$,$$ $$$$$($,$$$ك$$$ .$1$1$9$$M1DŽ$16*DŽ$DŽ$ ($$$x$$$$uWh $3$$$U$t$|$$$$㉄$$㉄$$牄$$$1ҋ$$1ӉӋ$$1$$$$$$ȉډ1$$ȉډ¸$$$1$$$ $$; r$;DŽ$0DŽ$4DŽ$(DŽ$,$D$=$ $?La$$ቄ$$ቄ$$牄$$$1ҋ$$1ӋӋ$$1҉$$$$$$ȉډ1$$$$$$˹$1Ӊ$$DŽ$=0$0+$$$$$$$DŽ$DŽ$DŽ$DŽ$9G}e$L$$$L$ $L$$L$$L$$L$$$t$|$ \$,$D$pT$l$D$pT$lt )ً $$$$$$5$5$ KK$f$f$=9${u $t DŽ$$uQDŽ$1ҾDŽ$ 0$ $ Ӊ$t@$\$ $L$$T$,$$$$$$ $*$$$3$ $ $ $ Ӊ$$T$ L$$T$4$$$v$f9$W9$+$$fE$&oW$3$$3$ )J$$+$$$$$9#7w$97$$!@dȉ+$$$$9C$0$4$($,$$$`$d$$$h$l$p$t$x$|$6DŽ$DŽ$$`8!-" aXދ$$$$$$$$DŽ$DŽ$DŽ$DŽ$&a9_$p$t$$$$$$ $$$$$T$4$T$0$T$,$T$($T$$$ T$ |$$\$$$($,$$$ $$$$$$$$$$$$$$$$pF$bF$+$}+$lv$hv$uH$u>$u $t DŽ$$u $t DŽ$vG1ہ$É$$ $$ $ $ Ɖ$$1$N$+$$$$$$$$DŽ$DŽ$DŽ$DŽ$"hQDŽ$$$$$DŽ$DŽ$DŽ$1Hu$u$u $t#ƒ $t0$*o$D$$$D$ $D$$D$$D$$D$$$\$t$ $\$$$$$$DŽ$DŽ$$$119 "gr [8$oށ [8 DŽ$DŽ$1ۋ$$$MDŽ$0DŽ$4DŽ$(DŽ$,0$$$$$ʉ$T$xL$t$≄$ $$$ቄ$$D$x$$$$ $XDŽ$\$$1$X$\D$t$Ӊȉډ¸$$`DŽ$d$`$d$$$$$$$ $$$$$@$D$$$H$L$($,$P$T$0$4$X$\$D$<$D$8$D$4$D$0$D$,$`D$(|$$@󥋜$\$$$$$h$l$`$dM,$$扄$$㉄$$扄$$$1ҋ$$1׋׉¸$$DŽ$$$$$$݋$Ë$$ډ$$$$$$$1$$1$$$$$$$$$$$$$$$$牄$$$扄$$$牄$$$1ҋ$$1׋$$׉¸$$$1$$$$Ӎ$ቄ${$$$$$$$$$D$,$D$($D$$$D$ $D$$D$|$$󥋜$\$$$$$$$$$3$$3$ ($$$$Ӊ c>$M1$D 8DŽ$DŽ$1$ $$ $$ ‰$$$$$1:*$$$$$$扄$($,$扄$$$牄$$$(1ҋ$$1׋$$׋$($,1҉$($,$$$($,1$($,$$$$$$$$$$$$$ $$$$0DŽ$4$ $$1҉$$$0$4$$$$$$$$1҉$$$$$$$$1$$$$¸$$$ 1$$¸$$$1$$$$$$$9rw $9v$($,$$㉄$0$4$㉄$$$ቄ$$$01ҋ$$1׋$׋$0$41ɉ$0$4$$$0$41$0$4$㉄$$$㉄$$ $$$$$1ҋ$$1Ӌ$$Ӌ$$1҉$$$$ $$ȉډ1$$˹$1Ӊ$1$$9$rw 9$v$0$4$$ډ$$1;$wr ;$w11׋$($,$($,9}!r9s!19w r9w11ۉȉڋ$0$4։$0$4E؉9w93$43$0 9$,w 9$(r9$,9$( 9$rKl9$q9$d$;Nr$;9M3 $$DŽ$DŽ$鮸$ $$  Љ$1$$$Ӄ $t 0$$ $$$$1ɋ$9$r 9$$$$$"ȉ+$$)9~Džj$$$$¸$$ȉ+$$$$Hh <$ቄ$$$牄$$$ቄ$$$1ҋ$$1Ӌ$Ӌ$$1$$ȉډ1Չ$$˹$1Ӊ$$$ $$ Љ$$ $$$$$$3$$>$t$|$|$ $L$$T$$$$$$$$%=M1ew De=M1D1$ [8f#$A$"r 9 .@$K$$$$$$$$T$,$T$($T$$$T$ $T$$t$|$$󥋔$T$$D$p$D$p+$}r$$Q$S$$<$$$@$D$$$H$L$($,$P$T$0$4$X$\$D$<$D$8$D$4$D$0$D$,$`D$(|$$@\$,$$`$d$$$h$l$$$$S$`$d$h$lt$$S$ $$$($,9$$$$$$$($,$$$$$$$(1ҋ$$1׋$$׋$($,1҉$($,$$$($,1$($,$$$$$$$$$$$$$ $$$$0DŽ$4$ $$1҉$$$0$4$$$$$$$$1҉$$$$$$$$1$$$$¸$$$ 1$$¸$$$1$$$$$$$9rw $9v$($,$$㉄$0$4$㉄$$$ቄ$$$01ҋ$$1׋$׋$0$41ɉ$0$4$$$0$41$0$4$㉄$$$㉄$$ $$$$$1ҋ$$1Ӌ$$Ӌ$$1҉$$$$ $$ȉډ1$$˹$1Ӊ$1$$9$rw 9$v$0$4$$ډ$$1;$wr ;$w11׋$($,$($,9r919w r9w11ۉȉڋ$0$4։$0$4$, $(?(,9$rIw 9$r>3$3$  $;=$r$; &ط$$$$$$$$$D$,$D$($D$$$D$ $D$$T$|$$\$,$Y$$ Ƌ$$$$$扄$$㉄$$扄$$$1ҋ$$1׉׉¸$$DŽ$$$$$$$$$$$1$$1$$i=$$$ x$DŽ$DŽ$ (1111ۋ$$$U$$t$|J$ $+$92$$$$$$$$ș¸$$)։$$$)ʃ{M ;$3$9$Dk11$M1$D H<)$% $$ $$ $$DŽ$1Ɂ(J$$$ x$DŽ$DŽ$ (銵9$$+$)*6A$$ 4㉄$$㉄$$牄$$$1ҋ$$1ӉӋ$$1$$$$$$ȉډ1$$$$$$Ή߉$$$1$$$$$$DŽ$1$$$@$D$$$H$L$($,$P$T$0$4$X$\$D$<$D$8$D$4$D$0$D$,$`D$(|$$@\$,$$`$d$$$h$l$$郲$3$$3$ +DŽ$DŽ$1$W$S$$$$$!W$$ $$T$ $L$$T$$$$$}{$$$$$$$$$D$,$D$($D$$$D$ $D$$T$|$$\$,$Ã$H1$$扄$$扄$$ቄ$$$1ҋ$$1׋׋$$1ɉ$$$$$$1$$$1׉$$)$ؙ¸$$)׉% $$ $$ $$$؃!u"پ$$M1D$ [8 $$9$yl$ $j=af$|$ $T$$T$,$$x$$$DŽ$ؽ1D$ $$$ቄ$($,㉄$$$ቄ$$ $(1ҋ$$ 1׋$׋$($,1ۉ$($,$$$($,1$($,$$$$ቄ$$$㉄$$$ቄ$$$1ҋ$$1Ӌ$$Ӌ$$1҉$$$$$$ȉډ1$$ȉډ¸$$$1$$Ѻ$$$长DŽ$$DŽ$$$0$$ $$ $$9$")苴$+$9~ƅC$R<$$$$牄$$剄$$$1ҋ$$1ӉӋ$$1$$ȉډ1Չ$$˹$1Ӊ$$)$$$ $W$H$ ¸1$$u$$ u$$DŽ$DŽ$$1f$$H$3 3$  V7V&jU9eT$($,$$$$$$ $$$$$D$4$D$0$D$,$D$($D$$$ D$ |$$ED$,$T$l$ $$$$T$l$tDŽ$ DŽ$$=$$w = t=DŽ$DŽ$DŽ$DŽ$N4<11҃$$$ $ $$ щ$$M$$$$w  d ޶f$$`$d$h$lDŽ$0DŽ$4ֺ$$ $$$($,(1*$9r#$9$$1$3$$3$ 1DŽ$"+$:$ $$$ $$$$$$ $$$ $$$T$ $)D$D$$$$o$$$$$d$$$$!@WJDŽ$DŽ$1$ ¸11+$DŽ$~$3$$3$ ;9$$$$$$$$$؉$$$$$$$$$$$$$$$$$$ŋ$$$$$$$$Ӭ$$$$$aDŽ$B&$, $( !$9$Z11$59$$扄$$扄$$㉄$$$1ҋ$$1׋׋$$1҉$$$$$$1$$$$$$¸$$$1$$$$$$$ DŽ$DŽ$$鸪$$$DŽ$$ ¸$$%=M1d#w DV#=M1BD61$ [8鎹 *#$$$$㉄$$$㉄$$$ቄ$$ $1ҋ$$ 1׋$$׋$$1ɉ$$$$$$1$$$$$㉄$$$㉄$$$ቄ$$$1ҋ$$1Ӌ$$Ӌ$$1҉$$$$$$ȉډ1$$ȉډ¸$$$1$$Ѻ$$$1$$$$$$$9g%w$9V%$$PT$($,9h4w9^49$,P$($,DŽ$0DŽ$4$ $$$$B?DŽ$DŽ$13$$扄$$ቄ$$扄$$ $1ҋ$$ 1׋׉¸$$DŽ$$$$$ $$$$ʉ$$$$$$$1$$1$$$5d7 $bDŽ$DŽ$ [8$DƿM16$$ $$$$扄$($,$扄$$$牄$$ $(1ҋ$$ 1$$$$$$$$$($,1$($,$$$($,$$1$($,$$$$ $$$ $$$$$ $$$1ҋ$ $$1׋$$׋$$1҉$$$$$$1$$¸$$$ 1$$$$$$$1$$$$$$$9rw $9v$($,$$ $Ɖ׋$㉄$$$ቄ$$1ҋ$$1Ӌ$$ Ӊ1$$ȉډ1׋$$$$$$$$ $$ $$$$DŽ$$$1҉$$$$$$$$ $$$$1҉$$$$ $$$$1$$$$¸$$$1$$ȉډ¸$1$$9$rw 9$v$$$$$$DŽ$DŽ$9$w!r 9$wDŽ$DŽ$$$$($,Ӊ$($,9$0$4$0$4s$$Ӊ$$$$$$$$9wr9s$$$$ $$$$$$DŽ$DŽ$DŽ$DŽ$$$$$$$$L$,$L$($L$$$L$ $L$$\$|$$D$$#D$pT$l$D$pT$lu9)$+)$$$$CBDŽ$DŽ$1틜$C$$N9$$$雫r9&$($,!ы$0$4A $鰢9-DŽ$DŽ$DŽ$DŽ$DŽ$5 [8 DŽ$DŽ$ DŽ$DŽ$c7I$T$$$T$ $T$$T$$T$$T$$$\$t$ D$$$$$$$$$$$$$$$$- $剄$$1ҋ$$1$$$$$$㉄$$㉄$$剄$$$1ҋ$$1ӉӉΉ߉$$$1$$$1ҋ$$1$$$剄$$$$$$$$¸$$$$1$$=$$ቄ$$牄$$ቄ$$$1ҋ$$1ӋӉȉډ¸$$DŽ$$$$$$$<$$$$$$$$$$1$$1$$$$$$l$$$$$ u$$DŽ$DŽ$DŽ$$$$$<DŽ$DŽ$1M1ڹ=DϹ [8ùADŽ$DŽ$ DŽ$DŽ$c7$鄹v$$$$$$$9%r$9$$ $($,$0$4 u$$$`$d$$$h$l$p$t$x$|$$$@0$ $$ $$$$$$$T$ D$$T$,$$$XW$%$1=É$$ $ʁ $ $ ։$$$f$u"$$9 $9$9ۛ$9țf !$$DŽ$́$$ $ $$%$ $$*阌n$\$$$$C+$ $$$ $ ى$=+DŽ$$|$ $L$$T$,$$$ U$$,$$ቄ$$ቄ$$剄$$$1ҋ$$1ӋӋ$$1҉$$$$$$ȉډ1$$˹$1Ӊ$$$<4$$$ቄ$$$扄$$ቄ$$$1ҋ$$1Ӌ$Ӊȉډ¸$$$1$$$$$$$$Ƌ$牄$$$$$$$$$$1$$1$$$$$$$$$$;$$0$4$($, 9w 9$90$$$$P9sGxw 9$r13$ t GuՋ$;Prw狌$;Hrم$/$$ >1$$1ۋ$$$'$$$$ u$$DŽ$DŽ$1鶦$$$$$ u$$DŽ$DŽ$$齞$% $$ $$ $$DŽ$1r989$+r 9$1$$$ x$DŽ$DŽ$ ($*T:x$4 $01Ek;$,r ;$(;$,;$(k 9$Sw 9$D9$9$k$9r$9k$9c$9P$9$@11$$扄$$㉄$$扄$$$1ҋ$$1׋׉¸$$$1$$$$$$$$$$ډ$$$$$$$$$1$$1$$$$$$N$$$$$$-=9&w9&9h0DŽ$DŽ$DŽ$$$$$DŽ$$2M 9$\w 9$M;$;$;$r ;$;$u;$h$$$$$$$$$T$,$T$($T$$$T$ $T$$T$|$$D$$$$$$$$$$$$$N$84$$$$$`$d $$$$$h$l p$p$t R$x$|9$&$&$?$$)$`$RJ$<DŽ$$$K$$ Ƌ$$$$$$扄$$ቄ$$$扄$$$1ҋ$$1׋$׉¸$$DŽ$$$$$$$$$$${r ځ 5 !$H8!$$$$ݔZ$ $$$$ቄ$$$㉄$$ቄ$$ $1ҋ$$ 1׋$׋$$1ۉ$$$$$$1$$$$$$ቄ$$$㉄$$$ቄ$$$1ҋ$$1Ӌ$$Ӌ$$1҉$$$$$$ȉډ1$$ȉډ¸$$$$$$ Ë$$ډ$$$$㉄$$牄$$$$$$$1ҋ$$1Ӌ$Ӊȉډ¸$$DŽ$$$$$u$<$$$$$$$$$$$1ҋ$$1Ӌ$$Ӊȉډ¸$1ꉄ$$$ $$$$$,$$$ꉔ$$$$$$$1$$1$$$$ $$靶$$$ [8 $$ $H)B-{3&291$($,$$$$$$ $$$$$D$4$D$0$D$,$D$($D$$$ D$ |$$ED$,$$ $$$$$ $ $ $ $$$ $%$ 1d7+$$$$$u"$u$u$0 $驗$T$<$T$8$T$4$T$0$T$,l$(|$\$$$h$l$$$`$d$$\$$$$$$$$$$$$$$$$$$L$,$L$($L$$$L$ $L$$L$|$$\$,$D$pT$l$D$pT$l)ރ $$YDŽ$DŽ$DŽ$DŽ$DŽ$ $$$$$$$$$T$,$T$($T$$$T$ $T$$T$|$$\$$[DŽ$<$($,$0$4&$ы$Ӊ$$$t) $ DŽ$s$uDŽ$VDŽ$DŽ$DŽ$DŽ$DŽ$1$&DŽ$DŽ$1DŽ$1}H$$ Ë$$ډ$$$$$㉄$$扄$$$牄$$$1ҋ$$1ӉӉΉ߉$$$1$$$$$$$$$$$$w ;$$($,$0$4 $$ቄ$$剄$$ቄ$$$1ҋ$$1ӋӉȉډ¸$$DŽ$$$$$$$,$$ꉔ$$$$$$$1$$1$$$$$$$$$$D$,$D$($D$$$D$ $D$$t$|$$T$$"$$$$$$$$$㉄$$5 1ቄ$$$$$% $$$% $$$%$$$1ҋ$$1׋$%׉¸$1ډ$$$1ۋ$$1$$$$1$$$$˹ډ1$$$$ $$ ʉ$$$$c$U$[$a$u$DŽ$DŽ$DŽ$DŽ$DŽ$1l$^$$$$Cc)DŽ$DŽ$DŽ$1Eʼn;$42r ;$0#;$4;$0;$,r ;$(ܶ;$,I;$(< 9$w 9$9$9$$9cr$9N$9$9J$u$$$$$ u$$DŽ$DŽ$$$ DŽ$DŽ$o$($L$>$u $t DŽ$u$=DŽ$-$~DŽ$DŽ$DŽ$DŽ$1$|$ T$L$$$$$r4$t$ T$L$ z$ $y$9=y$9xyh$($,DŽ$0DŽ$49h+$$$ Ƌ$$$$牄$$㉄$$$牄$$$1ҋ$$1׋$׉¸$$$1$$$$$$$$$$$$f$T$$$T$ $T$$T$$T$$T$$$t$|$ $T$$D$p$D$pt#+$$$DŽ$DŽ$$$$$< $ً$Ë$牄$ډ$$$ቄ$$剄$$$牄$$$1ҋ$$1ӉӉȉډ¸$1ꉄ$$$$$$$$1$$1$$$$$$޻DŽ$DŽ$DŽ$DŽ$DŽ$1鮻j$$+$< 99[DŽ$DŽ$DŽ$DŽ$DŽ$髊$$($$$$($$ $($$$$$$1ҋ$$1$$$$$$$$$$ 1$$ $$$$ $$1$$ $$ $$($$$($$$$$($,$1ҋ$($,1׋$ $׋$$1҉$$$$$$1$$¸$$$(1$$$$$$$1$$$$$$$9rw $9v$$ $$($Ɖ׋$㉄$$$ቄ$$1ҋ$$1Ӌ$$(Ӊ1$$ȉډ1׋$$$$$ $$$$$($$$$DŽ$$$1҉$$$$$$$ $($$$$1҉$$$$$$$$1$$$$¸$$$1$$ȉډ¸$1$$9$rw 9$v$$$$$$DŽ$DŽ$9$w!r 9$wDŽ$DŽ$$$$$ 9v[$0$4$0$4$($,$4 $0_DŽ$1֪r9wDŽ$9$wr 9$w DŽ$$nA4$$$$ $ƇDŽ$DŽ$髇$F DŽ$DŽ$1DŽ$Fv$t$u]$uSΉ$u$DŽ$DŽ$DŽ$DŽ$1郉DŽ$DŽ$DŽ$DŽ$1P$$$$$ u$$DŽ$DŽ$DŽ$$@"$$ +$$$ Ë$$ډ$$$$㉄$$剄$$$$$$$1ҋ$$1Ӌ$Ӊȉډ¸$$DŽ$$$$$$$$$$$$ DŽ$DŽ$$$$$  $$$DŽ$Fs$c7&+$, $uy$$u$ut DŽ$$uDŽ$DŽ$DŽ$DŽ$$  $C$$$DŽ$?r$1ruu$u$rDŽ$$$q$$锵$$ $$ʉ$$ቄ$$$牄$$$ቄ$$$1ҋ$$1Ӌ$Ӊȉډ¸$1ꉄ$$$$$$$$1$$1$$$$$$骖$9$7yRDŽ$DŽ$DŽ$DŽ$1qJ 9$dMW$$ $$}^$ 剄$ʉ$$ቄ$$$牄$$剄$$$1ҋ$$1ӉӉȉډ¸$1ꉄ$$$$$$$$$$t;$$ u 91ۋ$xn11on9$$$$$\DŽ$飬$tDŽ$ DŽ$DŽ$DŽ$ 1d7+$$$$$N$VDŽ$DŽ$1ҹ $$b$u $tDŽ$DŽ$hDŽ$1DŽ$1m @ 1ۋ$$$l1۸DŽ$$$yn$$$$;.;=$$/$!$u $t DŽ$$u$DŽ$$$$@$D$$$H$L$($,$P$T$0$4$X$\$D$<$D$8$D$4$D$0$D$,$`D$(|$$@ED$,$T$l$`$d$$T$lz$$$$$$$$$D$,$D$($D$$$D$ $D$$D$|$$ED$,$T$l$$$$T$l鶪$D$$$D$ $D$$D$$D$$D$$$t$|$ ED$,$T$lT$lB$$$$$ 4DŽ$DŽ$DŽ$DŽ$1֪.$$DŽ$DŽ$1|A\$$G9 59wY9Q9j9bDŽ$<$I$u[DŽ$DŽ$DŽ$DŽ$1Ƽ d7 u;DŽ$DDŽ$M1DŽ$DŽ$ [8$C$$DŽ$h$(DŽ$DŽ$$$$$$  DŽ$DŽ$DŽ$DŽ$$$9Q$D7p$5 [8 $p$#p$$J;$A;$DŽ$DŽ$ DŽ$DŽ$c7IDŽ$1o1ɻ [8t [8$$$M1$$˓D щ$$ pDŽ$$;$nc$9r$9$($,$$M$$+$ 9rEw9r?99$$9\r9RDŽ$DŽ$DŽ$DŽ$DŽ$sH$$ $$e$DŽ$1d9$(eHL9$rzvo;$DŽ$0DŽ$4^L DŽ$DŽ$DŽ$DŽ$1l9$sDŽ$0DŽ$49K;$h$9 Dw:r$9@w)$$DŽ$0DŽ$4K$$w$$$DŽ$1vc$t$$$$$`$dC_tAXt$$$$$h$lC%tAt$p$tBt@s$x$|s1d7+$$$$$$$ $%$ $;$GDŽ$k ;$jr ;$j;$;$;$j;$j9DŽ$>$|$ t$$t$$~K$9$$ $$ $ $$$DŽ$1= ~t)$|$ T$t$Y$׋$$$ x$DŽ$DŽ$(=$$$18J$C$駴$`$T$ $\$D$$$$$$$DŽ$΁$DŽ$=5d7 1ۋ$$$_$$11q_$9$#1$$$$ uu$$$$$ $$$ $ $$DŽ$1$$ uud7 {!DŽ$$DŽ$DDŽ$M1DŽ$DŽ$ [8B(DŽ$1$$$@$D$$$H$L$($,$P$T$0$4$X$\$D$<$D$8$D$4$D$0$D$,$`D$(|$$@ED$,$$`$d$$&$$$$$$$$$D$,$D$($D$$$D$ $D$$D$|$$ED$,$$$$$j$D$$$D$ $D$$D$$D$$D$$$\$t$ ED$,$ $$ $$ $t"$|$ t$$t$$$$DŽ$́$$$tBDŽ$DŽ$1DŽ$铙DŽ$DŽ$DŽ$111R=A$$}$9$'$t >$ $$ $ $$$DŽ$5DŽ$DŽ$DŽ$DŽ$$$$$$$t$|6DŽ$DDŽ$M1DŽ$DŽ$ [8$1ۋ$$$YQ$9$sQ$t$DŽ$DŽ$11ɻ11WV|$`$|$P$|$@$|$(t$@|$t$P|$t$`D$|D$D$x$L$tT$p$ 2$Ą^_ÐUWVS$$$$D$PD$TD$XD$\D$`D$L$$D$T$D$`$D$p\$t$$D$H$|$l$4$|$(|$D$H|$t$LD$\D$D$X$L$TT$P$1$Ĝ[^_]ÍvUWVS$$|$P$D$`D$dD$hD$l\$p$$t$|$$D$LT$H$D$LT$HD$T$,$|$(t$P|$|$D$lD$D$h$L$dT$`$#0$Ĝ[^_]ÐWVS$$|$P$D$`D$dD$hD$l\$p$$t$|$$D$LT$H$D$LT$HD$T$4$|$(|$t$P|$D$lD$D$h$L$dT$`$:/$Đ[^_ÐWVSĀ|$P$|$@$D$`D$dD$hD$l\$p$$D$T$$|$(t$@|$t$P|$D$lD$D$h$L$dT$`$w.$[^_ÐWVS$$|$P$D$`D$dD$hD$l\$p$$t$|$$D$LT$H$D$LT$HD$T$4$|$(|$|$t$PD$lD$D$h$L$dT$`$-$Đ[^_ÐWVSĀ|$P$|$@$D$`D$dD$hD$l\$p$$D$T$$|$(t$@|$|$t$PD$lD$D$h$L$dT$`$,$[^_ÐWV|$P$|$@$D$`D$dD$hD$lt$p$$D$T$4$|$(|$t$@|$t$PD$lD$D$h$L$dT$`$,$Ą^_ÍvUWVS$$0󥍼$$@󥍼$$PDŽ$DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$DŽ$$|$pDŽ$ݺݺDŽ$ݺݺ-$|$($|$$|$|$X$󥍄$D$$$$$*$$$D$h$J||x L$tL$hL$`L$d L$`u J|$tP<|$t.\$d \$`;S1ۉL$x\$|l$x\$hL$h\$l1vс||t\uTс~wDr=Ƥw;$u$$u$u$tMv 0$t ͉-[^_]Ð$u؋$u͋$u‹ Ív -[^_]Ívl$`\$hL$h\$l1IL$Lu]L$h 9T$dr 9L$`3T$dL$`3L$h u!T$L9zw9rS$$t$`|$d$$ $L$,$L$($L$$$L$ $L$$|$$|$XT$$D$PT$T$$$$T$TD$PT$t$D$t$$$u$$y$$$$DŽ$DŽ$~Ƥ (ƁD$t=6|$tqD$t-qD$X<$$T$`$|$X$D$X|$`T$\D$XT$\$$$uE$u:$u/$u$$uu$u $t 0=(|$\ D$X T$\ -|$$uz$$$$u $t DŽ$u$RDŽ$B$$tu$DŽ$DŽ$DŽ$DŽ$vCrft$x|$|l$x\$hL$h\$l1$L$$$L$ $L$$L$$L$$L$t$|$ T$$D$PT$TD$PT$T$$DŽ$DŽ$=|yD$t$u!$u$u $t $$L$X\$\f1x -(-:f|$tr$$$D$XT$\D$tv` ‹L$\D$X Sf$$$$f$D$XT$\r+|$t$$$$$$$$DŽ$DŽ$DŽ$DŽ$99:DŽ$D$XD$\$$uv$uk$$??$G$9u $t DŽ$u $tV1nf$J$tu$DŽ$DŽ$DŽ$1DŽ$DŽ$DŽ$DŽ$$D$XT$\1DŽ$oDŽ$#L$t$D$$$D$ $D$$D$$D$$D$$$D$T$ |$$$$$$D$XT$\D$XT$\DŽ$DŽ$$1q+D$t$$9r911 DŽ$D$XD$\~+uE$u:$1 ) T$XL$\$-DŽ$1DŽ$vWVd|$@t$p|$0$t$P$$D$T$4$|$ |$t$0t$@d^_ÍvWVS`|$@t$p|$0$\$P$$D$T$$|$ t$0|$t$@`[^_ÍvWVSp$$|$@$\$P$$t$|$$D$>B#&EGGHH#HHHWL]LLLJM\MtM+P6QAQQ#QS(T6TRTT4UBU^UVW(lX#XXOZdZ[[3[i[])/]6]^2^#^b(6c#ddd>e)^h&hhicilik'MrSrrrrrss~s#sttuvw'wwx&"(_t'5CRv|r#  V#&'H##Hj EȎώ(qxϑϚiH'&);Rig#.4#ҭ^cز$$U$[$$$̳$߳$3Jٴʵ!е!L!R!!!q'+9HsyϼĽZ(A&''(7[hPgqv'-H#V#v%|%%%% %R%g%}%%XkR)nub i F#V\bh#F#>&')`!f!g n %>#o!!! !gmd!j!!!q{#/&'s)~##\*t**\*{*G*f*%*****E#4++ K"U"["e""M'Pg #;)Ft})/  6    = * *4 *P * *< *X * * * l\,XDx  = X( h` v     h (     p    -  =  M  .text# .data.bss]gw  2 H ^ r  .eh_frame_nr_digits256_rounding_correction.constprop.1_add_and_round.constprop.0_bid128_ext_fma___bid128_fma___bid128ddd_fma___bid128ddq_fma___bid128dqd_fma___bid128dqq_fma___bid128qdd_fma___bid128qdq_fma___bid128qqd_fma___bid64qqq_fma___bid64qqd_fma___bid64qdq_fma___bid64qdd_fma___bid64dqq_fma___bid64dqd_fma___bid64ddq_fma.eh_frame___bid_ten2k256___bid_ten2k64___bid_ten2k128___bid_IDEC_glbflags___bid_midpoint64___bid_midpoint128___bid_nr_digits___bid_IDEC_glbround___bid_midpoint192___bid_midpoint256___bid_round256_58_76___bid_round128_19_38___bid_round192_39_57___bid_round64_2_18___bid64_to_bid128___bid128_to_bid64bid_round.o/ 1350391525 0 0 100666 53738 ` L(.text  0`.data@0.bss0/4$@0@UWVS$l$?$L$P\$@L$xD$0T$4$D$T$ D$01ҋL$\$ 1ӋD$@Ӊȉډ1҉D$`T$dȉډ¸$$D$1$$$ $$剄$$$D$T$ $1ҋL$\$ 1Ӌ$Ӊȉډ1҉D$XT$\ȉډ¸D$T$D$1D$T$L$\$($D$pT$t$D$ T$$D$p1ҋL$ \$$1ӋD$(ӋD$pT$t1҉D$pT$tD$(D$pT$tȉډ1D$pT$tȉډ¸D$hT$lT$ T$D$$D$ T$$$牄$$D$ 1ҋ$$1ӉӋt$ |$$1t$ |$$$D$ T$$ȉډ1D$ T$$Ή߉$$$1$$L$0\$41ۉL$0\$4D$@D$0T$4L$`\$dL$0\$4\$t$\$0t$41ҋ|$49wrL$09w11҉$$ \$ht$l\$t$\$ht$lD$hT$l$$1$$$$$L$X\$\$$\$ht$l$$l$L$剄$$T$HT$$D$HƉ׉1$1ۋD$$׉1ۉ$$D$d$$$D$D$T$ D$1ҋ$$1ӋD$d$(Ӊȉډ¸D$T$D$H1׋D$d$PD$(T$,D$P剄$$D$HD$LD$(T$,1҉D$`T$dD$HT$LD$`T$dD$d$@D$`T$d$$1҉$$D$@$$D$`T$d1$$$$1;$wr ;$w11҉D$XT$\$1ҋt$|$׉t$|$t$X|$\t$|$$$1$$$t$|$T$8T$8 $d$PD$HT$LT$8$ d$PD$PT$T1҉D$8T$17;D$HQJD$09$fD$P9$f9p1i9;14D$$ D$ FT$< T$88l$4 l$0*D$ D$*3$ $u$ $uD$d D$`$l$ 1ŋD$1  q3D$PD$TD$(D$,D$D$f$9D$ w 9T$3D$ 3T$ C$;$r ;$3$$1 $ ;$wSr ;$wH$1$1 $l$d;rT$`;f?0!@1$$$=f11v$9D$ 89L$)v90L$ I 9Xr9ND$T$\$ \$6$$t$ v|$L$`ՉNj$L$($L$xD$PT$T$D$T$ D$P1ҋL$\$ 1Ӌ$Ӊȉډ1҉$$ȉډ¸$$D$1$$L$H $$剄$$$D$T$ $1ҋL$\$ 1Ӌ$Ӊȉډ1҉D$hT$lȉډ¸D$ T$$D$1D$ T$$L$X$$剄$$$D$T$ $1ҋL$\$ 1Ӌ$Ӌ$$1҉$$$$$ȉډ1$$ȉډ¸D$@T$DT$T$0D$4L$$D$8T$<$D$pT$tD$81ҋL$p\$t1ӉӋD$8T$<1҉D$8T$<D$8T$<ȉډ1D$8T$<ȉډ¸$$D$p1$$L$P\$T1ۉL$P\$T$D$PT$T$$L$P\$TL$ \$$L$P\$T1ҋ|$T9wr\$P9w11҉$ $$L$@\$DL$0\$4L$@\$DD$@T$D$$1ۉ$$$$$L$h\$l$$|$@l$D$$D$`d$(D$0T$4D$d$(D$ T$$D$01ҋL$ \$$1ӋD$$Ӊω݉1퉼$$ ω݉$$D$ 1$$D$`d$H$$D$d$HD$ T$$$1ҋL$ \$$1ӋD$$Ӊω݉1퉼$$ω݉D$ 1ՋD$`d$XD$pT$tD$d$XD$ T$$D$p1ҋL$ \$$1ӋD$$ӋD$pT$t1҉D$pT$tD$`$D$pT$tȉډ1D$pT$tȉډ¸D$hT$lT$ $DŽ$D$`d$D$ T$$D$d$D$T$ D$ 1ҋL$\$ 1ӋD$ӋD$ T$$1҉D$ T$$D$`D$ T$$ȉډ1D$ T$$ȉډ¸$$D$1$$L$0\$41ۉL$0\$4D$`$D$0T$4$$ L$0\$4|$0l$41;l$4w r;|$0w11҉$$ \$ht$l$$\$ht$lD$hT$l$$1$$D$`H$$ՉNj$L$(\$XL$xD$PT$T$D$T$ D$P1ҋL$\$ 1ӋD$XӉȉډ1҉$$ȉډ¸$$D$1$$$ $$剄$$$D$T$ $1ҋL$\$ 1Ӌ$Ӊȉډ1҉D$hT$lȉډ¸D$0T$4D$1D$0T$4L$H$$剄$$$D$T$ $1ҋL$\$ 1Ӌ$Ӌ$$1҉$$$$$ȉډ1$$ȉډ¸D$@T$DT$T$D$L$t$`$D$8T$<$D$pT$tD$81ҋL$p\$t1ӉӋt$8|$<1t$8|$D$4 D$00l$ l$$ $u$ $uD$d D$`/$D$3l$ D$3D$ l$@l$ T$$l$4 l$0̳D$ D$q$ $u$ $u\$d \$`Ʒ$3D$ 3T$ w$;$Gw ;$8$1$1 +$ ;$w ;$;$;$߲$l$d;ŲT$`;靲vD$PD$T11ۋ$P$$E$$9D$ -9T$fT$T3 D$P3 211 5 =$(,D$PT$T$D$D$D$PT$TD$P#D$T@D$T$D$#D$@D$(T$,$D$9l$ 79D$($9D$ 9T$$D$;$w$9D$;$D$@D$ T$$D$PD$T$U$+$D$(D$,D$D$D$PD$T.uzR| <\AA AAC8 AA AAB @\`0 AA AAC* AA AAC @ )AA AAFH AA AAB @5cAA AAF5 AA AAC   %6Gn'{?F  fpLW%,y    8 N       " ( @ F T Z s z      ! ^ t   A K   ^u0HNYho`gr|: D   %!%0%7%%%& & 2& 8& t& & & & & & )' ;' ''( (}(!(!))(*5***+(++,1,E,O,,,e-}-0 0 |000!0!f1!o1!1!1!1111112 222B2!K2!]2!c2!{2!2!2!2!2!2!3 3 63 <3 3 3 4 4 N4X4e4k44 4 5  5 ;5 A5 5 5 66 =6 6"6"7"%7"7"7"j8"8"o=u===="="^>"k>">"?"?"?"G&G~GGGGG"G"xH"H"I"I"I"I"~Q"Q"R"(R"R"R"S"S"d#e$e$e%e%i$i$)i%0i%ii$j&*j&>j&Dj&j&j&j&j&7k@kk$k$k%k%l!l!l!l!l!l!l!l!l!l!l!l!m$n$n%)n%n"n"2o"TZ`f0&:&&&&&,&2&|&&&&.!8!F!M!]chn&&"&(&W&a& ` "\ 8  N5 .text .data.bssd$n-@P]n}*.eh_frame___bid_round64_2_18___bid_round128_19_38___bid_round192_39_57___bid_round256_58_76.eh_frame___bid_midpoint64___bid_Kx64___bid_Ex64m64___bid_mask64___bid_half64___bid_ten2mxtrunc64___bid_ten2k64___bid_Kx128___bid_Ex128m128___bid_mask128___bid_half128___bid_ten2mxtrunc128___bid_midpoint128___bid_ten2k128___bid_Kx192___bid_Ex192m192___bid_mask192___bid_half192___bid_midpoint192___bid_ten2mxtrunc192___bid_ten2k256___bid_Kx256___bid_Ex256m256___bid_mask256___bid_half256___bid_ten2mxtrunc256___bid_midpoint256bid_from_int.o/ 1350391525 0 0 100666 3328 ` Lr .text(  0`.data@0.bss0/4" @0@SD$xځ1[؉ځ[ÍvD$1fUWVSlD$DD$HD$LD$PD$T$$ځtكہ#w*s d1 ڃl[^_]fov؁xEcD$<|$T|$$|$P|$ |$L|$|$H|$|$D|$|$X|$L$\$ t$$T$8D$DT$8tl$=z_WVSD$t$x1ɻ@00xHX [^_f11ɻ@0xHX [^_fD$T$@@@ @0WVSD$L$\$x1@0Xpx [^_Ívك1@Xpx [^_ÍvD$T$L$ H@@ @0zR|  )AV A P@0 T<AA AACj AA AAC  AA AAB K AA AAA  AA AAB 0'AA AACU AA AAD  AA AAC  AA AAA  AA AAD 8dXFAA Ad  AAC W AA 8IAA Ac  AAD Z AA  IO  D X  h     ", 78 K, `T u   .text(.data.bss  .eh_frame___bid64_from_int32___bid64_from_uint32___bid64_from_int64___bid64_from_uint64___bid128_from_int32___bid128_from_uint32___bid128_from_int64___bid128_from_uint64.eh_frame___bid_IDEC_glbflags___bid_IDEC_glbround___bid_round64_2_18___bid_round128_19_38bid64_add.o/ 1350391525 0 0 100666 8176 ` L~.textA 0`.data@0.bss0.rdata\@0@/4`j@0@UWVS$$$D$ $T$(%`=`0T$8l$\$%D$0%`=`T$@D$ D$T$ D$T$ D$T$T$ T$uQ||I xx xxtD$ D$tT$89T$@iD$ D$T$89T$@T$Pl$@ΉD$T$(T$D$L$0L$+\$P\$ l$T$  \$(D$,%-|$ L$ ;r\$;)ÉD$(L$ T$ʉT$0D$L$(D$L$0ʉT$ )\$ |$ )ى T$ ~D$5Ƥ  |$ ~v (L$L$D$ xD$bKT$ r fxx T$89T$@| Й¸D$T$T$09T$(=0L$L$l$D\$(D$,%-‹\$ ;\$`T$ T$ J-l$`D$TD$3D$T$3T$D$\$ )\$d$\$L$x\$|L$T\$ ;r ) D$TD$@\$T)\$@L$\$ +L$x\$|L$h\$lL$d$\$ +\$@\$(׉1L$H1Ӊ\$LDDED$( $$t$H|$Lo#ϋT$(D$0T$4$D$XD$T$$D$8T$;=$n r ;5 ` D$(\$`D$ D$H l$`DDED$(4<L$( T$0L$4ωщD$T$D$ T$$D$T$D$1ҋL$\$1ӉӋD$T$1҉D$T$D$ T$$D$T$ȉډ1D$T$ȉډ¸D$8T$r|$ Ƥ.T$ T$%D$ %|=xD$@D$D$U D$@¸D$T$} t1D$T$ rJD$3D$T$3T$ cD$T$ |$ ~Kr|$Ƥ;ID$oD$ #%f\$;vD$(vD$T$ v1ɉUT$ T$|$vT$49T$<rL$09L$8v D$3D$T$3T$ tD$D$ L$P \$\$ L$ L$JfL$L$\$ \$~~ T$ #D$5o %|$  v\$ \$T$ T$T$ ˉ\$A\$~D$ ƤD$ ˉ\$Iׁ~r ƤuID$@t$|$ 1\$\$D$i43334333D$0ʉT$4ӉȉډӋt$014333d$1҉D$8T$<t$8|$f;K <9|$|'r 9L$x'!D$h")l$hF|$hD$XT$\D$\ЋL$X /FT$$H$HG|$HD$pNl$\|$X 4D$HT$LD$XT$\D$8T$BPL$x\$|C7|$TM1t$P|$T,l$\|$XD$XT$\D$PT$TD$HT$LD$X1ҋ\$Ht$L1֋։߉D$H1ՋT$8D$<ЉD$xd$8D$8D$x‰T$  !! &ELjc!p}"MT!!!" " $]%%&"&"&''((U)e)u)))))----/.6.S.00b1 i1 227222234444'5.5K56.77 7 D8K889999:N:_:l:q;;;<<<=>E>~>>>?5?i?r?D@S@9A/B"5B"dB"vB"CCDEEE.E;EeEEEG GGGGG-H8HDHHHH%I0IX|XYYYZO[v[[[[8\?\r]]]A^p__`` bNb ]b b!b!c!,c!8c}ccceegg3h=hhhcn jn n!n!/p;pIpYp`popq!q!pr!r!rrrrr ss9sttttttuuuuuuuupv!v!x!x!y!y!H{Y{j{{{{{}}}~ ~~~~>-O`m1!7!tV!l!˅C!!Ɇ'##R#f#Έ#### L,l,h$d  ,  ; JX Y8 h vd ć (   X ( .textM.data.bss#3HZk~  .eh_frame___bid64dq_add___bid64qd_add___bid64qq_add___bid64dq_sub___bid64qd_sub___bid64qq_sub___bid128_add___bid128qd_add___bid128dq_add___bid128dd_add___bid128dd_sub___bid128qd_sub___bid128dq_sub___bid128_sub.eh_frame___bid_nr_digits___bid_ten2k64___bid_IDEC_glbround___bid_ten2k128___bid_IDEC_glbflags___bid_midpoint64___bid_ten2mk128___bid_maskhigh128___bid_shiftright128___bid_onehalf128___bid_ten2mk128trunc___bid_midpoint128___bid64_to_bid128___bid64qqq_fma bid64_div.o/ 1350391525 0 0 100666 73761 ` LV.text$L 0`.data@0.bss0.rdata(@@@/4$(.@0@UWVS$$$$ށt$Pށ``T$0݁l$4|$0l$4|$(l$,́l$Xʁ`T$8`D$ ʁT$$D$ T$$l$, l$(́~~݁||݁xx xxt:D$$ D$ H 1|Ĭ[^_]Ív́|xtԉ uJ%|=|%x=x L$X3L$P1ʁxĬ[^_]f)L$8\$49\$$l$ t$$ݜ$݄$D$0T$4$$߬$r\$(D$(T$( ټ$f$ f$٬$߼$٬$$$L$ ϋD$$D$ D$@ʉT$DL$0\$4+L$@\$DL$H\$LD$(T$,1\$(L$H\$LىȉD$@T$DD$ !ȋT$$!ڋt$H|$L׃l$(+D$@T$DL$(+,)ʼn\$HD$`D$(T$,D$`D$pT$tD$hT$lD$(1ҋL$h\$l1ӋD$`Ӌt$(|$,1t$p|$tȉډ1׉ȉډ¸D$(T$,D$h1D$(T$,D$DD$HT$`T$@ D$@d$HD$@ʉT$D\$8)\$8 ؋L$ \$$L$\$ \$(t$,$t$Ӌt$ |$$t$H|$Lt$H|$LT$ ӋD$$4D$ D$`T$dt$(|$,+t$`|$dt$(|$,t$@|$DߋD$, D$(T$0Ѓ T$8 -\$X9\$Pt Et|tvL$X3L$P|$8|$8~\$8Kׁ~D 2 \$8D$0(1ʁxsXMfʁxxD$ T$$#BD$ D$$D$ T$$fxxT$0 t$4#D$0D$4|$0l$4|$(l$, ݁||w~~u D$0T$4Ĭ[^_]Ívwt$09t$ l$ l$$\$(l$0|$4\$@L$(+L$@\$4D$0ËD$0$Ӊ+D$ T$$,D$(T$,D$HT$LD$@T$DD$(1ҋL$@\$D1ӉӋt$(|$,1t$H|$Lȉډ1׉ȉډ¸D$(T$,D$@1D$(T$,\$8)\$8|$$+l$ \$@D$@T$DD$T$D$D$@D$D=ofo~~ D$ T$$*v|$8` )΁Ǝg ~L$X3L$P1 ʁĬ[^_]Ël$8fMׁ~l$8f#5o  `% \$8 W|$4w|$0s…h 11t$ |$$ƉfЃNj؋,͍ M=wlj=v͉Fut$ |$$ýD$ )tًl$ uŅ l$8D$8jL$X3L$P|$8|$8b ~Fw Ƥ8 (1ʁx\ A Kow|$$|$ t\$ KD$0H))9~ӉD$0T$4D$HT$Lt$011҉D$ T$$t$ |$$t$0|$41t$H|$LD$ T$$T$ L$$1ϋ  t1\$8$$߬$ ݜ$݄$l$(L$, ݜ$݄$Dټ$f$ f$٬$|$`٬$L$dL$ D$$D$`D$`d$ D$HʉT$LL$(\$,+L$H\$LΉ߉t$h|$lt$ |$$D$HT$L)ӋD$h#D$ T$l#T$$ӉȉډЉD$pT$t)D$p#D$HT$t#T$LӉȉډЉD$xT$|+L$ \$$D$x!T$|!ӉΉ߉$$$#D$ $#T$$Ɖ߉t$(|$,t$`|$dt$@|$Dt$h|$lL$pщȃ1׋L$xщȃ1׋$ȃ1xxz1ف1ʁxv~r ƤT$0߁|$4ځ|x1D$(D$,:~nr =ƤaD$ ρ|$$%|=x/1114Ƥ\$8 \$8 l$(ټ$f$ f$٬$߼$٬$$$\D$ T$$L$ 1ډ$$߬$ݜ$݄$D$@D$Dټ$f$ f$٬$|$`٬$D$dD$dv|$8Y-Ӌt$X3t$Pt$Xt E t$, t$(tʃD$(|$8)|$(DDED$(Ή4<\$(\$Hދ \$Pt$Tt$`\$PD$ T$$D$@T$DD$8T$  D$8)tl$8uŅ l$pfv6vv f $٬$߼$٬$$$Ή߃$$$|$D$P扄$$D$x扄$$D$P牄$$$1ҋ$$1ۉL$ \$$D$ T$$D$xD$ T$$L$ \$$˹$$$1$$\$<|$8牄$$㉄$$D$牄$$$1ҋ$$1׋D$׋$$1$1¸$$$1$$$$1$$t$ |$$1$$9$rw 9$v|$ ΋|$ ߋ$$˹L$ \$$L$h\$l+L$ \$$L$ \$$DŽ$DŽ$9\$lrw9L$hrDŽ$DŽ$L$@\$D+$$L$h\$l$$$$ ӋD$hT$l)ډ9T$l w 9D$h DŽ$DŽ$T$l9T$Dr"w D$h9D$@rDŽ$DŽ$$$D$@T$DD$(T$,)Ɖ+t$@|$D$$¸D$(T$,$$D$`T$dD$(T$,D$XT$\D$\9rw T$X9T$(v D$`T$d$$߬$ ݜ$݄$ $$߬$ ݜ$݄$l$ D$$ ݜ$݄$t$ |$$t$h|$lL$@\$DD$ T$$҉D$(T$,+D$HT$LD$HT$LT$$T$ L$@\$DۋD$ ȉ+L$8\$D$(T$,t$8|$<)t$@|$DD$ T$$+D$HT$L|$$9|$LD$ T$$5v$3$|$p|$p~D$(T$,/v٬$|$(٬$T$(D$,D$,_f@Tv+D$Pf\$(T$H T$ D$L D$$$3$$tt$(N tʃD$ )l$ l$(DDED$ Ή4<\$  t$8|$<|$HD$@T$DD$Hቄ$$D$XT$\D$@1ҋt$X|$\1t$0|$4D$0T$4D$HD$0T$4t$@|$D1t$@|$D$$t$@|$DD$0T$41D$@T$D$$$D$HT$LD$hT$l㉄$$D$H1ҋ$$1ӉӋt$H|$L1t$h|$lȉډ1׉ȉډ¸D$HT$L$1D$HT$LD$0T$4¸L$X19rw9v D$@T$DL$ <\$@t$D t1\$Xt$\\$(uqL$Xtf@) t1\$0t$4L$@!ًl$D! u-9T$< r 9D$8t l$<1ՋL$81 < vD$P D$PD$X$ T$\ˉ…11l$P݉t$@|$DǐЃ؋4  Aw݁wȉGul$Pt$@|$D=vv> 'D$( )tL$(بuT$(D$(l$(vD$(T$,É+\$@t$D\$Ht$L9T$Dw 9D$@D$ T$$$3$ ~rRwƤvH (1ʁx9  KnvrƤw(Mׁ~v΁];\$`w ;L$ T$8D$؃D$ T$$ t ow` QDŽ$@L$8)$D$PT$T$ t1D$PT$TD$(T$,D$0T$4D$0T$419T$,w r9D$(w11ۋD$HT$LډD$(T$,D$@T$DD$(T$,D$@T$D9T$,D$0T$4D$PT$T$ t1D$0T$4D$0T$4L$8 t1 $0 k\ R1Fr 9D$(\;\$,wr ;L$(vG1>%\$L9\$DD$H9D$@T$,9T$4L$(9L$0L$T L$P7\$L9\$DD$L9D$DT$H9T$@L$,9L$4\$(9\$0L$T L$PT$L9T$DjrL$H9L$@Z\$L9\$Dl$H9l$@D$,9D$40vT$(9T$0cL$H9L$@l$H9l$@D$(1iUWVS<$$P󥍼$$`󥋄$D$X$ $$$$󥍼$ $󥋌$ $$Ӂx\$(_x=|$P\$H=|$0ׁ?|$@9yD$@%D$DD$PD$T%|=x1D$8D$<oD$@ׁ|$D D$H=$(,9D$DXD$8D$<D$@D$DD$PD$T?$t$`$xL$0_+x\$h5t$H5?9D$H\$LD$XD$\%|=x1=|%~=~%~=~= l$\t$X(D$xT$|(扄$$D$x1ҋ$$1ۉL$0\$4D$0T$4,D$0T$4L$L?L$p\$H\$`%$$$D$@T$D$1ۋD$pD$XT$\L$X\$\D$@T$D1D$XT$\L$X\$\˹L$8\$Z ID$( )tL$(بuT$(D$(l$(vD$0T$4t$@|$D)t$(|$,D$pT$t+D$PT$T|$t9|$T D$pT$tvD$(T$,t$@|$D)t$8|$MoʁwѶɶo麶D$0T$4t$P|$Tt$p|$tD$t9rwT$p9v D$(T$,\$@t$D\$(t$,;\$lw7;D$h-ىt$(|$,D$(T$,t$P|$Tt$0|$4D$49rwT$09v D$8T$<\$@t$D\$8t$Zr  5X 0r ~   B Y`u{%!!!!r"" =# [#a#d$j$'-( Q( ( ( *) 0) R, v,  --U. l.u....../1  3,363@3[3e3336b7s77\8i8~888`9999:+:::];;'<-<j===UAA6BEBWBCDDcEE E E E J BJ K K K K KFLMLdLjLMMMNOOOORR^SSZT TVV W W !W Z[ [#[)[[[\.]A]o^````Na[ajaaaRbbbbbc}ccBdgddddd:eef f ffh h i ik kkkkkslyl_pp .qq qqqqq % CLV`f[ s| n 6C     " S    :ARXN: @ 9 ZB N FPT  -     f x kd   OVek|  X *_ 9 .text".data.bss.rdata(H$R ]r 1Jc|.eh_frame___bid64_div___bid64dq_div___bid64qd_div___bid64qq_div.eh_frame___udivdi3___bid_IDEC_glbflags___bid_power10_index_binexp___bid_estimate_decimal_digits___bid_power10_table_128___bid_IDEC_glbround___bid_convert_table___bid_packed_10000_zeros___bid_factors___bid_reciprocals10_64___bid_short_recip_scale___bid_round_const_table___bid_reciprocals10_128___bid_recip_scale___bid_power10_index_binexp_128 bid128_div.o/ 1350391525 0 0 100666 98235 ` L{ .text\_ 0`.data@0.bss0.rdata(|]@@@/4L]H{@0@UWVSʼnT$DL$X$$󥋌$$$$$}A 0PL$XH @ =Ĭ[^_]Ð$؉D$(T$lD$X D$DT$hҋT$(D$‹D$T$ډD$T$ L$ 19T$w 11ۉȉD$T$T$(T$HL$\X\$ @ D$`t$ |$D$pT$tD$`扄$$D$xT$|D$p1ҋL$x\$|1ۉL$0\$4D$0T$4d$`D$0T$4T$T$d|$D$\牄$$D$D$T$$1ҋL$\$1ۉL$8\$<D$8T$/!0F L$0\$ L$\$f9\$r9L$wzT$1ڋD$1 9|$ sXD$T$/_˹l$(u} D$,E T$@U D$(Ĭ[^_]fw9t$0vȉځ/tӉ1Ӊ1Ӊ9r w9vMfd7 E1 [8DƺM1 tL (tpL$@ L$,uaHtcT$,D$(PD$@ xL$(A AT$,D$(PD$@ _L$(A AvuD$, \$(CD$@ _C Cc7ȉ[v}Q 0T$,D$(PL$@H @ g=WD$(@A݉l$\\$|L$@ L$,8Il$|l$x ۋ\$\,L$\$L$\$ Ӹ1ҋt$9t$wr |$9|$w11҉Ή׉t$|$T$\|$Dl$ D$L$D$`T$dD$ቄ$$D$D$hT$lD$`1ҋt$h|$l1t$ |$$D$ T$$D$d$D$ T$$T$T$Xl$D$DD$pT$tD$T$D$p1ҋt$|$1t$0|$4D$0T$4D$XD$0T$4t$0|$4t$8|$4D$@T$D /%.!01/ L$(\$ L$H\$0v9|$0!r 9t$H!\$01L$H1 u9T$ !t$H|$0/._$P$T ؉$X $$\v9rV\$x9\$@H?'?D$0D$4D$hD$lD$8D$<Gw 9D$83\$0|$81 "D$0Ӂ?\$4L$ht$l%|=x|D$0ցt$4D$hD$l1D$8D$<w ;t$@ 13t$@ V"\$@\$H?t$LL$x$$%|=xD$H\$LDŽ$DŽ$1 9\$0_9\$H$$D$(T$,D$8T$V   )t͉بu_t$0|$4l$ $3$$11D$ T$$+t$0|$4ȉ+D$hT$l9\$lqvD$ T$$iD$8T$<T$<3T$4D$83D$0  DŽ$!{11v٬$|$ ٬$T$ D$$D$$%|=x =|Kf%~=~u |$0$XD$4%$\L$h\$l$P$T$P$9D$XD$XD$\٬$߼$٬$$$f٬$߼$٬$$$f91D$x¸D$ T$$T$@L$D$P$TD$$ $X $$\vD$ T$$L$h\$l9\$lrw9L$hvt$0|$4"D$ T$$7 yE$3$$|$xD$@T$DD$ T$$D$8T$<l$D ʼnl$0T$4D$8T$<҉D$8T$ )t͉uՅl$xQD$ T$$+t$0|$4ȉ+D$hT$l9\$lv+D$ f9\$l w 9L$h t$0|$4D$l9D$$RT$h9T$ > D ٬$߼$٬$$$Ή߃t$ |$$D$p牄$$D$(T$,D$pD$PT$T$1ҋt$P|$T1׉׉¸L$P1ډӉ˹L$P\$T$$L$$L$0D$4D$ D$ d$0$ʉ$$$T$(L$,\$($$$ )D$@T$Dt$`|$d+t$P|$TL$d9L$Trw \$`9\$Pv D$@T$DD$ T$$¸L$ \$$L$X\$\D$8T$<;T$+$$)׉$$߬$sݜ$݄$ l$`D$dcݜ$݄$l$hD$l5ݜ$݄$D$pT$t¸L$p\$tL$8\$<D$HT$L;T$Lr.D$8T$< u&L$@\$D L$p\$tD$d9v ٬$߼$٬$$$ȉڃ$$щD$pD$XD$(T$,D$xቄ$$D$pd$XD$PT$TD$(1ҋL$P\$T1ӋD$pd$xӋD$(T$,1҉D$(T$,$$D$(T$,ȉډ1D$(T$,˹D$P1ӋD$(T$,$$ȉډ¸D$PT$TD$hT$l+D$PT$TD$PT$TD$pD$t9T$lrD$pD$tD$`T$d+D$pT$tD$hT$lT$(T$(ȋT$( ڋL$h\$l)ӉL$p\$t9\$lN>1ҋ\$l9\$drw L$h9L$`r11Ґ+$$)׋$$¸$$L$8\$<D$HT$L;T$LrD$8T$<$$߬$&ݜ$݄$ l$p|$tݜ$݄$l$Pt$Tݜ$݄$٬$|$(٬$L$,t$(D$XD$`T$dD$xD$hT$lD$XD$XT$\D$`1ҋL$X\$\1ӋD$xӉΉ߉t$x|$|D$X1D$xT$|D$pT$t+D$hT$lt$`|$d1)1)ڋL$P\$T+L$x\$||$T9|$|t$P9t$x 9\$Dw 9L$@ΉߋL$(\$,L$H\$LL$H\$L9\$,r9L$(  |$4 |$0 |$D|$@T$@JD$0H$)$)D$x9~L$x\$L|$H|$hL$xt$( $㉄$$㉄$$D$h扄$$$1ҋ$$1t$X|$\D$XT$\D$h$D$XT$\t$0$|$<|$PD$8D$$d$$$$ቄ$$d$$D$@T$D$1ҋt$@|$D1t$`|$dD$`T$dD$Pd$0D$`T$dt$`|$dt$p|$tD$@1D$pT$tD$0D$@T$DD$8T$kv  )tωبut$0|$4l$($3$$11˹$$ ؉$ $$v%~=~u \$Dl$@ D$(T$,$D$HT$L D$0T$4L$(1ۉƉ׉1$߉¸L$01ډ$$D$(T$,1D$HT$L1L$D=9L$h1f٬$߼$٬$$$f9$1vټ$f$ f$٬$߼$٬$$$n~r Ƥl$0Ձl$4Ձ|l$8x1~:r Ƥ,L$@Ɓt$D|x 111TDŽ$!$T$xH$h@ D$h\$,L$(D$HT$LD$hD$`T$dD$pT$tD$H1ҋt$p|$t1t$(|$,D$(T$,D$hD$(T$,t$H|$L1t$H|$Lt$`|$dt$H|$LD$(T$,1D$HT$LD$xD$`T$d$㉄$$D$xቄ$$D$`1ҋ$$1׋$׋L$`\$d1$$1Ӊ¸D$`T$d$1D$`T$dt$(|$,t$(|$,D$p1D$(T$,L$(\$,;\$,rD$HT$LL$;D$( )tL$(uуD$(\$(l$(+L$(f;L$\yr ;l$XmBgD$@L$D111/L$X\$\$$$$3$DŽ$ ‰$$$ DŽ$$ _$DŽ$DŽ$D$HT$Lt$8|$<D$(1t1ɽ1L$4Ɖ׋D$HT$L1ۋd$01҉D$@T$Dt$@\$D1t$H|$Ld$0D$@T$DL$@\$D1ߋ  e1\D$(L$(t$X |$$D$`扄$$D$`牄$$D$x扄$$$1ҋ$$1\$ht$lD$hT$lD$xD$hT$lD$p牄$$D$P牄$$D$pD$@T$D$1ҋL$@\$D1ۉ$$$$D$P$$$$˹$$D$@1$$D$`D$@T$DD$`D$`T$dL$@1ۋD$x1҉D$0T$4L$0\$4L$@\$D1ۉL$@\$D\$`t$d\$@t$DD$xD$0T$4L$0\$41L$@\$DD$Pd$XD$8T$K\$8t$< t1\$Ht$LD$8D$<I݉l$(-l$x$NI$L\$(,L$8\$<ӉL$0\$4 19\$ŁT$0T$H l$L#D$HD$Ll$L?D$8D$<D$`D$d11w9m11 T$8ځ?T$o29Vw ;|$@Jt$8 t$@|$< L$@L$`l$dODŽ$($3$$,v3T$43D$0 `D$`T$d L$8 ;$w ;$$1ʋ$1 D$`;D$\w;T$X؉$$f11 l$dL$`L$p$$\$Xt$\t$@|$D$$ټ$f$ f$fD$xT$| -l$H $ -l$0$D$09$tHD$0ȉډD$@T$D+D$`T$dD$`T$d +L$8\$<1ҋt$d9t$DO)ӋD$` ȋT$d  T$PD$TΉ߉!!L$P\$T;\$Try;L$Po$3$$T$| D$x5 t$x|$|$/$!0-l$@D$`T$8-D$PT$Tv9r 9t$81L$81 9T$`XD$PT$Tt$8$/D$0D$4_T$PL$T>l$Tl$@D$PD$XKj#D$8T$  )tωبuyt$8|$<l$0$3$$11D$0T$4+t$8|$<ȉ+D$`T$d9\$d v%~=~u \$Ll$H D$0T$4$D$@T$D D$8T$vD$HŁl$L3vS|$H9|$`@vD$P T$T D$H(|$0 $ |$0 DŽ$($ x$,DŽ$ DŽ$$f1D$H0DŽ$($,DŽ$ DŽ$$' =0DŽ$ DŽ$$9L$`"D$HŁl$L1Iw|$`9|$@11w 9D$@$/߉Ӊ1߉Ӊ1߉9r w9v$vw 9D$`/߉Ӊ1߉Ӊ1߉9r w9vMfD$T5d7 D$P f9l$87t$@9t$`$D$`T$dL$8 9L$4Zr 9D$0R3L$43D$0 , l$d|$`|$p$$L$X\$\\$@t$D$$ټ$f$ f$ȉډD$@T$D+D$`T$dD$`T$d +L$8\$<1ҋt$d9t$Drw |$`9|$@r11҉Ή)׉كD$` T$d Ɖ D$P\$T;\$T;D$Pq vt1˹WfM%ʅ11fЃƋ k=wƉ=w݉Auvv>`޽ )t͉uуŅ$A+D$0-f9\$dw 9L$`t$8|$$!0-l$@D$XT$0-D$`T$df9(r 9t$01L$01 $9T$XD$`T$dt$0$/}D$0D$4_T$`L$dl$dl$HD$`$Kj#D$XT$\z D$PT$T$D$8T$x  )tωبut$X|$\l$P$3$$11;\$49r ;l$0-fB%fځ|x |1DŽ$Hxfl$XD$\1ݜ$݄$ l$PD$Tݜ$݄$߬$$ݜ$݄$L$X\$\$$\$X$$  |$\$D$X$$$L$H\$L\$Pt$T\$@t$DD$hD$lD$0D$4ټ$ f$  f$\$Xt$\ $$t$X$|$D9$yw D$@9k$3T$D$3D$@ 1٬$|$8٬$ L$f921@٬$߼$٬$ $$fDŽ$!$$HL$pX$@ D$hD$HT$LD$hD$xT$|D$@T$DD$H1ҋ\$@t$D1\$8t$<D$8T$r$9\$HT$L3$D$H3$ L$x\$|L$@\$D\$8t$<\$xt$|:L$@\$D+L$X\$\L$X\$\Ӊ ȉڹ1ۋt$\9t$Drw |$X9|$@r11ۉƉ)߉كD$X T$\ Ɖ D$`\$d;\$d;D$`wt$8|$<t$H|$Lt$@|$D+t$X|$\w 9D$@$/߉Ӊ1߉Ӊ1߉9r w9v$_vw 9D$8/߉Ӊ1߉Ӊ1߉9r w9vMVf٬$|$8٬$ T$8D$<D$<&fL$8\$<Ɖ+t$X|$\9T$\w 9D$XD$@T$D ٬$߼$٬$ $$ӃL$8\$<\$,K )t͉uՅ$Ff)L$@\$D+L$X\$\L$X\$\Ӊ ȉڹ1ۋt$\9t$Drw |$X9|$@r11ۉƉ)ߋD$X T$\  L$`\$d!!D$`T$d;T$d>f٬$߼$٬$ $$2fw 9t$XL$8\$AA AAF7 AA AAC @%LAA AAF/ AA AAC @ $ ~PAA AAF AA AAD Qw,2h@F  I [    : L  ! X n      / 5 i o y  RKqwx9?  !!!"####$$.%D%`%r%1&;&E&O&&&&&W'd'n't'((((Q)*E+>,,,,--12222"3(36(666:::;-=>=H=Y===>>@AAAADDF,F>FzGGGGKLLMRO^OrO~OoPPPPPQ QQ QTQUWUUU4V~W;YnY{YYYYYYZZ```XaaabcQcccffffggKgTgghhjZkl(l;lfllllTm^mp6pkppp qqrrOtttuu/vvvwweoƖ×͗DXgvƙՙ",ǟПm%4Q*6BV5­ȮBL˯ѯ28Q-3QWlV\Siѿ}  w:2\*0 =vWa !@W`flr:H](Nbq"<B`f1D4*6BN']j}~Rl '-MSYccq+1W   $ : j p            j,e 6<1U&Jx ? ] c """#1#;###&''''>(K(`()"),)6)--M./8/0202?2N2k233^77^9j9999k:q:;,=@@`B~CCCCC DDDEEEFFFF7HIHHH?IEIL*L_LLLLLLM,M2M=NTOZOOO&PP*Q0QNQTQQQQQUUUV6V,WWXEXKXsYoZuZZZZZ1[G[[[ D )  H `% n ~   .text\.data.bss.rdata$L4 ?_~.eh_frame_handle_UF_128.constprop.4_handle_UF_128_rem.constprop.5_get_BID128.constprop.3___bid128_div___bid128dd_div___bid128dq_div___bid128qd_div.eh_frame___bid_IDEC_glbflags___bid_IDEC_glbround___bid_round_const_table_128___bid_reciprocals10_128___bid_recip_scale___bid_power10_table_128___udivdi3___bid_power10_index_binexp_128___bid_estimate_decimal_digits___bid_factors___bid_convert_table___bid_packed_10000_zeros___bid_reciprocals10_64___bid_short_recip_scale bid64_mul.o/ 1350391525 0 0 100666 10982 ` L(.text$0&A 0`.data@0.bss0.rdata%@0@/4t%(@0@UWVS$$$$\$0``J\$D$\$ %D$8`T$ `%D$l$(T$,l$ l$~~||xxxxtX|$ `\$r*=~T$83T$01 ׉[^_]fl$, l$($$߬$}\$l$ $$߬$C\$t$ 0<މӉD$T$ D$ T$$D$(T$,D$1ҋt$(|$,1׉׋T$L$ 1ɉT$L$ L$ \$$L$\$ 1D$T$ ¸D$ T$$D$(1D$ T$$>11 9T$$w;ً 9T$ r 9L$vx|$(L$L$rl$@\$89\$0t ZT$H|$@|$@t|$@|$@DŽ$0l$@)l$(|$(L$$\$ 5t$X= $D$xT$|ቄ$$㉄$$D$x1ҋ$$1t$@|$DD$@T$D$D$@T$D5t$p=|$`l$ l$t$扄$$D$pD$T$$1ҋ|$l$1|$l$ D$T$ D$d$pD$T$ |$l$ |$hl$lD$1D$hT$lD$pD$T$D$`ቄ$$D$p㉄$$D$1ҋ$$1|$Pl$TD$PT$TD$`D$PT$TL$\$1ۉL$\$$$|$l$D$PT$T1D$T$D$d$X$$D$$$$D$X扄$$$1ҋ$$1Ӌ$Ӌ$$1$$ȉډ1׉ȉډ¸$$$1$$D$d$`D$T$$$L$\$D$xT$|1D$T$$$1D$T$D$@T$D1D$T$D$T$ 1D$T$D$@T$D¸$1D$hT$l9T$lrw9D$hv D$T$L$\$ӉL$@\$D9\$w 9L$D$T$$$ӉL$\$9r w9v@+@ t1D$hT$lD$T$ @ t1҉D$T$ D$hD$ T$lT$$ t1 t1ҋL$(#D$#T$ p\$D9$_wl$@9l$XOT$D3$D$X3D$@ 5$L$(DŽ$D$@[||p%x=xt$%x=xf%D$T$ #111҉l$D$(T$,xxZӁ #11ۉ%D$L$\$ v ||~~u Ή߁[^_]Ív@ 11 9T$ w&r9D$w3T$ 3D$ 3T$$ T$ %8=o-$fo uX 1|zv3T$ 3L$ t @fxxt t||1%1ǁxfDŽ$ t$( $t$|$ DŽ$l$HDDED$(L$ \$$9D$T$L$L$( t$p|$t|$t$㉄$$㉄$$D$扄$$$1ҋ$$1t$ |$$D$ T$$D$d$D$ T$$t$x|$|L$x|$|$Xl$,$扄$$扄$$D$T$$1ҋ|$l$1|$Pl$TD$PT$TD$XD$PT$T|$Pl$T|$hl$lD$1D$hT$lD$T$D$`T$dD$ቄ$$D$1ҋ$$1ӋD$Ӌt$|$1t$|$|$`l$d|$l$ȉډ1D$T$Ή߉t$`|$d$1D$`T$dD$Xd$D$T$D$Xd$D$XT$\D$$$D$T$ D$1ҋL$\$ 1Ӌ$d$Ӌt$|$1t$|$|$Xl$\|$l$ȉډ1D$T$ȉډ¸D$XT$\D$1D$XT$\$$1$$D$ T$$1$$$$1׋D$PT$T1׋D$ T$$¸$1D$hT$l9T$lr iL$\$ӉL$ \$$9\$gWt$X|$\9rD$T$\$(\$(D$@)\$D$T$L$ t1D$PT$TL$( t1҉D$T$ D$PD$ T$TT$\$HL$ t1t]$uR uLt$$9t$tw6r D$ 9D$pw*T$t3T$$D$p3D$ u"T$d9T$|rw L$`9L$xv D$T$f K\$$9\$t2rt$ 9t$p"T$t3T$$D$p3D$ |$d9|$|l$`9l$x~~u Ɖׁ%=~,1|xND$D$(D$,~r =Ƥ%|=xD$D$D$ 19L$9#t$|$(vL$ t1|$H?|$H.|$H[D$`T$dD$xT$|19T$dw r9D$`w11ۋD$ T$$ډD$ T$$D$pT$t9T$$@r 9D$ 41;\$$wr;L$ w11ҍvL$ t1׊L$( t1 t DŽ$$ $T$83T$0|$@\$#L$o ~|$ `D$% ‹D$@t$ Vvxڋ l$|$=rl$83l$0L$J~w*=Ƥf (1xIowvL$ L$=f1ɉ:r Ƥv1|$83|$0 0|$H9v9D$h\$$;gqt$ ;Q@K~8vKƉ~r =Ƥu Ɖ rv9D$  T$$9T$tnrL$ 9L$p^T$t3T$$D$p3D$ Q\$d9\$|8=t$`9t$x$*|$L$#D$5o SD$@@~Ƥ vD$83D$0 1ǁxT9J( pD$H)T$H!v T$D$@t$ C1ɉD$D$D$ 81D$D$(D$,S11|$83|$0|$$#:r|$ o*|$$~w|$ Ƥ ( x|$H |$H |$H ։AD$@$0$D$ T$$ҋL$ \$$ډŃl$ T$$l$(DŽ$|$$T$$#D$ 5o = `\$ l$$  މ D$ ƤD$$~T$HGt$HVT$(<,\$ t$$\$t$9fw9\t$|$  9rw59w111 t$;w|$;DŽ$ D$T$H 0N1~\D$ T$$͉MƉ~w r=ƤvΉ߉D$ T$$uΉ߉D$ T$$D$$  t$ (1ׁx|$H|$H|$H/t$|$ tL$IE ۉ\$8\$ ۍ KL$8ӉD$0L$8 t$ |$$|$@D$T$D$@D$(T$,D$0D$HT$LD$1ҋt$H|$L1t$|$ D$T$ D$0d$@D$T$ t$|$1t$(|$,D$T$ 1׋D$(T$,T$PD$T$D$PD$XT$\D$0D$@T$DD$1ҋL$@\$D1ӋD$0d$PӋD$T$1҉D$T$D$XT$\D$T$ȉډ1D$T$ȉډ¸D$0T$4D$@1D$0T$4T$L$ ѺT$@L$DL$H1L$@\$DL$\$L$@\$DD$D9rwT$@9vL$8 L$L$ t1҉D$T$D$upL$te@+L$ t1҉D$8T$ t1L$ t1҉ m؃0^1A ~Ƥ cowoǁwo tD$HHw +D$HD$HىL$@\$HۍCȋD$ T$$Ӊ D$T$T$D$8D$T$D$D$ T$$D$8D$8T$D$$9D$ 0wT$ 9T$ D$(T$,L$P9L$A_zR| X$AA AAFK AA AAC  AA AAD    fp>  I z    M S :zc y 9 ? b t Dflq$Zav|28=Z "  .text$A.data.bss.rdatat%D]r.eh_frame___bid64_mul.eh_frame___bid_estimate_decimal_digits___bid_power10_table_128___bid_IDEC_glbround___bid_reciprocals10_128___bid_recip_scale___bid_IDEC_glbflags___bid_round_const_tablebid128_mul.o/ 1350391525 0 0 100666 3680 ` LV .text8  0`.data@0.bss0/4  @0@UWVSD$pD$XǍ$L$`L$4$|$4D$xT$|t$h|$lDŽ$DŽ$DŽ$DŽ$_с||||txhx\L$p\$tL$H\$Lс``D$8Ӂ\$<Ձ LD$HD$LD$8D$<L$`\$dL$P\$T``t$@\$D wfD$PD$TD$@D$D r q˹l$< l$8u l$L l$Htl$D l$@u"l$T l$Pu1 ځĜ[^_]Ð|$ $|$t$Xt$4Ĝ[^_]r =\$< L$8 |$Lc7}\$D \$\\$@ \$\|$Tc7v11 vɉ݁D$HD$LD$8D$<vɉفD$PD$TD$@D$DWv1ɻ_WVD|$ t$Pt$0D$`T$dD$T$4$|$t$ fD^_WVS@|$ t$X\$0D$PT$TD$T$$|$t$ @[^_UWVS$$|$L$󥍼$|$x$󥋌$$$$t$@|$DDŽ$DŽ$DŽ$DŽ$_ځ||l$D||xx$$t$h|$lځ``|L$P߁|$TځT$` D$hD$lD$PD$T$$t$p|$tT$D``D|$@|$XT$DT$\T$D|$\ wD$pD$tD$XD$\l$`w T$`t$dt$`|$dt$`|$d|$T |$Pu T$l T$htt$\ t$Xu<|$t |$pu2@T$D1ځL$`H T$dP [^_]Í$|$$$|$t$L|$t$x$D$H$$D$HX$$HX [^_]Ðr &l$T T$P *|$lc7v|$\ l$X |$tc7RmD$`D$dvΉ|$`D$hD$lD$PD$Tt$@|$D|$\T$\D$pD$tD$XD$\D$`D$d_vWVSP\$`|$0t$dt$@D$tT$xD$T$4$|$|$t$0$؃P[^_ÍvUWVS\\$p|$0t$|l$@D$tT$xD$T$,$|$t$0|$$9؃\[^_]ÍvUWVS\|$|$\$0D$tT$xD$T$$t$@|$l$4$|$|$D$p$D$p\[^_]ÐzR| TPAA AAF AA AAB s AA AAA (tTPAA CPH AA0TAA ACPJA AAT AA AAFm AA AAA n AA AAB 0,]AA AC`SA AA8`haAA AACpUAA AA8oAA AACpcAA AA=|5  x0d P , ; I Yd i .text7 .data.bssy   .eh_frame___bid64qq_mul___bid64qd_mul___bid64dq_mul___bid128_mul___bid128qd_mul___bid128dq_mul___bid128dd_mul.eh_frame___bid64qqq_fma___bid64_to_bid128___bid128_fmabid64_compare.o/1350391525 0 0 100666 25282 ` L^!.text,PZT 0`.data@0.bss0.rdataQ@`@/4xQH]@0@UWVS|$0T$4\$8L$<%|=|%|=|1ȉ1 ցxx%x=x%`=`|$Ձl$ 1%`=`%D$\$%$D$D$|$JvD$[^_]Ívxxf1[^_]f~~t~~u؃ 1[^_]Ív[^_]Ív%|$ D$ =#xw ojl$ D$|$t|$WD$)$ D$|$-1%;t$~ T$ \$$D$ |$$t$T$|$)L$$ۉȉډD$$#r =oO1l$$v9ÉȉډʼnF#oŕoa뿍v%D$%\$ $=#rwov D$fD$f1fl$$l$3l$$3D$  $D$UWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`́l$(ρ|$1ׁ``tՁl$11u/ \$v~~t~~t 14[^_]f 14[^_]Ív%D$(ρ |$#r2o&15vl$ ŀ|$ tBu4[^_]ÍvD$ D$ t1|$ XfJu1xl$9l$9l$9l$sD$()+T$(p9|$(<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$D$T$D$D$T$t$ |$$1t$|$D$T$1׉ D$T$¸t$(1|$1׉1 +9T$r91%x=xfՁ l$#rwov l1dr 9v9|$(v1`f9|$(D <T$ D$D$T$D$ d$D$T$ D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$1҉D$T$D$T$ D$T$1D$T$T$ T$uH¸|$(1|$1׉1 9T$wr 9vx1ۉo1h^fUWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x1%`=`́l$ρ|$1ׁ`Ձ`pׁ|$1u \$h4[^_]Ív~~t~~t 14[^_]f 14[^_]Ív%D$ρ |$#ro1v|$ ǀ|$ tJT4[^_]ÍvD$ D$ tø|$ (vu1x|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 9T$wr9v{1ׁ |$#r9wov/p%x=x~1v1D1끐9l$6|$9|$rl9df7<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 q9T$rw 9s{1ۉrh1avUWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x7%x=x=%`=`́l$ρ|$1ׁ`Ձ`|ׁ|$11u. \$Xf~~t~~t4[^_]Ív 4[^_]Ë|$ ǀ|$ th14[^_]f%D$ρ |$#ro1 vx%x=xZf4[^_]ÍvD$ D$ W1|$ +fu1x|$9|$rv9n|$9|$r9s 9l$zD$)+T$`9l$`<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 59T$rw[9sW1fׁ |$#rwov d1\'1륐9l$Z|$9|$r9f_<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$wr 9v1ۉ1vUWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`́l$ρ|$1ׁ`Ձ`tׁ|$11u/ \$v~~t~~t 14[^_]f 14[^_]Ív%D$ρ |$#ro15v|$ ǀ|$ tBu4[^_]ÐD$ D$ t1|$ XfLfu1x|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 %9T$wr9v{1f%x=xfׁ |$#rwov l1d/1끐9l$6|$9|$rl9dff<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$rw 9sy1ۉpf1_UWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x=%`=`́l$ρ|$1ׁ`Ձ`|ׁ|$1u, \$~~t~~t 14[^_]f 14[^_]Ívx%x=xu΅xf4[^_]Ív%D$ρ |$#ro1 v|$ ǀ|$ tFu4[^_]ÐD$ D$ tǸ|$ -v fu1x|$9|$rv9n|$9|$r9s 9l$zD$)+T$`9l$b<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 19T$wr[9vW1fׁ |$#rwov d1\'1륐9l$Z|$9|$r9f^<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$rw 9s1ۉ1UWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x1%`=`́l$ρ|$1ׁ`Ձ`lׁ|$11u \$vd14[^_]f~~t~~t4[^_]Ív 4[^_]É%D$ρ |$#r o1v|$ ǀ|$ tFT4[^_]ÐD$ D$ t1|$ (ffu1x|$9|$r9|$9|$r9s 9l$D$)+T$x9l$z<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 9T$wrs9vo1fׁ |$#r-wov#t%x=x11T1덐9l$B|$9|$rx9pfB<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$rw 9s1ۉ|r1kUWVS|$0T$4\$8L$<%|=|%|=|1ȉ1  ցxx%x=x%`=`|$%D$ D$%`=`%D$\$́D$|$D$|$?fT$ƒ[^_]fxxf[^_]Ív~~t~~uԃ [^_]1[^_]f%|$ D$ =#pw obD$D$ D$|$t|$WD$% D$D$D$|$|$%1;t$~T$ \$l$ |$Չt$T$|$)L$ȉډD$Ձ#r =oO1L$9ȉӉF#urρog%D$́\$ #rwov D$fD$fD$f L$D$3D$3l$  D$vUWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`́l$ρ|$1ׁ`Ձ`ׁ|$1u/ \$~~t~~t4[^_]Ív 4[^_]É%D$ρ |$#r*o11v|$ ǀ|$ tFu4[^_]ÐD$ D$ tǸ|$ TvGfu1x|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 9T$w91f%x=xtJ1vׁ |$#rwov `1X11rf9l$|$9|$rT9LfI<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$rw 9si1ۉ`V1OUWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`́l$ρ|$1ׁ`Ձ`ׁ|$1u/ \$~~t~~t4[^_]Ív 4[^_]É%D$ρ |$#r*o11v|$ ǀ|$ tFu4[^_]ÍvD$ D$ tǸ|$ TvEu1x|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 9T$w91%x=xtI1vׁ |$#rwov `1X1f1rf9l$|$9|$rT9LfK<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$rw 9sk1ۉbX1QvD$T$||tс||tf%~=~t~~t1Ív 1fD$T$||tс||t1Ð%~=~t~~tà ÍvUWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`śl$ρ|$1ׁ`Ձ`ׁ|$1t]1u \$(f 14[^_]Ív|$ ǀ|$ tfu4[^_]Ív14[^_]fD$ D$ t1|$ uf뜍vxȉ%x=xt뀍vuԉ1x|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 9T$r913fׁ |$#rQwovG%D$ρ |$#r wow1qv1_1ff9l$|$9|$rH9@fw<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$wr 9v_1ۉV1OEvUWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`́l$ρ|$1ׁ`Ձ`ׁ|$1tUu \$)v 14[^_]Ív|$ ǀ|$ tntX4[^_]ÍvD$ D$ tǸ|$ uv뤍vy%x=x1f4[^_]Ívuĉ1x|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉  D$T$ ¸t$(1|$1׉1 u9T$w91)ׁ |$#rQwovG%D$ρ |$#r w*ow"1ev11fC1Vf9l$|$9|$r890f_<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$rw 9sO1ۉF<15vUWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`śl$ρ|$1ׁ`Ձ`ׁ|$1t]1u \$(f 4[^_]Ë|$ ǀ|$ tfu4[^_]Ív14[^_]fD$ D$ t1|$ uf럍vxȉ%x=xt냍vuԉ1x|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 9T$r916fׁ |$#rQwovG%D$ρ |$#r wow1qv1_1ff9l$|$9|$rH9@fz<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$wr 9v_1ۉV1OEvUWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`ḱl$ρ|$1ׁ`Ձ`ׁ|$1tu1u \$(f 14[^_]Ív|$ ǀ|$ t^t$14[^_]fy%x=xf4[^_]ÐD$ D$ t1|$ uf놐u1x‹|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 9T$w91;fׁ |$#rQwovG%D$ρ |$#r w&ow1yv1f[1Zf9l$ |$9|$r<94fq<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$rw 9sQ1ۉH>17UWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`{́l$ρ|$1ׁ`Ձ`ׁ|$1tUu \$}v 14[^_]Ívx%x=xu>x:f4[^_]ÍvD$ D$ t|$ uv릐1롋|$ ǀ|$ tu4[^_]Ðuȉ1x|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 y9T$w91/fׁ |$#rQwovG%D$ρ |$#r wow1iv1W1ff9l$|$9|$rH9@fq<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$rw 9s]1ۉTJ1CUWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`ḱl$ρ|$1ׁ`Ձ`ׁ|$1tu1u \$(f 4[^_]Ë|$ ǀ|$ t^t$14[^_]fy%x=xf4[^_]ÐD$ D$ t1|$ uf뉐u1x‹|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 9T$w91>fׁ |$#rQwovG%D$ρ |$#r w&ow1yv1f[1Zf9l$ |$9|$r<94ft<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$rw 9sQ1ۉH>17UWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`{́l$ρ|$1ׁ`Ձ`ׁ|$1tUu \$}v 4[^_]Åx%x=xu>x:f4[^_]ÍvD$ D$ t|$ uv멐1뤋|$ ǀ|$ tu4[^_]Ðuȉ1x|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉ D$T$ ¸t$(1|$1׉1 y9T$w912fׁ |$#rQwovG%D$ρ |$#r wow1iv1W1ff9l$|$9|$rH9@ft<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$rw 9s]1ۉTJ1CUWVS4t$HL$L\$PT$T%|=|%|=|1׉1 %x=x%x=x%`=`́l$ρ|$1ׁ`Ձ`ׁ|$1tUu \$)v 4[^_]Ë|$ ǀ|$ tntX4[^_]ÍvD$ D$ tǸ|$ uv맍vy%x=x1f4[^_]Ívuĉ1x|$9|$r9|$9|$r9s 9l$D$)+T$9l$<D$D$D$ T$$D$d$D$T$D$(T$,D$ 1ҋ|$(l$,1|$l$ D$T$ D$D$T$ t$ |$$1t$|$D$T$ 1׉  D$T$ ¸t$(1|$1׉1 u9T$w91,ׁ |$#rQwovG%D$ρ |$#r w*ow"1ev11fC1Vf9l$|$9|$r890fb<T$ D$D$T$ D$ d$D$T$D$(T$,D$1ҋ|$(l$,1ՋD$ ՋD$T$ 1҉D$ T$$D$T$D$ T$$1D$ T$$T$$ T$ uH¸|$(1|$1׉1 9T$rw 9sO1ۉF<15 d'@Bʚ; TvHrN @zZƤ~zR| DAA AAC0 AA AAD Y AA AAC h AA AAD H AA AAD lHAA AACH AA AAC L AA AAD d AA AAD AA AACH AA AAD a AA AAC L AA AAD h AA AAD  AA AACH AA AAD O AA AAA a AA AAC d AA AAD l<AA AACH AA AAC L AA AAD f AA AAB AA AACH AA AAC L AA AAD ` AA AAD f AA AAB tAA AACH AA AAC d AA AAD O AA AAA j AA AAB 9AA AAC0 AA AAC \ AA AAD k AA AAA E AA AAC lX"AA AACH  AA AAD O AA AAA f AA AAB l'AA AACH  AA AAD O AA AAA d AA AAD +Z$,Yh,iAA AACH AA AAD ` AA AAD E AA AAC h0AA AACH AA AAD ` AA AAD P AA AAD ht5iAA AACH AA AAA ` AA AAD E AA AAC h`9oAA AACH AA AAD ] AA AAC b AA AAB hP>sAA AACH AA AAD ` AA AAD N AA AAB h8BoAA AACH AA AAA ] AA AAC b AA AAB h4GsAA AACH AA AAA ` AA AAD N AA AAB hKAA AACH AA AAA ` AA AAD P AA AAD > Z _f ! (    ELN Y` $ '.^ n# }$$&"&&( 5)<)**, n, b- M.T.//1 22}44V6 A7H788: ;;[=b=6? %@,@AAC DD?FFFH  IIJJL MM9O@O   d< #D :G d  8  p  T"  ' + 4 , M|, h0 p5 9 L> B 0G %K .text)PT.data.bss.rdataAxK`.eh_frame___bid64_quiet_equal___bid64_quiet_greater_mult_factor___bid64_quiet_greater_equal___bid64_quiet_greater_unordered___bid64_quiet_less___bid64_quiet_less_equal___bid64_quiet_less_unordered___bid64_quiet_not_equal___bid64_quiet_not_greater___bid64_quiet_not_less___bid64_quiet_ordered___bid64_quiet_unordered___bid64_signaling_greater___bid64_signaling_greater_equal___bid64_signaling_greater_unordered___bid64_signaling_less___bid64_signaling_less_equal___bid64_signaling_less_unordered___bid64_signaling_not_greater___bid64_signaling_not_less.eh_frame___bid_IDEC_glbflags/102 1350391525 0 0 100666 87758 ` LR .text>H 0`.data@0.bss0/4 ?@Q@0@UWVS$$󥍼$$󥋄$D$$$T$$$L$($$\$H$%|=|%|=|1D$(3D$ %x=x %x=xׁ|$ D$HD$hρ|$, w= 5u|$, |$HD$( DŽaĬ[^_]Ð~~t~~t1Ĭ[^_]Ív 1Ĭ[^_]É1׋D$3D$H %x=x%x=xu1럐r|$|$ D$5 %`=`D$,5 |$H Mρ``DŽ\$ \$t 1\$, \$HuR1vD$ D$8\$8t|$8f|$, |$H|$8v1??9|$(|$8l$@l$Hl$0\$,\$H|$|$(t$ l$l$hT$ T$,)!K \$D$@D$T$D$@D$PT$TD$8D$ T$$D$1ҋt$ |$$1׋D$8׋D$T$1҉D$T$D$PT$TD$T$1D$T$\$PL$lD$@D$pT$tD$@D$@T$DD$8D$xT$|D$p1ҋL$x\$|1ۉL$`\$dD$`T$dD$8d$lD$`T$dD$pT$t1D$@T$DL$`\$d1ډ˹L$8\$1<9t=9w;|$g1e9l$pv1;D$u1;|$u1UWVS$$󥍼$$󥋬$$$ $$$\$$$\$$%|=|%|=|1D$1 %x=x %x=xts%D$= ځT$ w|$f 1u=D$ D$uT$ „u;Ĭ[^_]Ð 1Ĭ[^_]É1ʋD$3$ 31Ĭ[^_]Ívr <$IT$ $5 %`=`vy%x=x_qT$ T$(T$ T$(ځ``„D$ $tu4T$ T$uR1v D$(D$(t1|$(ffT$ T$|$(v1?T$(?;T$(D$ 9D$\r D$9$MD$3D$ D$0$3D$ D$0 D$ 9D$r wD$9$s 9T$()D$()Ѕ!9HT$X D$@D$0T$4D$@D$8T$D$ D$uT$ „u:Ĭ[^_]Ð 1Ĭ[^_]É1ʋD$3$ /Ĭ[^_]Ðr <$ET$ $5 %`=`vx%x=xN1Ĭ[^_]ÐT$ T$(T$ T$(>ځ``„D$ $tu8T$ T$uV1v D$(D$(t|$(vfT$ T$|$(v1?T$(?;T$(D$ 9D$lr D$9$]D$3D$ D$0$3D$ D$0 D$ 9D$r wD$9$s 9T$(9D$()Ѕ!9$HT$X D$@D$0T$4D$@D$8T$pCvCv9T$(&D$ 9D$, D$@$$D$(T$,D$@d$D$8T$<$$T$T$(T$HD$L$T$1҉D$0T$4D$HT$LD$0T$4D$D$0T$4D$(T$,1҉D$(T$,D$8T$<D$(T$,D$0T$41D$(T$,D$@D$T$D$@D$@T$DD$HT$LT$T$PD$TD$HT$L1҉D$8T$Ĭ[^_]Ð Ĭ[^_]Ð1ʋD$3$ +Ĭ[^_]Ðr <$AT$ $5 %`=`vx%x=xN1Ĭ[^_]ÐT$ T$(T$ T$(>ځ``„D$ $tu8T$ T$uV1v D$(D$(t|$(vfT$ T$|$(v1?T$(?;T$(D$ 9D$lr D$9$]D$3D$ D$0$3D$ D$0 D$ 9D$r wD$9$s 9T$(9D$()Ѕ!9$HT$X D$@D$0T$4D$@D$8T$ AA AAD d AA AAD O AA AAA WAA AAFn AA AAD O AA AAA _ AA AAA  AA AAA @.MAA AAFe AA AAA O AA AAA R AA AAB \ AA AAD l@AA AAF@ AA AAB d AA AAD O AA AAA tS2AA AAFD AA AAB d AA AAD O AA AAA ^ AA AAB f&AA AAF@ AA AAB g AA AAA R AA AAB \ AA AAD l| zAA AAF[ AA AAC g AA AAA R AA AAB l̂6AA AAFD AA AAB g AA AAA R AA AAB l\[AA AAFq AA AAA R AA AAB  AA AAA D`AA C0I  AAD _  AAC L AADAA C0F  AAC b  AAD O AAl\tAA AAF> AA AAD O AA AAA [ AA AAA lh!AA AAFQ AA AAA O AA AAA w AA AAA l<AA AAFP AA AAB O AA AAA \ AA AAD lAA AAF@ AA AAB O AA AAA \ AA AAD  AA AAFD AA AAB O AA AAA ^ AA AAB ^ AA AAB lAA AAF@ AA AAB R AA AAB \ AA AAD AA AAFD AA AAB R AA AAB ^ AA AAB ^ AA AAB l,%AA AAFT AA AAB O AA AAA w AA AAA JPJ 0 :   :A f%/2$9$&&'''+.+/q1{1)232z66&90999o=v= BCCDDHIKK|LLPP.U$W.WWW0\7\^___dd^hLjVjk kXo_o r*rrr(w/w{N}T}}}J4>PW"Ўڎ '5?QXGN֨^ª^h|4>x0:R\\fR\~Xblv    dn!"$$|%%))-//t0~04477J8T8;; x``@  $ < Z<. |@ S f z Ȃ  \ 2 Lp hd       +, .text>.data.bssH Rgw.eh_frame___bid128_quiet_equal___bid128_quiet_greater___bid128_quiet_greater_equal___bid128_quiet_greater_unordered___bid128_quiet_less___bid128_quiet_less_equal___bid128_quiet_less_unordered___bid128_quiet_not_equal___bid128_quiet_not_greater___bid128_quiet_not_less___bid128_quiet_ordered___bid128_quiet_unordered___bid128_signaling_greater___bid128_signaling_greater_equal___bid128_signaling_greater_unordered___bid128_signaling_less___bid128_signaling_less_equal___bid128_signaling_less_unordered___bid128_signaling_not_greater___bid128_signaling_not_less.eh_frame___bid_IDEC_glbflags___bid_ten2k128___bid_ten2k64bid128.o/ 1350391525 0 0 100666 30114 ` Llm=.text 0`.datal@`.bss0ףp= ףp= ףp= ףp= ףp= ףp= ףOnʡEx&1Zd;OnH}8gDioTN@a+eX8H9i$ DnC{e;E.D?ˈPo ̼*T;oe(KB.|3tmS\ 5$j0 `6S8ʐW K7٬:|pMH#'lqyh.L[Mľ"Z mO7}‡ I62w;W pdD2ϟCb.2:]ϏFSR&2l1+a}J9?aM*Svd弔z7^L~F^{tP (ġq:p8c$S, .PCCo<u'm Sr4 :6B5yrjR;uDG;~"݃:QӮP,69he0n<*J6ڝXv%ƅsW+ QI}4Ud^wH~t\޹̥΁vSnʋ |2ǣ g_0CXn >;5q9 ,My%1^_Bx4.GpCK,΁(8Y([ Jg9ES OGpL|oꊭaнK'uo? ypw> ;ZJbڗD+{b;=;K##⼺;1az'0mx5c_f/Flk7._[a쌊`6Y78U@gID#N;?_+B`w[z!IMA2*FjP|};+*\8qkgTM" ŗ{`=Ui Y-|9'Fu=p b!q&{qtqȦn𸪯qޝh'c*[|-3S:&c:R] X`UY~S|I"|c$\_>..Jyݭ'vc=C8:`eAYJ@Dmf>|Vsx>}81n3нrRޖ_xۏd1 aHC%)@F{?y 6;9%_Ua(Vk%My711eU%[b-kS.#Q-:p4.QUM4: d?]1 @*$bGט#?9'pJ';GLŸG꺔R̆eN0ƒ *dj[wqۢ!P?/"=~Fr6-K'rfAOXd˞kxX uQipelE1D"'y]߯Y 'yQZ-7yHa~s>w! 8Z~HW_S#Yh-0]c%2R l ($Wo|KE 68(Jl༿6{Y Ho^+Ʊ;HwFz7e$]z/0 ’s????????? @@ @@  @  @  @@ @ !$'+.158;?  #&*-047:> "&),036:= !%(+/259أp= ףp= ףp= ףp= ףp= ףp= ףOnʡEx&1Zd;OnH}8gDioTN@a+eX=f2}ƅ!YnSr3܀#GGŧMd7iXI?il7%d{0ùҌLiv2=BzՔQ/mhp|iau=M==|6+ aw̫&$])ɺ^d00 h16A_p <.Bظ*/MZDs@4>8H9i$ EnC{e;E.D?ˈPo ̼*T;oe(KB.|3tmS\ 5$k0 `6S8ʐW K7٬:|pMH#'lqyh.L[Mľ#Z mO7}‡ I62w;W pdD2ϟCb.2:]ϏFSR&2l1+a}J:?aM*Svd引z7^L~F^{tP!(ġq:p8c$S, .PCCo<u'm Sr4 :6B5yrjR;uD៤G;~"݃:QӮP,69he0n<*J6ڝXv%ƆsW+ QI}4Ud^wH~t \޹̥΁vSnʋ |2ǣ g_0CXn >;5q9 ,My%1^_Bx4.GpCK,΁)8Y([ Jg9ET OGpL|oꊭaнK'vo? ypw> ;ZJbڗD+{b;=;K##⼺;1az'0mx5c_f/Flk7._[a쌊`6Y78U@gID#N;?_+B`w[z"IMA2*FjP|};+*\8qkgTM" ŗ{`=Ui Y-|9'Fu=p b!q&{qtqȦn𸪯qޝh(c*[|-3S:&c:R] X`UY~S|I"|c$\_>..Jyݭ'vc>C8:`eAYJ@Dmf>|Vsx>}81n3нrRޖ_xۏe1 aHC%)@F{?y 6;9%_Ua(Vk%My711eU%\b-kS.#Q-:p4.QUM4: d@]1 @*$bGט#?9'pJ';GLŸG꺔R̆fN0ƒ *dj[wqۢ!P?/"=~Fr6-L'rfAOXd˞kyX uQipelE1D"'y]߯Y 'yQZ-7yHa~s>w! 8Z~HW_S#Yh-0]c%2R l (%Wo|KE 68(Jl༿6{Y Ho^+Ʊ;HwFz7e$]z/0 ’s= ףp= ףp= ףp= ףp= ףʡEx&1Zd;OnDioTN@a+eX!YnSr3܀#GGŧiXI?il7ùҌLiv2=BzՔ|iau=M==|6+ aw̫ɺ^d00 h16A_p*/MZDs۰>8H9i$ 믍{e;E.D?ˈPo ̼;oe(KB.3tmS\ 5$S8ʐW K7٬:|'lqyh.L[Mľ7}‡ I62wpdD2ϟCb.2:]SR&2l1+a}J*Svd^L~F^{tPp8c$S,PCCo<u'm :6B5yrjR;uDG;~"݃:QӮ9he0n<*J6ڝXv% QI}4Ud^wH~t΁vSnʋ g_0CXn >;5 ,My%1^_BGpCK,΁([ Jg9EpL|oꊭaнK'ypw> ;ZJbڗ<\R狽edDKN^wÿ- Ғsi$$DnT.wAP~uu\T^I,!J5U"S6n; ^wl}9+{b;=;K##⼺;1ax5c_f/Flk7._ߓ`6Y78U@g?_+B`w[zA2*FjP|};+*\gTM" ŗ{`=Ui Fu=p b!q&tqȦn𸪯qޝh3S:&c:R] X`UY~S|\_>..Jyݭ'vc`eAYJ@Dmf>|Vs1n3нrRޖ_xۏHC%)@F{?;9% "&),036:> ףp= ףp= ףp= ףp= ףˡEx&1Zd;OnEioTN@a+eX!YnSr3܀#GGŧjXI?il7ùҌLiv2=BzՔ}iau=M==|6+ aw̫ʺ^d00 h16A_p*/MZDs۱>8H9i$ 믎{e;E.D?ˈPo ̼;oe(KB.3tmS\ 5$T8ʐW K7٬:|'lqyh.L[Mľ8}‡ I62wpdD2ϟCb.2:]SR&2l1+a}J+Svd^L~F^{tPp8c$S,QCCo<u'm :6B5yrjR;uDH;~"݃:QӮ:he0n<*J6ڝXv% QI}4Ud^wH~t΁vSnʋ g_0CXn >;5 ,My%1^_BGpCK,΁([ Jg9EpL|oꊭaнK'zpw> ;ZJbڗ<]R狽edDKN^wÿ- Ғsi$$DnT.wAP~uu\T^I,!J5U"S7n; ^wl}9,{b;=;K##⼺;1ay5c_f/Flk7._ߔ`6Y78U@g?_+B`w[zB2*FjP|};+*\hTM" ŗ{`=Ui Fu=p b!q&uqȦn𸪯qޝh4S:&c:R] X`UY~S|]_>..Jyݭ'vcaeAYJ@Dmf>|Vs1n3нrRޖ_xۏHC%)@F{?;9%;5ʍMy%1^_BpCK,΁Jg9EώꊭaнK'> ;ZJbڗ|6+ aw̫10 h16A_pMZDsI9i$ E.D?ˈPo ̼oe(KB.ᕌS\ 5$ K7٬:|yh.L[MľÇ I62wПCb.2:]2l1+a}Jd^{tP9c$S,<u'mC5yrjR;uD"݃:QӮ*J6ڝXv%~4Ud^wH~tSnʋ 1CXn >;5ʎMy%1^_BpCK,΁Jg9EϏꊭaнK'? ;ZJbڗ;5q9 ,My%1^_Bx4.GpCK,΁(8Y([ Jg9ES OGpL|oꊭaнK'uo? ypw> ;ZJbڗ< Sr4 :6B5yrjR;uD៤G;~"݃:QӮP,69he0n<*J6ڝXv%ƆsW+ QI}4Ud^wH~t \޹̥΁vSnʋ |2ǣ g_0CXn >;5q9 ,My%1^_Bx4.GpCK,΁)8Y([ Jg9ET OGpL|oꊭaнK'vo? ypw> ;ZJbڗ<@@ @?!$'+.158;? !YnSr3܀#GGŧiXI?il7ùҌLiv2=BzՔ|iau=M==|6+ aw̫ɺ^d00 h16A_p*/MZDs۰>8H9i$ 믍{e;E.D?ˈPo ̼;oe(KB.3tmS\ 5$S8ʐW K7٬:|'lqyh.L[Mľ7}‡ I62wpdD2ϟCb.2:]SR&2l1+a}J*Svd^L~F^{tPp8c$S,PCCo<u'm!YnSr3܀#GGŧjXI?il7ùҌLiv2=BzՔ}iau=M==|6+ aw̫ʺ^d00 h16A_p*/MZDs۱>8H9i$ 믎{e;E.D?ˈPo ̼;oe(KB.3tmS\ 5$T8ʐW K7٬:|'lqyh.L[Mľ8}‡ I62wpdD2ϟCb.2:]SR&2l1+a}J+Svd^L~F^{tPp8c$S,QCCo<u'm ? ̣p= ףp= ףp= ף&1Zd;OnN@a+eX̤p= ףp= ףp= ף&1Zd;OnN@a+eXљ(\(\(\V-K7ADJY8m4 7k)lpimkA!FL^y55Jp?sa*L%>Ze)M\"\ou{6uNEi㽿*+ O2"[3/#|iʄЄK8g0!6WB 7 -RMC6+=_$jb Vx/e9!~oB-.琘̿AW$ xzJiXm;=).=F$B9/6h%XĢ1T,˽. @r<Om݉d%f[0M$NQ3&H`oNT=ʀMv']1M3xm4'"[b2|a?[ώfM2@Sj`Ih ?(3!: =ˬs R`i;.eNQG3ubk,{X>t҉)NV/%;!](\K7AZ8m4k)kA!^y55ta**M\"v{6++#[3/#ЄK87WB 7 -,=_$y/e9 @@ @@  ???? !$'+.158;?BEILOSVY\`cf(\(\(\V-K7ADJY8m4 7k)mpimkA!GL^y55Jp?sa*M%>Ze)M\"\ou{6vNEi㽿*+ O2"[3/#|iʄЄK8g0!6WB 7 -RMC6+=_$kb Vx/e9"~oB-.萘̿AW$ xzJiXm;>).=F$B9/6h%YĢ1T,˽. @r<Om݉d%f[0N$NQ3&I`oNT=ʀMv']1N3xm4'"[b2|a?[ώfM2ASj`Ih ?(4!: =ˬs S`i;.eNQG3vbk,{X>t҉)NV/%;!Ve_ĬCPa\)cʕC|oq%٣Z0Ppbz fζ!c[r$Rs{" hM7svԗH[=um#/6\Pِe,BbE"&'Oz˽iV|9@ʔia"b58J:>Ͻ#~W120Mnjd8n헧?O 6%zE9NF'dtZ<Xwi~ Q_vwvd!G^[!u/2SLjM;O2#>>W%@V$gmsmrKaakʻ FԅJ4}4f1FUJ: []]F$%u,8etK1js&8莾1*P=wx+5quwy)e諴don{Ic-^kŭ56@J-JHE ҷR<П<.;a%>^O rmC@tFМ, &K" 7~ſt[Am- [8DM1d7 菇+MraBK{Η6F@" zĆZL;K d'@Bʚ; TvHrN @zZƤ~o#]xEcd #NJt:@P.[(l2J!" OP=J4 YvË eJ0\zpu@^?高 fv&7_vSm' 'EE?y2b]_~nDŨ/GT;2Sz/PUONcDPsǦI'Ucȋ ʃD+S69u@ %ŰC#BN%c>p{D^%urHe bu#NtS2ݏҘbILtGEy;<AnʸҺ2UZڊ̈S P7=LU_[$lWCn@/b֡I(x_RʡZ7иQo-(81^tA3g[1e9q9=PP{q\Ck 7 n0b/5@,BoRT-PX8K!ƔWE|u30QGk~bC36"m'VmYI*J#] PG+ڦGAqfc >̌bs2a8@s8-ف334$9~J< Am%CMZ>drDv9oP Yd @{c vf i% "ridn[)t@O0/'P 6 v:#hNO@H`?w­w`F"2V߄c0 ϥي=K`Pzl#j =bC-T%2P @KLe*t; RjtP9' =y-@cR7y.Y[DcE    ddd''''@B@B@B ʚ; ʚ; ʚ; T T T T vH vH vH    rN rN rN rN @zZ@zZ@zZƤ~Ƥ~Ƥ~o#o#o#o#]xEc]xEc]xEcd d d #NJ#NJ#NJ#NJc-^kc-^kc-^k6ŭ56ŭ56ŭ5@@@@-J-J-JEJHEJHEJHEJHҷR ҷR ҷR <.;<П<.;<П<.;<П^O a%>^O a%>^O a%>^O a%>CrmCrmCrmМ, @tFМ, @tFМ, @tF" 7~&K" 7~&K" 7~&K [Am-ſt [Am-ſt [Am-ſt [Am-ſt !DM1 [8!!DM1 [8!DM1 [8!" d7"" d7" d7".text.datal.bss` ) 8 I`Vl{!`"'*@+, -/ 00+`1:1F`2^2pP333?@@@A@AB$D7DK@EaExG`IIIIJ@J`LL(N; OPOaQqVXX[\ ^^___bid_ten2mxtrunc256___bid_mask256___bid_half256___bid_Ex256m256___bid_Kx256___bid_ten2mxtrunc192___bid_mask192___bid_half192___bid_Ex192m192___bid_Kx192___bid_ten2mxtrunc128___bid_mask128___bid_half128___bid_Ex128m128___bid_Kx128___bid_ten2mxtrunc64___bid_mask64___bid_half64___bid_Ex64m64___bid_Kx64___bid_shift_ten2m3k128___bid_ten2m3k128___bid_shift_ten2m3k64___bid_ten2m3k64___bid_char_table3___bid_char_table2___bid_onehalf256M___bid_maskhigh256M___bid_shiftright256M___bid_ten2mk256truncM___bid_ten2mk256M___bid_onehalf192M___bid_maskhigh192M___bid_shiftright192M___bid_ten2mk192truncM___bid_ten2mk192M___bid_onehalf128M___bid_maskhigh128M___bid_shiftright128M___bid_ten2mk128truncM___bid_ten2mk128M___bid_ten2mk128trunc___bid_ten2mk64___bid_onehalf128___bid_maskhigh128___bid_shiftright128___bid_ten2mk128___bid_ten2k256___bid_ten2k128___bid_ten2k64___bid_midpoint256___bid_midpoint192___bid_midpoint128___bid_midpoint64___bid_nr_digits/120 1350391525 0 0 100666 4052 ` Lz .text X  0`.data@0.bss0/4 f @0@WVSL$΁ˁ``tFˁu)%x=xt}11ҍ)  ʃ[^_Ív1f%x=xt % =v11봍v%=?Bwb%|=xuˁ~~u فʚ;$T$ځ$ T$[^_ÍvUWVS\D$pL$tˁ\$Hʁ``wƉρ )\$ ЁWw5?Bw-щI/ȁ (T$Hx|$ |$ |$ L$Hwt$P|$Tl$P\$D$% Y\$9<w94v\$ D$Hz݋\$Ӊ\$0؃4CD$L0ډT$D$0DDED$ӉƋT$D$(T$,׉D$T$D$@T$DD$8T$ L[j *  ")8?V m  3 : J X d  l   .text .data.bss2<Qf.eh_frame___bid32_to_bid64___bid64_to_bid32.eh_frame___bid_IDEC_glbflags___bid_IDEC_glbround___bid_estimate_decimal_digits___bid_power10_index_binexp___bid_round_const_table___bid_reciprocals10_64___bid_short_recip_scale___bid_power10_table_128/138 1350391525 0 0 100666 8661 ` L.textlU 0`.data@0.bss0.rdata@0@/4@0@UWVS,t$@L$Dˁ%`=`tWρu:%x=x11ҍVF ىN ,[^_]É1f%x=xt % =v11맍v%=?B%|=xuρ~~u D$$%D$T$%D$T$1҉D$T$ %D$T$ D$T$ ¸L$1ډVL$\$1ۋD$$Ӊ˹D$T$ 1ӋD$1ӁN ߉~ ,[^_]Ív UWVS$$󥋄$$$$T$L$ށt$8ځx_vix=|$-=5ف?9I D$%D$11%|=x` 1Ɖ߁-  $(,9v7%?-6=_ D$8[^_]Ív 11  ?؋T$ L$ t u |$ $$߬$]ٜ$ل$l$D$/\$D$\$L$L$ ,ED$0ȉ+ T$L$l$0l$0݉$-l$@D$8tHl$@l$d$b $\$`DŽ$l$dD\$0,L$\$ӉL$\$ 19T$r 9D$ vډD$T$T$0\$xt$ D$\$l$㉄$$D$㉄$$剄$$$1ҋ$$1t$(|$,D$(T$,D$D$(T$,T$T$pt$t$D$x扄$$D$T$$1ҋt$|$1t$H|$LD$HT$LD$pD$HT$Lt$H|$Lt$P|$TD$1D$PT$TD$T$D$xD$XT$\ቄ$$D$1ҋ$$1ӋD$xӋt$|$1t$|$|$Xl$\|$l$ȉډ1D$T$Ή߉t$X|$\$1D$XT$\D$pd$ D$T$D$pd$$$D$ d$D$ T$$D$1ҋL$ \$$1ӋD$d$Ӌt$|$1t$|$$$|$l$ȉډ1D$T$Ή߉$$D$ 1$$$$1$$D$pd$x׋D$(T$,1׋$$1׋D$HT$L1׋D$(T$,¸$1D$PT$T9T$TrA9D$P7vL$\$ӉL$ \$$9\$r 9L$f$$D$pT$t9r9\$0,?Mt$|$ t1D$@.)? @)D$pT$t t1D$hT$lD$D$|$d9  |$d( |$d D$0D$XT$\D$(D$,9T$\w D$(D$,D$ T$$D$(T$,D$ T$$D$0 D$ T$$9T$$  1ҋL$$9L$, D$ T$$? MD$hT$l t1D$(T$,D$T$ t1҉D$T$ D$(D$0 T$,T$4D$hT$l t1҉D$hT$l? @)1 t1҉D$T$11 D$T$L$0\$4L$ \$$;\$$w D$hT$lT$l9T$r6 T$3T$lD$3D$h  f$0 w $\$`@B1D$`=ui v%?D$D$11xt$8D$pT$t%D$xT$|D$p1ҋt$x|$|1t$@|$DD$@T$DD$8%D$@T$Dt$?t$hl$剄$$D$ T$$$1D$h%D$(T$,t$(|$,D$ T$$1D$(T$,t$(|$,t$H|$LD$ 1D$HT$LD$ T$$D$XT$\t$ 1D$8%1҉D$T$t$|$t$ |$$1t$ |$$t$X|$\t$ |$$D$8%D$T$t$|$1t$ |$$D$h%D$T$D$h%D$XT$\D$0T$4T$T$8D$<t$0|$41t$8|$Sl ":S.eh_frame___bid32_to_bid128___bid128_to_bid32.eh_frame___bid_IDEC_glbflags___bid_power10_table_128___bid_estimate_decimal_digits___bid_power10_index_binexp_128___bid_IDEC_glbround___bid_round_const_table_128___bid_reciprocals10_128___bid_recip_scale___bid_round_const_table___bid_reciprocals10_64___bid_short_recip_scale /157 1350391525 0 0 100666 9618 ` L".text`X 0`.data@0.bss0.rdatad@0@/4h"@0@UWVS4t$HL$L\$P݁%`=`L$ځT$ D$ǒD$T$ VF ~ 4[^_]É%=~r ƤL$%D$ %|=xuD$%D$ 1fȉځl%~=~\$ T$T$$ D$T$$D$(T$,D$$% D$T$L$1ۉljՉ1D$$%$݉¸L$1ډVL$\$1L$(\$,1ӋD$ %N ؉F 4[^_]Ív%x=x%L$ D$ =#v'D$D$ D$ Evrov̓ D$ځT$ vvUWVS$$󥋜$$\$ t$$$$t$|$|$$|$hD$$%x=_vk=x =5L$ D$$%?9K D$0l$$l$411D$$%|=xe 1Ot$ |$$  $(,9L$$?D$0D$411D$ T$$ҁ (D$xT$|(扄$$D$x1ҋ$$1ۉL$H\$LD$HT$L,D$HT$LL$4?L$l\$0\$h%$D$pT$t% D$(T$,L$p1ۋD$l% D$@T$DL$@\$DD$(T$,1D$@T$DL$@\$D˹L$P\$TD$(1D$PT$T D$(T$,$剄$$L$(1ۡ 1҉D$T$L$\$L$(\$,1ۉL$(\$,$$\$(t$,$D$T$L$\$1L$(\$,D$l%(D$T$D$l%,$$D$h%(D$8t$1Ӊ1ۋD$h%,t$|$1t$|$$$t$|$ȉډ1D$T$˹D$81Ӌt$x|$|1D$l%$ס,׋D$pT$t1׋D$HT$L1׋D$@T$D1׋D$HT$L¸$l$8D$<D$8T$<D$PT$T9T$Tr4 9D$P* D$(T$,9T$,r 9D$( ȉ9r 9 f H t1ҋ\$4 ӹ@+ Ht$|$ t1 L$$~~ [^_] 11  D$$%?T$ \$ ` |$#-D$ t$|$|$ D$  ~  (1T$hx1K:\$h.owfw|$od$$߬$S ٜ$ل$l$L$% \$ D$ \$ T$ T$(,]\$8Ӊ+ T$ L$$ l$8l$8ʼn$$T$hF\$P$Y$\$ DŽ$l$PD\$8,L$\$ӉL$\$ 19T$r 9D$ fډD$ T$$T$8\$xt$0 D$\$l$㉄$$D$㉄$$剄$$$1ҋ$$1t$H|$LD$HT$LD$D$HT$LT$$T$lt$ t$D$x扄$$D$ T$$$1ҋt$ |$$1t$@|$DD$@T$DD$lD$@T$Dt$@|$Dt$X|$\D$ 1D$XT$\D$(T$,D$xD$pT$tD$ T$$D$(1ҋL$ \$$1ӋD$xӋt$(|$,1t$(|$,|$pl$t|$(l$,ȉډ1D$(T$,Ή߉t$p|$tD$ 1D$pT$tD$ld$0D$ T$$D$ld$D$T$D$0d$D$0T$4D$ 1ҋL$0\$41ӋD$d$Ӌt$ |$$1t$ |$$|$l$|$ l$$ȉډ1D$ T$$Ή߉t$|$D$01D$T$$$1$$D$ld$x׋D$HT$L1׋$$1׋D$@T$D1׋D$HT$L¸$1D$XT$\9T$\9D$XfL$(\$,ӉL$0\$49\$,r9L$(fD$T$D$XT$\9r9z\$8,?Mt$ |$$ t1D$P)?@)D$XT$\ t1D$`T$dD$ D$$|$P|$P|$PD$8D$pT$tD$(D$,9T$tw D$(D$,D$0T$4D$(T$,D$0T$4D$8 D$0T$49T$4O ? 1ҋL$49L$, D$(T$,?9 MD$`T$d t1D$8T$2|$ l$ht Cl$ ݉l$HۍCT$0 |$8l$Do- 3 = G  4 :   Tj#92 pw4:%>DJhn    < x !< .textX.data.bss.rdata4>Wl ".eh_frame___bid64_to_bid128___bid128_to_bid64.eh_frame___bid_power10_table_128___bid_IDEC_glbflags___bid_reciprocals10_128___bid_recip_scale___bid_IDEC_glbround___bid_estimate_decimal_digits___bid_power10_index_binexp_128___bid_round_const_table_128___bid_round_const_table/176 1350391525 0 0 100666 16734 ` L=.text-02 0`.data@0.bss0/4H.R= @0@UWVSL\$c$!\$! u)|$$\$; ZwD$;HHD$(T$,D$(ըլӉȉ)99 k $9]j9O]UWVS"4nugy;EK$Zn:AL   !!!!"""""##$'$X$y$$$%%&U&_&k&&7'>'((-(>(d(((( )-)7)B)f)p)****b+m+,,,,,,-@-a---..../////B0M0p11111112t22222[3f3^4r4444444/5=5 `  (     x   & ?,  W< pP  ! `% ) . .textE5.data.bss  ,;K`s.eh_frame___bid64_to_int64_rnint___bid64_to_int64_xrnint___bid64_to_int64_floor___bid64_to_int64_xfloor___bid64_to_int64_ceil___bid64_to_int64_xceil___bid64_to_int64_int___bid64_to_int64_xint___bid64_to_int64_rninta___bid64_to_int64_xrninta.eh_frame___bid_nr_digits___bid_midpoint64___bid_ten2k64___bid_ten2mk64___bid_shiftright128___bid_maskhigh128___bid_ten2mk128trunc___bid_IDEC_glbflags___bid_onehalf128/212 1350391525 0 0 100666 12974 ` L..text!& 0`.data@0.bss0/4". @0@UWVS,T$@L$D%|=|%x=x%`=`։ρ ˁT$ |$$l$ \$D$T$ 1%-Hu9r* A |Zu#J9<wNr 94sCuv ,[^_]É%։ǁ #v1,[^_]Ðr 9kBerow׉ˁ1҉D$ T$$l$ \$D$T$ 1%-` U )Ӌ ϋыD$ʉT$ r |$|qu` ըլL$\$ȉ˹+D$T$+D$T$9w9wՉ ދD$T$D$T$D$T$ D$1ҋt$|$ 1׉׋T$L$1ɉ$L$L$\$ $\$1 $\$$T$  t1҉D$T$$#D$# uAD$1׉ t*; wr;wD$t D$T$D$UWVSDT$XL$\%|=|%x=x%`=`։ρ ˁT$8|$f $[^_]ɁΉׁ #1$[^_]Ét$|$l$$$T$1%-Hu#9w9v Ztz~Jfr o`1҉D$T$l$$$T$1%-JvCr  )݋ߋӋ$ډT$ DыD$T$ D$T$t$11҉$T$4$|$t$|$ 1t$|$$T$$T$1׋  t11kݨ 99fUWVS4L$HD$L||tAxxt1``t5Ήǁ tCÁy>f 4[^_]ɁΉׁ #14[^_]ÉL$(|$,l$(\$D$T$ 1%-Hu!9w9r) Zt~Ffr o\Á1҉D$(T$,l$(\$D$T$ 1%-FAn \ )ˋ ϋыD$ʉT$ C׋D$T$ D$ T$$D$T$D$1ҋL$\$1ӋӋD$T$ 1҉D$T$ D$ T$$D$T$ ȉډ1D$T$ މˉ޻D$1֋T$D$ D$T$  t1҉ك~SL$#L$l$ #l$ t? 11kͨ 9]9P; Mw;?뢐UWVS4T$Ht$L%|=|%x=x%`=`щ T$(\$,l$(\$D$T$ 1%-Hu9r* y t"ub [vuH  )׋4֋D$T$ rw|$v 4[^_]É%щÁ #v14[^_]Ðr 93B-row׉ȉډ1҉D$(T$,l$(\$D$T$ 1%-1hYމӋD$T$ D$ T$$D$T$D$1ҋt$|$1׋׋D$T$ 1҉D$T$ D$ T$$D$T$ 1D$T$ D$1׋T$D$ D$T$  t1݃L$#L$l$ #l$ tv^ըլƉ׉t$|$ D$T$ t$|$ +t$|$ 99; u;dfUWVS4T$Ht$L%|=|%x=x%`=`щ T$(\$,l$(\$D$T$ 1%-Hu9r* y t"ub[vuH  )׋4֋D$T$ rw|$v 4[^_]É%щÁ #v14[^_]Ðr 93B-row׉ȉډ1҉D$(T$,l$(\$D$T$ 1%- 1aRމӋD$T$ D$ T$$D$T$D$1ҋt$|$1׋׋D$T$ 1҉D$T$ D$ T$$D$T$ 1D$T$ D$1׋T$D$ D$T$  t1݃L$#L$l$ #l$ t} PըլƉ׉t$|$ D$T$ t$|$ +t$|$ 99y; n;]UWVS$T$8t$<%|=| %x=x%`=`щ T$\$l$$$T$1%-Hu9D= r tu[TuD t$ ),$$4֋$T$ v $[^_]É%щÁ #v1$[^_]Ðr 99E3row׉ȉډ1҉D$T$l$$$T$1%-hމӋ,D$T$ D$T$t$11҉$T$4$|$t$|$ 1t$|$$T$$T$1׋  t11k 9Z9LfUWVS,T$@t$D%|=| %x=x%`=`щ T$ \$$l$ $$T$1%-Hu9D= r tu[TuD $ ),$$4֋$T$ v ,[^_]É%щÁ #v1,[^_]Ðr 99E3row׉ȉډ1҉D$ T$$l$ $$T$1%- 1iZ͉֋$T$D$T$D$T$$1ҋL$\$1ӋӋ$T$1҉$T$D$T$$T$ȉډ1$T$ȉډ¸D$T$ D$1D$T$ ,$T$  t1҉D$T$߃RT$ ; rw L$;v D$I1k 9%9$!؋T$! u\$ ; rwl$;vfUWVS,T$@L$D%|=|%x=x%`=`։ρ ˁT$ |$$l$ $$T$1%-Hu9r* ? |Xu!J9<wLr 94wAu ,[^_]É%։ǁ #v1,[^_]Ðr 9mBgrow׉ˁ1҉D$ T$$l$ $$T$1%-v` U )Ӌ ϋы$ʉT$ r!<$v|qu` ըլL$\$ ȉ˹+D$T$ +D$T$ 9w9wՉщD$D$T$ D$T$L$1ۋD$$1҉$T$ $\$t$|$ 1t$|$D$$$T$ $\$1ߋ  t1fUWVSDT$XL$\%|=|%x=x%`=`։ρ ˁT$8|$Yci02U_k&;K\-5H)39kv?IU ;l7AG}_iu! < C N Y   !]!g!o!!!!! x  (   0   8  ' A Z  t  D  T   .text!.data.bss  $6KZj.eh_frame___bid64_to_uint32_rnint___bid64_to_uint32_xrnint___bid64_to_uint32_floor___bid64_to_uint32_xfloor___bid64_to_uint32_ceil___bid64_to_uint32_xceil___bid64_to_uint32_int___bid64_to_uint32_xint___bid64_to_uint32_rninta___bid64_to_uint32_xrninta.eh_frame___bid_nr_digits___bid_midpoint64___bid_IDEC_glbflags___bid_ten2k64___bid_ten2mk64___bid_shiftright128___bid_maskhigh128___bid_ten2mk128trunc___bid_onehalf128/231 1350391525 0 0 100666 17824 ` LA.text<2x6 0`.data@0.bss0/42hA @0@UWVS]L$)‹$T$D$T$ D$D$ T$$t$1$1҉$T$4$|$t$|$ 1t$ |$$D$$T$$T$1׃  $\$ȉՋ<$T$D$T$ $1ۋ1҉D$T$ L$\$ $T$1҉$T$D$T$$T$D$T$ D$T$ 1$T$ $T$ t1҉$T$9L$D$T$D$T$ t$1%1҉$T$4$|$5 ơD$ T$$D$ T$$D$T$ D$T$1D$T$ %$T$$T$1D$T$ |$ e|$ 6UUWVS,L$@D$D||tAxxt1``t=Ήǁ tKÁyNf 1,[^_]fΉׁ #11,[^_]fL$ |$$l$ $$T$1%-Hu#9w9vJVV; ϋƉvr o,Á1҉D$ T$$l$ $$T$1%-vBF)Ћ$,D$T$ D$T$T$T$D$$1҉$T$D$T$$T$D$T$ 1҉D$T$ D$T$D$T$ $T$$T$1D$T$ |$ |$ Ջ$T$D$T$D$T$ $1ҋt$|$ 1׋׋$T$1҉$T$D$T$$T$1$T$D$1׋T$D$ $T$ t1ۃ~3 $#L$\$#\$ t Ɖ 11; r w;wˉƉD$T$D$T$ T$T$D$1҉$T$D$T$$T$ס ƍ D$ʉT$D$T$D$T$ D$T$1D$T$ UWVS4T$HL$L%|=|%x=x%`=` ։ρ ˁT$(|$,l$(\$D$T$ 1%-Hu9utJ Z Y ϋƉ/)ЋT$,D$ T$$D$T$D$D$T$T$ $D$D$T$1҉D$T$ $T$D$T$ D$T$ T$ L$$1ɉT$ L$$D$T$D$ T$$T$L$ 1T$ L$$|$$wS|$ wLD$ D$$D$T$ ¸L$L$D$ D$T$ f 14[^_]f%։ǁ #v'114[^_]Ívr 9#Browωˁ1҉D$(T$,l$(\$D$T$ 1%-11VՋD$T$ D$ T$$D$T$D$1ҋt$|$1׋׋T$L$ 1ɉT$L$ D$ T$$D$T$ 1D$T$ D$1׋T$D$ D$T$  t1ۃ~#L$#L$\$ #\$ tƉ׃X; r w;w܉Ɖ:D$ T$$D$T$ D$T$T$ $D$D$T$1҉D$T$$L$T$L$D$T$ס ƍ $ʉT$$L$T$L$ D$ T$$1D$T$ D$T$1D$T$ |$ X|$ MD$ D$ D$T$¸L$UWVS4T$HL$L%|=|%x=x%`=` ։ρ ˁT$(|$,l$(\$D$T$ 1%-Hu9utJ ZY ϋƉ/)ЋT$,D$ T$$D$T$D$D$T$T$ $D$D$T$1҉D$T$ $T$D$T$ D$T$ T$ L$$1ɉT$ L$$D$T$D$ T$$T$L$ 1T$ L$$|$$wS|$ wLD$ D$$D$T$ ¸L$L$D$ D$T$ f 14[^_]f%։ǁ #v'114[^_]Ívr 9#Browωˁ1҉D$(T$,l$(\$D$T$ 1%- 11OՋD$T$ D$ T$$D$T$D$1ҋt$|$1׋׋T$L$ 1ɉT$L$ D$ T$$D$T$ 1D$T$ D$1׋T$D$ D$T$  t1ۃ~*L$#L$\$ #\$ t Ɖ׃J; r w;wՉƉ,D$ T$$D$T$ D$T$T$ $D$D$T$1҉D$T$$L$T$L$D$T$ס ƍ $ʉT$$L$T$L$ D$ T$$1D$T$ D$T$1D$T$ |$ J|$ ?D$ D$ D$T$¸L$fUWVS,T$@L$D%|=|%x=x%`=`։ρ ˁT$ |$$l$ $$T$1%-Hu9#tTQ ϋ$ʉT$$T$3)Ћ$,D$T$ D$T$T$T$D$$1҉$T$D$T$$T$D$T$ 1҉D$T$ D$T$D$T$ $T$$T$1D$T$ |$ w |$  $D$$T$,[^_]Ív%։ǁ #v3$D$$T$,[^_]Ðr 9]BWrowÉˁ1҉D$ T$$l$ $$T$1%-4$|$P׋,$T$D$T$ $1ۋ1҉D$T$ L$\$ $T$1҉$T$D$T$$T$D$T$ D$T$ 1$T$ $T$ t1҉$T$D$T$D$T$ T$T$D$1҉$T$D$T$$T$ ϡ D$ʉT$D$T$D$T$ D$T$1D$T$ UWVS,T$@L$D%|=|%x=x%`=`։ρ ˁT$ |$$l$ $$T$1%-Hu9utL ϋƉv})Ћ$,D$T$ D$T$T$T$D$$1҉$T$D$T$$T$D$T$ 1҉D$T$ D$T$D$T$ $T$$T$1D$T$ |$ w |$  1,[^_]f%։ǁ #v'11,[^_]Ívr 9}Bwrowωˁ1҉D$ T$$l$ $$T$1%- 11YՋ$T$D$T$D$T$ $1ҋt$|$ 1׋׋$T$1҉$T$D$T$$T$1$T$D$1׋T$D$ $T$ t1ۃ~# $#L$\$#\$ t Ɖb; r w;wۉƉDD$T$D$T$ T$T$D$1҉$T$D$T$$T$ ϡ D$ʉT$D$T$D$T$ D$T$1D$T$ gvUWVS4T$HL$L%|=|%x=x%`=`։ρ ˁT$(|$,l$(\$D$T$ 1%-Hu9Q|~u3J9<wrr 94wgu"D$D$ D$T$ ' D$D$ D$T$ 4[^_]Ð%։ǁ #v7D$D$ D$T$ 4[^_]Ívr 9/B)rowˁ1҉D$(T$,l$(\$D$T$ 1%-4)ЋT$,D$ T$$D$T$D$D$T$T$ $D$D$T$1҉D$T$ $T$D$T$ D$T$ T$ L$$1ɉT$ L$$D$T$D$ T$$T$L$ 1T$ L$$|$$k|$ `D$ D$$@|It6 ϋD$ʉT$ D$T$ 1t$|$ 4< D$T$ D$T$|$11҉D$T$|$l$D$T$ 1҉D$T$ D$T$D$T$ D$T$T$L$1T$L$ D$T$  t1҉D$T$ [D$ T$$D$T$ D$T$T$ $D$D$T$1҉D$T$$L$T$L$D$T$ ϡ $ʉT$$L$T$L$ D$ T$$1D$T$ D$T$1D$T$ |$ i|$ ^D$ D$ D$T$¸L$L$D$ D$T$ D$T$ ¸L$fUWVS4T$HL$L%|=|%x=x%`=`։ρ ˁT$(|$,l$(\$D$T$ 1%-Hu9Uu3J9<r 94u1 f 14[^_]f%։ǁ #v'114[^_]Ívr 9GBArowωˁ1҉D$(T$,l$(\$D$T$ 1%-PQ)ЋT$,D$ T$$D$T$D$D$T$T$ $D$D$T$1҉D$T$ $T$D$T$ D$T$ T$ L$$1ɉT$ L$$D$T$D$ T$$T$L$ 1T$ L$$|$$|$ |D$ D$$|Kn ϋƉDf11 11)4<D$T$ D$ T$$D$T$D$1ҋt$|$1׋׋T$L$ 1ɉT$L$ D$ T$$D$T$ 1D$T$ D$1׋T$D$ D$T$  t1ۃfw ; ƉD$ T$$D$T$ D$T$T$ $D$D$T$1҉D$T$$L$T$L$D$T$ס ƍ $ʉT$$L$T$L$ D$ T$$1D$T$ D$T$1D$T$ |$ "|$ D$ D$ D$T$¸L$L$D$ D$T$ kbL$#L$L$L$ #L$L$ 9\$w7r9L$w/9\$u)9L$u# t; tw ;f ƉcD$T$ ¸L$JzR| TAA AACP AA AAB t AA AAD TtAA AACH3 AA AAB t AA AAD T AA AACHy AA AAD w AA AAA T$LAA AAC@n AA AAC i AA AAC T|AA AACHB AA AAC d AA AAD TAA AACHB AA AAC d AA AAD T, AA AAC@ AA AAD r AA AAB T#EAA AAC@ AA AAC d AA AAD TX'AA AACH' AA AAB t AA AAD T4l,AA AACH AA AAC d AA AAD l &apgqwT  & 7 H o    * 4 < n |     $ , 7   + t  s }      u!BReou]g(9_%5Dcku{Xhs~@PXc{"h-^nv ? I  L!!!!C"i"x"""""#####$ $;$E$$0%%%%%%7&B&M&&&&&&&&''F'''')(4(b((?)J)*%*1*d*k*r*y***%+4+C+++++,- -A-P-g-z--;.F./%/1/O/d/k/t////00%0o00000001111 22 x  (   0   8  ' A  Z t    # T' h, .text;2.data.bss  $6KZj.eh_frame___bid64_to_uint64_rnint___bid64_to_uint64_xrnint___bid64_to_uint64_floor___bid64_to_uint64_xfloor___bid64_to_uint64_ceil___bid64_to_uint64_xceil___bid64_to_uint64_int___bid64_to_uint64_xint___bid64_to_uint64_rninta___bid64_to_uint64_xrninta.eh_frame___bid_nr_digits___bid_midpoint64___bid_IDEC_glbflags___bid_ten2k64___bid_ten2mk64___bid_shiftright128___bid_maskhigh128___bid_ten2mk128trunc___bid_ten2k128___bid_onehalf128/250 1350391525 0 0 100666 49770 ` Lp.text@ 0`.data@0.bss0/4 @0@UWVS|$p$L$p\$tL$\$ D$xt$|\$xx8 v1Č[^_]Ð>ځ 5 %`=`tlj L$h\$ll$h\$D$T$1%-Hu. 911 f* w0(B  9w911  |$Hf%|=| Č[^_]Ív=l$ l$|$ \D$T$ 1҉D$hT$ll$h\$D$T$1%-f|$ c78%`=`i!v T$t$1҉Ɖt$(|$,D$(T$,|$,|$0t$1҉Ɖt$ |$$D$ T$$D$01ҋ|$(|$D$t$|$׉t$(|$,t$ |$$t$(|$,t$(|$,1t$(|$,t$@|$Dt$|$t$@|$D9or9e1׉1 u|$D9|$ rID$@9D$;D$)T$f |$ 9xVrl$9hGvB>ft$ _ )׋t$ 4T$֋D$$D$T$<p|$+`fl$\$D$T$1%-lf L$ 9 \$9L$  )׋t$ 4T$֋D$$D$T$h|$Wf9Bfމt$\Չl$Xt$|$ 4<9|$ rw9t$vl$XD$0 T$@D$T$D$@D$(T$,D$0D$ T$$T$T$8D$<D$ T$$1҉D$T$ D$8T$<D$T$ D$@D$T$ D$T$1҉D$T$D$(T$,D$T$D$T$ 1D$T$T$(,$D$8T$MD$X;Dr ;6ȃ)!UWVS|$p$L$p\$tL$\$ D$xt$|\$xx@ v1Č[^_]ÐFځ 5 %`=`tlj 'L$h\$ll$h\$D$T$1%-Hu. 911 f* 0B( 9<w9211 2 |$H v%|=| Č[^_]Ív=l$ l$|$ \D$T$ 1҉D$hT$ll$h\$D$T$1%-f|$ c70%`=`av T$t$1҉Ɖt$(|$,D$(T$,|$,|$0t$1҉Ɖt$ |$$D$ T$$D$01ҋ|$(|$D$t$|$׉t$(|$,t$ |$$t$(|$,t$(|$,1t$(|$,t$@|$Dt$|$t$@|$D9or9e1׉1 u|$D9|$ rID$@9D$;-|$L$ً |$ 9xNrl$9h?vB6ft$ _ )׋t$ 4T$֋D$$D$T$<p|$+`fl$\$D$T$1%-df L$ 9 w\$9f1D$l$ a )׋t$ 4T$֋D$$D$T$d|$Sf9Bf 1*fމt$\Չl$D$T$ 9T$ rw9D$v։ŋ|$D$0 T$@D$T$D$@D$ T$$D$0D$HT$LT$T$(D$,D$HT$L1҉D$T$ D$(T$,D$T$ D$@D$T$ D$T$1҉D$T$D$ T$$D$T$D$T$ 1D$T$T$(|$XD$ T$$D$PT$TD$(D$`T$dD$ 1ҋt$`|$d1׋D$X׋D$ T$$1҉D$ T$$D$PT$TD$ T$$1D$ T$$¸D$PT$TD$`1D$PT$Tt$|$ t$|$ D$H1D$T$ |$ l$$|$l$ D$ 9rwT$9v D$T$D$0D$ T$$D$@D$HT$LD$0D$0T$4D$ 1ҋt$0|$41t$8|$<D$8T$' 4t$0D$441D$(T$,D$0T$4D$8T$<¸D$ T$$D$(T$,)D$ T$$)t$ |$$t$$D$@D$D1ҋt$@|$D׉t$|$D$0T$4¸+D$8T$<+D$0T$4D$T$t$(|$,1t$8|$|$T |$PD$ 11XD$ D$T$ T$ur9411 11%T$ \$D$L$ 1҉ɉL$8\$qD$9D$*^r 9T$ 13T$  T$L$T$L$1T$ T$uL$T L$PT$@ 9T$ rAw9L$r93T$ 3L$ T$@L$T;rL$P;|$XL$\$ D$@ 9>r9411 11T$ \$D$L$ 1҉ɉL$8\$tȋL$kdD$Sv  )ӋL$  T$ыD$$D$ʉT$ v9BfՉl$XD$T$ v\$X4!Ɖt$(4!֋<@lj t1l$X9hr 9T$(\13T$( D$ T$$D$T$ t$(kf1  T$(L$(1҉ɉL$ \$$D$ T$$\$$\$L$(1҉ӋD$D$(D$,L$(\$,9r91؉1 aL$ 9L$ S L$D$ 1ۉȉD$@T$DL$@\$DT$DT$(D$T$D$ T$$D$T$D$ T$$ȉډD$8T$<L$8\$|$9)fUWVS|$p$L$p\$tL$\$ D$xt$|\$xxH v1Č[^_]ÐNځ 5 %`=`tlj /L$h\$ll$h\$D$T$1%-Hu. 9*11 f* 4B$ 98w9.11  |$H Č[^_]Ð%|=| Č[^_]Ív=l$ l$|$ TD$T$ 1҉D$hT$ll$h\$D$T$1%-f|$ c7(%`=`Yv T$t$1҉Ɖt$(|$,D$(T$,|$,|$0t$1҉Ɖt$ |$$D$ T$$D$01ҋ|$(|$D$t$|$׉t$(|$,t$ |$$t$(|$,t$(|$,1t$(|$,t$@|$Dt$|$t$@|$D9or9e1׉1 u|$D9|$ rID$@9D$;%D$t$f v|$ 9xKr l$9hHNT dp}<HUz 5; -4Bjs/\ AG `f    x!""9"""""U#a#v#####$&$$$'''(((((H)N)T)Z)x))_**b+h+++++%,g,,,,5-N-`--- ..V.d.....%/+/h/v/R0\0b0l0011 22*2^22223"3<3z3333`4j4R7a7l778,898_8f8v888888;99"::; ;:;L;;;; <F<Z<<<<==F=L=====>>%>,>w>}>>>>????x@"A5AAAAA@BLBYBBBBBCCCFFF[GhGqGGGHHHH8HKHIIIKOK~KKKKL&LLLZMlMNNNOOXO^OOOP PKPQP^PePPP$Q2QR$R*R0RRZSmSSSST1TTTTTUU^u^^^_d___`aala~aaaabbJbPbbbbbbb3cAcIc^dhdndtddeee$f0f=ffffffgggjjjDkJkkkkk ll'l4l=lalhllmzmmnoNo`oppppq8qqqrrrrdst!tatttt)u/u5u;uhuru v*vxyyyyyz,z8zEzzzzzzzzz {?{R{||g}}}}}}~2~V~~~#_eǀ ")tzˁڂci܅ӆ 2<8DQЋXٌ/_=S>HNTӑdp}!HTaҔٔ]cϙ@Gћ ekqwsy 7=cjǟ͟ߟ x  (   0   8  'd A  Z/ t? @Q c q  d .text@.data.bss  $7L[m~.eh_frame___bid128_to_int32_rnint___bid128_to_int32_xrnint___bid128_to_int32_floor___bid128_to_int32_xfloor___bid128_to_int32_ceil___bid128_to_int32_xceil___bid128_to_int32_int___bid128_to_int32_xint___bid128_to_int32_rninta___bid128_to_int32_xrninta.eh_frame___bid_nr_digits___bid_midpoint128___bid_IDEC_glbflags___bid_ten2k64___bid_midpoint64___bid_ten2mk128___bid_maskhigh128___bid_shiftright128___bid_ten2mk128trunc___bid_ten2k128___bid_onehalf128/269 1350391525 0 0 100666 42642 ` L.texth 0`.data@0.bss0/4V @0@UWVS$$󥋌$$L$\$$$\$$xxa v#D$D$D$T$Ĝ[^_]Vځ 5 %`=`t 7L$x\$|l$x\$D$T$1%-Hu. 911 f*/LB 9w911 o \$$D$D$%|=| D$D$f=vl$ l$c|$D$T$1҉D$xT$|l$x\$D$T$1%-f|$c7 %`=`Qvt$$L t$D$D$0)Ћ<D$8D$T$D$8D$@T$DD$0D$(T$,D$1ҋt$(|$,1t$H|$LD$HT$LD$8d$0D$HT$LD$T$1D$@T$Dt$H|$L1t$H|$Lt$|$t$(1t$|$D$(D$,19Vw9L11 u|$9|$,w4D$9D$(&T$$\$t$ۃމ\$t$ D$D$|$9xr l$9h Bfl$\$D$T$1%-f @L$9 )\$9D$$Dt$|$ރߋ ϋщ$D$ʉT$v/t$|$|$0)Ћ<D$8D$T$D$8D$@T$DD$0D$(T$,D$1ҋt$(|$,1t$H|$LD$HT$LD$8d$0D$HT$LD$T$1D$@T$Dt$H|$L1t$H|$Lt$0|$4|$(|$D$t$|$t$0|$4D$(D$,D$D$9T$w 9D$3T$3D$ |$49|$,D$09D$(9BfD$D$4vމt$dwՉl$`t$|$4<9|$rw9t$v|$Pt$(t$`|$8 l$Xd$PD$T$d$PD$@T$DD$(D$0T$4D$1ҋ|$0l$41|$l$D$T$D$(d$XD$T$|$l$1|$l$|$@l$D|$l$D$T$1D$T$l$@D$@d$PD$HT$LD$PD$pT$tD$(d$@D$hT$lD$H1ҋt$h|$l1t$P|$TD$PT$TD$(D$PT$Tt$H|$L1t$p|$tD$PT$T1׋D$T$¸D$T$D$01D$T$t$|$;|$rw;t$v D$T$L$HD$8D$0T$4D$XD$(T$,d$8D$8T$ρ  5 %`=` 1t$h|$ll$h\$D$T$1%-HD$u4D$ 91D$1 X L$(Ѓzf|$(g|$Ht+L$\$ كۉL$\$ vRD$D$ D$T$ Č[^_]Ív%|=| D$D$ 뿐fT$ T$t|$ tD$T$ 1҉D$hT$ll$h\$D$T$1%-f|$ c7<%`=`[%v D$D$ D$\$ 9Xr \$9XBzfD$HC\$ L$)ЋT$ D$8D$0T$4D$8D$T$D$ D$ T$$T$0T$@D$DD$ T$$1҉D$T$D$@T$DD$T$D$8D$T$L$0\$41L$\$D$T$1ӋD$T$¸D$T$T$ T$D$D$T$D$T$D$ D$$9\$$w 9L$ T$$1ڋD$ 1 i\$ \$[ D$HwD$D$ rt$HLt$|$ ރߋ\$( ϋщ$D$ʉT$ %vl$\$D$T$1%-Ff\$ L$)ЋT$D$8D$ T$$D$8D$T$T$ T$0D$4D$1҉D$T$D$0T$4D$T$D$ T$$1҉D$ T$$D$T$D$ T$$D$8D$T$L$\$1L$ \$$1;T$$Q;D$ BL$ \$( D$D$$D$ʉT$ 9\Bff\$(ۉ\$dL$ \$(Ӊ\$LD$0 T$(D$ T$$D$(D$T$D$0d$D$@T$DT$ T$8D$<D$@T$D1҉D$T$D$8T$<D$T$D$(d$D$T$D$ T$$1҉D$ T$$D$T$D$ T$$D$T$1D$ T$$T$8\$`D$T$D$PT$TD$8d$D$XT$\D$1ҋL$X\$\1ӋD$`d$ӋD$T$1҉D$T$D$PT$TD$T$ȉډ1D$T$ȉډ¸D$PT$TD$X1D$PT$TL$\$˹L$\$D$@1D$T$D$T$D$T$L$9rw\$9v D$ T$$D$0D$T$ D$(D$@T$DD$0D$0T$4L$1ۉ1҉D$T$D$(D$T$L$\$L$\$ 1ۉL$\$ \$@t$D\$t$ D$T$1D$T$ D$8D$(T$,D$`D$@T$DD$8D$8T$f\$ۉ\$tL$\$Ӊ\$D$H T$@D$8T$t$ |$|$()Ћ<D$0D$T$D$0D$8T$>>>???BBBBB^CdCCCCCC(D/D%E,EQGgGzHHHH0IIJWJ^JjKKKK#L*L@MLMYMMMQN[N&Q5QYZZy[[^p^|^^^^___ ``Zbdbjbtbccc.d8dFdddffffiiijj`jljyjjjkkkkkk$l6lBlXl_lqmxmmn=nCnznnoooopplpCqJq~rrrsBsLsZsss uu6u@uuuxxyy3y:yzz{{{{{ ||}}}}~ ~L~l~CJ~R\j6=fp܆jӇڇ@G<ERx؊ފ<BHNf|܋܌" `   $ d   $ d  ' A$! Z- t8 xG V ha n | .texth.data.bss  $7L[m~.eh_frame___bid128_to_int64_rnint___bid128_to_int64_xrnint___bid128_to_int64_floor___bid128_to_int64_xfloor___bid128_to_int64_ceil___bid128_to_int64_xceil___bid128_to_int64_int___bid128_to_int64_xint___bid128_to_int64_rninta___bid128_to_int64_xrninta.eh_frame___bid_nr_digits___bid_midpoint128___bid_IDEC_glbflags___bid_ten2k64___bid_midpoint64___bid_ten2mk128___bid_maskhigh128___bid_shiftright128___bid_ten2mk128trunc___bid_onehalf128/288 1350391525 0 0 100666 46012 ` L.text@ld 0`.data@0.bss0/4xT @0@UWVS|$p$L$p\$tL$\$D$xL$|ˁʁxxƉρ v1Č[^_]Ð 5 S%`=`tlj t$h|$ll$h\$D$T$1%-HD$(u6D$ 91l$1 d*  Č[^_]f%|=|  Č[^_]Ív=D$ D$|$D$T$1҉D$hT$ll$h\$D$T$1%-f|$c7t%`=`]vKB/ u$t$94"r|$9<v vD$(l$9hr l$9htBnfl$\$D$T$1%-f9*B6fGD$eX  )ӋL$ T$ыD$$D$ʉT$J 9w911 l$9D$9  )ӋL$ T$ыD$$D$ʉT$ -|$j1҉ɉL$(\$,D$(T$,D$,D$D$1҉L$\$ȉډ1҉D$T$ȉډ¸D$ T$$D$(1D$ T$$;|$r ;t$tD$1L$1 a L$ D$$ 1ۉȉD$8T$<L$8\$fO$re 1WJ 9r6w9r011  l$9w$91ftA  )ӋL$ $ы$$$ʉT$  )ӋL$ $ы$$D$ʉT$ :|$*j1҉ɉL$\$D$T$D$D$D$ 1҉L$\$ ȉډ1҉D$T$ ȉډ¸D$T$D$1D$T$;|$ r ;t$D$ 1L$1 n L$D$ 1ۉȉD$ T$$L$ \$$T$$T$(D$T$D$T$ D$T$D$T$ ȉD$0T$4ȉډ¸D$T$D$0T$4)D$T$)L$\$T$T$0D$ 1ҋL$01ӋD$T$D$ T$$D$T$¸+D$ T$$+D$T$ӋD$(1D$T$ ȉډ1D$T$ ȉډ¸D$8T$|$|r |$oL$ L$bt$ t$u?|$ |$u l$L l$Ht+L$X 9L$rw9t$r9L$lypD$D$D$T$҉D$ T$$D$T$D$ T$$D$T$T$T$ 4t$(D$,D$(T$,҉D$(T$,D$T$D$(T$,D$T$T$ T$(D$,D$(T$,D$T$;\$r ;L$T$1ڋD$1 ;l$vD$t$0)t$d$t$ t$0։t$X t$X<!Nj,!Ջ L$@ t1ҋ 9r99{\$0t$4\$t$ 71pT$D$D$T$҉D$T$D$T$D$T$D$T$T$T$(D$D$D$T$҉D$8T$<D$T$D$8T$<D$T$D$8k t$fO$re 1WJ 9r6w9r011  l$9w$91ftA  )ӋL$ $ы$$$ʉT$  )ӋL$ $ы$$D$ʉT$ :|$*j1҉ɉL$\$D$T$D$D$D$ 1҉L$\$ ȉډ1҉D$T$ ȉډ¸D$T$D$1D$T$;|$ r ;t$D$ 1L$1 n L$D$ 1ۉȉD$ T$$L$ \$$T$$T$(D$T$D$T$ D$T$D$T$ ȉD$0T$4ȉډ¸D$T$D$0T$4)D$T$)L$\$T$T$0D$ 1ҋL$01ӋD$T$D$ T$$D$T$¸+D$ T$$+D$T$ӋD$(1D$T$ ȉډ1D$T$ ȉډ¸D$8T$4>A AAAABBHB^B|BBCCuDDEELEREXE^E|EEEEEF!F\FnFFFFFGGqGwGGG,HBH.I8I>IHIIIJJJK@KLKYKKKKKLLLBNINnNxN&O0OQ RRRRRSS?TETU9UUUUUUUVVV>VEVOVVVVVVW6WHW~WWWWWX'X.XXXXX9YOY:ZDZJZTZZZ[[[8\D\Q\|\\\\\]]~^^^^d_n_0b?bJbbc5cccc/ddddddddde$e+eee:fPfRg\gbglggghh,iTi`imiiiiii(jjjkkkklllowo~op5p;pqpp q3qkqqq rrrr:rIrPrprwrrrrr ss2s`sfssssstt=tDtttttt>uTu6v@vFvPvvvwwwwNxxxxxxxxxy#y/ykyy'z:z{{||`}}}}-~4~\~f~~~$ &0qfx6AW]˅ׅ T#ωՉH|͊ӊ:DɎԎ w >DJPkqҐؐ!(u{/   p  P  0    ( C ]4* x`7 TH `Y xf du D .text>d.data.bssx .CUdw.eh_frame___bid128_to_uint32_rnint___bid128_to_uint32_xrnint___bid128_to_uint32_floor___bid128_to_uint32_xfloor___bid128_to_uint32_ceil___bid128_to_uint32_xceil___bid128_to_uint32_int___bid128_to_uint32_xint___bid128_to_uint32_rninta___bid128_to_uint32_xrninta.eh_frame___bid_nr_digits___bid_IDEC_glbflags___bid_midpoint64___bid_ten2k64___bid_midpoint128___bid_ten2k128___bid_ten2mk128___bid_maskhigh128___bid_shiftright128___bid_ten2mk128trunc___bid_onehalf128/308 1350391525 0 0 100666 40080 ` L.text̅ 0`.data@0.bss0/4( @0@UWVS|$p$L$p\$tL$\$D$xL$|ˁʁxxƉρ v&D$ D$$D$ T$$Č[^_]Ív  5 [%`=`t t$h|$ll$h\$D$T$1%-HD$(u6D$ 91l$1 |* D$ D$$ %|=| D$ D$$f=D$ D$|$D$T$1҉D$hT$ll$h\$D$T$1%-f|$c7T%`=`=v2+B- u$L$9 rt$94D$ D$$ D$ D$$D$(l$9hkr l$9h\BVfl$\$D$T$1%-f9Bf/L$ D$D$$D$ ʉT$$tt J 9w911 |$9l$9f\$L$L$ )Ћ D$(D$T$D$(D$8T$T$(;K)D$ 9D$  9T$UWVS|$p$L$p\$tL$\$ L$x\$|%ځxxΉ߁ v#D$D$D$T$Č[^_]  tVځ``t udT$ T$tf D$D$D$T$Č[^_]f|$ c7_ځ``Kfut$h|$ll$h\$D$T$1%-Hl$ u?l$ l$ 9ur9k1l$1 3v T$ ڃf^?L$  D$D$$D$ʉT$D$T$jځ||t@ D$D$D$T$Č[^_]f -v D$D$D$T$|$ vnD$T$ 1҉D$hT$ll$h\$D$T$1%-}D$ 9Brl$9jD$ vl$\$D$T$1%-#|$ |$ T$ T$(l$+T$ D$T$0d$(D$T$D$0d$(D$(T$,T$T$ D$$D$1҉D$T$D$ T$$D$T$D$T$1҉D$T$D$(T$,D$T$D$0D$T$D$T$1D$T$|$|$ L$\$ L$\$ȉN݉l$\l$ Ӊ\$XT$0 D$8D$(T$,D$8D$T$D$0d$D$PT$TT$(T$ D$$D$PT$T1҉D$T$D$ T$$D$T$D$8d$D$T$D$(T$,1҉D$(T$,D$T$D$(T$,D$T$1D$(T$,T$@D$T$D$`T$dT$T$HD$LD$@d$1҉D$ T$$D$HT$LD$ T$$D$T$1҉D$T$D$`T$dD$T$D$D$ T$$D$ T$$1D$T$D$T$¸D$T$D$P1D$T$D$T$D$T$l$9rwT$9v D$(T$,D$0D$T$D$8D$T$ D$0D$0T$4t$11҉D$ T$$D$8D$ T$$t$ |$$t$|$1t$|$t$|$ t$|$D$ T$$1D$T$D$@D$T$ D$HT$LD$@D$@T$DT$T$8D$<t$@|$D1t$8|$;D$.v\$@ۉ\$d\$ T$@҉T$LD$( T$@D$ T$$D$@D$T$D$(d$D$8T$ r 9|$F3D$3|$ T$L$ K B |$ |$ iD$L 9D$Lr 9T$@9D$\$t$\$t$ zD$Ll$T;P\$P;:k#\$ D$(! tӉ΃\$t$ #D$L 9D$wr9\$w9D$9\$D$L|$T;wl$P;9T$*D$Ll$T;rGT$P;7t$|$t$|$ {vUWVS|$p$L$p\$tL$\$ l$xL$|ˁ\$(%x=x^ρ v$D$D$ D$T$ Č[^_]ÐR 5 %`=`t 7t$h|$ll$h\$D$T$1%-HD$u6D$ 91D$1 bf L$@Ѓv\$(u`|$@T$ \$@D$D$L$@$D$ډT$ %|=| D$D$ fxvT$ T$b|$ D$T$ 1҉D$hT$ll$h\$D$T$1%-f|$ c7 %`=`Qv D$D$ D$D$\$ 9Xr \$9XtBnfl$\$D$T$1%-f9*B6 1ۋt$(É\$D$ WvD$(t zL$ \$)ЋT$D$0D$(T$,D$0D$ T$$D$D$T$T$(T$8D$<D$T$1҉D$T$T$8L$<T$L$D$0D$T$L$(\$,1L$ \$$D$T$1Ӄ ȃ DD$T$¸L$L$D$D$T$ f X\L$(\$,1ۉL$\$\$(\$ D$$L$\$ɋD$T$)+D$T$҉T$LL$\$˹L$\$L$\$)L$\$L$ \$$ɉL$0\$4L$ \$$L$\$L$0\$4)L$\$L$ \$$)L$\$L$\$L$\$\$\$8T$1ۉT$0D$4L$0\$4D$ T$$¸+D$ T$$ӋD$(T$,D$(T$,D$T$D$L1D$T$ȉډ1D$T$;|$r ;t$;|$m;t$cȉډ¸L$8L$D$D$T$;T$ 6;D$&v\$@ۉ\$d\$ T$@҉T$LD$( T$@D$ T$$D$@D$T$D$(d$D$8T$ D s   ; D     -\:Miv#0E %0@'1_e<Cdjpv$:= K U _    !R!!@"K"2#<###&B'I''''(=(B(S(())********[+++,,s-}-00000021i1p111122m2s222222 333A3N33333445$5*545555566~7788::;;E;,>;>J>>>>>>@?U?Z?j?@,@5@@@/AEAAAAAABC C&C0CCCCCDD EEEFFHH?III0L?LNLLLLLLMKM`MeMuM N7N@NPNNNAOWOvOOOOO PP.Q8Q>QHQQQQRRRSSTT U.UWZXaXXXXXX Y?Y_YZZZZ/[;[H[p["\D\\] ]]]^^aaab bWb^bbbbbbc;cOcycccc ddBdTd`dddddefff(fiff~gggg[hfhrhhhhh#i*ij jkkkl0l:lIlllm$mmm^pqq#q)q?qrrrrrss t)t6tXttttuDuJuquuuuvvxxxxxxyyyyyzzU}d}s}}}~~~~~~~BHjxAn|ā܁ `   P   ( h   (  C ]( x(4 $B  ^ j ~  T L .text.data.bss*4 F S e r.eh_frame___bid_addsd3___bid_subsd3.eh_frame___bid32_to_bid64___bid64_add___bid64_to_bid32___bid64_sub_div_sd.o/ 1350391525 0 0 100666 703 ` L~ .textLL 0`.data@0.bss0/4Lt@0@WVSD$ \$$$Ɖ׉$D$T$ 4$|$$T$[^_ÐzR| 0IAA AC A AA  2 >   .textI.data.bssL& 8 E W.eh_frame___bid_divsd3.eh_frame___bid32_to_bid64___bid64_div___bid64_to_bid32 _mul_sd.o/ 1350391525 0 0 100666 703 ` L~ .textLL 0`.data@0.bss0/4Lt@0@WVSD$ \$$$Ɖ׉$D$T$ 4$|$$T$[^_ÐzR| 0IAA AC A AA  2 >   .textI.data.bssL& 8 E W.eh_frame___bid_mulsd3.eh_frame___bid32_to_bid64___bid64_mul___bid64_to_bid32 _eq_sd.o/ 1350391525 0 0 100666 660 ` Lp .textHH 0`.data@0.bss0/4Lf@0@WVSD$ \$$$Ɖ׉$D$T$ 4$|$[^_ÐzR| 0EAA AC {A AA  2   .textE.data.bssL% 7 L.eh_frame___bid_eqsd2.eh_frame___bid32_to_bid64___bid64_quiet_equal_ne_sd.o/ 1350391525 0 0 100666 656 ` Lh .text@@ 0`.data@0.bss0/4L^@0@WVSD$ \$$$Ɖ׉$D$T$ 4$|$[^_ÐzR| 0=AA AC sA AA  2   .text=.data.bssL% 7 P.eh_frame___bid_nesd2.eh_frame___bid32_to_bid64___bid64_quiet_not_equal_lt_sd.o/ 1350391525 0 0 100666 651 ` Lh .text@@ 0`.data@0.bss0/4L^@0@WVSD$ \$$$Ɖ׉$D$T$ 4$|$؃[^_ÐzR| 0?AA AC uA AA  2   .text?.data.bssL% 7 K.eh_frame___bid_ltsd2.eh_frame___bid32_to_bid64___bid64_quiet_less _gt_sd.o/ 1350391525 0 0 100666 654 ` Lh .text@@ 0`.data@0.bss0/4L^@0@WVSD$ \$$$Ɖ׉$D$T$ 4$|$[^_ÐzR| 0=AA AC sA AA  2   .text=.data.bssL% 7 N.eh_frame___bid_gtsd2.eh_frame___bid32_to_bid64___bid64_quiet_greater_le_sd.o/ 1350391525 0 0 100666 665 ` Lp .textHH 0`.data@0.bss0/4Lf@0@WVSD$ \$$$Ɖ׉$D$T$ 4$|$H[^_ÐzR| 0FAA AC |A AA  2   .textF.data.bssL% 7 Q.eh_frame___bid_lesd2.eh_frame___bid32_to_bid64___bid64_quiet_less_equal _ge_sd.o/ 1350391525 0 0 100666 676 ` Lx .textLP 0`.data@0.bss0/4Pn@0@WVSD$ \$$$Ɖ׉$D$T$ 4$|$t [^_ÍvzR| 4KAA AC w A AAD   2   .textK.data.bssP% 7 T.eh_frame___bid_gesd2.eh_frame___bid32_to_bid64___bid64_quiet_greater_equal_sd_to_si.o/ 1350391525 0 0 100666 586 ` L" .text  0`.data@0.bss0/40@0@D$ $$T$ÐzR| C [    .text.data.bss0' 9 P.eh_frame___bid_fixsdsi.eh_frame___bid32_to_bid64___bid64_to_int32_xint_sd_to_di.o/ 1350391525 0 0 100666 586 ` L" .text  0`.data@0.bss0/40@0@D$ $$T$ÐzR| C [    .text.data.bss0' 9 P.eh_frame___bid_fixsddi.eh_frame___bid32_to_bid64___bid64_to_int64_xint_sd_to_usi.o/ 1350391525 0 0 100666 598 ` L* .text(  0`.data@0.bss0/40 @0@D$ $$T$=u1zR| (C d    .text(.data.bss 0* < T.eh_frame___bid_fixunssdsi.eh_frame___bid32_to_bid64___bid64_to_uint32_xint_sd_to_udi.o/ 1350391525 0 0 100666 606 ` L2 .text0 0`.data@0.bss0/40(@0@D$ $$T$ u11҃ÐzR| -C i    .text-.data.bss 0* < T.eh_frame___bid_fixunssddi.eh_frame___bid32_to_bid64___bid64_to_uint64_xint_si_to_sd.o/ 1350391525 0 0 100666 585 ` L" .text  0`.data@0.bss0/40@0@D$ $$T$ÐzR| C [    .text.data.bss0) = O.eh_frame___bid_floatsisd.eh_frame___bid64_from_int32___bid64_to_bid32 _di_to_sd.o/ 1350391525 0 0 100666 593 ` L* .text(  0`.data@0.bss0/40 @0@D$ T$$$T$$T$ÐzR| 'C c    .text'.data.bss0) = O.eh_frame___bid_floatdisd.eh_frame___bid64_from_int64___bid64_to_bid32 _usi_to_sd.o/ 1350391525 0 0 100666 589 ` L" .text  0`.data@0.bss0/40@0@D$ $$T$ÐzR| C [    .text.data.bss"0, A S.eh_frame___bid_floatunssisd.eh_frame___bid64_from_uint32___bid64_to_bid32 _udi_to_sd.o/ 1350391525 0 0 100666 597 ` L* .text(  0`.data@0.bss0/40 @0@D$ T$$$T$$T$ÐzR| 'C c    .text'.data.bss"0, A S.eh_frame___bid_floatunsdisd.eh_frame___bid64_from_uint64___bid64_to_bid32 _sd_to_sf.o/ 1350391525 0 0 100666 512 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss,) >.eh_frame___bid_truncsdsf.eh_frame___bid32_to_binary32_sd_to_df.o/ 1350391525 0 0 100666 513 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss ,* ?.eh_frame___bid_extendsddf.eh_frame___bid32_to_binary64 _sd_to_xf.o/ 1350391525 0 0 100666 513 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss ,* ?.eh_frame___bid_extendsdxf.eh_frame___bid32_to_binary80 _sd_to_tf.o/ 1350391525 0 0 100666 582 ` L@ .text@, 0`.data@0.bss0/486@0@S(\$0T$4D$T$$D$D$CD$CD$C ؃([ÐzR| >AC0xA   .text>.data.bss 8* @.eh_frame___bid_extendsdtf.eh_frame___bid32_to_binary128_sf_to_sd.o/ 1350391525 0 0 100666 529 ` L  .text 0`.data@0.bss0/40@0@D$ $ÐzR| C O   .text.data.bss 0* ?.eh_frame___bid_extendsfsd.eh_frame___binary32_to_bid32 _df_to_sd.o/ 1350391525 0 0 100666 528 ` L  .text 0`.data@0.bss0/40@0@D$ $ÐzR| C O   .text.data.bss0) >.eh_frame___bid_truncdfsd.eh_frame___binary64_to_bid32_xf_to_sd.o/ 1350391525 0 0 100666 528 ` L  .text 0`.data@0.bss0/40@0@l$ <$ÐzR| C O   .text.data.bss0) >.eh_frame___bid_truncxfsd.eh_frame___binary80_to_bid32_tf_to_sd.o/ 1350391525 0 0 100666 593 ` LL .text@8 0`.data@0.bss0/4DB@0@WV$D$0D$D$4D$D$8D$D$AC0xA   .text>.data.bss!8+ >.eh_frame___bid_extendsdtd2.eh_frame___bid32_to_bid128_unord_sd.o/ 1350391525 0 0 100666 659 ` Lh .text@@ 0`.data@0.bss0/4L^@0@WVSD$ \$$$Ɖ׉$D$T$ 4$|$[^_ÐzR| 0=AA AC sA AA  2   .text=.data.bssL( : S.eh_frame___bid_unordsd2.eh_frame___bid32_to_bid64___bid64_quiet_unordered _addsub_dd.o/ 1350391525 0 0 100666 716 ` L .text`l 0`.data@0.bss0/4X@0@SD$ T$$L$(\$,L$\$ $T$[ÍvSD$ T$$L$(\$,L$\$ $T$[ÐzR| -AC gA<4-AC gA$ T  @ 0 .text].data.bss*X4 A N.eh_frame___bid_adddd3___bid_subdd3.eh_frame___bid64_add___bid64_sub_div_dd.o/ 1350391525 0 0 100666 553 ` L0 .text0 0`.data@0.bss0/48&@0@SD$ T$$L$(\$,L$\$ $T$[ÐzR| -AC gA$   .text-.data.bss8& 3.eh_frame___bid_divdd3.eh_frame___bid64_div _mul_dd.o/ 1350391525 0 0 100666 553 ` L0 .text0 0`.data@0.bss0/48&@0@SD$ T$$L$(\$,L$\$ $T$[ÐzR| -AC gA$   .text-.data.bss8& 3.eh_frame___bid_muldd3.eh_frame___bid64_mul _eq_dd.o/ 1350391525 0 0 100666 568 ` L8 .text8$ 0`.data@0.bss0/48.@0@SD$ T$$L$(\$,L$\$ $T$[ÐzR| 5AC oA$   .text5.data.bss8% :.eh_frame___bid_eqdd2.eh_frame___bid64_quiet_equal_ne_dd.o/ 1350391525 0 0 100666 512 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss,% >.eh_frame___bid_nedd2.eh_frame___bid64_quiet_not_equal_lt_dd.o/ 1350391525 0 0 100666 559 ` L0 .text0 0`.data@0.bss0/48&@0@SD$ T$$L$(\$,L$\$ $T$؃[ÐzR| /AC iA$   .text/.data.bss8% 9.eh_frame___bid_ltdd2.eh_frame___bid64_quiet_less _gt_dd.o/ 1350391525 0 0 100666 510 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss,% <.eh_frame___bid_gtdd2.eh_frame___bid64_quiet_greater_le_dd.o/ 1350391525 0 0 100666 573 ` L8 .text8$ 0`.data@0.bss0/48.@0@SD$ T$$L$(\$,L$\$ $T$H[ÐzR| 6AC pA$   .text6.data.bss8% ?.eh_frame___bid_ledd2.eh_frame___bid64_quiet_less_equal _ge_dd.o/ 1350391525 0 0 100666 584 ` L@ .text<, 0`.data@0.bss0/4<6@0@SD$ T$$L$(\$,L$\$ $T$t[ÍvzR|  ;AC k AD $   .text;.data.bss<% B.eh_frame___bid_gedd2.eh_frame___bid64_quiet_greater_equal_dd_to_si.o/ 1350391525 0 0 100666 512 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss,' >.eh_frame___bid_fixddsi.eh_frame___bid64_to_int32_xint_dd_to_di.o/ 1350391525 0 0 100666 512 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss,' >.eh_frame___bid_fixdddi.eh_frame___bid64_to_int64_xint_dd_to_usi.o/ 1350391525 0 0 100666 548 ` L .text$ 0`.data@0.bss0/40@0@D$ T$$$T$=u1zR| $C `   .text$.data.bss 0* B.eh_frame___bid_fixunsddsi.eh_frame___bid64_to_uint32_xint_dd_to_udi.o/ 1350391525 0 0 100666 556 ` L$ .text, 0`.data@0.bss0/40@0@D$ T$$$T$ u11҃ÐzR| )C e   .text).data.bss 0* B.eh_frame___bid_fixunsdddi.eh_frame___bid64_to_uint64_xint_si_to_dd.o/ 1350391525 0 0 100666 527 ` L  .text 0`.data@0.bss0/40@0@D$ $ÐzR| C O   .text.data.bss0) =.eh_frame___bid_floatsidd.eh_frame___bid64_from_int32 _di_to_dd.o/ 1350391525 0 0 100666 535 ` L .text 0`.data@0.bss0/40 @0@D$ T$$$T$ÐzR| C W   .text.data.bss0) =.eh_frame___bid_floatdidd.eh_frame___bid64_from_int64 _usi_to_dd.o/ 1350391525 0 0 100666 531 ` L  .text 0`.data@0.bss0/40@0@D$ $ÐzR| C O   .text.data.bss"0, A.eh_frame___bid_floatunssidd.eh_frame___bid64_from_uint32 _udi_to_dd.o/ 1350391525 0 0 100666 539 ` L .text 0`.data@0.bss0/40 @0@D$ T$$$T$ÐzR| C W   .text.data.bss"0, A.eh_frame___bid_floatunsdidd.eh_frame___bid64_from_uint64 _dd_to_sf.o/ 1350391525 0 0 100666 512 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss,) >.eh_frame___bid_truncddsf.eh_frame___bid64_to_binary32_dd_to_df.o/ 1350391525 0 0 100666 512 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss,) >.eh_frame___bid_truncdddf.eh_frame___bid64_to_binary64_dd_to_xf.o/ 1350391525 0 0 100666 513 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss ,* ?.eh_frame___bid_extendddxf.eh_frame___bid64_to_binary80 _dd_to_tf.o/ 1350391525 0 0 100666 602 ` LT .textH@ 0`.data@0.bss0/4DJ@0@VS$t$0L$4\$8D$L$\$$D$D$FD$FD$F $[^zR| (HAA C0@ AA!   .textH.data.bss D* @.eh_frame___bid_extendddtf.eh_frame___bid64_to_binary128_sf_to_dd.o/ 1350391525 0 0 100666 529 ` L  .text 0`.data@0.bss0/40@0@D$ $ÐzR| C O   .text.data.bss 0* ?.eh_frame___bid_extendsfdd.eh_frame___binary32_to_bid64 _df_to_dd.o/ 1350391525 0 0 100666 529 ` L  .text 0`.data@0.bss0/40@0@D$ $ÐzR| C O   .text.data.bss 0* ?.eh_frame___bid_extenddfdd.eh_frame___binary64_to_bid64 _xf_to_dd.o/ 1350391525 0 0 100666 528 ` L  .text 0`.data@0.bss0/40@0@l$ <$ÐzR| C O   .text.data.bss0) >.eh_frame___bid_truncxfdd.eh_frame___binary80_to_bid64_tf_to_dd.o/ 1350391525 0 0 100666 593 ` LL .text@8 0`.data@0.bss0/4DB@0@WV$D$0D$D$4D$D$8D$D$.eh_frame___bid_extendddtd2.eh_frame___bid64_to_bid128_unord_dd.o/ 1350391525 0 0 100666 515 ` L .text 0`.data@0.bss0/4,@0@zR|    .text.data.bss,( A.eh_frame___bid_unorddd2.eh_frame___bid64_quiet_unordered _addsub_td.o/ 1350391525 0 0 100666 1014 ` L .text` 0`.data@0.bss0/4@0@WVS`\$p$D$0$D$4$D$8$D$<$D$@$D$D$D$H$D$LD$P|$t$@|$t$0$D$PD$TCD$XCD$\C ؃`[^_ÍvWVS`\$p$D$0$D$4$D$8$D$<$D$@$D$D$D$H$D$LD$P|$t$@|$t$0$D$PD$TCD$XCD$\C ؃`[^_ÐzR| 0AA ACpA AA0PAA ACpA AA 5  T  .text].data.bss*4 B P.eh_frame___bid_addtd3___bid_subtd3.eh_frame___bid128_add___bid128_sub_div_td.o/ 1350391525 0 0 100666 702 ` L .text 0`.data@0.bss0/4Ld@0@WVS`\$p$D$0$D$4$D$8$D$<$D$@$D$D$D$H$D$LD$P|$t$@|$t$0$D$PD$TCD$XCD$\C ؃`[^_ÐzR| 0AA ACpA AA   .text.data.bssL& 4.eh_frame___bid_divtd3.eh_frame___bid128_div_mul_td.o/ 1350391525 0 0 100666 702 ` L .text 0`.data@0.bss0/4Ld@0@WVS`\$p$D$0$D$4$D$8$D$<$D$@$D$D$D$H$D$LD$P|$t$@|$t$0$D$PD$TCD$XCD$\C ؃`[^_ÐzR| 0AA ACpA AA   .text.data.bssL& 4.eh_frame___bid_multd3.eh_frame___bid128_mul_eq_td.o/ 1350391525 0 0 100666 641 ` L .texttl 0`.data@0.bss0/4D(v@0@WVDD$PD$ D$TD$$D$XD$(D$\D$,D$`D$0D$dD$4D$hD$8D$lD$<|$t$0t$ D^_ÐzR| (qAA CPi AA_   .textq.data.bssD% ;.eh_frame___bid_eqtd2.eh_frame___bid128_quiet_equal _ne_td.o/ 1350391525 0 0 100666 637 ` Lx .textld 0`.data@0.bss0/4D n@0@WVDD$PD$ D$TD$$D$XD$(D$\D$,D$`D$0D$dD$4D$hD$8D$lD$<|$t$0t$ D^_ÐzR| (iAA CPa AA_   .texti.data.bssD% ?.eh_frame___bid_netd2.eh_frame___bid128_quiet_not_equal _lt_td.o/ 1350391525 0 0 100666 632 ` Lx .textld 0`.data@0.bss0/4D n@0@WVDD$PD$ D$TD$$D$XD$(D$\D$,D$`D$0D$dD$4D$hD$8D$lD$<|$t$0t$ ؃D^_ÐzR| (kAA CPc AA_   .textk.data.bssD% :.eh_frame___bid_lttd2.eh_frame___bid128_quiet_less_gt_td.o/ 1350391525 0 0 100666 635 ` Lx .textld 0`.data@0.bss0/4D n@0@WVDD$PD$ D$TD$$D$XD$(D$\D$,D$`D$0D$dD$4D$hD$8D$lD$<|$t$0t$ D^_ÐzR| (iAA CPa AA_   .texti.data.bssD% =.eh_frame___bid_gttd2.eh_frame___bid128_quiet_greater _le_td.o/ 1350391525 0 0 100666 646 ` L .texttl 0`.data@0.bss0/4D(v@0@WVDD$PD$ D$TD$$D$XD$(D$\D$,D$`D$0D$dD$4D$hD$8D$lD$<|$t$0t$ HD^_ÐzR| (rAA CPj AA_   .textr.data.bssD% @.eh_frame___bid_letd2.eh_frame___bid128_quiet_less_equal_ge_td.o/ 1350391525 0 0 100666 657 ` L .textxt 0`.data@0.bss0/4H,~@0@WVDD$PD$ D$TD$$D$XD$(D$\D$,D$`D$0D$dD$4D$hD$8D$lD$<|$t$0t$ t D^_ÍvzR| ,wAA CPe  AAD _   .textw.data.bssH% C.eh_frame___bid_getd2.eh_frame___bid128_quiet_greater_equal _td_to_si.o/ 1350391525 0 0 100666 593 ` LL .text@8 0`.data@0.bss0/4DB@0@WV$D$0D$D$4D$D$8D$D$AC0xA   .text>.data.bss8) >.eh_frame___bid_floatsitd.eh_frame___bid128_from_int32_di_to_td.o/ 1350391525 0 0 100666 592 ` LL .textH8 0`.data@0.bss0/4<B@0@S(\$0D$T$4L$8T$L$$D$D$CD$CD$C ؃([ÐzR|  FAC0@A   .textF.data.bss<) >.eh_frame___bid_floatditd.eh_frame___bid128_from_int64_usi_to_td.o/ 1350391525 0 0 100666 584 ` L@ .text@, 0`.data@0.bss0/486@0@S(\$0D$T$4T$$D$D$CD$CD$C ؃([ÐzR| >AC0xA   .text>.data.bss"8, B.eh_frame___bid_floatunssitd.eh_frame___bid128_from_uint32_udi_to_td.o/ 1350391525 0 0 100666 596 ` LL .textH8 0`.data@0.bss0/4<B@0@S(\$0D$T$4L$8T$L$$D$D$CD$CD$C ؃([ÐzR|  FAC0@A   .textF.data.bss"<, B.eh_frame___bid_floatunsditd.eh_frame___bid128_from_uint64_td_to_sf.o/ 1350391525 0 0 100666 593 ` LL .text@8 0`.data@0.bss0/4DB@0@WV$D$0D$D$4D$D$8D$D$AC0xA   .text>.data.bss 8* @.eh_frame___bid_extendsftd.eh_frame___binary32_to_bid128_df_to_td.o/ 1350391525 0 0 100666 582 ` L@ .text@, 0`.data@0.bss0/486@0@S(\$0D$D$4\$$D$D$CD$CD$C ؃([ÐzR| >AC0xA   .text>.data.bss 8* @.eh_frame___bid_extenddftd.eh_frame___binary64_to_bid128_xf_to_td.o/ 1350391525 0 0 100666 582 ` L@ .text@, 0`.data@0.bss0/486@0@S(\$0D$l$4|$$D$D$CD$CD$C ؃([ÐzR| >AC0xA   .text>.data.bss 8* @.eh_frame___bid_extendxftd.eh_frame___binary80_to_bid128_tf_to_td.o/ 1350391525 0 0 100666 647 ` L .textll 0`.data@0.bss0/4L v@0@WVS@\$PD$`D$0D$dD$4D$hD$8D$lD$D$C $uCs[^É$S[^É$VC1[^VSS\$Ƹ1 x9st Y[^ÐC1Y[^ÍvCs1Y[^S\$ Kt1[C$RxD$D$C $ [ÐzR| 4fAC [ AD KA `A SA4Tl0AA A]  AAF A AA $C LA I C C(.AC0S,A0L,A0GA ,C TC I A C$=AC nC FA(\C OA C8HtIAC LA I AA SC LA HA4GAC LA _C K AA EA$ KAC |C FA\ltAA C SA \C Q  AAA HA H  AAA HA H AADXHAA Ae  AAB F  AAD M AA4(SAC N AA OA _C KA+LtF f!|"##$X r%|"##%C#c$ X,L\ !h : S m  X p    Ah d $ .textw.data.bss _Sleep@4        , ; P _ v   .eh_frame___gthr_win32_once___gthr_win32_key_create___gthr_win32_key_delete___gthr_win32_getspecific___gthr_win32_setspecific___gthr_win32_mutex_init_function___gthr_win32_mutex_destroy___gthr_win32_mutex_lock___gthr_win32_mutex_trylock___gthr_win32_mutex_unlock___gthr_win32_recursive_mutex_init_function___gthr_win32_recursive_mutex_lock___gthr_win32_recursive_mutex_trylock___gthr_win32_recursive_mutex_unlock.eh_frame_InterlockedIncrement@4_TlsAlloc@0___mingwthr_key_dtor_GetLastError@0_TlsFree@4_TlsGetValue@4_SetLastError@4_TlsSetValue@8_CreateSemaphoreA@16_CloseHandle@4_WaitForSingleObject@8_InterlockedDecrement@4_ReleaseSemaphore@12_GetCurrentThreadId@0 tf-signs.o/ 1350391525 0 0 100666 648 ` L .text 0`.data@0.bss0/4H4|@0@,D$0T$LT$ T$\T$L$ညT$ ʈT$T$@T$DPT$HPT$ P ,fD$ T$t$$FN l$t$D$ +D$$$$$$$$ D$+D$pT$tL$x|$|$$$$\$$\$(t$,t$ D$Vh=L$ L$  $)D$ L$ )L$PL$0L$ 9uG$L$ ≔x$vHy9l$(<+D$(h l$   $1 09u؋T$  ) $ 9u)Mf%$$ fkfTfDŽ$DŽ$DŽ$DŽ$D$(L$($[f1111v)l$($$T$ T$< L$(A\$ \$\$ $` $9uG,f$ $ T$ ƒF1D$1\$|L$xT$tD$ )L$$$$$\$$\$($|$ DŽ$DŽ$DŽ$DŽ$D$(1^ t$$Ft$(%Hgl$t$D$ D$$$$$  Ӊ$ $Ѭ$ ȉD$ $T$<|$( L$$ÃD$$v|$$fD$qD$ L$ )L$L$ ƽ)݅$<|$TL$v$ $ $ $tL$@ D$\% f=f=t1҃L$@\$H\$11111ҋL$H֋L$9 t$9$9[fD$,`D$("Ń`D$ 1T$,T$L$89ct$0t$ O$c\$,M$U\$Hs$;l$HxD$ )l$L$ Ǹ)؉D$ƍ$4t$TL$4 ;D$u)؋$\$$$ ‰$$ ى$$ ؉$L$@͉L$HL$1|$0|$ $$9$;$$t$H$vME]111ҋD$HWT$0T$ ;$,-$$9wJE$;$1|$09|$D$t$t$$$bL$HL$bL < <p < Q Q p  zR| @AA AAF< AA AAB S  $(,048<  .text.data.bss.rdata@\".eh_frame___divtf3.eh_frameeqtf2.o/ 1350391525 0 0 100666 972 ` L .text 0`.data@0.bss0/4pt@0@UWVS\D$pD$ T$tT$l$xl$t$|$D$$T$$$l$($t$<ƉD$ fD$>%\$?|$L׉T$,fT$NL$O=t1ta9=tz\[^_]Ðl$ l$ l$l$ l$l$ l$ tfx؛\[^_]Ðl$$ l$l$l$( l$l$ l$,t=uvD$ D$ D$ D$ utD$$ D$ D$( D$,^fyTfl$9l$ 1l$$9l$#l$(9l$l$,9l$ 8tD$ D$ D$ D$ 1zR| TAA AACp AA AAB r AA AAB ___eqtf2 ___netf2 .text.data.bssp.eh_frame.eh_framegetf2.o/ 1350391525 0 0 100666 1140 ` L .text< 0`.data@0.bss0/4@0@UWVS\D$pD$$l$tl$(D$xD$,\$|$l$$D$$l$$\$<ÉD$ fT$>D$?t$Ll$ fL$ND$OuN\$( \$$ \$, \$ ۉޅt9uu9uN9J|D$ 9D$ w>sLt6\[^_]Åu1\$ \$ \$ \$ ۅuttʸ\[^_]Ðt 1\[^_]fuܐl$( l$$l$l$, l$l$ l$ -f؛\[^_]Ðl$ l$l$l$ l$l$ l$ trfyl$9l$,SD$9D$(?l$9l$$+nD$ D$ D$ D$ X뎋D$( D$$ D$, D$ t/zR| ;AA AACp AA AAA q AA AAB I AA AAC F AA AAB ___getf2 ___gttf2 .text;.data.bss.eh_frame.eh_frameletf2.o/ 1350391525 0 0 100666 1168 ` L .textX 0`.data@0.bss0/4 @0@UWVS\D$pD$\$t\$D$xD$t$|$\$$$D$($\$,$t$<fL$>T$?|$LljD$ f\$N\$ D$O|$ t=|$ 1ft$( t$$ t$, t$ ۅtRt:1\[^_]Ët$ t$ t$ ۉމ\$ tfu\[^_]Ívu\[^_]Ív\$ \$\$\$ \$\$ 1fyV|$ uST$( T$$ T$, T$ t.\$( \$$\$\$, \$\$ \$ fx؛\[^_]Ð9T;L$ J|;l$ >t2D$,9D$u݋\$(9\$ u͋D$$9D$븋D$ D$ D$  zR| WAA AACp AA AAA | AA AAD T AA AAD  AA AAB ___letf2 ___lttf2 .textW.data.bss.eh_frame.eh_framemultf3.o/ 1350391525 0 0 100666 5422 ` L4 .text 0`.data@0.bss0.rdata@@0@/4\$*@0@UWVS$ $$$($,$0$4\$$8t$$<\$|$LD$PL$TT$X|$\D$$$$$\$_\$ ۉ\$0f\$^\$(   t$ D$ t |$$+D$D$ )|$|$ l$PL$L$ ډ9u|$ $\$D$HT$㉜x$vHyD$\$)\$D$ D$(D$8D$$D$,D$v $ ډ$ $$l$?D$ D$(D$8D$$D$,D$l$`D$D$dT$T$h\$\$l뉬$$$L$$T$oT$҉T$4fT$nL$ L$  D$ǃ    $)D$ )|$PL$ ډ9u勜$E㉜x$Hy+T$\$$\$1f PD$  D$( D$8D$$D$,D$~L$  $D$L$ ȉ$\$ É$$?1ɊD$3D$ D$|$ T$T$<$$T$ D$$$׉Ë$$T$,D$ T$(Ƌ$$T$0D$$T$41\$ \$1ۋl$,T$ T$ˉT$ l$,1ɋ|$(߃1ۋT$0l$1|$4މD$ $$Ӊŋ$$T$(D$$$T$0D$$$T$411T$(|$1ۋl$0L$1|$4މD$$$Ӊŋ$$T$0D$$$T$4D$($$T$8D$$T$11T$0|$1ۋl$4L$($1ҋ|$8t$߃1ۉŋD$ӉD$$$$t$Ӊ\$$$|$ |$$ |$ D$ É$ $ ‰$D$ Ɖ$D$  ؉$$$$l$ fL$>T$? ˆT$?]uD$ED$$l$$$D$D$ D$ +\$$$$$L$L ؃|$$1D$m<T$$L$4$\$8$t$0$L$L Ѓ|$$119$|$ T$T$ $ϋ$T$4Wl$ ՋD$ ʼnl$0D$$D$ Ƌ$l$,苬$l$(l$8l$0$$T$8$$$L$L ؃\$|$$8D$$DŽ$DŽ$DŽ$DŽ$|$$1D$D$(1 D$D$ L$)L$ L$ Ÿ+D$D$$ $T$|$(t$,|$TL$ 4L$ ;D$u|$(t$,+D$$T$L$L$$mO$$$T$D$l$ω$$$$D$%$D$($t$,$D$ D$( D$ uZ'+$L$L$4$L$8$T$0D$ Ћl$ D$D$ uD$LD$$ ؉$t$ މ$ ى$T$\$($ Ӊ$T$(\$, ډ$l$,\$  ݉$\$ 9\$'$$$$$$$ É$$ ʉ$$ ȉ$T$$L$L D$1$T$($L$,$t$ $L$L D$؃\$D$)L$t$$$$$\$T$$+$$$$$$$$D$L$L D$D$1D$$ $ D$ ȃGD$D$1D$$$$l$ l$x D$8\$$t$ $$|$4$L$L ؃|$$\$4$l$$$D$ D$$$$$L$L D$4D$8D$0D$9r9w;$$$$$$$|$$|$$‹$D$ L$)L$L$ Ÿ)D$ t0Í$\$(TL$L$ ډ;D$(u$L$\$ @& D$11D$ $L$L $u*fD$|$D$YL$L$L D$$$$ T$c l$l$$$D$(D$8$t$,$l$ l$( ʼnl$< t$@t|؛l[^_]ÐD$ )L$T0L$ ֺ)‰T$tyэT$0l0\L$@~11ΉT$,o@)11 t A9\$uXT$ )\$ 9u)fD C~փ D$$1҉¸L$ 1D$ )\$\ L$ ޹)L$ tNT$ l \L$@)t$\$0T$4D$8D$<n1NT$Q|$X|$0+T$D$ )l$t$l$ŋBL$L$ ؉9ul$\$0T$Jt$\0x|$0fJyt$0\$4L$8T$<|$f$11111fT$,fT$. fT$.$׊T$/ T$/0XHT$,P L[^_]Ðv|$IT$@)t$L$ T$$D$(D$,n1/$2<$;|$ +$D$ )l$4$l$ ŋBL$L$ ؉9ul$ \$ $J4$\ x|$ Jyt$ \$$L$(T$,|$ f11111fT$fT$ fT$d$0XHT$P <[^_]Ðv<$FT$,$t  9u$JPVP$ME|$ *fzR| <AA AACPG AA AAB  .text.data.bssX'.eh_frame___floatunditf.eh_frame extendsftf2.o/ 1350391525 0 0 100666 1117 ` L .textl 0`.data@0.bss0/4X x@0@UWVSLD$`|$L$dρ|$0D$<D$8D$4]K~]ŀ?11f|$,f|$. f|$.׊T$/ T$/ϋT$,0XxP L[^_]Ív߃\$كQ˅i$L$CL$<$IL$<$t,<99u$Kxl$0DKyt$0\$4L$8|$%\$?ӉT$  T$L L$H t$Dl$@xO  |$D ʉ׃1t L$, fffu ׃t O! ډT$D$t؛tt$PfL$Td$Ptt$PfL$Td$P tt$PfL$T d$P|[^_]ËL$, t\$?\$ۉ\$ É\$L ‰T$H L$Dl$@G%HmcW T$ T$  T$T$;1t L$, fyfTfuT$tT$T$mL$ ʉ%Iށ1ۉсځ % D$ É $\$$t؛tt$PfL$Td$Ptt$PfL$Td$P tt$PfL$T d$P|[^_]ÍvL$, tDft1f^(D$D$(11D$f\$T$T$v ÁD$ O%I~ @d T$LL$, f"1D$1(D$v\$\$\$1 JL$, 1vfff([f?\$\$L=<)l$D$@1 09u؋|$M)D$@LD9u)؃T$@f@~1ۅËD$@ É\$D$Dڃ1T$111 ts1 ȃD$ @1ҿ111fށ!1D$1~녋D$bZfl$(D$vD$ L$)L$D@L$ ƽ)݅~pD$@T$TL$\$?\$ۉ\$  ˉ\$L ȉD$H ʉT$D<$ŃM   $ Љt$D$Pl$T\$XD$\1ƃt T$ fffu=ƃt3D$Pƍ(D$T9É\$X9D$\  $l$L$TD$P ‰T$Pt$X ȉD$Tt$\ ك<$L$ T$ D$$D$(% fD$(T$D$) ЈD$)l$ t؛tt$`fL$dd$`tt$`fL$dd$` tt$`fL$d d$`Č[^_]ËT$ ffD$\D$XD$TD$P(D$f9|$ zrD$P:fL$ uD$\D$XD$TD$PD$(1111  \$%`f\$XY$́L$ م $U   $ ЉD$Pl$T\$XD$\D$v|$ F>11v $D$\D$XD$TD$PT$ D$1ftWftGf D$\D$XD$TD$P$D$(l$ uD$\D$XD$TD$PD$$fD$\D$XD$TD$PT$ D$1f @sftE1 ͉l$TD$\ ЃD$P\$XD$L볋t$ L$L ىL$@\$L Ɖt$D $ ȉD$vD$ fzR| @)AA AAFU AA AAA  .text).data.bss\&.eh_frame___trunctfxf2.eh_frame/328 1350391525 0 0 100666 690 ` Lt .textXL 0`.data@0.bss0/4@ j@0@ / 1301111100 0 0 0 79624 ` <7L9<<?*?*AAD`D`GGIIL>L>NNQvQvTTVVYLYL[[^^a a ccfVfVhhkkn(n(ppsZsZuuxx{*{*}}``  vv66ttJJ  ||00xx$$pp00²²vv44͜͜^^88۬۬ތތ&&ppRR,,>>FF    zz**||!T!T$$&&)),n,n/$/$11447R7R::<<?d?dBBDDGhGhJJLLOOR*R*TTWWZRZR]]__bbe@e@ggjjmpmpp$p$rruuxrxr{"{"}}^^zz""NNXX00||ZZxx,,ʌʌ<<ҐҐPPڲڲdd$$JJ``  PP  TT  rrLL  !!$$'R'R*.*.,,//2z2z5D5D88::=~=~@@@@C C EEHxHxKBKBMMPPStStV&V&XX[[^Z^Za(a(ddffiiljljoBoBr r ttwwzNzN}"}"8888DDvv@@ZZʆʆ::ҼҼՒՒ..ݠݠjj22||00ll,,PP    VV..jj@@  ""%|%|(:(:++--003d3d6.6.88;;>l>lAACCFFInInL.L.NNQQTLTLW$W$YY\\_P_Pbbddg^g^jjlloXoXr8r8uuwwz|z|}$}$xxvv**88xx""ttTT..dd88ǒǒRRҦҦPPݨݨLL  VVFFVV..   ^ ^FFNN!!$$''*f*f-<-<//225r5r8282::==@:@:CCEEHnHnKKMMPPSSVNVNYY[[^^aadjdjg:g:jjlloorruLuLxxzz}\}\``  zz,,TTjj  ZZHH^^ƀƀBBΪΪPPִִjj  hh^^((DDJJ ~ ~  >>ff  ""%V%V''**-X-X00225x5x8P8P;;==@`@`BBEEHHK4K4MMPxPxSSUUXfXf[ [ ]]`N`Ncceehdhdkkmmpxpxssuuxvxv{({(}}||<<nnjjvv88BBLLll00ͤͤ||TT  ۚۚPP44TTZZ  TT    ::hh  "|"|%.%.''**-@-@//225~5~8L8L;;==@@CbCbF F HHKKNNQFQFTTVVYY\\__bTbTe*e*ggjjm\m\p(p(rru|u|x>x>zz}}**vvzz<<vvhh\\ZZPP``hh&&͈͈..~~00ݎݎ44@@JJxx<<    44LL""%L%L((((**--0V0V33558`8`;;==@@CbCbFFHHKKNtNtQQSSVVYfYf\\^^ajajd d ffiil4l4nnqqttwXwXz,z,||tt,,~~<<ll((FFVVrr**̊̊BBԾԾpp""߬߬PP\\>>ff   V V     ^ ^ , ,       z z "\ "\ %, %, ' ' * * -h -h 0T 0T 3 3 5 5 8 8 ;j ;j >4 >4 @ @ C C FX FX I I K K N N Qh Qh T< T< W W Y Y \ \ _ _ bV bV e e g g j j mv mv p, p, r r u u x x {t {t ~X ~X < < ` `   D D   f f   | | 2 2   v v @ @ X X Ȩ Ȩ ~ ~ < < Ӱ Ӱ X X ۶ ۶ ތ ތ b b   & & x x   \ \ 0 0   x x : :       N N ! ! # # &h &h )4 )4 , , . . 1 1 4\ 4\ 7 7 9 9 < < ? ? BD BD D D G G JL JL M M O O Rx Rx U8 U8 W W Z Z ]r ]r `6 `6 b b e e hN hN k k m m p p sb sb v v x x { { ~V ~V " " X X   > > h h * * ~ ~ 4 4 f f 0 0 È È D D   Ά Ά F F   ܪ ܪ h h   f f $ $ n n B B   l l * *     d d J J 0 0     \ \     !l !l $( $( & & )z )z ,Z ,Z / / 1 1 4 4 7| 7| :4 :4 < < ? ? B B EX EX H H J J Mp Mp P P R R Un Un X X Z Z ]l ]l `H `H c* c* f f h h kd kd n0 n0 p p s s v| v| yH yH { { ~ ~ ( ( 4 4 Z Z   B B   V V   j j   j j   z z 2 2 Ұ Ұ d d   ݚ ݚ p p $ $ ` ` . . J J   d d : : v v       t t L L $ $   " " % % (H (H * * - - 0: 0: 3 3 5 5 8 8 ; ; >( >( @ @ Cr Cr F. F. H H K K N N Q8 Q8 S S V V Y\ Y\ \ \ ^ ^ a a dJ dJ g g i i l l ol ol r, r, t t w w zl zl }. }.   l l . . R R   r r 0 0 d d   ^ ^   N N Ķ Ķ z z . . ϼ ϼ Ҁ Ҁ D D   ݮ ݮ h h 6 6 ~ ~ B B 2 2   \ \   4 4     ` `       "L "L $ $ ' ' *t *t -( -( / / 2 2 5Z 5Z 8$ 8$ : : = = @v @v C* C* E E H H Kr Kr N0 N0 Q Q S S Vf Vf Y& Y& [ [ ^ ^ a a d^ d^ g g i i l l oL oL r r t t w w z4 z4 | |   z z F F   n n $ $ 2 2 t t ( ( : :   X X x x < < Ɏ Ɏ L L Ѡ Ѡ H H ٤ ٤ V V ` `   ` ` . . P P pp   ` `  xx88  ##&&)T)T,,..1|1|40406699S_WriteConsoleInputVDMW@16__imp__WriteConsoleInputVDMW@16__head_libkernel32_a dchds01258.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %WriteConsoleInputVDMA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_WriteConsoleInputVDMA@16__imp__WriteConsoleInputVDMA@16__head_libkernel32_a dchds01257.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %WriteConsoleInputA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_WriteConsoleInputA@16__imp__WriteConsoleInputA@16__head_libkernel32_a dchds01256.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %WriteConsoleA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_WriteConsoleA@20__imp__WriteConsoleA@20__head_libkernel32_a dchds01255.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %Wow64SuspendThread .text.data.bss.idata$7.idata$5.idata$4.idata$66K_Wow64SuspendThread@4__imp__Wow64SuspendThread@4__head_libkernel32_a dchds01254.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %Wow64SetThreadContext .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_Wow64SetThreadContext@8__imp__Wow64SetThreadContext@8__head_libkernel32_a dchds01253.o/ 1301111099 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %Wow64RevertWow64FsRedirection .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_Wow64RevertWow64FsRedirection@4__imp__Wow64RevertWow64FsRedirection@4__head_libkernel32_a dchds01252.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %Wow64GetThreadSelectorEntry .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__Wow64GetThreadSelectorEntry@12__imp__Wow64GetThreadSelectorEntry@12__head_libkernel32_a dchds01251.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %Wow64GetThreadContext .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_Wow64GetThreadContext@8__imp__Wow64GetThreadContext@8__head_libkernel32_a dchds01250.o/ 1301111099 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %Wow64EnableWow64FsRedirection .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_Wow64EnableWow64FsRedirection@4__imp__Wow64EnableWow64FsRedirection@4__head_libkernel32_a dchds01249.o/ 1301111099 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %Wow64DisableWow64FsRedirection .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_Wow64DisableWow64FsRedirection@4__imp__Wow64DisableWow64FsRedirection@4__head_libkernel32_a dchds01248.o/ 1301111099 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %WinExec .text.data.bss.idata$7.idata$5.idata$4.idata$6 5_WinExec@8__imp__WinExec@8__head_libkernel32_a dchds01247.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %WideCharToMultiByte .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_WideCharToMultiByte@32__imp__WideCharToMultiByte@32__head_libkernel32_a dchds01246.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %WerpStringLookup .text.data.bss.idata$7.idata$5.idata$4.idata$62G_WerpStringLookup@8__imp__WerpStringLookup@8__head_libkernel32_a dchds01245.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %WerpNotifyUseStringResource .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_WerpNotifyUseStringResource@4__imp__WerpNotifyUseStringResource@4__head_libkernel32_a dchds01244.o/ 1301111099 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %WerpNotifyLoadStringResourceEx .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_WerpNotifyLoadStringResourceEx@20__imp__WerpNotifyLoadStringResourceEx@20__head_libkernel32_a dchds01243.o/ 1301111099 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %WerpNotifyLoadStringResource .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_WerpNotifyLoadStringResource@16__imp__WerpNotifyLoadStringResource@16__head_libkernel32_a dchds01242.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %WerpInitiateRemoteRecovery .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_WerpInitiateRemoteRecovery@4__imp__WerpInitiateRemoteRecovery@4__head_libkernel32_a dchds01241.o/ 1301111099 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %WerpCleanupMessageMapping .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_WerpCleanupMessageMapping@0__imp__WerpCleanupMessageMapping@0__head_libkernel32_a dchds01240.o/ 1301111099 0 0 100666 689 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %WerUnregisterRuntimeExceptionModule .text.data.bss.idata$7.idata$5.idata$4.idata$6+Xm_WerUnregisterRuntimeExceptionModule@8__imp__WerUnregisterRuntimeExceptionModule@8__head_libkernel32_a dchds01239.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %WerUnregisterMemoryBlock .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_WerUnregisterMemoryBlock@4__imp__WerUnregisterMemoryBlock@4__head_libkernel32_a dchds01238.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %WerUnregisterFile .text.data.bss.idata$7.idata$5.idata$4.idata$64I_WerUnregisterFile@4__imp__WerUnregisterFile@4__head_libkernel32_a dchds01237.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %WerSetFlags .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_WerSetFlags@4__imp__WerSetFlags@4__head_libkernel32_a dchds01236.o/ 1301111099 0 0 100666 681 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %WerRegisterRuntimeExceptionModule .text.data.bss.idata$7.idata$5.idata$4.idata$6)Ti_WerRegisterRuntimeExceptionModule@8__imp__WerRegisterRuntimeExceptionModule@8__head_libkernel32_a dchds01235.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %WerRegisterMemoryBlock .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_WerRegisterMemoryBlock@8__imp__WerRegisterMemoryBlock@8__head_libkernel32_a dchds01234.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %WerRegisterFile .text.data.bss.idata$7.idata$5.idata$4.idata$62G_WerRegisterFile@12__imp__WerRegisterFile@12__head_libkernel32_a dchds01233.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %WerGetFlags .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_WerGetFlags@8__imp__WerGetFlags@8__head_libkernel32_a dchds01232.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %WakeConditionVariable .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_WakeConditionVariable@4__imp__WakeConditionVariable@4__head_libkernel32_a dchds01231.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %WakeAllConditionVariable .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_WakeAllConditionVariable@4__imp__WakeAllConditionVariable@4__head_libkernel32_a dchds01230.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %WaitNamedPipeW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_WaitNamedPipeW@8__imp__WaitNamedPipeW@8__head_libkernel32_a dchds01229.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %WaitNamedPipeA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_WaitNamedPipeA@8__imp__WaitNamedPipeA@8__head_libkernel32_a dchds01228.o/ 1301111099 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %WaitForThreadpoolWorkCallbacks .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_WaitForThreadpoolWorkCallbacks@8__imp__WaitForThreadpoolWorkCallbacks@8__head_libkernel32_a dchds01227.o/ 1301111099 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %WaitForThreadpoolWaitCallbacks .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_WaitForThreadpoolWaitCallbacks@8__imp__WaitForThreadpoolWaitCallbacks@8__head_libkernel32_a dchds01226.o/ 1301111099 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %WaitForThreadpoolTimerCallbacks .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_WaitForThreadpoolTimerCallbacks@8__imp__WaitForThreadpoolTimerCallbacks@8__head_libkernel32_a dchds01225.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %WaitForThreadpoolIoCallbacks .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__WaitForThreadpoolIoCallbacks@8__imp__WaitForThreadpoolIoCallbacks@8__head_libkernel32_a dchds01224.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %WaitForSingleObjectEx .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_WaitForSingleObjectEx@12__imp__WaitForSingleObjectEx@12__head_libkernel32_a dchds01223.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %WaitForSingleObject .text.data.bss.idata$7.idata$5.idata$4.idata$68M_WaitForSingleObject@8__imp__WaitForSingleObject@8__head_libkernel32_a dchds01222.o/ 1301111099 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %WaitForMultipleObjectsEx .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_WaitForMultipleObjectsEx@20__imp__WaitForMultipleObjectsEx@20__head_libkernel32_a dchds01221.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %WaitForMultipleObjects .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_WaitForMultipleObjects@16__imp__WaitForMultipleObjects@16__head_libkernel32_a dchds01220.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %WaitForDebugEvent .text.data.bss.idata$7.idata$5.idata$4.idata$64I_WaitForDebugEvent@8__imp__WaitForDebugEvent@8__head_libkernel32_a dchds01219.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %WaitCommEvent .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_WaitCommEvent@12__imp__WaitCommEvent@12__head_libkernel32_a dchds01218.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %WTSGetActiveConsoleSessionId .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__WTSGetActiveConsoleSessionId@0__imp__WTSGetActiveConsoleSessionId@0__head_libkernel32_a dchds01217.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %VirtualUnlock .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_VirtualUnlock@8__imp__VirtualUnlock@8__head_libkernel32_a dchds01216.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %VirtualQueryEx .text.data.bss.idata$7.idata$5.idata$4.idata$60E_VirtualQueryEx@16__imp__VirtualQueryEx@16__head_libkernel32_a dchds01215.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %VirtualQuery .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_VirtualQuery@12__imp__VirtualQuery@12__head_libkernel32_a dchds01214.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %VirtualProtectEx .text.data.bss.idata$7.idata$5.idata$4.idata$64I_VirtualProtectEx@20__imp__VirtualProtectEx@20__head_libkernel32_a dchds01213.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %VirtualProtect .text.data.bss.idata$7.idata$5.idata$4.idata$60E_VirtualProtect@16__imp__VirtualProtect@16__head_libkernel32_a dchds01212.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %VirtualLock .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_VirtualLock@8__imp__VirtualLock@8__head_libkernel32_a dchds01211.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %VirtualFreeEx .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_VirtualFreeEx@16__imp__VirtualFreeEx@16__head_libkernel32_a dchds01210.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %VirtualFree .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_VirtualFree@12__imp__VirtualFree@12__head_libkernel32_a dchds01209.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VirtualAllocExNuma .text.data.bss.idata$7.idata$5.idata$4.idata$68M_VirtualAllocExNuma@24__imp__VirtualAllocExNuma@24__head_libkernel32_a dchds01208.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %VirtualAllocEx .text.data.bss.idata$7.idata$5.idata$4.idata$60E_VirtualAllocEx@20__imp__VirtualAllocEx@20__head_libkernel32_a dchds01207.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %VirtualAlloc .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_VirtualAlloc@16__imp__VirtualAlloc@16__head_libkernel32_a dchds01206.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VerifyVersionInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_VerifyVersionInfoW@16__imp__VerifyVersionInfoW@16__head_libkernel32_a dchds01205.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VerifyVersionInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_VerifyVersionInfoA@16__imp__VerifyVersionInfoA@16__head_libkernel32_a dchds01204.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %VerifyScripts .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_VerifyScripts@20__imp__VerifyScripts@20__head_libkernel32_a dchds01203.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VerifyConsoleIoHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_VerifyConsoleIoHandle@4__imp__VerifyConsoleIoHandle@4__head_libkernel32_a dchds01202.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VerSetConditionMask .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_VerSetConditionMask@16__imp__VerSetConditionMask@16__head_libkernel32_a dchds01201.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %VerLanguageNameW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_VerLanguageNameW@12__imp__VerLanguageNameW@12__head_libkernel32_a dchds01200.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %VerLanguageNameA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_VerLanguageNameA@12__imp__VerLanguageNameA@12__head_libkernel32_a dchds01199.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VDMOperationStarted .text.data.bss.idata$7.idata$5.idata$4.idata$68M_VDMOperationStarted@4__imp__VDMOperationStarted@4__head_libkernel32_a dchds01198.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VDMConsoleOperation .text.data.bss.idata$7.idata$5.idata$4.idata$68M_VDMConsoleOperation@8__imp__VDMConsoleOperation@8__head_libkernel32_a dchds01197.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %UpdateResourceW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_UpdateResourceW@24__imp__UpdateResourceW@24__head_libkernel32_a dchds01196.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %UpdateResourceA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_UpdateResourceA@24__imp__UpdateResourceA@24__head_libkernel32_a dchds01195.o/ 1301111099 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %UpdateProcThreadAttribute .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_UpdateProcThreadAttribute@28__imp__UpdateProcThreadAttribute@28__head_libkernel32_a dchds01194.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %UpdateCalendarDayOfWeek .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_UpdateCalendarDayOfWeek@4__imp__UpdateCalendarDayOfWeek@4__head_libkernel32_a dchds01193.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %UnregisterWaitEx .text.data.bss.idata$7.idata$5.idata$4.idata$62G_UnregisterWaitEx@8__imp__UnregisterWaitEx@8__head_libkernel32_a dchds01192.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %UnregisterWait .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_UnregisterWait@4__imp__UnregisterWait@4__head_libkernel32_a dchds01191.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %UnregisterConsoleIME .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_UnregisterConsoleIME@0__imp__UnregisterConsoleIME@0__head_libkernel32_a dchds01190.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %UnregisterApplicationRestart .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__UnregisterApplicationRestart@0__imp__UnregisterApplicationRestart@0__head_libkernel32_a dchds01189.o/ 1301111099 0 0 100666 693 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6(@ %UnregisterApplicationRecoveryCallback .text.data.bss.idata$7.idata$5.idata$4.idata$6-\q_UnregisterApplicationRecoveryCallback@0__imp__UnregisterApplicationRecoveryCallback@0__head_libkernel32_a dchds01188.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %UnmapViewOfFile .text.data.bss.idata$7.idata$5.idata$4.idata$60E_UnmapViewOfFile@4__imp__UnmapViewOfFile@4__head_libkernel32_a dchds01187.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %UnlockFileEx .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_UnlockFileEx@20__imp__UnlockFileEx@20__head_libkernel32_a dchds01186.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %UnlockFile .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_UnlockFile@20__imp__UnlockFile@20__head_libkernel32_a dchds01185.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %UnhandledExceptionFilter .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_UnhandledExceptionFilter@4__imp__UnhandledExceptionFilter@4__head_libkernel32_a dchds01184.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %UTUnRegister .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_UTUnRegister@4__imp__UTUnRegister@4__head_libkernel32_a dchds01183.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %UTRegister .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_UTRegister@28__imp__UTRegister@28__head_libkernel32_a dchds01182.o/ 1301111099 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %TzSpecificLocalTimeToSystemTime .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_TzSpecificLocalTimeToSystemTime@12__imp__TzSpecificLocalTimeToSystemTime@12__head_libkernel32_a dchds01181.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %TrySubmitThreadpoolCallback .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__TrySubmitThreadpoolCallback@12__imp__TrySubmitThreadpoolCallback@12__head_libkernel32_a dchds01180.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %TryEnterCriticalSection .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_TryEnterCriticalSection@4__imp__TryEnterCriticalSection@4__head_libkernel32_a dchds01179.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %TryAcquireSRWLockShared .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_TryAcquireSRWLockShared@4__imp__TryAcquireSRWLockShared@4__head_libkernel32_a dchds01178.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %TryAcquireSRWLockExclusive .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_TryAcquireSRWLockExclusive@4__imp__TryAcquireSRWLockExclusive@4__head_libkernel32_a dchds01177.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %TransmitCommChar .text.data.bss.idata$7.idata$5.idata$4.idata$62G_TransmitCommChar@8__imp__TransmitCommChar@8__head_libkernel32_a dchds01176.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %TransactNamedPipe .text.data.bss.idata$7.idata$5.idata$4.idata$66K_TransactNamedPipe@28__imp__TransactNamedPipe@28__head_libkernel32_a dchds01175.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %Toolhelp32ReadProcessMemory .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__Toolhelp32ReadProcessMemory@20__imp__Toolhelp32ReadProcessMemory@20__head_libkernel32_a dchds01174.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %TlsSetValue .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_TlsSetValue@8__imp__TlsSetValue@8__head_libkernel32_a dchds01173.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %TlsGetValue .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_TlsGetValue@4__imp__TlsGetValue@4__head_libkernel32_a dchds01172.o/ 1301111099 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %TlsFree .text.data.bss.idata$7.idata$5.idata$4.idata$6 5_TlsFree@4__imp__TlsFree@4__head_libkernel32_a dchds01171.o/ 1301111099 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %TlsAlloc .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_TlsAlloc@0__imp__TlsAlloc@0__head_libkernel32_a dchds01170.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %Thread32Next .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_Thread32Next@8__imp__Thread32Next@8__head_libkernel32_a dchds01169.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %Thread32First .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_Thread32First@8__imp__Thread32First@8__head_libkernel32_a dchds01168.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %TermsrvAppInstallMode .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_TermsrvAppInstallMode@0__imp__TermsrvAppInstallMode@0__head_libkernel32_a dchds01167.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %TerminateThread .text.data.bss.idata$7.idata$5.idata$4.idata$60E_TerminateThread@8__imp__TerminateThread@8__head_libkernel32_a dchds01166.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %TerminateProcess .text.data.bss.idata$7.idata$5.idata$4.idata$62G_TerminateProcess@8__imp__TerminateProcess@8__head_libkernel32_a dchds01165.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %TerminateJobObject .text.data.bss.idata$7.idata$5.idata$4.idata$66K_TerminateJobObject@8__imp__TerminateJobObject@8__head_libkernel32_a dchds01164.o/ 1301111099 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %SystemTimeToTzSpecificLocalTime .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_SystemTimeToTzSpecificLocalTime@12__imp__SystemTimeToTzSpecificLocalTime@12__head_libkernel32_a dchds01163.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SystemTimeToFileTime .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_SystemTimeToFileTime@8__imp__SystemTimeToFileTime@8__head_libkernel32_a dchds01162.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SwitchToThread .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_SwitchToThread@0__imp__SwitchToThread@0__head_libkernel32_a dchds01161.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SwitchToFiber .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_SwitchToFiber@4__imp__SwitchToFiber@4__head_libkernel32_a dchds01160.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SuspendThread .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_SuspendThread@4__imp__SuspendThread@4__head_libkernel32_a dchds01159.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SubmitThreadpoolWork .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_SubmitThreadpoolWork@4__imp__SubmitThreadpoolWork@4__head_libkernel32_a dchds01158.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %StartThreadpoolIo .text.data.bss.idata$7.idata$5.idata$4.idata$64I_StartThreadpoolIo@4__imp__StartThreadpoolIo@4__head_libkernel32_a dchds01157.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SortGetHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_SortGetHandle@12__imp__SortGetHandle@12__head_libkernel32_a dchds01156.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SortCloseHandle .text.data.bss.idata$7.idata$5.idata$4.idata$60E_SortCloseHandle@4__imp__SortCloseHandle@4__head_libkernel32_a dchds01155.o/ 1301111099 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %SleepEx .text.data.bss.idata$7.idata$5.idata$4.idata$6 5_SleepEx@8__imp__SleepEx@8__head_libkernel32_a dchds01154.o/ 1301111099 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SleepConditionVariableSRW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_SleepConditionVariableSRW@16__imp__SleepConditionVariableSRW@16__head_libkernel32_a dchds01153.o/ 1301111099 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SleepConditionVariableCS .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_SleepConditionVariableCS@12__imp__SleepConditionVariableCS@12__head_libkernel32_a dchds01152.o/ 1301111099 0 0 100666 588 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Sleep .text.data.bss.idata$7.idata$5.idata$4.idata$6_Sleep@4(__imp__Sleep@4__head_libkernel32_adchds01151.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SizeofResource .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_SizeofResource@8__imp__SizeofResource@8__head_libkernel32_a dchds01150.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %~SignalObjectAndWait .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_SignalObjectAndWait@16__imp__SignalObjectAndWait@16__head_libkernel32_a dchds01149.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %}ShowConsoleCursor .text.data.bss.idata$7.idata$5.idata$4.idata$64I_ShowConsoleCursor@8__imp__ShowConsoleCursor@8__head_libkernel32_a dchds01148.o/ 1301111099 0 0 100666 611 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %|SetupComm .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_SetupComm@12__imp__SetupComm@12__head_libkernel32_a dchds01147.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %{SetWaitableTimer .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetWaitableTimer@24__imp__SetWaitableTimer@24__head_libkernel32_a dchds01146.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %zSetVolumeMountPointW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_SetVolumeMountPointW@8__imp__SetVolumeMountPointW@8__head_libkernel32_a dchds01145.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ySetVolumeMountPointA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_SetVolumeMountPointA@8__imp__SetVolumeMountPointA@8__head_libkernel32_a dchds01144.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %xSetVolumeLabelW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_SetVolumeLabelW@8__imp__SetVolumeLabelW@8__head_libkernel32_a dchds01143.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %wSetVolumeLabelA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_SetVolumeLabelA@8__imp__SetVolumeLabelA@8__head_libkernel32_a dchds01142.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %vSetVDMCurrentDirectories .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetVDMCurrentDirectories@8__imp__SetVDMCurrentDirectories@8__head_libkernel32_a dchds01141.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %uSetUserGeoID .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SetUserGeoID@4__imp__SetUserGeoID@4__head_libkernel32_a dchds01140.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %tSetUnhandledExceptionFilter .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_SetUnhandledExceptionFilter@4__imp__SetUnhandledExceptionFilter@4__head_libkernel32_a dchds01139.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %sSetTimerQueueTimer .text.data.bss.idata$7.idata$5.idata$4.idata$68M_SetTimerQueueTimer@24__imp__SetTimerQueueTimer@24__head_libkernel32_a dchds01138.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %rSetTimeZoneInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetTimeZoneInformation@4__imp__SetTimeZoneInformation@4__head_libkernel32_a dchds01137.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %qSetThreadpoolWait .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SetThreadpoolWait@12__imp__SetThreadpoolWait@12__head_libkernel32_a dchds01136.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %pSetThreadpoolTimer .text.data.bss.idata$7.idata$5.idata$4.idata$68M_SetThreadpoolTimer@16__imp__SetThreadpoolTimer@16__head_libkernel32_a dchds01135.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %oSetThreadpoolThreadMinimum .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_SetThreadpoolThreadMinimum@8__imp__SetThreadpoolThreadMinimum@8__head_libkernel32_a dchds01134.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %nSetThreadpoolThreadMaximum .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_SetThreadpoolThreadMaximum@8__imp__SetThreadpoolThreadMaximum@8__head_libkernel32_a dchds01133.o/ 1301111099 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %mSetThreadpoolStackInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_SetThreadpoolStackInformation@8__imp__SetThreadpoolStackInformation@8__head_libkernel32_a dchds01132.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %lSetThreadUILanguage .text.data.bss.idata$7.idata$5.idata$4.idata$68M_SetThreadUILanguage@4__imp__SetThreadUILanguage@4__head_libkernel32_a dchds01131.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %kSetThreadStackGuarantee .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetThreadStackGuarantee@4__imp__SetThreadStackGuarantee@4__head_libkernel32_a dchds01130.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %jSetThreadPriorityBoost .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetThreadPriorityBoost@8__imp__SetThreadPriorityBoost@8__head_libkernel32_a dchds01129.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %iSetThreadPriority .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetThreadPriority@8__imp__SetThreadPriority@8__head_libkernel32_a dchds01128.o/ 1301111099 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %hSetThreadPreferredUILanguages .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_SetThreadPreferredUILanguages@12__imp__SetThreadPreferredUILanguages@12__head_libkernel32_a dchds01127.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %gSetThreadLocale .text.data.bss.idata$7.idata$5.idata$4.idata$60E_SetThreadLocale@4__imp__SetThreadLocale@4__head_libkernel32_a dchds01126.o/ 1301111099 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %fSetThreadIdealProcessorEx .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_SetThreadIdealProcessorEx@12__imp__SetThreadIdealProcessorEx@12__head_libkernel32_a dchds01125.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %eSetThreadIdealProcessor .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetThreadIdealProcessor@8__imp__SetThreadIdealProcessor@8__head_libkernel32_a dchds01124.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %dSetThreadGroupAffinity .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetThreadGroupAffinity@12__imp__SetThreadGroupAffinity@12__head_libkernel32_a dchds01123.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %cSetThreadExecutionState .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetThreadExecutionState@4__imp__SetThreadExecutionState@4__head_libkernel32_a dchds01122.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %bSetThreadErrorMode .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SetThreadErrorMode@8__imp__SetThreadErrorMode@8__head_libkernel32_a dchds01121.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %aSetThreadContext .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetThreadContext@8__imp__SetThreadContext@8__head_libkernel32_a dchds01120.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %`SetThreadAffinityMask .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_SetThreadAffinityMask@8__imp__SetThreadAffinityMask@8__head_libkernel32_a dchds01119.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %_SetTermsrvAppInstallMode .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetTermsrvAppInstallMode@4__imp__SetTermsrvAppInstallMode@4__head_libkernel32_a dchds01118.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %^SetTapePosition .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetTapePosition@24__imp__SetTapePosition@24__head_libkernel32_a dchds01117.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %]SetTapeParameters .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SetTapeParameters@12__imp__SetTapeParameters@12__head_libkernel32_a dchds01116.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %\SetSystemTimeAdjustment .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetSystemTimeAdjustment@8__imp__SetSystemTimeAdjustment@8__head_libkernel32_a dchds01115.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %[SetSystemTime .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_SetSystemTime@4__imp__SetSystemTime@4__head_libkernel32_a dchds01114.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ZSetSystemPowerState .text.data.bss.idata$7.idata$5.idata$4.idata$68M_SetSystemPowerState@8__imp__SetSystemPowerState@8__head_libkernel32_a dchds01113.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %YSetSystemFileCacheSize .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetSystemFileCacheSize@12__imp__SetSystemFileCacheSize@12__head_libkernel32_a dchds01112.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %XSetStdHandleEx .text.data.bss.idata$7.idata$5.idata$4.idata$60E_SetStdHandleEx@12__imp__SetStdHandleEx@12__head_libkernel32_a dchds01111.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %WSetStdHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SetStdHandle@8__imp__SetStdHandle@8__head_libkernel32_a dchds01110.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %VSetSearchPathMode .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetSearchPathMode@4__imp__SetSearchPathMode@4__head_libkernel32_a dchds01109.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %USetProcessWorkingSetSizeEx .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_SetProcessWorkingSetSizeEx@16__imp__SetProcessWorkingSetSizeEx@16__head_libkernel32_a dchds01108.o/ 1301111099 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %TSetProcessWorkingSetSize .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_SetProcessWorkingSetSize@12__imp__SetProcessWorkingSetSize@12__head_libkernel32_a dchds01107.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %SSetProcessShutdownParameters .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__SetProcessShutdownParameters@8__imp__SetProcessShutdownParameters@8__head_libkernel32_a dchds01106.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RSetProcessPriorityBoost .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetProcessPriorityBoost@8__imp__SetProcessPriorityBoost@8__head_libkernel32_a dchds01105.o/ 1301111099 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %QSetProcessPreferredUILanguages .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_SetProcessPreferredUILanguages@12__imp__SetProcessPreferredUILanguages@12__head_libkernel32_a dchds01104.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %PSetProcessDEPPolicy .text.data.bss.idata$7.idata$5.idata$4.idata$68M_SetProcessDEPPolicy@4__imp__SetProcessDEPPolicy@4__head_libkernel32_a dchds01103.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %OSetProcessAffinityUpdateMode .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__SetProcessAffinityUpdateMode@8__imp__SetProcessAffinityUpdateMode@8__head_libkernel32_a dchds01102.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %NSetProcessAffinityMask .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetProcessAffinityMask@8__imp__SetProcessAffinityMask@8__head_libkernel32_a dchds01101.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MSetPriorityClass .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetPriorityClass@8__imp__SetPriorityClass@8__head_libkernel32_a dchds01100.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %LSetNamedPipeHandleState .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetNamedPipeHandleState@16__imp__SetNamedPipeHandleState@16__head_libkernel32_a dchds01099.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %KSetNamedPipeAttribute .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetNamedPipeAttribute@20__imp__SetNamedPipeAttribute@20__head_libkernel32_a dchds01098.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %JSetMessageWaitingIndicator .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_SetMessageWaitingIndicator@8__imp__SetMessageWaitingIndicator@8__head_libkernel32_a dchds01097.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ISetMailslotInfo .text.data.bss.idata$7.idata$5.idata$4.idata$60E_SetMailslotInfo@8__imp__SetMailslotInfo@8__head_libkernel32_a dchds01096.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %HSetLocaleInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_SetLocaleInfoW@12__imp__SetLocaleInfoW@12__head_libkernel32_a dchds01095.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GSetLocaleInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_SetLocaleInfoA@12__imp__SetLocaleInfoA@12__head_libkernel32_a dchds01094.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FSetLocalTime .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SetLocalTime@4__imp__SetLocalTime@4__head_libkernel32_a dchds01093.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %ESetLocalPrimaryComputerNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__SetLocalPrimaryComputerNameW@8__imp__SetLocalPrimaryComputerNameW@8__head_libkernel32_a dchds01092.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %DSetLocalPrimaryComputerNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__SetLocalPrimaryComputerNameA@8__imp__SetLocalPrimaryComputerNameA@8__head_libkernel32_a dchds01091.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CSetLastError .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SetLastError@4__imp__SetLastError@4__head_libkernel32_a dchds01090.o/ 1301111099 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BSetLastConsoleEventActive .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_SetLastConsoleEventActive@0__imp__SetLastConsoleEventActive@0__head_libkernel32_a dchds01089.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ASetInformationJobObject .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetInformationJobObject@16__imp__SetInformationJobObject@16__head_libkernel32_a dchds01088.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %@SetHandleInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_SetHandleInformation@12__imp__SetHandleInformation@12__head_libkernel32_a dchds01087.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %?SetHandleCount .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_SetHandleCount@4__imp__SetHandleCount@4__head_libkernel32_a dchds01086.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %>SetHandleContext .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetHandleContext@8__imp__SetHandleContext@8__head_libkernel32_a dchds01085.o/ 1301111099 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %=SetFirmwareEnvironmentVariableW .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_SetFirmwareEnvironmentVariableW@16__imp__SetFirmwareEnvironmentVariableW@16__head_libkernel32_a dchds01084.o/ 1301111099 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %<SetFirmwareEnvironmentVariableA .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_SetFirmwareEnvironmentVariableA@16__imp__SetFirmwareEnvironmentVariableA@16__head_libkernel32_a dchds01083.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %;SetFileValidData .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetFileValidData@12__imp__SetFileValidData@12__head_libkernel32_a dchds01082.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %:SetFileTime .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SetFileTime@16__imp__SetFileTime@16__head_libkernel32_a dchds01081.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %9SetFileShortNameW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetFileShortNameW@8__imp__SetFileShortNameW@8__head_libkernel32_a dchds01080.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %8SetFileShortNameA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetFileShortNameA@8__imp__SetFileShortNameA@8__head_libkernel32_a dchds01079.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %7SetFilePointerEx .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetFilePointerEx@20__imp__SetFilePointerEx@20__head_libkernel32_a dchds01078.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %6SetFilePointer .text.data.bss.idata$7.idata$5.idata$4.idata$60E_SetFilePointer@16__imp__SetFilePointer@16__head_libkernel32_a dchds01077.o/ 1301111099 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %5SetFileIoOverlappedRange .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_SetFileIoOverlappedRange@12__imp__SetFileIoOverlappedRange@12__head_libkernel32_a dchds01076.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %4SetFileInformationByHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_SetFileInformationByHandle@16__imp__SetFileInformationByHandle@16__head_libkernel32_a dchds01075.o/ 1301111099 0 0 100666 687 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %3SetFileCompletionNotificationModes .text.data.bss.idata$7.idata$5.idata$4.idata$6*Vk_SetFileCompletionNotificationModes@8__imp__SetFileCompletionNotificationModes@8__head_libkernel32_a dchds01074.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %2SetFileBandwidthReservation .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__SetFileBandwidthReservation@24__imp__SetFileBandwidthReservation@24__head_libkernel32_a dchds01073.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %1SetFileAttributesW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SetFileAttributesW@8__imp__SetFileAttributesW@8__head_libkernel32_a dchds01072.o/ 1301111099 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %0SetFileAttributesTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_SetFileAttributesTransactedW@12__imp__SetFileAttributesTransactedW@12__head_libkernel32_a dchds01071.o/ 1301111099 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %/SetFileAttributesTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_SetFileAttributesTransactedA@12__imp__SetFileAttributesTransactedA@12__head_libkernel32_a dchds01070.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %.SetFileAttributesA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SetFileAttributesA@8__imp__SetFileAttributesA@8__head_libkernel32_a dchds01069.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %-SetFileApisToOEM .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetFileApisToOEM@0__imp__SetFileApisToOEM@0__head_libkernel32_a dchds01068.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %,SetFileApisToANSI .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetFileApisToANSI@0__imp__SetFileApisToANSI@0__head_libkernel32_a dchds01067.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %+SetExtendedFeaturesMask .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetExtendedFeaturesMask@12__imp__SetExtendedFeaturesMask@12__head_libkernel32_a dchds01066.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %*SetEventWhenCallbackReturns .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_SetEventWhenCallbackReturns@8__imp__SetEventWhenCallbackReturns@8__head_libkernel32_a dchds01065.o/ 1301111099 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %)SetEvent .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_SetEvent@4__imp__SetEvent@4__head_libkernel32_a dchds01064.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %(SetErrorMode .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SetErrorMode@4__imp__SetErrorMode@4__head_libkernel32_a dchds01063.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %'SetEnvironmentVariableW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetEnvironmentVariableW@8__imp__SetEnvironmentVariableW@8__head_libkernel32_a dchds01062.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %&SetEnvironmentVariableA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetEnvironmentVariableA@8__imp__SetEnvironmentVariableA@8__head_libkernel32_a dchds01061.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %%SetEnvironmentStringsW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetEnvironmentStringsW@4__imp__SetEnvironmentStringsW@4__head_libkernel32_a dchds01060.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %$SetEnvironmentStringsA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetEnvironmentStringsA@4__imp__SetEnvironmentStringsA@4__head_libkernel32_a dchds01059.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %#SetEndOfFile .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SetEndOfFile@4__imp__SetEndOfFile@4__head_libkernel32_a dchds01058.o/ 1301111099 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %"SetDynamicTimeZoneInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_SetDynamicTimeZoneInformation@4__imp__SetDynamicTimeZoneInformation@4__head_libkernel32_a dchds01057.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %!SetDllDirectoryW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetDllDirectoryW@4__imp__SetDllDirectoryW@4__head_libkernel32_a dchds01056.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % SetDllDirectoryA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetDllDirectoryA@4__imp__SetDllDirectoryA@4__head_libkernel32_a dchds01055.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetDefaultCommConfigW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetDefaultCommConfigW@12__imp__SetDefaultCommConfigW@12__head_libkernel32_a dchds01054.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetDefaultCommConfigA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetDefaultCommConfigA@12__imp__SetDefaultCommConfigA@12__head_libkernel32_a dchds01053.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetCurrentDirectoryW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_SetCurrentDirectoryW@4__imp__SetCurrentDirectoryW@4__head_libkernel32_a dchds01052.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetCurrentDirectoryA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_SetCurrentDirectoryA@4__imp__SetCurrentDirectoryA@4__head_libkernel32_a dchds01051.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetCurrentConsoleFontEx .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetCurrentConsoleFontEx@12__imp__SetCurrentConsoleFontEx@12__head_libkernel32_a dchds01050.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %SetCriticalSectionSpinCount .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_SetCriticalSectionSpinCount@8__imp__SetCriticalSectionSpinCount@8__head_libkernel32_a dchds01049.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetConsoleWindowInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_SetConsoleWindowInfo@12__imp__SetConsoleWindowInfo@12__head_libkernel32_a dchds01048.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetConsoleTitleW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetConsoleTitleW@4__imp__SetConsoleTitleW@4__head_libkernel32_a dchds01047.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetConsoleTitleA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetConsoleTitleA@4__imp__SetConsoleTitleA@4__head_libkernel32_a dchds01046.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetConsoleTextAttribute .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetConsoleTextAttribute@8__imp__SetConsoleTextAttribute@8__head_libkernel32_a dchds01045.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %SetConsoleScreenBufferSize .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_SetConsoleScreenBufferSize@8__imp__SetConsoleScreenBufferSize@8__head_libkernel32_a dchds01044.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %SetConsoleScreenBufferInfoEx .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__SetConsoleScreenBufferInfoEx@8__imp__SetConsoleScreenBufferInfoEx@8__head_libkernel32_a dchds01043.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetConsolePalette .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SetConsolePalette@12__imp__SetConsolePalette@12__head_libkernel32_a dchds01042.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetConsoleOutputCP .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SetConsoleOutputCP@4__imp__SetConsoleOutputCP@4__head_libkernel32_a dchds01041.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetConsoleOS2OemFormat .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetConsoleOS2OemFormat@4__imp__SetConsoleOS2OemFormat@4__head_libkernel32_a dchds01040.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %SetConsoleNumberOfCommandsW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_SetConsoleNumberOfCommandsW@8__imp__SetConsoleNumberOfCommandsW@8__head_libkernel32_a dchds01039.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %SetConsoleNumberOfCommandsA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_SetConsoleNumberOfCommandsA@8__imp__SetConsoleNumberOfCommandsA@8__head_libkernel32_a dchds01038.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetConsoleNlsMode .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetConsoleNlsMode@8__imp__SetConsoleNlsMode@8__head_libkernel32_a dchds01037.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % SetConsoleMode .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_SetConsoleMode@8__imp__SetConsoleMode@8__head_libkernel32_a dchds01036.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ % SetConsoleMenuClose .text.data.bss.idata$7.idata$5.idata$4.idata$68M_SetConsoleMenuClose@4__imp__SetConsoleMenuClose@4__head_libkernel32_a dchds01035.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ % SetConsoleMaximumWindowSize .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_SetConsoleMaximumWindowSize@8__imp__SetConsoleMaximumWindowSize@8__head_libkernel32_a dchds01034.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ % SetConsoleLocalEUDC .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_SetConsoleLocalEUDC@16__imp__SetConsoleLocalEUDC@16__head_libkernel32_a dchds01033.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ % SetConsoleKeyShortcuts .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetConsoleKeyShortcuts@16__imp__SetConsoleKeyShortcuts@16__head_libkernel32_a dchds01032.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetConsoleInputExeNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetConsoleInputExeNameW@4__imp__SetConsoleInputExeNameW@4__head_libkernel32_a dchds01031.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetConsoleInputExeNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_SetConsoleInputExeNameA@4__imp__SetConsoleInputExeNameA@4__head_libkernel32_a dchds01030.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetConsoleIcon .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_SetConsoleIcon@4__imp__SetConsoleIcon@4__head_libkernel32_a dchds01029.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetConsoleHistoryInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_SetConsoleHistoryInfo@4__imp__SetConsoleHistoryInfo@4__head_libkernel32_a dchds01028.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetConsoleHardwareState .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetConsoleHardwareState@12__imp__SetConsoleHardwareState@12__head_libkernel32_a dchds01027.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetConsoleFont .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_SetConsoleFont@8__imp__SetConsoleFont@8__head_libkernel32_a dchds01026.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetConsoleDisplayMode .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_SetConsoleDisplayMode@12__imp__SetConsoleDisplayMode@12__head_libkernel32_a dchds01025.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SetConsoleCursorPosition .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_SetConsoleCursorPosition@8__imp__SetConsoleCursorPosition@8__head_libkernel32_a dchds01024.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetConsoleCursorMode .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_SetConsoleCursorMode@12__imp__SetConsoleCursorMode@12__head_libkernel32_a dchds01023.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetConsoleCursorInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_SetConsoleCursorInfo@8__imp__SetConsoleCursorInfo@8__head_libkernel32_a dchds01022.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetConsoleCursor .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetConsoleCursor@8__imp__SetConsoleCursor@8__head_libkernel32_a dchds01021.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetConsoleCtrlHandler .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_SetConsoleCtrlHandler@8__imp__SetConsoleCtrlHandler@8__head_libkernel32_a dchds01020.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SetConsoleCP .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SetConsoleCP@4__imp__SetConsoleCP@4__head_libkernel32_a dchds01019.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %SetConsoleActiveScreenBuffer .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__SetConsoleActiveScreenBuffer@4__imp__SetConsoleActiveScreenBuffer@4__head_libkernel32_a dchds01018.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetComputerNameW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetComputerNameW@4__imp__SetComputerNameW@4__head_libkernel32_a dchds01017.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetComputerNameExW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SetComputerNameExW@8__imp__SetComputerNameExW@8__head_libkernel32_a dchds01016.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetComputerNameExA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_SetComputerNameExA@8__imp__SetComputerNameExA@8__head_libkernel32_a dchds01015.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetComputerNameA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_SetComputerNameA@4__imp__SetComputerNameA@4__head_libkernel32_a dchds01014.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetCommTimeouts .text.data.bss.idata$7.idata$5.idata$4.idata$60E_SetCommTimeouts@8__imp__SetCommTimeouts@8__head_libkernel32_a dchds01013.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SetCommState .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SetCommState@8__imp__SetCommState@8__head_libkernel32_a dchds01012.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SetCommMask .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_SetCommMask@8__imp__SetCommMask@8__head_libkernel32_a dchds01011.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SetCommConfig .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_SetCommConfig@12__imp__SetCommConfig@12__head_libkernel32_a dchds01010.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SetCommBreak .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SetCommBreak@4__imp__SetCommBreak@4__head_libkernel32_a dchds01009.o/ 1301111099 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %SetComPlusPackageInstallStatus .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_SetComPlusPackageInstallStatus@4__imp__SetComPlusPackageInstallStatus@4__head_libkernel32_a dchds01008.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %SetClientTimeZoneInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__SetClientTimeZoneInformation@4__imp__SetClientTimeZoneInformation@4__head_libkernel32_a dchds01007.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetCalendarInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetCalendarInfoW@16__imp__SetCalendarInfoW@16__head_libkernel32_a dchds01006.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetCalendarInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_SetCalendarInfoA@16__imp__SetCalendarInfoA@16__head_libkernel32_a dchds01005.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SearchPathW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SearchPathW@24__imp__SearchPathW@24__head_libkernel32_a dchds01004.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SearchPathA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_SearchPathA@24__imp__SearchPathA@24__head_libkernel32_a dchds01003.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %ScrollConsoleScreenBufferW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_ScrollConsoleScreenBufferW@20__imp__ScrollConsoleScreenBufferW@20__head_libkernel32_a dchds01002.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %ScrollConsoleScreenBufferA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_ScrollConsoleScreenBufferA@20__imp__ScrollConsoleScreenBufferA@20__head_libkernel32_a dchds01001.o/ 1301111099 0 0 100666 611 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %RtlUnwind .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_RtlUnwind@16__imp__RtlUnwind@16__head_libkernel32_a dchds01000.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RtlCaptureContext .text.data.bss.idata$7.idata$5.idata$4.idata$64I_RtlCaptureContext@4__imp__RtlCaptureContext@4__head_libkernel32_a dchds00999.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ResumeThread .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_ResumeThread@4__imp__ResumeThread@4__head_libkernel32_a dchds00998.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RestoreLastError .text.data.bss.idata$7.idata$5.idata$4.idata$62G_RestoreLastError@4__imp__RestoreLastError@4__head_libkernel32_a dchds00997.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ResolveLocaleName .text.data.bss.idata$7.idata$5.idata$4.idata$66K_ResolveLocaleName@12__imp__ResolveLocaleName@12__head_libkernel32_a dchds00996.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ResetWriteWatch .text.data.bss.idata$7.idata$5.idata$4.idata$60E_ResetWriteWatch@8__imp__ResetWriteWatch@8__head_libkernel32_a dchds00995.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ResetEvent .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_ResetEvent@4__imp__ResetEvent@4__head_libkernel32_a dchds00994.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RequestWakeupLatency .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_RequestWakeupLatency@4__imp__RequestWakeupLatency@4__head_libkernel32_a dchds00993.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RequestDeviceWakeup .text.data.bss.idata$7.idata$5.idata$4.idata$68M_RequestDeviceWakeup@4__imp__RequestDeviceWakeup@4__head_libkernel32_a dchds00992.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ReplacePartitionUnit .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_ReplacePartitionUnit@12__imp__ReplacePartitionUnit@12__head_libkernel32_a dchds00991.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReplaceFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_ReplaceFileW@24__imp__ReplaceFileW@24__head_libkernel32_a dchds00990.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReplaceFileA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_ReplaceFileA@24__imp__ReplaceFileA@24__head_libkernel32_a dchds00989.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReplaceFile .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_ReplaceFile@24__imp__ReplaceFile@24__head_libkernel32_a dchds00988.o/ 1301111099 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %RemoveVectoredExceptionHandler .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_RemoveVectoredExceptionHandler@4__imp__RemoveVectoredExceptionHandler@4__head_libkernel32_a dchds00987.o/ 1301111099 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %RemoveVectoredContinueHandler .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_RemoveVectoredContinueHandler@4__imp__RemoveVectoredContinueHandler@4__head_libkernel32_a dchds00986.o/ 1301111099 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %RemoveSecureMemoryCacheCallback .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_RemoveSecureMemoryCacheCallback@4__imp__RemoveSecureMemoryCacheCallback@4__head_libkernel32_a dchds00985.o/ 1301111099 0 0 100666 681 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %RemoveLocalAlternateComputerNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6)Ti_RemoveLocalAlternateComputerNameW@8__imp__RemoveLocalAlternateComputerNameW@8__head_libkernel32_a dchds00984.o/ 1301111099 0 0 100666 681 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %RemoveLocalAlternateComputerNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6)Ti_RemoveLocalAlternateComputerNameA@8__imp__RemoveLocalAlternateComputerNameA@8__head_libkernel32_a dchds00983.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RemoveDirectoryW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_RemoveDirectoryW@4__imp__RemoveDirectoryW@4__head_libkernel32_a dchds00982.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %RemoveDirectoryTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_RemoveDirectoryTransactedW@8__imp__RemoveDirectoryTransactedW@8__head_libkernel32_a dchds00981.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %RemoveDirectoryTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_RemoveDirectoryTransactedA@8__imp__RemoveDirectoryTransactedA@8__head_libkernel32_a dchds00980.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RemoveDirectoryA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_RemoveDirectoryA@4__imp__RemoveDirectoryA@4__head_libkernel32_a dchds00979.o/ 1301111099 0 0 100666 691 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %ReleaseSemaphoreWhenCallbackReturns .text.data.bss.idata$7.idata$5.idata$4.idata$6,Zo_ReleaseSemaphoreWhenCallbackReturns@12__imp__ReleaseSemaphoreWhenCallbackReturns@12__head_libkernel32_a dchds00978.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ReleaseSemaphore .text.data.bss.idata$7.idata$5.idata$4.idata$64I_ReleaseSemaphore@12__imp__ReleaseSemaphore@12__head_libkernel32_a dchds00977.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ReleaseSRWLockShared .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_ReleaseSRWLockShared@4__imp__ReleaseSRWLockShared@4__head_libkernel32_a dchds00976.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ReleaseSRWLockExclusive .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_ReleaseSRWLockExclusive@4__imp__ReleaseSRWLockExclusive@4__head_libkernel32_a dchds00975.o/ 1301111099 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %ReleaseMutexWhenCallbackReturns .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_ReleaseMutexWhenCallbackReturns@8__imp__ReleaseMutexWhenCallbackReturns@8__head_libkernel32_a dchds00974.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReleaseMutex .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_ReleaseMutex@4__imp__ReleaseMutex@4__head_libkernel32_a dchds00973.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReleaseActCtx .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_ReleaseActCtx@4__imp__ReleaseActCtx@4__head_libkernel32_a dchds00972.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegisterWowExec .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RegisterWowExec@4__imp__RegisterWowExec@4__head_libkernel32_a dchds00971.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegisterWowBaseHandlers .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_RegisterWowBaseHandlers@4__imp__RegisterWowBaseHandlers@4__head_libkernel32_a dchds00970.o/ 1301111099 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %RegisterWaitForSingleObjectEx .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_RegisterWaitForSingleObjectEx@20__imp__RegisterWaitForSingleObjectEx@20__head_libkernel32_a dchds00969.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %RegisterWaitForSingleObject .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__RegisterWaitForSingleObject@24__imp__RegisterWaitForSingleObject@24__head_libkernel32_a dchds00968.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegisterWaitForInputIdle .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_RegisterWaitForInputIdle@4__imp__RegisterWaitForInputIdle@4__head_libkernel32_a dchds00967.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegisterConsoleVDM .text.data.bss.idata$7.idata$5.idata$4.idata$68M_RegisterConsoleVDM@36__imp__RegisterConsoleVDM@36__head_libkernel32_a dchds00966.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegisterConsoleOS2 .text.data.bss.idata$7.idata$5.idata$4.idata$66K_RegisterConsoleOS2@4__imp__RegisterConsoleOS2@4__head_libkernel32_a dchds00965.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegisterConsoleIME .text.data.bss.idata$7.idata$5.idata$4.idata$66K_RegisterConsoleIME@8__imp__RegisterConsoleIME@8__head_libkernel32_a dchds00964.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %RegisterApplicationRestart .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_RegisterApplicationRestart@8__imp__RegisterApplicationRestart@8__head_libkernel32_a dchds00963.o/ 1301111099 0 0 100666 691 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %RegisterApplicationRecoveryCallback .text.data.bss.idata$7.idata$5.idata$4.idata$6,Zo_RegisterApplicationRecoveryCallback@16__imp__RegisterApplicationRecoveryCallback@16__head_libkernel32_a dchds00962.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegSaveKeyExW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegSaveKeyExW@16__imp__RegSaveKeyExW@16__head_libkernel32_a dchds00961.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegSaveKeyExA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegSaveKeyExA@16__imp__RegSaveKeyExA@16__head_libkernel32_a dchds00960.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegLoadMUIStringW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_RegLoadMUIStringW@28__imp__RegLoadMUIStringW@28__head_libkernel32_a dchds00959.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegLoadMUIStringA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_RegLoadMUIStringA@28__imp__RegLoadMUIStringA@28__head_libkernel32_a dchds00958.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegKrnInitialize .text.data.bss.idata$7.idata$5.idata$4.idata$64I_RegKrnInitialize@12__imp__RegKrnInitialize@12__head_libkernel32_a dchds00957.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegKrnGetGlobalState .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_RegKrnGetGlobalState@0__imp__RegKrnGetGlobalState@0__head_libkernel32_a dchds00956.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegGetValueW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_RegGetValueW@28__imp__RegGetValueW@28__head_libkernel32_a dchds00955.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RegGetValueA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_RegGetValueA@28__imp__RegGetValueA@28__head_libkernel32_a dchds00954.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %RegDisablePredefinedCacheEx .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_RegDisablePredefinedCacheEx@0__imp__RegDisablePredefinedCacheEx@0__head_libkernel32_a dchds00953.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegDeleteTreeW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegDeleteTreeW@8__imp__RegDeleteTreeW@8__head_libkernel32_a dchds00952.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegDeleteTreeA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_RegDeleteTreeA@8__imp__RegDeleteTreeA@8__head_libkernel32_a dchds00951.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ReadThreadProfilingData .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_ReadThreadProfilingData@12__imp__ReadThreadProfilingData@12__head_libkernel32_a dchds00950.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ReadProcessMemory .text.data.bss.idata$7.idata$5.idata$4.idata$66K_ReadProcessMemory@20__imp__ReadProcessMemory@20__head_libkernel32_a dchds00949.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ReadFileScatter .text.data.bss.idata$7.idata$5.idata$4.idata$62G_ReadFileScatter@20__imp__ReadFileScatter@20__head_libkernel32_a dchds00948.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReadFileEx .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_ReadFileEx@20__imp__ReadFileEx@20__head_libkernel32_a dchds00947.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %ReadFile .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_ReadFile@20__imp__ReadFile@20__head_libkernel32_a dchds00946.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ReadDirectoryChangesW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ReadDirectoryChangesW@32__imp__ReadDirectoryChangesW@32__head_libkernel32_a dchds00945.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReadConsoleW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_ReadConsoleW@20__imp__ReadConsoleW@20__head_libkernel32_a dchds00944.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ReadConsoleOutputW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_ReadConsoleOutputW@20__imp__ReadConsoleOutputW@20__head_libkernel32_a dchds00943.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %ReadConsoleOutputCharacterW .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__ReadConsoleOutputCharacterW@20__imp__ReadConsoleOutputCharacterW@20__head_libkernel32_a dchds00942.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %ReadConsoleOutputCharacterA .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__ReadConsoleOutputCharacterA@20__imp__ReadConsoleOutputCharacterA@20__head_libkernel32_a dchds00941.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %ReadConsoleOutputAttribute .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_ReadConsoleOutputAttribute@20__imp__ReadConsoleOutputAttribute@20__head_libkernel32_a dchds00940.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ReadConsoleOutputA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_ReadConsoleOutputA@20__imp__ReadConsoleOutputA@20__head_libkernel32_a dchds00939.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ReadConsoleInputW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_ReadConsoleInputW@16__imp__ReadConsoleInputW@16__head_libkernel32_a dchds00938.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ReadConsoleInputExW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_ReadConsoleInputExW@20__imp__ReadConsoleInputExW@20__head_libkernel32_a dchds00937.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ReadConsoleInputExA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_ReadConsoleInputExA@20__imp__ReadConsoleInputExA@20__head_libkernel32_a dchds00936.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ReadConsoleInputA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_ReadConsoleInputA@16__imp__ReadConsoleInputA@16__head_libkernel32_a dchds00935.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReadConsoleA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_ReadConsoleA@20__imp__ReadConsoleA@20__head_libkernel32_a dchds00934.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReOpenFile .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_ReOpenFile@16__imp__ReOpenFile@16__head_libkernel32_a dchds00933.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RaiseFailFastException .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_RaiseFailFastException@12__imp__RaiseFailFastException@12__head_libkernel32_a dchds00932.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RaiseException .text.data.bss.idata$7.idata$5.idata$4.idata$60E_RaiseException@16__imp__RaiseException@16__head_libkernel32_a dchds00931.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %QueueUserWorkItem .text.data.bss.idata$7.idata$5.idata$4.idata$66K_QueueUserWorkItem@12__imp__QueueUserWorkItem@12__head_libkernel32_a dchds00930.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %QueueUserAPC .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_QueueUserAPC@12__imp__QueueUserAPC@12__head_libkernel32_a dchds00929.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %QueryUnbiasedInterruptTime .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_QueryUnbiasedInterruptTime@4__imp__QueryUnbiasedInterruptTime@4__head_libkernel32_a dchds00928.o/ 1301111099 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %QueryThreadpoolStackInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_QueryThreadpoolStackInformation@8__imp__QueryThreadpoolStackInformation@8__head_libkernel32_a dchds00927.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %QueryThreadProfiling .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_QueryThreadProfiling@8__imp__QueryThreadProfiling@8__head_libkernel32_a dchds00926.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %QueryThreadCycleTime .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_QueryThreadCycleTime@8__imp__QueryThreadCycleTime@8__head_libkernel32_a dchds00925.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %QueryProcessCycleTime .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_QueryProcessCycleTime@8__imp__QueryProcessCycleTime@8__head_libkernel32_a dchds00924.o/ 1301111099 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %QueryProcessAffinityUpdateMode .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_QueryProcessAffinityUpdateMode@8__imp__QueryProcessAffinityUpdateMode@8__head_libkernel32_a dchds00923.o/ 1301111099 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %QueryPerformanceFrequency .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_QueryPerformanceFrequency@4__imp__QueryPerformanceFrequency@4__head_libkernel32_a dchds00922.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %QueryPerformanceCounter .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_QueryPerformanceCounter@4__imp__QueryPerformanceCounter@4__head_libkernel32_a dchds00921.o/ 1301111099 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %QueryMemoryResourceNotification .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_QueryMemoryResourceNotification@8__imp__QueryMemoryResourceNotification@8__head_libkernel32_a dchds00920.o/ 1301111099 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %QueryInformationJobObject .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_QueryInformationJobObject@20__imp__QueryInformationJobObject@20__head_libkernel32_a dchds00919.o/ 1301111099 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %QueryIdleProcessorCycleTimeEx .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_QueryIdleProcessorCycleTimeEx@12__imp__QueryIdleProcessorCycleTimeEx@12__head_libkernel32_a dchds00918.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %QueryIdleProcessorCycleTime .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_QueryIdleProcessorCycleTime@8__imp__QueryIdleProcessorCycleTime@8__head_libkernel32_a dchds00917.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %QueryFullProcessImageNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_QueryFullProcessImageNameW@16__imp__QueryFullProcessImageNameW@16__head_libkernel32_a dchds00916.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %QueryFullProcessImageNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_QueryFullProcessImageNameA@16__imp__QueryFullProcessImageNameA@16__head_libkernel32_a dchds00915.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %QueryDosDeviceW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_QueryDosDeviceW@12__imp__QueryDosDeviceW@12__head_libkernel32_a dchds00914.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %QueryDosDeviceA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_QueryDosDeviceA@12__imp__QueryDosDeviceA@12__head_libkernel32_a dchds00913.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %QueryDepthSList .text.data.bss.idata$7.idata$5.idata$4.idata$60E_QueryDepthSList@4__imp__QueryDepthSList@4__head_libkernel32_a dchds00912.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %QueryActCtxW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_QueryActCtxW@28__imp__QueryActCtxW@28__head_libkernel32_a dchds00911.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %QueryActCtxSettingsW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_QueryActCtxSettingsW@28__imp__QueryActCtxSettingsW@28__head_libkernel32_a dchds00910.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %PurgeComm .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_PurgeComm@8__imp__PurgeComm@8__head_libkernel32_a dchds00909.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %PulseEvent .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_PulseEvent@4__imp__PulseEvent@4__head_libkernel32_a dchds00908.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ProcessIdToSessionId .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_ProcessIdToSessionId@8__imp__ProcessIdToSessionId@8__head_libkernel32_a dchds00907.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %Process32NextW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_Process32NextW@8__imp__Process32NextW@8__head_libkernel32_a dchds00906.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %Process32Next .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_Process32Next@8__imp__Process32Next@8__head_libkernel32_a dchds00905.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %Process32FirstW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_Process32FirstW@8__imp__Process32FirstW@8__head_libkernel32_a dchds00904.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %Process32First .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_Process32First@8__imp__Process32First@8__head_libkernel32_a dchds00903.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %PrivMoveFileIdentityW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_PrivMoveFileIdentityW@12__imp__PrivMoveFileIdentityW@12__head_libkernel32_a dchds00902.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %PrivCopyFileExW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_PrivCopyFileExW@24__imp__PrivCopyFileExW@24__head_libkernel32_a dchds00901.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %PrepareTape .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_PrepareTape@12__imp__PrepareTape@12__head_libkernel32_a dchds00900.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %PowerSetRequest .text.data.bss.idata$7.idata$5.idata$4.idata$60E_PowerSetRequest@8__imp__PowerSetRequest@8__head_libkernel32_a dchds00899.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %PowerCreateRequest .text.data.bss.idata$7.idata$5.idata$4.idata$66K_PowerCreateRequest@4__imp__PowerCreateRequest@4__head_libkernel32_a dchds00898.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %PowerClearRequest .text.data.bss.idata$7.idata$5.idata$4.idata$64I_PowerClearRequest@8__imp__PowerClearRequest@8__head_libkernel32_a dchds00897.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %PostQueuedCompletionStatus .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_PostQueuedCompletionStatus@16__imp__PostQueuedCompletionStatus@16__head_libkernel32_a dchds00896.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %PeekNamedPipe .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_PeekNamedPipe@24__imp__PeekNamedPipe@24__head_libkernel32_a dchds00895.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %PeekConsoleInputW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_PeekConsoleInputW@16__imp__PeekConsoleInputW@16__head_libkernel32_a dchds00894.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %~PeekConsoleInputA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_PeekConsoleInputA@16__imp__PeekConsoleInputA@16__head_libkernel32_a dchds00893.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %}OutputDebugStringW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_OutputDebugStringW@4__imp__OutputDebugStringW@4__head_libkernel32_a dchds00892.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %|OutputDebugStringA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_OutputDebugStringA@4__imp__OutputDebugStringA@4__head_libkernel32_a dchds00891.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %{OpenWaitableTimerW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_OpenWaitableTimerW@12__imp__OpenWaitableTimerW@12__head_libkernel32_a dchds00890.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %zOpenWaitableTimerA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_OpenWaitableTimerA@12__imp__OpenWaitableTimerA@12__head_libkernel32_a dchds00889.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %yOpenThread .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_OpenThread@12__imp__OpenThread@12__head_libkernel32_a dchds00888.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %xOpenSemaphoreW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_OpenSemaphoreW@12__imp__OpenSemaphoreW@12__head_libkernel32_a dchds00887.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %wOpenSemaphoreA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_OpenSemaphoreA@12__imp__OpenSemaphoreA@12__head_libkernel32_a dchds00886.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %vOpenProfileUserMapping .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_OpenProfileUserMapping@0__imp__OpenProfileUserMapping@0__head_libkernel32_a dchds00885.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %uOpenProcess .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_OpenProcess@12__imp__OpenProcess@12__head_libkernel32_a dchds00884.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %tOpenPrivateNamespaceW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_OpenPrivateNamespaceW@8__imp__OpenPrivateNamespaceW@8__head_libkernel32_a dchds00883.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %sOpenPrivateNamespaceA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_OpenPrivateNamespaceA@8__imp__OpenPrivateNamespaceA@8__head_libkernel32_a dchds00882.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %rOpenMutexW .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_OpenMutexW@12__imp__OpenMutexW@12__head_libkernel32_a dchds00881.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %qOpenMutexA .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_OpenMutexA@12__imp__OpenMutexA@12__head_libkernel32_a dchds00880.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %pOpenJobObjectW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_OpenJobObjectW@12__imp__OpenJobObjectW@12__head_libkernel32_a dchds00879.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %oOpenJobObjectA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_OpenJobObjectA@12__imp__OpenJobObjectA@12__head_libkernel32_a dchds00878.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %nOpenFileMappingW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_OpenFileMappingW@12__imp__OpenFileMappingW@12__head_libkernel32_a dchds00877.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %mOpenFileMappingA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_OpenFileMappingA@12__imp__OpenFileMappingA@12__head_libkernel32_a dchds00876.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %lOpenFileById .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_OpenFileById@24__imp__OpenFileById@24__head_libkernel32_a dchds00875.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %kOpenFile .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_OpenFile@12__imp__OpenFile@12__head_libkernel32_a dchds00874.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %jOpenEventW .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_OpenEventW@12__imp__OpenEventW@12__head_libkernel32_a dchds00873.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %iOpenEventA .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_OpenEventA@12__imp__OpenEventA@12__head_libkernel32_a dchds00872.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %hOpenConsoleW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_OpenConsoleW@16__imp__OpenConsoleW@16__head_libkernel32_a dchds00871.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %gNotifyUILanguageChange .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_NotifyUILanguageChange@20__imp__NotifyUILanguageChange@20__head_libkernel32_a dchds00870.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %fNotifyMountMgr .text.data.bss.idata$7.idata$5.idata$4.idata$60E_NotifyMountMgr@12__imp__NotifyMountMgr@12__head_libkernel32_a dchds00869.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %eNormalizeString .text.data.bss.idata$7.idata$5.idata$4.idata$62G_NormalizeString@20__imp__NormalizeString@20__head_libkernel32_a dchds00868.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %dNlsWriteEtwEvent .text.data.bss.idata$7.idata$5.idata$4.idata$64I_NlsWriteEtwEvent@20__imp__NlsWriteEtwEvent@20__head_libkernel32_a dchds00867.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %cNlsUpdateSystemLocale .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_NlsUpdateSystemLocale@8__imp__NlsUpdateSystemLocale@8__head_libkernel32_a dchds00866.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %bNlsUpdateLocale .text.data.bss.idata$7.idata$5.idata$4.idata$60E_NlsUpdateLocale@8__imp__NlsUpdateLocale@8__head_libkernel32_a dchds00865.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %aNlsGetCacheUpdateCount .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_NlsGetCacheUpdateCount@0__imp__NlsGetCacheUpdateCount@0__head_libkernel32_a dchds00864.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %`NlsEventDataDescCreate .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_NlsEventDataDescCreate@16__imp__NlsEventDataDescCreate@16__head_libkernel32_a dchds00863.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_NlsCheckPolicy .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_NlsCheckPolicy@8__imp__NlsCheckPolicy@8__head_libkernel32_a dchds00862.o/ 1301111099 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %^NeedCurrentDirectoryForExePathW .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_NeedCurrentDirectoryForExePathW@4__imp__NeedCurrentDirectoryForExePathW@4__head_libkernel32_a dchds00861.o/ 1301111099 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %]NeedCurrentDirectoryForExePathA .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_NeedCurrentDirectoryForExePathA@4__imp__NeedCurrentDirectoryForExePathA@4__head_libkernel32_a dchds00860.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %\MultiByteToWideChar .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_MultiByteToWideChar@24__imp__MultiByteToWideChar@24__head_libkernel32_a dchds00859.o/ 1301111099 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %[MulDiv .text.data.bss.idata$7.idata$5.idata$4.idata$6 5_MulDiv@12__imp__MulDiv@12__head_libkernel32_a dchds00858.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ZMoveFileWithProgressW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_MoveFileWithProgressW@20__imp__MoveFileWithProgressW@20__head_libkernel32_a dchds00857.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %YMoveFileWithProgressA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_MoveFileWithProgressA@20__imp__MoveFileWithProgressA@20__head_libkernel32_a dchds00856.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %XMoveFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_MoveFileW@8__imp__MoveFileW@8__head_libkernel32_a dchds00855.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %WMoveFileTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_MoveFileTransactedW@24__imp__MoveFileTransactedW@24__head_libkernel32_a dchds00854.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VMoveFileTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_MoveFileTransactedA@24__imp__MoveFileTransactedA@24__head_libkernel32_a dchds00853.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %UMoveFileExW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_MoveFileExW@12__imp__MoveFileExW@12__head_libkernel32_a dchds00852.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %TMoveFileExA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_MoveFileExA@12__imp__MoveFileExA@12__head_libkernel32_a dchds00851.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %SMoveFileA .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_MoveFileA@8__imp__MoveFileA@8__head_libkernel32_a dchds00850.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RModule32NextW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_Module32NextW@8__imp__Module32NextW@8__head_libkernel32_a dchds00849.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %QModule32Next .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_Module32Next@8__imp__Module32Next@8__head_libkernel32_a dchds00848.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %PModule32FirstW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_Module32FirstW@8__imp__Module32FirstW@8__head_libkernel32_a dchds00847.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %OModule32First .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_Module32First@8__imp__Module32First@8__head_libkernel32_a dchds00846.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %NMapViewOfFileExNuma .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_MapViewOfFileExNuma@28__imp__MapViewOfFileExNuma@28__head_libkernel32_a dchds00845.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MMapViewOfFileEx .text.data.bss.idata$7.idata$5.idata$4.idata$62G_MapViewOfFileEx@24__imp__MapViewOfFileEx@24__head_libkernel32_a dchds00844.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %LMapViewOfFile .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_MapViewOfFile@20__imp__MapViewOfFile@20__head_libkernel32_a dchds00843.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %KMapUserPhysicalPagesScatter .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__MapUserPhysicalPagesScatter@12__imp__MapUserPhysicalPagesScatter@12__head_libkernel32_a dchds00842.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %JMapUserPhysicalPages .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_MapUserPhysicalPages@12__imp__MapUserPhysicalPages@12__head_libkernel32_a dchds00841.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ILockResource .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_LockResource@4__imp__LockResource@4__head_libkernel32_a dchds00840.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %HLockFileEx .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_LockFileEx@24__imp__LockFileEx@24__head_libkernel32_a dchds00839.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %GLockFile .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_LockFile@20__imp__LockFile@20__head_libkernel32_a dchds00838.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %FLocateLegacyContext .text.data.bss.idata$7.idata$5.idata$4.idata$68M_LocateLegacyContext@8__imp__LocateLegacyContext@8__head_libkernel32_a dchds00837.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ELocateExtendedFeature .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_LocateExtendedFeature@12__imp__LocateExtendedFeature@12__head_libkernel32_a dchds00836.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DLocaleNameToLCID .text.data.bss.idata$7.idata$5.idata$4.idata$62G_LocaleNameToLCID@8__imp__LocaleNameToLCID@8__head_libkernel32_a dchds00835.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CLocalUnlock .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_LocalUnlock@4__imp__LocalUnlock@4__head_libkernel32_a dchds00834.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %BLocalSize .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_LocalSize@4__imp__LocalSize@4__head_libkernel32_a dchds00833.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ALocalShrink .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_LocalShrink@8__imp__LocalShrink@8__head_libkernel32_a dchds00832.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %@LocalReAlloc .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_LocalReAlloc@12__imp__LocalReAlloc@12__head_libkernel32_a dchds00831.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %?LocalLock .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_LocalLock@4__imp__LocalLock@4__head_libkernel32_a dchds00830.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %>LocalHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_LocalHandle@4__imp__LocalHandle@4__head_libkernel32_a dchds00829.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %=LocalFree .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_LocalFree@4__imp__LocalFree@4__head_libkernel32_a dchds00828.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %<LocalFlags .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_LocalFlags@4__imp__LocalFlags@4__head_libkernel32_a dchds00827.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %;LocalFileTimeToFileTime .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_LocalFileTimeToFileTime@8__imp__LocalFileTimeToFileTime@8__head_libkernel32_a dchds00826.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %:LocalCompact .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_LocalCompact@4__imp__LocalCompact@4__head_libkernel32_a dchds00825.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %9LocalAlloc .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_LocalAlloc@8__imp__LocalAlloc@8__head_libkernel32_a dchds00824.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %8LoadStringBaseW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_LoadStringBaseW@16__imp__LoadStringBaseW@16__head_libkernel32_a dchds00823.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %7LoadStringBaseExW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_LoadStringBaseExW@20__imp__LoadStringBaseExW@20__head_libkernel32_a dchds00822.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %6LoadResource .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_LoadResource@8__imp__LoadResource@8__head_libkernel32_a dchds00821.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %5LoadModule .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_LoadModule@8__imp__LoadModule@8__head_libkernel32_a dchds00820.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %4LoadLibraryW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_LoadLibraryW@4__imp__LoadLibraryW@4__head_libkernel32_a dchds00819.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %3LoadLibraryExW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_LoadLibraryExW@12__imp__LoadLibraryExW@12__head_libkernel32_a dchds00818.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %2LoadLibraryExA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_LoadLibraryExA@12__imp__LoadLibraryExA@12__head_libkernel32_a dchds00817.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %1LoadLibraryA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_LoadLibraryA@4__imp__LoadLibraryA@4__head_libkernel32_a dchds00816.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %0LoadAppInitDlls .text.data.bss.idata$7.idata$5.idata$4.idata$60E_LoadAppInitDlls@0__imp__LoadAppInitDlls@0__head_libkernel32_a dchds00815.o/ 1301111099 0 0 100666 701 ` L .text,l 0`.data@0.bss0.idata$74v0.idata$580.idata$4<0.idata$6*@ %/LeaveCriticalSectionWhenCallbackReturns .text.data.bss.idata$7.idata$5.idata$4.idata$6/`u_LeaveCriticalSectionWhenCallbackReturns@8__imp__LeaveCriticalSectionWhenCallbackReturns@8__head_libkernel32_a dchds00814.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %.LeaveCriticalSection .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_LeaveCriticalSection@4__imp__LeaveCriticalSection@4__head_libkernel32_a dchds00813.o/ 1301111099 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %-LZStart .text.data.bss.idata$7.idata$5.idata$4.idata$6 5_LZStart@0__imp__LZStart@0__head_libkernel32_a dchds00812.o/ 1301111099 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %,LZDone .text.data.bss.idata$7.idata$5.idata$4.idata$63_LZDone@0__imp__LZDone@0__head_libkernel32_a dchds00811.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %+LZCreateFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_LZCreateFileW@20__imp__LZCreateFileW@20__head_libkernel32_a dchds00810.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %*LZCloseFile .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_LZCloseFile@4__imp__LZCloseFile@4__head_libkernel32_a dchds00809.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %)LCMapStringW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_LCMapStringW@24__imp__LCMapStringW@24__head_libkernel32_a dchds00808.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %(LCMapStringEx .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_LCMapStringEx@36__imp__LCMapStringEx@36__head_libkernel32_a dchds00807.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %'LCMapStringA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_LCMapStringA@24__imp__LCMapStringA@24__head_libkernel32_a dchds00806.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %&LCIDToLocaleName .text.data.bss.idata$7.idata$5.idata$4.idata$64I_LCIDToLocaleName@16__imp__LCIDToLocaleName@16__head_libkernel32_a dchds00805.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %%K32QueryWorkingSetEx .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_K32QueryWorkingSetEx@12__imp__K32QueryWorkingSetEx@12__head_libkernel32_a dchds00804.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %$K32QueryWorkingSet .text.data.bss.idata$7.idata$5.idata$4.idata$68M_K32QueryWorkingSet@12__imp__K32QueryWorkingSet@12__head_libkernel32_a dchds00803.o/ 1301111099 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %#K32InitializeProcessForWsWatch .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_K32InitializeProcessForWsWatch@4__imp__K32InitializeProcessForWsWatch@4__head_libkernel32_a dchds00802.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %"K32GetWsChangesEx .text.data.bss.idata$7.idata$5.idata$4.idata$66K_K32GetWsChangesEx@12__imp__K32GetWsChangesEx@12__head_libkernel32_a dchds00801.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %!K32GetWsChanges .text.data.bss.idata$7.idata$5.idata$4.idata$62G_K32GetWsChanges@12__imp__K32GetWsChanges@12__head_libkernel32_a dchds00800.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ % K32GetProcessMemoryInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_K32GetProcessMemoryInfo@12__imp__K32GetProcessMemoryInfo@12__head_libkernel32_a dchds00799.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %K32GetProcessImageFileNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__K32GetProcessImageFileNameW@12__imp__K32GetProcessImageFileNameW@12__head_libkernel32_a dchds00798.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %K32GetProcessImageFileNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__K32GetProcessImageFileNameA@12__imp__K32GetProcessImageFileNameA@12__head_libkernel32_a dchds00797.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %K32GetPerformanceInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_K32GetPerformanceInfo@8__imp__K32GetPerformanceInfo@8__head_libkernel32_a dchds00796.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %K32GetModuleInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_K32GetModuleInformation@16__imp__K32GetModuleInformation@16__head_libkernel32_a dchds00795.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %K32GetModuleFileNameExW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_K32GetModuleFileNameExW@16__imp__K32GetModuleFileNameExW@16__head_libkernel32_a dchds00794.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %K32GetModuleFileNameExA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_K32GetModuleFileNameExA@16__imp__K32GetModuleFileNameExA@16__head_libkernel32_a dchds00793.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %K32GetModuleBaseNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_K32GetModuleBaseNameW@16__imp__K32GetModuleBaseNameW@16__head_libkernel32_a dchds00792.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %K32GetModuleBaseNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_K32GetModuleBaseNameA@16__imp__K32GetModuleBaseNameA@16__head_libkernel32_a dchds00791.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %K32GetMappedFileNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_K32GetMappedFileNameW@16__imp__K32GetMappedFileNameW@16__head_libkernel32_a dchds00790.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %K32GetMappedFileNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_K32GetMappedFileNameA@16__imp__K32GetMappedFileNameA@16__head_libkernel32_a dchds00789.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %K32GetDeviceDriverFileNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__K32GetDeviceDriverFileNameW@12__imp__K32GetDeviceDriverFileNameW@12__head_libkernel32_a dchds00788.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %K32GetDeviceDriverFileNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__K32GetDeviceDriverFileNameA@12__imp__K32GetDeviceDriverFileNameA@12__head_libkernel32_a dchds00787.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %K32GetDeviceDriverBaseNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__K32GetDeviceDriverBaseNameW@12__imp__K32GetDeviceDriverBaseNameW@12__head_libkernel32_a dchds00786.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %K32GetDeviceDriverBaseNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__K32GetDeviceDriverBaseNameA@12__imp__K32GetDeviceDriverBaseNameA@12__head_libkernel32_a dchds00785.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %K32EnumProcesses .text.data.bss.idata$7.idata$5.idata$4.idata$64I_K32EnumProcesses@12__imp__K32EnumProcesses@12__head_libkernel32_a dchds00784.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %K32EnumProcessModulesEx .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_K32EnumProcessModulesEx@20__imp__K32EnumProcessModulesEx@20__head_libkernel32_a dchds00783.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %K32EnumProcessModules .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_K32EnumProcessModules@16__imp__K32EnumProcessModules@16__head_libkernel32_a dchds00782.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %K32EnumPageFilesW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_K32EnumPageFilesW@8__imp__K32EnumPageFilesW@8__head_libkernel32_a dchds00781.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % K32EnumPageFilesA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_K32EnumPageFilesA@8__imp__K32EnumPageFilesA@8__head_libkernel32_a dchds00780.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ % K32EnumDeviceDrivers .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_K32EnumDeviceDrivers@12__imp__K32EnumDeviceDrivers@12__head_libkernel32_a dchds00779.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ % K32EmptyWorkingSet .text.data.bss.idata$7.idata$5.idata$4.idata$66K_K32EmptyWorkingSet@4__imp__K32EmptyWorkingSet@4__head_libkernel32_a dchds00778.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % IsWow64Process .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_IsWow64Process@8__imp__IsWow64Process@8__head_libkernel32_a dchds00777.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % IsValidLocaleName .text.data.bss.idata$7.idata$5.idata$4.idata$64I_IsValidLocaleName@4__imp__IsValidLocaleName@4__head_libkernel32_a dchds00776.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IsValidLocale .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_IsValidLocale@8__imp__IsValidLocale@8__head_libkernel32_a dchds00775.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %IsValidLanguageGroup .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_IsValidLanguageGroup@8__imp__IsValidLanguageGroup@8__head_libkernel32_a dchds00774.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsValidCodePage .text.data.bss.idata$7.idata$5.idata$4.idata$60E_IsValidCodePage@4__imp__IsValidCodePage@4__head_libkernel32_a dchds00773.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %IsValidCalDateTime .text.data.bss.idata$7.idata$5.idata$4.idata$66K_IsValidCalDateTime@8__imp__IsValidCalDateTime@8__head_libkernel32_a dchds00772.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %IsTimeZoneRedirectionEnabled .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__IsTimeZoneRedirectionEnabled@0__imp__IsTimeZoneRedirectionEnabled@0__head_libkernel32_a dchds00771.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %IsThreadpoolTimerSet .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_IsThreadpoolTimerSet@4__imp__IsThreadpoolTimerSet@4__head_libkernel32_a dchds00770.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsThreadAFiber .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_IsThreadAFiber@0__imp__IsThreadAFiber@0__head_libkernel32_a dchds00769.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %IsSystemResumeAutomatic .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_IsSystemResumeAutomatic@0__imp__IsSystemResumeAutomatic@0__head_libkernel32_a dchds00768.o/ 1301111099 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %IsProcessorFeaturePresent .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_IsProcessorFeaturePresent@4__imp__IsProcessorFeaturePresent@4__head_libkernel32_a dchds00767.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsProcessInJob .text.data.bss.idata$7.idata$5.idata$4.idata$60E_IsProcessInJob@12__imp__IsProcessInJob@12__head_libkernel32_a dchds00766.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %IsNormalizedString .text.data.bss.idata$7.idata$5.idata$4.idata$68M_IsNormalizedString@12__imp__IsNormalizedString@12__head_libkernel32_a dchds00765.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %IsNLSDefinedString .text.data.bss.idata$7.idata$5.idata$4.idata$68M_IsNLSDefinedString@20__imp__IsNLSDefinedString@20__head_libkernel32_a dchds00764.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsDebuggerPresent .text.data.bss.idata$7.idata$5.idata$4.idata$64I_IsDebuggerPresent@0__imp__IsDebuggerPresent@0__head_libkernel32_a dchds00763.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsDBCSLeadByteEx .text.data.bss.idata$7.idata$5.idata$4.idata$62G_IsDBCSLeadByteEx@8__imp__IsDBCSLeadByteEx@8__head_libkernel32_a dchds00762.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsDBCSLeadByte .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_IsDBCSLeadByte@4__imp__IsDBCSLeadByte@4__head_libkernel32_a dchds00761.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %IsCalendarLeapYear .text.data.bss.idata$7.idata$5.idata$4.idata$68M_IsCalendarLeapYear@12__imp__IsCalendarLeapYear@12__head_libkernel32_a dchds00760.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %IsCalendarLeapMonth .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_IsCalendarLeapMonth@16__imp__IsCalendarLeapMonth@16__head_libkernel32_a dchds00759.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsCalendarLeapDay .text.data.bss.idata$7.idata$5.idata$4.idata$66K_IsCalendarLeapDay@20__imp__IsCalendarLeapDay@20__head_libkernel32_a dchds00758.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IsBadWritePtr .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_IsBadWritePtr@8__imp__IsBadWritePtr@8__head_libkernel32_a dchds00757.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsBadStringPtrW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_IsBadStringPtrW@8__imp__IsBadStringPtrW@8__head_libkernel32_a dchds00756.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsBadStringPtrA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_IsBadStringPtrA@8__imp__IsBadStringPtrA@8__head_libkernel32_a dchds00755.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IsBadReadPtr .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_IsBadReadPtr@8__imp__IsBadReadPtr@8__head_libkernel32_a dchds00754.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsBadHugeWritePtr .text.data.bss.idata$7.idata$5.idata$4.idata$64I_IsBadHugeWritePtr@8__imp__IsBadHugeWritePtr@8__head_libkernel32_a dchds00753.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsBadHugeReadPtr .text.data.bss.idata$7.idata$5.idata$4.idata$62G_IsBadHugeReadPtr@8__imp__IsBadHugeReadPtr@8__head_libkernel32_a dchds00752.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IsBadCodePtr .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_IsBadCodePtr@4__imp__IsBadCodePtr@4__head_libkernel32_a dchds00751.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InvalidateConsoleDIBits .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_InvalidateConsoleDIBits@8__imp__InvalidateConsoleDIBits@8__head_libkernel32_a dchds00750.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InterlockedPushListSList .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_InterlockedPushListSList@8__imp__InterlockedPushListSList@8__head_libkernel32_a dchds00749.o/ 1301111099 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InterlockedPushEntrySList .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_InterlockedPushEntrySList@8__imp__InterlockedPushEntrySList@8__head_libkernel32_a dchds00748.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InterlockedPopEntrySList .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_InterlockedPopEntrySList@4__imp__InterlockedPopEntrySList@4__head_libkernel32_a dchds00747.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %InterlockedIncrement .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_InterlockedIncrement@4__imp__InterlockedIncrement@4__head_libkernel32_a dchds00746.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %InterlockedFlushSList .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_InterlockedFlushSList@4__imp__InterlockedFlushSList@4__head_libkernel32_a dchds00745.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InterlockedExchangeAdd .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_InterlockedExchangeAdd@8__imp__InterlockedExchangeAdd@8__head_libkernel32_a dchds00744.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %InterlockedExchange .text.data.bss.idata$7.idata$5.idata$4.idata$68M_InterlockedExchange@8__imp__InterlockedExchange@8__head_libkernel32_a dchds00743.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %InterlockedDecrement .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_InterlockedDecrement@4__imp__InterlockedDecrement@4__head_libkernel32_a dchds00742.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %InterlockedCompareExchange .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_InterlockedCompareExchange@12__imp__InterlockedCompareExchange@12__head_libkernel32_a dchds00741.o/ 1301111099 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %InterlockedCompareExchange64 .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_InterlockedCompareExchange64@20__imp__InterlockedCompareExchange64@20__head_libkernel32_a dchds00740.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %InitializeSRWLock .text.data.bss.idata$7.idata$5.idata$4.idata$64I_InitializeSRWLock@4__imp__InitializeSRWLock@4__head_libkernel32_a dchds00739.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %InitializeSListHead .text.data.bss.idata$7.idata$5.idata$4.idata$68M_InitializeSListHead@4__imp__InitializeSListHead@4__head_libkernel32_a dchds00738.o/ 1301111099 0 0 100666 683 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %InitializeProcThreadAttributeList .text.data.bss.idata$7.idata$5.idata$4.idata$6*Vk_InitializeProcThreadAttributeList@16__imp__InitializeProcThreadAttributeList@16__head_libkernel32_a dchds00737.o/ 1301111099 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InitializeExtendedContext .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_InitializeExtendedContext@12__imp__InitializeExtendedContext@12__head_libkernel32_a dchds00736.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %InitializeCriticalSectionEx .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__InitializeCriticalSectionEx@12__imp__InitializeCriticalSectionEx@12__head_libkernel32_a dchds00735.o/ 1301111099 0 0 100666 693 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6(@ %InitializeCriticalSectionAndSpinCount .text.data.bss.idata$7.idata$5.idata$4.idata$6-\q_InitializeCriticalSectionAndSpinCount@8__imp__InitializeCriticalSectionAndSpinCount@8__head_libkernel32_a dchds00734.o/ 1301111099 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InitializeCriticalSection .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_InitializeCriticalSection@4__imp__InitializeCriticalSection@4__head_libkernel32_a dchds00733.o/ 1301111099 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %InitializeConditionVariable .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_InitializeConditionVariable@4__imp__InitializeConditionVariable@4__head_libkernel32_a dchds00732.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %InitOnceInitialize .text.data.bss.idata$7.idata$5.idata$4.idata$66K_InitOnceInitialize@4__imp__InitOnceInitialize@4__head_libkernel32_a dchds00731.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %InitOnceExecuteOnce .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_InitOnceExecuteOnce@16__imp__InitOnceExecuteOnce@16__head_libkernel32_a dchds00730.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %InitOnceComplete .text.data.bss.idata$7.idata$5.idata$4.idata$64I_InitOnceComplete@12__imp__InitOnceComplete@12__head_libkernel32_a dchds00729.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %InitOnceBeginInitialize .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_InitOnceBeginInitialize@16__imp__InitOnceBeginInitialize@16__head_libkernel32_a dchds00728.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %InitAtomTable .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_InitAtomTable@4__imp__InitAtomTable@4__head_libkernel32_a dchds00727.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IdnToUnicode .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_IdnToUnicode@20__imp__IdnToUnicode@20__head_libkernel32_a dchds00726.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %IdnToNameprepUnicode .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_IdnToNameprepUnicode@20__imp__IdnToNameprepUnicode@20__head_libkernel32_a dchds00725.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IdnToAscii .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_IdnToAscii@20__imp__IdnToAscii@20__head_libkernel32_a dchds00724.o/ 1301111099 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %HeapWalk .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_HeapWalk@8__imp__HeapWalk@8__head_libkernel32_a dchds00723.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %HeapValidate .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_HeapValidate@12__imp__HeapValidate@12__head_libkernel32_a dchds00722.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %HeapUnlock .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_HeapUnlock@4__imp__HeapUnlock@4__head_libkernel32_a dchds00721.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %HeapSummary .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_HeapSummary@12__imp__HeapSummary@12__head_libkernel32_a dchds00720.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %HeapSize .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_HeapSize@12__imp__HeapSize@12__head_libkernel32_a dchds00719.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %HeapSetInformation .text.data.bss.idata$7.idata$5.idata$4.idata$68M_HeapSetInformation@16__imp__HeapSetInformation@16__head_libkernel32_a dchds00718.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %HeapReAlloc .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_HeapReAlloc@16__imp__HeapReAlloc@16__head_libkernel32_a dchds00717.o/ 1301111099 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %HeapQueryInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_HeapQueryInformation@20__imp__HeapQueryInformation@20__head_libkernel32_a dchds00716.o/ 1301111099 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %HeapLock .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_HeapLock@4__imp__HeapLock@4__head_libkernel32_a dchds00715.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %HeapFree .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_HeapFree@12__imp__HeapFree@12__head_libkernel32_a dchds00714.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %HeapDestroy .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_HeapDestroy@4__imp__HeapDestroy@4__head_libkernel32_a dchds00713.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %HeapCreate .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_HeapCreate@12__imp__HeapCreate@12__head_libkernel32_a dchds00712.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %HeapCompact .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_HeapCompact@8__imp__HeapCompact@8__head_libkernel32_a dchds00711.o/ 1301111099 0 0 100666 611 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %HeapAlloc .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_HeapAlloc@12__imp__HeapAlloc@12__head_libkernel32_a dchds00710.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %Heap32Next .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_Heap32Next@4__imp__Heap32Next@4__head_libkernel32_a dchds00709.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %Heap32ListNext .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_Heap32ListNext@8__imp__Heap32ListNext@8__head_libkernel32_a dchds00708.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %Heap32ListFirst .text.data.bss.idata$7.idata$5.idata$4.idata$60E_Heap32ListFirst@8__imp__Heap32ListFirst@8__head_libkernel32_a dchds00707.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %Heap32First .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_Heap32First@12__imp__Heap32First@12__head_libkernel32_a dchds00706.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalWire .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_GlobalWire@4__imp__GlobalWire@4__head_libkernel32_a dchds00705.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalUnlock .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GlobalUnlock@4__imp__GlobalUnlock@4__head_libkernel32_a dchds00704.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalUnfix .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_GlobalUnfix@4__imp__GlobalUnfix@4__head_libkernel32_a dchds00703.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalUnWire .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GlobalUnWire@4__imp__GlobalUnWire@4__head_libkernel32_a dchds00702.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalSize .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_GlobalSize@4__imp__GlobalSize@4__head_libkernel32_a dchds00701.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalReAlloc .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GlobalReAlloc@12__imp__GlobalReAlloc@12__head_libkernel32_a dchds00700.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GlobalMemoryStatusEx .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GlobalMemoryStatusEx@4__imp__GlobalMemoryStatusEx@4__head_libkernel32_a dchds00699.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GlobalMemoryStatus .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GlobalMemoryStatus@4__imp__GlobalMemoryStatus@4__head_libkernel32_a dchds00698.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalLock .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_GlobalLock@4__imp__GlobalLock@4__head_libkernel32_a dchds00697.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GlobalHandle@4__imp__GlobalHandle@4__head_libkernel32_a dchds00696.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GlobalGetAtomNameW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GlobalGetAtomNameW@12__imp__GlobalGetAtomNameW@12__head_libkernel32_a dchds00695.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GlobalGetAtomNameA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GlobalGetAtomNameA@12__imp__GlobalGetAtomNameA@12__head_libkernel32_a dchds00694.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalFree .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_GlobalFree@4__imp__GlobalFree@4__head_libkernel32_a dchds00693.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalFlags .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_GlobalFlags@4__imp__GlobalFlags@4__head_libkernel32_a dchds00692.o/ 1301111099 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %GlobalFix .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_GlobalFix@4__imp__GlobalFix@4__head_libkernel32_a dchds00691.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GlobalFindAtomW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GlobalFindAtomW@4__imp__GlobalFindAtomW@4__head_libkernel32_a dchds00690.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GlobalFindAtomA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GlobalFindAtomA@4__imp__GlobalFindAtomA@4__head_libkernel32_a dchds00689.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GlobalDeleteAtom .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GlobalDeleteAtom@4__imp__GlobalDeleteAtom@4__head_libkernel32_a dchds00688.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalCompact .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GlobalCompact@4__imp__GlobalCompact@4__head_libkernel32_a dchds00687.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GlobalAlloc .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_GlobalAlloc@8__imp__GlobalAlloc@8__head_libkernel32_a dchds00686.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GlobalAddAtomW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GlobalAddAtomW@4__imp__GlobalAddAtomW@4__head_libkernel32_a dchds00685.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GlobalAddAtomA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GlobalAddAtomA@4__imp__GlobalAddAtomA@4__head_libkernel32_a dchds00684.o/ 1301111099 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetWriteWatch .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GetWriteWatch@24__imp__GetWriteWatch@24__head_libkernel32_a dchds00683.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetWindowsDirectoryW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetWindowsDirectoryW@8__imp__GetWindowsDirectoryW@8__head_libkernel32_a dchds00682.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetWindowsDirectoryA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetWindowsDirectoryA@8__imp__GetWindowsDirectoryA@8__head_libkernel32_a dchds00681.o/ 1301111099 0 0 100666 681 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %GetVolumePathNamesForVolumeNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6)Ti_GetVolumePathNamesForVolumeNameW@16__imp__GetVolumePathNamesForVolumeNameW@16__head_libkernel32_a dchds00680.o/ 1301111099 0 0 100666 681 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %GetVolumePathNamesForVolumeNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6)Ti_GetVolumePathNamesForVolumeNameA@16__imp__GetVolumePathNamesForVolumeNameA@16__head_libkernel32_a dchds00679.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetVolumePathNameW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetVolumePathNameW@12__imp__GetVolumePathNameW@12__head_libkernel32_a dchds00678.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetVolumePathNameA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetVolumePathNameA@12__imp__GetVolumePathNameA@12__head_libkernel32_a dchds00677.o/ 1301111099 0 0 100666 683 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %GetVolumeNameForVolumeMountPointW .text.data.bss.idata$7.idata$5.idata$4.idata$6*Vk_GetVolumeNameForVolumeMountPointW@12__imp__GetVolumeNameForVolumeMountPointW@12__head_libkernel32_a dchds00676.o/ 1301111099 0 0 100666 683 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %GetVolumeNameForVolumeMountPointA .text.data.bss.idata$7.idata$5.idata$4.idata$6*Vk_GetVolumeNameForVolumeMountPointA@12__imp__GetVolumeNameForVolumeMountPointA@12__head_libkernel32_a dchds00675.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetVolumeInformationW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetVolumeInformationW@32__imp__GetVolumeInformationW@32__head_libkernel32_a dchds00674.o/ 1301111099 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetVolumeInformationByHandleW .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetVolumeInformationByHandleW@32__imp__GetVolumeInformationByHandleW@32__head_libkernel32_a dchds00673.o/ 1301111099 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetVolumeInformationA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetVolumeInformationA@32__imp__GetVolumeInformationA@32__head_libkernel32_a dchds00672.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetVersionExW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetVersionExW@4__imp__GetVersionExW@4__head_libkernel32_a dchds00671.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetVersionExA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetVersionExA@4__imp__GetVersionExA@4__head_libkernel32_a dchds00670.o/ 1301111099 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetVersion .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_GetVersion@0__imp__GetVersion@0__head_libkernel32_a dchds00669.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetVDMCurrentDirectories .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetVDMCurrentDirectories@8__imp__GetVDMCurrentDirectories@8__head_libkernel32_a dchds00668.o/ 1301111099 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetUserPreferredUILanguages .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetUserPreferredUILanguages@16__imp__GetUserPreferredUILanguages@16__head_libkernel32_a dchds00667.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetUserGeoID .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetUserGeoID@4__imp__GetUserGeoID@4__head_libkernel32_a dchds00666.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetUserDefaultUILanguage .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetUserDefaultUILanguage@0__imp__GetUserDefaultUILanguage@0__head_libkernel32_a dchds00665.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetUserDefaultLocaleName .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetUserDefaultLocaleName@8__imp__GetUserDefaultLocaleName@8__head_libkernel32_a dchds00664.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetUserDefaultLangID .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetUserDefaultLangID@0__imp__GetUserDefaultLangID@0__head_libkernel32_a dchds00663.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetUserDefaultLCID .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetUserDefaultLCID@0__imp__GetUserDefaultLCID@0__head_libkernel32_a dchds00662.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetUILanguageInfo .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetUILanguageInfo@20__imp__GetUILanguageInfo@20__head_libkernel32_a dchds00661.o/ 1301111099 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetTimeZoneInformationForYear .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetTimeZoneInformationForYear@12__imp__GetTimeZoneInformationForYear@12__head_libkernel32_a dchds00660.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetTimeZoneInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetTimeZoneInformation@4__imp__GetTimeZoneInformation@4__head_libkernel32_a dchds00659.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetTimeFormatW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetTimeFormatW@24__imp__GetTimeFormatW@24__head_libkernel32_a dchds00658.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetTimeFormatEx .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetTimeFormatEx@24__imp__GetTimeFormatEx@24__head_libkernel32_a dchds00657.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetTimeFormatA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetTimeFormatA@24__imp__GetTimeFormatA@24__head_libkernel32_a dchds00656.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetTickCount .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetTickCount@0__imp__GetTickCount@0__head_libkernel32_a dchds00655.o/ 1301111099 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetTickCount64 .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GetTickCount64@0__imp__GetTickCount64@0__head_libkernel32_a dchds00654.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetThreadUILanguage .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetThreadUILanguage@0__imp__GetThreadUILanguage@0__head_libkernel32_a dchds00653.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetThreadTimes .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetThreadTimes@20__imp__GetThreadTimes@20__head_libkernel32_a dchds00652.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetThreadSelectorEntry .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetThreadSelectorEntry@12__imp__GetThreadSelectorEntry@12__head_libkernel32_a dchds00651.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetThreadPriorityBoost .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetThreadPriorityBoost@8__imp__GetThreadPriorityBoost@8__head_libkernel32_a dchds00650.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetThreadPriority .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetThreadPriority@4__imp__GetThreadPriority@4__head_libkernel32_a dchds00649.o/ 1301111099 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetThreadPreferredUILanguages .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetThreadPreferredUILanguages@16__imp__GetThreadPreferredUILanguages@16__head_libkernel32_a dchds00648.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetThreadLocale .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetThreadLocale@0__imp__GetThreadLocale@0__head_libkernel32_a dchds00647.o/ 1301111099 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetThreadIdealProcessorEx .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetThreadIdealProcessorEx@8__imp__GetThreadIdealProcessorEx@8__head_libkernel32_a dchds00646.o/ 1301111099 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetThreadId .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_GetThreadId@4__imp__GetThreadId@4__head_libkernel32_a dchds00645.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetThreadIOPendingFlag .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetThreadIOPendingFlag@8__imp__GetThreadIOPendingFlag@8__head_libkernel32_a dchds00644.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetThreadGroupAffinity .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetThreadGroupAffinity@8__imp__GetThreadGroupAffinity@8__head_libkernel32_a dchds00643.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetThreadErrorMode .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetThreadErrorMode@0__imp__GetThreadErrorMode@0__head_libkernel32_a dchds00642.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetThreadContext .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetThreadContext@8__imp__GetThreadContext@8__head_libkernel32_a dchds00641.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetTempPathW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetTempPathW@8__imp__GetTempPathW@8__head_libkernel32_a dchds00640.o/ 1301111099 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetTempPathA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetTempPathA@8__imp__GetTempPathA@8__head_libkernel32_a dchds00639.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetTempFileNameW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetTempFileNameW@16__imp__GetTempFileNameW@16__head_libkernel32_a dchds00638.o/ 1301111099 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %~GetTempFileNameA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetTempFileNameA@16__imp__GetTempFileNameA@16__head_libkernel32_a dchds00637.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %}GetTapeStatus .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetTapeStatus@4__imp__GetTapeStatus@4__head_libkernel32_a dchds00636.o/ 1301111099 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %|GetTapePosition .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetTapePosition@20__imp__GetTapePosition@20__head_libkernel32_a dchds00635.o/ 1301111099 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %{GetTapeParameters .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetTapeParameters@16__imp__GetTapeParameters@16__head_libkernel32_a dchds00634.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %zGetSystemWow64DirectoryW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetSystemWow64DirectoryW@8__imp__GetSystemWow64DirectoryW@8__head_libkernel32_a dchds00633.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %yGetSystemWow64DirectoryA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetSystemWow64DirectoryA@8__imp__GetSystemWow64DirectoryA@8__head_libkernel32_a dchds00632.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %xGetSystemWindowsDirectoryW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetSystemWindowsDirectoryW@8__imp__GetSystemWindowsDirectoryW@8__head_libkernel32_a dchds00631.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %wGetSystemWindowsDirectoryA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetSystemWindowsDirectoryA@8__imp__GetSystemWindowsDirectoryA@8__head_libkernel32_a dchds00630.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %vGetSystemTimes .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetSystemTimes@12__imp__GetSystemTimes@12__head_libkernel32_a dchds00629.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %uGetSystemTimeAsFileTime .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetSystemTimeAsFileTime@4__imp__GetSystemTimeAsFileTime@4__head_libkernel32_a dchds00628.o/ 1301111099 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %tGetSystemTimeAdjustment .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetSystemTimeAdjustment@12__imp__GetSystemTimeAdjustment@12__head_libkernel32_a dchds00627.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %sGetSystemTime .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetSystemTime@4__imp__GetSystemTime@4__head_libkernel32_a dchds00626.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %rGetSystemRegistryQuota .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetSystemRegistryQuota@8__imp__GetSystemRegistryQuota@8__head_libkernel32_a dchds00625.o/ 1301111099 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %qGetSystemPreferredUILanguages .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetSystemPreferredUILanguages@16__imp__GetSystemPreferredUILanguages@16__head_libkernel32_a dchds00624.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %pGetSystemPowerStatus .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetSystemPowerStatus@4__imp__GetSystemPowerStatus@4__head_libkernel32_a dchds00623.o/ 1301111099 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %oGetSystemInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetSystemInfo@4__imp__GetSystemInfo@4__head_libkernel32_a dchds00622.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %nGetSystemFirmwareTable .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetSystemFirmwareTable@16__imp__GetSystemFirmwareTable@16__head_libkernel32_a dchds00621.o/ 1301111099 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %mGetSystemFileCacheSize .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetSystemFileCacheSize@12__imp__GetSystemFileCacheSize@12__head_libkernel32_a dchds00620.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %lGetSystemDirectoryW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetSystemDirectoryW@8__imp__GetSystemDirectoryW@8__head_libkernel32_a dchds00619.o/ 1301111099 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %kGetSystemDirectoryA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetSystemDirectoryA@8__imp__GetSystemDirectoryA@8__head_libkernel32_a dchds00618.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %jGetSystemDefaultUILanguage .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetSystemDefaultUILanguage@0__imp__GetSystemDefaultUILanguage@0__head_libkernel32_a dchds00617.o/ 1301111099 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %iGetSystemDefaultLocaleName .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetSystemDefaultLocaleName@8__imp__GetSystemDefaultLocaleName@8__head_libkernel32_a dchds00616.o/ 1301111099 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %hGetSystemDefaultLangID .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetSystemDefaultLangID@0__imp__GetSystemDefaultLangID@0__head_libkernel32_a dchds00615.o/ 1301111099 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %gGetSystemDefaultLCID .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetSystemDefaultLCID@0__imp__GetSystemDefaultLCID@0__head_libkernel32_a dchds00614.o/ 1301111099 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %fGetSystemDEPPolicy .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetSystemDEPPolicy@0__imp__GetSystemDEPPolicy@0__head_libkernel32_a dchds00613.o/ 1301111099 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %eGetStringTypeW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetStringTypeW@16__imp__GetStringTypeW@16__head_libkernel32_a dchds00612.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %dGetStringTypeExW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetStringTypeExW@20__imp__GetStringTypeExW@20__head_libkernel32_a dchds00611.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %cGetStringTypeExA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetStringTypeExA@20__imp__GetStringTypeExA@20__head_libkernel32_a dchds00610.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %bGetStringTypeA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetStringTypeA@20__imp__GetStringTypeA@20__head_libkernel32_a dchds00609.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %aGetStringScripts .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetStringScripts@20__imp__GetStringScripts@20__head_libkernel32_a dchds00608.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %`GetStdHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetStdHandle@4__imp__GetStdHandle@4__head_libkernel32_a dchds00607.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_GetStartupInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetStartupInfoW@4__imp__GetStartupInfoW@4__head_libkernel32_a dchds00606.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %^GetStartupInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetStartupInfoA@4__imp__GetStartupInfoA@4__head_libkernel32_a dchds00605.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %]GetShortPathNameW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetShortPathNameW@12__imp__GetShortPathNameW@12__head_libkernel32_a dchds00604.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %\GetShortPathNameA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetShortPathNameA@12__imp__GetShortPathNameA@12__head_libkernel32_a dchds00603.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %[GetQueuedCompletionStatusEx .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetQueuedCompletionStatusEx@24__imp__GetQueuedCompletionStatusEx@24__head_libkernel32_a dchds00602.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ZGetQueuedCompletionStatus .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetQueuedCompletionStatus@20__imp__GetQueuedCompletionStatus@20__head_libkernel32_a dchds00601.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %YGetProfileStringW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetProfileStringW@20__imp__GetProfileStringW@20__head_libkernel32_a dchds00600.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %XGetProfileStringA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetProfileStringA@20__imp__GetProfileStringA@20__head_libkernel32_a dchds00599.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %WGetProfileSectionW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetProfileSectionW@12__imp__GetProfileSectionW@12__head_libkernel32_a dchds00598.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VGetProfileSectionA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetProfileSectionA@12__imp__GetProfileSectionA@12__head_libkernel32_a dchds00597.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %UGetProfileIntW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetProfileIntW@12__imp__GetProfileIntW@12__head_libkernel32_a dchds00596.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %TGetProfileIntA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetProfileIntA@12__imp__GetProfileIntA@12__head_libkernel32_a dchds00595.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SGetProductInfo .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetProductInfo@20__imp__GetProductInfo@20__head_libkernel32_a dchds00594.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %RGetProcessorSystemCycleTime .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetProcessorSystemCycleTime@12__imp__GetProcessorSystemCycleTime@12__head_libkernel32_a dchds00593.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %QGetProcessWorkingSetSizeEx .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetProcessWorkingSetSizeEx@16__imp__GetProcessWorkingSetSizeEx@16__head_libkernel32_a dchds00592.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %PGetProcessWorkingSetSize .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetProcessWorkingSetSize@12__imp__GetProcessWorkingSetSize@12__head_libkernel32_a dchds00591.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %OGetProcessVersion .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetProcessVersion@4__imp__GetProcessVersion@4__head_libkernel32_a dchds00590.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %NGetProcessTimes .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetProcessTimes@20__imp__GetProcessTimes@20__head_libkernel32_a dchds00589.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %MGetProcessShutdownParameters .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetProcessShutdownParameters@8__imp__GetProcessShutdownParameters@8__head_libkernel32_a dchds00588.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %LGetProcessPriorityBoost .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetProcessPriorityBoost@8__imp__GetProcessPriorityBoost@8__head_libkernel32_a dchds00587.o/ 1301111098 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %KGetProcessPreferredUILanguages .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_GetProcessPreferredUILanguages@16__imp__GetProcessPreferredUILanguages@16__head_libkernel32_a dchds00586.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %JGetProcessIoCounters .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetProcessIoCounters@8__imp__GetProcessIoCounters@8__head_libkernel32_a dchds00585.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %IGetProcessIdOfThread .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetProcessIdOfThread@4__imp__GetProcessIdOfThread@4__head_libkernel32_a dchds00584.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %HGetProcessId .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetProcessId@4__imp__GetProcessId@4__head_libkernel32_a dchds00583.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GGetProcessHeaps .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetProcessHeaps@8__imp__GetProcessHeaps@8__head_libkernel32_a dchds00582.o/ 1301111098 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %FGetProcessHeap .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GetProcessHeap@0__imp__GetProcessHeap@0__head_libkernel32_a dchds00581.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EGetProcessHandleCount .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_GetProcessHandleCount@8__imp__GetProcessHandleCount@8__head_libkernel32_a dchds00580.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DGetProcessGroupAffinity .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetProcessGroupAffinity@12__imp__GetProcessGroupAffinity@12__head_libkernel32_a dchds00579.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CGetProcessDEPPolicy .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetProcessDEPPolicy@12__imp__GetProcessDEPPolicy@12__head_libkernel32_a dchds00578.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BGetProcessAffinityMask .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetProcessAffinityMask@12__imp__GetProcessAffinityMask@12__head_libkernel32_a dchds00577.o/ 1301111098 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %AGetProcAddress .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GetProcAddress@8__imp__GetProcAddress@8__head_libkernel32_a dchds00576.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %@GetPrivateProfileStructW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetPrivateProfileStructW@20__imp__GetPrivateProfileStructW@20__head_libkernel32_a dchds00575.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %?GetPrivateProfileStructA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetPrivateProfileStructA@20__imp__GetPrivateProfileStructA@20__head_libkernel32_a dchds00574.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %>GetPrivateProfileStringW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetPrivateProfileStringW@24__imp__GetPrivateProfileStringW@24__head_libkernel32_a dchds00573.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %=GetPrivateProfileStringA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetPrivateProfileStringA@24__imp__GetPrivateProfileStringA@24__head_libkernel32_a dchds00572.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %<GetPrivateProfileSectionW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetPrivateProfileSectionW@16__imp__GetPrivateProfileSectionW@16__head_libkernel32_a dchds00571.o/ 1301111098 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %;GetPrivateProfileSectionNamesW .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_GetPrivateProfileSectionNamesW@12__imp__GetPrivateProfileSectionNamesW@12__head_libkernel32_a dchds00570.o/ 1301111098 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %:GetPrivateProfileSectionNamesA .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_GetPrivateProfileSectionNamesA@12__imp__GetPrivateProfileSectionNamesA@12__head_libkernel32_a dchds00569.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %9GetPrivateProfileSectionA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetPrivateProfileSectionA@16__imp__GetPrivateProfileSectionA@16__head_libkernel32_a dchds00568.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %8GetPrivateProfileIntW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetPrivateProfileIntW@16__imp__GetPrivateProfileIntW@16__head_libkernel32_a dchds00567.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %7GetPrivateProfileIntA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetPrivateProfileIntA@16__imp__GetPrivateProfileIntA@16__head_libkernel32_a dchds00566.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %6GetPriorityClass .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetPriorityClass@4__imp__GetPriorityClass@4__head_libkernel32_a dchds00565.o/ 1301111098 0 0 100666 687 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %5GetPhysicallyInstalledSystemMemory .text.data.bss.idata$7.idata$5.idata$4.idata$6*Vk_GetPhysicallyInstalledSystemMemory@4__imp__GetPhysicallyInstalledSystemMemory@4__head_libkernel32_a dchds00564.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %4GetOverlappedResult .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetOverlappedResult@16__imp__GetOverlappedResult@16__head_libkernel32_a dchds00563.o/ 1301111098 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %3GetOEMCP .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_GetOEMCP@0__imp__GetOEMCP@0__head_libkernel32_a dchds00562.o/ 1301111098 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %2GetNumberOfConsoleMouseButtons .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetNumberOfConsoleMouseButtons@4__imp__GetNumberOfConsoleMouseButtons@4__head_libkernel32_a dchds00561.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %1GetNumberOfConsoleInputEvents .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_GetNumberOfConsoleInputEvents@8__imp__GetNumberOfConsoleInputEvents@8__head_libkernel32_a dchds00560.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %0GetNumberOfConsoleFonts .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetNumberOfConsoleFonts@0__imp__GetNumberOfConsoleFonts@0__head_libkernel32_a dchds00559.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %/GetNumberFormatW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetNumberFormatW@24__imp__GetNumberFormatW@24__head_libkernel32_a dchds00558.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %.GetNumberFormatEx .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetNumberFormatEx@24__imp__GetNumberFormatEx@24__head_libkernel32_a dchds00557.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %-GetNumberFormatA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetNumberFormatA@24__imp__GetNumberFormatA@24__head_libkernel32_a dchds00556.o/ 1301111098 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %,GetNumaProximityNodeEx .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetNumaProximityNodeEx@8__imp__GetNumaProximityNodeEx@8__head_libkernel32_a dchds00555.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %+GetNumaProximityNode .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetNumaProximityNode@8__imp__GetNumaProximityNode@8__head_libkernel32_a dchds00554.o/ 1301111098 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %*GetNumaProcessorNodeEx .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetNumaProcessorNodeEx@8__imp__GetNumaProcessorNodeEx@8__head_libkernel32_a dchds00553.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %)GetNumaProcessorNode .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetNumaProcessorNode@8__imp__GetNumaProcessorNode@8__head_libkernel32_a dchds00552.o/ 1301111098 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %(GetNumaNodeProcessorMaskEx .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetNumaNodeProcessorMaskEx@8__imp__GetNumaNodeProcessorMaskEx@8__head_libkernel32_a dchds00551.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %'GetNumaNodeProcessorMask .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetNumaNodeProcessorMask@8__imp__GetNumaNodeProcessorMask@8__head_libkernel32_a dchds00550.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %&GetNumaNodeNumberFromHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetNumaNodeNumberFromHandle@8__imp__GetNumaNodeNumberFromHandle@8__head_libkernel32_a dchds00549.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %%GetNumaHighestNodeNumber .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetNumaHighestNodeNumber@4__imp__GetNumaHighestNodeNumber@4__head_libkernel32_a dchds00548.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %$GetNumaAvailableMemoryNodeEx .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetNumaAvailableMemoryNodeEx@8__imp__GetNumaAvailableMemoryNodeEx@8__head_libkernel32_a dchds00547.o/ 1301111098 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %#GetNumaAvailableMemoryNode .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetNumaAvailableMemoryNode@8__imp__GetNumaAvailableMemoryNode@8__head_libkernel32_a dchds00546.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %"GetNextVDMCommand .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetNextVDMCommand@4__imp__GetNextVDMCommand@4__head_libkernel32_a dchds00545.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %!GetNativeSystemInfo .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetNativeSystemInfo@4__imp__GetNativeSystemInfo@4__head_libkernel32_a dchds00544.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ % GetNamedPipeServerSessionId .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetNamedPipeServerSessionId@8__imp__GetNamedPipeServerSessionId@8__head_libkernel32_a dchds00543.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetNamedPipeServerProcessId .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetNamedPipeServerProcessId@8__imp__GetNamedPipeServerProcessId@8__head_libkernel32_a dchds00542.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetNamedPipeInfo .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetNamedPipeInfo@20__imp__GetNamedPipeInfo@20__head_libkernel32_a dchds00541.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetNamedPipeHandleStateW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetNamedPipeHandleStateW@28__imp__GetNamedPipeHandleStateW@28__head_libkernel32_a dchds00540.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetNamedPipeHandleStateA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetNamedPipeHandleStateA@28__imp__GetNamedPipeHandleStateA@28__head_libkernel32_a dchds00539.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetNamedPipeClientSessionId .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetNamedPipeClientSessionId@8__imp__GetNamedPipeClientSessionId@8__head_libkernel32_a dchds00538.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetNamedPipeClientProcessId .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetNamedPipeClientProcessId@8__imp__GetNamedPipeClientProcessId@8__head_libkernel32_a dchds00537.o/ 1301111098 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %GetNamedPipeClientComputerNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_GetNamedPipeClientComputerNameW@12__imp__GetNamedPipeClientComputerNameW@12__head_libkernel32_a dchds00536.o/ 1301111098 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %GetNamedPipeClientComputerNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_GetNamedPipeClientComputerNameA@12__imp__GetNamedPipeClientComputerNameA@12__head_libkernel32_a dchds00535.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetNamedPipeAttribute .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetNamedPipeAttribute@20__imp__GetNamedPipeAttribute@20__head_libkernel32_a dchds00534.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetNLSVersionEx .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetNLSVersionEx@12__imp__GetNLSVersionEx@12__head_libkernel32_a dchds00533.o/ 1301111098 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetNLSVersion .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GetNLSVersion@12__imp__GetNLSVersion@12__head_libkernel32_a dchds00532.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetModuleHandleW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetModuleHandleW@4__imp__GetModuleHandleW@4__head_libkernel32_a dchds00531.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetModuleHandleExW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetModuleHandleExW@12__imp__GetModuleHandleExW@12__head_libkernel32_a dchds00530.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetModuleHandleExA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetModuleHandleExA@12__imp__GetModuleHandleExA@12__head_libkernel32_a dchds00529.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetModuleHandleA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetModuleHandleA@4__imp__GetModuleHandleA@4__head_libkernel32_a dchds00528.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetModuleFileNameW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetModuleFileNameW@12__imp__GetModuleFileNameW@12__head_libkernel32_a dchds00527.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetModuleFileNameA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetModuleFileNameA@12__imp__GetModuleFileNameA@12__head_libkernel32_a dchds00526.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetMaximumProcessorGroupCount .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_GetMaximumProcessorGroupCount@0__imp__GetMaximumProcessorGroupCount@0__head_libkernel32_a dchds00525.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ % GetMaximumProcessorCount .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetMaximumProcessorCount@4__imp__GetMaximumProcessorCount@4__head_libkernel32_a dchds00524.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % GetMailslotInfo .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetMailslotInfo@20__imp__GetMailslotInfo@20__head_libkernel32_a dchds00523.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % GetLongPathNameW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetLongPathNameW@12__imp__GetLongPathNameW@12__head_libkernel32_a dchds00522.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ % GetLongPathNameTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetLongPathNameTransactedW@16__imp__GetLongPathNameTransactedW@16__head_libkernel32_a dchds00521.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ % GetLongPathNameTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetLongPathNameTransactedA@16__imp__GetLongPathNameTransactedA@16__head_libkernel32_a dchds00520.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetLongPathNameA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetLongPathNameA@12__imp__GetLongPathNameA@12__head_libkernel32_a dchds00519.o/ 1301111098 0 0 100666 681 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %GetLogicalProcessorInformationEx .text.data.bss.idata$7.idata$5.idata$4.idata$6)Ti_GetLogicalProcessorInformationEx@12__imp__GetLogicalProcessorInformationEx@12__head_libkernel32_a dchds00518.o/ 1301111098 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %GetLogicalProcessorInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetLogicalProcessorInformation@8__imp__GetLogicalProcessorInformation@8__head_libkernel32_a dchds00517.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetLogicalDrives .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetLogicalDrives@0__imp__GetLogicalDrives@0__head_libkernel32_a dchds00516.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetLogicalDriveStringsW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetLogicalDriveStringsW@8__imp__GetLogicalDriveStringsW@8__head_libkernel32_a dchds00515.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetLogicalDriveStringsA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetLogicalDriveStringsA@8__imp__GetLogicalDriveStringsA@8__head_libkernel32_a dchds00514.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetLocaleInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetLocaleInfoW@16__imp__GetLocaleInfoW@16__head_libkernel32_a dchds00513.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetLocaleInfoEx .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetLocaleInfoEx@16__imp__GetLocaleInfoEx@16__head_libkernel32_a dchds00512.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetLocaleInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetLocaleInfoA@16__imp__GetLocaleInfoA@16__head_libkernel32_a dchds00511.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetLocalTime .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetLocalTime@4__imp__GetLocalTime@4__head_libkernel32_a dchds00510.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetLastError .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetLastError@0__imp__GetLastError@0__head_libkernel32_a dchds00509.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetLargestConsoleWindowSize .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetLargestConsoleWindowSize@4__imp__GetLargestConsoleWindowSize@4__head_libkernel32_a dchds00508.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetLargePageMinimum .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetLargePageMinimum@0__imp__GetLargePageMinimum@0__head_libkernel32_a dchds00507.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetHandleInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetHandleInformation@8__imp__GetHandleInformation@8__head_libkernel32_a dchds00506.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetHandleContext .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetHandleContext@4__imp__GetHandleContext@4__head_libkernel32_a dchds00505.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetGeoInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetGeoInfoW@20__imp__GetGeoInfoW@20__head_libkernel32_a dchds00504.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetGeoInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetGeoInfoA@20__imp__GetGeoInfoA@20__head_libkernel32_a dchds00503.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetFullPathNameW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetFullPathNameW@16__imp__GetFullPathNameW@16__head_libkernel32_a dchds00502.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetFullPathNameTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetFullPathNameTransactedW@20__imp__GetFullPathNameTransactedW@20__head_libkernel32_a dchds00501.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetFullPathNameTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetFullPathNameTransactedA@20__imp__GetFullPathNameTransactedA@20__head_libkernel32_a dchds00500.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetFullPathNameA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetFullPathNameA@16__imp__GetFullPathNameA@16__head_libkernel32_a dchds00499.o/ 1301111098 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %GetFirmwareEnvironmentVariableW .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_GetFirmwareEnvironmentVariableW@16__imp__GetFirmwareEnvironmentVariableW@16__head_libkernel32_a dchds00498.o/ 1301111098 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %GetFirmwareEnvironmentVariableA .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_GetFirmwareEnvironmentVariableA@16__imp__GetFirmwareEnvironmentVariableA@16__head_libkernel32_a dchds00497.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetFinalPathNameByHandleW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetFinalPathNameByHandleW@16__imp__GetFinalPathNameByHandleW@16__head_libkernel32_a dchds00496.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetFinalPathNameByHandleA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetFinalPathNameByHandleA@16__imp__GetFinalPathNameByHandleA@16__head_libkernel32_a dchds00495.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetFileType .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_GetFileType@4__imp__GetFileType@4__head_libkernel32_a dchds00494.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetFileTime .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetFileTime@16__imp__GetFileTime@16__head_libkernel32_a dchds00493.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetFileSizeEx .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetFileSizeEx@8__imp__GetFileSizeEx@8__head_libkernel32_a dchds00492.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetFileSize .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_GetFileSize@8__imp__GetFileSize@8__head_libkernel32_a dchds00491.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetFileMUIPath .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetFileMUIPath@28__imp__GetFileMUIPath@28__head_libkernel32_a dchds00490.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetFileMUIInfo .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetFileMUIInfo@16__imp__GetFileMUIInfo@16__head_libkernel32_a dchds00489.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetFileInformationByHandleEx .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_GetFileInformationByHandleEx@16__imp__GetFileInformationByHandleEx@16__head_libkernel32_a dchds00488.o/ 1301111098 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetFileInformationByHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetFileInformationByHandle@8__imp__GetFileInformationByHandle@8__head_libkernel32_a dchds00487.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetFileBandwidthReservation .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetFileBandwidthReservation@24__imp__GetFileBandwidthReservation@24__head_libkernel32_a dchds00486.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetFileAttributesW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetFileAttributesW@4__imp__GetFileAttributesW@4__head_libkernel32_a dchds00485.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetFileAttributesTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_GetFileAttributesTransactedW@16__imp__GetFileAttributesTransactedW@16__head_libkernel32_a dchds00484.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetFileAttributesTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_GetFileAttributesTransactedA@16__imp__GetFileAttributesTransactedA@16__head_libkernel32_a dchds00483.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetFileAttributesExW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_GetFileAttributesExW@12__imp__GetFileAttributesExW@12__head_libkernel32_a dchds00482.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetFileAttributesExA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_GetFileAttributesExA@12__imp__GetFileAttributesExA@12__head_libkernel32_a dchds00481.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetFileAttributesA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetFileAttributesA@4__imp__GetFileAttributesA@4__head_libkernel32_a dchds00480.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetExtendedFeaturesMask .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetExtendedFeaturesMask@4__imp__GetExtendedFeaturesMask@4__head_libkernel32_a dchds00479.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetExtendedContextLength .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetExtendedContextLength@8__imp__GetExtendedContextLength@8__head_libkernel32_a dchds00478.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetExitCodeThread .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetExitCodeThread@8__imp__GetExitCodeThread@8__head_libkernel32_a dchds00477.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetExitCodeProcess .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetExitCodeProcess@8__imp__GetExitCodeProcess@8__head_libkernel32_a dchds00476.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetErrorMode .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetErrorMode@0__imp__GetErrorMode@0__head_libkernel32_a dchds00475.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetEraNameCountedString .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetEraNameCountedString@16__imp__GetEraNameCountedString@16__head_libkernel32_a dchds00474.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetEnvironmentVariableW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetEnvironmentVariableW@12__imp__GetEnvironmentVariableW@12__head_libkernel32_a dchds00473.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetEnvironmentVariableA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetEnvironmentVariableA@12__imp__GetEnvironmentVariableA@12__head_libkernel32_a dchds00472.o/ 1301111098 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetEnvironmentStringsW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetEnvironmentStringsW@0__imp__GetEnvironmentStringsW@0__head_libkernel32_a dchds00471.o/ 1301111098 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetEnvironmentStringsA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetEnvironmentStringsA@0__imp__GetEnvironmentStringsA@0__head_libkernel32_a dchds00470.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetEnvironmentStrings .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_GetEnvironmentStrings@0__imp__GetEnvironmentStrings@0__head_libkernel32_a dchds00469.o/ 1301111098 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetEnabledExtendedFeatures .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetEnabledExtendedFeatures@8__imp__GetEnabledExtendedFeatures@8__head_libkernel32_a dchds00468.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetDynamicTimeZoneInformation .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_GetDynamicTimeZoneInformation@4__imp__GetDynamicTimeZoneInformation@4__head_libkernel32_a dchds00467.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetDurationFormatEx .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetDurationFormatEx@32__imp__GetDurationFormatEx@32__head_libkernel32_a dchds00466.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetDurationFormat .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetDurationFormat@32__imp__GetDurationFormat@32__head_libkernel32_a dchds00465.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetDriveTypeW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetDriveTypeW@4__imp__GetDriveTypeW@4__head_libkernel32_a dchds00464.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetDriveTypeA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetDriveTypeA@4__imp__GetDriveTypeA@4__head_libkernel32_a dchds00463.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetDllDirectoryW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetDllDirectoryW@8__imp__GetDllDirectoryW@8__head_libkernel32_a dchds00462.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetDllDirectoryA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetDllDirectoryA@8__imp__GetDllDirectoryA@8__head_libkernel32_a dchds00461.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetDiskFreeSpaceW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetDiskFreeSpaceW@20__imp__GetDiskFreeSpaceW@20__head_libkernel32_a dchds00460.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetDiskFreeSpaceExW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetDiskFreeSpaceExW@16__imp__GetDiskFreeSpaceExW@16__head_libkernel32_a dchds00459.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetDiskFreeSpaceExA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetDiskFreeSpaceExA@16__imp__GetDiskFreeSpaceExA@16__head_libkernel32_a dchds00458.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetDiskFreeSpaceA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetDiskFreeSpaceA@20__imp__GetDiskFreeSpaceA@20__head_libkernel32_a dchds00457.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetDevicePowerState .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetDevicePowerState@8__imp__GetDevicePowerState@8__head_libkernel32_a dchds00456.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetDefaultCommConfigW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetDefaultCommConfigW@12__imp__GetDefaultCommConfigW@12__head_libkernel32_a dchds00455.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetDefaultCommConfigA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetDefaultCommConfigA@12__imp__GetDefaultCommConfigA@12__head_libkernel32_a dchds00454.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetDateFormatW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetDateFormatW@24__imp__GetDateFormatW@24__head_libkernel32_a dchds00453.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetDateFormatEx .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetDateFormatEx@28__imp__GetDateFormatEx@28__head_libkernel32_a dchds00452.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetDateFormatA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetDateFormatA@24__imp__GetDateFormatA@24__head_libkernel32_a dchds00451.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetCurrentThreadId .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetCurrentThreadId@0__imp__GetCurrentThreadId@0__head_libkernel32_a dchds00450.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetCurrentThread .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetCurrentThread@0__imp__GetCurrentThread@0__head_libkernel32_a dchds00449.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetCurrentProcessorNumberEx .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_GetCurrentProcessorNumberEx@4__imp__GetCurrentProcessorNumberEx@4__head_libkernel32_a dchds00448.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetCurrentProcessorNumber .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetCurrentProcessorNumber@0__imp__GetCurrentProcessorNumber@0__head_libkernel32_a dchds00447.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetCurrentProcessId .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetCurrentProcessId@0__imp__GetCurrentProcessId@0__head_libkernel32_a dchds00446.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetCurrentProcess .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetCurrentProcess@0__imp__GetCurrentProcess@0__head_libkernel32_a dchds00445.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetCurrentDirectoryW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetCurrentDirectoryW@8__imp__GetCurrentDirectoryW@8__head_libkernel32_a dchds00444.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetCurrentDirectoryA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetCurrentDirectoryA@8__imp__GetCurrentDirectoryA@8__head_libkernel32_a dchds00443.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetCurrentConsoleFontEx .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetCurrentConsoleFontEx@12__imp__GetCurrentConsoleFontEx@12__head_libkernel32_a dchds00442.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetCurrentConsoleFont .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetCurrentConsoleFont@12__imp__GetCurrentConsoleFont@12__head_libkernel32_a dchds00441.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetCurrentActCtx .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetCurrentActCtx@4__imp__GetCurrentActCtx@4__head_libkernel32_a dchds00440.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetCurrencyFormatW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetCurrencyFormatW@24__imp__GetCurrencyFormatW@24__head_libkernel32_a dchds00439.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetCurrencyFormatEx .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetCurrencyFormatEx@24__imp__GetCurrencyFormatEx@24__head_libkernel32_a dchds00438.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetCurrencyFormatA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetCurrencyFormatA@24__imp__GetCurrencyFormatA@24__head_libkernel32_a dchds00437.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetConsoleWindow .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetConsoleWindow@0__imp__GetConsoleWindow@0__head_libkernel32_a dchds00436.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetConsoleTitleW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetConsoleTitleW@8__imp__GetConsoleTitleW@8__head_libkernel32_a dchds00435.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetConsoleTitleA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetConsoleTitleA@8__imp__GetConsoleTitleA@8__head_libkernel32_a dchds00434.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetConsoleSelectionInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetConsoleSelectionInfo@4__imp__GetConsoleSelectionInfo@4__head_libkernel32_a dchds00433.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetConsoleScreenBufferInfoEx .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetConsoleScreenBufferInfoEx@8__imp__GetConsoleScreenBufferInfoEx@8__head_libkernel32_a dchds00432.o/ 1301111098 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetConsoleScreenBufferInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetConsoleScreenBufferInfo@8__imp__GetConsoleScreenBufferInfo@8__head_libkernel32_a dchds00431.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleProcessList .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_GetConsoleProcessList@8__imp__GetConsoleProcessList@8__head_libkernel32_a dchds00430.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleOutputCP .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetConsoleOutputCP@0__imp__GetConsoleOutputCP@0__head_libkernel32_a dchds00429.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetConsoleOriginalTitleW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetConsoleOriginalTitleW@8__imp__GetConsoleOriginalTitleW@8__head_libkernel32_a dchds00428.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetConsoleOriginalTitleA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetConsoleOriginalTitleA@8__imp__GetConsoleOriginalTitleA@8__head_libkernel32_a dchds00427.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetConsoleNlsMode .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetConsoleNlsMode@8__imp__GetConsoleNlsMode@8__head_libkernel32_a dchds00426.o/ 1301111098 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetConsoleMode .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GetConsoleMode@8__imp__GetConsoleMode@8__head_libkernel32_a dchds00425.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetConsoleKeyboardLayoutNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_GetConsoleKeyboardLayoutNameW@4__imp__GetConsoleKeyboardLayoutNameW@4__head_libkernel32_a dchds00424.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %GetConsoleKeyboardLayoutNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_GetConsoleKeyboardLayoutNameA@4__imp__GetConsoleKeyboardLayoutNameA@4__head_libkernel32_a dchds00423.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetConsoleInputWaitHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_GetConsoleInputWaitHandle@0__imp__GetConsoleInputWaitHandle@0__head_libkernel32_a dchds00422.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetConsoleInputExeNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetConsoleInputExeNameW@8__imp__GetConsoleInputExeNameW@8__head_libkernel32_a dchds00421.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetConsoleInputExeNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetConsoleInputExeNameA@8__imp__GetConsoleInputExeNameA@8__head_libkernel32_a dchds00420.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleHistoryInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_GetConsoleHistoryInfo@4__imp__GetConsoleHistoryInfo@4__head_libkernel32_a dchds00419.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetConsoleHardwareState .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetConsoleHardwareState@12__imp__GetConsoleHardwareState@12__head_libkernel32_a dchds00418.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleFontSize .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetConsoleFontSize@8__imp__GetConsoleFontSize@8__head_libkernel32_a dchds00417.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleFontInfo .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetConsoleFontInfo@16__imp__GetConsoleFontInfo@16__head_libkernel32_a dchds00416.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleDisplayMode .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_GetConsoleDisplayMode@4__imp__GetConsoleDisplayMode@4__head_libkernel32_a dchds00415.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleCursorMode .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_GetConsoleCursorMode@12__imp__GetConsoleCursorMode@12__head_libkernel32_a dchds00414.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleCursorInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetConsoleCursorInfo@8__imp__GetConsoleCursorInfo@8__head_libkernel32_a dchds00413.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetConsoleCommandHistoryW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetConsoleCommandHistoryW@12__imp__GetConsoleCommandHistoryW@12__head_libkernel32_a dchds00412.o/ 1301111098 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %GetConsoleCommandHistoryLengthW .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_GetConsoleCommandHistoryLengthW@4__imp__GetConsoleCommandHistoryLengthW@4__head_libkernel32_a dchds00411.o/ 1301111098 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %GetConsoleCommandHistoryLengthA .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_GetConsoleCommandHistoryLengthA@4__imp__GetConsoleCommandHistoryLengthA@4__head_libkernel32_a dchds00410.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetConsoleCommandHistoryA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetConsoleCommandHistoryA@12__imp__GetConsoleCommandHistoryA@12__head_libkernel32_a dchds00409.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleCharType .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetConsoleCharType@12__imp__GetConsoleCharType@12__head_libkernel32_a dchds00408.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetConsoleCP .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetConsoleCP@0__imp__GetConsoleCP@0__head_libkernel32_a dchds00407.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleAliasesW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetConsoleAliasesW@12__imp__GetConsoleAliasesW@12__head_libkernel32_a dchds00406.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetConsoleAliasesLengthW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetConsoleAliasesLengthW@4__imp__GetConsoleAliasesLengthW@4__head_libkernel32_a dchds00405.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetConsoleAliasesLengthA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetConsoleAliasesLengthA@4__imp__GetConsoleAliasesLengthA@4__head_libkernel32_a dchds00404.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleAliasesA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetConsoleAliasesA@12__imp__GetConsoleAliasesA@12__head_libkernel32_a dchds00403.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetConsoleAliasW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetConsoleAliasW@16__imp__GetConsoleAliasW@16__head_libkernel32_a dchds00402.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleAliasExesW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetConsoleAliasExesW@8__imp__GetConsoleAliasExesW@8__head_libkernel32_a dchds00401.o/ 1301111098 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetConsoleAliasExesLengthW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetConsoleAliasExesLengthW@0__imp__GetConsoleAliasExesLengthW@0__head_libkernel32_a dchds00400.o/ 1301111098 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetConsoleAliasExesLengthA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_GetConsoleAliasExesLengthA@0__imp__GetConsoleAliasExesLengthA@0__head_libkernel32_a dchds00399.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetConsoleAliasExesA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_GetConsoleAliasExesA@8__imp__GetConsoleAliasExesA@8__head_libkernel32_a dchds00398.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetConsoleAliasA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetConsoleAliasA@16__imp__GetConsoleAliasA@16__head_libkernel32_a dchds00397.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetComputerNameW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetComputerNameW@8__imp__GetComputerNameW@8__head_libkernel32_a dchds00396.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetComputerNameExW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetComputerNameExW@12__imp__GetComputerNameExW@12__head_libkernel32_a dchds00395.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetComputerNameExA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_GetComputerNameExA@12__imp__GetComputerNameExA@12__head_libkernel32_a dchds00394.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetComputerNameA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_GetComputerNameA@8__imp__GetComputerNameA@8__head_libkernel32_a dchds00393.o/ 1301111098 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetCompressedFileSizeW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetCompressedFileSizeW@8__imp__GetCompressedFileSizeW@8__head_libkernel32_a dchds00392.o/ 1301111098 0 0 100666 681 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %GetCompressedFileSizeTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6)Ti_GetCompressedFileSizeTransactedW@12__imp__GetCompressedFileSizeTransactedW@12__head_libkernel32_a dchds00391.o/ 1301111098 0 0 100666 681 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %GetCompressedFileSizeTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6)Ti_GetCompressedFileSizeTransactedA@12__imp__GetCompressedFileSizeTransactedA@12__head_libkernel32_a dchds00390.o/ 1301111098 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetCompressedFileSizeA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetCompressedFileSizeA@8__imp__GetCompressedFileSizeA@8__head_libkernel32_a dchds00389.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetCommandLineW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetCommandLineW@0__imp__GetCommandLineW@0__head_libkernel32_a dchds00388.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetCommandLineA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetCommandLineA@0__imp__GetCommandLineA@0__head_libkernel32_a dchds00387.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetCommTimeouts .text.data.bss.idata$7.idata$5.idata$4.idata$60E_GetCommTimeouts@8__imp__GetCommTimeouts@8__head_libkernel32_a dchds00386.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetCommState .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_GetCommState@8__imp__GetCommState@8__head_libkernel32_a dchds00385.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetCommProperties .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetCommProperties@8__imp__GetCommProperties@8__head_libkernel32_a dchds00384.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetCommModemStatus .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetCommModemStatus@8__imp__GetCommModemStatus@8__head_libkernel32_a dchds00383.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetCommMask .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_GetCommMask@8__imp__GetCommMask@8__head_libkernel32_a dchds00382.o/ 1301111098 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %~GetCommConfig .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GetCommConfig@12__imp__GetCommConfig@12__head_libkernel32_a dchds00381.o/ 1301111098 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %}GetComPlusPackageInstallStatus .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetComPlusPackageInstallStatus@0__imp__GetComPlusPackageInstallStatus@0__head_libkernel32_a dchds00380.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %|GetCalendarWeekNumber .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetCalendarWeekNumber@16__imp__GetCalendarWeekNumber@16__head_libkernel32_a dchds00379.o/ 1301111098 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %{GetCalendarSupportedDateRange .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetCalendarSupportedDateRange@12__imp__GetCalendarSupportedDateRange@12__head_libkernel32_a dchds00378.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %zGetCalendarMonthsInYear .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetCalendarMonthsInYear@12__imp__GetCalendarMonthsInYear@12__head_libkernel32_a dchds00377.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %yGetCalendarInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetCalendarInfoW@24__imp__GetCalendarInfoW@24__head_libkernel32_a dchds00376.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %xGetCalendarInfoEx .text.data.bss.idata$7.idata$5.idata$4.idata$66K_GetCalendarInfoEx@28__imp__GetCalendarInfoEx@28__head_libkernel32_a dchds00375.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %wGetCalendarInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_GetCalendarInfoA@24__imp__GetCalendarInfoA@24__head_libkernel32_a dchds00374.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %vGetCalendarDifferenceInDays .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetCalendarDifferenceInDays@12__imp__GetCalendarDifferenceInDays@12__head_libkernel32_a dchds00373.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %uGetCalendarDaysInMonth .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetCalendarDaysInMonth@16__imp__GetCalendarDaysInMonth@16__head_libkernel32_a dchds00372.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %tGetCalendarDateFormatEx .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GetCalendarDateFormatEx@24__imp__GetCalendarDateFormatEx@24__head_libkernel32_a dchds00371.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %sGetCalendarDateFormat .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_GetCalendarDateFormat@24__imp__GetCalendarDateFormat@24__head_libkernel32_a dchds00370.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %rGetCPInfoExW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetCPInfoExW@12__imp__GetCPInfoExW@12__head_libkernel32_a dchds00369.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %qGetCPInfoExA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetCPInfoExA@12__imp__GetCPInfoExA@12__head_libkernel32_a dchds00368.o/ 1301111098 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %pGetCPInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_GetCPInfo@8__imp__GetCPInfo@8__head_libkernel32_a dchds00367.o/ 1301111098 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %oGetBinaryTypeW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GetBinaryTypeW@8__imp__GetBinaryTypeW@8__head_libkernel32_a dchds00366.o/ 1301111098 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %nGetBinaryTypeA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_GetBinaryTypeA@8__imp__GetBinaryTypeA@8__head_libkernel32_a dchds00365.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %mGetBinaryType .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetBinaryType@8__imp__GetBinaryType@8__head_libkernel32_a dchds00364.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %lGetAtomNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetAtomNameW@12__imp__GetAtomNameW@12__head_libkernel32_a dchds00363.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %kGetAtomNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_GetAtomNameA@12__imp__GetAtomNameA@12__head_libkernel32_a dchds00362.o/ 1301111098 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %jGetApplicationRestartSettings .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_GetApplicationRestartSettings@16__imp__GetApplicationRestartSettings@16__head_libkernel32_a dchds00361.o/ 1301111098 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %iGetApplicationRecoveryCallback .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_GetApplicationRecoveryCallback@20__imp__GetApplicationRecoveryCallback@20__head_libkernel32_a dchds00360.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %hGetActiveProcessorGroupCount .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__GetActiveProcessorGroupCount@0__imp__GetActiveProcessorGroupCount@0__head_libkernel32_a dchds00359.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %gGetActiveProcessorCount .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_GetActiveProcessorCount@4__imp__GetActiveProcessorCount@4__head_libkernel32_a dchds00358.o/ 1301111098 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %fGetACP .text.data.bss.idata$7.idata$5.idata$4.idata$63_GetACP@0__imp__GetACP@0__head_libkernel32_a dchds00357.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %eGenerateConsoleCtrlEvent .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_GenerateConsoleCtrlEvent@8__imp__GenerateConsoleCtrlEvent@8__head_libkernel32_a dchds00356.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %dFreeUserPhysicalPages .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_FreeUserPhysicalPages@12__imp__FreeUserPhysicalPages@12__head_libkernel32_a dchds00355.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %cFreeResource .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_FreeResource@4__imp__FreeResource@4__head_libkernel32_a dchds00354.o/ 1301111098 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %bFreeLibraryWhenCallbackReturns .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_FreeLibraryWhenCallbackReturns@8__imp__FreeLibraryWhenCallbackReturns@8__head_libkernel32_a dchds00353.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %aFreeLibraryAndExitThread .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_FreeLibraryAndExitThread@8__imp__FreeLibraryAndExitThread@8__head_libkernel32_a dchds00352.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %`FreeLibrary .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_FreeLibrary@4__imp__FreeLibrary@4__head_libkernel32_a dchds00351.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %_FreeEnvironmentStringsW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_FreeEnvironmentStringsW@4__imp__FreeEnvironmentStringsW@4__head_libkernel32_a dchds00350.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %^FreeEnvironmentStringsA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_FreeEnvironmentStringsA@4__imp__FreeEnvironmentStringsA@4__head_libkernel32_a dchds00349.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %]FreeConsole .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_FreeConsole@0__imp__FreeConsole@0__head_libkernel32_a dchds00348.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %\FormatMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_FormatMessageW@28__imp__FormatMessageW@28__head_libkernel32_a dchds00347.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %[FormatMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_FormatMessageA@28__imp__FormatMessageA@28__head_libkernel32_a dchds00346.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ZFoldStringW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_FoldStringW@20__imp__FoldStringW@20__head_libkernel32_a dchds00345.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %YFoldStringA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_FoldStringA@20__imp__FoldStringA@20__head_libkernel32_a dchds00344.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %XFlushViewOfFile .text.data.bss.idata$7.idata$5.idata$4.idata$60E_FlushViewOfFile@8__imp__FlushViewOfFile@8__head_libkernel32_a dchds00343.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %WFlushProcessWriteBuffers .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_FlushProcessWriteBuffers@0__imp__FlushProcessWriteBuffers@0__head_libkernel32_a dchds00342.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %VFlushInstructionCache .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_FlushInstructionCache@12__imp__FlushInstructionCache@12__head_libkernel32_a dchds00341.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %UFlushFileBuffers .text.data.bss.idata$7.idata$5.idata$4.idata$62G_FlushFileBuffers@4__imp__FlushFileBuffers@4__head_libkernel32_a dchds00340.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %TFlushConsoleInputBuffer .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_FlushConsoleInputBuffer@4__imp__FlushConsoleInputBuffer@4__head_libkernel32_a dchds00339.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SFlsSetValue .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_FlsSetValue@8__imp__FlsSetValue@8__head_libkernel32_a dchds00338.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RFlsGetValue .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_FlsGetValue@4__imp__FlsGetValue@4__head_libkernel32_a dchds00337.o/ 1301111098 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %QFlsFree .text.data.bss.idata$7.idata$5.idata$4.idata$6 5_FlsFree@4__imp__FlsFree@4__head_libkernel32_a dchds00336.o/ 1301111098 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %PFlsAlloc .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_FlsAlloc@4__imp__FlsAlloc@4__head_libkernel32_a dchds00335.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %OFindVolumeMountPointClose .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_FindVolumeMountPointClose@4__imp__FindVolumeMountPointClose@4__head_libkernel32_a dchds00334.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %NFindVolumeClose .text.data.bss.idata$7.idata$5.idata$4.idata$60E_FindVolumeClose@4__imp__FindVolumeClose@4__head_libkernel32_a dchds00333.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MFindStringOrdinal .text.data.bss.idata$7.idata$5.idata$4.idata$66K_FindStringOrdinal@24__imp__FindStringOrdinal@24__head_libkernel32_a dchds00332.o/ 1301111098 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %LFindResourceW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_FindResourceW@12__imp__FindResourceW@12__head_libkernel32_a dchds00331.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %KFindResourceExW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_FindResourceExW@16__imp__FindResourceExW@16__head_libkernel32_a dchds00330.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %JFindResourceExA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_FindResourceExA@16__imp__FindResourceExA@16__head_libkernel32_a dchds00329.o/ 1301111098 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IFindResourceA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_FindResourceA@12__imp__FindResourceA@12__head_libkernel32_a dchds00328.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %HFindNextVolumeW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_FindNextVolumeW@12__imp__FindNextVolumeW@12__head_libkernel32_a dchds00327.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GFindNextVolumeMountPointW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_FindNextVolumeMountPointW@12__imp__FindNextVolumeMountPointW@12__head_libkernel32_a dchds00326.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %FFindNextVolumeMountPointA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_FindNextVolumeMountPointA@12__imp__FindNextVolumeMountPointA@12__head_libkernel32_a dchds00325.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EFindNextVolumeA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_FindNextVolumeA@12__imp__FindNextVolumeA@12__head_libkernel32_a dchds00324.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DFindNextStreamW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_FindNextStreamW@8__imp__FindNextStreamW@8__head_libkernel32_a dchds00323.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CFindNextFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_FindNextFileW@8__imp__FindNextFileW@8__head_libkernel32_a dchds00322.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %BFindNextFileNameW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_FindNextFileNameW@12__imp__FindNextFileNameW@12__head_libkernel32_a dchds00321.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %AFindNextFileA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_FindNextFileA@8__imp__FindNextFileA@8__head_libkernel32_a dchds00320.o/ 1301111098 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %@FindNextChangeNotification .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_FindNextChangeNotification@4__imp__FindNextChangeNotification@4__head_libkernel32_a dchds00319.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %?FindNLSStringEx .text.data.bss.idata$7.idata$5.idata$4.idata$62G_FindNLSStringEx@40__imp__FindNLSStringEx@40__head_libkernel32_a dchds00318.o/ 1301111098 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %>FindNLSString .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_FindNLSString@28__imp__FindNLSString@28__head_libkernel32_a dchds00317.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %=FindFirstVolumeW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_FindFirstVolumeW@8__imp__FindFirstVolumeW@8__head_libkernel32_a dchds00316.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %<FindFirstVolumeMountPointW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_FindFirstVolumeMountPointW@12__imp__FindFirstVolumeMountPointW@12__head_libkernel32_a dchds00315.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %;FindFirstVolumeMountPointA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_FindFirstVolumeMountPointA@12__imp__FindFirstVolumeMountPointA@12__head_libkernel32_a dchds00314.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %:FindFirstVolumeA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_FindFirstVolumeA@8__imp__FindFirstVolumeA@8__head_libkernel32_a dchds00313.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %9FindFirstStreamW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_FindFirstStreamW@16__imp__FindFirstStreamW@16__head_libkernel32_a dchds00312.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %8FindFirstStreamTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_FindFirstStreamTransactedW@20__imp__FindFirstStreamTransactedW@20__head_libkernel32_a dchds00311.o/ 1301111098 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %7FindFirstFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_FindFirstFileW@8__imp__FindFirstFileW@8__head_libkernel32_a dchds00310.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %6FindFirstFileTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_FindFirstFileTransactedW@28__imp__FindFirstFileTransactedW@28__head_libkernel32_a dchds00309.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %5FindFirstFileTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_FindFirstFileTransactedA@28__imp__FindFirstFileTransactedA@28__head_libkernel32_a dchds00308.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %4FindFirstFileNameW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_FindFirstFileNameW@16__imp__FindFirstFileNameW@16__head_libkernel32_a dchds00307.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %3FindFirstFileNameTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_FindFirstFileNameTransactedW@20__imp__FindFirstFileNameTransactedW@20__head_libkernel32_a dchds00306.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %2FindFirstFileExW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_FindFirstFileExW@24__imp__FindFirstFileExW@24__head_libkernel32_a dchds00305.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %1FindFirstFileExA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_FindFirstFileExA@24__imp__FindFirstFileExA@24__head_libkernel32_a dchds00304.o/ 1301111098 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %0FindFirstFileA .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_FindFirstFileA@8__imp__FindFirstFileA@8__head_libkernel32_a dchds00303.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %/FindFirstChangeNotificationW .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_FindFirstChangeNotificationW@12__imp__FindFirstChangeNotificationW@12__head_libkernel32_a dchds00302.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %.FindFirstChangeNotificationA .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_FindFirstChangeNotificationA@12__imp__FindFirstChangeNotificationA@12__head_libkernel32_a dchds00301.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %-FindCloseChangeNotification .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_FindCloseChangeNotification@4__imp__FindCloseChangeNotification@4__head_libkernel32_a dchds00300.o/ 1301111098 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %,FindClose .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_FindClose@4__imp__FindClose@4__head_libkernel32_a dchds00299.o/ 1301111098 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %+FindAtomW .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_FindAtomW@4__imp__FindAtomW@4__head_libkernel32_a dchds00298.o/ 1301111098 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %*FindAtomA .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_FindAtomA@4__imp__FindAtomA@4__head_libkernel32_a dchds00297.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %)FindActCtxSectionStringW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_FindActCtxSectionStringW@20__imp__FindActCtxSectionStringW@20__head_libkernel32_a dchds00296.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %(FindActCtxSectionStringA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_FindActCtxSectionStringA@20__imp__FindActCtxSectionStringA@20__head_libkernel32_a dchds00295.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %'FindActCtxSectionGuid .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_FindActCtxSectionGuid@20__imp__FindActCtxSectionGuid@20__head_libkernel32_a dchds00294.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %&FillConsoleOutputCharacterW .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__FillConsoleOutputCharacterW@20__imp__FillConsoleOutputCharacterW@20__head_libkernel32_a dchds00293.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %%FillConsoleOutputCharacterA .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__FillConsoleOutputCharacterA@20__imp__FillConsoleOutputCharacterA@20__head_libkernel32_a dchds00292.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %$FillConsoleOutputAttribute .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_FillConsoleOutputAttribute@20__imp__FillConsoleOutputAttribute@20__head_libkernel32_a dchds00291.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %#FileTimeToSystemTime .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_FileTimeToSystemTime@8__imp__FileTimeToSystemTime@8__head_libkernel32_a dchds00290.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %"FileTimeToLocalFileTime .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_FileTimeToLocalFileTime@8__imp__FileTimeToLocalFileTime@8__head_libkernel32_a dchds00289.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %!FileTimeToDosDateTime .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_FileTimeToDosDateTime@12__imp__FileTimeToDosDateTime@12__head_libkernel32_a dchds00288.o/ 1301111098 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % FatalExit .text.data.bss.idata$7.idata$5.idata$4.idata$6$9_FatalExit@4__imp__FatalExit@4__head_libkernel32_a dchds00287.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FatalAppExitW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_FatalAppExitW@8__imp__FatalAppExitW@8__head_libkernel32_a dchds00286.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FatalAppExitA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_FatalAppExitA@8__imp__FatalAppExitA@8__head_libkernel32_a dchds00285.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %ExpungeConsoleCommandHistoryW .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_ExpungeConsoleCommandHistoryW@4__imp__ExpungeConsoleCommandHistoryW@4__head_libkernel32_a dchds00284.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %ExpungeConsoleCommandHistoryA .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_ExpungeConsoleCommandHistoryA@4__imp__ExpungeConsoleCommandHistoryA@4__head_libkernel32_a dchds00283.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ExpandEnvironmentStringsW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_ExpandEnvironmentStringsW@12__imp__ExpandEnvironmentStringsW@12__head_libkernel32_a dchds00282.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ExpandEnvironmentStringsA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_ExpandEnvironmentStringsA@12__imp__ExpandEnvironmentStringsA@12__head_libkernel32_a dchds00281.o/ 1301111098 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %ExitVDM .text.data.bss.idata$7.idata$5.idata$4.idata$6 5_ExitVDM@8__imp__ExitVDM@8__head_libkernel32_a dchds00280.o/ 1301111098 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ExitThread .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_ExitThread@4__imp__ExitThread@4__head_libkernel32_a dchds00279.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ExitProcess .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_ExitProcess@4__imp__ExitProcess@4__head_libkernel32_a dchds00278.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EscapeCommFunction .text.data.bss.idata$7.idata$5.idata$4.idata$66K_EscapeCommFunction@8__imp__EscapeCommFunction@8__head_libkernel32_a dchds00277.o/ 1301111098 0 0 100666 611 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %EraseTape .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_EraseTape@12__imp__EraseTape@12__head_libkernel32_a dchds00276.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %EnumerateLocalComputerNamesW .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_EnumerateLocalComputerNamesW@16__imp__EnumerateLocalComputerNamesW@16__head_libkernel32_a dchds00275.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %EnumerateLocalComputerNamesA .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_EnumerateLocalComputerNamesA@16__imp__EnumerateLocalComputerNamesA@16__head_libkernel32_a dchds00274.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumUILanguagesW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_EnumUILanguagesW@12__imp__EnumUILanguagesW@12__head_libkernel32_a dchds00273.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumUILanguagesA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_EnumUILanguagesA@12__imp__EnumUILanguagesA@12__head_libkernel32_a dchds00272.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumTimeFormatsW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_EnumTimeFormatsW@12__imp__EnumTimeFormatsW@12__head_libkernel32_a dchds00271.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumTimeFormatsEx .text.data.bss.idata$7.idata$5.idata$4.idata$66K_EnumTimeFormatsEx@16__imp__EnumTimeFormatsEx@16__head_libkernel32_a dchds00270.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumTimeFormatsA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_EnumTimeFormatsA@12__imp__EnumTimeFormatsA@12__head_libkernel32_a dchds00269.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ % EnumSystemLocalesW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_EnumSystemLocalesW@8__imp__EnumSystemLocalesW@8__head_libkernel32_a dchds00268.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ % EnumSystemLocalesEx .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_EnumSystemLocalesEx@16__imp__EnumSystemLocalesEx@16__head_libkernel32_a dchds00267.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ % EnumSystemLocalesA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_EnumSystemLocalesA@8__imp__EnumSystemLocalesA@8__head_libkernel32_a dchds00266.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ % EnumSystemLanguageGroupsW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_EnumSystemLanguageGroupsW@12__imp__EnumSystemLanguageGroupsW@12__head_libkernel32_a dchds00265.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ % EnumSystemLanguageGroupsA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_EnumSystemLanguageGroupsA@12__imp__EnumSystemLanguageGroupsA@12__head_libkernel32_a dchds00264.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumSystemGeoID .text.data.bss.idata$7.idata$5.idata$4.idata$62G_EnumSystemGeoID@12__imp__EnumSystemGeoID@12__head_libkernel32_a dchds00263.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %EnumSystemFirmwareTables .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_EnumSystemFirmwareTables@12__imp__EnumSystemFirmwareTables@12__head_libkernel32_a dchds00262.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumSystemCodePagesW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_EnumSystemCodePagesW@8__imp__EnumSystemCodePagesW@8__head_libkernel32_a dchds00261.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumSystemCodePagesA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_EnumSystemCodePagesA@8__imp__EnumSystemCodePagesA@8__head_libkernel32_a dchds00260.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumResourceTypesW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_EnumResourceTypesW@12__imp__EnumResourceTypesW@12__head_libkernel32_a dchds00259.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumResourceTypesExW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_EnumResourceTypesExW@20__imp__EnumResourceTypesExW@20__head_libkernel32_a dchds00258.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumResourceTypesExA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_EnumResourceTypesExA@20__imp__EnumResourceTypesExA@20__head_libkernel32_a dchds00257.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumResourceTypesA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_EnumResourceTypesA@12__imp__EnumResourceTypesA@12__head_libkernel32_a dchds00256.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumResourceNamesW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_EnumResourceNamesW@16__imp__EnumResourceNamesW@16__head_libkernel32_a dchds00255.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumResourceNamesExW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_EnumResourceNamesExW@24__imp__EnumResourceNamesExW@24__head_libkernel32_a dchds00254.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumResourceNamesExA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_EnumResourceNamesExA@24__imp__EnumResourceNamesExA@24__head_libkernel32_a dchds00253.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumResourceNamesA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_EnumResourceNamesA@16__imp__EnumResourceNamesA@16__head_libkernel32_a dchds00252.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %EnumResourceLanguagesW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_EnumResourceLanguagesW@20__imp__EnumResourceLanguagesW@20__head_libkernel32_a dchds00251.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %EnumResourceLanguagesExW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_EnumResourceLanguagesExW@28__imp__EnumResourceLanguagesExW@28__head_libkernel32_a dchds00250.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %EnumResourceLanguagesExA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_EnumResourceLanguagesExA@28__imp__EnumResourceLanguagesExA@28__head_libkernel32_a dchds00249.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %EnumResourceLanguagesA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_EnumResourceLanguagesA@20__imp__EnumResourceLanguagesA@20__head_libkernel32_a dchds00248.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %EnumLanguageGroupLocalesW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_EnumLanguageGroupLocalesW@16__imp__EnumLanguageGroupLocalesW@16__head_libkernel32_a dchds00247.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %EnumLanguageGroupLocalesA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_EnumLanguageGroupLocalesA@16__imp__EnumLanguageGroupLocalesA@16__head_libkernel32_a dchds00246.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumDateFormatsW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_EnumDateFormatsW@12__imp__EnumDateFormatsW@12__head_libkernel32_a dchds00245.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumDateFormatsExW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_EnumDateFormatsExW@12__imp__EnumDateFormatsExW@12__head_libkernel32_a dchds00244.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumDateFormatsExEx .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_EnumDateFormatsExEx@16__imp__EnumDateFormatsExEx@16__head_libkernel32_a dchds00243.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumDateFormatsExA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_EnumDateFormatsExA@12__imp__EnumDateFormatsExA@12__head_libkernel32_a dchds00242.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumDateFormatsA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_EnumDateFormatsA@12__imp__EnumDateFormatsA@12__head_libkernel32_a dchds00241.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumCalendarInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_EnumCalendarInfoW@16__imp__EnumCalendarInfoW@16__head_libkernel32_a dchds00240.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumCalendarInfoExW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_EnumCalendarInfoExW@16__imp__EnumCalendarInfoExW@16__head_libkernel32_a dchds00239.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumCalendarInfoExEx .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_EnumCalendarInfoExEx@24__imp__EnumCalendarInfoExEx@24__head_libkernel32_a dchds00238.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumCalendarInfoExA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_EnumCalendarInfoExA@16__imp__EnumCalendarInfoExA@16__head_libkernel32_a dchds00237.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumCalendarInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_EnumCalendarInfoA@16__imp__EnumCalendarInfoA@16__head_libkernel32_a dchds00236.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnterCriticalSection .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_EnterCriticalSection@4__imp__EnterCriticalSection@4__head_libkernel32_a dchds00235.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EndUpdateResourceW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_EndUpdateResourceW@8__imp__EndUpdateResourceW@8__head_libkernel32_a dchds00234.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EndUpdateResourceA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_EndUpdateResourceA@8__imp__EndUpdateResourceA@8__head_libkernel32_a dchds00233.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EncodeSystemPointer .text.data.bss.idata$7.idata$5.idata$4.idata$68M_EncodeSystemPointer@4__imp__EncodeSystemPointer@4__head_libkernel32_a dchds00232.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EncodePointer .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_EncodePointer@4__imp__EncodePointer@4__head_libkernel32_a dchds00231.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnableThreadProfiling .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_EnableThreadProfiling@20__imp__EnableThreadProfiling@20__head_libkernel32_a dchds00230.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DuplicateHandle .text.data.bss.idata$7.idata$5.idata$4.idata$62G_DuplicateHandle@28__imp__DuplicateHandle@28__head_libkernel32_a dchds00229.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DuplicateConsoleHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_DuplicateConsoleHandle@16__imp__DuplicateConsoleHandle@16__head_libkernel32_a dchds00228.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DosPathToSessionPathW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_DosPathToSessionPathW@12__imp__DosPathToSessionPathW@12__head_libkernel32_a dchds00227.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DosPathToSessionPathA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_DosPathToSessionPathA@12__imp__DosPathToSessionPathA@12__head_libkernel32_a dchds00226.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DosDateTimeToFileTime .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_DosDateTimeToFileTime@12__imp__DosDateTimeToFileTime@12__head_libkernel32_a dchds00225.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %DnsHostnameToComputerNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_DnsHostnameToComputerNameW@12__imp__DnsHostnameToComputerNameW@12__head_libkernel32_a dchds00224.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %DnsHostnameToComputerNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_DnsHostnameToComputerNameA@12__imp__DnsHostnameToComputerNameA@12__head_libkernel32_a dchds00223.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DisconnectNamedPipe .text.data.bss.idata$7.idata$5.idata$4.idata$68M_DisconnectNamedPipe@4__imp__DisconnectNamedPipe@4__head_libkernel32_a dchds00222.o/ 1301111098 0 0 100666 693 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6(@ %DisassociateCurrentThreadFromCallback .text.data.bss.idata$7.idata$5.idata$4.idata$6-\q_DisassociateCurrentThreadFromCallback@4__imp__DisassociateCurrentThreadFromCallback@4__head_libkernel32_a dchds00221.o/ 1301111098 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DisableThreadProfiling .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_DisableThreadProfiling@4__imp__DisableThreadProfiling@4__head_libkernel32_a dchds00220.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DisableThreadLibraryCalls .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_DisableThreadLibraryCalls@4__imp__DisableThreadLibraryCalls@4__head_libkernel32_a dchds00219.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DeviceIoControl .text.data.bss.idata$7.idata$5.idata$4.idata$62G_DeviceIoControl@32__imp__DeviceIoControl@32__head_libkernel32_a dchds00218.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DeleteVolumeMountPointW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_DeleteVolumeMountPointW@4__imp__DeleteVolumeMountPointW@4__head_libkernel32_a dchds00217.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DeleteVolumeMountPointA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_DeleteVolumeMountPointA@4__imp__DeleteVolumeMountPointA@4__head_libkernel32_a dchds00216.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DeleteTimerQueueTimer .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_DeleteTimerQueueTimer@12__imp__DeleteTimerQueueTimer@12__head_libkernel32_a dchds00215.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DeleteTimerQueueEx .text.data.bss.idata$7.idata$5.idata$4.idata$66K_DeleteTimerQueueEx@8__imp__DeleteTimerQueueEx@8__head_libkernel32_a dchds00214.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DeleteTimerQueue .text.data.bss.idata$7.idata$5.idata$4.idata$62G_DeleteTimerQueue@4__imp__DeleteTimerQueue@4__head_libkernel32_a dchds00213.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %DeleteProcThreadAttributeList .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_DeleteProcThreadAttributeList@4__imp__DeleteProcThreadAttributeList@4__head_libkernel32_a dchds00212.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DeleteFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_DeleteFileW@4__imp__DeleteFileW@4__head_libkernel32_a dchds00211.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DeleteFileTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_DeleteFileTransactedW@8__imp__DeleteFileTransactedW@8__head_libkernel32_a dchds00210.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DeleteFileTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_DeleteFileTransactedA@8__imp__DeleteFileTransactedA@8__head_libkernel32_a dchds00209.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DeleteFileA .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_DeleteFileA@4__imp__DeleteFileA@4__head_libkernel32_a dchds00208.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DeleteFiber .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_DeleteFiber@4__imp__DeleteFiber@4__head_libkernel32_a dchds00207.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DeleteCriticalSection .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_DeleteCriticalSection@4__imp__DeleteCriticalSection@4__head_libkernel32_a dchds00206.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DeleteBoundaryDescriptor .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_DeleteBoundaryDescriptor@4__imp__DeleteBoundaryDescriptor@4__head_libkernel32_a dchds00205.o/ 1301111098 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DeleteAtom .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_DeleteAtom@4__imp__DeleteAtom@4__head_libkernel32_a dchds00204.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DelayLoadFailureHook .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_DelayLoadFailureHook@8__imp__DelayLoadFailureHook@8__head_libkernel32_a dchds00203.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DefineDosDeviceW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_DefineDosDeviceW@12__imp__DefineDosDeviceW@12__head_libkernel32_a dchds00202.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DefineDosDeviceA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_DefineDosDeviceA@12__imp__DefineDosDeviceA@12__head_libkernel32_a dchds00201.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DecodeSystemPointer .text.data.bss.idata$7.idata$5.idata$4.idata$68M_DecodeSystemPointer@4__imp__DecodeSystemPointer@4__head_libkernel32_a dchds00200.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DecodePointer .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_DecodePointer@4__imp__DecodePointer@4__head_libkernel32_a dchds00199.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DebugSetProcessKillOnExit .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_DebugSetProcessKillOnExit@4__imp__DebugSetProcessKillOnExit@4__head_libkernel32_a dchds00198.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DebugBreakProcess .text.data.bss.idata$7.idata$5.idata$4.idata$64I_DebugBreakProcess@4__imp__DebugBreakProcess@4__head_libkernel32_a dchds00197.o/ 1301111098 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DebugBreak .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_DebugBreak@0__imp__DebugBreak@0__head_libkernel32_a dchds00196.o/ 1301111098 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DebugActiveProcessStop .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_DebugActiveProcessStop@4__imp__DebugActiveProcessStop@4__head_libkernel32_a dchds00195.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DebugActiveProcess .text.data.bss.idata$7.idata$5.idata$4.idata$66K_DebugActiveProcess@4__imp__DebugActiveProcess@4__head_libkernel32_a dchds00194.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DeactivateActCtx .text.data.bss.idata$7.idata$5.idata$4.idata$62G_DeactivateActCtx@8__imp__DeactivateActCtx@8__head_libkernel32_a dchds00193.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CtrlRoutine .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_CtrlRoutine@4__imp__CtrlRoutine@4__head_libkernel32_a dchds00192.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateWaitableTimerW .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CreateWaitableTimerW@12__imp__CreateWaitableTimerW@12__head_libkernel32_a dchds00191.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreateWaitableTimerExW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_CreateWaitableTimerExW@16__imp__CreateWaitableTimerExW@16__head_libkernel32_a dchds00190.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreateWaitableTimerExA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_CreateWaitableTimerExA@16__imp__CreateWaitableTimerExA@16__head_libkernel32_a dchds00189.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateWaitableTimerA .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CreateWaitableTimerA@12__imp__CreateWaitableTimerA@12__head_libkernel32_a dchds00188.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreateToolhelp32Snapshot .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_CreateToolhelp32Snapshot@8__imp__CreateToolhelp32Snapshot@8__head_libkernel32_a dchds00187.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateTimerQueueTimer .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_CreateTimerQueueTimer@28__imp__CreateTimerQueueTimer@28__head_libkernel32_a dchds00186.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateTimerQueue .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CreateTimerQueue@0__imp__CreateTimerQueue@0__head_libkernel32_a dchds00185.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateThreadpoolWork .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CreateThreadpoolWork@12__imp__CreateThreadpoolWork@12__head_libkernel32_a dchds00184.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateThreadpoolWait .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CreateThreadpoolWait@12__imp__CreateThreadpoolWait@12__head_libkernel32_a dchds00183.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateThreadpoolTimer .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_CreateThreadpoolTimer@12__imp__CreateThreadpoolTimer@12__head_libkernel32_a dchds00182.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateThreadpoolIo .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CreateThreadpoolIo@16__imp__CreateThreadpoolIo@16__head_libkernel32_a dchds00181.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %CreateThreadpoolCleanupGroup .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__CreateThreadpoolCleanupGroup@0__imp__CreateThreadpoolCleanupGroup@0__head_libkernel32_a dchds00180.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateThreadpool .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CreateThreadpool@4__imp__CreateThreadpool@4__head_libkernel32_a dchds00179.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CreateThread .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_CreateThread@24__imp__CreateThread@24__head_libkernel32_a dchds00178.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateTapePartition .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CreateTapePartition@16__imp__CreateTapePartition@16__head_libkernel32_a dchds00177.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateSymbolicLinkW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CreateSymbolicLinkW@12__imp__CreateSymbolicLinkW@12__head_libkernel32_a dchds00176.o/ 1301111098 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %CreateSymbolicLinkTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_CreateSymbolicLinkTransactedW@16__imp__CreateSymbolicLinkTransactedW@16__head_libkernel32_a dchds00175.o/ 1301111098 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %CreateSymbolicLinkTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_CreateSymbolicLinkTransactedA@16__imp__CreateSymbolicLinkTransactedA@16__head_libkernel32_a dchds00174.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateSymbolicLinkA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CreateSymbolicLinkA@12__imp__CreateSymbolicLinkA@12__head_libkernel32_a dchds00173.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateSocketHandle .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CreateSocketHandle@0__imp__CreateSocketHandle@0__head_libkernel32_a dchds00172.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateSemaphoreW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_CreateSemaphoreW@16__imp__CreateSemaphoreW@16__head_libkernel32_a dchds00171.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateSemaphoreExW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CreateSemaphoreExW@24__imp__CreateSemaphoreExW@24__head_libkernel32_a dchds00170.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateSemaphoreExA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CreateSemaphoreExA@24__imp__CreateSemaphoreExA@24__head_libkernel32_a dchds00169.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateSemaphoreA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_CreateSemaphoreA@16__imp__CreateSemaphoreA@16__head_libkernel32_a dchds00168.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateRemoteThreadEx .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CreateRemoteThreadEx@32__imp__CreateRemoteThreadEx@32__head_libkernel32_a dchds00167.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateRemoteThread .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CreateRemoteThread@28__imp__CreateRemoteThread@28__head_libkernel32_a dchds00166.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateProcessW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CreateProcessW@40__imp__CreateProcessW@40__head_libkernel32_a dchds00165.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreateProcessInternalW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_CreateProcessInternalW@48__imp__CreateProcessInternalW@48__head_libkernel32_a dchds00164.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreateProcessInternalA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_CreateProcessInternalA@48__imp__CreateProcessInternalA@48__head_libkernel32_a dchds00163.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateProcessA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CreateProcessA@40__imp__CreateProcessA@40__head_libkernel32_a dchds00162.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreatePrivateNamespaceW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_CreatePrivateNamespaceW@12__imp__CreatePrivateNamespaceW@12__head_libkernel32_a dchds00161.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreatePrivateNamespaceA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_CreatePrivateNamespaceA@12__imp__CreatePrivateNamespaceA@12__head_libkernel32_a dchds00160.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CreatePipe .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_CreatePipe@16__imp__CreatePipe@16__head_libkernel32_a dchds00159.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateNamedPipeW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_CreateNamedPipeW@32__imp__CreateNamedPipeW@32__head_libkernel32_a dchds00158.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateNamedPipeA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_CreateNamedPipeA@32__imp__CreateNamedPipeA@32__head_libkernel32_a dchds00157.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CreateMutexW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_CreateMutexW@12__imp__CreateMutexW@12__head_libkernel32_a dchds00156.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateMutexExW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CreateMutexExW@16__imp__CreateMutexExW@16__head_libkernel32_a dchds00155.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateMutexExA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CreateMutexExA@16__imp__CreateMutexExA@16__head_libkernel32_a dchds00154.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CreateMutexA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_CreateMutexA@12__imp__CreateMutexA@12__head_libkernel32_a dchds00153.o/ 1301111098 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %CreateMemoryResourceNotification .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_CreateMemoryResourceNotification@4__imp__CreateMemoryResourceNotification@4__head_libkernel32_a dchds00152.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateMailslotW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CreateMailslotW@16__imp__CreateMailslotW@16__head_libkernel32_a dchds00151.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateMailslotA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CreateMailslotA@16__imp__CreateMailslotA@16__head_libkernel32_a dchds00150.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CreateJobSet .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_CreateJobSet@12__imp__CreateJobSet@12__head_libkernel32_a dchds00149.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateJobObjectW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CreateJobObjectW@8__imp__CreateJobObjectW@8__head_libkernel32_a dchds00148.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateJobObjectA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CreateJobObjectA@8__imp__CreateJobObjectA@8__head_libkernel32_a dchds00147.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreateIoCompletionPort .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_CreateIoCompletionPort@16__imp__CreateIoCompletionPort@16__head_libkernel32_a dchds00146.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateHardLinkW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CreateHardLinkW@12__imp__CreateHardLinkW@12__head_libkernel32_a dchds00145.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreateHardLinkTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_CreateHardLinkTransactedW@16__imp__CreateHardLinkTransactedW@16__head_libkernel32_a dchds00144.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreateHardLinkTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_CreateHardLinkTransactedA@16__imp__CreateHardLinkTransactedA@16__head_libkernel32_a dchds00143.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateHardLinkA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CreateHardLinkA@12__imp__CreateHardLinkA@12__head_libkernel32_a dchds00142.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CreateFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_CreateFileW@28__imp__CreateFileW@28__head_libkernel32_a dchds00141.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateFileTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_CreateFileTransactedW@40__imp__CreateFileTransactedW@40__head_libkernel32_a dchds00140.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateFileTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_CreateFileTransactedA@40__imp__CreateFileTransactedA@40__head_libkernel32_a dchds00139.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateFileMappingW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CreateFileMappingW@24__imp__CreateFileMappingW@24__head_libkernel32_a dchds00138.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreateFileMappingNumaW .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_CreateFileMappingNumaW@28__imp__CreateFileMappingNumaW@28__head_libkernel32_a dchds00137.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %CreateFileMappingNumaA .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_CreateFileMappingNumaA@28__imp__CreateFileMappingNumaA@28__head_libkernel32_a dchds00136.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CreateFileMappingA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CreateFileMappingA@24__imp__CreateFileMappingA@24__head_libkernel32_a dchds00135.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CreateFileA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_CreateFileA@28__imp__CreateFileA@28__head_libkernel32_a dchds00134.o/ 1301111098 0 0 100666 623 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CreateFiberEx .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_CreateFiberEx@20__imp__CreateFiberEx@20__head_libkernel32_a dchds00133.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CreateFiber .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_CreateFiber@12__imp__CreateFiber@12__head_libkernel32_a dchds00132.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CreateEventW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_CreateEventW@16__imp__CreateEventW@16__head_libkernel32_a dchds00131.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateEventExW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CreateEventExW@16__imp__CreateEventExW@16__head_libkernel32_a dchds00130.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateEventExA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CreateEventExA@16__imp__CreateEventExA@16__head_libkernel32_a dchds00129.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CreateEventA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_CreateEventA@16__imp__CreateEventA@16__head_libkernel32_a dchds00128.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CreateDirectoryW .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CreateDirectoryW@8__imp__CreateDirectoryW@8__head_libkernel32_a dchds00127.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %CreateDirectoryTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_CreateDirectoryTransactedW@16__imp__CreateDirectoryTransactedW@16__head_libkernel32_a dchds00126.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %~CreateDirectoryTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_CreateDirectoryTransactedA@16__imp__CreateDirectoryTransactedA@16__head_libkernel32_a dchds00125.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %}CreateDirectoryExW .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CreateDirectoryExW@12__imp__CreateDirectoryExW@12__head_libkernel32_a dchds00124.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %|CreateDirectoryExA .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CreateDirectoryExA@12__imp__CreateDirectoryExA@12__head_libkernel32_a dchds00123.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %{CreateDirectoryA .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CreateDirectoryA@8__imp__CreateDirectoryA@8__head_libkernel32_a dchds00122.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %zCreateConsoleScreenBuffer .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_CreateConsoleScreenBuffer@20__imp__CreateConsoleScreenBuffer@20__head_libkernel32_a dchds00121.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %yCreateBoundaryDescriptorW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_CreateBoundaryDescriptorW@8__imp__CreateBoundaryDescriptorW@8__head_libkernel32_a dchds00120.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %xCreateBoundaryDescriptorA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_CreateBoundaryDescriptorA@8__imp__CreateBoundaryDescriptorA@8__head_libkernel32_a dchds00119.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %wCreateActCtxW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_CreateActCtxW@4__imp__CreateActCtxW@4__head_libkernel32_a dchds00118.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %vCreateActCtxA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_CreateActCtxA@4__imp__CreateActCtxA@4__head_libkernel32_a dchds00117.o/ 1301111098 0 0 100666 611 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %uCopyFileW .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_CopyFileW@12__imp__CopyFileW@12__head_libkernel32_a dchds00116.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %tCopyFileTransactedW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CopyFileTransactedW@28__imp__CopyFileTransactedW@28__head_libkernel32_a dchds00115.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %sCopyFileTransactedA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CopyFileTransactedA@28__imp__CopyFileTransactedA@28__head_libkernel32_a dchds00114.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %rCopyFileExW .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_CopyFileExW@24__imp__CopyFileExW@24__head_libkernel32_a dchds00113.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %qCopyFileExA .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_CopyFileExA@24__imp__CopyFileExA@24__head_libkernel32_a dchds00112.o/ 1301111098 0 0 100666 611 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %pCopyFileA .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_CopyFileA@12__imp__CopyFileA@12__head_libkernel32_a dchds00111.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %oCopyExtendedContext .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CopyExtendedContext@12__imp__CopyExtendedContext@12__head_libkernel32_a dchds00110.o/ 1301111098 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %nConvertThreadToFiberEx .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ConvertThreadToFiberEx@8__imp__ConvertThreadToFiberEx@8__head_libkernel32_a dchds00109.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %mConvertThreadToFiber .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_ConvertThreadToFiber@4__imp__ConvertThreadToFiber@4__head_libkernel32_a dchds00108.o/ 1301111098 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %lConvertSystemTimeToCalDateTime .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_ConvertSystemTimeToCalDateTime@12__imp__ConvertSystemTimeToCalDateTime@12__head_libkernel32_a dchds00107.o/ 1301111098 0 0 100666 689 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %kConvertNLSDayOfWeekToWin32DayOfWeek .text.data.bss.idata$7.idata$5.idata$4.idata$6+Xm_ConvertNLSDayOfWeekToWin32DayOfWeek@4__imp__ConvertNLSDayOfWeekToWin32DayOfWeek@4__head_libkernel32_a dchds00106.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %jConvertFiberToThread .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_ConvertFiberToThread@0__imp__ConvertFiberToThread@0__head_libkernel32_a dchds00105.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %iConvertDefaultLocale .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_ConvertDefaultLocale@4__imp__ConvertDefaultLocale@4__head_libkernel32_a dchds00104.o/ 1301111098 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %hConvertCalDateTimeToSystemTime .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_ConvertCalDateTimeToSystemTime@8__imp__ConvertCalDateTimeToSystemTime@8__head_libkernel32_a dchds00103.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %gContinueDebugEvent .text.data.bss.idata$7.idata$5.idata$4.idata$68M_ContinueDebugEvent@12__imp__ContinueDebugEvent@12__head_libkernel32_a dchds00102.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %fConsoleMenuControl .text.data.bss.idata$7.idata$5.idata$4.idata$68M_ConsoleMenuControl@12__imp__ConsoleMenuControl@12__head_libkernel32_a dchds00101.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %eConnectNamedPipe .text.data.bss.idata$7.idata$5.idata$4.idata$62G_ConnectNamedPipe@8__imp__ConnectNamedPipe@8__head_libkernel32_a dchds00100.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %dCompareStringW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CompareStringW@24__imp__CompareStringW@24__head_libkernel32_a dchds00099.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %cCompareStringOrdinal .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CompareStringOrdinal@20__imp__CompareStringOrdinal@20__head_libkernel32_a dchds00098.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %bCompareStringEx .text.data.bss.idata$7.idata$5.idata$4.idata$62G_CompareStringEx@36__imp__CompareStringEx@36__head_libkernel32_a dchds00097.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %aCompareStringA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CompareStringA@24__imp__CompareStringA@24__head_libkernel32_a dchds00096.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %`CompareFileTime .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CompareFileTime@8__imp__CompareFileTime@8__head_libkernel32_a dchds00095.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %_CompareCalendarDates .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CompareCalendarDates@12__imp__CompareCalendarDates@12__head_libkernel32_a dchds00094.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %^CommConfigDialogW .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CommConfigDialogW@12__imp__CommConfigDialogW@12__head_libkernel32_a dchds00093.o/ 1301111098 0 0 100666 635 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %]CommConfigDialogA .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CommConfigDialogA@12__imp__CommConfigDialogA@12__head_libkernel32_a dchds00092.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %\CmdBatNotification .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CmdBatNotification@4__imp__CmdBatNotification@4__head_libkernel32_a dchds00091.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %[CloseThreadpoolWork .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CloseThreadpoolWork@4__imp__CloseThreadpoolWork@4__head_libkernel32_a dchds00090.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ZCloseThreadpoolWait .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CloseThreadpoolWait@4__imp__CloseThreadpoolWait@4__head_libkernel32_a dchds00089.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %YCloseThreadpoolTimer .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_CloseThreadpoolTimer@4__imp__CloseThreadpoolTimer@4__head_libkernel32_a dchds00088.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %XCloseThreadpoolIo .text.data.bss.idata$7.idata$5.idata$4.idata$64I_CloseThreadpoolIo@4__imp__CloseThreadpoolIo@4__head_libkernel32_a dchds00087.o/ 1301111098 0 0 100666 689 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %WCloseThreadpoolCleanupGroupMembers .text.data.bss.idata$7.idata$5.idata$4.idata$6+Xm_CloseThreadpoolCleanupGroupMembers@12__imp__CloseThreadpoolCleanupGroupMembers@12__head_libkernel32_a dchds00086.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %VCloseThreadpoolCleanupGroup .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_CloseThreadpoolCleanupGroup@4__imp__CloseThreadpoolCleanupGroup@4__head_libkernel32_a dchds00085.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %UCloseThreadpool .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CloseThreadpool@4__imp__CloseThreadpool@4__head_libkernel32_a dchds00084.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %TCloseProfileUserMapping .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_CloseProfileUserMapping@0__imp__CloseProfileUserMapping@0__head_libkernel32_a dchds00083.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SClosePrivateNamespace .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_ClosePrivateNamespace@8__imp__ClosePrivateNamespace@8__head_libkernel32_a dchds00082.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RCloseHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_CloseHandle@4__imp__CloseHandle@4__head_libkernel32_a dchds00081.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %QCloseConsoleHandle .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CloseConsoleHandle@4__imp__CloseConsoleHandle@4__head_libkernel32_a dchds00080.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %PClearCommError .text.data.bss.idata$7.idata$5.idata$4.idata$60E_ClearCommError@12__imp__ClearCommError@12__head_libkernel32_a dchds00079.o/ 1301111098 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %OClearCommBreak .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_ClearCommBreak@4__imp__ClearCommBreak@4__head_libkernel32_a dchds00078.o/ 1301111098 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %NCheckRemoteDebuggerPresent .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_CheckRemoteDebuggerPresent@8__imp__CheckRemoteDebuggerPresent@8__head_libkernel32_a dchds00077.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %MCheckNameLegalDOS8Dot3W .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_CheckNameLegalDOS8Dot3W@20__imp__CheckNameLegalDOS8Dot3W@20__head_libkernel32_a dchds00076.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %LCheckNameLegalDOS8Dot3A .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_CheckNameLegalDOS8Dot3A@20__imp__CheckNameLegalDOS8Dot3A@20__head_libkernel32_a dchds00075.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %KCheckForReadOnlyResource .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_CheckForReadOnlyResource@8__imp__CheckForReadOnlyResource@8__head_libkernel32_a dchds00074.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %JCheckElevationEnabled .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CheckElevationEnabled@4__imp__CheckElevationEnabled@4__head_libkernel32_a dchds00073.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ICheckElevation .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CheckElevation@20__imp__CheckElevation@20__head_libkernel32_a dchds00072.o/ 1301111098 0 0 100666 647 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %HChangeTimerQueueTimer .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_ChangeTimerQueueTimer@16__imp__ChangeTimerQueueTimer@16__head_libkernel32_a dchds00071.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GCancelWaitableTimer .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CancelWaitableTimer@4__imp__CancelWaitableTimer@4__head_libkernel32_a dchds00070.o/ 1301111098 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %FCancelTimerQueueTimer .text.data.bss.idata$7.idata$5.idata$4.idata$6<Q_CancelTimerQueueTimer@8__imp__CancelTimerQueueTimer@8__head_libkernel32_a dchds00069.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ECancelThreadpoolIo .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CancelThreadpoolIo@4__imp__CancelThreadpoolIo@4__head_libkernel32_a dchds00068.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DCancelSynchronousIo .text.data.bss.idata$7.idata$5.idata$4.idata$68M_CancelSynchronousIo@4__imp__CancelSynchronousIo@4__head_libkernel32_a dchds00067.o/ 1301111098 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CCancelIoEx .text.data.bss.idata$7.idata$5.idata$4.idata$6&;_CancelIoEx@8__imp__CancelIoEx@8__head_libkernel32_a dchds00066.o/ 1301111098 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %BCancelIo .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_CancelIo@4__imp__CancelIo@4__head_libkernel32_a dchds00065.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ACancelDeviceWakeupRequest .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_CancelDeviceWakeupRequest@4__imp__CancelDeviceWakeupRequest@4__head_libkernel32_a dchds00064.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %@CallbackMayRunLong .text.data.bss.idata$7.idata$5.idata$4.idata$66K_CallbackMayRunLong@4__imp__CallbackMayRunLong@4__head_libkernel32_a dchds00063.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %?CallNamedPipeW .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CallNamedPipeW@28__imp__CallNamedPipeW@28__head_libkernel32_a dchds00062.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %>CallNamedPipeA .text.data.bss.idata$7.idata$5.idata$4.idata$60E_CallNamedPipeA@28__imp__CallNamedPipeA@28__head_libkernel32_a dchds00061.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %=BuildCommDCBW .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_BuildCommDCBW@8__imp__BuildCommDCBW@8__head_libkernel32_a dchds00060.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %<BuildCommDCBAndTimeoutsW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_BuildCommDCBAndTimeoutsW@12__imp__BuildCommDCBAndTimeoutsW@12__head_libkernel32_a dchds00059.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %;BuildCommDCBAndTimeoutsA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_BuildCommDCBAndTimeoutsA@12__imp__BuildCommDCBAndTimeoutsA@12__head_libkernel32_a dchds00058.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %:BuildCommDCBA .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_BuildCommDCBA@8__imp__BuildCommDCBA@8__head_libkernel32_a dchds00057.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %9BindIoCompletionCallback .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_BindIoCompletionCallback@12__imp__BindIoCompletionCallback@12__head_libkernel32_a dchds00056.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %8BeginUpdateResourceW .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_BeginUpdateResourceW@8__imp__BeginUpdateResourceW@8__head_libkernel32_a dchds00055.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %7BeginUpdateResourceA .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_BeginUpdateResourceA@8__imp__BeginUpdateResourceA@8__head_libkernel32_a dchds00054.o/ 1301111098 0 0 100666 587 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %6Beep .text.data.bss.idata$7.idata$5.idata$4.idata$6_Beep@8'__imp__Beep@8__head_libkernel32_a dchds00053.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %5BasepMapModuleHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_BasepMapModuleHandle@8__imp__BasepMapModuleHandle@8__head_libkernel32_a dchds00052.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %4BasepFreeAppCompatData .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_BasepFreeAppCompatData@12__imp__BasepFreeAppCompatData@12__head_libkernel32_a dchds00051.o/ 1301111098 0 0 100666 705 ` L .text,l 0`.data@0.bss0.idata$74v0.idata$580.idata$4<0.idata$6,@ %3BasepFreeActivationContextActivationBlock .text.data.bss.idata$7.idata$5.idata$4.idata$61dy_BasepFreeActivationContextActivationBlock@4__imp__BasepFreeActivationContextActivationBlock@4__head_libkernel32_a dchds00050.o/ 1301111098 0 0 100666 677 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %2BasepCheckWinSaferRestrictions .text.data.bss.idata$7.idata$5.idata$4.idata$6'Pe_BasepCheckWinSaferRestrictions@12__imp__BasepCheckWinSaferRestrictions@12__head_libkernel32_a dchds00049.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %1BasepCheckBadapp .text.data.bss.idata$7.idata$5.idata$4.idata$64I_BasepCheckBadapp@60__imp__BasepCheckBadapp@60__head_libkernel32_a dchds00048.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %0BasepCheckAppCompat .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_BasepCheckAppCompat@16__imp__BasepCheckAppCompat@16__head_libkernel32_a dchds00047.o/ 1301111098 0 0 100666 693 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6(@ %/BasepAnsiStringToDynamicUnicodeString .text.data.bss.idata$7.idata$5.idata$4.idata$6-\q_BasepAnsiStringToDynamicUnicodeString@8__imp__BasepAnsiStringToDynamicUnicodeString@8__head_libkernel32_a dchds00046.o/ 1301111098 0 0 100666 719 ` L .text,p 0`.data@0.bss0.idata$74z0.idata$580.idata$4<0.idata$60@ %.BasepAllocateActivationContextActivationBlock .text.data.bss.idata$7.idata$5.idata$4.idata$66n_BasepAllocateActivationContextActivationBlock@16__imp__BasepAllocateActivationContextActivationBlock@16__head_libkernel32_a dchds00045.o/ 1301111098 0 0 100666 693 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6(@ %-Basep8BitStringToDynamicUnicodeString .text.data.bss.idata$7.idata$5.idata$4.idata$6-\q_Basep8BitStringToDynamicUnicodeString@8__imp__Basep8BitStringToDynamicUnicodeString@8__head_libkernel32_a dchds00044.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %,BaseVerifyUnicodeString .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_BaseVerifyUnicodeString@4__imp__BaseVerifyUnicodeString@4__head_libkernel32_a dchds00043.o/ 1301111098 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %+BaseUpdateAppcompatCache .text.data.bss.idata$7.idata$5.idata$4.idata$6!DY_BaseUpdateAppcompatCache@12__imp__BaseUpdateAppcompatCache@12__head_libkernel32_a dchds00042.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %*BaseThreadInitThunk .text.data.bss.idata$7.idata$5.idata$4.idata$68M_BaseThreadInitThunk@8__imp__BaseThreadInitThunk@8__head_libkernel32_a dchds00041.o/ 1301111098 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %)BaseSetLastNTError .text.data.bss.idata$7.idata$5.idata$4.idata$66K_BaseSetLastNTError@4__imp__BaseSetLastNTError@4__head_libkernel32_a dchds00040.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %(BaseQueryModuleData .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_BaseQueryModuleData@28__imp__BaseQueryModuleData@28__head_libkernel32_a dchds00039.o/ 1301111098 0 0 100666 693 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6(@ %'BaseIsAppcompatInfrastructureDisabled .text.data.bss.idata$7.idata$5.idata$4.idata$6-\q_BaseIsAppcompatInfrastructureDisabled@0__imp__BaseIsAppcompatInfrastructureDisabled@0__head_libkernel32_a dchds00038.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %&BaseInitAppcompatCacheSupport .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_BaseInitAppcompatCacheSupport@0__imp__BaseInitAppcompatCacheSupport@0__head_libkernel32_a dchds00037.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %%BaseGetNamedObjectDirectory .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_BaseGetNamedObjectDirectory@4__imp__BaseGetNamedObjectDirectory@4__head_libkernel32_a dchds00036.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %$BaseGenerateAppCompatData .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_BaseGenerateAppCompatData@24__imp__BaseGenerateAppCompatData@24__head_libkernel32_a dchds00035.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %#BaseFormatTimeOut .text.data.bss.idata$7.idata$5.idata$4.idata$64I_BaseFormatTimeOut@8__imp__BaseFormatTimeOut@8__head_libkernel32_a dchds00034.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %"BaseFormatObjectAttributes .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_BaseFormatObjectAttributes@16__imp__BaseFormatObjectAttributes@16__head_libkernel32_a dchds00033.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %!BaseFlushAppcompatCache .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_BaseFlushAppcompatCache@0__imp__BaseFlushAppcompatCache@0__head_libkernel32_a dchds00032.o/ 1301111098 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ % BaseDumpAppcompatCache .text.data.bss.idata$7.idata$5.idata$4.idata$6>S_BaseDumpAppcompatCache@0__imp__BaseDumpAppcompatCache@0__head_libkernel32_a dchds00031.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BaseDllReadWriteIniFile .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_BaseDllReadWriteIniFile@32__imp__BaseDllReadWriteIniFile@32__head_libkernel32_a dchds00030.o/ 1301111098 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %BaseCleanupAppcompatCacheSupport .text.data.bss.idata$7.idata$5.idata$4.idata$6(Rg_BaseCleanupAppcompatCacheSupport@4__imp__BaseCleanupAppcompatCacheSupport@4__head_libkernel32_a dchds00029.o/ 1301111098 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %BaseCheckRunApp .text.data.bss.idata$7.idata$5.idata$4.idata$62G_BaseCheckRunApp@52__imp__BaseCheckRunApp@52__head_libkernel32_a dchds00028.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BaseCheckAppcompatCacheEx .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_BaseCheckAppcompatCacheEx@24__imp__BaseCheckAppcompatCacheEx@24__head_libkernel32_a dchds00027.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BaseCheckAppcompatCache .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_BaseCheckAppcompatCache@16__imp__BaseCheckAppcompatCache@16__head_libkernel32_a dchds00026.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %BackupWrite .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_BackupWrite@28__imp__BackupWrite@28__head_libkernel32_a dchds00025.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %BackupSeek .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_BackupSeek@24__imp__BackupSeek@24__head_libkernel32_a dchds00024.o/ 1301111098 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %BackupRead .text.data.bss.idata$7.idata$5.idata$4.idata$6(=_BackupRead@28__imp__BackupRead@28__head_libkernel32_a dchds00023.o/ 1301111098 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %AttachConsole .text.data.bss.idata$7.idata$5.idata$4.idata$6,A_AttachConsole@4__imp__AttachConsole@4__head_libkernel32_a dchds00022.o/ 1301111098 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AssignProcessToJobObject .text.data.bss.idata$7.idata$5.idata$4.idata$6 BW_AssignProcessToJobObject@8__imp__AssignProcessToJobObject@8__head_libkernel32_a dchds00021.o/ 1301111098 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %AreFileApisANSI .text.data.bss.idata$7.idata$5.idata$4.idata$60E_AreFileApisANSI@0__imp__AreFileApisANSI@0__head_libkernel32_a dchds00020.o/ 1301111098 0 0 100666 669 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %ApplicationRecoveryInProgress .text.data.bss.idata$7.idata$5.idata$4.idata$6%La_ApplicationRecoveryInProgress@4__imp__ApplicationRecoveryInProgress@4__head_libkernel32_a dchds00019.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %ApplicationRecoveryFinished .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_ApplicationRecoveryFinished@4__imp__ApplicationRecoveryFinished@4__head_libkernel32_a dchds00018.o/ 1301111098 0 0 100666 671 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %AllocateUserPhysicalPagesNuma .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_AllocateUserPhysicalPagesNuma@16__imp__AllocateUserPhysicalPagesNuma@16__head_libkernel32_a dchds00017.o/ 1301111098 0 0 100666 659 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AllocateUserPhysicalPages .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_AllocateUserPhysicalPages@12__imp__AllocateUserPhysicalPages@12__head_libkernel32_a dchds00016.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %AllocConsole .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_AllocConsole@0__imp__AllocConsole@0__head_libkernel32_a dchds00015.o/ 1301111098 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AdjustCalendarDate .text.data.bss.idata$7.idata$5.idata$4.idata$68M_AdjustCalendarDate@12__imp__AdjustCalendarDate@12__head_libkernel32_a dchds00014.o/ 1301111098 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %AddVectoredExceptionHandler .text.data.bss.idata$7.idata$5.idata$4.idata$6#H]_AddVectoredExceptionHandler@8__imp__AddVectoredExceptionHandler@8__head_libkernel32_a dchds00013.o/ 1301111098 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ % AddVectoredContinueHandler .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_AddVectoredContinueHandler@8__imp__AddVectoredContinueHandler@8__head_libkernel32_a dchds00012.o/ 1301111098 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ % AddSecureMemoryCacheCallback .text.data.bss.idata$7.idata$5.idata$4.idata$6$J__AddSecureMemoryCacheCallback@4__imp__AddSecureMemoryCacheCallback@4__head_libkernel32_a dchds00011.o/ 1301111098 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ % AddSIDToBoundaryDescriptor .text.data.bss.idata$7.idata$5.idata$4.idata$6"F[_AddSIDToBoundaryDescriptor@8__imp__AddSIDToBoundaryDescriptor@8__head_libkernel32_a dchds00010.o/ 1301111098 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % AddRefActCtx .text.data.bss.idata$7.idata$5.idata$4.idata$6*?_AddRefActCtx@4__imp__AddRefActCtx@4__head_libkernel32_a dchds00009.o/ 1301111098 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ % AddLocalAlternateComputerNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_AddLocalAlternateComputerNameW@8__imp__AddLocalAlternateComputerNameW@8__head_libkernel32_a dchds00008.o/ 1301111098 0 0 100666 675 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %AddLocalAlternateComputerNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6&Nc_AddLocalAlternateComputerNameA@8__imp__AddLocalAlternateComputerNameA@8__head_libkernel32_a dchds00007.o/ 1301111098 0 0 100666 693 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6(@ %AddIntegrityLabelToBoundaryDescriptor .text.data.bss.idata$7.idata$5.idata$4.idata$6-\q_AddIntegrityLabelToBoundaryDescriptor@8__imp__AddIntegrityLabelToBoundaryDescriptor@8__head_libkernel32_a dchds00006.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %AddConsoleAliasW .text.data.bss.idata$7.idata$5.idata$4.idata$64I_AddConsoleAliasW@12__imp__AddConsoleAliasW@12__head_libkernel32_a dchds00005.o/ 1301111098 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %AddConsoleAliasA .text.data.bss.idata$7.idata$5.idata$4.idata$64I_AddConsoleAliasA@12__imp__AddConsoleAliasA@12__head_libkernel32_a dchds00004.o/ 1301111098 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %AddAtomW .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_AddAtomW@4__imp__AddAtomW@4__head_libkernel32_a dchds00003.o/ 1301111098 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %AddAtomA .text.data.bss.idata$7.idata$5.idata$4.idata$6"7_AddAtomA@4__imp__AddAtomA@4__head_libkernel32_a dchds00002.o/ 1301111098 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ActivateActCtx .text.data.bss.idata$7.idata$5.idata$4.idata$6.C_ActivateActCtx@8__imp__ActivateActCtx@8__head_libkernel32_a dchds00001.o/ 1301111098 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AcquireSRWLockShared .text.data.bss.idata$7.idata$5.idata$4.idata$6:O_AcquireSRWLockShared@4__imp__AcquireSRWLockShared@4__head_libkernel32_a dchds00000.o/ 1301111098 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AcquireSRWLockExclusive .text.data.bss.idata$7.idata$5.idata$4.idata$6@U_AcquireSRWLockExclusive@4__imp__AcquireSRWLockExclusive@4__head_libkernel32_a CharacterManaJ/src/Launch4JStub/w32api/libuser32.a0000644000175000017500000164503613615720000021720 0ustar paulliupaulliu! / 1301111120 0 0 0 34144 ` $$TTPP..&&rr^^ „„DD..ͶͶhh؊؊((FFxx::^^RR00  BB((!0!0##&|&|),),++.j.j1133669696;;>>A<A<CCFFIFIFKKNNQlQlTTVVYY\|\|__aadzdzg"g"iilzlzo(o(qqttw*w*yy|j|jjj22~~::^^||HHXX  ffxxʀʀ((||  vv&&FFBBFF\\VV    PP44 n n#*#*%%((++.^.^141433669v9v<(<(>>AAD0D0FFIILxLxOOQQTTW:W:YY\\_b_bb b ddgZgZjjlloRoRrrttw~w~zz||hhVVXXNNVV  VVttnnzz((ʐʐ>>ҼҼՈՈ88ݲݲXXNNZZ^^::VV    RRRR L L""%%(^(^++--0@0@22558.8.::==@L@LBBEEHfHfK K MMPXPXRRUUX`X`[[]]`d`dcceehhhhk*k*mmpps4s4uuxx{0{0}}ZZBBdd""66dd00VVhhbb  ɴɴjjrr22ܤܤLLDDHH~~@@88    || R R##%%(r(r++--0n0n3*3*5588;0;0==@@C>C>EEHHKLKLMMPPSjSjV<V<XX[[^2^2aaccfrfri"i"kknnq`q`t t vvyxyx|*|*~~,,0088VVHHNNzz""nn((xxBB̜̜DDԔԔ>>܎܎88FF@@FFPP>>    00~~tt!!$p$p',',)),,/,/,114v4v767699<<??BDBDEEGGJjJjMMOORRUBUBWWZvZv]]__b^b^eeggjfjfmmoorXrXttwwzBzB||..nn""hh``ZZ  FFhh~~00llʴʴ\\ՖՖ::ݚݚJJdd^^dd88 X XnnTT!!##&d&d))++..1*1*33669x9x<(<(>>AADHDHFFIILVLVOOQQTTW:W:YY\\_@_@aaddgzgzjBjBlloor^r^u2u2xxzz}f}f||DD<<ZZxxnnXXnnllȰȰ``ввNNؐؐ,,nnllZZ  ~~<<ZZ    jjpp::!!$h$h'')),^,^//1144747499Q_UserHandleGrantAccess@12__imp__UserHandleGrantAccess@12__head_libuser32_a daois00622.o/ 1301111120 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %nUpdateWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_UpdateWindow@4__imp__UpdateWindow@4__head_libuser32_a daois00621.o/ 1301111120 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %mUpdateLayeredWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_UpdateLayeredWindow@36__imp__UpdateLayeredWindow@36__head_libuser32_a daois00620.o/ 1301111120 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %lUnregisterTouchWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_UnregisterTouchWindow@4__imp__UnregisterTouchWindow@4__head_libuser32_a daois00619.o/ 1301111120 0 0 100666 685 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %kUnregisterPowerSettingNotification .text.data.bss.idata$7.idata$5.idata$4.idata$6*Vi_UnregisterPowerSettingNotification@4__imp__UnregisterPowerSettingNotification@4__head_libuser32_a daois00618.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %jUnregisterHotKey .text.data.bss.idata$7.idata$5.idata$4.idata$62E_UnregisterHotKey@8__imp__UnregisterHotKey@8__head_libuser32_a daois00617.o/ 1301111120 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %iUnregisterDeviceNotification .text.data.bss.idata$7.idata$5.idata$4.idata$6$J]_UnregisterDeviceNotification@4__imp__UnregisterDeviceNotification@4__head_libuser32_a daois00616.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %hUnregisterClassW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_UnregisterClassW@8__imp__UnregisterClassW@8__head_libuser32_a daois00615.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %gUnregisterClassA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_UnregisterClassA@8__imp__UnregisterClassA@8__head_libuser32_a daois00614.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %fUnpackDDElParam .text.data.bss.idata$7.idata$5.idata$4.idata$62E_UnpackDDElParam@16__imp__UnpackDDElParam@16__head_libuser32_a daois00613.o/ 1301111120 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %eUnloadKeyboardLayout .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_UnloadKeyboardLayout@4__imp__UnloadKeyboardLayout@4__head_libuser32_a daois00612.o/ 1301111120 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %dUnionRect .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_UnionRect@12__imp__UnionRect@12__head_libuser32_a daois00611.o/ 1301111120 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %cUnhookWindowsHookEx .text.data.bss.idata$7.idata$5.idata$4.idata$68K_UnhookWindowsHookEx@4__imp__UnhookWindowsHookEx@4__head_libuser32_a daois00610.o/ 1301111120 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %bUnhookWindowsHook .text.data.bss.idata$7.idata$5.idata$4.idata$64G_UnhookWindowsHook@8__imp__UnhookWindowsHook@8__head_libuser32_a daois00609.o/ 1301111120 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %aUnhookWinEvent .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_UnhookWinEvent@4__imp__UnhookWinEvent@4__head_libuser32_a daois00608.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %`TranslateMessage .text.data.bss.idata$7.idata$5.idata$4.idata$62E_TranslateMessage@4__imp__TranslateMessage@4__head_libuser32_a daois00607.o/ 1301111120 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %_TranslateMDISysAccel .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_TranslateMDISysAccel@8__imp__TranslateMDISysAccel@8__head_libuser32_a daois00606.o/ 1301111120 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %^TranslateAcceleratorW .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_TranslateAcceleratorW@12__imp__TranslateAcceleratorW@12__head_libuser32_a daois00605.o/ 1301111120 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %]TranslateAcceleratorA .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_TranslateAcceleratorA@12__imp__TranslateAcceleratorA@12__head_libuser32_a daois00604.o/ 1301111120 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %\TranslateAccelerator .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_TranslateAccelerator@12__imp__TranslateAccelerator@12__head_libuser32_a daois00603.o/ 1301111120 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %[TrackPopupMenuEx .text.data.bss.idata$7.idata$5.idata$4.idata$64G_TrackPopupMenuEx@24__imp__TrackPopupMenuEx@24__head_libuser32_a daois00602.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ZTrackPopupMenu .text.data.bss.idata$7.idata$5.idata$4.idata$60C_TrackPopupMenu@28__imp__TrackPopupMenu@28__head_libuser32_a daois00601.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %YTrackMouseEvent .text.data.bss.idata$7.idata$5.idata$4.idata$60C_TrackMouseEvent@4__imp__TrackMouseEvent@4__head_libuser32_a daois00600.o/ 1301111120 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %XToUnicodeEx .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_ToUnicodeEx@28__imp__ToUnicodeEx@28__head_libuser32_a daois00599.o/ 1301111120 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %WToUnicode .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_ToUnicode@24__imp__ToUnicode@24__head_libuser32_a daois00598.o/ 1301111120 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %VToAsciiEx .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_ToAsciiEx@24__imp__ToAsciiEx@24__head_libuser32_a daois00597.o/ 1301111120 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %UToAscii .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_ToAscii@20__imp__ToAscii@20__head_libuser32_a daois00596.o/ 1301111120 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %TTileWindows .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_TileWindows@20__imp__TileWindows@20__head_libuser32_a daois00595.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %STileChildWindows .text.data.bss.idata$7.idata$5.idata$4.idata$62E_TileChildWindows@8__imp__TileChildWindows@8__head_libuser32_a daois00594.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RTabbedTextOutW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_TabbedTextOutW@32__imp__TabbedTextOutW@32__head_libuser32_a daois00593.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %QTabbedTextOutA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_TabbedTextOutA@32__imp__TabbedTextOutA@32__head_libuser32_a daois00592.o/ 1301111120 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %PSystemParametersInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_SystemParametersInfoW@16__imp__SystemParametersInfoW@16__head_libuser32_a daois00591.o/ 1301111120 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %OSystemParametersInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_SystemParametersInfoA@16__imp__SystemParametersInfoA@16__head_libuser32_a daois00590.o/ 1301111120 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %NSwitchToThisWindow .text.data.bss.idata$7.idata$5.idata$4.idata$66I_SwitchToThisWindow@8__imp__SwitchToThisWindow@8__head_libuser32_a daois00589.o/ 1301111120 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %MSwitchDesktop .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_SwitchDesktop@4__imp__SwitchDesktop@4__head_libuser32_a daois00588.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LSwapMouseButton .text.data.bss.idata$7.idata$5.idata$4.idata$60C_SwapMouseButton@4__imp__SwapMouseButton@4__head_libuser32_a daois00587.o/ 1301111120 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %KSubtractRect .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_SubtractRect@12__imp__SubtractRect@12__head_libuser32_a daois00586.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %JShowWindowAsync .text.data.bss.idata$7.idata$5.idata$4.idata$60C_ShowWindowAsync@8__imp__ShowWindowAsync@8__head_libuser32_a daois00585.o/ 1301111120 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IShowWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_ShowWindow@8__imp__ShowWindow@8__head_libuser32_a daois00584.o/ 1301111120 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %HShowScrollBar .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_ShowScrollBar@12__imp__ShowScrollBar@12__head_libuser32_a daois00583.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GShowOwnedPopups .text.data.bss.idata$7.idata$5.idata$4.idata$60C_ShowOwnedPopups@8__imp__ShowOwnedPopups@8__head_libuser32_a daois00582.o/ 1301111120 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FShowCursor .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_ShowCursor@4__imp__ShowCursor@4__head_libuser32_a daois00581.o/ 1301111120 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %EShowCaret .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_ShowCaret@4__imp__ShowCaret@4__head_libuser32_a daois00580.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DSetWindowsHookW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_SetWindowsHookW@8__imp__SetWindowsHookW@8__head_libuser32_a daois00579.o/ 1301111120 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CSetWindowsHookExW .text.data.bss.idata$7.idata$5.idata$4.idata$66I_SetWindowsHookExW@16__imp__SetWindowsHookExW@16__head_libuser32_a daois00578.o/ 1301111120 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %BSetWindowsHookExA .text.data.bss.idata$7.idata$5.idata$4.idata$66I_SetWindowsHookExA@16__imp__SetWindowsHookExA@16__head_libuser32_a daois00577.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ASetWindowsHookA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_SetWindowsHookA@8__imp__SetWindowsHookA@8__head_libuser32_a daois00576.o/ 1301111120 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %@SetWindowWord .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_SetWindowWord@12__imp__SetWindowWord@12__head_libuser32_a daois00575.o/ 1301111120 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %?SetWindowTextW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_SetWindowTextW@8__imp__SetWindowTextW@8__head_libuser32_a daois00574.o/ 1301111120 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %>SetWindowTextA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_SetWindowTextA@8__imp__SetWindowTextA@8__head_libuser32_a daois00573.o/ 1301111120 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %=SetWindowRgn .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_SetWindowRgn@12__imp__SetWindowRgn@12__head_libuser32_a daois00572.o/ 1301111120 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %<SetWindowPos .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_SetWindowPos@28__imp__SetWindowPos@28__head_libuser32_a daois00571.o/ 1301111120 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %;SetWindowPlacement .text.data.bss.idata$7.idata$5.idata$4.idata$66I_SetWindowPlacement@8__imp__SetWindowPlacement@8__head_libuser32_a daois00570.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %:SetWindowLongW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_SetWindowLongW@12__imp__SetWindowLongW@12__head_libuser32_a daois00569.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %9SetWindowLongA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_SetWindowLongA@12__imp__SetWindowLongA@12__head_libuser32_a daois00568.o/ 1301111120 0 0 100666 649 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %8SetWindowContextHelpId .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_SetWindowContextHelpId@8__imp__SetWindowContextHelpId@8__head_libuser32_a daois00567.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %7SetWinEventHook .text.data.bss.idata$7.idata$5.idata$4.idata$62E_SetWinEventHook@28__imp__SetWinEventHook@28__head_libuser32_a daois00566.o/ 1301111120 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %6SetUserObjectSecurity .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_SetUserObjectSecurity@12__imp__SetUserObjectSecurity@12__head_libuser32_a daois00565.o/ 1301111120 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %5SetUserObjectInformationW .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_SetUserObjectInformationW@16__imp__SetUserObjectInformationW@16__head_libuser32_a daois00564.o/ 1301111120 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %4SetUserObjectInformationA .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_SetUserObjectInformationA@16__imp__SetUserObjectInformationA@16__head_libuser32_a daois00563.o/ 1301111120 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %3SetTimer .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_SetTimer@16__imp__SetTimer@16__head_libuser32_a daois00562.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %2SetThreadDesktop .text.data.bss.idata$7.idata$5.idata$4.idata$62E_SetThreadDesktop@4__imp__SetThreadDesktop@4__head_libuser32_a daois00561.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %1SetSystemTimer .text.data.bss.idata$7.idata$5.idata$4.idata$60C_SetSystemTimer@16__imp__SetSystemTimer@16__head_libuser32_a daois00560.o/ 1301111120 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %0SetSystemMenu .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_SetSystemMenu@8__imp__SetSystemMenu@8__head_libuser32_a daois00559.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %/SetSystemCursor .text.data.bss.idata$7.idata$5.idata$4.idata$60C_SetSystemCursor@8__imp__SetSystemCursor@8__head_libuser32_a daois00558.o/ 1301111120 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %.SetSysColors .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_SetSysColors@12__imp__SetSysColors@12__head_libuser32_a daois00557.o/ 1301111120 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %-SetShellWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_SetShellWindow@4__imp__SetShellWindow@4__head_libuser32_a daois00556.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %,SetScrollRange .text.data.bss.idata$7.idata$5.idata$4.idata$60C_SetScrollRange@20__imp__SetScrollRange@20__head_libuser32_a daois00555.o/ 1301111120 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %+SetScrollPos .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_SetScrollPos@16__imp__SetScrollPos@16__head_libuser32_a daois00554.o/ 1301111120 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %*SetScrollInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_SetScrollInfo@16__imp__SetScrollInfo@16__head_libuser32_a daois00553.o/ 1301111120 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %)SetRectEmpty .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_SetRectEmpty@4__imp__SetRectEmpty@4__head_libuser32_a daois00552.o/ 1301111120 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %(SetRect .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_SetRect@20__imp__SetRect@20__head_libuser32_a daois00551.o/ 1301111120 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %'SetPropW .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_SetPropW@12__imp__SetPropW@12__head_libuser32_a daois00550.o/ 1301111120 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %&SetPropA .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_SetPropA@12__imp__SetPropA@12__head_libuser32_a daois00549.o/ 1301111120 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %%SetProcessWindowStation .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_SetProcessWindowStation@4__imp__SetProcessWindowStation@4__head_libuser32_a daois00548.o/ 1301111120 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %$SetProcessDefaultLayout .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_SetProcessDefaultLayout@4__imp__SetProcessDefaultLayout@4__head_libuser32_a daois00547.o/ 1301111120 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %#SetParent .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_SetParent@8__imp__SetParent@8__head_libuser32_a daois00546.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %"SetMessageQueue .text.data.bss.idata$7.idata$5.idata$4.idata$60C_SetMessageQueue@4__imp__SetMessageQueue@4__head_libuser32_a daois00545.o/ 1301111120 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %!SetMessageExtraInfo .text.data.bss.idata$7.idata$5.idata$4.idata$68K_SetMessageExtraInfo@4__imp__SetMessageExtraInfo@4__head_libuser32_a daois00544.o/ 1301111120 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % SetMenuItemInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$64G_SetMenuItemInfoW@16__imp__SetMenuItemInfoW@16__head_libuser32_a daois00543.o/ 1301111120 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetMenuItemInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$64G_SetMenuItemInfoA@16__imp__SetMenuItemInfoA@16__head_libuser32_a daois00542.o/ 1301111120 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetMenuItemBitmaps .text.data.bss.idata$7.idata$5.idata$4.idata$68K_SetMenuItemBitmaps@20__imp__SetMenuItemBitmaps@20__head_libuser32_a daois00541.o/ 1301111120 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SetMenuInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_SetMenuInfo@8__imp__SetMenuInfo@8__head_libuser32_a daois00540.o/ 1301111120 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetMenuDefaultItem .text.data.bss.idata$7.idata$5.idata$4.idata$68K_SetMenuDefaultItem@12__imp__SetMenuDefaultItem@12__head_libuser32_a daois00539.o/ 1301111120 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetMenuContextHelpId .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_SetMenuContextHelpId@8__imp__SetMenuContextHelpId@8__head_libuser32_a daois00538.o/ 1301111120 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %SetMenu .text.data.bss.idata$7.idata$5.idata$4.idata$6 3_SetMenu@8__imp__SetMenu@8__head_libuser32_a daois00537.o/ 1301111120 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %SetLayeredWindowAttributes .text.data.bss.idata$7.idata$5.idata$4.idata$6#H[_SetLayeredWindowAttributes@16__imp__SetLayeredWindowAttributes@16__head_libuser32_a daois00536.o/ 1301111120 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetLastErrorEx .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_SetLastErrorEx@8__imp__SetLastErrorEx@8__head_libuser32_a daois00535.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetKeyboardState .text.data.bss.idata$7.idata$5.idata$4.idata$62E_SetKeyboardState@4__imp__SetKeyboardState@4__head_libuser32_a daois00534.o/ 1301111120 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetForegroundWindow .text.data.bss.idata$7.idata$5.idata$4.idata$68K_SetForegroundWindow@4__imp__SetForegroundWindow@4__head_libuser32_a daois00533.o/ 1301111120 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %SetFocus .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_SetFocus@4__imp__SetFocus@4__head_libuser32_a daois00532.o/ 1301111120 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetDoubleClickTime .text.data.bss.idata$7.idata$5.idata$4.idata$66I_SetDoubleClickTime@4__imp__SetDoubleClickTime@4__head_libuser32_a daois00531.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetDlgItemTextW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_SetDlgItemTextW@12__imp__SetDlgItemTextW@12__head_libuser32_a daois00530.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetDlgItemTextA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_SetDlgItemTextA@12__imp__SetDlgItemTextA@12__head_libuser32_a daois00529.o/ 1301111120 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SetDlgItemInt .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_SetDlgItemInt@16__imp__SetDlgItemInt@16__head_libuser32_a daois00528.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetDeskWallpaper .text.data.bss.idata$7.idata$5.idata$4.idata$62E_SetDeskWallpaper@4__imp__SetDeskWallpaper@4__head_libuser32_a daois00527.o/ 1301111120 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SetDebugErrorLevel .text.data.bss.idata$7.idata$5.idata$4.idata$66I_SetDebugErrorLevel@4__imp__SetDebugErrorLevel@4__head_libuser32_a daois00526.o/ 1301111120 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SetCursorPos .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_SetCursorPos@8__imp__SetCursorPos@8__head_libuser32_a daois00525.o/ 1301111120 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % SetCursor .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_SetCursor@4__imp__SetCursor@4__head_libuser32_a daois00524.o/ 1301111120 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ % SetClipboardViewer .text.data.bss.idata$7.idata$5.idata$4.idata$66I_SetClipboardViewer@4__imp__SetClipboardViewer@4__head_libuser32_a daois00523.o/ 1301111120 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % SetClipboardData .text.data.bss.idata$7.idata$5.idata$4.idata$62E_SetClipboardData@8__imp__SetClipboardData@8__head_libuser32_a daois00522.o/ 1301111120 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % SetClassWord .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_SetClassWord@12__imp__SetClassWord@12__head_libuser32_a daois00521.o/ 1301111120 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % SetClassLongW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_SetClassLongW@12__imp__SetClassLongW@12__head_libuser32_a daois00520.o/ 1301111120 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SetClassLongA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_SetClassLongA@12__imp__SetClassLongA@12__head_libuser32_a daois00519.o/ 1301111120 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SetCaretPos .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_SetCaretPos@8__imp__SetCaretPos@8__head_libuser32_a daois00518.o/ 1301111120 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetCaretBlinkTime .text.data.bss.idata$7.idata$5.idata$4.idata$64G_SetCaretBlinkTime@4__imp__SetCaretBlinkTime@4__head_libuser32_a daois00517.o/ 1301111120 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SetCapture .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_SetCapture@4__imp__SetCapture@4__head_libuser32_a daois00516.o/ 1301111120 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %SetActiveWindow .text.data.bss.idata$7.idata$5.idata$4.idata$60C_SetActiveWindow@4__imp__SetActiveWindow@4__head_libuser32_a daois00515.o/ 1301111120 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SendNotifyMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$68K_SendNotifyMessageW@16__imp__SendNotifyMessageW@16__head_libuser32_a daois00514.o/ 1301111120 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SendNotifyMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$68K_SendNotifyMessageA@16__imp__SendNotifyMessageA@16__head_libuser32_a daois00513.o/ 1301111120 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SendMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_SendMessageW@16__imp__SendMessageW@16__head_libuser32_a daois00512.o/ 1301111120 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SendMessageTimeoutW .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_SendMessageTimeoutW@28__imp__SendMessageTimeoutW@28__head_libuser32_a daois00511.o/ 1301111120 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SendMessageTimeoutA .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_SendMessageTimeoutA@28__imp__SendMessageTimeoutA@28__head_libuser32_a daois00510.o/ 1301111120 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SendMessageCallbackW .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_SendMessageCallbackW@24__imp__SendMessageCallbackW@24__head_libuser32_a daois00509.o/ 1301111120 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SendMessageCallbackA .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_SendMessageCallbackA@24__imp__SendMessageCallbackA@24__head_libuser32_a daois00508.o/ 1301111120 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %SendMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_SendMessageA@16__imp__SendMessageA@16__head_libuser32_a daois00507.o/ 1301111119 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %SendInput .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_SendInput@12__imp__SendInput@12__head_libuser32_a daois00506.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SendDlgItemMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_SendDlgItemMessageW@20__imp__SendDlgItemMessageW@20__head_libuser32_a daois00505.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %SendDlgItemMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_SendDlgItemMessageA@20__imp__SendDlgItemMessageA@20__head_libuser32_a daois00504.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ScrollWindowEx .text.data.bss.idata$7.idata$5.idata$4.idata$60C_ScrollWindowEx@32__imp__ScrollWindowEx@32__head_libuser32_a daois00503.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ScrollWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_ScrollWindow@20__imp__ScrollWindow@20__head_libuser32_a daois00502.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %ScrollDC .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_ScrollDC@28__imp__ScrollDC@28__head_libuser32_a daois00501.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ScrollChildren .text.data.bss.idata$7.idata$5.idata$4.idata$60C_ScrollChildren@12__imp__ScrollChildren@12__head_libuser32_a daois00500.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ScreenToClient .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_ScreenToClient@8__imp__ScreenToClient@8__head_libuser32_a daois00499.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ReuseDDElParam .text.data.bss.idata$7.idata$5.idata$4.idata$60C_ReuseDDElParam@20__imp__ReuseDDElParam@20__head_libuser32_a daois00498.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ReplyMessage .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_ReplyMessage@4__imp__ReplyMessage@4__head_libuser32_a daois00497.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RemovePropW .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_RemovePropW@8__imp__RemovePropW@8__head_libuser32_a daois00496.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RemovePropA .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_RemovePropA@8__imp__RemovePropA@8__head_libuser32_a daois00495.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RemoveMenu .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_RemoveMenu@12__imp__RemoveMenu@12__head_libuser32_a daois00494.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %ReleaseDC .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_ReleaseDC@8__imp__ReleaseDC@8__head_libuser32_a daois00493.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ReleaseCapture .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_ReleaseCapture@0__imp__ReleaseCapture@0__head_libuser32_a daois00492.o/ 1301111119 0 0 100666 649 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegisterWindowMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_RegisterWindowMessageW@4__imp__RegisterWindowMessageW@4__head_libuser32_a daois00491.o/ 1301111119 0 0 100666 649 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegisterWindowMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_RegisterWindowMessageA@4__imp__RegisterWindowMessageA@4__head_libuser32_a daois00490.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RegisterTouchWindow .text.data.bss.idata$7.idata$5.idata$4.idata$68K_RegisterTouchWindow@8__imp__RegisterTouchWindow@8__head_libuser32_a daois00489.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegisterRawInputDevices .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_RegisterRawInputDevices@12__imp__RegisterRawInputDevices@12__head_libuser32_a daois00488.o/ 1301111119 0 0 100666 679 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6$@ %RegisterPowerSettingNotification .text.data.bss.idata$7.idata$5.idata$4.idata$6)Tg_RegisterPowerSettingNotification@12__imp__RegisterPowerSettingNotification@12__head_libuser32_a daois00487.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegisterHotKey .text.data.bss.idata$7.idata$5.idata$4.idata$60C_RegisterHotKey@16__imp__RegisterHotKey@16__head_libuser32_a daois00486.o/ 1301111119 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %RegisterDeviceNotificationW .text.data.bss.idata$7.idata$5.idata$4.idata$6$J]_RegisterDeviceNotificationW@12__imp__RegisterDeviceNotificationW@12__head_libuser32_a daois00485.o/ 1301111119 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %RegisterDeviceNotificationA .text.data.bss.idata$7.idata$5.idata$4.idata$6$J]_RegisterDeviceNotificationA@12__imp__RegisterDeviceNotificationA@12__head_libuser32_a daois00484.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegisterClipboardFormatW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_RegisterClipboardFormatW@4__imp__RegisterClipboardFormatW@4__head_libuser32_a daois00483.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RegisterClipboardFormatA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_RegisterClipboardFormatA@4__imp__RegisterClipboardFormatA@4__head_libuser32_a daois00482.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegisterClassW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_RegisterClassW@4__imp__RegisterClassW@4__head_libuser32_a daois00481.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegisterClassExW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_RegisterClassExW@4__imp__RegisterClassExW@4__head_libuser32_a daois00480.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegisterClassExA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_RegisterClassExA@4__imp__RegisterClassExA@4__head_libuser32_a daois00479.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %RegisterClassA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_RegisterClassA@4__imp__RegisterClassA@4__head_libuser32_a daois00478.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RedrawWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_RedrawWindow@16__imp__RedrawWindow@16__head_libuser32_a daois00477.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RealGetWindowClassW .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_RealGetWindowClassW@12__imp__RealGetWindowClassW@12__head_libuser32_a daois00476.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %RealGetWindowClassA .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_RealGetWindowClassA@12__imp__RealGetWindowClassA@12__head_libuser32_a daois00475.o/ 1301111119 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %RealChildWindowFromPoint .text.data.bss.idata$7.idata$5.idata$4.idata$6!DW_RealChildWindowFromPoint@12__imp__RealChildWindowFromPoint@12__head_libuser32_a daois00474.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %PtInRect .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_PtInRect@12__imp__PtInRect@12__head_libuser32_a daois00473.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %PrivateExtractIconsW .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_PrivateExtractIconsW@32__imp__PrivateExtractIconsW@32__head_libuser32_a daois00472.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %PrivateExtractIconsA .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_PrivateExtractIconsA@32__imp__PrivateExtractIconsA@32__head_libuser32_a daois00471.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %PrintWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_PrintWindow@12__imp__PrintWindow@12__head_libuser32_a daois00470.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %PostThreadMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$68K_PostThreadMessageW@16__imp__PostThreadMessageW@16__head_libuser32_a daois00469.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %PostThreadMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$68K_PostThreadMessageA@16__imp__PostThreadMessageA@16__head_libuser32_a daois00468.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %PostQuitMessage .text.data.bss.idata$7.idata$5.idata$4.idata$60C_PostQuitMessage@4__imp__PostQuitMessage@4__head_libuser32_a daois00467.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %PostMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_PostMessageW@16__imp__PostMessageW@16__head_libuser32_a daois00466.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %PostMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_PostMessageA@16__imp__PostMessageA@16__head_libuser32_a daois00465.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %PeekMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_PeekMessageW@20__imp__PeekMessageW@20__head_libuser32_a daois00464.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %PeekMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_PeekMessageA@20__imp__PeekMessageA@20__head_libuser32_a daois00463.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %PaintDesktop .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_PaintDesktop@4__imp__PaintDesktop@4__head_libuser32_a daois00462.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %PackDDElParam .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_PackDDElParam@12__imp__PackDDElParam@12__head_libuser32_a daois00461.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %OpenWindowStationW .text.data.bss.idata$7.idata$5.idata$4.idata$68K_OpenWindowStationW@12__imp__OpenWindowStationW@12__head_libuser32_a daois00460.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %OpenWindowStationA .text.data.bss.idata$7.idata$5.idata$4.idata$68K_OpenWindowStationA@12__imp__OpenWindowStationA@12__head_libuser32_a daois00459.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %OpenInputDesktop .text.data.bss.idata$7.idata$5.idata$4.idata$64G_OpenInputDesktop@12__imp__OpenInputDesktop@12__head_libuser32_a daois00458.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %OpenIcon .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_OpenIcon@4__imp__OpenIcon@4__head_libuser32_a daois00457.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %OpenDesktopW .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_OpenDesktopW@16__imp__OpenDesktopW@16__head_libuser32_a daois00456.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %OpenDesktopA .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_OpenDesktopA@16__imp__OpenDesktopA@16__head_libuser32_a daois00455.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %OpenClipboard .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_OpenClipboard@4__imp__OpenClipboard@4__head_libuser32_a daois00454.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %OffsetRect .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_OffsetRect@12__imp__OffsetRect@12__head_libuser32_a daois00453.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %OemToCharW .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_OemToCharW@8__imp__OemToCharW@8__head_libuser32_a daois00452.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %OemToCharBuffW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_OemToCharBuffW@12__imp__OemToCharBuffW@12__head_libuser32_a daois00451.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %OemToCharBuffA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_OemToCharBuffA@12__imp__OemToCharBuffA@12__head_libuser32_a daois00450.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %OemToCharA .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_OemToCharA@8__imp__OemToCharA@8__head_libuser32_a daois00449.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %OemKeyScan .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_OemKeyScan@4__imp__OemKeyScan@4__head_libuser32_a daois00448.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %NotifyWinEvent .text.data.bss.idata$7.idata$5.idata$4.idata$60C_NotifyWinEvent@16__imp__NotifyWinEvent@16__head_libuser32_a daois00447.o/ 1301111119 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %MsgWaitForMultipleObjectsEx .text.data.bss.idata$7.idata$5.idata$4.idata$6$J]_MsgWaitForMultipleObjectsEx@20__imp__MsgWaitForMultipleObjectsEx@20__head_libuser32_a daois00446.o/ 1301111119 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %MsgWaitForMultipleObjects .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_MsgWaitForMultipleObjects@20__imp__MsgWaitForMultipleObjects@20__head_libuser32_a daois00445.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %MoveWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_MoveWindow@24__imp__MoveWindow@24__head_libuser32_a daois00444.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MonitorFromWindow .text.data.bss.idata$7.idata$5.idata$4.idata$64G_MonitorFromWindow@8__imp__MonitorFromWindow@8__head_libuser32_a daois00443.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MonitorFromRect .text.data.bss.idata$7.idata$5.idata$4.idata$60C_MonitorFromRect@8__imp__MonitorFromRect@8__head_libuser32_a daois00442.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MonitorFromPoint .text.data.bss.idata$7.idata$5.idata$4.idata$64G_MonitorFromPoint@12__imp__MonitorFromPoint@12__head_libuser32_a daois00441.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ModifyMenuW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_ModifyMenuW@20__imp__ModifyMenuW@20__head_libuser32_a daois00440.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ModifyMenuA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_ModifyMenuA@20__imp__ModifyMenuA@20__head_libuser32_a daois00439.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %MessageBoxW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_MessageBoxW@16__imp__MessageBoxW@16__head_libuser32_a daois00438.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %MessageBoxIndirectW .text.data.bss.idata$7.idata$5.idata$4.idata$68K_MessageBoxIndirectW@4__imp__MessageBoxIndirectW@4__head_libuser32_a daois00437.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %MessageBoxIndirectA .text.data.bss.idata$7.idata$5.idata$4.idata$68K_MessageBoxIndirectA@4__imp__MessageBoxIndirectA@4__head_libuser32_a daois00436.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %MessageBoxExW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_MessageBoxExW@20__imp__MessageBoxExW@20__head_libuser32_a daois00435.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %MessageBoxExA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_MessageBoxExA@20__imp__MessageBoxExA@20__head_libuser32_a daois00434.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %MessageBoxA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_MessageBoxA@16__imp__MessageBoxA@16__head_libuser32_a daois00433.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %MessageBeep .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_MessageBeep@4__imp__MessageBeep@4__head_libuser32_a daois00432.o/ 1301111119 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MenuItemFromPoint .text.data.bss.idata$7.idata$5.idata$4.idata$66I_MenuItemFromPoint@16__imp__MenuItemFromPoint@16__head_libuser32_a daois00431.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MapWindowPoints .text.data.bss.idata$7.idata$5.idata$4.idata$62E_MapWindowPoints@16__imp__MapWindowPoints@16__head_libuser32_a daois00430.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MapVirtualKeyW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_MapVirtualKeyW@8__imp__MapVirtualKeyW@8__head_libuser32_a daois00429.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MapVirtualKeyExW .text.data.bss.idata$7.idata$5.idata$4.idata$64G_MapVirtualKeyExW@12__imp__MapVirtualKeyExW@12__head_libuser32_a daois00428.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MapVirtualKeyExA .text.data.bss.idata$7.idata$5.idata$4.idata$64G_MapVirtualKeyExA@12__imp__MapVirtualKeyExA@12__head_libuser32_a daois00427.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MapVirtualKeyA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_MapVirtualKeyA@8__imp__MapVirtualKeyA@8__head_libuser32_a daois00426.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %MapDialogRect .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_MapDialogRect@8__imp__MapDialogRect@8__head_libuser32_a daois00425.o/ 1301111119 0 0 100666 665 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %LookupIconIdFromDirectoryEx .text.data.bss.idata$7.idata$5.idata$4.idata$6$J]_LookupIconIdFromDirectoryEx@20__imp__LookupIconIdFromDirectoryEx@20__head_libuser32_a daois00424.o/ 1301111119 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %LookupIconIdFromDirectory .text.data.bss.idata$7.idata$5.idata$4.idata$6!DW_LookupIconIdFromDirectory@8__imp__LookupIconIdFromDirectory@8__head_libuser32_a daois00423.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LockWorkStation .text.data.bss.idata$7.idata$5.idata$4.idata$60C_LockWorkStation@0__imp__LockWorkStation@0__head_libuser32_a daois00422.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LockWindowUpdate .text.data.bss.idata$7.idata$5.idata$4.idata$62E_LockWindowUpdate@4__imp__LockWindowUpdate@4__head_libuser32_a daois00421.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %LockSetForegroundWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_LockSetForegroundWindow@4__imp__LockSetForegroundWindow@4__head_libuser32_a daois00420.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %LoadStringW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_LoadStringW@16__imp__LoadStringW@16__head_libuser32_a daois00419.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %LoadStringA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_LoadStringA@16__imp__LoadStringA@16__head_libuser32_a daois00418.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %LoadMenuW .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_LoadMenuW@8__imp__LoadMenuW@8__head_libuser32_a daois00417.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LoadMenuIndirectW .text.data.bss.idata$7.idata$5.idata$4.idata$64G_LoadMenuIndirectW@4__imp__LoadMenuIndirectW@4__head_libuser32_a daois00416.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LoadMenuIndirectA .text.data.bss.idata$7.idata$5.idata$4.idata$64G_LoadMenuIndirectA@4__imp__LoadMenuIndirectA@4__head_libuser32_a daois00415.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %LoadMenuA .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_LoadMenuA@8__imp__LoadMenuA@8__head_libuser32_a daois00414.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LoadKeyboardLayoutW .text.data.bss.idata$7.idata$5.idata$4.idata$68K_LoadKeyboardLayoutW@8__imp__LoadKeyboardLayoutW@8__head_libuser32_a daois00413.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LoadKeyboardLayoutA .text.data.bss.idata$7.idata$5.idata$4.idata$68K_LoadKeyboardLayoutA@8__imp__LoadKeyboardLayoutA@8__head_libuser32_a daois00412.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %LoadImageW .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_LoadImageW@24__imp__LoadImageW@24__head_libuser32_a daois00411.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %LoadImageA .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_LoadImageA@24__imp__LoadImageA@24__head_libuser32_a daois00410.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %LoadIconW .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_LoadIconW@8__imp__LoadIconW@8__head_libuser32_a daois00409.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %LoadIconA .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_LoadIconA@8__imp__LoadIconA@8__head_libuser32_a daois00408.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %LoadCursorW .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_LoadCursorW@8__imp__LoadCursorW@8__head_libuser32_a daois00407.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LoadCursorFromFileW .text.data.bss.idata$7.idata$5.idata$4.idata$68K_LoadCursorFromFileW@4__imp__LoadCursorFromFileW@4__head_libuser32_a daois00406.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %LoadCursorFromFileA .text.data.bss.idata$7.idata$5.idata$4.idata$68K_LoadCursorFromFileA@4__imp__LoadCursorFromFileA@4__head_libuser32_a daois00405.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %LoadCursorA .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_LoadCursorA@8__imp__LoadCursorA@8__head_libuser32_a daois00404.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %LoadBitmapW .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_LoadBitmapW@8__imp__LoadBitmapW@8__head_libuser32_a daois00403.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %LoadBitmapA .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_LoadBitmapA@8__imp__LoadBitmapA@8__head_libuser32_a daois00402.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LoadAcceleratorsW .text.data.bss.idata$7.idata$5.idata$4.idata$64G_LoadAcceleratorsW@8__imp__LoadAcceleratorsW@8__head_libuser32_a daois00401.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LoadAcceleratorsA .text.data.bss.idata$7.idata$5.idata$4.idata$64G_LoadAcceleratorsA@8__imp__LoadAcceleratorsA@8__head_libuser32_a daois00400.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %KillTimer .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_KillTimer@8__imp__KillTimer@8__head_libuser32_a daois00399.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %KillSystemTimer .text.data.bss.idata$7.idata$5.idata$4.idata$60C_KillSystemTimer@8__imp__KillSystemTimer@8__head_libuser32_a daois00398.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %IsZoomed .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_IsZoomed@4__imp__IsZoomed@4__head_libuser32_a daois00397.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsWindowVisible .text.data.bss.idata$7.idata$5.idata$4.idata$60C_IsWindowVisible@4__imp__IsWindowVisible@4__head_libuser32_a daois00396.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsWindowUnicode .text.data.bss.idata$7.idata$5.idata$4.idata$60C_IsWindowUnicode@4__imp__IsWindowUnicode@4__head_libuser32_a daois00395.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsWindowEnabled .text.data.bss.idata$7.idata$5.idata$4.idata$60C_IsWindowEnabled@4__imp__IsWindowEnabled@4__head_libuser32_a daois00394.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %IsWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_IsWindow@4__imp__IsWindow@4__head_libuser32_a daois00393.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %IsWinEventHookInstalled .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_IsWinEventHookInstalled@4__imp__IsWinEventHookInstalled@4__head_libuser32_a daois00392.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IsTouchWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_IsTouchWindow@8__imp__IsTouchWindow@8__head_libuser32_a daois00391.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IsRectEmpty .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_IsRectEmpty@4__imp__IsRectEmpty@4__head_libuser32_a daois00390.o/ 1301111119 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %IsMenu .text.data.bss.idata$7.idata$5.idata$4.idata$61_IsMenu@4__imp__IsMenu@4__head_libuser32_a daois00389.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %IsIconic .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_IsIconic@4__imp__IsIconic@4__head_libuser32_a daois00388.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsHungAppWindow .text.data.bss.idata$7.idata$5.idata$4.idata$60C_IsHungAppWindow@4__imp__IsHungAppWindow@4__head_libuser32_a daois00387.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %IsGUIThread .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_IsGUIThread@4__imp__IsGUIThread@4__head_libuser32_a daois00386.o/ 1301111119 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %IsDlgButtonChecked .text.data.bss.idata$7.idata$5.idata$4.idata$66I_IsDlgButtonChecked@8__imp__IsDlgButtonChecked@8__head_libuser32_a daois00385.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsDialogMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_IsDialogMessageW@8__imp__IsDialogMessageW@8__head_libuser32_a daois00384.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsDialogMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_IsDialogMessageA@8__imp__IsDialogMessageA@8__head_libuser32_a daois00383.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IsDialogMessage .text.data.bss.idata$7.idata$5.idata$4.idata$60C_IsDialogMessage@8__imp__IsDialogMessage@8__head_libuser32_a daois00382.o/ 1301111119 0 0 100666 661 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %~IsClipboardFormatAvailable .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_IsClipboardFormatAvailable@4__imp__IsClipboardFormatAvailable@4__head_libuser32_a daois00381.o/ 1301111119 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %}IsChild .text.data.bss.idata$7.idata$5.idata$4.idata$6 3_IsChild@8__imp__IsChild@8__head_libuser32_a daois00380.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %|IsCharUpperW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_IsCharUpperW@4__imp__IsCharUpperW@4__head_libuser32_a daois00379.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %{IsCharUpperA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_IsCharUpperA@4__imp__IsCharUpperA@4__head_libuser32_a daois00378.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %zIsCharLowerW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_IsCharLowerW@4__imp__IsCharLowerW@4__head_libuser32_a daois00377.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %yIsCharLowerA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_IsCharLowerA@4__imp__IsCharLowerA@4__head_libuser32_a daois00376.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %xIsCharAlphaW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_IsCharAlphaW@4__imp__IsCharAlphaW@4__head_libuser32_a daois00375.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %wIsCharAlphaNumericW .text.data.bss.idata$7.idata$5.idata$4.idata$68K_IsCharAlphaNumericW@4__imp__IsCharAlphaNumericW@4__head_libuser32_a daois00374.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %vIsCharAlphaNumericA .text.data.bss.idata$7.idata$5.idata$4.idata$68K_IsCharAlphaNumericA@4__imp__IsCharAlphaNumericA@4__head_libuser32_a daois00373.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %uIsCharAlphaA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_IsCharAlphaA@4__imp__IsCharAlphaA@4__head_libuser32_a daois00372.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %tInvertRect .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_InvertRect@8__imp__InvertRect@8__head_libuser32_a daois00371.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %sInvalidateRgn .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_InvalidateRgn@12__imp__InvalidateRgn@12__head_libuser32_a daois00370.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %rInvalidateRect .text.data.bss.idata$7.idata$5.idata$4.idata$60C_InvalidateRect@12__imp__InvalidateRect@12__head_libuser32_a daois00369.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %qIntersectRect .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_IntersectRect@12__imp__IntersectRect@12__head_libuser32_a daois00368.o/ 1301111119 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %pInternalGetWindowText .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_InternalGetWindowText@12__imp__InternalGetWindowText@12__head_libuser32_a daois00367.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %oInsertMenuW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_InsertMenuW@20__imp__InsertMenuW@20__head_libuser32_a daois00366.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %nInsertMenuItemW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_InsertMenuItemW@16__imp__InsertMenuItemW@16__head_libuser32_a daois00365.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %mInsertMenuItemA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_InsertMenuItemA@16__imp__InsertMenuItemA@16__head_libuser32_a daois00364.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %lInsertMenuA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_InsertMenuA@20__imp__InsertMenuA@20__head_libuser32_a daois00363.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %kInflateRect .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_InflateRect@12__imp__InflateRect@12__head_libuser32_a daois00362.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %jInSendMessageEx .text.data.bss.idata$7.idata$5.idata$4.idata$60C_InSendMessageEx@4__imp__InSendMessageEx@4__head_libuser32_a daois00361.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %iInSendMessage .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_InSendMessage@0__imp__InSendMessage@0__head_libuser32_a daois00360.o/ 1301111119 0 0 100666 661 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %hImpersonateDdeClientWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_ImpersonateDdeClientWindow@8__imp__ImpersonateDdeClientWindow@8__head_libuser32_a daois00359.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %gHiliteMenuItem .text.data.bss.idata$7.idata$5.idata$4.idata$60C_HiliteMenuItem@16__imp__HiliteMenuItem@16__head_libuser32_a daois00358.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %fHideCaret .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_HideCaret@4__imp__HideCaret@4__head_libuser32_a daois00357.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %eGrayStringW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_GrayStringW@36__imp__GrayStringW@36__head_libuser32_a daois00356.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %dGrayStringA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_GrayStringA@36__imp__GrayStringA@36__head_libuser32_a daois00355.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %cGetWindowWord .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetWindowWord@8__imp__GetWindowWord@8__head_libuser32_a daois00354.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %bGetWindowThreadProcessId .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_GetWindowThreadProcessId@8__imp__GetWindowThreadProcessId@8__head_libuser32_a daois00353.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %aGetWindowTextW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetWindowTextW@12__imp__GetWindowTextW@12__head_libuser32_a daois00352.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %`GetWindowTextLengthW .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_GetWindowTextLengthW@4__imp__GetWindowTextLengthW@4__head_libuser32_a daois00351.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %_GetWindowTextLengthA .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_GetWindowTextLengthA@4__imp__GetWindowTextLengthA@4__head_libuser32_a daois00350.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %^GetWindowTextA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetWindowTextA@12__imp__GetWindowTextA@12__head_libuser32_a daois00349.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %]GetWindowRgn .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_GetWindowRgn@8__imp__GetWindowRgn@8__head_libuser32_a daois00348.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %\GetWindowRect .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetWindowRect@8__imp__GetWindowRect@8__head_libuser32_a daois00347.o/ 1301111119 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %[GetWindowPlacement .text.data.bss.idata$7.idata$5.idata$4.idata$66I_GetWindowPlacement@8__imp__GetWindowPlacement@8__head_libuser32_a daois00346.o/ 1301111119 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ZGetWindowModuleFileNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DW_GetWindowModuleFileNameW@12__imp__GetWindowModuleFileNameW@12__head_libuser32_a daois00345.o/ 1301111119 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %YGetWindowModuleFileNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DW_GetWindowModuleFileNameA@12__imp__GetWindowModuleFileNameA@12__head_libuser32_a daois00344.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %XGetWindowModuleFileName .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_GetWindowModuleFileName@12__imp__GetWindowModuleFileName@12__head_libuser32_a daois00343.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %WGetWindowLongW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetWindowLongW@8__imp__GetWindowLongW@8__head_libuser32_a daois00342.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %VGetWindowLongA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetWindowLongA@8__imp__GetWindowLongA@8__head_libuser32_a daois00341.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %UGetWindowInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetWindowInfo@8__imp__GetWindowInfo@8__head_libuser32_a daois00340.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %TGetWindowDC .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_GetWindowDC@4__imp__GetWindowDC@4__head_libuser32_a daois00339.o/ 1301111119 0 0 100666 649 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SGetWindowContextHelpId .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_GetWindowContextHelpId@4__imp__GetWindowContextHelpId@4__head_libuser32_a daois00338.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %RGetWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_GetWindow@8__imp__GetWindow@8__head_libuser32_a daois00337.o/ 1301111119 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %QGetUserObjectSecurity .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_GetUserObjectSecurity@20__imp__GetUserObjectSecurity@20__head_libuser32_a daois00336.o/ 1301111119 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %PGetUserObjectInformationW .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_GetUserObjectInformationW@20__imp__GetUserObjectInformationW@20__head_libuser32_a daois00335.o/ 1301111119 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %OGetUserObjectInformationA .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_GetUserObjectInformationA@20__imp__GetUserObjectInformationA@20__head_libuser32_a daois00334.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %NGetUpdateRgn .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetUpdateRgn@12__imp__GetUpdateRgn@12__head_libuser32_a daois00333.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %MGetUpdateRect .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetUpdateRect@12__imp__GetUpdateRect@12__head_libuser32_a daois00332.o/ 1301111119 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LGetTouchInputInfo .text.data.bss.idata$7.idata$5.idata$4.idata$66I_GetTouchInputInfo@16__imp__GetTouchInputInfo@16__head_libuser32_a daois00331.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %KGetTopWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_GetTopWindow@4__imp__GetTopWindow@4__head_libuser32_a daois00330.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %JGetTitleBarInfo .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetTitleBarInfo@8__imp__GetTitleBarInfo@8__head_libuser32_a daois00329.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %IGetThreadDesktop .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetThreadDesktop@4__imp__GetThreadDesktop@4__head_libuser32_a daois00328.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %HGetTabbedTextExtentW .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_GetTabbedTextExtentW@20__imp__GetTabbedTextExtentW@20__head_libuser32_a daois00327.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GGetTabbedTextExtentA .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_GetTabbedTextExtentA@20__imp__GetTabbedTextExtentA@20__head_libuser32_a daois00326.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %FGetSystemMetrics .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetSystemMetrics@4__imp__GetSystemMetrics@4__head_libuser32_a daois00325.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EGetSystemMenu .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetSystemMenu@8__imp__GetSystemMenu@8__head_libuser32_a daois00324.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DGetSysColorBrush .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetSysColorBrush@4__imp__GetSysColorBrush@4__head_libuser32_a daois00323.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CGetSysColor .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_GetSysColor@4__imp__GetSysColor@4__head_libuser32_a daois00322.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %BGetSubMenu .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_GetSubMenu@8__imp__GetSubMenu@8__head_libuser32_a daois00321.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %AGetShellWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetShellWindow@0__imp__GetShellWindow@0__head_libuser32_a daois00320.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %@GetScrollRange .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetScrollRange@16__imp__GetScrollRange@16__head_libuser32_a daois00319.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %?GetScrollPos .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_GetScrollPos@8__imp__GetScrollPos@8__head_libuser32_a daois00318.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %>GetScrollInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetScrollInfo@12__imp__GetScrollInfo@12__head_libuser32_a daois00317.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %=GetScrollBarInfo .text.data.bss.idata$7.idata$5.idata$4.idata$64G_GetScrollBarInfo@12__imp__GetScrollBarInfo@12__head_libuser32_a daois00316.o/ 1301111119 0 0 100666 667 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %<GetRegisteredRawInputDevices .text.data.bss.idata$7.idata$5.idata$4.idata$6%L__GetRegisteredRawInputDevices@12__imp__GetRegisteredRawInputDevices@12__head_libuser32_a daois00315.o/ 1301111119 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %;GetRawInputDeviceList .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_GetRawInputDeviceList@12__imp__GetRawInputDeviceList@12__head_libuser32_a daois00314.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %:GetRawInputDeviceInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_GetRawInputDeviceInfoW@16__imp__GetRawInputDeviceInfoW@16__head_libuser32_a daois00313.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %9GetRawInputDeviceInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_GetRawInputDeviceInfoA@16__imp__GetRawInputDeviceInfoA@16__head_libuser32_a daois00312.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %8GetRawInputData .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetRawInputData@20__imp__GetRawInputData@20__head_libuser32_a daois00311.o/ 1301111119 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %7GetRawInputBuffer .text.data.bss.idata$7.idata$5.idata$4.idata$66I_GetRawInputBuffer@12__imp__GetRawInputBuffer@12__head_libuser32_a daois00310.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %6GetQueueStatus .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetQueueStatus@4__imp__GetQueueStatus@4__head_libuser32_a daois00309.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %5GetPropW .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_GetPropW@8__imp__GetPropW@8__head_libuser32_a daois00308.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %4GetPropA .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_GetPropA@8__imp__GetPropA@8__head_libuser32_a daois00307.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %3GetProcessWindowStation .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_GetProcessWindowStation@0__imp__GetProcessWindowStation@0__head_libuser32_a daois00306.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %2GetProcessDefaultLayout .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_GetProcessDefaultLayout@4__imp__GetProcessDefaultLayout@4__head_libuser32_a daois00305.o/ 1301111119 0 0 100666 661 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %1GetPriorityClipboardFormat .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_GetPriorityClipboardFormat@8__imp__GetPriorityClipboardFormat@8__head_libuser32_a daois00304.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %0GetParent .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_GetParent@4__imp__GetParent@4__head_libuser32_a daois00303.o/ 1301111119 0 0 100666 649 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %/GetOpenClipboardWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_GetOpenClipboardWindow@0__imp__GetOpenClipboardWindow@0__head_libuser32_a daois00302.o/ 1301111119 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %.GetNextDlgTabItem .text.data.bss.idata$7.idata$5.idata$4.idata$66I_GetNextDlgTabItem@12__imp__GetNextDlgTabItem@12__head_libuser32_a daois00301.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %-GetNextDlgGroupItem .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_GetNextDlgGroupItem@12__imp__GetNextDlgGroupItem@12__head_libuser32_a daois00300.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %,GetMouseMovePointsEx .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_GetMouseMovePointsEx@20__imp__GetMouseMovePointsEx@20__head_libuser32_a daois00299.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %+GetMonitorInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetMonitorInfoW@8__imp__GetMonitorInfoW@8__head_libuser32_a daois00298.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %*GetMonitorInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetMonitorInfoA@8__imp__GetMonitorInfoA@8__head_libuser32_a daois00297.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %)GetMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_GetMessageW@16__imp__GetMessageW@16__head_libuser32_a daois00296.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %(GetMessageTime .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetMessageTime@0__imp__GetMessageTime@0__head_libuser32_a daois00295.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %'GetMessagePos .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetMessagePos@0__imp__GetMessagePos@0__head_libuser32_a daois00294.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %&GetMessageExtraInfo .text.data.bss.idata$7.idata$5.idata$4.idata$68K_GetMessageExtraInfo@0__imp__GetMessageExtraInfo@0__head_libuser32_a daois00293.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %%GetMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_GetMessageA@16__imp__GetMessageA@16__head_libuser32_a daois00292.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %$GetMenuStringW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetMenuStringW@20__imp__GetMenuStringW@20__head_libuser32_a daois00291.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %#GetMenuStringA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetMenuStringA@20__imp__GetMenuStringA@20__head_libuser32_a daois00290.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %"GetMenuState .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetMenuState@12__imp__GetMenuState@12__head_libuser32_a daois00289.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %!GetMenuItemRect .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetMenuItemRect@16__imp__GetMenuItemRect@16__head_libuser32_a daois00288.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % GetMenuItemInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$64G_GetMenuItemInfoW@16__imp__GetMenuItemInfoW@16__head_libuser32_a daois00287.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetMenuItemInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$64G_GetMenuItemInfoA@16__imp__GetMenuItemInfoA@16__head_libuser32_a daois00286.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetMenuItemID .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetMenuItemID@8__imp__GetMenuItemID@8__head_libuser32_a daois00285.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetMenuItemCount .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetMenuItemCount@4__imp__GetMenuItemCount@4__head_libuser32_a daois00284.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetMenuInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_GetMenuInfo@8__imp__GetMenuInfo@8__head_libuser32_a daois00283.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetMenuDefaultItem .text.data.bss.idata$7.idata$5.idata$4.idata$68K_GetMenuDefaultItem@12__imp__GetMenuDefaultItem@12__head_libuser32_a daois00282.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetMenuContextHelpId .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_GetMenuContextHelpId@4__imp__GetMenuContextHelpId@4__head_libuser32_a daois00281.o/ 1301111119 0 0 100666 661 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetMenuCheckMarkDimensions .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_GetMenuCheckMarkDimensions@0__imp__GetMenuCheckMarkDimensions@0__head_libuser32_a daois00280.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetMenuBarInfo .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetMenuBarInfo@16__imp__GetMenuBarInfo@16__head_libuser32_a daois00279.o/ 1301111119 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %GetMenu .text.data.bss.idata$7.idata$5.idata$4.idata$6 3_GetMenu@4__imp__GetMenu@4__head_libuser32_a daois00278.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetListBoxInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetListBoxInfo@4__imp__GetListBoxInfo@4__head_libuser32_a daois00277.o/ 1301111119 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetLayeredWindowAttributes .text.data.bss.idata$7.idata$5.idata$4.idata$6#H[_GetLayeredWindowAttributes@16__imp__GetLayeredWindowAttributes@16__head_libuser32_a daois00276.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetLastInputInfo .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetLastInputInfo@4__imp__GetLastInputInfo@4__head_libuser32_a daois00275.o/ 1301111119 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetLastActivePopup .text.data.bss.idata$7.idata$5.idata$4.idata$66I_GetLastActivePopup@4__imp__GetLastActivePopup@4__head_libuser32_a daois00274.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetKeyboardType .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetKeyboardType@4__imp__GetKeyboardType@4__head_libuser32_a daois00273.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetKeyboardState .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetKeyboardState@4__imp__GetKeyboardState@4__head_libuser32_a daois00272.o/ 1301111119 0 0 100666 649 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetKeyboardLayoutNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_GetKeyboardLayoutNameW@4__imp__GetKeyboardLayoutNameW@4__head_libuser32_a daois00271.o/ 1301111119 0 0 100666 649 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetKeyboardLayoutNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_GetKeyboardLayoutNameA@4__imp__GetKeyboardLayoutNameA@4__head_libuser32_a daois00270.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetKeyboardLayoutList .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_GetKeyboardLayoutList@8__imp__GetKeyboardLayoutList@8__head_libuser32_a daois00269.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % GetKeyboardLayout .text.data.bss.idata$7.idata$5.idata$4.idata$64G_GetKeyboardLayout@4__imp__GetKeyboardLayout@4__head_libuser32_a daois00268.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % GetKeyState .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_GetKeyState@4__imp__GetKeyState@4__head_libuser32_a daois00267.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % GetKeyNameTextW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetKeyNameTextW@12__imp__GetKeyNameTextW@12__head_libuser32_a daois00266.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % GetKeyNameTextA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetKeyNameTextA@12__imp__GetKeyNameTextA@12__head_libuser32_a daois00265.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % GetKBCodePage .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetKBCodePage@0__imp__GetKBCodePage@0__head_libuser32_a daois00264.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetInputState .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetInputState@0__imp__GetInputState@0__head_libuser32_a daois00263.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetInputDesktop .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetInputDesktop@0__imp__GetInputDesktop@0__head_libuser32_a daois00262.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetIconInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_GetIconInfo@8__imp__GetIconInfo@8__head_libuser32_a daois00261.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetGuiResources .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetGuiResources@8__imp__GetGuiResources@8__head_libuser32_a daois00260.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetGUIThreadInfo .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetGUIThreadInfo@8__imp__GetGUIThreadInfo@8__head_libuser32_a daois00259.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetForegroundWindow .text.data.bss.idata$7.idata$5.idata$4.idata$68K_GetForegroundWindow@0__imp__GetForegroundWindow@0__head_libuser32_a daois00258.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %GetFocus .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_GetFocus@0__imp__GetFocus@0__head_libuser32_a daois00257.o/ 1301111119 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetDoubleClickTime .text.data.bss.idata$7.idata$5.idata$4.idata$66I_GetDoubleClickTime@0__imp__GetDoubleClickTime@0__head_libuser32_a daois00256.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetDlgItemTextW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetDlgItemTextW@16__imp__GetDlgItemTextW@16__head_libuser32_a daois00255.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetDlgItemTextA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetDlgItemTextA@16__imp__GetDlgItemTextA@16__head_libuser32_a daois00254.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetDlgItemInt .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetDlgItemInt@16__imp__GetDlgItemInt@16__head_libuser32_a daois00253.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetDlgItem .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_GetDlgItem@8__imp__GetDlgItem@8__head_libuser32_a daois00252.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetDlgCtrlID .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_GetDlgCtrlID@4__imp__GetDlgCtrlID@4__head_libuser32_a daois00251.o/ 1301111119 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetDialogBaseUnits .text.data.bss.idata$7.idata$5.idata$4.idata$66I_GetDialogBaseUnits@0__imp__GetDialogBaseUnits@0__head_libuser32_a daois00250.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetDesktopWindow .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetDesktopWindow@0__imp__GetDesktopWindow@0__head_libuser32_a daois00249.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %GetDCEx .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_GetDCEx@12__imp__GetDCEx@12__head_libuser32_a daois00248.o/ 1301111119 0 0 100666 586 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %GetDC .text.data.bss.idata$7.idata$5.idata$4.idata$6_GetDC@4&__imp__GetDC@4__head_libuser32_adaois00247.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetCursorPos .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_GetCursorPos@4__imp__GetCursorPos@4__head_libuser32_a daois00246.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetCursorInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetCursorInfo@4__imp__GetCursorInfo@4__head_libuser32_a daois00245.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %GetCursor .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_GetCursor@0__imp__GetCursor@0__head_libuser32_a daois00244.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetComboBoxInfo .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetComboBoxInfo@8__imp__GetComboBoxInfo@8__head_libuser32_a daois00243.o/ 1301111119 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GetClipboardViewer .text.data.bss.idata$7.idata$5.idata$4.idata$66I_GetClipboardViewer@0__imp__GetClipboardViewer@0__head_libuser32_a daois00242.o/ 1301111119 0 0 100666 661 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %GetClipboardSequenceNumber .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_GetClipboardSequenceNumber@0__imp__GetClipboardSequenceNumber@0__head_libuser32_a daois00241.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetClipboardOwner .text.data.bss.idata$7.idata$5.idata$4.idata$64G_GetClipboardOwner@0__imp__GetClipboardOwner@0__head_libuser32_a daois00240.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetClipboardFormatNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_GetClipboardFormatNameW@12__imp__GetClipboardFormatNameW@12__head_libuser32_a daois00239.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %GetClipboardFormatNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_GetClipboardFormatNameA@12__imp__GetClipboardFormatNameA@12__head_libuser32_a daois00238.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetClipboardData .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetClipboardData@4__imp__GetClipboardData@4__head_libuser32_a daois00237.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetClipCursor .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetClipCursor@4__imp__GetClipCursor@4__head_libuser32_a daois00236.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetClientRect .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetClientRect@8__imp__GetClientRect@8__head_libuser32_a daois00235.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetClassWord .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_GetClassWord@8__imp__GetClassWord@8__head_libuser32_a daois00234.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetClassNameW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetClassNameW@12__imp__GetClassNameW@12__head_libuser32_a daois00233.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetClassNameA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetClassNameA@12__imp__GetClassNameA@12__head_libuser32_a daois00232.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetClassLongW .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetClassLongW@8__imp__GetClassLongW@8__head_libuser32_a daois00231.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetClassLongA .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_GetClassLongA@8__imp__GetClassLongA@8__head_libuser32_a daois00230.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetClassInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetClassInfoW@12__imp__GetClassInfoW@12__head_libuser32_a daois00229.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetClassInfoExW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetClassInfoExW@12__imp__GetClassInfoExW@12__head_libuser32_a daois00228.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetClassInfoExA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetClassInfoExA@12__imp__GetClassInfoExA@12__head_libuser32_a daois00227.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetClassInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetClassInfoA@12__imp__GetClassInfoA@12__head_libuser32_a daois00226.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetCaretPos .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_GetCaretPos@4__imp__GetCaretPos@4__head_libuser32_a daois00225.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetCaretBlinkTime .text.data.bss.idata$7.idata$5.idata$4.idata$64G_GetCaretBlinkTime@0__imp__GetCaretBlinkTime@0__head_libuser32_a daois00224.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetCapture .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_GetCapture@0__imp__GetCapture@0__head_libuser32_a daois00223.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetAsyncKeyState .text.data.bss.idata$7.idata$5.idata$4.idata$62E_GetAsyncKeyState@4__imp__GetAsyncKeyState@4__head_libuser32_a daois00222.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetAncestor .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_GetAncestor@8__imp__GetAncestor@8__head_libuser32_a daois00221.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetAltTabInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetAltTabInfoW@20__imp__GetAltTabInfoW@20__head_libuser32_a daois00220.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetAltTabInfoA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetAltTabInfoA@20__imp__GetAltTabInfoA@20__head_libuser32_a daois00219.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %GetAltTabInfo .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_GetAltTabInfo@20__imp__GetAltTabInfo@20__head_libuser32_a daois00218.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %GetActiveWindow .text.data.bss.idata$7.idata$5.idata$4.idata$60C_GetActiveWindow@0__imp__GetActiveWindow@0__head_libuser32_a daois00217.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FreeDDElParam .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_FreeDDElParam@8__imp__FreeDDElParam@8__head_libuser32_a daois00216.o/ 1301111119 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %FrameRect .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_FrameRect@12__imp__FrameRect@12__head_libuser32_a daois00215.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FlashWindowEx .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_FlashWindowEx@4__imp__FlashWindowEx@4__head_libuser32_a daois00214.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FlashWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_FlashWindow@8__imp__FlashWindow@8__head_libuser32_a daois00213.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FindWindowW .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_FindWindowW@8__imp__FindWindowW@8__head_libuser32_a daois00212.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FindWindowExW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_FindWindowExW@16__imp__FindWindowExW@16__head_libuser32_a daois00211.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FindWindowExA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_FindWindowExA@16__imp__FindWindowExA@16__head_libuser32_a daois00210.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %FindWindowA .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_FindWindowA@8__imp__FindWindowA@8__head_libuser32_a daois00209.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %FillRect .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_FillRect@12__imp__FillRect@12__head_libuser32_a daois00208.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %ExitWindowsEx .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_ExitWindowsEx@8__imp__ExitWindowsEx@8__head_libuser32_a daois00207.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ExcludeUpdateRgn .text.data.bss.idata$7.idata$5.idata$4.idata$62E_ExcludeUpdateRgn@8__imp__ExcludeUpdateRgn@8__head_libuser32_a daois00206.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %EqualRect .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_EqualRect@8__imp__EqualRect@8__head_libuser32_a daois00205.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EnumWindows .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_EnumWindows@8__imp__EnumWindows@8__head_libuser32_a daois00204.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumWindowStationsW .text.data.bss.idata$7.idata$5.idata$4.idata$68K_EnumWindowStationsW@8__imp__EnumWindowStationsW@8__head_libuser32_a daois00203.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumWindowStationsA .text.data.bss.idata$7.idata$5.idata$4.idata$68K_EnumWindowStationsA@8__imp__EnumWindowStationsA@8__head_libuser32_a daois00202.o/ 1301111119 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumThreadWindows .text.data.bss.idata$7.idata$5.idata$4.idata$66I_EnumThreadWindows@12__imp__EnumThreadWindows@12__head_libuser32_a daois00201.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EnumPropsW .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_EnumPropsW@8__imp__EnumPropsW@8__head_libuser32_a daois00200.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EnumPropsExW .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_EnumPropsExW@12__imp__EnumPropsExW@12__head_libuser32_a daois00199.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EnumPropsExA .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_EnumPropsExA@12__imp__EnumPropsExA@12__head_libuser32_a daois00198.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EnumPropsA .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_EnumPropsA@8__imp__EnumPropsA@8__head_libuser32_a daois00197.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumDisplaySettingsW .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_EnumDisplaySettingsW@12__imp__EnumDisplaySettingsW@12__head_libuser32_a daois00196.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %EnumDisplaySettingsExW .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_EnumDisplaySettingsExW@16__imp__EnumDisplaySettingsExW@16__head_libuser32_a daois00195.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %EnumDisplaySettingsExA .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_EnumDisplaySettingsExA@16__imp__EnumDisplaySettingsExA@16__head_libuser32_a daois00194.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumDisplaySettingsA .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_EnumDisplaySettingsA@12__imp__EnumDisplaySettingsA@12__head_libuser32_a daois00193.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumDisplayMonitors .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_EnumDisplayMonitors@16__imp__EnumDisplayMonitors@16__head_libuser32_a daois00192.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumDisplayDevicesW .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_EnumDisplayDevicesW@16__imp__EnumDisplayDevicesW@16__head_libuser32_a daois00191.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumDisplayDevicesA .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_EnumDisplayDevicesA@16__imp__EnumDisplayDevicesA@16__head_libuser32_a daois00190.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EnumDesktopsW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_EnumDesktopsW@12__imp__EnumDesktopsW@12__head_libuser32_a daois00189.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EnumDesktopsA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_EnumDesktopsA@12__imp__EnumDesktopsA@12__head_libuser32_a daois00188.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumDesktopWindows .text.data.bss.idata$7.idata$5.idata$4.idata$68K_EnumDesktopWindows@12__imp__EnumDesktopWindows@12__head_libuser32_a daois00187.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %EnumClipboardFormats .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_EnumClipboardFormats@4__imp__EnumClipboardFormats@4__head_libuser32_a daois00186.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnumChildWindows .text.data.bss.idata$7.idata$5.idata$4.idata$64G_EnumChildWindows@12__imp__EnumChildWindows@12__head_libuser32_a daois00185.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %EndTask .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_EndTask@12__imp__EndTask@12__head_libuser32_a daois00184.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %EndPaint .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_EndPaint@8__imp__EndPaint@8__head_libuser32_a daois00183.o/ 1301111119 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %EndMenu .text.data.bss.idata$7.idata$5.idata$4.idata$6 3_EndMenu@0__imp__EndMenu@0__head_libuser32_a daois00182.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %EndDialog .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_EndDialog@8__imp__EndDialog@8__head_libuser32_a daois00181.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EndDeferWindowPos .text.data.bss.idata$7.idata$5.idata$4.idata$64G_EndDeferWindowPos@4__imp__EndDeferWindowPos@4__head_libuser32_a daois00180.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EnableWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_EnableWindow@8__imp__EnableWindow@8__head_libuser32_a daois00179.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnableScrollBar .text.data.bss.idata$7.idata$5.idata$4.idata$62E_EnableScrollBar@12__imp__EnableScrollBar@12__head_libuser32_a daois00178.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EnableMenuItem .text.data.bss.idata$7.idata$5.idata$4.idata$60C_EnableMenuItem@12__imp__EnableMenuItem@12__head_libuser32_a daois00177.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %EmptyClipboard .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_EmptyClipboard@0__imp__EmptyClipboard@0__head_libuser32_a daois00176.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %EditWndProc .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_EditWndProc@16__imp__EditWndProc@16__head_libuser32_a daois00175.o/ 1301111119 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %DrawTextW .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_DrawTextW@20__imp__DrawTextW@20__head_libuser32_a daois00174.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DrawTextExW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_DrawTextExW@24__imp__DrawTextExW@24__head_libuser32_a daois00173.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DrawTextExA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_DrawTextExA@24__imp__DrawTextExA@24__head_libuser32_a daois00172.o/ 1301111119 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %DrawTextA .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_DrawTextA@20__imp__DrawTextA@20__head_libuser32_a daois00171.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DrawStateW .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DrawStateW@40__imp__DrawStateW@40__head_libuser32_a daois00170.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DrawStateA .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DrawStateA@40__imp__DrawStateA@40__head_libuser32_a daois00169.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DrawMenuBar .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DrawMenuBar@4__imp__DrawMenuBar@4__head_libuser32_a daois00168.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DrawIconEx .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DrawIconEx@36__imp__DrawIconEx@36__head_libuser32_a daois00167.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %DrawIcon .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_DrawIcon@16__imp__DrawIcon@16__head_libuser32_a daois00166.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DrawFrameControl .text.data.bss.idata$7.idata$5.idata$4.idata$64G_DrawFrameControl@16__imp__DrawFrameControl@16__head_libuser32_a daois00165.o/ 1301111119 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %DrawFrame .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_DrawFrame@16__imp__DrawFrame@16__head_libuser32_a daois00164.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DrawFocusRect .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_DrawFocusRect@8__imp__DrawFocusRect@8__head_libuser32_a daois00163.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %DrawEdge .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_DrawEdge@16__imp__DrawEdge@16__head_libuser32_a daois00162.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DrawCaption .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_DrawCaption@16__imp__DrawCaption@16__head_libuser32_a daois00161.o/ 1301111119 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DrawAnimatedRects .text.data.bss.idata$7.idata$5.idata$4.idata$66I_DrawAnimatedRects@16__imp__DrawAnimatedRects@16__head_libuser32_a daois00160.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DragObject .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DragObject@20__imp__DragObject@20__head_libuser32_a daois00159.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DragDetect .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DragDetect@12__imp__DragDetect@12__head_libuser32_a daois00158.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DlgDirSelectExW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_DlgDirSelectExW@16__imp__DlgDirSelectExW@16__head_libuser32_a daois00157.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DlgDirSelectExA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_DlgDirSelectExA@16__imp__DlgDirSelectExA@16__head_libuser32_a daois00156.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DlgDirSelectComboBoxExW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_DlgDirSelectComboBoxExW@16__imp__DlgDirSelectComboBoxExW@16__head_libuser32_a daois00155.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DlgDirSelectComboBoxExA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_DlgDirSelectComboBoxExA@16__imp__DlgDirSelectComboBoxExA@16__head_libuser32_a daois00154.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DlgDirListW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_DlgDirListW@20__imp__DlgDirListW@20__head_libuser32_a daois00153.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DlgDirListComboBoxW .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_DlgDirListComboBoxW@20__imp__DlgDirListComboBoxW@20__head_libuser32_a daois00152.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %DlgDirListComboBoxA .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_DlgDirListComboBoxA@20__imp__DlgDirListComboBoxA@20__head_libuser32_a daois00151.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DlgDirListA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_DlgDirListA@20__imp__DlgDirListA@20__head_libuser32_a daois00150.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DispatchMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_DispatchMessageW@4__imp__DispatchMessageW@4__head_libuser32_a daois00149.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DispatchMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_DispatchMessageA@4__imp__DispatchMessageA@4__head_libuser32_a daois00148.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DialogBoxParamW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_DialogBoxParamW@20__imp__DialogBoxParamW@20__head_libuser32_a daois00147.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DialogBoxParamA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_DialogBoxParamA@20__imp__DialogBoxParamA@20__head_libuser32_a daois00146.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DialogBoxIndirectParamW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_DialogBoxIndirectParamW@20__imp__DialogBoxIndirectParamW@20__head_libuser32_a daois00145.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DialogBoxIndirectParamA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_DialogBoxIndirectParamA@20__imp__DialogBoxIndirectParamA@20__head_libuser32_a daois00144.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DestroyWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_DestroyWindow@4__imp__DestroyWindow@4__head_libuser32_a daois00143.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DestroyMenu .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DestroyMenu@4__imp__DestroyMenu@4__head_libuser32_a daois00142.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DestroyIcon .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DestroyIcon@4__imp__DestroyIcon@4__head_libuser32_a daois00141.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DestroyCursor .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_DestroyCursor@4__imp__DestroyCursor@4__head_libuser32_a daois00140.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DestroyCaret .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_DestroyCaret@0__imp__DestroyCaret@0__head_libuser32_a daois00139.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DestroyAcceleratorTable .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_DestroyAcceleratorTable@4__imp__DestroyAcceleratorTable@4__head_libuser32_a daois00138.o/ 1301111119 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %DeregisterShellHookWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6!DW_DeregisterShellHookWindow@4__imp__DeregisterShellHookWindow@4__head_libuser32_a daois00137.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DeleteMenu .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DeleteMenu@12__imp__DeleteMenu@12__head_libuser32_a daois00136.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DeferWindowPos .text.data.bss.idata$7.idata$5.idata$4.idata$60C_DeferWindowPos@32__imp__DeferWindowPos@32__head_libuser32_a daois00135.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DefWindowProcW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_DefWindowProcW@16__imp__DefWindowProcW@16__head_libuser32_a daois00134.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DefWindowProcA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_DefWindowProcA@16__imp__DefWindowProcA@16__head_libuser32_a daois00133.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DefRawInputProc .text.data.bss.idata$7.idata$5.idata$4.idata$62E_DefRawInputProc@12__imp__DefRawInputProc@12__head_libuser32_a daois00132.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DefMDIChildProcW .text.data.bss.idata$7.idata$5.idata$4.idata$64G_DefMDIChildProcW@16__imp__DefMDIChildProcW@16__head_libuser32_a daois00131.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %DefMDIChildProcA .text.data.bss.idata$7.idata$5.idata$4.idata$64G_DefMDIChildProcA@16__imp__DefMDIChildProcA@16__head_libuser32_a daois00130.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DefFrameProcW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_DefFrameProcW@20__imp__DefFrameProcW@20__head_libuser32_a daois00129.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DefFrameProcA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_DefFrameProcA@20__imp__DefFrameProcA@20__head_libuser32_a daois00128.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DefDlgProcW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_DefDlgProcW@16__imp__DefDlgProcW@16__head_libuser32_a daois00127.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %DefDlgProcA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_DefDlgProcA@16__imp__DefDlgProcA@16__head_libuser32_a daois00126.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %~DdeUninitialize .text.data.bss.idata$7.idata$5.idata$4.idata$60C_DdeUninitialize@4__imp__DdeUninitialize@4__head_libuser32_a daois00125.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %}DdeUnaccessData .text.data.bss.idata$7.idata$5.idata$4.idata$60C_DdeUnaccessData@4__imp__DdeUnaccessData@4__head_libuser32_a daois00124.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %|DdeSetUserHandle .text.data.bss.idata$7.idata$5.idata$4.idata$64G_DdeSetUserHandle@12__imp__DdeSetUserHandle@12__head_libuser32_a daois00123.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %{DdeSetQualityOfService .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_DdeSetQualityOfService@12__imp__DdeSetQualityOfService@12__head_libuser32_a daois00122.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %zDdeReconnect .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_DdeReconnect@4__imp__DdeReconnect@4__head_libuser32_a daois00121.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %yDdeQueryStringW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_DdeQueryStringW@20__imp__DdeQueryStringW@20__head_libuser32_a daois00120.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %xDdeQueryStringA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_DdeQueryStringA@20__imp__DdeQueryStringA@20__head_libuser32_a daois00119.o/ 1301111119 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %wDdeQueryNextServer .text.data.bss.idata$7.idata$5.idata$4.idata$66I_DdeQueryNextServer@8__imp__DdeQueryNextServer@8__head_libuser32_a daois00118.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %vDdeQueryConvInfo .text.data.bss.idata$7.idata$5.idata$4.idata$64G_DdeQueryConvInfo@12__imp__DdeQueryConvInfo@12__head_libuser32_a daois00117.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %uDdePostAdvise .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_DdePostAdvise@12__imp__DdePostAdvise@12__head_libuser32_a daois00116.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %tDdeNameService .text.data.bss.idata$7.idata$5.idata$4.idata$60C_DdeNameService@16__imp__DdeNameService@16__head_libuser32_a daois00115.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %sDdeKeepStringHandle .text.data.bss.idata$7.idata$5.idata$4.idata$68K_DdeKeepStringHandle@8__imp__DdeKeepStringHandle@8__head_libuser32_a daois00114.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %rDdeInitializeW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_DdeInitializeW@16__imp__DdeInitializeW@16__head_libuser32_a daois00113.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %qDdeInitializeA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_DdeInitializeA@16__imp__DdeInitializeA@16__head_libuser32_a daois00112.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %pDdeImpersonateClient .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_DdeImpersonateClient@4__imp__DdeImpersonateClient@4__head_libuser32_a daois00111.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %oDdeGetQualityOfService .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_DdeGetQualityOfService@12__imp__DdeGetQualityOfService@12__head_libuser32_a daois00110.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %nDdeGetLastError .text.data.bss.idata$7.idata$5.idata$4.idata$60C_DdeGetLastError@4__imp__DdeGetLastError@4__head_libuser32_a daois00109.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %mDdeGetData .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DdeGetData@16__imp__DdeGetData@16__head_libuser32_a daois00108.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %lDdeFreeStringHandle .text.data.bss.idata$7.idata$5.idata$4.idata$68K_DdeFreeStringHandle@8__imp__DdeFreeStringHandle@8__head_libuser32_a daois00107.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %kDdeFreeDataHandle .text.data.bss.idata$7.idata$5.idata$4.idata$64G_DdeFreeDataHandle@4__imp__DdeFreeDataHandle@4__head_libuser32_a daois00106.o/ 1301111119 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %jDdeEnableCallback .text.data.bss.idata$7.idata$5.idata$4.idata$66I_DdeEnableCallback@12__imp__DdeEnableCallback@12__head_libuser32_a daois00105.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %iDdeDisconnectList .text.data.bss.idata$7.idata$5.idata$4.idata$64G_DdeDisconnectList@4__imp__DdeDisconnectList@4__head_libuser32_a daois00104.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %hDdeDisconnect .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_DdeDisconnect@4__imp__DdeDisconnect@4__head_libuser32_a daois00103.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %gDdeCreateStringHandleW .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_DdeCreateStringHandleW@12__imp__DdeCreateStringHandleW@12__head_libuser32_a daois00102.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %fDdeCreateStringHandleA .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_DdeCreateStringHandleA@12__imp__DdeCreateStringHandleA@12__head_libuser32_a daois00101.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %eDdeCreateDataHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_DdeCreateDataHandle@28__imp__DdeCreateDataHandle@28__head_libuser32_a daois00100.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %dDdeConnectList .text.data.bss.idata$7.idata$5.idata$4.idata$60C_DdeConnectList@20__imp__DdeConnectList@20__head_libuser32_a daois00099.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %cDdeConnect .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DdeConnect@16__imp__DdeConnect@16__head_libuser32_a daois00098.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %bDdeCmpStringHandles .text.data.bss.idata$7.idata$5.idata$4.idata$68K_DdeCmpStringHandles@8__imp__DdeCmpStringHandles@8__head_libuser32_a daois00097.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %aDdeClientTransaction .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_DdeClientTransaction@32__imp__DdeClientTransaction@32__head_libuser32_a daois00096.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %`DdeAddData .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_DdeAddData@16__imp__DdeAddData@16__head_libuser32_a daois00095.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_DdeAccessData .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_DdeAccessData@8__imp__DdeAccessData@8__head_libuser32_a daois00094.o/ 1301111119 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %^DdeAbandonTransaction .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_DdeAbandonTransaction@12__imp__DdeAbandonTransaction@12__head_libuser32_a daois00093.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %]CreateWindowStationW .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_CreateWindowStationW@16__imp__CreateWindowStationW@16__head_libuser32_a daois00092.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %\CreateWindowStationA .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_CreateWindowStationA@16__imp__CreateWindowStationA@16__head_libuser32_a daois00091.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %[CreateWindowExW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_CreateWindowExW@48__imp__CreateWindowExW@48__head_libuser32_a daois00090.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %ZCreateWindowExA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_CreateWindowExA@48__imp__CreateWindowExA@48__head_libuser32_a daois00089.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %YCreatePopupMenu .text.data.bss.idata$7.idata$5.idata$4.idata$60C_CreatePopupMenu@0__imp__CreatePopupMenu@0__head_libuser32_a daois00088.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %XCreateMenu .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_CreateMenu@0__imp__CreateMenu@0__head_libuser32_a daois00087.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %WCreateMDIWindowW .text.data.bss.idata$7.idata$5.idata$4.idata$64G_CreateMDIWindowW@40__imp__CreateMDIWindowW@40__head_libuser32_a daois00086.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %VCreateMDIWindowA .text.data.bss.idata$7.idata$5.idata$4.idata$64G_CreateMDIWindowA@40__imp__CreateMDIWindowA@40__head_libuser32_a daois00085.o/ 1301111119 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %UCreateIconIndirect .text.data.bss.idata$7.idata$5.idata$4.idata$66I_CreateIconIndirect@4__imp__CreateIconIndirect@4__head_libuser32_a daois00084.o/ 1301111119 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %TCreateIconFromResourceEx .text.data.bss.idata$7.idata$5.idata$4.idata$6!DW_CreateIconFromResourceEx@28__imp__CreateIconFromResourceEx@28__head_libuser32_a daois00083.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %SCreateIconFromResource .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_CreateIconFromResource@16__imp__CreateIconFromResource@16__head_libuser32_a daois00082.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %RCreateIcon .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_CreateIcon@28__imp__CreateIcon@28__head_libuser32_a daois00081.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %QCreateDialogParamW .text.data.bss.idata$7.idata$5.idata$4.idata$68K_CreateDialogParamW@20__imp__CreateDialogParamW@20__head_libuser32_a daois00080.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %PCreateDialogParamA .text.data.bss.idata$7.idata$5.idata$4.idata$68K_CreateDialogParamA@20__imp__CreateDialogParamA@20__head_libuser32_a daois00079.o/ 1301111119 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %OCreateDialogIndirectParamW .text.data.bss.idata$7.idata$5.idata$4.idata$6#H[_CreateDialogIndirectParamW@20__imp__CreateDialogIndirectParamW@20__head_libuser32_a daois00078.o/ 1301111119 0 0 100666 663 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6@ %NCreateDialogIndirectParamA .text.data.bss.idata$7.idata$5.idata$4.idata$6#H[_CreateDialogIndirectParamA@20__imp__CreateDialogIndirectParamA@20__head_libuser32_a daois00077.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %MCreateDesktopW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_CreateDesktopW@24__imp__CreateDesktopW@24__head_libuser32_a daois00076.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %LCreateDesktopA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_CreateDesktopA@24__imp__CreateDesktopA@24__head_libuser32_a daois00075.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %KCreateCursor .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_CreateCursor@28__imp__CreateCursor@28__head_libuser32_a daois00074.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %JCreateCaret .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_CreateCaret@16__imp__CreateCaret@16__head_libuser32_a daois00073.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ICreateAcceleratorTableW .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_CreateAcceleratorTableW@8__imp__CreateAcceleratorTableW@8__head_libuser32_a daois00072.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %HCreateAcceleratorTableA .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_CreateAcceleratorTableA@8__imp__CreateAcceleratorTableA@8__head_libuser32_a daois00071.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %GCountClipboardFormats .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_CountClipboardFormats@0__imp__CountClipboardFormats@0__head_libuser32_a daois00070.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %FCopyRect .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_CopyRect@8__imp__CopyRect@8__head_libuser32_a daois00069.o/ 1301111119 0 0 100666 609 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %ECopyImage .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_CopyImage@20__imp__CopyImage@20__head_libuser32_a daois00068.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %DCopyIcon .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_CopyIcon@4__imp__CopyIcon@4__head_libuser32_a daois00067.o/ 1301111119 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CCopyAcceleratorTableW .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_CopyAcceleratorTableW@12__imp__CopyAcceleratorTableW@12__head_libuser32_a daois00066.o/ 1301111119 0 0 100666 645 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %BCopyAcceleratorTableA .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_CopyAcceleratorTableA@12__imp__CopyAcceleratorTableA@12__head_libuser32_a daois00065.o/ 1301111119 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ACloseWindowStation .text.data.bss.idata$7.idata$5.idata$4.idata$66I_CloseWindowStation@4__imp__CloseWindowStation@4__head_libuser32_a daois00064.o/ 1301111119 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %@CloseWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6(;_CloseWindow@4__imp__CloseWindow@4__head_libuser32_a daois00063.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %?CloseTouchInputHandle .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_CloseTouchInputHandle@4__imp__CloseTouchInputHandle@4__head_libuser32_a daois00062.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %>CloseDesktop .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_CloseDesktop@4__imp__CloseDesktop@4__head_libuser32_a daois00061.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %=CloseClipboard .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_CloseClipboard@0__imp__CloseClipboard@0__head_libuser32_a daois00060.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %<ClipCursor .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_ClipCursor@4__imp__ClipCursor@4__head_libuser32_a daois00059.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %;ClientToScreen .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_ClientToScreen@8__imp__ClientToScreen@8__head_libuser32_a daois00058.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %:ChildWindowFromPointEx .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_ChildWindowFromPointEx@16__imp__ChildWindowFromPointEx@16__head_libuser32_a daois00057.o/ 1301111119 0 0 100666 643 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %9ChildWindowFromPoint .text.data.bss.idata$7.idata$5.idata$4.idata$6<O_ChildWindowFromPoint@12__imp__ChildWindowFromPoint@12__head_libuser32_a daois00056.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %8CheckRadioButton .text.data.bss.idata$7.idata$5.idata$4.idata$64G_CheckRadioButton@16__imp__CheckRadioButton@16__head_libuser32_a daois00055.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %7CheckMenuRadioItem .text.data.bss.idata$7.idata$5.idata$4.idata$68K_CheckMenuRadioItem@20__imp__CheckMenuRadioItem@20__head_libuser32_a daois00054.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %6CheckMenuItem .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_CheckMenuItem@12__imp__CheckMenuItem@12__head_libuser32_a daois00053.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %5CheckDlgButton .text.data.bss.idata$7.idata$5.idata$4.idata$60C_CheckDlgButton@12__imp__CheckDlgButton@12__head_libuser32_a daois00052.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %4CharUpperW .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_CharUpperW@4__imp__CharUpperW@4__head_libuser32_a daois00051.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %3CharUpperBuffW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_CharUpperBuffW@8__imp__CharUpperBuffW@8__head_libuser32_a daois00050.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %2CharUpperBuffA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_CharUpperBuffA@8__imp__CharUpperBuffA@8__head_libuser32_a daois00049.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %1CharUpperA .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_CharUpperA@4__imp__CharUpperA@4__head_libuser32_a daois00048.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %0CharToOemW .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_CharToOemW@8__imp__CharToOemW@8__head_libuser32_a daois00047.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %/CharToOemBuffW .text.data.bss.idata$7.idata$5.idata$4.idata$60C_CharToOemBuffW@12__imp__CharToOemBuffW@12__head_libuser32_a daois00046.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %.CharToOemBuffA .text.data.bss.idata$7.idata$5.idata$4.idata$60C_CharToOemBuffA@12__imp__CharToOemBuffA@12__head_libuser32_a daois00045.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %-CharToOemA .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_CharToOemA@8__imp__CharToOemA@8__head_libuser32_a daois00044.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %,CharPrevW .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_CharPrevW@8__imp__CharPrevW@8__head_libuser32_a daois00043.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %+CharPrevExA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_CharPrevExA@16__imp__CharPrevExA@16__head_libuser32_a daois00042.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %*CharPrevA .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_CharPrevA@8__imp__CharPrevA@8__head_libuser32_a daois00041.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %)CharNextW .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_CharNextW@4__imp__CharNextW@4__head_libuser32_a daois00040.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %(CharNextExA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_CharNextExA@12__imp__CharNextExA@12__head_libuser32_a daois00039.o/ 1301111119 0 0 100666 607 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %'CharNextA .text.data.bss.idata$7.idata$5.idata$4.idata$6$7_CharNextA@4__imp__CharNextA@4__head_libuser32_a daois00038.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %&CharLowerW .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_CharLowerW@4__imp__CharLowerW@4__head_libuser32_a daois00037.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %%CharLowerBuffW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_CharLowerBuffW@8__imp__CharLowerBuffW@8__head_libuser32_a daois00036.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %$CharLowerBuffA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_CharLowerBuffA@8__imp__CharLowerBuffA@8__head_libuser32_a daois00035.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %#CharLowerA .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_CharLowerA@4__imp__CharLowerA@4__head_libuser32_a daois00034.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %"ChangeMenuW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_ChangeMenuW@20__imp__ChangeMenuW@20__head_libuser32_a daois00033.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %!ChangeMenuA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_ChangeMenuA@20__imp__ChangeMenuA@20__head_libuser32_a daois00032.o/ 1301111119 0 0 100666 649 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ % ChangeDisplaySettingsW .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_ChangeDisplaySettingsW@8__imp__ChangeDisplaySettingsW@8__head_libuser32_a daois00031.o/ 1301111119 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ChangeDisplaySettingsExW .text.data.bss.idata$7.idata$5.idata$4.idata$6!DW_ChangeDisplaySettingsExW@20__imp__ChangeDisplaySettingsExW@20__head_libuser32_a daois00030.o/ 1301111119 0 0 100666 655 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ChangeDisplaySettingsExA .text.data.bss.idata$7.idata$5.idata$4.idata$6!DW_ChangeDisplaySettingsExA@20__imp__ChangeDisplaySettingsExA@20__head_libuser32_a daois00029.o/ 1301111119 0 0 100666 649 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ChangeDisplaySettingsA .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_ChangeDisplaySettingsA@8__imp__ChangeDisplaySettingsA@8__head_libuser32_a daois00028.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ChangeClipboardChain .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_ChangeClipboardChain@8__imp__ChangeClipboardChain@8__head_libuser32_a daois00027.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CascadeWindows .text.data.bss.idata$7.idata$5.idata$4.idata$60C_CascadeWindows@20__imp__CascadeWindows@20__head_libuser32_a daois00026.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %CascadeChildWindows .text.data.bss.idata$7.idata$5.idata$4.idata$68K_CascadeChildWindows@8__imp__CascadeChildWindows@8__head_libuser32_a daois00025.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CallWindowProcW .text.data.bss.idata$7.idata$5.idata$4.idata$62E_CallWindowProcW@20__imp__CallWindowProcW@20__head_libuser32_a daois00024.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CallWindowProcA .text.data.bss.idata$7.idata$5.idata$4.idata$62E_CallWindowProcA@20__imp__CallWindowProcA@20__head_libuser32_a daois00023.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CallNextHookEx .text.data.bss.idata$7.idata$5.idata$4.idata$60C_CallNextHookEx@16__imp__CallNextHookEx@16__head_libuser32_a daois00022.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CallMsgFilterW .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_CallMsgFilterW@8__imp__CallMsgFilterW@8__head_libuser32_a daois00021.o/ 1301111119 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CallMsgFilterA .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_CallMsgFilterA@8__imp__CallMsgFilterA@8__head_libuser32_a daois00020.o/ 1301111119 0 0 100666 619 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %CallMsgFilter .text.data.bss.idata$7.idata$5.idata$4.idata$6,?_CallMsgFilter@8__imp__CallMsgFilter@8__head_libuser32_a daois00019.o/ 1301111119 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %CalcChildScroll .text.data.bss.idata$7.idata$5.idata$4.idata$60C_CalcChildScroll@8__imp__CalcChildScroll@8__head_libuser32_a daois00018.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BroadcastSystemMessageW .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_BroadcastSystemMessageW@20__imp__BroadcastSystemMessageW@20__head_libuser32_a daois00017.o/ 1301111119 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BroadcastSystemMessageExW .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_BroadcastSystemMessageExW@24__imp__BroadcastSystemMessageExW@24__head_libuser32_a daois00016.o/ 1301111119 0 0 100666 657 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BroadcastSystemMessageExA .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY_BroadcastSystemMessageExA@24__imp__BroadcastSystemMessageExA@24__head_libuser32_a daois00015.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BroadcastSystemMessageA .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_BroadcastSystemMessageA@20__imp__BroadcastSystemMessageA@20__head_libuser32_a daois00014.o/ 1301111119 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %BroadcastSystemMessage .text.data.bss.idata$7.idata$5.idata$4.idata$6@S_BroadcastSystemMessage@20__imp__BroadcastSystemMessage@20__head_libuser32_a daois00013.o/ 1301111119 0 0 100666 629 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % BringWindowToTop .text.data.bss.idata$7.idata$5.idata$4.idata$62E_BringWindowToTop@4__imp__BringWindowToTop@4__head_libuser32_a daois00012.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % BlockInput .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_BlockInput@4__imp__BlockInput@4__head_libuser32_a daois00011.o/ 1301111119 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % BeginPaint .text.data.bss.idata$7.idata$5.idata$4.idata$6&9_BeginPaint@8__imp__BeginPaint@8__head_libuser32_a daois00010.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ % BeginDeferWindowPos .text.data.bss.idata$7.idata$5.idata$4.idata$68K_BeginDeferWindowPos@4__imp__BeginDeferWindowPos@4__head_libuser32_a daois00009.o/ 1301111119 0 0 100666 633 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ % AttachThreadInput .text.data.bss.idata$7.idata$5.idata$4.idata$66I_AttachThreadInput@12__imp__AttachThreadInput@12__head_libuser32_a daois00008.o/ 1301111119 0 0 100666 641 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %ArrangeIconicWindows .text.data.bss.idata$7.idata$5.idata$4.idata$6:M_ArrangeIconicWindows@4__imp__ArrangeIconicWindows@4__head_libuser32_a daois00007.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %AppendMenuW .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_AppendMenuW@16__imp__AppendMenuW@16__head_libuser32_a daois00006.o/ 1301111119 0 0 100666 617 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %AppendMenuA .text.data.bss.idata$7.idata$5.idata$4.idata$6*=_AppendMenuA@16__imp__AppendMenuA@16__head_libuser32_a daois00005.o/ 1301111119 0 0 100666 605 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %AnyPopup .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_AnyPopup@0__imp__AnyPopup@0__head_libuser32_a daois00004.o/ 1301111119 0 0 100666 621 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %AnimateWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6.A_AnimateWindow@12__imp__AnimateWindow@12__head_libuser32_a daois00003.o/ 1301111119 0 0 100666 653 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %AllowSetForegroundWindow .text.data.bss.idata$7.idata$5.idata$4.idata$6 BU_AllowSetForegroundWindow@4__imp__AllowSetForegroundWindow@4__head_libuser32_a daois00002.o/ 1301111119 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %AdjustWindowRectEx .text.data.bss.idata$7.idata$5.idata$4.idata$68K_AdjustWindowRectEx@16__imp__AdjustWindowRectEx@16__head_libuser32_a daois00001.o/ 1301111119 0 0 100666 631 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %AdjustWindowRect .text.data.bss.idata$7.idata$5.idata$4.idata$64G_AdjustWindowRect@12__imp__AdjustWindowRect@12__head_libuser32_a daois00000.o/ 1301111119 0 0 100666 649 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %ActivateKeyboardLayout .text.data.bss.idata$7.idata$5.idata$4.idata$6>Q_ActivateKeyboardLayout@8__imp__ActivateKeyboardLayout@8__head_libuser32_a CharacterManaJ/src/Launch4JStub/w32api/libmingw32.a0000644000175000017500000003727213615720000022057 0ustar paulliupaulliu! / 1341005860 0 0 0 766 ` % 8D""$$(2)),,,,,,,,,,,,,,666__CRT_glob__CRT_fmode__CRT_INIT_DllMain@12___do_global_dtors___do_global_ctors___main_main__CRT_MT__fpreset_fpreset__fmode__pei386_runtime_relocator___RUNTIME_PSEUDO_RELOC_LIST_____RUNTIME_PSEUDO_RELOC_LIST_END_____cpu_features_init___cpu_features__CRT_MT___mingwthr_remove_key_dtor___mingwthr_key_dtor___dyn_tls_init@12___tlregdtor_mingw_initltssuo_force_mingw_initltsdyn_force_mingw_initltsdrot_force___xl_d___xl_c___dyn_tls_init_callback__tls_used__tls_start__tls_end__tls_index___xl_a___xl_z____w64_mingwthr_add_key_dtor____w64_mingwthr_remove_key_dtor___mingw_TLScallback// 22 ` pseudo-reloc-list.o/ CRTglob.o/ 1341005856 0 0 100666 321 ` L .text 0`.data@0.bss0.filegCRTglob.c.text.data.bss__CRT_glob CRTfmode.o/ 1341005856 0 0 100666 318 ` L .text 0`.data@0.bss0.filegCRTfmode.c.text.data.bss__CRT_fmodeCRTinit.o/ 1341005856 0 0 100666 501 ` L .text P`.data@0.bss0/4,@0@ÐzR|  .filegCRTinit.c .text.data.bss,#.eh_frame__CRT_INIT.eh_frame dllmain.o/ 1341005857 0 0 100666 502 ` L .text P`.data@0.bss0/4,@0@ zR|  .filegdllmain.c .text.data.bss,$.eh_frame_DllMain@12.eh_framegccmain.o/ 1341005857 0 0 100666 1035 ` LL.text P`.dataT$@0.bss0/4hX.@0@t fСP@u Ít&St$tvu$[1ÍCuƍ& tÍt&딐zR| ,N\ 44IAC m AA X   6FUZo   8\.fileggccmain.c _p.1761!0 ___main 4.text .data.bssAhKZ_atexit i.eh_frame___do_global_dtors___do_global_ctors_initialized.eh_frame___CTOR_LIST_____DTOR_LIST__ main.o/ 1341005857 0 0 100666 1056 ` LP.text 0`.data@0.bss0/4 P`/18XF@0@L$qUVSQlÍE$uB< t< t<"u}< &tt< u< us< t< tE tu$t$ \$D$$eY[^]aÍ&<"t u<"< tzR| <D GuEutu|ux AAAC H  & .filegmain.c_main .text.data.bss*X___main 4 G Z n z.text.startup.eh_frame.text.startup.eh_frame_GetCommandLineA@0_GetStartupInfoA@4_GetModuleHandleA@4_WinMain@16crtst.o/ 1341005701 0 0 100666 306 ` L .text 0`.data@0.bss0.filegcrtst.c.text.data.bss__CRT_MTCRT_fp10.o/ 1341005701 0 0 100666 518 ` L .text P`.data@0.bss0/4,@0@ÐzR|  .filegCRT_fp10.c _fpreset .text.data.bss,".eh_frame__fpreset.eh_frametxtmode.o/ 1341005702 0 0 100666 310 ` L .text 0`.data@0.bss0@.filegtxtmode.c.text.data.bss__fmodepseudo-reloc.o/ 1341005858 0 0 100666 2507 ` L.textPt# P`.data@0.bss0.rdata,@0@/4@0@S(D$4D$D$@\$ $D$D$$D$D$0D$&'\\$LÍD$$D$D$$t$P։|$Tωl$X D$8u+|$t$$\$Lt$P|$Tl$X\Í&@tЋD$0l$ l$ D$@D$D$$$D$8|$t$$@D$D$|$t|$tD$ l$ D$D$0D$D$$$_\$D$$ftÍ-~, \$ t$$|$(5u{  CG Ss  T$$D$s.ST$T$rҋ\$ t$$|$(,ÐuC;fy)ʹT$T$fy)ʹT$T$R)Ϲ8T$|$1D$$LMingw runtime failure: VirtualQuery failed for %d bytes at address %p Unknown pseudo relocation protocol version %d. Unknown pseudo relocation bit size %d. zR| RAC0<8dC`DYFFETC`t H iPC`RPC`$xtl0O B ( 1INJe q   3 EK[ay;  <|.filegpseudo-reloc.c ` 5p P.textD#.data.bss.rdata`jv_fwrite  _abort _memcpy   .eh_frame___report_error___write_memory.part.0__pei386_runtime_relocator_was_init.31048.eh_frame__imp___iob___RUNTIME_PSEUDO_RELOC_LIST_END_____RUNTIME_PSEUDO_RELOC_LIST____image_base___vfprintf_VirtualQuery@12_VirtualProtect@16 /0 1341005858 0 0 100666 410 ` L .text 0`.data@0.bss0.fileg.text.data.bss7Zpseudo-reloc-list.c___RUNTIME_PSEUDO_RELOC_LIST_____RUNTIME_PSEUDO_RELOC_LIST_END__cpu_features.o/ 1341005859 0 0 100666 865 ` L: .text P`.data@0.bss0/480@0@X5 PX1Щ S1t ƀt t t t t t @ u.=vx"@t [Á Ɛ ҐzR| ]B7CRap .filegcpu_features.c .text .data.bss#8-=.eh_frame___cpu_features_init.eh_frame___cpu_features tlsmcrt.o/ 1341005859 0 0 100666 310 ` L .text 0`.data@0.bss0.filegtlsmcrt.c.text.data.bss__CRT_MTtlsmthread.o/ 1341005859 0 0 100666 738 ` LL.text0$ P`.data@0.bss0/4@8@0@t&'D$tv1ÐzR| 0  4.filegtlsmthread.c * .text#.data.bss?@I j .eh_frame___mingwthr_remove_key_dtor___mingwthr_key_dtor.eh_frame____w64_mingwthr_remove_key_dtor____w64_mingwthr_add_key_dtortlssup.o/ 1341005860 0 0 100666 2325 ` L2.textD P`.data@0.bss0.CRT$XLD4>@0.CRT$XLC8H@0.rdata<R@0@.tls@\@0.CRT$XLZX@0.CRT$XLA\@0.tls$ZZZ`@0.tls$AAAd@0.CRT$XDZh@0.CRT$XDAl@0/4p@0@D$$tt t&T$(D$D$ T$$ 'VS=D$$t ttB[^ ~1ۋtЃ9u[^ D$(D$D$D$ $렍v'1ÐPP zR| CC U H `8<TAA C d  FAC k  FAC x41W0d0  1   @|.filegtlssup.c !P ___xd_z ___xd_a 4 .text.data.bss.CRT$XLD.CRT$XLC.rdata.tls.CRT$XLZ.CRT$XLA .tls$ZZZ .tls$AAA .CRT$XDZ .CRT$XDA AKc{___xl_d___xl_c   ___xl_a ___xl_z__CRT_MT .eh_frame___dyn_tls_dtor@12___dyn_tls_init@12___tlregdtor.eh_frame_mingw_initltssuo_force_mingw_initltsdyn_force_mingw_initltsdrot_force___dyn_tls_init_callback__tls_used__tls_start__tls_end__tls_index___mingw_TLScallback tlsthrd.o/ 1341005860 0 0 100666 2154 ` LR.text # P`.data@0.bss 0/4*@0@VS$t-f$u tC4$Ћ[u$[^Ãt$1\$u\$t$D$ $tGD$ $D$$CC$\$t$þ늍t&S\$ u1[$t9uK&9t‹Bu$1[ËHJ$$ڋBۃD$$tDrt]Ít&uhu$ft'Ít&t$두zR| 8`AA C LI PC jC C AA4XdC IFQ A sQ LE K A <AC P CA LI nC C CA ZC (C X E iC _ E \C  &0NSd BG_fkx \   .filegtlsthrd.c />M` k  .text#.data.bss     _calloc _free  ' D.eh_frame___mingwthr_run_key_dtors.part.0___mingwthr_cs_key_dtor_list____w64_mingwthr_add_key_dtor___mingwthr_cs_init____w64_mingwthr_remove_key_dtor___mingw_TLScallback.eh_frame_EnterCriticalSection@4_TlsGetValue@4_GetLastError@0_LeaveCriticalSection@4_DeleteCriticalSection@4_InitializeCriticalSection@4CharacterManaJ/src/Launch4JStub/w32api/libmsvcrt.a0000644000175000017500000205012213615720000022076 0ustar paulliupaulliu! / 1341005727 0 0 0 27082 ` jloFoFqqtZtZvvynyn{{~~,,@@TThh||&&::NN||44TTtt ȔȔͨͨ22ҶҶ::׼׼FFffzz,,@@TThh   2 2FFZZbb!p!p##&|&|))++.(.(003636558J8J::=X=X??B`B`DDGzGzIILLO O QQTTVVY&Y&[[^:^:``cNcNeehbhbjjmmpprruuwwz z ||VV^^xx<<hh**VV,,@@hh||ĐĐɲɲ<<VVddrr**88FFNNbbjjxx    &&::"H"H$$'N'N)),T,T..1n1n336t6t88;;>>@@C&C&EEH.H.JMMOOR R TTW.W.YY\4\4^^a:a:ccf>f>hhk`k`mmpzpzssuux x zz}:}:hh..XX&&ZZ  JJtt**JHHhhʐ^\\يي((޾޾VV&&nnHHvv  ..ZZ  L Lnn  BB!!$b$b'')),0,0..1R1R33669 9 ;==@@CCEEH<H<JJMzMzPPRRUNUNWWZbZb]]__b"b"ddgBgBiilVlVnnqqt vrvryy{~~&&@&&\\||::jj""DDpp((ŬŬJJxxҘҘ00\\pp<<^^**bbFF X X  ,,XX66  #>#>%%(R(R**-z//2l2l447z7z::<<?&?&AAD4FIIKKNNPPS"UWWZZ]&__b*b*ddgLgLiil`l`nnqqttvvy8y8{{~X~Xll""NNJJxxFF||JJllƮƮ88XXxx،،ݮNN**VV  NNjj    00XXrr  #B#B%%(b(b**-n-n//2r2r447z7z::<<?B?BAADDG$G$IILdLdOOQQT:T:VVYfYf\\^^aBaBccffi"i"kknbnbqqssvBvBxx{{~$~$dd$22FFvv  88ff22@@jjȢȢ@@ЄЄ&&ռռFFZZhh**JJxx** * *  `^^rr L L""%%(0(0**-X-X0025 5 77:2:2<<?T?TAADvDvGGIILLNNQ.Q.SSVNVNXX[b[b]]``cHcHeehVjjm`m`oorruuwy|Z|Z~~xx""66dd<<PP||<<JJ˖˖аа::NNݚݚ^^  pNN**tt  vv d d  ^vv!z$$&&)\)\++..1*1*33688;;>N>N@C`C`FFHHKFKFMMPPS2S2UUXrXr[[]]`X`Xbbeeh8h8jjmxmxpprru\u\wwzz}D}D22$$`rV^^*66ll  ll$$ÔÔLȺ ͆͆nn((؎؎JJBB``::  66^^  22ff00 D D""%X%X''*x*x--//2244767699>AxAxDDFFIjIjLLN__libmsvcrt_a_iname__head_libmsvcrt_a_wscanf__imp__wscanf_wprintf__imp__wprintf_wctomb__imp__wctomb_wcsxfrm__imp__wcsxfrm_wcstoul__imp__wcstoul_wcstombs__imp__wcstombs_wcstol__imp__wcstol_wcstok__imp__wcstok_wcstod__imp__wcstod_wcsstr__imp__wcsstr_wcsspn__imp__wcsspn_wcsrchr__imp__wcsrchr_wcspbrk__imp__wcspbrk_wcsncpy__imp__wcsncpy_wcsncmp__imp__wcsncmp_wcsncat__imp__wcsncat_wcslen__imp__wcslen_wcsftime__imp__wcsftime_wcscspn__imp__wcscspn_wcscpy__imp__wcscpy_wcscoll__imp__wcscoll_wcscmp__imp__wcscmp_wcschr__imp__wcschr_wcscat__imp__wcscat_vwprintf__imp__vwprintf_vswprintf__imp__vswprintf_vsprintf__imp__vsprintf_vprintf__imp__vprintf_vfwprintf__imp__vfwprintf_vfprintf__imp__vfprintf_ungetwc__imp__ungetwc_ungetc__imp__ungetc_towupper__imp__towupper_towlower__imp__towlower_toupper__imp__toupper_tolower__imp__tolower_tmpnam__imp__tmpnam_tmpfile__imp__tmpfile_time__imp__time_tanh__imp__tanh_tan__imp__tan_system__imp__system_swscanf__imp__swscanf_swprintf__imp__swprintf_strxfrm__imp__strxfrm_strtoul__imp__strtoul_strtol__imp__strtol_strtok__imp__strtok_strtod__imp__strtod_strstr__imp__strstr_strspn__imp__strspn_strrchr__imp__strrchr_strpbrk__imp__strpbrk_strncpy__imp__strncpy_strncmp__imp__strncmp_strncat__imp__strncat_strlen__imp__strlen_strftime__imp__strftime_strerror__imp__strerror_strcspn__imp__strcspn_strcpy__imp__strcpy_strcoll__imp__strcoll_strcmp__imp__strcmp_strchr__imp__strchr_strcat__imp__strcat_sscanf__imp__sscanf_srand__imp__srand_sqrt__imp__sqrt_sprintf__imp__sprintf_sinh__imp__sinh_sin__imp__sin_signal__imp__signal_setvbuf__imp__setvbuf_setlocale__imp__setlocale_setbuf__imp__setbuf_scanf__imp__scanf_rewind__imp__rewind_rename__imp__rename_remove__imp__remove_realloc__imp__realloc_rand__imp__rand_raise__imp__raise_qsort__imp__qsort_putwchar__imp__putwchar_putwc__imp__putwc_puts__imp__puts_putchar__imp__putchar_putc__imp__putc_printf__imp__printf_pow__imp__pow_perror__imp__perror_modf__imp__modf_mktime__imp__mktime_memset__imp__memset_memmove__imp__memmove_memcpy__imp__memcpy_memcmp__imp__memcmp_memchr__imp__memchr_mbtowc__imp__mbtowc_mbstowcs__imp__mbstowcs_mblen__imp__mblen_malloc__imp__malloc_longjmp__imp__longjmp_log10__imp__log10_log__imp__log_localtime__imp__localtime_localeconv__imp__localeconv_ldiv__imp__ldiv_ldexp__imp__ldexp_labs__imp__labs_isxdigit__imp__isxdigit_iswxdigit__imp__iswxdigit_iswupper__imp__iswupper_iswspace__imp__iswspace_iswpunct__imp__iswpunct_iswprint__imp__iswprint_iswlower__imp__iswlower_iswgraph__imp__iswgraph_iswdigit__imp__iswdigit_iswctype__imp__iswctype_iswcntrl__imp__iswcntrl_iswascii__imp__iswascii_iswalpha__imp__iswalpha_iswalnum__imp__iswalnum_isupper__imp__isupper_isspace__imp__isspace_ispunct__imp__ispunct_isprint__imp__isprint_islower__imp__islower_isleadbyte__imp__isleadbyte_isgraph__imp__isgraph_isdigit__imp__isdigit_iscntrl__imp__iscntrl_isalpha__imp__isalpha_isalnum__imp__isalnum_is_wctype__imp__is_wctype_gmtime__imp__gmtime_getwchar__imp__getwchar_getwc__imp__getwc_gets__imp__gets_getenv__imp__getenv_getchar__imp__getchar_getc__imp__getc_fwscanf__imp__fwscanf_fwrite__imp__fwrite_fwprintf__imp__fwprintf_ftell__imp__ftell_fsetpos__imp__fsetpos_fseek__imp__fseek_fscanf__imp__fscanf_frexp__imp__frexp_freopen__imp__freopen_free__imp__free_fread__imp__fread_fputws__imp__fputws_fputwc__imp__fputwc_fputs__imp__fputs_fputc__imp__fputc_fprintf__imp__fprintf_fopen__imp__fopen_fmod__imp__fmod_floor__imp__floor_fgetws__imp__fgetws_fgetwc__imp__fgetwc_fgets__imp__fgets_fgetpos__imp__fgetpos_fgetc__imp__fgetc_fflush__imp__fflush_ferror__imp__ferror_feof__imp__feof_fclose__imp__fclose_fabs__imp__fabs_exp__imp__exp_exit__imp__exit_div__imp__div_difftime__imp__difftime_ctime__imp__ctime_cosh__imp__cosh_cos__imp__cos_clock__imp__clock_clearerr__imp__clearerr_ceil__imp__ceil_calloc__imp__calloc_bsearch__imp__bsearch_atol__imp__atol_atoi__imp__atoi_atof__imp__atof__imp__atexit_atan2__imp__atan2_atan__imp__atan_asin__imp__asin_asctime__imp__asctime_acos__imp__acos_abs__imp__abs_abort__imp__abort__yn__imp___yn__y1__imp___y1__y0__imp___y0__wutime64__imp___wutime64__wutime__imp___wutime__wunlink__imp___wunlink__wtol__imp___wtol__wtoi64__imp___wtoi64__wtoi__imp___wtoi__wtof__imp___wtof__wtmpnam__imp___wtmpnam__wtempnam__imp___wtempnam__wsystem__imp___wsystem__wstrtime__imp___wstrtime__wstrdate__imp___wstrdate__wstati64__imp___wstati64__wstat64__imp___wstat64__wstat__imp___wstat__wsplitpath__imp___wsplitpath__wspawnvpe__imp___wspawnvpe__wspawnvp__imp___wspawnvp__wspawnve__imp___wspawnve__wspawnv__imp___wspawnv__wspawnlpe__imp___wspawnlpe__wspawnlp__imp___wspawnlp__wspawnle__imp___wspawnle__wspawnl__imp___wspawnl__wsopen__imp___wsopen__wsetlocale__imp___wsetlocale__wsearchenv__imp___wsearchenv__wrmdir__imp___wrmdir__write__imp___write__wrename__imp___wrename__wremove__imp___wremove__wputenv__imp___wputenv__wpopen__imp___wpopen__imp___wpgmptr__wperror__imp___wperror__wopen__imp___wopen__wmktemp__imp___wmktemp__wmkdir__imp___wmkdir__wmakepath__imp___wmakepath__imp___winver__imp___winminor__imp___winmajor__wgetenv__imp___wgetenv__wgetdcwd__imp___wgetdcwd__wgetcwd__imp___wgetcwd__wfullpath__imp___wfullpath__wfsopen__imp___wfsopen__wfreopen__imp___wfreopen__wfopen__imp___wfopen__wfindnexti64__imp___wfindnexti64__wfindnext64__imp___wfindnext64__wfindnext__imp___wfindnext__wfindfirsti64__imp___wfindfirsti64__wfindfirst64__imp___wfindfirst64__wfindfirst__imp___wfindfirst__wfdopen__imp___wfdopen__wexecvpe__imp___wexecvpe__wexecvp__imp___wexecvp__wexecve__imp___wexecve__wexecv__imp___wexecv__wexeclpe__imp___wexeclpe__wexeclp__imp___wexeclp__wexecle__imp___wexecle__wexecl__imp___wexecl__imp___wenviron__wctype__imp___wctype__wctime64__imp___wctime64__wctime__imp___wctime__wcsupr__imp___wcsupr__wcstoui64__imp___wcstoui64__wcstoi64__imp___wcstoi64__wcsset__imp___wcsset__wcsrev__imp___wcsrev__wcsnset__imp___wcsnset__wcsnicoll__imp___wcsnicoll__wcsnicmp__imp___wcsnicmp__wcsncoll__imp___wcsncoll__wcslwr__imp___wcslwr__wcsicoll__imp___wcsicoll__wcsicmp__imp___wcsicmp__wcserror__imp___wcserror__wcsdup__imp___wcsdup__wcreat__imp___wcreat__imp___wcmdln__wchmod__imp___wchmod__wchdir__imp___wchdir__wasctime__imp___wasctime__waccess__imp___waccess__vsnwprintf__imp___vsnwprintf__vsnprintf__imp___vsnprintf__vscwprintf__imp___vscwprintf__vscprintf__imp___vscprintf__utime64__imp___utime64__utime__imp___utime__unlock__imp___unlock__unloaddll__imp___unloaddll__unlink__imp___unlink__ungetwch__imp___ungetwch__ungetch__imp___ungetch__umask__imp___umask__ultow__imp___ultow__ultoa__imp___ultoa__ui64tow__imp___ui64tow__ui64toa__imp___ui64toa__tzset__imp___tzset__imp___tzname__toupper__imp___toupper__tolower__imp___tolower__imp___timezone__time64__imp___time64__tempnam__imp___tempnam__telli64__imp___telli64__tell__imp___tell__imp___sys_nerr__imp___sys_errlist__swab__imp___swab__strupr__imp___strupr__strtoui64__imp___strtoui64__strtoi64__imp___strtoi64__strtime__imp___strtime__strset__imp___strset__strrev__imp___strrev__strnset__imp___strnset__strnicoll__imp___strnicoll__strnicmp__imp___strnicmp__strncoll__imp___strncoll__strlwr__imp___strlwr__stricoll__imp___stricoll__stricmp__imp___stricmp__strerror__imp___strerror__strdup__imp___strdup__strdate__imp___strdate__strcmpi__imp___strcmpi__statusfp__imp___statusfp__stati64__imp___stati64__stat64__imp___stat64__stat__imp___stat__splitpath__imp___splitpath__spawnvpe__imp___spawnvpe__spawnvp__imp___spawnvp__spawnve__imp___spawnve__spawnv__imp___spawnv__spawnlpe__imp___spawnlpe__spawnlp__imp___spawnlp__spawnle__imp___spawnle__spawnl__imp___spawnl__sopen__imp___sopen__snwscanf__imp___snwscanf__snwprintf__imp___snwprintf__snscanf__imp___snscanf__snprintf__imp___snprintf__sleep__imp___sleep__setsystime__imp___setsystime__setmode__imp___setmode__setmbcp__imp___setmbcp__setmaxstdio__imp___setmaxstdio__setjmp3__imp___setjmp3__setjmp__imp___setjmp__seterrormode__imp___seterrormode__set_sbh_threshold__imp___set_sbh_threshold__set_error_mode__imp___set_error_mode__set_SSE2_enable__imp___set_SSE2_enable__seh_longjmp_unwind__imp___seh_longjmp_unwind__searchenv__imp___searchenv__scwprintf__imp___scwprintf__scprintf__imp___scprintf__scalb__imp___scalb__safe_fprem1__imp___safe_fprem1__safe_fprem__imp___safe_fprem__safe_fdivr__imp___safe_fdivr__safe_fdiv__imp___safe_fdiv__rotr__imp___rotr__rotl__imp___rotl__rmtmp__imp___rmtmp__rmdir__imp___rmdir__resetstkoflw__imp___resetstkoflw__read__imp___read__imp___pwctype__putws__imp___putws__putwch__imp___putwch__putw__imp___putw__putenv__imp___putenv__putch__imp___putch__purecall__imp___purecall__popen__imp___popen__pipe__imp___pipe__imp___pgmptr__imp___pctype__pclose__imp___pclose__outpw__imp___outpw__outpd__imp___outpd__outp__imp___outp__imp___osver__imp___osplatform__open_osfhandle__imp___open_osfhandle__open__imp___open__imp___onexit__nextafter__imp___nextafter__msize__imp___msize__mktime64__imp___mktime64__mktemp__imp___mktemp__mkdir__imp___mkdir__memicmp__imp___memicmp__memccpy__imp___memccpy__mbsupr__imp___mbsupr__mbstrlen__imp___mbstrlen__mbstok__imp___mbstok__mbsstr__imp___mbsstr__mbsspnp__imp___mbsspnp__mbsspn__imp___mbsspn__mbsset__imp___mbsset__mbsrev__imp___mbsrev__mbsrchr__imp___mbsrchr__mbspbrk__imp___mbspbrk__mbsnset__imp___mbsnset__mbsninc__imp___mbsninc__mbsnicoll__imp___mbsnicoll__mbsnicmp__imp___mbsnicmp__mbsnextc__imp___mbsnextc__mbsncpy__imp___mbsncpy__mbsncoll__imp___mbsncoll__mbsncmp__imp___mbsncmp__mbsnccnt__imp___mbsnccnt__mbsncat__imp___mbsncat__mbsnbset__imp___mbsnbset__mbsnbicoll__imp___mbsnbicoll__mbsnbicmp__imp___mbsnbicmp__mbsnbcpy__imp___mbsnbcpy__mbsnbcoll__imp___mbsnbcoll__mbsnbcnt__imp___mbsnbcnt__mbsnbcmp__imp___mbsnbcmp__mbsnbcat__imp___mbsnbcat__mbslwr__imp___mbslwr__mbslen__imp___mbslen__mbsinc__imp___mbsinc__mbsicoll__imp___mbsicoll__mbsicmp__imp___mbsicmp__mbsdup__imp___mbsdup__mbsdec__imp___mbsdec__mbscspn__imp___mbscspn__mbscpy__imp___mbscpy__mbscoll__imp___mbscoll__mbscmp__imp___mbscmp__mbschr__imp___mbschr__mbscat__imp___mbscat__mbsbtype__imp___mbsbtype__imp___mbctype__mbctoupper__imp___mbctoupper__mbctombb__imp___mbctombb__mbctolower__imp___mbctolower__mbctokata__imp___mbctokata__mbctohira__imp___mbctohira__mbclen__imp___mbclen__mbcjmstojis__imp___mbcjmstojis__mbcjistojms__imp___mbcjistojms__mbccpy__imp___mbccpy__mbcasemap__imp___mbcasemap__mbbtype__imp___mbbtype__mbbtombc__imp___mbbtombc__makepath__imp___makepath__ltow__imp___ltow__ltoa__imp___ltoa__lseeki64__imp___lseeki64__lseek__imp___lseek__lsearch__imp___lsearch__lrotr__imp___lrotr__lrotl__imp___lrotl__longjmpex__imp___longjmpex__logb__imp___logb__locking__imp___locking__lock__imp___lock__localtime64__imp___localtime64__local_unwind2__imp___local_unwind2__loaddll__imp___loaddll__lfind__imp___lfind__kbhit__imp___kbhit__jn__imp___jn__j1__imp___j1__j0__imp___j0__itow__imp___itow__itoa__imp___itoa__isnan__imp___isnan__ismbstrail__imp___ismbstrail__ismbslead__imp___ismbslead__ismbcupper__imp___ismbcupper__ismbcsymbol__imp___ismbcsymbol__ismbcspace__imp___ismbcspace__ismbcpunct__imp___ismbcpunct__ismbcprint__imp___ismbcprint__ismbclower__imp___ismbclower__ismbclegal__imp___ismbclegal__ismbcl2__imp___ismbcl2__ismbcl1__imp___ismbcl1__ismbcl0__imp___ismbcl0__ismbckata__imp___ismbckata__ismbchira__imp___ismbchira__ismbcgraph__imp___ismbcgraph__ismbcdigit__imp___ismbcdigit__ismbcalpha__imp___ismbcalpha__ismbcalnum__imp___ismbcalnum__ismbbtrail__imp___ismbbtrail__ismbbpunct__imp___ismbbpunct__ismbbprint__imp___ismbbprint__ismbblead__imp___ismbblead__ismbbkpunct__imp___ismbbkpunct__ismbbkprint__imp___ismbbkprint__ismbbkana__imp___ismbbkana__ismbbkalnum__imp___ismbbkalnum__ismbbgraph__imp___ismbbgraph__ismbbalpha__imp___ismbbalpha__ismbbalnum__imp___ismbbalnum__isctype__imp___isctype__isatty__imp___isatty__imp___iob__inpw__imp___inpw__inpd__imp___inpd__inp__imp___inp__initterm__imp___initterm__i64tow__imp___i64tow__i64toa__imp___i64toa__hypot__imp___hypot__heapwalk__imp___heapwalk__heapused__imp___heapused__heapset__imp___heapset__heapmin__imp___heapmin__heapchk__imp___heapchk__heapadd__imp___heapadd__gmtime64__imp___gmtime64__global_unwind2__imp___global_unwind2__getws__imp___getws__getwche__imp___getwche__getwch__imp___getwch__getw__imp___getw__getsystime__imp___getsystime__getpid__imp___getpid__getmbcp__imp___getmbcp__getmaxstdio__imp___getmaxstdio__getdrives__imp___getdrives__getdrive__imp___getdrive__getdllprocaddr__imp___getdllprocaddr__getdiskfree__imp___getdiskfree__getdcwd__imp___getdcwd__getcwd__imp___getcwd__getche__imp___getche__getch__imp___getch__get_sbh_threshold__imp___get_sbh_threshold__get_osfhandle__imp___get_osfhandle__get_heap_handle__imp___get_heap_handle__gcvt__imp___gcvt__futime64__imp___futime64__futime__imp___futime__fullpath__imp___fullpath__ftol__imp___ftol__ftime64__imp___ftime64__ftime__imp___ftime__fstati64__imp___fstati64__fstat64__imp___fstat64__fstat__imp___fstat__fsopen__imp___fsopen__fputwchar__imp___fputwchar__fputchar__imp___fputchar__imp___fpreset__fpieee_flt__imp___fpieee_flt__fpclass__imp___fpclass__imp___fmode__flushall__imp___flushall__flsbuf__imp___flsbuf__finite__imp___finite__findnexti64__imp___findnexti64__findnext64__imp___findnext64__findnext__imp___findnext__findfirsti64__imp___findfirsti64__findfirst64__imp___findfirst64__findfirst__imp___findfirst__findclose__imp___findclose__fileno__imp___fileno__filelengthi64__imp___filelengthi64__filelength__imp___filelength__imp___fileinfo__filbuf__imp___filbuf__fgetwchar__imp___fgetwchar__fgetchar__imp___fgetchar__fdopen__imp___fdopen__fcvt__imp___fcvt__fcloseall__imp___fcloseall__expand__imp___expand__exit__imp___exit__execvpe__imp___execvpe__execvp__imp___execvp__execve__imp___execve__execv__imp___execv__execlpe__imp___execlpe__execlp__imp___execlp__execle__imp___execle__execl__imp___execl__except_handler3__imp___except_handler3__except_handler2__imp___except_handler2__errno__imp___errno__eof__imp___eof__imp___environ__endthreadex__imp___endthreadex__endthread__imp___endthread__ecvt__imp___ecvt__dup2__imp___dup2__dup__imp___dup__imp___dstbias__imp___daylight__cwscanf__imp___cwscanf__cwprintf__imp___cwprintf__cwait__imp___cwait__imp___ctype__ctime64__imp___ctime64__cscanf__imp___cscanf__creat__imp___creat__cputws__imp___cputws__cputs__imp___cputs__cprintf__imp___cprintf__copysign__imp___copysign__controlfp__imp___controlfp__control87__imp___control87__imp___commode__commit__imp___commit__close__imp___close__clearfp__imp___clearfp__chsize__imp___chsize__chmod__imp___chmod__chkesp__imp___chkesp__chgsign__imp___chgsign__chdrive__imp___chdrive__chdir__imp___chdir__cgetws__imp___cgetws__cgets__imp___cgets__cexit__imp___cexit__callnewh__imp___callnewh__cabs__imp___cabs__c_exit__imp___c_exit__beginthreadex__imp___beginthreadex__beginthread__imp___beginthread__beep__imp___beep__atoldbl__imp___atoldbl__atoi64__imp___atoi64__atodbl__imp___atodbl__assert__imp___assert__amsg_exit__imp___amsg_exit__aligned_realloc__imp___aligned_realloc__aligned_offset_realloc__imp___aligned_offset_realloc__aligned_offset_malloc__imp___aligned_offset_malloc__aligned_malloc__imp___aligned_malloc__aligned_free__imp___aligned_free__imp___aexit_rtn__imp___adjust_fdiv__adj_fptan__imp___adj_fptan__adj_fprem1__imp___adj_fprem1__adj_fprem__imp___adj_fprem__adj_fpatan__imp___adj_fpatan__adj_fdivr_m64__imp___adj_fdivr_m64__adj_fdivr_m32i__imp___adj_fdivr_m32i__adj_fdivr_m32__imp___adj_fdivr_m32__adj_fdivr_m16i__imp___adj_fdivr_m16i__adj_fdiv_r__imp___adj_fdiv_r__adj_fdiv_m64__imp___adj_fdiv_m64__adj_fdiv_m32i__imp___adj_fdiv_m32i__adj_fdiv_m32__imp___adj_fdiv_m32__adj_fdiv_m16i__imp___adj_fdiv_m16i__imp___acmdln__access__imp___access__abnormal_termination__imp___abnormal_termination__imp____winitenv___wgetmainargs__imp____wgetmainargs___wcserror__imp____wcserror__imp____wargv__imp____unguarded_readlc_active___uncaught_exception__imp____uncaught_exception___unDNameEx__imp____unDNameEx___unDName__imp____unDName___toascii__imp____toascii___threadid__imp____threadid___threadhandle__imp____threadhandle___setusermatherr__imp____setusermatherr__imp____setlc_active___set_app_type__imp____set_app_type___pxcptinfoptrs__imp____pxcptinfoptrs___pwctype_func__imp____pwctype_func__imp____pioinfo___pctype_func__imp____pctype_func___p__wpgmptr__imp____p__wpgmptr___p__winver__imp____p__winver___p__winminor__imp____p__winminor___p__winmajor__imp____p__winmajor___p__wenviron__imp____p__wenviron___p__wcmdln__imp____p__wcmdln___p__tzname__imp____p__tzname___p__timezone__imp____p__timezone___p__pwctype__imp____p__pwctype___p__pgmptr__imp____p__pgmptr___p__pctype__imp____p__pctype___p__osver__imp____p__osver___p__mbctype__imp____p__mbctype___p__mbcasemap__imp____p__mbcasemap___p__iob__imp____p__iob___p__fmode__imp____p__fmode___p__fileinfo__imp____p__fileinfo___p__environ__imp____p__environ___p__dstbias__imp____p__dstbias___p__daylight__imp____p__daylight___p__commode__imp____p__commode___p__amblksiz__imp____p__amblksiz___p__acmdln__imp____p__acmdln___p___winitenv__imp____p___winitenv___p___wargv__imp____p___wargv___p___mb_cur_max__imp____p___mb_cur_max___p___initenv__imp____p___initenv___p___argv__imp____p___argv___p___argc__imp____p___argc__imp____mb_cur_max___lconv_init__imp____lconv_init__imp____lc_handle__imp____lc_collate_cp__imp____lc_codepage___iscsymf__imp____iscsymf___iscsym__imp____iscsym___isascii__imp____isascii___iob_func__imp____iob_func__imp____initenv___getmainargs__imp____getmainargs___fpecode__imp____fpecode___doserrno__imp____doserrno___dllonexit__imp____dllonexit___crtLCMapStringW__imp____crtLCMapStringW___crtLCMapStringA__imp____crtLCMapStringA___crtGetStringTypeW__imp____crtGetStringTypeW___crtGetLocaleInfoW__imp____crtGetLocaleInfoW___crtCompareStringW__imp____crtCompareStringW___crtCompareStringA__imp____crtCompareStringA__imp____badioinfo__imp____argv__imp____argc____unguarded_readlc_active_add_func__imp_____unguarded_readlc_active_add_func____setlc_active_func__imp_____setlc_active_func____mb_cur_max_func__imp_____mb_cur_max_func____lc_handle_func__imp_____lc_handle_func____lc_collate_cp_func__imp_____lc_collate_cp_func____lc_codepage_func__imp_____lc_codepage_func___STRINGTOLD__imp____STRINGTOLD___RTtypeid__imp____RTtypeid___RTDynamicCast__imp____RTDynamicCast___RTCastToVoid__imp____RTCastToVoid___DestructExceptionObject__imp____DestructExceptionObject___CxxUnregisterExceptionObject__imp____CxxUnregisterExceptionObject___CxxRegisterExceptionObject__imp____CxxRegisterExceptionObject___CxxQueryExceptionSize__imp____CxxQueryExceptionSize___CxxLongjmpUnwind__imp____CxxLongjmpUnwind___CxxFrameHandler__imp____CxxFrameHandler___CxxExceptionFilter__imp____CxxExceptionFilter___CxxDetectRethrow__imp____CxxDetectRethrow___CxxCallUnwindDtor__imp____CxxCallUnwindDtor__XcptFilter__imp___XcptFilter__Strftime__imp___Strftime__imp___HUGE__Gettnames__imp___Gettnames__Getmonths__imp___Getmonths__Getdays__imp___Getdays__EH_prolog__imp___EH_prolog__CxxThrowException__imp___CxxThrowException__CItanh__imp___CItanh__CItan__imp___CItan__CIsqrt__imp___CIsqrt__CIsinh__imp___CIsinh__CIsin__imp___CIsin__CIpow__imp___CIpow__CIlog10__imp___CIlog10__CIlog__imp___CIlog__CIfmod__imp___CIfmod__CIexp__imp___CIexp__CIcosh__imp___CIcosh__CIcos__imp___CIcos__CIatan2__imp___CIatan2__CIatan__imp___CIatan__CIasin__imp___CIasin__CIacos__imp___CIacos___msvcrt_printf__imp____msvcrt_printf___msvcrt_fprintf__imp____msvcrt_fprintf___msvcrt_sprintf__imp____msvcrt_sprintf___msvcrt_vprintf__imp____msvcrt_vprintf___msvcrt_vfprintf__imp____msvcrt_vfprintf___msvcrt_vsprintf__imp____msvcrt_vsprintf__get_output_formatdsnot.o/ 1341005714 0 0 100666 574 ` L.text 0`.data@0.bss0.idata$4@0.idata$5@0.idata$7 @0msvcrt.dll.filegfake.text.data.bss.idata$4.idata$5.idata$7 __libmsvcrt_a_inamedsnoh.o/ 1341005714 0 0 100666 641 ` L6.text 0`.data@0.bss0.idata$2@0.idata$5@0.idata$4@0   .filegfakehnamefthunk.text.data.bss.idata$2.idata$4.idata$5+__head_libmsvcrt_a__libmsvcrt_a_iname dsnos00777.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % wscanf .text.data.bss.idata$7.idata$5.idata$4.idata$6_wscanf%__imp__wscanf__head_libmsvcrt_a dsnos00776.o/ 1341005723 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6_wprintf&__imp__wprintf__head_libmsvcrt_adsnos00775.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wctomb .text.data.bss.idata$7.idata$5.idata$4.idata$6_wctomb%__imp__wctomb__head_libmsvcrt_a dsnos00774.o/ 1341005723 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcsxfrm .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcsxfrm&__imp__wcsxfrm__head_libmsvcrt_adsnos00773.o/ 1341005723 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcstoul .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcstoul&__imp__wcstoul__head_libmsvcrt_adsnos00772.o/ 1341005723 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcstombs .text.data.bss.idata$7.idata$5.idata$4.idata$61_wcstombs__imp__wcstombs__head_libmsvcrt_a dsnos00771.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcstol .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcstol%__imp__wcstol__head_libmsvcrt_a dsnos00770.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcstok .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcstok%__imp__wcstok__head_libmsvcrt_a dsnos00769.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcstod .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcstod%__imp__wcstod__head_libmsvcrt_a dsnos00768.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcsstr .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcsstr%__imp__wcsstr__head_libmsvcrt_a dsnos00767.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcsspn .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcsspn%__imp__wcsspn__head_libmsvcrt_a dsnos00766.o/ 1341005723 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcsrchr .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcsrchr&__imp__wcsrchr__head_libmsvcrt_adsnos00765.o/ 1341005723 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcspbrk .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcspbrk&__imp__wcspbrk__head_libmsvcrt_adsnos00764.o/ 1341005723 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcsncpy .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcsncpy&__imp__wcsncpy__head_libmsvcrt_adsnos00763.o/ 1341005723 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcsncmp .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcsncmp&__imp__wcsncmp__head_libmsvcrt_adsnos00762.o/ 1341005723 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcsncat .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcsncat&__imp__wcsncat__head_libmsvcrt_adsnos00761.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcslen .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcslen%__imp__wcslen__head_libmsvcrt_a dsnos00760.o/ 1341005723 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcsftime .text.data.bss.idata$7.idata$5.idata$4.idata$61_wcsftime__imp__wcsftime__head_libmsvcrt_a dsnos00759.o/ 1341005723 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcscspn .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcscspn&__imp__wcscspn__head_libmsvcrt_adsnos00758.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcscpy .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcscpy%__imp__wcscpy__head_libmsvcrt_a dsnos00757.o/ 1341005723 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcscoll .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcscoll&__imp__wcscoll__head_libmsvcrt_adsnos00756.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcscmp .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcscmp%__imp__wcscmp__head_libmsvcrt_a dsnos00755.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcschr .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcschr%__imp__wcschr__head_libmsvcrt_a dsnos00754.o/ 1341005723 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %wcscat .text.data.bss.idata$7.idata$5.idata$4.idata$6_wcscat%__imp__wcscat__head_libmsvcrt_a dsnos00753.o/ 1341005723 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %vwprintf .text.data.bss.idata$7.idata$5.idata$4.idata$61_vwprintf__imp__vwprintf__head_libmsvcrt_a dsnos00752.o/ 1341005723 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %vswprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6 3_vswprintf__imp__vswprintf__head_libmsvcrt_a dsnos00751.o/ 1341005723 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %vsprintf .text.data.bss.idata$7.idata$5.idata$4.idata$61_vsprintf__imp__vsprintf__head_libmsvcrt_a dsnos00750.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %vprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6_vprintf&__imp__vprintf__head_libmsvcrt_adsnos00749.o/ 1341005722 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %vfwprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6 3_vfwprintf__imp__vfwprintf__head_libmsvcrt_a dsnos00748.o/ 1341005722 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %vfprintf .text.data.bss.idata$7.idata$5.idata$4.idata$61_vfprintf__imp__vfprintf__head_libmsvcrt_a dsnos00747.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %ungetwc .text.data.bss.idata$7.idata$5.idata$4.idata$6_ungetwc&__imp__ungetwc__head_libmsvcrt_adsnos00746.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %ungetc .text.data.bss.idata$7.idata$5.idata$4.idata$6_ungetc%__imp__ungetc__head_libmsvcrt_a dsnos00745.o/ 1341005722 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %towupper .text.data.bss.idata$7.idata$5.idata$4.idata$61_towupper__imp__towupper__head_libmsvcrt_a dsnos00744.o/ 1341005722 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %towlower .text.data.bss.idata$7.idata$5.idata$4.idata$61_towlower__imp__towlower__head_libmsvcrt_a dsnos00743.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %toupper .text.data.bss.idata$7.idata$5.idata$4.idata$6_toupper&__imp__toupper__head_libmsvcrt_adsnos00742.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %tolower .text.data.bss.idata$7.idata$5.idata$4.idata$6_tolower&__imp__tolower__head_libmsvcrt_adsnos00741.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %tmpnam .text.data.bss.idata$7.idata$5.idata$4.idata$6_tmpnam%__imp__tmpnam__head_libmsvcrt_a dsnos00740.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %tmpfile .text.data.bss.idata$7.idata$5.idata$4.idata$6_tmpfile&__imp__tmpfile__head_libmsvcrt_adsnos00739.o/ 1341005722 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %time .text.data.bss.idata$7.idata$5.idata$4.idata$6_time#__imp__time__head_libmsvcrt_a dsnos00738.o/ 1341005722 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %tanh .text.data.bss.idata$7.idata$5.idata$4.idata$6_tanh#__imp__tanh__head_libmsvcrt_a dsnos00737.o/ 1341005722 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %tan .text.data.bss.idata$7.idata$5.idata$4.idata$6_tan"__imp__tan__head_libmsvcrt_adsnos00736.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %system .text.data.bss.idata$7.idata$5.idata$4.idata$6_system%__imp__system__head_libmsvcrt_a dsnos00735.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %swscanf .text.data.bss.idata$7.idata$5.idata$4.idata$6_swscanf&__imp__swscanf__head_libmsvcrt_adsnos00734.o/ 1341005722 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %swprintf .text.data.bss.idata$7.idata$5.idata$4.idata$61_swprintf__imp__swprintf__head_libmsvcrt_a dsnos00733.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strxfrm .text.data.bss.idata$7.idata$5.idata$4.idata$6_strxfrm&__imp__strxfrm__head_libmsvcrt_adsnos00732.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strtoul .text.data.bss.idata$7.idata$5.idata$4.idata$6_strtoul&__imp__strtoul__head_libmsvcrt_adsnos00731.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strtol .text.data.bss.idata$7.idata$5.idata$4.idata$6_strtol%__imp__strtol__head_libmsvcrt_a dsnos00730.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strtok .text.data.bss.idata$7.idata$5.idata$4.idata$6_strtok%__imp__strtok__head_libmsvcrt_a dsnos00729.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strtod .text.data.bss.idata$7.idata$5.idata$4.idata$6_strtod%__imp__strtod__head_libmsvcrt_a dsnos00728.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strstr .text.data.bss.idata$7.idata$5.idata$4.idata$6_strstr%__imp__strstr__head_libmsvcrt_a dsnos00727.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strspn .text.data.bss.idata$7.idata$5.idata$4.idata$6_strspn%__imp__strspn__head_libmsvcrt_a dsnos00726.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strrchr .text.data.bss.idata$7.idata$5.idata$4.idata$6_strrchr&__imp__strrchr__head_libmsvcrt_adsnos00725.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strpbrk .text.data.bss.idata$7.idata$5.idata$4.idata$6_strpbrk&__imp__strpbrk__head_libmsvcrt_adsnos00724.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strncpy .text.data.bss.idata$7.idata$5.idata$4.idata$6_strncpy&__imp__strncpy__head_libmsvcrt_adsnos00723.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strncmp .text.data.bss.idata$7.idata$5.idata$4.idata$6_strncmp&__imp__strncmp__head_libmsvcrt_adsnos00722.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strncat .text.data.bss.idata$7.idata$5.idata$4.idata$6_strncat&__imp__strncat__head_libmsvcrt_adsnos00721.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strlen .text.data.bss.idata$7.idata$5.idata$4.idata$6_strlen%__imp__strlen__head_libmsvcrt_a dsnos00720.o/ 1341005722 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strftime .text.data.bss.idata$7.idata$5.idata$4.idata$61_strftime__imp__strftime__head_libmsvcrt_a dsnos00719.o/ 1341005722 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strerror .text.data.bss.idata$7.idata$5.idata$4.idata$61_strerror__imp__strerror__head_libmsvcrt_a dsnos00718.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strcspn .text.data.bss.idata$7.idata$5.idata$4.idata$6_strcspn&__imp__strcspn__head_libmsvcrt_adsnos00717.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strcpy .text.data.bss.idata$7.idata$5.idata$4.idata$6_strcpy%__imp__strcpy__head_libmsvcrt_a dsnos00716.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strcoll .text.data.bss.idata$7.idata$5.idata$4.idata$6_strcoll&__imp__strcoll__head_libmsvcrt_adsnos00715.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strcmp .text.data.bss.idata$7.idata$5.idata$4.idata$6_strcmp%__imp__strcmp__head_libmsvcrt_a dsnos00714.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strchr .text.data.bss.idata$7.idata$5.idata$4.idata$6_strchr%__imp__strchr__head_libmsvcrt_a dsnos00713.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %strcat .text.data.bss.idata$7.idata$5.idata$4.idata$6_strcat%__imp__strcat__head_libmsvcrt_a dsnos00712.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %sscanf .text.data.bss.idata$7.idata$5.idata$4.idata$6_sscanf%__imp__sscanf__head_libmsvcrt_a dsnos00711.o/ 1341005722 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %srand .text.data.bss.idata$7.idata$5.idata$4.idata$6_srand$__imp__srand__head_libmsvcrt_adsnos00710.o/ 1341005722 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %sqrt .text.data.bss.idata$7.idata$5.idata$4.idata$6_sqrt#__imp__sqrt__head_libmsvcrt_a dsnos00709.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %sprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6_sprintf&__imp__sprintf__head_libmsvcrt_adsnos00708.o/ 1341005722 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %sinh .text.data.bss.idata$7.idata$5.idata$4.idata$6_sinh#__imp__sinh__head_libmsvcrt_a dsnos00707.o/ 1341005722 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %sin .text.data.bss.idata$7.idata$5.idata$4.idata$6_sin"__imp__sin__head_libmsvcrt_adsnos00706.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %signal .text.data.bss.idata$7.idata$5.idata$4.idata$6_signal%__imp__signal__head_libmsvcrt_a dsnos00705.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %setvbuf .text.data.bss.idata$7.idata$5.idata$4.idata$6_setvbuf&__imp__setvbuf__head_libmsvcrt_adsnos00704.o/ 1341005722 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %setlocale .text.data.bss.idata$7.idata$5.idata$4.idata$6 3_setlocale__imp__setlocale__head_libmsvcrt_a dsnos00703.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %setbuf .text.data.bss.idata$7.idata$5.idata$4.idata$6_setbuf%__imp__setbuf__head_libmsvcrt_a dsnos00702.o/ 1341005722 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %scanf .text.data.bss.idata$7.idata$5.idata$4.idata$6_scanf$__imp__scanf__head_libmsvcrt_adsnos00701.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %rewind .text.data.bss.idata$7.idata$5.idata$4.idata$6_rewind%__imp__rewind__head_libmsvcrt_a dsnos00700.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %rename .text.data.bss.idata$7.idata$5.idata$4.idata$6_rename%__imp__rename__head_libmsvcrt_a dsnos00699.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %remove .text.data.bss.idata$7.idata$5.idata$4.idata$6_remove%__imp__remove__head_libmsvcrt_a dsnos00698.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %realloc .text.data.bss.idata$7.idata$5.idata$4.idata$6_realloc&__imp__realloc__head_libmsvcrt_adsnos00697.o/ 1341005722 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %rand .text.data.bss.idata$7.idata$5.idata$4.idata$6_rand#__imp__rand__head_libmsvcrt_a dsnos00696.o/ 1341005722 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %raise .text.data.bss.idata$7.idata$5.idata$4.idata$6_raise$__imp__raise__head_libmsvcrt_adsnos00695.o/ 1341005722 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %qsort .text.data.bss.idata$7.idata$5.idata$4.idata$6_qsort$__imp__qsort__head_libmsvcrt_adsnos00694.o/ 1341005722 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %putwchar .text.data.bss.idata$7.idata$5.idata$4.idata$61_putwchar__imp__putwchar__head_libmsvcrt_a dsnos00693.o/ 1341005722 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %putwc .text.data.bss.idata$7.idata$5.idata$4.idata$6_putwc$__imp__putwc__head_libmsvcrt_adsnos00692.o/ 1341005722 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %puts .text.data.bss.idata$7.idata$5.idata$4.idata$6_puts#__imp__puts__head_libmsvcrt_a dsnos00691.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %putchar .text.data.bss.idata$7.idata$5.idata$4.idata$6_putchar&__imp__putchar__head_libmsvcrt_adsnos00690.o/ 1341005722 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %putc .text.data.bss.idata$7.idata$5.idata$4.idata$6_putc#__imp__putc__head_libmsvcrt_a dsnos00689.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %printf .text.data.bss.idata$7.idata$5.idata$4.idata$6_printf%__imp__printf__head_libmsvcrt_a dsnos00688.o/ 1341005722 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %pow .text.data.bss.idata$7.idata$5.idata$4.idata$6_pow"__imp__pow__head_libmsvcrt_adsnos00687.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %perror .text.data.bss.idata$7.idata$5.idata$4.idata$6_perror%__imp__perror__head_libmsvcrt_a dsnos00686.o/ 1341005722 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %modf .text.data.bss.idata$7.idata$5.idata$4.idata$6_modf#__imp__modf__head_libmsvcrt_a dsnos00685.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %mktime .text.data.bss.idata$7.idata$5.idata$4.idata$6_mktime%__imp__mktime__head_libmsvcrt_a dsnos00684.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %memset .text.data.bss.idata$7.idata$5.idata$4.idata$6_memset%__imp__memset__head_libmsvcrt_a dsnos00683.o/ 1341005722 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %memmove .text.data.bss.idata$7.idata$5.idata$4.idata$6_memmove&__imp__memmove__head_libmsvcrt_adsnos00682.o/ 1341005722 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %memcpy .text.data.bss.idata$7.idata$5.idata$4.idata$6_memcpy%__imp__memcpy__head_libmsvcrt_a dsnos00681.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %memcmp .text.data.bss.idata$7.idata$5.idata$4.idata$6_memcmp%__imp__memcmp__head_libmsvcrt_a dsnos00680.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %memchr .text.data.bss.idata$7.idata$5.idata$4.idata$6_memchr%__imp__memchr__head_libmsvcrt_a dsnos00679.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %mbtowc .text.data.bss.idata$7.idata$5.idata$4.idata$6_mbtowc%__imp__mbtowc__head_libmsvcrt_a dsnos00678.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %mbstowcs .text.data.bss.idata$7.idata$5.idata$4.idata$61_mbstowcs__imp__mbstowcs__head_libmsvcrt_a dsnos00677.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %mblen .text.data.bss.idata$7.idata$5.idata$4.idata$6_mblen$__imp__mblen__head_libmsvcrt_adsnos00676.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %malloc .text.data.bss.idata$7.idata$5.idata$4.idata$6_malloc%__imp__malloc__head_libmsvcrt_a dsnos00675.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %longjmp .text.data.bss.idata$7.idata$5.idata$4.idata$6_longjmp&__imp__longjmp__head_libmsvcrt_adsnos00674.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %log10 .text.data.bss.idata$7.idata$5.idata$4.idata$6_log10$__imp__log10__head_libmsvcrt_adsnos00673.o/ 1341005721 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %log .text.data.bss.idata$7.idata$5.idata$4.idata$6_log"__imp__log__head_libmsvcrt_adsnos00672.o/ 1341005721 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %localtime .text.data.bss.idata$7.idata$5.idata$4.idata$6 3_localtime__imp__localtime__head_libmsvcrt_a dsnos00671.o/ 1341005721 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %localeconv .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_localeconv__imp__localeconv__head_libmsvcrt_a dsnos00670.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %ldiv .text.data.bss.idata$7.idata$5.idata$4.idata$6_ldiv#__imp__ldiv__head_libmsvcrt_a dsnos00669.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %ldexp .text.data.bss.idata$7.idata$5.idata$4.idata$6_ldexp$__imp__ldexp__head_libmsvcrt_adsnos00668.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %labs .text.data.bss.idata$7.idata$5.idata$4.idata$6_labs#__imp__labs__head_libmsvcrt_a dsnos00667.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %isxdigit .text.data.bss.idata$7.idata$5.idata$4.idata$61_isxdigit__imp__isxdigit__head_libmsvcrt_a dsnos00666.o/ 1341005721 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswxdigit .text.data.bss.idata$7.idata$5.idata$4.idata$6 3_iswxdigit__imp__iswxdigit__head_libmsvcrt_a dsnos00665.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswupper .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswupper__imp__iswupper__head_libmsvcrt_a dsnos00664.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswspace .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswspace__imp__iswspace__head_libmsvcrt_a dsnos00663.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswpunct .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswpunct__imp__iswpunct__head_libmsvcrt_a dsnos00662.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswprint .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswprint__imp__iswprint__head_libmsvcrt_a dsnos00661.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswlower .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswlower__imp__iswlower__head_libmsvcrt_a dsnos00660.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswgraph .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswgraph__imp__iswgraph__head_libmsvcrt_a dsnos00659.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswdigit .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswdigit__imp__iswdigit__head_libmsvcrt_a dsnos00658.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswctype .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswctype__imp__iswctype__head_libmsvcrt_a dsnos00657.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswcntrl .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswcntrl__imp__iswcntrl__head_libmsvcrt_a dsnos00656.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswascii .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswascii__imp__iswascii__head_libmsvcrt_a dsnos00655.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswalpha .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswalpha__imp__iswalpha__head_libmsvcrt_a dsnos00654.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iswalnum .text.data.bss.idata$7.idata$5.idata$4.idata$61_iswalnum__imp__iswalnum__head_libmsvcrt_a dsnos00653.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %isupper .text.data.bss.idata$7.idata$5.idata$4.idata$6_isupper&__imp__isupper__head_libmsvcrt_adsnos00652.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %isspace .text.data.bss.idata$7.idata$5.idata$4.idata$6_isspace&__imp__isspace__head_libmsvcrt_adsnos00651.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %ispunct .text.data.bss.idata$7.idata$5.idata$4.idata$6_ispunct&__imp__ispunct__head_libmsvcrt_adsnos00650.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %isprint .text.data.bss.idata$7.idata$5.idata$4.idata$6_isprint&__imp__isprint__head_libmsvcrt_adsnos00649.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %islower .text.data.bss.idata$7.idata$5.idata$4.idata$6_islower&__imp__islower__head_libmsvcrt_adsnos00648.o/ 1341005721 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %isleadbyte .text.data.bss.idata$7.idata$5.idata$4.idata$6"5_isleadbyte__imp__isleadbyte__head_libmsvcrt_a dsnos00647.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %isgraph .text.data.bss.idata$7.idata$5.idata$4.idata$6_isgraph&__imp__isgraph__head_libmsvcrt_adsnos00646.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %isdigit .text.data.bss.idata$7.idata$5.idata$4.idata$6_isdigit&__imp__isdigit__head_libmsvcrt_adsnos00645.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %iscntrl .text.data.bss.idata$7.idata$5.idata$4.idata$6_iscntrl&__imp__iscntrl__head_libmsvcrt_adsnos00644.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %isalpha .text.data.bss.idata$7.idata$5.idata$4.idata$6_isalpha&__imp__isalpha__head_libmsvcrt_adsnos00643.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %isalnum .text.data.bss.idata$7.idata$5.idata$4.idata$6_isalnum&__imp__isalnum__head_libmsvcrt_adsnos00642.o/ 1341005721 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %is_wctype .text.data.bss.idata$7.idata$5.idata$4.idata$6 3_is_wctype__imp__is_wctype__head_libmsvcrt_a dsnos00641.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %gmtime .text.data.bss.idata$7.idata$5.idata$4.idata$6_gmtime%__imp__gmtime__head_libmsvcrt_a dsnos00640.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %getwchar .text.data.bss.idata$7.idata$5.idata$4.idata$61_getwchar__imp__getwchar__head_libmsvcrt_a dsnos00639.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %getwc .text.data.bss.idata$7.idata$5.idata$4.idata$6_getwc$__imp__getwc__head_libmsvcrt_adsnos00638.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %~gets .text.data.bss.idata$7.idata$5.idata$4.idata$6_gets#__imp__gets__head_libmsvcrt_a dsnos00637.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %}getenv .text.data.bss.idata$7.idata$5.idata$4.idata$6_getenv%__imp__getenv__head_libmsvcrt_a dsnos00636.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %|getchar .text.data.bss.idata$7.idata$5.idata$4.idata$6_getchar&__imp__getchar__head_libmsvcrt_adsnos00635.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %{getc .text.data.bss.idata$7.idata$5.idata$4.idata$6_getc#__imp__getc__head_libmsvcrt_a dsnos00634.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %zfwscanf .text.data.bss.idata$7.idata$5.idata$4.idata$6_fwscanf&__imp__fwscanf__head_libmsvcrt_adsnos00633.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %yfwrite .text.data.bss.idata$7.idata$5.idata$4.idata$6_fwrite%__imp__fwrite__head_libmsvcrt_a dsnos00632.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %xfwprintf .text.data.bss.idata$7.idata$5.idata$4.idata$61_fwprintf__imp__fwprintf__head_libmsvcrt_a dsnos00631.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %wftell .text.data.bss.idata$7.idata$5.idata$4.idata$6_ftell$__imp__ftell__head_libmsvcrt_adsnos00630.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %vfsetpos .text.data.bss.idata$7.idata$5.idata$4.idata$6_fsetpos&__imp__fsetpos__head_libmsvcrt_adsnos00629.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %ufseek .text.data.bss.idata$7.idata$5.idata$4.idata$6_fseek$__imp__fseek__head_libmsvcrt_adsnos00628.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %tfscanf .text.data.bss.idata$7.idata$5.idata$4.idata$6_fscanf%__imp__fscanf__head_libmsvcrt_a dsnos00627.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %sfrexp .text.data.bss.idata$7.idata$5.idata$4.idata$6_frexp$__imp__frexp__head_libmsvcrt_adsnos00626.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %rfreopen .text.data.bss.idata$7.idata$5.idata$4.idata$6_freopen&__imp__freopen__head_libmsvcrt_adsnos00625.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %qfree .text.data.bss.idata$7.idata$5.idata$4.idata$6_free#__imp__free__head_libmsvcrt_a dsnos00624.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %pfread .text.data.bss.idata$7.idata$5.idata$4.idata$6_fread$__imp__fread__head_libmsvcrt_adsnos00623.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %ofputws .text.data.bss.idata$7.idata$5.idata$4.idata$6_fputws%__imp__fputws__head_libmsvcrt_a dsnos00622.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %nfputwc .text.data.bss.idata$7.idata$5.idata$4.idata$6_fputwc%__imp__fputwc__head_libmsvcrt_a dsnos00621.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %mfputs .text.data.bss.idata$7.idata$5.idata$4.idata$6_fputs$__imp__fputs__head_libmsvcrt_adsnos00620.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %lfputc .text.data.bss.idata$7.idata$5.idata$4.idata$6_fputc$__imp__fputc__head_libmsvcrt_adsnos00619.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %kfprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6_fprintf&__imp__fprintf__head_libmsvcrt_adsnos00618.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %jfopen .text.data.bss.idata$7.idata$5.idata$4.idata$6_fopen$__imp__fopen__head_libmsvcrt_adsnos00617.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %ifmod .text.data.bss.idata$7.idata$5.idata$4.idata$6_fmod#__imp__fmod__head_libmsvcrt_a dsnos00616.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %hfloor .text.data.bss.idata$7.idata$5.idata$4.idata$6_floor$__imp__floor__head_libmsvcrt_adsnos00615.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %gfgetws .text.data.bss.idata$7.idata$5.idata$4.idata$6_fgetws%__imp__fgetws__head_libmsvcrt_a dsnos00614.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %ffgetwc .text.data.bss.idata$7.idata$5.idata$4.idata$6_fgetwc%__imp__fgetwc__head_libmsvcrt_a dsnos00613.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %efgets .text.data.bss.idata$7.idata$5.idata$4.idata$6_fgets$__imp__fgets__head_libmsvcrt_adsnos00612.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %dfgetpos .text.data.bss.idata$7.idata$5.idata$4.idata$6_fgetpos&__imp__fgetpos__head_libmsvcrt_adsnos00611.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %cfgetc .text.data.bss.idata$7.idata$5.idata$4.idata$6_fgetc$__imp__fgetc__head_libmsvcrt_adsnos00610.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %bfflush .text.data.bss.idata$7.idata$5.idata$4.idata$6_fflush%__imp__fflush__head_libmsvcrt_a dsnos00609.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %aferror .text.data.bss.idata$7.idata$5.idata$4.idata$6_ferror%__imp__ferror__head_libmsvcrt_a dsnos00608.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %`feof .text.data.bss.idata$7.idata$5.idata$4.idata$6_feof#__imp__feof__head_libmsvcrt_a dsnos00607.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_fclose .text.data.bss.idata$7.idata$5.idata$4.idata$6_fclose%__imp__fclose__head_libmsvcrt_a dsnos00606.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %^fabs .text.data.bss.idata$7.idata$5.idata$4.idata$6_fabs#__imp__fabs__head_libmsvcrt_a dsnos00605.o/ 1341005721 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %]exp .text.data.bss.idata$7.idata$5.idata$4.idata$6_exp"__imp__exp__head_libmsvcrt_adsnos00604.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %\exit .text.data.bss.idata$7.idata$5.idata$4.idata$6_exit#__imp__exit__head_libmsvcrt_a dsnos00603.o/ 1341005721 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %[div .text.data.bss.idata$7.idata$5.idata$4.idata$6_div"__imp__div__head_libmsvcrt_adsnos00602.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %Zdifftime .text.data.bss.idata$7.idata$5.idata$4.idata$61_difftime__imp__difftime__head_libmsvcrt_a dsnos00601.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Yctime .text.data.bss.idata$7.idata$5.idata$4.idata$6_ctime$__imp__ctime__head_libmsvcrt_adsnos00600.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Xcosh .text.data.bss.idata$7.idata$5.idata$4.idata$6_cosh#__imp__cosh__head_libmsvcrt_a dsnos00599.o/ 1341005721 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Wcos .text.data.bss.idata$7.idata$5.idata$4.idata$6_cos"__imp__cos__head_libmsvcrt_adsnos00598.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Vclock .text.data.bss.idata$7.idata$5.idata$4.idata$6_clock$__imp__clock__head_libmsvcrt_adsnos00597.o/ 1341005721 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %Uclearerr .text.data.bss.idata$7.idata$5.idata$4.idata$61_clearerr__imp__clearerr__head_libmsvcrt_a dsnos00596.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Tceil .text.data.bss.idata$7.idata$5.idata$4.idata$6_ceil#__imp__ceil__head_libmsvcrt_a dsnos00595.o/ 1341005721 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %Scalloc .text.data.bss.idata$7.idata$5.idata$4.idata$6_calloc%__imp__calloc__head_libmsvcrt_a dsnos00594.o/ 1341005721 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %Rbsearch .text.data.bss.idata$7.idata$5.idata$4.idata$6_bsearch&__imp__bsearch__head_libmsvcrt_adsnos00593.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Qatol .text.data.bss.idata$7.idata$5.idata$4.idata$6_atol#__imp__atol__head_libmsvcrt_a dsnos00592.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Patoi .text.data.bss.idata$7.idata$5.idata$4.idata$6_atoi#__imp__atoi__head_libmsvcrt_a dsnos00591.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Oatof .text.data.bss.idata$7.idata$5.idata$4.idata$6_atof#__imp__atof__head_libmsvcrt_a dsnos00590.o/ 1341005721 0 0 100666 553 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 Natexit.text.data.bss.idata$7.idata$5.idata$4.idata$6%__imp__atexit__head_libmsvcrt_a dsnos00589.o/ 1341005721 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Matan2 .text.data.bss.idata$7.idata$5.idata$4.idata$6_atan2$__imp__atan2__head_libmsvcrt_adsnos00588.o/ 1341005721 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Latan .text.data.bss.idata$7.idata$5.idata$4.idata$6_atan#__imp__atan__head_libmsvcrt_a dsnos00587.o/ 1341005720 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Kasin .text.data.bss.idata$7.idata$5.idata$4.idata$6_asin#__imp__asin__head_libmsvcrt_a dsnos00586.o/ 1341005720 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %Jasctime .text.data.bss.idata$7.idata$5.idata$4.idata$6_asctime&__imp__asctime__head_libmsvcrt_adsnos00585.o/ 1341005720 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Iacos .text.data.bss.idata$7.idata$5.idata$4.idata$6_acos#__imp__acos__head_libmsvcrt_a dsnos00584.o/ 1341005720 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Habs .text.data.bss.idata$7.idata$5.idata$4.idata$6_abs"__imp__abs__head_libmsvcrt_adsnos00583.o/ 1341005720 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %Gabort .text.data.bss.idata$7.idata$5.idata$4.idata$6_abort$__imp__abort__head_libmsvcrt_adsnos00582.o/ 1341005720 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %F_yn .text.data.bss.idata$7.idata$5.idata$4.idata$6__yn"__imp___yn__head_libmsvcrt_adsnos00581.o/ 1341005720 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %E_y1 .text.data.bss.idata$7.idata$5.idata$4.idata$6__y1"__imp___y1__head_libmsvcrt_adsnos00580.o/ 1341005720 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %D_y0 .text.data.bss.idata$7.idata$5.idata$4.idata$6__y0"__imp___y0__head_libmsvcrt_adsnos00579.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %C_wutime64 .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wutime64__imp___wutime64__head_libmsvcrt_a dsnos00578.o/ 1341005720 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %B_wutime .text.data.bss.idata$7.idata$5.idata$4.idata$6__wutime&__imp___wutime__head_libmsvcrt_adsnos00577.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %A_wunlink .text.data.bss.idata$7.idata$5.idata$4.idata$61__wunlink__imp___wunlink__head_libmsvcrt_a dsnos00576.o/ 1341005720 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %@_wtol .text.data.bss.idata$7.idata$5.idata$4.idata$6__wtol$__imp___wtol__head_libmsvcrt_adsnos00575.o/ 1341005720 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %?_wtoi64 .text.data.bss.idata$7.idata$5.idata$4.idata$6__wtoi64&__imp___wtoi64__head_libmsvcrt_adsnos00574.o/ 1341005720 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %>_wtoi .text.data.bss.idata$7.idata$5.idata$4.idata$6__wtoi$__imp___wtoi__head_libmsvcrt_adsnos00573.o/ 1341005720 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %=_wtof .text.data.bss.idata$7.idata$5.idata$4.idata$6__wtof$__imp___wtof__head_libmsvcrt_adsnos00572.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %<_wtmpnam .text.data.bss.idata$7.idata$5.idata$4.idata$61__wtmpnam__imp___wtmpnam__head_libmsvcrt_a dsnos00571.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %;_wtempnam .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wtempnam__imp___wtempnam__head_libmsvcrt_a dsnos00570.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %:_wsystem .text.data.bss.idata$7.idata$5.idata$4.idata$61__wsystem__imp___wsystem__head_libmsvcrt_a dsnos00569.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %9_wstrtime .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wstrtime__imp___wstrtime__head_libmsvcrt_a dsnos00568.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %8_wstrdate .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wstrdate__imp___wstrdate__head_libmsvcrt_a dsnos00567.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %7_wstati64 .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wstati64__imp___wstati64__head_libmsvcrt_a dsnos00566.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %6_wstat64 .text.data.bss.idata$7.idata$5.idata$4.idata$61__wstat64__imp___wstat64__head_libmsvcrt_a dsnos00565.o/ 1341005720 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %5_wstat .text.data.bss.idata$7.idata$5.idata$4.idata$6__wstat%__imp___wstat__head_libmsvcrt_a dsnos00564.o/ 1341005720 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %4_wsplitpath .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__wsplitpath__imp___wsplitpath__head_libmsvcrt_a dsnos00563.o/ 1341005720 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %3_wspawnvpe .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__wspawnvpe__imp___wspawnvpe__head_libmsvcrt_a dsnos00562.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %2_wspawnvp .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wspawnvp__imp___wspawnvp__head_libmsvcrt_a dsnos00561.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %1_wspawnve .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wspawnve__imp___wspawnve__head_libmsvcrt_a dsnos00560.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %0_wspawnv .text.data.bss.idata$7.idata$5.idata$4.idata$61__wspawnv__imp___wspawnv__head_libmsvcrt_a dsnos00559.o/ 1341005720 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %/_wspawnlpe .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__wspawnlpe__imp___wspawnlpe__head_libmsvcrt_a dsnos00558.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %._wspawnlp .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wspawnlp__imp___wspawnlp__head_libmsvcrt_a dsnos00557.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %-_wspawnle .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wspawnle__imp___wspawnle__head_libmsvcrt_a dsnos00556.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %,_wspawnl .text.data.bss.idata$7.idata$5.idata$4.idata$61__wspawnl__imp___wspawnl__head_libmsvcrt_a dsnos00555.o/ 1341005720 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %+_wsopen .text.data.bss.idata$7.idata$5.idata$4.idata$6__wsopen&__imp___wsopen__head_libmsvcrt_adsnos00554.o/ 1341005720 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %*_wsetlocale .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__wsetlocale__imp___wsetlocale__head_libmsvcrt_a dsnos00553.o/ 1341005720 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %)_wsearchenv .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__wsearchenv__imp___wsearchenv__head_libmsvcrt_a dsnos00552.o/ 1341005720 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %(_wrmdir .text.data.bss.idata$7.idata$5.idata$4.idata$6__wrmdir&__imp___wrmdir__head_libmsvcrt_adsnos00551.o/ 1341005720 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %'_write .text.data.bss.idata$7.idata$5.idata$4.idata$6__write%__imp___write__head_libmsvcrt_a dsnos00550.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %&_wrename .text.data.bss.idata$7.idata$5.idata$4.idata$61__wrename__imp___wrename__head_libmsvcrt_a dsnos00549.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %%_wremove .text.data.bss.idata$7.idata$5.idata$4.idata$61__wremove__imp___wremove__head_libmsvcrt_a dsnos00548.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %$_wputenv .text.data.bss.idata$7.idata$5.idata$4.idata$61__wputenv__imp___wputenv__head_libmsvcrt_a dsnos00547.o/ 1341005720 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %#_wpopen .text.data.bss.idata$7.idata$5.idata$4.idata$6__wpopen&__imp___wpopen__head_libmsvcrt_adsnos00546.o/ 1341005720 0 0 100666 555 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 "_wpgmptr.text.data.bss.idata$7.idata$5.idata$4.idata$6'__imp___wpgmptr__head_libmsvcrt_a dsnos00545.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %!_wperror .text.data.bss.idata$7.idata$5.idata$4.idata$61__wperror__imp___wperror__head_libmsvcrt_a dsnos00544.o/ 1341005720 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _wopen .text.data.bss.idata$7.idata$5.idata$4.idata$6__wopen%__imp___wopen__head_libmsvcrt_a dsnos00543.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wmktemp .text.data.bss.idata$7.idata$5.idata$4.idata$61__wmktemp__imp___wmktemp__head_libmsvcrt_a dsnos00542.o/ 1341005720 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wmkdir .text.data.bss.idata$7.idata$5.idata$4.idata$6__wmkdir&__imp___wmkdir__head_libmsvcrt_adsnos00541.o/ 1341005720 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_wmakepath .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__wmakepath__imp___wmakepath__head_libmsvcrt_a dsnos00540.o/ 1341005720 0 0 100666 554 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _winver.text.data.bss.idata$7.idata$5.idata$4.idata$6&__imp___winver__head_libmsvcrt_adsnos00539.o/ 1341005720 0 0 100666 556 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _winminor.text.data.bss.idata$7.idata$5.idata$4.idata$6(__imp___winminor__head_libmsvcrt_adsnos00538.o/ 1341005720 0 0 100666 556 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _winmajor.text.data.bss.idata$7.idata$5.idata$4.idata$6(__imp___winmajor__head_libmsvcrt_adsnos00537.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wgetenv .text.data.bss.idata$7.idata$5.idata$4.idata$61__wgetenv__imp___wgetenv__head_libmsvcrt_a dsnos00536.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wgetdcwd .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wgetdcwd__imp___wgetdcwd__head_libmsvcrt_a dsnos00535.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wgetcwd .text.data.bss.idata$7.idata$5.idata$4.idata$61__wgetcwd__imp___wgetcwd__head_libmsvcrt_a dsnos00534.o/ 1341005720 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_wfullpath .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__wfullpath__imp___wfullpath__head_libmsvcrt_a dsnos00533.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wfsopen .text.data.bss.idata$7.idata$5.idata$4.idata$61__wfsopen__imp___wfsopen__head_libmsvcrt_a dsnos00532.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wfreopen .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wfreopen__imp___wfreopen__head_libmsvcrt_a dsnos00531.o/ 1341005720 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wfopen .text.data.bss.idata$7.idata$5.idata$4.idata$6__wfopen&__imp___wfopen__head_libmsvcrt_adsnos00530.o/ 1341005720 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_wfindnexti64 .text.data.bss.idata$7.idata$5.idata$4.idata$6(;__wfindnexti64__imp___wfindnexti64__head_libmsvcrt_a dsnos00529.o/ 1341005720 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_wfindnext64 .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__wfindnext64__imp___wfindnext64__head_libmsvcrt_a dsnos00528.o/ 1341005720 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_wfindnext .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__wfindnext__imp___wfindnext__head_libmsvcrt_a dsnos00527.o/ 1341005720 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_wfindfirsti64 .text.data.bss.idata$7.idata$5.idata$4.idata$6*=__wfindfirsti64__imp___wfindfirsti64__head_libmsvcrt_a dsnos00526.o/ 1341005720 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_wfindfirst64 .text.data.bss.idata$7.idata$5.idata$4.idata$6(;__wfindfirst64__imp___wfindfirst64__head_libmsvcrt_a dsnos00525.o/ 1341005720 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % _wfindfirst .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__wfindfirst__imp___wfindfirst__head_libmsvcrt_a dsnos00524.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _wfdopen .text.data.bss.idata$7.idata$5.idata$4.idata$61__wfdopen__imp___wfdopen__head_libmsvcrt_a dsnos00523.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _wexecvpe .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wexecvpe__imp___wexecvpe__head_libmsvcrt_a dsnos00522.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _wexecvp .text.data.bss.idata$7.idata$5.idata$4.idata$61__wexecvp__imp___wexecvp__head_libmsvcrt_a dsnos00521.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _wexecve .text.data.bss.idata$7.idata$5.idata$4.idata$61__wexecve__imp___wexecve__head_libmsvcrt_a dsnos00520.o/ 1341005720 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wexecv .text.data.bss.idata$7.idata$5.idata$4.idata$6__wexecv&__imp___wexecv__head_libmsvcrt_adsnos00519.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wexeclpe .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wexeclpe__imp___wexeclpe__head_libmsvcrt_a dsnos00518.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wexeclp .text.data.bss.idata$7.idata$5.idata$4.idata$61__wexeclp__imp___wexeclp__head_libmsvcrt_a dsnos00517.o/ 1341005720 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wexecle .text.data.bss.idata$7.idata$5.idata$4.idata$61__wexecle__imp___wexecle__head_libmsvcrt_a dsnos00516.o/ 1341005720 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wexecl .text.data.bss.idata$7.idata$5.idata$4.idata$6__wexecl&__imp___wexecl__head_libmsvcrt_adsnos00515.o/ 1341005720 0 0 100666 556 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _wenviron.text.data.bss.idata$7.idata$5.idata$4.idata$6(__imp___wenviron__head_libmsvcrt_adsnos00514.o/ 1341005720 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wctype .text.data.bss.idata$7.idata$5.idata$4.idata$6__wctype&__imp___wctype__head_libmsvcrt_adsnos00513.o/ 1341005720 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wctime64 .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wctime64__imp___wctime64__head_libmsvcrt_a dsnos00512.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wctime .text.data.bss.idata$7.idata$5.idata$4.idata$6__wctime&__imp___wctime__head_libmsvcrt_adsnos00511.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcsupr .text.data.bss.idata$7.idata$5.idata$4.idata$6__wcsupr&__imp___wcsupr__head_libmsvcrt_adsnos00510.o/ 1341005719 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_wcstoui64 .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__wcstoui64__imp___wcstoui64__head_libmsvcrt_a dsnos00509.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcstoi64 .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wcstoi64__imp___wcstoi64__head_libmsvcrt_a dsnos00508.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcsset .text.data.bss.idata$7.idata$5.idata$4.idata$6__wcsset&__imp___wcsset__head_libmsvcrt_adsnos00507.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcsrev .text.data.bss.idata$7.idata$5.idata$4.idata$6__wcsrev&__imp___wcsrev__head_libmsvcrt_adsnos00506.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcsnset .text.data.bss.idata$7.idata$5.idata$4.idata$61__wcsnset__imp___wcsnset__head_libmsvcrt_a dsnos00505.o/ 1341005719 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_wcsnicoll .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__wcsnicoll__imp___wcsnicoll__head_libmsvcrt_a dsnos00504.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcsnicmp .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wcsnicmp__imp___wcsnicmp__head_libmsvcrt_a dsnos00503.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcsncoll .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wcsncoll__imp___wcsncoll__head_libmsvcrt_a dsnos00502.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcslwr .text.data.bss.idata$7.idata$5.idata$4.idata$6__wcslwr&__imp___wcslwr__head_libmsvcrt_adsnos00501.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcsicoll .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wcsicoll__imp___wcsicoll__head_libmsvcrt_a dsnos00500.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcsicmp .text.data.bss.idata$7.idata$5.idata$4.idata$61__wcsicmp__imp___wcsicmp__head_libmsvcrt_a dsnos00499.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcserror .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wcserror__imp___wcserror__head_libmsvcrt_a dsnos00498.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcsdup .text.data.bss.idata$7.idata$5.idata$4.idata$6__wcsdup&__imp___wcsdup__head_libmsvcrt_adsnos00497.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wcreat .text.data.bss.idata$7.idata$5.idata$4.idata$6__wcreat&__imp___wcreat__head_libmsvcrt_adsnos00496.o/ 1341005719 0 0 100666 554 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _wcmdln.text.data.bss.idata$7.idata$5.idata$4.idata$6&__imp___wcmdln__head_libmsvcrt_adsnos00495.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wchmod .text.data.bss.idata$7.idata$5.idata$4.idata$6__wchmod&__imp___wchmod__head_libmsvcrt_adsnos00494.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wchdir .text.data.bss.idata$7.idata$5.idata$4.idata$6__wchdir&__imp___wchdir__head_libmsvcrt_adsnos00493.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_wasctime .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__wasctime__imp___wasctime__head_libmsvcrt_a dsnos00492.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_waccess .text.data.bss.idata$7.idata$5.idata$4.idata$61__waccess__imp___waccess__head_libmsvcrt_a dsnos00491.o/ 1341005719 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_vsnwprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__vsnwprintf__imp___vsnwprintf__head_libmsvcrt_a dsnos00490.o/ 1341005719 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_vsnprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__vsnprintf__imp___vsnprintf__head_libmsvcrt_a dsnos00489.o/ 1341005719 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_vscwprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__vscwprintf__imp___vscwprintf__head_libmsvcrt_a dsnos00488.o/ 1341005719 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_vscprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__vscprintf__imp___vscprintf__head_libmsvcrt_a dsnos00487.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_utime64 .text.data.bss.idata$7.idata$5.idata$4.idata$61__utime64__imp___utime64__head_libmsvcrt_a dsnos00486.o/ 1341005719 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_utime .text.data.bss.idata$7.idata$5.idata$4.idata$6__utime%__imp___utime__head_libmsvcrt_a dsnos00485.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_unlock .text.data.bss.idata$7.idata$5.idata$4.idata$6__unlock&__imp___unlock__head_libmsvcrt_adsnos00484.o/ 1341005719 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_unloaddll .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__unloaddll__imp___unloaddll__head_libmsvcrt_a dsnos00483.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_unlink .text.data.bss.idata$7.idata$5.idata$4.idata$6__unlink&__imp___unlink__head_libmsvcrt_adsnos00482.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_ungetwch .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__ungetwch__imp___ungetwch__head_libmsvcrt_a dsnos00481.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_ungetch .text.data.bss.idata$7.idata$5.idata$4.idata$61__ungetch__imp___ungetch__head_libmsvcrt_a dsnos00480.o/ 1341005719 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_umask .text.data.bss.idata$7.idata$5.idata$4.idata$6__umask%__imp___umask__head_libmsvcrt_a dsnos00479.o/ 1341005719 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_ultow .text.data.bss.idata$7.idata$5.idata$4.idata$6__ultow%__imp___ultow__head_libmsvcrt_a dsnos00478.o/ 1341005719 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_ultoa .text.data.bss.idata$7.idata$5.idata$4.idata$6__ultoa%__imp___ultoa__head_libmsvcrt_a dsnos00477.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_ui64tow .text.data.bss.idata$7.idata$5.idata$4.idata$61__ui64tow__imp___ui64tow__head_libmsvcrt_a dsnos00476.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_ui64toa .text.data.bss.idata$7.idata$5.idata$4.idata$61__ui64toa__imp___ui64toa__head_libmsvcrt_a dsnos00475.o/ 1341005719 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_tzset .text.data.bss.idata$7.idata$5.idata$4.idata$6__tzset%__imp___tzset__head_libmsvcrt_a dsnos00474.o/ 1341005719 0 0 100666 554 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _tzname.text.data.bss.idata$7.idata$5.idata$4.idata$6&__imp___tzname__head_libmsvcrt_adsnos00473.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_toupper .text.data.bss.idata$7.idata$5.idata$4.idata$61__toupper__imp___toupper__head_libmsvcrt_a dsnos00472.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_tolower .text.data.bss.idata$7.idata$5.idata$4.idata$61__tolower__imp___tolower__head_libmsvcrt_a dsnos00471.o/ 1341005719 0 0 100666 556 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _timezone.text.data.bss.idata$7.idata$5.idata$4.idata$6(__imp___timezone__head_libmsvcrt_adsnos00470.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_time64 .text.data.bss.idata$7.idata$5.idata$4.idata$6__time64&__imp___time64__head_libmsvcrt_adsnos00469.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_tempnam .text.data.bss.idata$7.idata$5.idata$4.idata$61__tempnam__imp___tempnam__head_libmsvcrt_a dsnos00468.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_telli64 .text.data.bss.idata$7.idata$5.idata$4.idata$61__telli64__imp___telli64__head_libmsvcrt_a dsnos00467.o/ 1341005719 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_tell .text.data.bss.idata$7.idata$5.idata$4.idata$6__tell$__imp___tell__head_libmsvcrt_adsnos00466.o/ 1341005719 0 0 100666 556 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _sys_nerr.text.data.bss.idata$7.idata$5.idata$4.idata$6(__imp___sys_nerr__head_libmsvcrt_adsnos00465.o/ 1341005719 0 0 100666 563 ` Lf .text 0`.data@0.bss0.idata$7,H0.idata$50R0.idata$44\0.idata$68 _sys_errlist.text.data.bss.idata$7.idata$5.idata$4.idata$6+__imp___sys_errlist__head_libmsvcrt_a dsnos00464.o/ 1341005719 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_swab .text.data.bss.idata$7.idata$5.idata$4.idata$6__swab$__imp___swab__head_libmsvcrt_adsnos00463.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strupr .text.data.bss.idata$7.idata$5.idata$4.idata$6__strupr&__imp___strupr__head_libmsvcrt_adsnos00462.o/ 1341005719 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_strtoui64 .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__strtoui64__imp___strtoui64__head_libmsvcrt_a dsnos00461.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strtoi64 .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__strtoi64__imp___strtoi64__head_libmsvcrt_a dsnos00460.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strtime .text.data.bss.idata$7.idata$5.idata$4.idata$61__strtime__imp___strtime__head_libmsvcrt_a dsnos00459.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strset .text.data.bss.idata$7.idata$5.idata$4.idata$6__strset&__imp___strset__head_libmsvcrt_adsnos00458.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strrev .text.data.bss.idata$7.idata$5.idata$4.idata$6__strrev&__imp___strrev__head_libmsvcrt_adsnos00457.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strnset .text.data.bss.idata$7.idata$5.idata$4.idata$61__strnset__imp___strnset__head_libmsvcrt_a dsnos00456.o/ 1341005719 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_strnicoll .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__strnicoll__imp___strnicoll__head_libmsvcrt_a dsnos00455.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strnicmp .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__strnicmp__imp___strnicmp__head_libmsvcrt_a dsnos00454.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strncoll .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__strncoll__imp___strncoll__head_libmsvcrt_a dsnos00453.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strlwr .text.data.bss.idata$7.idata$5.idata$4.idata$6__strlwr&__imp___strlwr__head_libmsvcrt_adsnos00452.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_stricoll .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__stricoll__imp___stricoll__head_libmsvcrt_a dsnos00451.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_stricmp .text.data.bss.idata$7.idata$5.idata$4.idata$61__stricmp__imp___stricmp__head_libmsvcrt_a dsnos00450.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strerror .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__strerror__imp___strerror__head_libmsvcrt_a dsnos00449.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strdup .text.data.bss.idata$7.idata$5.idata$4.idata$6__strdup&__imp___strdup__head_libmsvcrt_adsnos00448.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strdate .text.data.bss.idata$7.idata$5.idata$4.idata$61__strdate__imp___strdate__head_libmsvcrt_a dsnos00447.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_strcmpi .text.data.bss.idata$7.idata$5.idata$4.idata$61__strcmpi__imp___strcmpi__head_libmsvcrt_a dsnos00446.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_statusfp .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__statusfp__imp___statusfp__head_libmsvcrt_a dsnos00445.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_stati64 .text.data.bss.idata$7.idata$5.idata$4.idata$61__stati64__imp___stati64__head_libmsvcrt_a dsnos00444.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_stat64 .text.data.bss.idata$7.idata$5.idata$4.idata$6__stat64&__imp___stat64__head_libmsvcrt_adsnos00443.o/ 1341005719 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_stat .text.data.bss.idata$7.idata$5.idata$4.idata$6__stat$__imp___stat__head_libmsvcrt_adsnos00442.o/ 1341005719 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_splitpath .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__splitpath__imp___splitpath__head_libmsvcrt_a dsnos00441.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_spawnvpe .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__spawnvpe__imp___spawnvpe__head_libmsvcrt_a dsnos00440.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_spawnvp .text.data.bss.idata$7.idata$5.idata$4.idata$61__spawnvp__imp___spawnvp__head_libmsvcrt_a dsnos00439.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_spawnve .text.data.bss.idata$7.idata$5.idata$4.idata$61__spawnve__imp___spawnve__head_libmsvcrt_a dsnos00438.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_spawnv .text.data.bss.idata$7.idata$5.idata$4.idata$6__spawnv&__imp___spawnv__head_libmsvcrt_adsnos00437.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_spawnlpe .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__spawnlpe__imp___spawnlpe__head_libmsvcrt_a dsnos00436.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_spawnlp .text.data.bss.idata$7.idata$5.idata$4.idata$61__spawnlp__imp___spawnlp__head_libmsvcrt_a dsnos00435.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_spawnle .text.data.bss.idata$7.idata$5.idata$4.idata$61__spawnle__imp___spawnle__head_libmsvcrt_a dsnos00434.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_spawnl .text.data.bss.idata$7.idata$5.idata$4.idata$6__spawnl&__imp___spawnl__head_libmsvcrt_adsnos00433.o/ 1341005719 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_sopen .text.data.bss.idata$7.idata$5.idata$4.idata$6__sopen%__imp___sopen__head_libmsvcrt_a dsnos00432.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_snwscanf .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__snwscanf__imp___snwscanf__head_libmsvcrt_a dsnos00431.o/ 1341005719 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_snwprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__snwprintf__imp___snwprintf__head_libmsvcrt_a dsnos00430.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_snscanf .text.data.bss.idata$7.idata$5.idata$4.idata$61__snscanf__imp___snscanf__head_libmsvcrt_a dsnos00429.o/ 1341005719 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_snprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__snprintf__imp___snprintf__head_libmsvcrt_a dsnos00428.o/ 1341005719 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_sleep .text.data.bss.idata$7.idata$5.idata$4.idata$6__sleep%__imp___sleep__head_libmsvcrt_a dsnos00427.o/ 1341005719 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_setsystime .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__setsystime__imp___setsystime__head_libmsvcrt_a dsnos00426.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_setmode .text.data.bss.idata$7.idata$5.idata$4.idata$61__setmode__imp___setmode__head_libmsvcrt_a dsnos00425.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_setmbcp .text.data.bss.idata$7.idata$5.idata$4.idata$61__setmbcp__imp___setmbcp__head_libmsvcrt_a dsnos00424.o/ 1341005719 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_setmaxstdio .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__setmaxstdio__imp___setmaxstdio__head_libmsvcrt_a dsnos00423.o/ 1341005719 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_setjmp3 .text.data.bss.idata$7.idata$5.idata$4.idata$61__setjmp3__imp___setjmp3__head_libmsvcrt_a dsnos00422.o/ 1341005719 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_setjmp .text.data.bss.idata$7.idata$5.idata$4.idata$6__setjmp&__imp___setjmp__head_libmsvcrt_adsnos00421.o/ 1341005719 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_seterrormode .text.data.bss.idata$7.idata$5.idata$4.idata$6(;__seterrormode__imp___seterrormode__head_libmsvcrt_a dsnos00420.o/ 1341005719 0 0 100666 633 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %_set_sbh_threshold .text.data.bss.idata$7.idata$5.idata$4.idata$62E__set_sbh_threshold__imp___set_sbh_threshold__head_libmsvcrt_a dsnos00419.o/ 1341005719 0 0 100666 623 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_set_error_mode .text.data.bss.idata$7.idata$5.idata$4.idata$6,?__set_error_mode__imp___set_error_mode__head_libmsvcrt_a dsnos00418.o/ 1341005719 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_set_SSE2_enable .text.data.bss.idata$7.idata$5.idata$4.idata$6.A__set_SSE2_enable__imp___set_SSE2_enable__head_libmsvcrt_a dsnos00417.o/ 1341005718 0 0 100666 635 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %_seh_longjmp_unwind .text.data.bss.idata$7.idata$5.idata$4.idata$64G__seh_longjmp_unwind__imp___seh_longjmp_unwind__head_libmsvcrt_a dsnos00416.o/ 1341005718 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_searchenv .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__searchenv__imp___searchenv__head_libmsvcrt_a dsnos00415.o/ 1341005718 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_scwprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__scwprintf__imp___scwprintf__head_libmsvcrt_a dsnos00414.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_scprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__scprintf__imp___scprintf__head_libmsvcrt_a dsnos00413.o/ 1341005718 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_scalb .text.data.bss.idata$7.idata$5.idata$4.idata$6__scalb%__imp___scalb__head_libmsvcrt_a dsnos00412.o/ 1341005718 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_safe_fprem1 .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__safe_fprem1__imp___safe_fprem1__head_libmsvcrt_a dsnos00411.o/ 1341005718 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_safe_fprem .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__safe_fprem__imp___safe_fprem__head_libmsvcrt_a dsnos00410.o/ 1341005718 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_safe_fdivr .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__safe_fdivr__imp___safe_fdivr__head_libmsvcrt_a dsnos00409.o/ 1341005718 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_safe_fdiv .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__safe_fdiv__imp___safe_fdiv__head_libmsvcrt_a dsnos00408.o/ 1341005718 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_rotr .text.data.bss.idata$7.idata$5.idata$4.idata$6__rotr$__imp___rotr__head_libmsvcrt_adsnos00407.o/ 1341005718 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_rotl .text.data.bss.idata$7.idata$5.idata$4.idata$6__rotl$__imp___rotl__head_libmsvcrt_adsnos00406.o/ 1341005718 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_rmtmp .text.data.bss.idata$7.idata$5.idata$4.idata$6__rmtmp%__imp___rmtmp__head_libmsvcrt_a dsnos00405.o/ 1341005718 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_rmdir .text.data.bss.idata$7.idata$5.idata$4.idata$6__rmdir%__imp___rmdir__head_libmsvcrt_a dsnos00404.o/ 1341005718 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_resetstkoflw .text.data.bss.idata$7.idata$5.idata$4.idata$6(;__resetstkoflw__imp___resetstkoflw__head_libmsvcrt_a dsnos00403.o/ 1341005718 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_read .text.data.bss.idata$7.idata$5.idata$4.idata$6__read$__imp___read__head_libmsvcrt_adsnos00402.o/ 1341005718 0 0 100666 555 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _pwctype.text.data.bss.idata$7.idata$5.idata$4.idata$6'__imp___pwctype__head_libmsvcrt_a dsnos00401.o/ 1341005718 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_putws .text.data.bss.idata$7.idata$5.idata$4.idata$6__putws%__imp___putws__head_libmsvcrt_a dsnos00400.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_putwch .text.data.bss.idata$7.idata$5.idata$4.idata$6__putwch&__imp___putwch__head_libmsvcrt_adsnos00399.o/ 1341005718 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_putw .text.data.bss.idata$7.idata$5.idata$4.idata$6__putw$__imp___putw__head_libmsvcrt_adsnos00398.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_putenv .text.data.bss.idata$7.idata$5.idata$4.idata$6__putenv&__imp___putenv__head_libmsvcrt_adsnos00397.o/ 1341005718 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_putch .text.data.bss.idata$7.idata$5.idata$4.idata$6__putch%__imp___putch__head_libmsvcrt_a dsnos00396.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_purecall .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__purecall__imp___purecall__head_libmsvcrt_a dsnos00395.o/ 1341005718 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_popen .text.data.bss.idata$7.idata$5.idata$4.idata$6__popen%__imp___popen__head_libmsvcrt_a dsnos00394.o/ 1341005718 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_pipe .text.data.bss.idata$7.idata$5.idata$4.idata$6__pipe$__imp___pipe__head_libmsvcrt_adsnos00393.o/ 1341005718 0 0 100666 554 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _pgmptr.text.data.bss.idata$7.idata$5.idata$4.idata$6&__imp___pgmptr__head_libmsvcrt_adsnos00392.o/ 1341005718 0 0 100666 554 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _pctype.text.data.bss.idata$7.idata$5.idata$4.idata$6&__imp___pctype__head_libmsvcrt_adsnos00391.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_pclose .text.data.bss.idata$7.idata$5.idata$4.idata$6__pclose&__imp___pclose__head_libmsvcrt_adsnos00390.o/ 1341005718 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_outpw .text.data.bss.idata$7.idata$5.idata$4.idata$6__outpw%__imp___outpw__head_libmsvcrt_a dsnos00389.o/ 1341005718 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_outpd .text.data.bss.idata$7.idata$5.idata$4.idata$6__outpd%__imp___outpd__head_libmsvcrt_a dsnos00388.o/ 1341005718 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_outp .text.data.bss.idata$7.idata$5.idata$4.idata$6__outp$__imp___outp__head_libmsvcrt_adsnos00387.o/ 1341005718 0 0 100666 553 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _osver.text.data.bss.idata$7.idata$5.idata$4.idata$6%__imp___osver__head_libmsvcrt_a dsnos00386.o/ 1341005718 0 0 100666 562 ` Lf .text 0`.data@0.bss0.idata$7,H0.idata$50R0.idata$44\0.idata$68 _osplatform.text.data.bss.idata$7.idata$5.idata$4.idata$6*__imp___osplatform__head_libmsvcrt_adsnos00385.o/ 1341005718 0 0 100666 623 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_open_osfhandle .text.data.bss.idata$7.idata$5.idata$4.idata$6,?__open_osfhandle__imp___open_osfhandle__head_libmsvcrt_a dsnos00384.o/ 1341005718 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_open .text.data.bss.idata$7.idata$5.idata$4.idata$6__open$__imp___open__head_libmsvcrt_adsnos00383.o/ 1341005718 0 0 100666 554 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _onexit.text.data.bss.idata$7.idata$5.idata$4.idata$6&__imp___onexit__head_libmsvcrt_adsnos00382.o/ 1341005718 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %~_nextafter .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__nextafter__imp___nextafter__head_libmsvcrt_a dsnos00381.o/ 1341005718 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %}_msize .text.data.bss.idata$7.idata$5.idata$4.idata$6__msize%__imp___msize__head_libmsvcrt_a dsnos00380.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %|_mktime64 .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mktime64__imp___mktime64__head_libmsvcrt_a dsnos00379.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %{_mktemp .text.data.bss.idata$7.idata$5.idata$4.idata$6__mktemp&__imp___mktemp__head_libmsvcrt_adsnos00378.o/ 1341005718 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %z_mkdir .text.data.bss.idata$7.idata$5.idata$4.idata$6__mkdir%__imp___mkdir__head_libmsvcrt_a dsnos00377.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %y_memicmp .text.data.bss.idata$7.idata$5.idata$4.idata$61__memicmp__imp___memicmp__head_libmsvcrt_a dsnos00376.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %x_memccpy .text.data.bss.idata$7.idata$5.idata$4.idata$61__memccpy__imp___memccpy__head_libmsvcrt_a dsnos00375.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %w_mbsupr .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbsupr&__imp___mbsupr__head_libmsvcrt_adsnos00374.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %v_mbstrlen .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbstrlen__imp___mbstrlen__head_libmsvcrt_a dsnos00373.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %u_mbstok .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbstok&__imp___mbstok__head_libmsvcrt_adsnos00372.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %t_mbsstr .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbsstr&__imp___mbsstr__head_libmsvcrt_adsnos00371.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %s_mbsspnp .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbsspnp__imp___mbsspnp__head_libmsvcrt_a dsnos00370.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %r_mbsspn .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbsspn&__imp___mbsspn__head_libmsvcrt_adsnos00369.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %q_mbsset .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbsset&__imp___mbsset__head_libmsvcrt_adsnos00368.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %p_mbsrev .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbsrev&__imp___mbsrev__head_libmsvcrt_adsnos00367.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %o_mbsrchr .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbsrchr__imp___mbsrchr__head_libmsvcrt_a dsnos00366.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %n_mbspbrk .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbspbrk__imp___mbspbrk__head_libmsvcrt_a dsnos00365.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %m_mbsnset .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbsnset__imp___mbsnset__head_libmsvcrt_a dsnos00364.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %l_mbsninc .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbsninc__imp___mbsninc__head_libmsvcrt_a dsnos00363.o/ 1341005718 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %k_mbsnicoll .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__mbsnicoll__imp___mbsnicoll__head_libmsvcrt_a dsnos00362.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %j_mbsnicmp .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbsnicmp__imp___mbsnicmp__head_libmsvcrt_a dsnos00361.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %i_mbsnextc .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbsnextc__imp___mbsnextc__head_libmsvcrt_a dsnos00360.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %h_mbsncpy .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbsncpy__imp___mbsncpy__head_libmsvcrt_a dsnos00359.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %g_mbsncoll .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbsncoll__imp___mbsncoll__head_libmsvcrt_a dsnos00358.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %f_mbsncmp .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbsncmp__imp___mbsncmp__head_libmsvcrt_a dsnos00357.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %e_mbsnccnt .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbsnccnt__imp___mbsnccnt__head_libmsvcrt_a dsnos00356.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %d_mbsncat .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbsncat__imp___mbsncat__head_libmsvcrt_a dsnos00355.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %c_mbsnbset .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbsnbset__imp___mbsnbset__head_libmsvcrt_a dsnos00354.o/ 1341005718 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %b_mbsnbicoll .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__mbsnbicoll__imp___mbsnbicoll__head_libmsvcrt_a dsnos00353.o/ 1341005718 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %a_mbsnbicmp .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__mbsnbicmp__imp___mbsnbicmp__head_libmsvcrt_a dsnos00352.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %`_mbsnbcpy .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbsnbcpy__imp___mbsnbcpy__head_libmsvcrt_a dsnos00351.o/ 1341005718 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %__mbsnbcoll .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__mbsnbcoll__imp___mbsnbcoll__head_libmsvcrt_a dsnos00350.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %^_mbsnbcnt .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbsnbcnt__imp___mbsnbcnt__head_libmsvcrt_a dsnos00349.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %]_mbsnbcmp .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbsnbcmp__imp___mbsnbcmp__head_libmsvcrt_a dsnos00348.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %\_mbsnbcat .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbsnbcat__imp___mbsnbcat__head_libmsvcrt_a dsnos00347.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %[_mbslwr .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbslwr&__imp___mbslwr__head_libmsvcrt_adsnos00346.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %Z_mbslen .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbslen&__imp___mbslen__head_libmsvcrt_adsnos00345.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %Y_mbsinc .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbsinc&__imp___mbsinc__head_libmsvcrt_adsnos00344.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %X_mbsicoll .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbsicoll__imp___mbsicoll__head_libmsvcrt_a dsnos00343.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %W_mbsicmp .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbsicmp__imp___mbsicmp__head_libmsvcrt_a dsnos00342.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %V_mbsdup .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbsdup&__imp___mbsdup__head_libmsvcrt_adsnos00341.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %U_mbsdec .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbsdec&__imp___mbsdec__head_libmsvcrt_adsnos00340.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %T_mbscspn .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbscspn__imp___mbscspn__head_libmsvcrt_a dsnos00339.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %S_mbscpy .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbscpy&__imp___mbscpy__head_libmsvcrt_adsnos00338.o/ 1341005718 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %R_mbscoll .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbscoll__imp___mbscoll__head_libmsvcrt_a dsnos00337.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %Q_mbscmp .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbscmp&__imp___mbscmp__head_libmsvcrt_adsnos00336.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %P_mbschr .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbschr&__imp___mbschr__head_libmsvcrt_adsnos00335.o/ 1341005718 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %O_mbscat .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbscat&__imp___mbscat__head_libmsvcrt_adsnos00334.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %N_mbsbtype .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbsbtype__imp___mbsbtype__head_libmsvcrt_a dsnos00333.o/ 1341005718 0 0 100666 555 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 M_mbctype.text.data.bss.idata$7.idata$5.idata$4.idata$6'__imp___mbctype__head_libmsvcrt_a dsnos00332.o/ 1341005718 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %L_mbctoupper .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__mbctoupper__imp___mbctoupper__head_libmsvcrt_a dsnos00331.o/ 1341005718 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %K_mbctombb .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbctombb__imp___mbctombb__head_libmsvcrt_a dsnos00330.o/ 1341005718 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %J_mbctolower .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__mbctolower__imp___mbctolower__head_libmsvcrt_a dsnos00329.o/ 1341005717 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %I_mbctokata .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__mbctokata__imp___mbctokata__head_libmsvcrt_a dsnos00328.o/ 1341005717 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %H_mbctohira .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__mbctohira__imp___mbctohira__head_libmsvcrt_a dsnos00327.o/ 1341005717 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %G_mbclen .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbclen&__imp___mbclen__head_libmsvcrt_adsnos00326.o/ 1341005717 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %F_mbcjmstojis .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__mbcjmstojis__imp___mbcjmstojis__head_libmsvcrt_a dsnos00325.o/ 1341005717 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %E_mbcjistojms .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__mbcjistojms__imp___mbcjistojms__head_libmsvcrt_a dsnos00324.o/ 1341005717 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %D_mbccpy .text.data.bss.idata$7.idata$5.idata$4.idata$6__mbccpy&__imp___mbccpy__head_libmsvcrt_adsnos00323.o/ 1341005717 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %C_mbcasemap .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__mbcasemap__imp___mbcasemap__head_libmsvcrt_a dsnos00322.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %B_mbbtype .text.data.bss.idata$7.idata$5.idata$4.idata$61__mbbtype__imp___mbbtype__head_libmsvcrt_a dsnos00321.o/ 1341005717 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %A_mbbtombc .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__mbbtombc__imp___mbbtombc__head_libmsvcrt_a dsnos00320.o/ 1341005717 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %@_makepath .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__makepath__imp___makepath__head_libmsvcrt_a dsnos00319.o/ 1341005717 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %?_ltow .text.data.bss.idata$7.idata$5.idata$4.idata$6__ltow$__imp___ltow__head_libmsvcrt_adsnos00318.o/ 1341005717 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %>_ltoa .text.data.bss.idata$7.idata$5.idata$4.idata$6__ltoa$__imp___ltoa__head_libmsvcrt_adsnos00317.o/ 1341005717 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %=_lseeki64 .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__lseeki64__imp___lseeki64__head_libmsvcrt_a dsnos00316.o/ 1341005717 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %<_lseek .text.data.bss.idata$7.idata$5.idata$4.idata$6__lseek%__imp___lseek__head_libmsvcrt_a dsnos00315.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %;_lsearch .text.data.bss.idata$7.idata$5.idata$4.idata$61__lsearch__imp___lsearch__head_libmsvcrt_a dsnos00314.o/ 1341005717 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %:_lrotr .text.data.bss.idata$7.idata$5.idata$4.idata$6__lrotr%__imp___lrotr__head_libmsvcrt_a dsnos00313.o/ 1341005717 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %9_lrotl .text.data.bss.idata$7.idata$5.idata$4.idata$6__lrotl%__imp___lrotl__head_libmsvcrt_a dsnos00312.o/ 1341005717 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %8_longjmpex .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__longjmpex__imp___longjmpex__head_libmsvcrt_a dsnos00311.o/ 1341005717 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %7_logb .text.data.bss.idata$7.idata$5.idata$4.idata$6__logb$__imp___logb__head_libmsvcrt_adsnos00310.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %6_locking .text.data.bss.idata$7.idata$5.idata$4.idata$61__locking__imp___locking__head_libmsvcrt_a dsnos00309.o/ 1341005717 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %5_lock .text.data.bss.idata$7.idata$5.idata$4.idata$6__lock$__imp___lock__head_libmsvcrt_adsnos00308.o/ 1341005717 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %4_localtime64 .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__localtime64__imp___localtime64__head_libmsvcrt_a dsnos00307.o/ 1341005717 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %3_local_unwind2 .text.data.bss.idata$7.idata$5.idata$4.idata$6*=__local_unwind2__imp___local_unwind2__head_libmsvcrt_a dsnos00306.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %2_loaddll .text.data.bss.idata$7.idata$5.idata$4.idata$61__loaddll__imp___loaddll__head_libmsvcrt_a dsnos00305.o/ 1341005717 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %1_lfind .text.data.bss.idata$7.idata$5.idata$4.idata$6__lfind%__imp___lfind__head_libmsvcrt_a dsnos00304.o/ 1341005717 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %0_kbhit .text.data.bss.idata$7.idata$5.idata$4.idata$6__kbhit%__imp___kbhit__head_libmsvcrt_a dsnos00303.o/ 1341005717 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %/_jn .text.data.bss.idata$7.idata$5.idata$4.idata$6__jn"__imp___jn__head_libmsvcrt_adsnos00302.o/ 1341005717 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %._j1 .text.data.bss.idata$7.idata$5.idata$4.idata$6__j1"__imp___j1__head_libmsvcrt_adsnos00301.o/ 1341005717 0 0 100666 582 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %-_j0 .text.data.bss.idata$7.idata$5.idata$4.idata$6__j0"__imp___j0__head_libmsvcrt_adsnos00300.o/ 1341005717 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %,_itow .text.data.bss.idata$7.idata$5.idata$4.idata$6__itow$__imp___itow__head_libmsvcrt_adsnos00299.o/ 1341005717 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %+_itoa .text.data.bss.idata$7.idata$5.idata$4.idata$6__itoa$__imp___itoa__head_libmsvcrt_adsnos00298.o/ 1341005717 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %*_isnan .text.data.bss.idata$7.idata$5.idata$4.idata$6__isnan%__imp___isnan__head_libmsvcrt_a dsnos00297.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %)_ismbstrail .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbstrail__imp___ismbstrail__head_libmsvcrt_a dsnos00296.o/ 1341005717 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %(_ismbslead .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__ismbslead__imp___ismbslead__head_libmsvcrt_a dsnos00295.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %'_ismbcupper .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbcupper__imp___ismbcupper__head_libmsvcrt_a dsnos00294.o/ 1341005717 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %&_ismbcsymbol .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__ismbcsymbol__imp___ismbcsymbol__head_libmsvcrt_a dsnos00293.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %%_ismbcspace .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbcspace__imp___ismbcspace__head_libmsvcrt_a dsnos00292.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %$_ismbcpunct .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbcpunct__imp___ismbcpunct__head_libmsvcrt_a dsnos00291.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %#_ismbcprint .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbcprint__imp___ismbcprint__head_libmsvcrt_a dsnos00290.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %"_ismbclower .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbclower__imp___ismbclower__head_libmsvcrt_a dsnos00289.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %!_ismbclegal .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbclegal__imp___ismbclegal__head_libmsvcrt_a dsnos00288.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _ismbcl2 .text.data.bss.idata$7.idata$5.idata$4.idata$61__ismbcl2__imp___ismbcl2__head_libmsvcrt_a dsnos00287.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_ismbcl1 .text.data.bss.idata$7.idata$5.idata$4.idata$61__ismbcl1__imp___ismbcl1__head_libmsvcrt_a dsnos00286.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_ismbcl0 .text.data.bss.idata$7.idata$5.idata$4.idata$61__ismbcl0__imp___ismbcl0__head_libmsvcrt_a dsnos00285.o/ 1341005717 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbckata .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__ismbckata__imp___ismbckata__head_libmsvcrt_a dsnos00284.o/ 1341005717 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbchira .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__ismbchira__imp___ismbchira__head_libmsvcrt_a dsnos00283.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbcgraph .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbcgraph__imp___ismbcgraph__head_libmsvcrt_a dsnos00282.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbcdigit .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbcdigit__imp___ismbcdigit__head_libmsvcrt_a dsnos00281.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbcalpha .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbcalpha__imp___ismbcalpha__head_libmsvcrt_a dsnos00280.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbcalnum .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbcalnum__imp___ismbcalnum__head_libmsvcrt_a dsnos00279.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbbtrail .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbbtrail__imp___ismbbtrail__head_libmsvcrt_a dsnos00278.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbbpunct .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbbpunct__imp___ismbbpunct__head_libmsvcrt_a dsnos00277.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbbprint .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbbprint__imp___ismbbprint__head_libmsvcrt_a dsnos00276.o/ 1341005717 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbblead .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__ismbblead__imp___ismbblead__head_libmsvcrt_a dsnos00275.o/ 1341005717 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbbkpunct .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__ismbbkpunct__imp___ismbbkpunct__head_libmsvcrt_a dsnos00274.o/ 1341005717 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbbkprint .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__ismbbkprint__imp___ismbbkprint__head_libmsvcrt_a dsnos00273.o/ 1341005717 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbbkana .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__ismbbkana__imp___ismbbkana__head_libmsvcrt_a dsnos00272.o/ 1341005717 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbbkalnum .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__ismbbkalnum__imp___ismbbkalnum__head_libmsvcrt_a dsnos00271.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbbgraph .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbbgraph__imp___ismbbgraph__head_libmsvcrt_a dsnos00270.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_ismbbalpha .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbbalpha__imp___ismbbalpha__head_libmsvcrt_a dsnos00269.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ % _ismbbalnum .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__ismbbalnum__imp___ismbbalnum__head_libmsvcrt_a dsnos00268.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _isctype .text.data.bss.idata$7.idata$5.idata$4.idata$61__isctype__imp___isctype__head_libmsvcrt_a dsnos00267.o/ 1341005717 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _isatty .text.data.bss.idata$7.idata$5.idata$4.idata$6__isatty&__imp___isatty__head_libmsvcrt_adsnos00266.o/ 1341005717 0 0 100666 547 ` L^ .text 0`.data@0.bss0.idata$7,@0.idata$50J0.idata$44T0.idata$68 _iob.text.data.bss.idata$7.idata$5.idata$4.idata$6#__imp___iob__head_libmsvcrt_a dsnos00265.o/ 1341005717 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ % _inpw .text.data.bss.idata$7.idata$5.idata$4.idata$6__inpw$__imp___inpw__head_libmsvcrt_adsnos00264.o/ 1341005717 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_inpd .text.data.bss.idata$7.idata$5.idata$4.idata$6__inpd$__imp___inpd__head_libmsvcrt_adsnos00263.o/ 1341005717 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_inp .text.data.bss.idata$7.idata$5.idata$4.idata$6__inp#__imp___inp__head_libmsvcrt_a dsnos00262.o/ 1341005717 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_initterm .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__initterm__imp___initterm__head_libmsvcrt_a dsnos00261.o/ 1341005717 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_i64tow .text.data.bss.idata$7.idata$5.idata$4.idata$6__i64tow&__imp___i64tow__head_libmsvcrt_adsnos00260.o/ 1341005717 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_i64toa .text.data.bss.idata$7.idata$5.idata$4.idata$6__i64toa&__imp___i64toa__head_libmsvcrt_adsnos00259.o/ 1341005717 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_hypot .text.data.bss.idata$7.idata$5.idata$4.idata$6__hypot%__imp___hypot__head_libmsvcrt_a dsnos00258.o/ 1341005717 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_heapwalk .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__heapwalk__imp___heapwalk__head_libmsvcrt_a dsnos00257.o/ 1341005717 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_heapused .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__heapused__imp___heapused__head_libmsvcrt_a dsnos00256.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_heapset .text.data.bss.idata$7.idata$5.idata$4.idata$61__heapset__imp___heapset__head_libmsvcrt_a dsnos00255.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_heapmin .text.data.bss.idata$7.idata$5.idata$4.idata$61__heapmin__imp___heapmin__head_libmsvcrt_a dsnos00254.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_heapchk .text.data.bss.idata$7.idata$5.idata$4.idata$61__heapchk__imp___heapchk__head_libmsvcrt_a dsnos00253.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_heapadd .text.data.bss.idata$7.idata$5.idata$4.idata$61__heapadd__imp___heapadd__head_libmsvcrt_a dsnos00252.o/ 1341005717 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_gmtime64 .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__gmtime64__imp___gmtime64__head_libmsvcrt_a dsnos00251.o/ 1341005717 0 0 100666 623 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_global_unwind2 .text.data.bss.idata$7.idata$5.idata$4.idata$6,?__global_unwind2__imp___global_unwind2__head_libmsvcrt_a dsnos00250.o/ 1341005717 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_getws .text.data.bss.idata$7.idata$5.idata$4.idata$6__getws%__imp___getws__head_libmsvcrt_a dsnos00249.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_getwche .text.data.bss.idata$7.idata$5.idata$4.idata$61__getwche__imp___getwche__head_libmsvcrt_a dsnos00248.o/ 1341005717 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_getwch .text.data.bss.idata$7.idata$5.idata$4.idata$6__getwch&__imp___getwch__head_libmsvcrt_adsnos00247.o/ 1341005717 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_getw .text.data.bss.idata$7.idata$5.idata$4.idata$6__getw$__imp___getw__head_libmsvcrt_adsnos00246.o/ 1341005717 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_getsystime .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__getsystime__imp___getsystime__head_libmsvcrt_a dsnos00245.o/ 1341005717 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_getpid .text.data.bss.idata$7.idata$5.idata$4.idata$6__getpid&__imp___getpid__head_libmsvcrt_adsnos00244.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_getmbcp .text.data.bss.idata$7.idata$5.idata$4.idata$61__getmbcp__imp___getmbcp__head_libmsvcrt_a dsnos00243.o/ 1341005717 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_getmaxstdio .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__getmaxstdio__imp___getmaxstdio__head_libmsvcrt_a dsnos00242.o/ 1341005717 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_getdrives .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__getdrives__imp___getdrives__head_libmsvcrt_a dsnos00241.o/ 1341005717 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_getdrive .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__getdrive__imp___getdrive__head_libmsvcrt_a dsnos00240.o/ 1341005717 0 0 100666 623 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_getdllprocaddr .text.data.bss.idata$7.idata$5.idata$4.idata$6,?__getdllprocaddr__imp___getdllprocaddr__head_libmsvcrt_a dsnos00239.o/ 1341005717 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_getdiskfree .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__getdiskfree__imp___getdiskfree__head_libmsvcrt_a dsnos00238.o/ 1341005717 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_getdcwd .text.data.bss.idata$7.idata$5.idata$4.idata$61__getdcwd__imp___getdcwd__head_libmsvcrt_a dsnos00237.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_getcwd .text.data.bss.idata$7.idata$5.idata$4.idata$6__getcwd&__imp___getcwd__head_libmsvcrt_adsnos00236.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_getche .text.data.bss.idata$7.idata$5.idata$4.idata$6__getche&__imp___getche__head_libmsvcrt_adsnos00235.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_getch .text.data.bss.idata$7.idata$5.idata$4.idata$6__getch%__imp___getch__head_libmsvcrt_a dsnos00234.o/ 1341005716 0 0 100666 633 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %_get_sbh_threshold .text.data.bss.idata$7.idata$5.idata$4.idata$62E__get_sbh_threshold__imp___get_sbh_threshold__head_libmsvcrt_a dsnos00233.o/ 1341005716 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_get_osfhandle .text.data.bss.idata$7.idata$5.idata$4.idata$6*=__get_osfhandle__imp___get_osfhandle__head_libmsvcrt_a dsnos00232.o/ 1341005716 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_get_heap_handle .text.data.bss.idata$7.idata$5.idata$4.idata$6.A__get_heap_handle__imp___get_heap_handle__head_libmsvcrt_a dsnos00231.o/ 1341005716 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_gcvt .text.data.bss.idata$7.idata$5.idata$4.idata$6__gcvt$__imp___gcvt__head_libmsvcrt_adsnos00230.o/ 1341005716 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_futime64 .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__futime64__imp___futime64__head_libmsvcrt_a dsnos00229.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_futime .text.data.bss.idata$7.idata$5.idata$4.idata$6__futime&__imp___futime__head_libmsvcrt_adsnos00228.o/ 1341005716 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_fullpath .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__fullpath__imp___fullpath__head_libmsvcrt_a dsnos00227.o/ 1341005716 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_ftol .text.data.bss.idata$7.idata$5.idata$4.idata$6__ftol$__imp___ftol__head_libmsvcrt_adsnos00226.o/ 1341005716 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_ftime64 .text.data.bss.idata$7.idata$5.idata$4.idata$61__ftime64__imp___ftime64__head_libmsvcrt_a dsnos00225.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_ftime .text.data.bss.idata$7.idata$5.idata$4.idata$6__ftime%__imp___ftime__head_libmsvcrt_a dsnos00224.o/ 1341005716 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_fstati64 .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__fstati64__imp___fstati64__head_libmsvcrt_a dsnos00223.o/ 1341005716 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_fstat64 .text.data.bss.idata$7.idata$5.idata$4.idata$61__fstat64__imp___fstat64__head_libmsvcrt_a dsnos00222.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_fstat .text.data.bss.idata$7.idata$5.idata$4.idata$6__fstat%__imp___fstat__head_libmsvcrt_a dsnos00221.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_fsopen .text.data.bss.idata$7.idata$5.idata$4.idata$6__fsopen&__imp___fsopen__head_libmsvcrt_adsnos00220.o/ 1341005716 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_fputwchar .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__fputwchar__imp___fputwchar__head_libmsvcrt_a dsnos00219.o/ 1341005716 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_fputchar .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__fputchar__imp___fputchar__head_libmsvcrt_a dsnos00218.o/ 1341005716 0 0 100666 555 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _fpreset.text.data.bss.idata$7.idata$5.idata$4.idata$6'__imp___fpreset__head_libmsvcrt_a dsnos00217.o/ 1341005716 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_fpieee_flt .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__fpieee_flt__imp___fpieee_flt__head_libmsvcrt_a dsnos00216.o/ 1341005716 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_fpclass .text.data.bss.idata$7.idata$5.idata$4.idata$61__fpclass__imp___fpclass__head_libmsvcrt_a dsnos00215.o/ 1341005716 0 0 100666 553 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _fmode.text.data.bss.idata$7.idata$5.idata$4.idata$6%__imp___fmode__head_libmsvcrt_a dsnos00214.o/ 1341005716 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_flushall .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__flushall__imp___flushall__head_libmsvcrt_a dsnos00213.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_flsbuf .text.data.bss.idata$7.idata$5.idata$4.idata$6__flsbuf&__imp___flsbuf__head_libmsvcrt_adsnos00212.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_finite .text.data.bss.idata$7.idata$5.idata$4.idata$6__finite&__imp___finite__head_libmsvcrt_adsnos00211.o/ 1341005716 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_findnexti64 .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__findnexti64__imp___findnexti64__head_libmsvcrt_a dsnos00210.o/ 1341005716 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_findnext64 .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__findnext64__imp___findnext64__head_libmsvcrt_a dsnos00209.o/ 1341005716 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_findnext .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__findnext__imp___findnext__head_libmsvcrt_a dsnos00208.o/ 1341005716 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_findfirsti64 .text.data.bss.idata$7.idata$5.idata$4.idata$6(;__findfirsti64__imp___findfirsti64__head_libmsvcrt_a dsnos00207.o/ 1341005716 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_findfirst64 .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__findfirst64__imp___findfirst64__head_libmsvcrt_a dsnos00206.o/ 1341005716 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_findfirst .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__findfirst__imp___findfirst__head_libmsvcrt_a dsnos00205.o/ 1341005716 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_findclose .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__findclose__imp___findclose__head_libmsvcrt_a dsnos00204.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_fileno .text.data.bss.idata$7.idata$5.idata$4.idata$6__fileno&__imp___fileno__head_libmsvcrt_adsnos00203.o/ 1341005716 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_filelengthi64 .text.data.bss.idata$7.idata$5.idata$4.idata$6*=__filelengthi64__imp___filelengthi64__head_libmsvcrt_a dsnos00202.o/ 1341005716 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_filelength .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__filelength__imp___filelength__head_libmsvcrt_a dsnos00201.o/ 1341005716 0 0 100666 556 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _fileinfo.text.data.bss.idata$7.idata$5.idata$4.idata$6(__imp___fileinfo__head_libmsvcrt_adsnos00200.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_filbuf .text.data.bss.idata$7.idata$5.idata$4.idata$6__filbuf&__imp___filbuf__head_libmsvcrt_adsnos00199.o/ 1341005716 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_fgetwchar .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__fgetwchar__imp___fgetwchar__head_libmsvcrt_a dsnos00198.o/ 1341005716 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_fgetchar .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__fgetchar__imp___fgetchar__head_libmsvcrt_a dsnos00197.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_fdopen .text.data.bss.idata$7.idata$5.idata$4.idata$6__fdopen&__imp___fdopen__head_libmsvcrt_adsnos00196.o/ 1341005716 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_fcvt .text.data.bss.idata$7.idata$5.idata$4.idata$6__fcvt$__imp___fcvt__head_libmsvcrt_adsnos00195.o/ 1341005716 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_fcloseall .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__fcloseall__imp___fcloseall__head_libmsvcrt_a dsnos00194.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_expand .text.data.bss.idata$7.idata$5.idata$4.idata$6__expand&__imp___expand__head_libmsvcrt_adsnos00193.o/ 1341005716 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_exit .text.data.bss.idata$7.idata$5.idata$4.idata$6__exit$__imp___exit__head_libmsvcrt_adsnos00192.o/ 1341005716 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_execvpe .text.data.bss.idata$7.idata$5.idata$4.idata$61__execvpe__imp___execvpe__head_libmsvcrt_a dsnos00191.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_execvp .text.data.bss.idata$7.idata$5.idata$4.idata$6__execvp&__imp___execvp__head_libmsvcrt_adsnos00190.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_execve .text.data.bss.idata$7.idata$5.idata$4.idata$6__execve&__imp___execve__head_libmsvcrt_adsnos00189.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_execv .text.data.bss.idata$7.idata$5.idata$4.idata$6__execv%__imp___execv__head_libmsvcrt_a dsnos00188.o/ 1341005716 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_execlpe .text.data.bss.idata$7.idata$5.idata$4.idata$61__execlpe__imp___execlpe__head_libmsvcrt_a dsnos00187.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_execlp .text.data.bss.idata$7.idata$5.idata$4.idata$6__execlp&__imp___execlp__head_libmsvcrt_adsnos00186.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_execle .text.data.bss.idata$7.idata$5.idata$4.idata$6__execle&__imp___execle__head_libmsvcrt_adsnos00185.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_execl .text.data.bss.idata$7.idata$5.idata$4.idata$6__execl%__imp___execl__head_libmsvcrt_a dsnos00184.o/ 1341005716 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_except_handler3 .text.data.bss.idata$7.idata$5.idata$4.idata$6.A__except_handler3__imp___except_handler3__head_libmsvcrt_a dsnos00183.o/ 1341005716 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_except_handler2 .text.data.bss.idata$7.idata$5.idata$4.idata$6.A__except_handler2__imp___except_handler2__head_libmsvcrt_a dsnos00182.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_errno .text.data.bss.idata$7.idata$5.idata$4.idata$6__errno%__imp___errno__head_libmsvcrt_a dsnos00181.o/ 1341005716 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_eof .text.data.bss.idata$7.idata$5.idata$4.idata$6__eof#__imp___eof__head_libmsvcrt_a dsnos00180.o/ 1341005716 0 0 100666 555 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _environ.text.data.bss.idata$7.idata$5.idata$4.idata$6'__imp___environ__head_libmsvcrt_a dsnos00179.o/ 1341005716 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_endthreadex .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__endthreadex__imp___endthreadex__head_libmsvcrt_a dsnos00178.o/ 1341005716 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_endthread .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__endthread__imp___endthread__head_libmsvcrt_a dsnos00177.o/ 1341005716 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_ecvt .text.data.bss.idata$7.idata$5.idata$4.idata$6__ecvt$__imp___ecvt__head_libmsvcrt_adsnos00176.o/ 1341005716 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_dup2 .text.data.bss.idata$7.idata$5.idata$4.idata$6__dup2$__imp___dup2__head_libmsvcrt_adsnos00175.o/ 1341005716 0 0 100666 583 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_dup .text.data.bss.idata$7.idata$5.idata$4.idata$6__dup#__imp___dup__head_libmsvcrt_a dsnos00174.o/ 1341005716 0 0 100666 555 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _dstbias.text.data.bss.idata$7.idata$5.idata$4.idata$6'__imp___dstbias__head_libmsvcrt_a dsnos00173.o/ 1341005716 0 0 100666 556 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _daylight.text.data.bss.idata$7.idata$5.idata$4.idata$6(__imp___daylight__head_libmsvcrt_adsnos00172.o/ 1341005716 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_cwscanf .text.data.bss.idata$7.idata$5.idata$4.idata$61__cwscanf__imp___cwscanf__head_libmsvcrt_a dsnos00171.o/ 1341005716 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_cwprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__cwprintf__imp___cwprintf__head_libmsvcrt_a dsnos00170.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_cwait .text.data.bss.idata$7.idata$5.idata$4.idata$6__cwait%__imp___cwait__head_libmsvcrt_a dsnos00169.o/ 1341005716 0 0 100666 553 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _ctype.text.data.bss.idata$7.idata$5.idata$4.idata$6%__imp___ctype__head_libmsvcrt_a dsnos00168.o/ 1341005716 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_ctime64 .text.data.bss.idata$7.idata$5.idata$4.idata$61__ctime64__imp___ctime64__head_libmsvcrt_a dsnos00167.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_cscanf .text.data.bss.idata$7.idata$5.idata$4.idata$6__cscanf&__imp___cscanf__head_libmsvcrt_adsnos00166.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_creat .text.data.bss.idata$7.idata$5.idata$4.idata$6__creat%__imp___creat__head_libmsvcrt_a dsnos00165.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_cputws .text.data.bss.idata$7.idata$5.idata$4.idata$6__cputws&__imp___cputws__head_libmsvcrt_adsnos00164.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_cputs .text.data.bss.idata$7.idata$5.idata$4.idata$6__cputs%__imp___cputs__head_libmsvcrt_a dsnos00163.o/ 1341005716 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_cprintf .text.data.bss.idata$7.idata$5.idata$4.idata$61__cprintf__imp___cprintf__head_libmsvcrt_a dsnos00162.o/ 1341005716 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_copysign .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__copysign__imp___copysign__head_libmsvcrt_a dsnos00161.o/ 1341005716 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_controlfp .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__controlfp__imp___controlfp__head_libmsvcrt_a dsnos00160.o/ 1341005716 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_control87 .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__control87__imp___control87__head_libmsvcrt_a dsnos00159.o/ 1341005716 0 0 100666 555 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 _commode.text.data.bss.idata$7.idata$5.idata$4.idata$6'__imp___commode__head_libmsvcrt_a dsnos00158.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_commit .text.data.bss.idata$7.idata$5.idata$4.idata$6__commit&__imp___commit__head_libmsvcrt_adsnos00157.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_close .text.data.bss.idata$7.idata$5.idata$4.idata$6__close%__imp___close__head_libmsvcrt_a dsnos00156.o/ 1341005716 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_clearfp .text.data.bss.idata$7.idata$5.idata$4.idata$61__clearfp__imp___clearfp__head_libmsvcrt_a dsnos00155.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_chsize .text.data.bss.idata$7.idata$5.idata$4.idata$6__chsize&__imp___chsize__head_libmsvcrt_adsnos00154.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_chmod .text.data.bss.idata$7.idata$5.idata$4.idata$6__chmod%__imp___chmod__head_libmsvcrt_a dsnos00153.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_chkesp .text.data.bss.idata$7.idata$5.idata$4.idata$6__chkesp&__imp___chkesp__head_libmsvcrt_adsnos00152.o/ 1341005716 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_chgsign .text.data.bss.idata$7.idata$5.idata$4.idata$61__chgsign__imp___chgsign__head_libmsvcrt_a dsnos00151.o/ 1341005716 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_chdrive .text.data.bss.idata$7.idata$5.idata$4.idata$61__chdrive__imp___chdrive__head_libmsvcrt_a dsnos00150.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_chdir .text.data.bss.idata$7.idata$5.idata$4.idata$6__chdir%__imp___chdir__head_libmsvcrt_a dsnos00149.o/ 1341005716 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_cgetws .text.data.bss.idata$7.idata$5.idata$4.idata$6__cgetws&__imp___cgetws__head_libmsvcrt_adsnos00148.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_cgets .text.data.bss.idata$7.idata$5.idata$4.idata$6__cgets%__imp___cgets__head_libmsvcrt_a dsnos00147.o/ 1341005716 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_cexit .text.data.bss.idata$7.idata$5.idata$4.idata$6__cexit%__imp___cexit__head_libmsvcrt_a dsnos00146.o/ 1341005715 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_callnewh .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__callnewh__imp___callnewh__head_libmsvcrt_a dsnos00145.o/ 1341005715 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_cabs .text.data.bss.idata$7.idata$5.idata$4.idata$6__cabs$__imp___cabs__head_libmsvcrt_adsnos00144.o/ 1341005715 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_c_exit .text.data.bss.idata$7.idata$5.idata$4.idata$6__c_exit&__imp___c_exit__head_libmsvcrt_adsnos00143.o/ 1341005715 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_beginthreadex .text.data.bss.idata$7.idata$5.idata$4.idata$6*=__beginthreadex__imp___beginthreadex__head_libmsvcrt_a dsnos00142.o/ 1341005715 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_beginthread .text.data.bss.idata$7.idata$5.idata$4.idata$6&9__beginthread__imp___beginthread__head_libmsvcrt_a dsnos00141.o/ 1341005715 0 0 100666 584 ` Lp .text,H 0`.data@0.bss0.idata$74R0.idata$58\0.idata$4<f0.idata$6@ %_beep .text.data.bss.idata$7.idata$5.idata$4.idata$6__beep$__imp___beep__head_libmsvcrt_adsnos00140.o/ 1341005715 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_atoldbl .text.data.bss.idata$7.idata$5.idata$4.idata$61__atoldbl__imp___atoldbl__head_libmsvcrt_a dsnos00139.o/ 1341005715 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_atoi64 .text.data.bss.idata$7.idata$5.idata$4.idata$6__atoi64&__imp___atoi64__head_libmsvcrt_adsnos00138.o/ 1341005715 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_atodbl .text.data.bss.idata$7.idata$5.idata$4.idata$6__atodbl&__imp___atodbl__head_libmsvcrt_adsnos00137.o/ 1341005715 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_assert .text.data.bss.idata$7.idata$5.idata$4.idata$6__assert&__imp___assert__head_libmsvcrt_adsnos00136.o/ 1341005715 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_amsg_exit .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__amsg_exit__imp___amsg_exit__head_libmsvcrt_a dsnos00135.o/ 1341005715 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_aligned_realloc .text.data.bss.idata$7.idata$5.idata$4.idata$6.A__aligned_realloc__imp___aligned_realloc__head_libmsvcrt_a dsnos00134.o/ 1341005715 0 0 100666 647 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %_aligned_offset_realloc .text.data.bss.idata$7.idata$5.idata$4.idata$6<O__aligned_offset_realloc__imp___aligned_offset_realloc__head_libmsvcrt_a dsnos00133.o/ 1341005715 0 0 100666 645 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %_aligned_offset_malloc .text.data.bss.idata$7.idata$5.idata$4.idata$6:M__aligned_offset_malloc__imp___aligned_offset_malloc__head_libmsvcrt_a dsnos00132.o/ 1341005715 0 0 100666 623 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %_aligned_malloc .text.data.bss.idata$7.idata$5.idata$4.idata$6,?__aligned_malloc__imp___aligned_malloc__head_libmsvcrt_a dsnos00131.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_aligned_free .text.data.bss.idata$7.idata$5.idata$4.idata$6(;__aligned_free__imp___aligned_free__head_libmsvcrt_a dsnos00130.o/ 1341005715 0 0 100666 561 ` Lf .text 0`.data@0.bss0.idata$7,H0.idata$50R0.idata$44\0.idata$68 _aexit_rtn.text.data.bss.idata$7.idata$5.idata$4.idata$6)__imp___aexit_rtn__head_libmsvcrt_a dsnos00129.o/ 1341005715 0 0 100666 563 ` Lf .text 0`.data@0.bss0.idata$7,H0.idata$50R0.idata$44\0.idata$68 _adjust_fdiv.text.data.bss.idata$7.idata$5.idata$4.idata$6+__imp___adjust_fdiv__head_libmsvcrt_a dsnos00128.o/ 1341005715 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_adj_fptan .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__adj_fptan__imp___adj_fptan__head_libmsvcrt_a dsnos00127.o/ 1341005715 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_adj_fprem1 .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__adj_fprem1__imp___adj_fprem1__head_libmsvcrt_a dsnos00126.o/ 1341005715 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %~_adj_fprem .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__adj_fprem__imp___adj_fprem__head_libmsvcrt_a dsnos00125.o/ 1341005715 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %}_adj_fpatan .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__adj_fpatan__imp___adj_fpatan__head_libmsvcrt_a dsnos00124.o/ 1341005715 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %|_adj_fdivr_m64 .text.data.bss.idata$7.idata$5.idata$4.idata$6*=__adj_fdivr_m64__imp___adj_fdivr_m64__head_libmsvcrt_a dsnos00123.o/ 1341005715 0 0 100666 623 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %{_adj_fdivr_m32i .text.data.bss.idata$7.idata$5.idata$4.idata$6,?__adj_fdivr_m32i__imp___adj_fdivr_m32i__head_libmsvcrt_a dsnos00122.o/ 1341005715 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %z_adj_fdivr_m32 .text.data.bss.idata$7.idata$5.idata$4.idata$6*=__adj_fdivr_m32__imp___adj_fdivr_m32__head_libmsvcrt_a dsnos00121.o/ 1341005715 0 0 100666 623 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %y_adj_fdivr_m16i .text.data.bss.idata$7.idata$5.idata$4.idata$6,?__adj_fdivr_m16i__imp___adj_fdivr_m16i__head_libmsvcrt_a dsnos00120.o/ 1341005715 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %x_adj_fdiv_r .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__adj_fdiv_r__imp___adj_fdiv_r__head_libmsvcrt_a dsnos00119.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %w_adj_fdiv_m64 .text.data.bss.idata$7.idata$5.idata$4.idata$6(;__adj_fdiv_m64__imp___adj_fdiv_m64__head_libmsvcrt_a dsnos00118.o/ 1341005715 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %v_adj_fdiv_m32i .text.data.bss.idata$7.idata$5.idata$4.idata$6*=__adj_fdiv_m32i__imp___adj_fdiv_m32i__head_libmsvcrt_a dsnos00117.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %u_adj_fdiv_m32 .text.data.bss.idata$7.idata$5.idata$4.idata$6(;__adj_fdiv_m32__imp___adj_fdiv_m32__head_libmsvcrt_a dsnos00116.o/ 1341005715 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %t_adj_fdiv_m16i .text.data.bss.idata$7.idata$5.idata$4.idata$6*=__adj_fdiv_m16i__imp___adj_fdiv_m16i__head_libmsvcrt_a dsnos00115.o/ 1341005715 0 0 100666 554 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 s_acmdln.text.data.bss.idata$7.idata$5.idata$4.idata$6&__imp___acmdln__head_libmsvcrt_adsnos00114.o/ 1341005715 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %r_access .text.data.bss.idata$7.idata$5.idata$4.idata$6__access&__imp___access__head_libmsvcrt_adsnos00113.o/ 1341005715 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %q_abnormal_termination .text.data.bss.idata$7.idata$5.idata$4.idata$68K__abnormal_termination__imp___abnormal_termination__head_libmsvcrt_a dsnos00112.o/ 1341005715 0 0 100666 561 ` Lf .text 0`.data@0.bss0.idata$7,H0.idata$50R0.idata$44\0.idata$68 p__winitenv.text.data.bss.idata$7.idata$5.idata$4.idata$6)__imp____winitenv__head_libmsvcrt_a dsnos00111.o/ 1341005715 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %o__wgetmainargs .text.data.bss.idata$7.idata$5.idata$4.idata$6*=___wgetmainargs__imp____wgetmainargs__head_libmsvcrt_a dsnos00110.o/ 1341005715 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %n__wcserror .text.data.bss.idata$7.idata$5.idata$4.idata$6"5___wcserror__imp____wcserror__head_libmsvcrt_a dsnos00109.o/ 1341005715 0 0 100666 554 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 m__wargv.text.data.bss.idata$7.idata$5.idata$4.idata$6&__imp____wargv__head_libmsvcrt_adsnos00108.o/ 1341005715 0 0 100666 588 ` Lr .text 0`.data@0.bss0.idata$7,T0.idata$50^0.idata$44h0.idata$68 l__unguarded_readlc_active.text.data.bss.idata$7.idata$5.idata$4.idata$6%8__imp____unguarded_readlc_active__head_libmsvcrt_adsnos00107.o/ 1341005715 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %k__uncaught_exception .text.data.bss.idata$7.idata$5.idata$4.idata$66I___uncaught_exception__imp____uncaught_exception__head_libmsvcrt_a dsnos00106.o/ 1341005715 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %j__unDNameEx .text.data.bss.idata$7.idata$5.idata$4.idata$6$7___unDNameEx__imp____unDNameEx__head_libmsvcrt_a dsnos00105.o/ 1341005715 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %i__unDName .text.data.bss.idata$7.idata$5.idata$4.idata$6 3___unDName__imp____unDName__head_libmsvcrt_a dsnos00104.o/ 1341005715 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %h__toascii .text.data.bss.idata$7.idata$5.idata$4.idata$6 3___toascii__imp____toascii__head_libmsvcrt_a dsnos00103.o/ 1341005715 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %g__threadid .text.data.bss.idata$7.idata$5.idata$4.idata$6"5___threadid__imp____threadid__head_libmsvcrt_a dsnos00102.o/ 1341005715 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %f__threadhandle .text.data.bss.idata$7.idata$5.idata$4.idata$6*=___threadhandle__imp____threadhandle__head_libmsvcrt_a dsnos00101.o/ 1341005715 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %e__setusermatherr .text.data.bss.idata$7.idata$5.idata$4.idata$6.A___setusermatherr__imp____setusermatherr__head_libmsvcrt_a dsnos00100.o/ 1341005715 0 0 100666 569 ` Lj .text 0`.data@0.bss0.idata$7,L0.idata$50V0.idata$44`0.idata$68 d__setlc_active.text.data.bss.idata$7.idata$5.idata$4.idata$6-__imp____setlc_active__head_libmsvcrt_a dsnos00099.o/ 1341005715 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %c__set_app_type .text.data.bss.idata$7.idata$5.idata$4.idata$6*=___set_app_type__imp____set_app_type__head_libmsvcrt_a dsnos00098.o/ 1341005715 0 0 100666 623 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %b__pxcptinfoptrs .text.data.bss.idata$7.idata$5.idata$4.idata$6,?___pxcptinfoptrs__imp____pxcptinfoptrs__head_libmsvcrt_a dsnos00097.o/ 1341005715 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %a__pwctype_func .text.data.bss.idata$7.idata$5.idata$4.idata$6*=___pwctype_func__imp____pwctype_func__head_libmsvcrt_a dsnos00096.o/ 1341005715 0 0 100666 556 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 `__pioinfo.text.data.bss.idata$7.idata$5.idata$4.idata$6(__imp____pioinfo__head_libmsvcrt_adsnos00095.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %___pctype_func .text.data.bss.idata$7.idata$5.idata$4.idata$6(;___pctype_func__imp____pctype_func__head_libmsvcrt_a dsnos00094.o/ 1341005715 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %^__p__wpgmptr .text.data.bss.idata$7.idata$5.idata$4.idata$6&9___p__wpgmptr__imp____p__wpgmptr__head_libmsvcrt_a dsnos00093.o/ 1341005715 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %]__p__winver .text.data.bss.idata$7.idata$5.idata$4.idata$6$7___p__winver__imp____p__winver__head_libmsvcrt_a dsnos00092.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %\__p__winminor .text.data.bss.idata$7.idata$5.idata$4.idata$6(;___p__winminor__imp____p__winminor__head_libmsvcrt_a dsnos00091.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %[__p__winmajor .text.data.bss.idata$7.idata$5.idata$4.idata$6(;___p__winmajor__imp____p__winmajor__head_libmsvcrt_a dsnos00090.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %Z__p__wenviron .text.data.bss.idata$7.idata$5.idata$4.idata$6(;___p__wenviron__imp____p__wenviron__head_libmsvcrt_a dsnos00089.o/ 1341005715 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %Y__p__wcmdln .text.data.bss.idata$7.idata$5.idata$4.idata$6$7___p__wcmdln__imp____p__wcmdln__head_libmsvcrt_a dsnos00088.o/ 1341005715 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %X__p__tzname .text.data.bss.idata$7.idata$5.idata$4.idata$6$7___p__tzname__imp____p__tzname__head_libmsvcrt_a dsnos00087.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %W__p__timezone .text.data.bss.idata$7.idata$5.idata$4.idata$6(;___p__timezone__imp____p__timezone__head_libmsvcrt_a dsnos00086.o/ 1341005715 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %V__p__pwctype .text.data.bss.idata$7.idata$5.idata$4.idata$6&9___p__pwctype__imp____p__pwctype__head_libmsvcrt_a dsnos00085.o/ 1341005715 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %U__p__pgmptr .text.data.bss.idata$7.idata$5.idata$4.idata$6$7___p__pgmptr__imp____p__pgmptr__head_libmsvcrt_a dsnos00084.o/ 1341005715 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %T__p__pctype .text.data.bss.idata$7.idata$5.idata$4.idata$6$7___p__pctype__imp____p__pctype__head_libmsvcrt_a dsnos00083.o/ 1341005715 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %S__p__osver .text.data.bss.idata$7.idata$5.idata$4.idata$6"5___p__osver__imp____p__osver__head_libmsvcrt_a dsnos00082.o/ 1341005715 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %R__p__mbctype .text.data.bss.idata$7.idata$5.idata$4.idata$6&9___p__mbctype__imp____p__mbctype__head_libmsvcrt_a dsnos00081.o/ 1341005715 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %Q__p__mbcasemap .text.data.bss.idata$7.idata$5.idata$4.idata$6*=___p__mbcasemap__imp____p__mbcasemap__head_libmsvcrt_a dsnos00080.o/ 1341005715 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %P__p__iob .text.data.bss.idata$7.idata$5.idata$4.idata$61___p__iob__imp____p__iob__head_libmsvcrt_a dsnos00079.o/ 1341005715 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %O__p__fmode .text.data.bss.idata$7.idata$5.idata$4.idata$6"5___p__fmode__imp____p__fmode__head_libmsvcrt_a dsnos00078.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %N__p__fileinfo .text.data.bss.idata$7.idata$5.idata$4.idata$6(;___p__fileinfo__imp____p__fileinfo__head_libmsvcrt_a dsnos00077.o/ 1341005715 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %M__p__environ .text.data.bss.idata$7.idata$5.idata$4.idata$6&9___p__environ__imp____p__environ__head_libmsvcrt_a dsnos00076.o/ 1341005715 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %L__p__dstbias .text.data.bss.idata$7.idata$5.idata$4.idata$6&9___p__dstbias__imp____p__dstbias__head_libmsvcrt_a dsnos00075.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %K__p__daylight .text.data.bss.idata$7.idata$5.idata$4.idata$6(;___p__daylight__imp____p__daylight__head_libmsvcrt_a dsnos00074.o/ 1341005715 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %J__p__commode .text.data.bss.idata$7.idata$5.idata$4.idata$6&9___p__commode__imp____p__commode__head_libmsvcrt_a dsnos00073.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %I__p__amblksiz .text.data.bss.idata$7.idata$5.idata$4.idata$6(;___p__amblksiz__imp____p__amblksiz__head_libmsvcrt_a dsnos00072.o/ 1341005715 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %H__p__acmdln .text.data.bss.idata$7.idata$5.idata$4.idata$6$7___p__acmdln__imp____p__acmdln__head_libmsvcrt_a dsnos00071.o/ 1341005715 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %G__p___winitenv .text.data.bss.idata$7.idata$5.idata$4.idata$6*=___p___winitenv__imp____p___winitenv__head_libmsvcrt_a dsnos00070.o/ 1341005715 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %F__p___wargv .text.data.bss.idata$7.idata$5.idata$4.idata$6$7___p___wargv__imp____p___wargv__head_libmsvcrt_a dsnos00069.o/ 1341005715 0 0 100666 625 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %E__p___mb_cur_max .text.data.bss.idata$7.idata$5.idata$4.idata$6.A___p___mb_cur_max__imp____p___mb_cur_max__head_libmsvcrt_a dsnos00068.o/ 1341005715 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %D__p___initenv .text.data.bss.idata$7.idata$5.idata$4.idata$6(;___p___initenv__imp____p___initenv__head_libmsvcrt_a dsnos00067.o/ 1341005715 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %C__p___argv .text.data.bss.idata$7.idata$5.idata$4.idata$6"5___p___argv__imp____p___argv__head_libmsvcrt_a dsnos00066.o/ 1341005715 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %B__p___argc .text.data.bss.idata$7.idata$5.idata$4.idata$6"5___p___argc__imp____p___argc__head_libmsvcrt_a dsnos00065.o/ 1341005715 0 0 100666 563 ` Lf .text 0`.data@0.bss0.idata$7,H0.idata$50R0.idata$44\0.idata$68 A__mb_cur_max.text.data.bss.idata$7.idata$5.idata$4.idata$6+__imp____mb_cur_max__head_libmsvcrt_a dsnos00064.o/ 1341005715 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %@__lconv_init .text.data.bss.idata$7.idata$5.idata$4.idata$6&9___lconv_init__imp____lconv_init__head_libmsvcrt_a dsnos00063.o/ 1341005715 0 0 100666 562 ` Lf .text 0`.data@0.bss0.idata$7,H0.idata$50R0.idata$44\0.idata$68 ?__lc_handle.text.data.bss.idata$7.idata$5.idata$4.idata$6*__imp____lc_handle__head_libmsvcrt_adsnos00062.o/ 1341005714 0 0 100666 570 ` Lj .text 0`.data@0.bss0.idata$7,L0.idata$50V0.idata$44`0.idata$68 >__lc_collate_cp.text.data.bss.idata$7.idata$5.idata$4.idata$6.__imp____lc_collate_cp__head_libmsvcrt_adsnos00061.o/ 1341005714 0 0 100666 564 ` Lf .text 0`.data@0.bss0.idata$7,H0.idata$50R0.idata$44\0.idata$68 =__lc_codepage.text.data.bss.idata$7.idata$5.idata$4.idata$6,__imp____lc_codepage__head_libmsvcrt_adsnos00060.o/ 1341005714 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %<__iscsymf .text.data.bss.idata$7.idata$5.idata$4.idata$6 3___iscsymf__imp____iscsymf__head_libmsvcrt_a dsnos00059.o/ 1341005714 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %;__iscsym .text.data.bss.idata$7.idata$5.idata$4.idata$61___iscsym__imp____iscsym__head_libmsvcrt_a dsnos00058.o/ 1341005714 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %:__isascii .text.data.bss.idata$7.idata$5.idata$4.idata$6 3___isascii__imp____isascii__head_libmsvcrt_a dsnos00057.o/ 1341005714 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %9__iob_func .text.data.bss.idata$7.idata$5.idata$4.idata$6"5___iob_func__imp____iob_func__head_libmsvcrt_a dsnos00056.o/ 1341005714 0 0 100666 556 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 8__initenv.text.data.bss.idata$7.idata$5.idata$4.idata$6(__imp____initenv__head_libmsvcrt_adsnos00055.o/ 1341005714 0 0 100666 615 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %7__getmainargs .text.data.bss.idata$7.idata$5.idata$4.idata$6(;___getmainargs__imp____getmainargs__head_libmsvcrt_a dsnos00054.o/ 1341005714 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %6__fpecode .text.data.bss.idata$7.idata$5.idata$4.idata$6 3___fpecode__imp____fpecode__head_libmsvcrt_a dsnos00053.o/ 1341005714 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %5__doserrno .text.data.bss.idata$7.idata$5.idata$4.idata$6"5___doserrno__imp____doserrno__head_libmsvcrt_a dsnos00052.o/ 1341005714 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %4__dllonexit .text.data.bss.idata$7.idata$5.idata$4.idata$6$7___dllonexit__imp____dllonexit__head_libmsvcrt_a dsnos00051.o/ 1341005714 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %3__crtLCMapStringW .text.data.bss.idata$7.idata$5.idata$4.idata$60C___crtLCMapStringW__imp____crtLCMapStringW__head_libmsvcrt_a dsnos00050.o/ 1341005714 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %2__crtLCMapStringA .text.data.bss.idata$7.idata$5.idata$4.idata$60C___crtLCMapStringA__imp____crtLCMapStringA__head_libmsvcrt_a dsnos00049.o/ 1341005714 0 0 100666 635 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %1__crtGetStringTypeW .text.data.bss.idata$7.idata$5.idata$4.idata$64G___crtGetStringTypeW__imp____crtGetStringTypeW__head_libmsvcrt_a dsnos00048.o/ 1341005714 0 0 100666 635 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %0__crtGetLocaleInfoW .text.data.bss.idata$7.idata$5.idata$4.idata$64G___crtGetLocaleInfoW__imp____crtGetLocaleInfoW__head_libmsvcrt_a dsnos00047.o/ 1341005714 0 0 100666 635 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %/__crtCompareStringW .text.data.bss.idata$7.idata$5.idata$4.idata$64G___crtCompareStringW__imp____crtCompareStringW__head_libmsvcrt_a dsnos00046.o/ 1341005714 0 0 100666 635 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %.__crtCompareStringA .text.data.bss.idata$7.idata$5.idata$4.idata$64G___crtCompareStringA__imp____crtCompareStringA__head_libmsvcrt_a dsnos00045.o/ 1341005714 0 0 100666 562 ` Lf .text 0`.data@0.bss0.idata$7,H0.idata$50R0.idata$44\0.idata$68 -__badioinfo.text.data.bss.idata$7.idata$5.idata$4.idata$6*__imp____badioinfo__head_libmsvcrt_adsnos00044.o/ 1341005714 0 0 100666 553 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 ,__argv.text.data.bss.idata$7.idata$5.idata$4.idata$6%__imp____argv__head_libmsvcrt_a dsnos00043.o/ 1341005714 0 0 100666 553 ` Lb .text 0`.data@0.bss0.idata$7,D0.idata$50N0.idata$44X0.idata$6 8 +__argc.text.data.bss.idata$7.idata$5.idata$4.idata$6%__imp____argc__head_libmsvcrt_a dsnos00042.o/ 1341005714 0 0 100666 683 ` L .text,h 0`.data@0.bss0.idata$74r0.idata$58|0.idata$4<0.idata$6&@ %*___unguarded_readlc_active_add_func .text.data.bss.idata$7.idata$5.idata$4.idata$6)Tg____unguarded_readlc_active_add_func__imp_____unguarded_readlc_active_add_func__head_libmsvcrt_a dsnos00041.o/ 1341005714 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %)___setlc_active_func .text.data.bss.idata$7.idata$5.idata$4.idata$66I____setlc_active_func__imp_____setlc_active_func__head_libmsvcrt_a dsnos00040.o/ 1341005714 0 0 100666 633 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %(___mb_cur_max_func .text.data.bss.idata$7.idata$5.idata$4.idata$62E____mb_cur_max_func__imp_____mb_cur_max_func__head_libmsvcrt_a dsnos00039.o/ 1341005714 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %'___lc_handle_func .text.data.bss.idata$7.idata$5.idata$4.idata$60C____lc_handle_func__imp_____lc_handle_func__head_libmsvcrt_a dsnos00038.o/ 1341005714 0 0 100666 639 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %&___lc_collate_cp_func .text.data.bss.idata$7.idata$5.idata$4.idata$68K____lc_collate_cp_func__imp_____lc_collate_cp_func__head_libmsvcrt_a dsnos00037.o/ 1341005714 0 0 100666 635 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %%___lc_codepage_func .text.data.bss.idata$7.idata$5.idata$4.idata$64G____lc_codepage_func__imp_____lc_codepage_func__head_libmsvcrt_a dsnos00036.o/ 1341005714 0 0 100666 613 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %$__STRINGTOLD .text.data.bss.idata$7.idata$5.idata$4.idata$6&9___STRINGTOLD__imp____STRINGTOLD__head_libmsvcrt_a dsnos00035.o/ 1341005714 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %#__RTtypeid .text.data.bss.idata$7.idata$5.idata$4.idata$6"5___RTtypeid__imp____RTtypeid__head_libmsvcrt_a dsnos00034.o/ 1341005714 0 0 100666 623 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %"__RTDynamicCast .text.data.bss.idata$7.idata$5.idata$4.idata$6,?___RTDynamicCast__imp____RTDynamicCast__head_libmsvcrt_a dsnos00033.o/ 1341005714 0 0 100666 621 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %!__RTCastToVoid .text.data.bss.idata$7.idata$5.idata$4.idata$6*=___RTCastToVoid__imp____RTCastToVoid__head_libmsvcrt_a dsnos00032.o/ 1341005714 0 0 100666 651 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ % __DestructExceptionObject .text.data.bss.idata$7.idata$5.idata$4.idata$6@S___DestructExceptionObject__imp____DestructExceptionObject__head_libmsvcrt_a dsnos00031.o/ 1341005714 0 0 100666 669 ` L .text,d 0`.data@0.bss0.idata$74n0.idata$58x0.idata$4<0.idata$6"@ %__CxxUnregisterExceptionObject .text.data.bss.idata$7.idata$5.idata$4.idata$6$J]___CxxUnregisterExceptionObject__imp____CxxUnregisterExceptionObject__head_libmsvcrt_a dsnos00030.o/ 1341005714 0 0 100666 661 ` L .text,` 0`.data@0.bss0.idata$74j0.idata$58t0.idata$4<~0.idata$6 @ %__CxxRegisterExceptionObject .text.data.bss.idata$7.idata$5.idata$4.idata$6"FY___CxxRegisterExceptionObject__imp____CxxRegisterExceptionObject__head_libmsvcrt_a dsnos00029.o/ 1341005714 0 0 100666 647 ` L .text,\ 0`.data@0.bss0.idata$74f0.idata$58p0.idata$4<z0.idata$6@ %__CxxQueryExceptionSize .text.data.bss.idata$7.idata$5.idata$4.idata$6<O___CxxQueryExceptionSize__imp____CxxQueryExceptionSize__head_libmsvcrt_a dsnos00028.o/ 1341005714 0 0 100666 633 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %__CxxLongjmpUnwind .text.data.bss.idata$7.idata$5.idata$4.idata$62E___CxxLongjmpUnwind__imp____CxxLongjmpUnwind__head_libmsvcrt_a dsnos00027.o/ 1341005714 0 0 100666 627 ` L| .text,T 0`.data@0.bss0.idata$74^0.idata$58h0.idata$4<r0.idata$6@ %__CxxFrameHandler .text.data.bss.idata$7.idata$5.idata$4.idata$60C___CxxFrameHandler__imp____CxxFrameHandler__head_libmsvcrt_a dsnos00026.o/ 1341005714 0 0 100666 637 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %__CxxExceptionFilter .text.data.bss.idata$7.idata$5.idata$4.idata$66I___CxxExceptionFilter__imp____CxxExceptionFilter__head_libmsvcrt_a dsnos00025.o/ 1341005714 0 0 100666 633 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %__CxxDetectRethrow .text.data.bss.idata$7.idata$5.idata$4.idata$62E___CxxDetectRethrow__imp____CxxDetectRethrow__head_libmsvcrt_a dsnos00024.o/ 1341005714 0 0 100666 635 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %__CxxCallUnwindDtor .text.data.bss.idata$7.idata$5.idata$4.idata$64G___CxxCallUnwindDtor__imp____CxxCallUnwindDtor__head_libmsvcrt_a dsnos00023.o/ 1341005714 0 0 100666 611 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_XcptFilter .text.data.bss.idata$7.idata$5.idata$4.idata$6$7__XcptFilter__imp___XcptFilter__head_libmsvcrt_a dsnos00022.o/ 1341005714 0 0 100666 603 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_Strftime .text.data.bss.idata$7.idata$5.idata$4.idata$6 3__Strftime__imp___Strftime__head_libmsvcrt_a dsnos00021.o/ 1341005714 0 0 100666 548 ` L^ .text 0`.data@0.bss0.idata$7,@0.idata$50J0.idata$44T0.idata$68 _HUGE.text.data.bss.idata$7.idata$5.idata$4.idata$6$__imp___HUGE__head_libmsvcrt_adsnos00020.o/ 1341005714 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_Gettnames .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__Gettnames__imp___Gettnames__head_libmsvcrt_a dsnos00019.o/ 1341005714 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_Getmonths .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__Getmonths__imp___Getmonths__head_libmsvcrt_a dsnos00018.o/ 1341005714 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_Getdays .text.data.bss.idata$7.idata$5.idata$4.idata$61__Getdays__imp___Getdays__head_libmsvcrt_a dsnos00017.o/ 1341005714 0 0 100666 609 ` Lx .text,P 0`.data@0.bss0.idata$74Z0.idata$58d0.idata$4<n0.idata$6@ %_EH_prolog .text.data.bss.idata$7.idata$5.idata$4.idata$6"5__EH_prolog__imp___EH_prolog__head_libmsvcrt_a dsnos00016.o/ 1341005714 0 0 100666 633 ` L .text,X 0`.data@0.bss0.idata$74b0.idata$58l0.idata$4<v0.idata$6@ %_CxxThrowException .text.data.bss.idata$7.idata$5.idata$4.idata$62E__CxxThrowException__imp___CxxThrowException__head_libmsvcrt_a dsnos00015.o/ 1341005714 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_CItanh .text.data.bss.idata$7.idata$5.idata$4.idata$6__CItanh&__imp___CItanh__head_libmsvcrt_adsnos00014.o/ 1341005714 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_CItan .text.data.bss.idata$7.idata$5.idata$4.idata$6__CItan%__imp___CItan__head_libmsvcrt_a dsnos00013.o/ 1341005714 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _CIsqrt .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIsqrt&__imp___CIsqrt__head_libmsvcrt_adsnos00012.o/ 1341005714 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _CIsinh .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIsinh&__imp___CIsinh__head_libmsvcrt_adsnos00011.o/ 1341005714 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _CIsin .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIsin%__imp___CIsin__head_libmsvcrt_a dsnos00010.o/ 1341005714 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _CIpow .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIpow%__imp___CIpow__head_libmsvcrt_a dsnos00009.o/ 1341005714 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ % _CIlog10 .text.data.bss.idata$7.idata$5.idata$4.idata$61__CIlog10__imp___CIlog10__head_libmsvcrt_a dsnos00008.o/ 1341005714 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_CIlog .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIlog%__imp___CIlog__head_libmsvcrt_a dsnos00007.o/ 1341005714 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_CIfmod .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIfmod&__imp___CIfmod__head_libmsvcrt_adsnos00006.o/ 1341005714 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_CIexp .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIexp%__imp___CIexp__head_libmsvcrt_a dsnos00005.o/ 1341005714 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_CIcosh .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIcosh&__imp___CIcosh__head_libmsvcrt_adsnos00004.o/ 1341005714 0 0 100666 589 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_CIcos .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIcos%__imp___CIcos__head_libmsvcrt_a dsnos00003.o/ 1341005714 0 0 100666 601 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_CIatan2 .text.data.bss.idata$7.idata$5.idata$4.idata$61__CIatan2__imp___CIatan2__head_libmsvcrt_a dsnos00002.o/ 1341005714 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_CIatan .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIatan&__imp___CIatan__head_libmsvcrt_adsnos00001.o/ 1341005714 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_CIasin .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIasin&__imp___CIasin__head_libmsvcrt_adsnos00000.o/ 1341005714 0 0 100666 590 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %_CIacos .text.data.bss.idata$7.idata$5.idata$4.idata$6__CIacos&__imp___CIacos__head_libmsvcrt_adsnos40689.o/ 1341005724 0 0 100666 615 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %printf .text.data.bss.idata$7.idata$5.idata$4.idata$6,?___msvcrt_printf__imp____msvcrt_printf__head_libmsvcrt_a dsnos40619.o/ 1341005725 0 0 100666 617 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %kfprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6.A___msvcrt_fprintf__imp____msvcrt_fprintf__head_libmsvcrt_a dsnos40709.o/ 1341005725 0 0 100666 617 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %sprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6.A___msvcrt_sprintf__imp____msvcrt_sprintf__head_libmsvcrt_a dsnos40750.o/ 1341005726 0 0 100666 617 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %vprintf .text.data.bss.idata$7.idata$5.idata$4.idata$6.A___msvcrt_vprintf__imp____msvcrt_vprintf__head_libmsvcrt_a dsnos40748.o/ 1341005726 0 0 100666 619 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %vfprintf .text.data.bss.idata$7.idata$5.idata$4.idata$60C___msvcrt_vfprintf__imp____msvcrt_vfprintf__head_libmsvcrt_a dsnos40751.o/ 1341005727 0 0 100666 619 ` Lt .text,L 0`.data@0.bss0.idata$74V0.idata$58`0.idata$4<j0.idata$6 @ %vsprintf .text.data.bss.idata$7.idata$5.idata$4.idata$60C___msvcrt_vsprintf__imp____msvcrt_vsprintf__head_libmsvcrt_a ofmt_stub.o/ 1341005702 0 0 100666 348 ` L .text 0`.data@0.bss01Ð.filegfake .text.data.bss__get_output_formatCharacterManaJ/src/Launch4JStub/head_src/0000755000175000017500000000000013615720000020370 5ustar paulliupaulliuCharacterManaJ/src/Launch4JStub/head_src/guihead/0000755000175000017500000000000013615720000021776 5ustar paulliupaulliuCharacterManaJ/src/Launch4JStub/head_src/guihead/Makefile.win0000644000175000017500000000175113615720000024236 0ustar paulliupaulliu# Project: guihead # Makefile created by Dev-C++ 4.9.9.2 CPP = g++.exe CC = gcc.exe WINDRES = windres.exe RES = OBJ = ../../head/guihead.o ../../head/head.o $(RES) LINKOBJ = ../../head/guihead.o ../../head/head.o $(RES) LIBS = -L"C:/Dev-Cpp/lib" -mwindows -n -s INCS = -I"C:/Dev-Cpp/include" CXXINCS = -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" BIN = guihead.exe CXXFLAGS = $(CXXINCS) -fexpensive-optimizations -O3 CFLAGS = $(INCS) -fexpensive-optimizations -O3 RM = rm -f .PHONY: all all-before all-after clean clean-custom all: all-before guihead.exe all-after clean: clean-custom ${RM} $(OBJ) $(BIN) $(BIN): $(OBJ) # $(CC) $(LINKOBJ) -o "guihead.exe" $(LIBS) ../../head/guihead.o: guihead.c $(CC) -c guihead.c -o ../../head/guihead.o $(CFLAGS) ../../head/head.o: ../head.c $(CC) -c ../head.c -o ../../head/head.o $(CFLAGS) CharacterManaJ/src/Launch4JStub/head_src/guihead/guihead.dev0000644000175000017500000000270513615720000024110 0ustar paulliupaulliu[Project] FileName=guihead.dev Name=guihead UnitCount=5 Type=0 Ver=1 ObjFiles= Includes= Libs= PrivateResource= ResourceIncludes= MakeIncludes= Compiler= CppCompiler= Linker=-n_@@_ IsCpp=0 Icon= ExeOutput= ObjectOutput=..\..\head OverrideOutput=0 OverrideOutputName=guihead.exe HostApplication= Folders= CommandLine= UseCustomMakefile=1 CustomMakefile=Makefile.win IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 CompilerSettings=0000000001001000000100 [Unit1] FileName=guihead.c CompileCpp=0 Folder=guihead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c guihead.c -o ../../head/guihead.o $(CFLAGS) [Unit2] FileName=guihead.h CompileCpp=0 Folder=guihead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [VersionInfo] Major=0 Minor=1 Release=1 Build=1 LanguageID=1033 CharsetID=1252 CompanyName= FileVersion= FileDescription=Developed using the Dev-C++ IDE InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion= AutoIncBuildNr=0 [Unit4] FileName=..\head.h CompileCpp=0 Folder=guihead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit6] FileName=..\resid.h CompileCpp=0 Folder=guihead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit3] FileName=..\head.c CompileCpp=0 Folder=guihead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit5] FileName=..\resource.h CompileCpp=0 Folder=guihead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= CharacterManaJ/src/Launch4JStub/head_src/guihead/guihead.h0000644000175000017500000000361113615720000023556 0ustar paulliupaulliu/* Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2004, 2007 Grzegorz Kowal Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define ID_TIMER 1 #define DEFAULT_SPLASH_TIMEOUT 60 /* 60 seconds */ #define MAX_SPLASH_TIMEOUT 60 * 15 /* 15 minutes */ #define TIMER_PROC_INTERVAL 100 /* interval in ms between calls to EnumWindows */ HWND getInstanceWindow(); BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam); VOID CALLBACK TimerProc( HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime // current system time ); CharacterManaJ/src/Launch4JStub/head_src/guihead/guihead.c0000644000175000017500000001415113615720000023552 0ustar paulliupaulliu/* Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2004, 2015 Grzegorz Kowal Sylvain Mina (single instance patch) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "../resource.h" #include "../head.h" #include "guihead.h" extern FILE* hLog; extern PROCESS_INFORMATION processInformation; HWND hWnd; DWORD dwExitCode = 0; BOOL stayAlive = FALSE; BOOL splash = FALSE; BOOL splashTimeoutErr; BOOL waitForWindow; BOOL restartOnCrash = FALSE; int splashTimeout = DEFAULT_SPLASH_TIMEOUT; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int result = prepare(lpCmdLine); if (result == ERROR_ALREADY_EXISTS) { HWND handle = getInstanceWindow(); ShowWindow(handle, SW_SHOW); SetForegroundWindow(handle); closeLogFile(); return 2; } if (result != TRUE) { signalError(); return 1; } splash = loadBool(SHOW_SPLASH) && strstr(lpCmdLine, "--l4j-no-splash") == NULL; restartOnCrash = loadBool(RESTART_ON_CRASH); // if we should restart on crash, we must also stay alive to check for crashes stayAlive = restartOnCrash || (loadBool(GUI_HEADER_STAYS_ALIVE) && strstr(lpCmdLine, "--l4j-dont-wait") == NULL); if (splash || stayAlive) { hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, "STATIC", "", WS_POPUP | SS_BITMAP, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (splash) { char timeout[10] = {0}; if (loadString(SPLASH_TIMEOUT, timeout)) { splashTimeout = atoi(timeout); if (splashTimeout <= 0 || splashTimeout > MAX_SPLASH_TIMEOUT) { splashTimeout = DEFAULT_SPLASH_TIMEOUT; } } splashTimeout = splashTimeout * 1000; // to millis splashTimeoutErr = loadBool(SPLASH_TIMEOUT_ERR) && strstr(lpCmdLine, "--l4j-no-splash-err") == NULL; waitForWindow = loadBool(SPLASH_WAITS_FOR_WINDOW); HANDLE hImage = LoadImage(hInstance, // handle of the instance containing the image MAKEINTRESOURCE(SPLASH_BITMAP), // name or identifier of image IMAGE_BITMAP, // type of image 0, // desired width 0, // desired height LR_DEFAULTSIZE); if (hImage == NULL) { signalError(); return 1; } SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImage); RECT rect; GetWindowRect(hWnd, &rect); int x = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2; int y = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2; SetWindowPos(hWnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); ShowWindow(hWnd, nCmdShow); UpdateWindow (hWnd); } } do { if (splash || stayAlive) { if (!SetTimer (hWnd, ID_TIMER, TIMER_PROC_INTERVAL, TimerProc)) { signalError(); return 1; } } if (!execute(FALSE, &dwExitCode)) { signalError(); return 1; } if (!(splash || stayAlive)) { debug("Exit code:\t0\n"); closeProcessHandles(); closeLogFile(); return 0; } MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } if (restartOnCrash && dwExitCode != 0) { debug("Exit code:\t%d, restarting the application!\n", dwExitCode); } closeProcessHandles(); } while (restartOnCrash && dwExitCode != 0); debug("Exit code:\t%d\n", dwExitCode); closeLogFile(); return dwExitCode; } HWND getInstanceWindow() { char windowTitle[STR]; char instWindowTitle[STR] = {0}; if (loadString(INSTANCE_WINDOW_TITLE, instWindowTitle)) { HWND handle = FindWindowEx(NULL, NULL, NULL, NULL); while (handle != NULL) { GetWindowText(handle, windowTitle, STR - 1); if (strstr(windowTitle, instWindowTitle) != NULL) { return handle; } else { handle = FindWindowEx(NULL, handle, NULL, NULL); } } } return NULL; } BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam) { DWORD processId; GetWindowThreadProcessId(hwnd, &processId); if (processInformation.dwProcessId == processId) { LONG styles = GetWindowLong(hwnd, GWL_STYLE); if ((styles & WS_VISIBLE) != 0) { splash = FALSE; ShowWindow(hWnd, SW_HIDE); return FALSE; } } return TRUE; } VOID CALLBACK TimerProc( HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime) // current system time { if (splash) { if (splashTimeout == 0) { splash = FALSE; ShowWindow(hWnd, SW_HIDE); if (waitForWindow && splashTimeoutErr) { KillTimer(hwnd, ID_TIMER); signalError(); PostQuitMessage(0); } } else { splashTimeout -= TIMER_PROC_INTERVAL; if (waitForWindow) { EnumWindows(enumwndfn, 0); } } } GetExitCodeProcess(processInformation.hProcess, &dwExitCode); if (dwExitCode != STILL_ACTIVE || !(splash || stayAlive)) { KillTimer(hWnd, ID_TIMER); PostQuitMessage(0); } } CharacterManaJ/src/Launch4JStub/head_src/guihead/.gitignore0000644000175000017500000000003513615720000023764 0ustar paulliupaulliu/guihead.exe /guihead.layout CharacterManaJ/src/Launch4JStub/head_src/jnihead.h0000644000175000017500000000327413615720000022151 0ustar paulliupaulliu/* Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2007 Ryan Rusaw Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include "head.h" int getArgCount(const char* pcArgStr); void saveJvmOptions(const char *jrePath, const char *mainClass, const char *pcOpts); JNIEnv* createVm(); int invokeMainClass(JNIEnv* psJNIEnv); void cleanupVm(); BOOL executeVm(DWORD *dwExitCode); CharacterManaJ/src/Launch4JStub/head_src/LICENSE.txt0000644000175000017500000000263713615720000022223 0ustar paulliupaulliuLaunch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2004, 2015 Grzegorz Kowal Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. CharacterManaJ/src/Launch4JStub/head_src/resource.h0000644000175000017500000000507613615720000022400 0ustar paulliupaulliu/* Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2004, 2014 Grzegorz Kowal Ian Roberts (jdk preference patch) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // ICON #define APP_ICON 1 // BITMAP #define SPLASH_BITMAP 1 // RCDATA #define JRE_PATH 1 #define JAVA_MIN_VER 2 #define JAVA_MAX_VER 3 #define SHOW_SPLASH 4 #define SPLASH_WAITS_FOR_WINDOW 5 #define SPLASH_TIMEOUT 6 #define SPLASH_TIMEOUT_ERR 7 #define CHDIR 8 #define SET_PROC_NAME 9 #define ERR_TITLE 10 #define GUI_HEADER_STAYS_ALIVE 11 #define JVM_OPTIONS 12 #define CMD_LINE 13 #define JAR 14 #define MAIN_CLASS 15 #define CLASSPATH 16 #define WRAPPER 17 #define JDK_PREFERENCE 18 #define ENV_VARIABLES 19 #define PRIORITY_CLASS 20 #define DOWNLOAD_URL 21 #define SUPPORT_URL 22 #define MUTEX_NAME 23 #define INSTANCE_WINDOW_TITLE 24 #define INITIAL_HEAP_SIZE 25 #define INITIAL_HEAP_PERCENT 26 #define MAX_HEAP_SIZE 27 #define MAX_HEAP_PERCENT 28 #define BUNDLED_JRE_64_BIT 29 #define RUNTIME_BITS 30 #define RESTART_ON_CRASH 31 #define BUNDLED_JRE_AS_FALLBACK 32 #define STARTUP_ERR 101 #define BUNDLED_JRE_ERR 102 #define JRE_VERSION_ERR 103 #define LAUNCHER_ERR 104 #define INSTANCE_ALREADY_EXISTS_MSG 105 CharacterManaJ/src/Launch4JStub/head_src/jniconsolehead_BETA/0000755000175000017500000000000013615720000024150 5ustar paulliupaulliuCharacterManaJ/src/Launch4JStub/head_src/jniconsolehead_BETA/Makefile.win0000644000175000017500000000333013615720000026403 0ustar paulliupaulliu# Project: jniconsolehead # Makefile created by Dev-C++ 5.7.1 CPP = g++.exe CC = gcc.exe WINDRES = windres.exe OBJ = ../../head_jni_BETA/jniconsolehead.o ../../head_jni_BETA/head.o ../../head_jni_BETA/jnihead.o LINKOBJ = ../../head_jni_BETA/jniconsolehead.o ../../head_jni_BETA/head.o ../../head_jni_BETA/jnihead.o LIBS = -L"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib" -L"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/lib" -static-libstdc++ -static-libgcc -n -s INCS = -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include/win32" CXXINCS = -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include/c++" -I"C:/Program Files (x86)/Java/jdk 1.4/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include/win32" BIN = jniconsolehead.exe CXXFLAGS = $(CXXINCS) -Os CFLAGS = $(INCS) -Os RM = rm.exe -f .PHONY: all all-before all-after clean clean-custom all: all-before $(BIN) all-after clean: clean-custom ${RM} $(OBJ) $(BIN) $(BIN): $(OBJ) $(CC) $(LINKOBJ) -o $(BIN) $(LIBS) ../../head_jni_BETA/jniconsolehead.o: jniconsolehead.c $(CC) -c jniconsolehead.c -o ../../head_jni_BETA/jniconsolehead.o $(CFLAGS) ../../head_jni_BETA/head.o: ../head.c $(CC) -c ../head.c -o ../../head_jni_BETA/head.o $(CFLAGS) ../../head_jni_BETA/jnihead.o: ../jnihead.c $(CC) -c ../jnihead.c -o ../../head_jni_BETA/jnihead.o $(CFLAGS) CharacterManaJ/src/Launch4JStub/head_src/jniconsolehead_BETA/jniconsolehead.c0000644000175000017500000000505213615720000027303 0ustar paulliupaulliu/* Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2004, 2007 Grzegorz Kowal Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "../resource.h" #include "../head.h" #include "../jnihead.h" extern FILE* hLog; BOOL restartOnCrash = FALSE; int main(int argc, char* argv[]) { setConsoleFlag(); LPTSTR cmdLine = GetCommandLine(); if (*cmdLine == '"') { if (*(cmdLine = strchr(cmdLine + 1, '"') + 1)) { cmdLine++; } } else if ((cmdLine = strchr(cmdLine, ' ')) != NULL) { cmdLine++; } else { cmdLine = ""; } int result = prepare(cmdLine); if (result == ERROR_ALREADY_EXISTS) { char errMsg[BIG_STR] = {0}; loadString(INSTANCE_ALREADY_EXISTS_MSG, errMsg); msgBox(errMsg); closeLogFile(); return 2; } if (result != TRUE) { signalError(); return 1; } restartOnCrash = loadBool(RESTART_ON_CRASH); DWORD dwExitCode; do { dwExitCode = 0; saveJvmOptions(getJavaHome(), getMainClass(), getLauncherArgs()); if (!executeVm(&dwExitCode)) { signalError(); break; } if (restartOnCrash && dwExitCode != 0) { debug("Exit code:\t%d, restarting the application!\n", dwExitCode); } } while (restartOnCrash && dwExitCode != 0); debug("Exit code:\t%d\n", dwExitCode); closeLogFile(); return (int) dwExitCode; } CharacterManaJ/src/Launch4JStub/head_src/jniconsolehead_BETA/jniconsolehead.dev0000644000175000017500000000317413615720000027642 0ustar paulliupaulliu[Project] FileName=jniconsolehead.dev Name=jniconsolehead UnitCount=6 Type=1 Ver=2 ObjFiles= Includes="C:\Program Files (x86)\Java\jdk 1.4\include";"C:\Program Files (x86)\Java\jdk 1.4\include\win32" Libs= PrivateResource= ResourceIncludes= MakeIncludes= Compiler= CppCompiler= Linker=-n_@@_ IsCpp=0 Icon= ExeOutput= ObjectOutput=..\..\head_jni_BETA OverrideOutput=0 OverrideOutputName=jniconsolehead.exe HostApplication= Folders= CommandLine= UseCustomMakefile=0 CustomMakefile=Makefile.win IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 CompilerSettings=000000d000000000000001000 LogOutput= LogOutputEnabled=0 [Unit1] FileName=jniconsolehead.c CompileCpp=0 Folder=jniconsolehead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [VersionInfo] Major=0 Minor=1 Release=1 Build=1 LanguageID=1033 CharsetID=1252 CompanyName= FileVersion=0.1.1.1 FileDescription=Developed using the Dev-C++ IDE InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion= AutoIncBuildNr=0 SyncProduct=0 [Unit2] FileName=..\resource.h CompileCpp=0 Folder=jniconsolehead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit3] FileName=..\head.c CompileCpp=0 Folder=jniconsolehead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit4] FileName=..\head.h CompileCpp=0 Folder=jniconsolehead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit5] FileName=..\jnihead.h Folder=jniconsolehead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= CompileCpp=0 [Unit6] FileName=..\jnihead.c CompileCpp=0 Folder=jniconsolehead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= CharacterManaJ/src/Launch4JStub/head_src/jniconsolehead_BETA/.gitignore0000644000175000017500000000005313615720000026136 0ustar paulliupaulliu/jniconsolehead.exe /jniconsolehead.layout CharacterManaJ/src/Launch4JStub/head_src/jnihead.c0000644000175000017500000001752313615720000022146 0ustar paulliupaulliu/* Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2007 Ryan Rusaw Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "jnihead.h" /* Java Invocation API stuff */ typedef jint (JNICALL CreateJavaVM_t)(JavaVM **pvm, void **env, void *args); JavaVM* g_pJavaVM = NULL; JNIEnv* g_pJNIEnv = NULL; JavaVMInitArgs g_sJavaVMInitArgs; char g_rgcMnClsArgs[MAX_ARGS] = {0}; char g_rgcMnCls[_MAX_PATH] = {0}; char g_rgcCurrJrePth[_MAX_PATH] = {0}; HINSTANCE g_hInstance; const char* g_pcSep = " \t\f\r\n\v"; int getArgCount(const char* pcArgStr) { const char *pCopy; int iArgCnt= 0; int bInWtSpc = 1; for(pCopy = pcArgStr; *pCopy; pCopy++) { if (!isspace(*pCopy) && bInWtSpc) { iArgCnt++; } bInWtSpc = isspace(*pCopy); } return iArgCnt; } void saveJvmOptions(const char *jrePath, const char *mainClass, const char *pcOpts) { strcpy(g_rgcCurrJrePth, jrePath); strcpy(g_rgcMnCls, mainClass); char rgcOptCpy[MAX_ARGS] = {0}; int iArgCnt = 0, iCurrArg = 0, iSkipArgCnt = 0; char *pcCurrOpt; char **prgcVmArgs = NULL; strncpy(rgcOptCpy, pcOpts, MAX_ARGS - 1); iArgCnt = getArgCount(rgcOptCpy); if (iArgCnt > 0) { /* Allocate iArgCnt char pointers */ prgcVmArgs = malloc(iArgCnt * sizeof(char *)); for (pcCurrOpt = strtok(rgcOptCpy, g_pcSep); pcCurrOpt; pcCurrOpt = strtok(NULL, g_pcSep), iCurrArg++) { /* Use the allocated pointers to make an array of substrings */ prgcVmArgs[iCurrArg] = pcCurrOpt; } /* Allocat iArgCnt JavaVMOptions for the g_sJavaVMInitArgs struct */ g_sJavaVMInitArgs.options = malloc(iArgCnt * sizeof(JavaVMOption)); memset(g_sJavaVMInitArgs.options, 0, iArgCnt * sizeof(JavaVMOption)); char* rgcClsPth = 0; /* Copy the tokenized array into the allocated JavaVMOption array, * with some special handling for classpath related arguments */ for (iCurrArg = 0; iCurrArg < iArgCnt; iCurrArg++) { if ((strcmp(prgcVmArgs[iCurrArg], "-classpath") == 0) || (strcmp(prgcVmArgs[iCurrArg], "-jar") == 0)) { iCurrArg++; iSkipArgCnt++; if (iCurrArg < iArgCnt) { int iOffset = *prgcVmArgs[iCurrArg] == '"' ? 1 : 0; char rgcTmp[MAX_ARGS] = {0}; /* Remove leading and trailing "'s */\ strncpy(rgcTmp, prgcVmArgs[iCurrArg] + iOffset, strlen(prgcVmArgs[iCurrArg]) - iOffset); if (rgcTmp[strlen(rgcTmp)-1] == '"') rgcTmp[strlen(rgcTmp)-1] = '\0'; /* If we haven't defined a classpath yet start one, otherwise * we just append the this classpath to it */ if (!rgcClsPth) { rgcClsPth = malloc(MAX_ARGS * sizeof(char)); memset(rgcClsPth, 0, MAX_ARGS * sizeof(char)); sprintf(rgcClsPth,"-Djava.class.path=%s", rgcTmp); g_sJavaVMInitArgs.options[iCurrArg - iSkipArgCnt].optionString = rgcClsPth; } else { iSkipArgCnt++; strcat(rgcClsPth,";"); strcat(rgcClsPth,rgcTmp); } } } else { g_sJavaVMInitArgs.options[iCurrArg - iSkipArgCnt].optionString = malloc(strlen(prgcVmArgs[iCurrArg]) + 1); strcpy(g_sJavaVMInitArgs.options[iCurrArg - iSkipArgCnt].optionString, prgcVmArgs[iCurrArg]); } } g_sJavaVMInitArgs.nOptions = iArgCnt - iSkipArgCnt; /* Free the malloc'd memory, we dont want to leak */ free(prgcVmArgs); } } JNIEnv* createVm() { int iRetVal; CreateJavaVM_t *pfnCreateJavaVM; char rgcLibPth[_MAX_PATH + 18]; // sprintf(rgcLibPth, "%s\\bin\\client\\jvm.dll", g_rgcCurrJrePth); // TODO - could be client or server sprintf(rgcLibPth, "%s\\bin\\client\\jvm.dll", g_rgcCurrJrePth); /* Get a handle to the jvm dll */ if ((g_hInstance = LoadLibrary(rgcLibPth)) == NULL) { return NULL; } /* Get the CreateJavaVM() function */ pfnCreateJavaVM = (CreateJavaVM_t *)GetProcAddress(g_hInstance, "JNI_CreateJavaVM"); if (pfnCreateJavaVM == NULL) { return NULL; } g_sJavaVMInitArgs.version = JNI_VERSION_1_2; g_sJavaVMInitArgs.ignoreUnrecognized = JNI_TRUE; /* Start the VM */ iRetVal = pfnCreateJavaVM(&g_pJavaVM, (void **)&g_pJNIEnv, &g_sJavaVMInitArgs); if (iRetVal != 0) { return NULL; } return g_pJNIEnv; } int invokeMainClass(JNIEnv* psJNIEnv) { jclass jcMnCls; jmethodID jmMnMthd; jobjectArray joAppArgs; jstring jsAppArg; jthrowable jtExcptn; char *pcCurrArg; int iArgCnt= 0, iOption = -1; char rgcMnClsCpy[MAX_ARGS] = {0}; /* Ensure Java JNI Env is set up */ if(psJNIEnv == NULL) { return -1; } /* We need a class name */ if (g_rgcMnCls[0] == '\0') { return -1; } else { /* Replace . with / in fully qualified class name */ char *pClsNm; for(pClsNm = g_rgcMnCls; *pClsNm; pClsNm++) { if(*pClsNm == '.') *pClsNm = '/'; } } /* Find the class */ jcMnCls = (*psJNIEnv)->FindClass(psJNIEnv, g_rgcMnCls); jtExcptn = (*psJNIEnv)->ExceptionOccurred(psJNIEnv); if (jtExcptn != NULL) { (*psJNIEnv)->ExceptionDescribe(psJNIEnv); return -1; } if (jcMnCls == NULL) { return -1; } /* Get the static main method */ jmMnMthd = (*psJNIEnv)->GetStaticMethodID(psJNIEnv, jcMnCls, "main", "([Ljava/lang/String;)V"); jtExcptn = (*psJNIEnv)->ExceptionOccurred(psJNIEnv); if (jtExcptn != NULL) { (*psJNIEnv)->ExceptionDescribe(psJNIEnv); } if (jmMnMthd == NULL) { return -1; } /* Build the String[] array if we need one */ strncpy(rgcMnClsCpy, g_rgcMnClsArgs, MAX_ARGS); iArgCnt = getArgCount(rgcMnClsCpy); joAppArgs = (jobjectArray)(*psJNIEnv)->NewObjectArray(psJNIEnv, iArgCnt, (*psJNIEnv)->FindClass(psJNIEnv, "java/lang/String"), NULL); jtExcptn = (*psJNIEnv)->ExceptionOccurred(psJNIEnv); if (jtExcptn != NULL) { (*psJNIEnv)->ExceptionDescribe(psJNIEnv); return -1; } for (pcCurrArg = strtok(rgcMnClsCpy, g_pcSep); pcCurrArg; pcCurrArg = strtok(NULL, g_pcSep)) { iOption++; jsAppArg = (*psJNIEnv)->NewStringUTF(psJNIEnv, pcCurrArg); (*psJNIEnv)->SetObjectArrayElement(psJNIEnv, joAppArgs, iOption, jsAppArg); jtExcptn = (*psJNIEnv)->ExceptionOccurred(psJNIEnv); if(jtExcptn != NULL) { (*psJNIEnv)->ExceptionDescribe(psJNIEnv); return -1; } } /* Execute the class */ (*psJNIEnv)->CallStaticVoidMethod(psJNIEnv, jcMnCls, jmMnMthd, joAppArgs); return 0; } void cleanupVm() { /* Destroy the VM */ (*g_pJavaVM)->DestroyJavaVM(g_pJavaVM); } BOOL executeVm(DWORD *dwExitCode) { BOOL result = TRUE; *dwExitCode = -1; int iIdx; /* Use Invocation API */ if (createVm()) { *dwExitCode = invokeMainClass(g_pJNIEnv); cleanupVm(); } else { result = FALSE; } /* Free the allocated memory */ for (iIdx = 0; iIdx < g_sJavaVMInitArgs.nOptions; iIdx++) { free(g_sJavaVMInitArgs.options[iIdx].optionString); } free(g_sJavaVMInitArgs.options); return result; } CharacterManaJ/src/Launch4JStub/head_src/head.c0000644000175000017500000012206413615720000021442 0ustar paulliupaulliu/* Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2004, 2015 Grzegorz Kowal, Ian Roberts (jdk preference patch) Sylvain Mina (single instance patch) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "resource.h" #include "head.h" HMODULE hModule; FILE* hLog; BOOL debugAll = FALSE; BOOL console = FALSE; BOOL wow64 = FALSE; char oldPwd[_MAX_PATH]; PROCESS_INFORMATION processInformation; DWORD processPriority; struct { char title[STR]; char msg[BIG_STR]; char url[256]; } error; struct { int runtimeBits; int foundJava; BOOL bundledJreAsFallback; BOOL corruptedJreFound; char originalJavaMinVer[STR]; char originalJavaMaxVer[STR]; char javaMinVer[STR]; char javaMaxVer[STR]; char foundJavaVer[STR]; char foundJavaKey[_MAX_PATH]; char foundJavaHome[_MAX_PATH]; } search; struct { char mainClass[_MAX_PATH]; char cmd[_MAX_PATH]; char args[MAX_ARGS]; } launcher; BOOL initGlobals() { hModule = GetModuleHandle(NULL); if (hModule == NULL) { return FALSE; } strcpy(error.title, LAUNCH4j); search.runtimeBits = INIT_RUNTIME_BITS; search.foundJava = NO_JAVA_FOUND; search.bundledJreAsFallback = FALSE; search.corruptedJreFound = FALSE; return TRUE; } FILE* openLogFile(const char* exePath, const int pathLen) { char path[_MAX_PATH] = {0}; strncpy(path, exePath, pathLen); strcat(path, "\\launch4j.log"); return fopen(path, "a"); } void closeLogFile() { if (hLog != NULL) { fclose(hLog); } } BOOL initializeLogging(const char *lpCmdLine, const char* exePath, const int pathLen) { char varValue[MAX_VAR_SIZE] = {0}; GetEnvironmentVariable(LAUNCH4j, varValue, MAX_VAR_SIZE); if (strstr(lpCmdLine, "--l4j-debug") != NULL || strstr(varValue, "debug") != NULL) { hLog = openLogFile(exePath, pathLen); if (hLog == NULL) { return FALSE; } debugAll = strstr(lpCmdLine, "--l4j-debug-all") != NULL || strstr(varValue, "debug-all") != NULL; } debug("\n\nVersion:\t%s\n", VERSION); debug("CmdLine:\t%s %s\n", exePath, lpCmdLine); return TRUE; } void setWow64Flag() { LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(TEXT("kernel32")), "IsWow64Process"); if (fnIsWow64Process != NULL) { fnIsWow64Process(GetCurrentProcess(), &wow64); } debug("WOW64:\t\t%s\n", wow64 ? "yes" : "no"); } void setConsoleFlag() { console = TRUE; } void msgBox(const char* text) { if (console) { if (*error.title) { printf("%s: %s\n", error.title, text); } else { printf("%s\n", text); } } else { MessageBox(NULL, text, error.title, MB_OK); } } void signalError() { DWORD err = GetLastError(); debug("Error msg:\t%s\n", error.msg); if (err) { LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL); debug(ERROR_FORMAT, (LPCTSTR) lpMsgBuf); strcat(error.msg, "\n\n"); strcat(error.msg, (LPCTSTR) lpMsgBuf); LocalFree(lpMsgBuf); } msgBox(error.msg); if (*error.url) { debug("Open URL:\t%s\n", error.url); ShellExecute(NULL, "open", error.url, NULL, NULL, SW_SHOWNORMAL); } closeLogFile(); } BOOL loadString(const int resID, char* buffer) { HRSRC hResource; HGLOBAL hResourceLoaded; LPBYTE lpBuffer; debugAll("Resource %d:\t", resID); hResource = FindResourceEx(hModule, RT_RCDATA, MAKEINTRESOURCE(resID), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)); if (NULL != hResource) { hResourceLoaded = LoadResource(hModule, hResource); if (NULL != hResourceLoaded) { lpBuffer = (LPBYTE) LockResource(hResourceLoaded); if (NULL != lpBuffer) { int x = 0; do { buffer[x] = (char) lpBuffer[x]; } while (buffer[x++] != 0); debugAll("%s\n", buffer); return TRUE; } } } else { SetLastError(0); buffer[0] = 0; } debugAll("\n"); return FALSE; } BOOL loadBool(const int resID) { char boolStr[20] = {0}; loadString(resID, boolStr); return strcmp(boolStr, TRUE_STR) == 0; } int loadInt(const int resID) { char intStr[20] = {0}; loadString(resID, intStr); return atoi(intStr); } typedef enum __PE6432 { PE_UNKNOWN, // x86, x64̂łȂ (LPEIA64, ARMȂǂY) PE_X86, PE_X64 } PE6432; /** * w肵PEt@C(EXE, DLL)32/64rbg𔻒肷B * @param pFileName t@C̃pX * @return 茋 */ PE6432 CheckPE6432(LPCTSTR pFileName) { PE6432 result = PE_UNKNOWN; HANDLE fh = CreateFile(pFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (fh != INVALID_HANDLE_VALUE) { // DOSwb_ǂݎ IMAGE_DOS_HEADER imageDosHeader = { 0 }; DWORD rd = 0; if (ReadFile(fh, &imageDosHeader, sizeof(IMAGE_DOS_HEADER), &rd, NULL) && rd == sizeof(IMAGE_DOS_HEADER) && imageDosHeader.e_magic == IMAGE_DOS_SIGNATURE) { // "MZ" // NTwb_܂ňړ SetFilePointer(fh, imageDosHeader.e_lfanew, NULL, FILE_BEGIN); if (GetLastError() == NO_ERROR) { // NTwb_ǂݎ IMAGE_NT_HEADERS imageNTHeader = { 0 }; if (ReadFile(fh, &imageNTHeader, sizeof(IMAGE_NT_HEADERS), &rd, NULL) && rd == sizeof(IMAGE_NT_HEADERS) && imageNTHeader.Signature == IMAGE_NT_SIGNATURE) { // }V^Cv̔ if (imageNTHeader.FileHeader.Machine == IMAGE_FILE_MACHINE_I386) { result = PE_X86; } else if (imageNTHeader.FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64) { result = PE_X64; } // IA64, ARMȂǂUNKNOWNɂ } } } CloseHandle(fh); } return result; } BOOL regQueryValue(const char* regPath, unsigned char* buffer, unsigned long bufferLength) { HKEY hRootKey; char* key; char* value; if (strstr(regPath, HKEY_CLASSES_ROOT_STR) == regPath) { hRootKey = HKEY_CLASSES_ROOT; } else if (strstr(regPath, HKEY_CURRENT_USER_STR) == regPath) { hRootKey = HKEY_CURRENT_USER; } else if (strstr(regPath, HKEY_LOCAL_MACHINE_STR) == regPath) { hRootKey = HKEY_LOCAL_MACHINE; } else if (strstr(regPath, HKEY_USERS_STR) == regPath) { hRootKey = HKEY_USERS; } else if (strstr(regPath, HKEY_CURRENT_CONFIG_STR) == regPath) { hRootKey = HKEY_CURRENT_CONFIG; } else { return FALSE; } key = strchr(regPath, '\\') + 1; value = strrchr(regPath, '\\') + 1; *(value - 1) = 0; HKEY hKey; unsigned long datatype; BOOL result = FALSE; if ((wow64 && RegOpenKeyEx(hRootKey, key, 0, KEY_READ | KEY_WOW64_64KEY, &hKey) == ERROR_SUCCESS) || RegOpenKeyEx(hRootKey, key, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { result = RegQueryValueEx(hKey, value, NULL, &datatype, buffer, &bufferLength) == ERROR_SUCCESS; RegCloseKey(hKey); } *(value - 1) = '\\'; return result; } int findNextVersionPart(const char* startAt) { if (startAt == NULL || strlen(startAt) == 0) { return 0; } char* firstSeparatorA = strchr(startAt, '.'); char* firstSeparatorB = strchr(startAt, '_'); char* firstSeparator; if (firstSeparatorA == NULL) { firstSeparator = firstSeparatorB; } else if (firstSeparatorB == NULL) { firstSeparator = firstSeparatorA; } else { firstSeparator = min(firstSeparatorA, firstSeparatorB); } if (firstSeparator == NULL) { return strlen(startAt); } return firstSeparator - startAt; } /** * This method will take java version from `originalVersion` string and convert/format it * into `version` string that can be used for string comparison with other versions. * * Due to different version schemas <=8 vs. >=9 it will "normalize" versions to 1 format * so we can directly compare old and new versions. */ void formatJavaVersion(char* version, const char* originalVersion) { strcpy(version, ""); if (originalVersion == NULL || strlen(originalVersion) == 0) { return; } int partsAdded = 0; int i; char* pos = (char*) originalVersion; int curPartLen; while ((curPartLen = findNextVersionPart(pos)) > 0) { char number[curPartLen + 1]; memset(number, 0, curPartLen + 1); strncpy(number, pos, curPartLen); if (partsAdded == 0 && (curPartLen != 1 || number[0] != '1')) { // NOTE: When it's java 9+ we'll add "1" as the first part of the version strcpy(version, "1"); partsAdded++; } if (partsAdded < 3) { if (partsAdded > 0) { strcat(version, "."); } for (i = 0; (partsAdded > 0) && (i < JRE_VER_MAX_DIGITS_PER_PART - strlen(number)); i++) { strcat(version, "0"); } strcat(version, number); } else if (partsAdded == 3) { // add as an update strcat(version, "_"); for (i = 0; i < JRE_VER_MAX_DIGITS_PER_PART - strlen(number); i++) { strcat(version, "0"); } strcat(version, number); } else if (partsAdded >= 4) { debug("Warning:\tformatJavaVersion() too many parts added.\n"); break; } partsAdded++; pos += curPartLen + 1; if (pos >= originalVersion + strlen(originalVersion)) { break; } } for (i = partsAdded; i < 3; i++) { strcat(version, "."); int j; for (j = 0; j < JRE_VER_MAX_DIGITS_PER_PART; j++) { strcat(version, "0"); } } } void regSearch(const char* keyName, const int searchType) { HKEY hKey; const DWORD wow64KeyMask = searchType & KEY_WOW64_64KEY; debug("%s-bit search:\t%s...\n", wow64KeyMask ? "64" : "32", keyName); if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, KEY_READ | wow64KeyMask, &hKey) == ERROR_SUCCESS) { return; } DWORD x = 0; unsigned long versionSize = _MAX_PATH; FILETIME time; char fullKeyName[_MAX_PATH] = {0}; char originalVersion[_MAX_PATH] = {0}; char version[_MAX_PATH] = {0}; while (RegEnumKeyEx( hKey, // handle to key to enumerate x++, // index of subkey to enumerate originalVersion,// address of buffer for subkey name &versionSize, // address for size of subkey buffer NULL, // reserved NULL, // address of buffer for class string NULL, // address for size of class buffer &time) == ERROR_SUCCESS) { strcpy(fullKeyName, keyName); appendPath(fullKeyName, originalVersion); debug("Check:\t\t%s\n", fullKeyName); formatJavaVersion(version, originalVersion); if (strcmp(version, search.javaMinVer) >= 0 && (!*search.javaMaxVer || strcmp(version, search.javaMaxVer) <= 0) && strcmp(version, search.foundJavaVer) > 0 && isJavaHomeValid(fullKeyName, searchType)) { strcpy(search.foundJavaVer, version); strcpy(search.foundJavaKey, fullKeyName); search.foundJava = searchType; debug("Match:\t\t%s\n", version); } else { debug("Ignore:\t\t%s\n", version); } versionSize = _MAX_PATH; } RegCloseKey(hKey); } BOOL isJavaHomeValid(const char* keyName, const int searchType) { BOOL valid = FALSE; HKEY hKey; char path[_MAX_PATH] = {0}; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, KEY_READ | (searchType & KEY_WOW64_64KEY), &hKey) == ERROR_SUCCESS) { unsigned char buffer[_MAX_PATH] = {0}; unsigned long bufferlength = _MAX_PATH; unsigned long datatype; if (RegQueryValueEx(hKey, "JavaHome", NULL, &datatype, buffer, &bufferlength) == ERROR_SUCCESS) { int i = 0; do { path[i] = buffer[i]; } while (path[i++] != 0); valid = isLauncherPathValid(path); } RegCloseKey(hKey); } if (valid) { strcpy(search.foundJavaHome, path); } else { search.corruptedJreFound = TRUE; } return valid; } BOOL isLauncherPathValid(const char* path) { struct _stat statBuf; char launcherPath[_MAX_PATH] = {0}; BOOL result = FALSE; if (*path) { strcpy(launcherPath, path); appendLauncher(launcherPath); result = _stat(launcherPath, &statBuf) == 0; if (!result) { // Don't display additional info in the error popup. SetLastError(0); } } debug("Check launcher:\t%s %s\n", launcherPath, result ? "(OK)" : "(not found)"); return result; } void regSearchWow(const char* keyName, const int searchType) { if (search.runtimeBits == INIT_RUNTIME_BITS) { search.runtimeBits = loadInt(RUNTIME_BITS); } switch (search.runtimeBits) { case USE_64_BIT_RUNTIME: if (wow64) { regSearch(keyName, searchType | KEY_WOW64_64KEY); } break; case USE_64_AND_32_BIT_RUNTIME: if (wow64) { regSearch(keyName, searchType | KEY_WOW64_64KEY); if ((search.foundJava & KEY_WOW64_64KEY) != NO_JAVA_FOUND) { break; } } regSearch(keyName, searchType); break; case USE_32_AND_64_BIT_RUNTIME: regSearch(keyName, searchType); if (search.foundJava != NO_JAVA_FOUND && (search.foundJava & KEY_WOW64_64KEY) == NO_JAVA_FOUND) { break; } if (wow64) { regSearch(keyName, searchType | KEY_WOW64_64KEY); } break; case USE_32_BIT_RUNTIME: regSearch(keyName, searchType); break; default: debug("Runtime bits:\tFailed to load.\n"); break; } } void regSearchJreSdk(const char* jreKeyName, const char* sdkKeyName, const int jdkPreference) { if (jdkPreference == JDK_ONLY || jdkPreference == PREFER_JDK) { regSearchWow(sdkKeyName, FOUND_SDK); if (jdkPreference != JDK_ONLY) { regSearchWow(jreKeyName, FOUND_JRE); } } else { // jdkPreference == JRE_ONLY or PREFER_JRE regSearchWow(jreKeyName, FOUND_JRE); if (jdkPreference != JRE_ONLY) { regSearchWow(sdkKeyName, FOUND_SDK); } } } BOOL findJavaHome(char* path, const int jdkPreference) { debugAll("findJavaHome()\n"); regSearchJreSdk("SOFTWARE\\JavaSoft\\Java Runtime Environment", "SOFTWARE\\JavaSoft\\Java Development Kit", jdkPreference); // Java 9 support regSearchJreSdk("SOFTWARE\\JavaSoft\\JRE", "SOFTWARE\\JavaSoft\\JDK", jdkPreference); // IBM Java 1.8 if (search.foundJava == NO_JAVA_FOUND) { regSearchJreSdk("SOFTWARE\\IBM\\Java Runtime Environment", "SOFTWARE\\IBM\\Java Development Kit", jdkPreference); } // IBM Java 1.7 and earlier if (search.foundJava == NO_JAVA_FOUND) { regSearchJreSdk("SOFTWARE\\IBM\\Java2 Runtime Environment", "SOFTWARE\\IBM\\Java Development Kit", jdkPreference); } if (search.foundJava != NO_JAVA_FOUND) { strcpy(path, search.foundJavaHome); debug("Runtime used:\t%s (%s-bit)\n", search.foundJavaVer, (search.foundJava & KEY_WOW64_64KEY) != NO_JAVA_FOUND ? "64" : "32"); return TRUE; } return FALSE; } /* * Extract the executable name, returns path length. */ int getExePath(char* exePath) { if (GetModuleFileName(hModule, exePath, _MAX_PATH) == 0) { return -1; } return strrchr(exePath, '\\') - exePath; } /** * exeւ̃tpX(*.exe)󂯎A*.cfgɂpX𐶐 */ void getCfgPath(const char *exePath, char *cfgPath) { strcpy(cfgPath, exePath); strcpy(cfgPath + strlen(cfgPath) - 4, ".cfg"); } void appendPath(LPTSTR basepath, LPCTSTR path) { LPCTSTR pLast = basepath; while (*pLast++); // ܂ňړ pLast = CharPrev(basepath, pLast); // ꕶ߂ (MBCS) if (*pLast != '\\') { strcat(basepath, "\\"); } strcat(basepath, path); } void appendLauncher(char* jrePath) { if (console) { appendPath(jrePath, "bin\\java.exe"); } else { appendPath(jrePath, "bin\\javaw.exe"); } } void appendAppClasspath(char* dst, const char* src) { strcat(dst, src); strcat(dst, ";"); } /** * w肵fBNgeɂ̂ڂĎw肵t@CEtH_Ɉv * pXdstɒNjLB݂Ȃꍇ͉ȂB * @param dst ꂽpXNjLobt@ * @param dir \̃fBNgA܂͍ŏɎw肷̂EXEւ̃tpX(*.exe)w肷B * @param name 閼O(A\B\Ĉ悤ɃtH_؂肪Ăǂ) * @return ꂽꍇTRUEAȂꍇFALSE */ BOOL findAncestor(char* dst, const char *dir, const char* name) { // etH_ char parent[MAX_PATH]; strcpy(parent, dir); char *p = parent; while (*p++); // Ɉړ // UNC`̏ꍇ(lbg[NpX̏ꍇ) // ŏ̃tH_܂ł͌ŒɂB // (ex.) \\ABC\DEF\XYZ ̏ꍇA\\ABC\DEF\ kȂ char *top = parent; if (*top == '\\' && *(top + 1) == '\\') { top += 2; while(*top && *top != '\\') top = CharNext(top); } while (p > top) { if (*p == '\\' && *(p + 1)) { // ݂̖̃tH_؂ȊOł΁A𖖔ɂ // C:\a\b\c.exe Jnꍇ́AC:\a\b\ }b`B // C:\a\b\ ŊJnꍇ́AC:\a\ }b`B // C:\a\ ŊJnꍇ́AC:\ }b`B // C:\ ŊJnꍇ̓}b`̂Ȃ̂ŏI // UNC` \\ABC\DEF\XYZ.exe ŊJnꍇ\\ABC\DEF\ }b` // UNC` \\ABC\DEF\ ŊJnꍇ́A\\ABC\DEF\kȂ̂ŏI *(p + 1) = 0; break; } p = CharPrev(parent, p); } if (strcmp(dir, parent) == 0) { // ωȂȂ̂ŁAłɌς݂̂͂ debug("Not Found\n"); return FALSE; } // tH_ + name ŃtpX쐬 char temp[MAX_PATH] = { 0 }; strcpy(temp, parent); strcat(temp, name); // t@C܂̓tH_̎݃`FbN debug("check exist: %s\n", temp); DWORD attr = GetFileAttributes(temp); if (attr != -1) { // pX݂OK. strcat(dst, temp); debug("Found: %s\n", temp); return TRUE; } // XɁA̐e findAncestor(dst, parent, name); } /** * w肵fBNgeɂ̂ڂāAZ~Rŋ؂ꂽ * t@CEtH_ɈvpXdstɒNjLB * ݂Ȃꍇ͉ȂB * Z~Rŋ؂O͐擪̂̂珇Ԃɕ]A * ŏɂ݂‚_ŊB * @param dst ꂽpXNjLobt@ * @param dir ŏɎw肷̂EXEւ̃tpX(*.exe)w肷B * @param name 閼O(A\B\Ĉ悤ɃtH_؂肪Ăǂ) * @return ꂽꍇTRUEAȂꍇFALSE */ BOOL multiFindAncestor(char* dst, const char *dir, const char* names) { char name[MAX_PATH]; const char *p = names; while (*p) { // Z~R܂͖܂ł̖Oo char *d = name; while (*p && *p != ';') *d++ = *p++; *d = 0; if (*p) p++; // Z~Rł1i߂ if (*name) { // oOfindAncestors debug("FIND_ANCESTOR: %s\n", name); if (findAncestor(dst, dir, name)) { return TRUE; } } } // ׂȂȂꍇ return FALSE; } /** * java̎st@C64/32rbĝł邩 ԂB * uϐ:X86,X64v̂悤ɁAϐɃR‚ĕ\włB * x86, x64 ̏ɃJ}ŋ؂Aȗꂽꍇ́ux86vux64vƂȂB * @param dst ϐWJ * @param args ϐ̌ɕt^BłǂB */ void jreArch(char* dst, const char* args) { char tempBuf[MAX_PATH] = { 0 }; LPCTSTR displayArchs[] = { "x86", "x64" }; if (*args == ':') { strcpy(tempBuf, args + 1); displayArchs[0] = tempBuf; // x86p int idx = 1; char *p = tempBuf; while (*p) { if (*p == ',') { *p = 0; displayArchs[1] = p + 1; // J}؂x64p break; } p = CharNext(p); } } char launcherPath[MAX_PATH] = { 0 }; strcpy(launcherPath, search.foundJavaHome); appendLauncher(launcherPath); PE6432 peType = CheckPE6432(launcherPath); debug("PE Type: %s = %d\n", launcherPath, peType); if (peType == PE_X64) { strcat(dst, displayArchs[1]); } else if (peType == PE_X86) { strcat(dst, displayArchs[0]); } } /* * Expand environment %variables% */ BOOL expandVars(char *dst, const char *src, const char *exePath, const int pathLen) { char varName[STR] = {0}; char varValue[MAX_VAR_SIZE] = {0}; while (strlen(src) > 0) { char *start = strchr(src, '%'); if (start != NULL) { char *end = strchr(start + 1, '%'); if (end == NULL) { return FALSE; } // Copy content up to %VAR% strncat(dst, src, start - src); // Insert value of %VAR% *varName = 0; strncat(varName, start + 1, end - start - 1); // Remember value start for logging char *currentVarValue = dst + strlen(dst); if (strstr(varName, "FIND_ANCESTOR:") == varName) { char *findNames = varName + 14; multiFindAncestor(dst, exePath, findNames); } else if (strstr(varName, "JRE_ARCH") == varName) { char *findName = varName + 8; jreArch(dst, findName); } else if (strcmp(varName, "EXEDIR") == 0) { strncat(dst, exePath, pathLen); } else if (strcmp(varName, "EXEFILE") == 0) { strcat(dst, exePath); } else if (strcmp(varName, "PWD") == 0) { GetCurrentDirectory(_MAX_PATH, dst + strlen(dst)); } else if (strcmp(varName, "OLDPWD") == 0) { strcat(dst, oldPwd); } else if (strcmp(varName, "JREHOMEDIR") == 0) { strcat(dst, search.foundJavaHome); } else if (strstr(varName, HKEY_STR) == varName) { regQueryValue(varName, dst + strlen(dst), BIG_STR); } else if (strcmp(varName, "") == 0) { strcat(dst, "%"); } else if (GetEnvironmentVariable(varName, varValue, MAX_VAR_SIZE) > 0) { strcat(dst, varValue); } debug("Substitute:\t%s = %s\n", varName, currentVarValue); src = end + 1; } else { // Copy remaining content strcat(dst, src); break; } } return TRUE; } void appendHeapSizes(char *dst) { MEMORYSTATUSEX statex; statex.dwLength = sizeof(statex); GlobalMemoryStatusEx(&statex); appendHeapSize(dst, INITIAL_HEAP_SIZE, INITIAL_HEAP_PERCENT, statex.ullAvailPhys, "-Xms"); appendHeapSize(dst, MAX_HEAP_SIZE, MAX_HEAP_PERCENT, statex.ullAvailPhys, "-Xmx"); } void appendHeapSize(char *dst, const int megabytesID, const int percentID, const DWORDLONG availableMemory, const char *option) { const int mb = 1048576; // 1 MB const int mbLimit32 = 1024; // Max heap size in MB on 32-bit JREs const int megabytes = loadInt(megabytesID); const int percent = loadInt(percentID); const int availableMb = availableMemory * percent / (100 * mb); // 100% * 1 MB int heapSizeMb = availableMb > megabytes ? availableMb : megabytes; if (heapSizeMb > 0) { if (!(search.foundJava & KEY_WOW64_64KEY) && heapSizeMb > mbLimit32) { debug("Heap limit:\tReduced %d MB heap size to 32-bit maximum %d MB\n", heapSizeMb, mbLimit32); heapSizeMb = mbLimit32; } debug("Heap %s:\tRequested %d MB / %d%%, Available: %d MB, Heap size: %d MB\n", option, megabytes, percent, (int)(availableMemory / mb), heapSizeMb); strcat(dst, option); _itoa(heapSizeMb, dst + strlen(dst), 10); // 10 -- radix strcat(dst, "m "); } } void setJvmOptions(char *jvmOptions, const char *exePath, const int pathLen) { // \[Xɖߍ񂾌ŒJVMIvV if (loadString(JVM_OPTIONS, jvmOptions)) { strcat(jvmOptions, " "); } // *.cfgt@CIvV̓ǂݎ char cfgPath[MAX_PATH]; getCfgPath(exePath, cfgPath); char optbuf[MAX_VAR_SIZE] = { 0 }; // 32kbytes char optValue[MAX_ARGS] = { 0 }; GetPrivateProfileString("JVM_OPTIONS", NULL, "", optbuf, sizeof(optbuf), cfgPath); char *pOpt = optbuf; char tmp[MAX_ARGS] = {0}; while (*pOpt) { GetPrivateProfileString("JVM_OPTIONS", pOpt, "", optValue, sizeof(optValue), cfgPath); *tmp = 0; expandVars(tmp, optValue, exePath, pathLen); debug("Set jvm_option:\t%s = %s\n", pOpt, tmp); // ϐWJς݃IvVNjL strcat(jvmOptions, tmp); strcat(jvmOptions, " "); while (*pOpt++); } /* * iniݒt@C JVMIvV * Load additional JVM options from .l4j.ini file * Options are separated by spaces or CRLF * # starts an inline comment */ char iniFilePath[_MAX_PATH] = {0}; strncpy(iniFilePath, exePath, strlen(exePath) - 3); strcat(iniFilePath, "l4j.ini"); debug("try loading 1:\t%s\n", iniFilePath); long hFile; if ((hFile = _open(iniFilePath, _O_RDONLY)) == -1) { // *.l4j.iniȂ *.ini Ŏ memset(iniFilePath, 0, sizeof(iniFilePath)); strncpy(iniFilePath, exePath, strlen(exePath) - 3); strcat(iniFilePath, "ini"); debug("try loading 2:\t%s\n", iniFilePath); hFile = _open(iniFilePath, _O_RDONLY); } if (hFile != -1) { debug("Loading:\t%s\n", iniFilePath); const int jvmOptLen = strlen(jvmOptions); char* src = jvmOptions + jvmOptLen; char* dst = src; const int len = _read(hFile, src, MAX_ARGS - jvmOptLen - BIG_STR); BOOL copy = TRUE; int i; for (i = 0; i < len; i++, src++) { if (*src == '#') { copy = FALSE; } else if (*src == 13 || *src == 10) { copy = TRUE; if (dst > jvmOptions && *(dst - 1) != ' ') { *dst++ = ' '; } } else if (copy) { *dst++ = *src; } } *dst = 0; if (len > 0 && *(dst - 1) != ' ') { strcat(jvmOptions, " "); } _close(hFile); } } BOOL createMutex() { char mutexName[STR] = {0}; loadString(MUTEX_NAME, mutexName); if (*mutexName) { debug("Create mutex:\t%s\n", mutexName); SECURITY_ATTRIBUTES security; security.nLength = sizeof(SECURITY_ATTRIBUTES); security.bInheritHandle = TRUE; security.lpSecurityDescriptor = NULL; CreateMutexA(&security, FALSE, mutexName); if (GetLastError() == ERROR_ALREADY_EXISTS) { debug(ERROR_FORMAT, "Instance already exists."); return FALSE; } } return TRUE; } void setWorkingDirectory(const char *exePath, const int pathLen) { char workingDir[_MAX_PATH] = {0}; char tmpPath[_MAX_PATH] = {0}; GetCurrentDirectory(_MAX_PATH, oldPwd); if (loadString(CHDIR, tmpPath)) { strncpy(workingDir, exePath, pathLen); appendPath(workingDir, tmpPath); _chdir(workingDir); debug("Working dir:\t%s\n", workingDir); } } BOOL isValidCfgJrePath(LPCTSTR jrePath, PE6432 *pPEType) { // java.exeւ̃pX char launcherPath[MAX_PATH] = { 0 }; strcpy(launcherPath, jrePath); appendLauncher(launcherPath); // 64/32bit PE6432 peType = CheckPE6432(launcherPath); if (pPEType) { *pPEType = peType; } if (peType != PE_UNKNOWN) { int runtimeBits = loadInt(RUNTIME_BITS); switch (peType) { case PE_X86: if (runtimeBits == USE_64_BIT_RUNTIME) { // 64rbgvĂ̂java.exe32rbgȂ̂ŕs return FALSE; } search.foundJava = FOUND_BUNDLED; break; case PE_X64: if (!wow64 || runtimeBits == USE_32_BIT_RUNTIME) { // 32rbgvĂ̂java.exe64rbgȂ̂ŕs // ͌64rbgOSłȂ̂java.exe64rbg̏ꍇ // ({head32rbgŃrh邽߁A64rbgOSłwow64Ŏs) return FALSE; } search.foundJava = FOUND_BUNDLED | KEY_WOW64_64KEY; break; } return TRUE; } return FALSE; } BOOL cfgJreSearch(const char *exePath, int pathLen) { char tmpPath[MAX_PATH] = { 0 }; char cfgPath[MAX_PATH] = { 0 }; getCfgPath(exePath, cfgPath); GetPrivateProfileString("Settings", "JAVA_HOME", "", tmpPath, MAX_PATH, cfgPath); if (strlen(tmpPath) > 0) { char jrePath[MAX_ARGS] = {0}; expandVars(jrePath, tmpPath, exePath, pathLen); debug("Config JRE:\t%s\n", jrePath); PE6432 peType = PE_UNKNOWN; if (isValidCfgJrePath(jrePath, &peType)) { strcpy(launcher.cmd, jrePath); strcpy(search.foundJavaHome, launcher.cmd); { switch (peType) { case PE_X86: search.foundJava = FOUND_BUNDLED; return TRUE; case PE_X64: search.foundJava = FOUND_BUNDLED | KEY_WOW64_64KEY; return TRUE; } } } } return FALSE; } BOOL chooseJavaHome(char *path, PE6432 *pPEType) { // tH_I_CAOɕ\郁bZ[W̓G[bZ[Wؗp createJreSearchError(); BROWSEINFO bInfo = { 0 }; bInfo.hwndOwner = NULL; bInfo.pidlRoot = NULL; bInfo.pszDisplayName = path; bInfo.lpszTitle = error.msg; bInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; for (;;) { LPITEMIDLIST result = SHBrowseForFolder(&bInfo); if (result == NULL) { // LZ return FALSE; } SHGetPathFromIDList(result, path); if (isValidCfgJrePath(path, pPEType)) { return TRUE; } } } BOOL bundledJreSearch(const char *exePath, const int pathLen) { debugAll("bundledJreSearch()\n"); char tmpPath[_MAX_PATH] = {0}; BOOL is64BitJre = loadBool(BUNDLED_JRE_64_BIT); if (!wow64 && is64BitJre) { debug("Bundled JRE:\tCannot use 64-bit runtime on 32-bit OS.\n"); return FALSE; } if (loadString(JRE_PATH, tmpPath)) { char jrePath[MAX_ARGS] = {0}; expandVars(jrePath, tmpPath, exePath, pathLen); debug("Bundled JRE:\t%s\n", jrePath); if (jrePath[0] == '\\' || jrePath[1] == ':') { // Absolute strcpy(launcher.cmd, jrePath); } else { // Relative strncpy(launcher.cmd, exePath, pathLen); appendPath(launcher.cmd, jrePath); } if (isLauncherPathValid(launcher.cmd)) { search.foundJava = is64BitJre ? FOUND_BUNDLED | KEY_WOW64_64KEY : FOUND_BUNDLED; strcpy(search.foundJavaHome, launcher.cmd); return TRUE; } } return FALSE; } BOOL installedJreSearch() { debugAll("installedJreSearch()\n"); return *search.javaMinVer && findJavaHome(launcher.cmd, loadInt(JDK_PREFERENCE)); } void createJreSearchError() { if (*search.javaMinVer) { loadString(JRE_VERSION_ERR, error.msg); strcat(error.msg, " "); strcat(error.msg, search.originalJavaMinVer); if (*search.javaMaxVer) { strcat(error.msg, " - "); strcat(error.msg, search.originalJavaMaxVer); } if (search.runtimeBits == USE_64_BIT_RUNTIME || search.runtimeBits == USE_32_BIT_RUNTIME) { strcat(error.msg, " ("); strcat(error.msg, search.runtimeBits == USE_64_BIT_RUNTIME ? "64" : "32"); strcat(error.msg, "-bit)"); } if (search.corruptedJreFound) { char launcherErrMsg[BIG_STR] = {0}; if (loadString(LAUNCHER_ERR, launcherErrMsg)) { strcat(error.msg, "\n"); strcat(error.msg, launcherErrMsg); } } loadString(DOWNLOAD_URL, error.url); } else { loadString(BUNDLED_JRE_ERR, error.msg); } } BOOL jreSearch(const char *exePath, const int pathLen) { debugAll("jreSearch()\n"); BOOL result = TRUE; // *.cfgɑOIJAVA_HOMEL^Ă΁AD悷 // L^ĂȂAJAVA_HOMEƂđÓłȂ΃oh܂̓WXǧs if (!cfgJreSearch(exePath, pathLen)) { search.bundledJreAsFallback = loadBool(BUNDLED_JRE_AS_FALLBACK); loadString(JAVA_MIN_VER, search.originalJavaMinVer); formatJavaVersion(search.javaMinVer, search.originalJavaMinVer); debug("Java min ver:\t%s\n", search.javaMinVer); loadString(JAVA_MAX_VER, search.originalJavaMaxVer); formatJavaVersion(search.javaMaxVer, search.originalJavaMaxVer); debug("Java max ver:\t%s\n", search.javaMaxVer); if (search.bundledJreAsFallback) { if (!installedJreSearch()) { result = bundledJreSearch(exePath, pathLen); } } else { if (!bundledJreSearch(exePath, pathLen)) { result = installedJreSearch(); } } if (!result) { // oȟƃWXǧsꍇ // [U[JAVA_HOMȆI߂ char jrePath[MAX_PATH] = { 0 }; PE6432 peType = PE_UNKNOWN; if (chooseJavaHome(jrePath, &peType)) { // LJAVA_HOMEIꍇ switch (peType) { case PE_X86: search.foundJava = FOUND_CHOOSED; break; case PE_X64: search.foundJava = FOUND_CHOOSED | KEY_WOW64_64KEY; break; } strcpy(launcher.cmd, jrePath); strcpy(search.foundJavaHome, launcher.cmd); // Ƃ݂Ȃ result = TRUE; } else { // G[\̏ createJreSearchError(); } } } return result; } /* * Append a path to the Path environment variable */ BOOL appendToPathVar(const char* path) { char chBuf[MAX_VAR_SIZE] = {0}; const int pathSize = GetEnvironmentVariable("Path", chBuf, MAX_VAR_SIZE); if (MAX_VAR_SIZE - pathSize - 1 < strlen(path)) { return FALSE; } strcat(chBuf, ";"); strcat(chBuf, path); return SetEnvironmentVariable("Path", chBuf); } BOOL appendJreBinToPathVar() { // Append a path to the Path environment variable char jreBinPath[_MAX_PATH] = {0}; strcpy(jreBinPath, launcher.cmd); strcat(jreBinPath, "\\bin"); if (!appendToPathVar(jreBinPath)) { debug(ERROR_FORMAT, "appendToPathVar failed."); return FALSE; } return TRUE; } void setEnvironmentVariables(const char *exePath, const int pathLen) { char tmp[MAX_ARGS] = {0}; // \[Xɖߍ܂Ëϐ̓WJ char envVars[MAX_VAR_SIZE] = {0}; loadString(ENV_VARIABLES, envVars); char *var = strtok(envVars, "\t"); while (var != NULL) { char *varValue = strchr(var, '='); *varValue++ = 0; *tmp = 0; expandVars(tmp, varValue, exePath, pathLen); debug("Set var:\t%s = %s\n", var, tmp); SetEnvironmentVariable(var, tmp); var = strtok(NULL, "\t"); } // *.cfgt@C‹ϐ̓ǂݎ char cfgPath[MAX_PATH]; getCfgPath(exePath, cfgPath); debug("cfgPath: %s\n", cfgPath); char envbuf[MAX_VAR_SIZE] = { 0 }; // 32kbytes char envValue[MAX_ARGS] = { 0 }; GetPrivateProfileString("Environments", NULL, "", envbuf, sizeof(envbuf), cfgPath); char *pEnv = envbuf; while (*pEnv) { GetPrivateProfileString("Environments", pEnv, "", envValue, sizeof(envValue), cfgPath); *tmp = 0; expandVars(tmp, envValue, exePath, pathLen); debug("Set var:\t%s = %s\n", pEnv, tmp); SetEnvironmentVariable(pEnv, tmp); while (*pEnv++); } } void setMainClassAndClassPath(const char *exePath, const int pathLen) { char classPath[MAX_ARGS] = {0}; char expandedClassPath[MAX_ARGS] = {0}; char jar[_MAX_PATH] = {0}; char fullFileName[_MAX_PATH] = {0}; const BOOL wrapper = loadBool(WRAPPER); loadString(JAR, jar); if (loadString(MAIN_CLASS, launcher.mainClass)) { debug("Main class:\t%s\n", launcher.mainClass); if (!loadString(CLASSPATH, classPath)) { debug("Info:\t\tClasspath not defined.\n"); } expandVars(expandedClassPath, classPath, exePath, pathLen); strcat(launcher.args, "-classpath \""); if (wrapper) { appendAppClasspath(launcher.args, exePath); } else if (*jar) { appendAppClasspath(launcher.args, jar); } // Deal with wildcards or >> strcat(launcherArgs, exp); << char* cp = strtok(expandedClassPath, ";"); while(cp != NULL) { debug("Add classpath:\t%s\n", cp); if (strpbrk(cp, "*?") != NULL) { char* lastBackslash = strrchr(cp, '\\'); int pathLen = lastBackslash != NULL ? lastBackslash - cp + 1 : 0; *fullFileName = 0; strncpy(fullFileName, cp, pathLen); char* fileName = fullFileName + pathLen; *fileName = 0; struct _finddata_t c_file; long hFile; if ((hFile = _findfirst(cp, &c_file)) != -1L) { do { strcpy(fileName, c_file.name); appendAppClasspath(launcher.args, fullFileName); debug(" \" :\t%s\n", fullFileName); } while (_findnext(hFile, &c_file) == 0); } _findclose(hFile); } else { appendAppClasspath(launcher.args, cp); } cp = strtok(NULL, ";"); } *(launcher.args + strlen(launcher.args) - 1) = 0; strcat(launcher.args, "\" "); strcat(launcher.args, launcher.mainClass); } else if (wrapper) { strcat(launcher.args, "-jar \""); strcat(launcher.args, exePath); strcat(launcher.args, "\""); } else { strcat(launcher.args, "-jar \""); strncat(launcher.args, exePath, pathLen); appendPath(launcher.args, jar); strcat(launcher.args, "\""); } } void setCommandLineArgs(const char *lpCmdLine, const char *exePath, const int pathLen) { char tmp[MAX_ARGS] = {0}; // Constant command line arguments if (loadString(CMD_LINE, tmp)) { char tmp2[MAX_ARGS] = { 0 }; expandVars(tmp2, tmp, exePath, pathLen); debug("constant commandline args: %s\r\n", tmp2); strcat(launcher.args, " "); strcat(launcher.args, tmp2); } // Command line arguments if (*lpCmdLine) { strcpy(tmp, lpCmdLine); char* dst; while ((dst = strstr(tmp, "--l4j-")) != NULL) { char* src = strchr(dst, ' '); if (src == NULL || *(src + 1) == 0) { *dst = 0; } else { strcpy(dst, src + 1); } } if (*tmp) { strcat(launcher.args, " "); strcat(launcher.args, tmp); } } } int prepare(const char *lpCmdLine) { if (!initGlobals()) { return FALSE; } // Get executable path char exePath[_MAX_PATH] = {0}; int pathLen = getExePath(exePath); if (pathLen == -1) { return FALSE; } if (!initializeLogging(lpCmdLine, exePath, pathLen)) { return FALSE; } setWow64Flag(); // Set default error message, title and optional support web site url. loadString(ERR_TITLE, error.title); loadString(SUPPORT_URL, error.url); if (!loadString(STARTUP_ERR, error.msg)) { debug(ERROR_FORMAT, "Startup error message not defined."); return FALSE; } // Single instance if (!createMutex()) { return ERROR_ALREADY_EXISTS; } setWorkingDirectory(exePath, pathLen); if (!jreSearch(exePath, pathLen)) { return FALSE; } if (!appendJreBinToPathVar()) { return FALSE; } setEnvironmentVariables(exePath, pathLen); processPriority = loadInt(PRIORITY_CLASS); appendLauncher(launcher.cmd); appendHeapSizes(launcher.args); char jvmOptions[MAX_ARGS] = {0}; setJvmOptions(jvmOptions, exePath, pathLen); expandVars(launcher.args, jvmOptions, exePath, pathLen); setMainClassAndClassPath(exePath, pathLen); setCommandLineArgs(lpCmdLine, exePath, pathLen); debug("Launcher:\t%s\n", launcher.cmd); debug("Launcher args:\t%s\n", launcher.args); debug("Args length:\t%d/32768 chars\n", strlen(launcher.args)); return TRUE; } void closeProcessHandles() { CloseHandle(processInformation.hThread); CloseHandle(processInformation.hProcess); } BOOL execute(const BOOL wait, DWORD *dwExitCode) { STARTUPINFO si; memset(&processInformation, 0, sizeof(processInformation)); memset(&si, 0, sizeof(si)); si.cb = sizeof(si); char cmdline[MAX_ARGS] = {0}; strcpy(cmdline, "\""); strcat(cmdline, launcher.cmd); strcat(cmdline, "\" "); strcat(cmdline, launcher.args); if (CreateProcess(NULL, cmdline, NULL, NULL, TRUE, processPriority, NULL, NULL, &si, &processInformation)) { if ((search.foundJava & FOUND_CHOOSED) != 0) { // [U[JAVA_HOMEIċNꍇ́A // vZXNĂɃG[邩ǂɂ߂ WaitForInputIdle(processInformation.hProcess, 10000); // bZ[W[ṽACh҂ WaitForSingleObject(processInformation.hProcess, 3000); // 3b܂ // _̏IR[h𓾂 GetExitCodeProcess(processInformation.hProcess, dwExitCode); debug("Java PreExitCode: %ld\n", *dwExitCode); if (*dwExitCode == STILL_ACTIVE) { // ܂IĂȂ0ݒ肷 *dwExitCode = 0; } if (*dwExitCode == 0) { // NɃG[Ă̂łȂ // JAVA_HOME͐̂Ƃ݂ȂA // oh܂̓WXǧɐJAVA_HOMEA // ܂̓[U[IJAVA_HOMEA*.cfgɕۑ // (ɏ݋֎~ŏ߂ȂĂi͂Ȃ) char exePath[MAX_PATH] = { 0 }; char cfgPath[MAX_PATH] = { 0 }; getExePath(exePath); getCfgPath(exePath, cfgPath); int saveJavaHome = GetPrivateProfileInt("Settings", "SaveJavaHome", 1, cfgPath); if (saveJavaHome) { // JAVA_HOME̕ۑtO0łȂΎgpJAVA_HOMEL^ WritePrivateProfileString("Settings", "JAVA_HOME", search.foundJavaHome, cfgPath); } } } if (wait) { // I҂w肳ĂΎqvZXIҋ@ WaitForSingleObject(processInformation.hProcess, INFINITE); GetExitCodeProcess(processInformation.hProcess, dwExitCode); } // ҋ@KvȂȂ̂Ȃnh͔jĂ closeProcessHandles(); return TRUE; } *dwExitCode = -1; return FALSE; } const char* getJavaHome() { return search.foundJavaHome; } const char* getMainClass() { return launcher.mainClass; } const char* getLauncherArgs() { return launcher.args; } CharacterManaJ/src/Launch4JStub/head_src/consolehead/0000755000175000017500000000000013615720000022654 5ustar paulliupaulliuCharacterManaJ/src/Launch4JStub/head_src/consolehead/Makefile.win0000644000175000017500000000200713615720000025107 0ustar paulliupaulliu# Project: consolehead # Makefile created by Dev-C++ 4.9.9.2 CPP = g++.exe CC = gcc.exe WINDRES = windres.exe RES = OBJ = ../../head/consolehead.o ../../head/head.o $(RES) LINKOBJ = ../../head/consolehead.o ../../head/head.o $(RES) LIBS = -L"C:/Dev-Cpp/lib" -n -s INCS = -I"C:/Dev-Cpp/include" CXXINCS = -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" BIN = consolehead.exe CXXFLAGS = $(CXXINCS) -fexpensive-optimizations -O3 CFLAGS = $(INCS) -fexpensive-optimizations -O3 RM = rm -f .PHONY: all all-before all-after clean clean-custom all: all-before consolehead.exe all-after clean: clean-custom ${RM} $(OBJ) $(BIN) $(BIN): $(OBJ) # $(CC) $(LINKOBJ) -o "consolehead.exe" $(LIBS) ../../head/consolehead.o: consolehead.c $(CC) -c consolehead.c -o ../../head/consolehead.o $(CFLAGS) ../../head/head.o: ../head.c $(CC) -c ../head.c -o ../../head/head.o $(CFLAGS) CharacterManaJ/src/Launch4JStub/head_src/consolehead/consolehead.dev0000644000175000017500000000265513615720000025650 0ustar paulliupaulliu[Project] FileName=consolehead.dev Name=consolehead UnitCount=4 Type=1 Ver=1 ObjFiles= Includes= Libs= PrivateResource= ResourceIncludes= MakeIncludes= Compiler= CppCompiler= Linker=-n_@@_ IsCpp=0 Icon= ExeOutput= ObjectOutput=..\..\head OverrideOutput=0 OverrideOutputName=consolehead.exe HostApplication= Folders= CommandLine= UseCustomMakefile=1 CustomMakefile=Makefile.win IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 CompilerSettings=0000000001001000000100 [Unit1] FileName=consolehead.c CompileCpp=0 Folder=consolehead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [VersionInfo] Major=0 Minor=1 Release=1 Build=1 LanguageID=1033 CharsetID=1252 CompanyName= FileVersion= FileDescription=Developed using the Dev-C++ IDE InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion= AutoIncBuildNr=0 [Unit2] FileName=..\resource.h CompileCpp=0 Folder=consolehead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit3] FileName=..\head.c CompileCpp=0 Folder=consolehead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit4] FileName=..\head.h CompileCpp=0 Folder=consolehead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit5] FileName=..\head.rc Folder=consolehead Compile=1 Link=0 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit6] FileName=..\resid.h CompileCpp=0 Folder=consolehead Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= CharacterManaJ/src/Launch4JStub/head_src/consolehead/consolehead.c0000644000175000017500000000472313615720000025312 0ustar paulliupaulliu/* Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2004, 2007 Grzegorz Kowal Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "../resource.h" #include "../head.h" extern FILE* hLog; BOOL restartOnCrash = FALSE; int main(int argc, char* argv[]) { setConsoleFlag(); LPTSTR cmdLine = GetCommandLine(); if (*cmdLine == '"') { if (*(cmdLine = strchr(cmdLine + 1, '"') + 1)) { cmdLine++; } } else if ((cmdLine = strchr(cmdLine, ' ')) != NULL) { cmdLine++; } else { cmdLine = ""; } int result = prepare(cmdLine); if (result == ERROR_ALREADY_EXISTS) { char errMsg[BIG_STR] = {0}; loadString(INSTANCE_ALREADY_EXISTS_MSG, errMsg); msgBox(errMsg); closeLogFile(); return 2; } if (result != TRUE) { signalError(); return 1; } restartOnCrash = loadBool(RESTART_ON_CRASH); DWORD dwExitCode; do { dwExitCode = 0; if (!execute(TRUE, &dwExitCode)) { signalError(); break; } if (restartOnCrash && dwExitCode != 0) { debug("Exit code:\t%d, restarting the application!\n", dwExitCode); } } while (restartOnCrash && dwExitCode != 0); debug("Exit code:\t%d\n", dwExitCode); closeLogFile(); return (int) dwExitCode; } CharacterManaJ/src/Launch4JStub/head_src/consolehead/.gitignore0000644000175000017500000000004513615720000024643 0ustar paulliupaulliu/consolehead.exe /consolehead.layout CharacterManaJ/src/Launch4JStub/head_src/jniguihead_BETA/0000755000175000017500000000000013615720000023272 5ustar paulliupaulliuCharacterManaJ/src/Launch4JStub/head_src/jniguihead_BETA/Makefile.win0000644000175000017500000000330213615720000025524 0ustar paulliupaulliu# Project: jniguihead # Makefile created by Dev-C++ 5.7.1 CPP = g++.exe CC = gcc.exe WINDRES = windres.exe OBJ = ../../head_jni_BETA/jniguihead.o ../../head_jni_BETA/head.o ../../head_jni_BETA/jnihead.o LINKOBJ = ../../head_jni_BETA/jniguihead.o ../../head_jni_BETA/head.o ../../head_jni_BETA/jnihead.o LIBS = -L"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib" -L"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/lib" -static-libstdc++ -static-libgcc -mwindows -n -s INCS = -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include/win32" CXXINCS = -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include/c++" -I"C:/Program Files (x86)/Java/jdk 1.4/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include/win32" BIN = jniguihead.exe CXXFLAGS = $(CXXINCS) -Os CFLAGS = $(INCS) -Os RM = rm.exe -f .PHONY: all all-before all-after clean clean-custom all: all-before $(BIN) all-after clean: clean-custom ${RM} $(OBJ) $(BIN) $(BIN): $(OBJ) $(CC) $(LINKOBJ) -o $(BIN) $(LIBS) ../../head_jni_BETA/jniguihead.o: jniguihead.c $(CC) -c jniguihead.c -o ../../head_jni_BETA/jniguihead.o $(CFLAGS) ../../head_jni_BETA/head.o: ../head.c $(CC) -c ../head.c -o ../../head_jni_BETA/head.o $(CFLAGS) ../../head_jni_BETA/jnihead.o: ../jnihead.c $(CC) -c ../jnihead.c -o ../../head_jni_BETA/jnihead.o $(CFLAGS) CharacterManaJ/src/Launch4JStub/head_src/jniguihead_BETA/jniguihead.h0000644000175000017500000000346513615720000025562 0ustar paulliupaulliu/* Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2004, 2007 Grzegorz Kowal Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define ID_TIMER 1 #define DEFAULT_SPLASH_TIMEOUT 60 /* 60 seconds */ #define MAX_SPLASH_TIMEOUT 60 * 15 /* 15 minutes */ HWND getInstanceWindow(); BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam); VOID CALLBACK TimerProc( HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime // current system time ); CharacterManaJ/src/Launch4JStub/head_src/jniguihead_BETA/jniguihead.c0000644000175000017500000001421313615720000025546 0ustar paulliupaulliu/* Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2004, 2015 Grzegorz Kowal Sylvain Mina (single instance patch) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "../resource.h" #include "../head.h" #include "../jnihead.h" #include "jniguihead.h" extern FILE* hLog; extern PROCESS_INFORMATION processInformation; HWND hWnd; DWORD dwExitCode = 0; BOOL stayAlive = FALSE; BOOL splash = FALSE; BOOL splashTimeoutErr; BOOL waitForWindow; BOOL restartOnCrash = FALSE; int splashTimeout = DEFAULT_SPLASH_TIMEOUT; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int result = prepare(lpCmdLine); if (result == ERROR_ALREADY_EXISTS) { HWND handle = getInstanceWindow(); ShowWindow(handle, SW_SHOW); SetForegroundWindow(handle); closeLogFile(); return 2; } if (result != TRUE) { signalError(); return 1; } splash = loadBool(SHOW_SPLASH) && strstr(lpCmdLine, "--l4j-no-splash") == NULL; restartOnCrash = loadBool(RESTART_ON_CRASH); // if we should restart on crash, we must also stay alive to check for crashes stayAlive = restartOnCrash || (loadBool(GUI_HEADER_STAYS_ALIVE) && strstr(lpCmdLine, "--l4j-dont-wait") == NULL); if (splash || stayAlive) { hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, "STATIC", "", WS_POPUP | SS_BITMAP, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (splash) { char timeout[10] = {0}; if (loadString(SPLASH_TIMEOUT, timeout)) { splashTimeout = atoi(timeout); if (splashTimeout <= 0 || splashTimeout > MAX_SPLASH_TIMEOUT) { splashTimeout = DEFAULT_SPLASH_TIMEOUT; } } splashTimeoutErr = loadBool(SPLASH_TIMEOUT_ERR) && strstr(lpCmdLine, "--l4j-no-splash-err") == NULL; waitForWindow = loadBool(SPLASH_WAITS_FOR_WINDOW); HANDLE hImage = LoadImage(hInstance, // handle of the instance containing the image MAKEINTRESOURCE(SPLASH_BITMAP), // name or identifier of image IMAGE_BITMAP, // type of image 0, // desired width 0, // desired height LR_DEFAULTSIZE); if (hImage == NULL) { signalError(); return 1; } SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImage); RECT rect; GetWindowRect(hWnd, &rect); int x = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2; int y = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2; SetWindowPos(hWnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); ShowWindow(hWnd, nCmdShow); UpdateWindow (hWnd); } } do { if (splash || stayAlive) { if (!SetTimer (hWnd, ID_TIMER, 1000 /* 1s */, TimerProc)) { signalError(); return 1; } } debug(getJavaHome()); saveJvmOptions(getJavaHome(), getMainClass(), getLauncherArgs()); if (!executeVm(&dwExitCode)) { signalError(); return 1; } if (!(splash || stayAlive)) { debug("Exit code:\t0\n"); closeProcessHandles(); closeLogFile(); return 0; } MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } if (restartOnCrash && dwExitCode != 0) { debug("Exit code:\t%d, restarting the application!\n", dwExitCode); } closeProcessHandles(); } while (restartOnCrash && dwExitCode != 0); debug("Exit code:\t%d\n", dwExitCode); closeLogFile(); return dwExitCode; } HWND getInstanceWindow() { char windowTitle[STR]; char instWindowTitle[STR] = {0}; if (loadString(INSTANCE_WINDOW_TITLE, instWindowTitle)) { HWND handle = FindWindowEx(NULL, NULL, NULL, NULL); while (handle != NULL) { GetWindowText(handle, windowTitle, STR - 1); if (strstr(windowTitle, instWindowTitle) != NULL) { return handle; } else { handle = FindWindowEx(NULL, handle, NULL, NULL); } } } return NULL; } BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam) { DWORD processId; GetWindowThreadProcessId(hwnd, &processId); if (processInformation.dwProcessId == processId) { LONG styles = GetWindowLong(hwnd, GWL_STYLE); if ((styles & WS_VISIBLE) != 0) { splash = FALSE; ShowWindow(hWnd, SW_HIDE); return FALSE; } } return TRUE; } VOID CALLBACK TimerProc( HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime) // current system time { if (splash) { if (splashTimeout == 0) { splash = FALSE; ShowWindow(hWnd, SW_HIDE); if (waitForWindow && splashTimeoutErr) { KillTimer(hwnd, ID_TIMER); signalError(); PostQuitMessage(0); } } else { splashTimeout--; if (waitForWindow) { EnumWindows(enumwndfn, 0); } } } GetExitCodeProcess(processInformation.hProcess, &dwExitCode); if (dwExitCode != STILL_ACTIVE || !(splash || stayAlive)) { KillTimer(hWnd, ID_TIMER); PostQuitMessage(0); } } CharacterManaJ/src/Launch4JStub/head_src/jniguihead_BETA/jniguihead.dev0000644000175000017500000000354213615720000026105 0ustar paulliupaulliu[Project] FileName=jniguihead.dev Name=jniguihead UnitCount=7 Type=0 Ver=2 ObjFiles= Includes="C:\Program Files (x86)\Java\jdk 1.4\include";"C:\Program Files (x86)\Java\jdk 1.4\include\win32" Libs= PrivateResource= ResourceIncludes= MakeIncludes= Compiler= CppCompiler= Linker=-n_@@_ IsCpp=0 Icon= ExeOutput= ObjectOutput=..\..\head_jni_BETA OverrideOutput=0 OverrideOutputName=jniguihead.exe HostApplication= Folders= CommandLine= UseCustomMakefile=0 CustomMakefile=Makefile.win IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 CompilerSettings=000000d000000000000001000 LogOutput= LogOutputEnabled=0 [Unit1] FileName=jniguihead.c CompileCpp=0 Folder=jniguihead_BETA Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c jniguihead.c -o ../../head_jni_BETA/jniguihead.o $(CFLAGS) [Unit2] FileName=jniguihead.h CompileCpp=0 Folder=jniguihead_BETA Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [VersionInfo] Major=0 Minor=1 Release=1 Build=1 LanguageID=1033 CharsetID=1252 CompanyName= FileVersion=0.1.1.1 FileDescription=Developed using the Dev-C++ IDE InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion= AutoIncBuildNr=0 SyncProduct=0 [Unit4] FileName=..\head.h CompileCpp=0 Folder=jniguihead_BETA Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit6] FileName=..\jnihead.c CompileCpp=0 Folder=jniguihead_BETA Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit3] FileName=..\head.c CompileCpp=0 Folder=jniguihead_BETA Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c head.c -o ../../head/head.o $(CFLAGS) [Unit5] FileName=..\resource.h CompileCpp=0 Folder=jniguihead_BETA Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit7] FileName=..\jnihead.h CompileCpp=0 Folder=jniguihead_BETA Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= CharacterManaJ/src/Launch4JStub/head_src/jniguihead_BETA/.gitignore0000644000175000017500000000004313615720000025257 0ustar paulliupaulliu/jniguihead.exe /jniguihead.layout CharacterManaJ/src/Launch4JStub/head_src/head.h0000644000175000017500000001240113615720000021440 0ustar paulliupaulliu/* Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. Copyright (c) 2004, 2015 Grzegorz Kowal, Ian Roberts (jdk preference patch) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif // _WIN32_WINNT #ifndef _LAUNCH4J_HEAD__INCLUDED_ #define _LAUNCH4J_HEAD__INCLUDED_ #define WIN32_LEAN_AND_MEAN // VC - Exclude rarely-used stuff from Windows headers // Windows Header Files: #include #include // C RunTime Header Files #include #include #include #include #include #include #include #include #include #include #include #include #define LAUNCH4j "Launch4j" #define VERSION "3.12" #define JRE_VER_MAX_DIGITS_PER_PART 3 #define NO_JAVA_FOUND 0 #define FOUND_JRE 1 #define FOUND_SDK 2 #define FOUND_BUNDLED 4 #define FOUND_CHOOSED 8 #define JRE_ONLY 0 #define PREFER_JRE 1 #define PREFER_JDK 2 #define JDK_ONLY 3 #define USE_64_BIT_RUNTIME 1 #define USE_64_AND_32_BIT_RUNTIME 2 #define USE_32_AND_64_BIT_RUNTIME 3 #define USE_32_BIT_RUNTIME 4 #define INIT_RUNTIME_BITS 9 #define KEY_WOW64_64KEY 0x0100 #define HKEY_STR "HKEY" #define HKEY_CLASSES_ROOT_STR "HKEY_CLASSES_ROOT" #define HKEY_CURRENT_USER_STR "HKEY_CURRENT_USER" #define HKEY_LOCAL_MACHINE_STR "HKEY_LOCAL_MACHINE" #define HKEY_USERS_STR "HKEY_USERS" #define HKEY_CURRENT_CONFIG_STR "HKEY_CURRENT_CONFIG" #define STR 128 #define BIG_STR 1024 #define MAX_VAR_SIZE 32767 #define MAX_ARGS 32768 #define TRUE_STR "true" #define FALSE_STR "false" #define ERROR_FORMAT "Error:\t\t%s\n" #define debug(args...) if (hLog != NULL) { fprintf(hLog, ## args); fflush(hLog); } #define debugAll(args...) if (debugAll && hLog != NULL) fprintf(hLog, ## args); typedef void (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); BOOL initGlobals(); FILE* openLogFile(const char* exePath, const int pathLen); void closeLogFile(); BOOL initializeLogging(const char *lpCmdLine, const char* exePath, const int pathLen); void msgBox(const char* text); void signalError(); BOOL loadString(const int resID, char* buffer); BOOL loadBool(const int resID); int loadInt(const int resID); BOOL regQueryValue(const char* regPath, unsigned char* buffer, unsigned long bufferLength); void formatJavaVersion(char* version, const char* originalVersion); void regSearch(const char* keyName, const int searchType); BOOL isJavaHomeValid(const char* keyName, const int searchType); BOOL isLauncherPathValid(const char* path); void regSearchWow(const char* keyName, const int searchType); void regSearchJreSdk(const char* jreKeyName, const char* sdkKeyName, const int jdkPreference); BOOL findJavaHome(char* path, const int jdkPreference); int getExePath(char* exePath); void appendPath(char* basepath, const char* path); void appendLauncher(char* jrePath); void appendAppClasspath(char* dst, const char* src); BOOL expandVars(char *dst, const char *src, const char *exePath, const int pathLen); void appendHeapSizes(char *dst); void appendHeapSize(char *dst, const int megabytesID, const int percentID, const DWORDLONG availableMemory, const char *option); void setJvmOptions(char *jvmOptions, const char *exePath, const int pathLen); BOOL createMutex(); void setWorkingDirectory(const char *exePath, const int pathLen); BOOL bundledJreSearch(const char *exePath, const int pathLen); BOOL installedJreSearch(); void createJreSearchError(); BOOL jreSearch(const char *exePath, const int pathLen); BOOL appendToPathVar(const char* path); BOOL appendJreBinToPathVar(); void setEnvironmentVariables(const char *exePath, const int pathLen); void setMainClassAndClassPath(const char *exePath, const int pathLen); void setCommandLineArgs(const char *lpCmdLine, const char *exePath, const int pathLen); int prepare(const char *lpCmdLine); void closeProcessHandles(); BOOL execute(const BOOL wait, DWORD *dwExitCode); const char* getJavaHome(); const char* getMainClass(); const char* getLauncherArgs(); #endif // _LAUNCH4J_HEAD__INCLUDED_ CharacterManaJ/src/Launch4JStub/head/0000755000175000017500000000000013615720000017521 5ustar paulliupaulliuCharacterManaJ/src/Launch4JStub/head/head.o0000644000175000017500000011306313615720000020606 0ustar paulliupaulliuL8.textLJ ah 0`.data@0.bss 0.rdataHPK@0@.drectveR@0/4 hS6@0@WV$RtI   ^_Ív1^_WVS |$1󪋄$4D$$0D$\$$߹эD D$$ [^_Ðt$UWVS,)č|$1D$l$l$$ D$$@$$1󪋄$HD$$DT$$$߉эD D$$ãD$+$@$D$ED$J$$$@T$ $DT$D$Y$$,[^_]fD$%,$cfD$;,$;v1룸뜐S$pSD$y$ÅtD$$Ӄt0 u.mT$D$$$[ÍviАÐD$ t3=tD$D$$fD$ D$ D$D$$ÐW8ǡt%D$D$$$ =$=tet%D$D$$$D$D$D$ D$D$$t$8_D$D$$[vD$ D$D$$,D$D$D$,D$D$ |$D$$t%T$,T$D$$$1fǁ Ɓ|$,|$$<$WZVSt$ \$$ ttt$D$$D$ t$D$ $tqD$$ti$Rt\1f  But(t\$D$$[^ø[^Ð$Pt3t*D$ D$D$$1[^f1[^UWVSD$$g1߉fǁ D$$=5 u!D$$M[^_]f|$1t$t$$ht߉fǁ t$$됐߉ǁ - D$$J1fǁ (Ɓ$f1fǁ (Ɓ1ffRdž-bitfdž)WV4|$1t$t$D$@$4^_fW8|$1|$|$D$@$<$8_fUWVSlD$D$D$D$ D$D$$$Ã5$1@DŽ$\D$$\t$ D$@$D$$u1$Wl[^_]Ív$\@uf$MZuD$ D$$XD$$u|$$D$t$ D$D$$D$$d1$\S|$$PEED$(ff=L3f=d 1l[^_]ÐUWVS<\$PD$$9]D$$9QD$$9ED$&$99D$1$9t 1<[^_]ÐvD$\$pD$\$|$(|$D$ D$t$,$u\D$XD$D$TD$D$,D$ D$CD$D$($ƋD$($U\<[^_]f|$D$ D$t$,$y1 ffffWS|$ t??t:D$.<$D$_<$tt,9wt)[_1[_É؅uэAމUWVS<]E E 8EED$.U$D$_E$t9v&+UeԍBE܍B)čt$M1T$ED$4$UE؅UJu >1f1E1fD .1uщ1fD 0Fы}1A9rދut$$UU} 1ыU D 9EeԋEt E8u؃}J1щfD .щfD 0щfD 0щfD 0Fue[^_]f}}tLt-D$ D$3D$$H$eԋuUvK1fD _1ufщ1fD 0Fы}1A9rދut$$EvE}эQE-UWVSL$`l$1:uO1ۡt.u8T$ l$D$$$؁L[^_]Ð|ƐT$,$up@uD$,$8\tfD \1эD 󤍄$D$,$u[,@uD$,$8\tfD \1эD  $P1WVS@$T\$,1߉󪍄$4D$T$ D$$PD$$t 1@[^_f$0DŽ$8$8D$$0t$$<D$ D$D$$4$uKf@u$Ƌ$4$WU\$$@[^_Ë$4$Q$fUWVS\$tt9$pL$ T$D$$$$HD$\$ D$$pT$$(DŽ$Lt$4󪍌$8L$(|$(󪍬$<f1PT$,$@L$D$D$D$$LT$ $8L$D$$H$ z$pT$4$@uD$4$8\tfD\$8T$4$t!t$D$$$$8L$,$D$,$x=tTD$,$~@t!l$D$$$DŽ$LD$,fD$,$~$tT$4$]tl$$t$$$ttl$D$cf$H$U\[^_]úXvWVS0\$@t$D ~tXut$$0[^_HtWtD$ D$D$$$0[^_Ét$$tttt$$o0[^_ádD$$JRA|$1|$|$$<$WVSt$ |$$\$(Cv6D$4$u [^_ÍvD$$|$ [^_D$<$|tD$$t$ [^_`VS\$$t)t D$ D$D$$#s]D$$\D$$D$D$ $RT$ D$D$'$$[^ÐD$$4`D$$LD$$8O D$$D$$1[^ÍvD$$4SD$$\D$$wD$$cuffD$$f1,[^_]ÍvGKv$1\$$<$t$<$t!|$D$M$$<$Q@tW|$$@$t1|$D$^$$,[^_]øt$\$$@$ UWVS,$@$D$Ht$ts fBCt^<;uC|$tۡt!t$D$i$$t$|$,$t,[^_]Ð1,[^_]fUWVS<$T$,1::\D$|D$|$(1D$l$(,$v@uD$,$8\tfD \1эD ,$vát%\$ l$D$$$Ktb<[^_]Ív@uD$,$8\tfD \1эD  [D$D$$P$<[^_]fBT$$$,t<,uD,t?$QuD$|\$ovD$D$$P$@D$\$?vUWVS̀)ċ$$41T$5T$ f;v \D$,$9}T$$f%t)T$$T$ l$D$$${{D$%<$ƅPT$$D$%$Å)D$|$$$Ƅ$4)HD$T$$T$,$1$ы$LL$$D$,$9D$,$9Ei$T$$T$$$v$T$$$T$$T$$|D$$$`D$D$5D$,$ =T$5T$$$!$BD$$T$$$f|$$$̀[^_]ÐD$$$$<D$$$1̀[^_]DŽ$D$,$9`D$,$9UD$,$9JD$&,$9?D$1,$9D$,D$\,$@D$(D$\,$$t$D$ D$T$(T$T$,$uW$D$T$$T$$D$ D$GD$$$$$V\8t$D$ D$T$(T$T$,$uuD$,D$,D$,D$,UWVSl$$$D$0T$4|$L1\$L\$$$$D$<߉\$$$$ǙL$0ʋD$4D$0D$(ʉT$,D$@D$ D$(T$,$T$;D$<}\$< tK\$D$0T$4D$|$D$$<1$dуL$$dD$$<$߉эD l4j.@init!\$D$$$D$$D$,@t!\$D$$$1I|)ȉD$\$D$,$A1ҽv t[ tVtGB9t #u1B9u t1fD D$,$L[^_]f9s t G롍v뗐1fD 1߉L$,$dуL$$dD$$L$,߉D init!\$D$$$D$$D$,@lL[^_] W|$1|$|$$t|$tut!|$D$$$DŽ$ DŽ$DŽ$|$D$$$ =tĨ_Ívt/D$D$$$1Ĩ_1UWVS,t$1󪍼$fD$$$l$$Xu ,[^_]Ð$DD$$@D$4$@uD$4$8\tfD\l$4$4$tt$D$$$,[^_]UWVS<|$1󪋄$PD$l$,$f@uD$,$8\tfD \1эD ,$bƋ$Tt $T0ud1<[^_]Ív@uD$,$8\tfD \1эD  {$1󪍜$\$$u$tDt<[^_]ÍvB9'H UWVS<)ċ$P$$1󪍼$(ft$$($߉эD .cfg@\$D$$$\$ D$D$$$$u1<[^_]Ív|$$󪋄$TD$ t$\$\$$$4t!\$D$'$$DŽ$,$,D$$0t\$$D$$$,t ;)vUWVS<\$Pl$T=td{t$ 1\$D$D$ A!f\$$l$$eu14$Wu1<[^_]fD$$ff<[^_]ÍvUWVS<)ġt)t D$ D$D$$7$,1|$,\$,\$$`ơuItEtPD$ D$5D$$L$1<[^_]fl$$u1<[^_]Ív1󪋄$TD$ $PD$l$\$,$t!\$D$$$|$,\|$-:$TD$$PD$$@uD$$T$8\T$tfǁ\\$$$0D$$<[^_]Ív\$$fWVS0t)t D$ D$D$$=u 10[^_f|$1\$\$$$ǡt)t D$ D$D$$#wSD$$\D$$D$$KT$ D$D$'$$0[^_ÐD$$4LD$$8D$$$Lv?D$$$D$$?D$$4[D$$\D$$kD$$WffD$$0gvD$$vD$$+D$$fD$$D$$ff=ttD$$f<UWVSL$d5t)t D$ D$ D$$\$$`$tL[^_]Ív$󪍬$l$$ D$$vD$$bt%D$D$$$D$$ D$$ t%D$D$$$ \$$`$$ƅ\$1DŽ$<= 1󪉜$$DŽ$(DŽ$,A$< \$$|$$}ui,$RuԀ=.-s\$$`$/D$$fIv$<tdtP\$$D$$L[^_]ÐD$$fd뤍vUWVS)č|$1D$\$\$$ ¾$0I)9s1[^_]Ív߉fD ;$0D$$\$$[^_]fWVS |$1D$\$$߉эD \bin@$u=tDD$D$$$1 [^_Ív [^_Ð1 [^_UWVSL)ċ$`\$>1󪍼$>f󪍴$>t$$D$4$ƅD$=4$D$>$dT$ l$@D$$Xt%\$ t$D$$$\$4$D$$ƅql$$<D$,$1|$,э 7.cfg@t($<T$D$ $$$=1󪍴$>f󪍄$<D$D$$=|$ D$D$$?$<T$D$t$ D$|$$D$>$dT$ l$t$$t%\$ |$D$$$\$<$Gu?`L[^_]ÐUWVS\)ċ$pD$($tL$$D$0D$1۹Lj󪍌$0L$|$󪍼$Hf󪍬$Lf󪍼$0󪍄$0D$ D$$t$ ɉL$,$HD$$D$$t%D$D$%$$L$0L$$Vu6t-D$ D$D$$8$D$$D$ L$(L$D$0D$$0 $D$$1҉ٿэW D$,1$HYD$d$0 $Fft!\$D$f$$D$y$6D$\$)؍xƄ$L|$\$,$t=Ƅ 6432trueHKEY_CLASSES_ROOTHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERSHKEY_CURRENT_CONFIGWarning: formatJavaVersion() too many parts added. (OK)(not found)bin\java.exebin\javaw.exeCheck launcher: %s %s JavaHome%s-bit search: %s... Check: %s Match: %s Ignore: %s Runtime bits: Failed to load. findJavaHome() SOFTWARE\JavaSoft\Java Development KitSOFTWARE\JavaSoft\Java Runtime EnvironmentSOFTWARE\JavaSoft\JDKSOFTWARE\JavaSoft\JRESOFTWARE\IBM\Java Development KitSOFTWARE\IBM\Java Runtime EnvironmentSOFTWARE\IBM\Java2 Runtime EnvironmentRuntime used: %s (%s-bit) Not Found check exist: %s Found: %s FIND_ANCESTOR: %s x64x86PE Type: %s = %d FIND_ANCESTOR:JRE_ARCHEXEDIREXEFILEPWDOLDPWDJREHOMEDIRHKEYSubstitute: %s = %s Heap limit: Reduced %d MB heap size to 32-bit maximum %d MB Heap %s: Requested %d MB / %d%%, Available: %d MB, Heap size: %d MB -Xms-XmxJVM_OPTIONSSet jvm_option: %s = %s try loading 1: %s try loading 2: %s Loading: %s Create mutex: %s Instance already exists.Working dir: %s JAVA_HOMESettingsConfig JRE: %s bundledJreSearch() Bundled JRE: Cannot use 64-bit runtime on 32-bit OS. Bundled JRE: %s installedJreSearch() jreSearch() Java min ver: %s Java max ver: %s PathappendToPathVar failed. Set var: %s = %s cfgPath: %s EnvironmentsMain class: %s Info: Classpath not defined. -classpath ";Add classpath: %s *? " : %s -jar "constant commandline args: %s --l4j-Startup error message not defined.Launcher: %s Launcher args: %s Args length: %d/32768 chars Java PreExitCode: %ld SaveJavaHome -aligncomm:"_launcher",5 -aligncomm:"_search",5 -aligncomm:"_error",5 -aligncomm:"_processPriority",2 -aligncomm:"_processInformation",2 -aligncomm:"_oldPwd",5 -aligncomm:"_hLog",2 -aligncomm:"_hModule",2zR| 4lAA C Y  AAD E AA0TpsAA AFfA AAC T@AA AALY AA AAC AC w AD L XkC r C G E f @AC@ AA Td$AA C   AAA H  AAB G  AAC E AA<AA AAF AA AAC (>AA C@v AA(2AC@lAPHAA AAF AA AAD AA AAT AA AACP AA AAB  AA AAC 8@ lAA C D  AAA E  AAA ,0 AB I AAA C <```AA AAF\ AA AAB H>AA AFm A AAC  A AAA @AA AAF AA AAA X0#AA AC@z A AAA | A AAA x A AAA T|AA AC k A AAD O A AAF dA AA8xAA C   AAB   AAD <GAC y AB (D:AA C r AA8pWAA AAC0GAA AADAA AC c A AAD QA AA(3AA C k AAl AA AAF AA AAC D AA AAD  AA AAA P AA AAF AA AAB MAA AATAA AAF AA AAD q AA AAC X<AA AAL AA AAB D AA AAA @$AA AAC AA AAC &ACp|AX'AA AAL AA AAC  AA AAA ,\+AF AD v AA P,AA AAFT AA AAB AA AAT,AA AAF AA AAD  AA AAD @8 .AA AALЄ AA AAD P| 80AA AACPn AA AAC `AA AAl 0BAA AALЂ AA AAC \ AA AAD , AA AAD H@ 3&AA AC@@ A AAC  A AAB  H6,C L E WT t6AA AAF^ AA AAD J AA AAB P h9AA AALX AA AAD }AA AATX :AA AF A AAD K A AAB HA AA< :kAA AALVAA AAl 4=/AA AALt AA AAH  AA AAD  AA AAA T` dBuAA AAL~ AA AAB  AA AAB @ CRAA AAL AA AAB  0G#C _T TGAA AAL  AA AAD U AA AAC l 8J @J HJ REF!?0G:GDGNGS??THUP(?-V8?GWS??TH?W=??X HYH=?EXJHRYl?tWH?W?R?Z[=H =??'X,H4YA?J=]=gFvF}?]F^_HF?XHY=FF$\*F2H>FF?NXSH[Y{F?`HUFF?]FF^0a8HL?TXYHaYfFxFFFbc=H?XEe Ef#g<=EHU?]Xh=H?dFFF GbG'G?GKFFFbFGbGFF? F(F.?GFPFUFeFpF?i5 j k l m _& k ? W ? W ? W ? W ? W, n? oM =u p q r pZ nl n n n7 P_ S bH?dHY!bH??XHY?s=t)?Eugt?hp G?qrGsrH%?<?DXIHQYp#vAsWtbH?XHYGwGGwH ?XHY<GDwjGoszGsGH?r?GH;?@dEHMYeGs==GiG~=H?d??GGs HG'?3G;?CXHHPYk???G?G?G#?@?T?h?y???????MEUxlost"=;tm?t?b4sktwH?dHYyOs[b`Hp?xX}HYzbH?XHYRHb?jXoHwY??G s=3te?}H?XHYt?+bEseyt?bP ? ?) ?= ?T ?\ W} H ? X H Y n n !{.!{W!?_!Wo!?w!W!?!{!b!|"L"b0"VR"b"b"G"b#? #W#?$#W4#?<#WL#?T#Wd#?l#W#n#o#=#p%$q7$rh$p$i$%ik%Q%G%H%?%X%H%Y%b&}M&He&?m&Xr&Hz&Y&~&?&?"'Pa's'?'?'(?&(?+(a(Hu(?}(X(H(Y(b(S )H0)?8)X=)HE)YU)e)Hu)?})X)H)Y)**S*H*?*X*H*Y*<+HL+?T+XY+Ha+Y++_+H+?+?+X+H+Y&,L2,|z,S,t,b,,H,?,X,H,Y"-s*-=G-ty-?-t-?7.iZ.=q.G.G.P.s/?'/?./?3//H/?/X/H/Y/M/s/M/G/s 0G"0GE0Gh0F000F0P0=0H1?1dI1?_1=l1H1?1d1H1Y2H2?2X#2H+2Y^2Mc2Sh2Mz2M2t2M2M2M2b2M2G2M2G2s3M3s#3=,3HK3?P3dV3G3i3=3H3?3d3?3?4G4G4M4s$4H:4?F4GN4?V4X[4Hc4Y4?4?4?4?4G4?5G/5?L5?`5?t5?5?5?5?5?5? 6?(6?I6G\6F6=6H6?6d7?7G"7G67G=7GG7HS7G[7?c7Xh7Hp7Yx7G7G7G7H7G7?7X7H7Y7G8GG8Fh888G8F9M9s 9M9G9s49FK9GZ9Gn9P9?9V9b9?:4:M@:sl:Hx:?:?:X:H:Y:P;?;4;n];Hq;?y;X~;H;Y;;?;;s;H<?<X<H<Y`<?o<?t<<?<?<<H<?<X<H=Y =:=P=?=M>H>M%>?->X2>H:>YW>Hv>?{>d>H>Y>M>M>M>????!?H1??9?X>?HF?YN??V?n?o?S??s?M?b?M?H @?@X@H!@Y4@@@H@?T@u@M{@M@M@M@M@M@M@M@?AMA{AMAM*AM/AtMAMaAMfAb|AMAMAbAMAMAMA?AMAbBMBM+BM4BbKBMjBPBsB?BWBnCsCM"CM/CM4Cb~CHC?CXCHCYCMCMCMCbCPCRCE DFD? DG*DG4DG>DGlDxDoD?DRD?DZD[D=DHD=E?E?EX EH(EY0EFDEFXEFmEH}E?E?EXEHEYE? FNFM FMYFMFHFMF?FXFHFYFHFMF?FXFHFYFHFM G?GXGH!GY0GO8Gl>GOFGlZGPaGOGMGbGMGbGOGN"H/HGFHONHlTHO\HlHOHHOHHOHHOHIO IIH-I?5IX:IHBIYIEIxIsI?I?IJGJ?J?J5JG=JMEJM\b@b 9X9999 9 9D9h999,9L99949d9994999$9H9t999$999@9999`999< 9 9 9D 9 9 9 9\ 9 9 9d 9 9 9 9p 9 9 9.fileghead.c l ( 6 I WH _msgBoxT g t  | _loadInt    <    \    * ;t I8 U a m }   _jreArch  $ & '  + + , #. 140 A0 S3 gD6 }p6 d9 : : 0= `B _prepareC ,G _executePG  4J .textlX t 0`.datap@0.bss0.rdatat@0@.drectveT@0/4P @0@t"dD$ $= t.D$$$Pv utfD$$cVD$D$ $$P(fD$$$ S(\$0D$D$$D$9t ([D$$tD$$1WVS$1󪍴$t$$D$ D$D$$DžtW\$*D$ D$|$$Džt'D$\$<$ t$$t[^_1[^_fWVS`t$p\$x$=Ht`[^_$1$utvD$,t$(D$$D$ D$D$D$D$D$ D$ D$!$0=q1u t0D$ D$dD$$D$ $u=>|$4f<$S<$VD$ D$D$<$uNj t5 t,t"D$D$L$$  f D$$$Q`[^_D$$|$4 1|$4|$$$D$($$D$@D$D$ D$D$4$D$ D$D$r$D$PD$$$RD$P+D$X$QD$D$D$D$T+D$\D$ \$D$$D$|D$$$St' T$D$x$$ `[^_$ tD$$1<$Pw_1,t-D$ D$ D$$<$1=`<--l4j-no-splash--l4j-dont-waitSTATIC--l4j-no-splash-errExit code: 0 Exit code: %d, restarting the application! Exit code: %d -aligncomm:"_waitForWindow",2 -aligncomm:"_splashTimeoutErr",2 -aligncomm:"_hWnd",2zR|  $C w F W E @(tAC0k AD DdAA AF A AAA JA AA\tAA ACpk A AAD  A AAC  A AAC    "2 7?H [cr    !"8#Ed$t  %& &='L(*!+ +   < D P,X^ q }- .  /01 ( 2B J2OW3]4c p }  56 (%  "+2 :(GS+X789::8@;PX `h<n y  236 + (=: ?)DL3Q4V6 Dh.filegguihead.c $ ) <p .textkt.data.bss.rdata.drectveTH_splashRap _hWnd|_hLog       9 K W i _strstr _fwrite _prepare |   _execute    _fprintf _fflush      ( 9 J ^ o _atoi .eh_frame_TimerProc@16_enumwndfn@8_getInstanceWindow_WinMain@16.eh_frame_splashTimeout_waitForWindow_dwExitCode_stayAlive_splashTimeoutErr_restartOnCrash_processInformation_GetExitCodeProcess@8_KillTimer@8_PostQuitMessage@4_ShowWindow@8_signalError_EnumWindows@8_GetWindowThreadProcessId@8_GetWindowLongA@8_loadString_FindWindowExA@16_GetWindowTextA@12_loadBool_CreateWindowExA@48_SetTimer@16_TranslateMessage@4_DispatchMessageA@4_GetMessageA@16_closeProcessHandles_SetForegroundWindow@4_closeLogFile_LoadImageA@24_SendMessageA@16_GetWindowRect@8_GetSystemMetrics@4_SetWindowPos@28_UpdateWindow@4CharacterManaJ/src/Launch4JStub/head/consolehead.o0000644000175000017500000000330213615720000022163 0ustar paulliupaulliuL.text 0`.data@0.bss0.rdata@@0@/4D 0`/18@@0@Exit code: %d, restarting the application! Exit code: %d UW 8"D$ $<P$=Ht}$$DŽ$|$$u3t$T$D$0$$념$t‹tD$D$$=t$aD$"@$Px|$1|$|$$i<$zR| $AB JW A 1DWmr  +^fkz  .filegconsolehead.c_main .text.data.bss.rdata?*@4___main _hLogD T _strchr _prepare g t _execute _fprintf ~  _msgBox .text.startup.eh_frame.text.startup.eh_frame_restartOnCrash_setConsoleFlag_GetCommandLineA@0_signalError_loadBool_closeLogFile_loadStringCharacterManaJ/src/JavaLaunch/0000755000175000017500000000000013615720000016366 5ustar paulliupaulliuCharacterManaJ/src/JavaLaunch/JavaLaunch/0000755000175000017500000000000013615720000020402 5ustar paulliupaulliuCharacterManaJ/src/JavaLaunch/JavaLaunch/main.m0000644000175000017500000002037113615720000021507 0ustar paulliupaulliu// // main.m // JavaLaunch // // Created by seraphy on 2019/01/02. // Copyright © 2019 seraphy. All rights reserved. // #import #import #define JAVA_LAUNCH_ERROR "JavaLaunchError" #define UNSPECIFIED_ERROR "An unknown error occurred." #define APP_ROOT_PREFIX "$APP_ROOT" NSString *FindJavaHome() { NSTask *task = [[NSTask alloc] init]; NSPipe *pipe = [NSPipe pipe]; [task setLaunchPath:@"/usr/libexec/java_home"]; [task setArguments: [NSArray arrayWithObjects: @"-v", nil]]; [task setStandardOutput: pipe]; [task launch]; NSFileHandle *handle = [pipe fileHandleForReading]; NSData *data = [handle readDataToEndOfFile]; NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; [task waitUntilExit]; int exitCode = [task terminationStatus]; if (exitCode != 0) { NSLog(@"not found system java_home (exit:%d)", exitCode); return nil; } result = [result stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; NSLog(@"found system java_home=(%@)", result); return result; } int main(int argc, const char * argv[]) { int exitCode = 0; @autoreleasepool { @try { // メインバンドル NSBundle *mainBundle = [NSBundle mainBundle]; // *.appのディレクトリを取得 NSString *mainBundlePath = [mainBundle bundlePath]; NSLog(@"mainBundlePath=%@", mainBundlePath); // 実行可能jarの場所 NSString *jarPath = [[mainBundlePath stringByAppendingPathComponent:@"Contents"] stringByAppendingPathComponent: [[mainBundle infoDictionary] objectForKey:@"ExecutableJar"]]; NSLog(@"jarPath=%@", jarPath); // バンドルJREの場所を探索する NSString *pluginJreDir = [mainBundlePath stringByAppendingPathComponent:@"Contents/Plugins/JRE"]; NSLog(@"pluginJreDir=%@", pluginJreDir); NSString *jreDir = pluginJreDir; NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *path = [pluginJreDir stringByAppendingPathComponent:@"Home/bin/java"]; if ([fileManager fileExistsAtPath: path]) { // パターン1 Home/bin/java jreDir = [pluginJreDir stringByAppendingPathComponent:@"Home"]; } else { // パターン2 bin/java path = [pluginJreDir stringByAppendingPathComponent:@"bin/java"]; if (![fileManager fileExistsAtPath: path]) { // バンドルJREがない場合は環境変数JAVA_HOMEがあれば、それを優先する jreDir = [[[NSProcessInfo processInfo]environment]objectForKey:@"JAVA_HOME"]; if (jreDir == nil) { // 環境変数JAVA_HOMEがなければ/usr/libexec/java_homeで問い合わせる jreDir = FindJavaHome(); } } } NSLog(@"JreDir=%@", jreDir); if (jreDir == nil) { // JAVA_HOMEを特定できなければエラーダイアログ表示 NSString *title = [mainBundle localizedStringForKey: @"JavaDirectoryNotFound" value:@"JRE Not Found Error" table:@"Localizable"]; [[NSException exceptionWithName:@JAVA_LAUNCH_ERROR reason:title userInfo:nil] raise]; } // アプリケーション名を取得(ローカライズされたもの) NSString *displayAppName; displayAppName = [[mainBundle localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"]; NSLog(@"displayAppName=%@", displayAppName); printf("%s\n", [displayAppName UTF8String]); // JVMオプションの取得 NSMutableArray *jvmOptions = [NSMutableArray array]; NSArray *jvmOptionsFixed = [[mainBundle infoDictionary] objectForKey:@"JVMOptions"]; if (jvmOptionsFixed != nil) { for (NSString *option in jvmOptionsFixed) { NSString *jvmOption = [option stringByReplacingOccurrencesOfString:@APP_ROOT_PREFIX withString:[mainBundle bundlePath]]; // $APP_ROOTという文字列をバンドルパスに置換する [jvmOptions addObject: jvmOption]; } } // ユーザー定義オプションの読み込み NSString *bundleName = [[mainBundle infoDictionary] objectForKey:@"CFBundleName"]; NSString *userJvmOptionPath = [NSHomeDirectory() stringByAppendingPathComponent: [NSString stringWithFormat:@"/Library/%@/jvm_options", bundleName]]; NSLog(@"use define jvmoptions path=%@", userJvmOptionPath); if ([fileManager fileExistsAtPath: userJvmOptionPath]) { NSString* fileContents = [NSString stringWithContentsOfFile:userJvmOptionPath encoding:NSUTF8StringEncoding error:nil]; NSArray* allLinedStrings = [fileContents componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]]; // 同一のキーが指定されている場合はRightMostとなることを期待している。(厳密には仕様に定義されていない。) for (id line in allLinedStrings) { NSString *option = [line stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; if (![option hasPrefix:@"#"] && [option length] > 0) { option = [option stringByReplacingOccurrencesOfString:@APP_ROOT_PREFIX withString:[mainBundle bundlePath]]; NSLog(@"option: %@", option); [jvmOptions addObject: option]; } } } // Java起動引数の組み立て NSMutableArray *launchArgs = [NSMutableArray arrayWithObjects:[@"-Xdock:name=" stringByAppendingString:displayAppName], nil]; [launchArgs addObjectsFromArray: jvmOptions]; [launchArgs addObject:@"-jar"]; [launchArgs addObject:jarPath]; // javaを起動する NSPipe *pipe = [NSPipe pipe]; NSTask *javaTask = [[NSTask alloc] init]; [javaTask setLaunchPath: [jreDir stringByAppendingPathComponent: @"bin/java"]]; [javaTask setArguments: launchArgs]; [javaTask setStandardError: pipe]; NSTimeInterval beginTime = [NSDate timeIntervalSinceReferenceDate]; [javaTask launch]; NSFileHandle *handle = [pipe fileHandleForReading]; NSData *data = [handle readDataToEndOfFile]; NSString *javaError = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if ([javaError length] > 0) { NSLog(@"Error Message=%@", javaError); } [javaTask waitUntilExit]; NSTimeInterval endTime = [NSDate timeIntervalSinceReferenceDate]; exitCode = [javaTask terminationStatus]; NSLog(@"exitCode=%d", exitCode); NSTimeInterval span = endTime - beginTime; if (span < 5 && exitCode != 0) { // Javaの実行直後にエラーで終了している場合は、クラスロードエラーの可能性が高い。 NSString *title = [mainBundle localizedStringForKey: @"JRELoadError" value:@"JRE Load Error" table:nil]; NSString *reason = [NSString stringWithFormat:@"%@\n%@", title, javaError]; [[NSException exceptionWithName:@JAVA_LAUNCH_ERROR reason: reason userInfo:nil] raise]; } } @catch(NSException *exception) { NSLog(@"error=%@", [exception reason]); NSAlert *alert = [[NSAlert alloc] init]; [alert setAlertStyle:NSCriticalAlertStyle]; [alert setMessageText:[exception reason]]; [alert runModal]; exitCode = 1; } } return exitCode; } CharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/0000755000175000017500000000000013615720000022376 5ustar paulliupaulliuCharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/project.pbxproj0000644000175000017500000002166413615720000025463 0ustar paulliupaulliu// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 50; objects = { /* Begin PBXBuildFile section */ 2EC90F9121DC4F1B00F295DC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EC90F9021DC4F1B00F295DC /* main.m */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 2EC90F8B21DC4F1B00F295DC /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 2EC90F8D21DC4F1B00F295DC /* JavaLaunch */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = JavaLaunch; sourceTree = BUILT_PRODUCTS_DIR; }; 2EC90F9021DC4F1B00F295DC /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 2EC90F8A21DC4F1B00F295DC /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 2EC90F8421DC4F1B00F295DC = { isa = PBXGroup; children = ( 2EC90F8F21DC4F1B00F295DC /* JavaLaunch */, 2EC90F8E21DC4F1B00F295DC /* Products */, ); sourceTree = ""; }; 2EC90F8E21DC4F1B00F295DC /* Products */ = { isa = PBXGroup; children = ( 2EC90F8D21DC4F1B00F295DC /* JavaLaunch */, ); name = Products; sourceTree = ""; }; 2EC90F8F21DC4F1B00F295DC /* JavaLaunch */ = { isa = PBXGroup; children = ( 2EC90F9021DC4F1B00F295DC /* main.m */, ); path = JavaLaunch; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 2EC90F8C21DC4F1B00F295DC /* JavaLaunch */ = { isa = PBXNativeTarget; buildConfigurationList = 2EC90F9421DC4F1B00F295DC /* Build configuration list for PBXNativeTarget "JavaLaunch" */; buildPhases = ( 2EC90F8921DC4F1B00F295DC /* Sources */, 2EC90F8A21DC4F1B00F295DC /* Frameworks */, 2EC90F8B21DC4F1B00F295DC /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = JavaLaunch; productName = JavaLaunch; productReference = 2EC90F8D21DC4F1B00F295DC /* JavaLaunch */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 2EC90F8521DC4F1B00F295DC /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 1010; ORGANIZATIONNAME = seraphy; TargetAttributes = { 2EC90F8C21DC4F1B00F295DC = { CreatedOnToolsVersion = 10.1; }; }; }; buildConfigurationList = 2EC90F8821DC4F1B00F295DC /* Build configuration list for PBXProject "JavaLaunch" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 2EC90F8421DC4F1B00F295DC; productRefGroup = 2EC90F8E21DC4F1B00F295DC /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 2EC90F8C21DC4F1B00F295DC /* JavaLaunch */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 2EC90F8921DC4F1B00F295DC /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2EC90F9121DC4F1B00F295DC /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 2EC90F9221DC4F1B00F295DC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 2EC90F9321DC4F1B00F295DC /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; }; name = Release; }; 2EC90F9521DC4F1B00F295DC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_STYLE = Automatic; MACOSX_DEPLOYMENT_TARGET = 10.6; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 2EC90F9621DC4F1B00F295DC /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_STYLE = Automatic; MACOSX_DEPLOYMENT_TARGET = 10.6; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 2EC90F8821DC4F1B00F295DC /* Build configuration list for PBXProject "JavaLaunch" */ = { isa = XCConfigurationList; buildConfigurations = ( 2EC90F9221DC4F1B00F295DC /* Debug */, 2EC90F9321DC4F1B00F295DC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2EC90F9421DC4F1B00F295DC /* Build configuration list for PBXNativeTarget "JavaLaunch" */ = { isa = XCConfigurationList; buildConfigurations = ( 2EC90F9521DC4F1B00F295DC /* Debug */, 2EC90F9621DC4F1B00F295DC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 2EC90F8521DC4F1B00F295DC /* Project object */; } CharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/project.xcworkspace/0000755000175000017500000000000013615720000026374 5ustar paulliupaulliuCharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/project.xcworkspace/xcshareddata/0000755000175000017500000000000013615720000031027 5ustar paulliupaulliu././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootCharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettingsCharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSetting0000644000175000017500000000026513615720000034251 0ustar paulliupaulliu ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootCharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plistCharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChec0000644000175000017500000000035613615720000034021 0ustar paulliupaulliu IDEDidComputeMac32BitWarning CharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/project.xcworkspace/contents.xcworkspacedata0000644000175000017500000000023313615720000033334 0ustar paulliupaulliu CharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/xcshareddata/0000755000175000017500000000000013615720000025031 5ustar paulliupaulliuCharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/xcshareddata/xcschemes/0000755000175000017500000000000013615720000027013 5ustar paulliupaulliuCharacterManaJ/src/JavaLaunch/JavaLaunch.xcodeproj/xcshareddata/xcschemes/JavaLaunch.xcscheme0000644000175000017500000000637513615720000032563 0ustar paulliupaulliu CharacterManaJ/src/main/0000755000175000017500000000000013615720000015276 5ustar paulliupaulliuCharacterManaJ/src/main/java/0000755000175000017500000000000013615720000016217 5ustar paulliupaulliuCharacterManaJ/src/main/java/org/0000755000175000017500000000000013615720000017006 5ustar paulliupaulliuCharacterManaJ/src/main/java/org/apache/0000755000175000017500000000000013615720000020227 5ustar paulliupaulliuCharacterManaJ/src/main/java/org/apache/tools/0000755000175000017500000000000013615720000021367 5ustar paulliupaulliuCharacterManaJ/src/main/java/org/apache/tools/zip/0000755000175000017500000000000013615720000022171 5ustar paulliupaulliuCharacterManaJ/src/main/java/org/apache/tools/zip/UnixStat.java0000644000175000017500000000377113615720000024623 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; /** * Constants from stat.h on Unix systems. * */ // CheckStyle:InterfaceIsTypeCheck OFF - backward compatible public interface UnixStat { /** * Bits used for permissions (and sticky bit) * * @since 1.1 */ int PERM_MASK = 07777; /** * Indicates symbolic links. * * @since 1.1 */ int LINK_FLAG = 0120000; /** * Indicates plain files. * * @since 1.1 */ int FILE_FLAG = 0100000; /** * Indicates directories. * * @since 1.1 */ int DIR_FLAG = 040000; // ---------------------------------------------------------- // somewhat arbitrary choices that are quite common for shared // installations // ----------------------------------------------------------- /** * Default permissions for symbolic links. * * @since 1.1 */ int DEFAULT_LINK_PERM = 0777; /** * Default permissions for directories. * * @since 1.1 */ int DEFAULT_DIR_PERM = 0755; /** * Default permissions for plain files. * * @since 1.1 */ int DEFAULT_FILE_PERM = 0644; } CharacterManaJ/src/main/java/org/apache/tools/zip/AbstractUnicodeExtraField.java0000644000175000017500000001144513615720000030063 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; import java.io.UnsupportedEncodingException; import java.util.zip.CRC32; import java.util.zip.ZipException; /** * A common base class for Unicode extra information extra fields. */ public abstract class AbstractUnicodeExtraField implements ZipExtraField { private long nameCRC32; private byte[] unicodeName; private byte[] data; protected AbstractUnicodeExtraField() { } /** * Assemble as unicode extension from the name/comment and * encoding of the orginal zip entry. * * @param text The file name or comment. * @param bytes The encoded of the filename or comment in the zip * file. * @param off The offset of the encoded filename or comment in * bytes. * @param len The length of the encoded filename or commentin * bytes. */ protected AbstractUnicodeExtraField(String text, byte[] bytes, int off, int len) { CRC32 crc32 = new CRC32(); crc32.update(bytes, off, len); nameCRC32 = crc32.getValue(); try { unicodeName = text.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("FATAL: UTF-8 encoding not supported.", e); } } /** * Assemble as unicode extension from the name/comment and * encoding of the orginal zip entry. * * @param text The file name or comment. * @param bytes The encoded of the filename or comment in the zip * file. */ protected AbstractUnicodeExtraField(String text, byte[] bytes) { this(text, bytes, 0, bytes.length); } private void assembleData() { if (unicodeName == null) { return; } data = new byte[5 + unicodeName.length]; // version 1 data[0] = 0x01; System.arraycopy(ZipLong.getBytes(nameCRC32), 0, data, 1, 4); System.arraycopy(unicodeName, 0, data, 5, unicodeName.length); } /** * @return The CRC32 checksum of the filename or comment as * encoded in the central directory of the zip file. */ public long getNameCRC32() { return nameCRC32; } /** * @param nameCRC32 The CRC32 checksum of the filename as encoded * in the central directory of the zip file to set. */ public void setNameCRC32(long nameCRC32) { this.nameCRC32 = nameCRC32; data = null; } /** * @return The utf-8 encoded name. */ public byte[] getUnicodeName() { return unicodeName; } /** * @param unicodeName The utf-8 encoded name to set. */ public void setUnicodeName(byte[] unicodeName) { this.unicodeName = unicodeName; data = null; } public byte[] getCentralDirectoryData() { if (data == null) { this.assembleData(); } return data; } public ZipShort getCentralDirectoryLength() { if (data == null) { assembleData(); } return new ZipShort(data.length); } public byte[] getLocalFileDataData() { return getCentralDirectoryData(); } public ZipShort getLocalFileDataLength() { return getCentralDirectoryLength(); } public void parseFromLocalFileData(byte[] buffer, int offset, int length) throws ZipException { if (length < 5) { throw new ZipException("UniCode path extra data must have at least" + " 5 bytes."); } int version = buffer[offset]; if (version != 0x01) { throw new ZipException("Unsupported version [" + version + "] for UniCode path extra data."); } nameCRC32 = ZipLong.getValue(buffer, offset + 1); unicodeName = new byte[length - 5]; System.arraycopy(buffer, offset + 5, unicodeName, 0, length - 5); data = null; } } CharacterManaJ/src/main/java/org/apache/tools/zip/ExtraFieldUtils.java0000644000175000017500000002740113615720000026110 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.zip.ZipException; /** * ZipExtraField related methods * */ // CheckStyle:HideUtilityClassConstructorCheck OFF (bc) @SuppressWarnings({"unchecked", "rawtypes"}) public class ExtraFieldUtils { private static final int WORD = 4; /** * Static registry of known extra fields. * * @since 1.1 */ private static final Map implementations; static { implementations = new HashMap(); register(AsiExtraField.class); register(JarMarker.class); register(UnicodePathExtraField.class); register(UnicodeCommentExtraField.class); } /** * Register a ZipExtraField implementation. * *

The given class must have a no-arg constructor and implement * the {@link ZipExtraField ZipExtraField interface}.

* @param c the class to register * * @since 1.1 */ public static void register(Class c) { try { ZipExtraField ze = (ZipExtraField) c.newInstance(); implementations.put(ze.getHeaderId(), c); } catch (ClassCastException cc) { throw new RuntimeException(c + " doesn\'t implement ZipExtraField"); } catch (InstantiationException ie) { throw new RuntimeException(c + " is not a concrete class"); } catch (IllegalAccessException ie) { throw new RuntimeException(c + "\'s no-arg constructor is not public"); } } /** * Create an instance of the approriate ExtraField, falls back to * {@link UnrecognizedExtraField UnrecognizedExtraField}. * @param headerId the header identifier * @return an instance of the appropiate ExtraField * @exception InstantiationException if unable to instantiate the class * @exception IllegalAccessException if not allowed to instatiate the class * @since 1.1 */ public static ZipExtraField createExtraField(ZipShort headerId) throws InstantiationException, IllegalAccessException { Class c = (Class) implementations.get(headerId); if (c != null) { return (ZipExtraField) c.newInstance(); } UnrecognizedExtraField u = new UnrecognizedExtraField(); u.setHeaderId(headerId); return u; } /** * Split the array into ExtraFields and populate them with the * given data as local file data, throwing an exception if the * data cannot be parsed. * @param data an array of bytes as it appears in local file data * @return an array of ExtraFields * @throws ZipException on error */ public static ZipExtraField[] parse(byte[] data) throws ZipException { return parse(data, true, UnparseableExtraField.THROW); } /** * Split the array into ExtraFields and populate them with the * given data, throwing an exception if the data cannot be parsed. * @param data an array of bytes * @param local whether data originates from the local file data * or the central directory * @return an array of ExtraFields * @since 1.1 * @throws ZipException on error */ public static ZipExtraField[] parse(byte[] data, boolean local) throws ZipException { return parse(data, local, UnparseableExtraField.THROW); } /** * Split the array into ExtraFields and populate them with the * given data. * @param data an array of bytes * @param local whether data originates from the local file data * or the central directory * @param onUnparseableData what to do if the extra field data * cannot be parsed. * @return an array of ExtraFields * @throws ZipException on error * @since Ant 1.8.1 */ public static ZipExtraField[] parse(byte[] data, boolean local, UnparseableExtraField onUnparseableData) throws ZipException { List v = new ArrayList(); int start = 0; LOOP: while (start <= data.length - WORD) { ZipShort headerId = new ZipShort(data, start); int length = (new ZipShort(data, start + 2)).getValue(); if (start + WORD + length > data.length) { switch(onUnparseableData.getKey()) { case UnparseableExtraField.THROW_KEY: throw new ZipException("bad extra field starting at " + start + ". Block length of " + length + " bytes exceeds remaining" + " data of " + (data.length - start - WORD) + " bytes."); case UnparseableExtraField.READ_KEY: UnparseableExtraFieldData field = new UnparseableExtraFieldData(); if (local) { field.parseFromLocalFileData(data, start, data.length - start); } else { field.parseFromCentralDirectoryData(data, start, data.length - start); } v.add(field); /*FALLTHROUGH*/ case UnparseableExtraField.SKIP_KEY: // since we cannot parse the data we must assume // the extra field consumes the whole rest of the // available data break LOOP; default: throw new ZipException("unknown UnparseableExtraField key: " + onUnparseableData.getKey()); } } try { ZipExtraField ze = createExtraField(headerId); if (local || !(ze instanceof CentralDirectoryParsingZipExtraField)) { ze.parseFromLocalFileData(data, start + WORD, length); } else { ((CentralDirectoryParsingZipExtraField) ze) .parseFromCentralDirectoryData(data, start + WORD, length); } v.add(ze); } catch (InstantiationException ie) { throw new ZipException(ie.getMessage()); } catch (IllegalAccessException iae) { throw new ZipException(iae.getMessage()); } start += (length + WORD); } ZipExtraField[] result = new ZipExtraField[v.size()]; return (ZipExtraField[]) v.toArray(result); } /** * Merges the local file data fields of the given ZipExtraFields. * @param data an array of ExtraFiles * @return an array of bytes * @since 1.1 */ public static byte[] mergeLocalFileDataData(ZipExtraField[] data) { final boolean lastIsUnparseableHolder = data.length > 0 && data[data.length - 1] instanceof UnparseableExtraFieldData; int regularExtraFieldCount = lastIsUnparseableHolder ? data.length - 1 : data.length; int sum = WORD * regularExtraFieldCount; for (int i = 0; i < data.length; i++) { sum += data[i].getLocalFileDataLength().getValue(); } byte[] result = new byte[sum]; int start = 0; for (int i = 0; i < regularExtraFieldCount; i++) { System.arraycopy(data[i].getHeaderId().getBytes(), 0, result, start, 2); System.arraycopy(data[i].getLocalFileDataLength().getBytes(), 0, result, start + 2, 2); byte[] local = data[i].getLocalFileDataData(); System.arraycopy(local, 0, result, start + WORD, local.length); start += (local.length + WORD); } if (lastIsUnparseableHolder) { byte[] local = data[data.length - 1].getLocalFileDataData(); System.arraycopy(local, 0, result, start, local.length); } return result; } /** * Merges the central directory fields of the given ZipExtraFields. * @param data an array of ExtraFields * @return an array of bytes * @since 1.1 */ public static byte[] mergeCentralDirectoryData(ZipExtraField[] data) { final boolean lastIsUnparseableHolder = data.length > 0 && data[data.length - 1] instanceof UnparseableExtraFieldData; int regularExtraFieldCount = lastIsUnparseableHolder ? data.length - 1 : data.length; int sum = WORD * regularExtraFieldCount; for (int i = 0; i < data.length; i++) { sum += data[i].getCentralDirectoryLength().getValue(); } byte[] result = new byte[sum]; int start = 0; for (int i = 0; i < regularExtraFieldCount; i++) { System.arraycopy(data[i].getHeaderId().getBytes(), 0, result, start, 2); System.arraycopy(data[i].getCentralDirectoryLength().getBytes(), 0, result, start + 2, 2); byte[] local = data[i].getCentralDirectoryData(); System.arraycopy(local, 0, result, start + WORD, local.length); start += (local.length + WORD); } if (lastIsUnparseableHolder) { byte[] local = data[data.length - 1].getCentralDirectoryData(); System.arraycopy(local, 0, result, start, local.length); } return result; } /** * "enum" for the possible actions to take if the extra field * cannot be parsed. */ public static final class UnparseableExtraField { /** * Key for "throw an exception" action. */ public static final int THROW_KEY = 0; /** * Key for "skip" action. */ public static final int SKIP_KEY = 1; /** * Key for "read" action. */ public static final int READ_KEY = 2; /** * Throw an exception if field cannot be parsed. */ public static final UnparseableExtraField THROW = new UnparseableExtraField(THROW_KEY); /** * Skip the extra field entirely and don't make its data * available - effectively removing the extra field data. */ public static final UnparseableExtraField SKIP = new UnparseableExtraField(SKIP_KEY); /** * Read the extra field data into an instance of {@link * UnparseableExtraFieldData UnparseableExtraFieldData}. */ public static final UnparseableExtraField READ = new UnparseableExtraField(READ_KEY); private final int key; private UnparseableExtraField(int k) { key = k; } /** * Key of the action to take. */ public int getKey() { return key; } } } CharacterManaJ/src/main/java/org/apache/tools/zip/ZipOutputStream.java0000644000175000017500000010114513615720000026175 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; import java.io.File; import java.io.FileOutputStream; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.zip.CRC32; import java.util.zip.Deflater; import java.util.zip.ZipException; /** * Reimplementation of {@link java.util.zip.ZipOutputStream * java.util.zip.ZipOutputStream} that does handle the extended * functionality of this package, especially internal/external file * attributes and extra fields with different layouts for local file * data and central directory entries. * *

This class will try to use {@link java.io.RandomAccessFile * RandomAccessFile} when you know that the output is going to go to a * file.

* *

If RandomAccessFile cannot be used, this implementation will use * a Data Descriptor to store size and CRC information for {@link * #DEFLATED DEFLATED} entries, this means, you don't need to * calculate them yourself. Unfortunately this is not possible for * the {@link #STORED STORED} method, here setting the CRC and * uncompressed size information is required before {@link * #putNextEntry putNextEntry} can be called.

* */ @SuppressWarnings({"unchecked", "rawtypes"}) public class ZipOutputStream extends FilterOutputStream { private static final int BYTE_MASK = 0xFF; private static final int SHORT = 2; private static final int WORD = 4; private static final int BUFFER_SIZE = 512; /* * Apparently Deflater.setInput gets slowed down a lot on Sun JVMs * when it gets handed a really big buffer. See * https://issues.apache.org/bugzilla/show_bug.cgi?id=45396 * * Using a buffer size of 8 kB proved to be a good compromise */ private static final int DEFLATER_BLOCK_SIZE = 8192; /** * Compression method for deflated entries. * * @since 1.1 */ public static final int DEFLATED = java.util.zip.ZipEntry.DEFLATED; /** * Default compression level for deflated entries. * * @since Ant 1.7 */ public static final int DEFAULT_COMPRESSION = Deflater.DEFAULT_COMPRESSION; /** * Compression method for stored entries. * * @since 1.1 */ public static final int STORED = java.util.zip.ZipEntry.STORED; /** * default encoding for file names and comment. */ static final String DEFAULT_ENCODING = null; /** * General purpose flag, which indicates that filenames are * written in utf-8. */ public static final int UFT8_NAMES_FLAG = 1 << 11; /** * General purpose flag, which indicates that filenames are * written in utf-8. * @deprecated use {@link #UFT8_NAMES_FLAG} instead */ public static final int EFS_FLAG = UFT8_NAMES_FLAG; /** * Current entry. * * @since 1.1 */ private ZipEntry entry; /** * The file comment. * * @since 1.1 */ private String comment = ""; /** * Compression level for next entry. * * @since 1.1 */ private int level = DEFAULT_COMPRESSION; /** * Has the compression level changed when compared to the last * entry? * * @since 1.5 */ private boolean hasCompressionLevelChanged = false; /** * Default compression method for next entry. * * @since 1.1 */ private int method = java.util.zip.ZipEntry.DEFLATED; /** * List of ZipEntries written so far. * * @since 1.1 */ private final List entries = new LinkedList(); /** * CRC instance to avoid parsing DEFLATED data twice. * * @since 1.1 */ private final CRC32 crc = new CRC32(); /** * Count the bytes written to out. * * @since 1.1 */ private long written = 0; /** * Data for local header data * * @since 1.1 */ private long dataStart = 0; /** * Offset for CRC entry in the local file header data for the * current entry starts here. * * @since 1.15 */ private long localDataStart = 0; /** * Start of central directory. * * @since 1.1 */ private long cdOffset = 0; /** * Length of central directory. * * @since 1.1 */ private long cdLength = 0; /** * Helper, a 0 as ZipShort. * * @since 1.1 */ private static final byte[] ZERO = {0, 0}; /** * Helper, a 0 as ZipLong. * * @since 1.1 */ private static final byte[] LZERO = {0, 0, 0, 0}; /** * Holds the offsets of the LFH starts for each entry. * * @since 1.1 */ private final Map offsets = new HashMap(); /** * The encoding to use for filenames and the file comment. * *

For a list of possible values see http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html. * Defaults to the platform's default character encoding.

* * @since 1.3 */ private String encoding = null; /** * The zip encoding to use for filenames and the file comment. * * This field is of internal use and will be set in {@link * #setEncoding(String)}. */ private ZipEncoding zipEncoding = ZipEncodingHelper.getZipEncoding(DEFAULT_ENCODING); // CheckStyle:VisibilityModifier OFF - bc /** * This Deflater object is used for output. * *

This attribute is only protected to provide a level of API * backwards compatibility. This class used to extend {@link * java.util.zip.DeflaterOutputStream DeflaterOutputStream} up to * Revision 1.13.

* * @since 1.14 */ protected Deflater def = new Deflater(level, true); /** * This buffer servers as a Deflater. * *

This attribute is only protected to provide a level of API * backwards compatibility. This class used to extend {@link * java.util.zip.DeflaterOutputStream DeflaterOutputStream} up to * Revision 1.13.

* * @since 1.14 */ protected byte[] buf = new byte[BUFFER_SIZE]; // CheckStyle:VisibilityModifier ON /** * Optional random access output. * * @since 1.14 */ private RandomAccessFile raf = null; /** * whether to use the general purpose bit flag when writing UTF-8 * filenames or not. */ private boolean useUTF8Flag = true; /** * Whether to encode non-encodable file names as UTF-8. */ private boolean fallbackToUTF8 = false; /** * whether to create UnicodePathExtraField-s for each entry. */ private UnicodeExtraFieldPolicy createUnicodeExtraFields = UnicodeExtraFieldPolicy.NEVER; /** * Creates a new ZIP OutputStream filtering the underlying stream. * @param out the outputstream to zip * @since 1.1 */ public ZipOutputStream(OutputStream out) { super(out); } /** * Creates a new ZIP OutputStream writing to a File. Will use * random access if possible. * @param file the file to zip to * @since 1.14 * @throws IOException on error */ public ZipOutputStream(File file) throws IOException { super(null); try { raf = new RandomAccessFile(file, "rw"); raf.setLength(0); } catch (IOException e) { if (raf != null) { try { raf.close(); } catch (IOException inner) { // ignore } raf = null; } out = new FileOutputStream(file); } } /** * This method indicates whether this archive is writing to a * seekable stream (i.e., to a random access file). * *

For seekable streams, you don't need to calculate the CRC or * uncompressed size for {@link #STORED} entries before * invoking {@link #putNextEntry}. * @return true if seekable * @since 1.17 */ public boolean isSeekable() { return raf != null; } /** * The encoding to use for filenames and the file comment. * *

For a list of possible values see http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html. * Defaults to the platform's default character encoding.

* @param encoding the encoding value * @since 1.3 */ public void setEncoding(final String encoding) { this.encoding = encoding; this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding); useUTF8Flag &= ZipEncodingHelper.isUTF8(encoding); } /** * The encoding to use for filenames and the file comment. * * @return null if using the platform's default character encoding. * * @since 1.3 */ public String getEncoding() { return encoding; } /** * Whether to set the language encoding flag if the file name * encoding is UTF-8. * *

Defaults to true.

*/ public void setUseLanguageEncodingFlag(boolean b) { useUTF8Flag = b && ZipEncodingHelper.isUTF8(encoding); } /** * Whether to create Unicode Extra Fields. * *

Defaults to NEVER.

*/ public void setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy b) { createUnicodeExtraFields = b; } /** * Whether to fall back to UTF and the language encoding flag if * the file name cannot be encoded using the specified encoding. * *

Defaults to false.

*/ public void setFallbackToUTF8(boolean b) { fallbackToUTF8 = b; } /** * Finishs writing the contents and closes this as well as the * underlying stream. * * @since 1.1 * @throws IOException on error */ public void finish() throws IOException { closeEntry(); cdOffset = written; for (Iterator i = entries.iterator(); i.hasNext(); ) { writeCentralFileHeader((ZipEntry) i.next()); } cdLength = written - cdOffset; writeCentralDirectoryEnd(); offsets.clear(); entries.clear(); } /** * Writes all necessary data for this entry. * * @since 1.1 * @throws IOException on error */ public void closeEntry() throws IOException { if (entry == null) { return; } long realCrc = crc.getValue(); crc.reset(); if (entry.getMethod() == DEFLATED) { def.finish(); while (!def.finished()) { deflate(); } entry.setSize(adjustToLong(def.getTotalIn())); entry.setCompressedSize(adjustToLong(def.getTotalOut())); entry.setCrc(realCrc); def.reset(); written += entry.getCompressedSize(); } else if (raf == null) { if (entry.getCrc() != realCrc) { throw new ZipException("bad CRC checksum for entry " + entry.getName() + ": " + Long.toHexString(entry.getCrc()) + " instead of " + Long.toHexString(realCrc)); } if (entry.getSize() != written - dataStart) { throw new ZipException("bad size for entry " + entry.getName() + ": " + entry.getSize() + " instead of " + (written - dataStart)); } } else { /* method is STORED and we used RandomAccessFile */ long size = written - dataStart; entry.setSize(size); entry.setCompressedSize(size); entry.setCrc(realCrc); } // If random access output, write the local file header containing // the correct CRC and compressed/uncompressed sizes if (raf != null) { long save = raf.getFilePointer(); raf.seek(localDataStart); writeOut(ZipLong.getBytes(entry.getCrc())); writeOut(ZipLong.getBytes(entry.getCompressedSize())); writeOut(ZipLong.getBytes(entry.getSize())); raf.seek(save); } writeDataDescriptor(entry); entry = null; } /** * Begin writing next entry. * @param ze the entry to write * @since 1.1 * @throws IOException on error */ public void putNextEntry(ZipEntry ze) throws IOException { closeEntry(); entry = ze; entries.add(entry); if (entry.getMethod() == -1) { // not specified entry.setMethod(method); } if (entry.getTime() == -1) { // not specified entry.setTime(System.currentTimeMillis()); } // Size/CRC not required if RandomAccessFile is used if (entry.getMethod() == STORED && raf == null) { if (entry.getSize() == -1) { throw new ZipException("uncompressed size is required for" + " STORED method when not writing to a" + " file"); } if (entry.getCrc() == -1) { throw new ZipException("crc checksum is required for STORED" + " method when not writing to a file"); } entry.setCompressedSize(entry.getSize()); } if (entry.getMethod() == DEFLATED && hasCompressionLevelChanged) { def.setLevel(level); hasCompressionLevelChanged = false; } writeLocalFileHeader(entry); } /** * Set the file comment. * @param comment the comment * @since 1.1 */ public void setComment(String comment) { this.comment = comment; } /** * Sets the compression level for subsequent entries. * *

Default is Deflater.DEFAULT_COMPRESSION.

* @param level the compression level. * @throws IllegalArgumentException if an invalid compression * level is specified. * @since 1.1 */ public void setLevel(int level) { if (level < Deflater.DEFAULT_COMPRESSION || level > Deflater.BEST_COMPRESSION) { throw new IllegalArgumentException("Invalid compression level: " + level); } hasCompressionLevelChanged = (this.level != level); this.level = level; } /** * Sets the default compression method for subsequent entries. * *

Default is DEFLATED.

* @param method an int from java.util.zip.ZipEntry * @since 1.1 */ public void setMethod(int method) { this.method = method; } /** * Writes bytes to ZIP entry. * @param b the byte array to write * @param offset the start position to write from * @param length the number of bytes to write * @throws IOException on error */ public void write(byte[] b, int offset, int length) throws IOException { if (entry.getMethod() == DEFLATED) { if (length > 0) { if (!def.finished()) { if (length <= DEFLATER_BLOCK_SIZE) { def.setInput(b, offset, length); deflateUntilInputIsNeeded(); } else { final int fullblocks = length / DEFLATER_BLOCK_SIZE; for (int i = 0; i < fullblocks; i++) { def.setInput(b, offset + i * DEFLATER_BLOCK_SIZE, DEFLATER_BLOCK_SIZE); deflateUntilInputIsNeeded(); } final int done = fullblocks * DEFLATER_BLOCK_SIZE; if (done < length) { def.setInput(b, offset + done, length - done); deflateUntilInputIsNeeded(); } } } } } else { writeOut(b, offset, length); written += length; } crc.update(b, offset, length); } /** * Writes a single byte to ZIP entry. * *

Delegates to the three arg method.

* @param b the byte to write * @since 1.14 * @throws IOException on error */ public void write(int b) throws IOException { byte[] buff = new byte[1]; buff[0] = (byte) (b & BYTE_MASK); write(buff, 0, 1); } /** * Closes this output stream and releases any system resources * associated with the stream. * * @exception IOException if an I/O error occurs. * @since 1.14 */ public void close() throws IOException { finish(); if (raf != null) { raf.close(); } if (out != null) { out.close(); } } /** * Flushes this output stream and forces any buffered output bytes * to be written out to the stream. * * @exception IOException if an I/O error occurs. * @since 1.14 */ public void flush() throws IOException { if (out != null) { out.flush(); } } /* * Various ZIP constants */ /** * local file header signature * * @since 1.1 */ protected static final byte[] LFH_SIG = ZipLong.getBytes(0X04034B50L); /** * data descriptor signature * * @since 1.1 */ protected static final byte[] DD_SIG = ZipLong.getBytes(0X08074B50L); /** * central file header signature * * @since 1.1 */ protected static final byte[] CFH_SIG = ZipLong.getBytes(0X02014B50L); /** * end of central dir signature * * @since 1.1 */ protected static final byte[] EOCD_SIG = ZipLong.getBytes(0X06054B50L); /** * Writes next block of compressed data to the output stream. * @throws IOException on error * * @since 1.14 */ protected final void deflate() throws IOException { int len = def.deflate(buf, 0, buf.length); if (len > 0) { writeOut(buf, 0, len); } } /** * Writes the local file header entry * @param ze the entry to write * @throws IOException on error * * @since 1.1 */ protected void writeLocalFileHeader(ZipEntry ze) throws IOException { boolean encodable = zipEncoding.canEncode(ze.getName()); final ZipEncoding entryEncoding; if (!encodable && fallbackToUTF8) { entryEncoding = ZipEncodingHelper.UTF8_ZIP_ENCODING; } else { entryEncoding = zipEncoding; } ByteBuffer name = entryEncoding.encode(ze.getName()); if (createUnicodeExtraFields != UnicodeExtraFieldPolicy.NEVER) { if (createUnicodeExtraFields == UnicodeExtraFieldPolicy.ALWAYS || !encodable) { ze.addExtraField(new UnicodePathExtraField(ze.getName(), name.array(), name.arrayOffset(), name.limit())); } String comm = ze.getComment(); if (comm != null && !"".equals(comm)) { boolean commentEncodable = this.zipEncoding.canEncode(comm); if (createUnicodeExtraFields == UnicodeExtraFieldPolicy.ALWAYS || !commentEncodable) { ByteBuffer commentB = entryEncoding.encode(comm); ze.addExtraField(new UnicodeCommentExtraField(comm, commentB.array(), commentB.arrayOffset(), commentB.limit()) ); } } } offsets.put(ze, ZipLong.getBytes(written)); writeOut(LFH_SIG); written += WORD; //store method in local variable to prevent multiple method calls final int zipMethod = ze.getMethod(); writeVersionNeededToExtractAndGeneralPurposeBits(zipMethod, !encodable && fallbackToUTF8); written += WORD; // compression method writeOut(ZipShort.getBytes(zipMethod)); written += SHORT; // last mod. time and date writeOut(toDosTime(ze.getTime())); written += WORD; // CRC // compressed length // uncompressed length localDataStart = written; if (zipMethod == DEFLATED || raf != null) { writeOut(LZERO); writeOut(LZERO); writeOut(LZERO); } else { writeOut(ZipLong.getBytes(ze.getCrc())); writeOut(ZipLong.getBytes(ze.getSize())); writeOut(ZipLong.getBytes(ze.getSize())); } // CheckStyle:MagicNumber OFF written += 12; // CheckStyle:MagicNumber ON // file name length writeOut(ZipShort.getBytes(name.limit())); written += SHORT; // extra field length byte[] extra = ze.getLocalFileDataExtra(); writeOut(ZipShort.getBytes(extra.length)); written += SHORT; // file name writeOut(name.array(), name.arrayOffset(), name.limit()); written += name.limit(); // extra field writeOut(extra); written += extra.length; dataStart = written; } /** * Writes the data descriptor entry. * @param ze the entry to write * @throws IOException on error * * @since 1.1 */ protected void writeDataDescriptor(ZipEntry ze) throws IOException { if (ze.getMethod() != DEFLATED || raf != null) { return; } writeOut(DD_SIG); writeOut(ZipLong.getBytes(entry.getCrc())); writeOut(ZipLong.getBytes(entry.getCompressedSize())); writeOut(ZipLong.getBytes(entry.getSize())); // CheckStyle:MagicNumber OFF written += 16; // CheckStyle:MagicNumber ON } /** * Writes the central file header entry. * @param ze the entry to write * @throws IOException on error * * @since 1.1 */ protected void writeCentralFileHeader(ZipEntry ze) throws IOException { writeOut(CFH_SIG); written += WORD; // version made by // CheckStyle:MagicNumber OFF writeOut(ZipShort.getBytes((ze.getPlatform() << 8) | 20)); written += SHORT; final int zipMethod = ze.getMethod(); final boolean encodable = zipEncoding.canEncode(ze.getName()); writeVersionNeededToExtractAndGeneralPurposeBits(zipMethod, !encodable && fallbackToUTF8); written += WORD; // compression method writeOut(ZipShort.getBytes(zipMethod)); written += SHORT; // last mod. time and date writeOut(toDosTime(ze.getTime())); written += WORD; // CRC // compressed length // uncompressed length writeOut(ZipLong.getBytes(ze.getCrc())); writeOut(ZipLong.getBytes(ze.getCompressedSize())); writeOut(ZipLong.getBytes(ze.getSize())); // CheckStyle:MagicNumber OFF written += 12; // CheckStyle:MagicNumber ON // file name length final ZipEncoding entryEncoding; if (!encodable && fallbackToUTF8) { entryEncoding = ZipEncodingHelper.UTF8_ZIP_ENCODING; } else { entryEncoding = zipEncoding; } ByteBuffer name = entryEncoding.encode(ze.getName()); writeOut(ZipShort.getBytes(name.limit())); written += SHORT; // extra field length byte[] extra = ze.getCentralDirectoryExtra(); writeOut(ZipShort.getBytes(extra.length)); written += SHORT; // file comment length String comm = ze.getComment(); if (comm == null) { comm = ""; } ByteBuffer commentB = entryEncoding.encode(comm); writeOut(ZipShort.getBytes(commentB.limit())); written += SHORT; // disk number start writeOut(ZERO); written += SHORT; // internal file attributes writeOut(ZipShort.getBytes(ze.getInternalAttributes())); written += SHORT; // external file attributes writeOut(ZipLong.getBytes(ze.getExternalAttributes())); written += WORD; // relative offset of LFH writeOut((byte[]) offsets.get(ze)); written += WORD; // file name writeOut(name.array(), name.arrayOffset(), name.limit()); written += name.limit(); // extra field writeOut(extra); written += extra.length; // file comment writeOut(commentB.array(), commentB.arrayOffset(), commentB.limit()); written += commentB.limit(); } /** * Writes the "End of central dir record". * @throws IOException on error * * @since 1.1 */ protected void writeCentralDirectoryEnd() throws IOException { writeOut(EOCD_SIG); // disk numbers writeOut(ZERO); writeOut(ZERO); // number of entries byte[] num = ZipShort.getBytes(entries.size()); writeOut(num); writeOut(num); // length and location of CD writeOut(ZipLong.getBytes(cdLength)); writeOut(ZipLong.getBytes(cdOffset)); // ZIP file comment ByteBuffer data = this.zipEncoding.encode(comment); writeOut(ZipShort.getBytes(data.limit())); writeOut(data.array(), data.arrayOffset(), data.limit()); } /** * Smallest date/time ZIP can handle. * * @since 1.1 */ private static final byte[] DOS_TIME_MIN = ZipLong.getBytes(0x00002100L); /** * Convert a Date object to a DOS date/time field. * @param time the Date to convert * @return the date as a ZipLong * @since 1.1 */ protected static ZipLong toDosTime(Date time) { return new ZipLong(toDosTime(time.getTime())); } /** * Convert a Date object to a DOS date/time field. * *

Stolen from InfoZip's fileio.c

* @param t number of milliseconds since the epoch * @return the date as a byte array * @since 1.26 */ @SuppressWarnings("deprecation") protected static byte[] toDosTime(long t) { Date time = new Date(t); // CheckStyle:MagicNumberCheck OFF - I do not think that using constants // here will improve the readablity int year = time.getYear() + 1900; if (year < 1980) { return DOS_TIME_MIN; } int month = time.getMonth() + 1; long value = ((year - 1980) << 25) | (month << 21) | (time.getDate() << 16) | (time.getHours() << 11) | (time.getMinutes() << 5) | (time.getSeconds() >> 1); return ZipLong.getBytes(value); // CheckStyle:MagicNumberCheck ON } /** * Retrieve the bytes for the given String in the encoding set for * this Stream. * @param name the string to get bytes from * @return the bytes as a byte array * @throws ZipException on error * * @since 1.3 */ protected byte[] getBytes(String name) throws ZipException { try { ByteBuffer b = ZipEncodingHelper.getZipEncoding(encoding).encode(name); byte[] result = new byte[b.limit()]; System.arraycopy(b.array(), b.arrayOffset(), result, 0, result.length); return result; } catch (IOException ex) { throw new ZipException("Failed to encode name: " + ex.getMessage()); } } /** * Write bytes to output or random access file. * @param data the byte array to write * @throws IOException on error * * @since 1.14 */ protected final void writeOut(byte[] data) throws IOException { writeOut(data, 0, data.length); } /** * Write bytes to output or random access file. * @param data the byte array to write * @param offset the start position to write from * @param length the number of bytes to write * @throws IOException on error * * @since 1.14 */ protected final void writeOut(byte[] data, int offset, int length) throws IOException { if (raf != null) { raf.write(data, offset, length); } else { out.write(data, offset, length); } } /** * Assumes a negative integer really is a positive integer that * has wrapped around and re-creates the original value. * @param i the value to treat as unsigned int. * @return the unsigned int as a long. * @since 1.34 */ protected static long adjustToLong(int i) { if (i < 0) { return 2 * ((long) Integer.MAX_VALUE) + 2 + i; } else { return i; } } private void deflateUntilInputIsNeeded() throws IOException { while (!def.needsInput()) { deflate(); } } private void writeVersionNeededToExtractAndGeneralPurposeBits(final int zipMethod, final boolean utfFallback) throws IOException { // CheckStyle:MagicNumber OFF int versionNeededToExtract = 10; int generalPurposeFlag = (useUTF8Flag || utfFallback) ? UFT8_NAMES_FLAG : 0; if (zipMethod == DEFLATED && raf == null) { // requires version 2 as we are going to store length info // in the data descriptor versionNeededToExtract = 20; // bit3 set to signal, we use a data descriptor generalPurposeFlag |= 8; } // CheckStyle:MagicNumber ON // version needed to extract writeOut(ZipShort.getBytes(versionNeededToExtract)); // general purpose bit flag writeOut(ZipShort.getBytes(generalPurposeFlag)); } /** * enum that represents the possible policies for creating Unicode * extra fields. */ public static final class UnicodeExtraFieldPolicy { /** * Always create Unicode extra fields. */ public static final UnicodeExtraFieldPolicy ALWAYS = new UnicodeExtraFieldPolicy("always"); /** * Never create Unicode extra fields. */ public static final UnicodeExtraFieldPolicy NEVER = new UnicodeExtraFieldPolicy("never"); /** * Create Unicode extra fields for filenames that cannot be * encoded using the specified encoding. */ public static final UnicodeExtraFieldPolicy NOT_ENCODEABLE = new UnicodeExtraFieldPolicy("not encodeable"); private final String name; private UnicodeExtraFieldPolicy(String n) { name = n; } public String toString() { return name; } } } CharacterManaJ/src/main/java/org/apache/tools/zip/ZipShort.java0000644000175000017500000001036413615720000024622 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; /** * Utility class that represents a two byte integer with conversion * rules for the big endian byte order of ZIP files. * */ public final class ZipShort implements Cloneable { private static final int BYTE_MASK = 0xFF; private static final int BYTE_1_MASK = 0xFF00; private static final int BYTE_1_SHIFT = 8; private int value; /** * Create instance from a number. * @param value the int to store as a ZipShort * @since 1.1 */ public ZipShort (int value) { this.value = value; } /** * Create instance from bytes. * @param bytes the bytes to store as a ZipShort * @since 1.1 */ public ZipShort (byte[] bytes) { this(bytes, 0); } /** * Create instance from the two bytes starting at offset. * @param bytes the bytes to store as a ZipShort * @param offset the offset to start * @since 1.1 */ public ZipShort (byte[] bytes, int offset) { value = ZipShort.getValue(bytes, offset); } /** * Get value as two bytes in big endian byte order. * @return the value as a a two byte array in big endian byte order * @since 1.1 */ public byte[] getBytes() { byte[] result = new byte[2]; result[0] = (byte) (value & BYTE_MASK); result[1] = (byte) ((value & BYTE_1_MASK) >> BYTE_1_SHIFT); return result; } /** * Get value as Java int. * @return value as a Java int * @since 1.1 */ public int getValue() { return value; } /** * Get value as two bytes in big endian byte order. * @param value the Java int to convert to bytes * @return the converted int as a byte array in big endian byte order */ public static byte[] getBytes(int value) { byte[] result = new byte[2]; result[0] = (byte) (value & BYTE_MASK); result[1] = (byte) ((value & BYTE_1_MASK) >> BYTE_1_SHIFT); return result; } /** * Helper method to get the value as a java int from two bytes starting at given array offset * @param bytes the array of bytes * @param offset the offset to start * @return the correspondanding java int value */ public static int getValue(byte[] bytes, int offset) { int value = (bytes[offset + 1] << BYTE_1_SHIFT) & BYTE_1_MASK; value += (bytes[offset] & BYTE_MASK); return value; } /** * Helper method to get the value as a java int from a two-byte array * @param bytes the array of bytes * @return the correspondanding java int value */ public static int getValue(byte[] bytes) { return getValue(bytes, 0); } /** * Override to make two instances with same value equal. * @param o an object to compare * @return true if the objects are equal * @since 1.1 */ public boolean equals(Object o) { if (o == null || !(o instanceof ZipShort)) { return false; } return value == ((ZipShort) o).getValue(); } /** * Override to make two instances with same value equal. * @return the value stored in the ZipShort * @since 1.1 */ public int hashCode() { return value; } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException cnfe) { // impossible throw new RuntimeException(cnfe); } } } CharacterManaJ/src/main/java/org/apache/tools/zip/UnparseableExtraFieldData.java0000644000175000017500000000742513615720000030047 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.tools.zip; /** * Wrapper for extra field data that doesn't conform to the recommended format of header-tag + size + data. * *

The header-id is artificial (and not listed as a know ID in * {@link http://www.pkware.com/documents/casestudies/APPNOTE.TXT * APPNOTE.TXT}. Since it isn't used anywhere except to satisfy the * ZipExtraField contract it shouldn't matter anyway.

* @since Ant 1.8.1 */ public final class UnparseableExtraFieldData implements CentralDirectoryParsingZipExtraField { private static final ZipShort HEADER_ID = new ZipShort(0xACC1); private byte[] localFileData; private byte[] centralDirectoryData; /** * The Header-ID. * * @return a completely arbitrary value that should be ignored. */ public ZipShort getHeaderId() { return HEADER_ID; } /** * Length of the complete extra field in the local file data. * * @return The LocalFileDataLength value */ public ZipShort getLocalFileDataLength() { return new ZipShort(localFileData == null ? 0 : localFileData.length); } /** * Length of the complete extra field in the central directory. * * @return The CentralDirectoryLength value */ public ZipShort getCentralDirectoryLength() { return centralDirectoryData == null ? getLocalFileDataLength() : new ZipShort(centralDirectoryData.length); } /** * The actual data to put into local file data. * * @return The LocalFileDataData value */ public byte[] getLocalFileDataData() { return ZipUtil.copy(localFileData); } /** * The actual data to put into central directory. * * @return The CentralDirectoryData value */ public byte[] getCentralDirectoryData() { return centralDirectoryData == null ? getLocalFileDataData() : ZipUtil.copy(centralDirectoryData); } /** * Populate data from this array as if it was in local file data. * * @param buffer the buffer to read data from * @param offset offset into buffer to read data * @param length the length of data */ public void parseFromLocalFileData(byte[] buffer, int offset, int length) { localFileData = new byte[length]; System.arraycopy(buffer, offset, localFileData, 0, length); } /** * Populate data from this array as if it was in central directory data. * * @param buffer the buffer to read data from * @param offset offset into buffer to read data * @param length the length of data * @exception ZipException on error */ public void parseFromCentralDirectoryData(byte[] buffer, int offset, int length) { centralDirectoryData = new byte[length]; System.arraycopy(buffer, offset, centralDirectoryData, 0, length); if (localFileData == null) { parseFromLocalFileData(buffer, offset, length); } } } CharacterManaJ/src/main/java/org/apache/tools/zip/UnicodePathExtraField.java0000644000175000017500000000516113615720000027212 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; /** * Info-ZIP Unicode Path Extra Field (0x7075): * *

Stores the UTF-8 version of the file name field as stored in the * local header and central directory header.

* *
 *         Value         Size        Description
 *         -----         ----        -----------
 * (UPath) 0x7075        Short       tag for this extra block type ("up")
 *         TSize         Short       total data size for this block
 *         Version       1 byte      version of this extra field, currently 1
 *         NameCRC32     4 bytes     File Name Field CRC32 Checksum
 *         UnicodeName   Variable    UTF-8 version of the entry File Name
 * 
*/ public class UnicodePathExtraField extends AbstractUnicodeExtraField { public static final ZipShort UPATH_ID = new ZipShort(0x7075); public UnicodePathExtraField () { } /** * Assemble as unicode path extension from the name given as * text as well as the encoded bytes actually written to the archive. * * @param text The file name * @param bytes the bytes actually written to the archive * @param off The offset of the encoded filename in bytes. * @param len The length of the encoded filename or comment in * bytes. */ public UnicodePathExtraField(String text, byte[] bytes, int off, int len) { super(text, bytes, off, len); } /** * Assemble as unicode path extension from the name given as * text as well as the encoded bytes actually written to the archive. * * @param name The file name * @param bytes the bytes actually written to the archive */ public UnicodePathExtraField(String name, byte[] bytes) { super(name, bytes); } public ZipShort getHeaderId() { return UPATH_ID; } } CharacterManaJ/src/main/java/org/apache/tools/zip/CentralDirectoryParsingZipExtraField.java0000644000175000017500000000267513615720000032302 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; import java.util.zip.ZipException; /** * {@link ZipExtraField ZipExtraField} that knows how to parse central * directory data. * * @since Ant 1.8.0 */ public interface CentralDirectoryParsingZipExtraField extends ZipExtraField { /** * Populate data from this array as if it was in central directory data. * @param data an array of bytes * @param offset the start offset * @param length the number of bytes in the array from offset * * @throws ZipException on error */ void parseFromCentralDirectoryData(byte[] data, int offset, int length) throws ZipException; } CharacterManaJ/src/main/java/org/apache/tools/zip/UnrecognizedExtraField.java0000644000175000017500000001043013615720000027436 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; /** * Simple placeholder for all those extra fields we don't want to deal * with. * *

Assumes local file data and central directory entries are * identical - unless told the opposite.

* */ public class UnrecognizedExtraField implements CentralDirectoryParsingZipExtraField { /** * The Header-ID. * * @since 1.1 */ private ZipShort headerId; /** * Set the header id. * @param headerId the header id to use */ public void setHeaderId(ZipShort headerId) { this.headerId = headerId; } /** * Get the header id. * @return the header id */ public ZipShort getHeaderId() { return headerId; } /** * Extra field data in local file data - without * Header-ID or length specifier. * * @since 1.1 */ private byte[] localData; /** * Set the extra field data in the local file data - * without Header-ID or length specifier. * @param data the field data to use */ public void setLocalFileDataData(byte[] data) { localData = ZipUtil.copy(data); } /** * Get the length of the local data. * @return the length of the local data */ public ZipShort getLocalFileDataLength() { return new ZipShort(localData.length); } /** * Get the local data. * @return the local data */ public byte[] getLocalFileDataData() { return ZipUtil.copy(localData); } /** * Extra field data in central directory - without * Header-ID or length specifier. * * @since 1.1 */ private byte[] centralData; /** * Set the extra field data in central directory. * @param data the data to use */ public void setCentralDirectoryData(byte[] data) { centralData = ZipUtil.copy(data); } /** * Get the central data length. * If there is no central data, get the local file data length. * @return the central data length */ public ZipShort getCentralDirectoryLength() { if (centralData != null) { return new ZipShort(centralData.length); } return getLocalFileDataLength(); } /** * Get the central data. * @return the central data if present, else return the local file data */ public byte[] getCentralDirectoryData() { if (centralData != null) { return ZipUtil.copy(centralData); } return getLocalFileDataData(); } /** * @param data the array of bytes. * @param offset the source location in the data array. * @param length the number of bytes to use in the data array. * @see ZipExtraField#parseFromLocalFileData(byte[], int, int) */ public void parseFromLocalFileData(byte[] data, int offset, int length) { byte[] tmp = new byte[length]; System.arraycopy(data, offset, tmp, 0, length); setLocalFileDataData(tmp); } /** * @param data the array of bytes. * @param offset the source location in the data array. * @param length the number of bytes to use in the data array. */ public void parseFromCentralDirectoryData(byte[] data, int offset, int length) { byte[] tmp = new byte[length]; System.arraycopy(data, offset, tmp, 0, length); setCentralDirectoryData(tmp); if (localData == null) { setLocalFileDataData(tmp); } } } CharacterManaJ/src/main/java/org/apache/tools/zip/ZipExtraField.java0000644000175000017500000000514013615720000025546 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; import java.util.zip.ZipException; /** * General format of extra field data. * *

Extra fields usually appear twice per file, once in the local * file data and once in the central directory. Usually they are the * same, but they don't have to be. {@link * java.util.zip.ZipOutputStream java.util.zip.ZipOutputStream} will * only use the local file data in both places.

* */ public interface ZipExtraField { /** * The Header-ID. * @return the header id * @since 1.1 */ ZipShort getHeaderId(); /** * Length of the extra field in the local file data - without * Header-ID or length specifier. * @return the length of the field in the local file data * @since 1.1 */ ZipShort getLocalFileDataLength(); /** * Length of the extra field in the central directory - without * Header-ID or length specifier. * @return the length of the field in the central directory * @since 1.1 */ ZipShort getCentralDirectoryLength(); /** * The actual data to put into local file data - without Header-ID * or length specifier. * @return the data * @since 1.1 */ byte[] getLocalFileDataData(); /** * The actual data to put into central directory - without Header-ID or * length specifier. * @return the data * @since 1.1 */ byte[] getCentralDirectoryData(); /** * Populate data from this array as if it was in local file data. * @param data an array of bytes * @param offset the start offset * @param length the number of bytes in the array from offset * * @since 1.1 * @throws ZipException on error */ void parseFromLocalFileData(byte[] data, int offset, int length) throws ZipException; } CharacterManaJ/src/main/java/org/apache/tools/zip/ZipLong.java0000644000175000017500000001144313615720000024421 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; /** * Utility class that represents a four byte integer with conversion * rules for the big endian byte order of ZIP files. * */ public final class ZipLong implements Cloneable { private static final int WORD = 4; // private static final int BYTE_BIT_SIZE = 8; private static final int BYTE_MASK = 0xFF; private static final int BYTE_1 = 1; private static final int BYTE_1_MASK = 0xFF00; private static final int BYTE_1_SHIFT = 8; private static final int BYTE_2 = 2; private static final int BYTE_2_MASK = 0xFF0000; private static final int BYTE_2_SHIFT = 16; private static final int BYTE_3 = 3; private static final long BYTE_3_MASK = 0xFF000000L; private static final int BYTE_3_SHIFT = 24; private long value; /** * Create instance from a number. * @param value the long to store as a ZipLong * @since 1.1 */ public ZipLong(long value) { this.value = value; } /** * Create instance from bytes. * @param bytes the bytes to store as a ZipLong * @since 1.1 */ public ZipLong (byte[] bytes) { this(bytes, 0); } /** * Create instance from the four bytes starting at offset. * @param bytes the bytes to store as a ZipLong * @param offset the offset to start * @since 1.1 */ public ZipLong (byte[] bytes, int offset) { value = ZipLong.getValue(bytes, offset); } /** * Get value as four bytes in big endian byte order. * @since 1.1 * @return value as four bytes in big endian order */ public byte[] getBytes() { return ZipLong.getBytes(value); } /** * Get value as Java long. * @since 1.1 * @return value as a long */ public long getValue() { return value; } /** * Get value as four bytes in big endian byte order. * @param value the value to convert * @return value as four bytes in big endian byte order */ public static byte[] getBytes(long value) { byte[] result = new byte[WORD]; result[0] = (byte) ((value & BYTE_MASK)); result[BYTE_1] = (byte) ((value & BYTE_1_MASK) >> BYTE_1_SHIFT); result[BYTE_2] = (byte) ((value & BYTE_2_MASK) >> BYTE_2_SHIFT); result[BYTE_3] = (byte) ((value & BYTE_3_MASK) >> BYTE_3_SHIFT); return result; } /** * Helper method to get the value as a Java long from four bytes starting at given array offset * @param bytes the array of bytes * @param offset the offset to start * @return the correspondanding Java long value */ public static long getValue(byte[] bytes, int offset) { long value = (bytes[offset + BYTE_3] << BYTE_3_SHIFT) & BYTE_3_MASK; value += (bytes[offset + BYTE_2] << BYTE_2_SHIFT) & BYTE_2_MASK; value += (bytes[offset + BYTE_1] << BYTE_1_SHIFT) & BYTE_1_MASK; value += (bytes[offset] & BYTE_MASK); return value; } /** * Helper method to get the value as a Java long from a four-byte array * @param bytes the array of bytes * @return the correspondanding Java long value */ public static long getValue(byte[] bytes) { return getValue(bytes, 0); } /** * Override to make two instances with same value equal. * @param o an object to compare * @return true if the objects are equal * @since 1.1 */ public boolean equals(Object o) { if (o == null || !(o instanceof ZipLong)) { return false; } return value == ((ZipLong) o).getValue(); } /** * Override to make two instances with same value equal. * @return the value stored in the ZipLong * @since 1.1 */ public int hashCode() { return (int) value; } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException cnfe) { // impossible throw new RuntimeException(cnfe); } } } CharacterManaJ/src/main/java/org/apache/tools/zip/ZipEncodingHelper.java0000644000175000017500000002237713615720000026420 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.UnsupportedCharsetException; import java.util.HashMap; import java.util.Map; /** * Static helper functions for robustly encoding filenames in zip files. */ @SuppressWarnings({ "unchecked", "rawtypes" }) abstract class ZipEncodingHelper { /** * A class, which holds the high characters of a simple encoding * and lazily instantiates a Simple8BitZipEncoding instance in a * thread-safe manner. */ private static class SimpleEncodingHolder { private final char [] highChars; private Simple8BitZipEncoding encoding; /** * Instantiate a simple encoding holder. * * @param highChars The characters for byte codes 128 to 255. * * @see Simple8BitZipEncoding#Simple8BitZipEncoding(char[]) */ SimpleEncodingHolder(char [] highChars) { this.highChars = highChars; } /** * @return The associated {@link Simple8BitZipEncoding}, which * is instantiated if not done so far. */ public synchronized Simple8BitZipEncoding getEncoding() { if (this.encoding == null) { this.encoding = new Simple8BitZipEncoding(this.highChars); } return this.encoding; } } private static final Map simpleEncodings; static { simpleEncodings = new HashMap(); char[] cp437_high_chars = new char[] { 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 }; SimpleEncodingHolder cp437 = new SimpleEncodingHolder(cp437_high_chars); simpleEncodings.put("CP437",cp437); simpleEncodings.put("Cp437",cp437); simpleEncodings.put("cp437",cp437); simpleEncodings.put("IBM437",cp437); simpleEncodings.put("ibm437",cp437); char[] cp850_high_chars = new char[] { 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, 0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce, 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580, 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe, 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4, 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0 }; SimpleEncodingHolder cp850 = new SimpleEncodingHolder(cp850_high_chars); simpleEncodings.put("CP850",cp850); simpleEncodings.put("Cp850",cp850); simpleEncodings.put("cp850",cp850); simpleEncodings.put("IBM850",cp850); simpleEncodings.put("ibm850",cp850); } /** * Grow a byte buffer, so it has a minimal capacity or at least * the double capacity of the original buffer * * @param b The original buffer. * @param newCapacity The minimal requested new capacity. * @return A byte buffer r with * r.capacity() = max(b.capacity()*2,newCapacity) and * all the data contained in b copied to the beginning * of r. * */ static ByteBuffer growBuffer(ByteBuffer b, int newCapacity) { b.limit(b.position()); b.rewind(); int c2 = b.capacity() * 2; ByteBuffer on = ByteBuffer.allocate(c2 < newCapacity ? newCapacity : c2); on.put(b); return on; } /** * The hexadecimal digits 0,...,9,A,...,F encoded as * ASCII bytes. */ private static final byte[] HEX_DIGITS = new byte [] { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }; /** * Append %Uxxxx to the given byte buffer. * The caller must assure, that bb.remaining()>=6. * * @param bb The byte buffer to write to. * @param c The character to write. */ static void appendSurrogate(ByteBuffer bb, char c) { bb.put((byte) '%'); bb.put((byte) 'U'); bb.put(HEX_DIGITS[(c >> 12)&0x0f]); bb.put(HEX_DIGITS[(c >> 8)&0x0f]); bb.put(HEX_DIGITS[(c >> 4)&0x0f]); bb.put(HEX_DIGITS[c & 0x0f]); } /** * name of the encoding UTF-8 */ static final String UTF8 = "UTF8"; /** * variant name of the encoding UTF-8 used for comparisions. */ private static final String UTF_DASH_8 = "utf-8"; /** * name of the encoding UTF-8 */ static final ZipEncoding UTF8_ZIP_ENCODING = new FallbackZipEncoding(UTF8); /** * Instantiates a zip encoding. * * @param name The name of the zip encoding. Specify null for * the platform's default encoding. * @return A zip encoding for the given encoding name. */ static ZipEncoding getZipEncoding(String name) { // fallback encoding is good enough for utf-8. if (isUTF8(name)) { return UTF8_ZIP_ENCODING; } if (name == null) { return new FallbackZipEncoding(); } SimpleEncodingHolder h = (SimpleEncodingHolder) simpleEncodings.get(name); if (h!=null) { return h.getEncoding(); } try { Charset cs = Charset.forName(name); return new NioZipEncoding(cs); } catch (UnsupportedCharsetException e) { return new FallbackZipEncoding(name); } } /** * Whether a given encoding - or the platform's default encoding * if the parameter is null - is UTF-8. */ static boolean isUTF8(String encoding) { if (encoding == null) { // check platform's default encoding encoding = System.getProperty("file.encoding"); } return UTF8.equalsIgnoreCase(encoding) || UTF_DASH_8.equalsIgnoreCase(encoding); } } CharacterManaJ/src/main/java/org/apache/tools/zip/ZipUtil.java0000644000175000017500000000243313615720000024436 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; /** * Utility class for handling DOS and Java time conversions. * @since Ant 1.8.1 */ public abstract class ZipUtil { /** * Create a copy of the given array - or return null if the * argument is null. */ static byte[] copy(byte[] from) { if (from != null) { byte[] to = new byte[from.length]; System.arraycopy(from, 0, to, 0, to.length); return to; } return null; } } CharacterManaJ/src/main/java/org/apache/tools/zip/ZipEntry.java0000644000175000017500000004032413615720000024623 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.zip.ZipException; /** * Extension that adds better handling of extra fields and provides * access to the internal and external file attributes. * *

The extra data is expected to follow the recommendation of * {@link http://www.pkware.com/documents/casestudies/APPNOTE.TXT * APPNOTE.txt}:

*
    *
  • the extra byte array consists of a sequence of extra fields
  • *
  • each extra fields starts by a two byte header id followed by * a two byte sequence holding the length of the remainder of * data.
  • *
* *

Any extra data that cannot be parsed by the rules above will be * consumed as "unparseable" extra data and treated differently by the * methods of this class. Versions prior to Apache Commons Compress * 1.1 would have thrown an exception if any attempt was made to read * or write extra data not conforming to the recommendation.

* */ @SuppressWarnings({"unchecked", "rawtypes"}) public class ZipEntry extends java.util.zip.ZipEntry implements Cloneable { public static final int PLATFORM_UNIX = 3; public static final int PLATFORM_FAT = 0; private static final int SHORT_MASK = 0xFFFF; private static final int SHORT_SHIFT = 16; private int internalAttributes = 0; private int platform = PLATFORM_FAT; private long externalAttributes = 0; private LinkedHashMap/**/ extraFields = null; private UnparseableExtraFieldData unparseableExtra = null; private String name = null; /** * Creates a new zip entry with the specified name. * @param name the name of the entry * @since 1.1 */ public ZipEntry(String name) { super(name); } /** * Creates a new zip entry with fields taken from the specified zip entry. * @param entry the entry to get fields from * @since 1.1 * @throws ZipException on error */ public ZipEntry(java.util.zip.ZipEntry entry) throws ZipException { super(entry); byte[] extra = entry.getExtra(); if (extra != null) { setExtraFields(ExtraFieldUtils.parse(extra, true, ExtraFieldUtils .UnparseableExtraField.READ)); } else { // initializes extra data to an empty byte array setExtra(); } } /** * Creates a new zip entry with fields taken from the specified zip entry. * @param entry the entry to get fields from * @throws ZipException on error * @since 1.1 */ public ZipEntry(ZipEntry entry) throws ZipException { this((java.util.zip.ZipEntry) entry); setInternalAttributes(entry.getInternalAttributes()); setExternalAttributes(entry.getExternalAttributes()); setExtraFields(entry.getExtraFields(true)); } /** * @since 1.9 */ protected ZipEntry() { super(""); } /** * Overwrite clone. * @return a cloned copy of this ZipEntry * @since 1.1 */ public Object clone() { ZipEntry e = (ZipEntry) super.clone(); e.setInternalAttributes(getInternalAttributes()); e.setExternalAttributes(getExternalAttributes()); e.setExtraFields(getExtraFields(true)); return e; } /** * Retrieves the internal file attributes. * * @return the internal file attributes * @since 1.1 */ public int getInternalAttributes() { return internalAttributes; } /** * Sets the internal file attributes. * @param value an int value * @since 1.1 */ public void setInternalAttributes(int value) { internalAttributes = value; } /** * Retrieves the external file attributes. * @return the external file attributes * @since 1.1 */ public long getExternalAttributes() { return externalAttributes; } /** * Sets the external file attributes. * @param value an long value * @since 1.1 */ public void setExternalAttributes(long value) { externalAttributes = value; } /** * Sets Unix permissions in a way that is understood by Info-Zip's * unzip command. * @param mode an int value * @since Ant 1.5.2 */ public void setUnixMode(int mode) { // CheckStyle:MagicNumberCheck OFF - no point setExternalAttributes((mode << SHORT_SHIFT) // MS-DOS read-only attribute | ((mode & 0200) == 0 ? 1 : 0) // MS-DOS directory flag | (isDirectory() ? 0x10 : 0)); // CheckStyle:MagicNumberCheck ON platform = PLATFORM_UNIX; } /** * Unix permission. * @return the unix permissions * @since Ant 1.6 */ public int getUnixMode() { return platform != PLATFORM_UNIX ? 0 : (int) ((getExternalAttributes() >> SHORT_SHIFT) & SHORT_MASK); } /** * Platform specification to put into the "version made * by" part of the central file header. * * @return PLATFORM_FAT unless {@link #setUnixMode setUnixMode} * has been called, in which case PLATORM_UNIX will be returned. * * @since Ant 1.5.2 */ public int getPlatform() { return platform; } /** * Set the platform (UNIX or FAT). * @param platform an int value - 0 is FAT, 3 is UNIX * @since 1.9 */ protected void setPlatform(int platform) { this.platform = platform; } /** * Replaces all currently attached extra fields with the new array. * @param fields an array of extra fields * @since 1.1 */ public void setExtraFields(ZipExtraField[] fields) { extraFields = new LinkedHashMap(); for (int i = 0; i < fields.length; i++) { if (fields[i] instanceof UnparseableExtraFieldData) { unparseableExtra = (UnparseableExtraFieldData) fields[i]; } else { extraFields.put(fields[i].getHeaderId(), fields[i]); } } setExtra(); } /** * Retrieves all extra fields that have been parsed successfully. * @return an array of the extra fields */ public ZipExtraField[] getExtraFields() { return getExtraFields(false); } /** * Retrieves extra fields. * @param includeUnparseable whether to also return unparseable * extra fields as {@link UnparseableExtraFieldData} if such data * exists. * @return an array of the extra fields * @since 1.1 */ public ZipExtraField[] getExtraFields(boolean includeUnparseable) { if (extraFields == null) { return !includeUnparseable || unparseableExtra == null ? new ZipExtraField[0] : new ZipExtraField[] { unparseableExtra }; } List result = new ArrayList(extraFields.values()); if (includeUnparseable && unparseableExtra != null) { result.add(unparseableExtra); } return (ZipExtraField[]) result.toArray(new ZipExtraField[0]); } /** * Adds an extra field - replacing an already present extra field * of the same type. * *

If no extra field of the same type exists, the field will be * added as last field.

* @param ze an extra field * @since 1.1 */ public void addExtraField(ZipExtraField ze) { if (ze instanceof UnparseableExtraFieldData) { unparseableExtra = (UnparseableExtraFieldData) ze; } else { if (extraFields == null) { extraFields = new LinkedHashMap(); } extraFields.put(ze.getHeaderId(), ze); } setExtra(); } /** * Adds an extra field - replacing an already present extra field * of the same type. * *

The new extra field will be the first one.

* @param ze an extra field * @since 1.1 */ public void addAsFirstExtraField(ZipExtraField ze) { if (ze instanceof UnparseableExtraFieldData) { unparseableExtra = (UnparseableExtraFieldData) ze; } else { LinkedHashMap copy = extraFields; extraFields = new LinkedHashMap(); extraFields.put(ze.getHeaderId(), ze); if (copy != null) { copy.remove(ze.getHeaderId()); extraFields.putAll(copy); } } setExtra(); } /** * Remove an extra field. * @param type the type of extra field to remove * @since 1.1 */ public void removeExtraField(ZipShort type) { if (extraFields == null) { throw new java.util.NoSuchElementException(); } if (extraFields.remove(type) == null) { throw new java.util.NoSuchElementException(); } setExtra(); } /** * Removes unparseable extra field data. */ public void removeUnparseableExtraFieldData() { if (unparseableExtra == null) { throw new java.util.NoSuchElementException(); } unparseableExtra = null; setExtra(); } /** * Looks up an extra field by its header id. * * @return null if no such field exists. */ public ZipExtraField getExtraField(ZipShort type) { if (extraFields != null) { return (ZipExtraField) extraFields.get(type); } return null; } /** * Looks up extra field data that couldn't be parsed correctly. * * @return null if no such field exists. */ public UnparseableExtraFieldData getUnparseableExtraFieldData() { return unparseableExtra; } /** * Parses the given bytes as extra field data and consumes any * unparseable data as an {@link UnparseableExtraFieldData} * instance. * @param extra an array of bytes to be parsed into extra fields * @throws RuntimeException if the bytes cannot be parsed * @since 1.1 * @throws RuntimeException on error */ public void setExtra(byte[] extra) throws RuntimeException { try { ZipExtraField[] local = ExtraFieldUtils.parse(extra, true, ExtraFieldUtils.UnparseableExtraField.READ); mergeExtraFields(local, true); } catch (Exception e) { // actually this is not be possible as of Ant 1.8.1 throw new RuntimeException("Error parsing extra fields for entry: " + getName() + " - " + e.getMessage(), e); } } /** * Unfortunately {@link java.util.zip.ZipOutputStream * java.util.zip.ZipOutputStream} seems to access the extra data * directly, so overriding getExtra doesn't help - we need to * modify super's data directly. * * @since 1.1 */ protected void setExtra() { super.setExtra(ExtraFieldUtils.mergeLocalFileDataData(getExtraFields(true))); } /** * Sets the central directory part of extra fields. */ public void setCentralDirectoryExtra(byte[] b) { try { ZipExtraField[] central = ExtraFieldUtils.parse(b, false, ExtraFieldUtils.UnparseableExtraField.READ); mergeExtraFields(central, false); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } /** * Retrieves the extra data for the local file data. * @return the extra data for local file * @since 1.1 */ public byte[] getLocalFileDataExtra() { byte[] extra = getExtra(); return extra != null ? extra : new byte[0]; } /** * Retrieves the extra data for the central directory. * @return the central directory extra data * @since 1.1 */ public byte[] getCentralDirectoryExtra() { return ExtraFieldUtils.mergeCentralDirectoryData(getExtraFields(true)); } /** * Make this class work in JDK 1.1 like a 1.2 class. * *

This either stores the size for later usage or invokes * setCompressedSize via reflection.

* @param size the size to use * @deprecated since 1.7. * Use setCompressedSize directly. * @since 1.2 */ public void setComprSize(long size) { setCompressedSize(size); } /** * Get the name of the entry. * @return the entry name * @since 1.9 */ public String getName() { return name == null ? super.getName() : name; } /** * Is this entry a directory? * @return true if the entry is a directory * @since 1.10 */ public boolean isDirectory() { return getName().endsWith("/"); } /** * Set the name of the entry. * @param name the name to use */ protected void setName(String name) { this.name = name; } /** * Get the hashCode of the entry. * This uses the name as the hashcode. * @return a hashcode. * @since Ant 1.7 */ public int hashCode() { // this method has severe consequences on performance. We cannot rely // on the super.hashCode() method since super.getName() always return // the empty string in the current implemention (there's no setter) // so it is basically draining the performance of a hashmap lookup return getName().hashCode(); } /** * The equality method. In this case, the implementation returns 'this == o' * which is basically the equals method of the Object class. * @param o the object to compare to * @return true if this object is the same as o * @since Ant 1.7 */ public boolean equals(Object o) { return (this == o); } /** * If there are no extra fields, use the given fields as new extra * data - otherwise merge the fields assuming the existing fields * and the new fields stem from different locations inside the * archive. * @param f the extra fields to merge * @param local whether the new fields originate from local data */ private void mergeExtraFields(ZipExtraField[] f, boolean local) throws ZipException { if (extraFields == null) { setExtraFields(f); } else { for (int i = 0; i < f.length; i++) { ZipExtraField existing; if (f[i] instanceof UnparseableExtraFieldData) { existing = unparseableExtra; } else { existing = getExtraField(f[i].getHeaderId()); } if (existing == null) { addExtraField(f[i]); } else { if (local || !(existing instanceof CentralDirectoryParsingZipExtraField)) { byte[] b = f[i].getLocalFileDataData(); existing.parseFromLocalFileData(b, 0, b.length); } else { byte[] b = f[i].getCentralDirectoryData(); ((CentralDirectoryParsingZipExtraField) existing) .parseFromCentralDirectoryData(b, 0, b.length); } } } setExtra(); } } } CharacterManaJ/src/main/java/org/apache/tools/zip/ZipFile.java0000644000175000017500000006343613615720000024412 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import java.util.zip.CRC32; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; import java.util.zip.ZipException; /** * Replacement for java.util.ZipFile. * *

This class adds support for file name encodings other than UTF-8 * (which is required to work on ZIP files created by native zip tools * and is able to skip a preamble like the one found in self * extracting archives. Furthermore it returns instances of * org.apache.tools.zip.ZipEntry instead of * java.util.zip.ZipEntry.

* *

It doesn't extend java.util.zip.ZipFile as it would * have to reimplement all methods anyway. Like * java.util.ZipFile, it uses RandomAccessFile under the * covers and supports compressed and uncompressed entries.

* *

The method signatures mimic the ones of * java.util.zip.ZipFile, with a couple of exceptions: * *

    *
  • There is no getName method.
  • *
  • entries has been renamed to getEntries.
  • *
  • getEntries and getEntry return * org.apache.tools.zip.ZipEntry instances.
  • *
  • close is allowed to throw IOException.
  • *
* */ @SuppressWarnings({"unchecked", "rawtypes"}) public class ZipFile { private static final Logger logger = Logger.getLogger(ZipFile.class.getName()); private static final int HASH_SIZE = 509; private static final int SHORT = 2; private static final int WORD = 4; private static final int NIBLET_MASK = 0x0f; private static final int BYTE_SHIFT = 8; private static final int POS_0 = 0; private static final int POS_1 = 1; private static final int POS_2 = 2; private static final int POS_3 = 3; /** * Maps ZipEntrys to Longs, recording the offsets of the local * file headers. */ private final Map entries = new HashMap(HASH_SIZE); /** * Maps String to ZipEntrys, name -> actual entry. */ private final Map nameMap = new HashMap(HASH_SIZE); private static final class OffsetEntry { private long headerOffset = -1; private long dataOffset = -1; } /** * The encoding to use for filenames and the file comment. * *

For a list of possible values see http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html. * Defaults to the platform's default character encoding.

*/ private String encoding = null; /** * The zip encoding to use for filenames and the file comment. */ private final ZipEncoding zipEncoding; /** * The actual data source. */ private RandomAccessFile archive; /** * Whether to look for and use Unicode extra fields. */ private final boolean useUnicodeExtraFields; /** * Opens the given file for reading, assuming the platform's * native encoding for file names. * * @param f the archive. * * @throws IOException if an error occurs while reading the file. */ public ZipFile(File f) throws IOException { this(f, null); } /** * Opens the given file for reading, assuming the platform's * native encoding for file names. * * @param name name of the archive. * * @throws IOException if an error occurs while reading the file. */ public ZipFile(String name) throws IOException { this(new File(name), null); } /** * Opens the given file for reading, assuming the specified * encoding for file names, scanning unicode extra fields. * * @param name name of the archive. * @param encoding the encoding to use for file names * * @throws IOException if an error occurs while reading the file. */ public ZipFile(String name, String encoding) throws IOException { this(new File(name), encoding, true); } /** * Opens the given file for reading, assuming the specified * encoding for file names and scanning for unicode extra fields. * * @param f the archive. * @param encoding the encoding to use for file names, use null * for the platform's default encoding * * @throws IOException if an error occurs while reading the file. */ public ZipFile(File f, String encoding) throws IOException { this(f, encoding, true); } /** * Opens the given file for reading, assuming the specified * encoding for file names. * * @param f the archive. * @param encoding the encoding to use for file names, use null * for the platform's default encoding * @param useUnicodeExtraFields whether to use InfoZIP Unicode * Extra Fields (if present) to set the file names. * * @throws IOException if an error occurs while reading the file. */ public ZipFile(File f, String encoding, boolean useUnicodeExtraFields) throws IOException { this.encoding = encoding; this.zipEncoding = ZipEncodingHelper.getZipEncoding(encoding); this.useUnicodeExtraFields = useUnicodeExtraFields; archive = new RandomAccessFile(f, "r"); boolean success = false; try { Map entriesWithoutUTF8Flag = populateFromCentralDirectory(); resolveLocalFileHeaderData(entriesWithoutUTF8Flag); success = true; } finally { if (!success) { try { archive.close(); } catch (IOException e2) { // swallow, throw the original exception instead } } } } /** * The encoding to use for filenames and the file comment. * * @return null if using the platform's default character encoding. */ public String getEncoding() { return encoding; } /** * Closes the archive. * @throws IOException if an error occurs closing the archive. */ public void close() throws IOException { archive.close(); } /** * close a zipfile quietly; throw no io fault, do nothing * on a null parameter * @param zipfile file to close, can be null */ public static void closeQuietly(ZipFile zipfile) { if (zipfile != null) { try { zipfile.close(); } catch (IOException e) { //ignore } } } /** * Returns all entries. * @return all entries as {@link ZipEntry} instances */ public Enumeration getEntries() { return Collections.enumeration(entries.keySet()); } /** * Returns a named entry - or null if no entry by * that name exists. * @param name name of the entry. * @return the ZipEntry corresponding to the given name - or * null if not present. */ public ZipEntry getEntry(String name) { return (ZipEntry) nameMap.get(name); } /** * Returns an InputStream for reading the contents of the given entry. * @param ze the entry to get the stream for. * @return a stream to read the entry from. * @throws IOException if unable to create an input stream from the zipenty * @throws ZipException if the zipentry has an unsupported * compression method */ public InputStream getInputStream(ZipEntry ze) throws IOException, ZipException { OffsetEntry offsetEntry = (OffsetEntry) entries.get(ze); if (offsetEntry == null) { return null; } long start = offsetEntry.dataOffset; BoundedInputStream bis = new BoundedInputStream(start, ze.getCompressedSize()); switch (ze.getMethod()) { case ZipEntry.STORED: return bis; case ZipEntry.DEFLATED: bis.addDummy(); return new InflaterInputStream(bis, new Inflater(true)); default: throw new ZipException("Found unsupported compression method " + ze.getMethod()); } } private static final int CFH_LEN = /* version made by */ SHORT /* version needed to extract */ + SHORT /* general purpose bit flag */ + SHORT /* compression method */ + SHORT /* last mod file time */ + SHORT /* last mod file date */ + SHORT /* crc-32 */ + WORD /* compressed size */ + WORD /* uncompressed size */ + WORD /* filename length */ + SHORT /* extra field length */ + SHORT /* file comment length */ + SHORT /* disk number start */ + SHORT /* internal file attributes */ + SHORT /* external file attributes */ + WORD /* relative offset of local header */ + WORD; /** * Reads the central directory of the given archive and populates * the internal tables with ZipEntry instances. * *

The ZipEntrys will know all data that can be obtained from * the central directory alone, but not the data that requires the * local file header or additional data to be read.

* * @return a Map<ZipEntry, NameAndComment>> of * zipentries that didn't have the language encoding flag set when * read. */ private Map populateFromCentralDirectory() throws IOException { HashMap noUTF8Flag = new HashMap(); positionAtCentralDirectory(); byte[] cfh = new byte[CFH_LEN]; byte[] signatureBytes = new byte[WORD]; archive.readFully(signatureBytes); long sig = ZipLong.getValue(signatureBytes); final long cfhSig = ZipLong.getValue(ZipOutputStream.CFH_SIG); if (sig != cfhSig && startsWithLocalFileHeader()) { throw new IOException("central directory is empty, can't expand" + " corrupt archive."); } while (sig == cfhSig) { archive.readFully(cfh); int off = 0; ZipEntry ze = new ZipEntry(); int versionMadeBy = ZipShort.getValue(cfh, off); off += SHORT; ze.setPlatform((versionMadeBy >> BYTE_SHIFT) & NIBLET_MASK); off += SHORT; // skip version info final int generalPurposeFlag = ZipShort.getValue(cfh, off); final boolean hasUTF8Flag = (generalPurposeFlag & ZipOutputStream.UFT8_NAMES_FLAG) != 0; final ZipEncoding entryEncoding = hasUTF8Flag ? ZipEncodingHelper.UTF8_ZIP_ENCODING : zipEncoding; off += SHORT; ze.setMethod(ZipShort.getValue(cfh, off)); off += SHORT; // FIXME this is actually not very cpu cycles friendly as we are converting from // dos to java while the underlying Sun implementation will convert // from java to dos time for internal storage... long time = dosToJavaTime(ZipLong.getValue(cfh, off)); ze.setTime(time); off += WORD; ze.setCrc(ZipLong.getValue(cfh, off)); off += WORD; ze.setCompressedSize(ZipLong.getValue(cfh, off)); off += WORD; ze.setSize(ZipLong.getValue(cfh, off)); off += WORD; int fileNameLen = ZipShort.getValue(cfh, off); off += SHORT; int extraLen = ZipShort.getValue(cfh, off); off += SHORT; int commentLen = ZipShort.getValue(cfh, off); off += SHORT; off += SHORT; // disk number ze.setInternalAttributes(ZipShort.getValue(cfh, off)); off += SHORT; ze.setExternalAttributes(ZipLong.getValue(cfh, off)); off += WORD; byte[] fileName = new byte[fileNameLen]; archive.readFully(fileName); ze.setName(entryEncoding.decode(fileName)); // LFH offset, OffsetEntry offset = new OffsetEntry(); offset.headerOffset = ZipLong.getValue(cfh, off); // data offset will be filled later entries.put(ze, offset); nameMap.put(ze.getName(), ze); byte[] cdExtraData = new byte[extraLen]; archive.readFully(cdExtraData); ze.setCentralDirectoryExtra(cdExtraData); byte[] comment = new byte[commentLen]; archive.readFully(comment); ze.setComment(entryEncoding.decode(comment)); archive.readFully(signatureBytes); sig = ZipLong.getValue(signatureBytes); if (!hasUTF8Flag && useUnicodeExtraFields) { noUTF8Flag.put(ze, new NameAndComment(fileName, comment)); } } return noUTF8Flag; } private static final int MIN_EOCD_SIZE = /* end of central dir signature */ WORD /* number of this disk */ + SHORT /* number of the disk with the */ /* start of the central directory */ + SHORT /* total number of entries in */ /* the central dir on this disk */ + SHORT /* total number of entries in */ /* the central dir */ + SHORT /* size of the central directory */ + WORD /* offset of start of central */ /* directory with respect to */ /* the starting disk number */ + WORD /* zipfile comment length */ + SHORT; private static final int MAX_EOCD_SIZE = MIN_EOCD_SIZE /* maximum length of zipfile comment */ + 0xFFFF; private static final int CFD_LOCATOR_OFFSET = /* end of central dir signature */ WORD /* number of this disk */ + SHORT /* number of the disk with the */ /* start of the central directory */ + SHORT /* total number of entries in */ /* the central dir on this disk */ + SHORT /* total number of entries in */ /* the central dir */ + SHORT /* size of the central directory */ + WORD; /** * Searches for the "End of central dir record", parses * it and positions the stream at the first central directory * record. */ private void positionAtCentralDirectory() throws IOException { boolean found = false; long off = archive.length() - MIN_EOCD_SIZE; long stopSearching = Math.max(0L, archive.length() - MAX_EOCD_SIZE); if (off >= 0) { archive.seek(off); byte[] sig = ZipOutputStream.EOCD_SIG; int curr = archive.read(); while (off >= stopSearching && curr != -1) { if (curr == sig[POS_0]) { curr = archive.read(); if (curr == sig[POS_1]) { curr = archive.read(); if (curr == sig[POS_2]) { curr = archive.read(); if (curr == sig[POS_3]) { found = true; break; } } } } archive.seek(--off); curr = archive.read(); } } if (!found) { throw new ZipException("archive is not a ZIP archive"); } archive.seek(off + CFD_LOCATOR_OFFSET); byte[] cfdOffset = new byte[WORD]; archive.readFully(cfdOffset); archive.seek(ZipLong.getValue(cfdOffset)); } /** * Number of bytes in local file header up to the "length of * filename" entry. */ private static final long LFH_OFFSET_FOR_FILENAME_LENGTH = /* local file header signature */ WORD /* version needed to extract */ + SHORT /* general purpose bit flag */ + SHORT /* compression method */ + SHORT /* last mod file time */ + SHORT /* last mod file date */ + SHORT /* crc-32 */ + WORD /* compressed size */ + WORD /* uncompressed size */ + WORD; /** * Walks through all recorded entries and adds the data available * from the local file header. * *

Also records the offsets for the data to read from the * entries.

*/ private void resolveLocalFileHeaderData(Map entriesWithoutUTF8Flag) throws IOException { Enumeration e = getEntries(); while (e.hasMoreElements()) { ZipEntry ze = (ZipEntry) e.nextElement(); OffsetEntry offsetEntry = (OffsetEntry) entries.get(ze); long offset = offsetEntry.headerOffset; archive.seek(offset + LFH_OFFSET_FOR_FILENAME_LENGTH); byte[] b = new byte[SHORT]; archive.readFully(b); int fileNameLen = ZipShort.getValue(b); archive.readFully(b); int extraFieldLen = ZipShort.getValue(b); int lenToSkip = fileNameLen; while (lenToSkip > 0) { int skipped = archive.skipBytes(lenToSkip); if (skipped <= 0) { throw new RuntimeException("failed to skip file name in" + " local file header"); } lenToSkip -= skipped; } byte[] localExtraData = new byte[extraFieldLen]; archive.readFully(localExtraData); ze.setExtra(localExtraData); /*dataOffsets.put(ze, new Long(offset + LFH_OFFSET_FOR_FILENAME_LENGTH + SHORT + SHORT + fileNameLen + extraFieldLen)); */ offsetEntry.dataOffset = offset + LFH_OFFSET_FOR_FILENAME_LENGTH + SHORT + SHORT + fileNameLen + extraFieldLen; if (entriesWithoutUTF8Flag.containsKey(ze)) { setNameAndCommentFromExtraFields(ze, (NameAndComment) entriesWithoutUTF8Flag.get(ze)); } } } /** * Convert a DOS date/time field to a Date object. * * @param zipDosTime contains the stored DOS time. * @return a Date instance corresponding to the given time. */ protected static Date fromDosTime(ZipLong zipDosTime) { long dosTime = zipDosTime.getValue(); return new Date(dosToJavaTime(dosTime)); } /* * Converts DOS time to Java time (number of milliseconds since epoch). */ private static long dosToJavaTime(long dosTime) { Calendar cal = Calendar.getInstance(); // CheckStyle:MagicNumberCheck OFF - no point cal.set(Calendar.YEAR, (int) ((dosTime >> 25) & 0x7f) + 1980); cal.set(Calendar.MONTH, (int) ((dosTime >> 21) & 0x0f) - 1); cal.set(Calendar.DATE, (int) (dosTime >> 16) & 0x1f); cal.set(Calendar.HOUR_OF_DAY, (int) (dosTime >> 11) & 0x1f); cal.set(Calendar.MINUTE, (int) (dosTime >> 5) & 0x3f); cal.set(Calendar.SECOND, (int) (dosTime << 1) & 0x3e); // CheckStyle:MagicNumberCheck ON return cal.getTime().getTime(); } /** * Retrieve a String from the given bytes using the encoding set * for this ZipFile. * * @param bytes the byte array to transform * @return String obtained by using the given encoding * @throws ZipException if the encoding cannot be recognized. */ protected String getString(byte[] bytes) throws ZipException { try { return ZipEncodingHelper.getZipEncoding(encoding).decode(bytes); } catch (IOException ex) { throw new ZipException("Failed to decode name: " + ex.getMessage()); } } /** * Checks whether the archive starts with a LFH. If it doesn't, * it may be an empty archive. */ private boolean startsWithLocalFileHeader() throws IOException { archive.seek(0); final byte[] start = new byte[WORD]; archive.readFully(start); for (int i = 0; i < start.length; i++) { if (start[i] != ZipOutputStream.LFH_SIG[i]) { return false; } } return true; } /** * If the entry has Unicode*ExtraFields and the CRCs of the * names/comments match those of the extra fields, transfer the * known Unicode values from the extra field. */ private void setNameAndCommentFromExtraFields(ZipEntry ze, NameAndComment nc) { UnicodePathExtraField name = (UnicodePathExtraField) ze.getExtraField(UnicodePathExtraField.UPATH_ID); String originalName = ze.getName(); String newName = getUnicodeStringIfOriginalMatches(name, nc.name); if (newName != null && !originalName.equals(newName)) { ze.setName(newName); nameMap.remove(originalName); nameMap.put(newName, ze); } if (nc.comment != null && nc.comment.length > 0) { UnicodeCommentExtraField cmt = (UnicodeCommentExtraField) ze.getExtraField(UnicodeCommentExtraField.UCOM_ID); String newComment = getUnicodeStringIfOriginalMatches(cmt, nc.comment); if (newComment != null) { ze.setComment(newComment); } } } /** * If the stored CRC matches the one of the given name, return the * Unicode name of the given field. * *

If the field is null or the CRCs don't match, return null * instead.

*/ private String getUnicodeStringIfOriginalMatches(AbstractUnicodeExtraField f, byte[] orig) { if (f != null) { CRC32 crc32 = new CRC32(); crc32.update(orig); long origCRC32 = crc32.getValue(); if (origCRC32 == f.getNameCRC32()) { try { return ZipEncodingHelper .UTF8_ZIP_ENCODING.decode(f.getUnicodeName()); } catch (IOException ex) { // UTF-8 unsupported? should be impossible the // Unicode*ExtraField must contain some bad bytes logger.log(Level.WARNING, "ZipFile: UTF-8 unsupported." + " should be impossible the Unicode*ExtraField must contain some bad bytes.", ex); return null; } } } return null; } /** * InputStream that delegates requests to the underlying * RandomAccessFile, making sure that only bytes from a certain * range can be read. */ private class BoundedInputStream extends InputStream { private long remaining; private long loc; private boolean addDummyByte = false; BoundedInputStream(long start, long remaining) { this.remaining = remaining; loc = start; } public int read() throws IOException { if (remaining-- <= 0) { if (addDummyByte) { addDummyByte = false; return 0; } return -1; } synchronized (archive) { archive.seek(loc++); return archive.read(); } } public int read(byte[] b, int off, int len) throws IOException { if (remaining <= 0) { if (addDummyByte) { addDummyByte = false; b[off] = 0; return 1; } return -1; } if (len <= 0) { return 0; } if (len > remaining) { len = (int) remaining; } int ret = -1; synchronized (archive) { archive.seek(loc); ret = archive.read(b, off, len); } if (ret > 0) { loc += ret; remaining -= ret; } return ret; } /** * Inflater needs an extra dummy byte for nowrap - see * Inflater's javadocs. */ void addDummy() { addDummyByte = true; } } private static final class NameAndComment { private final byte[] name; private final byte[] comment; private NameAndComment(byte[] name, byte[] comment) { this.name = name; this.comment = comment; } } } CharacterManaJ/src/main/java/org/apache/tools/zip/Simple8BitZipEncoding.java0000644000175000017500000001637013615720000027155 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.tools.zip; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * This ZipEncoding implementation implements a simple 8bit character * set, which mets the following restrictions: * *
    *
  • Characters 0x0000 to 0x007f are encoded as the corresponding * byte values 0x00 to 0x7f.
  • *
  • All byte codes from 0x80 to 0xff are mapped to a unique unicode * character in the range 0x0080 to 0x7fff. (No support for * UTF-16 surrogates) *
* *

These restrictions most notably apply to the most prominent * omissions of java-1.4's {@link java.nio.charset.Charset Charset} * implementation, Cp437 and Cp850.

* *

The methods of this class are reentrant.

*/ @SuppressWarnings("unchecked") class Simple8BitZipEncoding implements ZipEncoding { /** * A character entity, which is put to the reverse mapping table * of a simple encoding. */ @SuppressWarnings("rawtypes") private static final class Simple8BitChar implements Comparable { public final char unicode; public final byte code; Simple8BitChar(byte code, char unicode) { this.code = code; this.unicode = unicode; } public int compareTo(Object o) { Simple8BitChar a = (Simple8BitChar) o; return this.unicode - a.unicode; } public String toString() { return "0x" + Integer.toHexString(0xffff & (int) unicode) + "->0x" + Integer.toHexString(0xff & (int) code); } } /** * The characters for byte values of 128 to 255 stored as an array of * 128 chars. */ private final char[] highChars; /** * A list of {@link Simple8BitChar} objects sorted by the unicode * field. This list is used to binary search reverse mapping of * unicode characters with a character code greater than 127. */ @SuppressWarnings("rawtypes") private final List reverseMapping; /** * @param highChars The characters for byte values of 128 to 255 * stored as an array of 128 chars. */ @SuppressWarnings("rawtypes") public Simple8BitZipEncoding(char[] highChars) { this.highChars = highChars; this.reverseMapping = new ArrayList(this.highChars.length); byte code = 127; for (int i = 0; i < this.highChars.length; ++i) { this.reverseMapping.add(new Simple8BitChar(++code, this.highChars[i])); } Collections.sort(this.reverseMapping); } /** * Return the character code for a given encoded byte. * * @param b The byte to decode. * @return The associated character value. */ public char decodeByte(byte b) { // code 0-127 if (b >= 0) { return (char) b; } // byte is signed, so 128 == -128 and 255 == -1 return this.highChars[128 + (int) b]; } /** * @param c The character to encode. * @return Whether the given unicode character is covered by this encoding. */ public boolean canEncodeChar(char c) { if (c >= 0 && c < 128) { return true; } Simple8BitChar r = this.encodeHighChar(c); return r != null; } /** * Pushes the encoded form of the given character to the given byte buffer. * * @param bb The byte buffer to write to. * @param c The character to encode. * @return Whether the given unicode character is covered by this encoding. * If false is returned, nothing is pushed to the * byte buffer. */ public boolean pushEncodedChar(ByteBuffer bb, char c) { if (c >= 0 && c < 128) { bb.put((byte) c); return true; } Simple8BitChar r = this.encodeHighChar(c); if (r == null) { return false; } bb.put(r.code); return true; } /** * @param c A unicode character in the range from 0x0080 to 0x7f00 * @return A Simple8BitChar, if this character is covered by this encoding. * A null value is returned, if this character is not * covered by this encoding. */ private Simple8BitChar encodeHighChar(char c) { // for performance an simplicity, yet another reincarnation of // binary search... int i0 = 0; int i1 = this.reverseMapping.size(); while (i1 > i0) { int i = i0 + (i1 - i0) / 2; Simple8BitChar m = (Simple8BitChar) this.reverseMapping.get(i); if (m.unicode == c) { return m; } if (m.unicode < c) { i0 = i + 1; } else { i1 = i; } } if (i0 >= this.reverseMapping.size()) { return null; } Simple8BitChar r = (Simple8BitChar) this.reverseMapping.get(i0); if (r.unicode != c) { return null; } return r; } /** * @see * org.apache.tools.zip.ZipEncoding#canEncode(java.lang.String) */ public boolean canEncode(String name) { for (int i=0;iThis implementation works for all cases under java-1.5 or * later. However, in java-1.4, some charsets don't have a java.nio * implementation, most notably the default ZIP encoding Cp437.

* *

The methods of this class are reentrant.

*/ class NioZipEncoding implements ZipEncoding { private final Charset charset; /** * Construct an NIO based zip encoding, which wraps the given * charset. * * @param charset The NIO charset to wrap. */ public NioZipEncoding(Charset charset) { this.charset = charset; } /** * @see * org.apache.tools.zip.ZipEncoding#canEncode(java.lang.String) */ public boolean canEncode(String name) { CharsetEncoder enc = this.charset.newEncoder(); enc.onMalformedInput(CodingErrorAction.REPORT); enc.onUnmappableCharacter(CodingErrorAction.REPORT); return enc.canEncode(name); } /** * @see * org.apache.tools.zip.ZipEncoding#encode(java.lang.String) */ public ByteBuffer encode(String name) { CharsetEncoder enc = this.charset.newEncoder(); enc.onMalformedInput(CodingErrorAction.REPORT); enc.onUnmappableCharacter(CodingErrorAction.REPORT); CharBuffer cb = CharBuffer.wrap(name); ByteBuffer out = ByteBuffer.allocate(name.length() + (name.length() + 1) / 2); while (cb.remaining() > 0) { CoderResult res = enc.encode(cb, out,true); if (res.isUnmappable() || res.isMalformed()) { // write the unmappable characters in utf-16 // pseudo-URL encoding style to ByteBuffer. if (res.length() * 6 > out.remaining()) { out = ZipEncodingHelper.growBuffer(out, out.position() + res.length() * 6); } for (int i=0; iThere are mostly two implementations, one that uses java.nio * {@link java.nio.charset.Charset Charset} and one implementation, * which copes with simple 8 bit charsets, because java-1.4 did not * support Cp437 in java.nio.

* *

The main reason for defining an own encoding layer comes from * the problems with {@link java.lang.String#getBytes(String) * String.getBytes}, which encodes unknown characters as ASCII * quotation marks ('?'). Quotation marks are per definition an * invalid filename on some operating systems like Windows, which * leads to ignored ZIP entries.

* *

All implementations should implement this interface in a * reentrant way.

*/ interface ZipEncoding { /** * Check, whether the given string may be losslessly encoded using this * encoding. * * @param name A filename or ZIP comment. * @return Whether the given name may be encoded with out any losses. */ boolean canEncode(String name); /** * Encode a filename or a comment to a byte array suitable for * storing it to a serialized zip entry. * *

Examples for CP 437 (in pseudo-notation, right hand side is * C-style notation):

*
     *  encode("\u20AC_for_Dollar.txt") = "%U20AC_for_Dollar.txt"
     *  encode("\u00D6lf\u00E4sser.txt") = "\231lf\204sser.txt"
     * 
* * @param name A filename or ZIP comment. * @return A byte buffer with a backing array containing the * encoded name. Unmappable characters or malformed * character sequences are mapped to a sequence of utf-16 * words encoded in the format %Uxxxx. It is * assumed, that the byte buffer is positioned at the * beinning of the encoded result, the byte buffer has a * backing array and the limit of the byte buffer points * to the end of the encoded result. * @throws IOException */ ByteBuffer encode(String name) throws IOException; /** * @param data The byte values to decode. * @return The decoded string. * @throws IOException */ String decode(byte [] data) throws IOException; } CharacterManaJ/src/main/java/org/apache/tools/zip/AsiExtraField.java0000644000175000017500000002310413615720000025520 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; import java.util.zip.CRC32; import java.util.zip.ZipException; /** * Adds Unix file permission and UID/GID fields as well as symbolic * link handling. * *

This class uses the ASi extra field in the format: *

 *         Value         Size            Description
 *         -----         ----            -----------
 * (Unix3) 0x756e        Short           tag for this extra block type
 *         TSize         Short           total data size for this block
 *         CRC           Long            CRC-32 of the remaining data
 *         Mode          Short           file permissions
 *         SizDev        Long            symlink'd size OR major/minor dev num
 *         UID           Short           user ID
 *         GID           Short           group ID
 *         (var.)        variable        symbolic link filename
 * 
* taken from appnote.iz (Info-ZIP note, 981119) found at ftp://ftp.uu.net/pub/archiving/zip/doc/

* *

Short is two bytes and Long is four bytes in big endian byte and * word order, device numbers are currently not supported.

* */ public class AsiExtraField implements ZipExtraField, UnixStat, Cloneable { private static final ZipShort HEADER_ID = new ZipShort(0x756E); private static final int WORD = 4; /** * Standard Unix stat(2) file mode. * * @since 1.1 */ private int mode = 0; /** * User ID. * * @since 1.1 */ private int uid = 0; /** * Group ID. * * @since 1.1 */ private int gid = 0; /** * File this entry points to, if it is a symbolic link. * *

empty string - if entry is not a symbolic link.

* * @since 1.1 */ private String link = ""; /** * Is this an entry for a directory? * * @since 1.1 */ private boolean dirFlag = false; /** * Instance used to calculate checksums. * * @since 1.1 */ private CRC32 crc = new CRC32(); /** Constructor for AsiExtraField. */ public AsiExtraField() { } /** * The Header-ID. * @return the value for the header id for this extrafield * @since 1.1 */ public ZipShort getHeaderId() { return HEADER_ID; } /** * Length of the extra field in the local file data - without * Header-ID or length specifier. * @return a ZipShort for the length of the data of this extra field * @since 1.1 */ public ZipShort getLocalFileDataLength() { return new ZipShort(WORD // CRC + 2 // Mode + WORD // SizDev + 2 // UID + 2 // GID + getLinkedFile().getBytes().length); } /** * Delegate to local file data. * @return the centralDirectory length * @since 1.1 */ public ZipShort getCentralDirectoryLength() { return getLocalFileDataLength(); } /** * The actual data to put into local file data - without Header-ID * or length specifier. * @return get the data * @since 1.1 */ public byte[] getLocalFileDataData() { // CRC will be added later byte[] data = new byte[getLocalFileDataLength().getValue() - WORD]; System.arraycopy(ZipShort.getBytes(getMode()), 0, data, 0, 2); byte[] linkArray = getLinkedFile().getBytes(); // CheckStyle:MagicNumber OFF System.arraycopy(ZipLong.getBytes(linkArray.length), 0, data, 2, WORD); System.arraycopy(ZipShort.getBytes(getUserId()), 0, data, 6, 2); System.arraycopy(ZipShort.getBytes(getGroupId()), 0, data, 8, 2); System.arraycopy(linkArray, 0, data, 10, linkArray.length); // CheckStyle:MagicNumber ON crc.reset(); crc.update(data); long checksum = crc.getValue(); byte[] result = new byte[data.length + WORD]; System.arraycopy(ZipLong.getBytes(checksum), 0, result, 0, WORD); System.arraycopy(data, 0, result, WORD, data.length); return result; } /** * Delegate to local file data. * @return the local file data * @since 1.1 */ public byte[] getCentralDirectoryData() { return getLocalFileDataData(); } /** * Set the user id. * @param uid the user id * @since 1.1 */ public void setUserId(int uid) { this.uid = uid; } /** * Get the user id. * @return the user id * @since 1.1 */ public int getUserId() { return uid; } /** * Set the group id. * @param gid the group id * @since 1.1 */ public void setGroupId(int gid) { this.gid = gid; } /** * Get the group id. * @return the group id * @since 1.1 */ public int getGroupId() { return gid; } /** * Indicate that this entry is a symbolic link to the given filename. * * @param name Name of the file this entry links to, empty String * if it is not a symbolic link. * * @since 1.1 */ public void setLinkedFile(String name) { link = name; mode = getMode(mode); } /** * Name of linked file * * @return name of the file this entry links to if it is a * symbolic link, the empty string otherwise. * * @since 1.1 */ public String getLinkedFile() { return link; } /** * Is this entry a symbolic link? * @return true if this is a symbolic link * @since 1.1 */ public boolean isLink() { return getLinkedFile().length() != 0; } /** * File mode of this file. * @param mode the file mode * @since 1.1 */ public void setMode(int mode) { this.mode = getMode(mode); } /** * File mode of this file. * @return the file mode * @since 1.1 */ public int getMode() { return mode; } /** * Indicate whether this entry is a directory. * @param dirFlag if true, this entry is a directory * @since 1.1 */ public void setDirectory(boolean dirFlag) { this.dirFlag = dirFlag; mode = getMode(mode); } /** * Is this entry a directory? * @return true if this entry is a directory * @since 1.1 */ public boolean isDirectory() { return dirFlag && !isLink(); } /** * Populate data from this array as if it was in local file data. * @param data an array of bytes * @param offset the start offset * @param length the number of bytes in the array from offset * @since 1.1 * @throws ZipException on error */ public void parseFromLocalFileData(byte[] data, int offset, int length) throws ZipException { long givenChecksum = ZipLong.getValue(data, offset); byte[] tmp = new byte[length - WORD]; System.arraycopy(data, offset + WORD, tmp, 0, length - WORD); crc.reset(); crc.update(tmp); long realChecksum = crc.getValue(); if (givenChecksum != realChecksum) { throw new ZipException("bad CRC checksum " + Long.toHexString(givenChecksum) + " instead of " + Long.toHexString(realChecksum)); } int newMode = ZipShort.getValue(tmp, 0); // CheckStyle:MagicNumber OFF byte[] linkArray = new byte[(int) ZipLong.getValue(tmp, 2)]; uid = ZipShort.getValue(tmp, 6); gid = ZipShort.getValue(tmp, 8); if (linkArray.length == 0) { link = ""; } else { System.arraycopy(tmp, 10, linkArray, 0, linkArray.length); link = new String(linkArray); } // CheckStyle:MagicNumber ON setDirectory((newMode & DIR_FLAG) != 0); setMode(newMode); } /** * Get the file mode for given permissions with the correct file type. * @param mode the mode * @return the type with the mode * @since 1.1 */ protected int getMode(int mode) { int type = FILE_FLAG; if (isLink()) { type = LINK_FLAG; } else if (isDirectory()) { type = DIR_FLAG; } return type | (mode & PERM_MASK); } public Object clone() { try { AsiExtraField cloned = (AsiExtraField) super.clone(); cloned.crc = new CRC32(); return cloned; } catch (CloneNotSupportedException cnfe) { // impossible throw new RuntimeException(cnfe); } } } CharacterManaJ/src/main/java/org/apache/tools/zip/FallbackZipEncoding.java0000644000175000017500000000554413615720000026675 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.tools.zip; import java.io.IOException; import java.nio.ByteBuffer; /** * A fallback ZipEncoding, which uses a java.io means to encode names. * *

This implementation is not favorable for encodings other than * utf-8, because java.io encodes unmappable character as question * marks leading to unreadable ZIP entries on some operating * systems.

* *

Furthermore this implementation is unable to tell, whether a * given name can be safely encoded or not.

* *

This implementation acts as a last resort implementation, when * neither {@link Simple8BitZipEnoding} nor {@link NioZipEncoding} is * available.

* *

The methods of this class are reentrant.

*/ class FallbackZipEncoding implements ZipEncoding { private final String charset; /** * Construct a fallback zip encoding, which uses the platform's * default charset. */ public FallbackZipEncoding() { this.charset = null; } /** * Construct a fallback zip encoding, which uses the given charset. * * @param charset The name of the charset or null for * the platform's default character set. */ public FallbackZipEncoding(String charset) { this.charset = charset; } /** * @see * org.apache.tools.zip.ZipEncoding#canEncode(java.lang.String) */ public boolean canEncode(String name) { return true; } /** * @see * org.apache.tools.zip.ZipEncoding#encode(java.lang.String) */ public ByteBuffer encode(String name) throws IOException { if (this.charset == null) { return ByteBuffer.wrap(name.getBytes()); } else { return ByteBuffer.wrap(name.getBytes(this.charset)); } } /** * @see * org.apache.tools.zip.ZipEncoding#decode(byte[]) */ public String decode(byte[] data) throws IOException { if (this.charset == null) { return new String(data); } else { return new String(data,this.charset); } } } CharacterManaJ/src/main/java/org/apache/tools/zip/UnicodeCommentExtraField.java0000644000175000017500000000522513615720000027721 0ustar paulliupaulliu/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.zip; /** * Info-ZIP Unicode Comment Extra Field (0x6375): * *

Stores the UTF-8 version of the file comment as stored in the * central directory header.

* *
 *         Value         Size        Description
 *         -----         ----        -----------
 *  (UCom) 0x6375        Short       tag for this extra block type ("uc")
 *         TSize         Short       total data size for this block
 *         Version       1 byte      version of this extra field, currently 1
 *         ComCRC32      4 bytes     Comment Field CRC32 Checksum
 *         UnicodeCom    Variable    UTF-8 version of the entry comment
 * 
*/ public class UnicodeCommentExtraField extends AbstractUnicodeExtraField { public static final ZipShort UCOM_ID = new ZipShort(0x6375); public UnicodeCommentExtraField () { } /** * Assemble as unicode comment extension from the name given as * text as well as the encoded bytes actually written to the archive. * * @param text The file name * @param bytes the bytes actually written to the archive * @param off The offset of the encoded comment in bytes. * @param len The length of the encoded comment or comment in * bytes. */ public UnicodeCommentExtraField(String text, byte[] bytes, int off, int len) { super(text, bytes, off, len); } /** * Assemble as unicode comment extension from the comment given as * text as well as the bytes actually written to the archive. * * @param comment The file comment * @param bytes the bytes actually written to the archive */ public UnicodeCommentExtraField(String comment, byte[] bytes) { super(comment, bytes); } public ZipShort getHeaderId() { return UCOM_ID; } } CharacterManaJ/src/main/java/charactermanaj/0000755000175000017500000000000013615720000021162 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/CharacterManaJ.java0000644000175000017500000000240713615720000024633 0ustar paulliupaulliupackage charactermanaj; import java.util.Locale; import java.util.Properties; import charactermanaj.model.AppConfig; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * Java7 on OSX で、クラス名がメニューの「〜の終了」「〜について」の起動クラス名がアプリ名に使われており、 * info.pinfoのBundleNameでも変更できないため、回避方法がみつかるまで、本クラス名を表示させることにする。 * * @author seraphy */ public class CharacterManaJ { public static void main(String[] args) throws Exception { // アプリケーション名表示オプションか? for (String arg : args) { if ("--show-appinfo".equals(arg)) { showAppinfo(); return; } } Main.main(args); } /** * アプリケーション名の表示 */ public static void showAppinfo() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/mainframe"); AppConfig appConfig = AppConfig.getInstance(); System.out.println(strings.getProperty("title")); System.out.println(Locale.getDefault().getLanguage()); System.out.println(appConfig.getSpecificationVersion()); System.out.println(appConfig.getImplementationVersion()); } } CharacterManaJ/src/main/java/charactermanaj/graphics/0000755000175000017500000000000013615720000022762 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/graphics/colormodel/0000755000175000017500000000000013615720000025121 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/graphics/colormodel/ColorModel.java0000644000175000017500000000127613615720000030031 0ustar paulliupaulliupackage charactermanaj.graphics.colormodel; /** * カラーモデル. * * @author seraphy */ public interface ColorModel { /** * カラーモデルの説明 * * @return 説明 */ String getTitle(); /** * 各項目の説明 * * @param index * インデックス(0-2) * @return 説明 */ String getItemTitle(int index); /** * RGBからHSVに変換する. * * @param r * @param g * @param b * @param hsvVals * @return */ float[] RGBtoHSV(int r, int g, int b, float[] hsvVals); /** * HSVからRGBに変換する. * * @param hue * @param sat * @param lum * @return */ int HSVtoRGB(float hue, float sat, float lum); } CharacterManaJ/src/main/java/charactermanaj/graphics/colormodel/ColorModels.java0000644000175000017500000000252113615720000030206 0ustar paulliupaulliupackage charactermanaj.graphics.colormodel; public enum ColorModels implements ColorModel { /** * HSB(色相・彩度・明度) */ HSB(new HSBColorModel()), /** * HSY(色相・彩度・輝度) */ HSY(new HSYColorModel()); /** * デフォルトのカラーモデル.
*/ public static ColorModels DEFAULT = HSB; /** * カラーモデル名からカラーモデルを取得する.
* nullまたは空文字、または該当がない場合はデフォルトを採用する.
* * @param colorModelName * カラーモデル名 * @return カラーモデル */ public static ColorModels safeValueOf(String colorModelName) { try { if (colorModelName != null && colorModelName.length() > 0) { return valueOf(colorModelName); } } catch (RuntimeException ex) { // 何もしない. } return DEFAULT; } private final ColorModel colorModel; ColorModels(ColorModel colorModel) { this.colorModel = colorModel; } public String getTitle() { return colorModel.getTitle(); } public String getItemTitle(int index) { return colorModel.getItemTitle(index); } public int HSVtoRGB(float hue, float sat, float lum) { return colorModel.HSVtoRGB(hue, sat, lum); } public float[] RGBtoHSV(int r, int g, int b, float[] hsvVals) { return colorModel.RGBtoHSV(r, g, b, hsvVals); } } CharacterManaJ/src/main/java/charactermanaj/graphics/colormodel/HSBColorModel.java0000644000175000017500000000141413615720000030360 0ustar paulliupaulliupackage charactermanaj.graphics.colormodel; import java.awt.Color; /* * Java標準のHSBカラーモデル.
*/ public class HSBColorModel implements ColorModel { private static final String[] ITEM_TITLES = { "colorModel.HSB.hue", "colorModel.HSB.saturation", "colorModel.HSB.brightness", }; public String getTitle() { return "colorModel.HSB.title"; } public String getItemTitle(int index) { return ITEM_TITLES[index]; } /** * RGBからHSBに変換する. */ public float[] RGBtoHSV(int r, int g, int b, float[] hsvVals) { return Color.RGBtoHSB(r, g, b, hsvVals); } /** * HSBからRGBに変換する. */ public int HSVtoRGB(float hue, float saturation, float brightness) { return Color.HSBtoRGB(hue, saturation, brightness); } } CharacterManaJ/src/main/java/charactermanaj/graphics/colormodel/HSYColorModel.java0000644000175000017500000000777013615720000030422 0ustar paulliupaulliupackage charactermanaj.graphics.colormodel; /** * HSYカラーモデルの計算.
* "gununuの日記"さんのところのC++計算ルーチンをJava用に書き直したもの.
* * @author seraphy * @see http://d.hatena.ne.jp/gununu/20090721/1248171222 */ public class HSYColorModel implements ColorModel { /** * 輝度計算用の係数R */ private static final float IR = 0.298912f; /** * 輝度計算用の係数G */ private static final float IG = 0.586611f; /** * 輝度計算用の係数B */ private static final float IB = 0.114478f; private static final String[] ITEM_TITLES = { "colorModel.HSY.hue", "colorModel.HSY.saturation", "colorModel.HSY.luminance", }; public String getTitle() { return "colorModel.HSY.title"; } public String getItemTitle(int index) { return ITEM_TITLES[index]; } /** * RGBから輝度を求める. * * @param r * @param g * @param b * @return 輝度 */ public static int getGrayscale(int r, int g, int b) { return (int) (IR * r + IG * g + IB * b) & 0xff; } /** * RGBからHSYに変換する.
* * @param rr * 0-255範囲のR * @param gg * 0-255範囲のG * @param bb * 0-255範囲のB * @param hsyVals * H色相, S彩度, Y輝度を0-1の実数表現した配列(書き込み先) * @return 引数と同じhsyvalsを返す. */ public float[] RGBtoHSV(int r, int g, int b, float[] hsyVals) { if (hsyVals == null || hsyVals.length < 3) { throw new IllegalArgumentException(); } int max = Math.max(Math.max(r, g), b); int min = Math.min(Math.min(r, g), b); float saturation = (max - min) / 255.f; float rr = r / 255.f; float gg = g / 255.f; float bb = b / 255.f; float lum = (IR * rr + IG * gg + IB * bb); if (lum > 1.f) { lum = 1.f; } float hue; if (saturation == 0) { hue = 0; } else { if (max == r) { hue = (gg - bb) / saturation * 60f; } else if (max == g) { hue = (bb - rr) / saturation * 60f + 120f; } else { hue = (rr - gg) / saturation * 60f + 240f; } if (hue < 0) { hue += 360f; } hue /= 360f; } hsyVals[0] = hue; hsyVals[1] = saturation; hsyVals[2] = lum; return hsyVals; } /** * HSYからRGBに変換する.
* * @param hue * 0-1範囲の色相 * @param sat * 0-1範囲の彩度 * @param lum * 0-1範囲の輝度 * @return RGB値 * @see http://d.hatena.ne.jp/gununu/20090721/1248171222 */ public int HSVtoRGB(float hue, float sat, float lum) { hue = (hue - (float) Math.floor(hue)); if (sat < 0) { sat = 0f; } else if (sat > 1f) { sat = 1f; } if (lum < 0) { lum = 0f; } else if (lum > 1f) { lum = 1f; } float r, g, b; if (hue <= 1 / 6.0f) { float h = hue * 6; r = (1 - IR - IG * h); g = (-IR + (1 - IG) * h); b = (-IR - IG * h); } else if (hue <= 3 / 6.0f) { float h = (hue - 1 / 3.0f) * 6; if (hue > 2 / 6.0f) { r = (-IG - IB * h); g = (1 - IG - IB * h); b = (-IG + (1 - IB) * h); } else { r = (-IG + (IR - 1) * h); g = (1 - IG + IR * h); b = (-IG + IR * h); } } else if (hue <= 5 / 6.0f) { float h = (hue - 2 / 3.0f) * 6; if (hue > 4 / 6.0f) { r = (-IB + (1 - IR) * h); g = (-IB - IR * h); b = (1 - IB - IR * h); } else { r = (-IB + IG * h); g = (-IB + (IG - 1) * h); b = (1 - IB + IG * h); } } else { float h = (hue - 1) * 6; r = (1 - IR + IB * h); g = (-IR + IB * h); b = (-IR + (IB - 1) * h); } r *= sat; g *= sat; b *= sat; float ma = Math.max(r, Math.max(g, b)); float mi = Math.min(r, Math.min(g, b)); float x = 1; float t; if (ma + lum > 1f) { t = (1f - lum) / ma; x = t; } if (mi + lum < 0) { t = lum / (-mi); if (t < x) { x = t; } } int red = (int) ((lum + r * x) * 255) & 0xff; int green = (int) ((lum + g * x) * 255) & 0xff; int blue = (int) ((lum + b * x) * 255) & 0xff; return 0xff000000 | red << 16 | green << 8 | blue; } } CharacterManaJ/src/main/java/charactermanaj/graphics/ColorConvertedImageLoaderImpl.java0000644000175000017500000000736013615720000031477 0ustar paulliupaulliupackage charactermanaj.graphics; import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; import java.io.Closeable; import java.io.IOException; import charactermanaj.graphics.colormodel.ColorModel; import charactermanaj.graphics.colormodel.ColorModels; import charactermanaj.graphics.filters.ColorConvertFilter; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.graphics.filters.ContrastTableFactory; import charactermanaj.graphics.filters.GammaTableFactory; import charactermanaj.graphics.io.ImageLoader; import charactermanaj.graphics.io.ImageResource; import charactermanaj.graphics.io.LoadedImage; /** * 画像リソースをロードし色変換された結果の画像イメージとして返す.
* @author seraphy */ public class ColorConvertedImageLoaderImpl implements ColorConvertedImageLoader, Closeable { private static final ColorConvertParameter NULL_COLORCONVPARAM = new ColorConvertParameter(); private ImageLoader loader; public ColorConvertedImageLoaderImpl(ImageLoader loader) { if (loader == null) { throw new IllegalArgumentException(); } this.loader = loader; } /** * 画像リソースをロードし色変換した結果のBufferedImageを返します.
* 返される形式はARGBに変換されています.
* * @param file * 画像リソース * @param colorConvParam * 色変換パラメータ、nullの場合はデフォルト * @param colorModel * カラーモデル、nullの場合はデフォルト * @return 画像イメージ * @throws IOException * 形式が不明であるか、ファィルがないか読み取りに失敗した場合 */ public LoadedImage load(ImageResource file, ColorConvertParameter colorConvParam, ColorModel colorModel) throws IOException { if (file == null) { throw new IllegalArgumentException(); } if (colorConvParam == null) { colorConvParam = NULL_COLORCONVPARAM; } if (colorModel == null) { colorModel = ColorModels.DEFAULT; } LoadedImage loadedImage = loader.load(file); BufferedImage originalImage = loadedImage.getImage(); BufferedImage image = colorConvert(originalImage, colorConvParam, colorModel); return new LoadedImage(image, loadedImage.getLastModified()); } public void close() { if (loader instanceof Closeable) { try { ((Closeable) loader).close(); } catch (RuntimeException ex) { throw ex; } catch (Exception ex) { throw new RuntimeException(ex); } } } /** * 色変換ロジック. * @param img 元画像(ARGB形式) * @param param 変換パラメータ * @return 色変換後の画像 */ private BufferedImage colorConvert(BufferedImage img, ColorConvertParameter param, ColorModel colorModel) { float[] factors = { param.getFactorR(), param.getFactorG(), param.getFactorB(), param.getFactorA(), }; float[] offsets = { param.getOffsetR(), param.getOffsetG(), param.getOffsetB(), param.getOffsetA(), }; RescaleOp rescale_op = new RescaleOp(factors, offsets, null); float[] gammas = { param.getGammaA(), param.getGammaR(), param.getGammaG(), param.getGammaB(), }; float[] hsbs = { param.getHue(), param.getSaturation(), param.getBrightness() }; float contrast = param.getContrast(); ColorConvertFilter colorConvert_op = new ColorConvertFilter( colorModel, param.getColorReplace(), hsbs, param.getGrayLevel(), new GammaTableFactory(gammas), new ContrastTableFactory((float) Math.exp(contrast * 2.f)) // 対数補正 ); img = colorConvert_op.filter(img, null); img = rescale_op.filter(img, img); return img; } } CharacterManaJ/src/main/java/charactermanaj/graphics/ImageBuildJobAbstractAdaptor.java0000644000175000017500000000531613615720000031266 0ustar paulliupaulliupackage charactermanaj.graphics; import java.io.IOException; import charactermanaj.graphics.ImageBuilder.ImageOutput; import charactermanaj.graphics.ImageBuilder.ImageSourceCollector; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.graphics.io.ImageResource; import charactermanaj.model.Layer; import charactermanaj.model.LayerOrderMapper; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.model.PartsSpecResolver; import charactermanaj.model.io.PartsImageCollectionParser; /** * 非同期に複合画像を生成するイメージビルダに引き渡すジョブを生成するためのアダプタクラス.
* パーツセットとパーツ設定リゾルバからイメージビルダに引き渡す情報を解決するジョブを生成する.
* @author seraphy * */ public abstract class ImageBuildJobAbstractAdaptor implements AsyncImageBuilder.AsyncImageBuildJob { protected PartsImageCollectionParser partsImageCollectorParser; public ImageBuildJobAbstractAdaptor(PartsSpecResolver partsSpecResolver) { if (partsSpecResolver == null) { throw new IllegalArgumentException(); } this.partsImageCollectorParser = new PartsImageCollectionParser(partsSpecResolver); } public void loadParts(final ImageSourceCollector collector) throws IOException { if (collector == null) { throw new IllegalArgumentException("collector is null"); } PartsSet partsSet = getPartsSet(); LayerOrderMapper layerOrderMapper = getLayerOrderMapper(); if (partsSet == null) { throw new RuntimeException("PartsSet is null"); } collector.setSize(partsImageCollectorParser.getPartsSpecResolver().getImageSize()); collector.setImageBgColor(partsSet.getBgColor()); collector.setAffineTramsform(partsSet.getAffineTransformParameter()); partsImageCollectorParser.parse(partsSet, layerOrderMapper, new PartsImageCollectionParser.PartsImageCollectionHandler() { public void detectImageSource(PartsIdentifier partsIdentifier, Layer layer, float layerOrder, ImageResource imageResource, ColorConvertParameter param) { if (param == null) { param = new ColorConvertParameter(); } String partsName = partsIdentifier.getPartsName(); collector.setImageSource(partsName, layer, layerOrder, imageResource, param); } }); collector.setComplite(); } protected abstract PartsSet getPartsSet() throws IOException; protected abstract LayerOrderMapper getLayerOrderMapper(); public abstract void buildImage(ImageOutput output); public abstract void handleException(Throwable ex); public void onAbandoned() { // なにもしない } public void onQueueing(long ticket) { // なにもしない } } CharacterManaJ/src/main/java/charactermanaj/graphics/ColorConvertedImageLoader.java0000644000175000017500000000210413615720000030644 0ustar paulliupaulliupackage charactermanaj.graphics; import java.io.IOException; import charactermanaj.graphics.colormodel.ColorModel; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.graphics.io.ImageResource; import charactermanaj.graphics.io.LoadedImage; /** * 画像リソースを読み込み、カラー変換した画像を返す. * @author seraphy * */ public interface ColorConvertedImageLoader { /** * 画像リソースをロードし色変換した結果のBufferedImageを返します.
* 返される形式はARGBに変換されています.
* * @param file * 画像リソース * @param colorConvParam * 色変換パラメータ、nullの場合はデフォルト * @param colorModel * カラーモデル * @return 画像イメージ * @throws IOException * 形式が不明であるか、ファィルがないか読み取りに失敗した場合 */ LoadedImage load(ImageResource file, ColorConvertParameter colorConvParam, ColorModel colorModel) throws IOException; } CharacterManaJ/src/main/java/charactermanaj/graphics/ImageBuilder.java0000644000175000017500000004772413615720000026174 0ustar paulliupaulliupackage charactermanaj.graphics; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import charactermanaj.graphics.colormodel.ColorModel; import charactermanaj.graphics.colormodel.ColorModels; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.graphics.io.ImageResource; import charactermanaj.graphics.io.LoadedImage; import charactermanaj.model.AppConfig; import charactermanaj.model.Layer; /** * 各パーツの各レイヤーごとの画像を色変換したのちレイヤーの順序に従い重ね合わせ合成する。 * * @author seraphy */ public interface ImageBuilder { /** * 各パーツ情報を設定するためのインターフェイス.
* パーツ登録が完了したら、{@link #setComplite()}を呼び出す必要がある.
* * @author seraphy * */ public interface ImageSourceCollector { /** * 画像サイズを設定する.
* * @param size * サイズ */ void setSize(Dimension size); /** * 画像の背景色を設定する.
* 画像生成処理そのものは背景色を使用しないが、画像の生成完了と同じタイミングで背景色を変えるために ホルダーとして用いることを想定している.
* * @param color */ void setImageBgColor(Color color); /** * アフィン変換処理のためのパラメータを指定する.
* 配列サイズは4または6でなければならない.
* * @param param * パラメータ、変換しない場合はnull */ void setAffineTramsform(double[] param); /** * 各パーツを登録する.
* 複数パーツある場合は、これを繰り返し呼び出す.
* すべて呼び出したらsetCompliteを呼び出す.
* * @param partsName * パーツ名 * @param layer * レイヤー * @param layerOrder * レイヤーの補正済み順序 * @param imageResource * イメージソース * @param param * 色変換情報 */ void setImageSource(String partsName, Layer layer, float layerOrder, ImageResource imageResource, ColorConvertParameter param); /** * パーツの登録が完了したことを通知する。 */ void setComplite(); } /** * 合成が完了した画像を通知するインターフェイス * * @author seraphy */ public interface ImageOutput { /** * 画像の背景色を取得する. * * @return 背景色 */ Color getImageBgColor(); /** *  画像を取得する. * * @return 画像 */ BufferedImage getImageOutput(); } /** * イメージを構築するためのジョブ定義.
* イメージを構築するためのパーツを登録するハンドラと、合成されたイメージを取り出すハンドラ、および エラーハンドラからなる.
* * @author seraphy */ public interface ImageBuildJob { /** * 合成する、各パーツを登録するためのハンドラ.
* * @param collector * 登録するためのインターフェイス */ void loadParts(ImageSourceCollector collector) throws IOException; /** * 合成されたイメージを取得するハンドラ * * @param output * イメージを取得するためのインターフェイス */ void buildImage(ImageOutput output); /** * 例外ハンドラ * * @param ex * 例外 */ void handleException(Throwable ex); } public interface ImageBuildJob2 extends ImageBuildJob { void onCreateLayerImage(String partsName, Layer layer, BufferedImage img); } boolean requestJob(final ImageBuildJob imageBuildJob); } class ImageBuilderImpl implements ImageBuilder { /** * 各パーツ情報の読み取りタイムアウト */ private static final int MAX_TIMEOUT = 20; // Secs /** * イメージ構築に使用したパーツ情報 * * @author seraphy */ private static final class BuildedPartsInfo { private final ImageBuildPartsInfo partsInfo; private final LoadedImage loadedImage; public BuildedPartsInfo(ImageBuildPartsInfo partsInfo, LoadedImage loadedImage) { this.partsInfo = partsInfo; this.loadedImage = loadedImage; } public ImageBuildPartsInfo getPartsInfo() { return partsInfo; } public LoadedImage getLoadedImage() { return loadedImage; } public long getLastModified() { return loadedImage.getLastModified(); } } /** * イメージ構築用情報.
* イメージ構築結果も格納される.
* * @author seraphy */ private static final class ImageBuildInfo { private ArrayList partsInfos = new ArrayList(); private ArrayList buildPartsInfos = new ArrayList(); private BufferedImage canvas; private Rectangle rct = new Rectangle(0, 0, 0, 0); private Color imageBgColor; private double[] affineParamHolder; private boolean sorted; @Override public int hashCode() { return partsInfos.hashCode(); } @Override public boolean equals(Object obj) { if (obj != null && obj instanceof ImageBuildInfo) { ImageBuildInfo other = (ImageBuildInfo) obj; if (!getPartsInfos().equals(other.getPartsInfos())) { // パーツ情報を重ね順をあわせて比較している. return false; } if (!rct.equals(other.rct)) { return false; } if (!(imageBgColor == null ? other.imageBgColor == null : imageBgColor.equals(other.imageBgColor))) { return false; } if (!(affineParamHolder == null ? other.affineParamHolder == null : Arrays.equals(affineParamHolder, other.affineParamHolder))) { return false; } return true; } return false; } /** * このイメージ構築情報と、すでに構築したイメージ情報を比較し、 同一であるか判定する.
* 引数に指定したイメージ構築情報が、まだ構築されていない場合は常にfalseとなる.
* イメージリソースが更新されていれば同一構成であってもfalseとなる.
* * @param usedInfo * すでに構築済みのイメージ情報(結果が入っているもの) * @return 同一であればtrue、そうでなければfalse */ public boolean isAlreadyLoaded(ImageBuildInfo usedInfo) { if (usedInfo == null || usedInfo.getCanvas() == null) { return false; } if ( !usedInfo.equals(this)) { // 構成が違うのでfalse return false; } // 要求されているパーツ情報と、読み込み済みのパーツ情報が同一であるか判定する. int mx = partsInfos.size(); int mxUsed = usedInfo.buildPartsInfos.size(); if (mx != mxUsed) { return false; // 念のため } for (int idx = 0; idx < mx; idx++) { ImageBuildPartsInfo partsInfo = partsInfos.get(idx); BuildedPartsInfo buildedPartsInfo = usedInfo.buildPartsInfos.get(idx); if ( !partsInfo.equals(buildedPartsInfo.getPartsInfo())) { // パーツ構成が一致しない.(念のため) return false; } long lastModified = partsInfo.getFile().lastModified(); if (lastModified != buildedPartsInfo.getLastModified()) { // 画像ファイルが更新されている. return false; } } return true; } /** * イメージ構築に使用したパーツ情報を記録する. * * @param partsInfo * パーツ情報 * @param loadedImage * イメージ */ public void addUsedPartsInfo(ImageBuildPartsInfo partsInfo, LoadedImage loadedImage) { buildPartsInfos.add(new BuildedPartsInfo(partsInfo, loadedImage)); } /** * イメージに構築したパーツ情報を取得する。 * 構築順序で返される。 * @return パーツ情報と構築されたレイヤーイメージ */ public List getBuildPartsInfos() { return buildPartsInfos; } /** * イメージ構築結果を取得する. * * @return イメージ構築結果 */ public BufferedImage getCanvas() { return canvas; } /** * イメージ構築結果を格納する. * * @param canvas * イメージ構築結果 */ public void setCanvas(BufferedImage canvas) { this.canvas = canvas; } public double[] getAffineParamHolder() { return affineParamHolder; } public void setAffineParamHolder(double[] affineParamHolder) { this.affineParamHolder = affineParamHolder; } public Color getImageBgColor() { return imageBgColor; } public void setImageBgColor(Color imageBgColor) { this.imageBgColor = imageBgColor; } public Rectangle getRct() { return rct; } public void setRect(int w, int h) { rct.width = w; rct.height = h; } /** * パーツのリストを取得する.
* 取得された時点で、パーツ情報は重ね合わせ順にソートされている.
* リストは変更不可です.
* * @return パーツ情報のリスト */ public List getPartsInfos() { if ( !sorted) { Collections.sort(partsInfos); sorted = true; } return Collections.unmodifiableList(partsInfos); } public void add(ImageBuildPartsInfo imageBuildPartsInfo) { sorted = false; partsInfos.add(imageBuildPartsInfo); } public int getPartsCount() { return partsInfos.size(); } } /** * イメージのローダー */ private ColorConvertedImageCachedLoader imageLoader; /** * 最後に使用したイメージビルド情報.(初回ならばnull) */ private ImageBuildInfo lastUsedImageBuildInfo; /** * イメージのローダーを指定して構築します.
* * @param imageLoader * イメージローダー */ public ImageBuilderImpl(ColorConvertedImageCachedLoader imageLoader) { if (imageLoader == null) { throw new IllegalArgumentException(); } this.imageLoader = imageLoader; } /** * イメージビルドジョブより、構築すべきイメージの情報を取得する. * * @param imageBuildJob * イメージビルドジョブ * @return 取得されたイメージ構築情報 * @throws IOException * 失敗 * @throws InterruptedException * 割り込み */ protected ImageBuildInfo getPartsInfo(ImageBuildJob imageBuildJob) throws IOException, InterruptedException { final ImageBuildInfo imageBuildInfo = new ImageBuildInfo(); final Semaphore compliteLock = new Semaphore(0); // ジョブリクエスト側に合成するイメージの情報を引き渡すように要求する. // loadPartsが非同期に行われる場合、すぐに制御を戻す. imageBuildJob.loadParts(new ImageSourceCollector() { // ジョブリクエスト側よりイメージサイズの設定として呼び出される @Override public void setSize(Dimension size) { synchronized (imageBuildInfo) { imageBuildInfo.setRect(size.width, size.height); } } @Override public void setImageBgColor(Color color) { synchronized (imageBuildInfo) { imageBuildInfo.setImageBgColor(color); } } @Override public void setAffineTramsform(double[] param) { if (param != null && !(param.length == 4 || param.length == 6)) { throw new IllegalArgumentException("affineTransformParameter invalid length."); } synchronized (imageBuildInfo) { imageBuildInfo.setAffineParamHolder(param); } } // ジョブリクエスト側よりパーツの登録として呼び出される @Override public void setImageSource(String partsName, Layer layer, float layerOrder, ImageResource imageResource, ColorConvertParameter param) { synchronized (imageBuildInfo) { imageBuildInfo.add(new ImageBuildPartsInfo( partsName, imageBuildInfo.getPartsCount(), layer, layerOrder, imageResource, param)); } } // ジョブリクエスト側よりイメージサイズとパーツの登録が完了したことを通知される. @Override public void setComplite() { compliteLock.release(); } }); // ImageCollectorは非同期に呼び出されても良いことを想定している. // MAX_TIMEOUTを経過してもsetCompliteが呼び出されない場合、処理を放棄する. if (!compliteLock.tryAcquire(MAX_TIMEOUT, TimeUnit.SECONDS)) { throw new RuntimeException("ImageCollector Timeout."); } return imageBuildInfo; } /** * イメージビルド情報をもとにイメージを構築して返す. * * @param imageBuildInfo * イメージビルド情報と、その結果 * @throws IOException * 失敗 */ protected void buildImage(ImageBuildInfo imageBuildInfo) throws IOException { // 出力画像のカンバスを作成 int w = imageBuildInfo.getRct().width; int h = imageBuildInfo.getRct().height; final BufferedImage canvas = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g = (Graphics2D) canvas.getGraphics(); try { // レンダリングヒント AppConfig appConfig = AppConfig.getInstance(); if (appConfig.isEnableRenderingHints()) { g.setRenderingHint( RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); g.setRenderingHint( RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); g.setRenderingHint( RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); } // 各パーツを重ね合わせ順にカンバスに描画する imageLoader.unlockImages(); for (ImageBuildPartsInfo partsInfo : imageBuildInfo.getPartsInfos()) { ImageResource imageFile = partsInfo.getFile(); ColorConvertParameter colorConvParam = partsInfo.getColorParam(); // カラーモデル Layer layer = partsInfo.getLayer(); String colorModelName = layer.getColorModelName(); ColorModel colorModel = ColorModels.safeValueOf(colorModelName); LoadedImage loadedImage = imageLoader.load(imageFile, colorConvParam, colorModel); // イメージ構築に使用した各パーツの結果を格納する. imageBuildInfo.addUsedPartsInfo(partsInfo, loadedImage); // イメージをキャンバスに重ねる. BufferedImage img = loadedImage.getImage(); g.drawImage(img, 0, 0, w, h, 0, 0, w, h, null); } } finally { g.dispose(); } // アフィン処理を行う.(パラメータが指定されていれば) final BufferedImage affineTransformedCanvas; double[] affineTransformParameter = imageBuildInfo.getAffineParamHolder(); if (affineTransformParameter == null || affineTransformParameter.length != 6) { affineTransformedCanvas = canvas; } else { AffineTransform affineTransform = new AffineTransform(affineTransformParameter); AffineTransformOp affineTransformOp = new AffineTransformOp(affineTransform, AffineTransformOp.TYPE_BILINEAR); affineTransformedCanvas = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); affineTransformOp.filter(canvas, affineTransformedCanvas); } // 最終的にできあがったキャンバスを結果として格納する. imageBuildInfo.setCanvas(affineTransformedCanvas); } /** * イメージ構築ジョブを要求します.
* 戻り値がtrueである場合は、ただちに完了したことを示します.
* * @param imageBuildJob * イメージを構築するジョブ * @return 画像がただちに得られた場合はtrue、そうでなければfalse */ @Override public boolean requestJob(final ImageBuildJob imageBuildJob) { if (imageBuildJob == null) { throw new IllegalArgumentException(); } // 合成する画像パーツの取得処理 final ImageBuildInfo imageBuildInfo; try { imageBuildInfo = getPartsInfo(imageBuildJob); } catch (Throwable ex) { // 予期せぬ例外の通知 imageBuildJob.handleException(ex); return false; } try { synchronized (imageBuildInfo) { final BufferedImage canvas; // 前回構築したパーツと同じであれば再構築せず、以前のものを使う if (imageBuildInfo.isAlreadyLoaded(lastUsedImageBuildInfo)) { canvas = lastUsedImageBuildInfo.getCanvas(); } else { // パーツの合成処理 buildImage(imageBuildInfo); canvas = imageBuildInfo.getCanvas(); lastUsedImageBuildInfo = imageBuildInfo; } // 構築したレイヤーごとの画像を通知する if (imageBuildJob instanceof ImageBuildJob2) { ImageBuildJob2 callback = (ImageBuildJob2) imageBuildJob; for (BuildedPartsInfo bpInfo : lastUsedImageBuildInfo.getBuildPartsInfos()) { ImageBuildPartsInfo partsInfo = bpInfo.getPartsInfo(); String partsName = partsInfo.getPartsName(); Layer layer = partsInfo.getLayer(); LoadedImage loadedImage = bpInfo.getLoadedImage(); BufferedImage img = loadedImage.getImage(); callback.onCreateLayerImage(partsName, layer, img); } } // 完成したカンバスを合成結果として通知する. imageBuildJob.buildImage(new ImageOutput() { public BufferedImage getImageOutput() { return canvas; } public Color getImageBgColor() { return imageBuildInfo.getImageBgColor(); } }); } } catch (Throwable ex) { // 予期せぬ例外の通知 imageBuildJob.handleException(ex); return false; } // 完了 return true; } } /** * 合成する個々のイメージ情報 .
* 補正済みレイヤー順に順序づけられており、同一レイヤーであればOrder順(定義順)に順序づけられます.
* * @author seraphy */ final class ImageBuildPartsInfo implements Comparable { /** * パーツ名 */ private String partsName; /** * 定義順 */ private int order; /** * 補正済みレイヤー順 */ private float layerOrder; private Layer layer; private ImageResource imageResource; private ColorConvertParameter colorParam; public ImageBuildPartsInfo(String partsName, int order, Layer layer, float layerOrder, ImageResource imageResource, ColorConvertParameter colorParam) { this.partsName = partsName; this.order = order; this.layer = layer; this.layerOrder = layerOrder; this.imageResource = imageResource; this.colorParam = colorParam; } @Override public int hashCode() { return partsName.hashCode() ^ order ^ layer.hashCode() ^ imageResource.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof ImageBuildPartsInfo) { ImageBuildPartsInfo o = (ImageBuildPartsInfo) obj; return order == o.order && partsName.equals(o.partsName) && layer.equals(o.layer) && imageResource.equals(o.imageResource) && colorParam.equals(o.colorParam); } return false; } public int compareTo(ImageBuildPartsInfo o) { // 補正済みレイヤー順 int ret = Float.compare(layerOrder, o.layerOrder); if (ret == 0) { // レイヤー順(フォールバック用。layerOrderが設定されていれば必要ない) ret = layer.compareTo(o.layer); } if (ret == 0) { // 同一レイヤーであれば定義順 ret = order - o.order; } if (ret == 0) { // それでも同じであればイメージソースの固有の順序 ret = imageResource.compareTo(o.imageResource); } return ret; } public String getPartsName() { return partsName; } public int getOrder() { return order; } public Layer getLayer() { return layer; } public float getLayerOrder() { return layerOrder; } public ColorConvertParameter getColorParam() { return colorParam; } public ImageResource getFile() { return imageResource; } } CharacterManaJ/src/main/java/charactermanaj/graphics/filters/0000755000175000017500000000000013615720000024432 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/graphics/filters/AbstractFilter.java0000644000175000017500000001157313615720000030215 0ustar paulliupaulliupackage charactermanaj.graphics.filters; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; import java.awt.image.ColorModel; import java.awt.image.DataBufferInt; import java.awt.image.WritableRaster; /** * 色フィルタの抽象クラス.
* @author seraphy */ public abstract class AbstractFilter implements BufferedImageOp { /** * 色変換を行うルーチン.
* 派生クラスでオーバーライドする.
* @param pixcels ARGB形式のピクセルデータ */ protected abstract void filter(int[] pixcels); public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel destCM) { if (destCM == null) { destCM = src.getColorModel(); } int w = src.getWidth(); int h = src.getHeight(); return new BufferedImage(destCM, destCM.createCompatibleWritableRaster(w, h), destCM.isAlphaPremultiplied(), null); } public BufferedImage filter(BufferedImage src, BufferedImage dest) { if (dest == null) { dest = createCompatibleDestImage(src, null); } int w = src.getWidth(); int h = src.getHeight(); int imageType = src.getType(); int [] pixcels; boolean shared = false; if (src == dest && (imageType == BufferedImage.TYPE_INT_ARGB || imageType == BufferedImage.TYPE_INT_RGB)) { // 元イメージと出力先イメージが同一であり、且つ、 // イメージがARGB/RGB形式であればピクセルデータはイメージが持つバッファそのものを共有アクセスする. // したがって、setPixcelsの呼び出しは不要. pixcels = null; shared = true; } else { // 元イメージと出力先イメージが異なるか、もしくは、 // イメージがARGB/RGB形式以外であれば、RGB形式のint配列に変換して処理する. // イメージに書き戻すためにsetPixcelsの呼び出しが必要となる. int len = w * h; pixcels = new int[len]; } pixcels = getPixcels(src, 0, 0, w, h, pixcels); filter(pixcels); if (!shared) { setPixcels(dest, 0, 0, w, h, pixcels); } return dest; } public Rectangle2D getBounds2D(BufferedImage src) { int w = src.getWidth(); int h = src.getHeight(); return new Rectangle(0, 0, w, h); } public Point2D getPoint2D(Point2D srcPt, Point2D dstPt) { return (Point2D) srcPt.clone(); } public RenderingHints getRenderingHints() { return null; } /** * ピクセルデータを取得する.
* 画像のタイプがARGBもしくはRGBの場合はpixcelsにnullを指定して格納先を指定しない場合は * 格納先を自動的に構築する.
* そうでない場合はピクセルデータはイメージのピクセルバッファを、そのまま返す.(つまり、変更は即イメージの変更になる.)
* ARGB,RGB以外のイメージは常に幅x高さ分のRGB(もしくはARGB)を格納できるだけのバッファを指定しなければならない.
* @param img 対象のイメージ * @param x 位置x * @param y 位置y * @param w 幅 * @param h 高さ * @param pixcels 格納先バッファ、もしくはnull * @return ピクセルデータ */ protected int[] getPixcels(BufferedImage img, int x, int y, int w, int h, int[] pixcels) { if (w <= 0 || h <= 0) { return new int[0]; } int len = w * h; if (pixcels != null && pixcels.length < len) { throw new IllegalArgumentException("array too short."); } int imageType = img.getType(); if (imageType == BufferedImage.TYPE_INT_ARGB || imageType == BufferedImage.TYPE_INT_RGB) { WritableRaster raster = img.getRaster(); if (pixcels == null) { DataBufferInt buf = (DataBufferInt) raster.getDataBuffer(); return buf.getData(); } return (int[]) raster.getDataElements(x, y, w, h, pixcels); } if (pixcels == null) { throw new IllegalArgumentException("image type error."); } return img.getRGB(x, y, w, h, pixcels, 0, w); } /** * ピクセルデータをイメージに書き戻す.
* ピクセルデータがnullであるか幅または高さが0であれば何もしない.
* @param img 対象のイメージ * @param x 位置x * @param y 位置y * @param w 幅 * @param h 高さ * @param pixcels ピクセルデータ、nullの場合は何もしない. */ protected void setPixcels(BufferedImage img, int x, int y, int w, int h, int[] pixcels) { int len = w * h; if (pixcels == null || w == 0 || h == 0) { return; } if (pixcels.length < len) { throw new IllegalArgumentException("array too short."); } int imageType = img.getType(); if (imageType == BufferedImage.TYPE_INT_ARGB || imageType == BufferedImage.TYPE_INT_RGB) { WritableRaster raster = img.getRaster(); raster.setDataElements(x, y, w, h, pixcels); return; } img.setRGB(x, y, w, h, pixcels, 0, w); } } CharacterManaJ/src/main/java/charactermanaj/graphics/filters/ContrastTableFactory.java0000644000175000017500000000160613615720000031375 0ustar paulliupaulliupackage charactermanaj.graphics.filters; /** * コントラストの計算済みテーブルを用意する.
* 最大で255x3あれば足りる.
* * @author seraphy * */ public class ContrastTableFactory implements TableFactory { private float contrast = 1.f; public ContrastTableFactory() { this(1.f); } public ContrastTableFactory(float contrast) { this.contrast = contrast; } public int[][] createTable() { int[] table = new int[256]; for (int level = 0; level <= 255; level++) { float f = level / 255.f; f = getContrast(f); int c = (int)(f * 256); if (c > 255) { c = 255; } else if (c < 0) { c = 0; } table[level] = c; } int[][] tables = new int[3][]; for (int idx = 0; idx < 3; idx++) { tables[idx] = table; } return tables; } protected float getContrast(float f) { return (f - 0.5f) * contrast + 0.5f; } } CharacterManaJ/src/main/java/charactermanaj/graphics/filters/TableFactory.java0000644000175000017500000000014713615720000027656 0ustar paulliupaulliupackage charactermanaj.graphics.filters; public interface TableFactory { int[][] createTable(); } CharacterManaJ/src/main/java/charactermanaj/graphics/filters/ColorConvertParameter.java0000644000175000017500000001313313615720000031556 0ustar paulliupaulliupackage charactermanaj.graphics.filters; /** * カラー情報.
* RGB置換、GrayLevel、RGBオフセット各種、HSB調整値を持つ.
* @author seraphy */ public final class ColorConvertParameter implements Cloneable { /** * 色置換パターン */ private ColorConv rgbChanelMixierPattern; /** * グレーレベル(0でモノトーン、1でノーマル、0.5で半分ほどモノトーン化) */ private float grayLevel = 1.f; private float hue = 0.f; private float saturation = 0.f; private float brightness = 0.f; private float contrast = 0.f; private int offsetR = 0; private int offsetG = 0; private int offsetB = 0; private int offsetA = 0; private float factorR = 1.f; private float factorG = 1.f; private float factorB = 1.f; private float factorA = 1.f; private float gammaR = 1.f; private float gammaG = 1.f; private float gammaB = 1.f; private float gammaA = 1.f; @Override public int hashCode() { int ret = 0; if (rgbChanelMixierPattern != null) { ret = rgbChanelMixierPattern.ordinal(); } ret ^= (int)(grayLevel * 100); ret ^= (int)(hue * 100); ret ^= (int)(saturation * 100); ret ^= (int)(brightness * 100); ret ^= (int)(contrast * 100); ret ^= offsetR; ret ^= offsetG; ret ^= offsetB; ret ^= offsetA; ret ^= (int)(factorR * 100); ret ^= (int)(factorG * 100); ret ^= (int)(factorB * 100); ret ^= (int)(factorA * 100); ret ^= (int)(gammaR * 100); ret ^= (int)(gammaG * 100); ret ^= (int)(gammaB * 100); ret ^= (int)(gammaA * 100); return ret; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof ColorConvertParameter) { ColorConvertParameter o = (ColorConvertParameter) obj; return rgbChanelMixierPattern == o.rgbChanelMixierPattern && grayLevel == o.grayLevel && hue == o.hue && saturation == o.saturation && contrast == o.contrast && brightness == o.brightness && offsetR == o.offsetR && offsetG == o.offsetG && offsetB == o.offsetB && offsetA == o.offsetA && factorR == o.factorR && factorG == o.factorG && factorB == o.factorB && factorA == o.factorA && gammaR == o.gammaR && gammaG == o.gammaG && gammaB == o.gammaB && gammaA == o.gammaA; } return false; } public static boolean equals(ColorConvertParameter a, ColorConvertParameter b) { if (a == b) { return true; } if (a != null && b != null) { return a.equals(b); } return false; } @Override public ColorConvertParameter clone() { try { // シャローコピー. すべてimmutableな単純型だけのメンバなので問題なし. return (ColorConvertParameter) super.clone(); } catch (CloneNotSupportedException e) { throw new Error("internal error."); } } public ColorConv getColorReplace() { return rgbChanelMixierPattern; } public void setColorReplace(ColorConv colorReplace) { this.rgbChanelMixierPattern = colorReplace; } public float getGrayLevel() { return grayLevel; } public void setGrayLevel(float grayLevel) { this.grayLevel = grayLevel; } public float getHue() { return hue; } public void setHue(float hue) { this.hue = hue; } public float getSaturation() { return saturation; } public void setSaturation(float saturation) { this.saturation = saturation; } public float getBrightness() { return brightness; } public void setBrightness(float brightness) { this.brightness = brightness; } public float getContrast() { return contrast; } public void setContrast(float contrast) { this.contrast = contrast; } public int getOffsetR() { return offsetR; } public void setOffsetR(int offsetR) { this.offsetR = offsetR; } public int getOffsetG() { return offsetG; } public void setOffsetG(int offsetG) { this.offsetG = offsetG; } public int getOffsetB() { return offsetB; } public void setOffsetB(int offsetB) { this.offsetB = offsetB; } public int getOffsetA() { return offsetA; } public void setOffsetA(int offsetA) { this.offsetA = offsetA; } public float getFactorR() { return factorR; } public void setFactorR(float factorR) { this.factorR = factorR; } public float getFactorG() { return factorG; } public void setFactorG(float factorG) { this.factorG = factorG; } public float getFactorB() { return factorB; } public void setFactorB(float factorB) { this.factorB = factorB; } public float getFactorA() { return factorA; } public void setFactorA(float factorA) { this.factorA = factorA; } public float getGammaR() { return gammaR; } public void setGammaR(float gammaR) { this.gammaR = gammaR; } public float getGammaG() { return gammaG; } public void setGammaG(float gammaG) { this.gammaG = gammaG; } public float getGammaB() { return gammaB; } public void setGammaB(float gammaB) { this.gammaB = gammaB; } public float getGammaA() { return gammaA; } public void setGammaA(float gammaA) { this.gammaA = gammaA; } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append(getClass().getSimpleName() + "@" + Integer.toHexString(System.identityHashCode(this)) + "("); buf.append("(replace:" + rgbChanelMixierPattern + ", grayLevel:" + grayLevel + ")"); buf.append("(H:" + hue + ", S:" + saturation + ", B:" + brightness + ", C:" + contrast +")"); buf.append("(Red:" + offsetR + "/" + factorR + "/" + gammaR + ", Green:" + offsetG + "/" + factorG + "/" + gammaG + ", Blue:" + offsetB + "/" + factorB + "/" + gammaB + ", Alpha:" + offsetA + "/" + factorA + "/" + gammaA + ")"); buf.append(")"); return buf.toString(); } } CharacterManaJ/src/main/java/charactermanaj/graphics/filters/BackgroundColorFilter.java0000644000175000017500000001353013615720000031523 0ustar paulliupaulliupackage charactermanaj.graphics.filters; import java.awt.Color; import charactermanaj.graphics.colormodel.HSYColorModel; public class BackgroundColorFilter extends AbstractFilter { /** * 背景モード. * @author seraphy */ public enum BackgroundColorMode { ALPHABREND(false, false, 1) { @Override public void filter(BackgroundColorFilter me, int[] pixcels) { me.alphabrend(pixcels); } }, OPAQUE(false, true, 2) { @Override public void filter(BackgroundColorFilter me, int[] pixcels) { me.opaque(pixcels); } }, GRAYSCALE(true, false, 4) { @Override public void filter(BackgroundColorFilter me, int[] pixcels) { me.grayscale(pixcels); } }, DRAW_ALPHA(true, true, 8) { @Override public void filter(BackgroundColorFilter me, int[] pixcels) { me.drawAlpha(pixcels); } }; private final boolean grayscale; private final boolean noAlphachanel; private final int mask; public abstract void filter(BackgroundColorFilter me, int[] pixcels); BackgroundColorMode(boolean grayscale, boolean noAlphachanel, int mask) { this.grayscale = grayscale; this.noAlphachanel = noAlphachanel; this.mask = mask; } public boolean isNoAlphaChannel() { return this.noAlphachanel; } public boolean isGrayscale() { return this.grayscale; } public int mask() { return mask; } public static BackgroundColorMode valueOf(boolean noAlphachanel, boolean grayscale) { for (BackgroundColorMode mode : values()) { if (mode.isNoAlphaChannel() == noAlphachanel && mode.isGrayscale() == grayscale) { return mode; } } throw new RuntimeException("構成に誤りがあります."); } } /** * 背景モード */ private BackgroundColorMode mode; /** * 背景色、グレースケールまたはアルファ表示モードでは不要 */ private Color bgColor; /** * 背景モードと背景色を指定して背景色描画フィルタを構築する. * @param mode モード * @param bgColor 背景色、(グレースケールまたはアルファではnull化) */ public BackgroundColorFilter(BackgroundColorMode mode, Color bgColor) { if (mode == null) { // モードは必須. throw new IllegalArgumentException(); } if (!mode.isGrayscale() && bgColor == null) { // グレースケールもしくはアルファ表示モード以外は背景色は必須. throw new IllegalArgumentException(); } this.mode = mode; this.bgColor = bgColor; } @Override protected void filter(int[] pixcels) { mode.filter(this, pixcels); } /** * 普通のアルファブレンドします. * @param pixcels */ public void alphabrend(int[] pixcels) { int br = bgColor.getRed(); int bg = bgColor.getGreen(); int bb = bgColor.getBlue(); final int mx = pixcels.length; for (int idx = 0; idx < mx; idx++) { int argb = pixcels[idx]; int b = argb & 0xff; int g = (argb >>>= 8) & 0xff; int r = (argb >>>= 8) & 0xff; int a = (argb >>>= 8) & 0xff; if (a == 0) { // 完全透過ならば背景色まま b = bb; g = bg; r = br; } else if (a != 0xff) { // 完全非透過でなければアルファブレンド b = ((b * a) / 0xff + (bb * (0xff - a) / 0xff)) & 0xff; g = ((g * a) / 0xff + (bg * (0xff - a) / 0xff)) & 0xff; r = ((r * a) / 0xff + (br * (0xff - a) / 0xff)) & 0xff; } argb = 0xff000000 | (r << 16) | (g << 8) | b; pixcels[idx] = argb; } } /** * 完全透過の部分のみ背景色を設定し、それ以外は元の色のままアルファを取り除く.
* @param pixcels ピクセルデータ */ public void opaque(int[] pixcels) { int bgRgb = bgColor.getRGB(); final int mx = pixcels.length; for (int idx = 0; idx < mx; idx++) { int argb = pixcels[idx]; int a = (argb >>> 24) & 0xff; int rgb = (argb & 0xffffff); if (a == 0) { rgb = bgRgb; } argb = 0xff000000 | rgb; pixcels[idx] = argb; } } /** * アルファを取り除き、グレスケールで表現する.
* RGBチャネルのうち、RBはアルファ適用されたグレースケールで、 * Gチャネルはアルファ未適用のグレースケールで表現される.
* @param pixcels ピクセルデータ */ public void grayscale(int[] pixcels) { final int mx = pixcels.length; for (int idx = 0; idx < mx; idx++) { int argb = pixcels[idx]; int b = argb & 0xff; int g = (argb >>>= 8) & 0xff; int r = (argb >>>= 8) & 0xff; int a = (argb >>>= 8) & 0xff; int gray_brend = 0; int gray_plain = 0; if (a != 0) { // 輝度の算定(グレースケール化) gray_brend = HSYColorModel.getGrayscale(r, g, b); gray_plain = gray_brend; if (a != 0xff) { // アルファによる調整 gray_brend = ((gray_brend * a) / 0xff) & 0xff; } } argb = 0xff000000 | (gray_brend << 16) | (gray_plain << 8) | gray_brend; pixcels[idx] = argb; } } /** * アルファチャネルとグレースケールを重ねて表示する.
* アルファ未適用のグレースケールをRチャネル、 * アルファを無し・半透明・透明の3段階にしたものをGチャネル、 * アルファをBチャネルで表現する.
* Gチャネルは、完全透過は濃緑(0x80)、完全非透過は黒(0xff)、半透明は明緑(0xff)となる.
* @param pixcels ピクセルデータ */ public void drawAlpha(int[] pixcels) { final int mx = pixcels.length; for (int idx = 0; idx < mx; idx++) { int argb = pixcels[idx]; int b = argb & 0xff; int g = (argb >>>= 8) & 0xff; int r = (argb >>>= 8) & 0xff; int a = (argb >>>= 8) & 0xff; int gray_plain = (r + g + b) / 3; int alpha_off = (a == 0) ? 0x80 : (a == 0xff) ? 0x00 : 0xff; argb = 0xff000000 | (gray_plain << 16) | (alpha_off << 8) | a; pixcels[idx] = argb; } } } CharacterManaJ/src/main/java/charactermanaj/graphics/filters/ColorConvertFilter.java0000644000175000017500000001166313615720000031071 0ustar paulliupaulliupackage charactermanaj.graphics.filters; import charactermanaj.graphics.colormodel.ColorModel; /** * 色変換フィルタ.
* @author seraphy */ public class ColorConvertFilter extends AbstractFilter { /** * 色置換用インターフェイス.
* @author seraphy */ public interface ColorReplace { /** * R,G,Bの順に格納されている色データに対して編集を行う.
* @param rgb 編集対象 */ void convert(int[] rgb); } /** * カラーモデル */ private final ColorModel colorModel; /** * 色置換オブジェクト */ private final ColorReplace colorReplace; /** * HSB値の各オフセット(3要素) */ private final float[] hsbOffsets; /** * 淡色化率.
* 0に近づくほどグレースケールに近づく.
* 0で完全なグレースケール、1の場合は色の変更はなし。 */ private final float grayLevel; /** * ガンマ値補正用テーブル.
*/ private final int[][] gammaTbl; /** * コントラスト補正用テーブル */ private final int[][] contrastTbl; /** * 色変換フィルタを構築する.
* * @param colorModel * カラーモデル * @param colorReplace * 色置換オブジェクト、不要ならばnull * @param hsbOffsets * HSBオフセット(3要素)、不要ならばnull * @param grayLevel * 淡色化率、1でそのまま、0でグレースケール化。 * @param gammaTableFactory * ガンマ補正値ファクトリ、不要ならばnull * @param contrastTableFactory * コントラスト補正ファクトリ、不要ならばnull */ public ColorConvertFilter( ColorModel colorModel, ColorReplace colorReplace, float[] hsbOffsets, float grayLevel, GammaTableFactory gammaTableFactory, ContrastTableFactory contrastTableFactory) { if (colorModel == null) { throw new IllegalArgumentException(); } this.colorModel = colorModel; if (gammaTableFactory == null) { gammaTableFactory = new GammaTableFactory(1.f); } if (contrastTableFactory == null) { contrastTableFactory = new ContrastTableFactory(1.f); } if (hsbOffsets != null && hsbOffsets.length < 3) { throw new IllegalArgumentException("hsbOffset too short."); } if (hsbOffsets != null) { if (hsbOffsets[0] == 0 && hsbOffsets[1] == 0 && hsbOffsets[2] == 0) { hsbOffsets = null; } else { hsbOffsets = (float[]) hsbOffsets.clone(); } } if (grayLevel < 0) { grayLevel = 0; } else if (grayLevel > 1) { grayLevel = 1.f; } this.grayLevel = grayLevel; this.gammaTbl = gammaTableFactory.createTable(); this.contrastTbl = contrastTableFactory.createTable(); this.hsbOffsets = hsbOffsets; this.colorReplace = colorReplace; } /** * ピクセルデータに対して色変換を行う.
* @param pixcels ピクセルデータ */ protected void filter(int[] pixcels) { final float grayLevel = this.grayLevel; final float negGrayLevel = 1.f - grayLevel; // グレースケール変換テーブル int[] precalc = new int[256]; int[] negPrecalc = new int[256]; for (int i = 0; i < 256; i++) { precalc[i] = (int)(i * grayLevel) & 0xff; negPrecalc[i] = (int)(i * negGrayLevel) & 0xff; } // 全ピクセルに対して計算を行う final ColorReplace colorReplace = this.colorReplace; int[] rgbvals = new int[3]; final float[] hsbOffsets = this.hsbOffsets; final float[] hsvvals = new float[3]; final int[][] gammaTbl = this.gammaTbl; final int mx = pixcels.length; for (int i = 0; i < mx; i++) { int argb = pixcels[i]; // ガンマ変換 int a = gammaTbl[0][(argb >> 24) & 0xff]; int r = gammaTbl[1][(argb >> 16) & 0xff]; int g = gammaTbl[2][(argb >> 8) & 0xff]; int b = gammaTbl[3][(argb) & 0xff]; // 色交換 if (colorReplace != null) { rgbvals[0] = r; rgbvals[1] = g; rgbvals[2] = b; colorReplace.convert(rgbvals); r = rgbvals[0]; g = rgbvals[1]; b = rgbvals[2]; } // 輝度 int br = ((77 * r + 150 * g + 29 * b) >> 8) & 0xff; // 輝度(グレースケール)に近づける r = ((int)(precalc[r] + negPrecalc[br])) & 0xff; g = ((int)(precalc[g] + negPrecalc[br])) & 0xff; b = ((int)(precalc[b] + negPrecalc[br])) & 0xff; // 色調変換 if (hsbOffsets != null) { colorModel.RGBtoHSV(r, g, b, hsvvals); for (int l = 0; l < 3; l++) { hsvvals[l] += hsbOffsets[l]; } for (int l = 1; l < 3; l++) { if (hsvvals[l] < 0) { hsvvals[l] = 0; } else if (hsvvals[l] > 1.f) { hsvvals[l] = 1.f; } } int rgb = colorModel.HSVtoRGB(hsvvals[0], hsvvals[1], hsvvals[2]); r = (rgb >> 16) & 0xff; g = (rgb >> 8) & 0xff; b = (rgb) & 0xff; } // コントラスト変換 r = contrastTbl[0][r]; g = contrastTbl[1][g]; b = contrastTbl[2][b]; argb = (a << 24) | (r << 16) | (g << 8) | b; pixcels[i] = argb; } } } CharacterManaJ/src/main/java/charactermanaj/graphics/filters/ColorConv.java0000644000175000017500000000377613615720000027216 0ustar paulliupaulliupackage charactermanaj.graphics.filters; import charactermanaj.graphics.filters.ColorConvertFilter.ColorReplace; /** * 色置換オブジェクトの列挙子.
* 「キャラクターなんとか機」のカラー変更にあわせて、画像は青・白(黒)の濃淡だけで表現し、 * RGBのマッピングを変えることで色変換する.(色調変換ではない。)
* G成分はないがしろにされている。 * @author seraphy */ public enum ColorConv implements ColorReplace { /** * 変換なし */ NONE { @Override public void convert(int[] rgb) { // do nothing. } }, /** * 青系.
* RGB成分をRRBにする.
*/ BLUE { @Override public void convert(int[] rgb) { rgb[1] = rgb[0]; } }, /** * 紫系.
* RGB成分をBRBにする.
*/ VIOLET { @Override public void convert(int[] rgb) { rgb[1] = rgb[0]; rgb[0] = rgb[2]; } }, /** * 赤系.
* RGB成分をBRRにする.
*/ RED { @Override public void convert(int[] rgb) { rgb[1] = rgb[0]; rgb[0] = rgb[2]; rgb[2] = rgb[1]; } }, /** * 黄系.
* RGB成分をBBRにする.
*/ YELLOW { @Override public void convert(int[] rgb) { rgb[1] = rgb[2]; rgb[2] = rgb[0]; rgb[0] = rgb[1]; } }, /** * 緑系.
* RGB成分をRBRにする.
*/ GREEN { @Override public void convert(int[] rgb) { rgb[1] = rgb[2]; rgb[2] = rgb[0]; } }, /** * シアン系にする.
* RGB成分をRBBにする.
*/ CYAN { @Override public void convert(int[] rgb) { rgb[1] = rgb[2]; } }, /** * 黒系にする.
* RGB成分をRRRにする.
*/ BLACK { @Override public void convert(int[] rgb) { rgb[1] = rgb[0]; rgb[2] = rgb[0]; } }, /** * 白系にする.
* RGB成分をBBBにする.
*/ WHITE { @Override public void convert(int[] rgb) { rgb[0] = rgb[2]; rgb[1] = rgb[2]; } }; /** * 色置換する. */ public abstract void convert(int[] rgb); } CharacterManaJ/src/main/java/charactermanaj/graphics/filters/GammaTableFactory.java0000644000175000017500000000372613615720000030627 0ustar paulliupaulliupackage charactermanaj.graphics.filters; /** * ガンマ補正値を構築するためのファクトリ. * @author seraphy */ public class GammaTableFactory implements TableFactory { /** * ARGBの、それぞれのガンマ補正値の配列 */ private float[] gammas; /** * ARGBすべてが同一のガンマ値で構築する. * @param gamma ガンマ値 */ public GammaTableFactory(float gamma) { setGamma(gamma); } /** * ARGBそれぞれ異なるガンマ値で構築する.
* @param gammas ガンマ値 */ public GammaTableFactory(float[] gammas) { setGamma(gammas); } /** * ARGBすべてが同一のガンマ値を設定する. * @param gamma ガンマ値 */ public final void setGamma(float gamma) { setGamma(new float[] {gamma, gamma, gamma, gamma}); } /** * ARGBそれぞれ異なるガンマ値を設定する.
* @param gammas ガンマ値 */ public final void setGamma(float[] gammas) { if (gammas == null || gammas.length < 3) { throw new IllegalArgumentException(); } this.gammas = gammas; } /** * ARGB/RGBの、それぞれのガンマ値に対する0-255の範囲に対する補正後の値を格納する * 二次元配列を構築する.
* @return ガンマテーブル */ public int[][] createTable() { int mx = gammas.length; int[][] gammaTbls = new int[mx][]; for (int i = 0; i < 4; i++) { float gamma; if (i < mx) { gamma = gammas[i]; } else { gamma = 1.f; } gammaTbls[i] = createGamma(gamma); } return gammaTbls; } /** * ガンマ値に対する0-255の入力に対する、そのガンマ補正値の配列を返す.
* @param gamma ガンマ値 * @return ガンマテーブル */ private int[] createGamma(float gamma) { if (gamma < 0.01f) { gamma = 0.01f; } int gammaTbl[] = new int[256]; for (int gi = 0; gi <= 0xff; gi++) { gammaTbl[gi] = (int)(Math.pow(gi / 255.0, 1 / gamma) * 255) & 0xff; } return gammaTbl; } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/0000755000175000017500000000000013615720000023371 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/graphics/io/ImageCacheMBean.java0000644000175000017500000000040013615720000027077 0ustar paulliupaulliupackage charactermanaj.graphics.io; public interface ImageCacheMBean { long getReadCount(); long getCacheHitCount(); long getTotalBytes(); long getMaxBytes(); int getTotalCount(); int getInstanceCount(); void reset(); } CharacterManaJ/src/main/java/charactermanaj/graphics/io/ImageLoader.java0000644000175000017500000000100513615720000026401 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.io.IOException; /** * 画像をロードします.
* @author seraphy */ public interface ImageLoader { /** * 画像リソースからBufferedImageを返します.
* 返される形式はARGBに変換されています.
* @param imageResource 画像リソース * @throws IOException 読み取りに失敗した場合、もしくは画像の形式が不明な場合 */ LoadedImage load(ImageResource imageResource) throws IOException; } CharacterManaJ/src/main/java/charactermanaj/graphics/io/OutputImageBuilder.java0000644000175000017500000000072713615720000030014 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.awt.image.BufferedImage; public abstract class OutputImageBuilder { private OutputOption outputOption; public OutputImageBuilder(OutputOption outputOption) { if (outputOption == null) { throw new IllegalArgumentException(); } this.outputOption = outputOption; } public OutputOption getOutputOption() { return outputOption.clone(); } public abstract BufferedImage buildImage(BufferedImage src); } CharacterManaJ/src/main/java/charactermanaj/graphics/io/OutputImageBuilderFactory.java0000644000175000017500000000104413615720000031335 0ustar paulliupaulliupackage charactermanaj.graphics.io; import charactermanaj.model.AppConfig; public class OutputImageBuilderFactory { public OutputOption createDefaultOutputOption() { AppConfig appConfig = AppConfig.getInstance(); OutputOption outputOption = new OutputOption(); outputOption.setJpegQuality(appConfig.getCompressionQuality()); return outputOption; } public OutputImageBuilder createOutputImageBuilder(OutputOption outputOption) { if (outputOption == null) { outputOption = createDefaultOutputOption(); } return null; } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/OutputOption.java0000644000175000017500000000636213615720000026734 0ustar paulliupaulliupackage charactermanaj.graphics.io; import charactermanaj.util.LocalizedMessageAware; /** * 出力オプションモデル. * @author seraphy */ public class OutputOption implements Cloneable { /** * 拡大縮小時に使用するレンダリングオプション. * @author seraphy */ public enum ZoomRenderingType implements LocalizedMessageAware { NONE, BILINER, BICUBIC; public String getLocalizedResourceId() { return "outputOption.zoomRenderingType." + name(); } } /** * 出力する画像モード. * @author seraphy */ public enum PictureMode implements LocalizedMessageAware { NORMAL, OPAQUE, GRAY, ALPHA; public String getLocalizedResourceId() { return "outputOption.pictureMode." + name(); } } /** * JPEG品質 */ private double jpegQuality = 1.; /** * ズームの使用可否 */ private boolean enableZoom; /** * 拡大率 */ private double zoomFactor = 1.; /** * 拡大縮小に使うアルゴリズム */ private ZoomRenderingType zoomRenderingType = ZoomRenderingType.NONE; /** * 出力画像のタイプ */ private PictureMode pictureMode = PictureMode.NORMAL; /** * 背景色を強制するか? */ private boolean forceBgColor; @Override public OutputOption clone() { try { return (OutputOption) super.clone(); } catch (CloneNotSupportedException ex) { throw new RuntimeException(ex); } } public double getJpegQuality() { return jpegQuality; } public void setJpegQuality(double jpegQuality) { if (jpegQuality < 0.1) { jpegQuality = 0.1; } if (jpegQuality > 1) { jpegQuality = 1.; } this.jpegQuality = jpegQuality; } public double getZoomFactor() { return zoomFactor; } public void setZoomFactor(double zoomFactor) { if (zoomFactor < 0.1) { zoomFactor = 0.1; } if (zoomFactor > 10.) { zoomFactor = 10.; } this.zoomFactor = zoomFactor; } public ZoomRenderingType getZoomRenderingType() { return zoomRenderingType; } public void setZoomRenderingType(ZoomRenderingType zoomRenderingType) { if (zoomRenderingType == null) { zoomRenderingType = ZoomRenderingType.NONE; } this.zoomRenderingType = zoomRenderingType; } public PictureMode getPictureMode() { return pictureMode; } public void setPictureMode(PictureMode pictureMode) { if (pictureMode == null) { pictureMode = PictureMode.NORMAL; } this.pictureMode = pictureMode; } public boolean isForceBgColor() { return forceBgColor; } public void setForceBgColor(boolean forceBgColor) { this.forceBgColor = forceBgColor; } public void setEnableZoom(boolean enableZoom) { this.enableZoom = enableZoom; } public boolean isEnableZoom() { return enableZoom; } /** * 推奨値に変更する. */ public void changeRecommend() { if (zoomFactor > 1.) { zoomRenderingType = ZoomRenderingType.BICUBIC; } else if (zoomFactor < 1.) { zoomRenderingType = ZoomRenderingType.BILINER; } else { zoomRenderingType = ZoomRenderingType.NONE; } } @Override public String toString() { return "(OutputOption:(jpegQuality:" + jpegQuality + ")(enableZoom:" + enableZoom + ")(zoomFactor:" + zoomFactor + ")(renderingType:" + zoomRenderingType + ")(pictureMode:" + pictureMode + ")(forceBgColor:" + forceBgColor + "))"; } }CharacterManaJ/src/main/java/charactermanaj/graphics/io/ImageLoaderImpl.java0000644000175000017500000000434313615720000027233 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import java.sql.Timestamp; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; /** * 画像を読み取ります.
* @author seraphy */ public class ImageLoaderImpl implements ImageLoader { /** * ロガー */ private static final Logger logger = Logger.getLogger(ImageLoaderImpl.class.getName()); /** * 画像リソースからBufferedImageを返します.
* 返される形式はARGBに変換されています.
* @param imageResource 画像リソース * @throws IOException 読み取りに失敗した場合、もしくは画像の形式が不明な場合 */ public LoadedImage load(ImageResource imageResource) throws IOException { if (imageResource == null) { throw new IllegalArgumentException(); } BufferedImage img; InputStream is = imageResource.openStream(); try { img = ImageIO.read(is); } finally { is.close(); } if (img == null) { logger.log(Level.WARNING, "unsuppoted image: " + imageResource); throw new IOException("unsupported image"); } // ARGB形式でなければ変換する. img = convertARGB(img); long lastModified = imageResource.lastModified(); if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "load image: " + imageResource + " ;lastModified=" + new Timestamp(lastModified)); } return new LoadedImage(img, lastModified); } /** * イメージがARGB形式でなければ、ARGB形式に変換して返す.
* そうでなければ、そのまま返す. * @param image イメージ * @return ARGB形式のイメージ */ protected BufferedImage convertARGB(BufferedImage image) { if (image == null) { throw new IllegalArgumentException(); } int typ = image.getType(); if (typ == BufferedImage.TYPE_INT_ARGB) { return image; } // ARGB形式でなければ変換する. BufferedImage img2 = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics g = img2.getGraphics(); try { g.drawImage(image, 0, 0, null); } finally { g.dispose(); } return img2; } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/PSDCreator.java0000644000175000017500000003541213615720000026207 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; import java.awt.image.WritableRaster; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 複数レイヤー画像をPSD形式のデータとして作成する。 * https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ * * @author seraphy */ public final class PSDCreator { /** * レイヤーデータ */ public static class LayerData { /** * レイヤー名 */ private String layerName; /** * レイヤーの画像(TYPE_INT_ARGB限定) */ private BufferedImage image; public LayerData(String layerName, BufferedImage image) { this.layerName = layerName; this.image = image; } public String getLayerName() { return layerName; } public BufferedImage getImage() { return image; } } /** * レイヤーとチャネルのペア */ static final class LayerChannelPair { private final LayerData layerData; private final int channel; public LayerChannelPair(LayerData layerData, int channel) { this.layerData = layerData; this.channel = channel; } public LayerData getLayerData() { return layerData; } public int getChannel() { return channel; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + channel; result = prime * result + ((layerData == null) ? 0 : layerData.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; LayerChannelPair other = (LayerChannelPair) obj; if (channel != other.channel) return false; if (layerData == null) { if (other.layerData != null) return false; } else if (!layerData.equals(other.layerData)) return false; return true; } } /** * RLEで圧縮するか? */ private static boolean useRLECompression = true; public static boolean isUseRLECompression() { return useRLECompression; } public static void setUseRLECompression(boolean useRLECompression) { PSDCreator.useRLECompression = useRLECompression; } /** * レンダリングヒントを使うか? */ private static boolean useRenderingHints = true; public static boolean isUseRenderingHints() { return useRenderingHints; } public static void setUseRenderingHints(boolean useRenderingHints) { PSDCreator.useRenderingHints = useRenderingHints; } /** * レイヤーを指定してPSDデータを作成する * @param layerDatas レイヤーのコレクション、順番に重ねられる * @return PSDデータ * @throws IOException */ public static byte[] createPSD(Collection layerDatas) throws IOException { if (layerDatas == null) { throw new NullPointerException("layerDatas is required."); } if (layerDatas.isEmpty()) { throw new IllegalArgumentException("layerDatas must not be empty."); } BufferedImage cimg = createCompositeImage(layerDatas); int width = cimg.getWidth(); int height = cimg.getHeight(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); dos.write("8BPS".getBytes()); dos.writeShort(1); dos.write(new byte[6]); // reserved 6bytes dos.writeShort(4); // argb dos.writeInt(height); dos.writeInt(width); int depth = 8; dos.writeShort(depth); dos.writeShort(3); // ColorMode=RGB(3) dos.writeInt(0); // カラーモードセクションなし dos.writeInt(0); // リソースセクションなし // レイヤーマスクセクション byte[] layerMaskSection = createLayerMaskSection(layerDatas); dos.writeInt(layerMaskSection.length); dos.write(layerMaskSection); // 画像セクション byte[] pictureDatas = createPictureSection(cimg, width, height); dos.write(pictureDatas); return bos.toByteArray(); } /** * レイヤーマスクセクションを作成する * @param layerDatas * @return * @throws IOException */ private static byte[] createLayerMaskSection(Collection layerDatas) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); byte[] layerData = createLayerData(layerDatas); dos.writeInt(layerData.length); dos.write(layerData); return bos.toByteArray(); } /** * レイヤーデータの作成 * @param layerDatas * @return * @throws IOException */ private static byte[] createLayerData(Collection layerDatas) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); int numOfLayers = layerDatas.size(); dos.writeShort(numOfLayers); // non pre-multiplied short[] channels = { -1, 0, 1, 2 }; // ALPHA, RED, GREEN, BLUE Map channelDataMap = new HashMap(); for (LayerData layerData : layerDatas) { String layerName = layerData.getLayerName(); BufferedImage image = layerData.getImage(); int width = image.getWidth(); int height = image.getHeight(); dos.writeInt(0); // top dos.writeInt(0); // left dos.writeInt(height); // bottom dos.writeInt(width); // right dos.writeShort(channels.length); byte[][] channelsData = createChannels(image); for (int channel = 0; channel < channels.length; channel++) { byte[] channelData = channelsData[channel]; byte[] outChannelData; if (useRLECompression) { // RLE圧縮 // 行ごとにRLE圧縮する int bufsiz = 0; List rleRows = new ArrayList(); for (int y = 0; y < height; y++) { byte[] rleRow = compressRLE(channelData, y * width, width); rleRows.add(rleRow); bufsiz += 2 + rleRow.length; } ByteBuffer outbuf = ByteBuffer.allocate(bufsiz); // 行ごとの圧縮サイズを格納 for (byte[] rleRow : rleRows) { outbuf.putShort((short) rleRow.length); } // 行ごとに圧縮後データの格納 for (byte[] rleRow : rleRows) { outbuf.put(rleRow); } outChannelData = outbuf.array(); } else { // RAW (圧縮なし) outChannelData = channelData; } // チャネルID (-1: alpha, 0: red, 1:green, 2:blue) dos.writeShort(channels[channel]); // チャネルのデータサイズ dos.writeInt(2 + outChannelData.length); channelDataMap.put(new LayerChannelPair(layerData, channel), outChannelData); } dos.write("8BIM".getBytes()); dos.write("norm".getBytes()); dos.write((byte) 255); // opacity dos.write((byte) 0); // clipping dos.write((byte) 0); // protection dos.write((byte) 0); // filler byte[] layerMaskData = createLayerMaskData(); byte[] layerBlendingData = createLayerBlendingData(); byte[] layerNameData = createLayerName(layerName); int lenOfAdditional = layerMaskData.length + layerBlendingData.length + layerNameData.length; dos.writeInt(lenOfAdditional); dos.write(layerMaskData); dos.write(layerBlendingData); dos.write(layerNameData); } for (LayerData layerData : layerDatas) { for (int channel = 0; channel < channels.length; channel++) { byte[] outChannelData = channelDataMap.get(new LayerChannelPair(layerData, channel)); assert outChannelData != null; dos.writeShort(useRLECompression ? 1 : 0); // 0:RAW 1:RLE 2..zip dos.write(outChannelData); } } return bos.toByteArray(); } /** * 空のレイヤーマスクデータ作成 * @return * @throws IOException */ private static byte[] createLayerMaskData() throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); dos.writeInt(0); return bos.toByteArray(); } /** * 空のレイヤーブレンダーデータの作成 * @return * @throws IOException */ private static byte[] createLayerBlendingData() throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); dos.writeInt(0); return bos.toByteArray(); } /** * レイヤー名の作成 * @param layerName * @return * @throws IOException */ private static byte[] createLayerName(String layerName) throws IOException { byte[] nameBuf = layerName.getBytes("UTF-8"); int layerNameSize = 1 + nameBuf.length; // PASCAL文字列長 (16の倍数サイズ) int blockSize = (layerNameSize / 4) * 4 + ((layerNameSize % 4 > 0) ? 4 : 0); int paddingSize = blockSize - layerNameSize; ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); dos.write((byte) nameBuf.length); dos.write(nameBuf); dos.write(new byte[paddingSize]); return bos.toByteArray(); } /** * 32ビットARGB形式のBuffeedImageを受け取り、 * ARGBのbyte[][]配列に変換して返す。 * @param img イメージ * @return チャネル別配列 */ private static byte[][] createChannels(BufferedImage img) { WritableRaster raster = img.getRaster(); DataBufferInt buffer = (DataBufferInt) raster.getDataBuffer(); int[] pixels = buffer.getData(); int width = img.getWidth(); int height = img.getHeight(); int mx = width * height; byte[][] channels = new byte[4][mx]; for (int idx = 0; idx < mx; idx++) { int argb = pixels[idx]; int alpha = (argb >> 24) & 0xff; int red = (argb >> 16) & 0xff; int green = (argb >> 8) & 0xff; int blue = argb & 0xff; channels[0][idx] = (byte) alpha; channels[1][idx] = (byte) red; channels[2][idx] = (byte) green; channels[3][idx] = (byte) blue; } return channels; } /** * レイヤーコレクションを重ねて1つの画像にして返す * @param layerDatas レイヤーコレクション * @return 重ね合わせた画像 */ private static BufferedImage createCompositeImage(Collection layerDatas) { int width = 0; int height = 0; for (LayerData layerData : layerDatas) { BufferedImage img = layerData.getImage(); int w = img.getWidth(); int h = img.getHeight(); if (w > width) { width = w; } if (h > height) { height = h; } } BufferedImage cimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = cimg.createGraphics(); try { if (isUseRenderingHints()) { // リンダリングヒントを使う g.setRenderingHint( RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); g.setRenderingHint( RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); g.setRenderingHint( RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); } for (LayerData layerData : layerDatas) { BufferedImage img = layerData.getImage(); int w = img.getWidth(); int h = img.getHeight(); g.drawImage(img, 0, 0, w, h, 0, 0, w, h, null); } } finally { g.dispose(); } return cimg; } /** * ARGB画像をRLE圧縮されたピクチャーセクションデータに変換する * @param img 画像 * @param width 幅、画像とPSDヘッダと一致していること * @param height 高さ、画像とPSDヘッダと一致していること * @return RLE圧縮されたRGBA順チャンネルをつなげたデータ */ private static byte[] createPictureSection(BufferedImage img, int width, int height) { byte[][] channels = createChannels(img); assert width == img.getWidth(); assert height == img.getHeight(); int[] channelMap = { 1, 2, 3, 0 }; // R, G, B, Aにマップ ByteBuffer channelData; if (useRLECompression) { // RLE圧縮とサイズの計算 int bufsiz = 2; List rows = new ArrayList(); for (int channel = 0; channel < channels.length; channel++) { byte[] pixels = channels[channelMap[channel]]; for (int y = 0; y < height; y++) { byte[] row = compressRLE(pixels, y * width, width); rows.add(row); bufsiz += 2 + row.length; // ラインごとのバイト数保存(16bit)とラインデータ分を加算 } } // RLE圧縮済みバッファ作成 channelData = ByteBuffer.allocate(bufsiz); channelData.order(ByteOrder.BIG_ENDIAN); channelData.putShort((short) 1); // RLE圧縮 // 各チャネルの各行ごとのデータ for (byte[] row : rows) { channelData.putShort((short) row.length); } for (byte[] row : rows) { channelData.put(row); } } else { // RAWサイズの計算 int bufsiz = 2; for (int channel = 0; channel < channels.length; channel++) { byte[] pixels = channels[channelMap[channel]]; bufsiz += pixels.length; } // RLE圧縮済みバッファ作成 channelData = ByteBuffer.allocate(bufsiz); channelData.order(ByteOrder.BIG_ENDIAN); channelData.putShort((short) 0); // RAW for (int channel = 0; channel < channels.length; channel++) { byte[] pixels = channels[channelMap[channel]]; channelData.put(pixels); } } return channelData.array(); } /** * バイト配列をRLE圧縮して返す * http://www.snap-tck.com/room03/c02/comp/comp02.html * @param data 圧縮するバイト配列 * @param offset 開始位置 * @param length 長さ * @return RLE圧縮結果 */ public static byte[] compressRLE(byte[] data, int offset, int length) { ByteBuffer outbuf = ByteBuffer.allocate(length * 2); // ワーストケース ByteBuffer buf = ByteBuffer.wrap(data, offset, length); while (buf.hasRemaining()) { int ch = buf.get(); // 不連続数を数える int count = 0; buf.mark(); int prev = ch; while (buf.hasRemaining() && count < 128) { int ch2 = buf.get(); if (prev == ch2) { break; } count++; prev = ch2; if (!buf.hasRemaining() && count < 128) { // 終端に達した場合は終端も不連続数と数える count++; break; } } buf.reset(); if (count > 0) { // 不連続数がある場合 outbuf.put((byte) (count - 1)); outbuf.put((byte) ch); while (--count > 0) { ch = buf.get(); outbuf.put((byte) ch); } } else { // 連続数を数える prev = ch; count = 1; while (buf.hasRemaining() && count < 128) { ch = buf.get(); if (prev != ch) { buf.reset(); break; } count++; buf.mark(); } outbuf.put((byte) (-count + 1)); outbuf.put((byte) prev); } } outbuf.flip(); int limit = outbuf.limit(); byte[] array = outbuf.array(); byte[] result = new byte[limit]; System.arraycopy(array, 0, result, 0, limit); return result; } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/FileImageResource.java0000644000175000017500000000244213615720000027570 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URI; /** * ファイルシステム上にある画像リソースを示す. * @author seraphy */ public class FileImageResource implements ImageResource { /** * ファイル */ private File file; public FileImageResource(File file) { if (file == null) { throw new IllegalArgumentException(); } this.file = file; } public long lastModified() { return file.lastModified(); } public InputStream openStream() throws IOException { return new BufferedInputStream(new FileInputStream(file)); } @Override public int hashCode() { return file.hashCode(); } public int compareTo(ImageResource o) { return getFullName().compareTo(o.getFullName()); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof FileImageResource) { FileImageResource o = (FileImageResource) obj; return file.equals(o.file); } return false; } public String getFullName() { return file.getPath(); } public URI getURI() { return file.toURI(); } @Override public String toString() { return file.toString(); } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/UkagakaImageConverter.java0000644000175000017500000001703613615720000030442 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.awt.Color; import java.awt.image.BufferedImage; import java.awt.image.Raster; import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; /** * 伺か用PNG変換クラス. * @author seraphy */ public class UkagakaImageConverter { /** * ロガー */ private static final Logger logger = Logger.getLogger(UkagakaImageConverter.class.getName()); /** * シングルトン */ private static final UkagakaImageConverter inst = new UkagakaImageConverter(); /** * シングルトンコンストラクタ */ protected UkagakaImageConverter() { super(); } public static UkagakaImageConverter getInstance() { return inst; } /** * 伺か用PNA(アルファチャネルのグレースケール表現)に変換する. * @param img 変換元の透過画像(TYPE_INT_ARGB専用) * @return 伺か用PNA画像(TYPE_INT_RGB, アルファチャネルのグレースケール表現) */ public BufferedImage createUkagakaPNA(BufferedImage img) { if (img == null) { throw new IllegalArgumentException("引数にnullは指定できません。"); } if (img.getType() != BufferedImage.TYPE_INT_ARGB) { throw new IllegalArgumentException("TYPE_INT_ARGB専用です."); } int w = img.getWidth(); int h = img.getHeight(); Raster raster = img.getData(); BufferedImage outimg = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY); // アルファ値をグレースケール表現に変換 int[] argb = null; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { argb = raster.getPixel(x, y, argb); int a = argb[3]; // alpha int o = a << 16 | a << 8 | a; outimg.setRGB(x, y, o); } } return outimg; } /** * 伺か用PNGに変換するための透過色に設定できる色を選択する.
* 該当がない場合(選択できなかった場合)はnullを返す.
* @param img 変換元の透過画像(TYPE_INT_ARGB専用) * @return 伺か用PNG画像(非透過)の透過色キー、該当がない場合はnull */ public Color detectTransparentColorKey(BufferedImage img) { if (img == null) { throw new IllegalArgumentException("引数にnullは指定できません。"); } if (img.getType() != BufferedImage.TYPE_INT_ARGB) { throw new IllegalArgumentException("TYPE_INT_ARGB専用です."); } int w = img.getWidth(); int h = img.getHeight(); Raster raster = img.getData(); // 512色インデックスグループ化 final int colorMx = 512; int[] colorCounts = new int[colorMx]; // ピクセル単位の512色インデックスごとの使用数を計測 int[] argb = new int[4]; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { argb = raster.getPixel(x, y, argb); int a = argb[3]; if (a == 0) { continue; // 完全透過はノーカウント } // 上位3ビットのみ int r = (argb[0] >>> 5) & 0x07; int g = (argb[1] >>> 5) & 0x07; int b = (argb[2] >>> 5) & 0x07; // インデックス生成 int idx = r << 6 | g << 3 | b; colorCounts[idx]++; } } if (logger.isLoggable(Level.FINER)) { logger.log(Level.FINER, "counts=" + Arrays.toString(colorCounts)); } // 色インデックスの色相と選択候補の重み float[] colorHues = new float[colorMx]; float[] hsb = new float[3]; // 候補の重み float[] colorWeights = new float[colorMx]; // 上位3ビットインデックスから8ビットRGB値への変換マップ int[] colorMap = new int[colorMx]; for (int idx = 0; idx < colorMx; idx++) { int r = ((idx >>> 6) & 0x07); int g = ((idx >>> 3) & 0x07); int b = ((idx) & 0x07); r = r << 5 | 0x1f; g = g << 5 | 0x1f; b = b << 5 | 0x1f; hsb = Color.RGBtoHSB(r, g, b, hsb); colorHues[idx] = hsb[0]; colorWeights[idx] = hsb[1]; // 濃さを重みとする. colorMap[idx] = r << 16 | g << 8 | b; } if (logger.isLoggable(Level.FINER)) { logger.log(Level.FINER, "weight=" + Arrays.toString(colorWeights)); } // 色インデックスごとの未使用色相の個数カウント float[] unusedColorScore = new float[colorMx]; float tolerance = 0.0625f; for (int idx = 0; idx < colorMx; idx++) { if (colorCounts[idx] > 0) { // 使用していればスキップ. continue; } // 類似色相のスコア float hue = colorHues[idx]; float score = 0.f; for (int ref = 0; ref < colorMx; ref++) { if (colorCounts[ref] > 0) { // 使用していればスキップ continue; } float refHue = colorHues[ref]; // 色相が等しいものを1、色相がズレるほどに0に近づく float diff = (tolerance - Math.abs(hue - refHue)) / tolerance; if (diff < 0) { // 範囲を超えていればスキップ continue; } score += diff; } // 色による重み付け float weight = colorWeights[idx]; unusedColorScore[idx] = score * weight; } if (logger.isLoggable(Level.FINER)) { logger.log(Level.FINER, "scores=" + Arrays.toString(unusedColorScore)); } // もっとも重いスコアを選択 float maxScore = 0; int maxIdx = -1; for (int idx = 0; idx < colorMx; idx++) { float score = unusedColorScore[idx]; if (score > maxScore) { maxScore = score; maxIdx = idx; } } if (logger.isLoggable(Level.FINER)) { logger.log(Level.FINER, "selectedIdx=" + maxIdx + "/score=" + maxScore); } // 透過用色の取得 if (maxIdx >= 0) { return new Color(colorMap[maxIdx]); } // 候補を見つけられなかった場合. return null; } /** * 伺か用PNGに変換する.
* @param img 変換元の透過画像(TYPE_INT_ARGB専用) * @param transparentColorKey 透過色キー、nullの場合は自動選択 * @return 伺か用PNG画像(TYPE_INT_RGB, 左上に透過色指定あり) */ public BufferedImage createUkagakaPNG(BufferedImage img, Color transparentColorKey) { if (img == null) { throw new IllegalArgumentException("引数にnullは指定できません。"); } if (img.getType() != BufferedImage.TYPE_INT_ARGB) { throw new IllegalArgumentException("TYPE_INT_ARGB専用です."); } // 透過色に設定するカラーキーの取得 if (transparentColorKey == null) { transparentColorKey = detectTransparentColorKey(img); } int transparencyColor; if (transparentColorKey != null) { transparencyColor = transparentColorKey.getRGB() & 0xffffff; } else { // カラーキーの取得がでなければ、黒に限りなく近い非黒を透過色として代替する. logger.log(Level.INFO, "透過色の選択ができなかったため、0x010101で代用します."); transparencyColor = 0x010101; } int w = img.getWidth(); int h = img.getHeight(); Raster raster = img.getData(); // 完全な透過ピクセルに対して算定した透過色を割り当て、 // 画像の左上に透過色を設定する. int argb[] = new int[4]; BufferedImage outimg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { argb = raster.getPixel(x, y, argb); int a = argb[3]; // alpha int c; if (a == 0) { // 完全透過の場合のみ透過色を設定 c = transparencyColor; } else { // それ以外はアルファを無視してRGBのみ int r = argb[0]; int g = argb[1]; int b = argb[2]; c = r << 16 | g << 8 | b; } outimg.setRGB(x, y, c); } // 左上(0,0)に透過とする色を設定 outimg.setRGB(0, 0, transparencyColor); } return outimg; } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/EmbeddedImageResource.java0000644000175000017500000000451213615720000030402 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.util.ResourceLoader; /** * クラスローダからリソースを読み込むイメージリソース.
* @author seraphy */ public class EmbeddedImageResource implements ImageResource { /** * ロガー */ private static final Logger logger = Logger.getLogger(EmbeddedImageResource.class.getName()); /** * クラスパス上からのリソースローダー */ private final ResourceLoader resourceLoader = new ResourceLoader(ResourceLoader.getDefaultClassLoader()); /** * ファイル */ private String resourceName; public EmbeddedImageResource(String resourceName) { if (resourceName == null) { throw new IllegalArgumentException(); } this.resourceName = resourceName; } @Override public int compareTo(ImageResource o) { return getFullName().compareTo(o.getFullName()); } @Override public int hashCode() { return getFullName().hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof ImageResource) { ImageResource o = (ImageResource) obj; return getFullName().equals(o.getFullName()); } return false; } @Override public String getFullName() { return resourceName; } @Override public URI getURI() { URL url = getResource(resourceName); if (url != null) { try { return url.toURI(); } catch(URISyntaxException ex) { logger.log(Level.WARNING, "resource name is invalid. " + resourceName, ex); // 何もしない. } } return null; } /** * リソースが実在すれば日付は常に1を返す.
* リソースが存在しなければ0を返す.
*/ @Override public long lastModified() { URL url = getResource(resourceName); if (url == null) { return 1; } return 0; } @Override public InputStream openStream() throws IOException { URL url = getResource(resourceName); if (url == null) { return null; } return url.openStream(); } @Override public String toString() { return getFullName(); } private URL getResource(String resourceName) { return resourceLoader.getResource(resourceName); } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/UkagakaImageSaveHelper.java0000644000175000017500000002603613615720000030531 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.awt.Color; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.event.IIOWriteWarningListener; import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageOutputStream; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.filechooser.FileFilter; import charactermanaj.ui.UkagakaConvertDialog; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * 伺か用PNG/PNA出力ヘルパ. * @author seraphy * */ public class UkagakaImageSaveHelper { /** * ロガー */ private static final Logger logger = Logger.getLogger(UkagakaImageSaveHelper.class.getName()); /** * リソース */ protected static final String STRINGS_RESOURCE = "languages/ukagakaImageSaveHelper"; /** * PNGファイルフィルタ */ protected static final FileFilter pngFilter = new FileFilter() { @Override public boolean accept(File f) { return f.isDirectory() || f.getName().endsWith(".png"); } @Override public String getDescription() { return "PNG(*.png)"; } }; /** * 最後に開いたディレクトリ.
* まだ使用していなければnull.
*/ protected File lastUseOpenDir; /** * 最後に保存したディレクトリ.
* まだ使用していなければnull.
*/ protected File lastUseSaveDir; /** * 最後に保存したファイル名 */ protected String lastUseSaveName = "surface"; /** * 最後に使用した透過色キー.
* まだ使用していなければnull.
*/ protected Color transparentColorKey; /** * 最後に使用した透過色キーモード. */ protected boolean autoTransparentColor = true; /** * コンストラクタ */ public UkagakaImageSaveHelper() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); lastUseSaveName = strings.getProperty("default.lastUseSaveName"); } protected JFileChooser createFileChooser(final boolean save) { JFileChooser fileChooser = new JFileChooser() { private static final long serialVersionUID = 1L; @Override public void approveSelection() { File outFile = getSelectedFile(); if (outFile == null) { return; } String lcName = outFile.getName().toLowerCase(); FileFilter selfilter = getFileFilter(); if (selfilter == pngFilter) { if (!lcName.endsWith(".png")) { outFile = new File(outFile.getPath() + ".png"); setSelectedFile(outFile); } } if (save && outFile.exists()) { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirmOverwrite"), strings.getProperty("confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION) { return; } } super.approveSelection(); } }; if (lastUseSaveDir != null) { fileChooser.setCurrentDirectory(lastUseSaveDir); } fileChooser.setFileFilter(pngFilter); if ( !save) { fileChooser.setAcceptAllFileFilterUsed(false); } fileChooser.addChoosableFileFilter(pngFilter); return fileChooser; } /** * 透過画像(TYPE_INT_ARGB)から、伺か用のPNG/PNAファイルに出力する. * @param parent 親フレーム * @param img 対象イメージ * @param colorKey マニュアル指定時の候補(前回のものを優先) * @throws IOException 出力に失敗した場合 */ public void save(JFrame parent, BufferedImage img, Color colorKey) throws IOException { final UkagakaConvertDialog dlg = new UkagakaConvertDialog(parent); if (!autoTransparentColor && transparentColorKey != null) { // 前回マニュアル透過色キー指定であれば、それを使う. colorKey = transparentColorKey; } dlg.setExportImage(img, colorKey); dlg.setAutoTransparentColor(autoTransparentColor); dlg.setSaveActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser fileChooser = createFileChooser(true); fileChooser.setSelectedFile(new File(lastUseSaveDir, lastUseSaveName)); int ret = fileChooser.showSaveDialog(dlg); if (ret != JFileChooser.APPROVE_OPTION) { return; } // 結果 dlg.setResult(fileChooser.getSelectedFile()); dlg.dispose(); } }); dlg.setVisible(true); File selectedFile = (File) dlg.getResult(); if (selectedFile == null) { return; } lastUseSaveName = selectedFile.getName(); lastUseSaveDir = selectedFile.getParentFile(); File pngFile = selectedFile; File pnaFile = makePNAFileName(pngFile); File[] outfiles = {pngFile, pnaFile}; BufferedImage[] outimages = { dlg.getOpaqueImage(), dlg.getAlphaImage() }; savePNGImages(outfiles, outimages); } /** * 複数のファイルとイメージを指定して書き込みます.
* ファイルとイメージの個数は一致していなければなりません.
* 同じ添え字のファイルに対して、その添え字のイメージが出力されます.
* いずれかで失敗した場合、その時点で処理は打ち切られて例外が返されます.
* (すでに出力されたファイル、もしくは書き込み中のファイルは放置されます.)
* @param outfiles ファイルの配列 * @param outimages イメージの配列 * @throws IOException 失敗 */ protected void savePNGImages(File[] outfiles, BufferedImage[] outimages) throws IOException { if (outfiles == null || outimages == null) { throw new IllegalArgumentException("引数にnullは指定でまきせん。"); } if (outfiles.length != outimages.length) { throw new IllegalArgumentException("ファイルおよびイメージの個数は一致していなければなりません."); } ImageWriter iw = ImageIO.getImageWritersByFormatName("png").next(); try { iw.addIIOWriteWarningListener(new IIOWriteWarningListener() { public void warningOccurred(ImageWriter source, int imageIndex, String warning) { logger.log(Level.WARNING, warning); } }); for (int idx = 0; idx < outfiles.length; idx++) { File outfile = outfiles[idx]; BufferedImage outimage = outimages[idx]; BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(outfile)); try { ImageWriteParam iwp = iw.getDefaultWriteParam(); IIOImage ioimg = new IIOImage(outimage, null, null); ImageOutputStream imgstm = ImageIO.createImageOutputStream(bos); try { iw.setOutput(imgstm); iw.write(null, ioimg, iwp); } finally { imgstm.close(); } } finally { bos.close(); } } } finally { iw.dispose(); } } /** * 複数ファイルを指定して既存のファイルから伺かPNG/PNAに変換して出力する.(ユーテリティ) * @param parent 親フレーム * @param colorKey 透過色キー(候補) * @throws IOException 失敗 */ public void convertChooseFiles(JFrame parent, Color colorKey) throws IOException { JFileChooser fileChooser = createFileChooser(false); fileChooser.setCurrentDirectory(lastUseOpenDir); fileChooser.setMultiSelectionEnabled(true); int ret = fileChooser.showOpenDialog(parent); if (ret != JFileChooser.APPROVE_OPTION) { return; } // 選択したディレクトリを記憶する. File[] files = fileChooser.getSelectedFiles(); if (files == null || files.length == 0) { return; } lastUseOpenDir = files[0].getParentFile(); final UkagakaConvertDialog dlg = new UkagakaConvertDialog(parent, null, true); if (!autoTransparentColor && transparentColorKey != null) { // 前回マニュアル透過色キー指定であれば、それを使う. colorKey = transparentColorKey; } dlg.setAutoTransparentColor(autoTransparentColor); ImageReader ir = ImageIO.getImageReadersByFormatName("png").next(); try { for (final File file : files) { String fname = file.getName(); ImageReadParam param = ir.getDefaultReadParam(); BufferedImage img; ImageInputStream iis = ImageIO.createImageInputStream(file); try { ir.setInput(iis); img = ir.read(0, param); } finally { iis.close(); } img = convertIntARGB(img); dlg.setCaption(fname); dlg.setExportImage(img, colorKey); dlg.setSaveActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if ( !dlg.isOverwriteOriginalFile()) { JFileChooser fileChooser = createFileChooser(true); fileChooser.setCurrentDirectory(file.getParentFile()); fileChooser.setSelectedFile(file); int ret = fileChooser.showSaveDialog(dlg); if (ret != JFileChooser.APPROVE_OPTION) { return; } // 選択結果 dlg.setResult(fileChooser.getSelectedFile()); } else { // ソースと同じ (上書き) dlg.setResult(file); } dlg.dispose(); } }); dlg.setVisible(true); File selectedFile = (File) dlg.getResult(); if (selectedFile == null) { // キャンセルされた場合 break; } File pngFile = selectedFile; File pnaFile = makePNAFileName(pngFile); File[] outfiles = {pngFile, pnaFile}; BufferedImage[] outimages = { dlg.getOpaqueImage(), dlg.getAlphaImage() }; savePNGImages(outfiles, outimages); } } finally { ir.dispose(); } } /** * BufferedImageをINT_TYPE_ARGBに設定する.
* @param img イメージ * @return 形式をINT_ARGBに変換されたイメージ */ protected BufferedImage convertIntARGB(BufferedImage img) { if (img == null || img.getType() == BufferedImage.TYPE_INT_ARGB) { // nullであるか、変換不要であれば、そのまま返す. return img; } int w = img.getWidth(); int h = img.getHeight(); BufferedImage dst = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g = dst.createGraphics(); try { g.drawImage(img, 0, 0, w, h, 0, 0, w, h, null); } finally { g.dispose(); } return dst; } /** * 拡張子をPNAに変換して返す. * @param pngFile PNGファイル名 * @return PNAファイル名 */ protected File makePNAFileName(File pngFile) { if (pngFile == null) { return null; } String fname = pngFile.getName(); int extpos = fname.lastIndexOf('.'); if (extpos >= 0) { fname = fname.substring(0, extpos); } fname += ".pna"; return new File(pngFile.getParent(), fname); } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/ImageResource.java0000644000175000017500000000203113615720000026762 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.io.IOException; import java.io.InputStream; import java.net.URI; /** * 画像リソース * @author seraphy */ public interface ImageResource extends Comparable { /** * 画像リソースをストリームで取得します. * @return 入力ストリーム * @throws IOException 開けなかった場合 */ InputStream openStream() throws IOException; /** * 更新日時 * @return 更新日時を示すエポックタイム */ long lastModified(); /** * 同値用ハッシュ * @return ハッシュ */ int hashCode(); /** * 同値判定 * @param obj 比較対象 * @return 同一であればtrue */ boolean equals(Object obj); /** * ソート用比較 */ int compareTo(ImageResource o); /** * リソース位置を示すフルネーム * @return リソース位置を示すフルネーム */ String getFullName(); /** * リソース位置を示すURI * @return リソース位置を示すURI */ URI getURI(); } CharacterManaJ/src/main/java/charactermanaj/graphics/io/ImageCachedLoader.java0000644000175000017500000000420313615720000027474 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.io.Closeable; import java.io.IOException; /** * 一度読み込んだ画像をキャッシュする画像ローダ.
* すでに読み込まれており、ファイルの更新日に変更がなければ読み込み済みの画像をかえす.
* @author seraphy */ public class ImageCachedLoader extends ImageLoaderImpl implements Closeable { /** * リソースに対するイメージキャッシュ.
* リソースは複数のプロファイルで共有しえるのでstaticとしている。 */ private static ImageCache caches = new ImageCache(); @Override public LoadedImage load(ImageResource imageResource) throws IOException { if (imageResource == null) { throw new IllegalArgumentException(); } ImageResourceCacheKey key = new ImageResourceCacheKey(imageResource); synchronized (caches) { LoadedImage loadedImage = caches.get(key); if (loadedImage != null) { long lastModified = loadedImage.getLastModified(); if (lastModified != imageResource.lastModified()) { // キャッシュされているが、すでに古い場合は破棄する. loadedImage = null; } } if (loadedImage == null) { loadedImage = super.load(imageResource); caches.set(key, loadedImage); caches.unlockImages(); // 即時解放許可 } return loadedImage; } } public void close() { caches.clear(); } } final class ImageResourceCacheKey { private final ImageResource imageResource; private final int hashCode; public ImageResourceCacheKey(ImageResource imageResource) { if (imageResource == null) { throw new IllegalArgumentException(); } this.imageResource = imageResource; this.hashCode = imageResource.hashCode(); } @Override public int hashCode() { return this.hashCode; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof ImageResourceCacheKey) { ImageResourceCacheKey other = (ImageResourceCacheKey) obj; return imageResource.equals(other.imageResource); } return false; } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/PNGFileImageHeader.java0000644000175000017500000000571113615720000027540 0ustar paulliupaulliupackage charactermanaj.graphics.io; /** * PNGヘッダ情報.
* http://en.wikipedia.org/wiki/Portable_Network_Graphics#cite_note-4 , * http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html#C.IHDR あたりを参照.
* @author seraphy */ public class PNGFileImageHeader { private int width; // 4bytes private int height; // 4bytes private int bitDepth; // 1byte private int colorType; // 1byte private int compressionMethod; // 1byte private int filterMethod; // 1byte private int interlaceMethod; // 1byte private boolean transparencyInformation; public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public int getBitDepth() { return bitDepth; } public void setBitDepth(int bitDepth) { this.bitDepth = bitDepth; } /** * カラータイプを取得する.
* Bit0がインデックス or グレースケール、Bit1がカラー、Bit2がアルファ.
* その組み合わせで8通りあるが、1、5、7はサポート外となる.
*
    *
  • 0: greyscale
  • *
  • 2: Truecolor (Color)
  • *
  • 3: Indexed (Color | Palette)
  • *
  • 4: greyscale alpha (Alpha)
  • *
  • 6: Alpha Color (Color | Alpha) (CharacterManaJでは、これを想定する.)
  • *
* @return */ public int getColorType() { return colorType; } public void setColorType(int colorType) { this.colorType = colorType; } public int getCompressionMethod() { return compressionMethod; } public void setCompressionMethod(int compressionMethod) { this.compressionMethod = compressionMethod; } public int getFilterMethod() { return filterMethod; } public void setFilterMethod(int filterMethod) { this.filterMethod = filterMethod; } public int getInterlaceMethod() { return interlaceMethod; } public void setInterlaceMethod(int interlaceMethod) { this.interlaceMethod = interlaceMethod; } public void setTransparencyInformation(boolean hasTransparencyInformation) { this.transparencyInformation = hasTransparencyInformation; } /** * 透過情報があるか?
* ColorTypeが3(Indexed Color), 2(TrueColor)で、透過情報がある場合は、透過情報つきカラーである.
* そうでなければ透過なしカラーである.
* @return */ public boolean hasTransparencyInformation() { return transparencyInformation; } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append("PNG(widht:" + width + ", height:" + height); buf.append(", bitDepth:" + bitDepth + ", colorType: " + colorType); buf.append(", hasTransparency: " + transparencyInformation); buf.append(", compressionMethod:" + compressionMethod); buf.append(", filterMethod:" + filterMethod); buf.append(", interlaceMethod:" + interlaceMethod); buf.append(")"); return buf.toString(); } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/ImageCache.java0000644000175000017500000001045313615720000026205 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.awt.image.BufferedImage; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; /** * 画像のキャッシュ.
* キャッシュは自動的にガベージコレクタにより回収されます.
* ただし、{@link #unlockImages()}が呼び出されるまで、{@link #set(Object, BufferedImage)}されたイメージは * ガベージコレクトの対象にはなりません。 * @author seraphy * * @param */ public class ImageCache { private static final Logger logger = Logger.getLogger(ImageCache.class.getName()); private static final ImageCacheMBeanImpl imageCacheMBean = ImageCacheMBeanImpl.getSingleton(); private HashMap> lockedImages = new HashMap>(); private ReferenceQueue queue = new ReferenceQueue(); private HashMap> caches = new HashMap>(); public ImageCache() { imageCacheMBean.incrementInstance(); } @Override protected void finalize() throws Throwable { clear(); imageCacheMBean.decrementInstance(); super.finalize(); } public LoadedImage get(K key) { if (key == null) { return null; } synchronized (caches) { BufferedImageWithKeyReference ref = caches.get(key); LoadedImage img = null; if (ref != null) { img = ref.get(); } imageCacheMBean.incrementReadCount(img != null); sweep(); return img; } } public void set(K key, LoadedImage img) { if (key == null) { return; } synchronized (caches) { // 現在キャッシュされているものがあれば、いったん解放する. BufferedImageWithKeyReference ref = caches.get(key); if (ref != null) { ref.enqueue(); } if (img == null) { if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "remove cache: " + key); } caches.remove(key); } else { BufferedImageWithKeyReference cacheData = new BufferedImageWithKeyReference(key, img, queue); lockedImages.put(key, cacheData); caches.put(key, cacheData); imageCacheMBean.cacheIn(cacheData.getImageSize()); } // 解放済みのアイテムエントリを除去する. sweep(); } } public void unlockImages() { synchronized (caches) { lockedImages.clear(); sweep(); } } /** * すべてのエントリをキャッシュアウトしてクリアする. */ public void clear() { synchronized (caches) { lockedImages.clear(); for (BufferedImageWithKeyReference ref : caches.values()) { ref.enqueue(); } sweep(); caches.clear(); } } public void sweep() { synchronized (caches) { // ガベージコレクト済みアイテムを除去する Reference ref = null; boolean removed = false; while ((ref = queue.poll()) != null) { @SuppressWarnings("unchecked") BufferedImageWithKeyReference r = (BufferedImageWithKeyReference) ref; K key = r.getKey(); if (key != null) { if (caches.get(key).get() == null) { if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "removed cache: " + key); } removed = true; caches.remove(key); } } int imageSize = r.getImageSize(); imageCacheMBean.cacheOut(imageSize); } if (removed) { if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "cache[" + Integer.toHexString(this.hashCode()) + "] size:" + caches.size()); } } } } } /** * キー情報つきSoftReference * @author seraphy * * @param キー */ class BufferedImageWithKeyReference extends SoftReference { private final K key; private final int imageSize; public BufferedImageWithKeyReference(K key, LoadedImage img, ReferenceQueue queue) { super(img, queue); this.key = key; this.imageSize = (img == null) ? 0 : img.getImageSize(); } public K getKey() { return key; } public int getImageSize() { return imageSize; } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/ImageCacheMBeanImpl.java0000644000175000017500000000576613615720000027745 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.lang.management.ManagementFactory; import javax.management.JMException; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.StandardMBean; public final class ImageCacheMBeanImpl implements ImageCacheMBean { private static ImageCacheMBeanImpl singleton = new ImageCacheMBeanImpl(); private ImageCacheMBeanImpl() { super(); } public static ImageCacheMBeanImpl getSingleton() { return singleton; } public static void setupMBean() throws JMException { MBeanServer srv = ManagementFactory.getPlatformMBeanServer(); srv.registerMBean( new StandardMBean(singleton, ImageCacheMBean.class), new ObjectName("CharacterManaJ:type=ImageCache,name=Singleton")); } private long readCount; private long cacheHitCount; private long totalBytes; private long maxBytes; private int totalCount; private int instanceCount; public synchronized long getReadCount() { return readCount; } public synchronized void setReadCount(long readCount) { this.readCount = readCount; } public synchronized long getCacheHitCount() { return cacheHitCount; } public synchronized void setCacheHitCount(long cacheHitCount) { this.cacheHitCount = cacheHitCount; } public synchronized long getTotalBytes() { return totalBytes; } public synchronized void setTotalBytes(long totalBytes) { this.totalBytes = totalBytes; } public synchronized long getMaxBytes() { return maxBytes; } public synchronized void setMaxBytes(long maxBytes) { this.maxBytes = maxBytes; } public synchronized void incrementReadCount(boolean cacheHit) { readCount++; if (cacheHit) { cacheHitCount++; } } public synchronized void cacheIn(long bytes) { totalCount++; totalBytes += bytes; if (totalBytes > maxBytes) { maxBytes = totalBytes; } } public synchronized void cacheOut(long bytes) { totalCount--; totalBytes -= bytes; } public synchronized int getTotalCount() { return totalCount; } public synchronized int getInstanceCount() { return instanceCount; } public synchronized void incrementInstance() { instanceCount++; } public synchronized void decrementInstance() { instanceCount--; } public synchronized void reset() { cacheHitCount = 0; readCount = 0; totalCount = 0; totalBytes = 0; maxBytes = 0; } @Override public String toString() { synchronized (this) { StringBuilder buf = new StringBuilder(); buf.append("imageCacheMBean "); buf.append(cacheHitCount); buf.append("/"); buf.append(readCount); return buf.toString(); } } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/LoadedImage.java0000644000175000017500000000203413615720000026366 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; /** * ロードされたイメージ情報 * @author seraphy */ public final class LoadedImage { private final BufferedImage image; private final long lastModified; private final int imageSize; public LoadedImage(BufferedImage image, long lastModified) { this.image = image; this.lastModified = lastModified; this.imageSize = getBufferSize(image); } public BufferedImage getImage() { return image; } public long getLastModified() { return lastModified; } public int getImageSize() { return imageSize; } /** * 画像バッファのバイト数を求める.
* @param image イメージ * @return バイト数 */ private static int getBufferSize(BufferedImage image) { if (image == null) { return 0; } DataBuffer buff = image.getRaster().getDataBuffer(); int bytes = buff.getSize() * DataBuffer.getDataTypeSize(buff.getDataType()) / 8; return bytes; } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/ImageSaveHelper.java0000644000175000017500000006270613615720000027250 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.event.IIOWriteWarningListener; import javax.imageio.stream.ImageOutputStream; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.filechooser.FileFilter; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; import charactermanaj.graphics.io.OutputOption.PictureMode; import charactermanaj.graphics.io.OutputOption.ZoomRenderingType; import charactermanaj.model.AppConfig; import charactermanaj.model.Layer; import charactermanaj.util.LocalizedMessageComboBoxRender; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * イメージを保存するためのヘルパークラス.
*/ public class ImageSaveHelper { /** * ロガー */ private static final Logger logger = Logger.getLogger(ImageSaveHelper.class.getName()); /** * リソース */ protected static final String STRINGS_RESOURCE = "languages/imageSaveHelper"; /** * このヘルパクラス用のファイルフィルタの抽象実装 * @author seraphy */ protected static abstract class ImageSaveHelperFilter extends FileFilter { @Override public boolean accept(File f) { if (f.isDirectory()) { // ディレクトリは選択可 return true; } return isSupported(f); } protected boolean isSupported(File f) { // サポートしている拡張子のいずれかにマッチするか? // (大文字・小文字は区別しない.) String lcName = f.getName().toLowerCase(); for (String ext : getSupprotedExtension()) { if (lcName.endsWith("." + ext.toLowerCase())) { return true; } } return false; } /** * 現在の選択されたファイル名を取得し、そのファイル名がデフォルトの拡張子で終端していなければ * デフォルトの拡張子を設定してファイルチューザに設定し直す.
* @param fileChooser ファイルチューザ * @return デフォルトの拡張子で終端されたファイル */ public File supplyDefaultExtension(JFileChooser fileChooser) { File outFile = fileChooser.getSelectedFile(); if (outFile == null) { return null; } if ( !isSupported(outFile)) { String extName = "." + getSupprotedExtension()[0]; outFile = new File(outFile.getPath() + extName); fileChooser.setSelectedFile(outFile); } return outFile; } /** * サポートするファイルの拡張子を取得する.
* 最初のものがデフォルトの拡張子として用いられる.
* @return ファイルの拡張子 */ protected abstract String[] getSupprotedExtension(); } /** * PNGファイルフィルタ */ protected static final FileFilter pngFilter = new ImageSaveHelperFilter() { @Override public String getDescription() { return "PNG(*.png)"; } @Override protected String[] getSupprotedExtension() { return new String[] {"png"}; } }; /** * JPEGファイルフィルタ */ protected static final FileFilter jpegFilter = new ImageSaveHelperFilter() { @Override public String getDescription() { return "JPEG(*.jpg;*.jpeg)"; } @Override protected String[] getSupprotedExtension() { return new String[] {"jpeg", "jpg"}; } }; /** * BMPファイルフィルタ */ protected static final FileFilter bmpFilter = new ImageSaveHelperFilter() { @Override public String getDescription() { return "Bitmap(*.bmp)"; } @Override protected String[] getSupprotedExtension() { return new String[] {"bmp"}; } }; /** * ZIPファイルフィルタ */ protected static final FileFilter zipFilter = new ImageSaveHelperFilter() { @Override public String getDescription() { return "Zip Archive(*.zip)"; } @Override protected String[] getSupprotedExtension() { return new String[] {"zip"}; } }; /** * PSDファイルフィルタ */ protected static final FileFilter psdFilter = new ImageSaveHelperFilter() { @Override public String getDescription() { return "Adobe Photoshop(*.psd)"; } @Override protected String[] getSupprotedExtension() { return new String[] {"psd"}; } }; /** * このヘルパクラスで定義されているファイルフィルタのリスト */ protected static final List fileFilters = Arrays.asList( pngFilter, jpegFilter, bmpFilter, psdFilter, zipFilter); /** * イメージビルダファクトリ */ protected OutputImageBuilderFactory imageBuilderFactory; /** * 最後に使用した出力オプション.
* 未使用であれば規定値.
*/ protected OutputOption outputOption; /** * 最後に使用したディレクトリ */ protected File lastUseSaveDir; /** * 最後に使用したフィルタ */ protected FileFilter lastUseFilter = pngFilter; /** * 最後に使用したディレクトリを設定する * @param lastUseSaveDir 最後に使用したディレクトリ、設定しない場合はnull */ public void setLastUseSaveDir(File lastUseSaveDir) { this.lastUseSaveDir = lastUseSaveDir; } /** * 最後に使用したディレクトリを取得する * @return 最後に使用したディレクトリ、なければnull */ public File getLastUsedSaveDir() { return lastUseSaveDir; } /** * コンストラクタ */ public ImageSaveHelper() { imageBuilderFactory = new OutputImageBuilderFactory(); outputOption = imageBuilderFactory.createDefaultOutputOption(); } /** * 画像ファイルの保存用ダイアログを表示する. * @param parent 親ウィンドウ * @return ファイル名 */ public File showSaveFileDialog(Component parent) { // 最後に使用したディレクトリを指定してファイルダイアログを構築する. JFileChooser fileChooser = new JFileChooser(lastUseSaveDir) { private static final long serialVersionUID = -9091369410030011886L; /** * OKボタン押下時の処理. */ @Override public void approveSelection() { File outFile = getSelectedFile(); if (outFile == null) { return; } // 選択したファイルフィルタに従ってデフォルトの拡張子を付与する. FileFilter selfilter = getFileFilter(); if (selfilter instanceof ImageSaveHelperFilter) { outFile = ((ImageSaveHelperFilter) selfilter).supplyDefaultExtension(this); } // ファイルが存在すれば上書き確認する. if (outFile.exists()) { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirmOverwrite"), strings.getProperty("confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION) { return; } } super.approveSelection(); } }; // // アクセサリパネルの追加˙ // final OutputOptionPanel accessoryPanel = new OutputOptionPanel(this.outputOption); // fileChooser.setAccessory(accessoryPanel); // ファイルフィルタ設定 fileChooser.setAcceptAllFileFilterUsed(false); for (FileFilter fileFilter : fileFilters) { fileChooser.addChoosableFileFilter(fileFilter); } // 最後に使用したファイルフィルタが既定のフィルタでないか未設定であればPNGにする. if (lastUseFilter == null || !fileFilters.contains(lastUseFilter)) { lastUseFilter = pngFilter; } // 最後に使用したフィルタをデフォルトのフィルタに設定する. fileChooser.setFileFilter(lastUseFilter); // ファイルダイアログを開く. int ret = fileChooser.showSaveDialog(parent); if (ret != JFileChooser.APPROVE_OPTION) { return null; } // // 出力オプションの保存 // OutputOption outputOption = accessoryPanel.getOutputOption(); // this.outputOption = outputOption; // 最後に使用したフィルタ、および選択したディレクトリを記憶する. File outFile = fileChooser.getSelectedFile(); lastUseSaveDir = outFile.getParentFile(); lastUseFilter = fileChooser.getFileFilter(); // 選択したファイルを返す. return outFile; } public OutputOption getOutputOption() { return outputOption.clone(); } public void setOutputOption(OutputOption outputOption) { if (outputOption == null) { throw new IllegalArgumentException(); } this.outputOption = outputOption.clone(); } /** * ファイルから拡張子を取得する。 * @param outFile ファイル名 * @return 拡張子 * @throws IOException 拡張子がない場合 */ public String getFileExtension(File outFile) throws IOException { // ファイル名から拡張子を取り出します. String fname = outFile.getName(); int extpos = fname.lastIndexOf("."); if (extpos < 0) { throw new IOException("missing file extension."); } return fname.substring(extpos + 1).toLowerCase(); } /** * ファイル名を指定してイメージをファイルに出力します.
* 出力形式は拡張子より判定します.
* サポートされていない拡張子の場合はIOException例外が発生します.
* @param img イメージ * @param imgBgColor JPEGの場合の背景色 * @param outFile 出力先ファイル(拡張子が必須) * @param warnings 警告を記録するバッファ、必要なければnull * @throws IOException 失敗 */ public void savePicture(BufferedImage img, Color imgBgColor, File outFile, final StringBuilder warnings) throws IOException { if (img == null || outFile == null) { throw new IllegalArgumentException(); } String ext = getFileExtension(outFile); // 拡張子に対するImageIOのライタを取得します. Iterator ite = ImageIO.getImageWritersBySuffix(ext); if (!ite.hasNext()) { throw new IOException("unsupported file extension: " + ext); } ImageWriter iw = ite.next(); // ライタを使いイメージを書き込みます. savePicture(img, imgBgColor, iw, outFile, warnings); } /** * イメージをMIMEで指定された形式で出力します. * @param img イメージ * @param imgBgColor JPEGの場合の背景色 * @param outstm 出力先 * @param mime MIME * @param warnings 警告を書き込むバッファ、必要なければnull * @throws IOException 例外 */ public void savePicture(BufferedImage img, Color imgBgColor, OutputStream outstm, String mime, final StringBuilder warnings) throws IOException { if (img == null || outstm == null || mime == null) { throw new IllegalArgumentException(); } // mimeがパラメータ付きの場合は、パラメータを除去する. int pt = mime.indexOf(';'); if (pt >= 0) { mime = mime.substring(0, pt).trim(); } // サポートしているmimeタイプを検出. Iterator ite = ImageIO.getImageWritersByMIMEType(mime); if (!ite.hasNext()) { throw new IOException("unsupported mime: " + mime); } ImageWriter iw = ite.next(); savePicture(img, imgBgColor, iw, outstm, warnings); outstm.flush(); } protected void savePicture(BufferedImage img, Color imgBgColor, ImageWriter iw, Object output, final StringBuilder warnings) throws IOException { try { iw.addIIOWriteWarningListener(new IIOWriteWarningListener() { public void warningOccurred(ImageWriter source, int imageIndex, String warning) { if (warnings.length() > 0) { warnings.append(System.getProperty("line.separator")); } if (warnings != null) { warnings.append(warning); } logger.log(Level.WARNING, warning); } }); boolean jpeg = false; boolean bmp = false; for (String mime : iw.getOriginatingProvider().getMIMETypes()) { if (mime.contains("image/jpeg") || mime.contains("image/jpg")) { jpeg = true; break; } if (mime.contains("image/bmp") || mime.contains("image/x-bmp") || mime.contains("image/x-windows-bmp")) { bmp = true; break; } } ImageWriteParam iwp = iw.getDefaultWriteParam(); IIOImage ioimg; if (jpeg) { iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); iwp.setCompressionQuality((float) outputOption.getJpegQuality()); // JPEGは透過色をサポートしていないので背景色を設定する. ioimg = new IIOImage(createJpegFormatPicture(img, imgBgColor), null, null); } else if (bmp) { // BMPは透過色をサポートしていないので背景色を設定する. ioimg = new IIOImage(createBMPFormatPicture(img, imgBgColor), null, null); } else if (outputOption.isForceBgColor()) { // 背景色強制 // JPEG, BMP以外(PNGを想定) ioimg = new IIOImage(createOpaquePNGFormatPicture(img, imgBgColor), null, null); } else { // 透過有効のまま // JPEG, BMP以外(PNGを想定) ioimg = new IIOImage(img, null, null); } ImageOutputStream imgstm = ImageIO.createImageOutputStream(output); try { iw.setOutput(imgstm); iw.write(null, ioimg, iwp); } finally { imgstm.close(); } } finally { iw.dispose(); } } /** * ARGB形式から、アルファチャンネルを削除し、かわりに背景色を設定したBGR形式画像を返します.
* JPEG画像として用いることを想定しています.
* @param img 変換するイメージ * @param imgBgColor 背景色 * @return 変換されたイメージ */ public BufferedImage createJpegFormatPicture(BufferedImage img, Color imgBgColor) { if (imgBgColor == null) { imgBgColor = Color.WHITE; } return createFormatPicture(img, imgBgColor, BufferedImage.TYPE_INT_BGR); } /** * ARGB形式から、アルファチャンネルを削除し、かわりに背景色を設定したBGR形式画像を返します.
* BMP画像として用いることを想定しています.
* @param img 変換するイメージ * @param imgBgColor 背景色 * @return 変換されたイメージ */ public BufferedImage createBMPFormatPicture(BufferedImage img, Color imgBgColor) { if (imgBgColor == null) { imgBgColor = Color.WHITE; } return createFormatPicture(img, imgBgColor, BufferedImage.TYPE_3BYTE_BGR); } /** * ARGB形式から、アルファチャンネルを削除し、かわりに背景色を設定したRGB形式画像を返します.
* 背景付きPNG画像として用いることを想定しています.
* @param img 変換するイメージ * @param imgBgColor 背景色 * @return 変換されたイメージ */ public BufferedImage createOpaquePNGFormatPicture(BufferedImage img, Color imgBgColor) { if (imgBgColor == null) { imgBgColor = Color.WHITE; } return createFormatPicture(img, imgBgColor, BufferedImage.TYPE_INT_ARGB); } /** * ARGB形式から、アルファチャンネルを削除し、かわりに背景色を設定したBGR形式画像を返します.
* JPEG画像として用いることを想定しています.
* @param img 変換するイメージ * @param imgBgColor 背景色 * @return 変換されたイメージ */ protected BufferedImage createFormatPicture(BufferedImage img, Color imgBgColor, int type) { if (img == null) { throw new IllegalArgumentException(); } int w = img.getWidth(); int h = img.getHeight(); BufferedImage tmpImg = new BufferedImage(w, h, type); Graphics2D g = tmpImg.createGraphics(); try { g.setRenderingHint( RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); if (imgBgColor != null) { g.setColor(imgBgColor); g.fillRect(0, 0, w, h); } g.drawImage(img, 0, 0, w, h, 0, 0, w, h, null); } finally { g.dispose(); } return tmpImg; } public static class LayerImage { private String partsName; private Layer layer; private BufferedImage image; public LayerImage(String partsName, Layer layer, BufferedImage image) { super(); this.partsName = partsName; this.layer = layer; this.image = image; } public String getPartsName() { return partsName; } public Layer getLayer() { return layer; } public BufferedImage getImage() { return image; } @Override public String toString() { return "(partsName=" + partsName + ", layer=" + layer + ")"; } } /** * zipにレイヤーごとの画像とプレビュー画像をまとめて保存する * @param outFile * @param layerImages * @param compositeImg * @throws IOException */ public void saveToZip(File outFile, Collection layerImages, BufferedImage compositeImg) throws IOException { AppConfig appConfig = AppConfig.getInstance(); String zipNameEncoding = appConfig.getZipNameEncoding(); ZipOutputStream zos = new ZipOutputStream(outFile); try { zos.setEncoding(zipNameEncoding); if (layerImages != null) { for (LayerImage layerImage : layerImages) { String partsName = layerImage.getPartsName(); Layer layer = layerImage.getLayer(); String dir = layer.getDir(); String fname = dir + "/" + partsName + ".png"; ZipEntry zipEntry = new ZipEntry(fname); zos.putNextEntry(zipEntry); ImageIO.write(layerImage.getImage(), "png", zos); zos.closeEntry(); } } if (compositeImg != null) { ZipEntry zipEntry = new ZipEntry("preview.png"); zos.putNextEntry(zipEntry); ImageIO.write(compositeImg, "png", zos); zos.closeEntry(); } } finally { zos.close(); } } /** * PSD形式で保存する * @param outFile * @param layerImages * @param compositeImg * @throws IOException */ public void saveToPSD(File outFile, Collection layerImages, BufferedImage compositeImg) throws IOException { List layerDatas = new ArrayList(); Map dupchk = new HashMap(); for (LayerImage layerImage : layerImages) { Layer layer = layerImage.getLayer(); String layerName = layer.getDir(); Integer cnt = dupchk.get(layerName); if (cnt == null) { cnt = 1; } else { cnt = cnt + 1; layerName = layerName + "(" + cnt + ")"; } dupchk.put(layerName, cnt); BufferedImage img = layerImage.getImage(); PSDCreator.LayerData layerData = new PSDCreator.LayerData(layerName, img); layerDatas.add(layerData); } AppConfig appConfig = AppConfig.getInstance(); PSDCreator.setUseRenderingHints(appConfig.isEnableRenderingHints()); // レンダリングヒントの使用 PSDCreator.setUseRLECompression(appConfig.isUseRLECompressionForPSD()); // RLE圧縮の有無 // PSDデータ作成 byte[] psdContents = PSDCreator.createPSD(layerDatas); FileOutputStream fos = new FileOutputStream(outFile); try { FileChannel fc = fos.getChannel(); try { ByteBuffer buf = ByteBuffer.wrap(psdContents); while (buf.hasRemaining()) { fc.write(buf); } } finally { fc.close(); } } finally { fos.close(); } } } /** * 出力オプションパネル * @author seraphy */ class OutputOptionPanel extends JPanel { private static final long serialVersionUID = 1L; private JSpinner jpegQualitySpinner; private JCheckBox lblZoom; private JSpinner zoomSpinner; private JComboBox zoomAlgoCombo; private JComboBox pictureModeCombo; private JCheckBox checkForceBgColor; public OutputOptionPanel() { this(new OutputOption()); } public OutputOptionPanel(OutputOption outputOption) { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ImageSaveHelper.STRINGS_RESOURCE); setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(3, 3, 3, 3), BorderFactory.createTitledBorder( strings.getProperty("ouputOption.caption")))); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; gbc.insets = new Insets(3, 3, 3, 3); gbc.gridheight = 1; gbc.ipadx = 0; gbc.ipady = 0; gbc.weighty = 0; // 左端余白 gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 1; gbc.weightx = 0.; add(Box.createHorizontalStrut(6), gbc); // JPEG gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 3; gbc.weightx = 1.; JLabel lblJpeg = new JLabel( strings.getProperty("outputOption.jpeg.caption")); lblJpeg.setFont(lblJpeg.getFont().deriveFont(Font.BOLD)); add(lblJpeg, gbc); gbc.gridx = 1; gbc.gridy = 1; gbc.gridwidth = 1; gbc.weightx = 0.; add(new JLabel( strings.getProperty("outputOption.jpeg.quality"), JLabel.RIGHT), gbc); SpinnerNumberModel spmodel = new SpinnerNumberModel(100, 10, 100, 1); this.jpegQualitySpinner = new JSpinner(spmodel); gbc.gridx = 2; gbc.gridy = 1; gbc.gridwidth = 1; add(jpegQualitySpinner, gbc); gbc.gridx = 3; gbc.gridy = 1; gbc.gridwidth = 1; add(new JLabel("%"), gbc); // ZOOM gbc.gridx = 0; gbc.gridy = 2; gbc.gridwidth = 3; gbc.weightx = 1.; gbc.insets = new Insets(10, 3, 3, 3); lblZoom = new JCheckBox(strings.getProperty("outputOption.zoom.caption")); lblZoom.setFont(lblJpeg.getFont().deriveFont(Font.BOLD)); add(lblZoom, gbc); gbc.gridx = 1; gbc.gridy = 3; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.insets = new Insets(3, 3, 3, 3); add(new JLabel( strings.getProperty("outputOption.zoom.factor"), JLabel.RIGHT), gbc); SpinnerNumberModel zoomSpModel = new SpinnerNumberModel(100, 20, 800, 1); this.zoomSpinner = new JSpinner(zoomSpModel); gbc.gridx = 2; gbc.gridy = 3; gbc.gridwidth = 1; add(zoomSpinner, gbc); gbc.gridx = 3; gbc.gridy = 3; gbc.gridwidth = 1; add(new JLabel("%"), gbc); gbc.gridx = 1; gbc.gridy = 4; gbc.gridwidth = 1; gbc.weightx = 1.; add(new JLabel( strings.getProperty("outputOption.zoom.renderingMode"), JLabel.RIGHT), gbc); this.zoomAlgoCombo = new JComboBox(ZoomRenderingType.values()); this.zoomAlgoCombo.setRenderer(new LocalizedMessageComboBoxRender(strings)); gbc.gridx = 2; gbc.gridy = 4; gbc.gridwidth = 2; gbc.weightx = 0.; add(zoomAlgoCombo, gbc); // 画像モード gbc.gridx = 0; gbc.gridy = 5; gbc.gridwidth = 3; gbc.insets = new Insets(10, 3, 3, 3); JLabel lblPictureMode = new JLabel( strings.getProperty("outputOption.picture")); lblPictureMode.setFont(lblJpeg.getFont().deriveFont(Font.BOLD)); add(lblPictureMode, gbc); gbc.gridx = 1; gbc.gridy = 6; gbc.gridwidth = 1; gbc.insets = new Insets(3, 3, 3, 3); add(new JLabel( strings.getProperty("outputOption.picture.type"), JLabel.RIGHT), gbc); this.pictureModeCombo = new JComboBox(PictureMode.values()); this.pictureModeCombo.setRenderer( new LocalizedMessageComboBoxRender(strings)); gbc.gridx = 2; gbc.gridy = 6; gbc.gridwidth = 2; gbc.weightx = 1.; add(pictureModeCombo, gbc); gbc.gridx = 1; gbc.gridy = 7; gbc.gridwidth = 3; gbc.weightx = 0.; checkForceBgColor = new JCheckBox( strings.getProperty("outputOption.picture.forceBgColor")); add(checkForceBgColor, gbc); JPanel pnlBgAlpha = new JPanel(new BorderLayout(3, 3)); pnlBgAlpha.add(new JLabel("背景アルファ"), BorderLayout.WEST); SpinnerNumberModel bgAlphaModel = new SpinnerNumberModel(255, 0, 255, 1); JSpinner bgAlphaSpinner = new JSpinner(bgAlphaModel); pnlBgAlpha.add(bgAlphaSpinner, BorderLayout.CENTER); gbc.gridx = 1; gbc.gridy = 8; gbc.gridwidth = 3; gbc.weightx = 0.; add(pnlBgAlpha, gbc); // 余白 gbc.gridx = 0; gbc.gridy = 9; gbc.gridwidth = 4; gbc.weightx = 1.; gbc.weighty = 1.; add(Box.createGlue(), gbc); // update setOutputOption(outputOption); } public void setOutputOption(OutputOption outputOption) { if (outputOption == null) { outputOption = new OutputOption(); } jpegQualitySpinner.setValue((int) (outputOption.getJpegQuality() * 100)); lblZoom.setSelected(outputOption.isEnableZoom()); zoomSpinner.setValue((int) (outputOption.getZoomFactor() * 100)); zoomAlgoCombo.setSelectedItem(outputOption.getZoomRenderingType()); pictureModeCombo.setSelectedItem(outputOption.getPictureMode()); checkForceBgColor.setSelected(outputOption.isForceBgColor()); } public OutputOption getOutputOption() { OutputOption outputOption = new OutputOption(); outputOption.setJpegQuality(((Integer) jpegQualitySpinner.getValue() / 100.)); outputOption.setEnableZoom(lblZoom.isSelected()); outputOption.setZoomFactor(((Integer) zoomSpinner.getValue() / 100.)); outputOption.setZoomRenderingType((ZoomRenderingType) zoomAlgoCombo.getSelectedItem()); outputOption.setPictureMode((PictureMode) pictureModeCombo.getSelectedItem()); outputOption.setForceBgColor(checkForceBgColor.isSelected()); return outputOption; } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/PNGFileImageHeaderReader.java0000644000175000017500000001105513615720000030661 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.EOFException; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URL; import java.util.Arrays; /** * PNGファイルのヘッダ情報を読み取る * @author seraphy */ public class PNGFileImageHeaderReader { /** * PNGファイルのファイルヘッダ */ public static final byte[] FILE_HEADER = { (byte) 0x89, (byte) 0x50, (byte) 0x4e, (byte) 0x47, (byte) 0x0d, (byte) 0x0a, (byte) 0x1a, (byte) 0x0a }; private static final PNGFileImageHeaderReader singletion = new PNGFileImageHeaderReader(); private PNGFileImageHeaderReader() { super(); } public static PNGFileImageHeaderReader getInstance() { return singletion; } /** * URLを指定してヘッダ情報を取得する.
* @param url * @return ヘッダ、PNGでない場合はnull * @throws IOException 読み取りに失敗した場合 */ public PNGFileImageHeader readHeader(URI uri) throws IOException { if (uri == null) { throw new IllegalArgumentException(); } URL url = uri.toURL(); InputStream is = url.openStream(); try { return readHeader(is); } finally { is.close(); } } /** * ファイルを指定してヘッダ情報を取得する. * @param file * @return ヘッダ、PNGでない場合はnull * @throws IOException 読み取りに失敗した場合 */ public PNGFileImageHeader readHeader(File file) throws IOException { if (file == null) { throw new IllegalArgumentException(); } InputStream is = new BufferedInputStream(new FileInputStream(file)); try { return readHeader(is); } finally { is.close(); } } /** * ストリームを指定してヘッダ情報を読み取る.
* ストリームは読み取った分だけ消費された状態で返される.
* @param is ストリーム * @return ヘッダ、PNGでない場足はnull * @throws IOException 読み取りに失敗した場合 */ public PNGFileImageHeader readHeader(InputStream is) throws IOException { if (is == null) { throw new IllegalArgumentException(); } DataInputStream dis = new DataInputStream(is); try { // ファイルヘッダの読み取り byte[] fileHeader = new byte[FILE_HEADER.length]; dis.readFully(fileHeader); if (!Arrays.equals(fileHeader, FILE_HEADER)) { // ヘッダが一致しない return null; } PNGFileImageHeader imageHeader = null; boolean hasTransparencyInfomation = false; for (;;) { int chunkLen = dis.readInt(); // チャンクの長さ byte[] chunkType = new byte[4]; dis.readFully(chunkType); if (Arrays.equals(chunkType, "IHDR".getBytes())) { imageHeader = new PNGFileImageHeader(); imageHeader.setWidth(dis.readInt()); // 4bytes imageHeader.setHeight(dis.readInt()); // 4bytes imageHeader.setBitDepth(((int) dis.readByte()) & 0xff); // 1byte imageHeader.setColorType(((int) dis.readByte()) & 0xff); // 1byte imageHeader.setCompressionMethod(((int) dis.readByte()) & 0xff); // 1byte imageHeader.setFilterMethod(((int) dis.readByte()) & 0xff); // 1byte imageHeader.setInterlaceMethod(((int) dis.readByte()) & 0xff); // 1byte int zan = chunkLen - 13; if (zan < 0) { throw new EOFException("IHDR too short"); } if (dis.skipBytes(zan) != zan) { throw new IOException("チャンクのサイズが不正です."); } } else if (Arrays.equals(chunkType, "tRNS".getBytes())) { // カラータイプによりチャンクの中身の形式は異なる. // インデックス(ColorType=3)の場合は透過色のインデックス // グレースケールの場合は、透過色とするスケール値など. hasTransparencyInfomation = chunkLen > 0; if (dis.skipBytes(chunkLen) != chunkLen) { throw new IOException("チャンクのサイズが不正です."); } } else if (Arrays.equals(chunkType, "IEND".getBytes())) { // 終了チャンク break; } else { // IHDR以外のチャンクは読み飛ばす if (dis.skipBytes(chunkLen) != chunkLen) { throw new IOException("チャンクのサイズが不正です."); } } dis.readInt(); // CRC32を読み飛ばす } if (imageHeader != null) { imageHeader.setTransparencyInformation(hasTransparencyInfomation); } return imageHeader; } catch (EOFException e) { // 何もしない } return null; } } CharacterManaJ/src/main/java/charactermanaj/graphics/io/ImagePreviewFileChooser.java0000644000175000017500000000614213615720000030746 0ustar paulliupaulliupackage charactermanaj.graphics.io; import java.awt.Image; import java.awt.Toolkit; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import javax.swing.BorderFactory; import javax.swing.JFileChooser; import javax.swing.filechooser.FileFilter; import charactermanaj.Main; import charactermanaj.ui.MiniPictureBox; /** * 画像ファイルを選択するファイルチューザ.
* 選択したファイルの画像のサムネイルを表示する. * @author seraphy */ public class ImagePreviewFileChooser extends JFileChooser { private static final long serialVersionUID = -66951985128705674L; /*** * プレビューパネル */ private MiniPictureBox previewPanel; /** * デフォルトコンストラクタ */ public ImagePreviewFileChooser() { super(); initAccessory(); initFileFilter(); } /** * 初期ディレクトり指定コンストラクタ * @param initDir 初期ディレクトリ */ public ImagePreviewFileChooser(File initDir) { super(initDir); initAccessory(); initFileFilter(); } protected Image getSelectedImage() { return previewPanel.getImage(); } protected void setSelectedImage(Image selectedImage) { previewPanel.setImage(selectedImage); } /** * イメージをロードする.
* ファィルパスがnullまたはファイルを示さないか実在しない場合はnull.
* 既定ではイメージは非同期読み込みとなる.
* @param file ファイルパス * @return イメージ、もしくはnull */ protected Image loadImage(File file) { if (file == null || !file.exists() || !file.isFile()) { return null; } Toolkit tk = Toolkit.getDefaultToolkit(); return tk.createImage(file.getPath()); } protected void initAccessory() { previewPanel = createAccessory(); previewPanel.setVisible(true); setAccessory(previewPanel); addPropertyChangeListener( JFileChooser.SELECTED_FILE_CHANGED_PROPERTY, new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { previewPanel.setImage(loadImage(getSelectedFile())); } }); } protected MiniPictureBox createAccessory() { MiniPictureBox pictureBox = new MiniPictureBox(); pictureBox.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder( 0, Main.isLinuxOrMacOSX() ? 5 : 10, 0, Main.isLinuxOrMacOSX() ? 5 : 0), pictureBox.getBorder())); return pictureBox; } protected void initFileFilter() { setAcceptAllFileFilterUsed(false); setFileFilter(createImageFileFilter()); } protected FileFilter createImageFileFilter() { return new FileFilter() { private final String[] acceptExts = {".png", ".jpeg", ".jpg", ".gif", ".bmp"}; @Override public boolean accept(File f) { if (f.isDirectory()) { return true; } String lcName = f.getName().toLowerCase(); for (String acceptExt : acceptExts) { if (lcName.endsWith(acceptExt)) { return true; } } return false; } public String getDescription() { return "Picture(*.jpeg;*.png;*.gif;*.bmp)"; }; }; } } CharacterManaJ/src/main/java/charactermanaj/graphics/AsyncImageBuilder.java0000644000175000017500000001131313615720000027153 0ustar paulliupaulliupackage charactermanaj.graphics; import java.util.logging.Level; import java.util.logging.Logger; /** * 各パーツ情報をもとに非同期にイメージを合成する * @author seraphy */ public class AsyncImageBuilder implements ImageBuilder, Runnable { /** * ロガー */ private static final Logger logger = Logger.getLogger(AsyncImageBuilder.class.getName()); /** * 非同期にイメージを構築するためのジョブ定義.
* リクエストを受け付けたことを示すイベントおよび、リクエストが放棄されたことを示すイベントを受け取ることができる.
* @author seraphy * */ public interface AsyncImageBuildJob extends ImageBuildJob { /** * リクエストを受け付けた場合に呼び出される.
* @param ticket このイメージビルダでリクエストを受け付けた通し番号 */ void onQueueing(long ticket); /** * リクエストを処理するまえに破棄された場合に呼び出される.
*/ void onAbandoned(); } /** * 同期オブジェクト */ private final Object lock = new Object(); /** * チケットのシリアルナンバー.
* リクエストがあるごとにインクリメントされる.
*/ private long ticketSerialNum = 0; /** * リクエストされているジョブ、なければnull */ private ImageBuildJob requestJob; /** * 停止フラグ(volatile) */ private volatile boolean stopFlag; /** * スレッド */ private Thread thread; /** * イメージビルダ */ private ImageBuilder imageBuilder; /** * イメージローダを指定して構築する. * @param imageLoader イメージローダー */ public AsyncImageBuilder(ColorConvertedImageCachedLoader imageLoader) { imageBuilder = new ImageBuilderImpl(imageLoader); thread = new Thread(this); thread.setDaemon(true); } /** * 同期イメージビルダを取得する。 * @return */ public ImageBuilder getImageBuilder() { return imageBuilder; } /** * スレッドの実行部. */ public void run() { logger.log(Level.FINE, "AsyncImageBuilder thread started."); // 停止フラグがたてられるまで繰り返す. while (!stopFlag) { try { ImageBuildJob job; synchronized (lock) { while (!stopFlag && requestJob == null) { // ジョブリクエストがくるまで待機 lock.wait(1000); } if (stopFlag) { break; } // ジョブを一旦ローカル変数に保存 job = requestJob; // ジョブの受け付けを再開. requestJob = null; lock.notifyAll(); } // リクエストを処理する. imageBuilder.requestJob(job); } catch (InterruptedException ex) { logger.log(Level.FINE, "AsyncImageBuilder thead interrupted."); // 割り込みされた場合、単にループを再開する. } catch (Exception ex) { logger.log(Level.SEVERE, "AsyncImageBuilder failed.", ex); // ジョブ合成中の予期せぬ例外はログに記録するのみで // スレッドそのものは停止させない. // (Error系は、たぶんアプリ自身が続行不能な障害なので停止する.) } } logger.log(Level.FINE, "AsyncImageBuilder thread stopped."); } /** * イメージ作成ジョブをリクエストする.
* イメージ作成ジョブは非同期に実行される.
* 処理がはじまる前に新しいリクエストで上書きされた場合、前のリクエストは単に捨てられる.
*/ @Override public boolean requestJob(ImageBuildJob imageSource) { synchronized (lock) { // 現在処理待ちのリクエストがあれば、新しいリクエストで上書きする. if (this.requestJob != null && this.requestJob instanceof AsyncImageBuildJob) { ((AsyncImageBuildJob) this.requestJob).onAbandoned(); } // リクエストをセットして待機中のスレッドに通知を出す. this.requestJob = imageSource; if (imageSource != null && imageSource instanceof AsyncImageBuildJob) { ((AsyncImageBuildJob) imageSource).onQueueing(++ticketSerialNum); } lock.notifyAll(); } return false; } /** * スレッドが生きているか? * @return 生きていればtrue */ public boolean isAlive() { return thread.isAlive(); } /** * スレッドを開始する. */ public void start() { if (!thread.isAlive()) { stopFlag = false; thread.start(); } } /** * スレッドを停止する. */ public void stop() { if (thread.isAlive()) { stopFlag = true; thread.interrupt(); try { // スレッドの停止を待機する. thread.join(); } catch (InterruptedException ex) { // do nothing. } } } } CharacterManaJ/src/main/java/charactermanaj/graphics/ColorConvertedImageCachedLoader.java0000644000175000017500000000574513615720000031752 0ustar paulliupaulliupackage charactermanaj.graphics; import java.io.IOException; import charactermanaj.graphics.colormodel.ColorModel; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.graphics.io.ImageCache; import charactermanaj.graphics.io.ImageCachedLoader; import charactermanaj.graphics.io.ImageLoader; import charactermanaj.graphics.io.ImageResource; import charactermanaj.graphics.io.LoadedImage; /** * 画像リソースに対する色変換後の画像イメージを返します.
* 一度読み込まれ色変換された画像は、画像ファイルの更新日が同一であり、且つ、色パラメータに変更がなければ * 読み込み済みの画像イメージを返します.
* @author seraphy * */ public class ColorConvertedImageCachedLoader extends ColorConvertedImageLoaderImpl { private ImageCache caches = new ImageCache(); public ColorConvertedImageCachedLoader() { this(new ImageCachedLoader()); } public ColorConvertedImageCachedLoader(ImageLoader imageLoader) { super(imageLoader); } @Override public LoadedImage load(ImageResource file, ColorConvertParameter colorConvParam, ColorModel colorModel) throws IOException { if (file == null) { throw new IllegalArgumentException(); } ColorConvertParameter param; if (colorConvParam == null) { param = new ColorConvertParameter(); } else { param = colorConvParam.clone(); } ColorConvertedImageKey key = new ColorConvertedImageKey(param, file); synchronized (caches) { LoadedImage loadedImage = caches.get(key); if (loadedImage == null) { loadedImage = super.load(file, param, colorModel); caches.set(key, loadedImage); } return loadedImage; } } @Override public void close() { caches.clear(); super.close(); } public void unlockImages() { caches.unlockImages(); } } final class ColorConvertedImageKey { private final ColorConvertParameter colorConvParameter; private final ImageResource imageResource; private final long lastModified; private final int hashCode; public ColorConvertedImageKey(ColorConvertParameter colorConvParameter, ImageResource imageResource) { if (colorConvParameter == null || imageResource == null) { throw new IllegalArgumentException(); } this.colorConvParameter = colorConvParameter; this.imageResource = imageResource; this.lastModified = imageResource.lastModified(); this.hashCode = imageResource.hashCode() ^ colorConvParameter.hashCode() ^ (int) this.lastModified; } @Override public int hashCode() { return this.hashCode; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof ColorConvertedImageKey) { ColorConvertedImageKey other = (ColorConvertedImageKey) obj; return lastModified == other.lastModified && imageResource.equals(other.imageResource) && colorConvParameter.equals(other.colorConvParameter); } return false; } } CharacterManaJ/src/main/java/charactermanaj/model/0000755000175000017500000000000013615720000022262 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/model/ListChangeListener.java0000644000175000017500000000370113615720000026655 0ustar paulliupaulliupackage charactermanaj.model; import java.util.EventListener; import java.util.EventObject; /** * リストの変更通知イベントのリスナ * * @param */ public interface ListChangeListener extends EventListener { /** * イベントのタイプ */ public enum ChangeType { ADD, MODIFIY, REMOVE } /** * リストの変更通知イベント * * @param */ public class Change extends EventObject { private static final long serialVersionUID = 3685161122703901464L; /** * イベントのタイプ */ private ChangeType type; /** * 行インデックス */ private int index; /** * 変更前の値 * addの場合はnull */ private E oldValue; /** * 変更後の値 * removeの場合はnull */ private E newValue; /** * 変更イベントを構築する * @param source イベント元 * @param type イベントの種類 * @param index リストのインデックス * @param oldValue 前の値 * @param newValue 現在の値 */ public Change(ObservableList source, ChangeType type, int index, E oldValue, E newValue) { super(source); this.type = type; this.index = index; this.oldValue = oldValue; this.newValue = newValue; } /** * Gets the event type * @return either ADD, REMOVE, or MODIFY */ public ChangeType getType() { return type; } public int getIndex() { return index; } public E getOldValue() { return oldValue; } public E getNewValue() { return newValue; } @SuppressWarnings("unchecked") public ObservableList getList() { return (ObservableList) getSource(); } @Override public String toString() { return "Change [type=" + type + ", index=" + index + ", oldValue=" + oldValue + ", newValue=" + newValue + "]"; } } /** * リストに変更があったことを通知される * @param c 変更イベント */ void onChanged(Change c); }CharacterManaJ/src/main/java/charactermanaj/model/ColorGroup.java0000644000175000017500000000301713615720000025221 0ustar paulliupaulliupackage charactermanaj.model; /** * カラーグループ.
* カラーグループはimmutableであり、構築された値は変更されることはない.
* @author seraphy */ public final class ColorGroup { private final String id; private final boolean enabled; private final String localizedName; public static final ColorGroup NA = new ColorGroup("n/a", "", false); public ColorGroup(final String id, final String localizedName) { this(id, localizedName, true); } private ColorGroup(final String id, final String localizedName, final boolean enabled) { if (id == null || id.trim().length() == 0) { throw new IllegalArgumentException(); } this.id = id.trim(); this.localizedName = (localizedName == null || localizedName.trim().length() == 0) ? id : localizedName; this.enabled = enabled; } public boolean isEnabled() { return enabled; } public String getId() { return id; } public String getLocalizedName() { return localizedName; } @Override public int hashCode() { return id.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof ColorGroup) { ColorGroup o = (ColorGroup) obj; return id.equals(o.getId()); } return false; } public static boolean equals(ColorGroup v1, ColorGroup v2) { if (v1 == v2) { return true; } if (v1 == null || v2 == null) { return false; } return v1.equals(v2); } @Override public String toString() { return getLocalizedName(); } } CharacterManaJ/src/main/java/charactermanaj/model/ColorInfo.java0000644000175000017500000000430413615720000025020 0ustar paulliupaulliupackage charactermanaj.model; import charactermanaj.graphics.filters.ColorConvertParameter; /** * カラーグループおよび連動フラグを含む色情報.
* @author seraphy */ public class ColorInfo implements Cloneable { private ColorConvertParameter colorParameter = new ColorConvertParameter(); private boolean syncColorGroup = false; private ColorGroup colorGroup = ColorGroup.NA; @Override public ColorInfo clone() { ColorInfo colorInfo; try { colorInfo = (ColorInfo) super.clone(); } catch (CloneNotSupportedException ex) { throw new RuntimeException(ex.getMessage(), ex); } colorInfo.colorParameter = (ColorConvertParameter) this.colorParameter.clone(); return colorInfo; } @Override public int hashCode() { return colorParameter.hashCode() ^ colorGroup.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof ColorInfo) { ColorInfo o = (ColorInfo) obj; return colorGroup.equals(o.colorGroup) && syncColorGroup == o.syncColorGroup && colorParameter.equals(o.colorParameter); } return false; } public ColorConvertParameter getColorParameter() { return colorParameter; } public void setColorParameter(ColorConvertParameter colorParameter) { if (colorParameter == null) { this.colorParameter = new ColorConvertParameter(); } else { this.colorParameter = colorParameter; } } public boolean isSyncColorGroup() { return syncColorGroup; } public void setSyncColorGroup(boolean syncColorGroup) { this.syncColorGroup = syncColorGroup; } public ColorGroup getColorGroup() { return colorGroup; } public void setColorGroup(ColorGroup colorGroup) { if (colorGroup == null) { this.colorGroup = ColorGroup.NA; } else { this.colorGroup = colorGroup; } } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append(getClass().getSimpleName() + "@" + Integer.toHexString(System.identityHashCode(this))); buf.append("("); buf.append("(colorGroup: " + colorGroup + "(sync: " + syncColorGroup + ")), "); buf.append("(colorParameter: " + colorParameter + ")"); buf.append(")"); return buf.toString(); } } CharacterManaJ/src/main/java/charactermanaj/model/PartsSet.java0000644000175000017500000004453213615720000024702 0ustar paulliupaulliupackage charactermanaj.model; import java.awt.Color; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; /** * パーツセット.
* 各カテゴリの選択パーツと、そのパーツの色情報、および背景色をセットにしたもの.
* 保存する必要がなければIDおよび表示名は使用されないため、nullとなりえる.
* * @author seraphy * */ public final class PartsSet extends AbstractMap> implements Cloneable { /** * PartsSet用のデフォルトのコンパレータ.
* 名前順、ID順にソートする.
*/ public static final Comparator DEFAULT_COMPARATOR = new Comparator() { public int compare(PartsSet o1, PartsSet o2) { int ret = o1.getLocalizedName().compareTo(o2.getLocalizedName()); if (ret == 0) { ret = o1.getPartsSetId().compareTo(o2.getPartsSetId()); } if (ret == 0) { ret = o1.hashCode() - o2.hashCode(); } return ret; } }; /** * パーツセットID.
* 一時的な名前なしのパーツセットとして使われる場合はnull */ private String partsSetId; /** * パーツセットの表示名.
* 一時的な名前なしのパーツセットとして使われる場合はnull */ private String localizedName; /** * プリセットパーツフラグ */ private boolean presetParts; /** * パーツセットとともに使われる背景色.
*/ private Color bgColor; /** * アフィン変換用パラメータ.
* 変換しない場合はnull.
*/ private double[] affineTransformParameter; /** * アクティブなカスタムレイヤーパターンIDのセット */ private Set activeCustomLayerPatternIds; /** * パーツリスト */ private HashMap> parts = new HashMap>(); /** * パーツに対するカラー情報.
* かならずしも、パーツに対してカラー情報を設定する必要はない.
* カラー情報がない場合は空.
*/ private HashMap partsColorInfoMap = new HashMap(); /** * 無名、空のパーツセットを作成する. */ public PartsSet() { this(null, null, false); } /** * 名前つきパーツセットを作成する.
* * @param partsSetId * パーツセットID * @param localizedName * 表示名 * @param presetParts * プリセットフラグ */ public PartsSet(String partsSetId, String localizedName, boolean presetParts) { this.partsSetId = partsSetId; this.localizedName = localizedName; this.presetParts = presetParts; } /** * パーツセットをディープコピーする.
* 現在のキャラクターデータのカテゴリインスタンスに関連づけて再生させる場合は、 * resolverに現在のキャラクターデータのカテゴリリゾルバを指定します.
* * @param org * 元オブジェクト * @param resolver * パーツセットのカテゴリを再生するためのリゾルバ、再生する必要がなければnull可 */ protected PartsSet(PartsSet org, PartsCategoryResolver resolver) { if (org == null) { throw new IllegalArgumentException(); } this.partsSetId = org.partsSetId; this.localizedName = org.localizedName; this.presetParts = org.presetParts; this.bgColor = org.bgColor; this.affineTransformParameter = org.affineTransformParameter == null ? null : org.affineTransformParameter.clone(); this.activeCustomLayerPatternIds = org.activeCustomLayerPatternIds == null ? null : new TreeSet(org.activeCustomLayerPatternIds); // ColorInfoMapの正規化 for (Map.Entry partsColorInfoEntry : org.partsColorInfoMap.entrySet()) { PartsIdentifier partsIdentifier = partsColorInfoEntry.getKey(); if (resolver != null) { PartsCategory orgPartsCategory = partsIdentifier.getPartsCategory(); PartsCategory repPartsCategory = resolver.getPartsCategory(orgPartsCategory.getCategoryId()); if (repPartsCategory == null) { // 同一IDのカテゴリがリゾルバになければ、このパーツは無かったことにする. continue; } if (orgPartsCategory != repPartsCategory) { // インスタンスが一致しなければリゾルバ側の結果を優先する. partsIdentifier = new PartsIdentifier( repPartsCategory, partsIdentifier.getPartsName(), partsIdentifier.getLocalizedPartsName()); } } PartsCategory repPartsCategory = partsIdentifier.getPartsCategory(); PartsColorInfo copiedPartsColorInfo = partsColorInfoEntry .getValue().createCompatible(repPartsCategory); partsColorInfoMap.put(partsIdentifier, copiedPartsColorInfo); } // PartsIdentifierの正規化 for (Map.Entry> partsEntry : org.parts.entrySet()) { PartsCategory orgPartsCategory = partsEntry.getKey(); PartsCategory partsCategory = orgPartsCategory; if (resolver != null) { PartsCategory repPartsCategory = resolver.getPartsCategory(orgPartsCategory.getCategoryId()); if (repPartsCategory == null) { // 同一IDのカテゴリがリゾルバになければ、このカテゴリはなかったことにする. continue; } if (repPartsCategory != orgPartsCategory) { // インスタンスが一致しなければリゾルバ側の結果を優先する. partsCategory = repPartsCategory; } } ArrayList partsIdentifiers = new ArrayList(partsEntry.getValue()); parts.put(partsCategory, partsIdentifiers); } } /** * リゾルバを使用してパーツカテゴリ(パーツ識別子のカテゴリも含む)のインスタンスを入れ替えます.
* パーツセットはキャラクターデータとは独立してロード・セーブされることがあるため、同じ情報でも異なるインスタンスとなる場合があり、 * これを是正するために、このメソッドを使用します.
* リゾルバから取得できないパーツカテゴリは除去されます.
* * @param resolver * リゾルバ * @return 互換性のあるパーツセット */ public PartsSet createCompatible(PartsCategoryResolver resolver) { if (resolver == null) { throw new IllegalArgumentException(); } // XXX: 本当は、こんなことはしたくない。 return new PartsSet(this, resolver); } /** * パーツセットをディープコピーする.
* * @return コピーされたパーツセット */ @Override public PartsSet clone() { return new PartsSet(this, null); } @Override public int hashCode() { return super.hashCode() ^ (partsSetId == null ? 0 : partsSetId.hashCode()); } @Override public boolean equals(Object o) { if (o == this) { return true; } if (o != null && o instanceof PartsSet) { PartsSet obj = (PartsSet) o; // 双方のIDがnullもしくは、同一インスタンスであるか、ID文字列が等値である場合 if (partsSetId == obj.partsSetId || (partsSetId != null && partsSetId.equals(obj.partsSetId))) { // AbstractMapのequalsでパーツの構成物を比較する. if (super.equals(obj)) { // カラー定義が等しいか比較する. if (partsColorInfoMap.equals(obj.partsColorInfoMap)) { // 背景色がともにnullもしくは同一インスタンスであるか、背景色が等値である場合 if (bgColor == obj.bgColor || (bgColor != null && bgColor.equals(obj.bgColor))) { // アフィン変換パラメータがともにnullもしくは同一インスタンスであるか、同値である場合. if (affineTransformParameter == obj.affineTransformParameter || (affineTransformParameter != null && Arrays.equals(affineTransformParameter, obj.affineTransformParameter))) { // アクティブなカスタムレイヤーが同一の場合 if (activeCustomLayerPatternIds == obj.activeCustomLayerPatternIds || (activeCustomLayerPatternIds != null && activeCustomLayerPatternIds.equals(obj.activeCustomLayerPatternIds))) { return true; } } } } } } } return false; } public void setPresetParts(boolean presetParts) { this.presetParts = presetParts; } /** * プリセット用パーツセットであるか? これがfalseの場合は一時的なパーツセットか、もしくはお気に入り用である.
* * @return プリセット用パーツセットである場合 */ public boolean isPresetParts() { return presetParts; } public void setBgColor(Color bgColor) { this.bgColor = bgColor; } /** * バックグラウンドカラーを取得する.
* 設定されていなければnull.
* * @return バックグラウンドカラー、もしくはnull */ public Color getBgColor() { return bgColor; } /** * アフィン変換用パラメータを指定する.
* 配列は4または6でなければならない.
* アフィン変換しない場合はnull * * @param affineTransformParameter * 変換パラメータ(4または6個の要素)、もしくはnull */ public void setAffineTransformParameter(double[] affineTransformParameter) { if (affineTransformParameter != null && !(affineTransformParameter.length == 4 || affineTransformParameter.length == 6)) { throw new IllegalArgumentException("The length of affineTransformParameter must be 4 or 6."); } this.affineTransformParameter = affineTransformParameter == null ? null : affineTransformParameter.clone(); } /** * アフィン変換用のパラメータを取得する.
* 変換しない場合はnull.
* * @return アフィン変換用のパラメータ、またはnull */ public double[] getAffineTransformParameter() { return affineTransformParameter == null ? null : affineTransformParameter.clone(); } /** * アクティブなカスタムレイヤーパターン名、設定がなければnull可 * @return */ public Set getActiveCustomLayerPatternIds() { return activeCustomLayerPatternIds; } public void setActiveCustomLayerPatternIds(Set activeCustomLayerPatternIds) { this.activeCustomLayerPatternIds = activeCustomLayerPatternIds; } public void setPartsSetId(String partsSetId) { this.partsSetId = partsSetId; } public void setLocalizedName(String localizedName) { this.localizedName = localizedName; } /** * プリセットIDを取得する.
* 一時的なパーツセットである場合はnull * * @return プリセットID、またはnull */ public String getPartsSetId() { return partsSetId; } /** * プリセット名を取得する.
* 一時的なパーツセットである場合はnull * * @return プリセット名、またはnull */ public String getLocalizedName() { return localizedName; } /** * パーツセットのエントリセットを取得する. */ @Override public Set>> entrySet() { return parts.entrySet(); } /** * パーツカラー情報を取得する.
* カラー情報が関連づけられていない場合はnullが返される.
* * @param partsIdentifier * パーツ識別子 * @return カラー情報、もしくはnull */ public PartsColorInfo getColorInfo(PartsIdentifier partsIdentifier) { PartsColorInfo partsColorInfo = partsColorInfoMap.get(partsIdentifier); return partsColorInfo == null ? null : partsColorInfo.clone(); } /** * カテゴリ別にパーツを登録する.
* partsNameがnullまたは空文字の場合はカテゴリのみ登録する.
* これにより、そのカテゴリに選択がないことを示す.
* 複数選択可能なカテゴリの場合、複数回の呼び出しで登録する.(登録順)
* * @param category * カテゴリ * @param partsIdentifier * パーツ識別子、またはnull * @param partsColorInfo * パーツの色情報、なければnull可 */ public void appendParts(PartsCategory category, PartsIdentifier partsIdentifier, PartsColorInfo partsColorInfo) { if (category == null) { throw new IllegalArgumentException(); } List partsIdentifiers = parts.get(category); if (partsIdentifiers == null) { partsIdentifiers = new ArrayList(); parts.put(category, partsIdentifiers); } if (partsIdentifier != null) { partsIdentifiers.add(partsIdentifier); if (partsColorInfo != null) { partsColorInfoMap.put(partsIdentifier, partsColorInfo.clone()); } } } /** * すべてのパーツのカラー情報を除去する.
*/ public void removeColorInfo() { partsColorInfoMap.clear(); } /** * パーツセットが構造的に一致するか検証します.
* nullの場合は常にfalseとなります.
* * @param other * 比較対象、null可 * @return パーツ構成が一致すればtrue、そうでなければfalse */ public boolean isSameStructure(PartsSet other) { if (other != null && other.size() == this.size()) { // カテゴリが一致し、各カテゴリに登録されているパーツ識別子のリストも順序を含めて一致する場合、 // 構造的に一致すると判定する. for (Map.Entry> entry : entrySet()) { PartsCategory category = entry.getKey(); List ownList = entry.getValue(); List otherList = other.get(category); if (ownList == null || otherList == null || !ownList.equals(otherList)) { return false; } } return true; } return false; } /** * 2つのパーツセットが構造的に一致するか検証します.
* いずれか一方がnullであればfalseを返します.双方がnullであればtrueを返します.
* 双方がnullでなければ{@link #isSameStructure(PartsSet)}で判定されます.
* * @param a * 比較対象1、null可 * @param b * 比較対象2、null可 * @return パーツ構成が一致すればtrue、そうでなければfalse */ public static boolean isSameStructure(PartsSet a, PartsSet b) { if (a == b) { return true; } if (a == null || b == null) { return false; } return a.isSameStructure(b); } /** * 保持しているパーツ識別子のカラー情報と同一のカラー情報をもっているか判定します.
* 相手側はカテゴリや順序を問わず、少なくとも自分と同じパーツ識別子をもっていれば足りるため、 パーツ構成が同一であるかの判定は行いません.
* パーツ構造を含めて判定を行う場合は事前に{@link #isSameStructure(PartsSet)}を呼び出します.
* nullの場合は常にfalseとなります.
* * @param other * 判定先、null可 * @return 同一であればtrue、そうでなければfalse */ public boolean isSameColor(PartsSet other) { if (other != null && other.size() == size()) { for (List partsIdentifiers : values()) { for (PartsIdentifier partsIdentifier : partsIdentifiers) { PartsColorInfo ownColorInfo = getColorInfo(partsIdentifier); PartsColorInfo otherColorInfo = other.getColorInfo(partsIdentifier); if ( !PartsColorInfo.equals(ownColorInfo, otherColorInfo)) { return false; } } } return true; } return false; } /** * カスタムレイヤーパターンが同一であるか? * @param other * @return */ public boolean isSameCustomLayers(PartsSet other) { if (other != null) { Set patternIds = other.getActiveCustomLayerPatternIds(); return activeCustomLayerPatternIds == null ? patternIds == null : activeCustomLayerPatternIds.equals(patternIds); } return false; } /** * 引数aが保持しているパーツ識別子のカラー情報と同一のカラー情報を引数bがもっているか判定します.
* 引数b側はカテゴリや順序を問わず、少なくとも引数aと同じパーツ識別子をもっていれば足りるため、 パーツ構成が同一であるかの判定は行いません.
* パーツ構造を含めて判定を行う場合は事前に{@link #isSameStructure(PartsSet, PartsSet)}を呼び出します.
* 双方がnullであればtrueとなります.
* いずれか一方がnullの場合はfalseとなります.
* * @param a * 対象1、null可 * @param b * 対象2、null可 * @return 同一であればtrue、そうでなければfalse */ public static boolean isSameColor(PartsSet a, PartsSet b) { if (a == b) { return true; } if (a == null || b == null) { return false; } return a.isSameColor(b); } /** * アクティブなカスタムレイヤーパターン名が同一であるか? * @param a * @param b * @return */ public static boolean isSameCustomLayers(PartsSet a, PartsSet b) { if (a == b) { return true; } if (a == null || b == null) { return false; } return a.isSameCustomLayers(b); } /** * このパーツセットが名前をもっているか? * * @return 名前がある場合はtrue、設定されていないか空文字の場合はfalse */ public boolean hasName() { return localizedName != null && localizedName.length() > 0; } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append(getClass().getSimpleName() + "@" + Integer.toHexString(System.identityHashCode(this))); buf.append("("); buf.append("partsSetId: " + partsSetId + ", "); buf.append("localizedName: " + localizedName + ", "); buf.append("presetFlg: " + presetParts + ", "); buf.append("background-color: " + bgColor + ", "); buf.append("affin-trans-param: " + Arrays.toString(affineTransformParameter) + ", "); buf.append("parts: " + parts + ", "); buf.append("partsColorMap: " + partsColorInfoMap); buf.append("activeCustomLayerPatternIds: " + activeCustomLayerPatternIds); buf.append(")"); return buf.toString(); } } CharacterManaJ/src/main/java/charactermanaj/model/CustomLayerOrderMapper.java0000644000175000017500000000225413615720000027540 0ustar paulliupaulliupackage charactermanaj.model; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * カスタムレイヤー順の定義リストからレイヤーに対する順序を索引できるようにする。 */ public class CustomLayerOrderMapper implements LayerOrderMapper { private Map layerOrderMap; public CustomLayerOrderMapper() { this(null); } public CustomLayerOrderMapper(Collection orders) { initMapping(orders); } public final void initMapping(Collection orders) { this.layerOrderMap = createLayerOrderMap(orders); } private static Map createLayerOrderMap(Collection orders) { Map layerOrderMap = new HashMap(); if (orders != null) { for (CustomLayerOrder layerOrder : orders) { Layer layer = layerOrder.getLayer(); float order = layerOrder.getLayerOrder(); layerOrderMap.put(layer, order); } } return layerOrderMap; } @Override public float getLayerOrder(Layer layer) { Float order = layerOrderMap.get(layer); if (order == null) { order = (float) layer.getOrder(); } return order; } } CharacterManaJ/src/main/java/charactermanaj/model/PartsSpecDecorater.java0000644000175000017500000000023013615720000026655 0ustar paulliupaulliupackage charactermanaj.model; public interface PartsSpecDecorater { void decoratePartsSpec(PartsIdentifier partsIdentifier, PartsSpec partsSpec); } CharacterManaJ/src/main/java/charactermanaj/model/CustomLayerOrderKey.java0000644000175000017500000000437513615720000027052 0ustar paulliupaulliupackage charactermanaj.model; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Map; public class CustomLayerOrderKey implements Comparable { private final String id; private final String displayName; private final Map localizedNames; public static final String DEFAULT_NAME_KEY = ""; public CustomLayerOrderKey(String id, String name, Map localizedNames) { if (id == null || name == null) { throw new NullPointerException("id and name is required."); } this.id = id; this.displayName = name; if (localizedNames == null) { localizedNames = Collections.emptyMap(); } this.localizedNames = Collections.unmodifiableMap(new HashMap(localizedNames)); } public String getId() { return id; } public String getDisplayName() { return displayName; } public Map getLocalizedNames() { return localizedNames; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; CustomLayerOrderKey other = (CustomLayerOrderKey) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } /** * 表示名によるソート順 */ public static final Comparator COMPARATOR = new Comparator() { @Override public int compare(CustomLayerOrderKey o1, CustomLayerOrderKey o2) { // 表示名でソートする // ※ ソート順でマップ化した場合、表示名が異なるがIDが同一のものができうるため // ツリーマップ化などを使う場合はロジックでID重複を防ぐ必要がある。 int ret = o1.displayName.compareTo(o2.displayName); if (ret == 0) { ret = o1.id.compareTo(o2.id); } return ret; } }; @Override public int compareTo(CustomLayerOrderKey o) { return COMPARATOR.compare(this, o); } @Override public String toString() { return displayName; } } CharacterManaJ/src/main/java/charactermanaj/model/IndependentWorkingSet.java0000644000175000017500000001525413615720000027406 0ustar paulliupaulliupackage charactermanaj.model; import java.awt.Point; import java.awt.Rectangle; import java.io.File; import java.net.URI; import java.util.Collections; import java.util.List; import java.util.Map; import charactermanaj.model.io.WorkingSetXMLReader; import charactermanaj.ui.model.WallpaperInfo; /** * WorkingSetのXMLの読み込み時に使用する.
* 特定のキャラクターデータのインスタンスとの関連を持たない状態の設定値を保持している.
* * @see WorkingSetXMLReader * @author seraphy */ public class IndependentWorkingSet { /** * ドキュメントベース */ private URI characterDocBase; /** * キャラクターデータのID, Revと基本構造のシグネチャ */ private String characterDataSig; /** * キーはカテゴリid, 値は、パーツ名をキーとしレイヤーごとのカラー情報のリストを値とするマップ */ private Map>> partsColorMap = Collections .emptyMap(); /** * 現在の選択中のパーツと色設定からのパーツセット */ private IndependentPartsSetInfo currentPartsSet; /** * 最後に使用したディレクトリ(保存用) */ private File lastUsedSaveDir; /** * 最後に使用したディレクトリ(Export用) */ private File lastUsedExportDir; /** * 最後に使用したお気に入り情報.
* (最後に使用したお気に入り情報は、ver0.92からサポート)
*/ private IndependentPartsSetInfo lastUsePresetParts; /** * 壁紙情報.
* (壁紙はver0.97からサポート)
*/ private WallpaperInfo wallpaperInfo; /** * ズーム倍率 * (ズーム倍率の保存はv0.999から、未指定の場合はnull) */ private Double zoomFactor; /** * ビューの中央位置 * (ズーム倍率の保存はv0.999から、未指定の場合はnull) */ private Point viewPosition; /** * ウィンドウの位置と大きさ */ private Rectangle windowRect; /** * ダウンロード不要フラグ */ private boolean noNeedDataDownload; public void setCharacterDocBase(URI characterDocBase) { this.characterDocBase = characterDocBase; } public URI getCharacterDocBase() { return characterDocBase; } public String getCharacterDataSig() { return characterDataSig; } public void setCharacterDataSig(String characterDataSig) { this.characterDataSig = characterDataSig; } /** * パーツカラーマップ * * @return キーはカテゴリid, 値は、パーツ名をキーとしレイヤーごとのカラー情報のリストを値とするマップ */ public Map>> getPartsColorMap() { return partsColorMap; } public void setPartsColorMap( Map>> partsColorMap) { if (partsColorMap == null) { this.partsColorMap = Collections.emptyMap(); } this.partsColorMap = partsColorMap; } public void setLastUsedExportDir(File lastUsedExportDir) { this.lastUsedExportDir = lastUsedExportDir; } public File getLastUsedExportDir() { return lastUsedExportDir; } public void setLastUsedSaveDir(File lastUsedSaveDir) { this.lastUsedSaveDir = lastUsedSaveDir; } public File getLastUsedSaveDir() { return lastUsedSaveDir; } public void setWallpaperInfo(WallpaperInfo wallpaperInfo) { this.wallpaperInfo = wallpaperInfo; } public WallpaperInfo getWallpaperInfo() { return wallpaperInfo; } public Double getZoomFactor() { return zoomFactor; } public void setZoomFactor(Double zoomFactor) { this.zoomFactor = zoomFactor; } public Point getViewPosition() { return viewPosition; } public void setViewPosition(Point viewPosition) { this.viewPosition = viewPosition; } public Rectangle getWindowRect() { return windowRect; } public void setWindowRect(Rectangle windowRect) { this.windowRect = windowRect; } public IndependentPartsSetInfo getCurrentPartsSet() { return currentPartsSet; } public void setCurrentPartsSet(IndependentPartsSetInfo currentPartsSet) { this.currentPartsSet = currentPartsSet; } public IndependentPartsSetInfo getLastUsePresetParts() { return lastUsePresetParts; } public void setLastUsePresetParts(IndependentPartsSetInfo lastUsePresetParts) { this.lastUsePresetParts = lastUsePresetParts; } public boolean isNoNeedDataDownload() { return noNeedDataDownload; } public void setNoNeedDataDownload(boolean noNeedDataDownload) { this.noNeedDataDownload = noNeedDataDownload; } /** * キャラクターデータを指定して、指定されたキャラクターデータ上のインスタンスと関連づけられた * カテゴリおよびパーツ名などのインスタンスで構成されるパーツ識別名とカラー情報を、 引数で指定したマップに出力する. * * @param characterData * キャラクターデータ * @param partsColorInfoMap * パーツ識別名とカラー情報を出力するマップ */ public void createCompatible(CharacterData characterData, Map partsColorInfoMap) { if (characterData == null || partsColorInfoMap == null) { throw new IllegalArgumentException(); } for (Map.Entry>> catEntry : partsColorMap .entrySet()) { String categoryId = catEntry.getKey(); for (Map.Entry> layerEntry : catEntry .getValue().entrySet()) { String partsName = layerEntry.getKey(); List partsColorInfos = layerEntry .getValue(); PartsCategory partsCategory = characterData .getPartsCategory(categoryId); if (partsCategory != null) { String localizedName = partsName; PartsIdentifier partsIdentifier = new PartsIdentifier( partsCategory, partsName, localizedName); PartsColorInfo partsColorInfo = IndependentPartsColorInfo .buildPartsColorInfo(characterData, partsCategory, partsColorInfos); if (partsColorInfo != null) { partsColorInfoMap.put(partsIdentifier, partsColorInfo); } } } } } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append("(characterDocBase=").append(characterDocBase); buf.append(", characterDataSig=").append(characterDataSig); buf.append(", partsColorMap=").append(partsColorMap); buf.append(", currentPartsSet=").append(currentPartsSet); buf.append(", lastUsedSaveDir=").append(lastUsedSaveDir); buf.append(", lastUsedExportDir=").append(lastUsedExportDir); buf.append(", noNeedDataDownload=").append(noNeedDataDownload); buf.append(")"); return buf.toString(); } } CharacterManaJ/src/main/java/charactermanaj/model/WorkingSet2.java0000644000175000017500000001437213615720000025312 0ustar paulliupaulliupackage charactermanaj.model; import java.awt.Point; import java.awt.Rectangle; import java.io.File; import java.net.URI; import java.util.Collections; import java.util.List; import java.util.Map; import charactermanaj.ui.model.WallpaperInfo; /** * WorkingSetのXMLの読み込み時に使用する.
* 特定のキャラクターデータのインスタンスとの関連を持たない状態の設定値を保持している.
* * @author seraphy */ public class WorkingSet2 { /** * ドキュメントベース */ private URI characterDocBase; /** * キャラクターデータのID, Revと基本構造のシグネチャ */ private String characterDataSig; /** * キーはカテゴリid, 値は、パーツ名をキーとしレイヤーごとのカラー情報のリストを値とするマップ */ private Map>> partsColorMap = Collections .emptyMap(); /** * 現在の選択中のパーツと色設定からのパーツセット */ private IndependentPartsSetInfo currentPartsSet; /** * 最後に使用したディレクトリ(保存用) */ private File lastUsedSaveDir; /** * 最後に使用したディレクトリ(Export用) */ private File lastUsedExportDir; /** * 最後に使用したお気に入り情報.
* (最後に使用したお気に入り情報は、ver0.92からサポート)
*/ private IndependentPartsSetInfo lastUsePresetParts; /** * 壁紙情報.
* (壁紙はver0.97からサポート)
*/ private WallpaperInfo wallpaperInfo; /** * ズーム倍率 * (ズーム倍率の保存はv0.999から、未指定の場合はnull) */ private Double zoomFactor; /** * ビューの中央位置 * (ズーム倍率の保存はv0.999から、未指定の場合はnull) */ private Point viewPosition; /** * ウィンドウの位置と大きさ */ private Rectangle windowRect; public void setCharacterDocBase(URI characterDocBase) { this.characterDocBase = characterDocBase; } public URI getCharacterDocBase() { return characterDocBase; } public String getCharacterDataSig() { return characterDataSig; } public void setCharacterDataSig(String characterDataSig) { this.characterDataSig = characterDataSig; } /** * パーツカラーマップ * * @return キーはカテゴリid, 値は、パーツ名をキーとしレイヤーごとのカラー情報のリストを値とするマップ */ public Map>> getPartsColorMap() { return partsColorMap; } public void setPartsColorMap( Map>> partsColorMap) { if (partsColorMap == null) { this.partsColorMap = Collections.emptyMap(); } this.partsColorMap = partsColorMap; } public void setLastUsedExportDir(File lastUsedExportDir) { this.lastUsedExportDir = lastUsedExportDir; } public File getLastUsedExportDir() { return lastUsedExportDir; } public void setLastUsedSaveDir(File lastUsedSaveDir) { this.lastUsedSaveDir = lastUsedSaveDir; } public File getLastUsedSaveDir() { return lastUsedSaveDir; } public void setWallpaperInfo(WallpaperInfo wallpaperInfo) { this.wallpaperInfo = wallpaperInfo; } public WallpaperInfo getWallpaperInfo() { return wallpaperInfo; } public Double getZoomFactor() { return zoomFactor; } public void setZoomFactor(Double zoomFactor) { this.zoomFactor = zoomFactor; } public Point getViewPosition() { return viewPosition; } public void setViewPosition(Point viewPosition) { this.viewPosition = viewPosition; } public Rectangle getWindowRect() { return windowRect; } public void setWindowRect(Rectangle windowRect) { this.windowRect = windowRect; } public IndependentPartsSetInfo getCurrentPartsSet() { return currentPartsSet; } public void setCurrentPartsSet(IndependentPartsSetInfo currentPartsSet) { this.currentPartsSet = currentPartsSet; } public IndependentPartsSetInfo getLastUsePresetParts() { return lastUsePresetParts; } public void setLastUsePresetParts(IndependentPartsSetInfo lastUsePresetParts) { this.lastUsePresetParts = lastUsePresetParts; } /** * キャラクターデータを指定して、指定されたキャラクターデータ上のインスタンスと関連づけられた * カテゴリおよびパーツ名などのインスタンスで構成されるパーツ識別名とカラー情報を、 引数で指定したマップに出力する. * * @param characterData * キャラクターデータ * @param partsColorInfoMap * パーツ識別名とカラー情報を出力するマップ */ public void createCompatible(CharacterData characterData, Map partsColorInfoMap) { if (characterData == null || partsColorInfoMap == null) { throw new IllegalArgumentException(); } for (Map.Entry>> catEntry : partsColorMap .entrySet()) { String categoryId = catEntry.getKey(); for (Map.Entry> layerEntry : catEntry .getValue().entrySet()) { String partsName = layerEntry.getKey(); List partsColorInfos = layerEntry .getValue(); PartsCategory partsCategory = characterData .getPartsCategory(categoryId); if (partsCategory != null) { String localizedName = partsName; PartsIdentifier partsIdentifier = new PartsIdentifier( partsCategory, partsName, localizedName); PartsColorInfo partsColorInfo = IndependentPartsColorInfo .buildPartsColorInfo(characterData, partsCategory, partsColorInfos); if (partsColorInfo != null) { partsColorInfoMap.put(partsIdentifier, partsColorInfo); } } } } } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append("(characterDocBase=").append(characterDocBase); buf.append(", characterDataSig=").append(characterDataSig); buf.append(", partsColorMap=").append(partsColorMap); buf.append(", currentPartsSet=").append(currentPartsSet); buf.append(", lastUsedSaveDir=").append(lastUsedSaveDir); buf.append(", lastUsedExportDir=").append(lastUsedExportDir); buf.append(")"); return buf.toString(); } } CharacterManaJ/src/main/java/charactermanaj/model/PartsColorInfo.java0000644000175000017500000001160213615720000026031 0ustar paulliupaulliupackage charactermanaj.model; import java.util.AbstractMap; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.graphics.filters.ColorConvertParameter; /** * パーツ単位のカラーグループを含む色情報のコレクション.
* パーツは複数のレイヤーから構成されるため、レイヤーごとのカラーグループを含む色情報の集合を意味する.
* キーのセットはカテゴリに属するレイヤーに固定されており、追加・削除することはできない.
* @author seraphy */ public final class PartsColorInfo extends AbstractMap implements Cloneable { /** * ロガー */ private static final Logger logger = Logger.getLogger(PartsColorInfo.class.getName()); /** * パーツが属するカテゴリのレイヤー構成に対する色情報のマップ.
*/ private HashMap colorInfoMap = new HashMap(); /** * カテゴリ */ private final PartsCategory partsCategory; /** * カテゴリを指定して色情報が未設定のインスタンスを構築する.
* カテゴリに属するレイヤーが初期化されている.
* @param partsCategory カテゴリ */ public PartsColorInfo(PartsCategory partsCategory) { if (partsCategory == null) { throw new IllegalArgumentException(); } this.partsCategory = partsCategory; init(); } @Override public PartsColorInfo clone() { try { PartsColorInfo inst = (PartsColorInfo) super.clone(); inst.colorInfoMap = new HashMap(); for (Map.Entry entry : colorInfoMap.entrySet()) { Layer layer = entry.getKey(); ColorInfo colorInfo = entry.getValue(); inst.colorInfoMap.put(layer, colorInfo.clone()); } return inst; } catch (CloneNotSupportedException ex) { throw new RuntimeException(ex); } } /** * パーツカラー情報を指定したパーツカテゴリに存在するレイヤーに正規化して返す.
* カテゴリに存在しないレイヤーの情報は破棄され、結果は有効なレイヤーのみの色情報となる.
* @param partsCategory パーツカテゴリ * @return 正規化されたパーツカラー情報 */ public PartsColorInfo createCompatible(PartsCategory partsCategory) { if (partsCategory == null) { throw new IllegalArgumentException(); } PartsColorInfo newInfo = new PartsColorInfo(partsCategory); newInfo.init(); for (Map.Entry entry : colorInfoMap.entrySet()) { Layer layer = entry.getKey(); ColorInfo colorInfo = entry.getValue(); if (partsCategory.hasLayer(layer)) { newInfo.put(layer, colorInfo.clone()); } else { logger.log(Level.INFO, "missing layer '" + layer + "' in " + partsCategory); } } return newInfo; } /** * 2つのパーツカラー情報が同じであるか判定する.
* 双方がnullである場合はtrueとなります.
* いずれか一方がnullである場合はfalseとなります.
* @param a 対象1、null可 * @param b 対象2, null可 * @return 同一であればtrue、そうでなければfalse */ public static boolean equals(PartsColorInfo a, PartsColorInfo b) { if (a == b) { return true; } if (a == null || b == null) { return false; } return a.equals(b); } private void init() { for (Layer layer : partsCategory.getLayers()) { colorInfoMap.put(layer, createColorInfo(layer)); } } protected ColorInfo createColorInfo(Layer layer) { ColorInfo colorInfo = new ColorInfo(); colorInfo.setColorGroup(layer.getColorGroup()); colorInfo.setSyncColorGroup(layer.getColorGroup().isEnabled()); colorInfo.setColorParameter(new ColorConvertParameter()); return colorInfo; } public PartsCategory getPartsCategory() { return partsCategory; } @Override public Set> entrySet() { return Collections.unmodifiableSet(colorInfoMap.entrySet()); } /** * カテゴリに属するレイヤーの色情報を設定する.
* カテゴリに該当しないレイヤーを指定した場合はIllegalArgumentException例外となる.
* @param key レイヤー * @param value 色情報 */ @Override public ColorInfo put(Layer key, ColorInfo value) { if (key == null || value == null) { throw new IllegalArgumentException(); } if (!colorInfoMap.containsKey(key)) { throw new IllegalArgumentException("invalid layer: " + key); } return colorInfoMap.put(key, value); } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append(getClass().getSimpleName() + "@" + Integer.toHexString(System.identityHashCode(this))); buf.append("("); buf.append(colorInfoMap.toString()); buf.append(")"); return buf.toString(); } } CharacterManaJ/src/main/java/charactermanaj/model/AppConfig.java0000644000175000017500000014365413615720000025010 0ustar paulliupaulliupackage charactermanaj.model; import java.awt.Color; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URL; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; import charactermanaj.util.ApplicationLogHandler; import charactermanaj.util.BeanPropertiesUtilities; import charactermanaj.util.BeanPropertiesUtilities.PropertyAccessor; import charactermanaj.util.BeanPropertiesUtilities.PropertyAccessorMap; import charactermanaj.util.ConfigurationDirUtilities; /** * アプリケーションの全域にわたる設定.
* アプリケーション設定は、クラスパス上のリソース、コートベース直下のappConfig.xml、ユーザーごとのappConfig.xmlの順に読み込まれます.
* 設定値は{@link BeanPropertiesUtilities}によってXMLプロパティファイルとして永続化されます。
* * @author seraphy * @see BeanPropertiesUtilities */ public final class AppConfig { /** * アプリケーション設定ファイルの名前 */ private static final String CONFIG_NAME = "appConfig.xml"; /** * 全ユーザー用キャラクターディレクトリのシステムプロパティのキー名.
*/ public static final String COMMON_CHARACTER_DIR_PROPERTY_NAME = "character.dir"; /** * 開発用仕様バージョン番号 */ private static final String DEFAULT_SPECIFICATION_VERSION = "1.0"; /** * ロガー */ private static final Logger logger = Logger.getLogger(AppConfig.class.getName()); /** * シングルトンインスタンス */ private static final AppConfig singleton = new AppConfig(); /** * プロパティ変更リスナのサポート */ private final PropertyChangeSupport propChangeSupport = new PropertyChangeSupport(this); public void addPropertyChangeListener(PropertyChangeListener listener) { propChangeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propChangeSupport.removePropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propChangeSupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propChangeSupport.removePropertyChangeListener(propertyName, listener); } /** * インスタンスを取得する. * * @return インスタンス */ public static AppConfig getInstance() { return singleton; } /** * プライベートコンストラクタ */ private AppConfig() { loadAppVersions(); } private String implementationVersion; private String specificationVersion; /** * 実装バージョンを取得する.
* ビルドされたjarパッケージからバージョン情報を取得する.
* クラスパスの実行からのバージョンは常に「develop」となる.
* * @return 実装バージョン */ public String getImplementationVersion() { return implementationVersion; } /** * 仕様バージョンを取得する.
* ビルドされたjarパッケージからバージョン情報を取得する.
* クラスパスの実行からのバージョンは常に「develop」となる.
* * @return 仕様バージョン */ public String getSpecificationVersion() { return specificationVersion; } /** * ビルドされたjarパッケージからバージョン情報を取得する.
* クラスパスの実行からのバージョンは常に「develop」となる.
*/ private void loadAppVersions() { Package pak = this.getClass().getPackage(); String implementationVersion = "develop"; String specificationVersion = DEFAULT_SPECIFICATION_VERSION; if (pak != null) { String vInfo = pak.getImplementationVersion(); if (vInfo != null && implementationVersion.trim().length() > 0) { implementationVersion = vInfo.trim(); } String specVInfo = pak.getSpecificationVersion(); if (specVInfo != null && specVInfo.trim().length() > 0) { specificationVersion = specVInfo.trim(); } } this.implementationVersion = implementationVersion; this.specificationVersion = specificationVersion; } /** * 設定ファイルのロケール固有版へのファイル末尾の修飾文字列を読み込み順に取得する. * @param locale ロケール、nullの場合はデフォルト * @return ロケールを表すファイル末尾の修飾文字列の読み込み順のリスト */ private String[] getLocalizedSuffix(Locale locale) { if (locale == null) { locale = Locale.getDefault(); } String language = locale.getLanguage(); String country = locale.getCountry(); String variant = locale.getVariant(); return new String[] { "", "_" + language, "_" + language + "_" + country, "_" + language + "_" + country + "_" + variant, }; } /** * 指定されたファイル名の拡張子の前にロケール固有の修飾文字列を付与したリスト作成して返す. * @param base ファイル名 * @param locale ロケール、nullの場合はデフォルト * @return ロケールの検索順序でのロケール固有の修飾文字列が付与されたファイルのリスト */ private List expandLocalizedSuffix(File base, Locale locale) { String path = base.getPath(); int pt = path.lastIndexOf("."); String left, right; if (pt >= 0) { left = path.substring(0, pt); right = path.substring(pt); } else { left = path; right = ""; } ArrayList files = new ArrayList(); for (String suffix : getLocalizedSuffix(locale)) { String newPath = left + suffix + right; //System.out.println("newpath=" + newPath); files.add(new File(newPath)); } return files; } /** * 設定ファイルの読み込み順序で、読み込むべきURIのリストを返す.
*
    *
  • (1) リソース上の/appConfig.xml
  • *
  • (2) appConfigFileシステムプロパティで指定されたファイル
  • *
  • (3) コードベース下のappConfig.xml
  • *
  • (4) アプリケーションデータ保存先のappConfig.xml
  • *
* appConfigFileシステムプロパティがある場合は、(1)(2)の順。
* 指定がない場合は、(1)(3)(4)の順に読み取る.
* * @return 優先順位での設定ファイルの読み込み先URIのリスト * @throws IOException */ public List getCandidateURIs() throws IOException { List uris = new ArrayList(); // リソース中の既定 (ロケール識別あり) getAppConfigResourceURI(uris); // システムプロパティでappConfig.xmlを明示している場合は、それを読み込む。 // (appConfigFileシステムプロパティが空の場合は、リソース埋め込みの既定の設定だけをよみこむ) String specifiedAppConfig = System.getProperty("appConfigFile"); if (specifiedAppConfig != null) { if (specifiedAppConfig.trim().length() > 0) { File specifiedAppConfigFile = new File(specifiedAppConfig); uris.add(specifiedAppConfigFile.toURI()); } } else { // システムプロパティて明示していない場合は、まずコードベースを使用する.(ロケール識別あり) File codeBase = ConfigurationDirUtilities.getApplicationBaseDir(); for (File localizedFile : expandLocalizedSuffix(new File(codeBase, CONFIG_NAME).getCanonicalFile(), null)) { uris.add(localizedFile.toURI()); } // システムプロパティて明示していない場合は、次にユーザディレクトリを使用する. File userDataDir = ConfigurationDirUtilities.getUserDataDir(); uris.add(new File(userDataDir, CONFIG_NAME).toURI()); } return uris; } /** * リソース上のAppConfigの読み込みURIを追記して返す * @param uris */ protected void getAppConfigResourceURI(List uris) { for (File localizedFile : expandLocalizedSuffix(new File(getClass() .getResource("/" + CONFIG_NAME).getPath()), null)) { uris.add(localizedFile.toURI()); } } /** * 保存先の試行順序ごとのファイルのリスト。 * * @return 保存先(優先順) */ public List getPrioritySaveFileList() { ArrayList saveFiles = new ArrayList(); String specifiedAppConfig = System.getProperty("appConfigFile"); if (specifiedAppConfig != null) { // システムプロパティでappConfig.xmlを明示している場合 if (specifiedAppConfig.trim().length() > 0) { File specifiedAppConfigFile = new File(specifiedAppConfig); if (!specifiedAppConfigFile.exists() || specifiedAppConfigFile.canWrite()) { // まだ存在しないか、書き込み可能である場合のみ候補とする. saveFiles.add(specifiedAppConfigFile); } } } else { // システムプロパティappConfigFileがなければユーザディレクトリへ書き込む // ユーザディレクトリは常に候補とする. File userDataDir = ConfigurationDirUtilities.getUserDataDir(); saveFiles.add(new File(userDataDir, CONFIG_NAME)); } return saveFiles; } /** * プロパティをロードする.
* 存在しないか、読み取りに失敗した場合は、該当ファイルはスキップされる.
*/ public void loadConfig() { try { loadConfig(getCandidateURIs()); } catch (IOException ex) { throw new RuntimeException("appConfig.xml loading failed.", ex); } } /** * プロパティをロードする.
* 存在しないか、読み取りに失敗した場合は、該当ファイルはスキップされる.
* @param uris パラメーターの読み込み順 */ public void loadConfig(List uris) { if (uris == null) { uris = Collections.emptyList(); } Properties config = new Properties(); try { for (URI uri : uris) { if (uri == null) { continue; // リソースがない場合はnullになる } // ファイルの実在チェック (チェックできる場合のみ) if ("file".equals(uri.getScheme())) { File file = new File(uri); if (!file.exists()) { logger.log(Level.CONFIG, "appConfig.xml is not found.:" + file); continue; } } // appConfig.xmlの読み込みを行う. // Properties#loadFromXML() はXMLからキーを読み取り、既存のキーに対して上書きする. // XMLに存在しないキーは読み込み前のままなので、繰り返し呼び出すことで「重ね合わせ」することができる. try { URL resourceURL = uri.toURL(); InputStream is = resourceURL.openStream(); try { config.loadFromXML(is); logger.log(Level.CONFIG, "appConfig.xml is loaded.:" + uri); } finally { is.close(); } } catch (FileNotFoundException ex) { logger.log(Level.CONFIG, "appConfig.xml is not found.: " + uri, ex); // 無視する (無い場合は十分にありえるので「情報」レベルでログ。) } catch (Exception ex) { logger.log(Level.WARNING, "appConfig.xml loading failed.: " + uri, ex); // 無視する } } } catch (RuntimeException ex) { throw new RuntimeException("appConfig.xml loading failed.", ex); } BeanPropertiesUtilities.loadFromProperties(this, config); } /** * プロパティをアプリケーションデータの指定した保存先に保存する. * * @throws IOException * 保存に失敗した場合 */ public void saveConfig(List prioritySaveFiles) throws IOException { Properties config = getProperties(); IOException oex = null; for (File configStore : prioritySaveFiles) { try { OutputStream os = new BufferedOutputStream( new FileOutputStream(configStore)); try { config.storeToXML(os, CONFIG_NAME, "UTF-8"); return; // 成功した時点で終了 } finally { os.close(); } } catch (IOException ex) { logger.log(Level.WARNING, "アプリケーション設定の保存に失敗しました" + ex, ex); oex = ex; } } // 例外が発生していれば、最後の例外を返す. if (oex != null) { throw oex; } } /** * プロパティをアプリケーションデータの保存先に保存する. * * @throws IOException * 保存に失敗した場合 */ public void saveConfig() throws IOException { saveConfig(getPrioritySaveFileList()); } /** * アプリケーション設定値のデフォルト値(リソース上のAppConfigのみ)を取得する * @return */ public static Map getDefaultProperties() { PropertyAccessorMap accessorMap = BeanPropertiesUtilities.getPropertyAccessorMap(AppConfig.class); AppConfig dummy = new AppConfig(); // アプリケーションから参照されないダミーのインスタンスを作成する. // リソース上のAppConfigのみ読み込み List uris = new ArrayList(); dummy.getAppConfigResourceURI(uris); dummy.loadConfig(uris); accessorMap.setBean(dummy); // 読み込んだプロパティの書き出し Map defMap = new HashMap(); for (Map.Entry propEntry : accessorMap.entrySet()) { String name = propEntry.getKey(); PropertyAccessor accessor = propEntry.getValue(); Object value = accessor.getValue(); defMap.put(name, value); } return defMap; } /** * Propertiesの値を設定した場合に設定できない項目があるかチェックする.
* このメソッドを呼び出しても、アプリケーション設定自身は何も影響されない.
* * @param props * 適用するプロパティ * @return 設定できなかったプロパティキーのコレクション、問題なければ空が返される. */ public static Set checkProperties(Map props) { if (props == null) { throw new IllegalArgumentException(); } AppConfig dummy = new AppConfig(); // アプリケーションから参照されないダミーのインスタンスを作成する. return update(props, dummy); } /** * Propertiesの値で設定を更新する.
* * @param props * 適用するプロパティ * @return 設定できなかったプロパティキーのコレクション、問題なければ空が返される. */ public Set update(Map props) { return update(props, this); } /** * Propertiesの値で設定を更新する.
* * @param props * 適用するプロパティ * @param bean * 適用するAppConfigのインスタンス(ドライランと本番の切り替え用) * @return 設定できなかったプロパティキーのコレクション、問題なければ空が返される. */ private static Set update(Map props, AppConfig bean) { if (props == null) { throw new IllegalArgumentException(); } HashSet rejectedNames = new HashSet(); PropertyAccessorMap accessorMap = BeanPropertiesUtilities.getPropertyAccessorMap(AppConfig.class); accessorMap.setBean(bean); for (Map.Entry propEntry : props.entrySet()) { String name = propEntry.getKey(); Object value = propEntry.getValue(); PropertyAccessor accessor = accessorMap.get(name); if (accessor == null) { // プロパティがない rejectedNames.add(name); continue; } Class propertyType = accessor.getPropertyType(); if (propertyType.isPrimitive() && value == null) { // プリミティブ型なのにnullは入れられない rejectedNames.add(name); continue; } try { accessor.setValue(value); } catch (Exception ex) { // 何らかの理由でプロパティの設定に失敗している場合 rejectedNames.add(name); logger.log(Level.WARNING, "invalid propery: " + name + " /val=" + value, ex); continue; } } return rejectedNames; } /** * このアプリケーション設定をプロパティに書き出して返します.
* * @return プロパティ */ public Properties getProperties() { Properties config = new Properties(); BeanPropertiesUtilities.saveToProperties(this, config); return config; } /** * プロファイル選択ダイアログのプロファイルのサンプルイメージの背景色 * * @return サンプルイメージの背景色 */ public Color getSampleImageBgColor() { return sampleImageBgColor; } public static final String SAMPLE_IMAGE_BG_COLOR = "sampleImageBgColor"; public void setSampleImageBgColor(Color sampleImageBgColor) { if (sampleImageBgColor == null) { throw new IllegalArgumentException(); } Color old = this.sampleImageBgColor; if (old == null ? sampleImageBgColor != null : !old.equals(sampleImageBgColor)) { this.sampleImageBgColor = sampleImageBgColor; propChangeSupport.firePropertyChange(SAMPLE_IMAGE_BG_COLOR, old, sampleImageBgColor); } } private Color sampleImageBgColor = Color.white; /** * デフォルトのイメージ背景色を取得する. * * @return デフォルトのイメージ背景色 */ public Color getDefaultImageBgColor() { return defaultImageBgColor; } public static final String DEFAULT_IMAGE_BG_COLOR = "defaultImageBgColor"; public void setDefaultImageBgColor(Color defaultImageBgColor) { if (defaultImageBgColor == null) { throw new IllegalArgumentException(); } Color old = this.defaultImageBgColor; if (old == null ? defaultImageBgColor != null : !old.equals(defaultImageBgColor)) { this.defaultImageBgColor = defaultImageBgColor; propChangeSupport.firePropertyChange(DEFAULT_IMAGE_BG_COLOR, old, defaultImageBgColor); } } private Color defaultImageBgColor = Color.white; /** * 使用中アイテムの背景色を取得する. * * @return 使用中アイテムの背景色 */ public Color getCheckedItemBgColor() { return checkedItemBgColor; } public static final String CHECKED_ITEM_BG_COLOR = "checkedItemBgColor"; public void setCheckedItemBgColor(Color checkedItemBgColor) { if (checkedItemBgColor == null) { throw new IllegalArgumentException(); } Color old = this.checkedItemBgColor; if (old == null ? checkedItemBgColor != null : !old.equals(checkedItemBgColor)) { this.checkedItemBgColor = checkedItemBgColor; propChangeSupport.firePropertyChange(CHECKED_ITEM_BG_COLOR, old, checkedItemBgColor); } } private Color checkedItemBgColor = Color.cyan.brighter(); /** *  選択アイテムの背景色を取得する * * @return 選択アイテムの背景色 */ public Color getSelectedItemBgColor() { return selectedItemBgColor; } public static final String SELECTED_ITEM_BG_COLOR = "selectedItemBgColor"; public void setSelectedItemBgColor(Color selectedItemBgColor) { if (selectedItemBgColor == null) { throw new IllegalArgumentException(); } Color old = this.selectedItemBgColor; if (old == null ? selectedItemBgColor != null : !old.equals(selectedItemBgColor)) { this.selectedItemBgColor = selectedItemBgColor; propChangeSupport.firePropertyChange(SELECTED_ITEM_BG_COLOR, old, selectedItemBgColor); } } private Color selectedItemBgColor = Color.orange; /** * 不備のあるデータ行の背景色を取得する. * * @return 不備のあるデータ行の背景色 */ public Color getInvalidBgColor() { return invalidBgColor; } public static final String INVALID_BG_COLOR = "invalidBgColor"; public void setInvalidBgColor(Color invalidBgColor) { if (invalidBgColor == null) { throw new IllegalArgumentException(); } Color old = this.invalidBgColor; if (old == null ? invalidBgColor != null : !old.equals(invalidBgColor)) { this.invalidBgColor = invalidBgColor; propChangeSupport.firePropertyChange(INVALID_BG_COLOR, old, invalidBgColor); } } private Color invalidBgColor = Color.red.brighter().brighter(); /** * JPEG画像変換時の圧縮率を取得する. * * @return 圧縮率 */ public float getCompressionQuality() { return compressionQuality; } public static final String COMPRESSION_QUALITY = "compressionQuality"; public void setCompressionQuality(float compressionQuality) { if (compressionQuality < .1f || compressionQuality > 1f) { throw new IllegalArgumentException(); } float old = this.compressionQuality; if (old != compressionQuality) { this.compressionQuality = compressionQuality; propChangeSupport.firePropertyChange(COMPRESSION_QUALITY, old, compressionQuality); } } private float compressionQuality = .8f; /** * エクスポートウィザードのプリセットにパーツ不足時の警告色(前景色)を取得する. * * @return エクスポートウィザードのプリセットにパーツ不足時の警告色(前景色) */ public Color getExportPresetWarningsForegroundColor() { return exportPresetWarningsForegroundColor; } public static final String EXPORT_PRESET_WARNINGS_FOREGROUND_COLOR = "exportPresetWarningsForegroundColor"; public void setExportPresetWarningsForegroundColor(Color exportPresetWarningsForegroundColor) { if (exportPresetWarningsForegroundColor == null) { throw new IllegalArgumentException(); } Color old = this.exportPresetWarningsForegroundColor; if (old == null ? exportPresetWarningsForegroundColor != null : !old.equals(exportPresetWarningsForegroundColor)) { this.exportPresetWarningsForegroundColor = exportPresetWarningsForegroundColor; propChangeSupport.firePropertyChange(EXPORT_PRESET_WARNINGS_FOREGROUND_COLOR, old, exportPresetWarningsForegroundColor); } } private Color exportPresetWarningsForegroundColor = Color.red; /** * JARファイル転送用バッファサイズ.
* * @return JARファイル転送用バッファサイズ. */ public int getJarTransferBufferSize() { return jarTransferBufferSize; } public static final String JAR_TRANSFER_BUFFER_SIZE = "jarTransferBufferSize"; public void setJarTransferBufferSize(int jarTransferBufferSize) { if (jarTransferBufferSize <= 0) { throw new IllegalArgumentException(); } int old = this.jarTransferBufferSize; if (old != jarTransferBufferSize) { this.jarTransferBufferSize = jarTransferBufferSize; propChangeSupport.firePropertyChange(JAR_TRANSFER_BUFFER_SIZE, old, jarTransferBufferSize); } } private int jarTransferBufferSize = 4096; /** * ZIPファイル名のエンコーディング.
* * @return ZIPファイル名のエンコーディング.
*/ public String getZipNameEncoding() { return zipNameEncoding; } public static final String ZIP_NAME_ENCODING = "zipNameEncoding"; public void setZipNameEncoding(String zipNameEncoding) { if (zipNameEncoding == null) { throw new IllegalArgumentException(); } try { Charset.forName(zipNameEncoding); } catch (Exception ex) { throw new RuntimeException("unsupported charset: " + zipNameEncoding); } String old = this.zipNameEncoding; if (old == null ? zipNameEncoding != null : !old.equals(zipNameEncoding)) { this.zipNameEncoding = zipNameEncoding; propChangeSupport.firePropertyChange(ZIP_NAME_ENCODING, old, zipNameEncoding); } } private String zipNameEncoding = "csWindows31J"; /** * ディセーブルなテーブルのセルのフォアグラウンドカラーを取得する. * * @return ディセーブルなテーブルのセルのフォアグラウンドカラー */ public Color getDisabledCellForgroundColor() { return disabledCellForegroundColor; } public static final String DISABLED_CELL_FOREGROUND_COLOR = "disabledCellForegroundColor"; public void setDisabledCellForegroundColor(Color disabledCellForegroundColor) { if (disabledCellForegroundColor == null) { throw new IllegalArgumentException(); } Color old = this.disabledCellForegroundColor; if (old == null ? disabledCellForegroundColor != null : !old.equals(disabledCellForegroundColor)) { this.disabledCellForegroundColor = disabledCellForegroundColor; propChangeSupport.firePropertyChange(DISABLED_CELL_FOREGROUND_COLOR, old, disabledCellForegroundColor); } } private Color disabledCellForegroundColor = Color.gray; /** * ディレクトリを監視する間隔(mSec)を取得する. * * @return ディレクトリを監視する間隔(mSec) */ public int getDirWatchInterval() { return dirWatchInterval; } public static final String DIR_WATCH_INTERVAL = "dirWatchInterval"; public void setDirWatchInterval(int dirWatchInterval) { if (dirWatchInterval <= 0) { throw new IllegalArgumentException(); } int old = this.dirWatchInterval; if (old != dirWatchInterval) { this.dirWatchInterval = dirWatchInterval; propChangeSupport.firePropertyChange(DIR_WATCH_INTERVAL, old, dirWatchInterval); } } private int dirWatchInterval = 7 * 1000; /** * ディレクトリの監視を有効にするか? * * @return ディレクトリの監視を有効にする場合はtrue */ public boolean isEnableDirWatch() { return enableDirWatch; } public static final String ENABLE_DIR_WATCH = "enableDirWatch"; public void setEnableDirWatch(boolean enableDirWatch) { boolean old = this.enableDirWatch; if (old != enableDirWatch) { this.enableDirWatch = enableDirWatch; propChangeSupport.firePropertyChange(ENABLE_DIR_WATCH, old, enableDirWatch); } } private boolean enableDirWatch = true; /** * ファイル転送に使うバッファサイズ.
* * @return バッファサイズ */ public int getFileTransferBufferSize() { return fileTransferBufferSize; } public static final String FILE_TRANSFER_BUFFER_SIZE = "fileTransferBufferSize"; public void setFileTransferBufferSize(int fileTransferBufferSize) { if (fileTransferBufferSize <= 0) { throw new IllegalArgumentException(); } int old = this.fileTransferBufferSize; if (old != fileTransferBufferSize) { this.fileTransferBufferSize = fileTransferBufferSize; propChangeSupport.firePropertyChange(FILE_TRANSFER_BUFFER_SIZE, old, fileTransferBufferSize); } } private int fileTransferBufferSize = 4096; /** * プレビューのインジケータを表示するまでのディレイ(mSec)を取得する. * * @return プレビューのインジケータを表示するまでのディレイ(mSec) */ public long getPreviewIndicatorDelay() { return previewIndeicatorDelay; } public static final String PREVIEW_INDEICATOR_DELAY = "previewIndeicatorDelay"; public void setPreviewIndeicatorDelay(long previewIndeicatorDelay) { if (previewIndeicatorDelay < 0) { throw new IllegalArgumentException(); } long old = this.previewIndeicatorDelay; if (old != previewIndeicatorDelay) { this.previewIndeicatorDelay = previewIndeicatorDelay; propChangeSupport.firePropertyChange(PREVIEW_INDEICATOR_DELAY, old, previewIndeicatorDelay); } } private long previewIndeicatorDelay = 300; /** * 情報ダイアログの編集ボタンを「開く」アクションにする場合はtrue、「編集」アクションにする場合はfalse * * @return trueならばOpen、falseならばEdit */ public boolean isInformationDialogOpenMethod() { return informationDialogOpenMethod; } public static final String INFORMATION_DIALOG_OPEN_METHOD = "informationDialogOpenMethod"; public void setInformationDialogOpenMethod( boolean informationDialogOpenMethod) { boolean old = this.informationDialogOpenMethod; if (old != informationDialogOpenMethod) { this.informationDialogOpenMethod = informationDialogOpenMethod; propChangeSupport.firePropertyChange("informationDialogOpenMethod", old, informationDialogOpenMethod); } } private boolean informationDialogOpenMethod = true; /** * ログを常に残すか?
* falseの場合は{@link ApplicationLogHandler}の実装に従って終了時に 必要なければログは削除される.
* * @return 常に残す場合はtrue、そうでなければfalse */ public boolean isNoRemoveLog() { return noRemoveLog; } public static final String NO_REMOVE_LOG = "noRemoveLog"; public void setNoRemoveLog(boolean noRemoveLog) { boolean old = this.noRemoveLog; if (old != noRemoveLog) { this.noRemoveLog = noRemoveLog; propChangeSupport.firePropertyChange(NO_REMOVE_LOG, old, noRemoveLog); } } private boolean noRemoveLog = false; /** * テーブルのグリッド色.
* * @return テーブルのグリッド色 */ public Color getGridColor() { return gridColor; } public static final String GRID_COLOR = "gridColor"; public void setGridColor(Color gridColor) { if (gridColor == null) { throw new IllegalArgumentException(); } Color old = this.gridColor; if (old == null ? gridColor != null : !old.equals(gridColor)) { this.gridColor = gridColor; propChangeSupport.firePropertyChange(GRID_COLOR, old, gridColor); } } private Color gridColor = Color.gray; /** * カラーダイアログの値が変更されたら、自動的にプレビューを更新するか? * * @return カラーダイアログの値が変更されたら、自動的にプレビューを更新する場合はtrue (デフォルトはtrue) */ public boolean isEnableAutoColorChange() { return enableAutoColorChange; } public static final String ENABLE_AUTO_COLOR_CHANGE = "enableAutoColorChange"; public void setEnableAutoColorChange(boolean enableAutoColorChange) { boolean old = this.enableAutoColorChange; if (old != enableAutoColorChange) { this.enableAutoColorChange = enableAutoColorChange; propChangeSupport.firePropertyChange(ENABLE_AUTO_COLOR_CHANGE, old, enableAutoColorChange); } } private boolean enableAutoColorChange = true; public static final String AUTHOR_EDIT_CONFLICT_BG_COLOR = "authorEditConflictBgColor"; public void setAuthorEditConflictBgColor(Color authorEditConflictBgColor) { if (authorEditConflictBgColor == null) { throw new IllegalArgumentException(); } Color old = this.authorEditConflictBgColor; if (old == null ? authorEditConflictBgColor != null : !old.equals(authorEditConflictBgColor)) { this.authorEditConflictBgColor = authorEditConflictBgColor; propChangeSupport.firePropertyChange(AUTHOR_EDIT_CONFLICT_BG_COLOR, old, authorEditConflictBgColor); } } /** * パーツの作者編集時に複数作者を選択した場合のに入力ボックスの背景色 * * @return 背景色 */ public Color getAuthorEditConflictBgColor() { return authorEditConflictBgColor; } Color authorEditConflictBgColor = Color.yellow; public static final String MAIN_FRAME_MAX_WIDTH = "mainFrameMaxWidth"; public void setMainFrameMaxWidth(int mainFrameMaxWidth) { int old = mainFrameMaxWidth; if (old != mainFrameMaxWidth) { this.mainFrameMaxWidth = mainFrameMaxWidth; propChangeSupport.firePropertyChange(MAIN_FRAME_MAX_WIDTH, old, mainFrameMaxWidth); } } /** * メインフレームの初期表示時の最大幅 * * @return メインフレームの初期表示時の最大幅 */ public int getMainFrameMaxWidth() { return mainFrameMaxWidth; } private int mainFrameMaxWidth = 800; public static final String MAIN_FRAME_MAX_HEIGHT = "mainFrameMaxHeight"; public void setMainFrameMaxHeight(int mainFrameMaxHeight) { int old = this.mainFrameMaxHeight; if (old != mainFrameMaxHeight) { this.mainFrameMaxHeight = mainFrameMaxHeight; propChangeSupport.firePropertyChange(MAIN_FRAME_MAX_HEIGHT, old, mainFrameMaxHeight); } } /** * メインフレームの初期表示時の最大高さ * * @return メインフレームの初期表示時の最大高さ */ public int getMainFrameMaxHeight() { return mainFrameMaxHeight; } private int mainFrameMaxHeight = 600; /** * カラーダイアログで存在しないレイヤーをディセーブルにしない. * * @return ディセーブルにしない場合はtrue */ public boolean isNotDisableLayerTab() { return notDisableLayerTab; } public static final String NOT_DISABLE_LAYER_TAB = "notDisableLayerTab"; public void setNotDisableLayerTab(boolean notDisableLayerTab) { boolean old = this.notDisableLayerTab; if (old != notDisableLayerTab) { this.notDisableLayerTab = notDisableLayerTab; propChangeSupport.firePropertyChange(NOT_DISABLE_LAYER_TAB, old, notDisableLayerTab); } } private boolean notDisableLayerTab; /** * ログを消去する日数.
* この指定日を経過した古いログは削除される.
* 0の場合は削除されない. * * @return */ public long getPurgeLogDays() { return purgeLogDays; } public static final String PURGE_LOG_DAYS = "purgeLogDays"; public void setPurgeLogDays(long purgeLogDays) { long old = this.purgeLogDays; if (old != purgeLogDays) { this.purgeLogDays = purgeLogDays; propChangeSupport.firePropertyChange(PURGE_LOG_DAYS, old, purgeLogDays); } } private long purgeLogDays = 10; public String getPartsColorGroupPattern() { return partsColorGroupPattern; } public static final String PARTS_COLOR_GROUP_PATTERN = "partsColorGroupPattern"; public void setPartsColorGroupPattern(String pattern) { if (pattern != null && pattern.trim().length() > 0) { Pattern.compile(pattern); } String old = this.partsColorGroupPattern; if (old == null ? pattern != null : !old.equals(pattern)) { this.partsColorGroupPattern = pattern; propChangeSupport.firePropertyChange(PARTS_COLOR_GROUP_PATTERN, old, pattern); } } private String partsColorGroupPattern = "^.*\\(@\\).*$"; private Color selectPanelTitleColor = Color.BLUE; public Color getSelectPanelTitleColor() { return selectPanelTitleColor; } public static final String SELECT_PANEL_TITLE_COLOR = "selectPanelTitleColor"; public void setSelectPanelTitleColor(Color selectPanelTitleColor) { if (selectPanelTitleColor == null) { throw new IllegalArgumentException(); } Color old = this.selectPanelTitleColor; if (old == null ? selectPanelTitleColor != null : !old.equals(selectPanelTitleColor)) { this.selectPanelTitleColor = selectPanelTitleColor; propChangeSupport.firePropertyChange(SELECT_PANEL_TITLE_COLOR, old, selectPanelTitleColor); } } private boolean enableAutoShrinkPanel; public boolean isEnableAutoShrinkPanel() { return enableAutoShrinkPanel; } public static final String ENABLE_AUTO_SHRINK_PANEL = "enableAutoShrinkPanel"; public void setEnableAutoShrinkPanel(boolean enableAutoShrinkPanel) { boolean old = this.enableAutoShrinkPanel; if (old != enableAutoShrinkPanel) { this.enableAutoShrinkPanel = enableAutoShrinkPanel; propChangeSupport.firePropertyChange(ENABLE_AUTO_SHRINK_PANEL, old, enableAutoShrinkPanel); } } public boolean isDisableWatchDirIfNotWritable() { return disableWatchDirIfNotWritable; } public static final String DISABLE_WATCH_DIR_IF_NOT_WRITABLE = "disableWatchDirIfNotWritable"; public void setDisableWatchDirIfNotWritable(boolean disableWatchDirIfNotWritable) { boolean old = this.disableWatchDirIfNotWritable; if (old != disableWatchDirIfNotWritable) { this.disableWatchDirIfNotWritable = disableWatchDirIfNotWritable; propChangeSupport.firePropertyChange(DISABLE_WATCH_DIR_IF_NOT_WRITABLE, old, disableWatchDirIfNotWritable); } } private boolean disableWatchDirIfNotWritable = true; public static final String ENABLE_PNG_SUPPORT_FOR_WINDOWS = "enablePNGSupportForWindows"; public void setEnablePNGSupportForWindows(boolean enablePNGSupportForWindows) { boolean old = this.enablePNGSupportForWindows; if (old != enablePNGSupportForWindows) { this.enablePNGSupportForWindows = enablePNGSupportForWindows; propChangeSupport.firePropertyChange(ENABLE_PNG_SUPPORT_FOR_WINDOWS, old, enablePNGSupportForWindows); } } public boolean isEnablePNGSupportForWindows() { return enablePNGSupportForWindows; } private boolean enablePNGSupportForWindows = true; /** * 画像表示(通常モード)でオプティマイズを有効にする最大倍率. */ private double renderingOptimizeThresholdForNormal = 2.; public static final String RENDERING_OPTIMIZE_THRESHOLD_FOR_NORMAL = "renderingOptimizeThresholdForNormal"; public void setRenderingOptimizeThresholdForNormal( double renderingOptimizeThresholdForNormal) { double old = this.renderingOptimizeThresholdForNormal; if (old != renderingOptimizeThresholdForNormal) { this.renderingOptimizeThresholdForNormal = renderingOptimizeThresholdForNormal; propChangeSupport.firePropertyChange(RENDERING_OPTIMIZE_THRESHOLD_FOR_NORMAL, old, renderingOptimizeThresholdForNormal); } } public double getRenderingOptimizeThresholdForNormal() { return renderingOptimizeThresholdForNormal; } /** * 画像表示(チェックモード)でオプティマイズを有効にする最大倍率. */ private double renderingOptimizeThresholdForCheck = 0.; public static final String RENDERING_OPTIMIZE_THRESHOLD_FOR_CHECK = "renderingOptimizeThresholdForCheck"; public void setRenderingOptimizeThresholdForCheck( double renderingOptimizeThresholdForCheck) { double old = this.renderingOptimizeThresholdForCheck; if (old != renderingOptimizeThresholdForCheck) { this.renderingOptimizeThresholdForCheck = renderingOptimizeThresholdForCheck; propChangeSupport.firePropertyChange(RENDERING_OPTIMIZE_THRESHOLD_FOR_CHECK, old, renderingOptimizeThresholdForCheck); } } public double getRenderingOptimizeThresholdForCheck() { return renderingOptimizeThresholdForCheck; } /** * バイキュービックをサポートする場合 */ private boolean enableInterpolationBicubic = true; public static final String ENABLE_INTERPOLATION_BICUBIC = "enableInterpolationBicubic"; public void setEnableInterpolationBicubic(boolean enableInterpolationBicubic) { boolean old = this.enableInterpolationBicubic; if (old != enableInterpolationBicubic) { this.enableInterpolationBicubic = enableInterpolationBicubic; propChangeSupport.firePropertyChange(ENABLE_INTERPOLATION_BICUBIC, old, enableInterpolationBicubic); } } public boolean isEnableInterpolationBicubic() { return enableInterpolationBicubic; } /** * 事前定義済みの倍率候補.
*/ private String predefinedZoomRanges = "20, 50, 80, 100, 120, 150, 200, 300, 400, 800"; public String getPredefinedZoomRanges() { return predefinedZoomRanges; } public static final String PREDEFINED_ZOOM_RANGES = "predefinedZoomRanges"; public void setPredefinedZoomRanges(String predefinedZoomRanges) { if (predefinedZoomRanges == null) { throw new IllegalArgumentException(); } String old = this.predefinedZoomRanges; if (old == null ? predefinedZoomRanges != null : !old.equals(predefinedZoomRanges)) { this.predefinedZoomRanges = predefinedZoomRanges; propChangeSupport.firePropertyChange(PREDEFINED_ZOOM_RANGES, old, predefinedZoomRanges); } } /** * ズームパネルを初期状態で表示するか? */ private boolean enableZoomPanel = true; public boolean isEnableZoomPanel() { return enableZoomPanel; } public static final String ENABLE_ZOOM_PANEL = "enableZoomPanel"; public void setEnableZoomPanel(boolean enableZoomPanel) { boolean old = this.enableZoomPanel; if (old != enableZoomPanel) { this.enableZoomPanel = enableZoomPanel; propChangeSupport.firePropertyChange(ENABLE_ZOOM_PANEL, old, enableZoomPanel); } } /** * ズームパネルをアクティブにする下部範囲 */ private int zoomPanelActivationArea = 30; public int getZoomPanelActivationArea() { return zoomPanelActivationArea; } public static final String ZOOM_PANEL_ACTIVATION_AREA = "zoomPanelActivationArea"; public void setZoomPanelActivationArea(int zoomPanelActivationArea) { int old = this.zoomPanelActivationArea; if (old != zoomPanelActivationArea) { this.zoomPanelActivationArea = zoomPanelActivationArea; propChangeSupport.firePropertyChange(ZOOM_PANEL_ACTIVATION_AREA, old, zoomPanelActivationArea); } } /** * レンダリングヒントを使用するか? */ private boolean enableRenderingHints = true; public static final String ENABLE_RENDERING_HINTS = "enableRenderingHints"; public void setEnableRenderingHints(boolean enableRenderingHints) { boolean old = this.enableRenderingHints; if (old != enableRenderingHints) { this.enableRenderingHints = enableRenderingHints; propChangeSupport.firePropertyChange(ENABLE_RENDERING_HINTS, old, enableRenderingHints); } } public boolean isEnableRenderingHints() { return enableRenderingHints; } /** * グリッド描画とマスク */ private int drawGridMask = 2; public int getDrawGridMask() { return drawGridMask; } public static final String DRAW_GRID_MASK = "drawGridMask"; public void setDrawGridMask(int drawGridMask) { drawGridMask &= 0x03; int old = this.drawGridMask; if (old != drawGridMask) { this.drawGridMask = drawGridMask; propChangeSupport.firePropertyChange(DRAW_GRID_MASK, old, drawGridMask); } } private Color previewGridColor = new Color(0x7f7f0000, true); public Color getPreviewGridColor() { return previewGridColor; } public static final String PREVIEW_GRID_COLOR = "previewGridColor"; public void setPreviewGridColor(Color previewGridColor) { Color old = this.previewGridColor; if (old == null ? previewGridColor != null : !old.equals(previewGridColor)) { this.previewGridColor = previewGridColor; propChangeSupport.firePropertyChange(PREVIEW_GRID_COLOR, old, previewGridColor); } } private int previewGridSize = 20; public int getPreviewGridSize() { return previewGridSize; } public static final String PREVIEW_GRID_SIZE = "previewGridSize"; public void setPreviewGridSize(int previewGridSize) { int old = this.previewGridSize; if (old != previewGridSize) { this.previewGridSize = previewGridSize; propChangeSupport.firePropertyChange(PREVIEW_GRID_SIZE, old, previewGridSize); } } /** * チェックモード時の余白サイズ(片側) */ private int previewUnfilledSpaceForCheckMode = 0; public int getPreviewUnfilledSpaceForCheckMode() { return previewUnfilledSpaceForCheckMode; } public static final String PREVIEW_UNFILLED_SPACE_FOR_CHECK_MODE = "previewUnfilledSpaceForCheckMode"; public void setPreviewUnfilledSpaceForCheckMode(int previewUnfilledSpaceForCheckMode) { int old = this.previewUnfilledSpaceForCheckMode; if (old != previewUnfilledSpaceForCheckMode) { this.previewUnfilledSpaceForCheckMode = previewUnfilledSpaceForCheckMode; propChangeSupport.firePropertyChange(PREVIEW_UNFILLED_SPACE_FOR_CHECK_MODE, old, previewUnfilledSpaceForCheckMode); } } /** * チェックモードでツールチップを表示するか? */ private boolean enableCheckInfoTooltip = true; public boolean isEnableCheckInfoTooltip() { return enableCheckInfoTooltip; } public static final String ENABLE_CHECK_INFO_TOOLTIP = "enableCheckInfoTooltip"; public void setEnableCheckInfoTooltip(boolean enableCheckInfoTooltip) { boolean old = this.enableCheckInfoTooltip; if (old != enableCheckInfoTooltip) { this.enableCheckInfoTooltip = enableCheckInfoTooltip; propChangeSupport.firePropertyChange(ENABLE_CHECK_INFO_TOOLTIP, old, enableCheckInfoTooltip); } } /** * ホイールによるスクロールの単位.
*/ private int wheelScrollUnit = 10; public int getWheelScrollUnit() { return wheelScrollUnit; } public static final String WHEEL_SCROLL_UNIT = "wheelScrollUnit"; public void setWheelScrollUnit(int wheelScrollUnit) { int old = this.wheelScrollUnit; if (old != wheelScrollUnit) { this.wheelScrollUnit = wheelScrollUnit; propChangeSupport.firePropertyChange(WHEEL_SCROLL_UNIT, old, wheelScrollUnit); } } /** * 壁紙にオフスクリーン描画を使用するか?.
* (あまり劇的なパフォーマンス効果はない.) */ private boolean enableOffscreenWallpaper = false; public boolean isEnableOffscreenWallpaper() { return enableOffscreenWallpaper; } public static final String ENABLE_OFFSCREEN_WALLPAPER = "enableOffscreenWallpaper"; public void setEnableOffscreenWallpaper(boolean enableOffscreenWallpaper) { boolean old = this.enableOffscreenWallpaper; if (old != enableOffscreenWallpaper) { this.enableOffscreenWallpaper = enableOffscreenWallpaper; propChangeSupport.firePropertyChange(ENABLE_OFFSCREEN_WALLPAPER, old, enableOffscreenWallpaper); } } /** * 壁紙のオフスクリーンの既定サイズ. */ private int offscreenWallpaperSize = 300; public int getOffscreenWallpaperSize() { return offscreenWallpaperSize; } private static final String OFFSCREEN_WALLPAPER_SIZE = "offscreenWallpaperSize"; public void setOffscreenWallpaperSize(int offscreenWallpaperSize) { int old = this.offscreenWallpaperSize; if (old != offscreenWallpaperSize) { this.offscreenWallpaperSize = offscreenWallpaperSize; propChangeSupport.firePropertyChange(OFFSCREEN_WALLPAPER_SIZE, old, offscreenWallpaperSize); } } /** * ランダム選択パーツの履歴数 */ private int randomChooserMaxHistory = 10; public int getRandomChooserMaxHistory() { return randomChooserMaxHistory; } public static final String RANDOM_CHOOSER_MAX_HISTORY = "randomChooserMaxHistory"; public void setRandomChooserMaxHistory(int randomChooserMaxHistory) { int old = this.randomChooserMaxHistory; if (old != randomChooserMaxHistory) { this.randomChooserMaxHistory = randomChooserMaxHistory; propChangeSupport.firePropertyChange(RANDOM_CHOOSER_MAX_HISTORY, old, randomChooserMaxHistory); } } /** * デフォルトのフォントサイズ、0以下の場合はシステム既定のまま */ private int defaultFontSize = 12; public int getDefaultFontSize() { return defaultFontSize; } public static final String DEFAULT_FONT_SIZE = "defaultFontSize"; public void setDefaultFontSize(int defaultFontSize) { int old = this.defaultFontSize; if (old != defaultFontSize) { this.defaultFontSize = defaultFontSize; propChangeSupport.firePropertyChange(DEFAULT_FONT_SIZE, old, defaultFontSize); } } /** * デフォルトのフォントファミリー、カンマ区切り */ private String fontPriority = "Lucida Grande"; public String getFontPriority() { return fontPriority; } public static final String FONT_PRIORITY = "fontPriority"; public void setFontPriority(String fontPriority) { if (fontPriority == null) { throw new IllegalArgumentException(); } String old = this.fontPriority; if (old == null ? fontPriority != null : !old.equals(fontPriority)) { this.fontPriority = fontPriority; propChangeSupport.firePropertyChange(FONT_PRIORITY, old, fontPriority); } } /** * ウィンドウの位置、サイズ、スクロールバーの位置、ズームの状態を復元するか? */ private boolean enableRestoreWindow = false; public boolean isEnableRestoreWindow() { return enableRestoreWindow; } public static final String ENABLE_RESTORE_WINDOW = "enableRestoreWindow"; public void setEnableRestoreWindow(boolean enableRestoreWindow) { boolean old = this.enableRestoreWindow; if (old != enableRestoreWindow) { this.enableRestoreWindow = enableRestoreWindow; propChangeSupport.firePropertyChange(ENABLE_RESTORE_WINDOW, old, enableRestoreWindow); } } private boolean enableColorAdvancedSettings = true; public boolean isEnableColorAdvancedSettings() { return enableColorAdvancedSettings; } public static final String ENABLE_COLOR_ADVANCED_SETTINGS = "enableColorAdvancedSettings"; public void setEnableColorAdvancedSettings(boolean enableColorAdvancedSettings) { boolean old = this.enableColorAdvancedSettings; if (old != enableColorAdvancedSettings) { this.enableColorAdvancedSettings = enableColorAdvancedSettings; propChangeSupport.firePropertyChange(ENABLE_COLOR_ADVANCED_SETTINGS, old, enableRestoreWindow); } } private boolean useRecycleBinIfSupported = true; public boolean isUseRecycleBinIfSupported() { return useRecycleBinIfSupported; } public static final String USE_RECYCLE_BIN_IF_SUPPORTED = "useRecycleBinIfSupported"; public void setUseRecycleBinIfSupported(boolean useRecycleBinIfSupported) { boolean old = this.useRecycleBinIfSupported; if (old != useRecycleBinIfSupported) { this.useRecycleBinIfSupported = useRecycleBinIfSupported; propChangeSupport.firePropertyChange(USE_RECYCLE_BIN_IF_SUPPORTED, old, useRecycleBinIfSupported); } } public boolean useRLECompressionForPSD = true; private static final String USE_RLE_COMPRESSION_FOR_PSD = "useRLECompressionForPSD"; public boolean isUseRLECompressionForPSD() { return useRLECompressionForPSD; } public void setUseRLECompressionForPSD(boolean useRLECompressionForPSD) { boolean old = this.useRLECompressionForPSD; if (old != useRLECompressionForPSD) { this.useRLECompressionForPSD = useRLECompressionForPSD; propChangeSupport.firePropertyChange(USE_RLE_COMPRESSION_FOR_PSD, old, useRLECompressionForPSD); } } private String impersonateUserAgent = "curl/7.58.0"; private static final String IMPERSONATE_USER_AGENT = "impersonateUserAgent"; public String getImpersonateUserAgent() { return impersonateUserAgent; } public void setImpersonateUserAgent(String impersonateUserAgent) { String old = this.impersonateUserAgent; this.impersonateUserAgent = impersonateUserAgent; if (old == null ? impersonateUserAgent != null : !old.equals(impersonateUserAgent)) { this.impersonateUserAgent = impersonateUserAgent; propChangeSupport.firePropertyChange(IMPERSONATE_USER_AGENT, old, impersonateUserAgent); } } private boolean deleteDownloadFileOnExit = true; private static final String DELETE_DOWNLOAD_FILE_ON_EXIT = "deleteDownloadFileOnExit"; public boolean isDeleteDownloadFileOnExit() { return deleteDownloadFileOnExit; } public void setDeleteDownloadFileOnExit(boolean deleteDownloadFileOnExit) { boolean old = this.deleteDownloadFileOnExit; if (old != deleteDownloadFileOnExit) { this.deleteDownloadFileOnExit = deleteDownloadFileOnExit; propChangeSupport.firePropertyChange(DELETE_DOWNLOAD_FILE_ON_EXIT, old, deleteDownloadFileOnExit); } } } CharacterManaJ/src/main/java/charactermanaj/model/CharacterDataChangeEvent.java0000644000175000017500000000147113615720000027726 0ustar paulliupaulliupackage charactermanaj.model; import java.util.EventObject; public class CharacterDataChangeEvent extends EventObject { private static final long serialVersionUID = -99746684880598436L; private CharacterData characterData; private boolean changeStructure; private boolean reloadPartsAndFavorites; public CharacterDataChangeEvent(Object src, CharacterData characterData, boolean changeStructure, boolean reloadPartsAndFavorites) { super(src); this.characterData = characterData; this.changeStructure = changeStructure; this.reloadPartsAndFavorites = reloadPartsAndFavorites; } public CharacterData getCharacterData() { return characterData; } public boolean isChangeStructure() { return changeStructure; } public boolean isReloadPartsAndFavorites() { return reloadPartsAndFavorites; } } CharacterManaJ/src/main/java/charactermanaj/model/PartsSpecResolver.java0000644000175000017500000000200313615720000026546 0ustar paulliupaulliupackage charactermanaj.model; import java.awt.Dimension; import java.util.Map; /** * パーツ設定を取得するためのインターフェイス * @author seraphy */ public interface PartsSpecResolver extends PartsCategoryResolver { /** * イメージのサイズを取得する * @return イメージサイズ、設定がなければnull */ Dimension getImageSize(); /** * 指定したパーツ識別子に対するパーツ設定を取得する.
* なければnull * @param partsIdentifier パーツ識別子 * @return パーツ設定、なければnull */ PartsSpec getPartsSpec(PartsIdentifier partsIdentifier); /** * 指定したカテゴリに該当するパーツ識別子とパーツ設定のマップを取得する.
* 該当するカテゴリがなければ空のマップを返す.
* @param category パーツカテゴリ * @return パーツ設定のマップ、なければ空 */ Map getPartsSpecMap(PartsCategory category); } CharacterManaJ/src/main/java/charactermanaj/model/CharacterData.java0000644000175000017500000007370413615720000025626 0ustar paulliupaulliupackage charactermanaj.model; import java.awt.Dimension; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.model.io.PartsDataLoader; /** * キャラクターデータ * @author seraphy */ public class CharacterData implements PartsSpecResolver { /** * ロガー */ private static final Logger logger = Logger.getLogger(CharacterData.class.getName()); /** * キャラクターデータを表示名順にソートするための比較器.
*/ public static final Comparator SORT_DISPLAYNAME = new Comparator() { public int compare(CharacterData o1, CharacterData o2) { if (!o1.isValid() || !o2.isValid()) { return o1.isValid() == o2.isValid() ? 0 : o1.isValid() ? 1 : -1; } int ret = o1.getName().compareTo(o2.getName()); if (ret == 0) { ret = o1.getId().compareTo(o2.getId()); } if (ret == 0) { ret = o1.getDocBase().toString().compareTo(o2.getDocBase().toString()); } return ret; } }; /** * キャラクターデータを定義しているXMLの位置.
* docBase自身はxml定義には含まれず、xmlをロードした位置を記憶するためにPersistentクラスによって設定される.
*/ private URI docBase; /** * キャラクターデータの内部用ID.
* キャラクターデータの構造を判定するために用いる.
*/ private String id; /** * キャラクターデータの更新番号.
* キャラクターデータの構造が変更されたことを識別するために用いる.
*/ private String rev; /** * 表示用名 */ private String localizedName; /** * 作成者 */ private String author; /** * 説明 */ private String description; /** * イメージサイズ */ private Dimension imageSize; /** * カテゴリ(定義順) */ private OrderedMap partsCategories = OrderedMap.emptyMap(); /** * 雑多なプロパティ.
*/ private Properties properties = new Properties(); /** * プリセットのマップ.
* キーはプリセット自身のID、値はプリセット自身.
*/ private HashMap presets = new HashMap(); /** * デフォルトのプリセットのID */ private String defaultPartsSetId; /** * カラーグループの定義.
*/ private OrderedMap colorGroups = OrderedMap.emptyMap(); /** * お勧めリンクリスト.
* Ver0.96以前には存在しないのでnullになり得る. */ private List recommendationURLList; /** * パーツカラーマネージャ.
* (非シリアライズデータ、デシリアライズ時には新規インスタンスが作成される).
*/ private transient PartsColorManager partsColorMrg = new PartsColorManager(this); /** * パーツデータローダー.
* パーツをロードしたときに設定され、リロードするときに使用する.
* パーツを一度もロードしていない場合はnull. * (非シリアライズデータ、デシリアライズ時はnullのまま).
*/ private transient PartsDataLoader partsDataLoader; /** * パーツイメージのセット.
* (キャラクターセットはパーツイメージをもったままシリアライズされることは想定していないが、可能ではある。) */ private Map> images = new HashMap>(); /** * 基本情報のみをコピーして返します.
* DocBase, ID, REV, Name, Author, Description, ImageSize、および, PartsCategory, ColorGroup, PartSetのコレクションがコピーされます.
* それ以外のものはコピーされません.
* @return 基本情報をコピーした新しいインスタンス */ public CharacterData duplicateBasicInfo() { return duplicateBasicInfo(true); } /** * 基本情報のみをコピーして返します.
* DocBase, ID, REV, Name, Author, Description, ImageSize、および, PartsCategory, ColorGroupがコピーされます.
* 引数のneedPartsSetがtrueの場合は,PartSetのコレクションもコピーされます.
* ディレクトリの監視状態、お勧めリンクもコピーされます.
* それ以外のものはコピーされません.
* @param needPartsSets パーツセットもコピーする場合、falseの場合はパーツセットは空となります. * @return 基本情報をコピーした新しいインスタンス */ public CharacterData duplicateBasicInfo(boolean needPartsSets) { CharacterData cd = new CharacterData(); cd.setId(this.id); cd.setRev(this.rev); cd.setDocBase(this.docBase); cd.setName(this.localizedName); cd.setAuthor(this.author); cd.setDescription(this.description); cd.setImageSize((Dimension)(this.imageSize == null ? null : this.imageSize.clone())); cd.setWatchDirectory(this.isWatchDirectory()); cd.setEnableCustomLayerPattern(this.isEnableCustonLayerPattern()); ArrayList recommendationURLList = null; if (this.recommendationURLList != null) { recommendationURLList = new ArrayList(); for (RecommendationURL recommendationUrl : this.recommendationURLList) { recommendationURLList.add(recommendationUrl.clone()); } } cd.setRecommendationURLList(recommendationURLList); ArrayList partsCategories = new ArrayList(); partsCategories.addAll(this.getPartsCategories()); cd.setPartsCategories(partsCategories.toArray(new PartsCategory[partsCategories.size()])); ArrayList colorGroups = new ArrayList(); colorGroups.addAll(this.getColorGroups()); cd.setColorGroups(colorGroups); if (needPartsSets) { for (PartsSet partsSet : this.getPartsSets().values()) { cd.addPartsSet(partsSet.clone()); } cd.setDefaultPartsSetId(this.defaultPartsSetId); } return cd; } /** * キャラクターデータが同じ構造であるか?
* カラーグループ、カテゴリ、レイヤーの各情報が等しければtrue、それ以外はfalse.
* 上記以外の項目(コメントや作者、プリセット等)については判定しない.
* サイズ、カラーグループの表示名や順序、カテゴリの順序や表示名、 * 複数アイテム可などの違いは構造の変更とみなさない.
* レイヤーはレイヤーID、重ね合わせ順、対象ディレクトリの3点が変更されている場合は構造の変更とみなす.
* いずれも個数そのものが変わっている場合は変更とみなす.
* 自分または相手がValidでなければ常にfalseを返す.
* @param other 比較対象, null可 * @return 同じ構造であればtrue、そうでなければfalse */ public boolean isSameStructure(CharacterData other) { if (!this.isValid() || other == null || !other.isValid()) { // 自分または相手がinvalidであれば構造的には常に不一致と見なす. return false; } // カラーグループが等しいか? (順序は問わない) // IDのみによって判定する ArrayList colorGroup1 = new ArrayList(getColorGroups()); ArrayList colorGroup2 = new ArrayList(other.getColorGroups()); if (colorGroup1.size() != colorGroup2.size()) { return false; } if (!colorGroup1.containsAll(colorGroup2)) { return false; } // カテゴリが等しいか? (順序は問わない) // IDによってのみ判定する. ArrayList categories1 = new ArrayList(getPartsCategories()); ArrayList categories2 = new ArrayList(other.getPartsCategories()); Comparator sortCategoryId = new Comparator() { public int compare(PartsCategory o1, PartsCategory o2) { int ret = o1.getCategoryId().compareTo(o2.getCategoryId()); if (ret == 0) { ret = o1.getOrder() - o2.getOrder(); } return ret; } }; // カテゴリID順に並び替えて, IDのみを比較する. Collections.sort(categories1, sortCategoryId); Collections.sort(categories2, sortCategoryId); int numOfCategories = categories1.size(); if (numOfCategories != categories2.size()) { // カテゴリ数不一致 return false; } for (int idx = 0; idx < numOfCategories; idx++) { PartsCategory category1 = categories1.get(idx); PartsCategory category2 = categories2.get(idx); String categoryId1 = category1.getCategoryId(); String categoryId2 = category2.getCategoryId(); if ( !categoryId1.equals(categoryId2)) { // カテゴリID不一致 return false; } } // レイヤーが等しいか? // ID、重ね順序、dirによってのみ判定する. int mx = categories1.size(); for (int idx = 0; idx < mx; idx++) { PartsCategory category1 = categories1.get(idx); PartsCategory category2 = categories2.get(idx); ArrayList layers1 = new ArrayList(category1.getLayers()); ArrayList layers2 = new ArrayList(category2.getLayers()); Comparator sortLayerId = new Comparator() { public int compare(Layer o1, Layer o2) { int ret = o1.getId().compareTo(o2.getId()); if (ret == 0) { ret = o1.getOrder() - o2.getOrder(); } return ret; } }; Collections.sort(layers1, sortLayerId); Collections.sort(layers2, sortLayerId); // ID、順序、Dirで判断する.(それ以外のレイヤー情報はequalsでは比較されない) if ( !layers1.equals(layers2)) { // レイヤー不一致 return false; } } return true; } /** * 引数で指定したキャラクター定義とアッパーコンパチブルであるか?
* 構造が同一であるか、サイズ違い、もしくはレイヤーの順序、カテゴリの順序、 * もしくはレイヤーまたはカテゴリが増えている場合で、減っていない場合はtrueとなる.
* 引数がnullの場合は常にfalseとなる. * @param other 前の状態のキャラクター定義、null可 * @return アッパーコンパチブルであればtrue、そうでなければfalse */ public boolean isUpperCompatibleStructure(CharacterData other) { if (!this.isValid() || other == null || !other.isValid()) { // 自分または相手がinvalidであれば構造的には常に互換性なしと見なす. return false; } // カラーグループが等しいか? (順序は問わない) // IDのみによって判定する ArrayList colorGroupNew = new ArrayList(getColorGroups()); ArrayList colorGroupOld = new ArrayList(other.getColorGroups()); if (!colorGroupNew.containsAll(colorGroupOld)) { // 自分が相手分のすべてのものを持っていなければ互換性なし. return false; } // カテゴリをすべて含むか? (順序は問わない) // IDによってのみ判定する. Map categoriesNew = new HashMap(); for (PartsCategory category : getPartsCategories()) { categoriesNew.put(category.getCategoryId(), category); } Map categoriesOld = new HashMap(); for (PartsCategory category : other.getPartsCategories()) { categoriesOld.put(category.getCategoryId(), category); } if ( !categoriesNew.keySet().containsAll(categoriesOld.keySet())) { // 自分が相手のすべてのカテゴリを持っていなければ互換性なし. return false; } // レイヤーをすべて含むか? // ID、Dirによってのみ判定する. for (Map.Entry categoryOldEntry : categoriesOld.entrySet()) { String categoryId = categoryOldEntry.getKey(); PartsCategory categoryOld = categoryOldEntry.getValue(); PartsCategory categoryNew = categoriesNew.get(categoryId); if (categoryNew == null) { return false; } Map layersNew = new HashMap(); for (Layer layer : categoryNew.getLayers()) { layersNew.put(layer.getId(), layer); } Map layersOld = new HashMap(); for (Layer layer : categoryOld.getLayers()) { layersOld.put(layer.getId(), layer); } if ( !layersNew.keySet().containsAll(layersOld.keySet())) { // 自分が相手のすべてのレイヤー(ID)を持っていなければ互換性なし. return false; } for (Map.Entry layerOldEntry : layersOld.entrySet()) { String layerId = layerOldEntry.getKey(); Layer layerOld = layerOldEntry.getValue(); Layer layerNew = layersNew.get(layerId); if (layerNew == null) { return false; } File dirOld = new File(layerOld.getDir()); File dirNew = new File(layerNew.getDir()); if ( !dirOld.equals(dirNew)) { // ディレクトリが一致しなければ互換性なし. return false; } } } return true; } /** * キャラクターデータの構造を表す文字列を返す.
* カテゴリ、レイヤー、色グループのみで構成される.
* id, revなどは含まない.
* @return キャラクターデータの構造を表す文字列 */ public String toStructureString() { // カラーグループ StringBuilder buf = new StringBuilder(); buf.append("{colorGroup:["); for (ColorGroup colorGroup : getColorGroups()) { buf.append(colorGroup.getId()); buf.append(","); } buf.append("],"); // カテゴリ buf.append("category:["); for (PartsCategory category : getPartsCategories()) { buf.append("{id:"); buf.append(category.getCategoryId()); buf.append(",layer:["); for (Layer layer : category.getLayers()) { buf.append("{id:"); buf.append(layer.getId()); buf.append(",dir:"); buf.append(layer.getDir()); buf.append("},"); } buf.append("]},"); } buf.append("]}"); return buf.toString(); } /** * キャラクターデータのID, REVと構造を識別するシグネチャの文字列を返す.
* (構造はカテゴリ、レイヤー、色グループのみ).
* @return シグネチャの文字列 */ public String toSignatureString() { StringBuilder buf = new StringBuilder(); buf.append("{id:"); buf.append(getId()); buf.append(",rev:"); buf.append(getRev()); buf.append(",structure:"); buf.append(toStructureString()); buf.append("}"); return buf.toString(); } /** * お勧めリンクのリストを取得する.
* 古いキャラクターデータで、お勧めリストノードが存在しない場合はnullとなる.
* @return お気に入りリンクのリスト、もしくはnull */ public List getRecommendationURLList() { return recommendationURLList; } /** * お勧めリンクリストを設定する.
* @param recommendationURLList、null可 */ public void setRecommendationURLList( List recommendationURLList) { this.recommendationURLList = recommendationURLList; } /** * 作者を設定する. * @param author 作者 */ public void setAuthor(String author) { this.author = author; } /** * 説明を設定する.
* 説明の改行コードはプラットフォーム固有の改行コードに変換される.
* @param description */ public void setDescription(String description) { if (description != null) { description = description.replace("\r\n", "\n"); description = description.replace("\r", "\n"); description = description.replace("\n", System.getProperty("line.separator")); } this.description = description; } public String getAuthor() { return author; } /** * 説明を取得する.
* 説明の改行コードはプラットフォーム固有の改行コードとなる.
* @return 説明 */ public String getDescription() { return description; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getRev() { return rev; } public void setRev(String rev) { this.rev = rev; } public void setDocBase(URI docBase) { this.docBase = docBase; } public URI getDocBase() { return docBase; } private static final String PROPNAME_WATCH_DIR = "watch-dir"; /** * ディレクトリを監視するか? (デフォルトは監視する) * @return ディレクトリを監視する場合はtrue */ public boolean isWatchDirectory() { try { String value = properties.getProperty(PROPNAME_WATCH_DIR); if (value != null) { return Boolean.parseBoolean(value); } } catch (RuntimeException ex) { logger.log(Level.WARNING, PROPNAME_WATCH_DIR + " property is invalid.", ex); } // デフォルトは監視する. return true; } /** * ディレクトリを監視するか指定する. * @param watchDir 監視する場合はtrue、しない場合はfalse */ public void setWatchDirectory(boolean watchDir) { properties.setProperty(PROPNAME_WATCH_DIR, Boolean.toString(watchDir)); } private static final String PROPNAME_ENABLE_CUSTOM_LAYER_PATTERN = "custom-layer-pattern"; /** * カスタムレイヤーパターンが有効であるか?(デフォルトは有効) * @return カスタムレイヤーパターンが有効である場合はtrue */ public boolean isEnableCustonLayerPattern() { try { String value = properties.getProperty(PROPNAME_ENABLE_CUSTOM_LAYER_PATTERN); if (value != null) { return Boolean.parseBoolean(value); } } catch (RuntimeException ex) { logger.log(Level.WARNING, PROPNAME_ENABLE_CUSTOM_LAYER_PATTERN + " property is invalid.", ex); } // デフォルトは有効. return true; } /** * カスタムレイヤーパターンの有効・無効を設定する。 * @param enableCustomLayerPattern 有効にする場合はtrue、無効にする場合はfalse */ public void setEnableCustomLayerPattern(boolean enableCustomLayerPattern) { properties.setProperty(PROPNAME_ENABLE_CUSTOM_LAYER_PATTERN, Boolean.toString(enableCustomLayerPattern)); } public String getProperty(String key) { if (key == null || key.trim().length() == 0) { throw new IllegalArgumentException(); } return properties.getProperty(key.trim()); } public void setProperty(String key, String value) { if (key == null || key.trim().length() == 0) { throw new IllegalArgumentException(); } properties.setProperty(key.trim(), value); } public Collection getPropertyNames() { ArrayList names = new ArrayList(); for (Object key : properties.keySet()) { names.add(key.toString()); } return names; } /** * 有効なキャラクターデータであるか? * ID, Name, DocBaseが存在するものが有効なキャラクターデータである.
* @return 有効であればtrue */ public boolean isValid() { return id != null && id.length() > 0 && localizedName != null && localizedName.length() > 0 && docBase != null; } /** * 編集可能か?
* まだdocbaseが指定されていない新しいインスタンスであるか、 * もしくはdocbaseが実在しファイルであり且つ読み込み可能であるか、 * もしくはdocbaseがまだ存在しない場合は、その親ディレクトリが読み書き可能であるか? * @return 編集可能であればtrue */ public boolean canWrite() { try { checkWritable(); return true; } catch (IOException ex) { return false; } } /** * 編集可能か?
* まだdocbaseが指定されていない新しいインスタンスであるか、 * もしくはdocbaseが実在しファイルであり且つ読み込み可能であるか、 * もしくはdocbaseがまだ存在しない場合は、その親ディレクトリが読み書き可能であるか? * @throws IOException 編集可能でなければIOException例外が発生する. */ public void checkWritable() throws IOException { if (docBase == null) { throw new IOException("invalid profile: " + this); } if ( !"file".equals(docBase.getScheme())) { throw new IOException("ファイルプロトコルではないため書き込みはできません。:" + docBase); } File xmlFile = new File(docBase); if (xmlFile.exists()) { // character.xmlファイルがある場合 if ( !xmlFile.canWrite() || !xmlFile.canRead()) { throw new IOException("書き込み、もしくは読み込みが禁止されているプロファイルです。" + docBase); } } else { // character.xmlファイルが、まだ存在していない場合 File parent = xmlFile.getParentFile(); if ( !parent.exists()) { throw new IOException("親ディレクトリがありません。" + docBase); } if ( !parent.canWrite() || !parent.canRead()) { throw new IOException("親ディレクトリは書き込み、もしくは読み込みが禁止されています。" + docBase); } } } /** * キャラクター名を設定する. * @param name */ public void setName(String name) { this.localizedName = name; } /** * キャラクター名を取得する. * @return */ public String getName() { return localizedName; } public void setImageSize(Dimension imageSize) { if (imageSize != null) { imageSize = (Dimension) imageSize.clone(); } this.imageSize = imageSize; } public Dimension getImageSize() { return imageSize != null ? (Dimension) imageSize.clone() : null; } public void setColorGroups(Collection colorGroups) { if (colorGroups == null) { throw new IllegalArgumentException(); } ArrayList colorGroupWithNA = new ArrayList(); colorGroupWithNA.add(ColorGroup.NA); for (ColorGroup colorGroup : colorGroups) { if (colorGroup.isEnabled()) { colorGroupWithNA.add(colorGroup); } } OrderedMap ret = new OrderedMap( colorGroupWithNA, new OrderedMap.KeyDetector() { public String getKey(ColorGroup data) { return data.getId(); } }); this.colorGroups = ret; } /** * カラーグループIDからカラーグループを取得する.
* 存在しない場合はN/Aを返す.
* @param colorGroupId カラーグループID * @return カラーグループ */ public ColorGroup getColorGroup(String colorGroupId) { ColorGroup cg = colorGroups.get(colorGroupId); if (cg != null) { return cg; } return ColorGroup.NA; } public Collection getColorGroups() { return colorGroups.values(); } public PartsCategory getPartsCategory(String categoryId) { if (partsCategories == null) { return null; } return partsCategories.get(categoryId); } public void setPartsCategories(PartsCategory[] partsCategories) { if (partsCategories == null) { partsCategories = new PartsCategory[0]; } this.partsCategories = new OrderedMap( Arrays.asList(partsCategories), new OrderedMap.KeyDetector() { public String getKey(PartsCategory data) { return data.getCategoryId(); } }); } public List getPartsCategories() { return partsCategories.asList(); } /** * パーツデータがロード済みであるか?
* 少なくとも{@link #loadPartsData(PartsDataLoader)}が一度呼び出されていればtrueとなる.
* falseの場合はパーツローダが設定されていないことを示す.
* @return パーツデータがロード済みであればtrue、そうでなければfalse */ public boolean isPartsLoaded() { return partsDataLoader != null; } /** * パーツデータをロードする.
* パーツローダを指定し、このローダはパーツの再ロード時に使用するため保持される.
* @param partsDataLoader ローダー */ public void loadPartsData(PartsDataLoader partsDataLoader) { if (partsDataLoader == null) { throw new IllegalArgumentException(); } this.partsDataLoader = partsDataLoader; reloadPartsData(); } /** * 全カテゴリー中のパーツデータの個数を取得する。 * @return パーツの個数 */ public int getPartsCount() { int cnt = 0; for (PartsCategory category : partsCategories.asList()) { Map partsMap = images.get(category); if (partsMap != null) { cnt += partsMap.size(); } } return cnt; } /** * パーツデータをリロードする.
* ロード時に使用したローダーを使ってパーツを再ロードします.
* まだ一度もロードしていない場合はIllegalStateException例外が発生します.
* @return 変更があった場合はtrue、ない場合はfalse */ public boolean reloadPartsData() { if (partsDataLoader == null) { throw new IllegalStateException("partsDataLoader is not set."); } // パーツデータのロード images.clear(); for (PartsCategory category : partsCategories.asList()) { images.put(category, partsDataLoader.load(category)); } // NOTE: とりあえずパーツの変更を検査せず、常に変更ありにしておく。とりあえず実害ない。 return true; } /** * {@inheritDoc} */ public PartsSpec getPartsSpec(PartsIdentifier partsIdentifier) { if (partsIdentifier == null) { throw new IllegalArgumentException(); } PartsCategory partsCategory = partsIdentifier.getPartsCategory(); Map partsSpecMap = images.get(partsCategory); if (partsSpecMap != null) { PartsSpec partsSpec = partsSpecMap.get(partsIdentifier); if (partsSpec != null) { return partsSpec; } } return null; } /** * {@inheritDoc} */ public Map getPartsSpecMap(PartsCategory category) { Map partsImageMap = images.get(category); if (partsImageMap == null) { return Collections.emptyMap(); } return partsImageMap; } public PartsColorManager getPartsColorManager() { return this.partsColorMrg; } /** * パーツセットを登録します.
* お気に入りとプリセットの両方の共用です.
* IDおよび名前がないものは登録されず、falseを返します.
* パーツセットは、このキャラクター定義に定義されているカテゴリに正規化されます.
* 正規化された結果カテゴリが一つもなくなった場合は何も登録されず、falseを返します.
* 登録された場合はtrueを返します.
* 同一のIDは上書きされます.
* @param partsSet * @return 登録された場合はtrue、登録できない場合はfalse */ public boolean addPartsSet(PartsSet partsSet) { if (partsSet == null) { throw new IllegalArgumentException(); } if (partsSet.getPartsSetId() == null || partsSet.getPartsSetId().length() == 0 || partsSet.getLocalizedName() == null || partsSet.getLocalizedName().length() == 0) { return false; } PartsSet compatiblePartsSet = partsSet.createCompatible(this); if (compatiblePartsSet.isEmpty()) { return false; } presets.put(compatiblePartsSet.getPartsSetId(), compatiblePartsSet); return true; } /** * プリセットパーツおよびパーツセット(Favorites)のコレクション. * @return パーツセットのコレクション */ public Map getPartsSets() { return presets; } /** * プリセットパーツおよびパーツセットをリセットします.
* @param noRemovePreset プリセットは削除せず残し、プリセット以外のパーツセットをクリアする場合はtrue、falseの場合は全て削除される. */ public void clearPartsSets(boolean noRemovePreset) { if (!noRemovePreset) { // 全部消す presets.clear(); defaultPartsSetId = null; } else { // プリセット以外を消す Iterator> ite = presets.entrySet().iterator(); while (ite.hasNext()) { Map.Entry entry = ite.next(); if (!entry.getValue().isPresetParts()) { // デフォルトパーツセットであれば、デフォルトパーツセットもnullにする. // (ただし、デフォルトパーツセットはプリセットであることを想定しているので、この処理は安全策用。) if (entry.getKey().equals(defaultPartsSetId)) { defaultPartsSetId = null; } ite.remove(); } } } } /** * デフォルトのパーツセットを取得する.
* そのパーツセットIDが実在するか、あるいは、それがプリセットであるか、などは一切関知しない.
* 呼び出しもとで必要に応じてチェックすること.
* @return デフォルトとして指定されているパーツセットのID、なければnull */ public String getDefaultPartsSetId() { return defaultPartsSetId; } /** * デフォルトのパーツセットIDを指定する.
* nullの場合はデフォルトのパーツセットがないことを示す.
* パーツセットはプリセットであることが想定されるが、
* 実際に、その名前のパーツセットが存在するか、あるいは、そのパーツセットがプリセットであるか、などの判定は一切行わない.
* @param defaultPartsSetId パーツセットID、もしくはnull */ public void setDefaultPartsSetId(String defaultPartsSetId) { this.defaultPartsSetId = defaultPartsSetId; } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append("character-id: " + id); buf.append("/rev:" + rev); buf.append("/name:" + localizedName); buf.append("/image-size:" + imageSize.width + "x" + imageSize.height); buf.append("/docBase:" + docBase); return buf.toString(); } } CharacterManaJ/src/main/java/charactermanaj/model/WorkingSet.java0000644000175000017500000001131313615720000025220 0ustar paulliupaulliupackage charactermanaj.model; import java.awt.Point; import java.awt.Rectangle; import java.io.File; import java.net.URI; import java.util.Map; import java.util.logging.Logger; import charactermanaj.ui.model.WallpaperInfo; public class WorkingSet { /** * ロガー */ private static final Logger logger = Logger.getLogger(WorkingSet.class.getName()); private Map partsColorInfoMap; private String characterDataRev; /** * 現在の選択中のパーツと色設定からのパーツセット */ private PartsSet currentPartsSet; private URI characterDocBase; private File lastUsedSaveDir; private File lastUsedExportDir; // ver0.92 private PartsSet lastUsePresetParts; // ver0.94 private CharacterData characterData; // ver0.97 private WallpaperInfo wallpaperInfo; // ver0.999 /** * ズーム */ private Double zoomFactor; /** * ビューの中央位置 * (ズーム倍率の保存はv0.999から、未指定の場合はnull) */ private Point viewPosition; /** * ウィンドウの位置と大きさ */ private Rectangle windowRect; /** * データのダウンロードが不要である */ private boolean noNeedDataDownload; public void setCharacterDataRev(String characterDataRev) { this.characterDataRev = characterDataRev; } /** * REV情報.
* キャラクターデータが設定されていない場合に使用される.
* (ver0.96以前旧シリアライズデータ互換用)
* * @return */ public String getCharacterDataRev() { return characterDataRev; } public Map getPartsColorInfoMap() { return partsColorInfoMap; } public void setPartsColorInfoMap( Map partsColorInfoMap) { this.partsColorInfoMap = partsColorInfoMap; } public void setCharacterDocBase(URI characterDocBase) { this.characterDocBase = characterDocBase; } public void setCurrentPartsSet(PartsSet currentPartsSet) { this.currentPartsSet = currentPartsSet; } public URI getCharacterDocBase() { return characterDocBase; } public PartsSet getCurrentPartsSet() { return currentPartsSet; } public void setLastUsedSaveDir(File lastUsedSaveDir) { this.lastUsedSaveDir = lastUsedSaveDir; } public void setLastUsedExportDir(File lastUsedExportDir) { this.lastUsedExportDir = lastUsedExportDir; } public File getLastUsedSaveDir() { return lastUsedSaveDir; } public File getLastUsedExportDir() { return lastUsedExportDir; } /** * 最後に使用したお気に入りの情報.
* 一度もプリセットを使ってなければnull.
* ver0.94以前には存在しなかったため、nullになりえます。 * * @return */ public PartsSet getLastUsePresetParts() { return lastUsePresetParts; } /** * /** 最後に使用したお気に入りの情報.
* 一度もプリセットを使ってなければnull.
* (ver0.94以前には存在しなかったため、nullになりえます。) * * @param lastUsePresetParts */ public void setLastUsePresetParts(PartsSet lastUsePresetParts) { this.lastUsePresetParts = lastUsePresetParts; } public void setCharacterData(CharacterData characterData) { this.characterData = characterData; } /** * 使用していたキャラクター定義を取得します.
* ver0.95よりも以前には存在しないため、nullとなりえます.
* * @return キャラクターデータ */ public CharacterData getCharacterData() { return characterData; } /** * 壁紙情報を取得します.
* ver0.97よりも以前には存在しないため、nullとなりえます.
* * @return 壁紙情報 */ public WallpaperInfo getWallpaperInfo() { return wallpaperInfo; } public void setWallpaperInfo(WallpaperInfo wallpaperInfo) { this.wallpaperInfo = wallpaperInfo; } /** * ビューの左上位置 * @return */ public Point getViewPosition() { return viewPosition; } public void setViewPosition(Point viewPosition) { this.viewPosition = viewPosition; } /** * ズーム * @return */ public Double getZoomFactor() { return zoomFactor; } public void setZoomFactor(Double zoomFactor) { this.zoomFactor = zoomFactor; } /** * ウィンドウサイズ * @return */ public Rectangle getWindowRect() { return windowRect; } public void setWindowRect(Rectangle windowRect) { this.windowRect = windowRect; } public boolean isNoNeedDataDownload() { return noNeedDataDownload; } public void setNoNeedDataDownload(boolean noNeedDataDownload) { this.noNeedDataDownload = noNeedDataDownload; } @Override public String toString() { return "docBase:" + characterDocBase + "/rev:" + characterDataRev; } } CharacterManaJ/src/main/java/charactermanaj/model/IndependentPartsSetInfoList.java0000644000175000017500000000313613615720000030523 0ustar paulliupaulliupackage charactermanaj.model; import java.util.ArrayList; /** * 素のパーツセットのコレクション.
* レイヤーやカテゴリなどのリレーションシップがない、
* 特定のキャラクターデータモデルのツリーの一部には組み込まれていない状態のもの.
*/ public class IndependentPartsSetInfoList extends ArrayList { /** * シリアライズバージョンID */ private static final long serialVersionUID = -6121741586284912547L; /** * デフォルトのパーツセットID.
* ない場合はnull.
*/ private String defaultPresetId; public String getDefaultPresetId() { return defaultPresetId; } /** * デフォルトパーツセットIDを設定する.
* nullはパーツセットIDがないことを示す.
* 空文字はnullとみなされる.
* * @param defaultPresetId */ public void setDefaultPresetId(String defaultPresetId) { if (defaultPresetId != null) { defaultPresetId = defaultPresetId.trim(); if (defaultPresetId.length() == 0) { // デフォルトパーツセットがないことを示すためのnull defaultPresetId = null; } } this.defaultPresetId = defaultPresetId; } @Override public boolean add(IndependentPartsSetInfo o) { if (o == null) { throw new IllegalArgumentException(); } return super.add(o); } @Override public IndependentPartsSetInfo set(int index, IndependentPartsSetInfo element) { if (element == null) { throw new IllegalArgumentException(); } return super.set(index, element); } }CharacterManaJ/src/main/java/charactermanaj/model/CustomLayerOrder.java0000644000175000017500000000663313615720000026400 0ustar paulliupaulliupackage charactermanaj.model; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; public class CustomLayerOrder { public static final String CATEGORY = "category"; public static final String LAYER = "layer"; public static final String LAYER_ORDER = "layerOrder"; private final PropertyChangeSupport propChangeSupport = new PropertyChangeSupport(this); private PartsCategory category; private Layer layer; private float layerOrder; public static CustomLayerOrder valueOf(PartsCategory category, Layer layer, float layerOrder) { CustomLayerOrder inst = new CustomLayerOrder(); inst.setCategory(category); inst.setLayer(layer); inst.setLayerOrder(layerOrder); return inst; } public CustomLayerOrder copy() { CustomLayerOrder inst = new CustomLayerOrder(); inst.setCategory(category); inst.setLayer(layer); inst.setLayerOrder(layerOrder); return inst; } public PartsCategory getCategory() { return category; } public void setCategory(PartsCategory category) { PartsCategory old = this.category; if (old == null ? category != null : !old.equals(category)) { this.category = category; propChangeSupport.firePropertyChange(CATEGORY, old, category); } } public Layer getLayer() { return layer; } public void setLayer(Layer layer) { Layer old = this.layer; this.layer = layer; if (old == null ? layer != null : !old.equals(layer)) { this.layer = layer; propChangeSupport.firePropertyChange(LAYER, old, layer); } } public float getLayerOrder() { return layerOrder; } public void setLayerOrder(float layerOrder) { float old = this.layerOrder; if (old != layerOrder) { this.layerOrder = layerOrder; propChangeSupport.firePropertyChange(LAYER_ORDER, old, layerOrder); } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((category == null) ? 0 : category.hashCode()); result = prime * result + ((layer == null) ? 0 : layer.hashCode()); result = prime * result + Float.floatToIntBits(layerOrder); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; CustomLayerOrder other = (CustomLayerOrder) obj; if (category == null) { if (other.category != null) return false; } else if (!category.equals(other.category)) return false; if (layer == null) { if (other.layer != null) return false; } else if (!layer.equals(other.layer)) return false; if (Float.floatToIntBits(layerOrder) != Float.floatToIntBits(other.layerOrder)) return false; return true; } public void addPropertyChangeListener(PropertyChangeListener listener) { propChangeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propChangeSupport.removePropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propChangeSupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propChangeSupport.removePropertyChangeListener(propertyName, listener); } @Override public String toString() { return "CustomLayerOrder [category=" + category + ", layer=" + layer + ", layerOrder=" + layerOrder + "]"; } }CharacterManaJ/src/main/java/charactermanaj/model/OrderedMap.java0000644000175000017500000001105613615720000025152 0ustar paulliupaulliupackage charactermanaj.model; import java.io.IOException; import java.io.ObjectInputStream; import java.util.AbstractList; import java.util.AbstractMap; import java.util.AbstractSet; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * 定義順でのリストアクセスと、キーによる一意アクセスの双方を格納にするマップ兼リスト.
* 元となるコレクションからキーを分離し、キーでアクセス可能にする.
* マップへのvalues()等のコレクションアクセスでは元のコレクションと同じ定義順で返される.
* より明確には{{@link #asList()}を使うとリストとしてアクセスすることができる.
* 読み込み専用で、書き込みはできない.
* * @author seraphy * * @param データに含まれるキーの型 * @param データの型 */ public class OrderedMap extends AbstractMap { /** * 空を示す定数インスタンス */ public static final OrderedMap EMPTY_MAP = new OrderedMap(); @SuppressWarnings("unchecked") public static final OrderedMap emptyMap() { return (OrderedMap) EMPTY_MAP; } public interface KeyDetector { K getKey(V data); } protected static class OrderedMapEntry implements Map.Entry { private final K key; private final V data; protected OrderedMapEntry(K key, V data) { this.key = key; this.data = data; } public K getKey() { return key; } public V getValue() { return data; } public V setValue(V arg0) { throw new UnsupportedOperationException(); } } /** * リストとしてのエントリ */ private ArrayList> entries = new ArrayList>(); /** * マップアクセス用.
* シリアライズ時はスキップされ、デシリアライズ時にリストから復元される.
*/ private transient HashMap entryMap = new HashMap(); /** * デシリアライズ.
* @param stream * @throws IOException * @throws ClassNotFoundException */ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); entryMap = new HashMap(); for (Map.Entry entry : entries) { entryMap.put(entry.getKey(), entry.getValue()); } } /** * 空のコレクションを作成する. */ protected OrderedMap() { super(); } /** * 元となるコレクションをコピーし、そのコレクションの各データのキーを分離しマップアクセス可能にする.
* @param datas 元となるコレクション * @param keyDetector コレクションの各要素からキーを分離するためのインターフェイス */ public OrderedMap(Collection datas, KeyDetector keyDetector) { if (datas == null || keyDetector == null) { throw new IllegalArgumentException(); } for (V data : datas) { K key = keyDetector.getKey(data); if (key == null) { throw new IllegalArgumentException("null key: " + data); } entries.add(new OrderedMapEntry(key, data)); entryMap.put(key, data); } if (entries.size() != entryMap.size()) { throw new IllegalArgumentException("duplicate-key"); } } @Override public Set> entrySet() { return new AbstractSet>() { @Override public int size() { return entries.size(); } @Override public Iterator> iterator() { final Iterator> ite = entries.iterator();; return new Iterator>() { public boolean hasNext() { return ite.hasNext(); } public java.util.Map.Entry next() { return ite.next(); } public void remove() { throw new UnsupportedOperationException(); } }; } }; } /** * マップの値を定義順のリストとして扱えるようにリストインターフェイスで返す.
* 読み込み専用です.
* @return マップの値のリスト */ public List asList() { return new AbstractList() { @Override public int size() { return entries.size(); } @Override public V get(int index) { return entries.get(index).getValue(); } }; } @Override public V get(Object key) { return entryMap.get(key); } @Override public int size() { return entries.size(); } } CharacterManaJ/src/main/java/charactermanaj/model/PartsCategoryResolver.java0000644000175000017500000000077213615720000027444 0ustar paulliupaulliupackage charactermanaj.model; import java.util.List; public interface PartsCategoryResolver { /** * パーツカテゴリの一覧を取得する.
* @return パーツカテゴリの一覧。(表示順) */ List getPartsCategories(); /** * パーツカテゴリのIDを指定して該当のインスタンスを取得します.
* @param id パーツカテゴリID * @return インスタンス、なければnull */ PartsCategory getPartsCategory(String id); } CharacterManaJ/src/main/java/charactermanaj/model/PartsAuthorInfo.java0000644000175000017500000000064413615720000026221 0ustar paulliupaulliupackage charactermanaj.model; /** * パーツの作者情報 * @author seraphy */ public class PartsAuthorInfo { private String author; private String homePage; public String getAuthor() { return author; } public String getHomePage() { return homePage; } public void setAuthor(String author) { this.author = author; } public void setHomePage(String homePage) { this.homePage = homePage; } } CharacterManaJ/src/main/java/charactermanaj/model/PartsFiles.java0000644000175000017500000000301013615720000025173 0ustar paulliupaulliupackage charactermanaj.model; import java.util.AbstractMap; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import charactermanaj.graphics.io.ImageResource; public class PartsFiles extends AbstractMap { private HashMap partsMap = new HashMap(); private final PartsIdentifier partsIdentifier; public PartsFiles(PartsIdentifier partsName) { if (partsName == null) { throw new IllegalArgumentException(); } this.partsIdentifier = partsName; } public PartsIdentifier getPartsIdentifier() { return partsIdentifier; } @Override public Set> entrySet() { return Collections.unmodifiableSet(partsMap.entrySet()); } @Override public ImageResource put(final Layer key, final ImageResource value) { if (key == null || value == null) { throw new IllegalArgumentException(); } if (!partsIdentifier.hasLayer(key)) { throw new IllegalArgumentException(key.toString()); } return partsMap.put(key, value); } @Override public ImageResource get(Object key) { return partsMap.get(key); } @Override public boolean containsKey(Object key) { return partsMap.containsKey(key); } public long lastModified() { long maxLastModified = 0; for (ImageResource imageResource : values()) { long lastModified = imageResource.lastModified(); if (lastModified > maxLastModified) { maxLastModified = lastModified; } } return maxLastModified; } } CharacterManaJ/src/main/java/charactermanaj/model/util/0000755000175000017500000000000013615720000023237 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/model/util/StartupSupport.java0000644000175000017500000002216513615720000027147 0ustar paulliupaulliupackage charactermanaj.model.util; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.model.AppConfig; import charactermanaj.model.io.WorkingSetPersist; import charactermanaj.util.ApplicationLogHandler; import charactermanaj.util.ConfigurationDirUtilities; /** * 開始前の事前準備するためのサポートクラス * * @author seraphy */ public abstract class StartupSupport { private static StartupSupport inst; /** * インスタンスを取得する. * * @return シングルトンインスタンス */ public static synchronized StartupSupport getInstance() { if (inst == null) { inst = new StartupSupport() { private final Logger logger = Logger.getLogger(StartupSupport.class.getName()); @Override public void doStartup() { StartupSupport[] startups = { new MoveAppDataToLocalAppData(), new PurgeOldLogs(), new PurgeOldWorkingSetXml(), //new ConvertRecentCharDirsSerToXmlProps(), //new ConvertWorkingSetSerToXml(), //new PurgeOldCaches(), }; for (StartupSupport startup : startups) { logger.log(Level.FINE, "startup operation start. class=" + startup.getClass().getSimpleName()); try { startup.doStartup(); logger.log(Level.FINE, "startup operation is done."); } catch (Exception ex) { logger.log(Level.WARNING, "startup operation failed.", ex); } } } }; } return inst; } /** * スタートアップ処理を実施します. */ public abstract void doStartup(); } /** * APPDATAフォルダにあったワーキングセット類をLOCALAPPDATAに移動する。 */ class MoveAppDataToLocalAppData extends StartupSupport { /** * ロガー */ private final Logger logger = Logger.getLogger(getClass().getName()); @Override public void doStartup() { File appDataDir = ConfigurationDirUtilities.getUserDataDir(); File localAppDataDir = ConfigurationDirUtilities.getLocalUserDataDir(); if (appDataDir.equals(localAppDataDir)) { // 移動元・移動先が同一であれば何もしない。 return; } // ログフォルダ、ログ設定はすでにログが開始されているので移動しない。 String[] files = {"recent-characterdirs.xml", "workingset"}; for (String file : files) { try { File target = new File(localAppDataDir, file); if (target.exists()) { // すでにあれば何もしない continue; } File source = new File(appDataDir, file); if (source.exists()) { // まだ移動されていない場合であれば移動を試みる boolean result = source.renameTo(target); logger.log(Level.INFO, "Move " + source + " to " + target + ". result=" + (result ? "succeeded" : "failed")); } } catch (Exception ex) { logger.log(Level.SEVERE, "Failed to move file. " + file, ex); } } } } /** * 使われていないWorkingset.xmlを削除する */ class PurgeOldWorkingSetXml extends StartupSupport { @Override public void doStartup() { AppConfig appConfig = AppConfig.getInstance(); long purgeOldLogsMillSec = appConfig.getPurgeLogDays() * 24L * 3600L * 1000L; if (purgeOldLogsMillSec <= 0) { return; } // ワーキングセットの掃除判定日時 // これよりも新しいものは実際に使われているかを問わず、削除判定しない。 final long expireDate = System.currentTimeMillis() - purgeOldLogsMillSec; // 指定した日時以前のワーキングセットについて本体データが削除されているものは // ワーキングセットも削除する。 WorkingSetPersist persist = new WorkingSetPersist(); persist.purge(expireDate); } } // ver0.999で廃止。 ///** // * シリアライズによるキャラクターディレクトリリストの保存をXML形式のPropertiesにアップグレードします。 // * // * @author seraphy // * // */ //class ConvertRecentCharDirsSerToXmlProps extends StartupSupport { // /** // * ロガー // */ // private final Logger logger = Logger.getLogger(getClass().getName()); // // @Override // public void doStartup() { // // 旧形式(ver0.991以前) // UserDataFactory factory = UserDataFactory.getInstance(); // // final String FILENAME = "recent-characterdirs.ser"; // File prevFile = new File(factory.getSpecialDataDir(FILENAME), FILENAME); // // try { // if (prevFile.exists()) { // FileUserData recentCharDirs = new FileUserData(prevFile); // RecentCharactersDir obj = (RecentCharactersDir) recentCharDirs // .load(); // // // 新しい形式で保存する. // obj.saveRecents(); // // // 古いファイルを削除する // prevFile.delete(); // } // // } catch (Exception ex) { // logger.log(Level.WARNING, FILENAME + " convert failed.", ex); // } // } //} //ver0.999で廃止。 ///** // * シリアライズによるキャラクターディレクトリリストの保存をXML形式のPropertiesにアップグレードします。 // * // * @author seraphy // * // */ //class ConvertWorkingSetSerToXml extends StartupSupport { // /** // * ロガー // */ // private final Logger logger = Logger.getLogger(getClass().getName()); // // @Override // public void doStartup() { // final String FILENAME = "workingset.ser"; // try { // UserDataFactory userDataFactory = UserDataFactory.getInstance(); // File dir = userDataFactory.getSpecialDataDir(FILENAME); // if (!dir.exists()) { // return; // } // File[] files = dir.listFiles(new FileFilter() { // public boolean accept(File pathname) { // String name = pathname.getName(); // return name.endsWith(FILENAME); // } // }); // if (files == null) { // logger.log(Level.WARNING, "cache-dir access failed. " + dir); // return; // } // WorkingSetXMLWriter wr = new WorkingSetXMLWriter(); // for (File file : files) { // FileUserData fileData = new FileUserData(file); // if (fileData.exists()) { // try { // // serファイルをデシリアライズする. // WorkingSet ws = (WorkingSet) fileData.load(); // URI docBase = ws.getCharacterDocBase(); // if (docBase != null) { // // XML形式で保存しなおす. // UserData workingSetXmlData = userDataFactory // .getMangledNamedUserData(docBase, // WorkingSetPersist.WORKINGSET_FILE_SUFFIX); // if (!workingSetXmlData.exists()) { // // XML形式データがまだない場合のみ保存しなおす. // OutputStream outstm = workingSetXmlData // .getOutputStream(); // try { // wr.writeWorkingSet(ws, outstm); // } finally { // outstm.close(); // } // } // } // // // serファイルは削除する. // fileData.delete(); // // } catch (Exception ex) { // logger.log(Level.WARNING, // FILENAME + " convert failed.", ex); // } // } // } // // } catch (Exception ex) { // logger.log(Level.WARNING, FILENAME + " convert failed.", ex); // } // } //} /** * 古いログファイルを消去する. * * @author seraphy */ class PurgeOldLogs extends StartupSupport { @Override public void doStartup() { AppConfig appConfig = AppConfig.getInstance(); long purgeOldLogsMillSec = appConfig.getPurgeLogDays() * 24L * 3600L * 1000L; if (purgeOldLogsMillSec > 0) { // 期限切れのログファイルを削除する long expiredDate = System.currentTimeMillis() - purgeOldLogsMillSec; ApplicationLogHandler.purge(expiredDate); } } } //ver0.999で廃止。 ///** // * 古いキャッシュファイルを消去する.
// * -character.xml-cache.ser, -favorites.serは、直接xmlでの読み込みになったため、 ただちに消去しても問題ない.
// * recent-character.serは、使用されなくなったため、ただちに消去して良い.
// * mangled_info.xmlは、*.serを消去したあとには不要となるため、消去する.
// * (今後使われることはない) // * // * @author seraphy // */ //class PurgeOldCaches extends StartupSupport { // // /** // * ロガー // */ // private final Logger logger = Logger.getLogger(getClass().getName()); // // @Override // public void doStartup() { // UserDataFactory userDataFactory = UserDataFactory.getInstance(); // File cacheDir = userDataFactory.getSpecialDataDir(".ser"); // if (cacheDir.exists()) { // File[] files = cacheDir.listFiles(); // if (files == null) { // logger.log(Level.WARNING, "cache-dir access failed."); // return; // } // for (File file : files) { // try { // if (!file.isFile() || !file.canWrite()) { // // ファイルでないか、書き込み不可の場合はスキップする. // continue; // } // String name = file.getName(); // if (name.endsWith("-character.xml-cache.ser") // || name.endsWith("-favorites.ser") // || name.equals("recent-character.ser") // || name.equals("mangled_info.xml")) { // boolean result = file.delete(); // logger.log(Level.INFO, "remove file " + file // + "/succeeded=" + result); // } // // } catch (Exception ex) { // logger.log(Level.WARNING, "remove file failed. " + file, ex); // } // } // } // } //} CharacterManaJ/src/main/java/charactermanaj/model/Layer.java0000644000175000017500000001037513615720000024207 0ustar paulliupaulliupackage charactermanaj.model; import java.io.File; /** * レイヤー情報.
* 重ね合わせ順による比較が可能.
* immutableなクラスであり、構築された後に変更されることはない.
* 同値であるかは、ID、順序、Dirのみで判断され、それ以外の情報は無視される.
* @author seraphy */ public final class Layer implements Comparable { /** * 重ね合わせ順 */ private final int order; /** * レイヤー識別名 */ private final String id; /** * レイヤー表示名 */ private final String localizedName; /** * カラーグループ */ private final ColorGroup colorGroup; /** * カラーグループ同期(初期) */ private final boolean initSync; /** * 対象ディレクトリ */ private final String dir; /** * カラーモデル名 */ private final String colorModelName; /** * レイヤー情報を構築する * * @param id * @param localizedName * @param order * @param colorGroup * @param initSync * @param dir * @param colorModelName */ public Layer(String id, String localizedName, int order, ColorGroup colorGroup, boolean initSync, String dir, String colorModelName) { if (id == null || id.length() == 0 || order < 0 || dir == null) { throw new IllegalArgumentException(); } if (localizedName == null || localizedName.length() == 0) { localizedName = id; } if (colorGroup == null) { colorGroup = ColorGroup.NA; } if (colorModelName == null || colorModelName.trim().length() == 0) { colorModelName = null; } this.id = id; this.localizedName = localizedName; this.order = order; this.colorGroup = colorGroup; this.initSync = initSync; this.dir = dir; this.colorModelName = colorModelName; } /** * 重ね合わせ順に比較する. * 同順位の場合は名前・ディレクトリから順序を決める. */ public int compareTo(Layer o) { int ret = order - o.order; if (ret == 0) { ret = id.compareTo(o.id); } if (ret == 0) { File d1 = new File(dir); File d2 = new File(o.dir); ret = d1.compareTo(d2); } return ret; } /** * レイヤー識別名を取得する * @return レイヤー識別名 */ public String getId() { return id; } /** * レイヤー表示名を取得する * @return レイヤー表示名 */ public String getLocalizedName() { return localizedName; } /** * 重ね合わせ順を取得する. * @return 重ね合わせ順 */ public int getOrder() { return order; } /** * カラーグループを取得する. * @return カラーグループ */ public ColorGroup getColorGroup() { return colorGroup; } /** * カラーグループの同期フラグ(初期)を取得する. * @return 同期フラグ */ public boolean isInitSync() { return initSync; } /** * 対象ディレクトリを取得する. * @return 対象ディレクトリ */ public String getDir() { return dir; } /** * カラーモデル名を取得する. * * @return カラーモデル名 */ public String getColorModelName() { return colorModelName; } /** * 同一レイヤーであるか判断する.
* ID、順序、Dirで判断する.
* (カラーグループ、カラーグループ同期、表示名、は無視される.)
*/ @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof Layer) { Layer o = (Layer) obj; File d1 = new File(dir); File d2 = new File(o.dir); return id.equals(o.id) && order == o.order && d1.equals(d2); } return false; } /** * 同一レイヤーであるか判断する.
* IDのみで判断する.
* (カラーグループ、カラーグループ同期、表示名、順序、Dirは無視される.)
* @param a 比較1 * @param b 比較2 * @return 等しければtrue、そうでなければfalse */ public static boolean equals(Layer a, Layer b) { if (a == b) { return true; } if (a == null || b == null) { return false; } return a.equals(b); } @Override public int hashCode() { return id.hashCode(); } @Override public String toString() { return "Layer(id=" + id + ", name=" + localizedName + ", order=" + order + ")"; } } CharacterManaJ/src/main/java/charactermanaj/model/PartsIdentifier.java0000644000175000017500000000534513615720000026230 0ustar paulliupaulliupackage charactermanaj.model; /** * パーツ識別子.
* パーツ識別子の同値性は同一カテゴリID、且つ、同一のパーツ名(ID)であることによってのみ判定される.
* 表示名については不問.
* カテゴリIDのみ判定され、カテゴリの同値性についても問わない.
* @author seraphy * */ public final class PartsIdentifier implements Comparable { private final PartsCategory partsCategory; private final String partsName; private final String localizedName; public PartsIdentifier(final PartsCategory partsCategory, final String partsName, final String localizedName) { if (partsName == null || partsCategory == null) { throw new IllegalArgumentException(); } this.partsCategory = partsCategory; this.partsName = partsName; this.localizedName = (localizedName == null || localizedName.trim().length() == 0) ? partsName : localizedName; } public PartsCategory getPartsCategory() { return partsCategory; } public boolean hasLayer(Layer layer) { return partsCategory.hasLayer(layer); } @Override public int hashCode() { return partsName.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof PartsIdentifier) { return partsName.equals(((PartsIdentifier) obj).partsName) && partsCategory.isSameCategoryID(((PartsIdentifier) obj).getPartsCategory()); } return false; } public static boolean equals(PartsIdentifier a, PartsIdentifier b) { if (a == b) { return true; } if (a == null || b == null) { return false; } return a.equals(b); } public int compareTo(PartsIdentifier o) { if (o == this) { return 0; } int ret = partsCategory.compareTo(o.partsCategory); if (ret == 0) { ret = localizedName.compareTo(o.localizedName); } if (ret == 0) { ret = partsName.compareTo(o.partsName); } return ret; } public String getPartsName() { return partsName; } public String getLocalizedPartsName() { return localizedName; } /** * ローカライズされた名前を変更する.
* [注意] このクラスは不変クラスなので、インスタンスを変更するのではなく、変更された状態の * 新しいインスタンスを返します.
* @param localizedName ローカライズされた名前 * @return 新しいインスタンス */ public PartsIdentifier setLocalizedPartsName(String localizedName) { if (localizedName == null || localizedName.trim().length() == 0) { throw new IllegalArgumentException(); } return new PartsIdentifier(partsCategory, partsName, localizedName); } @Override public String toString() { return getLocalizedPartsName(); } } CharacterManaJ/src/main/java/charactermanaj/model/PartsCategory.java0000644000175000017500000001332613615720000025721 0ustar paulliupaulliupackage charactermanaj.model; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * パーツカテゴリ.
* 同値であるかはカテゴリIDが一致するかによってのみ判定します.
* それ以外の情報は無視されます.
* @author seraphy */ public final class PartsCategory implements Comparable { /** * 順序 */ private final int order; /** * カテゴリ識別名 */ private final String categoryId; /** * カテゴリ表示名 */ private final String localizedCategoryName; /** * 複数選択可能? */ private final boolean multipleSelectable; /** * 省略可能? */ private final boolean optional; /** * 表示行数 */ private final int visibleRows; /** * レイヤー情報 */ private final List layers; /** * カテゴリを構築する.
* @param order 順序 * @param categoryId カテゴリ識別名 * @param localizedCategoryName カテゴリ表示名 * @param multipleSelectable 複数選択可能? * @param optional 省略可能? * @param visibleRows 表示行数 * @param layers レイヤー情報の配列、nullの場合は空とみなす */ public PartsCategory(final int order, final String categoryId, String localizedCategoryName, boolean multipleSelectable, boolean optional, int visibleRows, Layer[] layers) { if (categoryId == null || categoryId.trim().length() == 0) { throw new IllegalArgumentException(); } if (layers == null) { layers = new Layer[0]; } if (localizedCategoryName == null || localizedCategoryName.trim().length() == 0) { localizedCategoryName = categoryId; } this.order = order; this.categoryId = categoryId.trim(); this.localizedCategoryName = localizedCategoryName.trim(); this.multipleSelectable = multipleSelectable; this.optional = optional; this.layers = Collections.unmodifiableList(Arrays.asList(layers.clone())); this.visibleRows = visibleRows; } /** * カテゴリの順序を比較して返す.
* 順序で比較し、同一順序であれば表示名で比較し、それでも同一であれば識別子で比較します.
* @param o 比較対象. * @return 順序 */ public int compareTo(PartsCategory o) { if (o == this) { return 0; } int ret = order - o.order; if (ret == 0) { ret = localizedCategoryName.compareTo(o.localizedCategoryName); } if (ret == 0) { ret = categoryId.compareTo(o.categoryId); } return ret; } @Override public int hashCode() { return this.categoryId.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof PartsCategory) { // IDが等しいか? PartsCategory o = (PartsCategory) obj; if (categoryId.equals(o.getCategoryId())) { // それ以外の情報も等しいか? // (用法的に、異なるインスタンスで同じIDをもつことは希であり、 // その上、IDが同一で、それ以外の内容が一致しないことは更に希である。) if (order == o.order && localizedCategoryName .equals(o.localizedCategoryName) && multipleSelectable == o.multipleSelectable && visibleRows == o.visibleRows && layers.equals(o.layers)) { return true; } } } return false; } /** * 同一カテゴリであるか判定します.
* nullの場合は常にfalseを返します.
* @param obj パーツカテゴリ、またはnull * @return 同一のパーツカテゴリIDであればtrue、そうでなければfalse */ public boolean isSameCategoryID(PartsCategory obj) { if (obj == this) { return true; } if (obj != null) { return categoryId.equals(obj.categoryId); } return false; } public static boolean equals(PartsCategory o1, PartsCategory o2) { if (o1 == o2) { return true; } if (o1 == null || o2 == null) { return false; } return o1.equals(o2); } /** * 定義順を取得する * @return 定義順 */ public int getOrder() { return order; } /** * 複数選択可能であるか? * @return 複数選択可能であるか? */ public boolean isMultipleSelectable() { return multipleSelectable; } /** * 省略可能であるか? * @return 省略可能であるか? */ public boolean isOptional() { return optional; } /** * 表示行数を取得する. * @return 表示行数 */ public int getVisibleRows() { return visibleRows; } /** * このカテゴリに指定したレイヤーが含まれるか検証する. * @param layer レイヤー * @return 含まれる場合はtrue、含まれない場合はfalse */ public boolean hasLayer(Layer layer) { if (layer == null) { return false; } for (Layer memberLayer : layers) { if (Layer.equals(memberLayer, layer)) { return true; } } return false; } /** * レイヤー情報 * @return レイヤー情報 */ public List getLayers() { return layers; } /** * レイヤーを取得する.
* 該当するレイヤーがなければnull * @param layerId レイヤー名 * @return レイヤーもしくはnull */ public Layer getLayer(String layerId) { if (layerId == null) { return null; } for (Layer layer : layers) { if (layer.getId().equals(layerId)) { return layer; } } return null; } /** * カテゴリ識別名を取得する. * @return カテゴリ識別名 */ public String getCategoryId() { return categoryId; } /** * カテゴリ表示名を取得する. * @return カテゴリ表示名 */ public String getLocalizedCategoryName() { return this.localizedCategoryName; } @Override public String toString() { return getLocalizedCategoryName(); } } CharacterManaJ/src/main/java/charactermanaj/model/io/0000755000175000017500000000000013615720000022671 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/model/io/WorkingSetPersist.java0000644000175000017500000002154413615720000027210 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.BufferedInputStream; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.model.CharacterData; import charactermanaj.model.IndependentPartsSetInfo; import charactermanaj.model.IndependentWorkingSet; import charactermanaj.model.PartsColorInfo; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.model.WorkingSet; import charactermanaj.util.FileUtilities; import charactermanaj.util.UserData; import charactermanaj.util.UserDataFactory; /** * ワーキングセットの保存と復元.
* * @author seraphy */ public class WorkingSetPersist { /** * ロガー */ private static final Logger logger = Logger .getLogger(WorkingSetPersist.class.getName()); /** * ワーキングセットのサフィックス. */ private static final String WORKINGSET_FILE_SUFFIX = "workingset.xml"; private static final WorkingSetPersist singletion = new WorkingSetPersist(); private final UserDataFactory userDataFactory = UserDataFactory.getLocalInstance(); public static WorkingSetPersist getInstance() { return singletion; } /** * すべてのワーキングセットをクリアする.
*/ public void removeAllWorkingSet() { File dir = userDataFactory.getSpecialDataDir("foo-" + WORKINGSET_FILE_SUFFIX); if (dir.exists() && dir.isDirectory()) { File[] files = dir.listFiles(new FileFilter() { public boolean accept(File pathname) { return pathname.isFile() && pathname.getName().endsWith(WORKINGSET_FILE_SUFFIX); } }); if (files == null) { logger.log(Level.WARNING, "dir access failed. " + dir); return; } for (File file : files) { logger.log(Level.INFO, "remove file: " + file); try { FileUtilities.delete(file); } catch (Exception ex) { logger.log(Level.WARNING, "failed to remove file: " + file, ex); } } } } /** * ワーキングセットを削除する. * * @param cd * 対象のキャラクターデータ */ public void removeWorkingSet(CharacterData cd) { UserData workingSetXmlData = userDataFactory.getMangledNamedUserData( cd.getDocBase(), WORKINGSET_FILE_SUFFIX); if (workingSetXmlData != null && workingSetXmlData.exists()) { logger.log(Level.INFO, "remove file: " + workingSetXmlData); workingSetXmlData.delete(); } } /** * ワーキングセットを保存する.
* ワーキングセットインスタンスには、あらかじめ全て設定しておく必要がある.
* * @param workingSet * ワーキングセット * @throws IOException * 失敗 */ public void saveWorkingSet(WorkingSet workingSet) throws IOException { if (workingSet == null) { throw new IllegalArgumentException(); } CharacterData characterData = workingSet.getCharacterData(); if (characterData == null) { throw new IllegalArgumentException("character-data must be set."); } // XML形式でのワーキングセットの保存 UserData workingSetXmlData = userDataFactory.getMangledNamedUserData( characterData.getDocBase(), WORKINGSET_FILE_SUFFIX); OutputStream outstm = workingSetXmlData.getOutputStream(); try { WorkingSetXMLWriter workingSetXmlWriter = new WorkingSetXMLWriter(); workingSetXmlWriter.writeWorkingSet(workingSet, outstm); } finally { outstm.close(); } } /** * ワーキングセットを取得する.
* * @param characterData * 対象のキャラクターデータ * @return ワーキングセット、なければnull * @throws IOException * 読み込みに失敗した場合 */ public WorkingSet loadWorkingSet(CharacterData characterData) throws IOException { if (characterData == null) { throw new IllegalArgumentException(); } // XML形式でのワーキングセットの復元 UserData workingSetXmlData = userDataFactory.getMangledNamedUserData( characterData.getDocBase(), WORKINGSET_FILE_SUFFIX); if (workingSetXmlData == null || !workingSetXmlData.exists()) { // 保存されていない場合 return null; } // キャラクターデータと関連づけられていないワーキングセットデータを取得する IndependentWorkingSet workingSet2; InputStream is = workingSetXmlData.openStream(); try { WorkingSetXMLReader WorkingSetXMLReader = new WorkingSetXMLReader(); workingSet2 = WorkingSetXMLReader.loadWorkingSet(is); } finally { is.close(); } // 現在のキャラクターデータと照合する。 URI docBase = characterData.getDocBase(); if (docBase != null && !docBase.equals(workingSet2.getCharacterDocBase())) { // docBaseが一致せず logger.log(Level.INFO, "docBase missmatch"); return null; } String sig = characterData.toSignatureString(); if (!sig.equals(workingSet2.getCharacterDataSig())) { // 構造が一致せず. logger.log(Level.INFO, "character data structure missmatch"); return null; } // 現在のキャラクターデータに関連づけられているワーキングセットとして転記する WorkingSet ws = new WorkingSet(); ws.setCharacterData(characterData); ws.setCharacterDataRev(characterData.getRev()); ws.setCharacterDocBase(docBase); ws.setLastUsedExportDir(workingSet2.getLastUsedExportDir()); ws.setLastUsedSaveDir(workingSet2.getLastUsedSaveDir()); // パーツの色情報を復元する. Map partsColorInfoMap = characterData .getPartsColorManager().getPartsColorInfoMap(); workingSet2.createCompatible(characterData, partsColorInfoMap); ws.setPartsColorInfoMap(partsColorInfoMap); // 選択されているパーツの復元 IndependentPartsSetInfo partsSetInfo = workingSet2.getCurrentPartsSet(); if (partsSetInfo != null) { PartsSet partsSet = IndependentPartsSetInfo.convertPartsSet( partsSetInfo, characterData, false); ws.setCurrentPartsSet(partsSet); // 最後に選択したお気に入り情報の復元 IndependentPartsSetInfo lastUsePresetPartsInfo = workingSet2 .getLastUsePresetParts(); if (lastUsePresetPartsInfo != null && lastUsePresetPartsInfo.getId() != null && lastUsePresetPartsInfo.getId().trim().length() > 0) { PartsSet lastUsePresetParts = IndependentPartsSetInfo .convertPartsSet(lastUsePresetPartsInfo, characterData, false); ws.setLastUsePresetParts(lastUsePresetParts); } } ws.setWallpaperInfo(workingSet2.getWallpaperInfo()); ws.setZoomFactor(workingSet2.getZoomFactor()); ws.setViewPosition(workingSet2.getViewPosition()); ws.setWindowRect(workingSet2.getWindowRect()); ws.setNoNeedDataDownload(workingSet2.isNoNeedDataDownload()); return ws; } /** * 古いワーキングセットについて、すでに本体データが削除されている場合はワーキングセットも削除する。 * まだ存在するものは削除されない。 * 生きている場合は、ワーキングセットの検査日時を表すために更新日時を現在日時に設定しなおす。 * @param expireDate 判定対象となる日時、それ以前のもののみ判定を行う。 */ public void purge(final long expireDate) { final String XML_SUFFIX = "-" + WORKINGSET_FILE_SUFFIX; UserDataFactory userDataFactory = UserDataFactory.getLocalInstance(); File dir = userDataFactory.getSpecialDataDir(XML_SUFFIX); File[] xmls = dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isFile() && pathname.getName().endsWith(XML_SUFFIX) && pathname.lastModified() < expireDate && pathname.length() > 0; } }); if (xmls == null) { logger.log(Level.WARNING, "workingset-dir access failed."); return; } for (File xmlFile : xmls) { try { WorkingSetXMLReader reader = new WorkingSetXMLReader(); IndependentWorkingSet ws; InputStream is = new BufferedInputStream(new FileInputStream(xmlFile)); try { ws = reader.loadWorkingSet(is); } finally { is.close(); } URI docBase = ws.getCharacterDocBase(); if (docBase.getScheme().equals("file")) { File characterXml = new File(docBase); if (!characterXml.exists()) { // キャラクター定義XMLが存在しない = 削除されたキャラクターデータ logger.log(Level.INFO, "remove amandone workingset: " + xmlFile + ", docBase=" + docBase); xmlFile.delete(); } else { // チェック済みであることを示すためにXMLの更新日時を現在時刻にする xmlFile.setLastModified(System.currentTimeMillis()); } } } catch (Exception ex) { logger.log(Level.WARNING, "file access failed. " + xmlFile, ex); } } } } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsImageDirectoryWatchAgentFactory.java0000644000175000017500000001370613615720000032762 0ustar paulliupaulliupackage charactermanaj.model.io; import java.net.URI; import java.util.HashMap; import java.util.LinkedList; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.model.CharacterData; /** * ディレクトリ監視エージェントのファクトリ.
* このファクトリ単位でディレクト利監視エージェントは保持されます.
* このファクトリ上に、すでに同一のキャラクターデータを監視するエージェントがいる場合、それらのエージェントの実体は * ハンドルによって共有されます.
* @author seraphy */ public final class PartsImageDirectoryWatchAgentFactory { private final Logger logger = Logger.getLogger(getClass().getName()); private static PartsImageDirectoryWatchAgentFactory inst = new PartsImageDirectoryWatchAgentFactory(); private HashMap agents = new HashMap(); private final Object lock = new Object(); private PartsImageDirectoryWatchAgentFactory() { super(); } public static PartsImageDirectoryWatchAgentFactory getFactory() { return inst; } /** * キャラクターデータを指定して、そのキャラクターデータに対する監視エージェントを作成し、そのハンドルを返します.
* すでに、そのキャラクターデータに対するエージェントが存在する場合は、そのハンドルを返します.
* 無効なキャラクターデータ、もしくはnullを指定した場合は、エージェントの実体を持たないダミーのハンドルが返されます.
* @param characterData キャラクターデータ * @return 作成された、もしくは既に作成されている監視エージェントのハンドル */ public PartsImageDirectoryWatchAgent getAgent(CharacterData characterData) { if (characterData == null || !characterData.isValid()) { // キャラクターデータがnullまたは無効である場合は、 // 何もしないダミーのディレクトリハンドルを返す. return new NullWatchAgentHandle(characterData); } URI docBase = characterData.getDocBase(); PartsImageDirectoryWatchAgentThread agentImpl; synchronized (lock) { if (agents.containsKey(docBase)) { agentImpl = agents.get(docBase); } else { agentImpl = new PartsImageDirectoryWatchAgentThread(characterData); agents.put(docBase, agentImpl); logger.log(Level.FINE, "watch agent is cached. " + agentImpl); } } return new PartsImageDirectoryWatchAgentHandle(agentImpl); } } /** * 監視スレッドの実体がない、何もしないハンドル. * @author seraphy */ class NullWatchAgentHandle implements PartsImageDirectoryWatchAgent, PartsImageDirectoryWatchListener { private CharacterData characterData; public NullWatchAgentHandle(CharacterData characterData) { this.characterData = characterData; } public void addPartsImageDirectoryWatchListener( PartsImageDirectoryWatchListener l) { } // なにもしない. public void connect() { // なにもしない. } public void detectPartsImageChange(PartsImageDirectoryWatchEvent e) { // なにもしない. } public void disconnect() { // なにもしない. } public CharacterData getCharcterData() { return characterData; } public void removePartsImageDirectoryWatchListener( PartsImageDirectoryWatchListener l) { // なにもしない. } public void resume() { // なにもしない. } public void suspend() { // なにもしない. } } /** * 監視ディレクトリに対する監視スレッドの実体を複数のメインフレームで共有するための、個々のフレーム用のハンドル.
* @author seraphy */ class PartsImageDirectoryWatchAgentHandle implements PartsImageDirectoryWatchAgent, PartsImageDirectoryWatchListener { /** * ロガー */ private final Logger logger = Logger.getLogger(getClass().getName()); /** * 監視スレッドの実体 */ private final PartsImageDirectoryWatchAgentThread agent; /** * 監視を通知されるリスナー */ private final LinkedList listeners = new LinkedList(); /** * このハンドルで開始要求されているか示すフラグ. */ private boolean connected; protected PartsImageDirectoryWatchAgentHandle(PartsImageDirectoryWatchAgentThread agent) { this.agent = agent; } public CharacterData getCharcterData() { return agent.getCharcterData(); } public void connect() { logger.log(Level.FINE, "agent connect request. " + this); if ( !connected) { agent.addPartsImageDirectoryWatchListener(this); connected = true; } } public void disconnect() { logger.log(Level.FINE, "agent disconnect request. " + this); if (connected) { connected = false; agent.removePartsImageDirectoryWatchListener(this); } } public void suspend() { logger.log(Level.FINE, "agent stop request. " + this); agent.suspend(this); } public void resume() { logger.log(Level.FINE, "agent resume request. " + this); agent.resume(this); } public void addPartsImageDirectoryWatchListener( PartsImageDirectoryWatchListener l) { if (l != null) { synchronized (listeners) { listeners.add(l); } } } public void removePartsImageDirectoryWatchListener( PartsImageDirectoryWatchListener l) { if (l != null) { synchronized (listeners) { listeners.remove(l); } } } public void detectPartsImageChange(PartsImageDirectoryWatchEvent e) { if (!connected) { logger.log(Level.FINE, "skip agent event. " + this); return; } logger.log(Level.FINE, "agent event occured. " + this); PartsImageDirectoryWatchListener[] ls; synchronized (listeners) { ls = listeners.toArray(new PartsImageDirectoryWatchListener[listeners.size()]); } for (PartsImageDirectoryWatchListener l : ls) { l.detectPartsImageChange(e); } } } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataJarFileWriter.java0000644000175000017500000000207313615720000030656 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; public class CharacterDataJarFileWriter extends AbstractCharacterDataArchivedFileWriter { protected JarOutputStream jarOutStm; public CharacterDataJarFileWriter(File outFile) throws IOException { super(outFile); this.jarOutStm = new JarOutputStream( new BufferedOutputStream(new FileOutputStream(tmpFile))); } @Override protected void closeEntry() throws IOException { jarOutStm.closeEntry(); } @Override protected OutputStream getOutputStream() throws IOException { return jarOutStm; } @Override protected void putNextEntry(String name, long lastModified) throws IOException { JarEntry entry = new JarEntry(name); if (lastModified > 0) { entry.setTime(lastModified); } jarOutStm.putNextEntry(entry); } protected void internalClose() throws IOException { jarOutStm.close(); } } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataXMLWriter.java0000644000175000017500000005512613615720000030011 0ustar paulliupaulliupackage charactermanaj.model.io; import java.awt.Color; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.charset.Charset; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import charactermanaj.graphics.filters.ColorConv; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.model.CharacterData; import charactermanaj.model.ColorGroup; import charactermanaj.model.ColorInfo; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsColorInfo; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.model.RecommendationURL; /** * パーツ管理情報のXMLへの書き込み用クラス. * * @author seraphy */ public class CharacterDataXMLWriter { /** * キャラクター定義バージョン */ private static final String VERSION_SIG_1_0 = "1.0"; /** * キャラクター定義XMLファイルの名前空間 */ private static final String DEFAULT_NS = "http://charactermanaj.sourceforge.jp/schema/charactermanaj"; private final String NS; public CharacterDataXMLWriter() { this(DEFAULT_NS); } public CharacterDataXMLWriter(String ns) { this.NS = ns; } /** * キャラクターデータのXMLの書き込み. * * @param characterData * @param outstm * @throws IOException */ public void writeXMLCharacterData(CharacterData characterData, OutputStream outstm) throws IOException { if (outstm == null || characterData == null) { throw new IllegalArgumentException(); } Locale locale = Locale.getDefault(); String lang = locale.getLanguage(); Document doc; try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); doc = builder.newDocument(); } catch (ParserConfigurationException ex) { throw new RuntimeException("JAXP Configuration failed.", ex); } Element root = doc.createElementNS(NS, "character"); root.setAttribute("version", VERSION_SIG_1_0); root.setAttribute("xmlns:xml", XMLConstants.XML_NS_URI); root.setAttribute("xmlns:xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); root.setAttribute("xsi:schemaLocation", NS + " character.xsd"); root.setAttribute("id", characterData.getId()); root.setAttribute("rev", characterData.getRev()); doc.appendChild(root); // name Element nodeName = doc.createElementNS(NS, "name"); Attr attrLang = doc.createAttributeNS(XMLConstants.XML_NS_URI, "lang"); attrLang.setValue(lang); nodeName.setAttributeNodeNS(attrLang); nodeName.setTextContent(characterData.getName()); root.appendChild(nodeName); // information String author = characterData.getAuthor(); String description = characterData.getDescription(); if ((author != null && author.length() > 0) || (description != null && description.length() > 0)) { Element nodeInfomation = doc.createElementNS(NS, "information"); if (author != null && author.length() > 0) { Element nodeAuthor = doc.createElementNS(NS, "author"); Attr attrNodeAuthorLang = doc.createAttributeNS( XMLConstants.XML_NS_URI, "lang"); attrNodeAuthorLang.setValue(lang); nodeAuthor.setAttributeNodeNS(attrNodeAuthorLang); nodeAuthor.setTextContent(author); nodeInfomation.appendChild(nodeAuthor); } if (description != null && description.length() > 0) { // 説明の改行コードはXML上ではLFとする. description = description.replace("\r\n", "\n"); description = description.replace("\r", "\n"); Element nodeDescription = doc .createElementNS(NS, "description"); Attr attrNodeDescriptionLang = doc.createAttributeNS( XMLConstants.XML_NS_URI, "lang"); attrNodeDescriptionLang.setValue(lang); nodeDescription.setAttributeNodeNS(attrNodeDescriptionLang); nodeDescription.setTextContent(description); nodeInfomation.appendChild(nodeDescription); } root.appendChild(nodeInfomation); } // size Element nodeSize = doc.createElementNS(NS, "image-size"); Element nodeWidth = doc.createElementNS(NS, "width"); nodeWidth.setTextContent(Integer.toString((int) characterData .getImageSize().getWidth())); Element nodeHeight = doc.createElementNS(NS, "height"); nodeHeight.setTextContent(Integer.toString((int) characterData .getImageSize().getHeight())); nodeSize.appendChild(nodeWidth); nodeSize.appendChild(nodeHeight); root.appendChild(nodeSize); // settings Element nodeSettings = doc.createElementNS(NS, "settings"); root.appendChild(nodeSettings); for (String settingsEntryName : characterData.getPropertyNames()) { String value = characterData.getProperty(settingsEntryName); if (value != null) { Element nodeEntry = doc.createElementNS(NS, "entry"); nodeEntry.setAttribute("key", settingsEntryName); nodeEntry.setTextContent(value); nodeSettings.appendChild(nodeEntry); } } // categories Element nodeCategories = doc.createElementNS(NS, "categories"); for (PartsCategory category : characterData.getPartsCategories()) { // category Element nodeCategory = doc.createElementNS(NS, "category"); nodeCategory.setAttribute("id", category.getCategoryId()); nodeCategory.setAttribute("multipleSelectable", category.isMultipleSelectable() ? "true" : "false"); nodeCategory.setAttribute("optional", category.isOptional() ? "true" : "false"); // visible-rows Element nodeVisibleRows = doc.createElementNS(NS, "visible-rows"); nodeVisibleRows.setTextContent(Integer.toString(category .getVisibleRows())); nodeCategory.appendChild(nodeVisibleRows); // category name Element nodeCategoryName = doc.createElementNS(NS, "display-name"); Attr attrCategoryNameLang = doc.createAttributeNS( XMLConstants.XML_NS_URI, "lang"); attrCategoryNameLang.setValue(lang); nodeCategoryName.setAttributeNodeNS(attrCategoryNameLang); nodeCategoryName .setTextContent(category.getLocalizedCategoryName()); nodeCategory.appendChild(nodeCategoryName); // layers Element nodeLayers = doc.createElementNS(NS, "layers"); for (Layer layer : category.getLayers()) { // layer Element nodeLayer = doc.createElementNS(NS, "layer"); nodeLayer.setAttribute("id", layer.getId()); Element nodeLayerName = doc.createElementNS(NS, "display-name"); Attr attrLayerNameLang = doc.createAttributeNS( XMLConstants.XML_NS_URI, "lang"); attrLayerNameLang.setValue(lang); nodeLayerName.setAttributeNodeNS(attrLayerNameLang); nodeLayerName.setTextContent(layer.getLocalizedName()); nodeLayer.appendChild(nodeLayerName); Element nodeOrder = doc.createElementNS(NS, "order"); nodeOrder.setTextContent(Integer.toString(layer.getOrder())); nodeLayer.appendChild(nodeOrder); ColorGroup colorGroup = layer.getColorGroup(); if (colorGroup != null && colorGroup.isEnabled()) { Element nodeColorGroup = doc.createElementNS(NS, "colorGroup"); nodeColorGroup.setAttribute("refid", colorGroup.getId()); nodeColorGroup.setAttribute("init-sync", layer.isInitSync() ? "true" : "false"); nodeLayer.appendChild(nodeColorGroup); } Element nodeDir = doc.createElementNS(NS, "dir"); nodeDir.setTextContent(layer.getDir()); nodeLayer.appendChild(nodeDir); String colorModelName = layer.getColorModelName(); if (colorModelName != null && colorModelName.length() > 0) { Element nodeColorModel = doc.createElementNS(NS, "colorModel"); nodeColorModel.setTextContent(layer.getColorModelName()); nodeLayer.appendChild(nodeColorModel); } nodeLayers.appendChild(nodeLayer); } nodeCategory.appendChild(nodeLayers); nodeCategories.appendChild(nodeCategory); } root.appendChild(nodeCategories); // ColorGroupを構築する Collection colorGroups = characterData.getColorGroups(); if (colorGroups.size() > 0) { Element nodeColorGroups = doc.createElementNS(NS, "colorGroups"); int colorGroupCount = 0; for (ColorGroup colorGroup : colorGroups) { if (!colorGroup.isEnabled()) { continue; } Element nodeColorGroup = doc.createElementNS(NS, "colorGroup"); nodeColorGroup.setAttribute("id", colorGroup.getId()); Element nodeColorGroupName = doc.createElementNS(NS, "display-name"); Attr attrColorGroupNameLang = doc.createAttributeNS( XMLConstants.XML_NS_URI, "lang"); attrColorGroupNameLang.setValue(lang); nodeColorGroupName.setAttributeNodeNS(attrColorGroupNameLang); nodeColorGroupName .setTextContent(colorGroup.getLocalizedName()); nodeColorGroup.appendChild(nodeColorGroupName); nodeColorGroups.appendChild(nodeColorGroup); colorGroupCount++; } if (colorGroupCount > 0) { root.appendChild(nodeColorGroups); } } // Recommendations List recommendations = RecommendationURLCompensator.getInstance() .getUncompensateRecommendationList(characterData); // 補完解除されたお勧めリストを取得する。 if (recommendations != null) { Element nodeRecommendations = doc.createElementNS(NS, "recommendations"); for (RecommendationURL recommendation : recommendations) { Element nodeRecommendation = doc.createElementNS(NS, "recommendation"); String displayName = recommendation.getDisplayName(); String url = recommendation.getUrl(); Element nodeDescription = doc .createElementNS(NS, "description"); Attr attrRecommendationDescriptionLang = doc.createAttributeNS( XMLConstants.XML_NS_URI, "lang"); attrRecommendationDescriptionLang.setValue(lang); nodeDescription .setAttributeNodeNS(attrRecommendationDescriptionLang); nodeDescription.setTextContent(displayName); Element nodeURL = doc.createElementNS(NS, "URL"); Attr attrRecommendationURLLang = doc.createAttributeNS( XMLConstants.XML_NS_URI, "lang"); attrRecommendationURLLang.setValue(lang); nodeURL.setAttributeNodeNS(attrRecommendationURLLang); nodeURL.setTextContent(url); nodeRecommendation.appendChild(nodeDescription); nodeRecommendation.appendChild(nodeURL); nodeRecommendations.appendChild(nodeRecommendation); } root.appendChild(nodeRecommendations); } // presetsのelementを構築する. Element nodePresets = doc.createElementNS(NS, "presets"); if (writePartsSetElements(doc, nodePresets, characterData, true, false) > 0) { root.appendChild(nodePresets); } // output xml TransformerFactory txFactory = TransformerFactory.newInstance(); txFactory.setAttribute("indent-number", Integer.valueOf(4)); Transformer tfmr; try { tfmr = txFactory.newTransformer(); } catch (TransformerConfigurationException ex) { throw new RuntimeException("JAXP Configuration Failed.", ex); } tfmr.setOutputProperty(OutputKeys.INDENT, "yes"); // JDK-4504745 : javax.xml.transform.Transformer encoding does not work properly // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4504745 final String encoding = "UTF-8"; tfmr.setOutputProperty("encoding", encoding); try { tfmr.transform(new DOMSource(doc), new StreamResult( new OutputStreamWriter(outstm, Charset.forName(encoding)))); } catch (TransformerException ex) { IOException ex2 = new IOException("XML Convert failed."); ex2.initCause(ex); throw ex2; } } /** * キャラクターデータ内のPresetおよびFavotiesのPartssetの双方共通のパーツセット要素のリストを構築する. * * @param doc * ドキュメントオブジェクト(createElementNS用) * @param baseElement * 親要素、キャラクターデータの場合はPreset、Favoritesの場合はPartssetを示す要素 * @param characterData * キャラクターデータ * @param writePresets * Preset属性のパーツセットを登録する場合はtrue、Preset属性時はデフォルトプリセット属性も(あれば)登録される * @param writeFavorites * Preset属性のないパーツセットを登録する場合はtrue * @return 登録したパーツセットの個数 */ protected int writePartsSetElements(Document doc, Element baseElement, CharacterData characterData, boolean writePresets, boolean writeFavorites) { Map partsSetMap = characterData.getPartsSets(); Locale locale = Locale.getDefault(); String lang = locale.getLanguage(); HashMap registeredPartsSetMap = new HashMap(); for (Map.Entry partsSetsEntry : partsSetMap .entrySet()) { PartsSet partsSet = partsSetsEntry.getValue(); if (partsSet.isPresetParts() && !writePresets) { continue; } if (!partsSet.isPresetParts() && !writeFavorites) { continue; } if (partsSet.isEmpty()) { // 空のパーツセットは登録しない. continue; } Element nodePreset = createPartsSetXML(doc, lang, partsSet); baseElement.appendChild(nodePreset); registeredPartsSetMap.put(partsSet.getPartsSetId(), partsSet); } // プリセット登録時はデフォルトのプリセットIDがあれば、それも登録する. // (ただし、該当パーツセットが書き込み済みである場合のみ) if (writePresets) { String defaultPresetId = characterData.getDefaultPartsSetId(); if (defaultPresetId != null && defaultPresetId.length() > 0) { PartsSet defaultPartsSet = registeredPartsSetMap .get(defaultPresetId); if (defaultPartsSet != null && defaultPartsSet.isPresetParts()) { baseElement.setAttribute("default-preset", defaultPresetId); } } } return registeredPartsSetMap.size(); } /** * パーツセットのXM要素を生成して返す. * * @param doc * ノードを生成するためのファクトリ * @param lang * 言語識別用(パーツセット名などの登録時のlang属性に必要) * @param partsSet * パーツセット、nullの場合はxsi:nul="true"が返される. * @return パーツセット1つ分のXML要素 */ public Element createPartsSetXML(Document doc, String lang, PartsSet partsSet) { if (doc == null || lang == null) { throw new IllegalArgumentException(); } String partsSetId = partsSet.getPartsSetId(); String localizedName = partsSet.getLocalizedName(); Element nodePreset = doc.createElementNS(NS, "preset"); if (partsSet == null || partsSet.isEmpty()) { // 指定されていないか有効でない場合は無しとみなす. nodePreset.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true"); return nodePreset; } nodePreset.setAttribute("id", partsSetId); // display-name Element nodeName = doc.createElementNS(NS, "display-name"); Attr attrLang = doc.createAttributeNS(XMLConstants.XML_NS_URI, "lang"); attrLang.setValue(lang); nodeName.setAttributeNode(attrLang); nodeName.setTextContent(localizedName); nodePreset.appendChild(nodeName); // bgColor Color bgColor = partsSet.getBgColor(); if (bgColor != null) { Element nodeBgColor = doc.createElementNS(NS, "background-color"); nodeBgColor.setAttribute("color", "#" + Integer.toHexString(bgColor.getRGB() & 0xffffff)); nodePreset.appendChild(nodeBgColor); } // affine transform parameter double[] affineTransformParameter = partsSet .getAffineTransformParameter(); if (affineTransformParameter != null) { Element nodeAffineTransform = doc.createElementNS(NS, "affine-transform-parameter"); StringBuilder tmp = new StringBuilder(); for (double affineItem : affineTransformParameter) { if (tmp.length() > 0) { tmp.append(" "); } tmp.append(Double.toString(affineItem)); } nodeAffineTransform.setTextContent(tmp.toString()); nodePreset.appendChild(nodeAffineTransform); } // categories for (Map.Entry> entry : partsSet .entrySet()) { PartsCategory partsCategory = entry.getKey(); // category Element nodeCategory = doc.createElementNS(NS, "category"); nodeCategory.setAttribute("refid", partsCategory.getCategoryId()); nodePreset.appendChild(nodeCategory); List partsIdentifiers = entry.getValue(); for (PartsIdentifier partsIdentifier : partsIdentifiers) { String partsName = partsIdentifier.getPartsName(); Element nodeParts = doc.createElementNS(NS, "parts"); nodeParts.setAttribute("name", partsName); nodeCategory.appendChild(nodeParts); PartsColorInfo partsColorInfo = partsSet .getColorInfo(partsIdentifier); if (partsColorInfo != null) { Element nodeColor = createPartsColorInfoXML(doc, partsColorInfo); nodeParts.appendChild(nodeColor); } } } // アクティブなレイヤーパターン Set patternIds = partsSet.getActiveCustomLayerPatternIds(); if (patternIds != null) { Element patternsElm = doc.createElementNS(NS, "active-custom-layer-patterns"); for (String patternId : patternIds) { Element patElm = doc.createElementNS(NS, "pattern"); patElm.setAttribute("id", patternId); patternsElm.appendChild(patElm); } nodePreset.appendChild(patternsElm); } return nodePreset; } /** * パーツカラー情報のXML要素を生成して返す.
* * @param doc * 要素を作成するためのファクトリ * @param partsColorInfo * パーツカラー情報 * @return パーツカラー情報の要素 */ public Element createPartsColorInfoXML(Document doc, PartsColorInfo partsColorInfo) { if (doc == null || partsColorInfo == null) { throw new IllegalArgumentException(); } Element nodeColor = doc.createElementNS(NS, "color"); for (Map.Entry colorInfoEntry : partsColorInfo .entrySet()) { Layer layer = colorInfoEntry.getKey(); ColorInfo colorInfo = colorInfoEntry.getValue(); Element nodeLayer = doc .createElementNS(NS, "layer"); nodeLayer.setAttribute("refid", layer.getId()); nodeColor.appendChild(nodeLayer); // ColorGroup ColorGroup colorGroup = colorInfo.getColorGroup(); boolean colorSync = colorInfo.isSyncColorGroup(); if (colorGroup.isEnabled()) { Element nodeColorGroup = doc.createElementNS( NS, "color-group"); nodeColorGroup.setAttribute("group", colorGroup.getId()); nodeColorGroup.setAttribute("synchronized", colorSync ? "true" : "false"); nodeLayer.appendChild(nodeColorGroup); } // RGB ColorConvertParameter param = colorInfo .getColorParameter(); Element nodeRGB = doc.createElementNS(NS, "rgb"); Object[][] rgbArgss = { {"red", param.getOffsetR(), param.getFactorR(), param.getGammaR()}, {"green", param.getOffsetG(), param.getFactorG(), param.getGammaG()}, {"blue", param.getOffsetB(), param.getFactorB(), param.getGammaB()}, {"alpha", param.getOffsetA(), param.getFactorA(), param.getGammaA()},}; for (Object[] rgbArgs : rgbArgss) { Element nodeRGBItem = doc.createElementNS(NS, rgbArgs[0].toString()); nodeRGBItem.setAttribute("offset", rgbArgs[1].toString()); nodeRGBItem.setAttribute("factor", rgbArgs[2].toString()); nodeRGBItem.setAttribute("gamma", rgbArgs[3].toString()); nodeRGB.appendChild(nodeRGBItem); } nodeLayer.appendChild(nodeRGB); // HSB Element nodeHSB = doc.createElementNS(NS, "hsb"); nodeHSB.setAttribute("hue", Float.toString(param.getHue())); nodeHSB.setAttribute("saturation", Float.toString(param.getSaturation())); nodeHSB.setAttribute("brightness", Float.toString(param.getBrightness())); if (param.getContrast() != 0.f) { // ver0.96追加、optional // ぴったり0.0fだったら省略する. nodeHSB.setAttribute("contrast", Float.toString(param.getContrast())); } nodeLayer.appendChild(nodeHSB); // RGB Replace Element nodeRGBReplace = doc.createElementNS(NS, "rgb-replace"); ColorConv colorConv = param.getColorReplace(); if (colorConv == null) { colorConv = ColorConv.NONE; } nodeRGBReplace.setAttribute("replace-type", colorConv.name()); nodeRGBReplace.setAttribute("gray", Float.toString(param.getGrayLevel())); nodeLayer.appendChild(nodeRGBReplace); } return nodeColor; } public void saveFavorites(CharacterData characterData, OutputStream outstm) throws IOException { if (characterData == null || outstm == null) { throw new IllegalArgumentException(); } Document doc; try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); doc = builder.newDocument(); } catch (ParserConfigurationException ex) { throw new RuntimeException("JAXP Configuration Exception.", ex); } Element root = doc.createElementNS(NS, "partssets"); root.setAttribute("xmlns:xml", XMLConstants.XML_NS_URI); root.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); root.setAttribute("xsi:schemaLocation", NS + " partsset.xsd"); doc.appendChild(root); // presetsのelementを構築する.(Presetは除く) writePartsSetElements(doc, root, characterData, false, true); // output xml TransformerFactory txFactory = TransformerFactory.newInstance(); txFactory.setAttribute("indent-number", Integer.valueOf(4)); Transformer tfmr; try { tfmr = txFactory.newTransformer(); } catch (TransformerConfigurationException ex) { throw new RuntimeException("JAXP Configuration Failed.", ex); } tfmr.setOutputProperty(OutputKeys.INDENT, "yes"); // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4504745 final String encoding = "UTF-8"; tfmr.setOutputProperty("encoding", encoding); try { tfmr.transform(new DOMSource(doc), new StreamResult( new OutputStreamWriter(outstm, Charset.forName(encoding)))); } catch (TransformerException ex) { IOException ex2 = new IOException("XML Convert failed."); ex2.initCause(ex); throw ex2; } } } CharacterManaJ/src/main/java/charactermanaj/model/io/AbstractCharacterDataFileWriter.java0000644000175000017500000001306113615720000031704 0ustar paulliupaulliupackage charactermanaj.model.io; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSpec; import charactermanaj.util.FileUtilities; public abstract class AbstractCharacterDataFileWriter implements CharacterDataWriter { /** * ロガー */ private static final Logger logger = Logger.getLogger(AbstractCharacterDataFileWriter.class.getName()); protected File outFile; protected File tmpFile; protected Exception occureException; protected AbstractCharacterDataFileWriter(File outFile) throws IOException { if (outFile == null) { throw new IllegalArgumentException(); } if (outFile.exists()) { if (!outFile.canWrite()) { throw new IOException("not writable: " + outFile); } } File tmpFile = new File(outFile.getPath() + ".tmp"); this.tmpFile = tmpFile; this.outFile = outFile; } @Override public void writeExportProp(Properties prop) throws IOException { if (prop == null) { throw new IllegalArgumentException(); } try { internalWriteExportProp(prop); } catch (IOException ex) { occureException = ex; throw ex; } catch (Exception ex) { occureException = ex; IOException ex2 = new IOException("write characterdata failed."); ex2.initCause(ex); throw ex2; } } protected abstract void internalWriteExportProp(Properties prop) throws IOException; @Override public void writeCharacterData(CharacterData characterData) throws IOException { if (characterData == null) { throw new IllegalArgumentException(); } try { internalWriteCharacterData(characterData); } catch (IOException ex) { occureException = ex; throw ex; } catch (Exception ex) { occureException = ex; IOException ex2 = new IOException("write characterdata failed."); ex2.initCause(ex); throw ex2; } } protected abstract void internalWriteCharacterData(CharacterData characterData) throws IOException; @Override public void writeCustomLayerPatterns(Map> map) throws IOException { try { internalWriteCustomLayerPatterns(map); } catch (IOException ex) { occureException = ex; throw ex; } catch (Exception ex) { occureException = ex; IOException ex2 = new IOException("write characterdata failed."); ex2.initCause(ex); throw ex2; } } protected abstract void internalWriteCustomLayerPatterns(Map> map) throws IOException; @Override public void writeTextUTF16LE(String name, String contents) throws IOException { if (name == null) { throw new IllegalArgumentException(); } try { internalWriteTextUTF16LE(name, contents); } catch (IOException ex) { occureException = ex; throw ex; } catch (Exception ex) { occureException = ex; IOException ex2 = new IOException("internalWriteTextUTF16 failed."); ex2.initCause(ex); throw ex2; } } protected abstract void internalWriteTextUTF16LE(String name, String contents) throws IOException; @Override public void writeSamplePicture(BufferedImage samplePicture) throws IOException { if (samplePicture == null) { throw new IllegalArgumentException(); } try { internalWriteSamplePicture(samplePicture); } catch (IOException ex) { occureException = ex; throw ex; } catch (Exception ex) { occureException = ex; IOException ex2 = new IOException("write sample picture failed."); ex2.initCause(ex); throw ex2; } } protected abstract void internalWriteSamplePicture(BufferedImage samplePicture) throws IOException; @Override public void writePartsImages(Map partsImages) throws IOException { if (partsImages == null) { throw new IllegalArgumentException(); } try { internalWritePartsImages(partsImages); } catch (IOException ex) { occureException = ex; throw ex; } catch (Exception ex) { occureException = ex; IOException ex2 = new IOException("write parts images failed."); ex2.initCause(ex); throw ex2; } } protected abstract void internalWritePartsImages(Map partsImages) throws IOException; @Override public void writePartsManageData(Map partsImages) throws IOException { if (partsImages == null) { throw new IllegalArgumentException(); } try { internalWritePartsManageData(partsImages); } catch (IOException ex) { occureException = ex; throw ex; } catch (Exception ex) { occureException = ex; IOException ex2 = new IOException("write parts images failed."); ex2.initCause(ex); throw ex2; } } protected abstract void internalWritePartsManageData(Map partsImages) throws IOException; @Override public void close() throws IOException { try { internalClose(); if (outFile.exists()) { FileUtilities.delete(outFile); } } catch (Exception ex) { if (occureException == null) { occureException = ex; } } if (occureException != null) { if (!tmpFile.delete()) { logger.log(Level.WARNING, "temporary file can't delete. " + tmpFile); } return; } if (!tmpFile.renameTo(outFile)) { throw new IOException("rename failed. " + tmpFile); } } protected abstract void internalClose() throws IOException; } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsInfoXMLWriter.java0000644000175000017500000002124413615720000027222 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.URI; import java.nio.charset.Charset; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import charactermanaj.model.PartsAuthorInfo; import charactermanaj.model.PartsManageData; import charactermanaj.model.PartsManageData.PartsKey; public class PartsInfoXMLWriter { /** * パーツ定義XMLファイルの名前空間 */ public static final String NS_PARTSDEF = "http://charactermanaj.sourceforge.jp/schema/charactermanaj-partsdef"; /** * パーツ管理情報をDocBaseと同じフォルダ上のparts-info.xmlに書き出す.
* XML生成中に失敗した場合は既存の管理情報は残される.
* (管理情報の書き込み中にI/O例外が発生した場合は管理情報は破壊される.)
* * @param docBase * character.xmlの位置 * @param partsManageData * パーツ管理情報 * @throws IOException * 出力に失敗した場合 */ public void savePartsManageData(URI docBase, PartsManageData partsManageData) throws IOException { if (docBase == null || partsManageData == null) { throw new IllegalArgumentException(); } if (!"file".equals(docBase.getScheme())) { throw new IOException("ファイル以外はサポートしていません: " + docBase); } File docBaseFile = new File(docBase); File baseDir = docBaseFile.getParentFile(); // データからXMLを構築してストリームに出力する. // 完全に成功したXMLのみ書き込むようにするため、一旦バッファする。 ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { savePartsManageData(partsManageData, bos); } finally { bos.close(); } // バッファされたXMLデータを実際のファイルに書き込む File partsInfoXML = new File(baseDir, "parts-info.xml"); FileOutputStream os = new FileOutputStream(partsInfoXML); try { os.write(bos.toByteArray()); } finally { os.close(); } } /** * パーツ管理情報をXMLとしてストリームに書き出す.
* * @param partsManageData * パーツ管理データ * @param outstm * 出力先ストリーム * @throws IOException * 出力に失敗した場合 */ public void savePartsManageData(PartsManageData partsManageData, OutputStream outstm) throws IOException { if (partsManageData == null || outstm == null) { throw new IllegalArgumentException(); } Document doc; try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); doc = builder.newDocument(); } catch (ParserConfigurationException ex) { throw new RuntimeException("JAXP Configuration Exception.", ex); } Locale locale = Locale.getDefault(); String lang = locale.getLanguage(); Element root = doc.createElementNS(NS_PARTSDEF, "parts-definition"); root.setAttribute("xmlns:xml", XMLConstants.XML_NS_URI); root.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); root.setAttribute("xsi:schemaLocation", NS_PARTSDEF + " parts-definition.xsd"); doc.appendChild(root); // 作者情報を取得する Collection partsAuthors = partsManageData .getAuthorInfos(); for (PartsAuthorInfo partsAuthorInfo : partsAuthors) { String author = partsAuthorInfo.getAuthor(); if (author == null || author.length() == 0) { continue; } // 作者情報の登録 Element nodeAuthor = doc.createElementNS(NS_PARTSDEF, "author"); Element nodeAuthorName = doc.createElementNS(NS_PARTSDEF, "name"); Attr attrLang = doc.createAttributeNS(XMLConstants.XML_NS_URI, "lang"); attrLang.setValue(lang); nodeAuthorName.setAttributeNodeNS(attrLang); nodeAuthorName.setTextContent(author); nodeAuthor.appendChild(nodeAuthorName); String homepageURL = partsAuthorInfo.getHomePage(); if (homepageURL != null && homepageURL.length() > 0) { Element nodeHomepage = doc.createElementNS(NS_PARTSDEF, "home-page"); Attr attrHomepageLang = doc.createAttributeNS( XMLConstants.XML_NS_URI, "lang"); attrHomepageLang.setValue(lang); nodeHomepage.setAttributeNodeNS(attrHomepageLang); nodeHomepage.setTextContent(homepageURL); nodeAuthor.appendChild(nodeHomepage); } root.appendChild(nodeAuthor); Collection partsKeys = partsManageData .getPartsKeysByAuthor(author); // ダウンロード別にパーツキーの集約 HashMap> downloadMap = new HashMap>(); for (PartsKey partsKey : partsKeys) { PartsManageData.PartsVersionInfo versionInfo = partsManageData .getVersionStrict(partsKey); String downloadURL = versionInfo.getDownloadURL(); if (downloadURL == null) { downloadURL = ""; } List partsKeyGrp = downloadMap.get(downloadURL); if (partsKeyGrp == null) { partsKeyGrp = new ArrayList(); downloadMap.put(downloadURL, partsKeyGrp); } partsKeyGrp.add(partsKey); } // ダウンロード別にパーツ情報の登録 ArrayList downloadURLs = new ArrayList( downloadMap.keySet()); Collections.sort(downloadURLs); // 日時コンバータ final SimpleDateFormat dateTimeFmt = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); for (String downloadURL : downloadURLs) { List partsKeyGrp = downloadMap.get(downloadURL); Collections.sort(partsKeyGrp); Element nodeDownload = doc.createElementNS(NS_PARTSDEF, "download-url"); nodeDownload.setTextContent(downloadURL); root.appendChild(nodeDownload); for (PartsKey partsKey : partsKeyGrp) { PartsManageData.PartsVersionInfo versionInfo = partsManageData .getVersionStrict(partsKey); Element nodeParts = doc.createElementNS(NS_PARTSDEF, "parts"); nodeParts.setAttribute("name", partsKey.getPartsName()); if (partsKey.getCategoryId() != null) { nodeParts.setAttribute("category", partsKey.getCategoryId()); } if (versionInfo.getVersion() > 0) { nodeParts.setAttribute("version", Double.toString(versionInfo.getVersion())); } if (versionInfo.getLastModified() != null) { nodeParts.setAttribute("lastModified", dateTimeFmt .format(versionInfo.getLastModified())); } String localizedName = partsManageData .getLocalizedName(partsKey); if (localizedName != null && localizedName.trim().length() > 0) { Element nodeLocalizedName = doc.createElementNS( NS_PARTSDEF, "local-name"); Attr attrLocalizedNameLang = doc.createAttributeNS( XMLConstants.XML_NS_URI, "lang"); attrLocalizedNameLang.setValue(lang); nodeLocalizedName .setAttributeNodeNS(attrLocalizedNameLang); nodeLocalizedName.setTextContent(localizedName); nodeParts.appendChild(nodeLocalizedName); } root.appendChild(nodeParts); } } } // output xml TransformerFactory txFactory = TransformerFactory.newInstance(); txFactory.setAttribute("indent-number", Integer.valueOf(4)); Transformer tfmr; try { tfmr = txFactory.newTransformer(); } catch (TransformerConfigurationException ex) { throw new RuntimeException("JAXP Configuration Failed.", ex); } tfmr.setOutputProperty(OutputKeys.INDENT, "yes"); // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4504745 final String encoding = "UTF-8"; tfmr.setOutputProperty("encoding", encoding); try { tfmr.transform(new DOMSource(doc), new StreamResult( new OutputStreamWriter(outstm, Charset.forName(encoding)))); } catch (TransformerException ex) { IOException ex2 = new IOException("XML Convert failed."); ex2.initCause(ex); throw ex2; } } } CharacterManaJ/src/main/java/charactermanaj/model/io/CustomLayerOrderXMLWriter.java0000644000175000017500000001166313615720000030564 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.charset.Charset; import java.util.Collections; import java.util.List; import java.util.Map; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; public class CustomLayerOrderXMLWriter { /** * WorkingSetのバージョン */ public static final String VERSION_SIG_1_0 = "1.0"; /** * WorkingSetのXMLファイルの名前空間 */ public static final String NS = "http://charactermanaj.osdn.jp/schema/customlayerorder.xsd"; public void write(Map> map, OutputStream outstm) throws IOException { Document doc = createDocument(map); // output xml TransformerFactory txFactory = TransformerFactory.newInstance(); txFactory.setAttribute("indent-number", Integer.valueOf(4)); Transformer tfmr; try { tfmr = txFactory.newTransformer(); } catch (TransformerConfigurationException ex) { throw new RuntimeException("JAXP Configuration Failed.", ex); } tfmr.setOutputProperty(OutputKeys.INDENT, "yes"); // JDK-4504745 : javax.xml.transform.Transformer encoding does not work properly // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4504745 final String encoding = "UTF-8"; tfmr.setOutputProperty("encoding", encoding); try { tfmr.transform(new DOMSource(doc), new StreamResult( new OutputStreamWriter(outstm, Charset.forName(encoding)))); } catch (TransformerException ex) { IOException ex2 = new IOException("XML Convert failed."); ex2.initCause(ex); throw ex2; } } public Document createDocument(Map> map) { if (map == null) { map = Collections.emptyMap(); } Document doc; try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); doc = builder.newDocument(); } catch (ParserConfigurationException ex) { throw new RuntimeException("JAXP Configuration failed.", ex); } // ルートの登録 Element root = doc.createElementNS(NS, "custom-layer-orders"); root.setAttribute("version", VERSION_SIG_1_0); root.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns:xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); root.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns:xml", XMLConstants.XML_NS_URI); root.setAttribute("xsi:schemaLocation", NS + " customlayerorder.xsd"); for (Map.Entry> entry : map.entrySet()) { CustomLayerOrderKey orderKey = entry.getKey(); String id = orderKey.getId(); String displayName = orderKey.getDisplayName(); Map localizedNames = orderKey.getLocalizedNames(); String defaultName = localizedNames.get(CustomLayerOrderKey.DEFAULT_NAME_KEY); if (defaultName == null) { defaultName = displayName; } List orders = entry.getValue(); // パターンの登録 Element elmPattern = doc.createElementNS(NS, "pattern"); elmPattern.setAttribute("id", id); elmPattern.setAttribute("name", defaultName); root.appendChild(elmPattern); // ローカライズされた名前 for (Map.Entry localizedEntry : localizedNames.entrySet()) { String localizedLang = localizedEntry.getKey(); String localizedName = localizedEntry.getValue(); if (!CustomLayerOrderKey.DEFAULT_NAME_KEY.equals(localizedLang)) { Element elmLocalizedName = doc.createElementNS(NS, "localized-name"); elmLocalizedName.setAttribute("lang", localizedLang); elmLocalizedName.setAttribute("name", localizedName); elmPattern.appendChild(elmLocalizedName); } } // レイヤーマッピング for (CustomLayerOrder order : orders) { Element elmMapping = doc.createElementNS(NS, "mapping"); elmPattern.appendChild(elmMapping); PartsCategory category = order.getCategory(); Layer layer = order.getLayer(); float layerOrder = order.getLayerOrder(); elmMapping.setAttribute("category", category.getCategoryId()); elmMapping.setAttribute("layer", layer.getId()); elmMapping.setAttribute("order", Float.toString(layerOrder)); } } doc.appendChild(root); return doc; } } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsSpecDecorateLoader.java0000644000175000017500000000533513615720000030244 0ustar paulliupaulliupackage charactermanaj.model.io; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import charactermanaj.model.AppConfig; import charactermanaj.model.ColorGroup; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSpec; /** * パーツ名の末尾が、カラーグループの表記を括弧でくくったものと同じであれば、 * そのパーツ固有のカラーグループとして設定するためのデコレータ.
* このクラス自身はパーツのロードは行わず、コンストラクタで指定したローダーによりロードを行い、 * その結果に対してカラーグループの設定を行う.
* * @author seraphy * */ public class PartsSpecDecorateLoader implements PartsDataLoader { private PartsDataLoader parent; private Collection colorGroups; /** * パーツローダとカラーグループを指定して構築する. * @param parent 元パーツローダー * @param colorGroups カラーグループのコレクション、nullの場合は空とみなす. */ public PartsSpecDecorateLoader(PartsDataLoader parent, Collection colorGroups) { if (parent == null) { throw new IllegalArgumentException(); } if (colorGroups == null) { colorGroups = Collections.emptyList(); } this.parent = parent; this.colorGroups = colorGroups; } public Map load(PartsCategory category) { Map partsSpecs = parent.load(category); decolatePartsSpec(partsSpecs); return partsSpecs; } /** * パーツ識別子の表示名に、カラーグループの表示名により判定されるパターンに合致する場合、 * パーツ設定のカラーグループを、そのカラーグループとして設定する. * @param partsSpecs パーツマップ */ protected void decolatePartsSpec(Map partsSpecs) { String templ = AppConfig.getInstance().getPartsColorGroupPattern(); if (templ == null || templ.trim().length() == 0) { // パターンが設定されていない場合は無視する. return; } // パーツ名にカラーグループが含まれる場合、それを登録する. for (ColorGroup colorGroup : colorGroups) { String pattern = templ.replace("@", colorGroup.getLocalizedName()); Pattern pat = Pattern.compile(pattern); for (PartsSpec partsSpec : partsSpecs.values()) { Matcher mat = pat.matcher(partsSpec.getPartsIdentifier() .getLocalizedPartsName()); if (mat.matches()) { partsSpec.setColorGroup(colorGroup); } } } } } CharacterManaJ/src/main/java/charactermanaj/model/io/AbstractCharacterDataArchiveFile.java0000644000175000017500000007162313615720000032021 0ustar paulliupaulliupackage charactermanaj.model.io; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import charactermanaj.graphics.io.PNGFileImageHeader; import charactermanaj.graphics.io.PNGFileImageHeaderReader; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsManageData; import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion; public abstract class AbstractCharacterDataArchiveFile implements CharacterDataArchiveFile { private static final Logger logger = Logger .getLogger(AbstractCharacterDataArchiveFile.class.getName()); protected File archiveFile; protected String rootPrefix = ""; public interface FileContent { String getEntryName(); long lastModified(); long length(); InputStream openStream() throws IOException; } @Override public String toString() { return "CharacterDataArchiveFile(file=" + archiveFile + ")"; } public static final class CategoryLayerPair { private PartsCategory partsCategory; private Layer layer; public CategoryLayerPair(PartsCategory partsCategory, Layer layer) { if (partsCategory == null || layer == null) { throw new IllegalArgumentException(); } this.partsCategory = partsCategory; this.layer = layer; } @Override public int hashCode() { return partsCategory.hashCode() ^ layer.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof CategoryLayerPair) { CategoryLayerPair o = (CategoryLayerPair) obj; return partsCategory.equals(o.partsCategory) && layer.equals(o.layer); } return false; } public Layer getLayer() { return layer; } public PartsCategory getPartsCategory() { return partsCategory; } @Override public String toString() { return "(" + partsCategory + ":" + layer + ")"; } } public static final class PartsImageContent implements FileContent { private final FileContent fileContent; private final Collection categoryLayerPairs; private final String dirName; private final String partsName; private final String fileName; private final PNGFileImageHeader pngFileImageHeader; /** * パーツイメージを示す.
* * @param fileContent * ファイルコンテンツ * @param categoryLayerPairs * カテゴリとレイヤーのペア * @param partsName * ファイル名(ファイル名のみ。拡張子を含まない。パーツ名の元として用いることを想定。) * @param pngFileImageHeader * PNGファイルヘッダ */ protected PartsImageContent(FileContent fileContent, Collection categoryLayerPairs, String fileName, String partsName, PNGFileImageHeader pngFileImageHeader) { if (fileContent == null || categoryLayerPairs == null || categoryLayerPairs.isEmpty() || fileName == null || partsName == null || pngFileImageHeader == null) { throw new IllegalArgumentException(); } this.fileContent = fileContent; this.categoryLayerPairs = Collections .unmodifiableCollection(categoryLayerPairs); this.fileName = fileName; this.partsName = partsName; this.pngFileImageHeader = pngFileImageHeader; CategoryLayerPair categoryLayerPair = categoryLayerPairs.iterator() .next(); dirName = categoryLayerPair.getLayer().getDir(); } @Override public int hashCode() { return getEntryName().hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof PartsImageContent) { return getEntryName().equals( ((PartsImageContent) obj).getEntryName()); } return false; } public Collection getCategoryLayerPairs() { return categoryLayerPairs; } public String getDirName() { return dirName; } @Override public String getEntryName() { return fileContent.getEntryName(); } public String getFileName() { return fileName; } public String getPartsName() { return partsName; } public PNGFileImageHeader getPngFileImageHeader() { return pngFileImageHeader; } @Override public long lastModified() { return fileContent.lastModified(); } @Override public long length() { return fileContent.length(); } @Override public InputStream openStream() throws IOException { return fileContent.openStream(); } @Override public String toString() { return fileContent.getEntryName(); } } protected HashMap entries = new HashMap(); protected AbstractCharacterDataArchiveFile(File archiveFile) { if (archiveFile == null) { throw new IllegalArgumentException(); } this.archiveFile = archiveFile; } public File getArchiveFile() { return this.archiveFile; } protected void addEntry(FileContent fileContent) { if (fileContent == null) { throw new IllegalArgumentException(); } if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, fileContent.getEntryName()); } entries.put(fileContent.getEntryName(), fileContent); } /** * アーカイブファイルをベースとしたURIを返す.
* * @param name * コンテンツ名 * @return URI * @throws IOException * URIを生成できない場合 */ protected URI getContentURI(String name) throws IOException { try { URI baseURI = archiveFile.toURI(); return new URI("jar:" + baseURI.toString() + "/!" + name); } catch (URISyntaxException ex) { IOException iex = new IOException(ex.getMessage()); iex.initCause(ex); throw iex; } } /** * 指定したコンテンツが存在するか? * * @param name * コンテンツ名 * @return 存在すればtrue、存在しなければfalse */ @Override public boolean hasContent(String name) { return entries.containsKey(name); } /** * 指定したコンテンツを取得する.
* 存在しない場合はnullを返す.
* * @param name * コンテンツ名 * @return 存在すればコンテンツ、存在しなければnull */ public FileContent getContent(String name) { return entries.get(name); } @Override public String getRootPrefix() { return this.rootPrefix; } /** * アーカイブのルート上に単一のフォルダしかない場合、そのフォルダを真のルートとして設定する.
* 返されるルート名には末尾に「/」を含む.
* ルート上に複数のフォルダがあるかファイルが存在する場合は空文字を設定する.
*/ protected void searchRootPrefix() { HashSet dirs = new HashSet(); for (String name : entries.keySet()) { int pos = name.indexOf('/'); if (pos < 0) { // ルート上にファイルがあるので、ここがルート rootPrefix = ""; return; } if (pos >= 0) { String dir = name.substring(0, pos + 1); dirs.add(dir); } } if (dirs.size() == 1) { // ルート上に単一のフォルダしかないので、 // このフォルダが真のルート rootPrefix = dirs.iterator().next(); return; } // ルート上に複数のフォルダがあるので、ここがルート rootPrefix = ""; } /** * 指定したディレクトリ(フルパス指定)のファイルのみを取り出す.
* サブフォルダは含まない.
* ディレクトリに空文字またはnullまたは「/」を指定した場合はルートを意味する.
* * @param dir * ディレクトリ * @return ファイルへのフルパスのコレクション */ public Map getFiles(String dir) { if (dir == null) { dir = ""; } if (dir.length() > 0 && !dir.endsWith("/")) { dir += "/"; } if (dir.equals("/")) { dir = ""; // アーカイブ内コンテンツのパスは先頭は「/」ではないため。 } HashMap files = new HashMap(); int ep = dir.length(); for (Map.Entry entry : entries.entrySet()) { String name = entry.getKey(); FileContent fileContent = entry.getValue(); if (name.startsWith(dir)) { String suffix = name.substring(ep); int sep = suffix.indexOf('/'); if (sep < 0) { files.put(name, fileContent); } } } return files; } /** * キャラクター定義を読み込む.
* アーカイブに存在しないか、妥当性がない場合はnullを返す.
* * @return キャラクター定義、もしくはnull */ @Override public CharacterData readCharacterData() { FileContent characterFile = entries.get(rootPrefix + CharacterDataPersistent.CONFIG_FILE); if (characterFile == null) { return null; } CharacterDataXMLReader xmlReader = new CharacterDataXMLReader(); try { // character.xmlを読み込む CharacterData cd; InputStream is = characterFile.openStream(); try { URI docBase = getContentURI(rootPrefix + CharacterDataPersistent.CONFIG_FILE); cd = xmlReader.loadCharacterDataFromXML(is, docBase); } finally { is.close(); } return cd; } catch (Exception ex) { logger.log(Level.INFO, "character.xml load failed.", ex); return null; } } /** * キャラクター定義をINIファイルより読み取る.
* アーカイブのコンテンツルート上のcharacter.iniを探す.
* それがなければ、アーカイブ上のどこかにある/character.iniを探して、もっとも短い場所にある1つを採用する.
* character.iniが何処にも存在しないか、読み取り時にエラーとなった場合はnullを返す.
* 「キャラクターなんとか機 v2.2」の設定ファイルを想定している.
* ただし、character.iniの下にeye_colorフォルダがある場合は「ver3」とみなす。
* (設定ファイルの形式はv2, v3の間で変わらず) * * @return キャラクター定義、もしくはnull */ @Override public CharacterData readCharacterINI() { FileContent characterFile = null; characterFile = entries.get(rootPrefix + CharacterDataPersistent.COMPATIBLE_CONFIG_NAME); // どこかにあるcharacter.iniを探す // および、eye_colorフォルダがあるか?(あればver3形式とみなす。) boolean hasEyeColorFolder = false; ArrayList characterInis = new ArrayList(); for (Map.Entry entry : entries.entrySet()) { String entryName = entry.getKey(); if (entryName.endsWith("/" + CharacterDataPersistent.COMPATIBLE_CONFIG_NAME)) { characterInis.add(entryName); } if (entryName.contains("/eye_color/") || entryName.endsWith("/eye_color")) { hasEyeColorFolder = true; } } if (characterFile == null) { // もっとも短い名前のものを採用 Collections.sort(characterInis); if (characterInis.size() > 0) { characterFile = entries.get(characterInis.get(0)); } } if (characterFile == null) { // character.iniがないので何もしない. return null; } DefaultCharacterDataVersion version; if (hasEyeColorFolder) { // "eye_color"フォルダがあればver3形式とみなす version = DefaultCharacterDataVersion.V3; } else { version = DefaultCharacterDataVersion.V2; } try { // デフォルトのキャラクター定義を構築する. CharacterData cd; InputStream is = characterFile.openStream(); try { CharacterDataIniReader iniReader = new CharacterDataIniReader(); cd = iniReader.readCharacterDataFromIni(is, version); } finally { is.close(); } // docBaseを設定する. URI docBase = getContentURI(rootPrefix + CharacterDataPersistent.COMPATIBLE_CONFIG_NAME); cd.setDocBase(docBase); return cd; } catch (Exception ex) { logger.log(Level.INFO, "character.ini load failed", ex); return null; } } @Override public Map> readCustomLayerPatterns(CharacterData cd) throws IOException { FileContent mapFile = entries.get(rootPrefix + CustomLayerOrderXMLPersist.CUSTOM_LAYER_ORDERS_XML_FILE); if (mapFile == null) { // ファイルがない return null; } if (mapFile.length() == 0) { // 空ファイルは空マップを返す return Collections.emptyMap(); } CustomLayerOrderXMLReader xmlReader = new CustomLayerOrderXMLReader(cd); try { // character.xmlを読み込む return xmlReader.read(mapFile.openStream()); } catch (Exception ex) { logger.log(Level.INFO, CustomLayerOrderXMLPersist.CUSTOM_LAYER_ORDERS_XML_FILE + " load failed.", ex); return null; } } /** * お気に入りを読み込みキャラクター定義に追加する.
* アーカイブにお気に入り(favorites.xml)が存在しなければ何もしない.
* 読み取り中に失敗した場合は、その時点で読み込みを止めて戻る.
* * @param characterData * キャラクター定義(お気に入りが追加される) */ @Override public void readFavorites(CharacterData characterData) { if (characterData == null) { throw new IllegalArgumentException("characterDataにnullは指定できません。"); } FileContent favoritesXml = entries.get(rootPrefix + "favorites.xml"); if (favoritesXml == null) { // favorites.xmlがなければ何もしない return; } CharacterDataXMLReader xmlReader = new CharacterDataXMLReader(); try { // favorites.xmlを読み込む InputStream is = favoritesXml.openStream(); try { xmlReader.loadPartsSet(characterData, is); } catch (Exception ex) { logger.log(Level.INFO, "favorites.xml load failed.", ex); } finally { is.close(); } } catch (Exception ex) { logger.log(Level.INFO, "favorites.xml load failed", ex); } } /** * サンプルピクチャを読み込む.
* アーカイブに存在しないか、画像として読み取れなかった場合はnull * * @return サンプルピクチャ、もしくはnull */ @Override public BufferedImage readSamplePicture() { FileContent samplePictureFile = entries.get(rootPrefix + "preview.png"); if (samplePictureFile == null) { Map files = getFiles(rootPrefix); samplePictureFile = files.get("preview.jpg"); if (samplePictureFile == null) { samplePictureFile = files.get("preview.jpeg"); } if (samplePictureFile == null) { for (Map.Entry entry : files.entrySet()) { String name = entry.getKey(); if (name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".png")) { samplePictureFile = entry.getValue(); break; } } } } if (samplePictureFile == null) { return null; } try { BufferedImage pic; InputStream is = samplePictureFile.openStream(); try { pic = ImageIO.read(is); } finally { is.close(); } return pic; } catch (Exception ex) { logger.log(Level.INFO, "sample picture load failed.", ex); return null; } } /** * アーカイブにある「readme.txt」、もしくは「readme」というファイルをテキストファイルとして読み込む.
* readme.txtが優先される。ともに存在しない場合はnull.
* 改行コードはプラットフォーム固有の改行コードに変換して返される.
* 読み取れなかった場合はnull.
* * @return テキスト、もしくはnull */ @Override public String readReadMe() { Locale locale = Locale.getDefault(); String lang = locale.getLanguage(); ArrayList candiates = new ArrayList(); Map files = getFiles(rootPrefix); for (String findName : new String[]{"readme_" + lang + ".txt", "readme_" + lang, "readme.txt", "readme", null}) { for (Map.Entry entry : files.entrySet()) { String name = entry.getKey().toLowerCase(); if (findName == null && name.endsWith(".txt")) { candiates.add(entry.getValue()); break; } if (name.equals(findName)) { candiates.add(entry.getValue()); } } } if (candiates.isEmpty()) { return null; } // みつかったファイルについて読み込みを優先順で試行する. for (FileContent file : candiates) { try { return readTextUTF16(file); } catch (Exception ex) { logger.log(Level.WARNING, "read file failed. :" + file, ex); // 無視して次の候補を試行する. } } // すべて失敗したか、そもそもファイルがみつからなかった。 return null; } /** * ファイルをテキストとして読み取り、返す.
* UTF-16LE/BE/UTF-8についてはBOMにより判定する.
* BOMがない場合はUTF-16/8ともに判定できない.
* BOMがなければMS932もしくはEUC_JPであると仮定して読み込む.
* 改行コードはプラットフォーム固有の改行コードに変換して返される.
* * @param name * コンテンツ名 * @return テキスト、コンテンツが存在しない場合はnull * @throws IOException * 読み込みに失敗した場合 */ @Override public String readTextFile(String name) throws IOException { if (name == null) { throw new IllegalArgumentException(); } FileContent content = entries.get(name); if (content == null) { return null; } return readTextUTF16(content); } /** * ファイルをテキストとして読み取り、返す.
* UTF-16LE/BE/UTF-8についてはBOMにより判定する.
* BOMがない場合はUTF-16/8ともに判定できない.
* BOMがなければMS932もしくはEUC_JPであると仮定して読み込む.
* * @param content * コンテンツ * @return テキスト * @throws IOException * 読み込みに失敗した場合 */ public String readTextUTF16(FileContent content) throws IOException { if (content == null) { throw new IllegalArgumentException(); } return TextReadHelper.readTextTryEncoding(content.openStream()); } /** * キャラクター定義のカテゴリと、そのレイヤー情報から、画像のディレクトリの一覧をアーカイブ上のディレクトリの一覧として返す.
* ディレクトリの末尾は常にスラ付きとなる.
* enabledRootPefixがtrueの場合、ディレクトリの先頭はアーカイブのコンテンツルートとなる.
* 同一のディレクトリに対して複数のレイヤー(複数カテゴリを含む)が参照している場合、それらを含めて返す.
* 参照されているディレクトリがない場合は返される結果には含まれない.
* * @param characterData * キャラクター定義 * @param enabledRootPrefix * ルートプレフィックス(アーカイブのコンテンツルート)を付与する場合 * @return * パーツで使用する画像のディレクトリとして認識されるディレクトリの一覧、キーはアーカイブのディレクトリ位置、値は参照する1つ以上のレイヤー */ protected Map> getLayerDirs( CharacterData characterData, boolean enabledRootPrefix) { if (characterData == null) { return Collections.emptyMap(); } // イメージディレクトリの一覧 String rootPrefix = getRootPrefix(); HashMap> layerDirs = new HashMap>(); for (PartsCategory partsCategory : characterData.getPartsCategories()) { for (Layer layer : partsCategory.getLayers()) { String dir = layer.getDir(); if (!dir.endsWith("/")) { dir += "/"; // スラ付きにする. } if (enabledRootPrefix) { // アーカイブのルートコンテキストからのディレクトリ位置とする. dir = rootPrefix + dir; } Collection sameDirLayers = layerDirs .get(dir); if (sameDirLayers == null) { sameDirLayers = new ArrayList(); layerDirs.put(dir, sameDirLayers); } sameDirLayers.add(new CategoryLayerPair(partsCategory, layer)); } } return layerDirs; } /** * アーカイブに含まれるフォルダをもつpngファイルからパーツイメージを取得する.
* * @param インポート先のキャラクターデータ * 、フォルダ名などを判別するため。nullの場合はディレクトリなしとみなす.
* @param newly * 新規インポート用であるか?(新規でない場合は引数で指定したキャラクターセットと同じパーツは読み込まれない). * (アーカイブファイルからの読み込みでは無視される) * @return パーツイメージコンテンツのコレクション、なければ空 */ @Override public Collection getPartsImageContents( CharacterData characterData, boolean newly) { // コンテンツルートからの絶対位置指定でパーツイメージを取得する. Collection results = getPartsImageContentsStrict(characterData); if (results.isEmpty()) { // コンテンツルートからの絶対位置にパーツがない場合は、任意のディレクトリ位置からパーツイメージを推定する. results = getPartsImageContentsLazy(characterData); } return results; } /** * コンテンツルートからの絶対位置のフォルダからpngファイルからパーツイメージを取得する.
* * @param インポート先のキャラクターデータ * 、フォルダ名などを判別するため。nullの場合はディレクトリなしとみなす.
* @return パーツイメージコンテンツのコレクション、なければ空 */ protected Collection getPartsImageContentsStrict( CharacterData characterData) { final Map> layerDirMap = getLayerDirs( characterData, true); CategoryLayerPairResolveStrategy strategy = new CategoryLayerPairResolveStrategy() { @Override public Collection resolveCategoryLayerPairs( String dir) { Collection categoryLayerPairs = layerDirMap .get(dir); if (categoryLayerPairs == null || categoryLayerPairs.isEmpty()) { // ディレクトリ名に一致するものがないので、この画像は無視する return null; } return categoryLayerPairs; } }; return getPartsImageContents(strategy); } /** * アーカイブに含まれる任意のフォルダからpngファイルからパーツイメージを取得する.
* ディレクトリ名の大文字・小文字は区別されません.
* * @param インポート先のキャラクターデータ * 、フォルダ名などを判別するため。nullの場合はディレクトリなしとみなす.
* @return パーツイメージコンテンツのコレクション、なければ空 */ protected Collection getPartsImageContentsLazy( CharacterData characterData) { final Map> layerDirMap = getLayerDirs( characterData, false); CategoryLayerPairResolveStrategy strategy = new CategoryLayerPairResolveStrategy() { @Override public Collection resolveCategoryLayerPairs( String dir) { dir = (dir == null) ? "" : dir.toLowerCase(); for (Map.Entry> entry : layerDirMap .entrySet()) { String dirSuffix = entry.getKey().toLowerCase(); Collection categoryLayerPairs = entry .getValue(); if (dir.endsWith(dirSuffix)) { return categoryLayerPairs; } } return null; } }; return getPartsImageContents(strategy); } /** * ディレクトリ名からカテゴリとレイヤーを取得するためのインターフェイス.
* * @author seraphy */ protected interface CategoryLayerPairResolveStrategy { /** * ディレクトリを指定して、それに該当するカテゴリとレイヤーペアのコレクションを返します.
* 同一のディレクトリに対して複数のレイヤーが割り当てられている可能性があるためコレクションで返されます.
* 空のコレクションにはなりません.
* レイヤーとして認識されていないディレクトリの場合はnullを返します.
* * @param dir * ディレクトリ * @return カテゴリ・レイヤーのペアのコレクション、またはnull (空のコレクションにはならない。) */ Collection resolveCategoryLayerPairs(String dir); } /** * アーカイブに含まれるフォルダをもつpngファイルからパーツイメージを取得する。 * * @param strategy * ディレクトリが売れ入れ可能であるか判断するストラテジー * @return パーツイメージコンテンツのコレクション、なければ空 */ protected Collection getPartsImageContents( CategoryLayerPairResolveStrategy strategy) { if (strategy == null) { throw new IllegalArgumentException(); } ArrayList results = new ArrayList(); for (Map.Entry entry : entries.entrySet()) { String name = entry.getKey(); FileContent fileContent = entry.getValue(); String[] split = name.split("/"); if (split.length < 2) { // 最低でもフォルダ下になければならない continue; } String lastName = split[split.length - 1]; if (!lastName.toLowerCase().endsWith(".png")) { // png拡張子でなければならない continue; } // ディレクトリ名 String dir = name.substring(0, name.length() - lastName.length()); // ディレクトリ名から対応するレイヤーを取得します. Collection categoryLayerPairs = strategy .resolveCategoryLayerPairs(dir); if (categoryLayerPairs == null) { // パーツイメージのディレクトリとして定義されていない場合は、この画像は無視される. continue; } // PNGファイルヘッダの取得と確認 PNGFileImageHeader pngFileHeader = readPNGFileHeader(fileContent); if (pngFileHeader == null) { // PNGファイルとして不正なものは無視する. logger.log(Level.WARNING, "invalid png: " + name); continue; } // パーツ名(拡張子を除いたもの) String partsName; int extpos = lastName.lastIndexOf('.'); partsName = lastName.substring(0, extpos); PartsImageContent partsImageContent = new PartsImageContent( fileContent, categoryLayerPairs, lastName, partsName, pngFileHeader); results.add(partsImageContent); } return results; } /** * PNGファイルとしてファイルを読み込みPNGヘッダ情報を返します.
* PNGでないか、ファイルの読み込みに失敗した場合はnullを返します.
* * @param fileContent * 画像ファイル * @return PNGヘッダ情報、またはnull */ protected PNGFileImageHeader readPNGFileHeader(FileContent fileContent) { PNGFileImageHeaderReader pngHeaderReader = PNGFileImageHeaderReader .getInstance(); PNGFileImageHeader pngFileHeader = null; try { InputStream is = fileContent.openStream(); try { pngFileHeader = pngHeaderReader.readHeader(is); } finally { is.close(); } } catch (IOException ex) { logger.log(Level.WARNING, "not png header. " + fileContent, ex); pngFileHeader = null; // 無視する. } return pngFileHeader; } /** * アーカイブに含まれるparts-info.xmlを読み込み返す.
* 存在しなければ空のインスタンスを返す.
* * @return パーツ管理データ * @throws IOException */ @Override public PartsManageData getPartsManageData() throws IOException { FileContent content = entries.get(rootPrefix + "parts-info.xml"); if (content == null) { return new PartsManageData(); } PartsManageData partsManageData; InputStream is = content.openStream(); try { PartsInfoXMLReader xmlWriter = new PartsInfoXMLReader(); partsManageData = xmlWriter.loadPartsManageData(is); } finally { is.close(); } return partsManageData; } } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataIniReader.java0000644000175000017500000001251113615720000030005 0ustar paulliupaulliupackage charactermanaj.model.io; import java.awt.Dimension; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.model.CharacterData; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion; /** * character.iniファイルを読み込むためのクラス. * * @author seraphy */ public class CharacterDataIniReader { /** * ロガー */ private static final Logger logger = Logger .getLogger(CharacterDataIniReader.class.getName()); /** * character.iniファイルから、キャラクター定義を生成します.
* docBaseは設定されていないため、戻り値に設定する必要があります.
* * @param is * character.iniの入力ストリーム * @param version * デフォルトキャラクターセットのバージョン * @return キャラクターデータ * @throws IOException * 読み取りに失敗した場合 */ public CharacterData readCharacterDataFromIni(InputStream is, DefaultCharacterDataVersion version) throws IOException { if (is == null || version == null) { throw new IllegalArgumentException(); } CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider(); CharacterData cd = defProv.createDefaultCharacterData(version); // イメージサイズ int siz_x = 0; int siz_y = 0; // パーツセット HashMap plainPartsSet = new HashMap(); try { BufferedReader rd; try { rd = new BufferedReader(new InputStreamReader(is, "MS932")); // SJISで読み取る. } catch (UnsupportedEncodingException ex) { logger.log(Level.SEVERE, "SJIS encoded file cannot be read.", ex); rd = new BufferedReader(new InputStreamReader(is)); // システムデフォルトで読み込む } try { String line; int sectionMode = 0; while ((line = rd.readLine()) != null) { line = line.trim(); if (line.length() == 0) { continue; } if (line.startsWith("[")) { // セクションの判定 if (line.toLowerCase().equals("[size]")) { // Sizeセクション sectionMode = 1; } else if (line.toLowerCase().equals("[parts]")) { // Partsセクション sectionMode = 2; } else { // それ以外のセクションなのでモードをリセット. // 色情報のセクション「Color」は現在のところサポートしていない. sectionMode = 0; } } else { int eqpos = line.indexOf('='); String key, val; if (eqpos >= 0) { // キーは小文字に揃える (大小を無視して比較できるようにするため) key = line.substring(0, eqpos).toLowerCase().trim(); val = line.substring(eqpos + 1); } else { key = line.toLowerCase().trim(); val = ""; } if (sectionMode == 1) { // Sizeセクション try { if (key.equals("size_x")) { siz_x = Integer.parseInt(val); } else if (key.equals("size_y")) { siz_y = Integer.parseInt(val); } } catch (RuntimeException ex) { logger.log(Level.WARNING, "character.ini invalid. key=" + key + "/val=" + val, ex); // 変換できないものは無視する. } } else if (sectionMode == 2) { // Partsセクション if (key.length() > 0) { plainPartsSet.put(key, val); } } } } } finally { rd.close(); } } catch (IOException ex) { // エラーが発生したら、character.iniは無かったことにして続ける. logger.log(Level.WARNING, "character.ini invalid.", ex); return null; } finally { try { is.close(); } catch (IOException ex) { logger.log(Level.SEVERE, "can't close file.", ex); } } // イメージサイズの設定 if (siz_x > 0 && siz_y > 0) { cd.setImageSize(new Dimension(siz_x, siz_y)); } // パーツセットを構築する. boolean existsPartsetParts = false; if (!plainPartsSet.isEmpty()) { PartsSet partsSet = new PartsSet("default", "default", true); for (Map.Entry entry : plainPartsSet.entrySet()) { String categoryId = entry.getKey(); String partsName = entry.getValue(); PartsCategory partsCategory = cd.getPartsCategory(categoryId); if (partsCategory != null) { PartsIdentifier partsIdentifier; if (partsName == null || partsName.length() == 0) { partsIdentifier = null; } else { partsIdentifier = new PartsIdentifier(partsCategory, partsName, partsName); existsPartsetParts = true; } partsSet.appendParts(partsCategory, partsIdentifier, null); } } if (!partsSet.isEmpty() && existsPartsetParts) { // パーツセットが空でなく、 // なにかしらのパーツが登録されている場合のみパーツセットを登録する. cd.addPartsSet(partsSet); cd.setDefaultPartsSetId("default"); } } return cd; } } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataWriter.java0000644000175000017500000000202513615720000027416 0ustar paulliupaulliupackage charactermanaj.model.io; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Properties; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSpec; public interface CharacterDataWriter { void writeExportProp(Properties prop) throws IOException; void writeCharacterData(CharacterData characterData) throws IOException; void writeCustomLayerPatterns(Map> map) throws IOException; void writeTextUTF16LE(String name, String contents) throws IOException; void writeSamplePicture(BufferedImage samplePicture) throws IOException; void writePartsImages(Map partsImages) throws IOException; void writePartsManageData(Map partsImages) throws IOException; void close() throws IOException; } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsManageDataDecorateLoader.java0000644000175000017500000000752013615720000031332 0ustar paulliupaulliupackage charactermanaj.model.io; import java.util.HashMap; import java.util.Map; import charactermanaj.model.PartsAuthorInfo; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsManageData; import charactermanaj.model.PartsSpec; /** * パーツ管理情報をパーツデータに補填するデコレータ・ローダー.
* ローダから読み込まれたパーツデータに対して、それに該当する管理情報があれば、その管理情報で更新し、 * 更新した結果を返す.
* @author seraphy */ public class PartsManageDataDecorateLoader implements PartsDataLoader { /** * パーツ管理情報を構築するファクトリ.
* ローダーが呼び出された段階で、最新のパーツ管理情報をロードするためのもの.
* @author seraphy * */ public interface PartsManageDataFactory { /** * パーツ管理情報をロードする.
* パーツ管理情報が存在しない場合、もしくは読み取りできなった場合は管理情報はないものとして空のインスタンスを返す.
* @return バーツ管理情報、存在しない場合は空を返す.
*/ PartsManageData createPartsManageData(); } private PartsDataLoader parent; private PartsManageDataFactory partsManageDataFactory; public PartsManageDataDecorateLoader(PartsDataLoader parent, PartsManageDataFactory partsManageDataFactory) { if (parent == null || partsManageDataFactory == null) { throw new IllegalArgumentException(); } this.parent = parent; this.partsManageDataFactory = partsManageDataFactory; } public Map load(PartsCategory category) { // 親よりパーツデータをロードする. Map partsSpecs = parent.load(category); // 最新のパーツ管理情報をロードする. PartsManageData partsManageData = partsManageDataFactory.createPartsManageData(); if (partsManageData == null || partsManageData.isEmpty()) { // パーツ管理情報がnullであるか空であれば、元のまま何もせず返す. return partsSpecs; } // 返却用 HashMap newPartsSpecs = new HashMap(); // パーツ管理データからのデータを補填する. for (Map.Entry entry : partsSpecs.entrySet()) { PartsIdentifier orgPartsId = entry.getKey(); PartsIdentifier newPartsId; PartsSpec partsSpec = entry.getValue(); PartsManageData.PartsKey partsKey = new PartsManageData.PartsKey(orgPartsId); // ローカライズ名が指定されているか? String localizedName = partsManageData.getLocalizedName(partsKey); if (localizedName != null && localizedName.length() > 0 && !localizedName.equals(orgPartsId.getLocalizedPartsName())) { // ローカライズ名が指定されており、且つ、元のローカライズ名と異なる場合 newPartsId = orgPartsId.setLocalizedPartsName(localizedName); } else { // ローカライズ名の変更なし newPartsId = orgPartsId; } // パーツ作者情報があれば設定する. PartsAuthorInfo partsAuthorInfo = partsManageData.getPartsAuthorInfo(partsKey); if (partsAuthorInfo != null) { partsSpec.setAuthorInfo(partsAuthorInfo); } // パーツのバージョンとダウンロード情報があれば設定する. PartsManageData.PartsVersionInfo versionInfo = partsManageData.getVersion(partsKey); if (versionInfo != null) { double version = versionInfo.getVersion(); String downloadURL = versionInfo.getDownloadURL(); partsSpec.setVersion(version); partsSpec.setDownloadURL(downloadURL); } newPartsSpecs.put(newPartsId, partsSpec); } return newPartsSpecs; } } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataArchiveFile.java0000644000175000017500000001175313615720000030333 0ustar paulliupaulliupackage charactermanaj.model.io; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.PartsManageData; import charactermanaj.model.io.AbstractCharacterDataArchiveFile.PartsImageContent; /** * アーカイブ形式のファイルを読み取るためのインターフェイス.
* @author seraphy */ public interface CharacterDataArchiveFile { /** * クローズする. * @throws IOException */ void close() throws IOException; /** * コンテンツルートへのプレフィックスを取得する.
* アーカイブの実際のルートに単一のフォルダしかない場合、そのフォルダがルートプレフィックスとなる.
* アーカイブの実際のルートに複数のフォルダがあるか、ファイルがある場合、ルートプレフィックスは空文字である.
* @return コンテンツルートへのプレフィックス */ String getRootPrefix(); /** * 指定したコンテンツが存在するか? * @param name コンテンツ名 * @return 存在すればtrue、存在しなければfalse */ boolean hasContent(String name); /** * キャラクター定義を読み込む.
* アーカイブに存在しなければnull * @return キャラクター定義、もしくはnull * @throws IOException 読み取りに失敗した場合 */ CharacterData readCharacterData() throws IOException; /** * カスタムレイヤーパターン定義を読みこむ * アーカイブに存在しないければnull * @param cd キャラクターデータ(カテゴリ情報が必要なため) * @return カスタムレイヤーパターン、もしくはnull * @throws IOException 読み取りに失敗した場合 */ Map> readCustomLayerPatterns(CharacterData cd) throws IOException; /** * お気に入りを読み込みキャラクター定義に追加する.
* アーカイブにお気に入りが存在しなければ何もしない.
* @param characterData キャラクター定義(お気に入りが追加される) * @throws IOException 読み取りに失敗した場合 */ void readFavorites(CharacterData characterData) throws IOException; /** * キャラクター定義をINIファイルより読み取る.
* character.iniが存在しなければnull.
* 「キャラクターなんとか機」の設定ファイルを想定している.
* @return キャラクター定義、もしくはnull * @throws IOException 読み取りに失敗した場合 */ CharacterData readCharacterINI() throws IOException; /** * サンプルピクチャを読み込む.
* アーカイブに存在しなければnull. * @return サンプルピクチャ、もしくはnull * @throws IOException 読み取りに失敗した場合 */ BufferedImage readSamplePicture() throws IOException; /** * アーカイブにある「readme.txt」、もしくは「readme」というファイルをテキストファイルとして読み込む.
* readme.txtが優先される。ともに存在しない場合はnull. * @return テキスト、もしくはnull * @throws 読み込みに失敗した場合 */ String readReadMe() throws IOException; /** * ファイルをテキストとして読み取り、返す.
* UTF-16LE/BE/UTF-8についてはBOMにより判定する.
* BOMがない場合はUTF-16/8ともに判定できない.
* BOMがなければMS932もしくはEUC_JPであると仮定して読み込む.
* @param name コンテンツ名 * @return テキスト、コンテンツが存在しない場合はnull * @throws IOException 読み込みに失敗した場合 */ String readTextFile(String name) throws IOException; /** * アーカイブに含まれる、キャラクター定義と同じフォルダをもつpngファイルからパーツイメージを取得する.
* パーツの探索は引数で指定したキャラクター定義によって行われます.
* @param characterData インポート先のキャラクターデータ、フォルダ名などを判別するため。nullの場合は空のマップを返す.
* @param newly 新規インポート用であるか?(新規でない場合は引数で指定したキャラクターセットと同じパーツは読み込まれない) * @return パーツイメージコンテンツのコレクション、なければ空 */ Collection getPartsImageContents(CharacterData characterData, boolean newly); /** * アーカイブに含まれるparts-info.xmlを読み込み返す.
* 存在しなければ空のインスタンスを返す.
* @return パーツ管理データ * @throws IOException */ PartsManageData getPartsManageData() throws IOException; } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataXMLReader.java0000644000175000017500000006036713615720000027742 0ustar paulliupaulliupackage charactermanaj.model.io; import static charactermanaj.util.XMLUtilities.*; import java.awt.Color; import java.awt.Dimension; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import charactermanaj.graphics.colormodel.ColorModels; import charactermanaj.graphics.filters.ColorConv; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.model.CharacterData; import charactermanaj.model.ColorGroup; import charactermanaj.model.IndependentPartsColorInfo; import charactermanaj.model.IndependentPartsSetInfo; import charactermanaj.model.IndependentPartsSetInfoList; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsSet; import charactermanaj.model.RecommendationURL; import charactermanaj.util.XMLUtilities; /** * キャラクターデータを格納したXMLを読み込むためのクラス. * * @author seraphy */ public class CharacterDataXMLReader { /** * character.xmlのデフォルトの名前空間 */ private static final String NS_PREFIX = "http://charactermanaj.sourceforge.jp/schema/charactermanaj"; /** * favorites.xmlのデフォルトの名前空間. * (character.xmlの名前空間と別にすべきだったかもしれないが、v0.991まで、これでやってきたので、とりあえず、このままとする。) */ private static final String NS_PREFIX_FAVORITES = "http://charactermanaj.sourceforge.jp/schema/charactermanaj"; /** * ロガー */ private static final Logger logger = Logger .getLogger(CharacterDataXMLReader.class.getName()); /** * キャラクター定義(プロファイル)をロードする. * * @param docBase * 対象xml * @return キャラクターデータ * @throws IOException */ public CharacterData loadCharacterDataFromXML(URI docBase) throws IOException { if (docBase == null) { throw new IllegalArgumentException(); } URL docBaseURL = docBase.toURL(); CharacterData cd; InputStream is = docBaseURL.openStream(); try { cd = loadCharacterDataFromXML(is, docBase); } finally { is.close(); } return cd; } /** * XMLコンテンツに対する入力ストリームからキャラクターデータを取り出す.
* docbaseはXMLファイルの位置を示すものであり、XMLデータ中には含まれず、キャラクターデータのロード時にセットされる.
* そのため引数としてdocbaseを引き渡す.
* 読み取りは現在のデフォルトロケールで行われる.
* * @param is * 入力ストリーム * @param docBase * XMLファイルの位置を示すURI、nullの場合はnullが設定される。 * @param docInfo * ドキュメントのタイプ * @return 読み取られたプロファイル * @throws IOException * 読み取りに失敗 */ public CharacterData loadCharacterDataFromXML(InputStream is, URI docBase) throws IOException { return loadCharacterDataFromXML(is, docBase, Locale.getDefault()); } /** * XMLコンテンツに対する入力ストリームからキャラクターデータを取り出す.
* docbaseはXMLファイルの位置を示すものであり、XMLデータ中には含まれず、キャラクターデータのロード時にセットされる.
* そのため引数としてdocbaseを引き渡す.
* 設定ファイル中の表示文字列にロケール指定がある場合、引数に指定したロケールに合致する言語の情報を取得する.
* 合致するものがなければ最初のものを使用する.
* * @param is * 入力ストリーム * @param docBase * XMLファイルの位置を示すURI、nullの場合はnullが設定される。 * @param docInfo * ドキュメントのタイプ * @param locale * 読み取るロケール * @return 読み取られたプロファイル * @throws IOException * 読み取りに失敗 */ public CharacterData loadCharacterDataFromXML(InputStream is, URI docBase, Locale locale) throws IOException { if (is == null || locale == null) { throw new IllegalArgumentException(); } Document doc = XMLUtilities.loadDocument(is); CharacterData characterData = new CharacterData(); characterData.setDocBase(docBase); try { Element docElm = doc.getDocumentElement(); if (!"character".equals(docElm.getNodeName())) { throw new IOException("Invalid Format."); } String ns = docElm.getNamespaceURI(); if (ns == null || !ns.startsWith(NS_PREFIX)) { throw new IOException("unsupported xml format"); } String docVersion = docElm.getAttribute("version").trim(); if (!"1.0".equals(docVersion)) { throw new IOException("unsupported version: " + docVersion); } String characterId = docElm.getAttribute("id").trim(); String characterRev = docElm.getAttribute("rev").trim(); characterData.setId(characterId); characterData.setRev(characterRev); // language String lang = locale.getLanguage(); // name String characterName = getLocalizedElementText(docElm, "name", lang); if (characterName == null) { characterName = "default"; } characterData.setName(characterName.trim()); // information/author, information/description String author = null; String description = null; for (Element infoElm : getChildElements(docElm, "information")) { if (author == null) { author = getLocalizedElementText(infoElm, "author", lang); } if (description == null) { description = getLocalizedElementText(infoElm, "description", lang); } } if (author == null) { author = ""; } characterData.setAuthor(author.trim()); if (description == null) { description = null; } characterData.setDescription(description); // image-size/width, image-size/height int width = 0; int height = 0; for (Element sizeElm : getChildElements(docElm, "image-size")) { String tmpWidth = getLocalizedElementText(sizeElm, "width", lang); if (tmpWidth != null && tmpWidth.trim().length() > 0) { width = Integer.parseInt(tmpWidth.trim()); } String tmpHeight = getLocalizedElementText(sizeElm, "height", lang); if (tmpHeight != null && tmpHeight.trim().length() > 0) { height = Integer.parseInt(tmpHeight.trim()); } break; } if (width <= 0) { width = 300; } if (height <= 0) { height = 400; } characterData.setImageSize(new Dimension(width, height)); // settings for (Element settingElm : getChildElements(docElm, "settings")) { for (Element entElm : getChildElements(settingElm, "entry")) { String key = entElm.getAttribute("key").trim(); String val = entElm.getTextContent(); characterData.setProperty(key, val); } } // colorGroups/colorGroup ArrayList colorGroups = new ArrayList(); for (Element colorGroupsElm : getChildElements(docElm, "colorGroups")) { for (Element colorGroupElm : getChildElements(colorGroupsElm, "colorGroup")) { String colorGroupId = colorGroupElm.getAttribute("id") .trim(); String colorGroupDisplayName = getLocalizedElementText( colorGroupElm, "display-name", lang); ColorGroup colorGroup = new ColorGroup(colorGroupId, colorGroupDisplayName); colorGroups.add(colorGroup); } } characterData.setColorGroups(colorGroups); // categories/category ArrayList categories = new ArrayList(); for (Element catsElm : getChildElements(docElm, "categories")) { for (Element catElm : getChildElements(catsElm, "category")) { String categoryId = catElm.getAttribute("id").trim(); boolean multipleSelectable = Boolean.parseBoolean(catElm .getAttribute("multipleSelectable")); boolean optional; String strOptional = catElm.getAttribute("optional"); if (strOptional != null && strOptional.trim().length() > 0) { optional = Boolean.parseBoolean(strOptional); } else { // ver0.999以前にはないのでmultipleSelectableから自動導出する // 複数選択カテゴリの場合は0以上なので省略可とする。 // 複数選択カテゴリでなければ必須とする。 optional = multipleSelectable; } String categoryDisplayName = getLocalizedElementText( catElm, "display-name", lang); int visibleRows = 0; String tmpVisibleRows = getLocalizedElementText(catElm, "visible-rows", lang); if (tmpVisibleRows != null && tmpVisibleRows.trim().length() > 0) { visibleRows = Integer.parseInt(tmpVisibleRows.trim()); } if (visibleRows <= 0) { visibleRows = 0; } // layers/layer ArrayList layers = new ArrayList(); for (Element layersElm : getChildElements(catElm, "layers")) { for (Element layerElm : getChildElements(layersElm, "layer")) { String layerId = layerElm.getAttribute("id"); String layerDisplayName = getLocalizedElementText( layerElm, "display-name", lang); // レイヤーの重ね順 String strOrder = getElementText(layerElm, "order"); int order = layers.size(); if (strOrder != null && strOrder.trim().length() > 0) { order = Integer.parseInt(strOrder.trim()); } // レイヤーの画像ディレクトリ名 String layerDir = getElementText(layerElm, "dir"); if (layerDir == null || layerDir.trim().length() == 0) { throw new IOException("layer's dir is null"); } // カラーモデル(省略可) String colorModelName = getElementText(layerElm, "colorModel"); if (colorModelName == null || colorModelName.length() == 0) { // 省略時はデフォルトのカラーモデル名を使用する. colorModelName = ColorModels.DEFAULT.name(); } // layer/colorGroup カラーグループ boolean initSync = false; ColorGroup colorGroup = null; Element lcgElm = getFirstChildElement(layerElm, "colorGroup"); if (lcgElm != null) { String tmpInitSync = lcgElm .getAttribute("init-sync"); if (tmpInitSync.trim().length() > 0) { initSync = Boolean.parseBoolean(tmpInitSync .trim()); } if (colorGroup == null) { String colorGroupRefId = lcgElm .getAttribute("refid").trim(); colorGroup = characterData .getColorGroup(colorGroupRefId); } } Layer layer = new Layer(layerId, layerDisplayName, order, colorGroup, initSync, layerDir, colorModelName); layers.add(layer); } } PartsCategory category = new PartsCategory( categories.size(), categoryId, categoryDisplayName, multipleSelectable, optional, visibleRows, layers.toArray(new Layer[layers.size()])); categories.add(category); } } characterData.setPartsCategories(categories .toArray(new PartsCategory[categories.size()])); // presets for (Element presetssElm : getChildElements(docElm, "presets")) { loadPartsSet(characterData, presetssElm, true, lang); } // recommendations List recommendationURLList = null; // お勧めノードがない場合はnull for (Element recmsElm : getChildElements(docElm, "recommendations")) { for (Element recmElm : getChildElements(recmsElm, "recommendation")) { String recommentDescription = getLocalizedElementText( recmElm, "description", lang); String url = getLocalizedElementText(recmElm, "URL", lang); if (recommentDescription != null) { recommentDescription = recommentDescription.trim(); } if (url != null) { url = url.trim(); } RecommendationURL recommendationURL = new RecommendationURL(); recommendationURL.setDisplayName(recommentDescription); recommendationURL.setUrl(url); if (recommendationURLList == null) { recommendationURLList = new ArrayList(); } recommendationURLList.add(recommendationURL); } } characterData.setRecommendationURLList(recommendationURLList); } catch (RuntimeException ex) { IOException ex2 = new IOException("CharacterData invalid format."); ex2.initCause(ex); throw ex2; } return characterData; } /** * 入力ストリームからパーツセット定義(Favorites.xml)を読み込んで、 characterDataに追加登録する.
* * @param characterData * お気に入りを登録されるキャラクターデータ * @param inpstm * お気に入りのxmlへの入力ストリーム * @param docInfo * ドキュメントタイプ * @throws IOException * 読み込みに失敗した場合 */ public void loadPartsSet(CharacterData characterData, InputStream inpstm) throws IOException { if (characterData == null || inpstm == null) { throw new IllegalArgumentException(); } Document doc = XMLUtilities.loadDocument(inpstm); Element docElm = doc.getDocumentElement(); if (!"partssets".equals(docElm.getNodeName())) { logger.log(Level.WARNING, "invalid partsets format."); return; } String ns = docElm.getNamespaceURI(); if (ns == null || !ns.startsWith(NS_PREFIX_FAVORITES)) { logger.log(Level.WARNING, "invalid partsets format."); return; } String lang = Locale.getDefault().getLanguage(); loadPartsSet(characterData, docElm, false, lang); } /** * CharacterDataのプリセットまたはFavoritesのパーツセットのXMLからパーツセットを読み取って登録する.
* * @param characterData * キャラクターデータ * @param nodePartssets * パーツセットのノード、プリセットまたはパーツセットノード * @param presetParts * ロードしたパーツセットにプリセットフラグをたてる場合はtrue * @param lang * 言語 */ protected void loadPartsSet(CharacterData characterData, Element nodePartssets, boolean presetParts, String lang) { IndependentPartsSetInfoList partsSetLst = loadPartsSetList( nodePartssets, lang); logger.info("partsSetList: size=" + partsSetLst.size()); if (presetParts) { characterData .setDefaultPartsSetId(partsSetLst.getDefaultPresetId()); } for (IndependentPartsSetInfo partsSetInfo : partsSetLst) { PartsSet partsSet = IndependentPartsSetInfo.convertPartsSet( partsSetInfo, characterData, presetParts); characterData.addPartsSet(partsSet); } } /** * CharacterDataのプリセットまたはFavoritesのパーツセットのXMLからパーツセットを読み取って登録する.
* * @param nodePartssets * パーツセットのノード、プリセットまたはパーツセットノード * @param lang * 言語 */ public IndependentPartsSetInfoList loadPartsSetList(Element nodePartssets, String lang) { if (nodePartssets == null || lang == null || lang.length() == 0) { throw new IllegalArgumentException(); } IndependentPartsSetInfoList partsSetLst = new IndependentPartsSetInfoList(); // デフォルトのパーツセットID String defaultPresetId = nodePartssets.getAttribute("default-preset"); if (defaultPresetId != null) { defaultPresetId = defaultPresetId.trim(); } // パーツセットリストの読み込み for (Element presetElm : getChildElements(nodePartssets, "preset")) { IndependentPartsSetInfo partsSetInfo = loadPartsSet(presetElm, lang); if (partsSetInfo != null) { String partsSetId = partsSetInfo.getId(); // デフォルトのパーツセットIDがない場合は先頭をデフォルトとみなす. if (defaultPresetId == null || defaultPresetId.length() == 0) { defaultPresetId = partsSetId; } partsSetLst.add(partsSetInfo); } } if (defaultPresetId.length() == 0) { // デフォルトパーツセットがないことを示すためのnull defaultPresetId = null; } partsSetLst.setDefaultPresetId(defaultPresetId); return partsSetLst; } /** * CharacterDataのプリセットまたはFavoritesのパーツセットのXMLからパーツセットを読み取る.
* * @param nodePartssets * パーツセットのノード、プリセットまたはパーツセットノード * @param lang * 言語 * @return 素のパーツセット情報、無ければnull */ public IndependentPartsSetInfo loadPartsSet(Element presetElm, String lang) { if (presetElm == null || lang == null) { return null; } IndependentPartsSetInfo partsSetInfo = new IndependentPartsSetInfo(); // id String partsSetId = presetElm.getAttribute("id"); if (partsSetId != null) { partsSetId = partsSetId.trim(); } if (partsSetId != null && partsSetId.length() == 0) { partsSetId = null; } partsSetInfo.setId(partsSetId); // display-name String displayName = getLocalizedElementText(presetElm, "display-name", lang); partsSetInfo.setDisplayName(displayName); // bgColor Element bgColorElm = getFirstChildElement(presetElm, "background-color"); if (bgColorElm != null) { String tmpBgColor = bgColorElm.getAttribute("color"); try { Color bgColor = Color.decode(tmpBgColor); partsSetInfo.setBackgroundColor(bgColor); } catch (Exception ex) { logger.log(Level.WARNING, "bgColor parameter is invalid. :" + tmpBgColor, ex); // 無視する } } // affine-transform-parameter String tmpAffienTrans = getElementText(presetElm, "affine-transform-parameter"); if (tmpAffienTrans != null && tmpAffienTrans.trim().length() > 0) { try { ArrayList affineTransformParameterArr = new ArrayList(); for (String strParam : tmpAffienTrans.split("\\s+")) { affineTransformParameterArr.add(Double.valueOf(strParam)); } double[] affineTransformParameter = new double[affineTransformParameterArr .size()]; int idx = 0; for (double aaffineItem : affineTransformParameterArr) { affineTransformParameter[idx++] = aaffineItem; } partsSetInfo .setAffineTransformParameter(affineTransformParameter); } catch (Exception ex) { logger.log(Level.WARNING, "affine transform parameter is invalid. :" + tmpAffienTrans, ex); // 無視する. } } // カテゴリIDをキーとし、パーツ名をキーとしカラー情報のリストを値とするマップを値とする. Map>> partsMap = partsSetInfo .getPartsMap(); // Category for (Element catElm : getChildElements(presetElm, "category")) { String categoryId = catElm.getAttribute("refid"); if (categoryId != null) { categoryId = categoryId.trim(); } if (categoryId == null || categoryId.length() == 0) { logger.log(Level.WARNING, "missing category refid: " + catElm); continue; } // パーツ名をキーとしカラー情報のリストを値とするマップ. Map> categoryPartsMap = partsMap .get(categoryId); if (categoryPartsMap == null) { // ※ パーツの出現順を維持する必要があるためLinkedHashMapを用いる categoryPartsMap = new LinkedHashMap>(); partsMap.put(categoryId, categoryPartsMap); } // Parts for (Element partsElm : getChildElements(catElm, "parts")) { String partsName = partsElm.getAttribute("name"); if (partsName != null) { partsName = partsName.trim(); } if (partsName == null || partsName.length() == 0) { logger.log(Level.WARNING, "missing parts name. " + partsElm); continue; } // Color/Layer List infoList = null; for (Element colorElm : getChildElements(partsElm, "color")) { infoList = readPartsColor(colorElm); break; } categoryPartsMap.put(partsName, infoList); } } // アクティブなレイヤーパターン for (Element patternsElm : getChildElements(presetElm, "active-custom-layer-patterns")) { Set patternIds = new TreeSet(); for (Element patElm : getChildElements(patternsElm, "pattern")) { String id = patElm.getAttribute("id"); patternIds.add(id); } partsSetInfo.setActiveCustomLayerPatternIds(patternIds); break; } return partsSetInfo; } /** * パーツごとのカラー情報のXMLを読み込んで返す.
* パーツは複数のレイヤーから構成されるので、複数レイヤーのカラー情報のリストとして返される.
* (パーツは複数レイヤーをまとめる1つのカテゴリになるので、カテゴリ単位の情報となる.)
* * @param colorElm * カラーのXML要素 * @return 素のカラー情報 */ public List readPartsColor(Element colorElm) { if (colorElm == null) { throw new IllegalArgumentException(); } ArrayList infoList = new ArrayList(); for (Element layerElm : getChildElements(colorElm, "layer")) { IndependentPartsColorInfo info = new IndependentPartsColorInfo(); String layerId = layerElm.getAttribute("refid"); if (layerId != null) { layerId = layerId.trim(); } if (layerId == null || layerId.length() == 0) { logger.log(Level.WARNING, "missing layer-id: " + layerElm); continue; } info.setLayerId(layerId); // color-group Element colorGroupElm = getFirstChildElement(layerElm, "color-group"); if (colorGroupElm != null) { String colorGroupId = colorGroupElm.getAttribute("group") .trim(); info.setColorGroupId(colorGroupId); boolean syncColorGroup = Boolean.parseBoolean(colorGroupElm .getAttribute("synchronized").trim()); info.setSyncColorGroup(syncColorGroup); } // rgb ColorConvertParameter param = info.getColorConvertParameter(); Element nodeRgb = getFirstChildElement(layerElm, "rgb"); if (nodeRgb != null) { for (Element elmRgb : getChildElements(nodeRgb, null)) { String rgbName = elmRgb.getNodeName(); int offset = Integer .parseInt(elmRgb.getAttribute("offset")); float factor = Float.parseFloat(elmRgb .getAttribute("factor")); float gamma = Float .parseFloat(elmRgb.getAttribute("gamma")); if ("red".equals(rgbName)) { param.setOffsetR(offset); param.setFactorR(factor); param.setGammaR(gamma); } else if ("green".equals(rgbName)) { param.setOffsetG(offset); param.setFactorG(factor); param.setGammaG(gamma); } else if ("blue".equals(rgbName)) { param.setOffsetB(offset); param.setFactorB(factor); param.setGammaB(gamma); } else if ("alpha".equals(rgbName)) { param.setOffsetA(offset); param.setFactorA(factor); param.setGammaA(gamma); } } } // hsb Element elmHsb = getFirstChildElement(layerElm, "hsb"); if (elmHsb != null) { float hue = Float.parseFloat(elmHsb.getAttribute("hue")); float saturation = Float.parseFloat(elmHsb .getAttribute("saturation")); float brightness = Float.parseFloat(elmHsb .getAttribute("brightness")); String strContrast = elmHsb.getAttribute("contrast").trim(); param.setHue(hue); param.setSaturation(saturation); param.setBrightness(brightness); if (strContrast != null && strContrast.length() > 0) { // ver0.96追加 optional float contrast = Float.parseFloat(strContrast); param.setContrast(contrast); } } // rgb-replace Element elmRgbReplace = getFirstChildElement(layerElm, "rgb-replace"); if (elmRgbReplace != null) { Float grayLevel = Float.parseFloat(elmRgbReplace .getAttribute("gray")); ColorConv colorType = ColorConv.valueOf(elmRgbReplace .getAttribute("replace-type")); param.setGrayLevel(grayLevel); param.setColorReplace(colorType); } infoList.add(info); } return infoList; } } CharacterManaJ/src/main/java/charactermanaj/model/io/AbstractCharacterDataArchivedFileWriter.java0000644000175000017500000002070613615720000033356 0ustar paulliupaulliupackage charactermanaj.model.io; import java.awt.Color; import java.awt.Dimension; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.Charset; import java.sql.Timestamp; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import charactermanaj.graphics.io.ImageResource; import charactermanaj.graphics.io.ImageSaveHelper; import charactermanaj.model.AppConfig; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsFiles; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsManageData; import charactermanaj.model.PartsManageDataConverter; import charactermanaj.model.PartsSet; import charactermanaj.model.PartsSpec; /** * キャラクターデータをアーカイブ(zip, jar形式)で保存するための共通クラス. */ public abstract class AbstractCharacterDataArchivedFileWriter extends AbstractCharacterDataFileWriter { protected AbstractCharacterDataArchivedFileWriter(File outFile) throws IOException { super(outFile); } /** * 現在のエントリの出力ストリームを取得する * @return * @throws IOException */ protected abstract OutputStream getOutputStream() throws IOException; /** * 次のエントリに進む * @param name エントリ名 * @param lastModified 最終更新日時(0以下の場合はデフォルトとする) * @throws IOException */ protected abstract void putNextEntry(String name, long lastModified) throws IOException; /** * 現在のエントリを閉じる * @throws IOException */ protected abstract void closeEntry() throws IOException; @Override protected void internalWriteExportProp(Properties prop) throws IOException { // export prop putNextEntry("export-info.xml", 0); prop.storeToXML(getOutputStream(), "exportProp"); } @Override protected void internalWriteCharacterData(CharacterData characterData) throws IOException { CharacterDataXMLWriter xmlWriter = new CharacterDataXMLWriter(); // character.xmlの出力 putNextEntry(CharacterDataPersistent.CONFIG_FILE, 0); xmlWriter.writeXMLCharacterData(characterData, getOutputStream()); closeEntry(); // character.iniの出力 internalWriteCharacterIni(characterData); } /** * character.iniを出力します.
* * @param characterData * キャラクターデータ * @throws IOException * 出力に失敗した場合 */ protected void internalWriteCharacterIni(CharacterData characterData) throws IOException { StringBuilder buf = new StringBuilder(); buf.append("; created by charactermanaj " + new Timestamp(System.currentTimeMillis()) + "\r\n"); buf.append("[Size]\r\n"); Dimension dim = characterData.getImageSize(); if (dim == null) { dim = new Dimension(300, 400); } buf.append("size_x=" + dim.width + "\r\n"); buf.append("size_y=" + dim.height + "\r\n"); buf.append("\r\n"); buf.append("[Parts]\r\n"); Map partsMap = new HashMap(); for (PartsCategory partsCategory : characterData.getPartsCategories()) { String categoryId = partsCategory.getCategoryId(); partsMap.put(categoryId, ""); } Map partsSets = characterData.getPartsSets(); PartsSet partsSet = partsSets.get(characterData.getDefaultPartsSetId()); if (partsSet == null && !partsSets.isEmpty()) { // デフォルトのパーツセットが指定されていない場合は、どれか1つを選択する. partsSet = partsSets.values().iterator().next(); } if (partsSet != null) { for (Map.Entry> entry : partsSet .entrySet()) { PartsCategory partsCategory = entry.getKey(); StringBuilder partsNames = new StringBuilder(); for (PartsIdentifier partsIdentifier : entry.getValue()) { if (partsNames.length() > 0) { partsNames.append(","); } partsNames.append(partsIdentifier.getPartsName()); } String categoryId = partsCategory.getCategoryId(); partsMap.put(categoryId, partsNames.toString()); } } for (PartsCategory partsCategory : characterData.getPartsCategories()) { String categoryId = partsCategory.getCategoryId(); String partsNames = partsMap.get(categoryId); buf.append(categoryId + "=" + partsNames + "\r\n"); } // 色情報はすべてダミー(character.iniは色情報を省略しても問題ないようだが、一応) buf.append("\r\n"); buf.append("[Color]\r\n"); buf.append("hair_rgb=0\r\n"); buf.append("hair_gray=0\r\n"); buf.append("eye_rgb=0\r\n"); buf.append("eye_gray=0\r\n"); buf.append("skin_rgb=0\r\n"); buf.append("skin_gray=0\r\n"); buf.append("body_rgb=0\r\n"); buf.append("body_gray=0\r\n"); // UTF16LEで出力する. internalWriteTextUTF16LE(CharacterDataPersistent.COMPATIBLE_CONFIG_NAME, buf.toString()); } @Override protected void internalWriteCustomLayerPatterns(Map> map) throws IOException { if (map == null) { return; } // カスタムレイヤーパターンを出力する CustomLayerOrderXMLWriter xmlWriter = new CustomLayerOrderXMLWriter(); putNextEntry(CustomLayerOrderPersist.CUSTOM_LAYER_ORDERS_XML_FILE, 0); xmlWriter.write(map, getOutputStream()); closeEntry(); } @Override protected void internalWriteTextUTF16LE(String name, String contents) throws IOException { if (contents == null) { contents = ""; } // LFまたはCR改行であればCR/LF改行に変換. contents = contents.replace("\r\n", "\n"); contents = contents.replace("\r", "\n"); contents = contents.replace("\n", "\r\n"); putNextEntry(name, 0); OutputStream os = getOutputStream(); os.write((byte) 0xff); os.write((byte) 0xfe); os.flush(); Writer wr = new OutputStreamWriter(os, Charset.forName("UTF-16LE")) { @Override public void close() throws IOException { // ZipのOutputStreamをクローズしてはならないため // OutputStreamWriter自身はクローズは呼び出さない. flush(); closeEntry(); } }; try { wr.append(contents); wr.flush(); } finally { wr.close(); } } @Override protected void internalWriteSamplePicture(BufferedImage samplePicture) throws IOException { putNextEntry("preview.png", 0); ImageSaveHelper imageSaveHelper = new ImageSaveHelper(); imageSaveHelper.savePicture(samplePicture, Color.white, getOutputStream(), "image/png", null); closeEntry(); } @Override protected void internalWritePartsImages( Map partsImages) throws IOException { AppConfig appConfig = AppConfig.getInstance(); byte[] buf = new byte[appConfig.getJarTransferBufferSize()]; for (Map.Entry entry : partsImages.entrySet()) { PartsIdentifier partsIdentifier = entry.getKey(); PartsSpec partsSpec = entry.getValue(); PartsFiles partsFiles = partsSpec.getPartsFiles(); for (Map.Entry imageEntry : partsFiles.entrySet()) { Layer layer = imageEntry.getKey(); ImageResource imageResource = imageEntry.getValue(); String name = layer.getDir() + "/" + partsIdentifier.getPartsName() + ".png"; name = name.replace("//", "/"); putNextEntry(name, imageResource.lastModified()); OutputStream os = getOutputStream(); InputStream is = imageResource.openStream(); try { int rd; while ((rd = is.read(buf)) >= 0) { os.write(buf, 0, rd); } } finally { is.close(); } closeEntry(); } } } @Override protected void internalWritePartsManageData( Map partsImages) throws IOException { PartsManageDataConverter partsManageDataConverter = new PartsManageDataConverter(); for (Map.Entry entry : partsImages.entrySet()) { PartsIdentifier partsIdentifier = entry.getKey(); PartsSpec partsSpec = entry.getValue(); partsManageDataConverter.convert(partsIdentifier, partsSpec); } PartsManageData partsManageData = partsManageDataConverter.getPartsManageData(); PartsInfoXMLWriter xmlWriter = new PartsInfoXMLWriter(); putNextEntry("parts-info.xml", 0); xmlWriter.savePartsManageData(partsManageData, getOutputStream()); closeEntry(); } } CharacterManaJ/src/main/java/charactermanaj/model/io/RecentDataPersistent.java0000644000175000017500000001335213615720000027633 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.sql.Timestamp; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.model.CharacterData; import charactermanaj.util.DirectoryConfig; /** * 最後に使用したデータの使用状況を保存・復元するためのクラス * * @author seraphy */ public final class RecentDataPersistent { /** * キャラクターデータの親フォルダごとに保存する、最後に使用したキャラクターデータを保存するファイル名 */ private static final String RECENT_CAHARCTER_INFO_XML = "recent-character.xml"; /** * ロガー */ private static final Logger logger = Logger.getLogger(RecentDataPersistent.class.getName()); /** * シングルトン */ private static final RecentDataPersistent inst = new RecentDataPersistent(); /** * プライベートコンストラクタ */ private RecentDataPersistent() { super(); } /** * インスタンスを取得する * * @return インスタンス */ public static RecentDataPersistent getInstance() { return inst; } /** * キャラクターデータの親フォルダごとに保存する、最後に使用したキャラクターデータを保存するファイル * * @return */ private File getRecentCharacterXML() { File currentCharactersDir = DirectoryConfig.getInstance() .getCharactersDir(); File recentCharacterXML = new File(currentCharactersDir, RECENT_CAHARCTER_INFO_XML); return recentCharacterXML; } /** * 最後に使用したキャラクターデータのフォルダ名を親ディレクトリからの相対パスとして保存する.
* ただし、書き込み禁止である場合は何もしない.
* * @param characterData * キャラクターデータ * @throws IOException * 書き込みに失敗した場合 */ public boolean saveRecent(CharacterData characterData) throws IOException { URI docBase = null; if (characterData != null) { docBase = characterData.getDocBase(); } String characterDataName = null; if (docBase != null) { File currentCharactersDir = DirectoryConfig.getInstance() .getCharactersDir(); File characterXml = new File(docBase); File characterDir = characterXml.getParentFile(); // "Foo/Bar/character.xml"の、「Foo」の部分を取得する. File baseDir = characterDir.getParentFile(); if (currentCharactersDir.equals(baseDir)) { // "Foo/Bar/character.xml"の「Bar」の部分を取得する. // ※ キャラクターデータの親フォルダ上のフォルダ名だけを保存する.(相対パス) characterDataName = characterDir.getName(); } } Properties props = new Properties(); props.setProperty("lastUseCharacterData", characterDataName == null ? "" : characterDataName); File recentCharacterXML = getRecentCharacterXML(); if (recentCharacterXML.exists() && !recentCharacterXML.canWrite()) { // ファイルが書き込み禁止の場合は何もしない. logger.log(Level.FINE, "recent-character.xml is readonly."); return false; } // ファイルがまだ実在しないか、書き込み可能である場合のみ保存する. OutputStream os = new BufferedOutputStream(new FileOutputStream( recentCharacterXML)); try { String comment = "recent-character: lastModified=" + (new Timestamp(System.currentTimeMillis()).toString()); props.storeToXML(os, comment); } finally { os.close(); } return true; } /** * 親ディレクトリからの相対パスとして記録されている、最後に使用したキャラクターデータのフォルダ名から、 * 最後に使用したキャラクターデータをロードして返す.
* 該当するキャラクターデータが存在しないか、読み込みに失敗した場合は「履歴なし」としてnullを返す.
* * @return キャラクターデータ、もしくはnull */ public CharacterData loadRecent() { File recentCharacterXML = getRecentCharacterXML(); if (recentCharacterXML.exists()) { try { Properties props = new Properties(); InputStream is = new BufferedInputStream(new FileInputStream( recentCharacterXML)); try { props.loadFromXML(is); } finally { is.close(); } String characterDataName = props .getProperty("lastUseCharacterData"); if (characterDataName != null && characterDataName.trim().length() > 0) { // ※ キャラクターデータの親フォルダ上のフォルダ名だけを保存されているので // 相対パスから、character.xmlの絶対パスを求める File currentCharactersDir = DirectoryConfig.getInstance() .getCharactersDir(); File characterDir = new File(currentCharactersDir, characterDataName); File characterXml = new File(characterDir, CharacterDataPersistent.CONFIG_FILE); if (characterXml.exists()) { // character.xmlが存在すれば復元を試行する. CharacterDataPersistent persist = CharacterDataPersistent .getInstance(); return persist.loadProfile(characterXml.toURI()); } } } catch (Exception ex) { // 失敗した場合は最後に使用したデータが存在しないものとみなす. logger.log(Level.WARNING, "recent data loading failed. " + recentCharacterXML, ex); } } // 履歴がない場合、もしくは読み取れなかった場合はnullを返す. return null; } } CharacterManaJ/src/main/java/charactermanaj/model/io/FilePartsDataLoader.java0000644000175000017500000000474213615720000027355 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.File; import java.io.FileFilter; import java.util.HashMap; import java.util.Map; import charactermanaj.graphics.io.FileImageResource; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsFiles; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSpec; import charactermanaj.util.FileNameNormalizer; /** * ディレクトリを指定して、そこからキャラクターのパーツデータをロードするローダー.
* * @author seraphy * */ public class FilePartsDataLoader implements PartsDataLoader { /** * ベースディレクトリ */ private File baseDir; public FilePartsDataLoader(File baseDir) { if (baseDir == null) { throw new IllegalArgumentException(); } this.baseDir = baseDir; } public File getBaseDir() { return baseDir; } public Map load(PartsCategory category) { if (category == null) { throw new IllegalArgumentException(); } // ファイル名をノーマライズする FileNameNormalizer normalizer = FileNameNormalizer.getDefault(); final Map images = new HashMap(); for (Layer layer : category.getLayers()) { File searchDir = new File(baseDir, layer.getDir()); if (!searchDir.exists() || !searchDir.isDirectory()) { continue; } File[] imgFiles = searchDir.listFiles(new FileFilter() { public boolean accept(File pathname) { if (pathname.isFile()) { String lcfname = pathname.getName().toLowerCase(); return lcfname.endsWith(".png"); } return false; } }); if (imgFiles == null) { imgFiles = new File[0]; } for (File imgFile : imgFiles) { String partsName = normalizer.normalize(imgFile.getName()); int extpos = partsName.lastIndexOf("."); if (extpos > 0) { partsName = partsName.substring(0, extpos); } PartsIdentifier partsIdentifier = new PartsIdentifier(category, partsName, partsName); PartsSpec partsSpec = images.get(partsIdentifier); if (partsSpec == null) { partsSpec = createPartsSpec(partsIdentifier); images.put(partsIdentifier, partsSpec); } PartsFiles parts = partsSpec.getPartsFiles(); parts.put(layer, new FileImageResource(imgFile)); } } return images; } protected PartsSpec createPartsSpec(PartsIdentifier partsIdentifier) { return new PartsSpec(partsIdentifier); } } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsImageDirectoryWatchEvent.java0000644000175000017500000000065613615720000031455 0ustar paulliupaulliupackage charactermanaj.model.io; import java.util.EventObject; import charactermanaj.model.CharacterData; public class PartsImageDirectoryWatchEvent extends EventObject { private static final long serialVersionUID = 8090309437115158185L; public PartsImageDirectoryWatchEvent(CharacterData characterData) { super(characterData); } public CharacterData getCharacterData() { return (CharacterData) getSource(); } } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsDataLoader.java0000644000175000017500000000111413615720000026543 0ustar paulliupaulliupackage charactermanaj.model.io; import java.util.Map; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSpec; /** * パーツデータのロードを行うインターフェイス * @author seraphy */ public interface PartsDataLoader { /** * カテゴリを指定してパーツデータをロードする.
* 該当がない場合は空が返される * @param category カテゴリ * @return パーツデータのマップ */ Map load(PartsCategory category); } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataPersistent.java0000644000175000017500000007566613615720000030327 0ustar paulliupaulliupackage charactermanaj.model.io; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.graphics.io.FileImageResource; import charactermanaj.graphics.io.ImageLoader; import charactermanaj.graphics.io.ImageSaveHelper; import charactermanaj.graphics.io.LoadedImage; import charactermanaj.model.AppConfig; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion; import charactermanaj.util.DirectoryConfig; import charactermanaj.util.FileNameNormalizer; import charactermanaj.util.FileUserData; import charactermanaj.util.FileUtilities; import charactermanaj.util.UserData; public class CharacterDataPersistent { /** * キャラクター定義ファイル名 */ public static final String CONFIG_FILE = "character.xml"; /** * キャラクターなんとか機用のiniファイル名 */ public static final String COMPATIBLE_CONFIG_NAME = "character.ini"; /** * お気に入りのファイル名 */ private static final String FAVORITES_FILE_NAME = "favorites.xml"; /** * サンプルイメージファイル名 */ private static final String SAMPLE_IMAGE_FILENAME = "preview.png"; /** * ロガー */ private static final Logger logger = Logger .getLogger(CharacterDataPersistent.class.getName()); /** * キャラクターデータを格納したXMLのリーダー */ private final CharacterDataXMLReader characterDataXmlReader = new CharacterDataXMLReader(); /** * キャラクターデータを格納したXMLのライタ */ private final CharacterDataXMLWriter characterDataXmlWriter = new CharacterDataXMLWriter(); /** * プロファイルの列挙時のエラーハンドラ.
* * @author seraphy */ public interface ProfileListErrorHandler { /** * エラーが発生したことを通知される * * @param baseDir * 読み込み対象のXMLのファイル * @param ex * 例外 */ void occureException(File baseDir, Throwable ex); } /** * プライベートコンストラクタ.
* シングルトン実装であるため、一度だけ呼び出される. */ private CharacterDataPersistent() { super(); } /** * シングルトン */ private static final CharacterDataPersistent singleton = new CharacterDataPersistent(); /** * インスタンスを取得する * * @return インスタンス */ public static CharacterDataPersistent getInstance() { return singleton; } /** * キャラクターデータを新規に保存する.
* REVがnullである場合は保存に先立ってランダムにREVが設定される.
* 保存先ディレクトリはユーザー固有のキャラクターデータ保存先のディレクトリにキャラクター定義のIDを基本とする ディレクトリを作成して保存される.
* ただし、そのディレクトリがすでに存在する場合はランダムな名前で決定される.
* 実際のxmlの保存先にあわせてDocBaseが設定されて返される.
* * @param characterData * キャラクターデータ (IDは設定済みであること.それ以外はvalid, editableであること。) * @throws IOException * 失敗 */ public void createProfile(CharacterData characterData) throws IOException { if (characterData == null) { throw new IllegalArgumentException(); } String id = characterData.getId(); if (id == null || id.trim().length() == 0) { throw new IOException("missing character-id:" + characterData); } // ユーザー個別のキャラクターデータ保存先ディレクトリを取得 DirectoryConfig dirConfig = DirectoryConfig.getInstance(); File charactersDir = dirConfig.getCharactersDir(); if (!charactersDir.exists()) { if (!charactersDir.mkdirs()) { throw new IOException("can't create the characters directory. " + charactersDir); } } if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "check characters-dir: " + charactersDir + ": exists=" + charactersDir.exists()); } // 新規に保存先ディレクトリを作成. // 同じ名前のディレクトリがある場合は日付+連番をつけて衝突を回避する File baseDir = null; String suffix = ""; String name = characterData.getName(); if (name == null) { // 表示名が定義されていなければIDで代用する.(IDは必須) name = characterData.getId(); } for (int retry = 0;; retry++) { baseDir = new File(charactersDir, name + suffix); if (!baseDir.exists()) { break; } if (retry > 100) { throw new IOException("character directory conflict.:" + baseDir); } // 衝突回避の末尾文字を設定 suffix = generateSuffix(retry); } if (!baseDir.exists()) { if (!baseDir.mkdirs()) { throw new IOException("can't create directory. " + baseDir); } logger.log(Level.INFO, "create character-dir: " + baseDir); } // 保存先を確認 File characterPropXML = new File(baseDir, CONFIG_FILE); if (characterPropXML.exists() && !characterPropXML.isFile()) { throw new IOException(CONFIG_FILE + " is not a regular file.:" + characterPropXML); } if (characterPropXML.exists() && !characterPropXML.canWrite()) { throw new IOException("character.xml is not writable.:" + characterPropXML); } // DocBaseを実際の保存先に更新 URI docBase = characterPropXML.toURI(); characterData.setDocBase(docBase); // リビジョンが指定されてなければ新規にリビジョンを割り当てる。 if (characterData.getRev() == null) { characterData.setRev(generateRev()); } // 保存する. saveCharacterDataToXML(characterData); // ディレクトリを準備する preparePartsDir(characterData); } /** * {@link #createProfile(CharacterData)}に加えて、同時にカスタムレイヤーパターンを登録します。 * @param characterData キャラクターデータ * @param customLayerPatterns カスタムレイヤーパターン、なければnull可 * @throws IOException 失敗 */ public void createProfile(CharacterData characterData, Map> customLayerPatterns) throws IOException { // キャラクターデータの登録 createProfile(characterData); // カスタムレイヤーパターンの登録 if (characterData.isEnableCustonLayerPattern() && customLayerPatterns != null) { CustomLayerOrderPersist persist = CustomLayerOrderPersist.newInstance(characterData); persist.save(customLayerPatterns); } } /** * リビジョンを生成して返す. * * @return リビジョン用文字列 */ public String generateRev() { SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd_HHmmss"); return fmt.format(new Date()); } /** * 衝突回避用の末尾文字を生成する. * * @param retryCount * リトライ回数 * @return 末尾文字 */ protected String generateSuffix(int retryCount) { SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd_HHmmss"); String suffix = "_" + fmt.format(new Date()); if (retryCount > 0) { suffix = suffix + "_" + retryCount; } return suffix; } /** * キャラクターデータを更新する. * * @param characterData * キャラクターデータ(有効かつ編集可能であること) * @throws IOException * 失敗 */ public void updateProfile(CharacterData characterData) throws IOException { if (characterData == null) { throw new IllegalArgumentException(); } characterData.checkWritable(); if (!characterData.isValid()) { throw new IOException("invalid profile: " + characterData); } // 保存する saveCharacterDataToXML(characterData); // ディレクトリを準備する preparePartsDir(characterData); } /** * キャラクターデータのパーツイメージを保存するディレクトリを準備する * * @param characterData * キャラクターデータ * @param baseDir * ベースディレクトリ * @throws IOException * 失敗 */ protected void preparePartsDir(CharacterData characterData) throws IOException { if (characterData == null) { throw new IllegalArgumentException(); } characterData.checkWritable(); if (!characterData.isValid()) { throw new IOException("invalid profile: " + characterData); } URI docBase = characterData.getDocBase(); if (!"file".equals(docBase.getScheme())) { throw new IOException("ファイル以外はサポートしていません。:" + docBase); } File docBaseFile = new File(docBase); File baseDir = docBaseFile.getParentFile(); if (!baseDir.exists()) { if (!baseDir.mkdirs()) { throw new IOException("can't create directory. " + baseDir); } } for (PartsCategory partsCategory : characterData.getPartsCategories()) { for (Layer layer : partsCategory.getLayers()) { File layerDir = new File(baseDir, layer.getDir()); if (!layerDir.exists()) { if (!layerDir.mkdirs()) { throw new IOException("can't create directory. " + layerDir); } } } } } /** * キャラクターデータを読み込んだ場合に返されるコールバック */ public interface ListProfileCallback { /** * キャラクターデータを読み込んだ場合.
* 戻り値がfalseの場合は読み込みを以降の読み込みを中断します.
* (ただし、すでに読み込み開始している分については中断されません.) * * @param characterData * @return 継続する場合はtrue、中止する場合はfalse */ boolean receiveCharacterData(CharacterData characterData); /** * キャラクターデータの読み込みに失敗した場合.
* 戻り値がfalseの場合は読み込みを以降の読み込みを中断します.
* (ただし、すでに読み込み開始している分については中断されません.) * * @param dir * 読み込み対象ディレクトリ * @param ex * 例外の内容 * @return 継続する場合はtrue、中止する場合はfalse */ boolean occureException(File dir, Exception ex); } /** * 指定したディレクトリの下のサブフォルダに、character.iniがある場合は、 * キャラクターなんとか機のディレクトリとして、標準のcharacter.xmlを生成する.
* ただし、書き込み禁止の場合は何もしない.
* すでにcharacter.xmlがある場合も何もしない.
* * @param dataDir * キャラクターなんとか機のデータディレクトリ */ public void convertCharacterNantokaIniToXml(File dataDir) { if (dataDir == null || !dataDir.isDirectory() || !dataDir.canWrite()) { return; } File[] dirs = dataDir.listFiles(); if (dirs == null) { dirs = new File[0]; } for (File dir : dirs) { if (!dir.isDirectory()) { continue; } File characterXmlFile = new File(dir, CharacterDataPersistent.CONFIG_FILE); if (characterXmlFile.exists()) { // すでにキャラクター定義XMLが存在する場合はスキップする. continue; } File characterIniFile = new File(dir, CharacterDataPersistent.COMPATIBLE_CONFIG_NAME); if (characterIniFile.exists() && characterIniFile.canWrite() && dir.canWrite()) { // character.iniが存在し、書き込み可能であれば、それをcharacter.xmlに変換する. // eye_colorフォルダがあるか? File eyeColorFolder = new File(dir, "eye_color"); boolean hasEyeColorFolder = eyeColorFolder.exists() && eyeColorFolder.isDirectory(); DefaultCharacterDataVersion version; if (hasEyeColorFolder) { // eye_colorフォルダがあればver3形式とみなす. version = DefaultCharacterDataVersion.V3; } else { version = DefaultCharacterDataVersion.V2; } // readmeがあるか? String readme = null; File readmeFile = new File(dir, "readme.txt"); if (readmeFile.exists() && readmeFile.canRead()) { try { readme = TextReadHelper .readTextTryEncoding(new FileInputStream( readmeFile)); } catch (IOException ex) { logger.log(Level.WARNING, ex.toString(), ex); } } try { convertFromCharacterIni(characterIniFile, characterXmlFile, version, readme); } catch (Exception ex) { logger.log(Level.WARNING, "character.xmlの生成に失敗しました。:" + characterXmlFile, ex); } } } } /** * キャラクターデータを非同期に読み込む.
* 読み込み完了したものが随時、コールバックに渡される. * * @param callback * @return すべての読み込みが完了したか判定し待機することのできるFuture */ public Future listProfileAsync(final ListProfileCallback callback) { if (callback == null) { throw new IllegalArgumentException(); } // キャラクターデータが格納されている親ディレクトリ DirectoryConfig dirConfig = DirectoryConfig.getInstance(); File baseDir = dirConfig.getCharactersDir(); // キャラクターなんとか機のcharacter.iniがあれば、character.xmlに変換する. convertCharacterNantokaIniToXml(baseDir); // ファイル名をノーマライズする FileNameNormalizer normalizer = FileNameNormalizer.getDefault(); // キャンセルしたことを示すフラグ final AtomicBoolean cancelled = new AtomicBoolean(false); // 有効な論理CPU(CORE)数のスレッドで同時実行させる int numOfProcessors = Runtime.getRuntime().availableProcessors(); final ExecutorService executorSrv = Executors .newFixedThreadPool(numOfProcessors); try { // キャラクターデータ対象ディレクトリを列挙し、並列に解析する File[] dirs = baseDir.listFiles(new FileFilter() { public boolean accept(File pathname) { boolean accept = pathname.isDirectory() && !pathname.getName().startsWith("."); if (accept) { File configFile = new File(pathname, CONFIG_FILE); accept = configFile.exists() && configFile.canRead(); } return accept; } }); if (dirs == null) { dirs = new File[0]; } for (File dir : dirs) { String path = normalizer.normalize(dir.getPath()); final File normDir = new File(path); executorSrv.submit(new Runnable() { public void run() { boolean terminate = false; File characterDataXml = new File(normDir, CONFIG_FILE); if (characterDataXml.exists()) { try { File docBaseFile = new File(normDir, CONFIG_FILE); URI docBase = docBaseFile.toURI(); CharacterData characterData = loadProfile(docBase); terminate = !callback .receiveCharacterData(characterData); } catch (Exception ex) { terminate = !callback.occureException(normDir, ex); } } if (terminate) { // 中止が指示されたらスレッドプールを終了する logger.log(Level.FINE, "shutdownNow listProfile"); executorSrv.shutdownNow(); cancelled.set(true); } } }); } } finally { // タスクの登録を受付終了し、現在のすべてのタスクが完了したらスレッドは終了する. executorSrv.shutdown(); } // タスクの終了を待機できる疑似フューチャーを作成する. Future awaiter = new Future() { public boolean cancel(boolean mayInterruptIfRunning) { if (executorSrv.isTerminated()) { // すでに停止完了済み return false; } executorSrv.shutdownNow(); cancelled.set(true); return true; } public boolean isCancelled() { return cancelled.get(); } public boolean isDone() { return executorSrv.isTerminated(); } public Object get() throws InterruptedException, ExecutionException { try { return get(300, TimeUnit.SECONDS); } catch (TimeoutException ex) { throw new ExecutionException(ex); } } public Object get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { executorSrv.shutdown(); if (!executorSrv.isTerminated()) { executorSrv.awaitTermination(timeout, unit); } return null; } }; return awaiter; } /** * プロファイルを列挙する.
* 読み取りに失敗した場合はエラーハンドラに通知されるが例外は返されない.
* 一つも正常なプロファイルがない場合は空のリストが返される.
* エラーハンドラの通知は非同期に行われる. * * @param errorHandler * エラーハンドラ、不要ならばnull * @return プロファイルのリスト(表示名順)、もしくは空 */ public List listProfiles( final ProfileListErrorHandler errorHandler) { final List profiles = new ArrayList(); Future awaiter = listProfileAsync(new ListProfileCallback() { public boolean receiveCharacterData(CharacterData characterData) { synchronized (profiles) { profiles.add(characterData); } return true; } public boolean occureException(File dir, Exception ex) { if (errorHandler != null) { errorHandler.occureException(dir, ex); } return true; } }); // すべてのキャラクターデータが読み込まれるまで待機する. try { awaiter.get(); } catch (Exception ex) { logger.log(Level.WARNING, "listProfile abort.", ex); } Collections.sort(profiles, CharacterData.SORT_DISPLAYNAME); return Collections.unmodifiableList(profiles); } public CharacterData loadProfile(URI docBase) throws IOException { if (docBase == null) { throw new IllegalArgumentException(); } // XMLから読み取る CharacterData characterData = characterDataXmlReader .loadCharacterDataFromXML(docBase); return characterData; } protected void saveCharacterDataToXML(CharacterData characterData) throws IOException { if (characterData == null) { throw new IllegalArgumentException(); } characterData.checkWritable(); if (!characterData.isValid()) { throw new IOException("invalid profile: " + characterData); } URI docBase = characterData.getDocBase(); if (!"file".equals(docBase.getScheme())) { throw new IOException("ファイル以外はサポートしていません: " + docBase); } // XML形式で保存(メモリへ) ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { characterDataXmlWriter.writeXMLCharacterData(characterData, bos); } finally { bos.close(); } // 成功したら実際にファイルに出力 File characterPropXML = new File(docBase); File baseDir = characterPropXML.getParentFile(); if (!baseDir.exists()) { if (!baseDir.mkdirs()) { logger.log(Level.WARNING, "can't create directory. " + baseDir); } } FileOutputStream fos = new FileOutputStream(characterPropXML); try { fos.write(bos.toByteArray()); } finally { fos.close(); } } public void saveFavorites(CharacterData characterData) throws IOException { if (characterData == null) { throw new IllegalArgumentException(); } // xml形式 UserData favoritesData = getFavoritesUserData(characterData); OutputStream os = favoritesData.getOutputStream(); try { characterDataXmlWriter.saveFavorites(characterData, os); } finally { os.close(); } } private UserData getFavoritesUserData(CharacterData characterData) { if (characterData == null) { throw new IllegalArgumentException(); } // xml形式の場合、キャラクターディレクトリ上に設定する. URI docBase = characterData.getDocBase(); File characterDir = new File(docBase).getParentFile(); return new FileUserData(new File(characterDir, FAVORITES_FILE_NAME)); } /** * お気に入り(Favorites)を読み込む.
* 現在のパーツセットに追加する形で読み込まれ、同じパーツセットIDのものは上書きされます.
* * @param characterData * キャラクターデータ * @throws IOException * 読み込みに失敗した場合 */ public void loadFavorites(CharacterData characterData) throws IOException { if (characterData == null) { throw new IllegalArgumentException(); } UserData favoritesXml = getFavoritesUserData(characterData); if (favoritesXml.exists() && favoritesXml.length() > 0) { InputStream is = favoritesXml.openStream(); try { characterDataXmlReader.loadPartsSet(characterData, is); } finally { is.close(); } } } /** * 既存のキャラクター定義を削除する.
* 有効なdocBaseがあり、そのxmlファイルが存在するものについて、削除を行う.
* forceRemoveがtrueでない場合はキャラクター定義 character.xmlファイルの拡張子を * リネームすることでキャラクター定義として認識させなくする.
* forceRevmoeがtrueの場合は実際にファイルを削除する.
* character.xml、favorites、workingsetのキャッシュも削除される.
* * @param cd * キャラクター定義 * @param forceRemove * ファイルを削除する場合はtrue、リネームして無効にするだけならfalse * @throws IOException * 削除またはリネームできなかった場合 */ public void remove(CharacterData cd, boolean forceRemove) throws IOException { if (cd == null || cd.getDocBase() == null) { throw new IllegalArgumentException(); } URI docBase = cd.getDocBase(); File xmlFile = new File(docBase); if (!xmlFile.exists() || !xmlFile.isFile()) { // すでに存在しない場合 return; } // ディレクトリ File baseDir = xmlFile.getParentFile(); if (!baseDir.exists()) { // すでに存在しない場合 return; } // ver0.998以降では、お気に入りはキャラクターデータと同一ディレクトリにあるので、別個の処理は不要 // // favories.xmlの削除 // if (forceRemove) { // UserData[] favoritesDatas = new UserData[] { getFavoritesUserData(cd) }; // for (UserData favoriteData : favoritesDatas) { // if (favoriteData != null && favoriteData.exists()) { // logger.log(Level.INFO, "remove file: " + favoriteData); // favoriteData.delete(); // } // } // } // ワーキングセットの削除 // XML形式でのワーキングセットの保存 WorkingSetPersist workingSetPersist = WorkingSetPersist.getInstance(); workingSetPersist.removeWorkingSet(cd); if (!forceRemove) { // 論理削除 logicalDelete(xmlFile); } else { // 完全に削除する(物理削除) try { FileUtilities.delete(baseDir); } catch (IOException ex) { // 削除に失敗した場合は論理削除を試行する logicalDelete(xmlFile); throw ex; // 論理削除でエラーがでない場合は物理削除エラーをそのまま返す } } } /** * キャラクターデータxmlファイルをリネームすることで論理的に削除する。 * 削除されたキャラクターデータであることを示すためにフォルダ名も.deletedとづける * @param xmlFile * @throws IOException */ private void logicalDelete(File xmlFile) throws IOException { File baseDir = xmlFile.getParentFile(); // xmlファイルの拡張子を変更することでキャラクター定義として認識させない. // (削除に失敗するケースに備えて先にリネームする.) String suffix = "." + System.currentTimeMillis() + ".deleted"; File bakFile = new File(xmlFile.getPath() + suffix); if (!xmlFile.renameTo(bakFile)) { throw new IOException("can not rename configuration file.:" + xmlFile); } // 削除されたディレクトリであることを識別できるようにディレクトリ名も変更する. File parentBak = new File(baseDir.getPath() + suffix); if (!baseDir.renameTo(parentBak)) { throw new IOException("can't rename directory. " + baseDir); } } /** * サンプルピクチャを読み込む.
* ピクチャが存在しなければnullを返す. キャラクター定義がValidでない場合は常にnullを返す.
* * @param characterData * キャラクター定義、null不可 * @param loader * イメージのローダー、null不可 * @return ピクチャのイメージ、もしくはnull * @throws IOException * ピクチャの読み取りに失敗した場合 */ public BufferedImage loadSamplePicture(CharacterData characterData, ImageLoader loader) throws IOException { if (characterData == null || loader == null) { throw new IllegalArgumentException(); } if (!characterData.isValid()) { return null; } File sampleImageFile = getSamplePictureFile(characterData); if (sampleImageFile != null && sampleImageFile.exists()) { LoadedImage loadedImage = loader.load(new FileImageResource( sampleImageFile)); return loadedImage.getImage(); } return null; } /** * キャラクターのサンプルピクチャが登録可能であるか?
* キャラクターデータが有効であり、且つ、ファイルの書き込みが可能であればtrueを返す.
* キャラクターデータがnullもしくは無効であるか、ファイルプロトコルでないか、ファイルが書き込み禁止であればfalseょ返す.
* * @param characterData * キャラクターデータ * @return 書き込み可能であればtrue、そうでなければfalse */ public boolean canSaveSamplePicture(CharacterData characterData) { if (characterData == null || !characterData.isValid()) { return false; } File sampleImageFile = getSamplePictureFile(characterData); if (sampleImageFile != null) { if (sampleImageFile.exists() && sampleImageFile.canWrite()) { return true; } if (!sampleImageFile.exists()) { File parentDir = sampleImageFile.getParentFile(); if (parentDir != null) { return parentDir.canWrite(); } } } return false; } /** * サンプルピクチャとして認識されるファイル位置を返す.
* ファイルが実在するかは問わない.
* DocBaseが未設定であるか、ファィルプロトコルとして返せない場合はnullを返す.
* * @param characterData * キャラクター定義 * @return サンプルピクチャの保存先のファイル位置、もしくはnull */ protected File getSamplePictureFile(CharacterData characterData) { if (characterData == null) { throw new IllegalArgumentException(); } URI docBase = characterData.getDocBase(); if (docBase != null && "file".endsWith(docBase.getScheme())) { File docBaseFile = new File(docBase); return new File(docBaseFile.getParentFile(), SAMPLE_IMAGE_FILENAME); } return null; } /** * サンプルピクチャを保存する. * * @param characterData * キャラクターデータ * @param samplePicture * サンプルピクチャ * @throws IOException * 保存に失敗した場合 */ public void saveSamplePicture(CharacterData characterData, BufferedImage samplePicture) throws IOException { if (!canSaveSamplePicture(characterData)) { throw new IOException("can not write a sample picture.:" + characterData); } File sampleImageFile = getSamplePictureFile(characterData); // canSaveSamplePictureで書き込み先検証済み if (samplePicture != null) { // 登録または更新 // pngで保存するので背景色は透過になるが、一応、コードとしては入れておく。 AppConfig appConfig = AppConfig.getInstance(); Color sampleImageBgColor = appConfig.getSampleImageBgColor(); ImageSaveHelper imageSaveHelper = new ImageSaveHelper(); imageSaveHelper.savePicture(samplePicture, sampleImageBgColor, sampleImageFile, null); } else { // 削除 if (sampleImageFile.exists()) { FileUtilities.delete(sampleImageFile); } } } /** * character.iniを読み取り、character.xmlを生成します.
* すでにcharacter.xmlがある場合は上書きされます.
* 途中でエラーが発生した場合はcharacter.xmlは削除されます.
* * @param characterIniFile * 読み取るcharatcer.iniファイル * @param characterXmlFile * 書き込まれるcharacter.xmlファイル * @param version * デフォルトキャラクターセットのバージョン * @param description * 説明 * @throws IOException * 失敗した場合 */ public void convertFromCharacterIni(File characterIniFile, File characterXmlFile, DefaultCharacterDataVersion version, String description) throws IOException { if (characterIniFile == null || characterXmlFile == null || version == null) { throw new IllegalArgumentException(); } // character.iniから、character.xmlの内容を構築する. FileInputStream is = new FileInputStream(characterIniFile); CharacterData characterData; try { CharacterDataIniReader iniReader = new CharacterDataIniReader(); characterData = iniReader.readCharacterDataFromIni(is, version); } finally { is.close(); } // 説明文を設定する if (description != null) { characterData.setDescription(description); } // docBase URI docBase = characterXmlFile.toURI(); characterData.setDocBase(docBase); // character.xmlの書き込み boolean succeeded = false; try { FileOutputStream outstm = new FileOutputStream(characterXmlFile); try { characterDataXmlWriter.writeXMLCharacterData(characterData, outstm); } finally { outstm.close(); } succeeded = true; } finally { if (!succeeded) { // 途中で失敗した場合は生成ファイルを削除しておく. try { if (characterXmlFile.exists()) { characterXmlFile.delete(); } } catch (Exception ex) { logger.log(Level.WARNING, "ファイルの削除に失敗しました。:" + characterXmlFile, ex); } } } } } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsImageDirectoryWatchAgent.java0000644000175000017500000000226113615720000031424 0ustar paulliupaulliupackage charactermanaj.model.io; import charactermanaj.model.CharacterData; /** * パーツファイルのディレクトリの監視を行うエージェント.
* @author seraphy */ public interface PartsImageDirectoryWatchAgent { /** * 監視対象としているキャラクター定義を取得する. * @return キャラクター定義 */ CharacterData getCharcterData(); /** * 監視を接続する.
* 接続されるまでディレクトリの監視状態は通知されない.
*/ void connect(); /** * 監視を切断する.
* 接続されるまでディレクトリの監視状態は通知されない.
*/ void disconnect(); /** * 監視対象ディレクトリの監視を停止する.
*/ void suspend(); /** * 監視対象ディレクトリの監視再開を許可する.
*/ void resume(); /** * イベントリスナを登録する * @param l リスナ */ void addPartsImageDirectoryWatchListener(PartsImageDirectoryWatchListener l); /** * イベントリスナを登録解除する * @param l リスナ */ void removePartsImageDirectoryWatchListener(PartsImageDirectoryWatchListener l); } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsImageDirectoryWatchListener.java0000644000175000017500000000023213615720000032147 0ustar paulliupaulliupackage charactermanaj.model.io; public interface PartsImageDirectoryWatchListener { void detectPartsImageChange(PartsImageDirectoryWatchEvent e); } CharacterManaJ/src/main/java/charactermanaj/model/io/TextReadHelper.java0000644000175000017500000000527313615720000026423 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * テキストの読み込みヘルパー.
* * @author seraphy */ public final class TextReadHelper { /** * プライベートコンストラクタ */ private TextReadHelper() { super(); } /** * 入力ストリームを指定して、テキストファイルを読み込みます.
* 入力ストリームは内部で閉じられます.
* * @param is * 入力ストリーム * @return テキスト、もしくはnull * @throws IOException * 失敗 */ public static String readTextTryEncoding(InputStream is) throws IOException { if (is == null) { return null; } // 一旦メモリに取り込む ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { int ch; while ((ch = is.read()) != -1) { bos.write((byte) ch); } } finally { is.close(); } byte[] buf = bos.toByteArray(); String enc = null; if (buf.length >= 2) { // Windowsのメモ帳はUTF-16にBOMをつけるので、これで判定できる。 // 本アプリケーションのエクスポート時もUTF-16LEのBOM付きで出力する。 // 一般的なエディタはUTF-16BEにはBOMをつけないので、事前に判定することはできない。 if ((buf[0] & 0xff) == 0xff && (buf[1] & 0xff) == 0xfe) { enc = "UTF-16LE"; } else if ((buf[0] & 0xff) == 0xfe && (buf[1] & 0xff) == 0xff) { enc = "UTF-16BE"; } } if (enc == null && buf.length >= 3) { if ((buf[0] & 0xff) == 0xef && (buf[1] & 0xff) == 0xbb && (buf[1] & 0xff) == 0xbf) { // Windowsのメモ帳などはUTF-8にBOMをつけるので、これで判定できる。 // 一般的なエディタではUTF-8のBOMはつけないのでUTF-8であるかどうかを事前判定することはできない。 enc = "UTF-8"; } } if (enc == null) { // BOMがない場合はMS932かEUC_JPのいずれかであろう、と仮定する。 enc = "JISAutoDetect"; // SJIS/EUC_JPの自動判定 } // 文字列として変換 StringBuilder str = new StringBuilder(); InputStreamReader rd = new InputStreamReader(new ByteArrayInputStream( buf), enc); try { int ch; while ((ch = rd.read()) != -1) { str.append((char) ch); } } finally { rd.close(); } // 改行コードをプラットフォーム固有のものに変換 String line = str.toString(); line = line.replace("\r\n", "\n"); line = line.replace("\r", "\n"); line = line.replace("\n", System.getProperty("line.separator")); return line; } } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataJarArchiveFile.java0000644000175000017500000000230613615720000030762 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class CharacterDataJarArchiveFile extends AbstractCharacterDataArchiveFile { protected JarFile jarFile; protected class JarFileContent implements FileContent { private JarEntry entry; protected JarFileContent(JarEntry entry) { this.entry = entry; } @Override public String getEntryName() { return entry.getName(); } @Override public long lastModified() { return entry.getTime(); } @Override public long length() { return entry.getSize(); } @Override public InputStream openStream() throws IOException { return jarFile.getInputStream(entry); } } public void close() throws IOException { jarFile.close(); } public CharacterDataJarArchiveFile(File file) throws IOException { super(file); jarFile = new JarFile(file); load(); } private void load() { Enumeration enm = jarFile.entries(); while (enm.hasMoreElements()) { JarEntry entry = enm.nextElement(); addEntry(new JarFileContent(entry)); } searchRootPrefix(); } } CharacterManaJ/src/main/java/charactermanaj/model/io/CustomLayerOrderXMLReader.java0000644000175000017500000000720713615720000030511 0ustar paulliupaulliupackage charactermanaj.model.io; import static charactermanaj.util.XMLUtilities.*; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TreeMap; import org.w3c.dom.Document; import org.w3c.dom.Element; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsCategoryResolver; public class CustomLayerOrderXMLReader { private PartsCategoryResolver categoryResolver; public CustomLayerOrderXMLReader(PartsCategoryResolver categoryResolver) { if (categoryResolver == null) { throw new NullPointerException("categories is required."); } this.categoryResolver = categoryResolver; } public Map> read(InputStream is) throws IOException { if (is == null) { throw new IllegalArgumentException(); } Map> map = new TreeMap>(); Document doc = loadDocument(is); String lang = Locale.getDefault().getLanguage(); try { Element docElm = doc.getDocumentElement(); if (!"custom-layer-orders".equals(docElm.getNodeName())) { throw new IOException("Invalid Format."); } String ns = docElm.getNamespaceURI(); if (ns == null || !ns.startsWith(CustomLayerOrderXMLWriter.NS)) { throw new IOException("unsupported xml format"); } String docVersion = docElm.getAttribute("version").trim(); if (!CustomLayerOrderXMLWriter.VERSION_SIG_1_0.equals(docVersion)) { throw new IOException("unsupported version: " + docVersion); } for (Element elmPattern : getChildElements(docElm, "pattern")) { String id = elmPattern.getAttribute("id"); String patternName = elmPattern.getAttribute("name"); if (id == null || id.length() == 0) { id = patternName; // idが省略されている場合はnameで代用する } Map localizedNames = new HashMap(); localizedNames.put(CustomLayerOrderKey.DEFAULT_NAME_KEY, patternName); for (Element elmLocalizedName : getChildElements(elmPattern, "localized-name")) { String localizedLang = elmLocalizedName.getAttribute("lang"); String localizedName = elmLocalizedName.getAttribute("name"); localizedNames.put(localizedLang, localizedName); if (lang.equals(localizedLang)) { // langが一致すれば、その名前を優先する patternName = localizedName; } } List orders = new ArrayList(); for (Element elmMapping : getChildElements(elmPattern, "mapping")) { String categoryId = elmMapping.getAttribute("category"); String layerId = elmMapping.getAttribute("layer"); float layerOrder = Float.parseFloat(elmMapping.getAttribute("order")); PartsCategory category = categoryResolver.getPartsCategory(categoryId); if (category != null) { Layer layer = category.getLayer(layerId); if (layer != null) { CustomLayerOrder order = new CustomLayerOrder(); order.setCategory(category); order.setLayer(layer); order.setLayerOrder(layerOrder); orders.add(order); } } } CustomLayerOrderKey patternKey = new CustomLayerOrderKey(id, patternName, localizedNames); map.put(patternKey, orders); } } catch (RuntimeException ex) { IOException ex2 = new IOException("CustomLayerOrderXML invalid format."); ex2.initCause(ex); throw ex2; } return map; } } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataDirectoryFile.java0000644000175000017500000001062513615720000030713 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.util.Collection; import java.util.Collections; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.model.CharacterData; import charactermanaj.util.FileNameNormalizer; /** * ディレクトリをアーカイブと見立てる * * @author seraphy */ public class CharacterDataDirectoryFile extends AbstractCharacterDataArchiveFile { /** * ロガー */ private static final Logger logger = Logger.getLogger(CharacterDataDirectoryFile.class.getName()); /** * 対象ディレクトリ */ protected File baseDir; /** * ディレクトリ上のファイルコンテンツ * * @author seraphy */ protected static class DirFileContent implements FileContent { /** * ディレクトリ名 + ファイル名からなるエントリ名.
* エントリ名の区切り文字は常に「/」とする.
*/ private String entryName; /** * 実際のファイルへのパス */ private File entry; protected DirFileContent(File entry, String entryName) { this.entry = entry; this.entryName = entryName; } public String getEntryName() { return entryName; } public long lastModified() { return entry.lastModified(); } @Override public long length() { return entry.length(); } public InputStream openStream() throws IOException { return new FileInputStream(entry); } } /** * アーカイブファイルをベースとしたURIを返す.
* * @param name * コンテンツ名 * @return URI * @throws IOException * URIを生成できない場合 */ protected URI getContentURI(String name) throws IOException { return new File(baseDir, name).toURI(); } @Override public Collection getPartsImageContents( CharacterData characterData, boolean newly) { if (!newly && isOverlapped(characterData)) { // 既存のプロファイルへのインポートで指定されたインポートもととなるディレクトリが // 既存のプロファイルのディレクトリと重なっていれば自分自身のインポートであるとして // 空のパーツリストを返す. return Collections.emptyList(); } return super.getPartsImageContents(characterData, newly); } /** * このディレクトリに対してターゲットプロファイルのディレクトリがかぶっているか? つまり、ターゲット自身のディレクトリをソースとしていないか? * * @param characterData * ソースプロファイル * @return 被っている場合はtrue、被っていない場合はfalse */ protected boolean isOverlapped(CharacterData characterData) { if (characterData == null) { return false; } URI docBase = characterData.getDocBase(); if (docBase == null || !"file".equals(docBase.getScheme())) { return false; } String folderPlace = File.separator; String basePath = new File(docBase).getParent() + folderPlace; String sourcePath = baseDir.getPath() + folderPlace; // インポートもとディレクトリがインポート先のキャラクター定義のディレクトリを含むか? boolean result = basePath.contains(sourcePath); logger.log(Level.FINE, "checkOverlapped: " + basePath + " * " + sourcePath + " :" + result); return result; } public void close() throws IOException { // ディレクトリなのでクローズ処理は必要ない. } public CharacterDataDirectoryFile(File file) throws IOException { super(file); baseDir = file; load(baseDir, ""); searchRootPrefix(); } private void load(File dir, String prefix) { if (!dir.exists() || !dir.isDirectory()) { // ディレクトリでなければ何もせず戻る return; } // ファイル名をノーマライズする FileNameNormalizer normalizer = FileNameNormalizer.getDefault(); File[] files = dir.listFiles(); if (files != null) { for (File file : files) { String name = normalizer.normalize(file.getName()); String entryName = prefix + name; if (file.isDirectory()) { // エントリ名の区切り文字は常に「/」とする. (ZIP/JARのentry互換のため) load(file, entryName + "/"); } else { addEntry(new DirFileContent(file, entryName)); } } } } } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataZipArchiveFile.java0000644000175000017500000000262213615720000031011 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import charactermanaj.model.AppConfig; public class CharacterDataZipArchiveFile extends AbstractCharacterDataArchiveFile { protected ZipFile zipFile; protected class ZipFileContent implements FileContent { private ZipEntry entry; protected ZipFileContent(ZipEntry entry) { this.entry = entry; } @Override public String getEntryName() { return entry.getName(); } @Override public long lastModified() { return entry.getTime(); } @Override public long length() { return entry.getSize(); } @Override public InputStream openStream() throws IOException { return zipFile.getInputStream(entry); } } public void close() throws IOException { zipFile.close(); } public CharacterDataZipArchiveFile(File file) throws IOException { super(file); AppConfig appConfig = AppConfig.getInstance(); String encoding = appConfig.getZipNameEncoding(); zipFile = new ZipFile(file, encoding); load(); } private void load() { @SuppressWarnings("unchecked") Enumeration enm = zipFile.getEntries(); while (enm.hasMoreElements()) { ZipEntry entry = enm.nextElement(); addEntry(new ZipFileContent(entry)); } searchRootPrefix(); } } CharacterManaJ/src/main/java/charactermanaj/model/io/WorkingSetXMLReader.java0000644000175000017500000002362713615720000027346 0ustar paulliupaulliupackage charactermanaj.model.io; import static charactermanaj.util.XMLUtilities.*; import java.awt.Color; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.logging.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import charactermanaj.model.IndependentPartsColorInfo; import charactermanaj.model.IndependentPartsSetInfo; import charactermanaj.model.IndependentWorkingSet; import charactermanaj.ui.model.WallpaperInfo; import charactermanaj.ui.model.WallpaperInfo.WallpaperResourceType; import charactermanaj.util.XMLUtilities; /** * ワーキングセットのXMLデータを読み込む.
* * @author seraphy */ public class WorkingSetXMLReader { /** * ロガー */ private static final Logger logger = Logger .getLogger(WorkingSetXMLReader.class.getCanonicalName()); /** * WorkingSetのXMLファイルの名前空間 */ private static final String NS_PREFIX = "http://charactermanaj.sourceforge.jp/schema/charactermanaj-workingset"; /** * XMLコンテンツに対する入力ストリームからワーキングセットを取り出す.
* * @param is * 入力ストリーム * @throws IOException * 読み取りに失敗 */ public IndependentWorkingSet loadWorkingSet(InputStream is) throws IOException { if (is == null) { throw new IllegalArgumentException(); } IndependentWorkingSet workingSet = new IndependentWorkingSet(); CharacterDataXMLReader characterDataXMLReader = new CharacterDataXMLReader(); Document doc = XMLUtilities.loadDocument(is); String lang = Locale.getDefault().getLanguage(); try { Element docElm = doc.getDocumentElement(); if (!"character-workingset".equals(docElm.getNodeName())) { throw new IOException("Invalid Format."); } String ns = docElm.getNamespaceURI(); if (ns == null || !ns.startsWith(NS_PREFIX)) { throw new IOException("unsupported xml format"); } String docVersion = docElm.getAttribute("version").trim(); if (!"1.0".equals(docVersion)) { throw new IOException("unsupported version: " + docVersion); } // docbase String characterDocBase = docElm.getAttribute("characterDocBase") .trim(); try { workingSet.setCharacterDocBase(new URI(characterDocBase)); } catch (URISyntaxException ex) { IOException ex2 = new IOException("WorkingSet invalid format."); ex2.initCause(ex); throw ex2; } // character data signature String characterDataSig = getElementText(docElm, "characterDataSig"); workingSet.setCharacterDataSig(characterDataSig); // キーはカテゴリid, 値は、パーツ名をキーとしレイヤーごとのカラー情報のリストを値とするマップ HashMap>> partsColorMap = new HashMap>>(); for (Element partsColorInfoMapElm : getChildElements(docElm, "partsColorInfoMap")) { // カラー定義マップを読み込む HashMap> colorMap = new HashMap>(); for (Element colorsElm : getChildElements(partsColorInfoMapElm, "colors")) { for (Element colorElm : getChildElements(colorsElm, "color")) { String colorId = colorElm.getAttribute("id"); List colorInfoList = characterDataXMLReader .readPartsColor(colorElm); colorMap.put(colorId, colorInfoList); } } // パーツごとのカラー情報を読み込む for (Element partsListElm : getChildElements( partsColorInfoMapElm, "partsList")) { for (Element partsElm : getChildElements(partsListElm, "partsIdentifier")) { String categoryId = partsElm.getAttribute("categoryId"); String name = partsElm.getAttribute("name"); String colorId = partsElm.getAttribute("colorId"); Map> partsMap = partsColorMap .get(categoryId); if (partsMap == null) { partsMap = new HashMap>(); partsColorMap.put(categoryId, partsMap); } List colorInfo = colorMap .get(colorId); if (colorInfo == null) { logger.warning("undefined colorId:" + colorId); } else { partsMap.put(name, colorInfo); } } } } workingSet.setPartsColorMap(partsColorMap); // 最後に使用した保存先ディレクトリ String lastUsedSaveDirStr = getElementText(docElm, "lastUsedSaveDir"); if (lastUsedSaveDirStr != null && lastUsedSaveDirStr.trim().length() > 0) { workingSet.setLastUsedSaveDir(new File(lastUsedSaveDirStr .trim())); } // 最後に使用したエクスポート先ディレクトリ String lastUsedExportDirStr = getElementText(docElm, "lastUsedExportDir"); if (lastUsedExportDirStr != null && lastUsedExportDirStr.trim().length() > 0) { workingSet.setLastUsedExportDir(new File(lastUsedExportDirStr .trim())); } // 壁紙情報 WallpaperInfo wallpaperInfo = null; for (Element wallpaperElm : getChildElements(docElm, "wallpaperInfo")) { wallpaperInfo = readWallpaperInfo(wallpaperElm); break; // wallpaperInfoは最初の一要素しか想定しない. } workingSet.setWallpaperInfo(wallpaperInfo); // ズーム等情報 for (Element viewElm : getChildElements(docElm, "view")) { String strZoomFactor = viewElm.getAttribute("zoomFactor"); String strCenterX = viewElm.getAttribute("x"); String strCenterY = viewElm.getAttribute("y"); if (strZoomFactor != null && strZoomFactor.trim().length() > 0) { double zoomFactor = Double.parseDouble(strZoomFactor.trim()); workingSet.setZoomFactor(zoomFactor); } if (strCenterX != null && strCenterY != null && strCenterX.trim().length() > 0 && strCenterY.trim().length() > 0) { double centerX = Double.parseDouble(strCenterX.trim()); double centerY = Double.parseDouble(strCenterY.trim()); Point centerPt = new Point((int) centerX, (int) centerY); workingSet.setViewPosition(centerPt); } for (Element windowElm : getChildElements(viewElm, "window")) { String x = windowElm.getAttribute("x"); String y = windowElm.getAttribute("y"); String width = windowElm.getAttribute("width"); String height = windowElm.getAttribute("height"); if (x != null && y != null && width != null && height != null && x.trim().length() > 0 && y.trim().length() > 0 && width.trim().length() > 0 && height.trim().length() > 0) { Point pt = new Point(Integer.parseInt(x.trim()), Integer.parseInt(y.trim())); Dimension dim = new Dimension(Integer.parseInt(width.trim()), Integer.parseInt(height.trim())); Rectangle windowRect = new Rectangle(pt, dim); workingSet.setWindowRect(windowRect); } break; // windowElmは最初の一要素しか想定しない. } break; // viewElmは最初の一要素しか想定しない. } // 現在のパーツ情報 for (Element currentPartsSetsElm : getChildElements(docElm, "currentPartsSet")) { for (Element presetElm : getChildElements(currentPartsSetsElm, "preset")) { IndependentPartsSetInfo currentPartsSet = characterDataXMLReader .loadPartsSet(presetElm, lang); workingSet.setCurrentPartsSet(currentPartsSet); break; // 最初の一要素のみ } break; // 最初の一要素のみ } // 最後に使ったお気に入り情報 for (Element lastUsePresetPartsElm : getChildElements(docElm, "lastUsePresetParts")) { for (Element presetElm : getChildElements( lastUsePresetPartsElm, "preset")) { IndependentPartsSetInfo lastUsePresetParts = characterDataXMLReader .loadPartsSet(presetElm, lang); workingSet.setLastUsePresetParts(lastUsePresetParts); break; // 最初の一要素のみ } break; // 最初の一要素のみ } // ダウンロード不要フラグ boolean noNeedDataDownload = false; for (Element noNeedDataDownloadElm : getChildElements(docElm, "noNeedDataDownload")) { noNeedDataDownload = Boolean.parseBoolean(noNeedDataDownloadElm.getTextContent()); break; // 最初の一要素のみ } workingSet.setNoNeedDataDownload(noNeedDataDownload); return workingSet; } catch (RuntimeException ex) { IOException ex2 = new IOException("WorkingSet invalid format."); ex2.initCause(ex); throw ex2; } } /** * 壁紙情報を読み込む * * @param elm * 壁紙要素 * @return 壁紙情報、elmがnullの場合はnullを返す. */ private WallpaperInfo readWallpaperInfo(Element elm) { if (elm == null) { return null; } WallpaperInfo wallpaperInfo = new WallpaperInfo(); String typStr = getElementText(elm, "type"); WallpaperResourceType typ = WallpaperResourceType.valueOf(typStr); wallpaperInfo.setType(typ); String res = getElementText(elm, "resource"); if (res != null && res.trim().length() > 0) { wallpaperInfo.setResource(res.trim()); } String fileStr = getElementText(elm, "file"); if (fileStr != null && fileStr.trim().length() > 0) { wallpaperInfo.setFile(new File(fileStr.trim())); } float alpha = 0f; String alphaStr = getElementText(elm, "alpha"); if (alphaStr != null && alphaStr.trim().length() > 0) { alpha = Float.parseFloat(alphaStr); wallpaperInfo.setAlpha(alpha); } String backgroundColorStr = getElementText(elm, "backgroundColor"); if (backgroundColorStr != null && backgroundColorStr.trim().length() > 0) { Color backgroundColor = Color.decode(backgroundColorStr.trim()); wallpaperInfo.setBackgroundColor(backgroundColor); } return wallpaperInfo; } } CharacterManaJ/src/main/java/charactermanaj/model/io/CustomLayerOrderPersist.java0000644000175000017500000001572713615720000030365 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.util.Collections; import java.util.EventListener; import java.util.EventObject; import java.util.List; import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.io.CustomLayerOrderPersist.CustomLayerOrderPersistListener.Change; import charactermanaj.util.FileUserData; import charactermanaj.util.UserData; /** * カスタムレイヤーパターンの読み込みと保存を行う。 */ public abstract class CustomLayerOrderPersist { /** * レイヤーパターンのXMLファイル名 */ public static final String CUSTOM_LAYER_ORDERS_XML_FILE = "customlayerorders.xml"; /** * カスタムレイヤーパターンが変更(保存)されたことを通知するリスナ */ public interface CustomLayerOrderPersistListener extends EventListener { public static class Change extends EventObject { private static final long serialVersionUID = 9176040093651262447L; private Map> customLayerOrderMap; public Change(CharacterData characterData, Map> customLayerOrderMap) { super(characterData); this.customLayerOrderMap = customLayerOrderMap; } @Override public CharacterData getSource() { return (CharacterData) super.getSource(); } public Map> getCustomLayerOrderMap() { return customLayerOrderMap; } } void notifyChangeCustomLayerOrder(Change e); } /** * 対象としているキャラクターデータ */ protected final CharacterData characterData; /** * コンストラクタ * @param characterData */ protected CustomLayerOrderPersist(CharacterData characterData) { if (characterData == null) { throw new NullPointerException(); } this.characterData = characterData; } /** * 対象としているキャラクターデータ * @return */ public CharacterData getCharacterData() { return characterData; } /** * キャラクターデータを指定してインスタンスを構築する * @param characterData * @return */ public static CustomLayerOrderPersist newInstance(CharacterData characterData) { return new CustomLayerOrderXMLPersist(characterData); } /** * カスタムレイヤーパターンが存在するか? * @return 存在する場合はtrue(空の場合でもtrueとなる) */ public abstract boolean exist(); /** * カスタムレイヤーパターンを保存する * @param map * @throws IOException */ public abstract void save(Map> map) throws IOException; /** * カスタムレイヤーパターンをロードする。 * 存在しない場合はnullを返す。 * @return パターン、もしくはnull * @throws IOException */ public abstract Map> load() throws IOException; /** * リスナーのマップ */ private static final Map> listenersMap = new ConcurrentHashMap>(); /** * このキャラクターデータのカスタムレイヤーパターンの保存の通知を受け取るリスナを登録する * @param l */ public void addCustomLayerOrderPersistListener(CustomLayerOrderPersistListener l) { URI uri = characterData.getDocBase(); if (l != null && uri != null) { synchronized (listenersMap) { Queue listeners = listenersMap.get(uri); if (listeners == null) { listeners = new ConcurrentLinkedQueue(); listenersMap.put(uri, listeners); } listeners.add(l); } } } /** * このキャラクターデータのカスタムレイヤーパターンの保存の通知を受け取るリスナを登録解除する * @param l */ public void removeCustomLayerOrderPersistListener(CustomLayerOrderPersistListener l) { URI uri = characterData.getDocBase(); if (l != null && uri != null) { synchronized (listenersMap) { Queue listeners = listenersMap.get(uri); if (listeners != null) { listeners.remove(l); if (listeners.isEmpty()) { // これが最後のリスナであればマップのエントリも消す listenersMap.remove(uri); } } } } } /** * このキャラクターデータのカスタムレイヤーパターンの保存を全てのリスナーに通知する * @param map */ protected void fireEvent(Map> map) { URI uri = characterData.getDocBase(); if (uri != null) { Queue listeners = listenersMap.get(uri); if (listeners != null) { Change e = new Change(characterData, map); for (CustomLayerOrderPersistListener l : listeners) { l.notifyChangeCustomLayerOrder(e); } } } } } /** * カスタムレイヤーパターンをXML形式で保存する実装クラス */ class CustomLayerOrderXMLPersist extends CustomLayerOrderPersist { public CustomLayerOrderXMLPersist(CharacterData characterData) { super(characterData); } /** * 実際のXMLの保存先と関連づけられたユーザーデータ型を返す * @return */ private UserData getCustomLayerOrdersUserData() { // xml形式の場合、キャラクターディレクトリ上に設定する. URI docBase = characterData.getDocBase(); File characterDir = new File(docBase).getParentFile(); return new FileUserData(new File(characterDir, CUSTOM_LAYER_ORDERS_XML_FILE)); } public boolean exist() { return getCustomLayerOrdersUserData().exists(); } @Override public void save(Map> map) throws IOException { if (map == null) { map = Collections.emptyMap(); } UserData xmlData = getCustomLayerOrdersUserData(); OutputStream outstm = xmlData.getOutputStream(); try { CustomLayerOrderXMLWriter xmlWriter = new CustomLayerOrderXMLWriter(); xmlWriter.write(map, outstm); } finally { outstm.close(); } // 変更通知 fireEvent(map); } @Override public Map> load() throws IOException { UserData xmlData = getCustomLayerOrdersUserData(); if (xmlData.exists()) { if (xmlData.length() == 0) { // 空ファイルは空エントリとみなす return Collections.emptyMap(); } // XMLの読み取り InputStream is = xmlData.openStream(); try { CustomLayerOrderXMLReader xmlReader = new CustomLayerOrderXMLReader(characterData); return xmlReader.read(is); } finally { is.close(); } } return null; } } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataFileReaderWriterFactory.java0000644000175000017500000000555513615720000032704 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.File; import java.io.IOException; import java.net.URI; public class CharacterDataFileReaderWriterFactory { private static final CharacterDataFileReaderWriterFactory singleton = new CharacterDataFileReaderWriterFactory(); private CharacterDataFileReaderWriterFactory() { super(); } public static CharacterDataFileReaderWriterFactory getInstance() { return singleton; } /** * ファイルの拡張子に応じてzip/cmj形式でのライターを構築して帰します.
* 拡張子がjarとcmjは同じ意味で、ともにjarファイル形式となります.
* zip/cmj/jar以外の拡張子はIOExceptionとなります.
* @param outfile 出力先ファイル名 * @return ライター * @throws IOException 該当するライターがみつからない場合 */ public CharacterDataWriter createWriter(File outfile) throws IOException { if (outfile == null) { throw new IllegalArgumentException(); } String name = outfile.getName().toLowerCase(); if (name.endsWith(".jar") || name.endsWith(".cmj")) { return new CharacterDataJarFileWriter(outfile); } else if (name.endsWith(".zip")) { return new CharacterDataZipFileWriter(outfile); } throw new IOException("unsupported file type: " + name); } public CharacterDataArchiveFile openArchive(URI archiveFile) throws IOException { if (archiveFile == null) { throw new IllegalArgumentException(); } if ("file".equals(archiveFile.getScheme())) { // ファイルまたはディレクトリの場合 File file = new File(archiveFile); return openArchive(file); } // file以外は現在のところサポートしない。 throw new UnsupportedOperationException(); } public CharacterDataArchiveFile openArchive(File archiveFile) throws IOException { if (archiveFile == null) { throw new IllegalArgumentException(); } if (archiveFile.exists() && archiveFile.isDirectory()) { // ディレクトリの場合 return new CharacterDataDirectoryFile(archiveFile); } // zipまたはcmjファイルの場合 String name = archiveFile.getName().toLowerCase(); if (name.endsWith(".jar") || name.endsWith(".cmj")) { return new CharacterDataJarArchiveFile(archiveFile); } else if (name.endsWith(".zip")) { return new CharacterDataZipArchiveFile(archiveFile); } throw new IOException("unsupported file type: " + name); } /** * ファイルの拡張子からアーカイブとしてサポートされているタイプであるか判断する * @param fileName ファイル名 * @return サポートされている場合はtrue、そうでなければfalse */ public boolean isSupportedFile(String fileName) { if (fileName != null) { fileName = fileName.toLowerCase(); return fileName.endsWith(".zip") || fileName.endsWith(".jar") || fileName.endsWith(".cmj"); } return false; } } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsDataLoaderFactory.java0000644000175000017500000000235513615720000030103 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.File; import java.io.IOException; import java.net.URI; /** * パーツデータのローダーファクトリ.
* @author seraphy * */ public class PartsDataLoaderFactory { private static final PartsDataLoaderFactory singleton = new PartsDataLoaderFactory(); private PartsDataLoaderFactory() { super(); } public static PartsDataLoaderFactory getInstance() { return singleton; } /** * 設定ファイル(character.xml)のDocBaseをもとに、キャラクターデータのローダーを作成する.
* 現在のところ、fileプロトコルのみサポートする.
* @param docBase 設定ファイルのURI * @return ローダー * @throws IOException URIに対応するローダーが存在しないか、構築できない場合 */ public PartsDataLoader createPartsLoader(URI docBase) throws IOException { if (docBase == null) { throw new IllegalArgumentException(); } if (!"file".equals(docBase.getScheme())) { throw new IOException("ファイル以外はサポートしていません。:" + docBase); } File docbaseFile = new File(docBase); File baseDir = docbaseFile.getParentFile(); return new FilePartsDataLoader(baseDir); } } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsImageDirectoryWatchAgentThread.java0000644000175000017500000002506613615720000032564 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.File; import java.io.FileFilter; import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.IdentityHashMap; import java.util.LinkedList; import java.util.logging.Level; import java.util.logging.Logger; import java.util.zip.CRC32; import charactermanaj.model.AppConfig; import charactermanaj.model.CharacterData; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; public class PartsImageDirectoryWatchAgentThread implements Runnable { /** * ロガー */ private static final Logger logger = Logger.getLogger(PartsImageDirectoryWatchAgent.class.getName()); private final CharacterData characterData; private final File baseDir; /** * リスナーとサスペンド要求マップのロックオブジェクト */ private final Object lockListeners = new Object(); /** * 監視を通知されるリスナー. */ private LinkedList listeners = new LinkedList(); /** * サスペンド要求のマップ. */ private IdentityHashMap suspendStateMap = new IdentityHashMap(); /** * ロックオブジェクト */ private final Object lock = new Object(); /** * 停止フラグ */ private volatile boolean stopFlag; /** * 監視インターバル */ private int dirWatchInterval; /** * スレッド、生成されていなければnull */ private Thread thread; /** * 監視結果1、まだ監視されていなければnull */ private volatile Long signature; /** * 監視結果2、検出されたアイテムの個数 */ private volatile int itemCount; /** * 監視結果3、検出されたアイテムの最終更新日。ただし未来の日付は除外する。 */ private volatile long maxLastModified; public PartsImageDirectoryWatchAgentThread(CharacterData characterData) { if (characterData == null) { throw new IllegalArgumentException(); } URI docBase = characterData.getDocBase(); File baseDir = null; if (docBase != null && "file".equals(docBase.getScheme())) { baseDir = new File(docBase).getParentFile(); } this.characterData = characterData; this.baseDir = baseDir; this.dirWatchInterval = AppConfig.getInstance().getDirWatchInterval(); } public CharacterData getCharcterData() { return characterData; } /** * 監視を開始する.
* 一定時間待機後、フォルダを監視し、前回監視結果と比較して変更があれば通知を行う.
* その処理をstop指示が来るまで繰り返す.
* 開始しても、まず指定時間待機するため、すぐにはディレクトリの走査は行わない.
* 且つ、初回監視結果は変更通知されないため、二回以上走査しないかぎり通知は発生しない.
* これは意図したものである.
* 明示的に初回監視を行うには明示的に{@link #reset()}を呼び出す.
*/ private void start() { logger.log(Level.FINE, "watchAgent request start. " + this); synchronized (lock) { if (thread != null && thread.isAlive()) { // すでに開始済みであれば何もしない. return; } // 書き込み禁止キャラクター定義に対する監視を無効とするか? AppConfig appConfig = AppConfig.getInstance(); if (appConfig.isDisableWatchDirIfNotWritable()) { try { if (baseDir == null || !baseDir.exists() || !baseDir.isDirectory() || !baseDir.canWrite()) { logger.log(Level.INFO, "does not monitor the directory because it is not writable." + baseDir); return; } URI docBase = characterData.getDocBase(); if (docBase != null) { File docBaseFile = new File(docBase); if (!docBaseFile.exists() || !docBaseFile.canWrite()) { logger.log(Level.INFO, "does not monitor the directory because the character.xml is not writable." + characterData); return; } } } catch (Exception ex) { logger.log(Level.WARNING, "watch-dir start failed. " + characterData, ex); return; } } // スレッドを開始する. stopFlag = false; thread = new Thread(this); thread.setDaemon(true); thread.start(); } } /** * 監視を停止する.
* * @return 停止した場合はtrue、すでに停止していたか開始されていない場合はfalse */ private boolean stop() { logger.log(Level.FINE, "watchAgent request stop. " + this); boolean stopped = false; synchronized (lock) { // スレッドが生きていれば停止する. if (thread != null && thread.isAlive()) { stopFlag = true; thread.interrupt(); try { thread.join(10000); // 10Secs } catch (InterruptedException ex) { logger.log(Level.FINE, "stop request interrupted.", ex); // 抜ける } stopped = true; } // スレッドは停止されていると見なす. thread = null; } return stopped; } /** * スレッドの停止フラグがたてられるまで、一定時間待機と監視とを永久に繰り返す.
* ただし、スレッド自身はデーモンとして動作させているので他の非デーモンスレッドが存在しなくなれば停止する.
*/ public void run() { logger.log(Level.FINE, "watch-dir thead started. " + this); // 初回スキャンは無視するためリセット状態とする. this.signature = null; // スキャンループ while (!stopFlag) { try { Thread.sleep(dirWatchInterval); watch(new Runnable() { public void run() { fireWatchEvent(); } }); } catch (InterruptedException ex) { logger.log(Level.FINE, "watch-dir thead interrupted."); // 何もしない } catch (Exception ex) { logger.log(Level.SEVERE, "PartsImageDirectoryWatchAgent failed.", ex); // 何もしない. } } logger.log(Level.FINE, "watch-dir thead stopped. " + this); } /** * 監視を行う.
* 停止フラグが設定されるか、割り込みされた場合は処理を中断してInterruptedException例外を返して終了する.
* * @param notifier * 通知するためのオブジェクト * @throws InterruptedException * 割り込みされた場合 */ protected void watch(Runnable notifier) throws InterruptedException { if (baseDir == null || !baseDir.exists() || !baseDir.isDirectory()) { return; } int itemCount = 0; long maxLastModified = 0; long now = System.currentTimeMillis() + dirWatchInterval; CRC32 crc = new CRC32(); for (PartsCategory partsCategory : characterData.getPartsCategories()) { for (Layer layer : partsCategory.getLayers()) { File watchDir = new File(baseDir, layer.getDir()); ArrayList files = new ArrayList(); if (watchDir.exists() && watchDir.isDirectory()) { File[] list = watchDir.listFiles(new FileFilter() { public boolean accept(File pathname) { return pathname.isFile() && pathname.getName().toLowerCase().endsWith(".png"); } }); if (list == null) { list = new File[0]; } for (File file : list) { if (Thread.interrupted() || stopFlag) { throw new InterruptedException(); } itemCount++; long lastModified = file.lastModified(); if (lastModified <= now) { // 未来の日付は除外する. // 未来の日付のファイルが一つでもあると他のファイルが実際に更新されても判定できなくなるため。 maxLastModified = Math.max(maxLastModified, lastModified); } files.add(file.getName() + ":" + lastModified); }; Collections.sort(files); } for (String file : files) { // 同一動作環境上でのファイル名の比較に使うためなので // 文字コードは現在のデフォルトで良い。 crc.update(file.getBytes()); } } } long signature = crc.getValue(); if (this.signature != null) { // 初回は無視される. if (this.signature.longValue() != signature || this.itemCount != itemCount || this.maxLastModified != maxLastModified) { // ハッシュ値が異なるか、アイテム数が異なるか、最大の最終更新日が異なる場合、変更されたとみなす. if (notifier != null) { notifier.run(); } } } this.signature = Long.valueOf(signature); this.maxLastModified = maxLastModified; this.itemCount = itemCount; } /** * イベントリスナを登録する * * @param l * リスナ */ public void addPartsImageDirectoryWatchListener(PartsImageDirectoryWatchListener l) { if (l != null) { synchronized (lockListeners) { listeners.add(l); } changeSuspendState(); } } /** * イベントリスナを登録解除する * * @param l * リスナ */ public void removePartsImageDirectoryWatchListener(PartsImageDirectoryWatchListener l) { if (l != null) { synchronized (lockListeners) { listeners.remove(l); suspendStateMap.remove(l); } changeSuspendState(); } } public void suspend(PartsImageDirectoryWatchListener l) { if (l != null) { synchronized (lockListeners) { Integer cnt = suspendStateMap.get(l); if (cnt == null) { cnt = Integer.valueOf(1); } else { cnt = cnt + 1; } suspendStateMap.put(l, cnt); } changeSuspendState(); } } public void resume(PartsImageDirectoryWatchListener l) { if (l != null) { synchronized (lockListeners) { Integer cnt = suspendStateMap.get(l); if (cnt != null) { cnt = cnt - 1; if (cnt > 0) { suspendStateMap.put(l, cnt); } else { suspendStateMap.remove(l); } } } changeSuspendState(); } } protected void changeSuspendState() { boolean active; synchronized (lockListeners) { // リスナが接続されており、且つ、サスペンド要求が一つもない場合はスレッド実行可 active = !listeners.isEmpty() && suspendStateMap.isEmpty(); } if (active) { start(); } else { stop(); } } /** * イベントを通知する. */ protected void fireWatchEvent() { PartsImageDirectoryWatchListener[] listeners; synchronized (this.listeners) { listeners = this.listeners.toArray(new PartsImageDirectoryWatchListener[this.listeners.size()]); } PartsImageDirectoryWatchEvent e = new PartsImageDirectoryWatchEvent(characterData); for (PartsImageDirectoryWatchListener listener : listeners) { listener.detectPartsImageChange(e); } } } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataDefaultProvider.java0000644000175000017500000004063713615720000031254 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference; import java.net.URI; import java.net.URL; import java.sql.Timestamp; import java.util.Enumeration; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.PartsCategoryResolver; import charactermanaj.util.ConfigurationDirUtilities; import charactermanaj.util.LocalizedResourcePropertyLoader; import charactermanaj.util.ResourceLoader; import charactermanaj.util.SetupLocalization; /** * デフォルトキャラクターセットのプロバイダ * * @author seraphy */ public class CharacterDataDefaultProvider { /** * リソースに格納されているデフォルトのキャラクター定義のリソースパスまでのプレフィックス.
*/ public static final String DEFAULT_CHARACTER_PREFIX = "template/"; /** * テンプレートをリストしているXML形式のプロパティファイル名 */ public static final String TEMPLATE_LIST_XML = "characterDataTemplates"; /** * デフォルトのキャラクターセット名(ver2) */ public static final String DEFAULT_CHARACTER_NAME_V2 = "character2.xml"; /** * デフォルトのキャラクターセット名(ver3) */ public static final String DEFAULT_CHARACTER_NAME_V3 = "character3.xml"; /** * カスタムレイヤー順定義ファイルの末尾名。 * リソース名「xxxxx.xml」に対して「xxxxx-customlayerorders.xml」のようになる。 */ private static final String CUSTOM_LAYER_ORDERS_SUFFIX = "-customlayerorders.xml"; /** * リソースローダー * ローカルファイルをクラスパスより優先する。 */ private final ResourceLoader resourceLoader = new ResourceLoader(true); /** * ロガー */ private static final Logger logger = Logger .getLogger(CharacterDataDefaultProvider.class.getName()); public enum DefaultCharacterDataVersion { V2(DEFAULT_CHARACTER_NAME_V2), V3(DEFAULT_CHARACTER_NAME_V3); DefaultCharacterDataVersion(String reskey) { this.reskey = reskey; } private final String reskey; private transient SoftReference cache; public String getResourceName() { return reskey; } public CharacterData create(CharacterDataDefaultProvider prov) { if (prov == null) { throw new IllegalArgumentException(); } try { CharacterData cd = (cache != null) ? cache.get() : null; if (cd == null) { cd = prov.loadPredefinedCharacterData(reskey); cache = new SoftReference(cd); } return cd.duplicateBasicInfo(); } catch (IOException ex) { throw new RuntimeException( "can not create the default profile from application's resource", ex); } } public Map> createCustomLayerOrderMap( PartsCategoryResolver partsCategoryResolver, CharacterDataDefaultProvider prov) { if (prov == null) { throw new IllegalArgumentException(); } try { return prov.loadPredefinedCustomLayerOrder(partsCategoryResolver, reskey); } catch (IOException ex) { throw new RuntimeException( "can not create the default profile from application's resource", ex); } } } /** * デフォルトのキャラクター定義を生成して返す.
* 一度生成された場合はキャッシュされる.
* 生成されたキャラクター定義のdocBaseはnullであるため、docBaseをセットすること.
* * @param version * デフォルトキャラクターセットのバージョン * @return キャラクター定義 */ public synchronized CharacterData createDefaultCharacterData( DefaultCharacterDataVersion version) { if (version == null) { throw new IllegalArgumentException(); } return version.create(this); } /** * デフォルトのキャラクター定義に付随するカスタムレイヤーパターンを生成して返す。 * * 引数のpartsCategoryResolverは、カスタムレイヤーパターンはパーツカテゴリインスタンスを保持するため、 * そのキャラクターデータと同じインスタンスのパーツカテゴリインスタンスを取得できるようにするためのものである。 * @param partsCategoryResolver カテゴリIDでカテゴリを索引するリゾルバ * @param version バージョン * @return 付随するカスタムレイヤーパターン、なければnull */ public Map> createDefaultCustomLayerOrderMap( PartsCategoryResolver partsCategoryResolver, DefaultCharacterDataVersion version) { if (partsCategoryResolver == null) { throw new NullPointerException("categories is required."); } if (version == null) { throw new NullPointerException("version is required."); } return version.createCustomLayerOrderMap(partsCategoryResolver, this); } /** * キャラクターデータのxmlファイル名をキーとし、表示名を値とするマップ.
* 表示順序でアクセス可能.
* * @return 順序付マップ(キーはテンプレートxmlのファイル名、値は表示名) */ public Map getCharacterDataTemplates() { // キャラクターデータのxmlファイル名をキーとし、表示名を値とするマップ final LinkedHashMap templateNameMap = new LinkedHashMap(); // テンプレートの定義プロパティのロード // テンプレートリソースは実行中に増減する可能性があるため、共有キャッシュには入れない. LocalizedResourcePropertyLoader propLoader = LocalizedResourcePropertyLoader.getNonCachedInstance(); Properties props = propLoader.getLocalizedProperties(DEFAULT_CHARACTER_PREFIX + TEMPLATE_LIST_XML, null); // 順序優先のキーに、テンプレート名がカンマ区切りになっているので、 // このキーにあるものを先に順番に登録する String strOrders = props.getProperty("displayOrder"); if (strOrders != null) { for (String templateFileName : strOrders.split(",")) { templateFileName = templateFileName.trim(); String displayName = props.getProperty(templateFileName); if (displayName != null && displayName.trim().length() > 0) { String resKey = DEFAULT_CHARACTER_PREFIX + templateFileName; if (getResource(resKey) != null) { // 現存するテンプレートのみ登録 templateNameMap.put(templateFileName, displayName); } } } } // 順序で指定されていないアイテムの追加 Enumeration enm = props.propertyNames(); while (enm.hasMoreElements()) { String templateFileName = (String) enm.nextElement(); if (!templateNameMap.containsKey(templateFileName)) { if (templateFileName.endsWith(".xml")) { String displayName = props.getProperty(templateFileName); String resKey = DEFAULT_CHARACTER_PREFIX + templateFileName; if (getResource(resKey) != null) { // 現存するテンプレートのみ登録 templateNameMap.put(templateFileName, displayName); } } } } // ローカルフォルダにある未登録のxmlファイルもテンプレート一覧に加える // (ただし、テンプレートリストプロパティ、カスタムレイヤーパターン定義を除く) try { File templDir = getUserTemplateDir(); if (templDir.exists() && templDir.isDirectory()) { File[] files = templDir.listFiles(new java.io.FileFilter() { public boolean accept(File pathname) { String name = pathname.getName(); if (templateNameMap.containsKey(name)) { // すでに登録済みなのでスキップする. return false; } if (name.startsWith(TEMPLATE_LIST_XML)) { // テンプレートリストプロパティファイルは除外する. return false; } if (name.endsWith(CUSTOM_LAYER_ORDERS_SUFFIX)) { // カスタムレイヤーパターン定義ファイルは除外する. return false; } return pathname.isFile() && name.endsWith(".xml"); } }); if (files == null) { files = new File[0]; } CharacterDataPersistent persist = CharacterDataPersistent .getInstance(); for (File file : files) { try { URI docBase = file.toURI(); CharacterData cd = persist.loadProfile(docBase); if (cd != null && cd.isValid()) { String name = file.getName(); templateNameMap.put(name, cd.getName()); } } catch (IOException ex) { logger.log(Level.WARNING, "failed to read templatedir." + file, ex); } } } } catch (IOException ex) { // ディレクトリの一覧取得に失敗しても無視する. logger.log(Level.FINE, "failed to read templatedir.", ex); } return templateNameMap; } /** * XMLリソースファイルから、定義済みのキャラクターデータを生成して返す.
* (現在のロケールの言語に対応するデータを取得し、なければ最初の言語で代替する.)
* 生成されたキャラクター定義のdocBaseはnullであるため、使用する場合はdocBaseをセットすること.
* 都度、XMLファイルから読み込まれる.
* * @return デフォルトキャラクターデータ * @throws IOException * 失敗 */ public CharacterData loadPredefinedCharacterData(String name) throws IOException { CharacterData cd; String resKey = DEFAULT_CHARACTER_PREFIX + name; URL predefinedCharacter = getResource(resKey); if (predefinedCharacter == null) { throw new FileNotFoundException(resKey); } InputStream is = predefinedCharacter.openStream(); try { logger.log(Level.INFO, "load a predefined characterdata. resKey=" + resKey); CharacterDataXMLReader characterDataXmlReader = new CharacterDataXMLReader(); cd = characterDataXmlReader.loadCharacterDataFromXML(is, null); } finally { is.close(); } return cd; } /** * XMLリソースファイルから、定義済みのカスタムレイヤーパターンを生成して返す。 * 指定されたリソース名に対して「-customlayerorders.xml」のような末尾に変えたリソースで検索される。 * 定義がない場合はnullを返す。 * @param partsCategoryResolver * @param name リソース名 * @return * @throws IOException */ public Map> loadPredefinedCustomLayerOrder( PartsCategoryResolver partsCategoryResolver, String name) throws IOException { // キャラクター定義xmlへのリソース名から、カスタムレイヤー定義のリソース名を組み立てる int pt = name.lastIndexOf("."); String nameBody = name.substring(0, pt); String customLayerMappingXml = nameBody + CUSTOM_LAYER_ORDERS_SUFFIX; String resKey = DEFAULT_CHARACTER_PREFIX + customLayerMappingXml; URL predefinedCharacter = getResource(resKey); if (predefinedCharacter == null) { // リソースがない return null; } InputStream is = predefinedCharacter.openStream(); try { logger.log(Level.INFO, "load a predefined custom layer orders. resKey=" + resKey); CustomLayerOrderXMLReader xmlReader = new CustomLayerOrderXMLReader(partsCategoryResolver); return xmlReader.read(is); } finally { is.close(); } } /** * リソースを取得する.
* * @param resKey * リソースキー * @return リソース、なければnull */ protected URL getResource(String resKey) { return resourceLoader.getResource(resKey); } /** * ユーザー定義のカスタマイズ用のテンプレートディレクトリを取得する.
* (ディレクトリが実在しない場合もありえる) * * @return テンプレートディレクトリ */ public File getUserTemplateDir() throws IOException { File baseDir = ConfigurationDirUtilities.getUserDataDir(); SetupLocalization setup = new SetupLocalization(baseDir); File resourceDir = setup.getResourceDir(); return new File(resourceDir, DEFAULT_CHARACTER_PREFIX); } /** * "characterDataTemplates*.xml"のファイルは管理ファイルのため、
* ユーザによる書き込みは禁止とする.
* * @param name * @return 書き込み可能であるか? */ public boolean canFileSave(String name) { if (name.trim().startsWith("characterDataTemplates")) { return false; } return true; } /** * 指定したキャラクターデータをテンプレートとして保存する.
* * @param name * 保存するテンプレートファイル名 * @param cd * キャラクターデータ * @param localizedName * 表示名 * @param customLayerPattern * カスタムレイヤーパターン、なければnull * @throws IOException */ public void saveTemplate(String name, CharacterData cd, String localizedName, Map> customLayerPatterns) throws IOException { if (name == null || !canFileSave(name)) { throw new IllegalArgumentException(); } // テンプレートファイル位置の準備 // (ディレクトリが存在しない場合は作成する) File templDir = getUserTemplateDir(); templDir.mkdirs(); File templFile = new File(templDir, name); // キャラクターデータをXML形式でテンプレートファイルへ保存 CharacterDataXMLWriter characterDataXmlWriter = new CharacterDataXMLWriter(); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(templFile)); try { // パーツセットなしの状態とし、名前をローカライズ名に設定する. CharacterData templCd = cd.duplicateBasicInfo(false); templCd.setName(localizedName); characterDataXmlWriter.writeXMLCharacterData(templCd, bos); } finally { bos.close(); } // カスタムレイヤーパターンを保存する if (customLayerPatterns != null && cd.isEnableCustonLayerPattern()) { // 拡張子を取り除いた名前を取得する int pt = name.lastIndexOf("."); String nameBody = (pt > 0) ? name.substring(0, pt) : name; // カスタムレイヤーパターンとして識別される末尾文字列を付与する File templCustomLayerFile = new File(templDir, nameBody + CUSTOM_LAYER_ORDERS_SUFFIX); // カスタムレイヤーパターンXMLファイルを作成する CustomLayerOrderXMLWriter xmlWriter = new CustomLayerOrderXMLWriter(); BufferedOutputStream bos2 = new BufferedOutputStream(new FileOutputStream(templCustomLayerFile)); try { xmlWriter.write(customLayerPatterns, bos2); } finally { bos2.close(); } } // ユーザー定義テンプレートのプロパティファイルをロードする Properties userTemplDefProp = loadUserDefineTemplateDef(); // テンプレート一覧の更新 userTemplDefProp.put(name, localizedName); saveUserDefineTemplateDef(userTemplDefProp); } private File getUserTemplateDefPropertyFile() throws IOException { File templDir = getUserTemplateDir(); return new File(templDir, TEMPLATE_LIST_XML + ".xml"); } private Properties loadUserDefineTemplateDef() throws IOException { File userTemplDefPropFile = getUserTemplateDefPropertyFile(); Properties userTemplDefProp = new Properties(); if (userTemplDefPropFile.exists() && userTemplDefPropFile.length() > 0) { InputStream is = new BufferedInputStream(new FileInputStream(userTemplDefPropFile)); try { userTemplDefProp.loadFromXML(is); } finally { is.close(); } } return userTemplDefProp; } private void saveUserDefineTemplateDef(Properties userTemplDefProp) throws IOException { if (userTemplDefProp == null) { userTemplDefProp = new Properties(); } File userTemplDefPropFile = getUserTemplateDefPropertyFile(); // テンプレート一覧の保存 BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(userTemplDefPropFile)); try { userTemplDefProp.storeToXML(fos, new Timestamp(System.currentTimeMillis()).toString()); } finally { fos.close(); } } } CharacterManaJ/src/main/java/charactermanaj/model/io/ExportInfoKeys.java0000644000175000017500000000052113615720000026463 0ustar paulliupaulliupackage charactermanaj.model.io; public interface ExportInfoKeys { String EXPORT_PRESETS = "EXPORT_PRESETS"; String EXPORT_SAMPLE_PICTURE = "EXPORT_SAMPLE_PICTURE"; String EXPORT_CHARACTER_DATA = "EXPORT_CHARACTER_DATA"; String EXPORT_PARTS_IMAGES = "EXPORT_PARTS_IMAGES"; String EXPORT_TIMESTAMP = "EXPORT_TIMESTAMP"; } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsImageCollectionParser.java0000644000175000017500000000770613615720000030773 0ustar paulliupaulliupackage charactermanaj.model.io; import java.util.List; import java.util.Map; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.graphics.io.ImageResource; import charactermanaj.model.ColorInfo; import charactermanaj.model.Layer; import charactermanaj.model.LayerOrderMapper; import charactermanaj.model.PartsColorInfo; import charactermanaj.model.PartsFiles; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.model.PartsSpec; import charactermanaj.model.PartsSpecResolver; /** * パーツセットから複合画像イメージを生成するために必要なイメージリソースを抽出する. * @author seraphy * */ public class PartsImageCollectionParser { /** * 抽出された複合画像イメージの個々のイメージソースと、カラー情報を受け取るハンドラ.
* @author seraphy */ public interface PartsImageCollectionHandler { /** * 個々のイメージリソースとカラー情報を受け取るハンドラ.
* * @param partsIdentifier 対象のパーツ識別子 * @param layer パーツのレイヤー * @param layerOrder レイヤーの補正済み重ね順序 * @param imageResource パーツのレイヤーの画像リソース * @param param カラー情報、設定されていない場合はnull */ void detectImageSource(PartsIdentifier partsIdentifier, Layer layer, float layerOrder, ImageResource imageResource, ColorConvertParameter param); } /** * パーツ設定を解決するためのインターフェイス */ protected PartsSpecResolver partsSpecResolver; /** * パーツ設定のリゾルバを指定して構築する * @param partsSpecResolver パーツ設定のリゾルバ */ public PartsImageCollectionParser(PartsSpecResolver partsSpecResolver) { if (partsSpecResolver == null) { throw new IllegalArgumentException("resolver is null"); } this.partsSpecResolver = partsSpecResolver; } public PartsSpecResolver getPartsSpecResolver() { return this.partsSpecResolver; } /** * パーツセットを指定して複合画像を生成するために必要なイメージソースおよびカラー設定を解決する.
* protectedなので派生クラスで呼び出すか、publicに昇格させる.
* @param partsSet パーツセット * @param layerOrderMapper レイヤーの補正済み順序を取得するためのマッパー、nullの場合は既定 * @param handler 抽出された複合画像イメージの個々のイメージソースと、カラー情報を受け取るハンドラ */ public void parse(PartsSet partsSet, LayerOrderMapper layerOrderMapper, PartsImageCollectionHandler handler) { if (handler == null) { throw new IllegalArgumentException("handler is null"); } if (partsSet == null) { throw new IllegalArgumentException("PartsSet is null"); } for (List partsIdentifiers : partsSet.values()) { for (PartsIdentifier partsIdentifier : partsIdentifiers) { PartsColorInfo partsColorInfo = partsSet.getColorInfo(partsIdentifier); PartsSpec partsSpec = partsSpecResolver.getPartsSpec(partsIdentifier); if (partsSpec != null) { PartsFiles partsFiles = partsSpec.getPartsFiles(); for (Map.Entry entry : partsFiles.entrySet()) { Layer layer = entry.getKey(); float layerOrder = (layerOrderMapper != null) ? layerOrderMapper.getLayerOrder(layer) : (float) layer.getOrder(); if (!Float.isNaN(layerOrder)) { // NaN値の場合は非表示とする ImageResource file = entry.getValue(); ColorConvertParameter param = null; if (partsColorInfo != null) { ColorInfo colorInfo = partsColorInfo.get(layer); if (colorInfo != null) { param = colorInfo.getColorParameter(); } } handler.detectImageSource(partsIdentifier, layer, layerOrder, file, param); } } } } } } } CharacterManaJ/src/main/java/charactermanaj/model/io/ImportModel.java0000644000175000017500000002703313615720000025774 0ustar paulliupaulliupackage charactermanaj.model.io; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.model.AppConfig; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.PartsAuthorInfo; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsManageData; import charactermanaj.model.io.AbstractCharacterDataArchiveFile.CategoryLayerPair; import charactermanaj.model.io.AbstractCharacterDataArchiveFile.PartsImageContent; import charactermanaj.ui.progress.ProgressHandle; public class ImportModel { /** * ロガー.
*/ private static final Logger logger = Logger.getLogger(ImportModel.class.getName()); /** * インポートもとファイル */ private URI importSource; /** * プロファイル先のキャラクター定義、新規の場合はnull */ private CharacterData currentCharacterData; /** * インポートもとアーカイブ. ロードされた場合に非nullとなる. */ private CharacterDataArchiveFile archiveFile; /** * インポートされたキャラクター定義、なければnull */ private CharacterData sourceCharacterData; /** * インポートされたカスタムレイヤーパターン定義、なければnull */ private Map> sourceCustomLayerPatternMap; /** * インポートされたサンプルピクチャ、なければnull */ private BufferedImage samplePicture; /** * インポートされたreadme */ private String readme; /** * インポート先のキャラクター定義、もしくは現在のキャラクター定義のディレクトリ構成から 読み取ることのできるパーツのコレクション、なければ空.
*/ private Collection partsImageContentsMap; /** * パーツ管理データ、なければ空 */ private PartsManageData partsManageData; public void openImportSource(URI importSource, CharacterData currentCharacterData) throws IOException { if (archiveFile != null || importSource == null) { throw new IllegalStateException("既にアーカイブがオープンされています。"); } this.importSource = importSource; this.currentCharacterData = currentCharacterData; } public void closeImportSource() throws IOException { if (archiveFile != null) { try { archiveFile.close(); } finally { // クローズに失敗しても閉じたことにする. reset(); } } } public void loadContents(ProgressHandle progressHandle) throws IOException { if (archiveFile != null) { throw new IllegalStateException("既にアーカイブがオープンされています。"); } if (importSource == null) { throw new IllegalStateException("インポートファィルが指定されていません。"); } CharacterDataFileReaderWriterFactory factory = CharacterDataFileReaderWriterFactory.getInstance(); progressHandle.setCaption("open archive..."); archiveFile = factory.openArchive(importSource); readme = archiveFile.readReadMe(); progressHandle.setCaption("search the character definition..."); sourceCharacterData = archiveFile.readCharacterData(); if (sourceCharacterData == null) { // character.xmlがない場合は、character.iniで試行する. sourceCharacterData = archiveFile.readCharacterINI(); if (sourceCharacterData != null) { // readmeがあれば、それを説明として登録しておく if (readme != null && readme.trim().length() > 0) { sourceCharacterData.setDescription(readme); } } } else { // character.xmlがあった場合、favorites.xmlもあれば読み込む. archiveFile.readFavorites(sourceCharacterData); } if (sourceCharacterData != null && sourceCharacterData.isEnableCustonLayerPattern()) { // キャラクターデータの読み取りができ、且つ、カスタムレイヤーパターンが有効であれば sourceCustomLayerPatternMap = archiveFile.readCustomLayerPatterns(sourceCharacterData); } // サンプルピクチャの読み込み、なければnull progressHandle.setCaption("load sample picture..."); samplePicture = archiveFile.readSamplePicture(); // パーツセットの読み込み、なければ空 progressHandle.setCaption("load partssets..."); if (currentCharacterData != null) { // 既存のキャラクターセットの定義をもとにパーツディレクトリを探索する場合 // (インポートもと・インポート先が同一であればパーツは除外される.) partsImageContentsMap = archiveFile.getPartsImageContents(currentCharacterData, false); } else { // インポート元にあるキャラクター定義をもとにパーツディレクトリを探索する場合 partsImageContentsMap = archiveFile.getPartsImageContents(sourceCharacterData, true); } // パーツ管理データの読み込み progressHandle.setCaption("load parts definitions..."); partsManageData = archiveFile.getPartsManageData(); } protected void reset() { importSource = null; archiveFile = null; sourceCharacterData = null; samplePicture = null; readme = null; partsImageContentsMap = null; partsManageData = null; } public URI getImportSource() { return importSource; } protected void checkArchiveOpened() { if (archiveFile == null) { throw new IllegalStateException("アーカイブはオープンされていません。"); } } public CharacterData getCharacterData() { checkArchiveOpened(); return sourceCharacterData; } public Map> getCustomLayerPatternMap() { checkArchiveOpened(); return sourceCustomLayerPatternMap; } public BufferedImage getSamplePicture() { checkArchiveOpened(); return samplePicture; } public String getReadme() { checkArchiveOpened(); return readme; } public Collection getPartsImageContents() { checkArchiveOpened(); return partsImageContentsMap; } public PartsManageData getPartsManageData() { checkArchiveOpened(); return partsManageData; } /** * パーツデータをプロファイルの画像ディレクトリに一括コピーする.
* * @param partsImageContents * コピー対象のパーツデータ * @param cd * コピー先のプロファイル * @throws IOException * 失敗 */ public void copyPartsImageContents( Collection partsImageContents, CharacterData cd) throws IOException { if (cd == null || cd.getDocBase() == null) { throw new IllegalArgumentException("invalid character data"); } // コピー先ディレクトリの確定 URI docbase = cd.getDocBase(); if ( !"file".equals(docbase.getScheme())) { throw new IOException("ファイル以外はサポートしていません: " + docbase); } File configFile = new File(docbase); File baseDir = configFile.getParentFile(); if (baseDir == null || !baseDir.isDirectory()) { throw new IOException("親フォルダがディレクトリではありません: " + baseDir); } AppConfig appConfig = AppConfig.getInstance(); byte[] stmbuf = new byte[appConfig.getFileTransferBufferSize()]; // ファイルコピー for (PartsImageContent content : partsImageContents) { InputStream is = new BufferedInputStream(content.openStream()); try { File outDir = new File(baseDir, content.getDirName()); if (!outDir.exists()) { if (!outDir.mkdirs()) { logger.log(Level.WARNING, "can't create the directory. " + outDir); } } File outFile = new File(outDir, content.getFileName()); OutputStream os = new BufferedOutputStream(new FileOutputStream(outFile)); try { for (;;) { int rd = is.read(stmbuf); if (rd < 0) { break; } os.write(stmbuf, 0, rd); } } finally { os.close(); } if (!outFile.setLastModified(content.lastModified())) { logger.log(Level.WARNING, "can't change the modified-date: " + outFile); } } finally { is.close(); } } } /** * パーツ管理情報を更新または作成する.
* パーツ管理情報がnullまたは空であれば何もしない.
* そうでなければインポートするパーツに該当するパーツ管理情報を、現在のプロファイルのパーツ管理情報に追記・更新し、 それを書き出す.
* インポートもとにパーツ管理情報がなく、既存にある場合、インポートしても管理情報は削除されません.(上書きセマンティクスのため) * * @param partsImageContents * インポートするパーツ * @param partsManageData * パーツ管理データ * @param current * 現在のパーツ管理データを保持しているプロファイル、新規の場合はnull * @param target * 書き込み先のプロファイル * @throws IOException * 書き込みに失敗した場合 */ public void updatePartsManageData( Collection partsImageContents, PartsManageData partsManageData, CharacterData current, CharacterData target) throws IOException { if (target == null || !target.isValid()) { throw new IllegalArgumentException(); } if (partsImageContents == null || partsImageContents.isEmpty() || partsManageData == null || partsManageData.isEmpty()) { // インポートするパーツが存在しないか、管理情報がない場合は更新しようがないので何もしないで戻る. return; } PartsInfoXMLReader xmlReader = new PartsInfoXMLReader(); PartsManageData mergedPartsManagedData; if (current != null && current.isValid()) { // 現在のプロファイルからパーツ管理情報を取得する. mergedPartsManagedData = xmlReader.loadPartsManageData(current.getDocBase()); } else { // 新規の場合は空 mergedPartsManagedData = new PartsManageData(); } // インポート対象のパーツに該当するパーツ管理情報のみを取り出して追記する. for (PartsImageContent partsImageContent : partsImageContents) { String partsName = partsImageContent.getPartsName(); for (CategoryLayerPair catLayerPair : partsImageContent.getCategoryLayerPairs()) { PartsCategory partsCategory = catLayerPair.getPartsCategory(); String categoryId = partsCategory.getCategoryId(); PartsManageData.PartsKey partsKey = new PartsManageData.PartsKey(partsName, categoryId); PartsAuthorInfo partsAuthorInfo = partsManageData.getPartsAuthorInfo(partsKey); PartsManageData.PartsVersionInfo versionInfo = partsManageData.getVersion(partsKey); String localizedName = partsManageData.getLocalizedName(partsKey); if (partsAuthorInfo != null || versionInfo != null || localizedName != null) { // いずれかの情報の登録がある場合、パーツ管理情報として追記する. mergedPartsManagedData.putPartsInfo(partsKey, localizedName, partsAuthorInfo, versionInfo); } } } // パーツ管理情報を更新する. PartsInfoXMLWriter partsInfoXMLWriter = new PartsInfoXMLWriter(); partsInfoXMLWriter.savePartsManageData(target.getDocBase(), mergedPartsManagedData); } } CharacterManaJ/src/main/java/charactermanaj/model/io/PartsInfoXMLReader.java0000644000175000017500000002100013615720000027136 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.LinkedList; import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.XMLConstants; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import charactermanaj.model.PartsAuthorInfo; import charactermanaj.model.PartsManageData; /** * パーツ管理情報のXMLの読み込み用クラス. * * @author seraphy */ public class PartsInfoXMLReader { /** * ロガー */ private static final Logger logger = Logger .getLogger(PartsInfoXMLReader.class.getName()); /** * 指定したDocBaseと同じフォルダにあるparts-info.xmlからパーツ管理情報を取得して返す.
* ファイルが存在しない場合は空のインスタンスを返す.
* 返されるインスタンスは編集可能です.
* * @param docBase * character.xmlの位置 * @return パーツ管理情報、存在しない場合は空のインスタンス * @throws IOException * 読み込み中に失敗した場合 */ public PartsManageData loadPartsManageData(URI docBase) throws IOException { if (docBase == null) { throw new IllegalArgumentException(); } if (!"file".equals(docBase.getScheme())) { throw new IOException("ファイル以外はサポートしていません。:" + docBase); } File docBaseFile = new File(docBase); File baseDir = docBaseFile.getParentFile(); // パーツ管理情報ファイルの確認 final File partsInfoXML = new File(baseDir, "parts-info.xml"); if (!partsInfoXML.exists()) { // ファイルが存在しなければ空を返す. return new PartsManageData(); } PartsManageData partsManageData; InputStream is = new FileInputStream(partsInfoXML); try { partsManageData = loadPartsManageData(is); } finally { is.close(); } return partsManageData; } public PartsManageData loadPartsManageData(InputStream is) throws IOException { if (is == null) { throw new IllegalArgumentException(); } // パーツ管理情報 final PartsManageData partsManageData = new PartsManageData(); // SAXParserの準備 SAXParser saxParser; try { SAXParserFactory saxPartserFactory = SAXParserFactory.newInstance(); saxPartserFactory.setNamespaceAware(true); saxParser = saxPartserFactory.newSAXParser(); } catch (Exception ex) { throw new RuntimeException("JAXP Configuration failed.", ex); } // デフォルトのロケールから言語を取得 final Locale locale = Locale.getDefault(); final String lang = locale.getLanguage(); try { // 要素のスタック final LinkedList stack = new LinkedList(); // 日時コンバータ final SimpleDateFormat dateTimeFmt = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); // DOMではなくSAXで読み流す. saxParser.parse(is, new DefaultHandler() { private StringBuilder buf = new StringBuilder(); private PartsAuthorInfo partsAuthorInfo; private String authorName; private String homepageURL; private String authorNameLang; private String homepageLang; private String downloadURL; private String partsLocalNameLang; private String partsLocalName; private String partsCategoryId; private String partsName; private double partsVersion; private Timestamp partsLastModified; @Override public void startDocument() throws SAXException { logger.log(Level.FINEST, "parts-info : start"); } @Override public void endDocument() throws SAXException { logger.log(Level.FINEST, "parts-info : end"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { buf.append(ch, start, length); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { stack.addFirst(qName); int mx = stack.size(); if (mx >= 2 && stack.get(1).equals("parts")) { if ("local-name".equals(qName)) { partsLocalNameLang = attributes.getValue( XMLConstants.XML_NS_URI, "lang"); } } else if (mx >= 2 && stack.get(1).equals("author")) { if ("name".equals(qName)) { authorNameLang = attributes.getValue( XMLConstants.XML_NS_URI, "lang"); } else if ("home-page".equals(qName)) { homepageLang = attributes.getValue( XMLConstants.XML_NS_URI, "lang"); } } else if ("author".equals(qName)) { partsAuthorInfo = null; authorName = null; authorNameLang = null; homepageURL = null; homepageLang = null; } else if ("download-url".equals(qName)) { downloadURL = null; } else if ("parts".equals(qName)) { partsLocalName = null; partsLocalNameLang = null; partsCategoryId = attributes.getValue("category"); partsName = attributes.getValue("name"); // バージョン String strVersion = attributes.getValue("version"); try { if (strVersion == null || strVersion.length() == 0) { partsVersion = 0.; } else { partsVersion = Double.parseDouble(strVersion); if (partsVersion < 0) { partsVersion = 0; } } } catch (Exception ex) { logger.log(Level.INFO, "parts-info.xml: invalid version." + strVersion); partsVersion = 0; } // 更新日時 String strLastModified = attributes .getValue("lastModified"); if (strLastModified != null && strLastModified.trim().length() > 0) { try { partsLastModified = new Timestamp(dateTimeFmt .parse(strLastModified.trim()) .getTime()); } catch (Exception ex) { logger.log(Level.INFO, "parts-info.xml: invalid dateTime." + strLastModified); } } } buf = new StringBuilder(); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { int mx = stack.size(); if (mx >= 2 && "parts".equals(stack.get(1))) { if ("local-name".equals(qName)) { if (partsLocalName == null || lang.equals(partsLocalNameLang)) { partsLocalName = buf.toString(); } } } else if (mx >= 2 && "author".equals(stack.get(1))) { if ("name".equals(qName)) { if (authorName == null || lang.equals(authorNameLang)) { authorName = buf.toString(); } } else if ("home-page".equals(qName)) { if (homepageURL == null || lang.equals(homepageLang)) { homepageURL = buf.toString(); } } } else if ("author".equals(qName)) { logger.log(Level.FINE, "parts-info: author: " + authorName + " /homepage:" + homepageURL); if (authorName != null && authorName.length() > 0) { partsAuthorInfo = new PartsAuthorInfo(); partsAuthorInfo.setAuthor(authorName); partsAuthorInfo.setHomePage(homepageURL); } else { partsAuthorInfo = null; } } else if ("download-url".equals(qName)) { downloadURL = buf.toString(); logger.log(Level.FINE, "parts-info: download-url: " + downloadURL); } else if ("parts".equals(qName)) { if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "parts-info.xml: parts-name: " + partsName + " /category: " + partsCategoryId + " /parts-local-name: " + partsLocalName + " /version:" + partsVersion + "/lastModified:" + partsLastModified); } PartsManageData.PartsVersionInfo versionInfo = new PartsManageData.PartsVersionInfo(); versionInfo.setVersion(partsVersion); versionInfo.setDownloadURL(downloadURL); versionInfo.setLastModified(partsLastModified); PartsManageData.PartsKey partsKey = new PartsManageData.PartsKey( partsName, partsCategoryId); partsManageData.putPartsInfo(partsKey, partsLocalName, partsAuthorInfo, versionInfo); } stack.removeFirst(); } }); } catch (SAXException ex) { IOException ex2 = new IOException("parts-info.xml read failed."); ex2.initCause(ex); throw ex2; } return partsManageData; } } CharacterManaJ/src/main/java/charactermanaj/model/io/CharacterDataZipFileWriter.java0000644000175000017500000000706513615720000030712 0ustar paulliupaulliupackage charactermanaj.model.io; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; import java.nio.charset.CodingErrorAction; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; import charactermanaj.model.AppConfig; public class CharacterDataZipFileWriter extends AbstractCharacterDataArchivedFileWriter { /** * Zipストリーム */ protected ZipOutputStream zipOutStm; /** * ファイル名のエンコーディング */ protected CharsetEncoder enc; /** * ルートコンテンツへのプレフィックス */ protected String rootPrefix = ""; public CharacterDataZipFileWriter(File outFile) throws IOException { super(outFile); AppConfig appConfig = AppConfig.getInstance(); String zipNameEncoding = appConfig.getZipNameEncoding(); // コンストラクタにストリームではなくファイル名を指定することで、 // 内部でランダムアクセスファイルを使うようになるためヘッダのCRCチェックの書き込み等で有利 this.zipOutStm = new ZipOutputStream(tmpFile); // ファイル名の文字コードを設定する. // (JDKの標準のZipOutputStreamはUTF-8になるが、一般的にはMS932が多いため、Apache Antのものを借用し指定する.) this.enc = Charset.forName(zipNameEncoding).newEncoder(); zipOutStm.setEncoding(zipNameEncoding); enc.onUnmappableCharacter(CodingErrorAction.REPORT); // zipの場合、根本に1つフォルダをたてておく. // 一般的なフォルダ圧縮したものと体裁をそろえるため. String fname = outFile.getName(); int extpos = fname.lastIndexOf('.'); if (extpos > 0) { // ドットで始まる名前の場合は無視 fname = fname.substring(0, extpos); } setRootPrefix(fname); } public void setRootPrefix(String rootPrefix) { if (rootPrefix == null || rootPrefix.trim().equals("/")) { rootPrefix = ""; } if (rootPrefix.length() > 0 && !rootPrefix.endsWith("/")) { rootPrefix += "/"; } this.rootPrefix = rootPrefix.trim(); } public String getRootPrefix() { return rootPrefix; } @Override protected void closeEntry() throws IOException { zipOutStm.closeEntry(); } @Override protected OutputStream getOutputStream() throws IOException { return zipOutStm; } @Override protected void putNextEntry(String name, long lastModified) throws IOException { // ルートプレフィックスをすべてのエントリの登録時に付与する. String fname = rootPrefix + name; // ファイル名がキャラクターセットに合致するか? checkName(fname); // Zipエントリの登録 ZipEntry entry = new ZipEntry(fname); if (lastModified > 0) { entry.setTime(lastModified); } zipOutStm.putNextEntry(entry); } protected void internalClose() throws IOException { zipOutStm.close(); } /** * ファイル名がエンコーディング可能であるかチェックする.
* @param name チェックする名前 * @throws IOException ファイル名が不正である場合 * @throws UnsupportedEncodingException ファイル名がエンコーディングできない場合 */ protected void checkName(String name) throws UnsupportedEncodingException, IOException { if (name == null || name.length() == 0) { throw new IOException("missing entry name"); } if (!enc.canEncode(name)) { throw new UnsupportedEncodingException("file name encoding error.: " + name); } } } CharacterManaJ/src/main/java/charactermanaj/model/io/WorkingSetXMLWriter.java0000644000175000017500000003141213615720000027407 0ustar paulliupaulliupackage charactermanaj.model.io; import java.awt.Color; import java.awt.Point; import java.awt.Rectangle; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.URI; import java.nio.charset.Charset; import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import charactermanaj.model.CharacterData; import charactermanaj.model.PartsColorInfo; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.model.WorkingSet; import charactermanaj.ui.model.WallpaperInfo; import charactermanaj.ui.model.WallpaperInfo.WallpaperResourceType; /** * WorkingSetのXMLへの書き込み */ public class WorkingSetXMLWriter { /** * WorkingSetのバージョン */ private static final String VERSION_SIG_1_0 = "1.0"; /** * WorkingSetのXMLファイルの名前空間 */ private static final String NS = "http://charactermanaj.sourceforge.jp/schema/charactermanaj-workingset"; /** * キャラクターデータのXML化 */ private CharacterDataXMLWriter characterDataXmlWriter = new CharacterDataXMLWriter(NS); /** * ワーキングセットをXML表現で出力ストリームに出力します.
* * @param ws * ワーキングセット * @param outstm * 出力先ストリーム * @throws IOException * 失敗 */ public void writeWorkingSet(WorkingSet ws, OutputStream outstm) throws IOException { if (ws == null || outstm == null) { throw new IllegalArgumentException(); } Document doc = createWorkingSetXML(ws); // output xml TransformerFactory txFactory = TransformerFactory.newInstance(); txFactory.setAttribute("indent-number", Integer.valueOf(4)); Transformer tfmr; try { tfmr = txFactory.newTransformer(); } catch (TransformerConfigurationException ex) { throw new RuntimeException("JAXP Configuration Failed.", ex); } tfmr.setOutputProperty(OutputKeys.INDENT, "yes"); // JDK-4504745 : javax.xml.transform.Transformer encoding does not work properly // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4504745 final String encoding = "UTF-8"; tfmr.setOutputProperty("encoding", encoding); try { tfmr.transform(new DOMSource(doc), new StreamResult( new OutputStreamWriter(outstm, Charset.forName(encoding)))); } catch (TransformerException ex) { IOException ex2 = new IOException("XML Convert failed."); ex2.initCause(ex); throw ex2; } } /** * ワーキングセットのXMLドキュメントを生成します. * * @param ws * ワーキングセット * @return XMLドキュメント */ public Document createWorkingSetXML(WorkingSet ws) { if (ws == null) { throw new IllegalArgumentException(); } Document doc; try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); doc = builder.newDocument(); } catch (ParserConfigurationException ex) { throw new RuntimeException("JAXP Configuration failed.", ex); } Locale locale = Locale.getDefault(); String lang = locale.getLanguage(); Element root = doc.createElementNS(NS, "character-workingset"); root.setAttribute("version", VERSION_SIG_1_0); root.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns:xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); root.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns:xml", XMLConstants.XML_NS_URI); root.setAttribute("xsi:schemaLocation", NS + " character_ws.xsd"); // ドキュメントベース URI docbase = ws.getCharacterDocBase(); root.setAttribute("characterDocBase", docbase == null ? "" : docbase.toString()); // キャラクターデータのシグネチャ CharacterData cd = ws.getCharacterData(); Element characterDataSigElm = doc.createElementNS(NS, "characterDataSig"); if (cd == null || !cd.isValid()) { // 指定されていないか有効でない場合は無しとみなす. characterDataSigElm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true"); } else { characterDataSigElm.setTextContent(cd.toSignatureString()); } root.appendChild(characterDataSigElm); // パーツカラー情報 root.appendChild(writePartsColorInfoMap(doc, ws.getPartsColorInfoMap())); // 現在のパーツセット PartsSet currentPartsSet = ws.getCurrentPartsSet(); Element partsSetElm = doc.createElementNS(NS, "currentPartsSet"); if (currentPartsSet == null || currentPartsSet.isEmpty()) { partsSetElm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true"); } else { Element elm = characterDataXmlWriter.createPartsSetXML(doc, lang, currentPartsSet); partsSetElm.appendChild(elm); } root.appendChild(partsSetElm); // 最後に使用した保存先ディレクトリ Element lastUsedSaveDirElm = doc.createElementNS(NS, "lastUsedSaveDir"); File lastUsedSaveDir = ws.getLastUsedSaveDir(); if (lastUsedSaveDir == null) { lastUsedSaveDirElm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true"); } else { lastUsedSaveDirElm.setTextContent(lastUsedSaveDir.getPath()); } root.appendChild(lastUsedSaveDirElm); // 最後に使用したエクスポート先ディレクトリ Element lastUsedExportDirElm = doc.createElementNS(NS, "lastUsedExportDir"); File lastUsedExportDir = ws.getLastUsedExportDir(); if (lastUsedExportDir == null) { lastUsedExportDirElm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true"); } else { lastUsedExportDirElm.setTextContent(lastUsedExportDir.getPath()); } root.appendChild(lastUsedExportDirElm); // 最後に使用したパーツセット情報、なければnull PartsSet lastUsePresetParts = ws.getLastUsePresetParts(); Element lastUsePresetPartsElm = doc.createElementNS(NS, "lastUsePresetParts"); if (lastUsePresetParts == null || lastUsePresetParts.isEmpty()) { lastUsePresetPartsElm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true"); } else { Element elm = characterDataXmlWriter.createPartsSetXML(doc, lang, lastUsePresetParts); lastUsePresetPartsElm.appendChild(elm); } root.appendChild(lastUsePresetPartsElm); // 壁紙情報 root.appendChild(writeWallpaper(doc, ws.getWallpaperInfo())); // ズーム情報等 root.appendChild(writeViewSettings(doc, ws.getZoomFactor(), ws.getViewPosition(), ws.getWindowRect())); // データダウンロード不要フラグ if (ws.isNoNeedDataDownload()) { Element noNeedDataDownloadElm = doc.createElement("noNeedDataDownload"); noNeedDataDownloadElm.setTextContent(Boolean.toString(ws.isNoNeedDataDownload())); root.appendChild(noNeedDataDownloadElm); } doc.appendChild(root); return doc; } /** * パーツごとのカラー情報のXML要素を生成して返します. * * @param doc * 要素のファクトリ * @param partsColorMap * パーツごとのカラー情報のマップ * @return パーツごとのカラー情報のXML要素 */ public Element writePartsColorInfoMap(Document doc, Map partsColorMap) { Element partsColorInfoMapElm = doc.createElementNS(NS, "partsColorInfoMap"); if (partsColorMap != null) { // 使用しているカラーの設定ごとに番号を振る // (同じカラー設定であれば同じ番号とする.) LinkedHashMap colorMap = new LinkedHashMap(); for (Map.Entry partsColorEntry : partsColorMap.entrySet()) { PartsColorInfo partsColorInfo = partsColorEntry.getValue(); if (partsColorInfo != null && !partsColorInfo.isEmpty()) { if (!colorMap.containsKey(partsColorInfo)) { colorMap.put(partsColorInfo, Integer.toString(colorMap.size() + 1)); } } } // すべてのカラー設定を出力する. Element colorsElm = doc.createElementNS(NS, "colors"); for (Map.Entry colorMapEntry : colorMap.entrySet()) { PartsColorInfo partsColorInfo = colorMapEntry.getKey(); String id = colorMapEntry.getValue(); Element partsColorElm = characterDataXmlWriter.createPartsColorInfoXML(doc, partsColorInfo); partsColorElm.setAttribute("id", id); colorsElm.appendChild(partsColorElm); } partsColorInfoMapElm.appendChild(colorsElm); // パーツと、そのパーツのカラー設定番号の一覧を出力する. Element partsListElm = doc.createElementNS(NS, "partsList"); for (Map.Entry partsColorEntry : partsColorMap.entrySet()) { PartsIdentifier partsIdentifier = partsColorEntry.getKey(); PartsColorInfo partsColorInfo = partsColorEntry.getValue(); if (partsColorInfo != null && !partsColorInfo.isEmpty()) { String colorId = colorMap.get(partsColorInfo); if (colorId == null) { throw new RuntimeException("colorMapが不整合です"); } Element partsElm = doc.createElementNS(NS, "partsIdentifier"); String categoryId = partsIdentifier.getPartsCategory().getCategoryId(); partsElm.setAttribute("categoryId", categoryId); partsElm.setAttribute("name", partsIdentifier.getPartsName()); partsElm.setAttribute("colorId", colorId); partsListElm.appendChild(partsElm); } } partsColorInfoMapElm.appendChild(partsListElm); } return partsColorInfoMapElm; } /** * 壁紙情報をXML要素として生成する. * * @param doc * XML要素のファクトリ * @param wallpaperInfo * 壁紙情報 * @return 壁紙情報のXML要素 */ public Element writeWallpaper(Document doc, WallpaperInfo wallpaperInfo) { Element elm = doc.createElementNS(NS, "wallpaperInfo"); if (wallpaperInfo == null) { elm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true"); } else { // タイプ WallpaperResourceType typ = wallpaperInfo.getType(); Element typElm = doc.createElementNS(NS, "type"); typElm.setTextContent(typ.name()); elm.appendChild(typElm); // リソース String res = wallpaperInfo.getResource(); Element resElm = doc.createElementNS(NS, "resource"); if (res == null || res.trim().length() == 0) { resElm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true"); } else { resElm.setTextContent(res); } elm.appendChild(resElm); // ファイル File file = wallpaperInfo.getFile(); Element fileElm = doc.createElementNS(NS, "file"); if (file == null) { fileElm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true"); } else { fileElm.setTextContent(file.getPath()); } elm.appendChild(fileElm); // アルファ float alpha = wallpaperInfo.getAlpha(); Element alphaElm = doc.createElementNS(NS, "alpha"); alphaElm.setTextContent(Float.toString(alpha)); elm.appendChild(alphaElm); // 背景色 Color backgroundColor = wallpaperInfo.getBackgroundColor(); Element bgColorElm = doc.createElementNS(NS, "backgroundColor"); bgColorElm.setTextContent("#" + Integer.toHexString(backgroundColor.getRGB() & 0xffffff)); elm.appendChild(bgColorElm); } return elm; } /** * Zoom情報をXML要素として生成する. * * @param doc * XML要素のファクトリ * @param zoomFactor ズーム倍率 * @param viewPosition ビュー左上位置 * @return Zoom情報のXML要素 */ public Element writeViewSettings(Document doc, Double zoomFactor, Point viewPosition, Rectangle windowRect) { Element elm = doc.createElementNS(NS, "view"); if (zoomFactor != null) { elm.setAttribute("zoomFactor", Double.toString(zoomFactor)); } if (viewPosition != null) { elm.setAttribute("x", Integer.toString(viewPosition.x)); elm.setAttribute("y", Integer.toString(viewPosition.y)); } if (windowRect != null) { Element elmWin = doc.createElementNS(NS, "window"); elmWin.setAttribute("x", Integer.toString(windowRect.x)); elmWin.setAttribute("y", Integer.toString(windowRect.y)); elmWin.setAttribute("width", Integer.toString(windowRect.width)); elmWin.setAttribute("height", Integer.toString(windowRect.height)); elm.appendChild(elmWin); } return elm; } } CharacterManaJ/src/main/java/charactermanaj/model/io/RecommendationURLCompensator.java0000644000175000017500000001131613615720000031300 0ustar paulliupaulliupackage charactermanaj.model.io; import java.util.List; import charactermanaj.model.CharacterData; import charactermanaj.model.RecommendationURL; import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion; /** * デフォルトキャラクターセット用のお薦めURLを補完・補完解除します。
*
* ※ これは黒魔術的に置き換えるためのものなので、XMLの書き込み時には * デフォルトキャラクターセットv2, v3に該当するもので、同一のお勧めリストであれば * それをnullに変える。
* ただし、デフォルトキャラクターセットv2, v3の定義もXMLであるため、 * XML読み込み中のタイミングでnullを既定のお勧めリストとして補完しようとすると * 循環してしまうため、XML読み込み後に補間する必要があることに注意。
*/ public final class RecommendationURLCompensator { /** * シングルトン */ private static final RecommendationURLCompensator INST = new RecommendationURLCompensator(); /** * プライ弁ーとコンストラクタ */ private RecommendationURLCompensator() { super(); } /** * シングルトンインスタンすを取得する * @return */ public static RecommendationURLCompensator getInstance() { return INST; } /** * お勧めリンクリストが設定されていない場合(nullの場合)、デフォルトのお勧めリストを設定する.
* すでに設定されている場合(空を含む)は何もしない.
*
* おすすめリンクがサポートされてなかったころのデータは、おすすめリンク用のタグそのものが存在せずnullとなる.
* サポート後のデータでリンクを未設定にしている場合は、空のリストとなる.
* したがって、nullの場合のみ、おすすめリンクを補完する.
* * @param characterData * キャラクターデータ */ public void compensateRecommendationList(CharacterData characterData) { if (characterData == null) { throw new IllegalArgumentException(); } // キャラクターデータの構造がデフォルトのv2, v3と同一であれば、対応するリンクを設定する List recommendations = getCompensateRecommendationList(characterData); if (recommendations != null) { characterData.setRecommendationURLList(recommendations); } } /** * キャラクターデータに対するお勧めリストの補完が必要であれば、そのリストを返す。 * すでに設定済みであるか、対応する補完リストがない場合はnullを返す。 * @param characterData * @return お勧めリスト、もしくはnull */ public List getCompensateRecommendationList(CharacterData characterData) { if (characterData != null && characterData.getRecommendationURLList() == null) { // 補填の必要ある場合のみ CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider(); for (DefaultCharacterDataVersion dataVersion : DefaultCharacterDataVersion.values()) { CharacterData defaultCd = defProv.createDefaultCharacterData(dataVersion); if (defaultCd.toSignatureString().equals(characterData.toSignatureString())) { return defaultCd.getRecommendationURLList(); } } } return null; } /** * 補完されたものを除いたお勧めリストを取得する。 * デフォルト構造でデフォルトと同一のお勧めリストの場合、補完されたものとしてnullを返す。 * それ以外はお勧めリストをそのまま返す。 * @param cd */ public List getUncompensateRecommendationList(CharacterData cd) { if (cd == null) { return null; } // デフォルトのキャラクターデータ構造で、 // お勧めリストと内容が同じの場合は、明示的にリストを設定しない. String cdSig = cd.toStructureString(); List recommendations = cd.getRecommendationURLList(); if (recommendations != null) { CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider(); for (DefaultCharacterDataVersion dataVersion : DefaultCharacterDataVersion.values()) { CharacterData defaultCd = defProv.createDefaultCharacterData(dataVersion); String defSig = defaultCd.toStructureString(); if (cdSig.equals(defSig)) { List defaultRecommendationURLList = defaultCd.getRecommendationURLList(); if (defaultRecommendationURLList != null && defaultRecommendationURLList.equals(recommendations)) { recommendations = null; break; } } } } return recommendations; } } CharacterManaJ/src/main/java/charactermanaj/model/PartsColorManager.java0000644000175000017500000002744613615720000026525 0ustar paulliupaulliupackage charactermanaj.model; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.graphics.filters.ColorConvertParameter; /** * パーツごとの色情報を設定・取得したり、最後に設定した色情報を記憶するなどの色情報アクセスのためのクラス.
* @author seraphy * */ public class PartsColorManager { private static final Logger logger = Logger.getLogger(PartsColorManager.class.getName()); /** * カテゴリごとのパーツカラー情報.
* @author seraphy */ public static final class CategoryColorInfo { private final PartsColorInfo partsColorInfo; private final boolean applyAll; public CategoryColorInfo(PartsColorInfo partsColorInfo, boolean applyAll) { this.partsColorInfo = partsColorInfo; this.applyAll = applyAll; } public PartsColorInfo getPartsColorInfo() { return partsColorInfo; } public boolean isApplyAll() { return applyAll; } } /** * パーツ単位でのカラーグループを含む色情報.
* カテゴリ全体に適用される場合はパーツ単位の色情報はリセットする.
*/ private HashMap partsColorInfoMap = new HashMap(); /** * カテゴリごとに共通となる場合のカラーグループを含む色情報.
* パーツ単位の色情報が定義されていない場合、カテゴリ単位での情報が使用される.
*/ private HashMap categoryColorInfoMap = new HashMap(); /** * カラーグループごとの色情報.
*/ private HashMap recentColorGroupMap = new HashMap(); /** * パーツ設定のリゾルバ */ private PartsSpecResolver partsSpecResolver; /** * パーツ設定リゾルバを指定して構築する. * @param partsSpecResolver リゾルバ */ public PartsColorManager(PartsSpecResolver partsSpecResolver) { if (partsSpecResolver == null) { throw new IllegalArgumentException(); } this.partsSpecResolver = partsSpecResolver; } /** * パーツ識別子ごとの色情報を取得します.
* まだ一度も登録されていない場合は、現在の状態から色情報を作成して返します.
* その場合、registered引数がtrueである場合は生成と同時に初期値として登録済みとする.
* そうでない場合は生成された色情報は一時的なものとなる. * @param partsIdentifier パーツ識別子 * @param registered 色情報を新規に作成した場合に登録する場合はtrue * @return 色情報 */ public PartsColorInfo getPartsColorInfo(PartsIdentifier partsIdentifier, boolean registered) { if (partsIdentifier == null) { throw new IllegalArgumentException(); } // パーツ識別子ごとのカラー情報を取得する. PartsColorInfo partsColorInfo = partsColorInfoMap.get(partsIdentifier); if (partsColorInfo == null) { // パーツ識別子ごとのカラー情報が設定されていない場合は // カテゴリ別情報からカラー情報を生成する. partsColorInfo = createDefaultColorInfo(partsIdentifier); if (registered) { // 生成されたカラー情報をパーツ識別子ごとのカラー情報に適用する. partsColorInfoMap.put(partsIdentifier, partsColorInfo); } } return partsColorInfo; } /** * パーツ識別子ごとのパーツ色情報を保存します.
* @param partsIdentifier パーツ識別子 * @param partsColorInfo パーツの色情報 * @param applyAll パーツ識別子ではなく、カテゴリに対して保存する場合 */ public void setPartsColorInfo(PartsIdentifier partsIdentifier, PartsColorInfo partsColorInfo, boolean applyAll) { if (partsIdentifier == null || partsColorInfo == null) { throw new IllegalArgumentException(); } partsColorInfo = partsColorInfo.clone(); PartsCategory partsCategory = partsIdentifier.getPartsCategory(); if (applyAll) { // カテゴリ指定の場合 // パーツ個別色をリセットすることでカテゴリを優先させる. resetPartsColorInfo(partsCategory); if (logger.isLoggable(Level.FINEST)) { logger.log(Level.FINEST, "setPartsColorInfo(Category): " + partsIdentifier + "=" + partsColorInfo); } } else { // パーツ個別指定の場合 partsColorInfoMap.put(partsIdentifier, partsColorInfo); if (logger.isLoggable(Level.FINEST)) { logger.log(Level.FINEST, "setPartsColorInfo(Parts): " + partsIdentifier + "=" + partsColorInfo); } } // カラーグループとしての最新のカラー情報を保存する.(有効なカラーグループで連動指定がある場合のみ) // ただし、「すべてに適用」でない場合は保存しない. if (applyAll) { setRecentColorGroup(partsColorInfo); } // カテゴリごとの最新の色情報を設定する. // (「すべてに適用」であるか、単数選択カテゴリで、まだ「すべてに適用」の色情報がない場合のみ.) // (複数選択カテゴリの場合は明示的に「すべてに適用」を選択していないかぎり保存されない.) CategoryColorInfo categoryColorInfo = categoryColorInfoMap.get(partsCategory); if (applyAll || (!partsCategory.isMultipleSelectable() && (categoryColorInfo == null || !categoryColorInfo.isApplyAll()))) { categoryColorInfo = new CategoryColorInfo(partsColorInfo, applyAll); categoryColorInfoMap.put(partsCategory, categoryColorInfo); } } /** * パーツの色情報を指定して、パーツ識別子の各レイーヤの色グループ情報を保存します.
* 連動指定が有効であり、有効なカラーグループである場合のみ保存されます.
* @param partsColorInfo パーツ識別子 */ protected void setRecentColorGroup(PartsColorInfo partsColorInfo) { if (partsColorInfo == null) { return; } for (Map.Entry entry : partsColorInfo.entrySet()) { ColorInfo colorInfo = entry.getValue(); ColorGroup colorGroup = colorInfo.getColorGroup(); if (colorInfo.isSyncColorGroup() && colorGroup != null && colorGroup.isEnabled()) { ColorConvertParameter colorParam = colorInfo.getColorParameter(); if (colorParam != null) { colorParam = colorParam.clone(); } ColorConvertParameter oldColorParam = recentColorGroupMap.put(colorGroup, colorParam); if (logger.isLoggable(Level.FINEST)) { if ( !ColorConvertParameter.equals(colorParam, oldColorParam)) { logger.log(Level.FINEST, "setRecentColorGroup(" + colorGroup + ")=" + colorParam); } } } } } /** * カラーグループごとのもっとも最近に設定した色情報を取得します.
* カラーグループが有効でないか、まだ一度も登録されていない場合はnullが返されます.
* @param colorGroup 色グループ、null可 * @return 色情報、もしくはnull */ protected ColorConvertParameter getRecentColorGroup(ColorGroup colorGroup) { if (colorGroup == null || !colorGroup.isEnabled()) { return null; } ColorConvertParameter colorParam = recentColorGroupMap.get(colorGroup); if (colorParam != null) { colorParam = colorParam.clone(); } return colorParam; } /** * 指定したパーツカテゴリの色情報を取得します.
* 登録がない場合はnullが返されます.
* @param partsCategory パーツカテゴリ * @return 指定したパーツカテゴリの色情報、またはnull */ public CategoryColorInfo getPartsColorInfo(PartsCategory partsCategory) { return categoryColorInfoMap.get(partsCategory); } /** * すべてのパーツ識別子の色情報をリセットします.
*/ public void resetPartsColorInfo() { resetPartsColorInfo(null); } /** * 指定したカテゴリと、カテゴリに属するパーツ識別子ごとの色情報をリセットします.
* 引数partsCategoryがnullの場合は全パーツ識別子、全カテゴリと、すべてのカラーグループをリセットします.
* @param partsCategory パーツカテゴリまたはnull */ public void resetPartsColorInfo(PartsCategory partsCategory) { if (partsCategory == null) { recentColorGroupMap.clear(); partsColorInfoMap.clear(); categoryColorInfoMap.clear(); return; } categoryColorInfoMap.remove(partsCategory); Iterator> ite = partsColorInfoMap.entrySet().iterator(); while (ite.hasNext()) { Map.Entry entry = ite.next(); PartsIdentifier partsIdentifier = entry.getKey(); if (partsIdentifier.getPartsCategory().equals(partsCategory)) { ite.remove(); } } } /** * パーツ識別子ごとの色情報を現在の状態から新たに構築する. * @param partsIdentifier パーツ識別子 * @return 色情報 */ protected PartsColorInfo createDefaultColorInfo(PartsIdentifier partsIdentifier) { PartsCategory category = partsIdentifier.getPartsCategory(); PartsColorInfo partsColorInfo = new PartsColorInfo(category); // パーツ固有のカラーグループの指定があるか? PartsSpec partsSpec = partsSpecResolver.getPartsSpec(partsIdentifier); ColorGroup partsSpecColorGroup = null; if (partsSpec != null) { partsSpecColorGroup = partsSpec.getColorGroup(); } if (partsSpecColorGroup != null && partsSpecColorGroup.isEnabled()) { // パーツ固定のカラーグループの指定があれば // 全レイヤーを該当カラーグループに設定する. for (Map.Entry entry : partsColorInfo.entrySet()) { ColorInfo colorInfo = entry.getValue(); colorInfo = colorInfo.clone(); colorInfo.setColorGroup(partsSpecColorGroup); colorInfo.setSyncColorGroup(true); entry.setValue(colorInfo); } } else { // パーツ固有のカラーグループがなければ // 同一カテゴリの最近設定されたカラー情報をもとに、パーツカラー情報を作成する. CategoryColorInfo categoryColorInfo = categoryColorInfoMap.get(category); if (categoryColorInfo != null) { PartsColorInfo categoryPartsColorInfo = categoryColorInfo.getPartsColorInfo(); for (Map.Entry entry : categoryPartsColorInfo.entrySet()) { Layer layer = entry.getKey(); ColorInfo colorInfo = entry.getValue(); if (colorInfo != null && partsColorInfo.containsKey(layer)) { colorInfo = colorInfo.clone(); // ただし、同一カテゴリに設定されたカラー情報が「すべてに適用」でない場合は、 // レイヤー固有のカラーグループを維持する. if ( !categoryColorInfo.isApplyAll()) { ColorGroup layerColorGroup = layer.getColorGroup(); if (layerColorGroup == null) { layerColorGroup = ColorGroup.NA; } colorInfo.setColorGroup(layerColorGroup); } partsColorInfo.put(layer, colorInfo); } } } } // カラーグループが指定されている場合、もっとも最近に設定されたカラーグループの色情報に設定し直す for (Map.Entry entry : partsColorInfo.entrySet()) { ColorInfo colorInfo = entry.getValue(); ColorGroup colorGroup = colorInfo.getColorGroup(); if (colorGroup != null && colorGroup.isEnabled() && colorInfo.isSyncColorGroup()) { ColorConvertParameter param = getRecentColorGroup(colorGroup); if (param != null) { colorInfo.setColorParameter(param); } } } return partsColorInfo; } public Map getPartsColorInfoMap() { return partsColorInfoMap; } } CharacterManaJ/src/main/java/charactermanaj/model/CharacterDataChangeListener.java0000644000175000017500000000030613615720000030426 0ustar paulliupaulliupackage charactermanaj.model; import java.util.EventListener; public interface CharacterDataChangeListener extends EventListener { void notifyChangeCharacterData(CharacterDataChangeEvent e); } CharacterManaJ/src/main/java/charactermanaj/model/IndependentPartsColorInfo.java0000644000175000017500000000634213615720000030214 0ustar paulliupaulliupackage charactermanaj.model; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.graphics.filters.ColorConvertParameter; /** * 素のカラー情報.
* レイヤーやカテゴリなどのリレーションシップがない、
* 特定のキャラクターデータモデルのツリーの一部には組み込まれていない状態のもの.
*/ public class IndependentPartsColorInfo { /** * ロガー */ private static final Logger logger = Logger .getLogger(IndependentPartsColorInfo.class.getName()); /** * layerID */ private String layerId; /** * カラーグループのid */ private String colorGroupId; /** * カラーの同期指定 */ private boolean syncColorGroup; /** * カラー変換パラメータ.
*/ private ColorConvertParameter colorConvertParameter = new ColorConvertParameter(); public void setLayerId(String layerId) { this.layerId = layerId; } public String getLayerId() { return layerId; } public void setColorGroupId(String colorGroupId) { this.colorGroupId = colorGroupId; } public String getColorGroupId() { return colorGroupId; } public void setSyncColorGroup(boolean syncColorGroup) { this.syncColorGroup = syncColorGroup; } public boolean isSyncColorGroup() { return syncColorGroup; } public void setColorConvertParameter( ColorConvertParameter colorConvertParameter) { this.colorConvertParameter = colorConvertParameter; } public ColorConvertParameter getColorConvertParameter() { return colorConvertParameter; } /** * インスタンス独立の素のカラー情報から、カテゴリやレイヤー、カラーグループのインスタンスと関連づけられたカラー情報に変換してかえす. * * @param characterData * キャラクターデータ * @param category * パーツカテゴリインスタンス * @param partsColorInfoList * 素のパーツカラー情報、なければnull可 * @return パーツカラー情報、パーツカラー情報がなければnull */ public static PartsColorInfo buildPartsColorInfo( CharacterData characterData, PartsCategory category, List partsColorInfoList) { if (characterData == null || category == null) { throw new IllegalArgumentException(); } if (partsColorInfoList == null) { return null; } PartsColorInfo partsColorInfo = null; for (IndependentPartsColorInfo info : partsColorInfoList) { String layerId = info.getLayerId(); Layer layer = category.getLayer(layerId); if (layer == null) { logger.log(Level.WARNING, "undefined layer: " + layerId); break; } if (partsColorInfo == null) { partsColorInfo = new PartsColorInfo(category); } ColorInfo colorInfo = partsColorInfo.get(layer); // color group String colorGroupId = info.getColorGroupId(); ColorGroup colorGroup = characterData.getColorGroup(colorGroupId); boolean syncColorGroup = info.isSyncColorGroup(); colorInfo.setColorGroup(colorGroup); colorInfo.setSyncColorGroup(syncColorGroup); // color parameters colorInfo.setColorParameter(info.getColorConvertParameter()); } return partsColorInfo; } }CharacterManaJ/src/main/java/charactermanaj/model/ObservableList.java0000644000175000017500000001010713615720000026044 0ustar paulliupaulliupackage charactermanaj.model; import java.util.AbstractList; import java.util.ArrayList; import java.util.List; import javax.swing.event.EventListenerList; /** * 監視可能なリスト * * @param */ public class ObservableList extends AbstractList { /** * 要素がリストに追加または削除されるときに呼び出されるフック * @param */ public interface Hook { /** * リストに追加された場合 * @param item */ void add(E item); /** * リストから除去された場合 * @param item */ void remove(E item); } /** * リストの実体 */ private final List parent; /** * フック */ private Hook hook; /** * イベントリスナのリスト */ private final EventListenerList listeners = new EventListenerList(); /** * 空のArrayListを使って構築する */ public ObservableList() { this(new ArrayList()); } /** * 指定したリストを使って構築する * @param parent 元となるリスト */ public ObservableList(List parent) { if (parent == null) { throw new NullPointerException(); } this.parent = parent; } /** * 指定したリストを使って構築した監視可能リストを返す * @param parent 元となるリスト * @return 監視可能リスト */ public static ObservableList wrap(List parent) { return new ObservableList(parent); } /** * 現在のフックを取得する。なればnull * @return */ public Hook getHook() { return hook; } /** * フックを設定する。解除する場合はnull * @param hook */ public void setHook(Hook hook) { this.hook = hook; } /** * 元となるリストを取得する * @return 元となるリスト */ public List unwrap() { return parent; } /** * 変更通知リスナを登録する * @param l リスナ */ public void addListChangeListener(ListChangeListener l) { listeners.add(ListChangeListener.class, l); } /** * 変更通知リスナを登録解除する * @param l リスナ */ public void removeListChangeListener(ListChangeListener l) { listeners.remove(ListChangeListener.class, l); } /** * 全ての変更通知リスナに対して変更イベントを通知する。 * @param type 変更タイプ * @param index リストのインデックス */ @SuppressWarnings("unchecked") public void fireEvent(ListChangeListener.ChangeType type, int index, E oldValue, E newValue) { // Guaranteed to return a non-null array Object[] ll = listeners.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event // ※ 逆順で通知するのがSwingの作法らしい。 ListChangeListener.Change event = null; for (int i = ll.length - 2; i >= 0; i -= 2) { if (ll[i] == ListChangeListener.class) { // Lazily create the event: if (event == null) { event = new ListChangeListener.Change(this, type, index, oldValue, newValue); } ((ListChangeListener) ll[i + 1]).onChanged(event); } } } @Override public E get(int index) { return parent.get(index); } @Override public int size() { return parent.size(); } @Override public E set(int index, E element) { E ret = parent.set(index, element); fireEvent(ListChangeListener.ChangeType.MODIFIY, index, ret, element); if (hook != null) { if (ret != null && !ret.equals(element)) { hook.remove(ret); } if (element != null && !element.equals(ret)) { hook.add(element); } } return ret; } public void setAll(List items) { clear(); if (items != null) { addAll(items); } } @Override public void add(int index, E element) { parent.add(index, element); if (element != null && hook != null) { hook.add(element); } fireEvent(ListChangeListener.ChangeType.ADD, index, null, element); } @Override public E remove(int index) { E ret = parent.remove(index); fireEvent(ListChangeListener.ChangeType.REMOVE, index, ret, null); if (ret != null && hook != null) { hook.remove(ret); } return ret; } }CharacterManaJ/src/main/java/charactermanaj/model/PartsSpec.java0000644000175000017500000000314513615720000025034 0ustar paulliupaulliupackage charactermanaj.model; /** * パーツの構成情報.
* @author seraphy */ public class PartsSpec { private PartsIdentifier partsIdentifier; private ColorGroup colorGroup = ColorGroup.NA; private PartsFiles partsFiles; /** * パーツの作者情報、指定がなければnull */ private PartsAuthorInfo authorInfo; /** * パーツのバージョン、指定がなければ0 */ private double version; /** * ダウンロードURL */ private String downloadURL; public PartsSpec(PartsIdentifier partsIdentifier) { if (partsIdentifier == null) { throw new IllegalArgumentException(); } this.partsIdentifier = partsIdentifier; this.partsFiles = new PartsFiles(partsIdentifier); } public PartsIdentifier getPartsIdentifier() { return partsIdentifier; } public PartsFiles getPartsFiles() { return partsFiles; } public void setAuthorInfo(PartsAuthorInfo authorInfo) { this.authorInfo = authorInfo; } public PartsAuthorInfo getAuthorInfo() { return authorInfo; } public String getAuthor() { if (authorInfo != null) { return authorInfo.getAuthor(); } return null; } public void setVersion(double version) { this.version = version; } public double getVersion() { return version; } public String getDownloadURL() { return downloadURL; } public void setDownloadURL(String downloadURL) { this.downloadURL = downloadURL; } public void setColorGroup(ColorGroup colorGroup) { if (colorGroup == null) { colorGroup = ColorGroup.NA; } this.colorGroup = colorGroup; } public ColorGroup getColorGroup() { return colorGroup; } } CharacterManaJ/src/main/java/charactermanaj/model/RecommendationURL.java0000644000175000017500000000225713615720000026462 0ustar paulliupaulliupackage charactermanaj.model; /** * お勧めリンク * @author seraphy */ public class RecommendationURL implements Cloneable { private String displayName; private String url; @Override public RecommendationURL clone() { try { return (RecommendationURL) super.clone(); } catch (CloneNotSupportedException ex) { throw new RuntimeException(ex); } } @Override public int hashCode() { if (url == null) { return 0; } return url.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof RecommendationURL) { RecommendationURL o = (RecommendationURL) obj; return (displayName == null ? (o.displayName == null) : displayName.equals(o.displayName)) && (url == null ? (o.url == null) : url.equals(o.url)); } return false; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } @Override public String toString() { return "displayName=" + displayName + "/url=" + url; } } CharacterManaJ/src/main/java/charactermanaj/model/IndependentPartsSetInfo.java0000644000175000017500000001247213615720000027672 0ustar paulliupaulliupackage charactermanaj.model; import java.awt.Color; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; /** * 素のパーツセットの情報.
* レイヤーやカテゴリなどのリレーションシップがない、
* 特定のキャラクターデータモデルのツリーの一部には組み込まれていない状態のもの.
*/ public class IndependentPartsSetInfo { /** * ロガー */ private static final Logger logger = Logger .getLogger(IndependentPartsSetInfo.class.getName()); /** * バーツセットのID */ private String id; /** * パーツセットの表示名 */ private String displayName; /** * 背景色、未設定であればnull */ private Color backgroundColor; /** * アフィン変換パラメータ、未設定であればnull */ private double[] affineTransformParameter; /** * アクティブなカスタムレイヤーパターンIDのセット */ private Set activeCustomLayerPatternIds; /** * カテゴリIDをキーとし、パーツ名をキーとしカラー情報のリストを値とするマップを値とする. */ private Map>> partsMap = new HashMap>>(); public String getId() { return id; } public void setId(String id) { this.id = id; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } public Color getBackgroundColor() { return backgroundColor; } public void setBackgroundColor(Color backgroundColor) { this.backgroundColor = backgroundColor; } public double[] getAffineTransformParameter() { return affineTransformParameter; } public void setAffineTransformParameter( double[] affineTransformParameter) { this.affineTransformParameter = affineTransformParameter; } public Set getActiveCustomLayerPatternIds() { return activeCustomLayerPatternIds; } public void setActiveCustomLayerPatternIds(Set activeCustomLayerPatternIds) { this.activeCustomLayerPatternIds = activeCustomLayerPatternIds; } /** * カテゴリIDをキーとし、パーツ名をキーとしカラー情報のリストを値とするマップを値とする. * * @return カテゴリIDをキーとし、パーツ名をキーとしカラー情報のリストを値とするマップを値とする. */ public Map>> getPartsMap() { return partsMap; } public void setPartsMap( Map>> partsMap) { if (partsMap == null) { throw new IllegalArgumentException(); } this.partsMap = partsMap; } /** * インスタンス独立のパーツセット情報から、指定されたキャラクターデータに関連づけられた パーツ情報に変換して返す.
* * @param partsSetInfo * インスタンス独立のパーツセット情報 * @param characterData * キャラクターデータ * @param presetParts * プリセットか? * @return キャラクターデータに関連づけられたパーツセットインスタンス */ public static PartsSet convertPartsSet( IndependentPartsSetInfo partsSetInfo, CharacterData characterData, boolean presetParts) { if (partsSetInfo == null || characterData == null) { throw new IllegalArgumentException(); } PartsSet partsSet = new PartsSet(); partsSet.setPartsSetId(partsSetInfo.getId()); partsSet.setLocalizedName(partsSetInfo.getDisplayName()); partsSet.setPresetParts(presetParts); Color backgroundColor = partsSetInfo.getBackgroundColor(); if (backgroundColor != null) { partsSet.setBgColor(backgroundColor); } double[] affineTrans = partsSetInfo.getAffineTransformParameter(); if (affineTrans != null) { partsSet.setAffineTransformParameter(affineTrans); } Map>> partsMap = partsSetInfo .getPartsMap(); for (Map.Entry>> categoryEntry : partsMap .entrySet()) { String categoryId = categoryEntry.getKey(); Map> categoryPartsMap = categoryEntry .getValue(); PartsCategory partsCategory = characterData .getPartsCategory(categoryId); if (partsCategory == null) { logger.log(Level.WARNING, "undefined category-id: " + categoryId); continue; } for (Map.Entry> partsEntry : categoryPartsMap .entrySet()) { String partsName = partsEntry.getKey(); List colorInfoList = partsEntry .getValue(); PartsIdentifier partsIdentifier = new PartsIdentifier( partsCategory, partsName, partsName); PartsColorInfo partsColorInfo = IndependentPartsColorInfo .buildPartsColorInfo(characterData, partsCategory, colorInfoList); partsSet.appendParts(partsCategory, partsIdentifier, partsColorInfo); } } // 適用しているカスタムレイヤー名 partsSet.setActiveCustomLayerPatternIds(partsSetInfo.getActiveCustomLayerPatternIds()); return partsSet; } } CharacterManaJ/src/main/java/charactermanaj/model/PartsManageDataConverter.java0000644000175000017500000000413213615720000030011 0ustar paulliupaulliupackage charactermanaj.model; /** * パーツ設定情報から、パーツ管理情報に変換する.
* @author seraphy * */ public class PartsManageDataConverter { private PartsManageData partsManageData; /** * パーツ管理情報は自動作成される.
* @param partsSpecResolver */ public PartsManageDataConverter() { this(null); } /** * 書き込み先となるパーツ管理情報を指定して構築する.
* パーツ管理情報がnullの場合は自動作成される.
* @param partsManageData パーツ管理情報(書き込み先) */ public PartsManageDataConverter(PartsManageData partsManageData) { if (partsManageData == null) { this.partsManageData = new PartsManageData(); } else { this.partsManageData = partsManageData; } } /** * パーツ管理情報を取得する. * @return パーツ管理情報 */ public PartsManageData getPartsManageData() { return partsManageData; } /** * パーツ識別子とパーツ設定情報を指定して、パーツ管理情報に変換して登録する.
* @param partsIdentifier パーツ識別子 * @param partsSpec パーツ設定情報(null可) */ public void convert(PartsIdentifier partsIdentifier, PartsSpec partsSpec) { if (partsIdentifier == null) { throw new IllegalArgumentException(); } String localizedName = partsIdentifier.getLocalizedPartsName(); double version; String downloadURL; if (partsSpec != null) { version = partsSpec.getVersion(); downloadURL = partsSpec.getDownloadURL(); } else { version = 0; downloadURL = null; } PartsAuthorInfo partsAuthorInfo; if (partsSpec != null) { partsAuthorInfo = partsSpec.getAuthorInfo(); } else { partsAuthorInfo = null; } PartsManageData.PartsVersionInfo versionInfo = new PartsManageData.PartsVersionInfo(); versionInfo.setDownloadURL(downloadURL); versionInfo.setVersion(version); PartsManageData.PartsKey partsKey = new PartsManageData.PartsKey(partsIdentifier); partsManageData.putPartsInfo(partsKey, localizedName, partsAuthorInfo, versionInfo); } } CharacterManaJ/src/main/java/charactermanaj/model/CharacterDataChangeObserver.java0000644000175000017500000000337013615720000030434 0ustar paulliupaulliupackage charactermanaj.model; import javax.swing.event.EventListenerList; /** * キャラクターデータが変更されたことを通知するためのメカニズム * * @author seraphy * */ public abstract class CharacterDataChangeObserver { private static CharacterDataChangeObserver inst = new CharacterDataChangeObserverImpl(); public static CharacterDataChangeObserver getDefault() { return inst; } public abstract void addCharacterDataChangeListener( CharacterDataChangeListener l); public abstract void removeCharacterDataChangeListener( CharacterDataChangeListener l); public abstract void notifyCharacterDataChange(CharacterDataChangeEvent e); public void notifyCharacterDataChange(Object wnd, CharacterData cd, boolean changeStructure, boolean reloadPartsAndFavorites) { if (cd == null) { throw new IllegalArgumentException(); } notifyCharacterDataChange(new CharacterDataChangeEvent(wnd, cd, changeStructure, reloadPartsAndFavorites)); } } class CharacterDataChangeObserverImpl extends CharacterDataChangeObserver { private EventListenerList listeners = new EventListenerList(); @Override public void addCharacterDataChangeListener(CharacterDataChangeListener l) { listeners.add(CharacterDataChangeListener.class, l); } @Override public void removeCharacterDataChangeListener(CharacterDataChangeListener l) { listeners.remove(CharacterDataChangeListener.class, l); } @Override public void notifyCharacterDataChange(CharacterDataChangeEvent e) { if (e == null) { throw new IllegalArgumentException(); } CharacterDataChangeListener[] lst = listeners .getListeners(CharacterDataChangeListener.class); for (CharacterDataChangeListener l : lst) { l.notifyChangeCharacterData(e); } } } CharacterManaJ/src/main/java/charactermanaj/model/PartsManageData.java0000644000175000017500000002466113615720000026132 0ustar paulliupaulliupackage charactermanaj.model; import java.sql.Timestamp; import java.util.AbstractCollection; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * パーツ管理情報.
* パーツ識別子のかわりに、パーツキーを用いる.
* パーツキーは、CategoryIdがnullであることを許可している.
* カテゴリを省略し、パーツ名だけでパーツ管理情報を検索できるようにするためのもの.
* * @author seraphy */ public class PartsManageData extends AbstractCollection { /** * パーツキー.
* パーツ識別子 {@link PartsIdentifier} とほぼ同等であるが、カテゴリがnullであることを許可している点が異なる.
* * @author seraphy */ public static final class PartsKey implements Comparable { private final String partsName; private final String categoryId; public PartsKey(String partsName) { this(partsName, null); } public PartsKey(String partsName, String categoryId) { if (partsName == null || partsName.length() == 0) { throw new IllegalArgumentException(); } if (categoryId != null && categoryId.trim().length() == 0) { categoryId = null; } this.partsName = partsName; this.categoryId = categoryId; } public PartsKey(PartsIdentifier partsIdentifier) { if (partsIdentifier == null) { throw new IllegalArgumentException(); } this.partsName = partsIdentifier.getPartsName(); this.categoryId = partsIdentifier.getPartsCategory().getCategoryId(); } public int compareTo(PartsKey o) { int ret = partsName.compareTo(o.partsName); if (ret == 0) { if (categoryId == null || o.categoryId == null) { ret = (categoryId == o.categoryId) ? 0 : (categoryId == null ? -1 : 1); } } return ret; } public String getCategoryId() { return categoryId; } public String getPartsName() { return partsName; } @Override public int hashCode() { return partsName.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof PartsKey) { PartsKey o = (PartsKey) obj; if (partsName.equals(o.partsName)) { return categoryId == null ? (o.categoryId == null) : categoryId.equals(o.categoryId); } } return false; } } /** * パーツごとのバージョンとダウンロードURL情報を保持するホルダークラス.
* * @author seraphy */ public static final class PartsVersionInfo { private double version; private String downloadURL; private Timestamp lastModified; public PartsVersionInfo() { super(); } public PartsVersionInfo(double version, String downloadURL) { this(version, downloadURL, null); } public PartsVersionInfo(double version, String downloadURL, Timestamp lastModified) { this.version = version; this.downloadURL = downloadURL; this.lastModified = lastModified; } public double getVersion() { return version; } public String getDownloadURL() { return downloadURL; } public void setVersion(double version) { this.version = version; } public void setDownloadURL(String downloadURL) { this.downloadURL = downloadURL; } public Timestamp getLastModified() { return lastModified; } public void setLastModified(Timestamp lastModified) { this.lastModified = lastModified; } } /** * パーツキーと、それに対する作者情報 */ private HashMap partsAuthorInfoMap = new HashMap(); /** * パーツキーと、それに対するローカライズ名 */ private HashMap partsLocalizedNameMap = new HashMap(); /** * パーツキーと、それに対するバージョン情報 */ private HashMap partsVersionInfoMap = new HashMap(); /** * すべてクリアする.
*/ @Override public void clear() { partsAuthorInfoMap.clear(); partsLocalizedNameMap.clear(); partsVersionInfoMap.clear(); } /** * パーツキーに結びつく、各種情報を登録する.
* * @param partsKey * パーツキー * @param localizedName * ローカライズ名(なければnull) * @param partsAuthorInfo * 作者情報 (なければnull) * @param versionInfo * バージョン情報 (なければnull) */ public void putPartsInfo(PartsKey partsKey, String localizedName, PartsAuthorInfo partsAuthorInfo, PartsVersionInfo versionInfo) { if (partsKey == null) { throw new IllegalArgumentException(); } partsAuthorInfoMap.put(partsKey, partsAuthorInfo); partsLocalizedNameMap.put(partsKey, localizedName); partsVersionInfoMap.put(partsKey, versionInfo); } /** * パーツキーを指定して該当する作者情報を取得する.
* 完全に一致する作者情報がない場合は、カテゴリを無視して、パーツキーのパーツ名(ID)の一致する、いずれかの作者情報を返す.
* * @param partsKey * パーツキー * @return 作者情報、完全に一致するものがなく、且つ、パーツ名(ID)に一致する情報もない場合はnull */ public PartsAuthorInfo getPartsAuthorInfo(PartsKey partsKey) { if (partsKey == null) { return null; } PartsAuthorInfo authorInfo = partsAuthorInfoMap.get(partsKey); if (authorInfo == null) { for (Map.Entry entry : partsAuthorInfoMap.entrySet()) { PartsKey key = entry.getKey(); if (key.getPartsName().equals(partsKey.getPartsName())) { authorInfo = entry.getValue(); break; } } } return authorInfo; } /** * パーツキーと完全に一致する作者情報を取得する.
* 存在しない場合はnullを返す.
* * @param partsKey * パーツキー * @return 作者情報、もしくはnull */ public PartsAuthorInfo getPartsAuthorInfoStrict(PartsKey partsKey) { if (partsKey == null) { return null; } return partsAuthorInfoMap.get(partsKey); } /** * パーツキーを指定して該当するバージョン情報を取得する.
* 完全に一致するバージョン情報がない場合は、カテゴリを無視して、パーツキーのパーツ名(ID)の一致する、いずれかのバージョン情報を返す.
* * @param partsKey * パーツキー * @return バージョン情報、完全に一致するものがなく、且つ、パーツ名(ID)に一致する情報もない場合はnull */ public PartsVersionInfo getVersion(PartsKey partsKey) { if (partsKey == null) { return null; } PartsVersionInfo versionInfo = partsVersionInfoMap.get(partsKey); if (versionInfo == null) { for (Map.Entry entry : partsVersionInfoMap.entrySet()) { PartsKey key = entry.getKey(); if (key.getPartsName().equals(partsKey.getPartsName())) { versionInfo = entry.getValue(); break; } } } return versionInfo; } /** * パーツキーを指定して該当するローカライズ名を取得する.
* 完全に一致するバージョン情報がない場合は、カテゴリを無視して、パーツキーのパーツ名(ID)の一致する、いずれかのローカライズ名を返す.
* * @param partsKey * パーツキー * @return バージョン情報、完全に一致するものがなく、且つ、パーツ名(ID)に一致する情報もない場合はnull */ public String getLocalizedName(PartsKey partsKey) { if (partsKey == null) { return null; } String localizedName = partsLocalizedNameMap.get(partsKey); if (localizedName == null) { for (Map.Entry entry : partsLocalizedNameMap.entrySet()) { PartsKey key = entry.getKey(); if (key.getPartsName().equals(partsKey.getPartsName())) { localizedName = entry.getValue(); break; } } } return localizedName; } /** * パーツキーと完全に一致するバージョン情報を取得する.
* * @param partsKey * パーツキー * @return パーツキーに完全に一致するバージョン情報、該当がなければnull */ public PartsVersionInfo getVersionStrict(PartsKey partsKey) { if (partsKey == null) { return null; } return partsVersionInfoMap.get(partsKey); } /** * パーツキーと完全に一致するローカライズ名を取得する.
* * @param partsKey * パーツキー * @return パーツキーに完全に一致するローカライズ名、該当がなければnull */ public String getLocalizedNameStrict(PartsKey partsKey) { if (partsKey == null) { return null; } return partsLocalizedNameMap.get(partsKey); } /** * すべての作者情報を返す.
* * @return 作者情報のコレクション */ public Collection getAuthorInfos() { HashMap authorInfos = new HashMap(); for (PartsAuthorInfo authorInfo : partsAuthorInfoMap.values()) { if (authorInfo != null) { String author = authorInfo.getAuthor(); if (author != null && author.length() > 0) { authorInfos.put(author, authorInfo); } } } return authorInfos.values(); } /** * 指定した作者に該当する登録されているパーツキーの一覧を返す.
* * @param author * 作者 * @return 作者に該当するパーツキー */ public Collection getPartsKeysByAuthor(String author) { if (author == null) { return Collections.emptyList(); } ArrayList partsKeys = new ArrayList(); for (Map.Entry entry : partsAuthorInfoMap.entrySet()) { PartsKey partsKey = entry.getKey(); PartsAuthorInfo partsAuthorInfo = entry.getValue(); if (partsAuthorInfo != null) { String author2 = partsAuthorInfo.getAuthor(); if (author2 == null) { author2 = ""; } if (author2.equals(author)) { partsKeys.add(partsKey); } } } return partsKeys; } @Override public Iterator iterator() { return partsAuthorInfoMap.keySet().iterator(); } @Override public int size() { return partsAuthorInfoMap.size(); } } CharacterManaJ/src/main/java/charactermanaj/model/LayerOrderMapper.java0000644000175000017500000000024413615720000026342 0ustar paulliupaulliupackage charactermanaj.model; /** * レイヤーの補正済み順序を取得する */ public interface LayerOrderMapper { float getLayerOrder(Layer layer); }CharacterManaJ/src/main/java/charactermanaj/ui/0000755000175000017500000000000013615720000021577 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/ui/ArchiveFileChooser.java0000644000175000017500000000561113615720000026151 0ustar paulliupaulliupackage charactermanaj.ui; import java.io.File; import java.util.Properties; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileFilter; import charactermanaj.model.AppConfig; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * OK押下時に拡張子の補完とオーバーライドの警告を行うファイルチューザー.
* @author seraphy */ public class ArchiveFileChooser extends JFileChooser { private static final long serialVersionUID = -3908688762049311010L; protected static final String STRINGS_RESOURCE = "languages/exportwizdialog"; /** * Jarファイルフィルタ */ public static final FileFilter cmjFileFilter = new FileFilter() { @Override public String getDescription() { return "CharacterManaJ (*.cmj)"; } @Override public boolean accept(File f) { return f.isDirectory() || f.getName().endsWith(".cmj"); } }; /** * Zipファイルフィルタ */ public static final FileFilter zipFileFilter = new FileFilter() { @Override public String getDescription() { AppConfig appConfig = AppConfig.getInstance(); String zipNameEncoding = appConfig.getZipNameEncoding(); return "ZIP (" + zipNameEncoding + ") (*.zip)"; } @Override public boolean accept(File f) { return f.isDirectory() || f.getName().endsWith(".zip"); } }; protected boolean writeMode; protected ArchiveFileChooser(File initFile, boolean writeMode) { super(initFile); this.writeMode = writeMode; // フィルタの登録 addChoosableFileFilter(zipFileFilter); addChoosableFileFilter(cmjFileFilter); // デフォルトのフィルタ setFileFilter(zipFileFilter); } @Override public void approveSelection() { File file = getSelectedFile(); if (file == null) { return; } // ディレクトリ名を指定した場合は、そこに移動する. if (file.exists() && file.isDirectory()) { setCurrentDirectory(file); setSelectedFile(null); return; } String lcName = file.getName().toLowerCase(); FileFilter selfilter = getFileFilter(); if (selfilter == cmjFileFilter) { if (!lcName.endsWith(".cmj")) { file = new File(file.getPath() + ".cmj"); setSelectedFile(file); } } if (selfilter == zipFileFilter) { if (!lcName.endsWith(".zip")) { file = new File(file.getPath() + ".zip"); setSelectedFile(file); } } Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); if (writeMode && file.exists()) { if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.overwrite"), strings.getProperty("confirm"), JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) { return; } } if (!writeMode && !file.exists()) { JOptionPane.showMessageDialog(this, strings.getProperty("requiredExists")); return; } super.approveSelection(); } }; CharacterManaJ/src/main/java/charactermanaj/ui/PreviewPanel.java0000644000175000017500000017065013615720000025054 0ustar paulliupaulliupackage charactermanaj.ui; import static java.lang.Math.*; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.EventObject; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.TreeSet; import java.util.concurrent.Semaphore; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractButton; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.JToolBar; import javax.swing.JViewport; import javax.swing.OverlayLayout; import javax.swing.SwingUtilities; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.basic.BasicComboBoxEditor; import charactermanaj.Main; import charactermanaj.graphics.filters.BackgroundColorFilter; import charactermanaj.graphics.filters.BackgroundColorFilter.BackgroundColorMode; import charactermanaj.model.AppConfig; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.ui.util.ScrollPaneDragScrollSupport; import charactermanaj.util.LocalizedResourcePropertyLoader; import charactermanaj.util.UIHelper; /** * プレビューパネル * * @author seraphy */ public class PreviewPanel extends JPanel { private static final long serialVersionUID = 1L; protected static final String STRINGS_RESOURCE = "languages/previewpanel"; /** * プレビューパネルの上部ツールバーの通知を受けるリスナ * * @author seraphy */ public interface PreviewPanelListener { /** * 保存 * * @param e */ void savePicture(PreviewPanelEvent e); /** * コピー * * @param e */ void copyPicture(PreviewPanelEvent e); /** * 背景色変更 * * @param e */ void changeBackgroundColor(PreviewPanelEvent e); /** * 情報 * * @param e */ void showInformation(PreviewPanelEvent e); /** * お気に入りに追加 * * @param e */ void addFavorite(PreviewPanelEvent e); /** * 左右反転 * * @param e */ void flipHorizontal(PreviewPanelEvent e); } /** * ロード中を示すインジケータ */ private final String indicatorText; /** * ロード中であるか判定するタイマー */ private final Timer timer; /** * インジケータを表示するまでのディレイ */ private long indicatorDelay; @Override public void addNotify() { super.addNotify(); if (!timer.isRunning()) { timer.start(); } } @Override public void removeNotify() { if (timer.isRunning()) { timer.stop(); } super.removeNotify(); } public static class PreviewPanelEvent extends EventObject { private static final long serialVersionUID = 1L; private int modifiers; public PreviewPanelEvent(Object src, ActionEvent e) { this(src, (e == null) ? 0 : e.getModifiers()); } public PreviewPanelEvent(Object src, int modifiers) { super(src); this.modifiers = modifiers; } public int getModifiers() { return modifiers; } public boolean isShiftKeyPressed() { return (modifiers & ActionEvent.SHIFT_MASK) != 0; } } private final Object lock = new Object(); private long loadingTicket; private long loadedTicket; private long firstWaitingTimestamp; private boolean indicatorShown; private String title; private JLabel lblTitle; private JLayeredPane layeredPane; private CheckInfoLayerPanel checkInfoLayerPanel; private PreviewImagePanel previewImgPanel; private JScrollPane previewImgScrollPane; private ScrollPaneDragScrollSupport scrollSupport; private PreviewControlPanel previewControlPanel; private double latestToggleZoom = 2.; private LinkedList listeners = new LinkedList(); public PreviewPanel(ScaleSupport scaleSupport) { setLayout(new BorderLayout()); final AppConfig appConfig = AppConfig.getInstance(); final Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); // 画像をロード中であることを示すインジケータの確認サイクル. timer = new Timer(100, new ActionListener() { public void actionPerformed(ActionEvent e) { onTimer(); } }); indicatorText = strings.getProperty("indicatorText"); indicatorDelay = appConfig.getPreviewIndicatorDelay(); UIHelper uiUtl = UIHelper.getInstance(); JButton saveBtn = uiUtl.createIconButton("icons/save.png"); JButton copyBtn = uiUtl.createIconButton("icons/copy.png"); JButton colorBtn = uiUtl.createIconButton("icons/color.png"); JButton informationBtn = uiUtl.createIconButton("icons/information.png"); JButton favoriteBtn = uiUtl.createIconButton("icons/favorite.png"); JButton flipHolizontalBtn = uiUtl.createIconButton("icons/flip.png"); saveBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { savePicture(new PreviewPanelEvent(PreviewPanel.this, e)); } }); copyBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { copyPicture(new PreviewPanelEvent(PreviewPanel.this, e)); } }); colorBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { changeBackgroundColor(new PreviewPanelEvent(PreviewPanel.this, e)); } }); informationBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showInformation(new PreviewPanelEvent(PreviewPanel.this, e)); } }); favoriteBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addFavorite(new PreviewPanelEvent(PreviewPanel.this, e)); } }); flipHolizontalBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { flipHolizontal(new PreviewPanelEvent(PreviewPanel.this, e)); } }); saveBtn.setToolTipText(strings.getProperty("tooltip.save")); copyBtn.setToolTipText(strings.getProperty("tooltip.copy")); colorBtn.setToolTipText(strings.getProperty("tooltip.changeBgColor")); informationBtn.setToolTipText(strings.getProperty("tooltip.showInformation")); favoriteBtn.setToolTipText(strings.getProperty("tooltip.registerFavorites")); flipHolizontalBtn.setToolTipText(strings.getProperty("tooltip.flipHorizontal")); final JToolBar toolBar = new JToolBar(); toolBar.setFloatable(false); toolBar.add(flipHolizontalBtn); toolBar.add(copyBtn); toolBar.add(saveBtn); toolBar.add(Box.createHorizontalStrut(8)); toolBar.add(colorBtn); toolBar.add(Box.createHorizontalStrut(4)); toolBar.add(favoriteBtn); toolBar.add(informationBtn); lblTitle = new JLabel() { private static final long serialVersionUID = 1L; public Dimension getPreferredSize() { Dimension dim = super.getPreferredSize(); int maxWidth = getParent().getWidth() - toolBar.getWidth(); if (dim.width > maxWidth) { dim.width = maxWidth; } return dim; }; public Dimension getMaximumSize() { return getPreferredSize(); }; public Dimension getMinimumSize() { Dimension dim = getPreferredSize(); dim.width = 50; return dim; }; }; lblTitle.setBorder(BorderFactory.createEmptyBorder(3, 10, 3, 3)); JPanel previewPaneHeader = new JPanel(); previewPaneHeader.setLayout(new BorderLayout()); previewPaneHeader.add(lblTitle, BorderLayout.WEST); previewPaneHeader.add(toolBar, BorderLayout.EAST); previewImgPanel = new PreviewImagePanel(); previewImgScrollPane = new JScrollPane(previewImgPanel); previewImgScrollPane.setAutoscrolls(false); previewImgScrollPane.setWheelScrollingEnabled(false); previewImgScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); previewImgScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scrollSupport = new ScrollPaneDragScrollSupport(previewImgScrollPane) { @Override protected void setCursor(Cursor cursor) { PreviewPanel.this.setCursor(cursor); } }; add(previewPaneHeader, BorderLayout.NORTH); layeredPane = new JLayeredPane(); layeredPane.setLayout(new OverlayLayout(layeredPane)); layeredPane.add(previewImgScrollPane, JLayeredPane.DEFAULT_LAYER); checkInfoLayerPanel = new CheckInfoLayerPanel(); layeredPane.add(checkInfoLayerPanel, JLayeredPane.POPUP_LAYER); checkInfoLayerPanel.setVisible(false); add(layeredPane, BorderLayout.CENTER); previewControlPanel = new PreviewControlPanel(); Dimension dim = previewControlPanel.getPreferredSize(); Dimension prevDim = previewImgScrollPane.getPreferredSize(); dim.width = prevDim.width; previewControlPanel.setPreferredSize(dim); add(previewControlPanel, BorderLayout.SOUTH); previewControlPanel.setPinned(appConfig.isEnableZoomPanel()); // 倍率が変更された場合 previewControlPanel.addPropertyChangeListener("zoomFactorInt", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { Integer newValue = (Integer) evt.getNewValue(); zoomWithCenterPosition(newValue.doubleValue() / 100., null); } }); // 背景モードが切り替えられた場合 previewControlPanel.addPropertyChangeListener("backgroundColorMode", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { BackgroundColorMode bgColorMode = (BackgroundColorMode) evt.getNewValue(); previewImgPanel.setBackgroundColorMode(bgColorMode); if (bgColorMode != BackgroundColorMode.ALPHABREND && appConfig.isEnableCheckInfoTooltip() ) { // チェック情報ツールチップの表示 checkInfoLayerPanel.setMessage(null); checkInfoLayerPanel.setVisible(true); } else { // チェック情報ツールチップの非表示 checkInfoLayerPanel.setVisible(false); } } }); previewImgScrollPane.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { Rectangle rct = previewImgScrollPane.getBounds(); int y = e.getY(); UIHelper uiUtl = UIHelper.getInstance(); if (y > rct.height - (int) (appConfig.getZoomPanelActivationArea() * uiUtl.getScaleY())) { previewControlPanel.setVisible(true); } else { if ( !previewControlPanel.isPinned()) { previewControlPanel.setVisible(false); } } } }); // 標準のホイールリスナは削除する. for (final MouseWheelListener listener : previewImgScrollPane.getMouseWheelListeners()) { previewImgScrollPane.removeMouseWheelListener(listener); } previewImgScrollPane.addMouseWheelListener(new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent e) { if ((Main.isMacOSX() && e.isAltDown()) || ( !Main.isMacOSX() && e.isControlDown())) { // Mac OS XならOptionキー、それ以外はコントロールキーとともにホイールスクロールの場合 zoomByWheel(e); } else { // ズーム以外のホイール操作はスクロールとする. scrollByWheel(e); } // 現在画像位置の情報の更新 updateCheckInfoMessage(e.getPoint()); } }); previewImgScrollPane.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (e.getClickCount() == 2) { // ダブルクリック // (正確に2回目。3回目以降はダブルクリック + シングルクリック) toggleZoom(e.getPoint()); } else { scrollSupport.drag(true, e.getPoint()); } } @Override public void mouseReleased(MouseEvent e) { scrollSupport.drag(false, e.getPoint()); } }); previewImgScrollPane.addMouseMotionListener(new MouseMotionListener() { public void mouseMoved(MouseEvent e) { updateCheckInfoMessage(e.getPoint()); } public void mouseDragged(MouseEvent e) { scrollSupport.dragging(e.getPoint()); // 現在画像位置の情報の更新 updateCheckInfoMessage(e.getPoint()); } }); } /** * 倍率を切り替える. */ protected void toggleZoom(Point mousePos) { if (previewImgPanel.isDefaultZoom()) { // 等倍であれば以前の倍率を適用する. zoomWithCenterPosition(latestToggleZoom, mousePos); } else { // 等倍でなければ現在の倍率を記憶して等倍にする. double currentZoomFactor = previewImgPanel.getZoomFactor(); latestToggleZoom = currentZoomFactor; zoomWithCenterPosition(1., mousePos); } } /** * マウス位置に対して画像情報のツールチップを表示する * * @param mousePosition * マウス位置 */ protected void updateCheckInfoMessage(Point mousePosition) { if ( !checkInfoLayerPanel.isVisible()) { return; } // マウス位置から画像位置を割り出す Point imgPos = null; if (mousePosition != null) { Point panelPt = SwingUtilities.convertPoint(previewImgScrollPane, mousePosition, previewImgPanel); imgPos = previewImgPanel.getImagePosition(panelPt); } if (imgPos != null) { // 画像位置があれば、その位置の情報を取得する. int argb = previewImgPanel.getImageARGB(imgPos); int a = (argb >> 24) & 0xff; int r = (argb >> 16) & 0xff; int g = (argb >> 8) & 0xff; int b = argb & 0xff; int y = (int) (0.298912f * r + 0.586611f * g + 0.114478f * b); String text = String.format( "(%3d,%3d)¥nA:%3d, Y:%3d¥nR:%3d, G:%3d, B:%3d", imgPos.x, imgPos.y, a, y, r, g, b); checkInfoLayerPanel.setMessage(text); checkInfoLayerPanel.setPotision(mousePosition); } else { // 画像位置がなければツールチップは空にする. checkInfoLayerPanel.setMessage(null); } } /** * マウス座標単位で指定したオフセット分スクロールする. * * @param diff_x * 水平方向スクロール数 * @param diff_y * 垂直方向スクロール数 */ protected void scroll(int diff_x, int diff_y) { scrollSupport.scroll(diff_x, diff_y); } /** * マウスホイールによる水平・垂直スクロール.
* シフトキーで水平、それ以外は垂直とする.
* * @param e * ホイールイベント */ protected void scrollByWheel(final MouseWheelEvent e) { scrollSupport.scrollByWheel(e); // イベントは処理済みとする. e.consume(); } /** * ホイールによる拡大縮小.
* ホイールの量は関係なく、方向だけで判定する.
* プラットフォームごとに修飾キーの判定が異なるので、 呼び出しもとであらかじめ切り分けて呼び出すこと.
* * @param e * ホイールイベント */ protected void zoomByWheel(final MouseWheelEvent e) { int wheelRotation = e.getWheelRotation(); double currentZoom = previewImgPanel.getZoomFactor(); double zoomFactor; if (wheelRotation < 0) { // ホイール上で拡大 zoomFactor = currentZoom * 1.1; } else if (wheelRotation > 0){ // ホイール下で縮小 zoomFactor = currentZoom * 0.9; } else { return; } // 倍率変更する zoomWithCenterPosition(zoomFactor, e.getPoint()); // イベント処理済み e.consume(); } /** * ズームスライダまたはコンボのいずれかの値を更新すると、他方からも更新通知があがるため 二重処理を防ぐためのセマフォ.
*/ private Semaphore zoomLock = new Semaphore(1); /** * プレビューに表示する画像の倍率を更新する.
* 指定した座標が拡大縮小の中心点になるようにスクロールを試みる.
* 座標がnullの場合は現在表示されている中央を中心とするようにスクロールを試みる.
* (スクロールバーが表示されていない、もしくは十分にスクロールできない場合は必ずしも中心とはならない.)
* コントロールパネルの表示値も更新する.
* コントロールパネルからの更新通知をうけて再入しないように、 同時に一つしか実行されないようにしている.
* * @param zoomFactor * 倍率、範囲外のものは範囲内に補正される. * @param mousePos * スクロールペイン上のマウス座標、もしくはnull(nullの場合は表示中央) */ protected void zoomWithCenterPosition(double zoomFactor, Point mousePos) { if ( !zoomLock.tryAcquire()) { return; } try { // 範囲制限. if (zoomFactor < 0.2) { zoomFactor = 0.2; } else if (zoomFactor > 8.) { zoomFactor = 8.; } JViewport vp = previewImgScrollPane.getViewport(); Point viewCenter; if (mousePos != null) { // スクロールペインのマウス座標を表示パネルの位置に換算する. viewCenter = SwingUtilities.convertPoint(this, mousePos, previewImgPanel); } else { // 表示パネル上の現在表示しているビューポートの中央の座標を求める Rectangle viewRect = vp.getViewRect(); viewCenter = new Point( (viewRect.x + viewRect.width / 2), (viewRect.y + viewRect.height / 2) ); } // 現在のビューサイズ(余白があれば余白も含む) Dimension viewSize = previewImgPanel.getScaledSize(true); // 倍率変更 previewControlPanel.setZoomFactor(zoomFactor); previewImgPanel.setZoomFactor(zoomFactor); // 新しいのビューサイズ(余白があれば余白も含む) Dimension viewSizeAfter = previewImgPanel.getScaledSize(true); Dimension visibleSize = vp.getExtentSize(); if (viewSize != null && viewSizeAfter != null && viewSizeAfter.width > 0 && viewSizeAfter.height > 0 && viewSizeAfter.width > visibleSize.width && viewSizeAfter.height > visibleSize.height) { // 新しいビューの大きさよりも表示可能領域が小さい場合のみ vp.setViewSize(viewSizeAfter); // スクロールペインに表示されている画面サイズを求める. // スクロールバーがある方向は、コンテンツの最大と等しいが // スクロールバーがない場合は画面サイズのほうが大きいため、 // 倍率変更による縦横の移動比は、それぞれ異なる. int visible_width = max(visibleSize.width, viewSize.width); int visible_height = max(visibleSize.height, viewSize.height); int visible_width_after = max(visibleSize.width, viewSizeAfter.width); int visible_height_after = max(visibleSize.height, viewSizeAfter.height); // 前回の倍率から今回の倍率の倍率. // オリジナルに対する倍率ではない. // また、画像は縦横同率であるが表示ウィンドウはスクロールバー有無により同率とは限らない. double zoomDiffX = (double) visible_width_after / (double) visible_width; double zoomDiffY = (double) visible_height_after / (double) visible_height; // 拡大後の座標の補正 Point viewCenterAfter = new Point(); viewCenterAfter.x = (int) round(viewCenter.x * zoomDiffX); viewCenterAfter.y = (int) round(viewCenter.y * zoomDiffY); // 倍率適用前後の座標の差分 int diff_x = viewCenterAfter.x - viewCenter.x; int diff_y = viewCenterAfter.y - viewCenter.y; // スクロール scroll(diff_x, diff_y); } // スクロールの単位を画像1ドットあたりの表示サイズに変更する. // (ただし1を下回らない) JScrollBar vsb = previewImgScrollPane.getVerticalScrollBar(); JScrollBar hsb = previewImgScrollPane.getHorizontalScrollBar(); vsb.setUnitIncrement(max(1, (int) ceil(zoomFactor))); hsb.setUnitIncrement(max(1, (int) ceil(zoomFactor))); } finally { zoomLock.release(); } } /** * 現在のビューの左上位置を返す * @return */ public Point getViewPosition() { JViewport vp = previewImgScrollPane.getViewport(); return vp.getViewPosition(); } /** * 指定した座標が中央となるようにスクロールする。 * まだ画像が表示されていない場合は次に画像を設定したときに行う。 * @param centerPt 中央 */ public void setViewPosition(Point viewPt) { JViewport vp = previewImgScrollPane.getViewport(); if (previewImgPanel.getPreviewImage() != null) { if (viewPt != null) { vp.setViewPosition(viewPt); } requestViewPt = null; } else { requestViewPt = viewPt; } } private Point requestViewPt; /** * プレビューに表示するタイトル.
* * @param title * タイトル */ public void setTitle(String title) { if (title == null) { title = ""; } if (!title.equals(this.title)) { this.title = title; lblTitle.setText(title + (indicatorShown ? indicatorText : "")); lblTitle.setToolTipText(title); } } public String getTitle() { return this.title; } /** * ロードに時間がかかっているか判定し、 インジケータを表示するためのタイマーイベントハンドラ.
*/ protected void onTimer() { boolean waiting; long firstRequest; synchronized (lock) { waiting = isWaiting(); firstRequest = firstWaitingTimestamp; } boolean indicatorShown = (waiting && ((System.currentTimeMillis() - firstRequest) > indicatorDelay)); if (this.indicatorShown != indicatorShown) { this.indicatorShown = indicatorShown; lblTitle.setText(title + (indicatorShown ? indicatorText : "")); } } /** * チケットの状態が、ロード完了待ち状態であるか?
* ロード中のチケットが、ロード完了のチケットより新しければロード中と見なす.
* * @return 完了待ちであればtrue、そうでなければfalse */ protected boolean isWaiting() { synchronized (lock) { return loadingTicket > loadedTicket; } } /** * ロード要求が出されるたびに、そのロード要求チケットを登録する.
* チケットは要求されるたびに増加するシーケンスとする.
* * @param ticket * ロード要求チケット */ public void setLoadingRequest(long ticket) { synchronized (lock) { if ( !isWaiting() && this.loadedTicket < ticket) { // 現在認識しているチケットの状態がロード完了であり、 // それよりも新しいチケットが要求されたならば、 // 今回のチケットから待ち時間の計測を開始する. this.firstWaitingTimestamp = System.currentTimeMillis(); } this.loadingTicket = ticket; } } /** * ロード完了するたびに呼び出される.
* * @param ticket * ロード要求チケット. */ public void setLoadingComplete(long ticket) { synchronized (lock) { this.loadedTicket = ticket; } } /** * 表示画像を設定する.
* * @param previewImg * 表示画像、もしくはnull */ public void setPreviewImage(BufferedImage previewImg) { previewImgPanel.setPreviewImage(previewImg); if (requestViewPt != null) { // 画像設定前にスクロール位置の要求があれば、再適用を試みる setViewPosition(requestViewPt); } } /** * 表示されている画像を取得する.
* 表示画像が設定されていなければnull.
* * @return 表示画像、もしくはnull */ public BufferedImage getPreviewImage() { return previewImgPanel.getPreviewImage(); } /** * 表示している画面イメージそのままを取得する. * * @return 表示画像 */ public BufferedImage getScreenImage() { JViewport vp = previewImgScrollPane.getViewport(); Dimension dim = vp.getExtentSize(); BufferedImage img = new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = img.createGraphics(); try { vp.paint(g); } finally { g.dispose(); } return img; } /** * 壁紙を設定する.
* * @param wallpaperImg * 壁紙、null不可 */ public void setWallpaper(Wallpaper wallpaper) { previewImgPanel.setWallpaper(wallpaper); } /** * 壁紙を取得する.
* 壁紙が未設定の場合は空の壁紙インスタンスが返される.
* * @return 壁紙 */ public Wallpaper getWallpaper() { return previewImgPanel.getWallpaper(); } /** * 表示倍率を取得する. * * @return 表示倍率 */ public double getZoomFactor() { return previewControlPanel.getZoomFactor(); } /** * 表示倍率を設定する * * @param zoomFactor * 表示倍率 */ public void setZoomFactor(double zoomFactor) { previewControlPanel.setZoomFactor(zoomFactor); } /** * ズームパネルのピン留め制御 * * @param visible * 表示する場合はtrue */ public void setVisibleZoomBox(boolean visible) { previewControlPanel.setPinned(visible); } /** * ズームパネルがピン留めされているか? * * @return ピン留めされていればtrue */ public boolean isVisibleZoomBox() { return previewControlPanel.isPinned(); } public void addPreviewPanelListener(PreviewPanelListener listener) { if (listener == null) { throw new IllegalArgumentException(); } listeners.add(listener); } public void removePreviewPanelListener(PreviewPanelListener listener) { listeners.remove(listener); } protected void savePicture(PreviewPanelEvent e) { for (PreviewPanelListener listener : listeners) { listener.savePicture(e); } } protected void flipHolizontal(PreviewPanelEvent e) { for (PreviewPanelListener listener : listeners) { listener.flipHorizontal(e); } } protected void copyPicture(PreviewPanelEvent e) { for (PreviewPanelListener listener : listeners) { listener.copyPicture(e); } } protected void changeBackgroundColor(PreviewPanelEvent e) { for (PreviewPanelListener listener : listeners) { listener.changeBackgroundColor(e); } } protected void showInformation(PreviewPanelEvent e) { for (PreviewPanelListener listener : listeners) { listener.showInformation(e); } } protected void addFavorite(PreviewPanelEvent e) { for (PreviewPanelListener listener : listeners) { listener.addFavorite(e); } } } /** * チェック情報の表示用レイヤーパネル.
* * @author seraphy */ class CheckInfoLayerPanel extends JPanel { private static final long serialVersionUID = 1L; /** * ロガー */ private static final Logger logger = Logger.getLogger(CheckInfoLayerPanel.class.getName()); /** * ボックスの余白 */ private Insets padding = new Insets(3, 3, 3, 3); /** * 表示位置プロパティ */ private Point pos = new Point(); /** * 表示メッセージプロパティ.
* ¥nで改行となる.
* 空文字ならば非表示.
*/ private String message = ""; /** * 解析済みメッセージ.
* 業に分割される.
* 空文字は空のリストとなる.
*/ private String[] messageLines; /** * 解析済みフォントの高さ.
*/ private int fontHeight; /** * 描画済みエリア.
* 次回描画前に消去する必要のある領域.
* まだ一度も描画してなければnull.
*/ private Rectangle eraseRect; /** * 現在、描画すべきエリア.
* なければnull.
*/ private Rectangle requestRect; /** * 画面に関連づけられていない状態でのテキスト表示サイズは 計算できないため、画面追加時に再計算させるための 予約フラグ.
*/ private boolean requestRecalcOnAdd; /** * フォントのためのデスクトップヒント.(あれば) */ @SuppressWarnings("rawtypes") private Map desktopHintsForFont; /** * 透明コンポーネントとして構築する.
*/ @SuppressWarnings("rawtypes") public CheckInfoLayerPanel() { setOpaque(false); Toolkit tk = Toolkit.getDefaultToolkit(); desktopHintsForFont = (Map) tk.getDesktopProperty("awt.font.desktophints"); logger.log(Level.CONFIG, "awt.font.desktophints=" + desktopHintsForFont); } /** * 指定エリアに情報を描画する.
*/ @Override protected void paintComponent(Graphics g0) { Graphics2D g = (Graphics2D) g0; super.paintComponent(g); // クリップ領域 Rectangle clip = g.getClipBounds(); // System.out.println("clip:" + clip + " /eraseRect:" + eraseRect + " /drawRect:" + requestRect); // 削除すべき領域が描画範囲に含まれているか? // (含まれていれば、その領域は消去済みである.) if (clip == null || (eraseRect != null && clip.contains(eraseRect))) { eraseRect = null; } // 表示領域の判定 if (requestRect == null || requestRect.isEmpty() || !(clip != null && clip.intersects(requestRect))) { // 表示すべき領域が存在しないか、描画要求範囲にない. return; } if (messageLines == null || messageLines.length == 0) { // 表示するものがなければ何もしない. return; } // フォントのレンダリングヒント if (desktopHintsForFont != null) { g.addRenderingHints(desktopHintsForFont); } // 箱の描画 g.setColor(new Color(255, 255, 255, 192)); g.fillRect(requestRect.x, requestRect.y, requestRect.width, requestRect.height); g.setColor(Color.GRAY); g.drawRect(requestRect.x, requestRect.y, requestRect.width - 1, requestRect.height - 1); // 情報の描画 g.setColor(Color.BLACK); int oy = fontHeight; for (String messageLine : messageLines) { g.drawString(messageLine, requestRect.x + padding.left, requestRect.y + padding.top - 1 + oy); oy += fontHeight; } // 描画された領域を次回消去領域として記憶する. if (eraseRect == null || eraseRect.isEmpty()) { // 消去済みであれば、今回分のみを次回消去領域とする. eraseRect = (Rectangle) requestRect.clone(); } else { // 消去済みエリアが未消去で残っている場合は // 今回領域を結合する. eraseRect.add(requestRect); } } /** * 画面にアタッチされた場合、描画領域の再計算が 必要であれば計算する.
*/ @Override public void addNotify() { super.addNotify(); if (requestRecalcOnAdd) { requestRecalcOnAdd = false; calcRepaint(); } } /** * 要求されたプロパティから、フォント高さによる表示領域を計算し、 その領域の再描画を要求する.(描画する内容がなれば、描画要求しない.)
* 前回表示領域があれば、消去するために、そのエリアも再描画を要求する.
* それ以外のエリアは描画要求しない.(描画の最適化による負荷軽減策)
* フォントサイズを求めるためにグラフィクスへのアクセスが必要となるが、 まだ取得できない場合は{@link #addNotify()}の呼び出し時に * 再計算するようにフラグを立てておく.
*/ protected void calcRepaint() { Graphics2D g = (Graphics2D) getGraphics(); if (g == null) { requestRecalcOnAdd = true; return; } try { // 前回描画領域のクリアのために呼び出す. if (eraseRect != null && !eraseRect.isEmpty()) { repaint(eraseRect); } // 空であれば新たな描画なし. if (message.length() == 0) { requestRect = null; return; } FontMetrics fm = g.getFontMetrics(); String[] messageLines = message.split("¥n"); Rectangle2D rct = null; for (String messageLine : messageLines) { Rectangle2D tmp = fm.getStringBounds(messageLine, g); if (rct != null) { rct.add(tmp); } else { rct = tmp; } } int fw = (int) rct.getWidth(); int fh = (int) rct.getHeight(); int w = fw + padding.left + padding.right; int h = fh * messageLines.length + padding.top + padding.bottom; // 指定した位置の右上あたりにする int x = pos.x + 16; int y = pos.y - h; // サイズ int client_w = getWidth(); int client_h = getHeight(); if (x + w > client_w) { // 画面右の場合はカーソルの左に移動 x = pos.x - w - 10; } if (y < 0) { // 画面上の場合はカーソルの下に移動 y = pos.y + 10; } if (y + h > client_h) { y -= (y + h - client_h); } // 結果の格納 this.requestRect = new Rectangle(x, y, w, h); this.messageLines = messageLines; this.fontHeight = fh; // 再描画の要求 Rectangle paintRect = (Rectangle) requestRect.clone(); repaint(paintRect); } finally { g.dispose(); } } public void setPotision(Point requestPt) { if (requestPt == null) { throw new IllegalArgumentException(); } if ( !requestPt.equals(pos)) { Point oldpos = pos; pos = (Point) requestPt.clone(); calcRepaint(); firePropertyChange("position", oldpos, pos); } } public Point getPosition() { return (Point) pos.clone(); } public void setMessage(String message) { if (message == null) { message = ""; } message = message.replace("¥r¥n", "¥n"); if ( !message.equals(this.message)) { String oldmes = this.message; this.message = message; calcRepaint(); firePropertyChange("message", oldmes, message); } } public String getMessage() { return message; } } /** * 画像表示パネル * * @author seraphy */ class PreviewImagePanel extends JPanel { private static final long serialVersionUID = 1L; /** * 背景モード.
*/ private BackgroundColorMode bgColorMode; /** * 壁紙.
*/ private Wallpaper wallpaper; /** * 壁紙変更イベントのリスナ */ private PropertyChangeListener wallpaperListener; /** * 透過オリジナル画像.
*/ private BufferedImage previewImg; /** * 表示用画像(背景モードによる調整あり).
* 事前に拡大縮小を適用済みの場合は、{@link #scaledZoomFactor}に 適用している倍率が設定される.
* 表示用に改めてイメージを生成する必要がない場合は、 透過オリジナルと同じインスタンスとなりえる.
*/ private BufferedImage previewImgForDraw; /** * 表示用画像がスケール済みである場合、そのスケールが設定される.
* スケール済みでない場合はnullとなる.
*/ private Double scaledZoomFactor; /** * 倍率 */ private double zoomFactor = 1.; /** * 許容誤差 */ private static final double TOLERANT = 0.001; /** * コンストラクタ */ public PreviewImagePanel() { super(); // 通常モード bgColorMode = BackgroundColorMode.ALPHABREND; // 壁紙変更通知リスナ wallpaperListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { onChangeWallpaper(); } }; // 壁紙 wallpaper = new Wallpaper(); wallpaper.addPropertyChangeListener(wallpaperListener); } /** * 画像を表示する. */ @Override protected void paintComponent(Graphics g0) { Graphics2D g = (Graphics2D) g0; super.paintComponent(g); if (previewImgForDraw == null) { return; } // 倍率を適用した画像を画面の中央に配置できるように計算する. // (画像が倍率適用済みであれば1倍とする) Rectangle imgRct = adjustImageRectangle(); // 表示用画像がスケール済みでない場合はレンダリングオプションを適用する. if (scaledZoomFactor == null) { Object renderingOption = getRenderingOption(); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, renderingOption); } // 背景処理 if (bgColorMode == BackgroundColorMode.ALPHABREND) { // 表示の最大範囲 (可視領域外も含む) int w = getWidth(); int h = getHeight(); wallpaper.drawWallpaper(g, w, h); } // レンダリング g.drawImage(previewImgForDraw, imgRct.x, imgRct.y, imgRct.x + imgRct.width, imgRct.y + imgRct.height, 0, 0, previewImgForDraw.getWidth(), previewImgForDraw.getHeight(), null); // 通常モード以外のグリッド描画に該当するモードはグリッドを前景に描く AppConfig appConfig = AppConfig.getInstance(); int drawGridMask = appConfig.getDrawGridMask(); if ((drawGridMask & bgColorMode.mask()) != 0) { Color oldc = g.getColor(); try { g.setColor(appConfig.getPreviewGridColor()); drawGrid(g, imgRct.x, imgRct.y, appConfig.getPreviewGridSize()); } finally { g.setColor(oldc); } } } /** * グリッドを描画する.
* 開始位置の-1単位位置から画像サイズの+1単位までがグリッド範囲となる。 * * @param g * @param offset_x * 開始位置 * @param offset_y * 開始位置 * @param unit * グリッド単位(pixel) */ protected void drawGrid(Graphics2D g, int offset_x, int offset_y, int unit) { Rectangle clip = g.getClipBounds(); int src_w = previewImg.getWidth(); int src_h = previewImg.getHeight(); int my = src_h / unit; int mx = src_w / unit; int st_x = offset_x + (int)(-1 * unit * zoomFactor); int en_x = offset_x + (int)((mx + 1) * unit * zoomFactor); int w = en_x - st_x + 1; for (int y = -1; y <= my + 1; y++) { int y1 = y * unit; Rectangle rct = new Rectangle( st_x, offset_y + (int)(y1 * zoomFactor), w, 1); if (clip == null || clip.intersects(rct)) { g.drawLine(rct.x, rct.y, rct.x + rct.width, rct.y); } } int st_y = offset_y + (int)(-1 * unit * zoomFactor); int en_y = offset_y + (int)((my + 1) * unit * zoomFactor); int h = en_y - st_y + 1; for (int x = -1; x <= mx + 1; x++) { int x1 = x * unit; Rectangle rct = new Rectangle( offset_x + (int)(x1 * zoomFactor), st_y, 1, h); g.drawLine(rct.x, rct.y, rct.x, rct.y + rct.height); } } /** * 現在の倍率に応じたレンダリングオプションを取得する.
* * @return レンダリングオプション */ protected Object getRenderingOption() { AppConfig appConfig = AppConfig.getInstance(); double rendringOptimizeThreshold; if (bgColorMode == BackgroundColorMode.ALPHABREND) { rendringOptimizeThreshold = appConfig.getRenderingOptimizeThresholdForNormal(); } else { rendringOptimizeThreshold = appConfig.getRenderingOptimizeThresholdForCheck(); } Object renderingHint; if (zoomFactor < rendringOptimizeThreshold) { // 補正を適用する最大倍率以内である場合 if (zoomFactor <= 1. || !appConfig.isEnableInterpolationBicubic()) { // 縮小する場合、もしくはバイキュービックをサポートしない場合 renderingHint = RenderingHints.VALUE_INTERPOLATION_BILINEAR; } else { // 拡大する場合でバイキュービックをサポートしている場合 renderingHint = RenderingHints.VALUE_INTERPOLATION_BICUBIC; } } else { // 補正を適用する最大倍率を超えている場合は補正なし. renderingHint = RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR; } return renderingHint; } /** * 倍率と、画面のサイズと、表示するオリジナルの画像サイズをもとに、 倍率を適用した画像サイズを、画面に収まる位置に補正して返す.
* 返される矩形の幅と高さ(width, height)は拡大後の画像サイズに等しい.
* 拡大後の画像が画面よりも小さければセンタリングするように矩形の開始位置(x, y)がオフセットされる.
* そうでなければ矩形の開始位置(x, y)は0となる.
* 画像が設定されていなければ幅と高さがゼロの矩形が返される.
* * @return 画像を表示するオフセットと大きさ、もしくは空の矩形 */ public Rectangle adjustImageRectangle() { if (previewImg == null) { return new Rectangle(0, 0, 0, 0); // 幅・高さともにゼロ } int client_w = getWidth(); int client_h = getHeight(); int src_w = previewImg.getWidth(); int src_h = previewImg.getHeight(); int w = (int) round(src_w * zoomFactor); int h = (int) round(src_h * zoomFactor); int offset_x = 0; if (w < client_w) { offset_x = (client_w - w) / 2; } int offset_y = 0; if (h < client_h) { offset_y = (client_h - h) / 2; } return new Rectangle(offset_x, offset_y, w, h); } /** * パネルのマウス座標から、実寸の画像のピクセル位置を返す.
* 画像が表示されていないか、範囲外であればnullを返す.
* * @param pt * パネルの座標 * @return 画像の位置、もしくはnull */ public Point getImagePosition(Point pt) { if (pt == null || previewImg == null) { // プレビュー画像が設定されていなければnull return null; } Rectangle imgRct = adjustImageRectangle(); if ( !imgRct.contains(pt.x, pt.y)) { // 範囲外であればnull return null; } // オフセットを除去する. Point ret = (Point) pt.clone(); ret.x -= imgRct.x; ret.y -= imgRct.y; // 倍率を解除する. ret.x = (int) floor(ret.x / zoomFactor); ret.y = (int) floor(ret.y / zoomFactor); return ret; } /** * 画像の位置から画面の位置を割り出す.
* * @param pt * 画像の位置 * @return 画面の位置 */ public Point getMousePosition(Point pt) { if (pt == null || previewImg == null) { // プレビュー画像が設定されていなければnull return null; } Rectangle imgRct = adjustImageRectangle(); // 表示倍率を加える Point ret = (Point) pt.clone(); ret.x = (int) ceil(ret.x * zoomFactor); ret.y = (int) ceil(ret.y * zoomFactor); // オフセットを加える ret.x += imgRct.x; ret.y += imgRct.y; return ret; } /** * 指定した位置のRGB値を取得する.
* 範囲外の場合は0が返される.
* * @param pt * イメージの位置 * @return イメージのARGB値 (ビット順序は、A:24, R:16, G:8, B:0) */ public int getImageARGB(Point pt) { if (pt == null) { throw new IllegalArgumentException(); } try { return previewImg.getRGB(pt.x, pt.y); } catch (RuntimeException ex) { return 0; // 範囲外 } } /** * 倍率を適用した画像パネルのサイズを計算し適用する.
* モードにより余白が加えられる.
*/ protected void recalcScaledSize() { Dimension scaledSize = getScaledSize(true); if (scaledSize != null) { setPreferredSize(scaledSize); revalidate(); } } /** * 元画像の倍率適用後のサイズを返す.
* 元画像が設定されていなければnull.
* needOffsetがfalseであれば表示モードに関わらず、画像の拡大・縮小後の純粋なサイズ、 * trueであれば余白が必要な表示モードの場合の余白が付与された場合のサイズが返される.
* * @param needOffset * 余白を加味したサイズが必要な場合はtrue * @return 倍率適用後のサイズ、もしくはnull */ protected Dimension getScaledSize(boolean needOffset) { if (previewImg == null) { return null; } int src_w = previewImg.getWidth(); int src_h = previewImg.getHeight(); int w = (int) round(src_w * zoomFactor); int h = (int) round(src_h * zoomFactor); Dimension scaledSize = new Dimension(w, h); if (bgColorMode != BackgroundColorMode.ALPHABREND) { // 通常モード以外は画像よりも少し大きめにすることで // キャンバスに余白をつける AppConfig appConfig = AppConfig.getInstance(); int unfilledSpace = appConfig.getPreviewUnfilledSpaceForCheckMode(); scaledSize.width += max(0, unfilledSpace * 2); scaledSize.height += max(0, unfilledSpace * 2); } return scaledSize; } /** * プレビュー画像を設定する. * * @param previewImg */ public void setPreviewImage(BufferedImage previewImg) { BufferedImage oldimg = this.previewImg; this.previewImg = previewImg; recalcScaledSize(); makeDrawImage(true); repaint(); firePropertyChange("previewImage", oldimg, previewImg); } public BufferedImage getPreviewImage() { return previewImg; } /** * 壁紙を設定する. * * @param wallpaper */ public void setWallpaper(Wallpaper wallpaper) { if (wallpaper == null) { throw new IllegalArgumentException(); } if ( !this.wallpaper.equals(wallpaper)) { Wallpaper wallpaperOld = this.wallpaper; if (wallpaperOld != null) { wallpaperOld.removePropertyChangeListener(wallpaperListener); } this.wallpaper = wallpaper; if (this.wallpaper != null) { this.wallpaper.addPropertyChangeListener(wallpaperListener); } firePropertyChange("wallpaper", wallpaperOld, this.wallpaper); onChangeWallpaper(); } } public Wallpaper getWallpaper() { return wallpaper; } protected void onChangeWallpaper() { repaint(); } /** * 背景モード調整済みの表示用画像を作成する. * * @param changeImage * 画像の変更あり */ protected void makeDrawImage(boolean changeImage) { if (previewImg == null) { // 画像が設定されていなければ空 this.previewImgForDraw = null; scaledZoomFactor = null; return; } BufferedImage img; if (changeImage || scaledZoomFactor != null) { // 画像が変更されているか、スケール済みであれば // 背景モードの再適用が必要. if (bgColorMode == BackgroundColorMode.ALPHABREND) { // アルファブレンド通常モードは背景用にあえて作成する必要はない. img = previewImg; } else { // アルファブレンド通常モード以外は背景に作成する Color bgColor = wallpaper.getBackgroundColor(); BackgroundColorFilter bgColorFilter = new BackgroundColorFilter(bgColorMode, bgColor); img = bgColorFilter.filter(previewImg, null); } } else { // 画像が変更されておらず、スケール済みでもなければ // すでに作成済みの画像が使用できる. img = previewImgForDraw; } // レンダリングオプション Object renderingOption = getRenderingOption(); // バイキュービックでなければ、事前の拡大縮小は行わずに、表示時に行う. if ( !renderingOption.equals(RenderingHints.VALUE_INTERPOLATION_BICUBIC)) { previewImgForDraw = img; scaledZoomFactor = null; return; } // バイキュービックの場合、倍率を適用したサイズに予め加工しておく. Dimension scaledSize = getScaledSize(false); BufferedImage offscreen = new BufferedImage( scaledSize.width, scaledSize.height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = offscreen.createGraphics(); try { g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g.drawImage(img, 0, 0, scaledSize.width, scaledSize.height, 0, 0, img.getWidth(), img.getHeight(), null); } finally { g.dispose(); } previewImgForDraw = offscreen; scaledZoomFactor = Double.valueOf(zoomFactor); } public void setBackgroundColorMode(BackgroundColorMode bgColorMode) { if (bgColorMode == null) { throw new IllegalArgumentException(); } if (this.bgColorMode != bgColorMode) { BackgroundColorMode oldcm = bgColorMode; this.bgColorMode = bgColorMode; makeDrawImage(true); recalcScaledSize(); repaint(); firePropertyChange("backgroundColorMode", oldcm, bgColorMode); } } public BackgroundColorMode setBackgroundColorMode() { return bgColorMode; } public void setZoomFactor(double zoomFactor) { if (abs(zoomFactor - this.zoomFactor) > TOLERANT) { // 0.001未満の差異は誤差とみなして反映しない. double oldzoom = this.zoomFactor; this.zoomFactor = zoomFactor; recalcScaledSize(); makeDrawImage(false); repaint(); firePropertyChange("zoomFactor", oldzoom, zoomFactor); } } public double getZoomFactor() { return zoomFactor; } /** * 倍率が100%であるか? * * @return 100%であればtrue */ public boolean isDefaultZoom() { return zoomFactor - 1 < TOLERANT; } } /** * 倍率・背景モードを操作するための下部パネル用 * * @author seraphy */ class PreviewControlPanel extends JPanel { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(PreviewControlPanel.class.getName()); protected static final String STRINGS_RESOURCE = "languages/previewpanel"; /** * ピン留めチェックボックス */ private JCheckBox chkPinning; /** * アルファ確認チェックボックス */ private JCheckBox chkNoAlpha; /** * グレースケール確認チェックボックス */ private JCheckBox chkGrayscale; /** * 倍率用スライダ */ private JSlider zoomSlider; /** * 倍率入力用コンボボックス */ private JComboBox zoomCombo; /** * スライダの最小値 */ private static final int MIN_INDEX = -170; /** * スライダの最大値 */ private static final int MAX_INDEX = 219; /** * 最小倍率 */ private double minimumZoomFactor; /** * 最大倍率 */ private double maximumZoomFactor; /** * 現在の倍率(100倍済み) */ private int currentZoomFactorInt; /** * 現在の背景色モード */ private BackgroundColorMode backgroundColorMode; /** * 任意の底Aをもつ対数 logA(N)を計算して返す. * * @param a * 底 * @param x * 引数 * @return logA(N) */ private static double logN(double a, double x) { return log(x) / log(a); } /** * 倍率(等倍を1とする)に対するスライダのインデックス値を返す.
* スライダは10ステップごとに前のステップの10%づつ増減する.(複利式)
* * @param zoomFactor * 倍率(1を等倍とする) * @return インデックス */ private static int zoomFactorToIndex(double zoomFactor) { return (int) round(logN((1. + 0.1), zoomFactor) * 10); } /** * スライダのインデックス値から倍率(等倍を1とする)を返す.
* 10ステップごとに10%づつ増減する.(複利式)
* * @param index * インデックス * @return 倍率(1を等倍とする) */ private static double zoomFactorFromIndex(int index) { return pow(1. + 0.1, index / 10.); } /** * コンストラクタ */ public PreviewControlPanel() { final Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); final UIHelper uiHelper = UIHelper.getInstance(); // ピンアイコン Icon pinIcon = uiHelper.createTwoStateIcon( "icons/pin-icon1.png", "icons/pin-icon2.png"); // ピンチェックボックス chkPinning = new JCheckBox(pinIcon); chkPinning.setToolTipText(strings.getProperty("tooltip.zoompanel.pinning")); // 円ボタン型チェックボックス用アイコンの実装 final Icon stateIcon = new Icon() { public int getIconHeight() { return (int)(12 * uiHelper.getScaleX()); } public int getIconWidth() { return (int)(6 * uiHelper.getScaleY()); }; public void paintIcon(Component c, Graphics g, int x, int y) { boolean sw = false; if (c instanceof AbstractButton) { AbstractButton btn = (AbstractButton) c; sw = btn.isSelected(); } int w = getIconWidth(); int h = getIconHeight(); int s = min(w, h); int ox = 0; int oy = 0; if (w > s) { ox = (w - s) / 2; } if (h > s) { oy = (h - s) / 2; } if (sw) { AppConfig appConfig = AppConfig.getInstance(); Color fillColor = appConfig.getSelectedItemBgColor(); g.setColor(fillColor); g.fillOval(x + ox, y + oy, s, w); } g.setColor(Color.GRAY); g.drawOval(x + ox, y + oy, s, s); } }; // アルファ確認とグレースケール確認用のチェックボックス chkNoAlpha = new JCheckBox(stateIcon); chkGrayscale = new JCheckBox(stateIcon); chkNoAlpha.setToolTipText(strings.getProperty("tooltip.zoompanel.checkalpha")); chkGrayscale.setToolTipText(strings.getProperty("tooltip.zoompanel.checkgrayscale")); backgroundColorMode = BackgroundColorMode.ALPHABREND; final ChangeListener chkAlphaGrayChangeListener = new ChangeListener() { public void stateChanged(ChangeEvent e) { onChangeCheckAlphaGray(); } }; chkNoAlpha.addChangeListener(chkAlphaGrayChangeListener); chkGrayscale.addChangeListener(chkAlphaGrayChangeListener); // 倍率スライダ zoomSlider = new JSlider(JSlider.HORIZONTAL, MIN_INDEX, MAX_INDEX, 0); zoomSlider.setToolTipText(strings.getProperty("tooltip.zoompanel.zoomfactor_slider")); // 倍率コンボ zoomCombo = new JComboBox(); zoomCombo.setToolTipText(strings.getProperty("tooltip.zoompanel.zoomfactor_combo")); // 倍率の既定リストの設定と、最大・最小値の算定 minimumZoomFactor = zoomFactorFromIndex(zoomSlider.getMinimum()); maximumZoomFactor = zoomFactorFromIndex(zoomSlider.getMaximum()); int minZoomRange = (int) round(minimumZoomFactor * 100.); int maxZoomRange = (int) round(maximumZoomFactor * 100.); List predefinedZoomRanges = getPredefinedZoomRanges(); for (int zoomRange : predefinedZoomRanges) { if (zoomRange < minZoomRange) { minZoomRange = zoomRange; } if (zoomRange > maxZoomRange) { maxZoomRange = zoomRange; } zoomCombo.addItem(Integer.toString(zoomRange)); } final int[] zoomRanges = {minZoomRange, maxZoomRange}; currentZoomFactorInt = 100; zoomCombo.setSelectedItem(Integer.toString(currentZoomFactorInt)); zoomCombo.setEditable(true); if ( !Main.isMacOSX()) { // Windows環境だとデフォルトで9桁分のテキストフィールドが作成され // それがレイアウトの推奨サイズとして実際に使われてしまうため、 // 明示的に3桁にとどめておくようにオーバーライドする. // Mac OS Xならば問題ない. zoomCombo.setEditor(new BasicComboBoxEditor() { { editor = new JTextField(3) { private static final long serialVersionUID = 1L; @Override public void setBorder(Border border) { // 何もしない. } public void setText(String s) { if (getText().equals(s)) { return; } super.setText(s); } }; } }); } // スライダを変更することによりコンボボックスを変更する、 // もしくはコンボボックスを変更することでスライダを変更するが、 // 互いに通知を呼び合うことになるため他方を無視するためのセマフォ final Semaphore changeLock = new Semaphore(1); zoomCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { boolean adjusted = false; String value = (String) zoomCombo.getSelectedItem(); int zoomFactorInt; try { zoomFactorInt = Integer.parseInt(value); if (zoomFactorInt < zoomRanges[0]) { zoomFactorInt = zoomRanges[0]; adjusted = true; } else if (zoomFactorInt > zoomRanges[1]) { zoomFactorInt = zoomRanges[1]; adjusted = true; } } catch (RuntimeException ex) { zoomFactorInt = 100; adjusted = true; } if (adjusted) { zoomCombo.setSelectedItem(Integer.toString(zoomFactorInt)); Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); } if (changeLock.tryAcquire()) { try { zoomSlider.setValue(zoomFactorToIndex(zoomFactorInt / 100.)); } finally { changeLock.release(); } } fireZoomFactorChange(zoomFactorInt); } }); zoomSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { int index = zoomSlider.getValue(); double zoomFactor = zoomFactorFromIndex(index); int zoomFactorInt = (int) round(zoomFactor * 100); if (changeLock.tryAcquire()) { try { zoomCombo.setSelectedItem(Integer.toString(zoomFactorInt)); } finally { changeLock.release(); } fireZoomFactorChange(zoomFactorInt); } } }); // パーツの配備 GridBagLayout gbl = new GridBagLayout(); setLayout(gbl); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.ipadx = 0; gbc.ipady = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.fill = GridBagConstraints.NONE; gbc.anchor = GridBagConstraints.CENTER; gbc.insets = new Insets(0, 0, 0, 5); gbc.weightx = 0.; gbc.weighty = 0.; add(chkPinning, gbc); gbc.gridx = 1; gbc.weightx = 0.; gbc.insets = new Insets(0, 0, 0, 0); add(chkGrayscale, gbc); gbc.gridx = 2; gbc.weightx = 0.; gbc.insets = new Insets(0, 0, 0, 5); add(chkNoAlpha, gbc); gbc.gridx = 3; gbc.weightx = 1.; gbc.fill = GridBagConstraints.HORIZONTAL; add(zoomSlider, gbc); gbc.gridx = 4; gbc.weightx = 0.; gbc.insets = new Insets(3, 0, 3, 0); gbc.fill = GridBagConstraints.VERTICAL; add(zoomCombo, gbc); Integer scrollbarWidth = (Integer) UIManager.get("ScrollBar.width"); logger.log(Level.CONFIG, "ScrollBar.width=" + scrollbarWidth); if (scrollbarWidth == null) { scrollbarWidth = Integer.parseInt( strings.getProperty("uiconstraint.scrollbar.width")); } gbc.gridx = 5; gbc.weightx = 0.; gbc.anchor = GridBagConstraints.WEST; gbc.insets = new Insets(0, 0, 0, scrollbarWidth); add(new JLabel("%"), gbc); } /** * アプリケーション設定より事前定義済みの倍率候補を取得する * * @return 倍率候補のリスト(順序あり) */ protected List getPredefinedZoomRanges() { AppConfig appConfig = AppConfig.getInstance(); String strs = appConfig.getPredefinedZoomRanges(); TreeSet ranges = new TreeSet(); for (String str : strs.split(",")) { str = str.trim(); if (str.length() > 0) { try { int zoomFactor = Integer.parseInt(str); ranges.add(Integer.valueOf(zoomFactor)); } catch (RuntimeException ex) { // 無視する. } } } ranges.add(Integer.valueOf(100)); // 等倍は常に設定する. return new ArrayList(ranges); } /** * 倍率が変更されたことを通知する. */ protected void fireZoomFactorChange(int newZoomFactor) { if (currentZoomFactorInt != newZoomFactor) { int oldValue = currentZoomFactorInt; currentZoomFactorInt = newZoomFactor; firePropertyChange("zoomFactorInt", oldValue, newZoomFactor); } } private Semaphore changeChkLock = new Semaphore(1); protected void onChangeCheckAlphaGray() { changeChkLock.tryAcquire(); try { BackgroundColorMode backgroundColorMode = BackgroundColorMode.valueOf( chkNoAlpha.isSelected(), chkGrayscale.isSelected() ); setBackgroundColorMode(backgroundColorMode); } finally { changeChkLock.release(); } } public BackgroundColorMode getBackgroundColorMode() { return this.backgroundColorMode; } public void setBackgroundColorMode(BackgroundColorMode backgroundColorMode) { if (backgroundColorMode == null) { throw new IllegalArgumentException(); } BackgroundColorMode oldcm = this.backgroundColorMode; if (oldcm != backgroundColorMode) { this.backgroundColorMode = backgroundColorMode; changeChkLock.tryAcquire(); try { chkNoAlpha.setSelected(backgroundColorMode.isNoAlphaChannel()); chkGrayscale.setSelected(backgroundColorMode.isGrayscale()); } finally { changeChkLock.release(); } firePropertyChange("backgroundColorMode", oldcm, backgroundColorMode); } } public boolean isPinned() { return chkPinning.isSelected(); } public void setPinned(boolean pinned) { chkPinning.setSelected(pinned); if (isDisplayable()) { setVisible(pinned); } } public double getZoomFactor() { return (double) currentZoomFactorInt / 100.; } public void setZoomFactor(double zoomFactor) { if (zoomFactor < minimumZoomFactor) { zoomFactor = minimumZoomFactor; } if (zoomFactor > maximumZoomFactor) { zoomFactor = maximumZoomFactor; } int zoomFactorInt = (int) round(zoomFactor * 100.); if (zoomFactorInt != currentZoomFactorInt) { zoomCombo.setSelectedItem(Integer.toString(zoomFactorInt)); } } } CharacterManaJ/src/main/java/charactermanaj/ui/WallpaperDialog.java0000644000175000017500000003615113615720000025517 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.io.File; import java.util.ArrayList; import java.util.Properties; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.SpinnerNumberModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import charactermanaj.Main; import charactermanaj.graphics.io.ImagePreviewFileChooser; import charactermanaj.ui.model.PredefinedWallpaper; import charactermanaj.ui.model.WallpaperInfo; import charactermanaj.ui.model.WallpaperInfo.WallpaperResourceType; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.LocalizedMessageComboBoxRender; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * 壁紙選択ダイアログ * @author seraphy */ public class WallpaperDialog extends JDialog { private static final long serialVersionUID = 1L; /** * リソース */ protected static final String STRINGS_RESOURCE = "languages/wallpaperdialog"; /** * 定義済み壁紙のキャッシュ */ private static ArrayList predefinedWallpapers = new ArrayList(); /** * 壁紙情報 */ private WallpaperInfo wallpaperInfo = new WallpaperInfo(); /** * 選択なしラジオ */ private JRadioButton radioNone; /** * ファイルから選択ラジオ */ private JRadioButton radioFile; /** * 定義済みから選択ラジオ */ private JRadioButton radioPredefined; /** * 定義済み壁紙リスト */ private JList listPredefinedWallpapers; /** * 背景画像の透過率 */ private JSpinner spinnerAlpha; /** * 選択ファイルフィールド */ private JTextField txtFile; /** * ファイルを選択アクション */ private AbstractAction actChooseFile; /** * 背景色選択コンポーネント */ private ColorBox colorBox; /** * コンストラクタ * @param parent 親フレーム */ public WallpaperDialog(JFrame parent) { super(parent, true); try { setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { onCancel(); }; }); initPredefinedWallpapers(); initComponent(); } catch (RuntimeException ex) { dispose(); throw ex; } } /** * 定義済み壁紙リストを初期化する.
* 既に初期化済みであれば何もしない.
*/ private static synchronized void initPredefinedWallpapers() { if ( !predefinedWallpapers.isEmpty()) { return; } predefinedWallpapers.addAll(PredefinedWallpaper.getPredefinedWallpapers()); } /** * このダイアログのコンポーネントを初期化します.
*/ private void initComponent() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(WallpaperDialog.STRINGS_RESOURCE); setTitle(strings.getProperty("title")); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout(3, 3)); getRootPane().setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); JPanel wallpaperPanel = createWallpaperChoosePanel(strings); JPanel bgcolorPanel = createBgColorPanel(strings); JPanel btnPanel = createButtonPanel(strings); contentPane.add(bgcolorPanel, BorderLayout.NORTH); contentPane.add(wallpaperPanel, BorderLayout.CENTER); contentPane.add(btnPanel, BorderLayout.SOUTH); Dimension dim = new Dimension(400, 350); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); if (scaleSupport != null) { // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する dim = scaleSupport.manualScaled(dim); } setSize(dim); setLocationRelativeTo(getParent()); } private JPanel createButtonPanel(Properties strings) { JPanel btnPanel = new JPanel(); AbstractAction actOK = new AbstractAction(strings.getProperty("btn.ok")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onOK(); } }; AbstractAction actCancel = new AbstractAction(strings.getProperty("btn.cancel")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onCancel(); } }; JButton btnOK = new JButton(actOK); JButton btnCancel = new JButton(actCancel); BoxLayout bl = new BoxLayout(btnPanel, BoxLayout.LINE_AXIS); btnPanel.setLayout(bl); btnPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 45)); btnPanel.add(Box.createHorizontalGlue()); if (Main.isLinuxOrMacOSX()) { btnPanel.add(btnCancel); btnPanel.add(btnOK); } else { btnPanel.add(btnOK); btnPanel.add(btnCancel); } // Enter/Returnキーを既定ボタンにする. JRootPane rootPane = getRootPane(); rootPane.setDefaultButton(btnOK); // CTRL-Wでウィンドウを非表示にする. (ESCでは非表示にしない) InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); Toolkit tk = Toolkit.getDefaultToolkit(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeWallpaperDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeWallpaperDialog"); am.put("closeWallpaperDialog", actCancel); return btnPanel; } private JPanel createBgColorPanel(Properties strings) { JPanel bgcolorPanel = new JPanel(); bgcolorPanel.setBorder( BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(strings.getProperty("group.bgcolor")), BorderFactory.createEmptyBorder(3, 3, 3, 3))); GridBagLayout gbl = new GridBagLayout(); bgcolorPanel.setLayout(gbl); colorBox = new ColorBox(); colorBox.getColorDisplayPanel().setPreferredSize(new Dimension(48, 20)); GridBagConstraints gbc = new GridBagConstraints(); gbc.ipadx = 0; gbc.ipady = 0; gbc.insets = new Insets(0, 0, 0, 0); gbc.weighty = 0.; gbc.gridheight = 1; gbc.anchor = GridBagConstraints.CENTER; gbc.fill = GridBagConstraints.NONE; bgcolorPanel.add(colorBox, gbc); return bgcolorPanel; } private JPanel createWallpaperChoosePanel(Properties strings) { JPanel wallpaperPanel = new JPanel(); wallpaperPanel.setBorder(BorderFactory.createTitledBorder(strings.getProperty("group.wallpaper"))); GridBagLayout gbl = new GridBagLayout(); wallpaperPanel.setLayout(gbl); radioNone = new JRadioButton(strings.getProperty("radio.none")); radioFile = new JRadioButton(strings.getProperty("radio.file")); radioPredefined = new JRadioButton(strings.getProperty("radio.predefined")); ButtonGroup btnGroup = new ButtonGroup(); btnGroup.add(radioNone); btnGroup.add(radioFile); btnGroup.add(radioPredefined); radioNone.setSelected(true); txtFile = new JTextField(); actChooseFile = new AbstractAction(strings.getProperty("btn.chooseFile")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onChooseFile(); } }; JButton btnChooseFile = new JButton(actChooseFile); listPredefinedWallpapers = new JList(predefinedWallpapers .toArray(new PredefinedWallpaper[predefinedWallpapers.size()])); listPredefinedWallpapers.setCellRenderer(new LocalizedMessageComboBoxRender(strings)); SpinnerNumberModel alphaSpModel = new SpinnerNumberModel(100, 0, 100, 1); spinnerAlpha = new JSpinner(alphaSpModel); GridBagConstraints gbc = new GridBagConstraints(); gbc.ipadx = 0; gbc.ipady = 0; gbc.insets = new Insets(0, 0, 0, 0); gbc.weighty = 0.; gbc.gridheight = 1; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 3; gbc.weightx = 0.; wallpaperPanel.add(radioNone, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 3; gbc.weightx = 0.; wallpaperPanel.add(radioFile, gbc); gbc.gridx = 0; gbc.gridy = 2; gbc.gridwidth = 1; gbc.weightx = 0.; wallpaperPanel.add(Box.createHorizontalStrut(20), gbc); gbc.gridx = 1; gbc.gridy = 2; gbc.gridwidth = 1; gbc.weightx = 1.; wallpaperPanel.add(txtFile, gbc); gbc.gridx = 2; gbc.gridy = 2; gbc.gridwidth = 1; gbc.weightx = 0.; wallpaperPanel.add(btnChooseFile, gbc); gbc.gridx = 0; gbc.gridy = 3; gbc.gridwidth = 3; gbc.weightx = 0.; wallpaperPanel.add(radioPredefined, gbc); gbc.gridx = 1; gbc.gridy = 4; gbc.gridwidth = 2; gbc.weightx = 1.; gbc.weighty = 1.; wallpaperPanel.add(new JScrollPane(listPredefinedWallpapers), gbc); gbc.gridx = 0; gbc.gridy = 5; gbc.gridwidth = 3; gbc.weightx = 0.; gbc.weighty = 0.; gbc.insets = new Insets(5, 0, 0, 0); wallpaperPanel.add(new JLabel( strings.getProperty("label.wallpaperImageAlpha")), gbc); JPanel alphaPanel = new JPanel(new BorderLayout(3, 3)); alphaPanel.setBorder(BorderFactory.createEmptyBorder(3, 0, 3, 0)); alphaPanel.add(spinnerAlpha, BorderLayout.CENTER); alphaPanel.add(new JLabel("%"), BorderLayout.EAST); gbc.gridx = 1; gbc.gridy = 6; gbc.gridwidth = 2; gbc.weightx = 0.; gbc.weighty = 0.; gbc.ipady = 0; gbc.insets = new Insets(0, 0, 0, 0); gbc.fill = GridBagConstraints.NONE; gbc.anchor = GridBagConstraints.WEST; wallpaperPanel.add(alphaPanel, gbc); // リスナ listPredefinedWallpapers.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { radioPredefined.setSelected(true); } }); return wallpaperPanel; } protected void onChooseFile() { File selectedFile = wallpaperInfo.getFile(); final JFileChooser fileChooser = new ImagePreviewFileChooser(); fileChooser.setSelectedFile(selectedFile); if (fileChooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) { return; } selectedFile = fileChooser.getSelectedFile(); txtFile.setText(selectedFile == null ? "" : selectedFile.getPath()); radioFile.setSelected(selectedFile != null); } /** * 壁紙情報インスタンスの内容でコンポーネントを設定する. */ protected void applyByWallpaperInfo() { // ファイル File imageFile = wallpaperInfo.getFile(); txtFile.setText(imageFile == null ? "" : imageFile.getPath()); // リソース PredefinedWallpaper selectedPredefinedWp = null; String resource = wallpaperInfo.getResource(); for (PredefinedWallpaper predefinedWp : predefinedWallpapers) { if (predefinedWp.getResource().equals(resource)) { selectedPredefinedWp = predefinedWp; } } listPredefinedWallpapers.setSelectedValue(selectedPredefinedWp, true); // 透過率 int alphaInt = (int)(wallpaperInfo.getAlpha() * 100); spinnerAlpha.setValue(alphaInt); // 背景色 Color bgColor = wallpaperInfo.getBackgroundColor(); colorBox.setColorKey(bgColor); // タイプ WallpaperResourceType typ = wallpaperInfo.getType(); if (typ == WallpaperResourceType.FILE) { radioFile.setSelected(true); } else if (typ == WallpaperResourceType.PREDEFINED) { radioPredefined.setSelected(true); } else { radioNone.setSelected(true); } } /** * ダイアログのコンポーネントの状態から壁紙情報を構築して返す.
* 生成した壁紙情報が妥当であるかは検証しない.
* @return 新しい壁紙情報インスタンス */ public WallpaperInfo createWallpaperInfo() { WallpaperInfo wallpaperInfo = this.wallpaperInfo.clone(); // 選択したタイプ WallpaperResourceType typ; if (radioFile.isSelected()) { // 背景画像ファイル選択 typ = WallpaperResourceType.FILE; } else if (radioPredefined.isSelected()) { // リソース選択 typ = WallpaperResourceType.PREDEFINED; } else { // それ以外は選択なし typ = WallpaperResourceType.NONE; } // 画像ファイルの現在の選択 String strSelectedFile = txtFile.getText(); File selectedFile = null; if (strSelectedFile != null) { strSelectedFile = strSelectedFile.trim(); if (strSelectedFile.length() > 0) { selectedFile = new File(strSelectedFile); } } wallpaperInfo.setFile(selectedFile); // 定義済みリソースの現在の選択 PredefinedWallpaper predefinedWp = (PredefinedWallpaper) listPredefinedWallpapers.getSelectedValue(); wallpaperInfo.setResource(predefinedWp == null ? null : predefinedWp.getResource()); // タイプの設定 wallpaperInfo.setType(typ); // 背景画像の透過率 int alphaInt = (Integer) spinnerAlpha.getValue(); float alpha = (float) alphaInt / 100.f; wallpaperInfo.setAlpha(alpha); // 背景色 Color bgColor = colorBox.getColorKey(); wallpaperInfo.setBackgroundColor(bgColor); return wallpaperInfo; } protected void onOK() { WallpaperInfo wallpaperInfo = createWallpaperInfo(); if (!checkValidate(wallpaperInfo)) { return; } this.wallpaperInfo = wallpaperInfo; dispose(); } protected void onCancel() { wallpaperInfo = null; dispose(); } protected boolean checkValidate(WallpaperInfo wallpaperInfo) { String messageid = null; WallpaperResourceType typ = wallpaperInfo.getType(); if (typ == WallpaperResourceType.FILE) { File selectedFile = wallpaperInfo.getFile(); if (selectedFile == null) { messageid = "error.require.imageFile"; } else if (!selectedFile.exists() || !selectedFile.isFile() || !selectedFile.canRead()) { messageid = "error.invalid.imageFile"; } } else if (typ == WallpaperResourceType.PREDEFINED) { String resource = wallpaperInfo.getResource(); if (resource == null || resource.trim().length() == 0) { messageid = "error.require.resource"; } } if (messageid != null) { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(WallpaperDialog.STRINGS_RESOURCE); String message = strings.getProperty(messageid); JOptionPane.showMessageDialog(this, message, "ERROR", JOptionPane.ERROR_MESSAGE); } return messageid == null; } public void setWallpaperInfo(WallpaperInfo wallpaperInfo) { if (wallpaperInfo == null) { wallpaperInfo = new WallpaperInfo(); } this.wallpaperInfo = wallpaperInfo; } public WallpaperInfo getWallpaperInfo() { return wallpaperInfo; } /** * ダイアログを表示し、その結果を返す.
* キャンセルされた場合はnullが返される.
* @return 結果、もしくはnull */ public WallpaperInfo showDialog() { applyByWallpaperInfo(); setVisible(true); return wallpaperInfo; } } CharacterManaJ/src/main/java/charactermanaj/ui/MainFramePartialForMacOSX.java0000644000175000017500000000501613615720000027302 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.Image; import java.awt.image.BufferedImage; import java.lang.reflect.Method; import java.util.logging.Level; import java.util.logging.Logger; import com.apple.eawt.Application; import com.apple.eawt.ApplicationAdapter; import com.apple.eawt.ApplicationEvent; import charactermanaj.util.SystemUtil; import charactermanaj.util.UIHelper; /** * Mac OS X用のメインフレームサポートクラス.
* スクリーンメニューのハンドラなどを接続している.
* @author seraphy * */ public class MainFramePartialForMacOSX { /** * ロガー */ private static final Logger logger = Logger.getLogger(MainFramePartialForMacOSX.class.getName()); private MainFramePartialForMacOSX() { super(); } /** * DockIconを設定する */ public static void setupDockIcon() { try { Application app = Application.getApplication(); Class clz = app.getClass(); BufferedImage icon = UIHelper.getInstance().getImage("icons/icon.png"); Method mtd = clz.getMethod("setDockIconImage", new Class[] {Image.class}); mtd.invoke(app, new Object[] { icon }); } catch (NoSuchMethodException ex) { // メソッドがない = Tiger以前の失敗であろうから、単に無視するだけで良い. logger.log(Level.CONFIG, "dockIcon not supported.", ex); } catch (Exception ex) { // 実行時の失敗だが、DockIconが設定できないだけなので継続する. logger.log(Level.WARNING, "dockIcon failed.", ex); } } /** * スクリーンメニューを設定する * @param mainFrame */ public static void setupScreenMenu() { Application app = Application.getApplication(); app.setEnabledAboutMenu(true); app.setEnabledPreferencesMenu(true); ApplicationAdapter listener = new ApplicationAdapter() { public void handleAbout(ApplicationEvent arg0) { if (MainFrame.getActivedMainFrame() != null) { MainFrame.getActivedMainFrame().onAbout(); } arg0.setHandled(true); } public void handleQuit(ApplicationEvent arg0) { if (MainFrame.getActivedMainFrame() != null) { MainFrame.closeAllProfiles(); } arg0.setHandled(true); // JVMを明示的にシャットダウンする. (何もしないと強制終了になるため。) SystemUtil.exit(0); } public void handlePreferences(ApplicationEvent arg0) { if (MainFrame.getActivedMainFrame() != null) { MainFrame.getActivedMainFrame().onPreferences(); } arg0.setHandled(true); } }; app.addApplicationListener(listener); } } CharacterManaJ/src/main/java/charactermanaj/ui/ImageSelectPanelList.java0000644000175000017500000000256713615720000026452 0ustar paulliupaulliupackage charactermanaj.ui; import java.util.AbstractList; import java.util.ArrayList; import java.util.HashMap; import charactermanaj.model.PartsCategory; public class ImageSelectPanelList extends AbstractList { protected ArrayList imageSelectPanels = new ArrayList(); protected HashMap imageSelectPanelMap = new HashMap(); public ImageSelectPanelList() { } @Override public boolean add(ImageSelectPanel o) { if (o == null) { throw new IllegalArgumentException(); } PartsCategory partsCategory = o.getPartsCategory(); if (imageSelectPanelMap.containsKey(partsCategory)) { throw new IllegalArgumentException("duplicate category: " + partsCategory); } imageSelectPanelMap.put(partsCategory, o); return imageSelectPanels.add(o); } @Override public ImageSelectPanel get(int index) { return imageSelectPanels.get(index); } @Override public int size() { return imageSelectPanels.size(); } public ImageSelectPanel findByPartsCategory(PartsCategory partsCategory) { if (partsCategory == null) { throw new IllegalArgumentException(); } ImageSelectPanel panel = imageSelectPanelMap.get(partsCategory); if (panel == null) { throw new IllegalArgumentException("not registered: " + partsCategory); } return panel; } } CharacterManaJ/src/main/java/charactermanaj/ui/ManageFavoriteDialog.java0000644000175000017500000003526513615720000026465 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import charactermanaj.model.CharacterData; import charactermanaj.model.PartsSet; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.LocalizedResourcePropertyLoader; import charactermanaj.util.UIHelper; /** * お気に入りの編集ダイアログ * * @author seraphy */ public class ManageFavoriteDialog extends JDialog { private static final long serialVersionUID = 1L; protected static final String STRINGS_RESOURCE = "languages/managefavoritesdialog"; private CharacterData characterData; private PartsSetListTableModel partsSetListModel; private JTable partsSetList; private FavoriteManageCallback callback; private Action actSelect; private Action actDelete; private Action actRename; public static class PartsSetListTableModel extends AbstractTableModel { /** * シリアライズバージョンID */ private static final long serialVersionUID = 3012538368342673506L; /** * パーツセットのリスト */ private List partsSetList = Collections.emptyList(); private enum Columns { DISPLAY_NAME("Name") { @Override public Object getValue(PartsSet partsSet) { if (partsSet != null) { return partsSet.getLocalizedName(); } return null; } }, IS_PRESET("Type") { @Override public Object getValue(PartsSet partsSet) { if (partsSet != null) { return partsSet.isPresetParts() ? "Preset" : "Favorites"; } return null; } }; private String columnName; private Columns(String columnName) { this.columnName = columnName; } public Class getColumnClass() { return String.class; } public String getColumnName() { return columnName; } public abstract Object getValue(PartsSet partsSet); } private static Columns[] columns = Columns.values(); public int getColumnCount() { return columns.length; } public int getRowCount() { return partsSetList.size(); } public Object getValueAt(int rowIndex, int columnIndex) { PartsSet partsSet = getRow(rowIndex); return columns[columnIndex].getValue(partsSet); } @Override public Class getColumnClass(int columnIndex) { return columns[columnIndex].getColumnClass(); } @Override public String getColumnName(int column) { return columns[column].getColumnName(); } public PartsSet getRow(int rowIndex) { return partsSetList.get(rowIndex); } public void updateRow(int rowIndex, PartsSet partsSet) { partsSetList.set(rowIndex, partsSet); fireTableRowsUpdated(rowIndex, rowIndex); } public List getPartsSetList() { return new ArrayList(partsSetList); } public void setPartsSetList(List partsSetList) { if (partsSetList == null) { partsSetList = Collections.emptyList(); } this.partsSetList = new ArrayList(partsSetList); fireTableDataChanged(); } } /** * パーツセットの選択および保存を行うためのコールバック. */ public interface FavoriteManageCallback { /** * 引数で指定されたパーツセットを表示する. * * @param partsSet */ void selectFavorites(PartsSet partsSet); /** * 指定したキャラクターデータのお気に入りを保存する.
* presetを変更した場合はcharacter.xmlを更新するためにsavePreset引数をtrueとする.
* * @param characterData * お気に入りを保存するキャラクターデータ * @param savePreset * character.xmlを更新する場合(presetの更新) */ void updateFavorites(CharacterData characterData, boolean savePreset); } public ManageFavoriteDialog(JFrame parent, CharacterData characterData) { super(parent, false); if (characterData == null) { throw new IllegalArgumentException(); } setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClose(); } }); Properties strings = LocalizedResourcePropertyLoader .getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); setTitle(strings.getProperty("manageFavorites")); this.characterData = characterData; characterData.getPartsSets(); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); partsSetListModel = new PartsSetListTableModel(); partsSetList = new JTable(partsSetListModel); partsSetList.setRowSelectionAllowed(true); partsSetList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); // 行の高さをフォントの高さにする partsSetList.setRowHeight((int)(partsSetList.getFont().getSize() * 1.2)); partsSetList.setTableHeader(null); partsSetList.getColumnModel().getColumn(1).setMaxWidth(150); partsSetList.getSelectionModel().addListSelectionListener( new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { updateButtonUI(); } }); actSelect = new AbstractAction(strings.getProperty("select")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSelect(); } }; actDelete = new AbstractAction(strings.getProperty("remove")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onDelete(); } }; actRename = new AbstractAction(strings.getProperty("rename")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onRename(); } }; JPanel buttonsPanel = new JPanel(); GridBagLayout gb = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); buttonsPanel.setLayout(gb); gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; buttonsPanel.add(new JButton(actSelect), gbc); gbc.gridx = 0; gbc.gridy = 1; buttonsPanel.add(new JButton(actDelete), gbc); gbc.gridx = 0; gbc.gridy = 2; buttonsPanel.add(new JButton(actRename), gbc); gbc.gridx = 0; gbc.gridy = 3; gbc.weighty = 1.; buttonsPanel.add(Box.createGlue(), gbc); JPanel panel2 = new JPanel(); panel2.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 42)); panel2.setLayout(new BorderLayout()); Action actCancel = new AbstractAction(strings.getProperty("close")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onClose(); } }; JButton btnClose = new JButton(actCancel); panel2.add(btnClose, BorderLayout.EAST); JScrollPane scr = new JScrollPane(partsSetList); scr.setBorder(BorderFactory.createEtchedBorder()); scr.setPreferredSize(new Dimension(300, 150)); contentPane.add(scr, BorderLayout.CENTER); contentPane.add(buttonsPanel, BorderLayout.EAST); contentPane.add(panel2, BorderLayout.SOUTH); Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); rootPane.setDefaultButton(btnClose); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "deleteFav"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeManageFavoriteDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeManageFavoriteDialog"); am.put("deleteFav", actDelete); am.put("closeManageFavoriteDialog", actCancel); Dimension dim = new Dimension(400, 500); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); if (scaleSupport != null) { // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する dim = scaleSupport.manualScaled(dim); } setSize(dim); setLocationRelativeTo(parent); final JPopupMenu popupMenu = new JPopupMenu(); popupMenu.add(new JMenuItem(actSelect)); popupMenu.add(new JMenuItem(actRename)); popupMenu.add(new JMenuItem(actDelete)); partsSetList.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { onSelect(); } } @Override public void mousePressed(MouseEvent e) { if (SwingUtilities.isRightMouseButton(e)) { // 右クリックによる選択 Point pt = e.getPoint(); int rowIndex = partsSetList.rowAtPoint(pt); if (rowIndex >= 0) { int[] selrows = partsSetList.getSelectedRows(); Arrays.sort(selrows); if (Arrays.binarySearch(selrows, rowIndex) < 0) { // 現在の選択行以外を右クリックした場合、その行を選択行とする. ListSelectionModel selModel = partsSetList .getSelectionModel(); selModel.setSelectionInterval(rowIndex, rowIndex); } } } evaluatePopup(e); } @Override public void mouseReleased(MouseEvent e) { evaluatePopup(e); } private void evaluatePopup(MouseEvent e) { if (e.isPopupTrigger()) { popupMenu.show(partsSetList, e.getX(), e.getY()); } } }); initListModel(); updateButtonUI(); } /** * 現在のキャラクターデータの最新の状態でお気に入り一覧を更新する. */ public void initListModel() { ArrayList partssets = new ArrayList(); for (PartsSet partsset : characterData.getPartsSets().values()) { partssets.add(partsset); } Collections.sort(partssets, PartsSet.DEFAULT_COMPARATOR); partsSetListModel.setPartsSetList(partssets); } protected void updateButtonUI() { int[] rows = partsSetList.getSelectedRows(); actSelect.setEnabled(rows.length == 1); actRename.setEnabled(rows.length == 1); actDelete.setEnabled(rows.length >= 1); } /** * 選択されている「お気に入り」のパーツセットの一覧を取得する.
* プリセットが選択されている場合、それは除外される.
* * @param beep * プリセットが選択されている場合にビープを鳴らすか? * @return お気に入りのパーツセットのリスト、選択がなければ空のリスト. */ protected List getSelectedPartsSet() { ArrayList selectedPartsSet = new ArrayList(); int[] rows = partsSetList.getSelectedRows(); for (int row : rows) { PartsSet partsSet = partsSetListModel.getRow(row); selectedPartsSet.add(partsSet); } return selectedPartsSet; } /** * お気に入りの削除 */ protected void onDelete() { List removePartsSet = getSelectedPartsSet(); if (removePartsSet.isEmpty() || callback == null) { return; } // 削除の確認ダイアログ Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); String msg = strings.getProperty("favorite.remove.confirm"); JOptionPane optionPane = new JOptionPane(msg, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION) { private static final long serialVersionUID = 1L; @Override public void selectInitialValue() { String noBtnCaption = UIManager .getString("OptionPane.noButtonText"); for (JButton btn : UIHelper.getInstance().getDescendantOfClass( JButton.class, this)) { if (btn.getText().equals(noBtnCaption)) { // 「いいえ」ボタンにフォーカスを設定 btn.requestFocus(); } } } }; JDialog dlg = optionPane.createDialog(ManageFavoriteDialog.this, strings.getProperty("confirm.remove")); dlg.setVisible(true); Object ret = optionPane.getValue(); if (ret == null || ((Number) ret).intValue() != JOptionPane.YES_OPTION) { return; } // お気に入りリストから削除する. boolean dirty = false; boolean deletePreset = false; Map partsSetMap = characterData.getPartsSets(); for (PartsSet partsSet : removePartsSet) { Iterator> ite = partsSetMap.entrySet().iterator(); while (ite.hasNext()) { Map.Entry entry = ite.next(); PartsSet target = entry.getValue(); if (target == partsSet) { dirty = true; if (target.isPresetParts()) { // presetを削除した場合はcharacter.xmlの更新が必要 deletePreset = true; } ite.remove(); } } } if (dirty) { callback.updateFavorites(characterData, deletePreset); initListModel(); } } /** * お気に入りのリネーム */ protected void onRename() { int row = partsSetList.getSelectedRow(); if (row < 0 || callback == null) { return; } PartsSet partsSet = partsSetListModel.getRow(row); Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); String localizedName = JOptionPane.showInputDialog(this, strings.getProperty("inputName"), partsSet.getLocalizedName()); if (localizedName != null) { partsSet.setLocalizedName(localizedName); callback.updateFavorites(characterData, partsSet.isPresetParts()); initListModel(); } } /** * 選択したお気に入りを表示する. */ protected void onSelect() { int row = partsSetList.getSelectedRow(); if (row < 0) { return; } PartsSet partsSet = partsSetListModel.getRow(row); if (callback != null) { callback.selectFavorites(partsSet); } } protected void onClose() { dispose(); } public void setFavoriteManageCallback(FavoriteManageCallback callback) { this.callback = callback; } public FavoriteManageCallback getFavoriteManageCallback() { return callback; } } CharacterManaJ/src/main/java/charactermanaj/ui/MainFramePartialForMacOSX9.java0000644000175000017500000000715613615720000027402 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.Desktop; import java.awt.Image; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.logging.Logger; import javax.imageio.ImageIO; import charactermanaj.Main; /** * Mac OS X用のOracle JDK9以降のメインフレームサポートクラス.
* スクリーンメニューのハンドラなどを接続している.
* * JDK9以降はAppleのeawtがなくなってOracleのAPIを使う必要があるため.
* @author seraphy */ public class MainFramePartialForMacOSX9 { /** * ロガー */ private static final Logger logger = Logger.getLogger(MainFramePartialForMacOSX.class.getName()); private MainFramePartialForMacOSX9() { super(); } /** * DockIconを設定する * * @throws Exception 失敗した場合 */ public static void setupDockIcon() throws Exception { Class taskbarCls = Class.forName("java.awt.Taskbar"); Object taskbar = taskbarCls.getMethod("getTaskbar").invoke(null); Method setIconImageMethod = taskbarCls.getMethod("setIconImage", Image.class); Image icon = ImageIO.read(Main.class.getResource("/icons/icon.png")); setIconImageMethod.invoke(taskbar, icon); } /** * スクリーンメニューを設定する * * @param mainFrame メインフレーム * @throws Exception 失敗 */ public static void setupScreenMenu() throws Exception { // Java9以降であればOracle実装でスクリーンメニュー類を設定する. // (jdk5でコンパイルする都合上、無理矢理リフレクション経由のDynamicProxyでハンドラを作っている) Desktop desktop = Desktop.getDesktop(); Class aboutHandlerCls = Class.forName("java.awt.desktop.AboutHandler"); Object aboutHandler = Proxy.newProxyInstance(Main.class.getClassLoader(), new Class[] { aboutHandlerCls }, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("handleAbout")) { MainFrame.getActivedMainFrame().onAbout(); return null; } logger.warning("aboutHandler called=" + method.getName()); return null; } }); desktop.getClass().getMethod("setAboutHandler", aboutHandlerCls).invoke(desktop, aboutHandler); Class preferenceHandlerCls = Class.forName("java.awt.desktop.PreferencesHandler"); Object preferenceHandler = Proxy.newProxyInstance(Main.class.getClassLoader(), new Class[] { preferenceHandlerCls }, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("handlePreferences")) { MainFrame.getActivedMainFrame().onPreferences(); return null; } logger.warning("preferenceHandler called=" + method.getName()); return null; } }); desktop.getClass().getMethod("setPreferencesHandler", preferenceHandlerCls).invoke(desktop, preferenceHandler); Class quitHandlerCls = Class.forName("java.awt.desktop.QuitHandler"); Object quitHandler = Proxy.newProxyInstance(Main.class.getClassLoader(), new Class[] { quitHandlerCls }, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("handleQuitRequestWith")) { MainFrame.closeAllProfiles(); System.exit(0); return null; } logger.warning("quitHandler called=" + method.getName()); return null; } }); desktop.getClass().getMethod("setQuitHandler", quitHandlerCls).invoke(desktop, quitHandler); } } CharacterManaJ/src/main/java/charactermanaj/ui/MainFrame.java0000644000175000017500000032066213615720000024312 0ustar paulliupaulliupackage charactermanaj.ui; import static java.lang.Math.*; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dialog.ModalityType; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.GraphicsEnvironment; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.dnd.DropTarget; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.TreeMap; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JCheckBoxMenuItem; import javax.swing.JColorChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButton; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JSplitPane; import javax.swing.JViewport; import javax.swing.SwingUtilities; import javax.swing.event.AncestorEvent; import javax.swing.event.AncestorListener; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; import charactermanaj.Main; import charactermanaj.clipboardSupport.ClipboardUtil; import charactermanaj.graphics.AsyncImageBuilder; import charactermanaj.graphics.ColorConvertedImageCachedLoader; import charactermanaj.graphics.ImageBuildJobAbstractAdaptor; import charactermanaj.graphics.ImageBuilder; import charactermanaj.graphics.ImageBuilder.ImageOutput; import charactermanaj.graphics.ImageBuilder.ImageSourceCollector; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.graphics.io.ImageResource; import charactermanaj.graphics.io.ImageSaveHelper; import charactermanaj.graphics.io.ImageSaveHelper.LayerImage; import charactermanaj.graphics.io.OutputOption; import charactermanaj.graphics.io.UkagakaImageSaveHelper; import charactermanaj.model.AppConfig; import charactermanaj.model.CharacterData; import charactermanaj.model.CharacterDataChangeEvent; import charactermanaj.model.CharacterDataChangeListener; import charactermanaj.model.CharacterDataChangeObserver; import charactermanaj.model.ColorGroup; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.Layer; import charactermanaj.model.LayerOrderMapper; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsColorInfo; import charactermanaj.model.PartsColorManager; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.model.RecommendationURL; import charactermanaj.model.WorkingSet; import charactermanaj.model.io.CharacterDataFileReaderWriterFactory; import charactermanaj.model.io.CharacterDataPersistent; import charactermanaj.model.io.CustomLayerOrderPersist; import charactermanaj.model.io.CustomLayerOrderPersist.CustomLayerOrderPersistListener; import charactermanaj.model.io.PartsImageCollectionParser; import charactermanaj.model.io.PartsImageDirectoryWatchAgent; import charactermanaj.model.io.PartsImageDirectoryWatchAgentFactory; import charactermanaj.model.io.PartsImageDirectoryWatchEvent; import charactermanaj.model.io.PartsImageDirectoryWatchListener; import charactermanaj.model.io.RecentDataPersistent; import charactermanaj.model.io.WorkingSetPersist; import charactermanaj.ui.ImageSelectPanel.ImageSelectPanelEvent; import charactermanaj.ui.ImageSelectPanel.ImageSelectPanelListener; import charactermanaj.ui.LayerOrderCustomizeDialog.LayerOrderCustomizeListener; import charactermanaj.ui.ManageFavoriteDialog.FavoriteManageCallback; import charactermanaj.ui.PreviewPanel.PreviewPanelEvent; import charactermanaj.ui.PreviewPanel.PreviewPanelListener; import charactermanaj.ui.model.ActiveCustomLayerPatternMgr; import charactermanaj.ui.model.ColorChangeEvent; import charactermanaj.ui.model.ColorChangeListener; import charactermanaj.ui.model.ColorGroupCoordinator; import charactermanaj.ui.model.FavoritesChangeEvent; import charactermanaj.ui.model.FavoritesChangeListener; import charactermanaj.ui.model.FavoritesChangeObserver; import charactermanaj.ui.model.PartsColorCoordinator; import charactermanaj.ui.model.PartsSelectionManager; import charactermanaj.ui.model.WallpaperFactory; import charactermanaj.ui.model.WallpaperFactoryErrorRecoverHandler; import charactermanaj.ui.model.WallpaperFactoryException; import charactermanaj.ui.model.WallpaperInfo; import charactermanaj.ui.scrollablemenu.JScrollableMenu; import charactermanaj.ui.util.FileDropTarget; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.ui.util.WindowAdjustLocationSupport; import charactermanaj.util.DesktopUtilities; import charactermanaj.util.DownloadUtils; import charactermanaj.util.DownloadUtils.HeadResponse; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.LocalizedResourcePropertyLoader; import charactermanaj.util.SystemUtil; import charactermanaj.util.UIHelper; /** * メインフレーム.
* アプリケーションがアクティブである場合は最低でも1つのメインフレームが表示されている.
* * @author seraphy */ public class MainFrame extends JFrame implements FavoritesChangeListener, CharacterDataChangeListener, CustomLayerOrderPersistListener { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(MainFrame.class.getName()); protected static final String STRINGS_RESOURCE = "languages/mainframe"; protected static final String MENU_STRINGS_RESOURCE = "menu/menu"; /** * メインフレームのアイコン.
*/ private BufferedImage icon; /** * 現在アクティブなメインフレーム.
* フォーカスが切り替わるたびにアクティブフレームを追跡する.
* Mac OS XのAbout/Preferences/Quitのシステムメニューからよびだされた場合に * オーナーたるべきメインフレームを識別するためのもの.
*/ private static volatile MainFrame activedMainFrame; /** * このメインフレームが対象とするキャラクターデータ.
*/ protected CharacterData characterData; /** * プレビューペイン */ private PreviewPanel previewPane; /** * パーツ選択マネージャ */ protected PartsSelectionManager partsSelectionManager; /** * パネルの最小化モード */ private boolean minimizeMode; /** * パーツ選択パネルリスト */ protected ImageSelectPanelList imageSelectPanels; /** * パーツ選択パネルを納めるスクロールペイン */ protected JScrollPane imgSelectPanelsPanelSp; /** * カラーグループのマネージャ */ protected ColorGroupCoordinator colorGroupCoordinator; /** * パーツカラーのマネージャ */ protected PartsColorCoordinator partsColorCoordinator; /** * キャッシュつきのイメージローダ.
*/ private ColorConvertedImageCachedLoader imageLoader; /** * パーツを組み立てて1つのプレビュー可能なイメージを構築するためのビルダ */ private AsyncImageBuilder imageBuilder; /** * パーツイメージを画像として保存する場合のヘルパー.
* 最後に使ったディレクトリを保持するためのメンバ変数としている.
*/ private ImageSaveHelper imageSaveHelper = new ImageSaveHelper(); /** * 伺か用出力ヘルパ.
* 最後に使ったディレクトリ、ファイル名、モードなどを保持するためのメンバ変数としている.
*/ private UkagakaImageSaveHelper ukagakaImageSaveHelper = new UkagakaImageSaveHelper(); /** * パーツディレクトリを定期的にチェックし、パーツイメージが変更・追加・削除されている場合に パーツリストを更新するためのウォッチャー */ private PartsImageDirectoryWatchAgent watchAgent; /** * デフォルトのパーツセット表示名 */ private String defaultPartsSetTitle; /** * 最後に使用したプリセット.
* (一度もプリセットを使用していなければnull). */ private PartsSet lastUsePresetParts; /** * 最後に使用した検索ダイアログ.
* nullであれば一度も使用していない.
* (nullでなくとも閉じられている可能性がある.)
*/ private SearchPartsDialog lastUseSearchPartsDialog; /** * 最後に使用したお気に入りダイアログ.
* nullであれば一度も使用していない.
* (nullでなくとも閉じられている可能性がある.) */ private ManageFavoriteDialog lastUseManageFavoritesDialog; /** * 最後に使用したパーツのランダム選択ダイアログ.
* nullであれば一度も使用していない.
* (nullでなくとも閉じられている可能性がある.) */ private PartsRandomChooserDialog lastUsePartsRandomChooserDialog; /** * 最後に使用した壁紙情報 */ private WallpaperInfo wallpaperInfo; /** * カスタムレイヤーパターンのリストを管理する */ private final ActiveCustomLayerPatternMgr customLayerPatternMgr = new ActiveCustomLayerPatternMgr(); /** * ダウンロード不要フラグ */ private boolean noNeedDataDownload; /** * アクティブなメインフレームを設定する. * * @param mainFrame * メインフレーム */ public static void setActivedMainFrame(MainFrame mainFrame) { if (mainFrame == null) { throw new IllegalArgumentException(); } activedMainFrame = mainFrame; } /** * 現在アクティブなメインフレームを取得する. まだメインフレームが開かれていない場合はnull.
* 最後のメインフレームが破棄中、もしくは破棄済みであれば破棄されたフレームを示すことに注意.
* * @return メインフレーム、もしくはnull */ public static MainFrame getActivedMainFrame() { return activedMainFrame; } /** * キャラクターデータが変更された場合に通知される. */ public void notifyChangeCharacterData(final CharacterDataChangeEvent e) { final CharacterData cd = e.getCharacterData(); if (cd != null && cd.getDocBase().equals( MainFrame.this.characterData.getDocBase())) { SwingUtilities.invokeLater(new Runnable() { public void run() { try { Cursor oldCur = getCursor(); setCursor(Cursor .getPredefinedCursor(Cursor.WAIT_CURSOR)); try { if (e.isChangeStructure()) { // 現在情報の保存 saveWorkingSet(); // 画面構成の再構築 initComponent(cd); // メニューの状態の更新 menuUpdater.run(); } if (e.isReloadPartsAndFavorites()) { // パーツとお気に入りのリロード reloadPartsAndFavorites(cd, true); } } finally { setCursor(oldCur != null ? oldCur : Cursor .getDefaultCursor()); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(MainFrame.this, ex); } } }); } } /** * お気に入りデータが変更された場合に通知される. * * @param e */ @Override public void notifyChangeFavorites(FavoritesChangeEvent e) { CharacterData cd = e.getCharacterData(); if (cd != null && cd.getDocBase().equals( MainFrame.this.characterData.getDocBase())) { if (!MainFrame.this.equals(e.getSource()) && !characterData.equals(cd)) { // プリセットとお気に入りを最新化する. // ただし、自分自身から送信したイベントの場合は最新化は不要. characterData.clearPartsSets(false); for (Map.Entry entry : cd.getPartsSets() .entrySet()) { PartsSet partsSet = entry.getValue(); characterData.addPartsSet(partsSet); } } // お気に入り管理ダイアログ上のお気に入り一覧を最新に更新する. if (lastUseManageFavoritesDialog != null && lastUseManageFavoritesDialog.isDisplayable()) { lastUseManageFavoritesDialog.initListModel(); } } } /** * 外部でカスタムレイヤーの定義が変更された場合に呼び出される * @param e */ @Override public void notifyChangeCustomLayerOrder(CustomLayerOrderPersistListener.Change e) { if (!e.getSource().equals(characterData)) { // 自分が送信元の場合は何もしない Map> map = e.getCustomLayerOrderMap(); if (map != null) { customLayerPatternMgr.setMap(map); requestPreview(); } } } /** * メインフレームを構築する. * * @param characterData * キャラクターデータ */ public MainFrame(CharacterData characterData) { try { if (characterData == null) { throw new IllegalArgumentException(); } setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onCloseProfile(); } @Override public void windowClosed(WindowEvent e) { stopAgents(); } @Override public void windowActivated(WindowEvent e) { setActivedMainFrame(MainFrame.this); } @Override public void windowOpened(WindowEvent e) { // do nothing. } }); // アイコンスケールの設定 ScaleSupport scaleSupport = ScaleSupport.getInstance(this); UIHelper uiUtl = UIHelper.getInstance(); uiUtl.setScaleX(scaleSupport.getManualScaleX()); uiUtl.setScaleY(scaleSupport.getManualScaleY()); // アイコンの設定 icon = uiUtl.getImage("icons/icon.png"); setIconImage(icon); // 画面コンポーネント作成 initComponent(characterData); initMenubar(); // お気に入り変更通知を受け取る FavoritesChangeObserver.getDefault().addFavoritesChangeListener( this); // キャラクターデータの変更通知を受け取る CharacterDataChangeObserver.getDefault() .addCharacterDataChangeListener(this); // レイヤーパターンの変更通知を受け取る CustomLayerOrderPersist.newInstance(characterData) .addCustomLayerOrderPersistListener(this); // アプリケーション設定の変更で画面の再表示を試行する AppConfig.getInstance().addPropertyChangeListener(appConfigChangeListener); // パーツがひとつも登録されていない場合 // (ただし、すでにダウンロード不要フラグを設定してあればスキップする) // (データ構造変更時の再ロードでは、この処理は行わない。一時的にパーツ数が0になるため) if (characterData.getPartsCount() == 0 && !noNeedDataDownload) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { confirmDefaultCharacterDataDownload(); } }); } } catch (RuntimeException ex) { logger.log(Level.SEVERE, "メインフレームの構築中に予期せぬ例外が発生しました。", ex); dispose(); // コンストラクタが呼ばれた時点でJFrameは構築済みなのでdisposeの必要がある. throw ex; } catch (Error ex) { logger.log(Level.SEVERE, "メインフレームの構築中に致命的な例外が発生しました。", ex); dispose(); // コンストラクタが呼ばれた時点でJFrameは構築済みなのでdisposeの必要がある. throw ex; } } /** * デフォルトのウィンドウ位置とサイズの設定 */ private void setDefaultWindowLocation() { // メインスクリーンサイズを取得する. GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment(); Rectangle desktopSize = genv.getMaximumWindowBounds(); // メインスクリーンのサイズ(デスクトップ領域のみ) logger.log(Level.CONFIG, "desktopSize=" + desktopSize); Dimension imageSize = characterData.getImageSize(); // 画像サイズ300x400を基準サイズとして、それ以下にはならない. // アプリケーション設定の最大サイズ以上の場合はウィンドウサイズは固定してスクロールバーに任せる AppConfig appConfig = AppConfig.getInstance(); int maxWidth = min(desktopSize.width, appConfig.getMainFrameMaxWidth()); int maxHeight = min(desktopSize.height, appConfig.getMainFrameMaxHeight()); int imageWidth = min(maxWidth, max(300, imageSize != null ? imageSize.width : 0)); int imageHeight = min(maxHeight, max(400, imageSize != null ? imageSize.height : 0)); // 300x400の画像の場合にメインフレームが600x550だとちょうどいい感じ. // それ以上大きい画像の場合は増えた分だけフレームを大きくしておく. Dimension dim = new Dimension(imageWidth - 300 + 600, imageHeight - 400 + 550); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); if (scaleSupport != null) { // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する dim = scaleSupport.manualScaled(dim); } setSize(dim); // 現在表示されていなければ、次回表示時にプラットフォーム固有位置に表示するように予約 if (!isShowing()) { setLocationByPlatform(true); } } /** * メインフレームを表示する.
* デスクトップ領域からはみ出した場合は位置を補正する.
*/ public void showMainFrame() { // メインスクリーンサイズを取得する. GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment(); Rectangle desktopSize = genv.getMaximumWindowBounds(); // メインスクリーンのサイズ(デスクトップ領域のみ) logger.log(Level.CONFIG, "desktopSize=" + desktopSize); // プラットフォーム固有の位置あわせで表示する. // 表示した結果、はみ出している場合は0,0に補正する. setVisible(true); Point loc = getLocation(); logger.log(Level.CONFIG, "windowLocation=" + loc); Dimension windowSize = getSize(); if (loc.y + windowSize.height >= desktopSize.height) { loc.y = 0; } if (loc.x + windowSize.width >= desktopSize.width) { loc.x = 0; } if (loc.x == 0 || loc.y == 0) { setLocation(loc); } // デスクトップよりも大きい場合は小さくする. boolean resize = false; Dimension dim = getSize(); if (dim.height > desktopSize.height) { dim.height = desktopSize.height; resize = true; } if (dim.width > desktopSize.width) { dim.width = desktopSize.width; resize = true; } if (resize) { setSize(dim); } } /** * このメインフレームに関連づけられているエージェントスレッドを停止します.
* すでに停止している場合は何もしません。 */ protected void stopAgents() { // エージェントを停止 if (watchAgent != null) { try { watchAgent.disconnect(); } catch (Throwable ex) { logger.log(Level.SEVERE, "フォルダ監視スレッドの停止に失敗しました。", ex); } watchAgent = null; } // イメージビルダを停止 if (imageBuilder != null) { try { imageBuilder.stop(); } catch (Throwable ex) { logger.log(Level.SEVERE, "非同期イメージビルダスレッドの停止に失敗しました。", ex); } imageBuilder = null; } } /** * メインフレームを破棄します.
*/ @Override public void dispose() { FavoritesChangeObserver.getDefault() .removeFavoritesChangeListener(this); CharacterDataChangeObserver.getDefault() .removeCharacterDataChangeListener(this); CustomLayerOrderPersist.newInstance(characterData) .removeCustomLayerOrderPersistListener(this); AppConfig.getInstance() .removePropertyChangeListener(appConfigChangeListener); imageLoader.close(); stopAgents(); super.dispose(); } /** * AppConfigの設定値が変更されたことを通知されるリスナ */ private final PropertyChangeListener appConfigChangeListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { // 画面を再描画する repaint(); } }; /** * 画面コンポーネントを設定します.
* すでに設定されている場合は一旦削除されたのちに再作成されます.
*/ private void initComponent(CharacterData characterData) { CharacterData oldCd; synchronized (this) { oldCd = this.characterData; if (oldCd != null) { // 使用中のキャラクターデータであることを登録解除する。 ProfileListManager.unregisterUsedCharacterData(oldCd); } this.characterData = characterData; // 使用中のキャラクターデータであることを登録する. ProfileListManager.registerUsedCharacterData(characterData); } // 設定まわり準備 AppConfig appConfig = AppConfig.getInstance(); Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); // タイトル表示 String title; if (Main.isMacOSX()) { // Mac OS Xの場合はウィンドウにタイトルはつけない。 title = ""; } else { title = strings.getProperty("title") + " - "; } setTitle(title + characterData.getName()); // デフォルトのパーツセット表示名 defaultPartsSetTitle = strings.getProperty("defaultPartsSetTitle"); // エージェントの停止 stopAgents(); // コンポーネント配置 Container contentPane = getContentPane(); // すでにあるコンポーネントを削除 for (Component comp : contentPane.getComponents()) { contentPane.remove(comp); } // 開いている情報ダイアログを閉じる closeInformationDialog(); // 開いている検索ダイアログを閉じる closeSearchDialog(); // 開いているお気に入り管理ダイアログを閉じる closeManageFavoritesDialog(); // 開いているランダム選択ダイアログを閉じる. closePartsRandomChooserDialog(); PartsColorManager partsColorManager = characterData.getPartsColorManager(); // デフォルトの背景色の設定 Color bgColor = appConfig.getDefaultImageBgColor(); wallpaperInfo = new WallpaperInfo(); wallpaperInfo.setBackgroundColor(bgColor); if (imageLoader != null) { imageLoader.close(); } imageLoader = new ColorConvertedImageCachedLoader(); imageBuilder = new AsyncImageBuilder(imageLoader); partsSelectionManager = new PartsSelectionManager(partsColorManager, new PartsSelectionManager.ImageBgColorProvider() { public Color getImageBgColor() { return wallpaperInfo.getBackgroundColor(); } public void setImageBgColor(Color imageBgColor) { applyBackgroundColorOnly(imageBgColor); } }, new PartsSelectionManager.CustomLayerPatternsIDProvider() { @Override public Set getActivePatternIds() { Set keys = customLayerPatternMgr.getActivePatternNames(); Set ids = new HashSet(); for (CustomLayerOrderKey key : keys) { ids.add(key.getId()); } return ids; } @Override public void setActivePatternIds(Set names) { Set keys = new HashSet(); for (CustomLayerOrderKey key : customLayerPatternMgr.getMap().keySet()) { if (names.contains(key.getId())) { keys.add(key); } } customLayerPatternMgr.setActivePatternNames(keys); } }); colorGroupCoordinator = new ColorGroupCoordinator(partsSelectionManager, partsColorManager); partsColorCoordinator = new PartsColorCoordinator(characterData, partsColorManager, colorGroupCoordinator); PartsImageDirectoryWatchAgentFactory agentFactory = PartsImageDirectoryWatchAgentFactory.getFactory(); watchAgent = agentFactory.getAgent(characterData); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); previewPane = new PreviewPanel(scaleSupport); previewPane.setTitle(defaultPartsSetTitle); previewPane.addPreviewPanelListener(new PreviewPanelListener() { public void addFavorite(PreviewPanelEvent e) { if (!e.isShiftKeyPressed()) { // お気に入り登録 onRegisterFavorite(); } else { // シフトキーにて、お気に入りの管理を開く onManageFavorites(); } } public void changeBackgroundColor(PreviewPanelEvent e) { if ( !e.isShiftKeyPressed()) { // 壁紙選択 onChangeWallpaper(); } else { // シフトキーにて背景色変更 onChangeBgColor(); } } public void copyPicture(PreviewPanelEvent e) { onCopy(e.isShiftKeyPressed()); } public void savePicture(PreviewPanelEvent e) { if ( !e.isShiftKeyPressed()) { // 画像出力 onSavePicture(); } else { // シフトキーにて「伺か」用出力 onSaveAsUkagaka(); } } public void showInformation(PreviewPanelEvent e) { onInformation(); } public void flipHorizontal(PreviewPanelEvent e) { onFlipHolizontal(); } }); imageSelectPanels = new ImageSelectPanelList(); JPanel imgSelectPanelsPanel = new JPanel(); BoxLayout bl = new BoxLayout(imgSelectPanelsPanel, BoxLayout.PAGE_AXIS); imgSelectPanelsPanel.setLayout(bl); for (PartsCategory category : characterData.getPartsCategories()) { final ImageSelectPanel imageSelectPanel = new ImageSelectPanel(scaleSupport, category, characterData); imgSelectPanelsPanel.add(imageSelectPanel); imageSelectPanels.add(imageSelectPanel); partsSelectionManager.register(imageSelectPanel); } imgSelectPanelsPanelSp = new JScrollPane(imgSelectPanelsPanel) { private static final long serialVersionUID = 1L; @Override public JScrollBar createVerticalScrollBar() { JScrollBar sb = super.createVerticalScrollBar(); sb.setUnitIncrement(12); return sb; } }; imgSelectPanelsPanelSp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, imgSelectPanelsPanelSp, previewPane); contentPane.add(splitPane, BorderLayout.CENTER); imgSelectPanelsPanelSp.requestFocus(); ArrayList colorGroups = new ArrayList(); colorGroups.addAll(characterData.getColorGroups()); final ColorChangeListener colorChangeListener = new ColorChangeListener() { public void onColorGroupChange(ColorChangeEvent event) { // do nothing. } public void onColorChange(ColorChangeEvent event) { MainFrame.this.requestPreview(); } }; colorGroupCoordinator.addColorChangeListener(colorChangeListener); for (int idx = 0; idx < imageSelectPanels.size(); idx++) { ImageSelectPanel imageSelectPanel = imageSelectPanels.get(idx); final PartsCategory partsCategory = imageSelectPanel.getPartsCategory(); final ColorDialog colorDialog = new ColorDialog(this, partsCategory, colorGroups); colorGroupCoordinator.registerColorDialog(colorDialog); partsColorCoordinator.register(imageSelectPanel, colorDialog); final int curidx = idx; imageSelectPanel.addImageSelectListener(new ImageSelectPanelListener() { public void onChangeColor(ImageSelectPanelEvent event) { WindowAdjustLocationSupport.alignRight( MainFrame.this, colorDialog, curidx, false); colorDialog.setVisible(!colorDialog.isVisible()); } public void onPreferences(ImageSelectPanelEvent event) { // do nothing. (not supported) } public void onChange(ImageSelectPanelEvent event) { MainFrame.this.requestPreview(); } public void onSelectChange(ImageSelectPanelEvent event) { // do nothing. } public void onTitleClick(ImageSelectPanelEvent event) { PartsCategory partsCategory = (event != null) ? event.getImageSelectPanel().getPartsCategory() : null; MainFrame.this.onClickPartsCategoryTitle(partsCategory, false); } public void onTitleDblClick(ImageSelectPanelEvent event) { PartsCategory partsCategory = (event != null) ? event.getImageSelectPanel().getPartsCategory() : null; MainFrame.this.onClickPartsCategoryTitle(partsCategory, true); } }); imageSelectPanel.addAncestorListener(new AncestorListener() { public void ancestorAdded(AncestorEvent event) { } public void ancestorMoved(AncestorEvent event) { } public void ancestorRemoved(AncestorEvent event) { // パネルもしくは、その親が削除されたときにダイアログも非表示とする。 colorDialog.setVisible(false); } }); } // 全パーツのロード partsSelectionManager.loadParts(); // 登録されているカスタムレイヤーパターンのロード loadCustomLayerOrder(); // 保存されているワーキングセットを復元する. // 復元できなかった場合はパーツセットを初期選択する. if ( !loadWorkingSet()) { // ワーキングセットがない場合は // デフォルトのウィンドウ位置とサイズ setDefaultWindowLocation(); // デフォルトのパーツセットの表示 if (showDefaultParts(true)) { requestPreview(); } } // 選択されているパーツを見える状態にする scrollToSelectedParts(); // 非同期イメージローダの処理開始 if (!imageBuilder.isAlive()) { imageBuilder.start(); } // ドロップターゲットの設定 new DropTarget(imgSelectPanelsPanelSp, new FileDropTarget() { @Override protected void onDropFiles(final List dropFiles) { if (dropFiles == null || dropFiles.isEmpty()) { return; } final File dropFile = dropFiles.get(0); // インポートダイアログを開く. // ドロップソースの処理がブロッキングしないように、 // ドロップハンドラの処理を終了してからインポートダイアログが開くようにする. SwingUtilities.invokeLater(new Runnable() { public void run() { onImport(new ImportSourceCallback() { @Override public void onInit(ImportWizardDialog dlg) { dlg.initSelectFile(dropFile); } }); } }); } @Override protected void onException(Exception ex) { ErrorMessageHelper.showErrorDialog(MainFrame.this, ex); } }); // ディレクトリを監視し変更があった場合にパーツをリロードするリスナ watchAgent.addPartsImageDirectoryWatchListener(new PartsImageDirectoryWatchListener() { public void detectPartsImageChange(PartsImageDirectoryWatchEvent e) { Runnable refreshJob = new Runnable() { public void run() { onDetectPartsImageChange(); } }; if (SwingUtilities.isEventDispatchThread()) { refreshJob.run(); } else { SwingUtilities.invokeLater(refreshJob); } } }); // 監視が有効であれば、ディレクトリの監視をスタートする if (appConfig.isEnableDirWatch() && characterData.isWatchDirectory()) { watchAgent.connect(); } // パーツカテゴリの自動縮小が設定されている場合 minimizeMode = false; if (appConfig.isEnableAutoShrinkPanel()) { onClickPartsCategoryTitle(null, true); } // コンポーネントの再構築の場合 if (oldCd != null) { validate(); } } /** * おすすめURLの表示名がアスタリスクで始まっている、urlがzipの最初の定義を * デフォルトのキャラクターセットのダウンロードurlとしてインポートするか問い合わせる */ private void confirmDefaultCharacterDataDownload() { List recommendations = characterData.getRecommendationURLList(); List downloadUrls = new ArrayList(); if (recommendations != null) { CharacterDataFileReaderWriterFactory archiveRdWrFactory = CharacterDataFileReaderWriterFactory.getInstance(); for (RecommendationURL recommendation : recommendations) { String name = recommendation.getDisplayName(); String url = recommendation.getUrl(); if (name.startsWith("*") && archiveRdWrFactory.isSupportedFile(url)) { downloadUrls.add(recommendation); } } } if (downloadUrls.isEmpty()) { // デフォルトのキャラクターデータが定義されていない場合 return; } Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); Box box = Box.createVerticalBox(); box.add(new JLabel(strings.getProperty("defaultdatadownload.confirm.message"))); ButtonGroup grp = new ButtonGroup(); for (RecommendationURL recommendation : downloadUrls) { String name = recommendation.getDisplayName(); String url = recommendation.getUrl(); if (name.startsWith("*")) { name = name.substring(1); } JRadioButton radio = new JRadioButton(name); radio.setToolTipText(url); radio.setActionCommand(url); if (grp.getButtonCount() == 0) { // 最初のアイテムを選択状態にする radio.setSelected(true); } grp.add(radio); box.add(radio); } JRadioButton chkNoAskAgain = new JRadioButton(strings.getProperty("noDownloadAndDoNotAskAgain")); grp.add(chkNoAskAgain); box.add(chkNoAskAgain); int ret = JOptionPane.showConfirmDialog(MainFrame.this, box, strings.getProperty("defaultdatadownload.confirm.title"), JOptionPane.YES_NO_OPTION); if (ret != JOptionPane.YES_OPTION) { return; } if (chkNoAskAgain.isSelected()) { // ダウンロードしないし、今後、この問い合わせは不要 noNeedDataDownload = true; return; } // リダイレクト先の実際のURLを取得する String downloadUrl = grp.getSelection().getActionCommand(); final String actualDownloadUrl; try { AppConfig appConfig = AppConfig.getInstance(); DownloadUtils downloader = new DownloadUtils(); downloader.setImpersonateUserAgent(appConfig.getImpersonateUserAgent()); HeadResponse response = downloader.getHead(downloadUrl); actualDownloadUrl = response.getLocation(); } catch (Exception ex) { // アクセスできなかった場合はエラーを表示してインポートはしない ErrorMessageHelper.showErrorDialog(this, ex); return; } // リダイレクト先URLをインポートダイアログに表示する onImport(new ImportSourceCallback() { @Override public void onInit(ImportWizardDialog dlg) { dlg.initSelectURL(actualDownloadUrl); } }); } /** * パーツが変更されたことを検知した場合.
* パーツデータをリロードし、各カテゴリのパーツ一覧を再表示させ、プレビューを更新する.
*/ protected void onDetectPartsImageChange() { try { reloadPartsAndFavorites(null, true); } catch (IOException ex) { logger.log(Level.SEVERE, "parts reload failed. " + characterData, ex); } } /** * すべてのカテゴリのリストで選択中のアイテムが見えるようにスクロールする. */ protected void scrollToSelectedParts() { partsSelectionManager.scrollToSelectedParts(); } /** * 指定したパーツカテゴリ以外のパーツ選択パネルを最小化する. * * @param partsCategory * パーツカテゴリ、nullの場合は全て最小化する. * @param dblClick * ダブルクリック */ protected void onClickPartsCategoryTitle(PartsCategory partsCategory, boolean dblClick) { if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "onClickPartsCategoryTitle category=" + partsCategory + "/clickCount=" + dblClick); } if (dblClick) { minimizeMode = !minimizeMode; if (!minimizeMode) { partsSelectionManager.setMinimizeModeIfOther(null, false); return; } } if (minimizeMode) { if (partsSelectionManager.isNotMinimizeModeJust(partsCategory)) { partsSelectionManager.setMinimizeModeIfOther(null, true); // 全部縮小 } else { partsSelectionManager.setMinimizeModeIfOther(partsCategory, true); if (partsCategory != null) { // 対象のパネルがスクロールペイン内に見える用にスクロールする. // スクロールバーの位置指定などの座標系の操作は「要求」であり、実際に適用されるまで本当の位置は分らない。 // よって以下の処理は非同期に行い、先に座標を確定させたものに対して行う必要がある。 final ImageSelectPanel panel = imageSelectPanels.findByPartsCategory(partsCategory); SwingUtilities.invokeLater(new Runnable() { public void run() { final Point pt = panel.getLocation(); JViewport viewPort = imgSelectPanelsPanelSp.getViewport(); viewPort.setViewPosition(pt); viewPort.revalidate(); } }); } } } } /** * デフォルトパーツを選択する.
* デフォルトパーツがなければお気に入りの最初のものを選択する.
* それもなければ空として表示する.
* パーツの適用に失敗した場合はfalseを返します.(例外は返されません.)
* * @param force * すでに選択があっても選択しなおす場合はtrue、falseの場合は選択があれば何もしない. * @return パーツ選択された場合。force=trueの場合はエラーがなければ常にtrueとなります。 */ protected boolean showDefaultParts(boolean force) { try { if (!force) { // 現在選択中のパーツを取得する.(なければ空) PartsSet sel = partsSelectionManager.createPartsSet(); if (!sel.isEmpty()) { // 強制選択でない場合、すでに選択済みのパーツがあれば何もしない. return false; } } // デフォルトのパーツセットを取得する String defaultPresetId = characterData.getDefaultPartsSetId(); PartsSet partsSet = null; if (defaultPresetId != null) { partsSet = characterData.getPartsSets().get(defaultPresetId); } // デフォルトのパーツセットがなければ、お気に入りの最初を選択する. if (partsSet == null) { List partssets = getPartsSetList(); if (!partssets.isEmpty()) { partsSet = partssets.get(0); } } // パーツセットがあれば、それを表示要求する. // パーツセットがなければカラーダイアログを初期化するのみ if (partsSet == null) { partsColorCoordinator.initColorDialog(); } else { selectPresetParts(partsSet); } } catch (Exception ex) { logger.log(Level.WARNING, "パーツのデフォルト適用に失敗しました。", ex); return false; } return true; } /** * プリセットを適用しキャラクターイメージを再構築します.
* 実行時エラーは画面のレポートされます.
* * @param presetParts * パーツセット, nullの場合は何もしない. */ protected void selectPresetParts(PartsSet presetParts) { if (presetParts == null) { return; } try { // 最後に使用したプリセットとして記憶する. lastUsePresetParts = presetParts; // プリセットパーツで選択を変える partsSelectionManager.selectPartsSet(presetParts); // カラーパネルを選択されているアイテムをもとに再設定する partsColorCoordinator.initColorDialog(); // 再表示 requestPreview(); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * プリセットとお気に入りを表示順に並べて返す. * * @return プリセットとお気に入りのリスト(表示順) */ protected List getPartsSetList() { ArrayList partssets = new ArrayList(); partssets.addAll(characterData.getPartsSets().values()); Collections.sort(partssets, PartsSet.DEFAULT_COMPARATOR); return partssets; } protected static final class TreeLeaf implements Comparable { public enum TreeLeafType { NODE, LEAF } private String name; private TreeLeafType typ; public TreeLeaf(TreeLeafType typ, String name) { if (name == null) { name = ""; } this.typ = typ; this.name = name; } public String getName() { return name; } public TreeLeafType getTyp() { return typ; } @Override public boolean equals(Object obj) { if (obj != null && obj instanceof TreeLeaf) { TreeLeaf o = (TreeLeaf) obj; return typ == o.typ && name.equals(o.name); } return false; } @Override public int hashCode() { return typ.hashCode() ^ name.hashCode(); } public int compareTo(TreeLeaf o) { int ret = name.compareTo(o.name); if (ret == 0) { ret = (typ.ordinal() - o.typ.ordinal()); } return ret; } @Override public String toString() { return name; } } protected TreeMap buildFavoritesItemTree( List partssets) { if (partssets == null) { partssets = Collections.emptyList(); } TreeMap favTree = new TreeMap(); for (PartsSet partsSet : partssets) { String flatname = partsSet.getLocalizedName(); String[] tokens = flatname.split("\\|"); if (tokens.length == 0) { continue; } TreeMap r = favTree; for (int idx = 0; idx < tokens.length - 1; idx++) { String name = tokens[idx]; TreeLeaf leafName = new TreeLeaf(TreeLeaf.TreeLeafType.NODE, name); @SuppressWarnings("unchecked") TreeMap n = (TreeMap) r .get(leafName); if (n == null) { n = new TreeMap(); r.put(leafName, n); } r = n; } String lastName = tokens[tokens.length - 1]; TreeLeaf lastLeafName = new TreeLeaf(TreeLeaf.TreeLeafType.LEAF, lastName); @SuppressWarnings("unchecked") List leafValue = (List) r.get(lastLeafName); if (leafValue == null) { leafValue = new ArrayList(); r.put(lastLeafName, leafValue); } leafValue.add(partsSet); } return favTree; } protected interface FavoriteMenuItemBuilder { JMenuItem createFavoriteMenuItem(String name, PartsSet partsSet); JMenu createSubMenu(String name); } private void buildFavoritesMenuItems(List menuItems, FavoriteMenuItemBuilder favMenuItemBuilder, TreeMap favTree) { for (Map.Entry entry : favTree.entrySet()) { TreeLeaf treeLeaf = entry.getKey(); String name = treeLeaf.getName(); if (treeLeaf.getTyp() == TreeLeaf.TreeLeafType.LEAF) { // 葉ノードには、JMenuItemを設定する. @SuppressWarnings("unchecked") List leafValue = (List) entry.getValue(); for (final PartsSet partsSet : leafValue) { JMenuItem favoriteMenu = favMenuItemBuilder .createFavoriteMenuItem(name, partsSet); menuItems.add(favoriteMenu); } } else if (treeLeaf.getTyp() == TreeLeaf.TreeLeafType.NODE) { // 枝ノードは、サブメニューを作成し、子ノードを設定する @SuppressWarnings("unchecked") TreeMap childNode = (TreeMap) entry .getValue(); JMenu subMenu = favMenuItemBuilder.createSubMenu(name); menuItems.add(subMenu); ArrayList subMenuItems = new ArrayList(); buildFavoritesMenuItems(subMenuItems, favMenuItemBuilder, childNode); for (JMenuItem subMenuItem : subMenuItems) { subMenu.add(subMenuItem); } } else { throw new RuntimeException("unknown type: " + treeLeaf); } } } /** * お気に入りのJMenuItemを作成するファンクションオブジェクト */ private FavoriteMenuItemBuilder favMenuItemBuilder = new FavoriteMenuItemBuilder() { private MenuBuilder menuBuilder = new MenuBuilder(); /** * お気に入りメニューの作成 */ public JMenuItem createFavoriteMenuItem(final String name, final PartsSet partsSet) { JMenuItem favoriteMenu = menuBuilder.createJMenuItem(); favoriteMenu.setName(partsSet.getPartsSetId()); favoriteMenu.setText(name); if (partsSet.isPresetParts()) { Font font = favoriteMenu.getFont(); favoriteMenu.setFont(font.deriveFont(Font.BOLD)); } favoriteMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { selectPresetParts(partsSet); } }); // メニューアイテム上でマウスホイールを動かした場合は上下にスクロールさせる. // (ただし、OSXのスクリーンメニュー使用時は無視する.) addMouseWheelListener(favoriteMenu); return favoriteMenu; } /** * サブメニューの作成 */ public JMenu createSubMenu(String name) { JMenu menu = menuBuilder.createJMenu(); menu.setText(name); // メニューアイテム上でマウスホイールを動かした場合は上下にスクロールさせる. // (ただし、OSXのスクリーンメニュー使用時は無視する.) addMouseWheelListener(menu); return menu; } /** * メニューアイテム上でホイールを上下させたときにメニューをスクロールさせるためのホイールハンドラを設定する. * * @param favoriteMenu */ protected void addMouseWheelListener(final JMenuItem favoriteMenu) { if (JScrollableMenu.isScreenMenu()) { return; } favoriteMenu.addMouseWheelListener(new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent e) { int rotation = e.getWheelRotation(); JPopupMenu popupMenu = (JPopupMenu) favoriteMenu .getParent(); JMenu parentMenu = (JMenu) popupMenu.getInvoker(); if (parentMenu != null && parentMenu instanceof JScrollableMenu) { final JScrollableMenu favMenu = (JScrollableMenu) parentMenu; favMenu.doScroll(rotation < 0); } e.consume(); } }); } }; /** * お気に入りメニューが開いたとき * * @param menu */ protected void onSelectedFavoriteMenu(JMenu menu) { // 表示順にソート List partssets = getPartsSetList(); TreeMap favTree = buildFavoritesItemTree(partssets); // メニューの再構築 ArrayList favoritesMenuItems = new ArrayList(); buildFavoritesMenuItems(favoritesMenuItems, favMenuItemBuilder, favTree); replaceMenuItems(menu, favoritesMenuItems); } /** * スクロール可能JMenu/通常JMenuのメニューアイテムの差し替え * @param menu * @param items */ private void replaceMenuItems(JMenu menu, List items) { if (menu instanceof JScrollableMenu) { // スクロールメニューの場合 JScrollableMenu favMenu = (JScrollableMenu) menu; // スクロールメニューの初期化 favMenu.initScroller(); // スクロールメニューアイテムの設定 favMenu.setScrollableItems(items); // 高さを補正する // お気に入りメニューが選択された場合、 // お気に入りアイテム一覧を表示するよりも前に // 表示可能なアイテム数を現在のウィンドウの高さから算定する. Toolkit tk = Toolkit.getDefaultToolkit(); Dimension scrsiz = tk.getScreenSize(); int height = scrsiz.height; // MainFrame.this.getHeight(); favMenu.adjustMaxVisible(height); logger.log(Level.FINE, "scrollableMenu maxVisible=" + favMenu.getMaxVisible()); } else { // 通常メニューの場合 // 既存メニューの位置をセパレータより判断する. int mx = menu.getMenuComponentCount(); int separatorIdx = -1; for (int idx = 0; idx < mx; idx++) { Component item = menu.getMenuComponent(idx); if (item instanceof JSeparator) { separatorIdx = idx; break; } } // 既存メニューの削除 if (separatorIdx > 0) { while (menu.getMenuComponentCount() > separatorIdx + 1) { menu.remove(separatorIdx + 1); } } // メニューを登録する. for (JMenuItem menuItem : items) { menu.add(menuItem); } } } /** * カスタムレイヤーメニューを開いたとき * @param menu */ protected void onSelectedCustomLayerMenu(JMenu menu) { // メニューの再構築 ArrayList menuItems = new ArrayList(); for (Map.Entry> entry : customLayerPatternMgr.getOrderedEntries()) { final CustomLayerOrderKey patternKey = entry.getKey(); final String displayName = patternKey.getDisplayName(); final JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(displayName); menuItem.setSelected(customLayerPatternMgr.isSelected(patternKey)); menuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { customLayerPatternMgr.setSelected(patternKey, menuItem.isSelected()); requestPreview(); } }); menuItems.add(menuItem); } replaceMenuItems(menu, menuItems); } /** * ヘルプメニューを開いたときにお勧めメニューを構築する. * * @param menu */ protected void onSelectedRecommendationMenu(JMenu mnuRecomendation) { // 現在のお勧めメニューを一旦削除 while (mnuRecomendation.getMenuComponentCount() > 0) { mnuRecomendation.remove(0); } // お勧めリンクメニューを作成する. List recommendations = characterData.getRecommendationURLList(); if (recommendations != null) { MenuBuilder menuBuilder = new MenuBuilder(); for (RecommendationURL recommendation : recommendations) { String displayName = recommendation.getDisplayName(); String url = recommendation.getUrl(); if (displayName.startsWith("*") && url.endsWith(".zip")) { // デフォルトのデータダウンロードURLはメニューには表示しない continue; } JMenuItem mnuItem = menuBuilder.createJMenuItem(); mnuItem.setText(displayName); mnuItem.addActionListener( DesktopUtilities.createBrowseAction(MainFrame.this, url, displayName) ); mnuRecomendation.add(mnuItem); } } // お勧めリンクメニューのリストがnullでなく空でもない場合は有効、そうでなければ無効にする. mnuRecomendation.setEnabled(recommendations != null && !recommendations.isEmpty()); } /** * 最後に選択されたお気に入りと同じ構成であれば、 このお気に入りの名前をプレビューペインのタイトルに設定する.
* そうでなければデフォルトのパーツセット名(no titleとか)を表示する.
* 色情報が異なる場合に末尾に「*」マークがつけられる.
* * @param requestPartsSet * 表示するパーツセット(名前は設定されていなくて良い。お気に入り側を使うので。), nullの場合はデフォルトのパーツ名 */ protected void showPresetName(PartsSet requestPartsSet) { String title = getSuggestPartsSetName(requestPartsSet, true); if (title == null) { title = defaultPartsSetTitle; } previewPane.setTitle(title); } /** * パーツセット名を推定する.
* 最後に選択されたお気に入りと同じ構成であれば、 このお気に入りの名前を返す.
* お気に入りが選択されていないか構成が異なる場合、お気に入りに名前がない場合はnullを返す.
* * @param requestPartsSet * 表示するパーツセット(名前は設定されていなくて良い。お気に入り側を使うので。) * @param markColorOrCustomLayerChange * 色情報またはカスタムレイヤーが異なる場合に末尾に「*」マークをつける場合はtrue */ private String getSuggestPartsSetName(PartsSet requestPartsSet, boolean markColorOrCustomLayerChange) { String partsSetTitle = null; if (lastUsePresetParts != null && PartsSet.isSameStructure(requestPartsSet, lastUsePresetParts)) { partsSetTitle = lastUsePresetParts.getLocalizedName(); if (markColorOrCustomLayerChange && (!PartsSet.isSameColor(requestPartsSet, lastUsePresetParts) || !PartsSet.isSameCustomLayers(requestPartsSet, lastUsePresetParts))) { if (partsSetTitle != null) { partsSetTitle += "*"; } } } if (partsSetTitle != null && partsSetTitle.trim().length() > 0) { return partsSetTitle; } return null; } /** * プレビューの更新を要求する. 更新は非同期に行われる. */ protected void requestPreview() { if (!characterData.isValid()) { return; } // 選択されているパーツの各イメージを取得しレイヤー順に並び替えて合成する. // 合成は別スレッドにて非同期に行われる. // リクエストは随時受け付けて、最新のリクエストだけが処理される. // (処理がはじまる前に新しいリクエストで上書きされた場合、前のリクエストは単に捨てられる.) imageBuilder.requestJob(new ImageBuildJobAbstractAdaptor(characterData) { /** * 構築するパーツセット情報 */ private PartsSet requestPartsSet; /** * 適用されているカスタムレイヤー順序 */ private LayerOrderMapper layerOrderMapper; /** * 非同期のイメージ構築要求の番号.
*/ private long ticket; @Override public void onQueueing(long ticket) { this.ticket = ticket; previewPane.setLoadingRequest(ticket); } @Override public void buildImage(ImageOutput output) { // 合成結果のイメージを引数としてイメージビルダから呼び出される. final BufferedImage img = output.getImageOutput(); Runnable refreshJob = new Runnable() { public void run() { previewPane.setPreviewImage(img); previewPane.setLoadingComplete(ticket); showPresetName(requestPartsSet); // 表示対象のパーツセットの情報で更新する (情報ダイアログが開いていれば) if (informationDialog != null) { informationDialog.showPartsInformation(requestPartsSet, layerOrderMapper); } } }; if (SwingUtilities.isEventDispatchThread()) { refreshJob.run(); } else { try { SwingUtilities.invokeAndWait(refreshJob); } catch (Exception ex) { logger.log(Level.WARNING, "build image failed.", ex); } } } @Override public void handleException(final Throwable ex) { // 合成中に例外が発生した場合、イメージビルダから呼び出される. Runnable showExceptionJob = new Runnable() { public void run() { ErrorMessageHelper.showErrorDialog(MainFrame.this, ex); } }; if (SwingUtilities.isEventDispatchThread()) { showExceptionJob.run(); } else { SwingUtilities.invokeLater(showExceptionJob); } } @Override protected PartsSet getPartsSet() { // 合成できる状態になった時点でイメージビルダから呼び出される. Runnable collectPartsSetJob = new Runnable() { public void run() { requestPartsSet = partsSelectionManager.createPartsSet(); // getPartsSetで得られるパーツセットで保持しているカスタムレイヤーパターン名ではなく、 // 現在画面に適用している作業中のカスタムレイヤーのマッパーを取得する。 // ※ カスタムレイヤー編集ダイアログの動的なレイヤー変更によるプレビューに対応するため layerOrderMapper = customLayerPatternMgr.getLayerOrderMapper(); } }; if (SwingUtilities.isEventDispatchThread()) { collectPartsSetJob.run(); } else { try { // スレッドによるSwingのイベントディスパッチスレッド以外からの呼び出しの場合、 // Swingディスパッチスレッドでパーツの選択状態を取得する. SwingUtilities.invokeAndWait(collectPartsSetJob); } catch (InvocationTargetException e) { throw new RuntimeException(e.getMessage(), e); } catch (InterruptedException e) { throw new RuntimeException("interrupted:" + e, e); } } if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "preview: " + requestPartsSet); } return requestPartsSet; } @Override protected LayerOrderMapper getLayerOrderMapper() { return layerOrderMapper; } }); } /** * プロファイルを開く */ protected void onOpenProfile() { try { MainFrame main2 = ProfileListManager.openProfile(this); if (main2 != null) { main2.showMainFrame(); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * 背景色を変更する. */ protected void onChangeBgColor() { getJMenuBar().setEnabled(false); try { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); Color color = wallpaperInfo.getBackgroundColor(); color = JColorChooser.showDialog(this, strings.getProperty("chooseBgColor"), color); if (color != null) { applyBackgroundColorOnly(color); } } finally { getJMenuBar().setEnabled(true); } } /** * 壁紙を変更する. */ protected void onChangeWallpaper() { try { WallpaperDialog wallpaperDialog = new WallpaperDialog(this); // 最後に使用した壁紙情報でダイアログを設定する. wallpaperDialog.setWallpaperInfo(this.wallpaperInfo); // 壁紙情報を設定するモーダルダイアログを開く WallpaperInfo wallpaperInfo = wallpaperDialog.showDialog(); if (wallpaperInfo == null) { return; } // 壁紙情報を保存し、その情報をもとに背景を再描画する. applyWallpaperInfo(wallpaperInfo, false); } catch (WallpaperFactoryException ex) { ErrorMessageHelper.showErrorDialog(this, ex); } catch (RuntimeException ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * 背景色のみ変更し、背景を再描画する.
* 壁紙情報全体の更新よりも効率化するためのメソッドである.
* * @param bgColor * 背景色 */ protected void applyBackgroundColorOnly(Color bgColor) { wallpaperInfo.setBackgroundColor(bgColor); previewPane.getWallpaper() .setBackgroundColor(wallpaperInfo.getBackgroundColor()); } /** * 壁紙情報を保存し、その情報をもとに背景を再描画する.
* ignoreErrorがtrueである場合、適用に失敗した場合はログに記録するのみで、 壁紙情報は保存されず、壁紙も更新されない.
* * @param wallpaperInfo * 壁紙情報、null不可 * @param ignoreError * 失敗を無視する場合 * @throws IOException * 失敗 */ protected void applyWallpaperInfo(WallpaperInfo wallpaperInfo, boolean ignoreError) throws WallpaperFactoryException { if (wallpaperInfo == null) { throw new IllegalArgumentException(); } // 壁紙情報から壁紙インスタンスを生成する. WallpaperFactory wallpaperFactory = WallpaperFactory.getInstance(); Wallpaper wallpaper = null; try { // 壁紙情報の構築時に問題が発生した場合、 // 回復処理をして継続するかエラーとするか? WallpaperFactoryErrorRecoverHandler handler = null; if (ignoreError) { handler = new WallpaperFactoryErrorRecoverHandler(); } // 壁紙情報 wallpaper = wallpaperFactory.createWallpaper(wallpaperInfo, handler); } catch (WallpaperFactoryException ex) { logger.log(Level.WARNING, "壁紙情報の適用に失敗しました。", ex); if ( !ignoreError) { throw ex; } } catch (RuntimeException ex) { logger.log(Level.WARNING, "壁紙情報の適用に失敗しました。", ex); if ( !ignoreError) { throw ex; } } if (wallpaper == null) { return; } // 壁紙を更新する. previewPane.setWallpaper(wallpaper); // 壁紙情報として記憶する. this.wallpaperInfo = wallpaperInfo; } /** * プレビューしている画像をファイルに保存する。 サポートしているのはPNG/JPEGのみ。 */ protected void onSavePicture() { Toolkit tk = Toolkit.getDefaultToolkit(); BufferedImage img = previewPane.getPreviewImage(); Color imgBgColor = wallpaperInfo.getBackgroundColor(); if (img == null) { tk.beep(); return; } try { // 出力オプションの調整 OutputOption outputOption = imageSaveHelper.getOutputOption(); outputOption.setZoomFactor(previewPane.getZoomFactor()); outputOption.changeRecommend(); imageSaveHelper.setOutputOption(outputOption); // ファイルダイアログ表示 final File outFile = imageSaveHelper.showSaveFileDialog(this); if (outFile == null) { return; } logger.log(Level.FINE, "savePicture: " + outFile); logger.log(Level.FINE, "outputOption: " + outputOption); // 画像のファイルへの出力 StringBuilder warnings = new StringBuilder(); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { String ext = imageSaveHelper.getFileExtension(outFile); if ("zip".equals(ext)) { saveLayers(outFile, new SaveLayerCallback() { @Override public void collect(List layerImages, BufferedImage compositeImg) throws IOException { imageSaveHelper.saveToZip(outFile, layerImages, compositeImg); } }); } else if ("psd".equals(ext)) { saveLayers(outFile, new SaveLayerCallback() { @Override public void collect(List layerImages, BufferedImage compositeImg) throws IOException { imageSaveHelper.saveToPSD(outFile, layerImages, compositeImg); } }); } else { imageSaveHelper.savePicture(img, imgBgColor, outFile, warnings); } } finally { setCursor(Cursor.getDefaultCursor()); } if (warnings.length() > 0) { JOptionPane.showMessageDialog(this, warnings.toString(), "WARNINGS", JOptionPane.WARNING_MESSAGE); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } private interface SaveLayerCallback { void collect(List layerImages, BufferedImage compositeImg) throws IOException; } private void saveLayers(final File outFile, SaveLayerCallback callback) throws IOException { final PartsImageCollectionParser partsImageCollectorParser = new PartsImageCollectionParser(characterData); final List layerImages = new ArrayList(); final BufferedImage[] result = new BufferedImage[1]; ImageBuilder syncImgBuilder = this.imageBuilder.getImageBuilder(); // 同期型のイメージビルダを取得する syncImgBuilder.requestJob(new ImageBuilder.ImageBuildJob2() { @Override public void loadParts(final ImageSourceCollector collector) throws IOException { PartsSet partsSet = partsSelectionManager.createPartsSet(); partsSet.getActiveCustomLayerPatternIds(); LayerOrderMapper layerOrderMapper = customLayerPatternMgr.getLayerOrderMapper(); collector.setSize(partsImageCollectorParser.getPartsSpecResolver().getImageSize()); collector.setImageBgColor(partsSet.getBgColor()); collector.setAffineTramsform(partsSet.getAffineTransformParameter()); partsImageCollectorParser.parse(partsSet, layerOrderMapper, new PartsImageCollectionParser.PartsImageCollectionHandler() { public void detectImageSource(PartsIdentifier partsIdentifier, Layer layer, float layerOrder, ImageResource imageResource, ColorConvertParameter param) { if (param == null) { param = new ColorConvertParameter(); } String partsName = partsIdentifier.getPartsName(); collector.setImageSource(partsName, layer, layerOrder, imageResource, param); } }); collector.setComplite(); } @Override public void handleException(Throwable ex) { ErrorMessageHelper.showErrorDialog(MainFrame.this, ex); } @Override public void buildImage(ImageOutput output) { result[0] = output.getImageOutput(); } @Override public void onCreateLayerImage(String partsName, Layer layer, BufferedImage img) { layerImages.add(new ImageSaveHelper.LayerImage(partsName,layer, img)); } }); // 集まった各レイヤーの画像と、合成された画像を呼び出し元にコールバックする callback.collect(layerImages, result[0]); } /** * 伺か用PNG/PNAの出力. */ protected void onSaveAsUkagaka() { BufferedImage img = previewPane.getPreviewImage(); Color bgColor = wallpaperInfo.getBackgroundColor(); if (img == null) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } try { ukagakaImageSaveHelper.save(this, img, bgColor); } catch (IOException ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * 伺か用PNG/PNAの変換 */ protected void onConvertUkagaka() { try { Color colorKey = wallpaperInfo.getBackgroundColor(); ukagakaImageSaveHelper.convertChooseFiles(this, colorKey); } catch (IOException ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * プロファイルの場所を開く */ protected void onBrowseProfileDir() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } try { DesktopUtilities.browseBaseDir(characterData.getDocBase()); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * このプロファイルを編集する. */ protected void onEditProfile() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } try { CharacterData cd = this.characterData; CharacterData newCd = ProfileListManager.editProfile(this, cd); if (newCd != null) { CharacterDataChangeObserver.getDefault() .notifyCharacterDataChange(this, newCd, true, true); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * パーツの管理ダイアログを開く.
*/ protected void onManageParts() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } PartsManageDialog mrgDlg = new PartsManageDialog(this, characterData); mrgDlg.setVisible(true); if (mrgDlg.isUpdated()) { // パーツ管理情報が更新された場合、 // パーツデータをリロードする. if (characterData.reloadPartsData()) { partsSelectionManager.loadParts(); requestPreview(); } } } /** * 「パーツ検索」ダイアログを開く.
* すでに開いているダイアログがあれば、それにフォーカスを当てる.
*/ protected void openSearchDialog() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } if (lastUseSearchPartsDialog != null) { // 開いているダイアログがあれば、それにフォーカスを当てる. if (lastUseSearchPartsDialog.isDisplayable() && lastUseSearchPartsDialog.isVisible()) { lastUseSearchPartsDialog.requestFocus(); return; } } SearchPartsDialog searchPartsDlg = new SearchPartsDialog(this, characterData, partsSelectionManager); WindowAdjustLocationSupport.alignRight(this, searchPartsDlg, 0, true); searchPartsDlg.setVisible(true); lastUseSearchPartsDialog = searchPartsDlg; } /** * 「パーツ検索」ダイアログを閉じる.
*/ protected void closeSearchDialog() { lastUseSearchPartsDialog = null; for (SearchPartsDialog dlg : SearchPartsDialog.getDialogs()) { if (dlg != null && dlg.isDisplayable() && dlg.getParent() == this) { dlg.dispose(); } } } /** * 「お気に入りの管理」ダイアログを閉じる */ protected void closeManageFavoritesDialog() { if (lastUseManageFavoritesDialog != null) { if (lastUseManageFavoritesDialog.isDisplayable()) { lastUseManageFavoritesDialog.dispose(); } lastUseManageFavoritesDialog = null; } } /** * 「パーツのランダム選択ダイアログ」を閉じる */ protected void closePartsRandomChooserDialog() { if (lastUsePartsRandomChooserDialog != null) { if (lastUsePartsRandomChooserDialog.isDisplayable()) { lastUsePartsRandomChooserDialog.dispose(); } lastUsePartsRandomChooserDialog = null; } } /** * 情報ダイアログを閉じる */ protected void closeInformationDialog() { if (informationDialog != null) { informationDialog.dispose(); informationDialog = null; } } /** * クリップボードにコピー * * @param screenImage * スクリーンイメージ */ protected void onCopy(boolean screenImage) { try { BufferedImage img = previewPane.getPreviewImage(); if (img == null) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } if (screenImage) { // 表示している内容をそのままコピーする. img = previewPane.getScreenImage(); } Color imgBgColor = wallpaperInfo.getBackgroundColor(); ClipboardUtil.setImage(img, imgBgColor); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * アプリケーションの設定ダイアログを開く */ public void onPreferences() { AppConfigDialog appConfigDlg = new AppConfigDialog(this); appConfigDlg.setVisible(true); } /** * 新規モードでインポートウィザードを実行する.
*/ protected void onImportNew() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } try { // インポートウィザードの実行(新規モード) ImportWizardDialog importWizDialog = new ImportWizardDialog(this, null); importWizDialog.setVisible(true); int exitCode = importWizDialog.getExitCode(); if (exitCode == ImportWizardDialog.EXIT_PROFILE_CREATED) { CharacterData cd = importWizDialog.getImportedCharacterData(); if (cd != null && cd.isValid()) { // インポートしたキャラクターデータのプロファイルを開く. setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { MainFrame mainFrame = ProfileListManager.openProfile(cd); mainFrame.setVisible(true); } finally { setCursor(Cursor.getDefaultCursor()); } } } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } private interface ImportSourceCallback { void onInit(ImportWizardDialog dlg); } /** * 現在のプロファイルに対するインポートウィザードを実行する.
* インポートが実行された場合は、パーツをリロードする.
* インポートウィザード表示中は監視スレッドは停止される.
* * @param initCallback * アーカイブファィルまたはディレクトリを初期設定するコールバック */ protected void onImport(ImportSourceCallback initCallback) { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } try { watchAgent.suspend(); try { // インポートウィザードの実行 ImportWizardDialog importWizDialog = new ImportWizardDialog(this, characterData); if (initCallback != null) { initCallback.onInit(importWizDialog); } importWizDialog.setVisible(true); if (importWizDialog.getExitCode() == ImportWizardDialog.EXIT_PROFILE_UPDATED) { CharacterData importedCd = importWizDialog.getImportedCharacterData(); CharacterDataChangeObserver.getDefault() .notifyCharacterDataChange(this, importedCd, false, true); } } finally { watchAgent.resume(); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * パーツとお気に入りをリロードする.
* まだロードされていない場合はあらたにロードする.
* 引数newCdが指定されている場合は、現在のキャラクター定義の説明文を更新する.
* (説明文の更新以外には使用されない.)
* * @param newCd * 説明文更新のための更新されたキャラクターデータを指定する。null可 * @param forceRepaint * 必ず再描画する場合 * @throws IOException * 失敗 */ protected synchronized void reloadPartsAndFavorites(CharacterData newCd, boolean forceRepaint) throws IOException { if (newCd != null) { // (インポート画面では説明文のみ更新するので、それだけ取得) characterData.setDescription(newCd.getDescription()); } if ( !characterData.isPartsLoaded()) { // キャラクターデータが、まだ読み込まれていなければ読み込む. ProfileListManager.loadCharacterData(characterData); ProfileListManager.loadFavorites(characterData); partsSelectionManager.loadParts(); } else { // パーツデータをリロードする. if (characterData.reloadPartsData()) { partsSelectionManager.loadParts(); } // お気に入りをリロードする. CharacterDataPersistent persiste = CharacterDataPersistent.getInstance(); persiste.loadFavorites(characterData); // お気に入りが更新されたことを通知する. FavoritesChangeObserver.getDefault().notifyFavoritesChange( MainFrame.this, characterData); } // 現在選択されているパーツセットがない場合はデフォルトのパーツセットを選択する. if (showDefaultParts(false) || forceRepaint) { requestPreview(); } } protected void onExport() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } ExportWizardDialog exportWizDlg = new ExportWizardDialog(this, characterData, previewPane.getPreviewImage()); exportWizDlg.setVisible(true); } protected void onResetColor() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); if (JOptionPane.showConfirmDialog(this, strings.get("confirm.resetcolors"), strings.getProperty("confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.YES_OPTION) { return; } characterData.getPartsColorManager().resetPartsColorInfo(); partsColorCoordinator.initColorDialog(); requestPreview(); } /** * プロファイルを閉じる. */ protected void onCloseProfile() { saveWorkingSet(); ProfileListManager.unregisterUsedCharacterData(characterData); if (characterData.isValid()) { // 最後に使用したキャラクターデータとして記憶する. try { RecentDataPersistent recentPersist = RecentDataPersistent.getInstance(); recentPersist.saveRecent(characterData); } catch (Exception ex) { logger.log(Level.WARNING, "recent data saving failed.", ex); // recent情報の記録に失敗しても致命的ではないので、これは無視する. } } // イメージビルダスレッド・ディレクトリ監視スレッドを停止する. stopAgents(); // フレームウィンドウを破棄する. dispose(); // 破棄されたことをロギングする. logger.log(Level.FINE, "dispose mainframe."); } /** * 開いている、すべてのプロファイルを閉じる.
* (Mac OS Xのcmd+Qで閉じる場合などで使用される.)
*/ public static void closeAllProfiles() { // ウィンドウが閉じられることでアクティブなフレームが切り替わる場合を想定し、 // 現在のアクティブなウィンドウをあらかじめ記憶しておく MainFrame mainFrame = activedMainFrame; // gcをかけてファイナライズを促進させる SystemUtil.gc(); // ファイナライズされていないFrameのうち、ネイティブリソースと関連づけられている // フレームについて、それがMainFrameのインスタンスであれば閉じる. // ただし、現在アクティブなものは除く for (Frame frame : JFrame.getFrames()) { try { if (frame.isDisplayable()) { // ネイティブリソースと関連づけられているフレーム if (frame instanceof MainFrame && frame != mainFrame) { // MainFrameのインスタンスであるので閉じる処理が可能. // (現在アクティブなメインフレームは最後に閉じるため、ここでは閉じない.) ((MainFrame) frame).onCloseProfile(); } } } catch (Throwable ex) { logger.log(Level.SEVERE, "mainframe closing failed.", ex); // フレームを閉じるときに失敗した場合、通常、致命的問題だが // クローズ処理は継続しなければならない. } } // 現在アクティブなフレームを閉じる. // 最後に閉じることで「最後に使ったプロファイル」として記憶させる. if (activedMainFrame != null && activedMainFrame.isDisplayable()) { try { activedMainFrame.onCloseProfile(); } catch (Throwable ex) { logger.log(Level.SEVERE, "mainframe closing failed.", ex); // フレームを閉じるときに失敗した場合、通常、致命的問題だが // クローズ処理は継続しなければならない. } } } /** * 画面の作業状態を保存する. */ protected void saveWorkingSet() { if (!characterData.isValid()) { return; } try { // ワーキングセットの作成 WorkingSet workingSet = new WorkingSet(); workingSet.setCharacterDocBase(characterData.getDocBase()); workingSet.setCharacterDataRev(characterData.getRev()); PartsSet partsSet = partsSelectionManager.createPartsSet(); workingSet.setCurrentPartsSet(partsSet); workingSet.setPartsColorInfoMap(characterData .getPartsColorManager().getPartsColorInfoMap()); workingSet.setLastUsedSaveDir(imageSaveHelper.getLastUsedSaveDir()); workingSet.setLastUsedExportDir(ExportWizardDialog.getLastUsedDir()); workingSet.setLastUsePresetParts(lastUsePresetParts); workingSet .setCharacterData(characterData.duplicateBasicInfo(false)); // パーツセットは保存しない. workingSet.setWallpaperInfo(wallpaperInfo); workingSet.setZoomFactor(previewPane.getZoomFactor()); workingSet.setViewPosition(previewPane.getViewPosition()); Dimension windowSize = getSize(); Point windowPos = getLocation(); Rectangle windowRect = new Rectangle(windowPos, windowSize); workingSet.setWindowRect(windowRect); workingSet.setNoNeedDataDownload(noNeedDataDownload); // XML形式でのワーキングセットの保存 WorkingSetPersist workingSetPersist = WorkingSetPersist .getInstance(); workingSetPersist.saveWorkingSet(workingSet); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * 保存されているカスタムレイヤーパターンをロードする */ protected void loadCustomLayerOrder() { try { CustomLayerOrderPersist persist = CustomLayerOrderPersist.newInstance(characterData); Map> map = persist.load(); if (map != null) { customLayerPatternMgr.setMap(map); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * 画面の作業状態を復元する. * * @return ワーキングセットを読み込んだ場合はtrue、そうでなければfalse */ protected boolean loadWorkingSet() { if (!characterData.isValid()) { return false; } try { WorkingSetPersist workingSetPersist = WorkingSetPersist.getInstance(); WorkingSet workingSet = workingSetPersist .loadWorkingSet(characterData); if (workingSet == null) { // ワーキングセットがない場合. // もしくは現在のキャラクターデータと互換性がない場合 return false; } // ウインドウのサイズ、位置の復元 AppConfig appConfig = AppConfig.getInstance(); Rectangle windowRect = workingSet.getWindowRect(); if (appConfig.isEnableRestoreWindow() && windowRect != null) { // 位置の復元 GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment(); Rectangle desktopSize = genv.getMaximumWindowBounds(); // メインスクリーンのサイズ(デスクトップ領域のみ) Point windowPos = windowRect.getLocation(); if (desktopSize.contains(windowPos)) { setLocation(windowPos); } // サイズの復元 Dimension dim = windowRect.getSize(); if (dim.width < 100) { dim.width = 100; } if (dim.height < 100) { dim.height = 100; } setSize(dim); } else { // デフォルトのウィンドウ位置とサイズ setDefaultWindowLocation(); } // パーツの色情報を復元する. Map partsColorInfoMap = characterData .getPartsColorManager().getPartsColorInfoMap(); partsColorInfoMap.putAll(workingSet.getPartsColorInfoMap()); // 選択されているパーツの復元 PartsSet partsSet = workingSet.getCurrentPartsSet(); if (partsSet != null) { selectPresetParts(partsSet); // 最後に選択されたパーツセット名と選択されているパーツセットが同一であれば名前を表示する PartsSet lastUsePresetParts = workingSet.getLastUsePresetParts(); if (lastUsePresetParts != null) { if (lastUsePresetParts.isSameStructure(partsSet)) { this.lastUsePresetParts = lastUsePresetParts; showPresetName(lastUsePresetParts); } } } // 最後に保存したディレクトリを復元する. imageSaveHelper.setLastUseSaveDir(workingSet.getLastUsedSaveDir()); ExportWizardDialog.setLastUsedDir(workingSet .getLastUsedExportDir()); // 壁紙情報を取得する. WallpaperInfo wallpaperInfo = workingSet.getWallpaperInfo(); if (wallpaperInfo != null) { // 壁紙情報を保存し、その情報をもとに背景を再描画する. // (適用に失敗した場合はエラーは無視し、壁紙情報は保存しない.) applyWallpaperInfo(wallpaperInfo, true); } // ズーム状態を復元する Double zoomFactor = workingSet.getZoomFactor(); if (appConfig.isEnableRestoreWindow() && zoomFactor != null) { previewPane.setZoomFactor(zoomFactor); final Point viewPosition = workingSet.getViewPosition(); if (viewPosition != null) { previewPane.setViewPosition(viewPosition); } } // ダウンロード不要フラグ noNeedDataDownload = workingSet.isNoNeedDataDownload(); return true; } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } return false; } public void onAbout() { try { AboutBox aboutBox = new AboutBox(this); aboutBox.showAboutBox(); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } protected void onHelp() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); String helpURL = strings.getProperty("help.url"); String helpDescription = strings.getProperty("help.show"); DesktopUtilities.browse(this, helpURL, helpDescription); } protected void onFlipHolizontal() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } double[] affineTransformParameter = partsSelectionManager.getAffineTransformParameter(); if (affineTransformParameter == null) { // 左右フリップするアフィン変換パラメータを構築する. Dimension siz = characterData.getImageSize(); if (siz != null) { affineTransformParameter = new double[] {-1., 0, 0, 1., siz.width, 0}; } } else { // アフィン変換パラメータをクリアする. affineTransformParameter = null; } partsSelectionManager.setAffineTransformParameter(affineTransformParameter); requestPreview(); } protected void onSetDefaultPicture() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } try { BufferedImage samplePicture = previewPane.getPreviewImage(); if (samplePicture != null) { CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); persist.saveSamplePicture(characterData, samplePicture); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } private InformationDialog informationDialog; protected void onInformation() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } PartsSet partsSet = partsSelectionManager.createPartsSet(); LayerOrderMapper layerOrderMapper = customLayerPatternMgr.getLayerOrderMapper(); if (informationDialog == null) { informationDialog = new InformationDialog(this, characterData, new Runnable() { @Override public void run() { closeInformationDialog(); } }); } informationDialog.showPartsInformation(partsSet, layerOrderMapper); informationDialog.setVisible(true); } protected void onManageCustomLayer() { List categories = characterData.getPartsCategories(); // レイヤー編集ダイアログの構築 final LayerOrderCustomizeDialog layerOrderCustomDlg = new LayerOrderCustomizeDialog(this, categories); layerOrderCustomDlg.setModalityType(ModalityType.APPLICATION_MODAL); layerOrderCustomDlg.addLayerOrderCustomizeListener(new LayerOrderCustomizeListener() { @Override public void onChange(charactermanaj.ui.LayerOrderCustomizeDialog.LayerOrderCustomizeListener.Change e) { // レイヤーパターンの編集がされた場合、プレビューする customLayerPatternMgr.initCustomLayerOrderMap(layerOrderCustomDlg.getEdittingCustomLayerOrderList()); requestPreview(); } }); // 現在保持しているレイヤーパターンの一覧を取得する final LayerOrderCustomizeDialogModel layerOrderCustomDialogModel = new LayerOrderCustomizeDialogModel(); // レイヤーパターン名を表示順に並べてからモデルに登録する。 for (Map.Entry> entry : customLayerPatternMgr.getOrderedEntries()) { CustomLayerOrderKey orderKey = entry.getKey(); List customLayerOrderList = entry.getValue(); layerOrderCustomDialogModel.put(orderKey, customLayerOrderList); } // 現在選択しているアクティブなレイヤーパターンを取得する List currentList = customLayerPatternMgr.getActiveCustomLayerOrderList(); layerOrderCustomDialogModel.setCurrentList(currentList); layerOrderCustomDlg.setModel(layerOrderCustomDialogModel); // パターンの保存時 layerOrderCustomDialogModel.addListChangeListener(new LayerOrderCustomizeDialogModel.ChangeListener() { @Override public void onChange(Change change) { try { // 編集されたレイヤーパターンの一覧を保存する。 Map> customLayerPatternMap = new HashMap>(); for (CustomLayerOrderKey patternKey : layerOrderCustomDialogModel.getPatternNames()) { List customLayerOrderList = layerOrderCustomDialogModel.getCopy(patternKey); if (customLayerOrderList != null) { customLayerPatternMap.put(patternKey, customLayerOrderList); } } // この画面のカスタムレイヤー管理を更新する customLayerPatternMgr.setMap(customLayerPatternMap); // 設定したレイヤーパターンをファイルに永続化する CustomLayerOrderPersist persist = CustomLayerOrderPersist.newInstance(characterData); persist.save(customLayerPatternMap); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(MainFrame.this, ex); } } }); // モーダルでダイアログを表示する layerOrderCustomDlg.setLocationByPlatform(true); layerOrderCustomDlg.setVisible(true); // 最後に選択または保存したパターン名をデフォルトで選択状態とする CustomLayerOrderKey lastPatternName = layerOrderCustomDlg.getLastPatternName(); if (lastPatternName != null) { customLayerPatternMgr.setSelected(lastPatternName, true); } // プレビューのために設定していたレイヤー順序を本来のアクティブカスタムレイヤーのものに戻す customLayerPatternMgr.initActiveCustomLayerOrderMap(); requestPreview(); } protected void onManageFavorites() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } if (lastUseManageFavoritesDialog != null) { // 開いているダイアログがあれば、それにフォーカスを当てる. if (lastUseManageFavoritesDialog.isDisplayable() && lastUseManageFavoritesDialog.isVisible()) { lastUseManageFavoritesDialog.requestFocus(); return; } } // お気に入り編集ダイアログを開く ManageFavoriteDialog dlg = new ManageFavoriteDialog(this, characterData); dlg.setFavoriteManageCallback(new FavoriteManageCallback() { public void selectFavorites(PartsSet partsSet) { // お気に入り編集ダイアログで選択されたパーツを選択表示する. selectPresetParts(partsSet); } public void updateFavorites(CharacterData characterData, boolean savePreset) { // お気に入りを登録する. try { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { CharacterDataPersistent persiste = CharacterDataPersistent .getInstance(); if (savePreset) { persiste.updateProfile(characterData); } persiste.saveFavorites(characterData); // お気に入りが更新されたことを通知する. FavoritesChangeObserver.getDefault() .notifyFavoritesChange(MainFrame.this, characterData); } finally { setCursor(Cursor.getDefaultCursor()); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(MainFrame.this, ex); } } }); WindowAdjustLocationSupport.alignRight(this, dlg, 0, true); dlg.setVisible(true); lastUseManageFavoritesDialog = dlg; } protected void onRegisterFavorite() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } try { // パーツセットを生成 PartsSet partsSet = partsSelectionManager.createPartsSet(); if (partsSet.isEmpty()) { // 空のパーツセットは登録しない. return; } Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); // お気に入りに登録するパーツセットが最後に使用したお気に入りと同じ構成であれば、 // そのお気に入り名を使用する. String initName = getSuggestPartsSetName(partsSet, false); // カラー情報の有無のチェックボックス. JCheckBox chkColorInfo = new JCheckBox(strings.getProperty("input.favoritesColorInfo")); chkColorInfo.setSelected(true); String partsSetId = null; if (initName != null && lastUsePresetParts != null) { partsSetId = lastUsePresetParts.getPartsSetId(); } // 上書き保存の可否のチェックボックス JCheckBox chkOverwrite = new JCheckBox(strings.getProperty("input.favoritesOverwrite")); chkOverwrite.setSelected(partsSetId != null && partsSetId.length() > 0); chkOverwrite.setEnabled(partsSetId != null && partsSetId.length() > 0); // チェックボックスパネル Box checkboxsPanel = new Box(BoxLayout.PAGE_AXIS); checkboxsPanel.add(chkColorInfo); checkboxsPanel.add(chkOverwrite); // 入力ダイアログを開く String name = (String) JOptionPane.showInputDialog(this, checkboxsPanel, strings.getProperty("input.favorites"), JOptionPane.QUESTION_MESSAGE, null, null, initName == null ? "" : initName); if (name == null || name.trim().length() == 0) { return; } boolean includeColorInfo = chkColorInfo.isSelected(); if (!includeColorInfo) { // カラー情報を除去する. partsSet.removeColorInfo(); // カスタムレイヤー情報を除去する partsSet.setActiveCustomLayerPatternIds(null); } // 新規の場合、もしくは上書きしない場合はIDを設定する. if (partsSetId == null || !chkOverwrite.isSelected()) { partsSetId = "ps" + UUID.randomUUID().toString(); } partsSet.setPartsSetId(partsSetId); // 名前を設定する. partsSet.setLocalizedName(name); // ファイルに保存 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { CharacterDataPersistent persiste = CharacterDataPersistent.getInstance(); // 現在の最新情報を取り出す. characterData.clearPartsSets(true); persiste.loadFavorites(characterData); // お気に入りコレクションに登録 characterData.addPartsSet(partsSet); persiste.saveFavorites(characterData); // お気に入りが更新されたことを通知する. FavoritesChangeObserver.getDefault().notifyFavoritesChange( MainFrame.this, characterData); } finally { setCursor(Cursor.getDefaultCursor()); } // 最後に選択したお気に入りにする lastUsePresetParts = partsSet; showPresetName(partsSet); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * ランダム選択ダイアログを開く. */ protected void onToolRandom() { if (!characterData.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } if (lastUsePartsRandomChooserDialog != null) { // 開いているダイアログがあれば、それにフォーカスを当てる. if (lastUsePartsRandomChooserDialog.isDisplayable() && lastUsePartsRandomChooserDialog.isVisible()) { lastUsePartsRandomChooserDialog.requestFocus(); return; } } // お気に入り編集ダイアログを開く PartsRandomChooserDialog dlg = new PartsRandomChooserDialog(this, characterData, new PartsRandomChooserDialog.PartsSetSynchronizer() { public PartsSet getCurrentPartsSet() { // 現在のパーツセットを生成 return partsSelectionManager.createPartsSet(); } public void setPartsSet(PartsSet partsSet) { selectPresetParts(partsSet); } public boolean isExcludePartsIdentifier(PartsIdentifier partsIdentifier) { Boolean exclude = randomExcludePartsIdentifierMap .get(partsIdentifier); return exclude != null && exclude.booleanValue(); } public void setExcludePartsIdentifier(PartsIdentifier partsIdentifier, boolean exclude) { randomExcludePartsIdentifierMap.put(partsIdentifier, exclude); } }); WindowAdjustLocationSupport.alignRight(this, dlg, 0, true); dlg.setVisible(true); lastUsePartsRandomChooserDialog = dlg; } /** * ランダム選択パーツで選択候補から除外するパーツのマップ. */ private HashMap randomExcludePartsIdentifierMap = new HashMap(); /** * すべての解除可能なパーツの選択を解除する。 */ protected void onDeselectAll() { partsSelectionManager.deselectAll(); } /** * 単一選択カテゴリのパーツの解除を許可する。 */ protected void onDeselectableAllCategory() { partsSelectionManager.setDeselectableAlways( !partsSelectionManager.isDeselectableAlways()); } /** * プレビューのズームボックスの表示制御 */ protected void onEnableZoom() { previewPane.setVisibleZoomBox( !previewPane.isVisibleZoomBox()); } /** * メニューバーを構築します. */ protected void initMenubar() { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); MenuDataFactory[] menus = new MenuDataFactory[] { new MenuDataFactory("menu.file", new MenuDataFactory[] { new MenuDataFactory("file.openProfile", new ActionListener() { public void actionPerformed(ActionEvent e) { onOpenProfile(); } }), new MenuDataFactory("file.savePicture", new ActionListener() { public void actionPerformed(ActionEvent e) { onSavePicture(); } }), new MenuDataFactory("file.ukagaka", new MenuDataFactory[] { new MenuDataFactory("file.saveAsUkagaka", new ActionListener() { public void actionPerformed(ActionEvent e) { onSaveAsUkagaka(); }; }), new MenuDataFactory("file.convertUkagaka", new ActionListener() { public void actionPerformed(ActionEvent e) { onConvertUkagaka(); }; }), }), null, new MenuDataFactory("file.editprofile", new ActionListener() { public void actionPerformed(ActionEvent e) { onEditProfile(); } }), new MenuDataFactory("file.opendir", new ActionListener() { public void actionPerformed(ActionEvent e) { onBrowseProfileDir(); } }), new MenuDataFactory("file.import", new MenuDataFactory[] { new MenuDataFactory("file.importMe", new ActionListener() { public void actionPerformed(ActionEvent e) { onImport(null); }; }), new MenuDataFactory("file.importNew", new ActionListener() { public void actionPerformed(ActionEvent e) { onImportNew(); }; }), }), new MenuDataFactory("file.export", new ActionListener() { public void actionPerformed(ActionEvent e) { onExport(); }; }), new MenuDataFactory("file.manageParts", new ActionListener() { public void actionPerformed(ActionEvent e) { onManageParts(); } }), new MenuDataFactory("file.preferences", new ActionListener() { public void actionPerformed(ActionEvent e) { onPreferences(); }; }), null, new MenuDataFactory("file.closeProfile", new ActionListener() { public void actionPerformed(ActionEvent e) { onCloseProfile(); } }), }), new MenuDataFactory("menu.edit", new MenuDataFactory[] { new MenuDataFactory("edit.search", new ActionListener() { public void actionPerformed(ActionEvent e) { openSearchDialog(); } }), new MenuDataFactory("edit.copy", new ActionListener() { public void actionPerformed(ActionEvent e) { onCopy((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0); } }), new MenuDataFactory("edit.flipHorizontal", new ActionListener() { public void actionPerformed(ActionEvent e) { onFlipHolizontal(); } }), new MenuDataFactory("edit.resetcolor", new ActionListener() { public void actionPerformed(ActionEvent e) { onResetColor(); } }), null, new MenuDataFactory("edit.setDefaultPicture", new ActionListener() { public void actionPerformed(ActionEvent e) { onSetDefaultPicture(); } }), new MenuDataFactory("edit.information", new ActionListener() { public void actionPerformed(ActionEvent e) { onInformation(); } }), null, new MenuDataFactory("edit.deselectall", new ActionListener() { public void actionPerformed(ActionEvent e) { onDeselectAll(); } }), new MenuDataFactory("edit.deselectparts", true, new ActionListener() { public void actionPerformed(ActionEvent e) { onDeselectableAllCategory(); } }), new MenuDataFactory("edit.enableAutoShrink", true, new ActionListener() { public void actionPerformed(ActionEvent e) { onClickPartsCategoryTitle(null, true); } }), null, new MenuDataFactory("edit.enableZoomBox", true, new ActionListener() { public void actionPerformed(ActionEvent e) { onEnableZoom(); } }), null, new MenuDataFactory("edit.changeBgColor", new ActionListener() { public void actionPerformed(ActionEvent e) { onChangeBgColor(); } }), new MenuDataFactory("edit.changeWallpaper", new ActionListener() { public void actionPerformed(ActionEvent e) { onChangeWallpaper(); } }), }), new MenuDataFactory("menu.customlayer", new MenuDataFactory[] { new MenuDataFactory("customlayer.manage", new ActionListener() { public void actionPerformed(ActionEvent e) { onManageCustomLayer(); } }), null, }), new MenuDataFactory("menu.favorite", new MenuDataFactory[] { new MenuDataFactory("favorite.register", new ActionListener() { public void actionPerformed(ActionEvent e) { onRegisterFavorite(); } }), new MenuDataFactory("favorite.manage", new ActionListener() { public void actionPerformed(ActionEvent e) { onManageFavorites(); } }), null, }), new MenuDataFactory("menu.tool", new MenuDataFactory[]{new MenuDataFactory( "tool.random", new ActionListener() { public void actionPerformed(ActionEvent e) { onToolRandom(); } }),}), new MenuDataFactory("menu.help", new MenuDataFactory[] { new MenuDataFactory("help.recommendations", (ActionListener) null), null, new MenuDataFactory("help.help", new ActionListener() { public void actionPerformed(ActionEvent e) { onHelp(); } }), new MenuDataFactory("help.forum", DesktopUtilities.createBrowseAction( MainFrame.this, strings.getProperty("help.forum.url"), strings.getProperty("help.forum.description")) ), new MenuDataFactory("help.bugreport", DesktopUtilities.createBrowseAction( MainFrame.this, strings.getProperty("help.reportbugs.url"), strings.getProperty("help.reportbugs.description")) ), new MenuDataFactory("help.about", new ActionListener() { public void actionPerformed(ActionEvent e) { onAbout(); } }), }), }; final MenuBuilder menuBuilder = new MenuBuilder(); JMenuBar menuBar = menuBuilder.createMenuBar(menus); menuBuilder.getJMenu("menu.edit").addMenuListener(new MenuListener() { public void menuCanceled(MenuEvent e) { // do nothing. } public void menuDeselected(MenuEvent e) { // do nothing. } public void menuSelected(MenuEvent e) { menuBuilder.getJMenuItem("edit.copy").setEnabled(previewPane.getPreviewImage() != null); menuBuilder.getJMenuItem("edit.deselectparts").setSelected( partsSelectionManager.isDeselectableAlways()); menuBuilder.getJMenuItem("edit.enableAutoShrink").setSelected(minimizeMode); menuBuilder.getJMenuItem("edit.enableZoomBox").setSelected(previewPane.isVisibleZoomBox()); } }); final JMenu mnuFavorites = menuBuilder.getJMenu("menu.favorite"); mnuFavorites.addMenuListener(new MenuListener() { public void menuCanceled(MenuEvent e) { // do nothing. } public void menuDeselected(MenuEvent e) { // do nothing. } public void menuSelected(MenuEvent e) { onSelectedFavoriteMenu(mnuFavorites); } }); final JMenu mnuCustomLayer = menuBuilder.getJMenu("menu.customlayer"); mnuCustomLayer.addMenuListener(new MenuListener() { public void menuCanceled(MenuEvent e) { // do nothing. } public void menuDeselected(MenuEvent e) { // do nothing. } public void menuSelected(MenuEvent e) { onSelectedCustomLayerMenu(mnuCustomLayer); } }); // J2SE5の場合は「パーツディレクトリを開く」コマンドは使用不可とする. if (System.getProperty("java.version").startsWith("1.5")) { menuBuilder.getJMenuItem("file.opendir").setEnabled(false); } // お勧めサイトメニュー構築 final JMenu mnuRecomendation = menuBuilder.getJMenu("help.recommendations"); JMenu mnuHelp = menuBuilder.getJMenu("menu.help"); mnuHelp.addMenuListener(new MenuListener() { public void menuCanceled(MenuEvent e) { // do nothing. } public void menuDeselected(MenuEvent e) { // do nothing. } public void menuSelected(MenuEvent e) { onSelectedRecommendationMenu(mnuRecomendation); } }); // メニューバーの設置 setJMenuBar(menuBar); // メニューの状態を更新するハンドラ menuUpdater = new Runnable() { @Override public void run() { // カスタムレイヤーの有効状態によってメニュー項目の表示制御を行う. mnuCustomLayer.setVisible(characterData.isEnableCustonLayerPattern()); } }; menuUpdater.run(); } /** * メニューの状態を更新する */ private Runnable menuUpdater; } CharacterManaJ/src/main/java/charactermanaj/ui/PartsManageDialog.java0000644000175000017500000010745013615720000025773 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.net.URI; import java.sql.Timestamp; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Properties; import java.util.concurrent.Semaphore; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import charactermanaj.Main; import charactermanaj.model.AppConfig; import charactermanaj.model.CharacterData; import charactermanaj.model.PartsAuthorInfo; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsManageData; import charactermanaj.model.PartsManageData.PartsKey; import charactermanaj.model.PartsManageData.PartsVersionInfo; import charactermanaj.model.PartsSpec; import charactermanaj.model.io.PartsInfoXMLReader; import charactermanaj.model.io.PartsInfoXMLWriter; import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.DesktopUtilities; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.LocalizedResourcePropertyLoader; public class PartsManageDialog extends JDialog { private static final long serialVersionUID = 1L; protected static final String STRINGS_RESOURCE = "languages/partsmanagedialog"; private static final Logger logger = Logger.getLogger(PartsManageDialog.class.getName()); private CharacterData characterData; private PartsManageTableModel partsManageTableModel; private JTable partsManageTable; private JTextField txtHomepage; private JTextField txtAuthor; private boolean updated; public PartsManageDialog(JFrame parent, CharacterData characterData) { super(parent, true); if (characterData == null) { throw new IllegalArgumentException(); } this.characterData = characterData; setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClose(); } }); Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); setTitle(strings.getProperty("title")); Container contentPane = getContentPane(); // パーツリストテーブル JPanel partsListPanel = new JPanel(); partsListPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(5, 5, 5, 5), BorderFactory .createTitledBorder(strings.getProperty("partslist")))); GridBagLayout partsListPanelLayout = new GridBagLayout(); partsListPanel.setLayout(partsListPanelLayout); partsManageTableModel = new PartsManageTableModel(); partsManageTable = new JTable(partsManageTableModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int rowIdx, int columnIdx) { PartsManageTableModel.Columns column = PartsManageTableModel.Columns .values()[columnIdx]; Component comp = super.prepareRenderer(renderer, rowIdx, columnIdx); PartsManageTableRow row = partsManageTableModel.getRow(rowIdx); Timestamp current = row.getTimestamp(); Timestamp lastModified = row.getLastModified(); boolean warnings = false; if (current != null && !current.equals(lastModified)) { // 現在のパーツの最終更新日と、パーツ管理情報の作成時のパーツの最終更新日が不一致の場合 warnings = true; } // 背景色、警告行は赤色に if (warnings && column == PartsManageTableModel.Columns.LastModified) { AppConfig appConfig = AppConfig.getInstance(); Color invalidBgColor = appConfig.getInvalidBgColor(); comp.setBackground(invalidBgColor); } else { if (isCellSelected(rowIdx, columnIdx)) { comp.setBackground(getSelectionBackground()); } else { comp.setBackground(getBackground()); } } return comp; } }; partsManageTable.setShowGrid(true); partsManageTable.setGridColor(AppConfig.getInstance().getGridColor()); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); partsManageTableModel.adjustColumnModel(partsManageTable.getColumnModel(), scaleSupport.getManualScaleX()); partsManageTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); partsManageTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); // 行の高さをフォントの高さにする partsManageTable.setRowHeight((int)(partsManageTable.getFont().getSize() * 1.2)); JScrollPane partsManageTableSP = new JScrollPane(partsManageTable); partsManageTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { onChangeSelection(); } } }); partsManageTableModel.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { onTableDataChange(e.getFirstRow(), e.getLastRow()); } }); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 4; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; gbc.insets = new Insets(3, 3, 3, 3); gbc.ipadx = 0; gbc.ipady = 0; gbc.weightx = 1.; gbc.weighty = 1.; partsListPanel.add(partsManageTableSP, gbc); Action actSortByName = new AbstractAction(strings.getProperty("sortByName")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSortByName(); } }; Action actSortByAuthor = new AbstractAction(strings.getProperty("sortByAuthor")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSortByAuthor(); } }; Action actSortByTimestamp = new AbstractAction(strings.getProperty("sortByTimestamp")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSortByTimestamp(); } }; gbc.gridx = 0; gbc.gridy = 1; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; partsListPanel.add(new JButton(actSortByName), gbc); gbc.gridx = 1; gbc.gridy = 1; gbc.weightx = 0.; gbc.weighty = 0.; partsListPanel.add(new JButton(actSortByAuthor), gbc); gbc.gridx = 2; gbc.gridy = 1; gbc.weightx = 0.; gbc.weighty = 0.; partsListPanel.add(new JButton(actSortByTimestamp), gbc); gbc.gridx = 3; gbc.gridy = 1; gbc.weightx = 1.; gbc.weighty = 0.; partsListPanel.add(Box.createHorizontalGlue(), gbc); contentPane.add(partsListPanel, BorderLayout.CENTER); // テーブルのコンテキストメニュー final JPopupMenu popupMenu = new JPopupMenu(); Action actApplyAllLastModified = new AbstractAction(strings.getProperty("applyAllLastModified")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onApplyAllLastModified(); } }; Action actApplyAllDownloadURL = new AbstractAction(strings.getProperty("applyAllDownloadURL")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onApplyAllDownloadURL(); } }; Action actApplyAllVersion = new AbstractAction(strings.getProperty("applyAllVersion")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onApplyAllVersion(); } }; popupMenu.add(actApplyAllLastModified); popupMenu.add(new JSeparator()); popupMenu.add(actApplyAllVersion); popupMenu.add(actApplyAllDownloadURL); partsManageTable.setComponentPopupMenu(popupMenu); // 作者情報パネル JPanel authorPanel = new JPanel(); authorPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory .createEmptyBorder(5, 5, 5, 5), BorderFactory .createTitledBorder(strings.getProperty("author.info")))); GridBagLayout authorPanelLayout = new GridBagLayout(); authorPanel.setLayout(authorPanelLayout); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; gbc.insets = new Insets(3, 3, 3, 3); gbc.ipadx = 0; gbc.ipady = 0; gbc.weightx = 0.; gbc.weighty = 0.; authorPanel.add(new JLabel(strings.getProperty("author"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 0; gbc.gridwidth = 2; gbc.weightx = 1.; txtAuthor = new JTextField(); authorPanel.add(txtAuthor, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 1; gbc.weightx = 0.; authorPanel.add(new JLabel(strings.getProperty("homepage"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 1; gbc.gridwidth = 1; gbc.weightx = 1.; txtHomepage = new JTextField(); authorPanel.add(txtHomepage, gbc); gbc.gridx = 2; gbc.gridy = 1; gbc.gridwidth = 1; gbc.weightx = 0.; Action actBrowseHomepage = new AbstractAction(strings.getProperty("open")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onBrosweHomepage(); } }; authorPanel.add(new JButton(actBrowseHomepage), gbc); if (!DesktopUtilities.isSupported()) { actBrowseHomepage.setEnabled(false); } txtAuthor.getDocument().addDocumentListener(new DocumentListener() { public void removeUpdate(DocumentEvent e) { onEditAuthor(); } public void insertUpdate(DocumentEvent e) { onEditAuthor(); } public void changedUpdate(DocumentEvent e) { onEditAuthor(); } }); txtHomepage.getDocument().addDocumentListener(new DocumentListener() { public void removeUpdate(DocumentEvent e) { onEditHomepage(); } public void insertUpdate(DocumentEvent e) { onEditHomepage(); } public void changedUpdate(DocumentEvent e) { onEditHomepage(); } }); // ボタンパネル JPanel btnPanel = new JPanel(); btnPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 45)); GridBagLayout btnPanelLayout = new GridBagLayout(); btnPanel.setLayout(btnPanelLayout); Action actClose = new AbstractAction(strings.getProperty("cancel")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onClose(); } }; Action actOK = new AbstractAction(strings.getProperty("update")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onOK(); } }; gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 1.; btnPanel.add(Box.createHorizontalGlue(), gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 2 : 1; gbc.gridy = 0; gbc.weightx = 0.; btnPanel.add(new JButton(actOK), gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 1 : 2; gbc.gridy = 0; gbc.weightx = 0.; btnPanel.add(new JButton(actClose), gbc); // ダイアログ下部 JPanel southPanel = new JPanel(new BorderLayout()); southPanel.add(authorPanel, BorderLayout.NORTH); southPanel.add(btnPanel, BorderLayout.SOUTH); contentPane.add(southPanel, BorderLayout.SOUTH); // キーボード Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closePartsManageDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closePartsManageDialog"); am.put("closePartsManageDialog", actClose); // モデル構築 partsManageTableModel.initModel(characterData); // ウィンドウ配置 Dimension dim = new Dimension(500, 400); dim = scaleSupport.manualScaled(dim); setSize(dim); setLocationRelativeTo(parent); } private Semaphore authorEditSemaphore = new Semaphore(1); protected void onChangeSelection() { try { authorEditSemaphore.acquire(); try { int [] selRows = partsManageTable.getSelectedRows(); HashSet authors = new HashSet(); for (int selRow : selRows) { PartsManageTableRow row = partsManageTableModel.getRow(selRow); authors.add(row.getAuthor() == null ? "" : row.getAuthor()); } if (authors.size() > 1) { AppConfig appConfig = AppConfig.getInstance(); txtAuthor.setBackground(appConfig.getAuthorEditConflictBgColor()); txtHomepage.setBackground(appConfig.getAuthorEditConflictBgColor()); } else { Color bgColor = UIManager.getColor("TextField.background"); if (bgColor == null) { bgColor = Color.white; } txtAuthor.setBackground(bgColor); txtHomepage.setBackground(bgColor); } if (authors.isEmpty()) { // 選択されているauthorがない場合は全部編集不可 txtAuthor.setEditable(false); txtAuthor.setText(""); txtHomepage.setEditable(false); txtHomepage.setText(""); } else { // 選択されているAuthorが1つ以上あればAuthorは編集可 txtAuthor.setEditable(true); txtHomepage.setEditable(true); if (authors.size() == 1) { // 選択されているAuthorが一個であれば、それを表示 String author = authors.iterator().next(); String homepage = partsManageTableModel.getHomepage(author); txtAuthor.setText(author); txtHomepage.setText(homepage); } else { // 選択されているAuthorが二個以上あれば編集可能だがテキストには表示しない. txtAuthor.setText(""); txtHomepage.setText(""); } } } finally { authorEditSemaphore.release(); } } catch (InterruptedException ex) { ErrorMessageHelper.showErrorDialog(this, ex); } catch (RuntimeException ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } protected void onTableDataChange(int firstRow, int lastRow) { onChangeSelection(); } protected void onApplyAllLastModified() { int[] selRows = partsManageTable.getSelectedRows(); if (selRows.length == 0) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } Arrays.sort(selRows); for (int selRow : selRows) { PartsManageTableRow row = partsManageTableModel.getRow(selRow); Timestamp dt = row.getTimestamp(); row.setLastModified(dt); } partsManageTableModel.fireTableRowsUpdated(selRows[0], selRows[selRows.length - 1]); } protected void onApplyAllDownloadURL() { int[] selRows = partsManageTable.getSelectedRows(); if (selRows.length == 0) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } Arrays.sort(selRows); HashSet authors = new HashSet(); for (int selRow : selRows) { PartsManageTableRow row = partsManageTableModel.getRow(selRow); authors.add(row.getAuthor() == null ? "" : row.getAuthor()); } Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); if (authors.size() > 1) { if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.authorConflict"), strings.getProperty("confirm"), JOptionPane.OK_CANCEL_OPTION) != JOptionPane.OK_OPTION) { return; } } PartsManageTableRow firstRow = partsManageTableModel.getRow(selRows[0]); String downloadURL = firstRow.getDownloadURL(); if (downloadURL == null) { downloadURL = ""; } String downloadURL_new = JOptionPane.showInputDialog(this, strings.getProperty("input.downloadURL"), downloadURL); if (downloadURL_new == null || downloadURL.equals(downloadURL_new)) { // キャンセルされたか、内容に変化ない場合は何もしない return; } for (int selRow : selRows) { PartsManageTableRow row = partsManageTableModel.getRow(selRow); row.setDownloadURL(downloadURL_new); Timestamp dt = row.getTimestamp(); row.setLastModified(dt); } partsManageTableModel.fireTableRowsUpdated(selRows[0], selRows[selRows.length - 1]); } protected void onApplyAllVersion() { Toolkit tk = Toolkit.getDefaultToolkit(); int[] selRows = partsManageTable.getSelectedRows(); if (selRows.length == 0) { tk.beep(); return; } Arrays.sort(selRows); HashSet authors = new HashSet(); for (int selRow : selRows) { PartsManageTableRow row = partsManageTableModel.getRow(selRow); authors.add(row.getAuthor() == null ? "" : row.getAuthor()); } Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); if (authors.size() > 1) { if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.authorConflict"), strings.getProperty("confirm"), JOptionPane.OK_CANCEL_OPTION) != JOptionPane.OK_OPTION) { return; } } PartsManageTableRow firstRow = partsManageTableModel.getRow(selRows[0]); double version = firstRow.getVersion(); String strVersion = (version < 0) ? "" : Double.toString(version); String strVersion_new = JOptionPane.showInputDialog(this, strings.getProperty("input.version"), strVersion); if (strVersion_new == null || strVersion.equals(strVersion_new)) { // キャンセルされたか、内容に変化ない場合は何もしない return; } double version_new; try { version_new = Double.parseDouble(strVersion_new); } catch (Exception ex) { // 数値として不正であれば何もしない. tk.beep(); return; } for (int selRow : selRows) { PartsManageTableRow row = partsManageTableModel.getRow(selRow); row.setVersion(version_new); Timestamp dt = row.getTimestamp(); row.setLastModified(dt); } partsManageTableModel.fireTableRowsUpdated(selRows[0], selRows[selRows.length - 1]); } protected void onEditHomepage() { try { if (!authorEditSemaphore.tryAcquire()) { return; } try { String author = txtAuthor.getText(); String homepage = txtHomepage.getText(); partsManageTableModel.setHomepage(author, homepage); } finally { authorEditSemaphore.release(); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } protected void onEditAuthor() { try { if (!authorEditSemaphore.tryAcquire()) { return; } try { String author = txtAuthor.getText(); int[] selRows = partsManageTable.getSelectedRows(); int firstRow = -1; int lastRow = Integer.MAX_VALUE; for (int selRow : selRows) { PartsManageTableRow row = partsManageTableModel.getRow(selRow); String oldValue = row.getAuthor(); if (oldValue == null || !oldValue.equals(author)) { row.setAuthor(author); Timestamp dt = row.getTimestamp(); row.setLastModified(dt); firstRow = Math.max(firstRow, selRow); lastRow = Math.min(lastRow, selRow); } } String homepage = partsManageTableModel.getHomepage(author); if (homepage == null) { homepage = ""; } txtHomepage.setText(homepage); if (firstRow >= 0) { partsManageTable.repaint(); } } finally { authorEditSemaphore.release(); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } protected void onClose() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.cancel"), strings.getProperty("confirm"), JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) { return; } updated = false; dispose(); } protected void onBrosweHomepage() { Toolkit tk = Toolkit.getDefaultToolkit(); String homepage = txtHomepage.getText(); if (homepage == null || homepage.trim().length() == 0) { tk.beep(); return; } try { URI uri = new URI(homepage); DesktopUtilities.browse(uri); } catch (Exception ex) { tk.beep(); logger.log(Level.INFO, "browse failed. : " + homepage, ex); } } protected void onSortByAuthor() { partsManageTableModel.sortByAuthor(); } protected void onSortByName() { partsManageTableModel.sortByName(); } protected void onSortByTimestamp() { partsManageTableModel.sortByTimestamp(); } protected void onOK() { if (partsManageTable.isEditing()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } int mx = partsManageTableModel.getRowCount(); // 作者ごとのホームページ情報の取得 // (同一作者につきホームページは一つ) HashMap authorInfoMap = new HashMap(); for (int idx = 0; idx < mx; idx++) { PartsManageTableRow row = partsManageTableModel.getRow(idx); String author = row.getAuthor(); String homepage = row.getHomepage(); if (author != null && author.trim().length() > 0) { PartsAuthorInfo authorInfo = authorInfoMap.get(author.trim()); if (authorInfo == null) { authorInfo = new PartsAuthorInfo(); authorInfo.setAuthor(author.trim()); authorInfoMap.put(authorInfo.getAuthor(), authorInfo); } authorInfo.setHomePage(homepage); } } PartsManageData partsManageData = new PartsManageData(); // パーツごとの作者とバージョン、ダウンロード先の取得 for (int idx = 0; idx < mx; idx++) { PartsManageTableRow row = partsManageTableModel.getRow(idx); String author = row.getAuthor(); PartsAuthorInfo partsAuthorInfo = null; if (author != null && author.trim().length() > 0) { partsAuthorInfo = authorInfoMap.get(author.trim()); } double version = row.getVersion(); String downloadURL = row.getDownloadURL(); String localizedName = row.getLocalizedName(); Timestamp lastModified = row.getLastModified(); PartsManageData.PartsVersionInfo versionInfo = new PartsManageData.PartsVersionInfo(); versionInfo.setVersion(version); versionInfo.setDownloadURL(downloadURL); versionInfo.setLastModified(lastModified); PartsIdentifier partsIdentifier = row.getPartsIdentifier(); PartsManageData.PartsKey partsKey = new PartsManageData.PartsKey(partsIdentifier); partsManageData.putPartsInfo(partsKey, localizedName, partsAuthorInfo, versionInfo); } // パーツ管理情報を書き込む. PartsInfoXMLWriter xmlWriter = new PartsInfoXMLWriter(); try { URI docBase = characterData.getDocBase(); xmlWriter.savePartsManageData(docBase, partsManageData); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); return; } updated = true; dispose(); } /** * パーツ管理情報が更新されたか? * * @return 更新された場合はtrue、そうでなければfalse */ public boolean isUpdated() { return updated; } } class PartsManageTableRow { private PartsIdentifier partsIdentifier; private Timestamp timestamp; private String localizedName; private String author; private String homepage; private String downloadURL; private double version; private Timestamp lastModified; public PartsManageTableRow(PartsIdentifier partsIdentifier, PartsSpec partsSpec, Timestamp lastModified) { if (partsIdentifier == null || partsSpec == null) { throw new IllegalArgumentException(); } this.partsIdentifier = partsIdentifier; this.localizedName = partsIdentifier.getLocalizedPartsName(); this.timestamp = new Timestamp(partsSpec.getPartsFiles().lastModified()); this.lastModified = lastModified; PartsAuthorInfo autherInfo = partsSpec.getAuthorInfo(); if (autherInfo != null) { author = autherInfo.getAuthor(); homepage = autherInfo.getHomePage(); } if (author == null) { author = ""; } if (homepage == null) { homepage = ""; } downloadURL = partsSpec.getDownloadURL(); version = partsSpec.getVersion(); } public PartsIdentifier getPartsIdentifier() { return partsIdentifier; } public Timestamp getTimestamp() { return timestamp; } public String getLocalizedName() { return localizedName; } public void setLocalizedName(String localizedName) { if (localizedName == null || localizedName.trim().length() == 0) { throw new IllegalArgumentException(); } this.localizedName = localizedName; } public String getAuthor() { return author; } public String getDownloadURL() { return downloadURL; } public double getVersion() { return version; } public void setAuthor(String author) { this.author = author; } public void setDownloadURL(String downloadURL) { this.downloadURL = downloadURL; } public void setVersion(double version) { this.version = version; } public String getHomepage() { return homepage; } public void setHomepage(String homepage) { this.homepage = homepage; } public Timestamp getLastModified() { return lastModified; } public void setLastModified(Timestamp lastModified) { this.lastModified = lastModified; } } class PartsManageTableModel extends AbstractTableModelWithComboBoxModel { private static final long serialVersionUID = 1L; private static final Logger logger = Logger .getLogger(PartsManageTableModel.class.getName()); private static Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties( PartsManageDialog.STRINGS_RESOURCE); /** * カラムの定義 */ public enum Columns { PartsID("column.partsid", false, String.class) { @Override public Object getValue(PartsManageTableRow row) { return row.getPartsIdentifier().getPartsName(); } }, LastModified("column.lastmodified", false, String.class) { @Override public Object getValue(PartsManageTableRow row) { return row.getTimestamp().toString(); } }, Category("column.category", false, String.class) { @Override public Object getValue(PartsManageTableRow row) { return row.getPartsIdentifier().getPartsCategory() .getLocalizedCategoryName(); } }, PartsName("column.partsname", true, String.class) { @Override public Object getValue(PartsManageTableRow row) { return row.getLocalizedName(); } @Override public void setValue(PartsManageTableRow row, Object value) { String localizedName = (String) value; if (localizedName != null && localizedName.trim().length() > 0) { String oldValue = row.getLocalizedName(); if (oldValue != null && oldValue.equals(localizedName)) { return; // 変化なし } row.setLocalizedName(localizedName); } } }, Author("column.author", true, String.class) { @Override public Object getValue(PartsManageTableRow row) { return row.getAuthor(); } @Override public void setValue(PartsManageTableRow row, Object value) { String author = (String) value; if (author == null) { author = ""; } String oldValue = row.getAuthor(); if (oldValue != null && oldValue.equals(author)) { return; // 変化なし } row.setAuthor(author); } }, Version("column.version", true, Double.class) { @Override public Object getValue(PartsManageTableRow row) { return row.getVersion() > 0 ? row.getVersion() : null; } @Override public void setValue(PartsManageTableRow row, Object value) { Double version = (Double) value; if (version == null || version.doubleValue() <= 0) { version = Double.valueOf(0.); } Double oldValue = row.getVersion(); if (oldValue != null && oldValue.equals(version)) { return; // 変化なし } row.setVersion(version); } }, DownloadURL("column.downloadURL", true, String.class) { @Override public Object getValue(PartsManageTableRow row) { return row.getDownloadURL(); } @Override public void setValue(PartsManageTableRow row, Object value) { String downloadURL = (String) value; if (downloadURL == null) { downloadURL = ""; } String oldValue = row.getDownloadURL(); if (oldValue != null && oldValue.equals(downloadURL)) { return; // 変化なし } row.setDownloadURL(downloadURL); } }; private final Class columnClass; private final boolean editable; private final String columnName; private String displayName; private int width; private Columns(String columnName, boolean editable, Class columnClass) { this.columnName = columnName; this.editable = editable; this.columnClass = columnClass; } public abstract Object getValue(PartsManageTableRow row); public boolean isEditable() { return editable; } public Class getColumnClass() { return columnClass; } public String getDisplayName() { init(); return displayName; } public int getWidth() { init(); return width; } public void setValue(PartsManageTableRow row, Object value) { // 何もしない. } private void init() { if (displayName != null) { return; } displayName = strings.getProperty(columnName); width = Integer .parseInt(strings.getProperty(columnName + ".width")); } } public int getColumnCount() { return Columns.values().length; } @Override public String getColumnName(int column) { return Columns.values()[column].getDisplayName(); } public void adjustColumnModel(TableColumnModel columnModel, double scale) { Columns[] columns = Columns.values(); for (int idx = 0; idx < columns.length; idx++) { columnModel.getColumn(idx).setPreferredWidth( (int)(columns[idx].getWidth() * scale)); } } public Object getValueAt(int rowIndex, int columnIndex) { PartsManageTableRow row = getRow(rowIndex); Columns column = Columns.values()[columnIndex]; return column.getValue(row); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { PartsManageTableRow row = getRow(rowIndex); Columns column = Columns.values()[columnIndex]; if (!column.isEditable()) { return; } column.setValue(row, aValue); // 更新日を最新にする Timestamp dt = row.getTimestamp(); row.setLastModified(dt); // 変更通知 fireTableRowsUpdated(rowIndex, columnIndex); } @Override public Class getColumnClass(int columnIndex) { Columns column = Columns.values()[columnIndex]; return column.getColumnClass(); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { Columns column = Columns.values()[columnIndex]; return column.isEditable(); } public void initModel(CharacterData characterData) { if (characterData == null) { throw new IllegalArgumentException(); } clear(); // 既存のパーツ管理情報ファイルがあれば読み込む URI docBase = characterData.getDocBase(); PartsManageData partsManageData = null; if (docBase != null) { try { PartsInfoXMLReader reader = new PartsInfoXMLReader(); partsManageData = reader.loadPartsManageData(docBase); } catch (Exception ex) { logger.log(Level.WARNING, ex.toString(), ex); } } if (partsManageData == null) { partsManageData = new PartsManageData(); } for (PartsCategory partsCategory : characterData.getPartsCategories()) { for (Map.Entry entry : characterData .getPartsSpecMap(partsCategory).entrySet()) { PartsIdentifier partsIdentifier = entry.getKey(); PartsSpec partsSpec = entry.getValue(); // パーツ管理情報ファイルから、パーツ管理情報を設定した時点の // ファイルサイズや更新日時などを読み取る. PartsKey partsKey = new PartsKey(partsIdentifier); PartsVersionInfo versionInfo = partsManageData .getVersion(partsKey); Timestamp lastModified = null; if (versionInfo != null) { lastModified = versionInfo.getLastModified(); } PartsManageTableRow row = new PartsManageTableRow( partsIdentifier, partsSpec, lastModified); addRow(row); } } sortByAuthor(); } /** * ホームページを設定する.
* ホームページはAuthorに対して1つであるが、Authorが自由編集可能であるため便宜的にRowに持たせている.
* 結果として同じAuthorに対して同じ値を設定する必要がある.
* ホームページはテーブルに表示されないのでリスナーへの通知は行わない.
* * @param author * 作者、空またはnullは何もしない. * @param homepage * ホームページ */ public void setHomepage(String author, String homepage) { if (author == null || author.length() == 0) { return; } for (PartsManageTableRow row : elements) { String targetAuthor = row.getAuthor(); if (targetAuthor == null) { targetAuthor = ""; } if (targetAuthor.equals(author)) { row.setHomepage(homepage); } } } /** * ホームページを取得する.
* 該当する作者がないか、作者がnullまたは空の場合は常にnullを返す.
* * @param author * 作者 * @return ホームページ、またはnull */ public String getHomepage(String author) { if (author == null || author.length() == 0) { return null; } for (PartsManageTableRow row : elements) { String targetAuthor = row.getAuthor(); if (targetAuthor == null) { targetAuthor = ""; } if (targetAuthor.equals(author)) { return row.getHomepage(); } } return null; } protected static final Comparator NAMED_SORTER = new Comparator() { public int compare(PartsManageTableRow o1, PartsManageTableRow o2) { // カテゴリで順序づけ int ret = o1.getPartsIdentifier().getPartsCategory().compareTo( o2.getPartsIdentifier().getPartsCategory()); if (ret == 0) { // 表示名で順序づけ String lnm1 = o1.getLocalizedName(); String lnm2 = o2.getLocalizedName(); if (lnm1 == null) { lnm1 = ""; } if (lnm2 == null) { lnm2 = ""; } ret = lnm1.compareTo(lnm2); } if (ret == 0) { // それでも判定できなければ元の識別子で判定する. ret = o1.getPartsIdentifier().compareTo(o2.getPartsIdentifier()); } return ret; } }; public void sortByName() { Collections.sort(elements, NAMED_SORTER); fireTableDataChanged(); } public void sortByTimestamp() { Collections.sort(elements, new Comparator() { public int compare(PartsManageTableRow o1, PartsManageTableRow o2) { // 更新日で順序づけ (新しいもの順) int ret = o1.getTimestamp().compareTo(o2.getTimestamp()) * -1; if (ret == 0) { // それでも判定できなければ名前順と同じ ret = NAMED_SORTER.compare(o1, o2); } return ret; } }); fireTableDataChanged(); } public void sortByAuthor() { Collections.sort(elements, new Comparator() { public int compare(PartsManageTableRow o1, PartsManageTableRow o2) { // 作者で順序づけ String author1 = o1.getAuthor(); String author2 = o2.getAuthor(); if (author1 == null) { author1 = ""; } if (author2 == null) { author2 = ""; } int ret = author1.compareTo(author2); if (ret == 0) { // それでも判定できなければ名前順と同じ ret = NAMED_SORTER.compare(o1, o2); } return ret; } }); fireTableDataChanged(); } } CharacterManaJ/src/main/java/charactermanaj/ui/ProfileListManager.java0000644000175000017500000004544413615720000026204 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.Cursor; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JDialog; import javax.swing.JFrame; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.PartsManageData; import charactermanaj.model.io.CharacterDataDefaultProvider; import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion; import charactermanaj.model.io.CharacterDataPersistent; import charactermanaj.model.io.CharacterDataPersistent.ListProfileCallback; import charactermanaj.model.io.CharacterDataPersistent.ProfileListErrorHandler; import charactermanaj.model.io.CustomLayerOrderPersist; import charactermanaj.model.io.PartsDataLoader; import charactermanaj.model.io.PartsDataLoaderFactory; import charactermanaj.model.io.PartsInfoXMLReader; import charactermanaj.model.io.PartsManageDataDecorateLoader; import charactermanaj.model.io.PartsSpecDecorateLoader; import charactermanaj.model.io.RecentDataPersistent; import charactermanaj.model.io.RecommendationURLCompensator; import charactermanaj.util.ErrorMessageHelper; /** * プロファイルの選択・管理を行うクラス. * * @author seraphy */ public final class ProfileListManager { /** * ロガー */ private static final Logger logger = Logger.getLogger(ProfileListManager.class.getName()); /** * プライベートコンストラクタ */ private ProfileListManager() { super(); } /** * すべてのメインフレームで使用中のキャラクターデータのコレクション.
*/ private static final HashMap activeCharacterDatas = new HashMap(); /** * キャラクターデータが使用中であるか?
* キャラクターデータのDocBaseをもとに判断する.
* nullを指定した場合は常にfalseを返す.
* * @param characterData * キャラクターデータ、またはnull * @return 使用中であればtrue */ public static boolean isUsingCharacterData(CharacterData characterData) { URI characterDocBase = (characterData == null) ? null : characterData.getDocBase(); synchronized (activeCharacterDatas) { Integer cnt = (characterDocBase == null) ? null : activeCharacterDatas.get(characterDocBase); return cnt != null && cnt.intValue() > 0; } } /** * キャラクターデータが使用中であることを登録する。 * * @param characterData * キャラクターデータ */ public static void registerUsedCharacterData(CharacterData characterData) { if (characterData == null) { return; } synchronized (activeCharacterDatas) { URI characterDocBase = characterData.getDocBase(); if (characterDocBase != null) { Integer cnt = activeCharacterDatas.get(characterDocBase); if (cnt == null) { cnt = Integer.valueOf(1); } else { cnt = Integer.valueOf(cnt.intValue() + 1); } activeCharacterDatas.put(characterDocBase, cnt); } } } /** * キャラクターデータの使用中であることを登録解除する。 * * @param characterData * キャラクターデータ */ public static void unregisterUsedCharacterData(CharacterData characterData) { if (characterData == null) { return; } // 使用中のキャラクターデータとしてのカウントを減らす synchronized (activeCharacterDatas) { URI characterDocBase = characterData.getDocBase(); if (characterDocBase != null) { Integer cnt = activeCharacterDatas.get(characterDocBase); if (cnt != null) { cnt = Integer.valueOf(cnt.intValue() - 1); if (cnt.intValue() <= 0) { activeCharacterDatas.remove(characterDocBase); } else { activeCharacterDatas.put(characterDocBase, cnt); } } } } } /** * プロファイル選択ダイアログを表示し、選択されたプロファイルのメインフレームを作成して返す.
* プロファイルの選択をキャンセルした場合はnullを返す.
* * @param parent * 親フレーム * @return メインフレーム、もしくはnull * @throws IOException * 読み込みに失敗した場合 */ public static MainFrame openProfile(JFrame parent) throws IOException { // キャラクタープロファイルのリストをロード CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); List characterDatas = persist .listProfiles(new ProfileListErrorHandler() { public void occureException(File baseDir, Throwable ex) { logger.log(Level.WARNING, "invalid profile. :" + baseDir, ex); } }); // 選択ダイアログを表示 ProfileSelectorDialog selDlg = new ProfileSelectorDialog(parent, characterDatas); selDlg.setVisible(true); CharacterData characterData = selDlg.getSelectedCharacterData(); if (characterData == null || !characterData.isValid()) { // キャンセルしたか、開くことのできないデータ return null; } // メインフレームを準備 MainFrame newFrame; parent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { newFrame = openProfile(characterData); } finally { parent.setCursor(Cursor.getDefaultCursor()); } return newFrame; } /** * 指定したキャラクター定義で新しいメインフレームを作成して返す.
* * @param characterData * キャラクターデータ * @return 作成されたメインフレーム * @throws IOException * 例外 */ public static MainFrame openProfile(CharacterData characterData) throws IOException { if (characterData == null || !characterData.isValid()) { throw new IOException("開くことのできないキャラクターデータです。:" + characterData); } // キャラクターデータの準備(バージョンアップに伴う補正等) prepare(characterData); // キャラクターデータのロード loadCharacterData(characterData); loadFavorites(characterData); // メインフレームを構築 MainFrame newFrame = new MainFrame(characterData); // 最後に使ったプロファイルとして登録 saveRecent(characterData); return newFrame; } /** * キャラクター定義編集用ダイアログを生成して返す. * * @author seraphy */ private interface ProfileEditorDialogFactory { ProfileEditDialog create(CharacterData characterData); } /** * キャラクター定義を編集する.
* * @param parent * 親ダイアログ、もしくはnull * @param characterData * キャラクター定義(参照のみ、変更されない.) * @return 編集されたキャラクター定義、もしくはキャンセルされた場合はnull * @throws IOException * 失敗 */ public static CharacterData editProfile(final JDialog parent, CharacterData characterData) throws IOException { return internalEditProfile(characterData, new ProfileEditorDialogFactory() { public ProfileEditDialog create(CharacterData characterData) { return new ProfileEditDialog(parent, characterData); } }); } /** * キャラクター定義を編集する.
* * @param parent * 親フレーム、もしくはnull * @param characterData * キャラクター定義(参照のみ、変更されない.) * @return 編集されたキャラクター定義、もしくはキャンセルされた場合はnull * @throws IOException * 失敗 */ public static CharacterData editProfile(final JFrame parent, CharacterData characterData) throws IOException { return internalEditProfile(characterData, new ProfileEditorDialogFactory() { public ProfileEditDialog create(CharacterData characterData) { return new ProfileEditDialog(parent, characterData); } }); } /** * キャラクター定義を編集する.
* * @param characterData * キャラクター定義(参照のみ、変更されない.) * @param dialogFactory * キャラクター定義編集ダイアログを生成するファクトリ * @return 編集されたキャラクター定義、もしくはキャンセルされた場合はnull * @throws IOException * 失敗 */ private static CharacterData internalEditProfile(CharacterData characterData, ProfileEditorDialogFactory dialogFactory) throws IOException { if (characterData == null || !characterData.isValid()) { throw new IOException("開くことのできないキャラクターデータです。:" + characterData); } // キャラクターデータのコピーを作成する.(プリセットも含む) CharacterData original = characterData.duplicateBasicInfo(true); original.clearPartsSets(true); // プリセット以外のパーツセットはクリアする. try { loadFavorites(original); } catch (IOException ex) { ErrorMessageHelper.showErrorDialog(null, ex); // Favoritesの読み込みに失敗しても継続する. } // 編集用ダイアログを構築して開く ProfileEditDialog editDlg = dialogFactory.create(original); editDlg.setVisible(true); // 編集結果を得る. CharacterData newCd = editDlg.getResult(); if (newCd == null) { // キャンセルされた場合 return null; } // 保存する. CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); persist.updateProfile(newCd); persist.saveFavorites(newCd); return newCd; } /** * 最後に使用したプロファイル、それがなければデフォルトプロファイルを開いて、そのメインフレームを返す. * * @return メインフレーム * @throws IOException * 開けなかった場合 */ public static MainFrame openDefaultProfile() throws IOException { CharacterDataPersistent persistent = CharacterDataPersistent.getInstance(); CharacterData characterData; // 最後に使用したプロファイルのロードを試行する. try { characterData = loadRecent(); if (characterData != null) { // キャラクターデータの準備(バージョンアップに伴う補正等) prepare(characterData); // キャラクターデータを読み込む loadCharacterData(characterData); loadFavorites(characterData); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(null, ex); characterData = null; } // 最後に使用したプロファイルの記録がないか、プロファイルのロードに失敗した場合は // プロファイル一覧から最初のプロファイルを選択する. if (characterData == null) { final ArrayList profiles = new ArrayList(); Future future = persistent .listProfileAsync(new ListProfileCallback() { public boolean receiveCharacterData( CharacterData characterData) { try { prepare(characterData); loadCharacterData(characterData); loadFavorites(characterData); synchronized (profiles) { profiles.add(characterData); } // 読み込めたものが1つでもあれば、以降は不要なので打ち切り return false; } catch (Exception ex) { logger.log(Level.SEVERE, "プロファイルのロードに失敗しました。" + characterData, ex); // プロファイルの読み込みに失敗した場合は次を試行する. return true; } } public boolean occureException(File baseDir, Exception ex) { logger.log(Level.WARNING, "invalid profile. :" + baseDir, ex); // エラーでも継続する return true; } }); try { future.get(); synchronized (profiles) { if (!profiles.isEmpty()) { characterData = profiles.get(0); } } } catch (Exception ex) { logger.log(Level.SEVERE, "プロファイルのロードに失敗しました。" + ex, ex); } } // プロファイルが一個もなければ、デフォルトのプロファイルの生成を試行する. if (characterData == null) { logger.info("オープンできるプロファイルがないため、新規プロファイルを作成します。"); try { CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider(); characterData = defProv.createDefaultCharacterData(DefaultCharacterDataVersion.V3).duplicateBasicInfo(); Map> customLayerPatterns = defProv.createDefaultCustomLayerOrderMap(characterData, DefaultCharacterDataVersion.V3); persistent.createProfile(characterData, customLayerPatterns); } catch (IOException ex) { // デフォルトのプロファイルが作成できないことは致命的であるが、 // アプリケーションを起動させるために継続する. logger.log(Level.SEVERE, "default profile creation failed.", ex); // キャラクター定義として無効なダミーのインスタンスを生成して返す. // 何もできないが、メインフレームを空の状態で表示させることは可能. characterData = new CharacterData(); } } // 最後に使用したプロファイルとして記録 saveRecent(characterData); // メインフレームを生成して返す return new MainFrame(characterData); } /** * キャラクターデータの準備を行う。(バージョンアップに伴う補正等) * @param characterData */ public static void prepare(CharacterData characterData) { if (characterData.isEnableCustonLayerPattern() || characterData.getRecommendationURLList() == null) { String structureSig = characterData.toStructureString(); CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider(); CharacterData v3 = defProv.createDefaultCharacterData(DefaultCharacterDataVersion.V3); if (characterData.isEnableCustonLayerPattern()) { CustomLayerOrderPersist customLayerOrderPersist = CustomLayerOrderPersist.newInstance(characterData); if (!customLayerOrderPersist.exist()) { // まだカスタムレイヤーが登録されていない場合(空ファイルの登録は無視する) // カスタムレイヤーをまだ使ったことがないキャラクターデータを最初に開いた場合 // 既定は空のパターン Map> map = Collections.emptyMap(); if (v3.toStructureString().equals(structureSig)) { // デフォルトのキャラクターセット(v3)と同一構造であれば、 // V3デフォルト用のカスタムレイヤー定義をセットする。 map = defProv.createDefaultCustomLayerOrderMap(characterData, DefaultCharacterDataVersion.V3); } // カスタムレイヤーパターンをファイルに保存する try { customLayerOrderPersist.save(map); } catch (Exception ex) { logger.log(Level.WARNING, "failed to save the custom layer mapping.", ex); } } } // お薦めリンクがnullの場合 // (旧形式、またはお薦めリンクの定義がデフォルト定義と同一である場合はnullになる。) // rev:c587663f3dda3a4a874ef6810a336126f07d482c まではMainFrameのお薦めリンクメニュー構築時に補完していた。 // キャラクターデータのダウンロード問い合わせ対応のため、ここで先に補完しておく。 if (characterData.getRecommendationURLList() == null) { CharacterData v2 = defProv.createDefaultCharacterData(DefaultCharacterDataVersion.V2); if (v2.toStructureString().equals(structureSig) || v3.toStructureString().equals(structureSig)) { // デフォルトのキャラクターセット(v2, v3)と同一構造であれば、デフォルトで補完する RecommendationURLCompensator compensator = RecommendationURLCompensator.getInstance(); compensator.compensateRecommendationList(characterData); } } } } /** * キャラクターデータに、パーツデータをロードする.
* お気に入りはロードされないので、必要ならば、このあとで{@link #loadFavorites(CharacterData)}を呼び出す.
* * @param characterData * @throws IOException * 開けなかった場合 */ public static void loadCharacterData(final CharacterData characterData) throws IOException { if (characterData != null && characterData.isValid()) { final PartsInfoXMLReader xmlReader = new PartsInfoXMLReader(); PartsDataLoaderFactory loaderFactory = PartsDataLoaderFactory.getInstance(); PartsDataLoader loader = loaderFactory.createPartsLoader(characterData.getDocBase()); PartsDataLoader colorGroupInfoDecorater = new PartsSpecDecorateLoader(loader, characterData.getColorGroups()); PartsManageDataDecorateLoader partsMngDecorater = new PartsManageDataDecorateLoader(colorGroupInfoDecorater, new PartsManageDataDecorateLoader.PartsManageDataFactory() { public PartsManageData createPartsManageData() { try { return xmlReader .loadPartsManageData(characterData .getDocBase()); } catch (Exception ex) { logger.log(Level.WARNING, "parts-info.xml loading failed.", ex); return new PartsManageData(); } } }); characterData.loadPartsData(partsMngDecorater); } } /** * キャラクターデータに、お気に入りをロードする.
* * @param characterData * @throws IOException * 開けなかった場合 */ public static void loadFavorites(final CharacterData characterData) throws IOException { if (characterData != null && characterData.isValid()) { final CharacterDataPersistent persistent = CharacterDataPersistent.getInstance(); persistent.loadFavorites(characterData); } } /** * 最後に使用したキャラクターデータとして記録する. * * @param characterData * @throws IOException * 保存できなった場合 */ public static void saveRecent(CharacterData characterData) throws IOException { RecentDataPersistent recentPersist = RecentDataPersistent.getInstance(); recentPersist.saveRecent(characterData); } /** * 最後に使用したキャラクターデータを取得する. * * @return キャラクターデータ。最後に使用したデータが存在しない場合はnull * @throws IOException * 読み込みに失敗した場合 */ public static CharacterData loadRecent() throws IOException { RecentDataPersistent recentPersist = RecentDataPersistent.getInstance(); return recentPersist.loadRecent(); } } CharacterManaJ/src/main/java/charactermanaj/ui/ProfileSelectorDialog.java0000644000175000017500000013300713615720000026667 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.dnd.DropTarget; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.URI; import java.text.MessageFormat; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButton; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import charactermanaj.Main; import charactermanaj.clipboardSupport.ClipboardUtil; import charactermanaj.graphics.io.FileImageResource; import charactermanaj.graphics.io.ImageCachedLoader; import charactermanaj.graphics.io.LoadedImage; import charactermanaj.model.AppConfig; import charactermanaj.model.CharacterData; import charactermanaj.model.CharacterDataChangeObserver; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.RecommendationURL; import charactermanaj.model.io.CharacterDataDefaultProvider; import charactermanaj.model.io.CharacterDataPersistent; import charactermanaj.model.io.CustomLayerOrderPersist; import charactermanaj.model.io.PartsImageDirectoryWatchAgent; import charactermanaj.model.io.PartsImageDirectoryWatchAgentFactory; import charactermanaj.ui.util.FileDropTarget; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.ui.util.SingleRootFileSystemView; import charactermanaj.util.DesktopUtilities; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.LocalizedResourcePropertyLoader; import charactermanaj.util.UIHelper; /** * プロファイルを選択するためのダイアログ、およびデフォルトプロファイルを開く * * @author seraphy */ public class ProfileSelectorDialog extends JDialog { private static final long serialVersionUID = -6883202891172975022L; private static final Logger logger = Logger.getLogger(ProfileSelectorDialog.class.getName()); protected static final String STRINGS_RESOURCE = "languages/profileselectordialog"; /** * サンプルイメージをロードするためのローダー */ private ImageCachedLoader imageLoader = new ImageCachedLoader(); /** * サンプルイメージファイルが保存可能であるか?
* 有効なキャラクターデータが選択されており、サンプルイメージの更新が許可されていればtrue.
*/ private boolean canWriteSamplePicture; /** * サンプルイメージを表示するパネル */ private SamplePicturePanel sampleImgPanel; private Action actOK; private Action actCancel; private Action actProfileNew; private Action actProfileCopy; private Action actProfileEdit; private Action actProfileRemove; private Action actProfileBrowse; private Action actProfileImport; private Action actProfileExport; private Action actProfileTemplate; /** * プロファイル一覧を表示するリストコンポーネント */ private JTable characterList; /** * プロファイル一覧のリストモデル */ private ProfileSelectorTableModel characterListModel; /** * プロファイルの説明用テキストエリア */ private JTextArea descriptionArea; /** * ダイアログをOKで閉じた場合に選択していたキャラクターデータを示す.
* nullの場合はキャンセルを意味する. */ private CharacterData selectedCharacterData; /** * プロファイルの選択ダイアログを構築する. * * @param parent * 親フレーム、もしくはnull * @param characterDatas * プロファイルのリスト */ public ProfileSelectorDialog(JFrame parent, List characterDatas) { super(parent, true); if (characterDatas == null) { throw new IllegalArgumentException(); } setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClosing(); } }); final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); setTitle(strings.getProperty("title")); JPanel pnlProfiles = new JPanel(new BorderLayout()); characterListModel = new ProfileSelectorTableModel(); characterListModel.setModel(characterDatas); characterList = new JTable(characterListModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { CharacterData cd = characterListModel.getRow(row); Component comp = super.prepareRenderer(renderer, row, column); if (ProfileListManager.isUsingCharacterData(cd)) { // 使用中のものは太字で表示 Font f = comp.getFont(); comp.setFont(f.deriveFont(Font.BOLD)); } if (!cd.canWrite()) { // 書き込み不可のものはイタリックで表示 Font f = comp.getFont(); comp.setFont(f.deriveFont(Font.ITALIC)); } return comp; } }; characterList.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); characterList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 行の高さをフォントの高さにする characterList.setRowHeight((int)(characterList.getFont().getSize() * 1.2)); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); characterListModel.adjustColumnModel(characterList.getColumnModel(), scaleSupport.getManualScaleX()); characterList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); characterList.getSelectionModel().addListSelectionListener( new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { updateUIState(); } } }); characterList.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { // 正確に2回 onOK(); } } }); JScrollPane characterListSP = new JScrollPane(characterList); characterListSP.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); characterListSP .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); pnlProfiles.add(characterListSP, BorderLayout.CENTER); actOK = new AbstractAction(strings.getProperty("btn.select")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onOK(); } }; actCancel = new AbstractAction(strings.getProperty("btn.cancel")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onCancel(); } }; actProfileNew = new AbstractAction(strings.getProperty("profile.new")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onProfileNew(true); } }; actProfileCopy = new AbstractAction(strings.getProperty("profile.copy")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onProfileNew(false); } }; actProfileEdit = new AbstractAction(strings.getProperty("profile.edit")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onProfileEdit(); } }; actProfileRemove = new AbstractAction( strings.getProperty("profile.remove")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onProfileRemove(); } }; actProfileBrowse = new AbstractAction( strings.getProperty("profile.browse")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onProfileBrowse(); } }; actProfileImport = new AbstractAction( strings.getProperty("profile.import")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onProfileImport(); } }; actProfileExport = new AbstractAction( strings.getProperty("profile.export")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onProfileExport(); } }; actProfileTemplate = new AbstractAction( strings.getProperty("profile.template")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onProfileTemplate(); } }; final JPopupMenu popupTblMenu = new JPopupMenu(); popupTblMenu.add(new JMenuItem(actOK)); popupTblMenu.add(new JSeparator()); popupTblMenu.add(new JMenuItem(actProfileCopy)); popupTblMenu.add(new JMenuItem(actProfileEdit)); popupTblMenu.add(new JMenuItem(actProfileRemove)); popupTblMenu.add(new JSeparator()); popupTblMenu.add(new JMenuItem(actProfileBrowse)); popupTblMenu.add(new JMenuItem(actProfileImport)); popupTblMenu.add(new JMenuItem(actProfileExport)); popupTblMenu.add(new JSeparator()); popupTblMenu.add(new JMenuItem(actProfileTemplate)); characterList.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { evaluatePopup(e); } @Override public void mouseReleased(MouseEvent e) { evaluatePopup(e); } private void evaluatePopup(MouseEvent e) { if (e.isPopupTrigger()) { popupTblMenu.show(characterList, e.getX(), e.getY()); } } }); JButton btnProfileNew = new JButton(actProfileNew); JButton btnProfileCopy = new JButton(actProfileCopy); JButton btnProfileEdit = new JButton(actProfileEdit); JButton btnProfileRemove = new JButton(actProfileRemove); JButton btnProfileBrowse = new JButton(actProfileBrowse); JButton btnProfileImport = new JButton(actProfileImport); JButton btnProfileExport = new JButton(actProfileExport); JButton btnProfileTemplate = new JButton(actProfileTemplate); JPanel pnlProfileEditButtons = new JPanel(); pnlProfileEditButtons.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; gbc.ipadx = 0; gbc.ipady = 0; gbc.insets = new Insets(0, 3, 0, 3); pnlProfileEditButtons.add(btnProfileNew, gbc); gbc.gridx = 0; gbc.gridy = 1; pnlProfileEditButtons.add(btnProfileCopy, gbc); gbc.gridx = 0; gbc.gridy = 2; pnlProfileEditButtons.add(btnProfileEdit, gbc); gbc.gridx = 0; gbc.gridy = 3; pnlProfileEditButtons.add(btnProfileRemove, gbc); gbc.gridx = 0; gbc.gridy = 4; gbc.weighty = 1.; pnlProfileEditButtons.add(Box.createGlue(), gbc); gbc.gridx = 0; gbc.gridy = 5; gbc.weighty = 0.; pnlProfileEditButtons.add(btnProfileBrowse, gbc); gbc.gridx = 0; gbc.gridy = 6; gbc.weighty = 0.; pnlProfileEditButtons.add(btnProfileImport, gbc); gbc.gridx = 0; gbc.gridy = 7; pnlProfileEditButtons.add(btnProfileExport, gbc); gbc.gridx = 0; gbc.gridy = 8; pnlProfileEditButtons.add(btnProfileTemplate, gbc); JPanel pnlProfilesGroup = new JPanel(new BorderLayout()); pnlProfilesGroup.setBorder(BorderFactory.createCompoundBorder(BorderFactory .createEmptyBorder(3, 3, 3, 3), BorderFactory .createTitledBorder(strings.getProperty("profiles")))); pnlProfilesGroup.add(pnlProfiles, BorderLayout.CENTER); pnlProfilesGroup.add(pnlProfileEditButtons, BorderLayout.EAST); JPanel infoPanel = new JPanel(new GridLayout(1, 2)); JPanel descriptionPanel = new JPanel(new BorderLayout()); descriptionPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(3, 3, 3, 3), BorderFactory .createTitledBorder(strings.getProperty("description")))); descriptionArea = new JTextArea(); descriptionArea.setEditable(false); descriptionPanel.add(new JScrollPane(descriptionArea), BorderLayout.CENTER); // サンプルピクャパネル sampleImgPanel = new SamplePicturePanel(); // サンプルピクチャファイルのドラッグアンドドロップ new DropTarget(sampleImgPanel, new FileDropTarget() { @Override protected void onDropFiles(final List dropFiles) { if (dropFiles == null || dropFiles.isEmpty()) { return; } // インポートダイアログを開く. // ドロップソースの処理がブロッキングしないように、 // ドロップハンドラの処理を終了して呼び出す. SwingUtilities.invokeLater(new Runnable() { public void run() { onDrop(dropFiles); } }); } @Override protected void onException(Exception ex) { ErrorMessageHelper.showErrorDialog(ProfileSelectorDialog.this, ex); } }); // サンプルピクチャのコンテキストメニュー final JPopupMenu popupMenu = new JPopupMenu(); final JMenuItem popupMenuCut = popupMenu.add(new AbstractAction(strings.getProperty("samplepicture.cut")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSamplePictureCut(); } }); final JMenuItem popupMenuPaste = popupMenu.add(new AbstractAction(strings.getProperty("samplepicture.paste")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSamplePicturePaste(); } }); sampleImgPanel.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { evaluatePopup(e); } @Override public void mouseReleased(MouseEvent e) { evaluatePopup(e); } private void evaluatePopup(MouseEvent e) { if (e.isPopupTrigger()) { popupMenuCut.setEnabled(sampleImgPanel.getSamplePictrue() != null && canWriteSamplePicture); popupMenuPaste.setEnabled(canWriteSamplePicture && ClipboardUtil.hasImage()); popupMenu.show(sampleImgPanel, e.getX(), e.getY()); } } }); JScrollPane sampleImgPanelSp = new JScrollPane(sampleImgPanel); sampleImgPanelSp.setBorder(null); JPanel sampleImgTitledPanel = new JPanel(new BorderLayout()); sampleImgTitledPanel.add(sampleImgPanelSp, BorderLayout.CENTER); sampleImgTitledPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(3, 3, 3, 3), BorderFactory .createTitledBorder(strings.getProperty("sample-image")))); infoPanel.add(descriptionPanel); infoPanel.add(sampleImgTitledPanel); JSplitPane centerPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true); centerPane.setResizeWeight(1.f); // ウィンドウサイズ変更時に上を可変とする. int divLocation = Integer.parseInt(strings.getProperty("dividerLocation")); divLocation = (int)(scaleSupport.getManualScaleY() * divLocation); centerPane.setDividerLocation(divLocation); centerPane.add(pnlProfilesGroup); centerPane.add(infoPanel); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(centerPane, BorderLayout.CENTER); // OK/CANCEL ボタンパネル JPanel btnPanel = new JPanel(); BoxLayout boxLayout = new BoxLayout(btnPanel, BoxLayout.LINE_AXIS); btnPanel.setLayout(boxLayout); btnPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 42)); JButton btnOK = new JButton(actOK); JButton btnCancel = new JButton(actCancel); if (Main.isLinuxOrMacOSX()) { btnPanel.add(btnCancel); btnPanel.add(btnOK); } else { btnPanel.add(btnOK); btnPanel.add(btnCancel); } JPanel btnPanel2 = new JPanel(new BorderLayout()); btnPanel2.add(btnPanel, BorderLayout.EAST); contentPane.add(btnPanel2, BorderLayout.SOUTH); Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); rootPane.setDefaultButton(btnOK); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeProfileSelectorDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeProfileSelectorDialog"); am.put("closeProfileSelectorDialog", actCancel); int width = Integer.parseInt(strings.getProperty("windowWidth")); int height = Integer.parseInt(strings.getProperty("windowHeight")); Dimension dim = new Dimension(width, height); // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する dim = scaleSupport.manualScaled(dim); setSize(dim); setLocationRelativeTo(parent); characterList.requestFocus(); updateUIState(); } public CharacterData getSelectedCharacterData() { return selectedCharacterData; } /** * キャラクターデータの選択変更に伴い、ボタンやサンプルピクチャなどを切り替える. */ protected void updateUIState() { CharacterData characterData = null; int selRow = characterList.getSelectedRow(); if (selRow >= 0) { characterData = characterListModel.getRow(selRow); } final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); boolean selected = (characterData != null); boolean enableEdit = (characterData != null) && characterData.canWrite(); actOK.setEnabled(selected); actProfileNew.setEnabled(true); actProfileCopy.setEnabled(selected); actProfileEdit.setEnabled(selected); actProfileRemove.setEnabled(selected && enableEdit); actProfileImport.setEnabled(true); actProfileExport.setEnabled(selected); actProfileBrowse.setEnabled(selected); actProfileTemplate.setEnabled(selected); if (enableEdit) { actProfileEdit.putValue(Action.NAME, strings.getProperty("profile.edit")); } else { actProfileEdit.putValue(Action.NAME, strings.getProperty("profile.edit.readonly")); } // 有効なキャラクターデータであり、且つ、書き込み可能であり、且つ、使用中でなければ削除可能 boolean removable = characterData != null && characterData.isValid() && !ProfileListManager.isUsingCharacterData(characterData) && characterData.canWrite(); actProfileRemove.setEnabled(removable); boolean canWriteSamplePicture = false; BufferedImage sampleImage = null; if (characterData != null && characterData.isValid()) { // description StringWriter sw = new StringWriter(); PrintWriter descriptionBuf = new PrintWriter(sw); URI docBase = characterData.getDocBase(); String author = characterData.getAuthor(); String description = characterData.getDescription(); if (docBase != null) { descriptionBuf.println("configuration: " + docBase); } if (author != null && author.length() > 0) { descriptionBuf.println("author: " + author); } Dimension imageSize = characterData.getImageSize(); if (imageSize != null) { descriptionBuf.println("size: " + imageSize.width + "x" + imageSize.height); } if (description != null) { description = description.replace("\r\n", "\n"); description = description.replace("\r", "\n"); description = description.replace("\n", System.getProperty("line.separator")); descriptionBuf.println(description); } descriptionArea.setText(sw.toString()); descriptionArea.setSelectionStart(0); descriptionArea.setSelectionEnd(0); // sample picture try { CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); sampleImage = persist.loadSamplePicture(characterData, imageLoader); canWriteSamplePicture = persist.canSaveSamplePicture(characterData); } catch (Exception ex) { // サンプルピクチャの読み込みに失敗したら、サンプルピクチャを表示しないだけで処理は継続する. logger.log(Level.WARNING, "sample picture loading failed. " + characterData , ex); sampleImage = null; } } this.canWriteSamplePicture = canWriteSamplePicture; String dropHere = strings.getProperty("dropHere"); String noPicture = strings.getProperty("nopicture"); sampleImgPanel.setSamplePicture(sampleImage); sampleImgPanel.setAlternateText(canWriteSamplePicture ? dropHere : noPicture); } /** * サンプルピクチャのファイルを削除し、表示されている画像をクリップボードに保存する */ protected void onSamplePictureCut() { int selRow = characterList.getSelectedRow(); if (selRow < 0) { return; } CharacterData characterData = characterListModel.getRow(selRow); BufferedImage img = sampleImgPanel.getSamplePictrue(); Toolkit tk = Toolkit.getDefaultToolkit(); if (characterData == null || !characterData.isValid() || !canWriteSamplePicture || img == null) { tk.beep(); return; } try { // クリップボードにイメージをセット Color bgColor = AppConfig.getInstance().getSampleImageBgColor(); ClipboardUtil.setImage(img, bgColor); // サンプルピクチャを削除 CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); persist.saveSamplePicture(characterData, null); // プレビューを更新 sampleImgPanel.setSamplePicture(null); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * サンプルピクチャをクリップボードから貼り付け、それをファイルに保存する */ protected void onSamplePicturePaste() { CharacterData characterData = null; int selRow = characterList.getSelectedRow(); if (selRow >= 0) { characterData = characterListModel.getRow(selRow); } Toolkit tk = Toolkit.getDefaultToolkit(); if (characterData == null || !characterData.isValid() || !canWriteSamplePicture) { tk.beep(); return; } try { BufferedImage img = ClipboardUtil.getImage(); if (img != null) { // 画像が読み込まれた場合、それを保存する. CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); persist.saveSamplePicture(characterData, img); sampleImgPanel.setSamplePicture(img); } else { // サンプルピクチャは更新されなかった。 tk.beep(); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * サンプルピクチャパネルにドロップされた画像ファイルをサンプルピクチャとしてコピーします.
* * @param dtde * ドロップイベント */ protected void onDrop(Collection dropFiles) { CharacterData characterData = null; int selRow = characterList.getSelectedRow(); if (selRow >= 0) { characterData = characterListModel.getRow(selRow);; } Toolkit tk = Toolkit.getDefaultToolkit(); if (dropFiles == null || dropFiles.isEmpty() || !canWriteSamplePicture || characterData == null || !characterData.isValid() || !canWriteSamplePicture) { tk.beep(); return; } try { // 最初のファィルのみ取得する. File dropFile = dropFiles.iterator().next(); // ドロップファイルがあれば、イメージとして読み込む BufferedImage img = null; if (dropFile != null && dropFile.isFile() && dropFile.canRead()) { try { LoadedImage loadedImage = imageLoader.load(new FileImageResource(dropFile)); img = loadedImage.getImage(); } catch (IOException ex) { // イメージのロードができない = 形式が不正であるなどの場合は // 読み込みせず、継続する. img = null; } } if (img != null) { // 画像が読み込まれた場合、それを保存する. CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); persist.saveSamplePicture(characterData, img); sampleImgPanel.setSamplePicture(img); } else { // サンプルピクチャは更新されなかった。 tk.beep(); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } @Override public void dispose() { imageLoader.close(); super.dispose(); } /** * 閉じる場合 */ protected void onClosing() { dispose(); } /** * OKボタン押下 */ protected void onOK() { selectedCharacterData = null; int selRow = characterList.getSelectedRow(); if (selRow >= 0) { selectedCharacterData = characterListModel.getRow(selRow); } if (selectedCharacterData == null) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } dispose(); } /** * キャンセルボタン押下 */ protected void onCancel() { selectedCharacterData = null; onClosing(); } /** * プロファイルの作成 * * @param makeDefault * デフォルトのプロファイルで作成する場合 */ protected void onProfileNew(boolean makeDefault) { CharacterData cd = null; Map> customLayerOrderMap = null; int selRow = characterList.getSelectedRow(); if (selRow >= 0) { cd = characterListModel.getRow(selRow); // カスタムレイヤーマッピングをロードする if (cd.isValid()) { try { customLayerOrderMap = CustomLayerOrderPersist.newInstance(cd).load(); } catch (Exception ex) { logger.log(Level.WARNING, "failed to read the custom layer mapping", ex); } } } CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); if (makeDefault || cd == null) { try { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); // キャラクターデータ選択用のコンボボックスの準備 JComboBox comboTemplates = new JComboBox(); comboTemplates.setEditable(false); // テンプレート一覧のEntryを表示するので、カスタムレンダラーで描画する comboTemplates.setRenderer(new ListCellRenderer() { private JLabel label = new JLabel(); @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { // 背景色透過制御 label.setOpaque(isSelected && index >= 0); if (isSelected) { label.setBackground(list.getSelectionBackground()); label.setForeground(list.getSelectionForeground()); } else { label.setBackground(list.getBackground()); label.setForeground(list.getForeground()); } if (value == null) { label.setText(""); } else { @SuppressWarnings("unchecked") Map.Entry entry = (Map.Entry) value; label.setFont(list.getFont()); label.setText(entry.getValue()); } return label; } }); // キャラクターデータのテンプレートを一覧登録する. CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider(); for (final Map.Entry entry : defProv .getCharacterDataTemplates().entrySet()) { comboTemplates.addItem(entry); } // ブランク用のダミーテンプレートを追加する comboTemplates.addItem(new AbstractMap.SimpleEntry("", strings.getProperty("template.blank"))); // コンボボックスの幅を広げる. // (短いとInputBoxのタイトルが隠れるため) Dimension preferredSize = comboTemplates.getPreferredSize(); int comboWidth = Integer.parseInt(strings .getProperty("profileNew.chooseTemplate.combo.width")); preferredSize.width = Math.max(preferredSize.width, comboWidth); comboTemplates.setPreferredSize(preferredSize); int ret = JOptionPane.showConfirmDialog(this, comboTemplates, strings.getProperty("profileNew.chooseTemplate.title"), JOptionPane.OK_CANCEL_OPTION); if (ret != JOptionPane.OK_OPTION) { // キャンセルされた場合 return; } @SuppressWarnings("unchecked") Map.Entry selection = (Map.Entry) comboTemplates .getSelectedItem(); if (selection == null) { // 未選択の場合 return; } // 選択したテンプレートを取得 String characterXmlName = selection.getKey(); if (characterXmlName != null && characterXmlName.length() > 0) { // テンプレートを読み込む cd = defProv.loadPredefinedCharacterData(characterXmlName); customLayerOrderMap = defProv.loadPredefinedCustomLayerOrder(cd, characterXmlName); } else { // プランクを選択している場合は空のキャラクターデータを作成する cd = new CharacterData(); // お勧めURLは空にする。(nullの場合は旧形式とみなして取得時にデフォルトのURLが設定されるため) cd.setRecommendationURLList(new ArrayList()); customLayerOrderMap = null; } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); return; } } // 基本情報をコピーします。 CharacterData newCd = cd.duplicateBasicInfo(); // DocBaseはnullにする。これにより新規作成と判断される. newCd.setDocBase(null); // 新規なのでパーツセット情報はリセットする newCd.clearPartsSets(false); ProfileEditDialog editDlg = new ProfileEditDialog(this, newCd); editDlg.setVisible(true); newCd = editDlg.getResult(); if (newCd == null) { // キャンセルされた場合 return; } // 新規プロファイルを保存する. try { // キャラクターデータと、カスタムレイヤーマッピングを保存する // ※ 設定ダイアログでキャラクターデータ構造を変更している場合には // 最初にロードしたカスタムレイヤーの定義と合致しないかもしれないが、とりあえず登録しておく。 persist.createProfile(newCd, customLayerOrderMap); persist.saveFavorites(newCd); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); return; } // 作成されたプロファイルを一覧に追加する. characterListModel.add(newCd); } /** * プロファィルの編集 */ protected void onProfileEdit() { CharacterData cd = null; int selRow = characterList.getSelectedRow(); if (selRow >= 0) { cd = characterListModel.getRow(selRow); } if (cd == null || !cd.isValid()) { return; } try { // プロファイル編集ダイアログを開き、その結果を取得する. CharacterData newCd = ProfileListManager.editProfile(this, cd); if (newCd == null) { // キャンセルされた場合 return; } // 現在開いているメインフレームに対してキャラクター定義が変更されたことを通知する. CharacterDataChangeObserver.getDefault().notifyCharacterDataChange( this, newCd, true, true); // プロファイル一覧画面も更新する. characterListModel.set(selRow, newCd); characterList.repaint(); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); return; } } /** * プロファイルの削除 */ protected void onProfileRemove() { CharacterData cd = null; int selRow = characterList.getSelectedRow(); if (selRow >= 0) { cd = characterListModel.getRow(selRow); } if (cd == null || !cd.isValid() || ProfileListManager.isUsingCharacterData(cd) || !cd.canWrite()) { // 無効なキャラクター定義であるか、使用中であるか、書き込み不可であれば削除は実行できない. Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); String msgTempl = strings.getProperty("profile.remove.confirm"); MessageFormat fmt = new MessageFormat(msgTempl); String msg = fmt.format(new Object[]{cd.getName()}); JPanel msgPanel = new JPanel(new BorderLayout(5, 5)); msgPanel.add(new JLabel(msg), BorderLayout.CENTER); JCheckBox chkRemoveForce = new JCheckBox(strings.getProperty("profile.remove.force")); msgPanel.add(chkRemoveForce, BorderLayout.SOUTH); JOptionPane optionPane = new JOptionPane(msgPanel, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION) { private static final long serialVersionUID = 1L; @Override public void selectInitialValue() { String noBtnCaption = UIManager.getString("OptionPane.noButtonText"); for (JButton btn : UIHelper.getInstance().getDescendantOfClass(JButton.class, this)) { if (btn.getText().equals(noBtnCaption)) { // 「いいえ」ボタンにフォーカスを設定 btn.requestFocus(); } } } }; JDialog dlg = optionPane.createDialog(this, strings.getProperty("confirm.remove")); dlg.setVisible(true); Object ret = optionPane.getValue(); if (ret == null || ((Number) ret).intValue() != JOptionPane.YES_OPTION) { return; } if (!cd.canWrite() || cd.getDocBase() == null) { JOptionPane.showMessageDialog(this, strings.getProperty("profile.remove.cannot")); return; } boolean forceRemove = chkRemoveForce.isSelected(); try { CharacterDataPersistent persiste = CharacterDataPersistent.getInstance(); persiste.remove(cd, forceRemove); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); return; } // モデルから該当キャラクターを削除して再描画 characterListModel.remove(selRow); characterList.repaint(); updateUIState(); } /** * 場所を開く */ protected void onProfileBrowse() { CharacterData cd = null; int selRow = characterList.getSelectedRow(); if (selRow >= 0) { cd = characterListModel.getRow(selRow); } if (cd == null || !cd.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } try { URI docBase = cd.getDocBase(); if (!DesktopUtilities.browseBaseDir(docBase)) { JOptionPane.showMessageDialog(this, docBase); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * インポート */ protected void onProfileImport() { try { CharacterData selCd = null; int selRow = characterList.getSelectedRow(); if (selRow >= 0) { selCd = characterListModel.getRow(selRow); } // 選択したプロファイルを更新するか、新規にプロファイルを作成するか選択できるようにする if (selCd != null) { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); JPanel radioPanel = new JPanel(new BorderLayout()); JRadioButton btnUpdate = new JRadioButton(strings.getProperty("importToUpdateProfile")); JRadioButton btnNew = new JRadioButton(strings.getProperty("importToCreateProfile")); ButtonGroup radios = new ButtonGroup(); radios.add(btnUpdate); radios.add(btnNew); btnUpdate.setSelected(true); radioPanel.add(btnUpdate, BorderLayout.NORTH); radioPanel.add(btnNew, BorderLayout.SOUTH); int ret = JOptionPane.showConfirmDialog(this, radioPanel, strings.getProperty("confirmUpdateProfile"), JOptionPane.OK_CANCEL_OPTION); if (ret != JOptionPane.OK_OPTION) { return; } if (btnNew.isSelected()) { // 選択されていないことにする. selCd = null; } } // キャラクターデータをロードし直す. CharacterData cd; if (selCd != null) { cd = selCd.duplicateBasicInfo(); try { ProfileListManager.loadCharacterData(cd); ProfileListManager.loadFavorites(cd); } catch (IOException ex) { ErrorMessageHelper.showErrorDialog(this, ex); // 継続する. } } else { cd = null; } // ディレクトリ監視エージェントの停止 PartsImageDirectoryWatchAgentFactory agentFactory = PartsImageDirectoryWatchAgentFactory.getFactory(); PartsImageDirectoryWatchAgent agent = agentFactory.getAgent(cd); agent.suspend(); try { // インポートウィザードの実行 ImportWizardDialog importWizDialog = new ImportWizardDialog(this, cd); importWizDialog.setVisible(true); CharacterData newCd = importWizDialog.getImportedCharacterData(); if (importWizDialog.getExitCode() == ImportWizardDialog.EXIT_PROFILE_CREATED) { // 作成されたプロファイルを一覧に追加する. characterListModel.add(newCd); } else if (importWizDialog.getExitCode() == ImportWizardDialog.EXIT_PROFILE_UPDATED) { // 更新されたプロファイルを通知する CharacterDataChangeObserver.getDefault() .notifyCharacterDataChange(this, newCd, true, true); } } finally { agent.resume(); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * エクスポート */ protected void onProfileExport() { CharacterData cd = null; int selRow = characterList.getSelectedRow(); if (selRow >= 0) { cd = characterListModel.getRow(selRow); } if (cd == null || !cd.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } try { // コピーした情報に対してパーツデータをロードする. final CharacterData newCd = cd.duplicateBasicInfo(); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { ProfileListManager.loadCharacterData(newCd); } finally { setCursor(Cursor.getDefaultCursor()); } // エクスポートウィザードを表示 BufferedImage sampleImage = sampleImgPanel.getSamplePictrue(); ExportWizardDialog exportWizDialog = new ExportWizardDialog(this, newCd, sampleImage); exportWizDialog.setVisible(true); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); return; } } /** * 選択したプロファイルをテンプレートとして登録する. */ protected void onProfileTemplate() { try { CharacterData cd = null; int selRow = characterList.getSelectedRow(); if (selRow >= 0) { cd = characterListModel.getRow(selRow); } if (cd == null || !cd.isValid()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } String defualtName = cd.getId() + "_" + cd.getRev() + ".xml"; // Windowsでのファイル名として使用禁止の文字を置換する. for (char c : "<>|:;*?/\\\"".toCharArray()) { defualtName = defualtName.replace(c, '_'); } // カスタムレイヤーパターンのロード(なければnull) CustomLayerOrderPersist customLayerPersist = CustomLayerOrderPersist.newInstance(cd); Map> customLayerPatterns = customLayerPersist.load(); // カスタマイズ用テンプレートファイルの格納場所を取得する. final CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider(); final File templDir = defProv.getUserTemplateDir(); templDir.mkdirs(); // 指定されたディレクトリ以外に表示・移動できないファイルシステムビューを使用したファイルチューザ JFileChooser fileChooser = new JFileChooser( new SingleRootFileSystemView(templDir)) { private static final long serialVersionUID = 1L; @Override public void approveSelection() { File outFile = getSelectedFile(); if (outFile == null) { return; } String name = outFile.getName(); if (!defProv.canFileSave(name) || !name.endsWith(".xml")) { // 書き込み不可ファイル、もしくはxml以外なので許可しない. Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } // ファイルが存在すれば上書き確認する. if (outFile.exists()) { Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties( STRINGS_RESOURCE); if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirmOverwrite"), strings.getProperty("confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION) { return; } } super.approveSelection(); } }; // 保存先ファイル名の入力 fileChooser.setSelectedFile(new File(templDir, defualtName)); int ret = fileChooser.showSaveDialog(this); if (ret != JFileChooser.APPROVE_OPTION) { return; } // テンプレート名の入力 String localizedName = cd.getName(); final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); localizedName = JOptionPane.showInputDialog(this, strings.getProperty("inputTemplateName"), localizedName); if (localizedName == null) { return; } // テンプレートファイルの作成(上書き保存) File outFile = fileChooser.getSelectedFile(); defProv.saveTemplate(outFile.getName(), cd, localizedName, customLayerPatterns); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); return; } } } /** * プロファイル一覧リストのモデル */ class ProfileSelectorTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; private enum Columns { NAME("profile.column.name") { @Override public String getValue(CharacterData cd) { return cd.getName(); } }, ID("profile.column.id") { @Override public String getValue(CharacterData cd) { return cd.getId(); } }, REVISION("profile.column.revision") { @Override public String getValue(CharacterData cd) { return cd.getRev(); } }, CANVAS_SIZE("profile.column.canvasSize") { @Override public String getValue(CharacterData cd) { Dimension siz = cd.getImageSize(); if (siz != null) { return siz.width + "x" + siz.height; } return ""; } }, DESCRIPTION("profile.column.description") { @Override public String getValue(CharacterData cd) { return cd.getDescription(); } }, AUTHOR("profile.column.author") { @Override public String getValue(CharacterData cd) { return cd.getAuthor(); } }, LOCATION("profile.column.location") { @Override public String getValue(CharacterData cd) { return cd.getDocBase().toString(); } }; private final String columnName; private String displayName; private int width; private Columns(String columnName) { this.columnName = columnName; } public String getDisplayName() { loadProperty(); return displayName; } public int getWidth() { loadProperty(); return width; } private void loadProperty() { if (displayName != null) { return; } final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties( ProfileSelectorDialog.STRINGS_RESOURCE); displayName = strings.getProperty(columnName); width = Integer .parseInt(strings.getProperty(columnName + ".width")); } public abstract String getValue(CharacterData cd); } private List rows = Collections .emptyList(); public void setModel(List rows) { if (rows == null) { throw new IllegalArgumentException(); } this.rows = new ArrayList(rows); fireTableDataChanged(); } public void add(CharacterData cd) { if (cd == null) { throw new IllegalArgumentException(); } this.rows.add(cd); int lastRow = this.rows.size() - 1; fireTableRowsInserted(lastRow, lastRow); } public void set(int selRow, CharacterData cd) { this.rows.set(selRow, cd); fireTableRowsDeleted(selRow, selRow); } public void remove(int selRow) { this.rows.remove(selRow); fireTableRowsDeleted(selRow, selRow); } public List getModel() { return rows; } public CharacterData getRow(int rowIndex) { CharacterData cd = rows.get(rowIndex); return cd; } public int getColumnCount() { return Columns.values().length; } public int getRowCount() { return rows.size(); } public void adjustColumnModel(TableColumnModel columnModel, double scale) { Columns[] columns = Columns.values(); for (int idx = 0; idx < columns.length; idx++) { columnModel.getColumn(idx).setPreferredWidth( (int)(columns[idx].getWidth() * scale)); } } @Override public String getColumnName(int column) { return Columns.values()[column].getDisplayName(); } public Object getValueAt(int rowIndex, int columnIndex) { CharacterData cd = getRow(rowIndex); Columns column = Columns.values()[columnIndex]; return column.getValue(cd); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { // なにもしない. } } CharacterManaJ/src/main/java/charactermanaj/ui/MiniPictureBox.java0000644000175000017500000000644113615720000025350 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Insets; import java.awt.RenderingHints; import java.awt.geom.Rectangle2D; import java.awt.image.ImageObserver; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.border.BevelBorder; /** * サンプルイメージを表示する小さなピクチャボックス.
* 非同期イメージに対応している.
* @author seraphy */ public class MiniPictureBox extends JPanel { private static final long serialVersionUID = 3210952907784110605L; /** * 表示するイメージ.
* 非同期読み込みのイメージにも対応.
*/ private Image image; /** * 読み込みエラーが発生しているか? */ private boolean errorOccured; /** * コンストラクタ */ public MiniPictureBox() { setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); setPreferredSize(new Dimension(150, 300)); } @Override protected void paintComponent(Graphics g0) { Graphics2D g = (Graphics2D) g0; super.paintComponent(g); Image img = getImage(); if (img != null) { if (errorOccured) { FontMetrics fm = g.getFontMetrics(); String message = "ERROR"; Rectangle2D rct = fm.getStringBounds(message, g); Insets insets = getInsets(); g.drawString(message, insets.left, insets.top + (int) rct.getHeight()); } else { // 画像の読み込みに失敗しているか? checkImage(img, -1, -1, new ImageObserver() { public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { if ((infoflags & (ImageObserver.ERROR)) != 0) { errorOccured = true; repaint(); } return true; } }); if ( !prepareImage(img, this)) { // まだロードできていない場合は // ロードできるまで表示しない. return; } // イメージサイズの取得 int imgW = img.getWidth(this); int imgH = img.getHeight(this); // 表示エリア int x = 0; int y = 0; int w = getWidth(); int h = getHeight(); Insets insets = getInsets(); if (insets != null) { x = insets.left; y = insets.top; w -= insets.left + insets.right; h -= insets.top + insets.bottom; } // 倍率算定 double vx = (double) w / (double) imgW; double vy = (double) h / (double) imgH; double factor = Math.min(vx, vy); int scaledW = (int)(imgW * factor); int scaledH = (int)(imgH * factor); int offset_x = (w - scaledW) / 2; int offset_y = (h - scaledH) / 2; // 描画 g.setRenderingHint( RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage(img, x + offset_x, y + offset_y, x + offset_x + scaledW, y + offset_y + scaledH, 0, 0, imgW, imgH, this); } } } public Image getImage() { return image; } public void setImage(Image image) { Image oldimg = this.image; if ((oldimg != null && image == null) || (image != null && (oldimg == null || !oldimg.equals(image)))) { this.image = image; this.errorOccured = false; repaint(); firePropertyChange("image", oldimg, image); } } }CharacterManaJ/src/main/java/charactermanaj/ui/RecentCharactersDir.java0000644000175000017500000001411013615720000026316 0ustar paulliupaulliupackage charactermanaj.ui; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; import java.util.Properties; import java.util.TreeMap; import charactermanaj.util.ConfigurationDirUtilities; /** * 最後に使用したキャラクターデータディレクトリと、その履歴情報.
* * @author seraphy */ public class RecentCharactersDir { /** * 使用したキャラクターデータディレクトリリストの保存先ファイル名 */ private static final String RECENT_CHARACTERDIRS_XML = "recent-characterdirs.xml"; /** * キャラクターデータディレクトリ一覧のプロパティキーのプレフィックス */ private static final String DIRS_PREFIX = "characterDataDirs."; /** * 最後に使用したディレクトリ */ private File lastUseCharacterDir; /** * 過去に使用したディレクトリ情報 */ private ArrayList recentCharacterDirs = new ArrayList(); /** * ディレクトリの問い合わせ不要フラグ. */ private boolean doNotAskAgain; /** * 使用したキャラクターディレクトリの履歴、古いもの順 * * @return */ public List getRecentCharacterDirs() { return recentCharacterDirs; } /** * 使用したキャラクターディレクトリの履歴、新しいもの順.
* 表示用であり、追加・削除・変更は不可. * * @return */ public List getRecentCharacterDirsOrderByNewly() { ArrayList dirs = new ArrayList(recentCharacterDirs); Collections.reverse(dirs); return Collections.unmodifiableList(dirs); } public void setLastUseCharacterDir(File lastUseCharacterDir) { this.lastUseCharacterDir = lastUseCharacterDir; } public File getLastUseCharacterDir() { return lastUseCharacterDir; } public void clrar() { doNotAskAgain = false; lastUseCharacterDir = null; recentCharacterDirs.clear(); } public boolean isDoNotAskAgain() { return doNotAskAgain; } public void setDoNotAskAgain(boolean doNotAskAgain) { this.doNotAskAgain = doNotAskAgain; } /** * ユーザーディレクトリ上の、過去に利用したキャラクターデータディレクトリの一覧をロードする.
* 存在しなければ空を返す. * * @return * @throws IOException */ public static RecentCharactersDir load() throws IOException { Properties props = new Properties(); // ユーザーディレクトリのルート上に最後に使ったファイルリストをxml形式で保存する. File localUserDataDir = ConfigurationDirUtilities.getLocalUserDataDir(); File recentUseDirs = new File(localUserDataDir, RECENT_CHARACTERDIRS_XML); if (recentUseDirs.exists()) { InputStream is = new BufferedInputStream(new FileInputStream( recentUseDirs)); try { props.loadFromXML(is); } finally { is.close(); } } RecentCharactersDir inst = new RecentCharactersDir(); inst.doNotAskAgain = Boolean.parseBoolean(props .getProperty("doNotAskAgain")); String lastUseCharacterDataDir = props .getProperty("lastUseCharacterDataDir"); File lastUseCharacterDir = null; TreeMap dirsMap = new TreeMap(); try { if (lastUseCharacterDataDir != null && lastUseCharacterDataDir.trim().length() > 0) { lastUseCharacterDir = new File(new URI( lastUseCharacterDataDir)); if (!lastUseCharacterDir.isDirectory()) { // 存在しない場合 lastUseCharacterDir = null; } } Enumeration enmKeys = props.propertyNames(); while (enmKeys.hasMoreElements()) { String key = (String) enmKeys.nextElement(); if (key.startsWith(DIRS_PREFIX)) { String value = props.getProperty(key); if (value != null && value.trim().length() > 0) { File dir = new File(new URI(value)); if (dir.isDirectory()) { // 実在するフォルダのみ使用可能とする dirsMap.put(key, dir); } } } } } catch (URISyntaxException ex) { IOException ex2 = new IOException("invalid file name: " + ex); ex2.initCause(ex); throw ex2; } inst.lastUseCharacterDir = lastUseCharacterDir; for (File dir : dirsMap.values()) { if (!dir.equals(lastUseCharacterDir)) { inst.recentCharacterDirs.add(dir); } } if (lastUseCharacterDir != null) { inst.recentCharacterDirs.add(lastUseCharacterDir); } return inst; } /** * 利用したキャラクターデータディレクトリの履歴情報をユーザーディレクトリに保存する. * * @throws IOException */ public void saveRecents() throws IOException { Properties props = new Properties(); // 最後に使用したディレクトリ if (lastUseCharacterDir != null) { props.put("lastUseCharacterDataDir", lastUseCharacterDir.toURI() .toString()); // 最後に使用したディレクトリを末尾に移動 recentCharacterDirs.remove(lastUseCharacterDir); recentCharacterDirs.add(lastUseCharacterDir); } else { props.put("lastUseCharacterDataDir", ""); } // ディレクトリリスト int idx = 0; for (File dir : recentCharacterDirs) { String key = DIRS_PREFIX + String.format("%04d", idx); props.put(key, dir.toURI().toString()); idx++; } // ディレクトリを再度問い合わせないか? props.put("doNotAskAgain", doNotAskAgain ? "true" : "false"); // ユーザーディレクトリのルート上に最後に使ったファイルリストをxml形式で保存する. File localUserDataDir = ConfigurationDirUtilities.getLocalUserDataDir(); File recentUseDirs = new File(localUserDataDir, RECENT_CHARACTERDIRS_XML); OutputStream os = new BufferedOutputStream(new FileOutputStream( recentUseDirs)); try { props.storeToXML(os, "recent-characterdirs"); } finally { os.close(); } } }CharacterManaJ/src/main/java/charactermanaj/ui/Wallpaper.java0000644000175000017500000004451213615720000024377 0ustar paulliupaulliupackage charactermanaj.ui; import static java.lang.Math.ceil; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Composite; import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.Image; import java.awt.Rectangle; import java.awt.Transparency; import java.awt.image.BufferedImage; import java.awt.image.VolatileImage; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.model.AppConfig; /** * 壁紙 * @author seraphy */ public class Wallpaper { /** * ロガー */ private static final Logger logger = Logger.getLogger(Wallpaper.class.getName()); /** * 壁紙の推奨されるブロックサイズ(幅).
* このサイズに満たない壁紙用画像は、このサイズに近い値まで敷き詰めて保持しておく.
*/ private static final int wallpaperPreferredWidth = 128; /** * 壁紙の推奨されるブロックサイズ(高さ).
* このサイズに満たない壁紙用画像は、このサイズに近い値まで敷き詰めて保持しておく.
*/ private static final int wallpaperPreferredHeight = 128; /** * プロパティ変更イベントのキー名 */ public static final String KEY_WALLPAPER_IMAGE = "wallpaperImage"; /** * プロパティ変更通知サポート. */ private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); /** * 背景色.
*/ private Color backgroundColor = Color.WHITE; /** * 壁紙画像.
*/ private BufferedImage wallpaperImg; /** * 壁紙画像のアルファ値.
*/ private float wallpaperAlpha = 1.f; /** * 壁紙用オフスクリーンサーフェイス.
* なければnull.
*/ private VolatileImage wallpaperVolatileImg; /** * 壁紙用オフスクリーンを生成したときに使用した背景色.
* なければnull */ private Color wallpaperVolatileBgColor; /** * 壁紙が表示されない状態で壁紙イメージを構築する.
*/ public Wallpaper() { this(null); } /** * 壁紙の元画像を指定して壁紙イメージを構築する.
* nullを指定した場合は壁紙は表示されない.
* @param wallpaperImg 壁紙イメージ、もしくはnull */ public Wallpaper(BufferedImage wallpaperImg) { this.wallpaperImg = makeExpandedWallpaper(makeExpandedWallpaper(wallpaperImg)); } /** * 壁紙画像を設定する.
* nullの場合は解除される.
* 壁紙が小さい場合は推奨されるブロックサイズまで敷き詰めなおした状態で * 保持する.(描画不可軽減のため.) * したがって、{@link #getWallpaperImage()}を呼び出したときには * 拡張されたサイズとなっている.
* @param wallpaperImg */ public void setWallpaperImage(BufferedImage wallpaperImg) { // 現在のオフスクリーンを破棄する. disposeOffscreen(); // 新しいイメージ BufferedImage wallpaperImgOld = makeExpandedWallpaper(this.wallpaperImg); this.wallpaperImg = makeExpandedWallpaper(wallpaperImg); propertyChangeSupport.firePropertyChange("wallpaperImage", wallpaperImgOld, this.wallpaperImg); } /** * 壁紙画像を取得する.
* 壁紙画像はブロックサイズまで拡張されたものとなっている.
* @return 壁紙画像、なければnull */ public BufferedImage getWallpaperImage() { return wallpaperImg; } public float getWallpaperAlpha() { return wallpaperAlpha; } /** * 壁紙画像を描画する場合のアルファ値を設定する.
* 負の値は0に、1以上は1に制限される.
* @param wallpaperAlpha アルファ値(0から1の範囲) */ public void setWallpaperAlpha(float wallpaperAlpha) { // 現在のオフスクリーンを破棄する. disposeOffscreen(); // 範囲無いに制限する. if (wallpaperAlpha < 0) { wallpaperAlpha = 0; } else if (wallpaperAlpha > 1.f) { wallpaperAlpha = 1.f; } // アルファ値を設定する. float oldalpha = this.wallpaperAlpha; if (oldalpha != wallpaperAlpha) { this.wallpaperAlpha = wallpaperAlpha; propertyChangeSupport.firePropertyChange("wallpaperAlpha", oldalpha, wallpaperAlpha); } } public Color getBackgroundColor() { return backgroundColor; } public void setBackgroundColor(Color backgroundColor) { // 現在のオフスクリーンを破棄する. disposeOffscreen(); // 色が省略された場合の補正. if (backgroundColor == null) { backgroundColor = Color.WHITE; } // 背景色を設定する. Color colorOld = this.backgroundColor; if ( !colorOld.equals(backgroundColor)) { this.backgroundColor = backgroundColor; propertyChangeSupport.firePropertyChange("backgroundColor", colorOld, backgroundColor); } } /** * 壁紙を左上(0,0)を原点に指定した幅・高さでタイル状に敷き詰めて描画します.
* 壁紙が設定されていなければ何もしません.
* アプリケーション設定でオフスクリーンの使用が有効である場合、グラフィクスコンテキストに * あわせてオフスクリーンイメージをあらかじめキャッシュとして作成して転送する.
* オフスクリーンは初回描画時に構築され、以降、必要に応じて再作成される.
* オフスクリーンを即座に破棄する場合には{@link #disposeOffscreen()}を呼び出す.
* @param g 描画先 * @param bgColor 背景色 * @param w 幅 (画面幅) * @param h 高さ (画面高) */ public void drawWallpaper(Graphics2D g, int w, int h) { drawWallpaper(g, w, h, false); } /** * 壁紙を左上(0,0)を原点に指定した幅・高さでタイル状に敷き詰めて描画します.
* 壁紙が設定されていなければ何もしません.
* アプリケーション設定でオフスクリーンの使用が有効である場合、グラフィクスコンテキストに * あわせてオフスクリーンイメージをあらかじめキャッシュとして作成して転送する.
* ただし、引数でオフスクリーンを使用しないと指定した場合はオフスクリーンには一切関知せず、 * 通常の画像による背景描画を行う.
* (この場合、オフスクリーンは作成されず、現在あるものを再作成も破棄もしない.) * @param g 描画先 * @param bgColor 背景色 * @param w 幅 (画面幅) * @param h 高さ (画面高) * @param noUseOffscreen オフスクリーンを使用しない.(たとえ利用可能であっても) */ public void drawWallpaper(Graphics2D g, int w, int h, boolean noUseOffscreen) { // 背景色 Color bgColor = getBackgroundColor(); // 背景色で塗りつぶす // (壁紙がある場合は不要) if (wallpaperImg == null) { fillBackgroundColor(g, bgColor, w, h); } // 壁紙を敷き詰める if (wallpaperImg != null) { // オフスクリーンによる背景描画が行われたか? boolean drawOffscreen = false; if ( !noUseOffscreen) { // オフクリーンサーフェイスのチェックまたは生成 AppConfig appConfig = AppConfig.getInstance(); if (appConfig.isEnableOffscreenWallpaper()) { checkOrCreateOffscreen(g, bgColor, w, h); } else { disposeOffscreen(); } // オフスクリーンフェイスが有効であれば、オフスクリーンで描画する. if (wallpaperVolatileImg != null) { int src_w = wallpaperVolatileImg.getWidth(); int src_h = wallpaperVolatileImg.getHeight(); drawWallpaper(g, w, h, wallpaperVolatileImg, src_w, src_h); // オフスクリーンがロストしていなければ // オフスクリーンで描画されたと判定する. drawOffscreen = !wallpaperVolatileImg.contentsLost(); } } // オフスクリーンサーフェイスで描画されていなければ通常の画像で描画する. if ( !drawOffscreen) { if (wallpaperVolatileImg != null && logger.isLoggable(Level.INFO)) { logger.log(Level.INFO, "offscreen is lost."); } fillBackgroundColor(g, bgColor, w, h); Composite oldcomp = g.getComposite(); try { float alpha = getWallpaperAlpha(); if (alpha < 1.f) { // アルファが100%の場合は、あえて設定しない. AlphaComposite comp = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); g.setComposite(comp); } int src_w = wallpaperImg.getWidth(); int src_h = wallpaperImg.getHeight(); drawWallpaper(g, w, h, wallpaperImg, src_w, src_h); } finally { g.setComposite(oldcomp); } } } } /** * 現在使用しているオフスクリーン用ネイティブリソースを破棄する.
*/ protected void disposeOffscreen() { if (wallpaperVolatileImg != null) { wallpaperVolatileImg.flush(); wallpaperVolatileImg = null; if (logger.isLoggable(Level.FINER)) { logger.log(Level.FINER, "オフスクリーンを破棄しました。"); } } } /** * オフスクリーンイメージが有効であるかチェックし、 * 有効でなければオフスクリーンを再作成、もしくは再描画する.
* オフスクリーンは背景画像と同じサイズで作成される.
* 背景画像が設定されていなければオフスクリーンも無効とする.
* @param g 実際のスクリーンデバイス(互換性あるオフスクリーンを作成するため) * @param bgColor 背景色 * @param offscreen_max_w オフスクリーンの最大サイズ(幅) * @param offscreen_max_h オフスクリーンの最大サイズ(高さ) */ protected void checkOrCreateOffscreen(Graphics2D g, Color bgColor, int offscreen_max_w, int offscreen_max_h) { if (wallpaperImg == null) { // 壁紙もと画像がなければ何もしない. disposeOffscreen(); return; } try { GraphicsConfiguration gConf = g.getDeviceConfiguration(); // オフスクリーンの状態を確認する. int validate = VolatileImage.IMAGE_INCOMPATIBLE; if (wallpaperVolatileImg != null) { validate = wallpaperVolatileImg.validate(gConf); if (logger.isLoggable(Level.FINEST)) { logger.log(Level.FINEST, "オフスクリーンの状態: " + validate); } } // 構築時の背景色と変更があるか? if (validate == VolatileImage.IMAGE_OK && (wallpaperVolatileBgColor != null && bgColor != null)) { if ( !wallpaperVolatileBgColor.equals(bgColor)) { validate = VolatileImage.IMAGE_RESTORED; } } // 壁紙元画像サイズ int src_w = wallpaperImg.getWidth(); int src_h = wallpaperImg.getHeight(); // オフスクリーンサイズの算定. // 要求された最大幅かアプリ設定の最大幅の小さいほうを最大幅とし、 // それが壁紙もと画像よりも小さければ壁紙サイズと同じとする. AppConfig appConfig = AppConfig.getInstance(); int offscreen_w = appConfig.getOffscreenWallpaperSize(); int offscreen_h = appConfig.getOffscreenWallpaperSize(); offscreen_w = Math.max(src_w, Math.min(offscreen_max_w, offscreen_w)); offscreen_h = Math.max(src_h, Math.min(offscreen_max_h, offscreen_h)); // ブロックサイズを満たすために必要な元サイズの繰り返し数 int nx = (int) ceil((double) offscreen_w / src_w); int ny = (int) ceil((double) offscreen_h / src_h); // 繰り返し数からブロックサイズに近い元サイズで割り切れるサイズを求める offscreen_w = src_w * nx; offscreen_h = src_h * ny; // オフスクリーンが有効、もしくは描画が必要である状態の場合にサイズのチェックを行う. if (validate == VolatileImage.IMAGE_OK || validate == VolatileImage.IMAGE_RESTORED) { int currentOffW = Math.max(1, wallpaperVolatileImg.getWidth()); int currentOffH = Math.max(1, wallpaperVolatileImg.getHeight()); double ratioW = ((double) offscreen_w / currentOffW); double ratioH = ((double) offscreen_h / currentOffH); // オフスクリーンの描画済みサイズが要求サイズの2割を超えるか割り込んだ場合は // 再作成が必要. if (ratioW < 0.8 || ratioW > 1.2 || ratioH < 0.8 || ratioH > 1.2) { validate = VolatileImage.IMAGE_INCOMPATIBLE; if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "オフスクリーンサイズの変更が必要です。: " + ratioW + "," + ratioH); } } } // オフスクリーンの状態が再構築または再描画が必要であるか? if (validate != VolatileImage.IMAGE_OK ) { // オフスクリーンがないか、コンパチでなくなっている場合はオフスクリーンを生成する. if (wallpaperVolatileImg == null || validate == VolatileImage.IMAGE_INCOMPATIBLE) { // 現在使用しているネイティブリソースを破棄する. disposeOffscreen(); // 新しいオフスクリーンサーフェイスを作成する. wallpaperVolatileImg = gConf.createCompatibleVolatileImage( offscreen_w, offscreen_h, Transparency.OPAQUE); if (wallpaperVolatileImg == null) { logger.log(Level.INFO, "オフスクリーンイメージは生成できません。"); } else { if (logger.isLoggable(Level.FINER)) { logger.log(Level.FINER, "オフスクリーンを構築しました。(サイズ:" + offscreen_w + "," + offscreen_h + ")"); } } } // 再描画する. if (wallpaperVolatileImg != null) { if (logger.isLoggable(Level.FINER)) { logger.log(Level.FINER, "オフスクリーンの描画 (サイズ:" + offscreen_w + "," + offscreen_h + ")"); } Graphics2D vg = wallpaperVolatileImg.createGraphics(); try { int ow = wallpaperVolatileImg.getWidth(); int oh = wallpaperVolatileImg.getHeight(); fillBackgroundColor(vg, bgColor, ow, oh); Composite oldcomp = vg.getComposite(); try { float alpha = getWallpaperAlpha(); if (alpha < 1.f) { // アルファが100%の場合は、あえて設定しない. AlphaComposite comp = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); vg.setComposite(comp); } drawWallpaper(vg, ow, oh, wallpaperImg, src_w, src_h); } finally { vg.setComposite(oldcomp); } } finally { vg.dispose(); } wallpaperVolatileBgColor = bgColor; } } } catch (RuntimeException ex) { logger.log(Level.SEVERE, "オフスクリーンイメージの生成中に例外が発生しました。", ex); // 現在使用しているネイティブリソースを破棄する. disposeOffscreen(); } } /** * 背景色で塗りつぶす * @param g 対象 * @param bgColor 背景色、nullの場合は何もしない. * @param w 幅 * @param h 高さ */ protected void fillBackgroundColor(Graphics2D g, Color bgColor, int w, int h) { if (bgColor == null) { return; } Color oldc = g.getColor(); try { Rectangle clip = g.getClipBounds(); if (clip == null) { clip = new Rectangle(0, 0, w, h); } g.setColor(bgColor); g.fill(clip); } finally { g.setColor(oldc); } } /** * 壁紙を指定の領域まで敷き詰めて描画する.
* @param g * @param w 敷き詰めるサイズ(幅) * @param h 敷き詰めるサイズ(高さ) * @param wallpaperImg 敷き詰める画像 * @param src_w 壁紙画像のサイズ * @param src_v 壁紙画像の高さ */ protected void drawWallpaper(Graphics2D g, int w, int h, Image wallpaperImg, int src_w, int src_h) { if (wallpaperImg == null) { return; } // 表示範囲で表示できる壁紙を表示できる個数 int nx = (int) ceil((double) w / src_w); int ny = (int) ceil((double) h / src_h); // 描画対象領域 Rectangle clip = g.getClipBounds(); // 描画対象領域にかかる壁紙を描画する. Rectangle rct = new Rectangle(0, 0, src_w, src_h); for (int iy = 0; iy <= ny; iy++) { for (int ix = 0; ix <= nx; ix++) { rct.x = ix * src_w; rct.y = iy * src_h; if (clip == null || clip.intersects(rct)) { g.drawImage( wallpaperImg, rct.x, rct.y, rct.x + rct.width, rct.y + rct.height, 0, 0, src_w, src_h, null ); } } } } /** * 壁紙を一定の大きさに敷き詰める.
* すでに十分大きい場合は何もしない.
* @param wallpaper 対象のイメージ * @return 拡張後のイメージ、もしくは同じイメージ */ protected BufferedImage makeExpandedWallpaper(BufferedImage wallpaper) { if (wallpaper == null) { return null; } // 敷き詰める画像の元サイズ int src_w = wallpaper.getWidth(); int src_h = wallpaper.getHeight(); // ブロックサイズよりも元サイズが大きければ何もしない. if (src_w > wallpaperPreferredWidth && src_h > wallpaperPreferredHeight) { return wallpaper; } // ブロックサイズを満たすために必要な元サイズの繰り返し数 int nx = (int) ceil((double) wallpaperPreferredWidth / src_w); int ny = (int) ceil((double) wallpaperPreferredHeight / src_h); // 繰り返し数からブロックサイズに近い元サイズで割り切れるサイズを求める int w = src_w * nx; int h = src_h * ny; // ブロックサイズまで元画像を敷き詰める BufferedImage wallpaperNew = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g = wallpaperNew.createGraphics(); try { drawWallpaper(g, w, h, wallpaper, src_w, src_h); } finally { g.dispose(); } return wallpaperNew; } public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(propertyName, listener); } } CharacterManaJ/src/main/java/charactermanaj/ui/model/0000755000175000017500000000000013615720000022677 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/ui/model/AbstractTableModelWithComboBoxModel.java0000644000175000017500000001132713615720000032510 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.awt.Toolkit; import java.util.ArrayList; import java.util.LinkedList; import javax.swing.ComboBoxModel; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import javax.swing.table.AbstractTableModel; public /** * テーブルモデルをベースに、それをコンボボックスモデルとしても利用できるように拡張した抽象基底クラス.
* @author seraphy */ abstract class AbstractTableModelWithComboBoxModel extends AbstractTableModel implements ComboBoxModel { private static final long serialVersionUID = -6775939667002896930L; protected ArrayList elements = new ArrayList(); private boolean editable = true; public boolean removeRow(int rowIndex) { if (rowIndex < 0 || rowIndex >= elements.size()) { return false; } elements.remove(rowIndex); fireTableRowsDeleted(rowIndex, rowIndex); return true; } /** * 編集可能フラグ.
* モデル自身は、このフラグについて何ら関知せず、常に編集可能である.
* @param editable */ public void setEditable(boolean editable) { this.editable = editable; } /** * 編集可能フラグ.
* モデル自身は、このフラグについて何ら関知せず、常に編集可能である.
* 初期状態でtrueである.
* @return */ public boolean isEditable() { return editable; } public void clear() { elements.clear(); fireTableDataChanged(); } public T getRow(int index) { return elements.get(index); } public Object getElementAt(int index) { return getRow(index); } public boolean addRow(T obj) { if (obj == null) { throw new IllegalArgumentException(); } boolean ret = elements.add(obj); int row = elements.size() - 1; fireTableRowsInserted(row, row); return ret; } public int moveUp(int rowIndex) { if (rowIndex < 1 || rowIndex >= elements.size()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return rowIndex; } T value = elements.get(rowIndex); elements.remove(rowIndex); elements.add(rowIndex - 1, value); fireTableRowsUpdated(rowIndex -1, rowIndex); return rowIndex - 1; } public int moveDown(int rowIndex) { if (rowIndex < 0 || rowIndex >= elements.size() - 1) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return rowIndex; } T value = elements.get(rowIndex); elements.remove(rowIndex); elements.add(rowIndex + 1, value); fireTableRowsUpdated(rowIndex, rowIndex + 1); return rowIndex + 1; } ///////////////////////////////////////// @Override public void fireTableCellUpdated(int row, int column) { super.fireTableCellUpdated(row, column); fireListUpdated(row, row); } @Override public void fireTableRowsDeleted(int firstRow, int lastRow) { super.fireTableRowsDeleted(firstRow, lastRow); fireListRemoved(firstRow, lastRow); } @Override public void fireTableRowsInserted(int firstRow, int lastRow) { super.fireTableRowsInserted(firstRow, lastRow); fireListAdded(firstRow, lastRow); } @Override public void fireTableRowsUpdated(int firstRow, int lastRow) { super.fireTableRowsUpdated(firstRow, lastRow); fireListUpdated(firstRow, lastRow); } @Override public void fireTableDataChanged() { super.fireTableDataChanged(); int siz = getRowCount(); if (siz > 0) { fireListUpdated(0, siz - 1); } } public int getRowCount() { return elements.size(); } ////////////////////////////// private Object selectedObject; private LinkedList listDataListeners = new LinkedList(); public Object getSelectedItem() { return selectedObject; } public void setSelectedItem(Object anItem) { selectedObject = anItem; } public void removeListDataListener(ListDataListener l) { if (l != null) { listDataListeners.remove(l); } } public void addListDataListener(ListDataListener l) { if (l != null) { listDataListeners.add(l); } } public void fireListUpdated(int firstRow, int lastRow) { ListDataEvent e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, firstRow, lastRow); for (ListDataListener listener : listDataListeners) { listener.contentsChanged(e); } } public void fireListAdded(int firstRow, int lastRow) { ListDataEvent e = new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, firstRow, lastRow); for (ListDataListener listener : listDataListeners) { listener.intervalAdded(e); } } public void fireListRemoved(int firstRow, int lastRow) { ListDataEvent e = new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, firstRow, lastRow); for (ListDataListener listener : listDataListeners) { listener.intervalRemoved(e); } } public int getSize() { return getRowCount(); } } CharacterManaJ/src/main/java/charactermanaj/ui/model/ActiveCustomLayerPatternMgr.java0000644000175000017500000001734413615720000031162 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.CustomLayerOrderMapper; import charactermanaj.model.Layer; import charactermanaj.model.LayerOrderMapper; /** * アクティブなカスタムレイヤーパターンのリストを管理する。 */ public class ActiveCustomLayerPatternMgr { /** * 認識している、すべてのカスタムレイヤーパターンを保持する */ private final Map> customLayerPatternMap = new HashMap>(); /** * 現在有効にしているカスタムレイヤーパターン名を保持する */ private final Set activeCustomLayers = new HashSet(); /** * カスタムレイヤーパターンと有効にしているパターン名から現在有効なレイヤーマッピングを導出する。 * まだ導出されていないかリセットされた場合はnull */ private transient CustomLayerOrderMapper customLayerOrderMapper; /** * レイヤーパターンの一覧を取得する。 * * @return map パターン名をキーとし、カスタムレイヤー順のリストを値とするマップ */ public Map> getMap() { return customLayerPatternMap; } /** * レイヤーパターンの一覧を設定する。 * (現在のパターン一覧はクリアされる。) * @param map パターン名をキーとし、カスタムレイヤー順のリストを値とするマップ */ public void setMap(Map> map) { customLayerPatternMap.clear(); customLayerPatternMap.putAll(map); activeCustomLayers.retainAll(customLayerPatternMap.keySet()); // 現在存在するパターン名に絞り込む customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。 } /** * すべてのレイヤーパターンのキーとレイヤー順リストについて、パターンの表示名順にソートしたエントリリストとして返す。 * @return ソートされたエントリーリスト */ public List>> getOrderedEntries() { List>> entries = new ArrayList>>(customLayerPatternMap.entrySet()); Collections.sort(entries, new Comparator>>() { @Override public int compare(Entry> o1, Entry> o2) { CustomLayerOrderKey k1 = o1.getKey(); CustomLayerOrderKey k2 = o2.getKey(); return CustomLayerOrderKey.COMPARATOR.compare(k1, k2); } }); return entries; } /** * アクティブなカスタムレイヤー順定義でカスタムレイヤー順序索引を行うようにする。 */ public void initActiveCustomLayerOrderMap() { initCustomLayerOrderMap(getActiveCustomLayerOrderList()); } /** * リストで指定したカスタムレイヤー順定義でカスタムレイヤー順序索引を行うようにする。 * @param orderList カスタムレイヤー順定義、nullの場合はすべてレイヤーの規定値となる。 */ public void initCustomLayerOrderMap(List orderList) { customLayerOrderMapper = new CustomLayerOrderMapper(orderList); } /** * 現在設定されているカスタムレイヤー順序索引を取得する。 * @see {@link #initCustomLayerOrderMap(List)} * @return */ public LayerOrderMapper getLayerOrderMapper() { if (customLayerOrderMapper == null) { initActiveCustomLayerOrderMap(); } return customLayerOrderMapper; } /** * 現在有効なカスタムレイヤーパターン名の一覧のコピーを取得する。 * (返される順序は不定です。) * @return */ public Set getActivePatternNames() { return new HashSet(activeCustomLayers); } /** * 現在有効なカスタムレイヤー定義リストを取得する * @return */ public List getActiveCustomLayerOrderList() { List mergedList = new ArrayList(); for (CustomLayerOrderKey patternName : activeCustomLayers) { List list = customLayerPatternMap.get(patternName); if (list != null) { for (CustomLayerOrder layerOrder : list) { if (layerOrder != null && !mergedList.contains(layerOrder)) { mergedList.add(layerOrder); } } } } return mergedList; } /** * レイヤーパターンの選択状態を取得する * @param name * @return */ public boolean isSelected(CustomLayerOrderKey name) { return activeCustomLayers.contains(name); } /** * レイヤーパターンの選択状態を設定する * @param name * @param selected */ public void setSelected(CustomLayerOrderKey name, boolean selected) { if (customLayerPatternMap.containsKey(name)) { if (selected) { unselectConflict(name); activeCustomLayers.add(name); } else { activeCustomLayers.remove(name); } customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。 } } /** * 現在のアクティブなレイヤーパターンの一覧を一括更新する。 * @param patternNames */ public void setActivePatternNames(Set patternNames) { activeCustomLayers.clear(); for (CustomLayerOrderKey name : patternNames) { if (customLayerPatternMap.containsKey(name)) { unselectConflict(name); activeCustomLayers.add(name); } } customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。 } /** * 選択するレイヤーパターンと重複するレイヤーをもつパターンがすでに選択されている場合、 * その選択を解除する。 * @param name 選択するレイヤーパターン */ private void unselectConflict(CustomLayerOrderKey orderKey) { // 指定されたパターン名が使用しているレイヤー一覧を作成する。 Set targetLayers = new HashSet(); List targetLayerOrders = customLayerPatternMap.get(orderKey); if (targetLayerOrders != null) { for (CustomLayerOrder layerOrder : targetLayerOrders) { targetLayers.add(layerOrder.getLayer()); } } // 現在選択しているレイヤーパターンから、 // これから選択しようとしているレイヤーを含んでいる(衝突)パターンを検出する ArrayList conflictPatterns = new ArrayList(); for (CustomLayerOrderKey patternName : activeCustomLayers) { if (!patternName.equals(orderKey)) { // 自分と同一名であれば検査の必要なし List layerOrders = customLayerPatternMap.get(patternName); if (layerOrders != null) { for (CustomLayerOrder layerOrder : layerOrders) { Layer layer = layerOrder.getLayer(); if (targetLayers.contains(layer)) { // ターゲットにレイヤーが含まれている場合は、このパターンの選択は解除する conflictPatterns.add(patternName); break; } } } } } // 衝突のあるパターン名を現在の選択から除外する activeCustomLayers.removeAll(conflictPatterns); } }CharacterManaJ/src/main/java/charactermanaj/ui/model/ColorChangeEvent.java0000644000175000017500000000161013615720000026726 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.util.EventObject; import charactermanaj.model.Layer; import charactermanaj.ui.ColorDialog; public class ColorChangeEvent extends EventObject { private static final long serialVersionUID = -4185234778107466586L; private Layer layer; private boolean cascaded; public ColorChangeEvent(ColorDialog colorDialog, Layer layer) { this(colorDialog, layer, false); } public ColorChangeEvent(ColorChangeEvent src, boolean cascaded) { this((ColorDialog) src.getSource(), src.getLayer(), cascaded); } protected ColorChangeEvent(ColorDialog colorDialog, Layer layer, boolean cascaded) { super(colorDialog); if (layer == null) { throw new IllegalArgumentException("null layer"); } this.layer = layer; this.cascaded = cascaded; } public Layer getLayer() { return layer; } public boolean isCascaded() { return cascaded; } } CharacterManaJ/src/main/java/charactermanaj/ui/model/PredefinedWallpaper.java0000644000175000017500000000451613615720000027465 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Properties; import charactermanaj.util.LocalizedMessageAware; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * 定義済み壁紙 * @author seraphy */ public class PredefinedWallpaper implements Comparable, LocalizedMessageAware { private static final String PREDEFINED_WALLPAPER_RESOURCE = "images/wallpaper"; private final String key; private final String msgid; private final String resource; protected PredefinedWallpaper(String key, String msgid, String resource) { this.key = key; this.msgid = msgid; this.resource = resource; } public String getLocalizedResourceId() { return "predefinedWallpaper." + msgid; } public String getKey() { return key; } public String getMsgid() { return msgid; } public String getResource() { return resource; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof PredefinedWallpaper) { PredefinedWallpaper o = (PredefinedWallpaper) obj; return key.equals(o.key); } return false; } @Override public int hashCode() { return key.hashCode(); } public int compareTo(PredefinedWallpaper o) { return key.compareTo(o.key); } @Override public String toString() { return msgid; } /** * 定義済み壁紙リソースのリストを取得する * @return 定義済み壁紙リソースリスト */ public static List getPredefinedWallpapers() { Properties predefinedWallpapers = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(PREDEFINED_WALLPAPER_RESOURCE); ArrayList results = new ArrayList(); for (Map.Entry entry : predefinedWallpapers.entrySet()) { String key = (String) entry.getKey(); String value = (String) entry.getValue(); String msgid; int pt = value.indexOf(';'); if (pt >= 0) { msgid = value.substring(pt + 1); } else { msgid = value; } PredefinedWallpaper predefinedWallpaper = new PredefinedWallpaper( key, msgid, "images/" + key); results.add(predefinedWallpaper); } Collections.sort(results); return results; } }CharacterManaJ/src/main/java/charactermanaj/ui/model/SimpleComboBoxModel.java0000644000175000017500000000727413615720000027417 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.util.AbstractList; import java.util.ArrayList; import java.util.List; import javax.swing.ComboBoxModel; import javax.swing.event.EventListenerList; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; /** * コンボボックスのリストへの追加によって自動的に現在選択が設定されないシンプルな動きをするコンボボックスのモデル。 * リストの削除時に現在選択中のものが削除される場合は、現在選択は解除される。 * * @param */ public class SimpleComboBoxModel extends AbstractList implements ComboBoxModel { private EventListenerList listeners = new EventListenerList(); private List items; private Object selectedItem; public SimpleComboBoxModel() { this(new ArrayList()); } public SimpleComboBoxModel(List items) { this.items = items; } public void setAll(List items) { this.items.clear(); if (items != null) { this.items.addAll(items); } ListDataListener[] ls = listeners.getListeners(ListDataListener.class); if (ls.length > 0) { ListDataEvent evt = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, this.items.size()); for (ListDataListener l : ls) { l.contentsChanged(evt); } } } @Override public S get(int index) { return items.get(index); } @Override public int size() { return items.size(); } @Override public int getSize() { return size(); } @Override public Object getElementAt(int index) { return get(index); } @SuppressWarnings("unchecked") public boolean add(S element) { int found = -1; // 自然ソート順で挿入位置を求める int len = items.size(); for (int idx = 0; idx < len; idx++) { S v = items.get(idx); int comp = ((Comparable) element).compareTo(v); if (comp < 0) { break; } found = idx; } add(found + 1, element); return true; } @Override public void add(int index, S element) { items.add(index, element); ListDataListener[] ls = listeners.getListeners(ListDataListener.class); if (ls.length > 0) { ListDataEvent evt = new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index); for (ListDataListener l : ls) { l.intervalAdded(evt); } } } @Override public S set(int index, S element) { S old = items.set(index, element); ListDataListener[] ls = listeners.getListeners(ListDataListener.class); if (ls.length > 0) { ListDataEvent evt = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index); for (ListDataListener l : ls) { l.contentsChanged(evt); } } return old; } @Override public S remove(int index) { S old = items.remove(index); ListDataListener[] ls = listeners.getListeners(ListDataListener.class); if (ls.length > 0) { ListDataEvent evt = new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index); for (ListDataListener l : ls) { l.intervalRemoved(evt); } } if (old != null && old.equals(selectedItem)) { setSelectedItem(null); } return old; } @Override public void addListDataListener(ListDataListener l) { listeners.add(ListDataListener.class, l); } @Override public void removeListDataListener(ListDataListener l) { listeners.remove(ListDataListener.class, l); } @Override public void setSelectedItem(Object anItem) { this.selectedItem = anItem; ListDataListener[] ls = listeners.getListeners(ListDataListener.class); if (ls.length > 0) { ListDataEvent evt = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, -1, -1); for (ListDataListener l : ls) { l.contentsChanged(evt); } } } @Override public Object getSelectedItem() { return selectedItem; } }CharacterManaJ/src/main/java/charactermanaj/ui/model/ColorGroupCoordinator.java0000644000175000017500000001761013615720000030046 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.model.ColorGroup; import charactermanaj.model.ColorInfo; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsColorInfo; import charactermanaj.model.PartsColorManager; import charactermanaj.model.PartsIdentifier; import charactermanaj.ui.ColorDialog; /** * 同一カラーグループでの連動をサポートするためのコーディネータオブジェクト.
* @author seraphy */ public class ColorGroupCoordinator { /** * パーツの選択状態を管理するマネージャ.
*/ private final PartsSelectionManager partsSelectionMrg; /** * 色ダイアログのコレクション */ private final LinkedList colorDialogs = new LinkedList(); /** * カラーグループの変更通知を受けるリスナーのコレクション.
*/ private final LinkedList listeners = new LinkedList(); /** * パーツ識別子ごとの色情報を管理するパーツカラーマネージャ */ private final PartsColorManager partsColorMrg; /** * 色ダイアログからの通知を受け取るリスナ.(自クラス内オブジェクト) */ protected final ColorChangeListener listener; /** * コンストラクタ * @param partsSelectionMrg パーツの選択を管理するマネージャ * @param partsColorMrg パーツ識別子ごとの色を管理するマネージャ */ public ColorGroupCoordinator(PartsSelectionManager partsSelectionMrg, PartsColorManager partsColorMrg) { if (partsSelectionMrg == null || partsColorMrg == null) { throw new IllegalArgumentException(); } this.partsSelectionMrg = partsSelectionMrg; this.partsColorMrg = partsColorMrg; listener = new ColorChangeListener() { public void onColorChange(ColorChangeEvent event) { Layer layer = event.getLayer(); ColorDialog colorDialog = (ColorDialog) event.getSource(); PartsCategory partsCategory = colorDialog.getPartsCategory(); ColorGroupCoordinator.this.syncColorGroup(partsCategory, layer, colorDialog); ColorGroupCoordinator.this.fireColorChangeEvent(event); } public void onColorGroupChange(ColorChangeEvent event) { Layer layer = event.getLayer(); ColorDialog colorDialog = (ColorDialog) event.getSource(); ColorGroup colorGroup = colorDialog.getColorGroup(layer); ColorGroupCoordinator.this.onChangeColorGroup(colorDialog, layer, colorGroup); ColorGroupCoordinator.this.fireColorGroupChangeEvent(event); } }; } /** * カラーダイアログを登録する.
* @param colorDialog カラーダイアログ */ public void registerColorDialog(ColorDialog colorDialog) { if (colorDialog == null) { throw new IllegalArgumentException(); } this.colorDialogs.add(colorDialog); colorDialog.addColorChangeListener(listener); } /** * カラーダイアログの登録を解除する.
* @param colorDialog カラーダイアログ */ public void unregisterColorDialog(ColorDialog colorDialog) { Iterator ite = colorDialogs.iterator(); while (ite.hasNext()) { ColorDialog dlg = ite.next(); if (dlg == colorDialog) { dlg.removeColorChangeListener(listener); ite.remove(); } } } /** * カラーグループが変更されたことを通知するリスナを登録する.
* @param listener リスナー */ public void addColorChangeListener(ColorChangeListener listener) { if (listener == null) { throw new IllegalArgumentException(); } listeners.add(listener); } /** * カラーグループが変更されたことを通知するリスナを登録解除する.
* @param listener リスナー */ public void removeColorChangeListener(ColorChangeListener listener) { listeners.remove(listener); } protected void fireColorChangeEvent(ColorChangeEvent e) { if (e == null) { throw new IllegalArgumentException(); } for (ColorChangeListener listener : listeners) { listener.onColorChange(e); } } protected void fireColorGroupChangeEvent(ColorChangeEvent e) { if (e == null) { throw new IllegalArgumentException(); } for (ColorChangeListener listener : listeners) { listener.onColorGroupChange(e); } } protected void onChangeColorGroup(ColorDialog destColorDialog, Layer layer, ColorGroup colorGroup) { if (destColorDialog == null || layer == null || colorGroup == null) { throw new IllegalArgumentException(); } for (ColorDialog colorDlg : colorDialogs) { for (Layer srcLayer : colorDlg.getPartsCategory().getLayers()) { if (!srcLayer.equals(layer)) { if (ColorGroup.equals(colorGroup, colorDlg.getColorGroup(srcLayer)) && colorDlg.isSyncColorGroup(srcLayer)) { ColorConvertParameter param = colorDlg.getColorConvertParameter(srcLayer); destColorDialog.setColorConvertParameter(layer, param); break; } } } } } /** * パーツの色ダイアログが変更されたことにより、同一の他のカラーグループのレイヤーのカラーダイアログの設定値をコピーする.
* (色ダイアログのパラメータ変更により呼び出される.)
* @param partsCategory パーツカテゴリ * @param eventSourceLayer 変更もとのレイヤー * @param sourceColorDialog 変更されたカラーダイアログ */ public void syncColorGroup(PartsCategory partsCategory, Layer eventSourceLayer, ColorDialog sourceColorDialog) { if (partsCategory == null || sourceColorDialog == null) { throw new IllegalArgumentException(); } // 変更もと ArrayList syncSources = new ArrayList(); if (eventSourceLayer != null) { if (sourceColorDialog.isSyncColorGroup(eventSourceLayer)) { syncSources.add(eventSourceLayer); } } else { for (Layer layer2 : partsCategory.getLayers()) { if (sourceColorDialog.isSyncColorGroup(layer2)) { syncSources.add(layer2); } } } // 変更もとのレイヤーのカラーグループを他のレイヤーにも適用する. for (Layer sourceLayer : syncSources) { ColorGroup sourceColorGroup = sourceColorDialog.getColorGroup(sourceLayer); if (sourceColorGroup != null && sourceColorGroup.isEnabled()) { ColorConvertParameter param = sourceColorDialog.getColorConvertParameter(sourceLayer); // 他のパネルに適用する for (ColorDialog targetColorDialog : colorDialogs) { for (Layer targetLayer : targetColorDialog.getPartsCategory().getLayers()) { if (!targetLayer.equals(sourceLayer)) { if (ColorGroup.equals(targetColorDialog.getColorGroup(targetLayer), sourceColorGroup)) { if (targetColorDialog.isSyncColorGroup(targetLayer)) { targetColorDialog.setColorConvertParameter(targetLayer, param); } } } } } // 色ダイアログで選択中でない有効なパーツも含めてパーツカラーを更新する. for (PartsCategory targetPartsCategory : partsSelectionMrg.getAllCategories()) { Collection selectedPartss = partsSelectionMrg.getSelectedPartsIdentifiers(targetPartsCategory); for (PartsIdentifier partsIdentifier : selectedPartss) { // カラーダイアログで選択されていない他のパーツも含めてパーツカラーを更新する. PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(partsIdentifier, true); for (Map.Entry entry : partsColorInfo.entrySet()) { ColorInfo colorInfo = entry.getValue(); if (ColorGroup.equals(sourceColorGroup, colorInfo.getColorGroup())) { if (colorInfo.isSyncColorGroup()) { colorInfo.setColorParameter(param); } } } } } } } } } CharacterManaJ/src/main/java/charactermanaj/ui/model/WallpaperFactory.java0000644000175000017500000001622013615720000027022 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import charactermanaj.graphics.io.EmbeddedImageResource; import charactermanaj.graphics.io.FileImageResource; import charactermanaj.graphics.io.ImageLoaderImpl; import charactermanaj.graphics.io.ImageResource; import charactermanaj.graphics.io.LoadedImage; import charactermanaj.ui.Wallpaper; import charactermanaj.ui.model.WallpaperInfo.WallpaperResourceType; /** * 壁紙情報から壁紙オブジェクトを作成するファクトリクラス.
* @author seraphy */ public class WallpaperFactory { /** * エラーが発生した場合にハンドリングするインターフェィス.
* ハンドラは、そのままエラーを送出するか、もしくは回復して続行させることができる.
* @author seraphy */ public interface ErrorHandler { /** * 指定された壁紙ファイルが、ファイルとして実在しない場合のエラー.
* 代わりのファイルを指定するかnullを返して画像なしとして扱うか、 * もしくは例外を送出することができる.
* @param wallpaperInfo 設定対象(回復時には更新可能) * @param file 対象となったファイル * @return 読み替えるファイル、nullの場合は画像なしとみなす. * @throws WallpaperFactoryException 例外とする場合 */ File missingImageFile(WallpaperInfo wallpaperInfo, File file) throws WallpaperFactoryException; /** * 指定した画像リソースの読み込みに失敗した場合のエラー.
* 代わりの画像を指定するかnullを返して画像なしとして扱うか、 * もしくは例外を送出することができる.
* @param wallpaperInfo 設定対象(回復時には更新可能) * @param imageResource 対象となった画像リソース * @param ex 失敗事由 * @return 代わりの画像、もしくは画像なしとするためにnullを返すことができる * @throws WallpaperFactoryException 例外とする場合 */ BufferedImage imageCreationFailed(WallpaperInfo wallpaperInfo, ImageResource imageResource, Throwable ex) throws WallpaperFactoryException; /** * その他の内部例外(RuntimeException)が発生した場合のハンドラ.
* 代わりの壁紙オブジェクトを返すか、もしくは例外を送出することができる.
* @param wallpaperInfo 壁紙情報 * @param wallpaper 構築中の壁紙オブジェクト * @param ex 発生した例外 * @return 代わりの壁紙オブジェクト (nullは返してはならない.) * @throws WallpaperFactoryException 例外とする場合 */ Wallpaper internalError(WallpaperInfo wallpaperInfo, Wallpaper wallpaper, Throwable ex) throws WallpaperFactoryException; } /** * 壁紙画像を読み取るためのイメージローダ.
*/ private ImageLoaderImpl imageLoader = new ImageLoaderImpl(); /** * シングルトン */ private static final WallpaperFactory inst = new WallpaperFactory(); /** * エラーを例外として送出する既定のハンドラ.
*/ public final ErrorHandler defaultErrorHandler = new WallpaperFactoryDefaultErrorHandler(); private WallpaperFactory() { super(); } public static WallpaperFactory getInstance() { return inst; } /** * 壁紙情報から壁紙オブジェクトを作成して返します.
* 壁紙情報に不備があるか何らかの問題により壁紙が作成できない場合はエラーハンドラが呼び出されます.
* エラーハンドラは例外を送出するか、もしくは回復して続行させることができます.
* 引数に渡される壁紙情報はエラーハンドラにより修復される可能性があります.
* @param wallpaperInfo 壁紙情報、nullの場合はデフォルト設定が用いられる. * @param errorHandler エラーハンドラ、省略した場合は{@link #DEFAULT_ERROR_HANDLER}が用いられる. * @return 生成された壁紙オブジェクト * @throws WallpaperFactoryException 壁紙オブジェクトの生成に失敗したことを通知する例外 */ public Wallpaper createWallpaper(WallpaperInfo wallpaperInfo, ErrorHandler errorHandler) throws WallpaperFactoryException { if (wallpaperInfo == null) { return new Wallpaper(); } if (errorHandler == null) { errorHandler = defaultErrorHandler; } Wallpaper wallpaper = new Wallpaper(); try { // 背景画像の設定. WallpaperResourceType typ = wallpaperInfo.getType(); ImageResource imageResource = null; if (typ == WallpaperResourceType.FILE) { // 選択ファイルから File imageFile = wallpaperInfo.getFile(); if (imageFile == null || !imageFile.exists() || !imageFile.isFile() || !imageFile.canRead()) { // ハンドラによってエラーを通知するか、もしくは回復する. imageFile = errorHandler.missingImageFile(wallpaperInfo, imageFile); } if (imageFile != null) { imageResource = new FileImageResource(imageFile); } } else if (typ == WallpaperResourceType.PREDEFINED) { // リソースファイルから String resource = wallpaperInfo.getResource(); if (resource != null && resource.trim().length() > 0) { imageResource = new EmbeddedImageResource(resource); } } BufferedImage wallpaperImg = null; if (imageResource != null) { try { LoadedImage wallpaperLoadedImage = imageLoader.load(imageResource); wallpaperImg = wallpaperLoadedImage.getImage(); } catch (IOException ex) { // ハンドラによってエラーを通知するか、もしくは回復する. wallpaperImg = errorHandler.imageCreationFailed(wallpaperInfo, imageResource, ex); } } wallpaper.setWallpaperImage(wallpaperImg); // アルファ値 wallpaper.setWallpaperAlpha(wallpaperInfo.getAlpha()); // 背景色 wallpaper.setBackgroundColor(wallpaperInfo.getBackgroundColor()); } catch (RuntimeException ex) { // ハンドラによってエラーを通知するか、もしくは回復する. wallpaper = errorHandler.internalError(wallpaperInfo, wallpaper, ex); if (wallpaper == null) { throw ex; } } return wallpaper; } } /** * 壁紙を構築時に問題があった場合に例外を送出するエラーハンドラ.
* @author seraphy */ class WallpaperFactoryDefaultErrorHandler implements WallpaperFactory.ErrorHandler { public BufferedImage imageCreationFailed(WallpaperInfo wallpaperInfo, ImageResource imageResource, Throwable ex) throws WallpaperFactoryException { throw new WallpaperFactoryException("image creation failed: " + imageResource, ex); } public Wallpaper internalError(WallpaperInfo wallpaperInfo, Wallpaper wallpaper, Throwable ex) throws WallpaperFactoryException { throw new WallpaperFactoryException("internal error: " + (ex == null ? "" : ex.getMessage()), ex); } public File missingImageFile(WallpaperInfo wallpaperInfo, File file) throws WallpaperFactoryException { throw new WallpaperFactoryException("missing image file: " + file); } } CharacterManaJ/src/main/java/charactermanaj/ui/model/FavoritesChangeEvent.java0000644000175000017500000000112513615720000027613 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.util.EventObject; import charactermanaj.model.CharacterData; /** * お気に入り変更イベント.
* * @author seraphy */ public class FavoritesChangeEvent extends EventObject { /** * シリアライズバージョンID */ private static final long serialVersionUID = 3206827658882098336L; private CharacterData characterData; public FavoritesChangeEvent(Object src, CharacterData characterData) { super(src); this.characterData = characterData; } public CharacterData getCharacterData() { return characterData; } } CharacterManaJ/src/main/java/charactermanaj/ui/model/WallpaperFactoryErrorRecoverHandler.java0000644000175000017500000000470013615720000032660 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.awt.image.BufferedImage; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.graphics.io.ImageResource; import charactermanaj.ui.Wallpaper; import charactermanaj.ui.model.WallpaperInfo.WallpaperResourceType; /** * 壁紙オブジェクトの構築に回復しながら継続するためのハンドラ.
* @author seraphy */ public class WallpaperFactoryErrorRecoverHandler implements WallpaperFactory.ErrorHandler { protected static final Logger logger = Logger.getLogger(WallpaperFactoryErrorRecoverHandler.class.getName()); private boolean errorOccured = false; private boolean recovered = false; /** * 何らかのエラーが発生し回復できなかった場合 * @return */ public boolean isErrorOccured() { return errorOccured; } /** * 何らかのエラーが発生したが回復された場合 * @return */ public boolean isRecovered() { return recovered; } public void setErrorOccured(boolean errorOccured) { this.errorOccured = errorOccured; } public void setRecovered(boolean recovered) { this.recovered = recovered; } public File missingImageFile(WallpaperInfo wallpaperInfo, File file) throws WallpaperFactoryException { if (file == null) { logger.log(Level.FINE, "壁紙ファイルの指定がありません."); } else { logger.log(Level.WARNING, "壁紙ファイルが存在しないか読み込みできません:" + file); } // ファイルは、もとより指定されていなかったものとして回復する. wallpaperInfo.setType(WallpaperResourceType.NONE); setRecovered(true); return null; } public BufferedImage imageCreationFailed(WallpaperInfo wallpaperInfo, ImageResource imageResource, Throwable ex) throws WallpaperFactoryException { logger.log(Level.WARNING, "壁紙ファイルの読み込みに失敗しました。:" + imageResource, ex); // ファイルは、もとより指定されていなかったものとして回復する. wallpaperInfo.setType(WallpaperResourceType.NONE); setRecovered(true); return null; } public Wallpaper internalError(WallpaperInfo wallpaperInfo, Wallpaper wallpaper, Throwable ex) throws WallpaperFactoryException { logger.log(Level.WARNING, "壁紙の構築に失敗しました。" + wallpaperInfo, ex); setErrorOccured(true); throw new WallpaperFactoryException("internal error: " + ex, ex); } } CharacterManaJ/src/main/java/charactermanaj/ui/model/ColorChangeListener.java0000644000175000017500000000034613615720000027437 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.util.EventListener; public interface ColorChangeListener extends EventListener { void onColorChange(ColorChangeEvent event); void onColorGroupChange(ColorChangeEvent event); } CharacterManaJ/src/main/java/charactermanaj/ui/model/WallpaperFactoryException.java0000644000175000017500000000070513615720000030702 0ustar paulliupaulliupackage charactermanaj.ui.model; /** * 壁紙の構築エラー.
* @author seraphy */ public class WallpaperFactoryException extends Exception { private static final long serialVersionUID = 6160297739997949904L; public WallpaperFactoryException() { super(); } public WallpaperFactoryException(String message) { super(message); } public WallpaperFactoryException(String message, Throwable cause) { super(message, cause); } } CharacterManaJ/src/main/java/charactermanaj/ui/model/WallpaperInfo.java0000644000175000017500000000505113615720000026306 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.awt.Color; import java.io.File; /** * 壁紙情報.
* @author seraphy */ public class WallpaperInfo implements Cloneable { /** * 壁紙のリソースタイプ * @author seraphy */ public enum WallpaperResourceType { /** * なし */ NONE, /** * ファイル */ FILE, /** * 定義済み */ PREDEFINED } /** * 壁紙リソースのタイプ */ private WallpaperResourceType type = WallpaperResourceType.NONE; /** * ファイル */ private File file; /** * リソース */ private String resource; /** * 壁紙のアルファ値 */ private float alpha = 1.f; /** * 背景色 */ private Color backgroundColor = Color.WHITE; @Override public WallpaperInfo clone() { try { return (WallpaperInfo) super.clone(); } catch (CloneNotSupportedException ex) { throw new RuntimeException(ex); } } public WallpaperResourceType getType() { return type; } public void setType(WallpaperResourceType type) { if (type == null) { type = WallpaperResourceType.NONE; } this.type = type; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getResource() { return resource; } public void setResource(String resource) { if (resource != null) { resource = resource.trim(); if (resource.length() == 0) { resource = null; } } this.resource = resource; } /** * 背景画像のアルファ値を取得する. * @return アルファ値 */ public float getAlpha() { return alpha; } /** * 背景画像のアルファ値を設定する.
* 範囲は0から1の間であり、それを超えた場合は制限される.
* @param alpha アルファ値 */ public void setAlpha(float alpha) { if (alpha < 0) { alpha = 0; } else if (alpha > 1.f) { alpha = 1.f; } this.alpha = alpha; } /** * 背景色を取得する. * @return 背景色 */ public Color getBackgroundColor() { return backgroundColor; } /** * 背景色を設定する.
* nullを指定した場合は白とみなす.
* @param backgroundColor 背景色 */ public void setBackgroundColor(Color backgroundColor) { if (backgroundColor == null) { backgroundColor = Color.WHITE; } this.backgroundColor = backgroundColor; } @Override public String toString() { return "(WallpaperInfo:(type:" + type + ")(file:" + file + ")(resource:" + resource + ")(alpha:" + alpha + ")(bgColor:" + backgroundColor + "))"; } } CharacterManaJ/src/main/java/charactermanaj/ui/model/FavoritesChangeObserver.java0000644000175000017500000000310413615720000030320 0ustar paulliupaulliupackage charactermanaj.ui.model; import javax.swing.event.EventListenerList; import charactermanaj.model.CharacterData; /** * お気に入りが変更されたことを通知するためのメカニズム.
* * @author seraphy * */ public abstract class FavoritesChangeObserver { private static FavoritesChangeObserver defobj = new FavoritesChangeObserverImpl(); public static FavoritesChangeObserver getDefault() { return defobj; } public abstract void addFavoritesChangeListener(FavoritesChangeListener l); public abstract void removeFavoritesChangeListener(FavoritesChangeListener l); public abstract void notifyFavoritesChange(FavoritesChangeEvent e); public void notifyFavoritesChange(Object wnd, CharacterData cd) { if (cd == null) { throw new IllegalArgumentException(); } notifyFavoritesChange(new FavoritesChangeEvent(wnd, cd)); } } class FavoritesChangeObserverImpl extends FavoritesChangeObserver { private EventListenerList listeners = new EventListenerList(); @Override public void addFavoritesChangeListener(FavoritesChangeListener l) { listeners.add(FavoritesChangeListener.class, l); } @Override public void removeFavoritesChangeListener(FavoritesChangeListener l) { listeners.remove(FavoritesChangeListener.class, l); } @Override public void notifyFavoritesChange(FavoritesChangeEvent e) { if (e == null) { throw new IllegalArgumentException(); } FavoritesChangeListener[] lst = listeners .getListeners(FavoritesChangeListener.class); for (FavoritesChangeListener l : lst) { l.notifyChangeFavorites(e); } } } CharacterManaJ/src/main/java/charactermanaj/ui/model/PartsColorCoordinator.java0000644000175000017500000002611313615720000030041 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.model.AppConfig; import charactermanaj.model.ColorGroup; import charactermanaj.model.ColorInfo; import charactermanaj.model.Layer; import charactermanaj.model.PartsColorInfo; import charactermanaj.model.PartsColorManager; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSpec; import charactermanaj.model.PartsSpecResolver; import charactermanaj.ui.ColorDialog; import charactermanaj.ui.ImageSelectPanel; import charactermanaj.ui.ImageSelectPanel.ImageSelectPanelEvent; import charactermanaj.ui.ImageSelectPanel.ImageSelectPanelListener; /** * パーツの選択パネルとカラーダイアログを関連づけて調整するコーディネータオブジェクト.
* @author seraphy * */ public class PartsColorCoordinator { /** * ロガー */ private static final Logger logger = Logger.getLogger(PartsColorCoordinator.class.getName()); /** * パーツ選択パネルとカラーダイアログの関係を示すマップ.
*/ private IdentityHashMap colorDialogMap = new IdentityHashMap(); /** * パーツ識別子ごとのカラー情報を保存するパーツカラーマネージャ.
*/ private PartsColorManager partsColorMrg; /** * パーツ設定 */ private PartsSpecResolver partsSpecResolver; /** * 同一の色グループに設定値を同期させるためのコーディネータ.
*/ private ColorGroupCoordinator colorGroupCoordinator; /** * コンストラクタ.
* @param partsSpecResolver パーツ * @param partsColorMrg パーツ識別子ごとの色情報を管理するオブジェクト * @param colorGroupCoordinator 同一の色グループに設定値を同期させるためのコーディネータ. */ public PartsColorCoordinator(PartsSpecResolver partsSpecResolver, PartsColorManager partsColorMrg, ColorGroupCoordinator colorGroupCoordinator) { if (partsSpecResolver == null || partsColorMrg == null || colorGroupCoordinator == null) { throw new IllegalArgumentException(); } this.partsSpecResolver = partsSpecResolver; this.partsColorMrg = partsColorMrg; this.colorGroupCoordinator = colorGroupCoordinator; } /** * パーツ選択パネルと色ダイアログの関係を登録する.
* @param imageSelectPanel パーツ選択パネル * @param colorDialog 色ダイアログ */ public void register(final ImageSelectPanel imageSelectPanel, final ColorDialog colorDialog) { if (imageSelectPanel == null || colorDialog == null) { throw new IllegalArgumentException(); } if (colorDialogMap.containsKey(imageSelectPanel)) { throw new IllegalArgumentException("already registered: " + imageSelectPanel); } colorDialogMap.put(imageSelectPanel, colorDialog); imageSelectPanel.addImageSelectListener(new ImageSelectPanelListener() { public void onChangeColor(ImageSelectPanelEvent event) { // なにもしない } public void onPreferences(ImageSelectPanelEvent event) { // なにもしない } public void onChange(ImageSelectPanelEvent event) { PartsColorCoordinator.this.loadColorSettingToColorDialog(imageSelectPanel, colorDialog); } public void onSelectChange(ImageSelectPanelEvent event) { PartsColorCoordinator.this.loadColorSettingToColorDialog(imageSelectPanel, colorDialog); } public void onTitleClick(ImageSelectPanelEvent event) { // なにもしない } public void onTitleDblClick(ImageSelectPanelEvent event) { // なにもしない } }); colorDialog.addColorChangeListener(new ColorChangeListener() { public void onColorChange(ColorChangeEvent event) { saveColorSettingAll(); } public void onColorGroupChange(ColorChangeEvent event) { saveColorSettingAll(); } }); } /** * パーツ選択パネルの現在の選択に対する保存されているカラー情報を色ダイアログに設定する.
* @param imageSelectPanel パーツ選択パネル * @param colorDialog 色ダイアログ */ protected void loadColorSettingToColorDialog(ImageSelectPanel imageSelectPanel, ColorDialog colorDialog) { PartsIdentifier selectedParts = imageSelectPanel.getSelectedPartsIdentifier(); // 選択されているパーツのパーツ名と有効なレイヤーをカラーダイアログに設定する. // 選択されているパーツがない場合はデフォルトに戻す. colorDialog.setPartsIdentifier(selectedParts); colorDialog.setEnableLayers(getEnabledLayers(selectedParts)); if (selectedParts == null) { // 選択されているパーツがない場合は、ここまで。 return; } PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(selectedParts, false); for (Map.Entry entry : partsColorInfo.entrySet()) { Layer layer = entry.getKey(); ColorInfo colorInfo = entry.getValue(); ColorGroup colorGroup = colorInfo.getColorGroup(); if (colorGroup == null) { colorGroup = ColorGroup.NA; } colorDialog.setColorGroup(layer, colorGroup); boolean syncColorGroup = colorInfo.isSyncColorGroup(); colorDialog.setSyncColorGroup(layer, syncColorGroup); ColorConvertParameter param = colorInfo.getColorParameter(); colorDialog.setColorConvertParameter(layer, param); if (syncColorGroup) { colorGroupCoordinator.syncColorGroup(colorDialog.getPartsCategory(), layer, colorDialog); } } } /** * 現在選択中のパーツの組み合わせに対応するカラーダイアログの設定情報をPartsColorManagerに保存する.
* (カラーダイアログの値が変更されるたびに呼び出される.)
*/ protected void saveColorSettingAll() { for (Map.Entry entry : colorDialogMap.entrySet()) { ImageSelectPanel imageSelectPanel = entry.getKey(); ColorDialog colorDialog = entry.getValue(); saveColorSettingFromColorDialog(imageSelectPanel, colorDialog); } } /** * カテゴリべつの現在選択中のパーツ識別子と、それに対応するカラーダイアログの設定値をPartsColorManagerに保存する.
* @param imageSelectPanel カテゴリ別のパーツ選択 * @param colorDialog 対応するカラーダイアログ */ protected void saveColorSettingFromColorDialog(ImageSelectPanel imageSelectPanel, ColorDialog colorDialog) { PartsIdentifier selectedParts = imageSelectPanel.getSelectedPartsIdentifier(); if (selectedParts == null) { return; } Map paramMap = colorDialog.getColorConvertParameters(); PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(selectedParts, true); for (Map.Entry entry : paramMap.entrySet()) { Layer layer = entry.getKey(); ColorConvertParameter param = entry.getValue(); ColorInfo colorInfo = new ColorInfo(); ColorGroup colorGroup = colorDialog.getColorGroup(layer); colorInfo.setColorGroup(colorGroup); boolean syncColorGroup = colorDialog.isSyncColorGroup(layer); colorInfo.setSyncColorGroup(syncColorGroup); colorInfo.setColorParameter(param); partsColorInfo.put(layer, colorInfo); } boolean applyAll = colorDialog.isApplyAll(); partsColorMrg.setPartsColorInfo(selectedParts, partsColorInfo, applyAll); } /** * 全カラーダイアログで設定されている各レイヤーごとの色パラメータを全て取得する.
* @return 各レイヤーごとの色パラメータ */ public Map getColorConvertParameterMap() { final HashMap colorConvertParameterMap = new HashMap(); for (ColorDialog colorDlg : colorDialogMap.values()) { for (Map.Entry entry : colorDlg.getColorConvertParameters().entrySet()) { Layer layer = entry.getKey(); ColorConvertParameter colorConvertParameter = entry.getValue(); colorConvertParameterMap.put(layer, colorConvertParameter); } } return colorConvertParameterMap; } /** * 現在選択されている各カテゴリのパーツの組み合わせに対するカラー情報に各カテゴリの色ダイアログを設定する.
* (選択中のパーツ名も設定される.)
*/ public void initColorDialog() { for (Map.Entry entry : colorDialogMap.entrySet()) { ImageSelectPanel imageSelectPanel = entry.getKey(); ColorDialog colorDialog = entry.getValue(); PartsIdentifier partsIdentifier = imageSelectPanel.getSelectedPartsIdentifier(); // 選択されているパーツのパーツ名と有効なレイヤーをカラーダイアログに設定する. // 選択されているパーツがない場合はデフォルトに戻す. colorDialog.setPartsIdentifier(partsIdentifier); colorDialog.setEnableLayers(getEnabledLayers(partsIdentifier)); if (partsIdentifier != null) { PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(partsIdentifier, false); for (Map.Entry colorInfoEntry : partsColorInfo.entrySet()) { Layer layer = colorInfoEntry.getKey(); ColorInfo colorInfo = colorInfoEntry.getValue(); if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, layer + "=" + colorInfo); } colorDialog.setColorGroup(layer, colorInfo.getColorGroup()); colorDialog.setSyncColorGroup(layer, colorInfo.isSyncColorGroup()); colorDialog.setColorConvertParameter(layer, colorInfo.getColorParameter()); } } } } /** * 指定したパーツ識別子を構成する実際に存在するレイヤーを返します.
* (カテゴリが2つ以上のレイヤーをもっている場合でもパーツが、カテゴリのレイヤー数を全て使い切っていない場合は、使っているレイヤーのみが返されます.)
* 指定したパーツ識別子がnullの場合はnullを返します.
* 指定したパーツ識別子がnullではなく、且つ、パーツリゾルバから取得できない場合は空が返されます.
* ただし、アプリケーション設定で「存在しないレイヤーをディセーブルにしない」がtrueであれば、常にnullを返します.
* @param partsIdentifier パーツ識別子、もしくはnull * @return レイヤーのコレクション、もしくはnull */ protected Collection getEnabledLayers(PartsIdentifier partsIdentifier) { AppConfig appConfig = AppConfig.getInstance(); if (appConfig.isNotDisableLayerTab()) { return null; } if (partsIdentifier != null) { PartsSpec partsSpec = partsSpecResolver.getPartsSpec(partsIdentifier); ArrayList layers = new ArrayList(); if (partsSpec != null) { for (Layer layer : partsSpec.getPartsFiles().keySet()) { layers.add(layer); } } return layers; } return null; } } CharacterManaJ/src/main/java/charactermanaj/ui/model/PartsSelectionManager.java0000644000175000017500000003032413615720000027776 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.awt.Color; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsColorInfo; import charactermanaj.model.PartsColorManager; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.ui.ImageSelectPanel; /** * パーツ選択ペインの管理クラス. * @author seraphy */ public class PartsSelectionManager { /** * 背景色を管理するオブジェクトが実装するインターフェイス. * @author seraphy */ public interface ImageBgColorProvider { /** * 背景色を取得する. * @return 背景色 */ Color getImageBgColor(); /** * 背景色を設定する * @param imageBgColor 背景色 */ void setImageBgColor(Color imageBgColor); } /** * アクティブなカスタムレイヤーをIDでやりとりするインターフェイス * * @author seraphy */ public interface CustomLayerPatternsIDProvider { /** * アクティブなカスタムレイヤーパターンのID一覧を取得する * @return */ Set getActivePatternIds(); /** * カスタムレイヤーパターンのIDのセットを指定してアクティブにする。 * @param names */ void setActivePatternIds(Set names); } /** * カテゴリ別パーツ選択パネル.
*/ private HashMap imageSelectPanels = new HashMap(); /** * パーツカラーマネージャ.
*/ private PartsColorManager partsColorMrg; /** * 背景色プロバイダ. */ private ImageBgColorProvider imageBgColorProvider; /** * アフィン変換用のパラメータ.
* 変換しない場合はnull.
*/ private double[] affineTransformParameter; /** * 単一選択カテゴリの選択解除の有効/無効.
* 有効にする場合はtrue.
*/ private boolean deselectableAllCategory; /** * カスタムレイヤーパターンのプロバイダ */ private CustomLayerPatternsIDProvider customLayerPatternsProvider; /** * コンストラクタ * @param partsColorMrg パーツカラーマネージャ * @param imageBgColorProvider 背景色プロバイダ */ public PartsSelectionManager( PartsColorManager partsColorMrg, ImageBgColorProvider imageBgColorProvider, CustomLayerPatternsIDProvider customLayerPatternsProvider ) { if (partsColorMrg == null || imageBgColorProvider == null || customLayerPatternsProvider == null) { throw new IllegalArgumentException(); } this.partsColorMrg = partsColorMrg; this.imageBgColorProvider = imageBgColorProvider; this.customLayerPatternsProvider = customLayerPatternsProvider; } /** * パーツをロードする. */ public void loadParts() { for (ImageSelectPanel panel : imageSelectPanels.values()) { panel.loadParts(); } } public void register(ImageSelectPanel imageSelectPanel) { if (imageSelectPanel == null) { throw new IllegalArgumentException(); } imageSelectPanels.put(imageSelectPanel.getPartsCategory(), imageSelectPanel); } public List getSelectedPartsIdentifiers(PartsCategory partsCategory) { if (partsCategory == null) { throw new IllegalArgumentException(); } ImageSelectPanel panel = imageSelectPanels.get(partsCategory); if (panel != null) { return Collections.unmodifiableList(panel.getSelectedPartsIdentifiers()); } return Collections.emptyList(); } public PartsIdentifier getSelectedPartsIdentifier(PartsCategory partsCategory) { if (partsCategory == null) { throw new IllegalArgumentException(); } ImageSelectPanel panel = imageSelectPanels.get(partsCategory); if (panel != null) { return panel.getSelectedPartsIdentifier(); } return null; } public Collection getAllCategories() { ArrayList partsCategories = new ArrayList(); partsCategories.addAll(imageSelectPanels.keySet()); return partsCategories; } /** * 各カテゴリの選択状態と背景色、アクティブなカスタムレイヤーをパーツセットで指定されたものに設定します.
* @param partsSet パーツセット */ public void selectPartsSet(PartsSet partsSet) { if (partsSet == null) { throw new IllegalArgumentException(); } // パーツを選択する for (ImageSelectPanel panel : imageSelectPanels.values()) { PartsCategory partsCategory = panel.getPartsCategory(); List partsIdentifiers = partsSet.get(partsCategory); panel.selectParts(partsIdentifiers); if (partsIdentifiers != null) { for (PartsIdentifier partsIdentifier : partsIdentifiers) { PartsColorInfo partsColorInfo = partsSet.getColorInfo(partsIdentifier); if (partsColorInfo != null) { partsColorMrg.setPartsColorInfo(partsIdentifier, partsColorInfo, false); } } } } // 背景色を設定する Color bgColor = partsSet.getBgColor(); if (bgColor != null) { setImageBgColor(bgColor); } // アクティブなカスタムレイヤー名を設定する Set customLayerPatternIds = partsSet.getActiveCustomLayerPatternIds(); if (customLayerPatternIds != null) { customLayerPatternsProvider.setActivePatternIds(customLayerPatternIds); } affineTransformParameter = partsSet.getAffineTransformParameter(); // clone済み } /** * 現在の選択中のパーツと色設定からパーツセットを構築します. * 選択がなにもない場合は空のパーツセットとなります.
* @return パーツセット */ public PartsSet createPartsSet() { PartsSet presetParts = new PartsSet(); for (ImageSelectPanel imageSelectPanel : imageSelectPanels.values()) { PartsCategory category = imageSelectPanel.getPartsCategory(); for (PartsIdentifier partsIdentifier : imageSelectPanel.getSelectedPartsIdentifiers()) { PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(partsIdentifier, false); presetParts.appendParts(category, partsIdentifier, partsColorInfo); } } presetParts.setBgColor(getImageBgColor()); presetParts.setAffineTransformParameter(affineTransformParameter); // 相手側でcloneする presetParts.setActiveCustomLayerPatternIds(customLayerPatternsProvider.getActivePatternIds()); return presetParts; } /** * すべてのカテゴリのリストで選択中のアイテムが見えるようにスクロールする. */ public void scrollToSelectedParts() { for (ImageSelectPanel imageSelectPanel : imageSelectPanels.values()) { imageSelectPanel.scrollToSelectedRow(); } } /** * 指定したパーツ識別子にフォーカスを当てて、必要に応じてスクロールします.
* 該当するパーツ識別子がどこにもなければ何もしません.
* @param partsIdentifier パーツ識別子 */ public void setSelection(PartsIdentifier partsIdentifier) { if (partsIdentifier == null) { return; } PartsCategory partsCategory = partsIdentifier.getPartsCategory(); if (isMinimizeMode(partsCategory)) { setMinimizeModeIfOther(partsCategory, true); } ImageSelectPanel imageSelectPanel = imageSelectPanels.get(partsCategory); if (imageSelectPanel != null) { imageSelectPanel.setSelection(partsIdentifier); } } /** * 背景色を取得する. * @return 背景色 */ protected Color getImageBgColor() { return imageBgColorProvider.getImageBgColor(); } /** * 背景色を設定する * @param imageBgColor 背景色 */ protected void setImageBgColor(Color imageBgColor) { imageBgColorProvider.setImageBgColor(imageBgColor); } /** * アフィン変換用のパラメータを取得する.
* 変換しない場合はnull.
* @return アフィン変換用のパラメータ、もしくはnull */ public double[] getAffineTransformParameter() { return affineTransformParameter == null ? null : affineTransformParameter.clone(); } /** * アフィン変換用のパラメータを設定する.
* 変換しない場合はnull.
* 要素数は4または6でなければならない.
* @param affineTransformParameter アフィン変換用のパラメータ、もしくはnull */ public void setAffineTransformParameter(double[] affineTransformParameter) { if (affineTransformParameter != null && !(affineTransformParameter.length == 4 || affineTransformParameter.length == 6)) { throw new IllegalArgumentException("affineTransformParameter invalid length."); } this.affineTransformParameter = affineTransformParameter == null ? null : affineTransformParameter.clone(); } /** * 選択選択パーツカテゴリの選択解除を許可するか?
* @return 許可する場合はtrue */ public boolean isDeselectableAlways() { return deselectableAllCategory; } /** * 選択選択パーツカテゴリの選択解除を許可するか設定する.
* @param deselectable 許可する場合はtrue */ public void setDeselectableAlways(boolean deselectable) { this.deselectableAllCategory = deselectable; for (ImageSelectPanel imageSelectPanel : this.imageSelectPanels.values()) { imageSelectPanel.setDeselectableAlways(deselectable); } } /** * パーツ選択をすべて解除する.
* 単一選択カテゴリが解除されるかどうかは、{@link ImageSelectPanel#isDeselectableAlways()}による.
*/ public void deselectAll() { for (ImageSelectPanel imageSelectPanel : this.imageSelectPanels.values()) { if (imageSelectPanel.getPartsCategory().isOptional() || imageSelectPanel.isDeselectableAlways()) { imageSelectPanel.deselectAll(); } } } /** * 指定したカテゴリ以外のパネルを最小化する.
* (指定したカテゴリがnullでなければ、そのカテゴリの最小化は解除される.)
* @param partsCategory 最小化の対象外のパネル、nullの場合は不問 * @param minimize 指定したカテゴリ以外を最小化する場合はtrue、falseの場合はすべてが最小化解除される. */ public void setMinimizeModeIfOther(PartsCategory partsCategory, boolean minimize) { for (Map.Entry entry : imageSelectPanels.entrySet()) { PartsCategory cat = entry.getKey(); ImageSelectPanel imageSelectPanel = entry.getValue(); if (partsCategory != null && cat.equals(partsCategory)) { imageSelectPanel.setMinimizeMode(false); } else { imageSelectPanel.setMinimizeMode(minimize); } } } /** * 指定したカテゴリが最小化モードであるか? * @param partsCategory カテゴリ * @return 指定したカテゴリが最小化モードであればtrue、該当するカテゴリがない場合は常にfalse */ public boolean isMinimizeMode(PartsCategory partsCategory) { ImageSelectPanel panel = imageSelectPanels.get(partsCategory); if (panel == null) { return false; } return panel.isMinimizeMode(); } /** * 指定したカテゴリが最小化モードでなく、且つ、他がすべて最小化モードであるか? * (指定カテゴリがない場合は全パネルが最小化モードである場合)
* @param partsCategory カテゴリ、もしくはnull * @return 指定したカテゴリが最小化モードでなく、且つ、他がすべて最小化モードである場合はtrue */ public boolean isNotMinimizeModeJust(PartsCategory partsCategory) { for (Map.Entry entry : imageSelectPanels.entrySet()) { PartsCategory cat = entry.getKey(); ImageSelectPanel imageSelectPanel = entry.getValue(); if (partsCategory != null) { if (cat.equals(partsCategory)) { // 指定したカテゴリが最小化モードであればfalse if (imageSelectPanel.isMinimizeMode()) { return false; } } else { // 指定したカテゴリ以外が最小化モードでなければfalse if ( !imageSelectPanel.isMinimizeMode()) { return false; } } } } // 指定カテゴリ以外がすべて最小化モードである場合 // (指定カテゴリがない場合は全パネルが最小化モードである場合) return true; } } CharacterManaJ/src/main/java/charactermanaj/ui/model/FavoritesChangeListener.java0000644000175000017500000000027513615720000030324 0ustar paulliupaulliupackage charactermanaj.ui.model; import java.util.EventListener; public interface FavoritesChangeListener extends EventListener { void notifyChangeFavorites(FavoritesChangeEvent e); } CharacterManaJ/src/main/java/charactermanaj/ui/ProfileEditDialog.java0000644000175000017500000025042213615720000025775 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Properties; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.ComboBoxModel; import javax.swing.DefaultCellEditor; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.SpinnerNumberModel; import javax.swing.SwingConstants; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import charactermanaj.Main; import charactermanaj.graphics.colormodel.ColorModels; import charactermanaj.model.AppConfig; import charactermanaj.model.CharacterData; import charactermanaj.model.ColorGroup; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.model.RecommendationURL; import charactermanaj.model.io.CharacterDataPersistent; import charactermanaj.model.io.RecommendationURLCompensator; import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.DesktopUtilities; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.LocalizedResourcePropertyLoader; public class ProfileEditDialog extends JDialog { private static final long serialVersionUID = 8559918820826437849L; /** * ローカライズ文字列 */ protected static final String STRINGS_RESOURCE = "languages/profileditdialog"; protected static class JTextFieldEx extends JTextField { private static final long serialVersionUID = -8608404290439184405L; private boolean error; @Override public Color getBackground() { if (error) { AppConfig appConfig = AppConfig.getInstance(); return appConfig.getInvalidBgColor(); } return super.getBackground(); } public void setError(boolean error) { if (this.error != error) { this.error = error; repaint(); } } public boolean isError() { return error; } } /** * オリジナルのデータ. */ private CharacterData original; /** * キャラクターデータID */ private JTextFieldEx txtCharacterID; /** * キャラクターデータ Rev */ private JTextFieldEx txtCharacterRev; /** * キャラクターデータ DocBase(読み込み専用) */ private JTextField txtCharacterDocBase; /** * キャラクター名 */ private JTextFieldEx txtCharacterName; /** * イメージ幅 */ private JSpinner txtImageWidth; /** * イメージ高さ */ private JSpinner txtImageHeight; /** * 作者 */ private JTextField txtAuthor; /** * 説明 */ private JTextArea txtDescription; /** * ディレクトリの監視 */ private JCheckBox chkWatchDir; /** * カスタムレイヤーの有効・無効 */ private JCheckBox chkEnableCustomLayer; /** * カラーグループのモデル */ private ColorGroupsTableModel colorGroupsTableModel; /** * カテゴリのモデル */ private CategoriesTableModel categoriesTableModel; /** * レイヤーのモデル */ private LayersTableModel layersTableModel; /** * パーツセットのモデル */ private PartssetsTableModel partssetsTableModel; /** * お勧めリンクのモデル */ private RecommendationTableModel recommendationsTableModel; /** * 画面の内容から生成された新しいキャラクターデータ、もしくはnull */ private CharacterData result; /** * OKボタン */ private JButton btnOK; /** * キャラクターデータの編集画面を構築する.
* * @param parent * 親、もしくはnull * @param original * オリジナルのキャラクターデータ(変更されない) */ public ProfileEditDialog(JFrame parent, CharacterData original) { super(parent, true); initDialog(parent, original); } /** * キャラクターデータの編集画面を構築する.
* * @param parent * 親、もしくはnull * @param original * オリジナルのキャラクターデータ(変更されない) */ public ProfileEditDialog(JDialog parent, CharacterData original) { super(parent, true); initDialog(parent, original); } /** * 編集ダイアログを初期化する. * * @param origianl * 編集もとキャラクター定義 */ private void initDialog(Component parent, CharacterData original) { // 元情報 if (original == null) { throw new IllegalArgumentException(); } this.original = original; // ウィンドウイベントのハンドル setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClose(); } }); // 設定 AppConfig appConfig = AppConfig.getInstance(); final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); // タイトル String title; if (original.isValid()) { title = strings.getProperty("title.edit"); } else { title = strings.getProperty("title.new"); } setTitle(title); // OK/CANCEL PANEL JPanel buttonsPanel = new JPanel(); buttonsPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 42)); GridBagLayout buttonsPanelLayout = new GridBagLayout(); buttonsPanel.setLayout(buttonsPanelLayout); GridBagConstraints gbc = new GridBagConstraints(); String okCaption; if (original.isValid()) { okCaption = strings.getProperty("button.ok.edit"); } else { okCaption = strings.getProperty("button.ok.new"); } btnOK = new JButton(new AbstractAction(okCaption) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onOK(); } }); btnOK.setEnabled(false); // 初期状態はディセーブル、updateUIStateで更新する. Action actOpenDir = new AbstractAction(strings.getProperty("button.openDir")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onOpenDir(); } }; actOpenDir.setEnabled(original.isValid()); JButton btnOpenDir = new JButton(actOpenDir); Action actCancel = new AbstractAction(strings.getProperty("button.cancel")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onClose(); } }; JButton btnCancel = new JButton(actCancel); gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 0.; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; buttonsPanel.add(btnOpenDir, gbc); gbc.gridx = 1; gbc.gridy = 0; gbc.weightx = 1.; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; buttonsPanel.add(Box.createGlue(), gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 3 : 2; gbc.gridy = 0; gbc.weightx = 0.; buttonsPanel.add(btnOK, gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 2 : 3; gbc.gridy = 0; buttonsPanel.add(btnCancel, gbc); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(buttonsPanel, BorderLayout.SOUTH); // InputMap/ActionMap Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); rootPane.setDefaultButton(btnOK); InputMap im = rootPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeWindow"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeWindow"); rootPane.getActionMap().put("closeWindow", actCancel); // Main JPanel mainPanel = new JPanel(); GridBagLayout mainPanelLayout = new GridBagLayout(); mainPanel.setLayout(mainPanelLayout); this.txtCharacterID = new JTextFieldEx(); this.txtCharacterRev = new JTextFieldEx(); this.txtCharacterDocBase = new JTextField(); this.txtCharacterID.setEditable(true); this.txtCharacterRev.setEditable(true); this.txtCharacterDocBase.setEditable(false); this.txtCharacterName = new JTextFieldEx(); this.txtImageWidth = new JSpinner(new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 1)); // 現実に可能であるかを問わず制限を設けない this.txtImageHeight = new JSpinner(new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 1)); // 現実に可能であるかを問わず制限を設けない this.txtAuthor = new JTextField(); this.txtDescription = new JTextArea(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0; gbc.weighty = 0; gbc.insets = new Insets(1, 3, 1, 5); gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(new JLabel(strings.getProperty("docbase.caption"), SwingConstants.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 0; gbc.gridwidth = 3; gbc.gridheight = 1; gbc.weightx = 1.; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(txtCharacterDocBase, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0; gbc.weighty = 0; gbc.insets = new Insets(1, 3, 1, 5); gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(new JLabel(strings.getProperty("id.caption"), SwingConstants.RIGHT), gbc); txtCharacterID.setToolTipText(strings.getProperty("id.caption.help")); txtCharacterRev.setToolTipText(strings.getProperty("rev.caption.help")); gbc.gridx = 1; gbc.gridy = 1; gbc.gridwidth = 3; gbc.gridheight = 1; gbc.weightx = 1.; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(txtCharacterID, gbc); gbc.gridx = 0; gbc.gridy = 2; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0; gbc.weighty = 0; gbc.insets = new Insets(1, 3, 1, 5); gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(new JLabel(strings.getProperty("rev.caption"), SwingConstants.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 2; gbc.gridwidth = 3; gbc.gridheight = 1; gbc.weightx = 1.; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(txtCharacterRev, gbc); gbc.gridx = 0; gbc.gridy = 3; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(new JLabel(strings.getProperty("name.caption"), SwingConstants.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 3; gbc.gridwidth = 3; gbc.gridheight = 1; gbc.weightx = 1.; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(txtCharacterName, gbc); gbc.gridx = 0; gbc.gridy = 4; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(new JLabel(strings.getProperty("image-width.caption"), SwingConstants.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 4; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.5; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(txtImageWidth, gbc); gbc.gridx = 2; gbc.gridy = 4; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(new JLabel(strings.getProperty("image-height.caption"), JLabel.RIGHT), gbc); gbc.gridx = 3; gbc.gridy = 4; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.5; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(txtImageHeight, gbc); gbc.gridx = 0; gbc.gridy = 5; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(new JLabel(strings.getProperty("author.caption"), SwingConstants.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 5; gbc.gridwidth = 3; gbc.gridheight = 1; gbc.weightx = 1.; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(txtAuthor, gbc); gbc.gridx = 0; gbc.gridy = 6; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0; gbc.weighty = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(new JLabel(strings.getProperty("description.caption"), SwingConstants.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 6; gbc.gridwidth = 3; gbc.gridheight = 2; gbc.weightx = 1.; gbc.weighty = 1.; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; mainPanel.add(new JScrollPane(txtDescription), gbc); // model this.colorGroupsTableModel = new ColorGroupsTableModel(); this.categoriesTableModel = new CategoriesTableModel(); this.layersTableModel = new LayersTableModel(); this.partssetsTableModel = new PartssetsTableModel(); this.recommendationsTableModel = new RecommendationTableModel(); this.colorGroupsTableModel.setEditable(true); this.categoriesTableModel.setEditable(true); this.layersTableModel.setEditable(true); this.partssetsTableModel.setEditable(true); this.recommendationsTableModel.setEditable(true); // colorGroup JPanel colorGroupPanel = new JPanel(new BorderLayout()); final JTable colorGroupTable = new JTable(colorGroupsTableModel); colorGroupTable.setShowGrid(true); colorGroupTable.setGridColor(appConfig.getGridColor()); colorGroupTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); colorGroupTable.setRowHeight(colorGroupTable.getRowHeight() + 4); colorGroupTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 行の高さをフォントの高さにする colorGroupTable.setRowHeight((int)(colorGroupTable.getFont().getSize() * 1.2)); colorGroupPanel.add(new JScrollPane(colorGroupTable), BorderLayout.CENTER); JPanel colorGroupBtnPanel = new JPanel(); GridBagLayout colorGroupBtnPanelLayout = new GridBagLayout(); colorGroupBtnPanel.setLayout(colorGroupBtnPanelLayout); AbstractAction actColorGroupAdd = new AbstractAction(strings.getProperty("colorgroup.add.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { colorGroupsTableModel.addNewColorGroup(); } }; AbstractAction actColorGroupDel = new AbstractAction(strings.getProperty("colorgroup.delete.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int selRow = colorGroupTable.getSelectedRow(); if (selRow >= 0) { ColorGroupsTableRow colorGroup = colorGroupsTableModel.getRow(selRow); if (layersTableModel.isUsed(colorGroup)) { JOptionPane.showMessageDialog(ProfileEditDialog.this, strings.getProperty("warning.used-colorgroup")); } else { colorGroupsTableModel.removeRow(selRow); } } } }; AbstractAction actColorGroupMoveUp = new AbstractAction(strings.getProperty("colorgroup.moveup.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int rowIndex = colorGroupTable.getSelectedRow(); if (rowIndex >= 0) { int newSel = colorGroupsTableModel.moveUp(rowIndex); colorGroupTable.getSelectionModel().setSelectionInterval(newSel, newSel); } } }; AbstractAction actColorGroupMoveDown = new AbstractAction(strings.getProperty("colorgroup.movedown.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int rowIndex = colorGroupTable.getSelectedRow(); if (rowIndex >= 0) { int newSel = colorGroupsTableModel.moveDown(rowIndex); colorGroupTable.getSelectionModel().setSelectionInterval(newSel, newSel); } } }; gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; colorGroupBtnPanel.add(new JButton(actColorGroupAdd), gbc); gbc.gridx = 0; gbc.gridy = 1; colorGroupBtnPanel.add(new JButton(actColorGroupDel), gbc); gbc.gridx = 0; gbc.gridy = 2; colorGroupBtnPanel.add(new JButton(actColorGroupMoveUp), gbc); gbc.gridx = 0; gbc.gridy = 3; colorGroupBtnPanel.add(new JButton(actColorGroupMoveDown), gbc); gbc.gridx = 0; gbc.gridy = 4; gbc.weighty = 1.; colorGroupBtnPanel.add(Box.createGlue(), gbc); colorGroupPanel.add(colorGroupBtnPanel, BorderLayout.EAST); final Color disabledForeground = appConfig.getDisabledCellForgroundColor(); // categories JPanel categoriesPanel = new JPanel(new BorderLayout()); final JTable categoriesTable = new JTable(categoriesTableModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component comp = super.prepareRenderer(renderer, row, column); if (comp instanceof JCheckBox) { // BooleanのデフォルトのレンダラーはJCheckBoxを継承したJTable$BooleanRenderer comp.setEnabled(isCellEditable(row, column) && isEnabled()); } if (isCellSelected(row, column)) { comp.setForeground(getSelectionForeground()); comp.setBackground(getSelectionBackground()); } else { // 前景色、ディセーブル時は灰色 Color foregroundColor = getForeground(); comp.setForeground(isEnabled() ? foregroundColor : disabledForeground); comp.setBackground(getBackground()); } return comp; } }; categoriesTable.setShowGrid(true); categoriesTable.setGridColor(appConfig.getGridColor()); categoriesTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); categoriesTable.setRowHeight(categoriesTable.getRowHeight() + 4); categoriesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); categoriesTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // 行の高さをフォントの高さにする categoriesTable.setRowHeight((int)(categoriesTable.getFont().getSize() * 1.2)); categoriesPanel.add(new JScrollPane(categoriesTable), BorderLayout.CENTER); ScaleSupport scaleSupprt = ScaleSupport.getInstance(this); categoriesTableModel.adjustColumnModel(categoriesTable.getColumnModel(), scaleSupprt.getManualScaleX()); JPanel categoriesBtnPanel = new JPanel(); GridBagLayout categoryBtnPanelLayout = new GridBagLayout(); categoriesBtnPanel.setLayout(categoryBtnPanelLayout); AbstractAction actCategoryAdd = new AbstractAction(strings.getProperty("categories.add.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { categoriesTableModel.addCategory(); } }; AbstractAction actCategoryDel = new AbstractAction(strings.getProperty("categories.delete.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int selRow = categoriesTable.getSelectedRow(); if (selRow >= 0) { CategoriesTableRow partsCategory = categoriesTableModel.getRow(selRow); if (layersTableModel.isUsed(partsCategory)) { JOptionPane.showMessageDialog(ProfileEditDialog.this, strings.getProperty("warning.used-category")); } else { categoriesTableModel.removeRow(selRow); } } } }; AbstractAction actCategoryMoveUp = new AbstractAction(strings.getProperty("categories.moveup.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int rowIndex = categoriesTable.getSelectedRow(); if (rowIndex >= 0) { int newSel = categoriesTableModel.moveUp(rowIndex); categoriesTable.getSelectionModel().setSelectionInterval(newSel, newSel); } } }; AbstractAction actCategoryMoveDown = new AbstractAction(strings.getProperty("categories.movedown.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int rowIndex = categoriesTable.getSelectedRow(); if (rowIndex >= 0) { int newSel = categoriesTableModel.moveDown(rowIndex); categoriesTable.getSelectionModel().setSelectionInterval(newSel, newSel); } } }; gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; categoriesBtnPanel.add(new JButton(actCategoryAdd), gbc); gbc.gridx = 0; gbc.gridy = 1; categoriesBtnPanel.add(new JButton(actCategoryDel), gbc); gbc.gridx = 0; gbc.gridy = 2; categoriesBtnPanel.add(new JButton(actCategoryMoveUp), gbc); gbc.gridx = 0; gbc.gridy = 3; categoriesBtnPanel.add(new JButton(actCategoryMoveDown), gbc); gbc.gridx = 0; gbc.gridy = 4; gbc.weighty = 1.; categoriesBtnPanel.add(Box.createGlue(), gbc); categoriesPanel.add(categoriesBtnPanel, BorderLayout.EAST); // layers JPanel layersPanel = new JPanel(new BorderLayout()); final Color invalidBgColor = appConfig.getInvalidBgColor(); final JTable layersTable = new JTable(layersTableModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component comp = super.prepareRenderer(renderer, row, column); if (comp instanceof JCheckBox) { // BooleanのデフォルトのレンダラーはJCheckBoxを継承したJTable$BooleanRenderer comp.setEnabled(isCellEditable(row, column) && isEnabled()); } LayersTableModel model = (LayersTableModel) getModel(); LayersTableRow layer = model.getRow(row); comp.setForeground(getForeground()); comp.setBackground(layer.isValid() ? getBackground() : invalidBgColor); // 前景色、ディセーブル時は灰色 Color foregroundColor = getForeground(); comp.setForeground(isEnabled() ? foregroundColor : disabledForeground); return comp; } }; ScaleSupport scaleSupport = ScaleSupport.getInstance(this); layersTableModel.adjustColumnModel(layersTable.getColumnModel(), scaleSupport.getManualScaleX()); JComboBox colorGroupCombo = new JComboBox( new FirstItemInjectionComboBoxModelWrapper(colorGroupsTableModel, ColorGroupsTableRow.NA)); JComboBox categoriesCombo = new JComboBox(categoriesTableModel); JComboBox colorModelsCombo = new JComboBox(ColorModels.values()); layersTable.setShowGrid(true); layersTable.setGridColor(appConfig.getGridColor()); layersTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); layersTable.setRowHeight(layersTable.getRowHeight() + 4); layersTable.setDefaultEditor(ColorGroupsTableRow.class, new DefaultCellEditor(colorGroupCombo)); layersTable.setDefaultEditor(CategoriesTableRow.class, new DefaultCellEditor(categoriesCombo)); layersTable.setDefaultEditor(ColorModels.class, new DefaultCellEditor(colorModelsCombo)); layersTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); layersTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 行の高さをフォントの高さにする layersTable.setRowHeight((int)(layersTable.getFont().getSize() * 1.2)); layersPanel.add(new JScrollPane(layersTable), BorderLayout.CENTER); JPanel layersBtnPanel = new JPanel(); GridBagLayout layersBtnPanelLayout = new GridBagLayout(); layersBtnPanel.setLayout(layersBtnPanelLayout); AbstractAction actLayerAdd = new AbstractAction(strings.getProperty("layers.add.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { layersTableModel.addNewLayer(); } }; AbstractAction actLayerDel = new AbstractAction(strings.getProperty("layers.delete.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int selRow = layersTable.getSelectedRow(); if (selRow >= 0) { layersTableModel.removeRow(selRow); } } }; AbstractAction actLayerSort = new AbstractAction(strings.getProperty("layers.sort.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { layersTableModel.sort(); } }; AbstractAction actLayerMoveUp = new AbstractAction(strings.getProperty("layers.moveup.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int rowIndex = layersTable.getSelectedRow(); if (rowIndex >= 0) { int newSel = layersTableModel.moveUp(rowIndex); layersTable.getSelectionModel().setSelectionInterval(newSel, newSel); } } }; AbstractAction actLayerMoveDown = new AbstractAction(strings.getProperty("layers.movedown.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int rowIndex = layersTable.getSelectedRow(); if (rowIndex >= 0) { int newSel = layersTableModel.moveDown(rowIndex); layersTable.getSelectionModel().setSelectionInterval(newSel, newSel); } } }; gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; layersBtnPanel.add(new JButton(actLayerAdd), gbc); gbc.gridx = 0; gbc.gridy = 1; layersBtnPanel.add(new JButton(actLayerDel), gbc); gbc.gridx = 0; gbc.gridy = 2; layersBtnPanel.add(new JButton(actLayerMoveUp), gbc); gbc.gridx = 0; gbc.gridy = 3; layersBtnPanel.add(new JButton(actLayerMoveDown), gbc); gbc.gridx = 0; gbc.gridy = 4; layersBtnPanel.add(new JButton(actLayerSort), gbc); gbc.gridx = 0; gbc.gridy = 5; gbc.weighty = 1.; layersBtnPanel.add(Box.createGlue(), gbc); layersPanel.add(layersBtnPanel, BorderLayout.EAST); chkWatchDir = new JCheckBox(strings.getProperty("layers.watchdir")); chkEnableCustomLayer = new JCheckBox(strings.getProperty("layers.enableCustomLayer")); Box chkboxs = Box.createVerticalBox(); chkboxs.add(chkWatchDir); chkboxs.add(chkEnableCustomLayer); layersPanel.add(chkboxs, BorderLayout.SOUTH); // Presets JPanel partssetsPanel = new JPanel(new BorderLayout()); JTable partssetsTable = new JTable(partssetsTableModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component comp = super.prepareRenderer(renderer, row, column); if (comp instanceof JCheckBox) { // BooleanのデフォルトのレンダラーはJCheckBoxを継承したJTable$BooleanRenderer comp.setEnabled(isCellEditable(row, column) && isEnabled()); } if (isCellSelected(row, column)) { comp.setForeground(getSelectionForeground()); comp.setBackground(getSelectionBackground()); } else { // 前景色、ディセーブル時は灰色 Color foregroundColor = getForeground(); comp.setForeground(isEnabled() ? foregroundColor : disabledForeground); comp.setBackground(getBackground()); } return comp; } }; partssetsTableModel.adjustColumnModel(partssetsTable.getColumnModel(), scaleSupport.getManualScaleX()); partssetsTable.setRowHeight(layersTable.getRowHeight() + 4); partssetsTable.setShowGrid(true); partssetsTable.setGridColor(appConfig.getGridColor()); partssetsTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); partssetsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); partssetsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 行の高さをフォントの高さにする partssetsTable.setRowHeight((int)(partssetsTable.getFont().getSize() * 1.2)); partssetsPanel.add(new JScrollPane(partssetsTable), BorderLayout.CENTER); // Recommendations JPanel recommendationsPanel = new JPanel(new BorderLayout()); final JTable recommendationsTable = new JTable(recommendationsTableModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component comp = super.prepareRenderer(renderer, row, column); if (isCellSelected(row, column)) { comp.setForeground(getSelectionForeground()); comp.setBackground(getSelectionBackground()); } else { // 前景色、ディセーブル時は灰色 Color foregroundColor = getForeground(); comp.setForeground(isEnabled() ? foregroundColor : disabledForeground); comp.setBackground(getBackground()); } return comp; } }; recommendationsTableModel.adjustColumnModel(recommendationsTable.getColumnModel(), scaleSupport.getManualScaleX()); recommendationsTable.setRowHeight(layersTable.getRowHeight() + 4); recommendationsTable.setShowGrid(true); recommendationsTable.setGridColor(appConfig.getGridColor()); recommendationsTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); recommendationsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); recommendationsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 行の高さをフォントの高さにする recommendationsTable.setRowHeight((int)(recommendationsTable.getFont().getSize() * 1.2)); recommendationsPanel.add(new JScrollPane(recommendationsTable), BorderLayout.CENTER); JPanel recommendationsBtnPanel = new JPanel(); GridBagLayout recommendationsBtnPanelLayout = new GridBagLayout(); recommendationsBtnPanel.setLayout(recommendationsBtnPanelLayout); AbstractAction actRecommendationAdd = new AbstractAction(strings.getProperty("recommendations.add.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { recommendationsTableModel.addNew(); } }; AbstractAction actRecommendationDel = new AbstractAction(strings.getProperty("recommendations.delete.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int selRow = recommendationsTable.getSelectedRow(); if (selRow >= 0) { recommendationsTableModel.removeRow(selRow); } } }; AbstractAction actRecommendationMoveUp = new AbstractAction(strings.getProperty("recommendations.moveup.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int rowIndex = recommendationsTable.getSelectedRow(); if (rowIndex >= 0) { int newSel = recommendationsTableModel.moveUp(rowIndex); recommendationsTable.getSelectionModel().setSelectionInterval(newSel, newSel); } } }; AbstractAction actRecommendationMoveDown = new AbstractAction(strings.getProperty("recommendations.movedown.caption")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int rowIndex = recommendationsTable.getSelectedRow(); if (rowIndex >= 0) { int newSel = recommendationsTableModel.moveDown(rowIndex); recommendationsTable.getSelectionModel().setSelectionInterval(newSel, newSel); } } }; gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; recommendationsBtnPanel.add(new JButton(actRecommendationAdd), gbc); gbc.gridx = 0; gbc.gridy = 1; recommendationsBtnPanel.add(new JButton(actRecommendationDel), gbc); gbc.gridx = 0; gbc.gridy = 2; recommendationsBtnPanel.add(new JButton(actRecommendationMoveUp), gbc); gbc.gridx = 0; gbc.gridy = 3; recommendationsBtnPanel.add(new JButton(actRecommendationMoveDown), gbc); gbc.gridx = 0; gbc.gridy = 4; gbc.weighty = 1.; recommendationsBtnPanel.add(Box.createGlue(), gbc); recommendationsPanel.add(recommendationsBtnPanel, BorderLayout.EAST); // データのロード loadCharacterData(original); // レイヤーのカテゴリ使用状態を監視するリスナ関連 final HashMap> usedLayerMap = new HashMap>(); final Runnable resetUsedLayers = new Runnable() { public void run() { usedLayerMap.clear(); } }; layersTableModel.addListDataListener(new ListDataListener() { public void contentsChanged(ListDataEvent e) { resetUsedLayers.run(); } public void intervalAdded(ListDataEvent e) { resetUsedLayers.run(); } public void intervalRemoved(ListDataEvent e) { resetUsedLayers.run(); } }); categoriesTableModel.setUsedCategoryDetector(new CategoriesTableModel.UsedCategoryDetector() { public List getLayers(CategoriesTableRow partsCategory) { if (usedLayerMap.isEmpty()) { int mx = layersTableModel.getRowCount(); for (int idx = 0; idx < mx; idx++) { LayersTableRow layer = layersTableModel.getRow(idx); CategoriesTableRow pc = layer.getPartsCategory(); List usedLayers = usedLayerMap.get(pc); if (usedLayers == null) { usedLayers = new ArrayList(); usedLayerMap.put(pc, usedLayers); } usedLayers.add(layer); } } return usedLayerMap.get(partsCategory); } }); // 生成可能であるかチェックするためのリスナ layersTableModel.addListDataListener(new ListDataListener() { public void contentsChanged(ListDataEvent e) { updateUIState(); layersTable.repaint(); // エラー有無表示を最新の状態で再判定・再描画するため } public void intervalAdded(ListDataEvent e) { updateUIState(); } public void intervalRemoved(ListDataEvent e) { updateUIState(); } }); // キャラクターID/REV/NAMEが変更されたことを通知され、OKボタンを判定するためのリスナ DocumentListener textChangeListener = new DocumentListener() { public void removeUpdate(DocumentEvent e) { updateUIState(); } public void insertUpdate(DocumentEvent e) { updateUIState(); } public void changedUpdate(DocumentEvent e) { updateUIState(); } }; txtCharacterID.getDocument().addDocumentListener(textChangeListener); txtCharacterRev.getDocument().addDocumentListener(textChangeListener); txtCharacterName.getDocument().addDocumentListener(textChangeListener); // TABS JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.add(strings.getProperty("panel.basicinfomation"), mainPanel); tabbedPane.add(strings.getProperty("panel.colorgroup"), colorGroupPanel); tabbedPane.add(strings.getProperty("panel.categories"), categoriesPanel); tabbedPane.add(strings.getProperty("panel.layers"), layersPanel); tabbedPane.add(strings.getProperty("panel.partssets"), partssetsPanel); tabbedPane.add(strings.getProperty("panel.recommendations"), recommendationsPanel); contentPane.add(tabbedPane, BorderLayout.CENTER); Dimension dim = new Dimension(500, 500); dim = scaleSupport.manualScaled(dim); setSize(dim); setLocationRelativeTo(parent); updateUIState(); } /** * CharacterDataから画面へ転記する. * * @param original * オリジナル情報 */ protected void loadCharacterData(CharacterData original) { if (original == null) { throw new IllegalArgumentException(); } colorGroupsTableModel.clear(); categoriesTableModel.clear(); layersTableModel.clear(); partssetsTableModel.clear(); recommendationsTableModel.clear(); // 基本情報 txtCharacterID.setText(original.getId()); txtCharacterRev.setText(original.getRev()); txtCharacterDocBase.setText(original.getDocBase() == null ? "" : original.getDocBase().toString()); txtCharacterName.setText(original.getName()); txtAuthor.setText(original.getAuthor() != null ? original.getAuthor() : ""); txtDescription.setText(original.getDescription() != null ? original.getDescription() : ""); Dimension siz = original.getImageSize(); txtImageWidth.setValue(siz != null ? siz.width : 300); txtImageHeight.setValue(siz != null ? siz.height : 400); // カラーグループ HashMap colorGroupMap = new HashMap(); for (ColorGroup colorGroup : original.getColorGroups()) { if (colorGroup.isEnabled()) { ColorGroupsTableRow mutableColorGroup = ColorGroupsTableRow.valueOf(colorGroup); colorGroupsTableModel.addRow(mutableColorGroup); colorGroupMap.put(colorGroup, mutableColorGroup); } } // カテゴリとレイヤー for (PartsCategory partsCategory : original.getPartsCategories()) { categoriesTableModel.addRow(new CategoriesTableRow(partsCategory)); for (Layer layer : partsCategory.getLayers()) { LayersTableRow editableLayer = new LayersTableRow(); ColorGroupsTableRow mutableColorGroup = colorGroupMap.get(layer.getColorGroup()); if (mutableColorGroup == null) { mutableColorGroup = ColorGroupsTableRow.NA; } editableLayer.setColorGroup(mutableColorGroup); editableLayer.setPartsCategory(new CategoriesTableRow(partsCategory)); editableLayer.setDir(layer.getDir()); editableLayer.setColorModel(ColorModels.safeValueOf(layer.getColorModelName())); editableLayer.setOrder(layer.getOrder()); editableLayer.setLayerId(layer.getId()); editableLayer.setLayerName(layer.getLocalizedName()); layersTableModel.addRow(editableLayer); } } // ディレクトリ監視有無 chkWatchDir.setSelected(original.isWatchDirectory()); // カスタムレイヤーパターンの有効・無効 chkEnableCustomLayer.setSelected(original.isEnableCustonLayerPattern()); // パーツセット ArrayList partsSets = new ArrayList(); partsSets.addAll(original.getPartsSets().values()); Collections.sort(partsSets, PartsSet.DEFAULT_COMPARATOR); for (PartsSet partsSet : partsSets) { partssetsTableModel.addRow(new PresetsTableRow(partsSet)); } partssetsTableModel.setDefaultPartsSetId(original.getDefaultPartsSetId()); // お勧めリンク List recommendationURLList = original.getRecommendationURLList(); if (recommendationURLList == null) { // お勧めリンクが設定されていない場合は、キャラクターデータに対応する // 既定のお勧めリストがあれば取得する (なければnull) RecommendationURLCompensator compensator = RecommendationURLCompensator.getInstance(); recommendationURLList = compensator.getCompensateRecommendationList(original); } if (recommendationURLList != null) { for (RecommendationURL recommendationURL : recommendationURLList) { recommendationsTableModel.addRow(new RecommendationTableRow(recommendationURL)); } } } protected void onOpenDir() { try { URI docBase = original.getDocBase(); if (!DesktopUtilities.browseBaseDir(docBase)) { JOptionPane.showMessageDialog(this, docBase); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * 画面を閉じる場合 */ protected void onClose() { result = null; boolean writable = !original.isValid() || original.canWrite(); // 新規または更新可能 if (writable) { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); if (JOptionPane.showConfirmDialog(this, strings.get("confirm.close"), strings.getProperty("confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION) { // YESでなければ継続しない. return; } } dispose(); } /** * 画面の状態を更新する */ protected void updateUIState() { boolean valid = isValidData(new ValidationReport() { public void validateReport(JComponent comp, boolean valid) { if (comp != null && comp instanceof JTextFieldEx) { ((JTextFieldEx) comp).setError(!valid); } } }); boolean writable = !original.isValid() || original.canWrite(); // 新規または更新可能 btnOK.setEnabled(valid && writable); } private interface ValidationReport { void validateReport(JComponent comp, boolean valid); } /** * 入力データが有効であるか判定する. * * @return 有効であればtrue */ protected boolean isValidData(ValidationReport report) { // ID, REVが英数字であるか判定 Pattern pat = Pattern.compile("\\p{Graph}+"); String id = txtCharacterID.getText().trim(); String rev = txtCharacterRev.getText().trim(); boolean validId = pat.matcher(id).matches(); boolean validRev = pat.matcher(rev).matches(); boolean validName = txtCharacterName.getText().trim().length() > 0; // レイヤーの不備判定 boolean validLayers = true; int cnt = 0; int mx = layersTableModel.getRowCount(); for (int idx = 0; idx < mx; idx++) { LayersTableRow layer = layersTableModel.getRow(idx); if (!layer.isValid()) { // レイヤーに不備がある validLayers = false; break; } cnt++; } if (cnt == 0) { // レイヤーがない validLayers = false; } if (report != null) { report.validateReport(txtCharacterID, validId); report.validateReport(txtCharacterRev, validRev); report.validateReport(txtCharacterName, validName); } return validLayers && validId && validRev && validName; } /** * OKボタン押下 */ protected void onOK() { if ( !isValidData(null)) { // 編集可能でないか、まだ保存可能になっていない場合はビープ音を鳴らして警告 Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } // 編集可能であり、且つ、保存可能な状態であれば CharacterData newCd = createCharacterData(); final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); if (original.isValid() && !original.isSameStructure(newCd)) { if (original.getRev().equals(newCd.getRev())) { // 構造が変更されているがREVが変らない場合 int ret = JOptionPane.showConfirmDialog(this, strings.get("confirm.needchangerevision"), strings.getProperty("confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); if (ret == JOptionPane.CANCEL_OPTION) { return; } if (ret == JOptionPane.YES_OPTION) { // リビジョンを生成して割り当てる CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); newCd.setRev(persist.generateRev()); } } else if ( !newCd.isUpperCompatibleStructure(original)){ // 上位互換のない構造が変更されていることを通知する. if (JOptionPane.showConfirmDialog(this, strings.get("confirm.changestructre"), strings.getProperty("confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION) { return; } } } result = newCd; dispose(); return; } /** * 画面の情報からキャラクターデータを構築して返します.
* * @return キャラクターデータ */ protected CharacterData createCharacterData() { CharacterData cd = new CharacterData(); // オリジナルのDocBaseVを転記する. cd.setDocBase(original.getDocBase()); // ID, REV cd.setId(txtCharacterID.getText().trim()); cd.setRev(txtCharacterRev.getText().trim()); // キャラクターセット名 cd.setName(txtCharacterName.getText().trim()); // 情報 cd.setAuthor(txtAuthor.getText().trim()); cd.setDescription(txtDescription.getText()); // サイズ Dimension imageSize = new Dimension(); imageSize.width = ((Number)(txtImageWidth.getValue())).intValue(); imageSize.height = ((Number)(txtImageHeight.getValue())).intValue(); cd.setImageSize(imageSize); // カラーグループ int mxColorGroup = colorGroupsTableModel.getRowCount(); ArrayList colorGroups = new ArrayList(); for (int idx = 0; idx < mxColorGroup; idx++) { colorGroups.add(colorGroupsTableModel.getRow(idx).convert()); } cd.setColorGroups(colorGroups); // レイヤーの構築 HashMap> layerMap = new HashMap>(); int mxLayer = layersTableModel.getRowCount(); for (int idx = 0; idx < mxLayer; idx++) { LayersTableRow editableLayer = layersTableModel.getRow(idx); Layer layer = editableLayer.toLayer(); CategoriesTableRow partsCategory = editableLayer.getPartsCategory(); if (layer != null && partsCategory != null) { List layers = layerMap.get(partsCategory); if (layers == null) { layers = new ArrayList(); layerMap.put(partsCategory, layers); } layers.add(layer); } } // カテゴリおよびレイヤー ArrayList categories = new ArrayList(); int mxCategory = categoriesTableModel.getRowCount(); for (int idx = 0; idx < mxCategory; idx++) { CategoriesTableRow partsCategory = categoriesTableModel.getRow(idx); List layers = layerMap.get(partsCategory); if (layers != null) { partsCategory.setLayers(layers); categories.add(partsCategory.convert()); } } cd.setPartsCategories(categories.toArray(new PartsCategory[categories.size()])); // ディレクトリの監視 cd.setWatchDirectory(chkWatchDir.isSelected()); // カスタムレイヤーパターンの有効・無効 cd.setEnableCustomLayerPattern(chkEnableCustomLayer.isSelected()); // パーツセット情報 int mxPartssets = partssetsTableModel.getRowCount(); for (int idx = 0; idx < mxPartssets; idx++) { PartsSet partsSet = partssetsTableModel.getRow(idx).convert(); cd.addPartsSet(partsSet); } cd.setDefaultPartsSetId(partssetsTableModel.getDefaultPartsSetId()); // お気に入りリンク情報 int mxRecommendations = recommendationsTableModel.getRowCount(); ArrayList recommendationURLList = new ArrayList(); for (int idx = 0; idx < mxRecommendations; idx++) { RecommendationTableRow row = recommendationsTableModel.getRow(idx); String displayName = row.getLocalizedName(); String url = row.getURL(); if ((displayName != null && displayName.trim().length() > 0) && (url != null && url.trim().length() > 0)) { RecommendationURL recommendationURL = new RecommendationURL(); recommendationURL.setDisplayName(displayName.trim()); recommendationURL.setUrl(url.trim()); recommendationURLList.add(recommendationURL); } } cd.setRecommendationURLList(recommendationURLList); return cd; } /** * 結果を取得する. キャンセルされた場合はnullが返される.
* * @return キャラクターデータ、またはnull */ public CharacterData getResult() { return result; } } /** * 編集用カラーグループ * * @author seraphy */ class ColorGroupsTableRow { private final String id; private final boolean enabled; private String localizedName; public static final ColorGroupsTableRow NA = new ColorGroupsTableRow("n/a", "", false); public ColorGroupsTableRow(final String id, final String localizedName) { this(id, localizedName, true); } public static ColorGroupsTableRow valueOf(ColorGroup colorGroup) { if (colorGroup == null || !colorGroup.isEnabled()) { return NA; } return new ColorGroupsTableRow(colorGroup.getId(), colorGroup.getLocalizedName(), true); } public ColorGroup convert() { if (!isEnabled()) { return ColorGroup.NA; } return new ColorGroup(getId(), getLocalizedName()); } private ColorGroupsTableRow(final String id, final String localizedName, final boolean enabled) { if (id == null || id.trim().length() == 0) { throw new IllegalArgumentException(); } this.id = id.trim(); this.localizedName = (localizedName == null || localizedName.trim().length() == 0) ? id : localizedName; this.enabled = enabled; } public void setLocalizedName(String localizedName) { if (localizedName == null || localizedName.trim().length() == 0) { throw new IllegalArgumentException(); } if (!enabled) { throw new UnsupportedOperationException("unmodified object."); } this.localizedName = localizedName; } public boolean isEnabled() { return enabled; } public String getId() { return id; } public String getLocalizedName() { return localizedName; } @Override public int hashCode() { return id.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof ColorGroupsTableRow) { ColorGroupsTableRow o = (ColorGroupsTableRow) obj; return id.equals(o.getId()); } return false; } public static boolean equals(ColorGroupsTableRow v1, ColorGroupsTableRow v2) { if (v1 == v2) { return true; } if (v1 == null || v2 == null) { return false; } return v1.equals(v2); } @Override public String toString() { return getLocalizedName(); } } /** * カラーグループのテーブル編集モデル * * @author seraphy */ class ColorGroupsTableModel extends AbstractTableModelWithComboBoxModel { private static final long serialVersionUID = 2952439955567262351L; private static final String[] colorGroupColumnNames; private static final Logger logger = Logger.getLogger(ColorGroupsTableModel.class.getName()); static { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(ProfileEditDialog.STRINGS_RESOURCE); colorGroupColumnNames = new String[] { strings.getProperty("colorgroup.column.colorgroupname"), }; } private int serialCounter = 1; public int getColumnCount() { return colorGroupColumnNames.length; } @Override public String getColumnName(int column) { return colorGroupColumnNames[column]; } public Object getValueAt(int rowIndex, int columnIndex) { ColorGroupsTableRow colorGroup = elements.get(rowIndex); switch (columnIndex) { case 0: return colorGroup.getLocalizedName(); } return "****"; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { ColorGroupsTableRow colorGroup = elements.get(rowIndex); try { switch (columnIndex) { case 0: String localizedName = (String) aValue; if (localizedName != null && localizedName.trim().length() > 0) { colorGroup.setLocalizedName(localizedName.trim()); } break; default: return; } fireTableCellUpdated(rowIndex, columnIndex); } catch (Exception ex) { logger.log(Level.FINE, "value set failed. (" + rowIndex + ", " + columnIndex + "): " + aValue, ex); // 無視する } } @Override public Class getColumnClass(int columnIndex) { return String.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return isEditable(); } public void addNewColorGroup() { String id = "cg" + UUID.randomUUID().toString(); String localizedName = "ColorGroup" + (serialCounter++); ColorGroupsTableRow colorGroup = new ColorGroupsTableRow(id, localizedName); addRow(colorGroup); } } /** * カラーグループ用のコンボボックスモデルに対して最初のアイテムとしてN/Aを常に追加するモデルに変換するラップクラス.
* * @author seraphy */ class FirstItemInjectionComboBoxModelWrapper implements ComboBoxModel { private ComboBoxModel parent; private T selectedItem; private T firstItem; private LinkedList listDataListeners = new LinkedList(); public FirstItemInjectionComboBoxModelWrapper(ComboBoxModel parent, T firstItem) { if (parent == null || firstItem == null) { throw new IllegalArgumentException(); } this.parent = parent; this.firstItem = firstItem; parent.addListDataListener(new ListDataListener() { public void contentsChanged(ListDataEvent e) { fireListUpdated(convertRowIndex(e)); } public void intervalAdded(ListDataEvent e) { fireListAdded(convertRowIndex(e)); } public void intervalRemoved(ListDataEvent e) { fireListRemoved(convertRowIndex(e)); } /** * 親コンボボックスモデルのインデックスを+1したイベントに変換する. * * @param e * 元イベント * @return インデックス変換後のイベント */ protected ListDataEvent convertRowIndex(ListDataEvent e) { return new ListDataEvent(e.getSource(), e.getType(), e .getIndex0() + 1, e.getIndex1() + 1); } }); } protected void fireListUpdated(ListDataEvent e) { for (ListDataListener listener : listDataListeners) { listener.contentsChanged(e); } } protected void fireListAdded(ListDataEvent e) { for (ListDataListener listener : listDataListeners) { listener.intervalAdded(e); } } protected void fireListRemoved(ListDataEvent e) { for (ListDataListener listener : listDataListeners) { listener.intervalRemoved(e); } } public Object getSelectedItem() { return selectedItem; } @SuppressWarnings("unchecked") public void setSelectedItem(Object anItem) { selectedItem = (T) anItem; if (!firstItem.equals(anItem)) { parent.setSelectedItem(anItem); } } public void addListDataListener(ListDataListener l) { if (l != null) { listDataListeners.add(l); } } public void removeListDataListener(ListDataListener l) { if (l != null) { listDataListeners.remove(l); } } public Object getElementAt(int index) { if (index == 0) { return firstItem; } return parent.getElementAt(index - 1); } public int getSize() { return parent.getSize() + 1; } } class CategoriesTableRow implements Comparable { /** * 順序 */ private int order; /** * カテゴリ識別名 */ private String categoryId; /** * カテゴリ表示名 */ private String localizedCategoryName; /** * 複数選択可能? */ private boolean multipleSelectable; /** * 省略可能? */ private boolean optional; /** * 表示行数 */ private int visibleRows; /** * レイヤー情報 */ private ArrayList layers = new ArrayList(); /** * カテゴリを構築する.
* * @param categoryId * カテゴリ識別名 * @param localizedCategoryName * カテゴリ表示名 * @param multipleSelectable * 複数選択可能? * @param layers * レイヤー情報の配列 */ public CategoriesTableRow(final int order, final String categoryId, String localizedCategoryName, boolean multipleSelectable, boolean optional, int visibleRows, Layer[] layers) { if (categoryId == null || categoryId.trim().length() == 0) { throw new IllegalArgumentException(); } if (layers == null) { layers = new Layer[0]; } if (localizedCategoryName == null || localizedCategoryName.trim().length() == 0) { localizedCategoryName = categoryId; } this.order = order; this.categoryId = categoryId.trim(); this.localizedCategoryName = localizedCategoryName.trim(); this.multipleSelectable = multipleSelectable; this.optional = optional; this.layers.addAll(Arrays.asList(layers)); this.visibleRows = visibleRows; } public CategoriesTableRow(PartsCategory partsCategory) { if (partsCategory == null) { throw new IllegalArgumentException(); } this.order = partsCategory.getOrder(); this.categoryId = partsCategory.getCategoryId(); this.localizedCategoryName = partsCategory.getLocalizedCategoryName(); this.multipleSelectable = partsCategory.isMultipleSelectable(); this.optional = partsCategory.isOptional(); this.layers.addAll(partsCategory.getLayers()); this.visibleRows = partsCategory.getVisibleRows(); } public PartsCategory convert() { return new PartsCategory(order, categoryId, localizedCategoryName, multipleSelectable, optional, visibleRows, layers .toArray(new Layer[layers.size()])); } public int compareTo(CategoriesTableRow o) { if (o == this) { return 0; } int ret = order - o.order; if (ret == 0) { ret = localizedCategoryName.compareTo(o.localizedCategoryName); } if (ret == 0) { ret = categoryId.compareTo(o.categoryId); } return ret; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof CategoriesTableRow) { return categoryId.equals(((CategoriesTableRow) obj).getCategoryId()); } return false; } public static boolean equals(CategoriesTableRow o1, CategoriesTableRow o2) { if (o1 == o2) { return true; } if (o1 == null || o2 == null) { return false; } return o1.equals(o2); } /** * 定義順を取得する * * @return 定義順 */ public int getOrder() { return order; } /** * 定義順を設定する * * @param order * 定義順 */ public void setOrder(int order) { this.order = order; } /** * 複数選択可能であるか? * * @return 複数選択可能であるか? */ public boolean isMultipleSelectable() { return multipleSelectable; } /** * 複数選択可能であるか設定する * * @param multipleSelectable * 複数選択可能であればtrue */ public void setMultipleSelectable(boolean multipleSelectable) { this.multipleSelectable = multipleSelectable; } /** * 省略可能か? * @return */ public boolean isOptional() { return optional; } /** * 省略可能か設定する。 * @param optional */ public void setOptional(boolean optional) { this.optional = optional; } /** * 表示行数を取得する. * * @return 表示行数 */ public int getVisibleRows() { return visibleRows; } /** * 表示行数を設定する * * @param visibleRows * 表示行数 */ public void setVisibleRows(int visibleRows) { this.visibleRows = visibleRows; } /** * このカテゴリに指定したレイヤーが含まれるか検証する. * * @param layer * レイヤー * @return 含まれる場合はtrue、含まれない場合はfalse */ public boolean hasLayer(Layer layer) { if (layer != null) { for (Layer memberLayer : layers) { if (Layer.equals(memberLayer, layer)) { return true; } } } return false; } /** * レイヤー情報 * * @return レイヤー情報 */ public Collection getLayers() { return Collections.unmodifiableCollection(layers); } /** * レイヤー情報 * * @param layers */ public void setLayers(Collection layers) { this.layers.clear(); if (layers != null) { this.layers.addAll(layers); } } /** * レイヤーを取得する.
* 該当するレイヤーがなければnull * * @param layerId * レイヤー名 * @return レイヤーもしくはnull */ public Layer getLayer(String layerId) { if (layerId == null) { return null; } for (Layer layer : layers) { if (layer.getId().equals(layerId)) { return layer; } } return null; } /** * カテゴリ識別名を取得する. * * @return カテゴリ識別名 */ public String getCategoryId() { return categoryId; } /** * カテゴリ表示名を取得する. * * @return カテゴリ表示名 */ public String getLocalizedCategoryName() { return this.localizedCategoryName; } /** * カテゴリ表示名を設定する. * * @param localizedCategoryName * カテゴリ表示名 */ public void setLocalizedCategoryName(String localizedCategoryName) { if (localizedCategoryName == null || localizedCategoryName.trim().length() == 0) { throw new IllegalArgumentException(); } this.localizedCategoryName = localizedCategoryName.trim(); } @Override public int hashCode() { return this.categoryId.hashCode(); } @Override public String toString() { return getLocalizedCategoryName(); } } /** * カテゴリのテーブル編集モデル. * * @author seraphy * */ class CategoriesTableModel extends AbstractTableModelWithComboBoxModel { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(CategoriesTableModel.class.getName()); public interface UsedCategoryDetector { List getLayers(CategoriesTableRow partsCategory); } enum ColumnDef { CATEGORY_NAME("categories.column.categoryname", true, String.class) { @Override public Object getValue(CategoriesTableRow row) { return row.getLocalizedCategoryName(); } @Override public void setValue(CategoriesTableRow row, Object aValue) { row.setLocalizedCategoryName((String) aValue); } }, MULTIPLE_SELECTABLE("categories.column.multipleselectable", true, Boolean.class) { @Override public Object getValue(CategoriesTableRow row) { return Boolean.valueOf(row.isMultipleSelectable()); } @Override public void setValue(CategoriesTableRow row, Object aValue) { row.setMultipleSelectable(((Boolean) aValue).booleanValue()); } }, OPTIONAL("categories.column.optional", true, Boolean.class) { @Override public Object getValue(CategoriesTableRow row) { return Boolean.valueOf(row.isOptional()); } @Override public void setValue(CategoriesTableRow row, Object aValue) { row.setOptional(((Boolean) aValue).booleanValue()); } }, DISPLAY_ROW_COUNT("categories.column.displayrowcount", true, Integer.class) { @Override public Object getValue(CategoriesTableRow row) { return row.getVisibleRows(); } @Override public void setValue(CategoriesTableRow row, Object aValue) { row.setVisibleRows(((Number) aValue).intValue()); } }, USED_LAYERS("categories.column.usedlayers", false, String.class) { @Override public Object getValue(CategoriesTableRow row) { return null; } }; private final String reskey; private final boolean editable; private final Class dataType; ColumnDef(String reskey, boolean editable, Class dataType) { this.reskey = reskey; this.editable = editable; this.dataType = dataType; } public Class getDataType() { return dataType; } public boolean isEditable() { return editable; } public String getResourceKey() { return reskey; } public abstract Object getValue(CategoriesTableRow row); public void setValue(CategoriesTableRow row, Object value) { throw new UnsupportedOperationException(name()); } } private static final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(ProfileEditDialog.STRINGS_RESOURCE); private static final ColumnDef[] COLUMNS = ColumnDef.values(); private int serialCounter = 1; private UsedCategoryDetector usedCategoryDetector; public CategoriesTableModel() { } public void adjustColumnModel(TableColumnModel columnModel, double scale) { for (int idx = 0; idx < COLUMNS.length; idx++) { ColumnDef columnDef = COLUMNS[idx]; String reskey = columnDef.getResourceKey(); int width = Integer.parseInt(strings.getProperty(reskey + ".width")); columnModel.getColumn(idx).setPreferredWidth((int)(width * scale)); } } public void setUsedCategoryDetector( UsedCategoryDetector usedCategoryDetector) { this.usedCategoryDetector = usedCategoryDetector; } public UsedCategoryDetector getUsedCategoryDetector() { return usedCategoryDetector; } public void addCategory() { String id = "cat" + UUID.randomUUID().toString(); String name = "Category" + (serialCounter++); CategoriesTableRow partsCategory = new CategoriesTableRow( serialCounter, id, name, false, false, 10, null); // 単一選択・必須カテゴリの作成 addRow(partsCategory); } /** * 定義順を振り直す. */ public void reorder() { int mx = elements.size(); for (int idx = 0; idx < mx; idx++) { CategoriesTableRow partsCategory = elements.get(idx); partsCategory.setOrder(idx + 1); } fireTableDataChanged(); } @Override public int moveDown(int rowIndex) { int ret = super.moveDown(rowIndex); reorder(); return ret; } @Override public int moveUp(int rowIndex) { int ret = super.moveUp(rowIndex); reorder(); return ret; } @Override public String getColumnName(int column) { String reskey = COLUMNS[column].getResourceKey(); return strings.getProperty(reskey, reskey); } public int getColumnCount() { return COLUMNS.length; } public Object getValueAt(int rowIndex, int columnIndex) { CategoriesTableRow partsCategory = elements.get(rowIndex); ColumnDef columnDef = COLUMNS[columnIndex]; if (columnDef == ColumnDef.USED_LAYERS) { // USED_LAYERSカラムは行データの外部からデータを収集して表示する StringBuilder layerNames = new StringBuilder(); List layers = null; if (usedCategoryDetector != null) { layers = usedCategoryDetector.getLayers(partsCategory); } if (layers != null) { for (LayersTableRow layer : layers) { if (layerNames.length() > 0) { layerNames.append(", "); } layerNames.append(layer.getLayerName()); } } return layerNames.toString(); } // USED_LAYERSカラム以外 return columnDef.getValue(partsCategory); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { CategoriesTableRow partsCategory = elements.get(rowIndex); try { ColumnDef columnDef = COLUMNS[columnIndex]; if (columnDef.isEditable()) { columnDef.setValue(partsCategory, aValue); fireTableCellUpdated(rowIndex, columnIndex); } } catch (RuntimeException ex) { logger.log(Level.FINE, "value set failed. (" + rowIndex + ", " + columnIndex + "): " + aValue, ex); // 無視する. } } @Override public Class getColumnClass(int columnIndex) { return COLUMNS[columnIndex].getDataType(); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return isEditable() && COLUMNS[columnIndex].isEditable(); } } /** * レイヤーのテーブル編集モデル * * @author seraphy */ class LayersTableModel extends AbstractTableModelWithComboBoxModel { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(LayersTableModel.class.getName()); private static final String[] layerColumnNames; private static final int[] layersColumnWidths; private enum Columns { /** * レイヤー名 */ LAYER_NAME("layers.column.layername", String.class) { @Override public Object getValue(LayersTableRow layer) { return layer.getLayerName(); } @Override public boolean setValue(LayersTableRow layer, Object aValue) { layer.setLayerName((String) aValue); return true; } }, /** * カテゴリ */ CATEGORY("layers.column.category", CategoriesTableRow.class) { @Override public Object getValue(LayersTableRow layer) { return layer.getPartsCategory(); } @Override public boolean setValue(LayersTableRow layer, Object aValue) { layer.setPartsCategory((CategoriesTableRow) aValue); return true; } }, /** * カラーグループ */ COLOR_GROUP("layers.column.colorgroup", ColorGroupsTableRow.class) { @Override public Object getValue(LayersTableRow layer) { return layer.getColorGroup(); } @Override public boolean setValue(LayersTableRow layer, Object aValue) { layer.setColorGroup((ColorGroupsTableRow) aValue); return true; } }, /** * 順序 */ ORDER("layers.column.order", Integer.class) { @Override public Object getValue(LayersTableRow layer) { return layer.getOrder(); } @Override public boolean setValue(LayersTableRow layer, Object aValue) { layer.setOrder(((Number) aValue).intValue()); return true; } }, /** * カラーモデル */ COLOR_MODEL("layers.column.colorModel", ColorModels.class) { @Override public Object getValue(LayersTableRow layer) { return layer.getColorModel(); } @Override public boolean setValue(LayersTableRow layer, Object aValue) { layer.setColorModel(((ColorModels) aValue)); return true; } }, /** * ディレクトリ */ DIRECTORY("layers.column.directory", String.class) { @Override public Object getValue(LayersTableRow layer) { return layer.getDir(); } @Override public boolean setValue(LayersTableRow layer, Object aValue) { layer.setDir((String) aValue); return true; } }; private final String resourceKey; private final Class typ; Columns(String resourceKey, Class typ) { this.resourceKey = resourceKey; this.typ = typ; } public String getResourceKey() { return resourceKey; } public Class getColumnClass() { return typ; } public abstract Object getValue(LayersTableRow layer); public abstract boolean setValue(LayersTableRow layer, Object aValue); } static { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(ProfileEditDialog.STRINGS_RESOURCE); int columnsLen = Columns.values().length; layerColumnNames = new String[columnsLen]; layersColumnWidths = new int[columnsLen]; for (Columns column : Columns.values()) { try { layerColumnNames[column.ordinal()] = strings.getProperty(column .getResourceKey()); layersColumnWidths[column.ordinal()] = Integer.parseInt(strings .getProperty(column.getResourceKey() + ".width")); } catch (RuntimeException ex) { logger.log(Level.SEVERE, "resource not found. related=" + column, ex); throw ex; } } } private int serialCounter = 1; public LayersTableModel() { super(); } public void adjustColumnModel(TableColumnModel columnModel, double scale) { for (int idx = 0; idx < layersColumnWidths.length; idx++) { columnModel.getColumn(idx).setPreferredWidth((int)(layersColumnWidths[idx] * scale)); } } public void addNewLayer() { LayersTableRow layer = new LayersTableRow(); String layerId = "lay" + UUID.randomUUID().toString(); String layerName = "Layer" + (serialCounter++); layer.setLayerId(layerId); layer.setLayerName(layerName); addRow(layer); } public int getColumnCount() { return layerColumnNames.length; } @Override public String getColumnName(int column) { return layerColumnNames[column]; } public Object getValueAt(int rowIndex, int columnIndex) { LayersTableRow layer = elements.get(rowIndex); Columns column = Columns.values()[columnIndex]; return column.getValue(layer); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { LayersTableRow layer = elements.get(rowIndex); try { Columns column = Columns.values()[columnIndex]; if (column.setValue(layer, aValue)) { fireTableCellUpdated(rowIndex, columnIndex); } } catch (Exception ex) { logger.log(Level.FINE, "value set failed. (" + rowIndex + ", " + columnIndex + "): " + aValue, ex); // 無視する. } } @Override public Class getColumnClass(int columnIndex) { Columns column = Columns.values()[columnIndex]; return column.getColumnClass(); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return isEditable(); } public void sort() { Collections.sort(elements, new Comparator() { public int compare(LayersTableRow o1, LayersTableRow o2) { int ret; CategoriesTableRow p1 = o1.getPartsCategory(); CategoriesTableRow p2 = o2.getPartsCategory(); if (p1 == p2) { ret = 0; } else if (p1 != null && p2 != null) { ret = p1.compareTo(p2); } else if (p1 == null) { ret = -1; } else { ret = 1; } if (ret == 0) { ret = o1.getOrder() - o2.getOrder(); } if (ret == 0) { ret = o1.getLayerId().compareTo(o2.getLayerId()); } return ret; } }); fireTableDataChanged(); } protected boolean isUsed(ColorGroupsTableRow colorGroup) { if (colorGroup != null) { for (LayersTableRow layer : elements) { if (ColorGroupsTableRow.equals(layer.getColorGroup(), colorGroup)) { return true; } } } return false; } protected boolean isUsed(CategoriesTableRow partsCategory) { if (partsCategory != null) { for (LayersTableRow layer : elements) { if (CategoriesTableRow.equals(layer.getPartsCategory(), partsCategory)) { return true; } } } return false; } } /** * レイヤーのテーブル編集モデルで使うレイヤー編集クラス * * @author seraphy */ class LayersTableRow { private String layerId; private String layerName; private CategoriesTableRow partsCategory; private ColorGroupsTableRow colorGroup = ColorGroupsTableRow.NA; private int order; private String dir; private ColorModels colorModel = ColorModels.DEFAULT; public LayersTableRow() { super(); } public String getLayerId() { return layerId; } public void setLayerId(String layerId) { if (layerId == null || layerId.trim().length() == 0) { throw new IllegalArgumentException(); } this.layerId = layerId.trim(); } public String getLayerName() { return layerName; } public void setLayerName(String layerName) { if (layerName == null || layerName.trim().length() == 0) { throw new IllegalArgumentException(); } this.layerName = layerName.trim(); } public CategoriesTableRow getPartsCategory() { return partsCategory; } public void setPartsCategory(CategoriesTableRow partsCategory) { this.partsCategory = partsCategory; } public ColorGroupsTableRow getColorGroup() { return colorGroup; } public void setColorGroup(ColorGroupsTableRow colorGroup) { if (colorGroup == null) { throw new IllegalArgumentException(); } this.colorGroup = colorGroup; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } public String getDir() { return dir; } public void setDir(String dir) { if (dir == null || dir.trim().length() == 0) { throw new IllegalArgumentException(); } dir = dir.trim(); if (dir.indexOf("/") >= 0 || dir.indexOf("\\") >= 0 || dir.indexOf("..") >= 0 || dir.endsWith(".")) { throw new IllegalArgumentException("not simple name: " + dir); } this.dir = dir; } public ColorModels getColorModel() { return colorModel; } public void setColorModel(ColorModels colorModel) { this.colorModel = colorModel; } public boolean isValid() { return layerName != null && layerName.trim().length() > 0 && dir != null && dir.trim().length() > 0 && partsCategory != null && colorGroup != null; } public Layer toLayer() { if (!isValid()) { return null; } ColorGroup colorGroup = getColorGroup().convert(); return new Layer( getLayerId(), getLayerName(), getOrder(), colorGroup, colorGroup.isEnabled(), getDir(), getColorModel().name()); } } /** * パーツセットのテーブルの行編集モデル * * @author seraphy */ class PresetsTableRow { private PartsSet partsSet; public PresetsTableRow(PartsSet partsSet) { if (partsSet == null) { throw new IllegalArgumentException(); } this.partsSet = partsSet.clone(); } public String getPartsSetId() { return partsSet.getPartsSetId(); } public String getLocalizedName() { return partsSet.getLocalizedName(); } public void setLocalizedName(String localizedName) { partsSet.setLocalizedName(localizedName); } public boolean isPresetParts() { return partsSet.isPresetParts(); } public void setPresetParts(boolean checked) { partsSet.setPresetParts(checked); } public PartsSet convert() { return partsSet.clone(); } } /** * パーツセットのテーブル編集モデル * * @author seraphy */ class PartssetsTableModel extends AbstractTableModelWithComboBoxModel { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(PartssetsTableModel.class.getName()); private static final String[] partssetsColumnNames; private static final int[] partssetsColumnWidths; private String defaultPartsSetId; static { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(ProfileEditDialog.STRINGS_RESOURCE); partssetsColumnNames = new String[] { strings.getProperty("partssets.column.default"), strings.getProperty("partssets.column.preset"), strings.getProperty("partssets.column.partssetname"), strings.getProperty("partssets.column.usedpartsname"), }; partssetsColumnWidths = new int[] { Integer.parseInt(strings.getProperty("partssets.column.default.width")), Integer.parseInt(strings.getProperty("partssets.column.preset.width")), Integer.parseInt(strings.getProperty("partssets.column.partssetname.width")), Integer.parseInt(strings.getProperty("partssets.column.usedpartsname.width")), }; } public PartssetsTableModel() { } public void setDefaultPartsSetId(String defaultPartsSetId) { this.defaultPartsSetId = defaultPartsSetId; } public String getDefaultPartsSetId() { return defaultPartsSetId; } public void adjustColumnModel(TableColumnModel columnModel, double scale) { for (int idx = 0; idx < partssetsColumnWidths.length; idx++) { columnModel.getColumn(idx).setPreferredWidth((int)(partssetsColumnWidths[idx] * scale)); } } public int getColumnCount() { return partssetsColumnNames.length; } @Override public String getColumnName(int column) { return partssetsColumnNames[column]; } public Object getValueAt(int rowIndex, int columnIndex) { PresetsTableRow rowModel = elements.get(rowIndex); switch (columnIndex) { case 0: return rowModel.getPartsSetId().equals(defaultPartsSetId); case 1: return Boolean.valueOf(rowModel.isPresetParts()); case 2: return rowModel.getLocalizedName(); case 3: return getUsedParts(rowModel); default: return null; } } private String getUsedParts(PresetsTableRow rowModel) { StringBuilder buf = new StringBuilder(); PartsSet partsSet = rowModel.convert(); ArrayList categories = new ArrayList(partsSet.keySet()); Collections.sort(categories); for (PartsCategory category : categories) { if (buf.length() > 0) { buf.append(", "); } buf.append("[" + category.getLocalizedCategoryName() + "] "); List partsIdentifiers = partsSet.get(category); if (partsIdentifiers.isEmpty()) { buf.append("empty"); } else { int mx = partsIdentifiers.size(); for (int idx = 0; idx < mx; idx++) { if (idx != 0) { buf.append(", "); } buf.append(partsIdentifiers.get(idx).getLocalizedPartsName()); } } } return buf.toString(); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { PresetsTableRow rowModel = elements.get(rowIndex); try { switch (columnIndex) { case 0: if (((Boolean) aValue).booleanValue()) { // デフォルトのパーツセットに指定した場合、プリセットもOnとなる。 rowModel.setPresetParts(true); defaultPartsSetId = rowModel.getPartsSetId(); fireTableDataChanged(); return; } break; case 1: if (((Boolean) aValue).booleanValue()) { rowModel.setPresetParts(true); } else { // デフォルトのパーツセットをプリセットから外した場合、 // デフォルトのパーツセットは未設定となる. rowModel.setPresetParts(false); if (rowModel.getPartsSetId().equals(defaultPartsSetId)) { defaultPartsSetId = null; fireTableRowsUpdated(rowIndex, rowIndex); return; } } break; case 2: String localizedName = (String) aValue; if (localizedName != null && localizedName.trim().length() > 0) { rowModel.setLocalizedName(localizedName.trim()); } break; case 3: return; default: return; } fireTableCellUpdated(rowIndex, columnIndex); } catch (Exception ex) { logger.log(Level.FINE, "value set failed. (" + rowIndex + ", " + columnIndex + "): " + aValue, ex); // 無視する. } } @Override public Class getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return Boolean.class; case 1: return Boolean.class; case 2: return String.class; case 3: return String.class; default: } return String.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { switch (columnIndex ) { case 0: return isEditable(); case 1: return isEditable(); case 2: return isEditable(); case 3: return false; default: } return false; } } /** * お勧めリンクのテーブルの行編集モデル * * @author seraphy */ class RecommendationTableRow { private RecommendationURL recommendationURL; public RecommendationTableRow(RecommendationURL recommendationURL) { if (recommendationURL == null) { throw new IllegalArgumentException(); } this.recommendationURL = recommendationURL.clone(); } public String getLocalizedName() { return recommendationURL.getDisplayName(); } public void setLocalizedName(String localizedName) { recommendationURL.setDisplayName(localizedName); } public String getURL() { return recommendationURL.getUrl(); } public void setURL(String url) { recommendationURL.setUrl(url); } public RecommendationURL convert() { return recommendationURL.clone(); } } /** * お勧めリンクのテーブル編集モデル * * @author seraphy */ class RecommendationTableModel extends AbstractTableModelWithComboBoxModel { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(PartssetsTableModel.class.getName()); private static final String[] partssetsColumnNames; private static final int[] partssetsColumnWidths; static { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(ProfileEditDialog.STRINGS_RESOURCE); partssetsColumnNames = new String[] { strings.getProperty("recommendations.column.displayName"), strings.getProperty("recommendations.column.url"), }; partssetsColumnWidths = new int[] { Integer.parseInt(strings.getProperty("recommendations.column.displayName.width")), Integer.parseInt(strings.getProperty("recommendations.column.url.width")), }; } public RecommendationTableModel() { } public void adjustColumnModel(TableColumnModel columnModel, double scale) { for (int idx = 0; idx < partssetsColumnWidths.length; idx++) { columnModel.getColumn(idx).setPreferredWidth((int)(partssetsColumnWidths[idx] * scale)); } } public void addNew() { addRow(new RecommendationTableRow(new RecommendationURL())); } public int getColumnCount() { return partssetsColumnNames.length; } @Override public String getColumnName(int column) { return partssetsColumnNames[column]; } public Object getValueAt(int rowIndex, int columnIndex) { RecommendationTableRow rowModel = elements.get(rowIndex); switch (columnIndex) { case 0: return rowModel.getLocalizedName(); case 1: return rowModel.getURL(); default: return null; } } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { RecommendationTableRow rowModel = elements.get(rowIndex); try { switch (columnIndex) { case 0: if (aValue != null && ((String) aValue).trim().length() > 0) { rowModel.setLocalizedName((String) aValue); } break; case 1: if (aValue != null && ((String) aValue).trim().length() > 0) { rowModel.setURL((String) aValue); } break; default: return; } fireTableCellUpdated(rowIndex, columnIndex); } catch (Exception ex) { logger.log(Level.FINE, "value set failed. (" + rowIndex + ", " + columnIndex + "): " + aValue, ex); // 無視する. } } @Override public Class getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return String.class; case 1: return String.class; default: } return String.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { switch (columnIndex ) { case 0: return isEditable(); case 1: return isEditable(); default: } return false; } } CharacterManaJ/src/main/java/charactermanaj/ui/InformationDialog.java0000644000175000017500000004714513615720000026062 0ustar paulliupaulliupackage charactermanaj.ui; import static java.lang.Math.*; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.URI; import java.util.Collections; import java.util.Comparator; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.AbstractCellEditor; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableRowSorter; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.graphics.io.ImageResource; import charactermanaj.graphics.io.PNGFileImageHeader; import charactermanaj.graphics.io.PNGFileImageHeaderReader; import charactermanaj.model.AppConfig; import charactermanaj.model.Layer; import charactermanaj.model.LayerOrderMapper; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.model.PartsSpecResolver; import charactermanaj.model.io.PartsImageCollectionParser; import charactermanaj.model.io.PartsImageCollectionParser.PartsImageCollectionHandler; import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.DesktopUtilities; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * 情報ダイアログを開く * @author seraphy */ public class InformationDialog extends JDialog { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(InformationDialog.class.getName()); protected static final String STRINGS_RESOURCE = "languages/informationdialog"; private PartsSpecResolver partsSpecResolver; private JTable informationTable; private InformationTableModel informationTableModel; private TableRowSorter sorter; private boolean modeOpen; private Runnable closeHandler; public InformationDialog(JFrame parent, PartsSpecResolver partsSpecResolver, Runnable closeHandler) { super(parent, false); this.partsSpecResolver = partsSpecResolver; this.closeHandler = closeHandler; AppConfig appConfig = AppConfig.getInstance(); modeOpen = appConfig.isInformationDialogOpenMethod(); if (partsSpecResolver == null) { throw new IllegalArgumentException("partsSpecResolver is null"); } setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClose(); } }); final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); setTitle(strings.getProperty("title")); informationTableModel = new InformationTableModel(); informationTable = new JTable(informationTableModel) { private static final long serialVersionUID = 1L; // セルの幅を大きいものにあわせる public Component prepareRenderer(final TableCellRenderer renderer, final int row, final int column) { final Component prepareRenderer = super.prepareRenderer(renderer, row, column); final TableColumn tableColumn = getColumnModel().getColumn(column); int preferredWidth = max(prepareRenderer .getPreferredSize().width, tableColumn .getPreferredWidth()); // セルかヘッダのどちらか幅の大きいほう if (tableColumn.getPreferredWidth() != preferredWidth) { tableColumn.setPreferredWidth(preferredWidth); } return prepareRenderer; } }; ScaleSupport scaleSupport = ScaleSupport.getInstance(this); informationTableModel.adjustColumnModel(informationTable.getColumnModel(), scaleSupport.getManualScaleX()); informationTable.setShowGrid(true); informationTable.setGridColor(appConfig.getGridColor()); informationTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); informationTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); informationTable.setRowHeight(informationTable.getRowHeight() + 4); // 行の高さをフォントの高さにする informationTable.setRowHeight((int)(informationTable.getFont().getSize() * 1.2)); informationTable.setDefaultRenderer(JButton.class, new ButtonCellRender()); informationTable.setDefaultEditor(JButton.class, new ButtonCellEditor()); sorter = new TableRowSorter(informationTableModel); sorter.setSortable(InformationTableModel.ColumnDef.EDIT_BUTTON.ordinal(), false); informationTable.setRowSorter(sorter); informationTable.getTableHeader().addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { // ヘッダをダブルクリックでソート順を解除して、モデルの標準の順番に戻す。 sorter.setSortKeys(null); e.consume(); } } }); // セルデータの幅にあわせる(事前に) for (int row = 0; row < informationTable.getRowCount(); row++) { for (int col = 0; col < informationTable.getColumnCount(); col++) { TableCellRenderer renderer = informationTable.getCellRenderer(row, col); informationTable.prepareRenderer(renderer, row, col); } } final JPopupMenu popupMenu = new JPopupMenu(); popupMenu.add(new AbstractAction(strings.getProperty("popupmenu.copyPath")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onCopyFilePath(); } }); informationTable.setComponentPopupMenu(popupMenu); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); JScrollPane informationTableSP = new JScrollPane(informationTable); JPanel informationTableSPPabel = new JPanel(new BorderLayout()); informationTableSPPabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); informationTableSPPabel.add(informationTableSP, BorderLayout.CENTER); contentPane.add(informationTableSPPabel, BorderLayout.CENTER); AbstractAction actClose = new AbstractAction(strings.getProperty("btnClose")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onClose(); } }; JPanel btnPanel = new JPanel(); btnPanel.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 45)); GridBagLayout btnPanelLayout = new GridBagLayout(); btnPanel.setLayout(btnPanelLayout); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; gbc.insets = new Insets(3, 3, 3, 3); gbc.ipadx = 0; gbc.ipady = 0; gbc.weightx = 1.; gbc.weighty = 0.; btnPanel.add(Box.createHorizontalGlue(), gbc); gbc.gridx = 1; gbc.gridy = 0; gbc.weightx = 0.; gbc.weighty = 0.; JButton btnClose = new JButton(actClose); btnPanel.add(btnClose, gbc); contentPane.add(btnPanel, BorderLayout.SOUTH); Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); rootPane.setDefaultButton(btnClose); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0), "closeInformationDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeInformationDialog"); am.put("closeInformationDialog", actClose); // 推奨サイズをスクリーンのスケールで調整する Dimension dim = getPreferredSize(); dim = scaleSupport.manualScaled(dim); setSize(dim); setLocationRelativeTo(parent); } public void showPartsInformation(PartsSet partsSet, LayerOrderMapper layerOrderMapper) { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); final PNGFileImageHeaderReader pngHeaderReader = PNGFileImageHeaderReader.getInstance(); informationTableModel.clear(); if (partsSet != null) { PartsImageCollectionParser parser = new PartsImageCollectionParser(partsSpecResolver); parser.parse(partsSet, layerOrderMapper, new PartsImageCollectionHandler() { private int serialOrder = 1; public void detectImageSource(PartsIdentifier partsIdentifier, Layer layer, float layerOrder, final ImageResource imageResource, ColorConvertParameter param) { AbstractAction act = new AbstractAction( strings.getProperty(modeOpen ? "btn.edit.open" : "btn.edit.edit")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onOpen(imageResource); } }; URI uri = imageResource.getURI(); if (uri != null && "file".equals(uri.getScheme()) && DesktopUtilities.isSupported()) { act.setEnabled(true); } else { act.setEnabled(false); } PNGFileImageHeader pngHeader; try { pngHeader = pngHeaderReader.readHeader(uri); } catch (IOException ex) { logger.log(Level.WARNING, "PNG Header loading error.: " + uri, ex); pngHeader = null; } InformationRowModel information = new InformationRowModel(serialOrder++, partsIdentifier, layer, layerOrder, imageResource, param, pngHeader, act); informationTableModel.addRow(information); } }); informationTableModel.sort(); } } protected void onClose() { if (closeHandler != null) { closeHandler.run(); } else { dispose(); } } protected void onCopyFilePath() { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); for (int selRow : informationTable.getSelectedRows()) { InformationRowModel information = informationTableModel.getRow(selRow); pw.println(information.getImageResourceName()); } Toolkit tk = Toolkit.getDefaultToolkit(); String text = sw.toString(); if (text.length() == 0) { tk.beep(); return; } StringSelection textSelection = new StringSelection(sw.toString()); Clipboard cb = tk.getSystemClipboard(); cb.setContents(textSelection, null); } protected void onOpen(ImageResource imageResource) { try { URI uri = imageResource.getURI(); if (uri != null && "file".equals(uri.getScheme())) { File file = new File(uri); DesktopUtilities.open(file); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } } class InformationTableModel extends AbstractTableModelWithComboBoxModel { protected enum ColumnDef { PARTS_NAME("column.partsName", String.class) { @Override public Object getValue(InformationRowModel information) { return information.getPartsName(); } }, CATEGORY("column.categoryName", String.class){ @Override public Object getValue(InformationRowModel information) { return information.getCategoryName(); } }, LAYER("column.layerName", String.class){ @Override public Object getValue(InformationRowModel information) { return information.getLayerName(); } }, DEFAULT_LAYER_ORDER("column.defaultLayerOrder", Integer.class){ @Override public Object getValue(InformationRowModel information) { return information.getDefaultLayerOrder(); } }, ACTUAL_LAYER_ORDER("column.layerOrder", Float.class){ @Override public Object getValue(InformationRowModel information) { return information.getLayerOrder(); } }, ORDER("column.order", Float.class){ @Override public Object getValue(InformationRowModel information) { return information.getOrder(); } }, IMAGE_SIZE("column.imagesize", String.class){ @Override public Object getValue(InformationRowModel information) { return information.getImageSizeStr(); } }, COLOR_TYPE("column.colortype", String.class){ @Override public Object getValue(InformationRowModel information) { return information.getColorTypeStr(); } }, EDIT_BUTTON("column.editbtn", JButton.class){ @Override public Object getValue(InformationRowModel information) { return information.getButton(); } }; private final String resource; private final Class cls; ColumnDef(String resource, Class cls) { this.resource = resource; this.cls = cls; } public String getResource() { return resource; } public Class getType() { return cls; } public abstract Object getValue(InformationRowModel information); } private static final ColumnDef[] COLUMNS = ColumnDef.values(); private static final long serialVersionUID = 1L; private static final String[] columnNames = new String[COLUMNS.length]; private static final int[] columnWidths = new int[COLUMNS.length]; static { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(InformationDialog.STRINGS_RESOURCE); for (int idx = 0; idx < COLUMNS.length; idx++) { columnNames[idx] = strings.getProperty(COLUMNS[idx].getResource()); columnWidths[idx] = Integer.parseInt(strings.getProperty(COLUMNS[idx].getResource() + ".width")); } } public void adjustColumnModel(TableColumnModel columnModel, double scale) { for (int idx = 0; idx < COLUMNS.length; idx++) { columnModel.getColumn(idx).setPreferredWidth((int)(columnWidths[idx] * scale)); } } public int getColumnCount() { return COLUMNS.length; } @Override public String getColumnName(int column) { return columnNames[column]; } @Override public Class getColumnClass(int columnIndex) { return COLUMNS[columnIndex].getType(); } public Object getValueAt(int rowIndex, int columnIndex) { InformationRowModel information = getRow(rowIndex); return COLUMNS[columnIndex].getValue(information); } public void sort() { Collections.sort(elements); fireTableDataChanged(); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (JButton.class.equals(COLUMNS[columnIndex].getType())) { InformationRowModel information = getRow(rowIndex); return information.getButton().isEnabled(); } return false; } } class InformationRowModel implements Comparable { private int order; private PartsIdentifier partsIdentifier; private Layer layer; private float layerOrder; private ImageResource imageResource; private JButton btnOpen; private PNGFileImageHeader pngHeader; public InformationRowModel(int order, PartsIdentifier partsIdentifier, Layer layer, float layerOrder, ImageResource imageResource, ColorConvertParameter colorConvertParameter, PNGFileImageHeader pngHeader, AbstractAction actOpen) { this.order = order; this.partsIdentifier = partsIdentifier; this.layer = layer; this.layerOrder = layerOrder; this.imageResource = imageResource; this.pngHeader = pngHeader; this.btnOpen = new JButton(actOpen) { private static final long serialVersionUID = 1L; @Override public String toString() { // JTableをクリップボードにコピーしたときに設定されるカラムの文字列表現 return "open"; } }; } @Override public int hashCode() { return partsIdentifier.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof InformationRowModel) { InformationRowModel o = (InformationRowModel) obj; return partsIdentifier.equals(o.partsIdentifier) && layer.equals(o.layer); } return false; } /** * パーツのレイヤー毎のソート順の定義 */ public static final Comparator COMPARATOR = new Comparator() { @Override public int compare(InformationRowModel o1, InformationRowModel o2) { // 補正済みレイヤー重ね順 int ret = Float.compare(o1.layerOrder, o2.layerOrder); if (ret == 0) { // レイヤー重ね順 ret = o1.layer.compareTo(o2.layer); } if (ret == 0) { // 定義順 ret = o1.order - o2.order; } if (ret == 0) { // カテゴリ、レイヤー、パーツ名順(念のため) ret = o1.partsIdentifier.compareTo(o2.partsIdentifier); } if (ret == 0) { // リソース順(念のため) ret = o1.imageResource.compareTo(o2.imageResource); } return ret; } }; public int compareTo(InformationRowModel o) { return COMPARATOR.compare(this, o); } public int getOrder() { return order; } public String getPartsName() { return this.partsIdentifier.getLocalizedPartsName(); } public String getCategoryName() { return this.partsIdentifier.getPartsCategory().getLocalizedCategoryName(); } public String getLayerName() { return this.layer.getLocalizedName(); } public int getDefaultLayerOrder() { return this.layer.getOrder(); } public float getLayerOrder() { return this.layerOrder; } public String getImageResourceName() { return this.imageResource.getFullName(); } public JButton getButton() { return btnOpen; } public String getImageSizeStr() { if (pngHeader == null) { return "INVALID"; } return pngHeader.getWidth() + "x" + pngHeader.getHeight(); } public String getColorTypeStr() { if (pngHeader == null) { return "INVALID"; } StringBuilder buf = new StringBuilder(); int colorType = pngHeader.getColorType(); if ((colorType & 0x01) != 0) { buf.append("Indexed "); } if ((colorType & 0x02) != 0) { buf.append("Color "); } else { buf.append("Greyscale "); } if (colorType == 6 || pngHeader.hasTransparencyInformation()) { // 6:TrueColor または アルファ情報がある場合のみアルファ有りとする. buf.append("Alpha "); } buf.append(pngHeader.getBitDepth() + "bit"); return buf.toString().trim(); } } /** * ボタンレンダー.
* @author seraphy */ class ButtonCellRender extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); return (JButton) value; } } /** * ボタンエディタ.
* @author seraphy */ class ButtonCellEditor extends AbstractCellEditor implements TableCellEditor { private static final long serialVersionUID = 1L; public Component getTableCellEditorComponent(final JTable table, final Object value, final boolean isSelected, final int row, final int column) { final JButton orgBtn = (JButton) value; final JButton btn = new JButton(new AbstractAction(orgBtn.getText()) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { fireEditingCanceled(); for (ActionListener listener : orgBtn.getActionListeners()) { listener.actionPerformed(e); } } }); return btn; } public Object getCellEditorValue() { return null; } } CharacterManaJ/src/main/java/charactermanaj/ui/ColorDialog.java0000644000175000017500000014574013615720000024653 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.Event; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.JSpinner; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.JToolBar; import javax.swing.KeyStroke; import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.EventListenerList; import charactermanaj.Main; import charactermanaj.graphics.colormodel.ColorModel; import charactermanaj.graphics.colormodel.ColorModels; import charactermanaj.graphics.filters.ColorConv; import charactermanaj.graphics.filters.ColorConvertParameter; import charactermanaj.model.AppConfig; import charactermanaj.model.ColorGroup; import charactermanaj.model.Layer; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.ui.model.ColorChangeEvent; import charactermanaj.ui.model.ColorChangeListener; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.ui.util.SpinnerWheelSupportListener; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.LocalizedResourcePropertyLoader; import charactermanaj.util.UIHelper; /** * カラーダイアログ.
* カラーダイアログはカテゴリ別に関連づけられており、カテゴリ内の各レイヤーに対応するタブを持つ.
* * @author seraphy */ public class ColorDialog extends JDialog { private static final long serialVersionUID = 1L; /** * ロガー */ private static final Logger logger = Logger.getLogger(ColorDialog.class.getName()); /** * このカラーダイアログが対応するカテゴリ */ private final PartsCategory partsCategory; /** * レイヤーごとのタブのマップ */ private HashMap tabs = new HashMap(); /** * タブペイン */ private JTabbedPane tabbedPane; /** * レイヤーに対するタブインデックスのマップ */ private HashMap tabbedPaneIndexMap = new HashMap(); /** * 色変更イベントのリスナのコレクション */ private final EventListenerList listeners = new EventListenerList(); /** * キャプションのプレフィックス */ private String captionBase; /** * 現在表示しているカラー情報の対象としているパーツ識別子 */ private PartsIdentifier partsIdentifier; /** * カテゴリ全体に適用するチェックボックス */ private JCheckBox chkApplyAll; /** * リセットアクション */ private Action actReset; /** * 詳細設定の表示切り替えチェックボックス */ private JCheckBox chkShowAdvancedSettings; /** * コンストラクタ * * @param parent * 親フレーム * @param partsCategory * カテゴリ * @param colorGroups * 選択可能なカラーグループのコレクション */ public ColorDialog(JFrame parent, PartsCategory partsCategory, Collection colorGroups) { super(parent); this.partsCategory = partsCategory; final Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/colordialog"); String caption = strings.getProperty("colordialog.caption"); String name = partsCategory.getLocalizedCategoryName(); captionBase = caption + name; setTitle(captionBase); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); // ダイアログを非表示にする. final AbstractAction actHide = new AbstractAction() { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { setVisible(false); } }; // 非表示アクション addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // ウィンドウの閉じるボタン押下により、ダイアログを「非表示」にする. actHide.actionPerformed(new ActionEvent(ColorDialog.this, 0, "closing")); } }); Container container = getContentPane(); this.tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT); for (final Layer layer : partsCategory.getLayers()) { final ColorDialogTabPanel tabContainer = new ColorDialogTabPanel(this, layer, colorGroups); final ColorChangeListener innerListener = new ColorChangeListener() { private Semaphore semaphore = new Semaphore(1); // イベントが循環発生することを防ぐ public void onColorChange(ColorChangeEvent event) { if (semaphore.tryAcquire()) { try { ColorDialog.this.fireColorChangeEvent(layer, false); } finally { semaphore.release(); } } } public void onColorGroupChange(ColorChangeEvent event) { if (semaphore.tryAcquire()) { try { ColorDialog.this.fireColorGroupChangeEvent(layer); ColorDialog.this.fireColorChangeEvent(layer, false); } finally { semaphore.release(); } } } }; tabContainer.addColorChangeListener(innerListener); tabContainer.addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { // レイヤータブが切り替えられるたびに、そのレイヤーの状況にあわせてリセットボタンの状態を更新する. updateResetButton(tabContainer); } }); tabContainer.addPropertyChangeListener("colorConvertParameter", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { // レイヤーの情報が変るたびにリセットボタンの状態を更新する updateResetButton(tabContainer); } }); tabbedPane.addTab(layer.getLocalizedName(), tabContainer); tabbedPaneIndexMap.put(layer, tabbedPane.getTabCount() - 1); tabs.put(layer, tabContainer); } // 適用アクション Action actApply = new AbstractAction(strings.getProperty("button.apply")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { apply(); } }; // リセットアクション actReset = new AbstractAction(strings.getProperty("button.reset")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { ColorDialogTabPanel tab = (ColorDialogTabPanel) tabbedPane .getSelectedComponent(); if (tab != null) { resetColor(tab); apply(); } } }; JPanel btnPanel = new JPanel(); btnPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); GridBagLayout gbl = new GridBagLayout(); btnPanel.setLayout(gbl); int colIdx = 0; GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = colIdx++; gbc.gridy = 0; gbc.ipadx = 0; gbc.ipady = 0; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; chkApplyAll = new JCheckBox(strings.getProperty("checkbox.applyAllItems")); chkApplyAll.setSelected(!partsCategory.isMultipleSelectable()); chkApplyAll.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // すべてに適用のチェックが変更された場合は全レイヤーの色の変更通知を出す. apply(); } }); btnPanel.add(chkApplyAll, gbc); gbc.gridx = colIdx++; gbc.gridy = 0; gbc.weightx = 1.; btnPanel.add(Box.createHorizontalGlue(), gbc); // 「適用」ボタン、アプリケーション設定により有無を選択できる. JButton btnApply = null; final AppConfig appConfig = AppConfig.getInstance(); if ( !appConfig.isEnableAutoColorChange()) { gbc.gridx = colIdx++; gbc.gridy = 0; gbc.weightx = 0.; btnApply = new JButton(actApply); btnPanel.add(btnApply, gbc); } gbc.gridx = colIdx++; gbc.gridy = 0; gbc.weightx = 0.; JButton btnReset = new JButton(actReset); btnPanel.add(btnReset, gbc); // ダイアログ上部のボタンバー UIHelper uiUtl = UIHelper.getInstance(); JButton copyBtn = uiUtl.createIconButton("icons/copy.png"); JButton pasteBtn = uiUtl.createIconButton("icons/paste.png"); copyBtn.setToolTipText(strings.getProperty("copy")); pasteBtn.setToolTipText(strings.getProperty("paste")); Action actCopy = new AbstractAction() { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0; onCopy(shift); } }; Action actPaste = new AbstractAction() { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { onPaste(); } }; copyBtn.addActionListener(actCopy); pasteBtn.addActionListener(actPaste); final JToolBar toolBar = new JToolBar(); toolBar.setFloatable(false); toolBar.add(copyBtn); toolBar.add(pasteBtn); AbstractAction actShowAdvancedSetting = new AbstractAction( strings.getProperty("chk.showAdvancedSettings")) { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { onChangeShowAdvancedSettings(); } }; chkShowAdvancedSettings = new JCheckBox(actShowAdvancedSetting); chkShowAdvancedSettings.setSelected(appConfig.isEnableColorAdvancedSettings()); onChangeShowAdvancedSettings(); Box btns = Box.createHorizontalBox(); btns.add(chkShowAdvancedSettings); btns.add(Box.createHorizontalGlue()); btns.add(toolBar); container.setLayout(new BorderLayout()); container.add(btns, BorderLayout.NORTH); container.add(tabbedPane, BorderLayout.CENTER); container.add(btnPanel, BorderLayout.SOUTH); Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); // 「適用」ボタンがある場合は、デフォルトボタンに設定する. if (btnApply != null) { rootPane.setDefaultButton(btnApply); } // CTRL-Wでウィンドウを非表示にする. (ESCでは非表示にしない) InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); int ctrlMask = tk.getMenuShortcutKeyMask(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, ctrlMask), "hideColorDialog"); am.put("hideColorDialog", actHide); // CTRL-SHIFT-C でパラメータのコピー im.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, ctrlMask + Event.SHIFT_MASK), "copyColorParam"); am.put("copyColorParam", actCopy); // CTRL-SHIFT-V でパラメーターの貼り付け im.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, ctrlMask + Event.SHIFT_MASK), "pastColorParam"); am.put("pastColorParam", actPaste); // CTRL-E で詳細設定の表示切り替え im.put(KeyStroke.getKeyStroke(KeyEvent.VK_E, ctrlMask), "showAdvancedSetting"); am.put("showAdvancedSetting", new AbstractAction() { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { // 詳細表示チェックボックスをトグル動作して画面を更新する chkShowAdvancedSettings.setSelected(!chkShowAdvancedSettings.isSelected()); onChangeShowAdvancedSettings(); } }); pack(); } /** * 詳細設定の表示切り替え */ protected void onChangeShowAdvancedSettings() { boolean show = chkShowAdvancedSettings.isSelected(); for (ColorDialogTabPanel tabContainer : tabs.values()) { tabContainer.setVisibleAdvancedSettings(show); } pack(); } /** * 設定値をクリップボードにコピーする */ protected void onCopy(boolean advanced) { Toolkit tk = Toolkit.getDefaultToolkit(); ColorDialogTabPanel tabContainer = (ColorDialogTabPanel) tabbedPane.getSelectedComponent(); if (tabContainer == null) { tk.beep(); return; } ColorConvertParameter param = tabContainer.getColorConvertParameter(); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); // コメントヘッダ if (partsIdentifier != null) { pw.println("# " + partsIdentifier.getLocalizedPartsName()); } pw.println("# " + partsCategory.getLocalizedCategoryName()); pw.println("# " + tabContainer.getLayer().getLocalizedName()); pw.println(); // パラメータ pw.println("hue=" + param.getHue()); pw.println("saturation=" + param.getSaturation()); pw.println("brightness=" + param.getBrightness()); pw.println("contrast=" + param.getContrast()); if (advanced) { pw.println(); pw.println("offsetR=" + param.getOffsetR()); pw.println("offsetG=" + param.getOffsetG()); pw.println("offsetB=" + param.getOffsetB()); pw.println("offsetA=" + param.getOffsetA()); pw.println("factorR=" + param.getFactorR()); pw.println("factorG=" + param.getFactorG()); pw.println("factorB=" + param.getFactorB()); pw.println("factorA=" + param.getFactorA()); pw.println("gammaR=" + param.getGammaR()); pw.println("gammaG=" + param.getGammaG()); pw.println("gammaB=" + param.getGammaB()); pw.println("gammaA=" + param.getGammaA()); pw.println("grayLevel=" + param.getGrayLevel()); pw.println("replace=" + param.getColorReplace()); } Clipboard cb = tk.getSystemClipboard(); StringSelection selection = new StringSelection(sw.toString()); cb.setContents(selection, null); } /** * クリップボードから設定値を貼り付ける */ protected void onPaste() { Toolkit tk = Toolkit.getDefaultToolkit(); ColorDialogTabPanel tabContainer = (ColorDialogTabPanel) tabbedPane.getSelectedComponent(); if (tabContainer == null) { tk.beep(); return; } Clipboard cb = tk.getSystemClipboard(); Transferable trans = cb.getContents(null); if (trans == null) { tk.beep(); return; } try { // 文字列を格納しているか? if (!trans.isDataFlavorSupported(DataFlavor.stringFlavor)) { // テキストを持っていない tk.beep(); return; } // 現在の設定を取得する ColorConvertParameter param = tabContainer.getColorConvertParameter(); ColorConvertParameter org = param.clone(); // 変更有無の判定のため現在値をコピーする List errorLines = new ArrayList(); BufferedReader rd = new BufferedReader(DataFlavor.stringFlavor.getReaderForText(trans)); try { // テキストを読み込みつつ、対応するパラメータを設定する。 for (;;) { String line = rd.readLine(); if (line == null) { break; } // #以降はコメント int pt = line.indexOf('#'); if (pt >= 0) { line = line.substring(0, pt); } line = line.trim(); if (line.isEmpty()) { // 空行は無視 continue; } String[] tokens = line.split("="); if (tokens.length == 2) { String name = tokens[0].trim().toLowerCase(); String val = tokens[1].trim(); try { if ("hue".equals(name)) { param.setHue(Float.parseFloat(val)); } else if ("saturation".equals(name)) { param.setSaturation(Float.parseFloat(val)); } else if ("brightness".equals(name)) { param.setBrightness(Float.parseFloat(val)); } else if ("contrast".equals(name)) { param.setContrast(Float.parseFloat(val)); } else if ("offsetr".equals(name)) { param.setOffsetR(Integer.parseInt(val)); } else if ("offsetg".equals(name)) { param.setOffsetG(Integer.parseInt(val)); } else if ("offsetb".equals(name)) { param.setOffsetB(Integer.parseInt(val)); } else if ("offseta".equals(name)) { param.setOffsetA(Integer.parseInt(val)); } else if ("factorr".equals(name)) { param.setFactorR(Float.parseFloat(val)); } else if ("factorg".equals(name)) { param.setFactorG(Float.parseFloat(val)); } else if ("factorb".equals(name)) { param.setFactorB(Float.parseFloat(val)); } else if ("factora".equals(name)) { param.setFactorA(Float.parseFloat(val)); } else if ("gammar".equals(name)) { param.setGammaR(Float.parseFloat(val)); } else if ("gammag".equals(name)) { param.setGammaG(Float.parseFloat(val)); } else if ("gammab".equals(name)) { param.setGammaB(Float.parseFloat(val)); } else if ("gammaa".equals(name)) { param.setGammaA(Float.parseFloat(val)); } else if ("graylevel".equals(name)) { param.setGrayLevel(Float.parseFloat(val)); } else if ("replace".equals(name)) { param.setColorReplace(ColorConv.valueOf(val)); } else { // 未知のパラメーター errorLines.add(line); } } catch (RuntimeException ex) { // パラメーターエラー logger.log(Level.WARNING, "failed to read the clipboard.", ex); errorLines.add(line); errorLines.add("* " + ex.toString()); } } else { // フォーマットが不正 errorLines.add(line); } if (errorLines.size() > 30) { // エラー行数が30を超えたら、 // 操作ミス等による関係ないテキストを放り込んだ可能性が大なので打ち切る break; } } } finally { rd.close(); } if (!param.equals(org)) { // クリップボートから取得されたパラメータを設定します。 tabContainer.applyColorConvertParameter(param); } // パラメータの取り込みに失敗した行を表示する if (errorLines.size() > 0) { StringBuilder buf = new StringBuilder(); String lineBreak = System.getProperty("line.separator"); for (String line : errorLines) { buf.append(line).append(lineBreak); } JTextArea message = new JTextArea(buf.toString()); message.setEditable(false); JScrollPane scr = new JScrollPane(message); scr.setPreferredSize(new Dimension(200, 200)); final Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/colordialog"); String title = strings.getProperty("clipboard.paste.formatErrorTitle"); JOptionPane.showMessageDialog(this, scr, title, JOptionPane.ERROR_MESSAGE); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } /** * 各レイヤーのカラー情報のタブが開かれた場合、もしくはカラーの設定値が変更されるたびに 呼び出されて、リセットボタンの状態を変更します.
* 現在のタブが選択しているパネルと異なるパネルからの要求については無視されます.
* * @param panel * 色情報が変更された、もしくは開かれた対象パネル */ protected void updateResetButton(ColorDialogTabPanel panel) { ColorDialogTabPanel currentPanel = (ColorDialogTabPanel) tabbedPane.getSelectedComponent(); if (currentPanel != null && currentPanel.equals(panel)) { actReset.setEnabled(panel.isColorConvertParameterModified()); } } /** * このカラーダイアログが対応するパーツカテゴリを取得する.
* * @return パーツカテゴリ */ public PartsCategory getPartsCategory() { return partsCategory; } /** * 指定したレイヤーのカラーグループが「連動」しているか?
* カテゴリに属していないレイヤーを指定した場合は常にfalseを返す.
* * @param layer * レイヤー * @return 連動している場合はtrue、そうでなければfalse */ public boolean isSyncColorGroup(Layer layer) { ColorDialogTabPanel tab = tabs.get(layer); if (tab == null) { return false; } return tab.isSyncColorGroup(); } /** * 指定したレイヤーのカラーグループの連動フラグを設定する.
* カテゴリに属していないレイヤーを指定した場合は何もしない.
* * @param layer * レイヤー * @param selected * 連動フラグ */ public void setSyncColorGroup(Layer layer, boolean selected) { ColorDialogTabPanel tab = tabs.get(layer); if (tab != null) { tab.setSyncColorGroup(selected); } } /** * レイヤーごとの色情報のマップを指定して、各レイヤーに色情報を設定する.
* カテゴリに属していないレイヤーが含まれる場合は例外となる.
* * @param params * レイヤーと色情報のマップ */ public void setColorConvertParameters(Map params) { if (params == null) { throw new IllegalArgumentException(); } for (Layer layer : partsCategory.getLayers()) { ColorConvertParameter param = params.get(layer); if (param == null) { param = new ColorConvertParameter(); } setColorConvertParameter(layer, param); } } /** * 対象となるパーツ識別子を指定する。
* カラーダイアログのキャプションにパーツ名を設定される.
* nullを指定した場合はキャプションからパーツ名が除去される.
* * @param partsIdentifier * パーツ識別子、もしくはnull */ public void setPartsIdentifier(PartsIdentifier partsIdentifier) { this.partsIdentifier = partsIdentifier; if (partsIdentifier == null) { setTitle(captionBase); } else { setTitle(captionBase + "(" + partsIdentifier.getLocalizedPartsName() + ")"); } } /** * 対象となるパーツ識別子を取得する.
* 設定されていなければnullが返される.
* * @return パーツ識別子、もしくはnull */ public PartsIdentifier getPartsIdentifier() { return partsIdentifier; } /** * 各レイヤーのタブの有効・無効状態を設定します.
* カテゴリに属さないレイヤーは無視されます.
* nullを指定した場合は、すべてのレイヤーが「有効」となります.
* * @param layers * 有効とするレイヤーのコレクション、もしくはnull */ public void setEnableLayers(Collection layers) { for (Map.Entry entry : tabs.entrySet()) { Layer layer = entry.getKey(); boolean enabled = (layers == null) || layers.contains(layer); Integer tabIndex = tabbedPaneIndexMap.get(layer); if (tabIndex != null) { if (Main.isMacOSX()) { // OSXの場合、タブをディセーブルにしても表示が変化ないので // タブタイトルを変更することでディセーブルを示す. // (html3で表現しようとしたところ、かなりバギーだったため採用せず) tabbedPane.setTitleAt(tabIndex, enabled ? layer.getLocalizedName() : "-"); } tabbedPane.setEnabledAt(tabIndex, enabled); if (logger.isLoggable(Level.FINEST)) { logger.log(Level.FINEST, "setEnableLayers(" + layer + ")=" + enabled); } } } } /** * 「すべてに適用」フラグを取得する.
* * @return すべてに適用フラグ */ public boolean isApplyAll() { return chkApplyAll.isSelected(); } /** * 各レイヤーと、その色情報をマップとして取得する.
* * @return 各レイヤーと、その色情報のマップ */ public Map getColorConvertParameters() { HashMap params = new HashMap(); for (Layer layer : partsCategory.getLayers()) { ColorDialogTabPanel tab = tabs.get(layer); ColorConvertParameter param = tab.getColorConvertParameter(); params.put(layer, param); } return params; } /** * レイヤーを指定して、色情報を設定する.
* カテゴリに属していないレイヤーを指定した場合は例外となる.
* * @param layer * レイヤー * @param param * 色情報 */ public void setColorConvertParameter(Layer layer, ColorConvertParameter param) { if (layer == null || param == null) { throw new IllegalArgumentException(); } ColorDialogTabPanel tab = tabs.get(layer); if (tab == null) { throw new IllegalArgumentException("layer not found. " + layer + "/tabs=" + tabs); } tab.setColorConvertParameter(param); } /** * 指定したレイヤーの色情報を取得する.
* カテゴリに属していないレイヤーを指定した場合は例外となる.
* * @param layer * レイヤー * @return 色情報 */ public ColorConvertParameter getColorConvertParameter(Layer layer) { if (layer == null) { throw new IllegalArgumentException(); } ColorDialogTabPanel tab = tabs.get(layer); if (tab == null) { throw new IllegalArgumentException("layer not found. " + layer); } return tab.getColorConvertParameter(); } /** * 指定したレイヤーのカラーグループを取得する.
* カテゴリに属さないレイヤーを指定した場合は例外となる.
* * @param layer * レイヤー * @return カラーグループ */ public ColorGroup getColorGroup(Layer layer) { if (layer == null) { throw new IllegalArgumentException(); } ColorDialogTabPanel tab = tabs.get(layer); if (tab == null) { throw new IllegalArgumentException("layer not found. " + layer); } return tab.getColorGroup(); } /** * 指定したレイヤーのカラーグループを設定する.
* カテゴリに属さないレイヤーを指定した場合は例外となる.
* * @param layer * レイヤー * @param colorGroup * カラーグループ */ public void setColorGroup(Layer layer, ColorGroup colorGroup) { if (layer == null || colorGroup == null) { throw new IllegalArgumentException(); } ColorDialogTabPanel tab = tabs.get(layer); if (tab != null) { tab.setColorGroup(colorGroup); } } /** * 色ダイアログが変更された場合に通知を受けるリスナーを登録する.
* * @param listener * リスナー */ public void addColorChangeListener(ColorChangeListener listener) { if (listener == null) { throw new IllegalArgumentException(); } listeners.add(ColorChangeListener.class, listener); } /** * 色ダイアログが変更された場合に通知を受けるリスナーを登録解除する.
* * @param listener */ public void removeColorChangeListener(ColorChangeListener listener) { listeners.remove(ColorChangeListener.class, listener); } /** * 全レイヤーに対するカラー変更イベントを明示的に送信する. */ protected void apply() { for (Layer layer : getPartsCategory().getLayers()) { ColorDialog.this.fireColorChangeEvent(layer, true); } } /** * カラーをリセットする. */ protected void resetColor(ColorDialogTabPanel tab) { tab.resetColor(); } /** * 指定したレイヤーに対するカラー変更イベントを通知する.
* ただし、force引数がfalseである場合、アプリケーション設定で即時プレビューが指定されていない場合は通知しない.
* * @param layer * レイヤー * @param force * アプリケーション設定に関わらず送信する場合はtrue */ protected void fireColorChangeEvent(Layer layer, boolean force) { if (layer == null) { throw new IllegalArgumentException(); } if (!force) { AppConfig appConfig = AppConfig.getInstance(); if (!appConfig.isEnableAutoColorChange()) { return; } } // Guaranteed to return a non-null array Object[] ll = listeners.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event // ※ 逆順で通知するのがSwingの作法らしい。 ColorChangeEvent event = null; for (int i = ll.length - 2; i >= 0; i -= 2) { if (ll[i] == ColorChangeListener.class) { // Lazily create the event: if (event == null) { event = new ColorChangeEvent(this, layer); } ((ColorChangeListener) ll[i + 1]).onColorChange(event); } } } /** * 色グループが変更されたことを通知する.
* * @param layer * レイヤー */ protected void fireColorGroupChangeEvent(Layer layer) { if (layer == null) { throw new IllegalArgumentException(); } // Guaranteed to return a non-null array Object[] ll = listeners.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event // ※ 逆順で通知するのがSwingの作法らしい。 ColorChangeEvent event = null; for (int i = ll.length - 2; i >= 0; i -= 2) { if (ll[i] == ColorChangeListener.class) { // Lazily create the event: if (event == null) { event = new ColorChangeEvent(this, layer); } ((ColorChangeListener) ll[i + 1]).onColorGroupChange(event); } } } @Override public String toString() { return "ColorDialog(partsCategory:" + partsCategory + ")"; } } class ColorDialogTabPanel extends JPanel { private static final long serialVersionUID = 1L; private final ColorDialog parent; private Layer layer; private JComboBox cmbColorReplace; private JSpinner spinGray; private JSpinner spinOffsetR; private JSpinner spinOffsetG; private JSpinner spinOffsetB; private JSpinner spinOffsetA; private JSpinner spinFactorR; private JSpinner spinFactorG; private JSpinner spinFactorB; private JSpinner spinFactorA; private JSpinner spinHue; private JSpinner spinSaturation; private JSpinner spinBrightness; private JSpinner spinContrast; private JSpinner spinGammaR; private JSpinner spinGammaG; private JSpinner spinGammaB; private JSpinner spinGammaA; private JComboBox cmbColorGroup; private JCheckBox chkColorGroupSync; /** * パラメータの明示的変更時に他のパラメータへの反映イベントを停止させるためのセマフォ */ private AtomicInteger changeEventDisableSemaphore = new AtomicInteger(); /** * 明示的に設定されたカラーパラメータを保存する.(リセットに使用するため) */ private ColorConvertParameter paramOrg = new ColorConvertParameter(); /** * 現在の画面項目からカラー情報を組み立てたキャッシュ。 * (画面項目の更新によりクリアされる。) */ private ColorConvertParameter chachedParam; private LinkedList listeners = new LinkedList(); public void addColorChangeListener(ColorChangeListener listener) { if (listener == null) { throw new IllegalArgumentException(); } listeners.add(listener); } public void removeColorChangeListener(ColorChangeListener listener) { listeners.remove(listener); } protected void fireColorChangeEvent() { if (layer == null) { throw new IllegalArgumentException(); } chachedParam = null; if (changeEventDisableSemaphore.get() <= 0) { ColorChangeEvent event = new ColorChangeEvent(parent, layer); for (ColorChangeListener listener : listeners) { listener.onColorChange(event); } } } protected void fireColorGroupChangeEvent() { if (layer == null) { throw new IllegalArgumentException(); } chachedParam = null; if (changeEventDisableSemaphore.get() <= 0) { ColorChangeEvent event = new ColorChangeEvent(parent, layer); for (ColorChangeListener listener : listeners) { listener.onColorGroupChange(event); } } } private JPanel colorReplacePanel; private JPanel colorLevelPanel; public ColorDialogTabPanel(final ColorDialog parent, final Layer layer, Collection colorGroups) { if (parent == null || layer == null || colorGroups == null) { throw new IllegalArgumentException(); } this.parent = parent; this.layer = layer; final Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/colordialog"); setLayout(new BorderLayout()); JPanel container = new JPanel(); BoxLayout boxlayout = new BoxLayout(container, BoxLayout.PAGE_AXIS); container.setLayout(boxlayout); add(container, BorderLayout.NORTH); // 変更イベントハンドラ final ChangeListener changeEventHandler = new ChangeListener() { public void stateChanged(ChangeEvent e) { fireColorChangeEvent(); firePropertyChange("colorConvertParameter", null, null); } }; // 色置換パネル colorReplacePanel = new JPanel(); colorReplacePanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(3, 3, 3, 3), BorderFactory.createTitledBorder(strings.getProperty("group.replacergb.caption")))); GridBagLayout gbl = new GridBagLayout(); colorReplacePanel.setLayout(gbl); GridBagConstraints gbc = new GridBagConstraints(); JLabel lblColorReplace = new JLabel(strings.getProperty("replacergb"), JLabel.RIGHT); cmbColorReplace = new JComboBox(ColorConv.values()); JLabel lblGray = new JLabel(strings.getProperty("bright"), JLabel.RIGHT); SpinnerNumberModel grayModel = new SpinnerNumberModel(1., 0., 1., 0.01); grayModel.addChangeListener(changeEventHandler); cmbColorReplace.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { fireColorChangeEvent(); firePropertyChange("colorConvertParameter", null, null); } }); spinGray = new JSpinner(grayModel); spinGray.addMouseWheelListener(new SpinnerWheelSupportListener(grayModel)); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; gbc.ipadx = 0; gbc.ipady = 0; gbc.insets = new Insets(3, 3, 3, 3); colorReplacePanel.add(lblColorReplace, gbc); gbc.gridx = 1; gbc.gridy = 0; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 1.; gbc.weighty = 0.; colorReplacePanel.add(cmbColorReplace, gbc); gbc.gridx = 2; gbc.gridy = 0; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.; gbc.weighty = 0.; colorReplacePanel.add(lblGray, gbc); gbc.gridx = 3; gbc.gridy = 0; gbc.weightx = 1.; gbc.weighty = 0.; gbc.gridwidth = 1; gbc.gridheight = 1; colorReplacePanel.add(spinGray, gbc); // RGB変更パネル colorLevelPanel = new JPanel(); colorLevelPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(3, 3, 3, 3), BorderFactory.createTitledBorder(strings.getProperty("group.rgb.caption")))); GridLayout gl = new GridLayout(4, 5); gl.setHgap(2); gl.setVgap(2); colorLevelPanel.setLayout(gl); colorLevelPanel.add(Box.createGlue()); colorLevelPanel.add(new JLabel(strings.getProperty("red"), JLabel.CENTER)); colorLevelPanel.add(new JLabel(strings.getProperty("green"), JLabel.CENTER)); colorLevelPanel.add(new JLabel(strings.getProperty("blue"), JLabel.CENTER)); colorLevelPanel.add(new JLabel(strings.getProperty("alpha"), JLabel.CENTER)); colorLevelPanel.add(new JLabel(strings.getProperty("offset"), JLabel.RIGHT)); SpinnerNumberModel offsetModelR = new SpinnerNumberModel(0, -255, 255, 1); SpinnerNumberModel offsetModelG = new SpinnerNumberModel(0, -255, 255, 1); SpinnerNumberModel offsetModelB = new SpinnerNumberModel(0, -255, 255, 1); SpinnerNumberModel offsetModelA = new SpinnerNumberModel(0, -255, 255, 1); offsetModelR.addChangeListener(changeEventHandler); offsetModelG.addChangeListener(changeEventHandler); offsetModelB.addChangeListener(changeEventHandler); offsetModelA.addChangeListener(changeEventHandler); spinOffsetR = new JSpinner(offsetModelR); spinOffsetG = new JSpinner(offsetModelG); spinOffsetB = new JSpinner(offsetModelB); spinOffsetA = new JSpinner(offsetModelA); spinOffsetR.addMouseWheelListener(new SpinnerWheelSupportListener(offsetModelR)); spinOffsetG.addMouseWheelListener(new SpinnerWheelSupportListener(offsetModelG)); spinOffsetB.addMouseWheelListener(new SpinnerWheelSupportListener(offsetModelB)); spinOffsetA.addMouseWheelListener(new SpinnerWheelSupportListener(offsetModelA)); colorLevelPanel.add(spinOffsetR); colorLevelPanel.add(spinOffsetG); colorLevelPanel.add(spinOffsetB); colorLevelPanel.add(spinOffsetA); colorLevelPanel.add(new JLabel(strings.getProperty("factor"), JLabel.RIGHT)); SpinnerNumberModel factorModelR = new SpinnerNumberModel(1., 0.01, 99, 0.01); SpinnerNumberModel factorModelG = new SpinnerNumberModel(1., 0.01, 99, 0.01); SpinnerNumberModel factorModelB = new SpinnerNumberModel(1., 0.01, 99, 0.01); SpinnerNumberModel factorModelA = new SpinnerNumberModel(1., 0.01, 99, 0.01); factorModelR.addChangeListener(changeEventHandler); factorModelG.addChangeListener(changeEventHandler); factorModelB.addChangeListener(changeEventHandler); factorModelA.addChangeListener(changeEventHandler); spinFactorR = new JSpinner(factorModelR); spinFactorG = new JSpinner(factorModelG); spinFactorB = new JSpinner(factorModelB); spinFactorA = new JSpinner(factorModelA); spinFactorR.addMouseWheelListener(new SpinnerWheelSupportListener(factorModelR)); spinFactorG.addMouseWheelListener(new SpinnerWheelSupportListener(factorModelG)); spinFactorB.addMouseWheelListener(new SpinnerWheelSupportListener(factorModelB)); spinFactorA.addMouseWheelListener(new SpinnerWheelSupportListener(factorModelA)); colorLevelPanel.add(spinFactorR); colorLevelPanel.add(spinFactorG); colorLevelPanel.add(spinFactorB); colorLevelPanel.add(spinFactorA); colorLevelPanel.add(new JLabel(strings.getProperty("gamma"), JLabel.RIGHT)); SpinnerNumberModel gammaModelR = new SpinnerNumberModel(1., 0.01, 99, 0.01); SpinnerNumberModel gammaModelG = new SpinnerNumberModel(1., 0.01, 99, 0.01); SpinnerNumberModel gammaModelB = new SpinnerNumberModel(1., 0.01, 99, 0.01); SpinnerNumberModel gammaModelA = new SpinnerNumberModel(1., 0.01, 99, 0.01); gammaModelR.addChangeListener(changeEventHandler); gammaModelG.addChangeListener(changeEventHandler); gammaModelB.addChangeListener(changeEventHandler); gammaModelA.addChangeListener(changeEventHandler); spinGammaR = new JSpinner(gammaModelR); spinGammaG = new JSpinner(gammaModelG); spinGammaB = new JSpinner(gammaModelB); spinGammaA = new JSpinner(gammaModelA); spinGammaR.addMouseWheelListener(new SpinnerWheelSupportListener(gammaModelR)); spinGammaG.addMouseWheelListener(new SpinnerWheelSupportListener(gammaModelG)); spinGammaB.addMouseWheelListener(new SpinnerWheelSupportListener(gammaModelB)); spinGammaA.addMouseWheelListener(new SpinnerWheelSupportListener(gammaModelA)); colorLevelPanel.add(spinGammaR); colorLevelPanel.add(spinGammaG); colorLevelPanel.add(spinGammaB); colorLevelPanel.add(spinGammaA); // 色調パネル ColorModel colorModel = ColorModels.safeValueOf(layer.getColorModelName()); JPanel colorTunePanel = new JPanel(); colorTunePanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(3, 3, 3, 3), BorderFactory.createTitledBorder(strings.getProperty(colorModel.getTitle())))); GridLayout gl2 = new GridLayout(3, 4); gl2.setHgap(3); gl2.setVgap(3); colorTunePanel.setLayout(gl2); colorTunePanel.add(new JLabel(strings.getProperty(colorModel .getItemTitle(0)), JLabel.CENTER)); // Hue 色相 colorTunePanel.add(new JLabel(strings.getProperty(colorModel .getItemTitle(1)), JLabel.CENTER)); // Saturation 彩度 colorTunePanel.add(new JLabel(strings.getProperty(colorModel .getItemTitle(2)), JLabel.CENTER)); // Brightness 明度 colorTunePanel.add(new JLabel(strings.getProperty("contrast"), JLabel.CENTER)); // Contrast コントラスト SpinnerNumberModel hsbModelH = new SpinnerNumberModel(0., -1., 1., 0.001); SpinnerNumberModel hsbModelS = new SpinnerNumberModel(0., -1., 1., 0.001); SpinnerNumberModel hsbModelB = new SpinnerNumberModel(0., -1., 1., 0.001); SpinnerNumberModel hsbModelC = new SpinnerNumberModel(0., -1., 1., 0.001); hsbModelH.addChangeListener(changeEventHandler); hsbModelS.addChangeListener(changeEventHandler); hsbModelB.addChangeListener(changeEventHandler); hsbModelC.addChangeListener(changeEventHandler); spinHue = new JSpinner(hsbModelH); spinSaturation = new JSpinner(hsbModelS); spinBrightness = new JSpinner(hsbModelB); spinContrast = new JSpinner(hsbModelC); spinHue.addMouseWheelListener(new SpinnerWheelSupportListener(hsbModelH)); spinSaturation.addMouseWheelListener(new SpinnerWheelSupportListener(hsbModelS)); spinBrightness.addMouseWheelListener(new SpinnerWheelSupportListener(hsbModelB)); spinContrast.addMouseWheelListener(new SpinnerWheelSupportListener(hsbModelC)); colorTunePanel.add(spinHue); colorTunePanel.add(spinSaturation); colorTunePanel.add(spinBrightness); colorTunePanel.add(spinContrast); JSlider sliderHue = new JSlider(); JSlider sliderSaturation = new JSlider(); JSlider sliderBrightness = new JSlider(); JSlider sliderContrast = new JSlider(); sliderHue.setPreferredSize(spinHue.getPreferredSize()); sliderSaturation.setPreferredSize(spinSaturation.getPreferredSize()); sliderBrightness.setPreferredSize(spinBrightness.getPreferredSize()); sliderContrast.setPreferredSize(spinContrast.getPreferredSize()); colorTunePanel.add(sliderHue); colorTunePanel.add(sliderSaturation); colorTunePanel.add(sliderBrightness); colorTunePanel.add(sliderContrast); JSlider sliders[] = new JSlider[] {sliderHue, sliderSaturation, sliderBrightness, sliderContrast}; JSpinner spinners[] = new JSpinner[] {spinHue, spinSaturation, spinBrightness, spinContrast}; for (int idx = 0; idx < spinners.length; idx++) { final JSlider sl = sliders[idx]; final JSpinner sp = spinners[idx]; SpinnerNumberModel spModel = (SpinnerNumberModel) sp.getModel(); sl.setMinimum((int)(((Number)spModel.getMinimum()).floatValue() * 100)); sl.setMaximum((int)(((Number)spModel.getMaximum()).floatValue() * 100)); sl.setValue((int)(((Number) sp.getValue()).doubleValue() * 100.)); final Semaphore loopBlocker = new Semaphore(1); // イベントが循環発生することを防ぐ sl.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { if (loopBlocker.tryAcquire()) { try { double rate = sl.getValue() / 100.; sp.setValue(Double.valueOf(rate)); } finally { loopBlocker.release(); } } } }); sp.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { if (loopBlocker.tryAcquire()) { try { int rate = (int)(((Number) sp.getValue()).doubleValue() * 100.); sl.setValue(rate); } finally { loopBlocker.release(); } } } }); } // カラーグループ ColorGroup colorGroup = layer.getColorGroup(); JPanel colorGroupPanel = new JPanel(); colorGroupPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(3, 3, 3, 3), BorderFactory.createTitledBorder(strings.getProperty("colorgroup")))); GridBagLayout gbl2 = new GridBagLayout(); colorGroupPanel.setLayout(gbl2); GridBagConstraints gbc2 = new GridBagConstraints(); JLabel lblColorGroup = new JLabel(strings.getProperty("group"), JLabel.RIGHT); cmbColorGroup = new JComboBox(colorGroups.toArray(new ColorGroup[colorGroups.size()])); cmbColorGroup.setSelectedItem(colorGroup); cmbColorGroup.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ColorGroup selColorGroup = (ColorGroup) cmbColorGroup.getSelectedItem(); chkColorGroupSync.setSelected(selColorGroup.isEnabled()); fireColorGroupChangeEvent(); } }); chkColorGroupSync = new JCheckBox(strings.getProperty("synchronized")); chkColorGroupSync.setSelected(layer.isInitSync()); gbc2.gridx = 0; gbc2.gridy = 0; gbc2.gridwidth = 1; gbc2.gridheight = 1; gbc2.weightx = 0.; gbc2.weighty = 0.; gbc2.anchor = GridBagConstraints.WEST; gbc2.fill = GridBagConstraints.BOTH; gbc2.ipadx = 0; gbc2.ipady = 0; gbc2.insets = new Insets(3, 3, 3, 3); colorGroupPanel.add(lblColorGroup, gbc2); gbc2.gridx = 1; gbc2.gridy = 0; gbc2.gridwidth = 1; gbc2.gridheight = 1; gbc2.weightx = 1.; gbc2.weighty = 0.; colorGroupPanel.add(cmbColorGroup, gbc2); gbc2.gridx = 2; gbc2.gridy = 0; gbc2.gridwidth = GridBagConstraints.REMAINDER; gbc2.gridheight = 1; gbc2.weightx = 0.; gbc2.weighty = 0.; colorGroupPanel.add(chkColorGroupSync, gbc2); if (colorGroupPanel != null) { container.add(colorGroupPanel); } container.add(colorLevelPanel); container.add(colorReplacePanel); container.add(colorTunePanel); } /** * 詳細設定パネルの表示状態 * @return */ public boolean isVisibleAdvancedSettings() { return colorLevelPanel.isVisible(); } /** * 詳細設定パネルの表示制御 * @param show */ public void setVisibleAdvancedSettings(boolean show) { colorLevelPanel.setVisible(show); colorReplacePanel.setVisible(show); revalidate(); } /** * このパネルのレイヤーを取得する * @return */ public Layer getLayer() { return layer; } /** * このパネルで変更された色情報の状態をリセットする.
* 最後に{@link #setColorConvertParameter(ColorConvertParameter)}された値で 設定し直す.
*/ public void resetColor() { setColorConvertParameter(paramOrg); } /** * 指定されたパラメータでダイアログを設定し、オリジナル値とする。 * @param param */ public void setColorConvertParameter(ColorConvertParameter param) { setColorConvertParameter(param, true); } /** * 指定されたパラメータでダイアログを設定し、且つ、変更通知を送信する。 * @param param */ public void applyColorConvertParameter(ColorConvertParameter param) { setColorConvertParameter(param, false); fireColorChangeEvent(); } /** * 指定されたパラメータでダイアログを設定する。 * @param param 色パラメーター * @param setOriginal オリジナル値に設定するか? */ private void setColorConvertParameter(ColorConvertParameter param, boolean setOriginal) { if (param == null) { throw new IllegalArgumentException(); } if (setOriginal) { // オリジナル値として設定する paramOrg = param.clone(); } ColorConv colorReplace = param.getColorReplace(); if (colorReplace == null) { colorReplace = ColorConv.NONE; } changeEventDisableSemaphore.incrementAndGet(); try { cmbColorReplace.setSelectedItem(colorReplace); spinGray.setValue(Double.valueOf(param.getGrayLevel())); spinOffsetR.setValue(Integer.valueOf(param.getOffsetR())); spinOffsetG.setValue(Integer.valueOf(param.getOffsetG())); spinOffsetB.setValue(Integer.valueOf(param.getOffsetB())); spinOffsetA.setValue(Integer.valueOf(param.getOffsetA())); spinFactorR.setValue(Double.valueOf(param.getFactorR())); spinFactorG.setValue(Double.valueOf(param.getFactorG())); spinFactorB.setValue(Double.valueOf(param.getFactorB())); spinFactorA.setValue(Double.valueOf(param.getFactorA())); spinGammaR.setValue(Double.valueOf(param.getGammaR())); spinGammaG.setValue(Double.valueOf(param.getGammaG())); spinGammaB.setValue(Double.valueOf(param.getGammaB())); spinGammaA.setValue(Double.valueOf(param.getGammaA())); spinHue.setValue(Double.valueOf(param.getHue())); spinSaturation.setValue(Double.valueOf(param.getSaturation())); spinBrightness.setValue(Double.valueOf(param.getBrightness())); spinContrast.setValue(Double.valueOf(param.getContrast())); } finally { changeEventDisableSemaphore.decrementAndGet(); } chachedParam = param; firePropertyChange("colorConvertParameter", null, param); } public ColorConvertParameter getColorConvertParameter() { if (chachedParam != null) { return chachedParam; } ColorConvertParameter param = new ColorConvertParameter(); param.setColorReplace((ColorConv) cmbColorReplace.getSelectedItem()); param.setGrayLevel(((Number) spinGray.getValue()).floatValue()); param.setOffsetR(((Number) spinOffsetR.getValue()).intValue()); param.setOffsetG(((Number) spinOffsetG.getValue()).intValue()); param.setOffsetB(((Number) spinOffsetB.getValue()).intValue()); param.setOffsetA(((Number) spinOffsetA.getValue()).intValue()); param.setFactorR(((Number) spinFactorR.getValue()).floatValue()); param.setFactorG(((Number) spinFactorG.getValue()).floatValue()); param.setFactorB(((Number) spinFactorB.getValue()).floatValue()); param.setFactorA(((Number) spinFactorA.getValue()).floatValue()); param.setGammaR(((Number) spinGammaR.getValue()).floatValue()); param.setGammaG(((Number) spinGammaG.getValue()).floatValue()); param.setGammaB(((Number) spinGammaB.getValue()).floatValue()); param.setGammaA(((Number) spinGammaA.getValue()).floatValue()); param.setHue(((Number) spinHue.getValue()).floatValue()); param.setSaturation(((Number) spinSaturation.getValue()).floatValue()); param.setBrightness(((Number) spinBrightness.getValue()).floatValue()); param.setContrast(((Number) spinContrast.getValue()).floatValue()); chachedParam = param; return param; } /** * カラー設定が変更されているか? * * @return 変更されている場合はtrue、そうでなければfalse */ public boolean isColorConvertParameterModified() { return !paramOrg.equals(getColorConvertParameter()); } public ColorGroup getColorGroup() { return (ColorGroup) cmbColorGroup.getSelectedItem(); } public void setColorGroup(ColorGroup colorGroup) { if (colorGroup == null) { colorGroup = ColorGroup.NA; } changeEventDisableSemaphore.incrementAndGet(); try { cmbColorGroup.setSelectedItem(colorGroup); } finally { changeEventDisableSemaphore.decrementAndGet(); } } public boolean isSyncColorGroup() { return chkColorGroupSync == null ? false : chkColorGroupSync.isSelected(); } public void setSyncColorGroup(boolean selected) { if (chkColorGroupSync != null) { changeEventDisableSemaphore.incrementAndGet(); try { chkColorGroupSync.setSelected(selected); } finally { changeEventDisableSemaphore.decrementAndGet(); } } } } CharacterManaJ/src/main/java/charactermanaj/ui/ColorBox.java0000644000175000017500000001562113615720000024176 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Properties; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JPanel; import javax.swing.border.BevelBorder; import javax.swing.event.EventListenerList; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * 色表示ボックス.
* 色が変更された場合はプロパティ「colorKey」に対するプロパティ変更リスナへの通知が行われます.
* ダブルクリックまたはボタンが押下され色を指定したことによるアクションリスナへの通知が行われます.
* 既定のコマンドは「colorKey」です.
* アクションは色選択ダイアログがOKされたことによるアクションであり、色が前後で変更されなくても通知されます.
* @author seraphy */ public class ColorBox extends JPanel { private static final long serialVersionUID = -8745278154296281466L; /** * リソース */ protected static final String STRINGS_RESOURCE = "languages/colorbox"; /** * コマンド */ private String actionCommand = "colorKey"; /** * 初期カラー */ private Color colorKey; /** * 色の表示パネル */ private JPanel colorDisplayPanel; /** * 色選択アクション */ private AbstractAction actChooseColor; /** * 色ボックスを構築します.
* 色選択ボタンが付与されます.
*/ public ColorBox() { this(null, true); } /** * 初期カラーと、色選択ボックスの表示有無を指定して構築します. * @param colorKey 初期カラー * @param colorPicker 色選択ボタンの表示有無 */ public ColorBox(Color colorKey, boolean colorPicker) { if (colorKey == null) { colorKey = Color.WHITE; } this.colorKey = colorKey; Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); colorDisplayPanel = createColorDiaplyPanel(); colorDisplayPanel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (actChooseColor.isEnabled() && e.getClickCount() == 2) { onChooseColor(new ActionEvent(this, 1, getActionCommand(), e.getWhen(), e.getModifiers())); } } }); colorDisplayPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(0, 0, 0, 3), BorderFactory.createBevelBorder(BevelBorder.LOWERED))); colorDisplayPanel.setPreferredSize(new Dimension(32, 24)); actChooseColor = new AbstractAction(strings.getProperty("btn.chooseColorKey")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onChooseColor(e); } }; JButton btnChooseColor = new JButton(actChooseColor); btnChooseColor.setVisible(colorPicker); actChooseColor.setEnabled(colorPicker); setLayout(new BorderLayout()); add(colorDisplayPanel, BorderLayout.CENTER); add(btnChooseColor, BorderLayout.EAST); } protected JPanel createColorDiaplyPanel() { return new JPanel() { private static final long serialVersionUID = -8554046012311330274L; @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Rectangle rct = getBounds(); Insets insets = getInsets(); int x = insets.left; int y = insets.top; int w = rct.width - insets.left - insets.right; int h = rct.height - insets.top - insets.bottom; g.setColor(getColorKey()); g.fillRect(x, y, w, h); } }; } protected JPanel getColorDisplayPanel() { return colorDisplayPanel; } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); actChooseColor.setEnabled(enabled); } public void setColorKey(Color colorKey) { if (colorKey == null) { colorKey = Color.WHITE; } if ( !this.colorKey.equals(colorKey)) { Color oldc = this.colorKey; this.colorKey = colorKey; repaint(); firePropertyChange("colorKey", oldc, colorKey); } } /** * Adds an ActionListener to the button. * @param l the ActionListener to be added */ public void addActionListener(ActionListener l) { listenerList.add(ActionListener.class, l); } /** * Removes an ActionListener from the button. * If the listener is the currently set Action * for the button, then the Action * is set to null. * * @param l the listener to be removed */ public void removeActionListener(ActionListener l) { listenerList.remove(ActionListener.class, l); } /** * Notifies all listeners that have registered interest for * notification on this event type. The event instance * is lazily created using the event * parameter. * * @param event the ActionEvent object * @see EventListenerList */ protected void fireActionPerformed(ActionEvent event) { Object[] listeners = listenerList.getListenerList(); ActionEvent e = null; for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == ActionListener.class) { if (e == null) { String actionCommand = event.getActionCommand(); if(actionCommand == null) { actionCommand = getActionCommand(); } e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, actionCommand, event.getWhen(), event.getModifiers()); } ((ActionListener) listeners[i + 1]).actionPerformed(e); } } } public void setActionCommand(String actionCommand) { this.actionCommand = actionCommand; } public String getActionCommand() { return actionCommand; } public Color getColorKey() { return colorKey; } protected String getColorDialogTitle() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); return strings.getProperty("caption.chooseColorKey"); } protected void onChooseColor(ActionEvent e) { Color colorKey = getColorKey(); colorKey = JColorChooser.showDialog( this, getColorDialogTitle(), colorKey); if (colorKey != null) { setColorKey(colorKey); fireActionPerformed(e); } } }CharacterManaJ/src/main/java/charactermanaj/ui/progress/0000755000175000017500000000000013615720000023443 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/ui/progress/Worker.java0000644000175000017500000000062513615720000025562 0ustar paulliupaulliupackage charactermanaj.ui.progress; /** * ワーカー.
* @author seraphy * * @param ワーカーの戻り型 */ public interface Worker { /** * ワーカーを実行する.
* * @param progressHandle 進行状態を通知するハンドル * @return 処理結果 * @throws Exception 何らかの失敗 */ T doWork(ProgressHandle progressHandle) throws Exception; } CharacterManaJ/src/main/java/charactermanaj/ui/progress/ProgressInfoHolder.java0000644000175000017500000000273113615720000030067 0ustar paulliupaulliupackage charactermanaj.ui.progress; /** * プログレスダイアログと、そのワーカースレッドの間で進行状態を通信するためのホルダ.
* @author seraphy */ public class ProgressInfoHolder implements ProgressHandle { /** * キャプション */ private String caption; /** * 進行状態不明フラグ. */ private Boolean indeterminate; /** * 進行状態の現在値 */ private Integer progressCurrent; /** * 進行状態の最大値 */ private Integer progressMaximum; public synchronized String getCaption() { return caption; } public synchronized void setCaption(String caption) { this.caption = caption; } public synchronized Boolean getIndeterminate() { return indeterminate; } public synchronized void setIndeterminate(boolean indeterminate) { this.indeterminate = indeterminate; } public synchronized Integer getProgressCurrent() { return progressCurrent; } public synchronized void setProgressCurrent(int progressCurrent) { this.progressCurrent = progressCurrent; } public synchronized Integer getProgressMaximum() { return progressMaximum; } public synchronized void setProgressMaximum(int progressMaximum) { this.progressMaximum = progressMaximum; } /** * 現在の状態で確定し、ただちに状態をリセットする.
*/ public synchronized void flush() { caption = null; indeterminate = null; progressCurrent = null; progressMaximum = null; } } CharacterManaJ/src/main/java/charactermanaj/ui/progress/WorkerException.java0000644000175000017500000000074413615720000027443 0ustar paulliupaulliupackage charactermanaj.ui.progress; /** * プログレスダイアログのワーカースレッド実行中に例外が発生した場合 * @author seraphy */ public class WorkerException extends Exception { private static final long serialVersionUID = -8315947965963588713L; public WorkerException() { super(); } public WorkerException(String message) { super(message); } public WorkerException(String message, Throwable cause) { super(message, cause); } } CharacterManaJ/src/main/java/charactermanaj/ui/progress/WorkerWithProgessDialog.java0000644000175000017500000002173613615720000031107 0ustar paulliupaulliupackage charactermanaj.ui.progress; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.Thread.UncaughtExceptionHandler; import javax.swing.BorderFactory; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JProgressBar; import javax.swing.JRootPane; import javax.swing.SwingUtilities; import javax.swing.Timer; import javax.swing.border.BevelBorder; /** * ワーカースレッドの実行中、プログレスを表示するモーダルダイアログ.
* ワーカースレッドの実行が完了するとダイアログは自動的に閉じられる.
* モーダルダイアログであるため、ワーカースレッドの実行中はユーザはUIを操作することはできない.
* @author seraphy * * @param ワーカーの処理結果の戻り値の型 */ public class WorkerWithProgessDialog extends JDialog { private static final long serialVersionUID = 1L; /** * ワーカースレッドが停止したことを示すフラグ */ private volatile boolean exitThread; /** * ワーカースレッドの戻り値 */ private volatile T result; /** * ワーカースレッドが例外により終了した場合の例外 */ private volatile Throwable occuredException; /** * ワーカースレッド */ private Thread thread; /** * ワーカースレッドの状態を監視しプログレスに反映させるタイマー */ private Timer timer; /** * プログレスの更新頻度(タイマーのインターバル) */ private static int interval = 200; /** * 親フレームとワーカーを指定して構築する.
* @param parent 親フレーム * @param worker ワーカー */ public WorkerWithProgessDialog(JFrame parent, Worker worker) { super(parent, true); try { if (worker == null) { throw new IllegalArgumentException(); } initComponent(parent, worker); } catch (RuntimeException ex) { dispose(); throw ex; } } /** * 親ダイアログとワーカーを指定して構築する.
* @param parent 親フレーム * @param worker ワーカー */ public WorkerWithProgessDialog(JDialog parent, Worker worker) { super(parent, true); try { if (worker == null) { throw new IllegalArgumentException(); } initComponent(parent, worker); } catch (RuntimeException ex) { dispose(); throw ex; } } /** * コンポーネントの初期化 * @param parent 親フレームまたは親ダイアログ * @param worker ワーカー */ private void initComponent(Component parent, Worker worker) { // 閉じるボタンは無効 setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // リサイズ不可 setResizable(false); // ウィンドウ装飾なし (閉じるボタンやタイトルバーなども無し) setUndecorated(true); Container container = getContentPane(); // プログレスバー final JProgressBar progressBar = new JProgressBar(); progressBar.setIndeterminate(true); progressBar.setStringPainted(false); container.add(progressBar, BorderLayout.SOUTH); // デフォルトのラベル表示 String title = "please wait for a while."; final JLabel lblCaption = new JLabel(title); container.add(lblCaption, BorderLayout.NORTH); // ウィンドウ枠 JRootPane rootPane = getRootPane(); rootPane.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createBevelBorder(BevelBorder.RAISED), BorderFactory.createEmptyBorder(5, 5, 5, 5)) ); // 親ウィンドウの幅の70% Dimension dim = progressBar.getPreferredSize(); dim.width = (int)(parent.getWidth() * 0.7); progressBar.setPreferredSize(dim); // パックする. pack(); // 親の中央に表示 setLocationRelativeTo(parent); // ワーカースレッドとプログレスダイアログとの状態通信用オブジェクト final ProgressInfoHolder progressHandle = new ProgressInfoHolder() { @Override public synchronized void flush() { final String caption = getCaption(); final Boolean indeterminate = getIndeterminate(); final Integer progressMaximum = getProgressMaximum(); final Integer progressCurrent = getProgressCurrent(); if (caption != null || progressMaximum != null || progressCurrent != null || indeterminate != null) { SwingUtilities.invokeLater(new Runnable() { public void run() { // 設定されている値でプログレスダイアログに状態を反映する. if (caption != null) { lblCaption.setText(caption); } if (progressMaximum != null) { progressBar.setMaximum(progressMaximum.intValue()); } if (progressCurrent != null) { progressBar.setValue(progressCurrent.intValue()); } if (indeterminate != null) { progressBar.setIndeterminate(indeterminate.booleanValue()); progressBar.setStringPainted( !indeterminate.booleanValue()); } } }); } super.flush(); } }; // プログレスダイアログに状態を反映させるためのタイマー timer = new Timer(interval, new ActionListener() { public void actionPerformed(ActionEvent e) { if (exitThread || !thread.isAlive()) { // スレッドが終了していればスレッド停止を通知する. onExitWork(); } else { // スレッドが生きていれば、スレッドの進行状態を // プログレスダイアログに反映させる. progressHandle.flush(); } } }); // ワーカースレッドの構築. thread = new Thread(createJob(worker, progressHandle)); thread.setDaemon(true); // ワーカースレッドが予期せぬハンドルされていない例外により終了した場合のハンドラ. thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { public void uncaughtException(Thread t, Throwable e) { occuredException = e; onExitWork(); } }); } /** * プログレスの表示間隔を取得する * @return 表示間隔 */ public static int getInterval() { return interval; } /** * プログレスの表示間隔を設定する * @param interval 表示間隔 */ public static void setInterval(int interval) { WorkerWithProgessDialog.interval = interval; } /** * ワーカーをラップするワーカースレッドのジョブを作成する.
* @param worker ワーカー * @param progressHandle 進行状態の通知ハンドル * @return ジョブ */ protected Runnable createJob(final Worker worker, final ProgressHandle progressHandle) { return new Runnable() { public void run() { try { try { result = worker.doWork(progressHandle); } catch (Throwable ex) { occuredException = ex; } } finally { onExitWork(); } } }; } /** * ワーカースレッドより、スレッドが終了したことを通知される.
* ワーカースレッド自身か、ワーカースレッドの例外ハンドラか、 * タイマーから呼び出されるため、2回以上呼び出される可能性がある.
*/ protected void onExitWork() { exitThread = true; SwingUtilities.invokeLater(new Runnable() { public void run() { // プログレスダイアログが表示されている場合、 // それを破棄する.(モーダルの解除) if (isDisplayable() && isVisible()) { dispose(); } } }); } /** * ワーカースレッドを開始し、プログレスダイアログを表示し、 * ワーカースレッドの完了まで待機する.
* @throws WorkerException ワーカースレッドが例外により終了した場合 */ public T startAndWait() throws WorkerException { // 初期化 result = null; occuredException = null; exitThread = false; // ワーカースレッドの開始 thread.start(); try { timer.start(); try { // モーダルダイアログの開始 // (モーダルダイアログが非表示されるまで制御を返さない.) setVisible(true); } finally { timer.stop(); } } finally { for (;;) { try { // ワーカースレッドの停止を待機する. thread.join(); break; } catch (InterruptedException ex) { // 割り込みされた場合は、ワーカースレッドを割り込みする. thread.interrupt(); } } } // ワーカースレッドが例外により終了した場合 // その例外を送出する. if (occuredException != null) { throw new WorkerException( "worker has failed." + occuredException.getMessage(), occuredException ); } return getResult(); } /** * ワーカースレッドの戻り値を取得する.
* 正常終了していない場合、または処理中の場合は意味を持たない.
* @return ワーカースレッドの戻り値 */ public T getResult() { return result; } } CharacterManaJ/src/main/java/charactermanaj/ui/progress/ProgressHandle.java0000644000175000017500000000151013615720000027223 0ustar paulliupaulliupackage charactermanaj.ui.progress; /** * ワーカースレッドからプログレスダイアログに状態を通知するためのインターフェイス.
* 中途半端な状態で反映されないように、複数のプロパティを設定する場合は * 同期をとること.
* @author seraphy */ public interface ProgressHandle { /** * 進行状態の最大値を設定する. * @param maximum */ void setProgressMaximum(int maximum); /** * 進行状態の現在値を設定する. * @param current */ void setProgressCurrent(int current); /** * 進行状態が不明であることを設定する. * @param indeterminate */ void setIndeterminate(boolean indeterminate); /** * キャプションを設定する. * @param caption */ void setCaption(String caption); } CharacterManaJ/src/main/java/charactermanaj/ui/ArchiveFileDialog.java0000644000175000017500000000577313615720000025757 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.Component; import java.io.File; import javax.swing.filechooser.FileFilter; /** * エクスポート・インポート用ファイルダイアログ * @author seraphy * */ public class ArchiveFileDialog { /** * 最後に使ったディレクトリ */ protected File lastUsedDir; /** * 最後に使用したフィルタ */ protected FileFilter lastUsedFileFiler; /** * 保存ダイアログを開く * @param parent 親 * @return 保存先ファイル、キャンセルした場合はnull */ public File showSaveDialog(Component parent) { ArchiveFileChooser fileChooser = new ArchiveFileChooser(lastUsedDir, true); int ret = fileChooser.showSaveDialog(parent); if (ret != ArchiveFileChooser.APPROVE_OPTION) { return null; } File outFile = fileChooser.getSelectedFile(); lastUsedDir = outFile.getParentFile(); return outFile; } /** * 開くダイアログを開く.
* initFileがnullの場合は前回選択したディレクトリが初期状態となる. * @param parent 親 * @param initFile 初期選択ファイル、もしくはディレクトリ、もしくはnull * @return 選択ファイル、キャンセルした場合はnull */ public File showOpenDialog(Component parent, File initFile) { // 初期ファイル名が指定されている場合、そのディレクトリをカレントにしてみる. // 指定されてなければ最後に使ったディレクトリを設定する. File initDir = null; if (initFile != null) { if (initFile.isDirectory()) { initDir = initFile; } else { initDir = initFile.getParentFile(); } } // 初期ファイルの指定がなければ前回の最後に使用したディレクトリを使用 if (initDir == null) { initDir = lastUsedDir; } ArchiveFileChooser fileChooser = new ArchiveFileChooser(initDir, false); // 最後に使用したフィルタがあれば、それを選択状態とする. if (lastUsedFileFiler != null) { fileChooser.setFileFilter(lastUsedFileFiler); } // 初期ファイル名が指定されていれば、それを選択状態としてみる. if (initFile != null) { fileChooser.setSelectedFile(initFile); } // ファイル選択ダイアログの表示 int ret = fileChooser.showOpenDialog(parent); if (ret != ArchiveFileChooser.APPROVE_OPTION) { // キャンセル return null; } // 選択ファイルの取得 File outFile = fileChooser.getSelectedFile(); // 最後に選択したディレクトリとフィルタを記憶する. lastUsedDir = outFile.getParentFile(); lastUsedFileFiler = fileChooser.getFileFilter(); return outFile; } /** * 最後に使用したディレクトリを取得する. * @return */ public File getLastUSedDir() { return lastUsedDir; } /** * 最後に使用したディレクトリを設定する. * @param lastUSedDir */ public void setLastUSedDir(File lastUSedDir) { this.lastUsedDir = lastUSedDir; } } CharacterManaJ/src/main/java/charactermanaj/ui/UkagakaConvertDialog.java0000644000175000017500000003071413615720000026474 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.TextField; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.util.Properties; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.KeyStroke; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import charactermanaj.Main; import charactermanaj.graphics.io.UkagakaImageConverter; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * 伺か用PNG/PNA出力設定ダイアログ * @author seraphy */ public class UkagakaConvertDialog extends JDialog { private static final long serialVersionUID = 4189631881766588004L; /** * リソース */ protected static final String STRINGS_RESOURCE = "languages/ukagakaConvertDialog"; /** * キャプション */ private TextField caption = new TextField(); /** * キャンセル */ private AbstractAction actCancel; /** * 保存(デフォルトアクション) */ private AbstractAction actSave; /** * プレビュー(PNG) */ private SamplePicturePanel opaqueImagePanel = new SamplePicturePanel(); /** * プレビュー(PNA) */ private SamplePicturePanel alphaImagePanel = new SamplePicturePanel(); /** * 透過色キー表示ボックス */ private ColorBox colorBox = new ColorBox(); /** * エクスポート対象の元イメージ. */ private BufferedImage originalImage; /** * 透過色をマニュアルとするか? */ private boolean manualTransparentColorKey; /** * 透過キー自動モード */ private JRadioButton radioAuto; /** * 透過キー手動選択モード */ private JRadioButton radioManual; /** * 上書きモードチェックボックス */ private JCheckBox chkOverwriteOption; /** * 終了コード */ private Object result; /** * 保存ボタンアクションリスナ.
*/ private ActionListener saveActionListener; /** * 上書きオプションの表示フラグ */ private boolean showOverwriteOption; /** * 伺か用PNG/PNA出力設定ダイアログを構築する. * @param parent 親フレーム */ public UkagakaConvertDialog(JFrame parent) { this(parent, false); } /** * 伺か用PNG/PNA出力設定ダイアログを構築する. * @param parent 親フレーム * @param overwriteOption 上書きオプションの表示 */ public UkagakaConvertDialog(JFrame parent, boolean overwriteOption) { this(parent, null, overwriteOption); } /** * 伺か用PNG/PNA出力設定ダイアログを構築する. * @param parent 親フレーム * @param saveActionListener 保存ボタンアクション * @param overwriteOption 上書きオプションの表示 */ public UkagakaConvertDialog(JFrame parent, ActionListener saveActionListener, boolean overwriteOption) { super(parent, true); this.saveActionListener = saveActionListener; this.showOverwriteOption = overwriteOption; addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClose(); } @Override public void windowOpened(WindowEvent e) { result = null; } }); try { initComponent(); } catch (RuntimeException ex) { dispose(); throw ex; } } /** * コンポーネントの初期化 */ private void initComponent() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); setTitle(strings.getProperty("title")); Toolkit tk = Toolkit.getDefaultToolkit(); actCancel = new AbstractAction(strings.getProperty("btn.cancel")) { private static final long serialVersionUID = -1L; public void actionPerformed(ActionEvent e) { onClose(); } }; actSave = new AbstractAction(strings.getProperty("btn.save")) { private static final long serialVersionUID = -1L; public void actionPerformed(ActionEvent e) { onSave(); } }; JButton btnCancel = new JButton(actCancel); JButton btnSave = new JButton(actSave); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout(3, 3)); contentPane.add(caption, BorderLayout.NORTH); caption.setEditable(false); caption.setVisible(false); JScrollPane opaqueSp = new JScrollPane(opaqueImagePanel); JScrollPane alphaSp = new JScrollPane(alphaImagePanel); JPanel previewSpPane = new JPanel(); BoxLayout boxlayout = new BoxLayout(previewSpPane, BoxLayout.LINE_AXIS); previewSpPane.setLayout(boxlayout); previewSpPane.add(opaqueSp); previewSpPane.add(Box.createHorizontalStrut(3)); previewSpPane.add(alphaSp); previewSpPane.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(strings.getProperty("preview")), BorderFactory.createEmptyBorder(3, 3, 3, 3) )); JPanel centerPane = new JPanel(new BorderLayout()); centerPane.add(previewSpPane, BorderLayout.CENTER); JPanel transparentColorPanel = new JPanel(); GridBagLayout tc_gbl = new GridBagLayout(); transparentColorPanel.setLayout(tc_gbl); transparentColorPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(strings.getProperty("caption.chooseTransparentColorKey")), BorderFactory.createEmptyBorder(3, 3, 3, 3) )); centerPane.add(transparentColorPanel, BorderLayout.SOUTH); GridBagConstraints gbc = new GridBagConstraints(); radioAuto = new JRadioButton(strings.getProperty("radio.auto")); radioAuto.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { onChange(!radioAuto.isSelected()); } }); radioManual = new JRadioButton(strings.getProperty("radio.manual")); radioAuto.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { onChange(!radioAuto.isSelected()); } }); ButtonGroup btngroup = new ButtonGroup(); btngroup.add(radioAuto); btngroup.add(radioManual); radioAuto.setSelected(!manualTransparentColorKey); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.insets = new Insets(3, 3, 3, 3); gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; transparentColorPanel.add(radioAuto, gbc); gbc.gridx = 1; gbc.gridy = 0; transparentColorPanel.add(radioManual, gbc); gbc.gridx = 2; gbc.gridy = 0; transparentColorPanel.add(colorBox, gbc); contentPane.add(centerPane, BorderLayout.CENTER); JPanel btnPanel = new JPanel(); GridBagLayout gbl = new GridBagLayout(); btnPanel.setLayout(gbl); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 1.; gbc.weighty = 0.; gbc.insets = new Insets(3, 3, 3, 3); gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; chkOverwriteOption = new JCheckBox(strings.getProperty("chk.overwriteOriginalFile")); if (showOverwriteOption) { btnPanel.add(chkOverwriteOption, gbc); } else { btnPanel.add(Box.createHorizontalGlue(), gbc); } gbc.gridx = Main.isLinuxOrMacOSX() ? 2 : 1; gbc.gridy = 0; gbc.weightx = 0.; btnPanel.add(btnSave, gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 1 : 2; gbc.gridy = 0; btnPanel.add(btnCancel, gbc); btnPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 45)); contentPane.add(btnPanel, BorderLayout.SOUTH); JRootPane rootPane = getRootPane(); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeExportWizDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeExportWizDialog"); am.put("closeExportWizDialog", actCancel); rootPane.setDefaultButton(btnSave); rootPane.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5)); Dimension dim = new Dimension(450, 450); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); if (scaleSupport != null) { // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する dim = scaleSupport.manualScaled(dim); } setSize(dim); setLocationRelativeTo(getParent()); // colorBoxの色変更イベントのハンドル colorBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onChooseTransparentColorKey(); } }); } /** * 出力するイメージを設定する. * @param img イメージ(TYPE_INT_ARGBのみ) * @param colorKey 透過色に指定するカラーキー(候補)、nullの場合はデフォルト */ public void setExportImage(BufferedImage img, Color colorKey) { if (img == null) { throw new IllegalArgumentException(); } if (img.getType() != BufferedImage.TYPE_INT_ARGB) { throw new IllegalArgumentException("TYPE_INT_ARGB以外は指定できません。"); } if (colorKey == null) { colorKey = Color.GREEN; } this.originalImage = img; colorBox.setColorKey(colorKey); rebuildImage(); } public BufferedImage getOpaqueImage() { return opaqueImagePanel.getSamplePictrue(); } public BufferedImage getAlphaImage() { return alphaImagePanel.getSamplePictrue(); } public void setAutoTransparentColor(boolean mode) { if (mode) { radioAuto.setSelected(true); radioManual.setSelected(false); } else { radioManual.setSelected(true); radioAuto.setSelected(false); } } public Color getTransparentColorKey() { return colorBox.getColorKey(); } public void setTransparentColorKey(Color colorKey) { colorBox.setColorKey(colorKey); } public boolean isAutoTransparentColor() { return radioAuto.isSelected(); } public boolean isOverwriteOriginalFile() { return chkOverwriteOption.isSelected(); } public void setOverwriteOriginalFile(boolean overwriteOriginalFile) { chkOverwriteOption.setSelected(overwriteOriginalFile); } protected void onClose() { result = null; dispose(); } protected void onSave() { if (saveActionListener != null) { ActionEvent e = new ActionEvent(this, 0, "save"); saveActionListener.actionPerformed(e); } } public void setSaveActionListener(ActionListener saveActionListener) { this.saveActionListener = saveActionListener; } public ActionListener getSaveActionListener() { return saveActionListener; } public Object getResult() { return result; } public void setResult(Object result) { this.result = result; } public void setCaption(String text) { if (text == null || text.length() == 0) { caption.setText(""); caption.setVisible(false); } else { caption.setText(text); caption.setVisible(true); } } public String getCaption() { return caption.getText(); } /** * 透過色のマニュアル選択.
*/ protected void onChooseTransparentColorKey() { // モードを手動に切り替え setAutoTransparentColor(false); // プレビューを再構築 rebuildImage(); } /** * 伺か用PNGの透過色キーの自動・マニュアルの切り替えイベント.
* @param modeManual */ protected void onChange(boolean modeManual) { if (manualTransparentColorKey != modeManual) { manualTransparentColorKey = modeManual; rebuildImage(); } } /** * 伺か用のPNG/PNA画像を生成してプレビューに設定します.
*/ protected void rebuildImage() { if (originalImage == null) { return; } UkagakaImageConverter conv = UkagakaImageConverter.getInstance(); BufferedImage pna = conv.createUkagakaPNA(originalImage); Color transparentColorKey = null; if (manualTransparentColorKey) { transparentColorKey = colorBox.getColorKey(); } else { transparentColorKey = conv.detectTransparentColorKey(originalImage); } BufferedImage png = conv.createUkagakaPNG(originalImage, transparentColorKey); opaqueImagePanel.setSamplePicture(png); alphaImagePanel.setSamplePicture(pna); } } CharacterManaJ/src/main/java/charactermanaj/ui/PartsRandomChooserDialog.java0000644000175000017500000004771013615720000027350 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JRootPane; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JToggleButton; import javax.swing.KeyStroke; import javax.swing.event.EventListenerList; import charactermanaj.model.AppConfig; import charactermanaj.model.CharacterData; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * パーツのランダム選択ダイアログ.
* * @author seraphy */ public class PartsRandomChooserDialog extends JDialog { private static final long serialVersionUID = -8427874726724107481L; protected static final String STRINGS_RESOURCE = "languages/partsrandomchooserdialog"; /** * メインフレームとの間でパーツの選択状態の取得・設定を行うためのインターフェイス.
*/ public interface PartsSetSynchronizer { /** * 現在フレームで設定されているパーツセットを取得する. * * @return */ PartsSet getCurrentPartsSet(); /** * ランダム選択パネルのパーツセットでフレームを設定する. * * @param partsSet */ void setPartsSet(PartsSet partsSet); /** * 指定されたパーツがランダム選択対象外であるか? * * @param partsIdentifier * パーツ * @return 対象外であればtrue */ boolean isExcludePartsIdentifier(PartsIdentifier partsIdentifier); /** * 指定したパーツがランダム選択対象外であるか設定する. * * @param partsIdentifier * パーツ * @param exclude * 対象外であればtrue */ void setExcludePartsIdentifier(PartsIdentifier partsIdentifier, boolean exclude); } /** * ランダム選択パネルを縦に並べるボックス */ private Box centerPnl; /** * キャラクターデータ */ private CharacterData characterData; /** * メインフレームとの同期用 */ private PartsSetSynchronizer partsSync; /** * 一括ランダムアクション */ private Action actRandomAll; /** * 選択を戻すアクション */ private Action actBack; /** * 閉じるアクション */ private Action actCancel; /** * 履歴 */ private LinkedList> history = new LinkedList>(); /** * 最大の履歴保持数 */ private int maxHistory; /** * コンストラクタ * * @param parent * メインフレーム(親) * @param characterData * キャラクターデータ * @param partsSync * メインフレームとの同期用 */ public PartsRandomChooserDialog(JFrame parent, CharacterData characterData, PartsSetSynchronizer partsSync) { super(parent, false); try { if (characterData == null || partsSync == null) { throw new IllegalArgumentException(); } setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClose(); } }); this.characterData = characterData; this.partsSync = partsSync; AppConfig appConfig = AppConfig.getInstance(); this.maxHistory = appConfig.getRandomChooserMaxHistory(); if (this.maxHistory < 0) { this.maxHistory = 0; } initLayout(); pack(); setLocationRelativeTo(parent); } catch (RuntimeException ex) { dispose(); throw ex; } } /** * レイアウトを行う. */ private void initLayout() { Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); setTitle(strings.getProperty("partsRandomChooser")); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); this.centerPnl = Box.createVerticalBox(); ActionListener changePartsIdentifierListener = new ActionListener() { public void actionPerformed(ActionEvent e) { if (eventLock.get() == 0) { onChangePartsIdentifiers(); } } }; PartsSet partsSet = partsSync.getCurrentPartsSet(); eventLock.incrementAndGet(); try { for (PartsCategory category : characterData.getPartsCategories()) { List partsIdentifiers = partsSet.get(category); int partsLen = (partsIdentifiers != null) ? partsIdentifiers .size() : 0; boolean enable = true; if (partsLen < 1) { partsLen = 1; // 未選択の場合でも1つは作成する. enable = false; // 未選択の場合はディセーブルとする. } for (int partsIdx = 0; partsIdx < partsLen; partsIdx++) { PartsIdentifier partsIdentifier = null; if (partsIdentifiers != null && partsIdx < partsIdentifiers.size()) { partsIdentifier = partsIdentifiers.get(partsIdx); } boolean lastInCategory = (partsIdx == partsLen - 1); int idx = centerPnl.getComponentCount(); RandomChooserPanel pnl = addPartsChooserPanel(centerPnl, idx, category, lastInCategory, changePartsIdentifierListener, scaleSupport); // 未選択の場合、もしくは複数選択カテゴリの場合はランダムはディセーブルとする pnl.setEnableRandom(enable && !category.isMultipleSelectable()); if (partsIdentifier != null) { pnl.setSelectedPartsIdentifier(partsIdentifier); } } } } finally { eventLock.decrementAndGet(); } JScrollPane scr = new JScrollPane(centerPnl) { private static final long serialVersionUID = 1L; @Override public JScrollBar createVerticalScrollBar() { JScrollBar sb = super.createVerticalScrollBar(); sb.setUnitIncrement(12); return sb; } }; scr.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); contentPane.add(scr, BorderLayout.CENTER); this.actRandomAll = new AbstractAction(strings.getProperty("randomAll")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onRandomAll(); } }; this.actBack = new AbstractAction(strings.getProperty("back")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onBack(); } }; this.actCancel = new AbstractAction(strings.getProperty("close")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onClose(); } }; JButton btnClose = new JButton(actCancel); JButton btnRandomAll = new JButton(actRandomAll); JButton btnBack = new JButton(actBack); Box btnPanel = Box.createHorizontalBox(); int mergin = (int)(5 * scaleSupport.getManualScaleX()); btnPanel.setBorder(BorderFactory.createEmptyBorder(mergin, mergin, mergin, mergin * 8)); // 5, 5, 5, 40 btnPanel.add(btnRandomAll); btnPanel.add(btnBack); btnPanel.add(Box.createHorizontalGlue()); btnPanel.add(btnClose); contentPane.add(btnPanel, BorderLayout.SOUTH); JRootPane rootPane = getRootPane(); rootPane.setDefaultButton(btnRandomAll); Toolkit tk = Toolkit.getDefaultToolkit(); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeDialog"); am.put("closeDialog", actCancel); addHistory(getSelection()); updateUIState(); } /** * ボタンの状態を設定する. */ protected void updateUIState() { actBack.setEnabled(history.size() > 1); } /** * ダイアログを破棄して閉じる. */ protected void onClose() { dispose(); } /** * パネル構築時、および一括ランダム選択時などでパーツのコンボボックスの選択が複数変更される場合に * イベントを一度だけ処理するようにグループ化するためのロック. */ private final AtomicInteger eventLock = new AtomicInteger(0); /** * センターパネル上に配置したランダム選択パネルのリストを取得する.
* (ランダム選択パネルの個数は実行時に自由に可変できるため.) * * @return ランダム選択パネルのリスト */ protected List getRandomChooserPanels() { ArrayList panels = new ArrayList(); int mx = centerPnl.getComponentCount(); for (int idx = 0; idx < mx; idx++) { Component comp = centerPnl.getComponent(idx); if (comp instanceof RandomChooserPanel) { RandomChooserPanel pnl = (RandomChooserPanel) comp; panels.add(pnl); } } return panels; } /** * 現在選択中の状態を取得する. * * @return */ protected Map getSelection() { HashMap selection = new HashMap(); for (RandomChooserPanel pnl : getRandomChooserPanels()) { PartsIdentifier partsIdentifier = pnl.getSelectedPartsIdentifier(); selection.put(pnl, partsIdentifier); } return selection; } /** * 履歴に追加する. * * @param selection */ protected void addHistory(Map selection) { if (selection == null || selection.isEmpty()) { return; } // 履歴に追加する. history.addLast(selection); // 最大数を越えた場合は除去する while (history.size() > maxHistory) { history.removeFirst(); } updateUIState(); } /** * 前回の選択状態に戻す */ protected void onBack() { if (history.size() <= 1) { return; } // ヒストリーの直前のものを取り出す // 先頭のものは現在表示中のものなので、2つ取り出す必要がある. history.removeLast(); Map selection = history.getLast(); // すべてのランダム選択パネルに再適用する. eventLock.incrementAndGet(); try { for (Map.Entry entry : selection .entrySet()) { RandomChooserPanel pnl = entry.getKey(); PartsIdentifier partsIdentifier = entry.getValue(); pnl.setSelectedPartsIdentifier(partsIdentifier); } PartsSet partsSet = makePartsSet(selection.values()); if (!partsSet.isEmpty()) { partsSync.setPartsSet(partsSet); } } finally { eventLock.decrementAndGet(); } updateUIState(); } /** * 一括ランダム選択 */ protected void onRandomAll() { eventLock.incrementAndGet(); try { for (RandomChooserPanel pnl : getRandomChooserPanels()) { if (pnl.isEnableRandom()) { // ランダム選択を有効としているものだけを対象とする. pnl.selectRandom(); } } onChangePartsIdentifiers(); } finally { eventLock.decrementAndGet(); } } /** * パーツの選択からパーツセットを生成して返す. * * @param selection * @return */ protected PartsSet makePartsSet(Collection selection) { PartsSet partsSet = new PartsSet(); for (PartsIdentifier partsIdentifier : selection) { if (partsIdentifier != null) { PartsCategory category = partsIdentifier.getPartsCategory(); partsSet.appendParts(category, partsIdentifier, null); // 色は不問とする } } return partsSet; } /** * パーツの選択が変更されたことを通知される.
* 現在のランダム選択状態を、プレビューの状態に反映させる. */ protected void onChangePartsIdentifiers() { Map selection = getSelection(); PartsSet partsSet = makePartsSet(selection.values()); if (!partsSet.isEmpty()) { partsSync.setPartsSet(partsSet); addHistory(selection); } } /** * アイテムごとのランダム選択パネル * * @author seraphy */ protected class RandomChooserPanel extends JPanel { private static final long serialVersionUID = 1L; private EventListenerList listeners = new EventListenerList(); private JCheckBox label; private JComboBox partsCombo; private JToggleButton btnReject; public RandomChooserPanel(final PartsCategory category, final boolean lastInCategory, final ScaleSupport scaleSupport) { Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties( STRINGS_RESOURCE); int gap = (int)(3 * scaleSupport.getManualScaleX()); setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(gap, gap, gap, gap), BorderFactory.createCompoundBorder( BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder(gap, gap, gap, gap)))); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1.; gbc.weighty = 0.; String categoryName = category.getLocalizedCategoryName(); this.label = new JCheckBox(categoryName, true); add(label, gbc); JButton btnRandom = new JButton(new AbstractAction( strings.getProperty("random")) { private static final long serialVersionUID = -1; public void actionPerformed(ActionEvent e) { onClickRandom(e); } }); gbc.gridx = 1; gbc.weightx = 0; add(btnRandom, gbc); ArrayList partsList = new ArrayList(); partsList.addAll(characterData.getPartsSpecMap(category).keySet()); Collections.sort(partsList); if (category.isMultipleSelectable()) { // 複数選択カテゴリは未選択状態が可能なため先頭に空行を入れる. partsList.add(0, null); } this.partsCombo = new JComboBox( partsList.toArray(new PartsIdentifier[partsList.size()])); partsCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onSelectChangePartsIdentifier(e); } }); gbc.gridx = 0; gbc.gridy = 1; gbc.weightx = 1.; add(partsCombo, gbc); this.btnReject = new JToggleButton(new AbstractAction( strings.getProperty("reject")) { private static final long serialVersionUID = -1; public void actionPerformed(ActionEvent e) { onClickReject(e); } }); gbc.gridx = 1; gbc.gridy = 1; gbc.weightx = 0; add(btnReject, gbc); if (category.isMultipleSelectable() && lastInCategory) { JButton btnAdd = new JButton(new AbstractAction( strings.getProperty("add")) { private static final long serialVersionUID = -1; public void actionPerformed(ActionEvent e) { onClickAdd(e); } }); gbc.gridx = 1; gbc.gridy = 2; gbc.weightx = 0; add(btnAdd, gbc); } updateButtonState(); } public void addActionListener(ActionListener l) { listeners.add(ActionListener.class, l); } public void removeActionListener(ActionListener l) { listeners.remove(ActionListener.class, l); } public boolean isEnableRandom() { return label.isSelected(); } public void setEnableRandom(boolean selected) { label.setSelected(selected); } public PartsIdentifier getSelectedPartsIdentifier() { return (PartsIdentifier) partsCombo.getSelectedItem(); } public void setSelectedPartsIdentifier(PartsIdentifier partsIdentifier) { partsCombo.setSelectedItem(partsIdentifier); } protected void updateButtonState() { PartsIdentifier partsIdentifier = getSelectedPartsIdentifier(); if (partsIdentifier == null) { btnReject.setEnabled(false); return; } boolean exclude = partsSync .isExcludePartsIdentifier(partsIdentifier); btnReject.setSelected(exclude); btnReject.setEnabled(true); } protected void onSelectChangePartsIdentifier(ActionEvent e) { updateButtonState(); ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "selectChangePartsIdentifier"); for (ActionListener l : listeners .getListeners(ActionListener.class)) { l.actionPerformed(evt); } } protected void onClickReject(ActionEvent e) { PartsIdentifier partsIdentifier = getSelectedPartsIdentifier(); if (partsIdentifier == null) { return; } boolean exclude = partsSync .isExcludePartsIdentifier(partsIdentifier); partsSync.setExcludePartsIdentifier(partsIdentifier, !exclude); updateButtonState(); } protected void onClickRandom(ActionEvent e) { selectRandom(); } public void selectRandom() { ArrayList partsIdentifiers = new ArrayList(); int mx = partsCombo.getItemCount(); for (int idx = 0; idx < mx; idx++) { PartsIdentifier partsIdentifier = (PartsIdentifier) partsCombo .getItemAt(idx); if (partsIdentifier != null) { if (!partsSync.isExcludePartsIdentifier(partsIdentifier)) { partsIdentifiers.add(partsIdentifier); } } } int len = partsIdentifiers.size(); if (len == 0) { // 選択しようがないので何もしない. return; } Random rng = new Random(); int selidx = rng.nextInt(len); setSelectedPartsIdentifier(partsIdentifiers.get(selidx)); } protected void onClickAdd(ActionEvent e) { // 何もしない. } } /** * カテゴリのパーツのランダム選択パネルを作成する.
* パネルが追加ボタンをもつときには、作成されたパネルにもパーツ変更リスナは適用される.
* * @param centerPnl * 追加されるパネル * @param addPos * 追加する位置 * @param category * カテゴリ * @param lastInCategory * 作成するパネルに、追加ボタンをつけるか? * @param changePartsIdentifierListener * パーツ選択が変わった場合のリスナ * @return 作成されたランダム選択パネル */ protected RandomChooserPanel addPartsChooserPanel(final Box centerPnl, final int addPos, final PartsCategory category, final boolean lastInCategory, final ActionListener changePartsIdentifierListener, final ScaleSupport scaleSupport) { RandomChooserPanel pnl = new RandomChooserPanel(category, lastInCategory, scaleSupport) { private static final long serialVersionUID = 1L; @Override protected void onClickAdd(ActionEvent e) { int mx = centerPnl.getComponentCount(); for (int idx = 0; idx < mx; idx++) { Component comp = centerPnl.getComponent(idx); if (comp.equals(this)) { // 同じカテゴリのものを追加する addPartsChooserPanel(centerPnl, idx + 1, category, lastInCategory, changePartsIdentifierListener, scaleSupport); centerPnl.validate(); // Addボタンを非表示にする. ((JButton) e.getSource()).setVisible(false); break; } } } }; // パーツ選択変更を通知するリスナを設定する. pnl.addActionListener(changePartsIdentifierListener); centerPnl.add(pnl, addPos); return pnl; } } CharacterManaJ/src/main/java/charactermanaj/ui/util/0000755000175000017500000000000013615720000022554 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/ui/util/FileDropListener.java0000644000175000017500000000061413615720000026632 0ustar paulliupaulliupackage charactermanaj.ui.util; import java.io.File; import java.util.List; /** * ファイルがドロップされたことを通知されるリスナ.
* @author seraphy * */ public interface FileDropListener { /** * ファイルがドロップされたことを通知する. * @param dropFiles ドロップされたファイル */ void onDropFiles(List dropFiles); } CharacterManaJ/src/main/java/charactermanaj/ui/util/SpinnerWheelSupportListener.java0000644000175000017500000000376513615720000031140 0ustar paulliupaulliupackage charactermanaj.ui.util; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; /** * スピナーをホイールによって上下できるようにするためのホイールリスナ. * @author seraphy */ public class SpinnerWheelSupportListener implements MouseWheelListener { /** * 対象となるスピナーのモデル */ protected SpinnerModel model; /** * スピナーのモデルを指定して構築します. * @param model */ public SpinnerWheelSupportListener(SpinnerModel model) { if (model == null) { throw new IllegalArgumentException(); } this.model = model; } /** * ホイールによりスピナーモデルの現在値を上下させる.
* モデルが数値型である場合は範囲チェックをし、その範囲で適用します.
* 数値外であれば適用した結果エラーとなる場合は単に無視します.
* @param e マウスホイールイベント */ @SuppressWarnings({ "rawtypes", "unchecked" }) public void mouseWheelMoved(MouseWheelEvent e) { int rotate = e.getWheelRotation(); Object nextval = null; if (rotate < 0) { // 上スクロール(up) nextval = model.getNextValue(); } else if (rotate > 0) { // 下スクロール(down) nextval = model.getPreviousValue(); } if (nextval != null) { if (model instanceof SpinnerNumberModel) { SpinnerNumberModel nmodel = (SpinnerNumberModel) model; Comparable max = nmodel.getMaximum(); Comparable min = nmodel.getMinimum(); if (max.compareTo(nextval) < 0) { nextval = null; } else if (min.compareTo(nextval) > 0) { nextval = null; } } try { if (nextval != null) { model.setValue(nextval); } } catch (IllegalArgumentException ex) { // 範囲外になった場合はIllegalArgumentExceptionが発生するが、 // ユーザ操作によるものなので単に無視する } } } } CharacterManaJ/src/main/java/charactermanaj/ui/util/SingleRootFileSystemView.java0000644000175000017500000000211713615720000030345 0ustar paulliupaulliupackage charactermanaj.ui.util; import java.io.File; import java.io.IOException; import javax.swing.filechooser.FileSystemView; /** * ファイルチューザのコンストラクタに指定することで、特定のディレクトリ以外に移動できないようにする
* ためのファイルシステムビューを構築します.
* 親ディレクトリへの移動、別のルートディレクトリの選択はできず、新規ディレクトリの作成もできません.
* * @author seraphy */ public class SingleRootFileSystemView extends FileSystemView { /** * 対象ディレクトリ */ private File dir; public SingleRootFileSystemView(File templDir) { if (templDir == null) { throw new IllegalArgumentException(); } this.dir = templDir; } @Override public File createNewFolder(File containingDir) throws IOException { return null; } @Override public File getDefaultDirectory() { return dir; } @Override public File getHomeDirectory() { return dir; } @Override public File[] getRoots() { return new File[]{dir}; } } CharacterManaJ/src/main/java/charactermanaj/ui/util/ScrollPaneDragScrollSupport.java0000644000175000017500000002432113615720000031035 0ustar paulliupaulliupackage charactermanaj.ui.util; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import javax.swing.JComponent; import javax.swing.JScrollPane; import javax.swing.JViewport; import javax.swing.SwingUtilities; import charactermanaj.model.AppConfig; /** * JScrollPaneでマウスによるドラッグスクロールをサポートするためのヘルパクラス.
* @author seraphy */ public class ScrollPaneDragScrollSupport { /** * 対象となるスクロールペイン */ private JScrollPane scrollPane; /** * ホイールによるスクロールで移動する分割単位.
* 表示されているエリアをn等分割したサイズごとにスクロールする.
*/ private int wheelDivider; /** * JScrollPaneを指定して構築する. * @param scrollPane */ public ScrollPaneDragScrollSupport(JScrollPane scrollPane) { if (scrollPane == null) { throw new IllegalArgumentException(); } this.scrollPane = scrollPane; AppConfig appConfig = AppConfig.getInstance(); wheelDivider = Math.max(2, appConfig.getWheelScrollUnit()); } /** * ドラッグ開始位置を示す.
* スクロールが調整されるたびに新しい座標にセットし直す.
* ドラッグ中であれば非nullとなる.
* ドラッグが完了した場合、もしくはドラッグが開始されていなければnullとなる.
*/ private Point dragPt; /** * ドラッグによるスクロールが可能か?
* 垂直・水平のいずれのスクロールバーがない状況ではドラッグは開始されない.
* @return ドラッグによるスクロールが可能である場合はtrue */ public boolean isDragScrollable() { JViewport vp = scrollPane.getViewport(); Dimension viewSize = vp.getViewSize(); Dimension visibleSize = vp.getExtentSize(); if (viewSize.width <= visibleSize.width && viewSize.height <= visibleSize.height) { // ビューポートにビューが全部表示されていればドラッグは開始されない. return false; } return true; } /** * 現在のドラッグ位置を取得する.
* ドラッグが開始されていなければnullとなる.
* @return ドラッグ位置 */ public Point getDragPt() { return dragPt; } /** * 現在ドラッグ中であるか? * @return ドラッグ中であればtrue */ public boolean isDragging() { return dragPt != null; } /** * カーソルを設定する. * @param cursor カーソル */ protected void setCursor(Cursor cursor) { scrollPane.setCursor(cursor); } /** * ドラッグの開始または終了を行う.
* すでに開始済みで開始要求するか、開始されておらず停止要求した場合は何もしない.
* @param start 開始する場合はtrue、終了する場合はfalse * @param mousePt 開始位置 */ public void drag(boolean start, Point mousePt) { if (start) { if (dragPt == null) { JViewport vp = scrollPane.getViewport(); Dimension viewSize = vp.getViewSize(); Dimension visibleSize = vp.getExtentSize(); if (viewSize.width <= visibleSize.width && viewSize.height <= visibleSize.height) { // ビューポートにビューが全部表示されていればドラッグは開始されない. dragPt = null; return; } // ドラッグ中であることを示す dragPt = mousePt; setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } } else if (dragPt != null) { // ドラッグ中であれば解除する. // (ドラッグ解除済みであれば何もしない.) dragging(mousePt); setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); dragPt = null; } } /** * マウスによるドラッグによるスクロール.
* 前回位置(初回なら開始位置)との差分からスクロール量を判定する.
* @param mousePt 現在のマウス位置 */ public void dragging(Point mousePt) { if (dragPt == null || mousePt == null) { // 前回値がないか今回値がない場合は何もしない. return; } // 前回座標との差分を求める int diff_x = dragPt.x - mousePt.x; int diff_y = dragPt.y - mousePt.y; scroll(diff_x, diff_y); // 現在位置を記録 dragPt = mousePt; } /** * マウス座標単位で指定したオフセット分スクロールする. * @param diff_x 水平方向スクロール数 * @param diff_y 垂直方向スクロール数 */ public void scroll(int diff_x, int diff_y) { if (diff_x == 0 && diff_y == 0) { return; } JViewport vp = scrollPane.getViewport(); Dimension viewSize = vp.getViewSize(); Dimension visibleSize = vp.getExtentSize(); Point vpt = vp.getViewPosition(); vpt.x += diff_x; if (vpt.x < 0) { vpt.x = 0; } else if (vpt.x + visibleSize.width > viewSize.width) { // はみ出た分を引く vpt.x -= (vpt.x + visibleSize.width - viewSize.width); } vpt.y += diff_y; if (vpt.y < 0) { vpt.y = 0; } else if (vpt.y + visibleSize.height > viewSize.height) { // はみ出た分を引く vpt.y -= (vpt.y + visibleSize.height - viewSize.height); } vp.setViewPosition(vpt); } /** * ホイールによるスクロール量の分割数.
* 表示されている領域に対してn等分割したサイズを * 一回あたりのスクロール量とする.
* @return スクロール量の分割数 */ public int getWheelDivider() { return wheelDivider; } public void setWheelFactor(int wheelDivider) { this.wheelDivider = Math.max(2, wheelDivider); } /** * マウスホイールによる水平・垂直スクロールを行うためのコンビニエスとメソッド.
* シフトキーで水平、それ以外は垂直とする.
* @param e ホイールイベント */ public void scrollByWheel(final MouseWheelEvent e) { if (e == null) { return; } JViewport vp = scrollPane.getViewport(); Dimension visibleSize = vp.getExtentSize(); int rotation = e.getWheelRotation(); int diff_x = 0; int diff_y = 0; if (e.isShiftDown()) { // 水平スクロール int unit = visibleSize.width / getWheelDivider(); diff_x = rotation * unit; } else { // 垂直スクロール int unit = visibleSize.height / getWheelDivider(); diff_y = rotation * unit; } scroll(diff_x, diff_y); } /** * セットアップしたリスナを保存するもの */ private MouseListener mouseListener; /** * セットアップしたリスナを保存するもの */ private MouseMotionListener mouseMotionListener; /** * セットアップしたリスナを保存するもの */ private MouseWheelListener mouseWheelListener; /** * リスナをセットアップしたコンポーネント */ private JComponent installTarget; /** * ドラッグの開始に相応しいボタンプレスであるか判定するためのインターフェイス. * @author seraphy */ public interface DragPridicator { /** * このマウスイベントでドラッグ開始しても良いか? * @param e マウスイベント * @return ドラッグを開始しても良い場合はtrue */ boolean isDraggable(MouseEvent e); } /** * マウスによるドラッグをサポートする、一般的なマウスリスナとマウスモーションリスナをセットアップする.
* すでに登録済みであれば何もしない.
* このメソッドはマウスリスナに特別な処理が必要ない場合に定型的な処理を代行するコンビニエスメソッドです.
* @param comp マウスリスナをセットアップするターゲットのコンポーネント * @param predicator マウスによるドラッグの開始を行うか判定するためのオブジェクト、nullの場合は不問 */ public void installDraggingListener(final JComponent comp, final DragPridicator predicator) { if (comp == null) { throw new IllegalArgumentException(); } if (mouseListener == null) { mouseListener = new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (predicator == null || predicator.isDraggable(e)) { Point pt = SwingUtilities.convertPoint( comp, e.getPoint(), scrollPane); drag(true, pt); } } @Override public void mouseReleased(MouseEvent e) { if (predicator == null || predicator.isDraggable(e)) { Point pt = SwingUtilities.convertPoint( comp, e.getPoint(), scrollPane); drag(false, pt); } } }; // リスナを登録する. comp.addMouseListener(mouseListener); } if (mouseMotionListener == null) { mouseMotionListener = new MouseMotionListener() { public void mouseMoved(MouseEvent e) { // 何もしない. } public void mouseDragged(MouseEvent e) { Point pt = SwingUtilities.convertPoint( comp, e.getPoint(), scrollPane); dragging(pt); } }; // リスナを登録する. comp.addMouseMotionListener(mouseMotionListener); } if (mouseWheelListener == null) { mouseWheelListener = new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent e) { scrollByWheel(e); e.consume(); } }; // ホイールスクロールのデフォルト設定を解除する. scrollPane.setWheelScrollingEnabled(false); // リスナを登録する. comp.addMouseWheelListener(mouseWheelListener); } installTarget = comp; } /** * セットアップしたリスナを解除する.
* 登録されていない場合は何もしない.
*/ public void uninstallDraggingListener() { if (mouseListener != null && installTarget != null) { installTarget.removeMouseListener(mouseListener); mouseListener = null; } if (mouseMotionListener != null && installTarget != null) { installTarget.removeMouseMotionListener(mouseMotionListener); mouseMotionListener = null; } if (mouseWheelListener != null && installTarget != null) { installTarget.removeMouseWheelListener(mouseWheelListener); mouseWheelListener = null; } } } CharacterManaJ/src/main/java/charactermanaj/ui/util/WindowAdjustLocationSupport.java0000644000175000017500000000437713615720000031142 0ustar paulliupaulliupackage charactermanaj.ui.util; import java.awt.Dimension; import java.awt.GraphicsEnvironment; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.Window; import javax.swing.JFrame; /** * ウィンドウの位置を調整するサポートクラス.
* * @author seraphy */ public final class WindowAdjustLocationSupport { /** * プライベートコンストラクタ */ private WindowAdjustLocationSupport() { super(); } /** * ウィンドウの表示位置をメインウィンドウの右側に調整する.
* 横位置Xはメインフレームの右側とし、縦位置Yはメインフレームの上位置からのoffset_yを加えた位置とする.
* * @param mainWindow * 基準位置となるメインウィンドウ * @param window * 位置を調整するウィンドウ * @param offset_y * 表示のYオフセット * @param sameHeight * 高さをメインウィンドウにそろえるか? */ public static void alignRight(JFrame mainWindow, Window window, int offset_y, boolean sameHeight) { // メインウィンドウよりも左側に位置づけする. // 縦位置はメインウィンドウの上端からオフセットを加えたものとする. Point pt = mainWindow.getLocation(); Insets insets = mainWindow.getInsets(); pt.x += mainWindow.getWidth(); pt.y += (offset_y * insets.top); // メインスクリーンサイズを取得する. GraphicsEnvironment genv = GraphicsEnvironment .getLocalGraphicsEnvironment(); Rectangle desktopSize = genv.getMaximumWindowBounds(); // メインスクリーンのサイズ(デスクトップ領域のみ) // メインスクリーンサイズを超えた場合は、はみ出た分を移動する. if ((pt.x + window.getWidth()) > desktopSize.width) { pt.x -= ((pt.x + window.getWidth()) - desktopSize.width); } if ((pt.y + window.getHeight()) > desktopSize.height) { pt.y -= ((pt.y + window.getHeight()) - desktopSize.height); } window.setLocation(pt); // 高さはメインフレームと同じにする. if (sameHeight) { Dimension siz = window.getSize(); siz.height = mainWindow.getHeight() - offset_y; window.setSize(siz); } } } CharacterManaJ/src/main/java/charactermanaj/ui/util/ScaleSupport.java0000644000175000017500000001321013615720000026040 0ustar paulliupaulliupackage charactermanaj.ui.util; import java.awt.Component; import java.awt.Dimension; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Toolkit; import java.awt.geom.AffineTransform; import java.lang.reflect.Field; import java.lang.reflect.Method; import charactermanaj.util.JavaVersionUtils; /** * スクリーンのスケールを取得する。 * * Java8であれば自動スケールがかかっていないので、マニュアルでスケール倍して座標を補正する。 * Java11であれば自動スケールがかかっている。 */ public class ScaleSupport { private static final int resolution; private static final float computeScale; private static final boolean noNeedCheckScaleByReflection; private double scaleX; private double scaleY; private double manualScaleX; private double manualScaleY; private boolean retina; static { // デフォルトのスクリーン解像度を取得する Toolkit tk = Toolkit.getDefaultToolkit(); resolution = tk.getScreenResolution(); // スクリーン解像度と標準のDPIから必要とされるスケールを計算する。 // ただし、Windowsでない場合はスケール1の等倍にする。 // (Retinaの場合はシステム側でスケールされるのでアプリ側でスケールする必要はないため) float dpi = System.getProperty("os.name").startsWith("Windows") ? 96f : resolution; computeScale = resolution / dpi; // Java9以降であればアフィン変換パラメータでスケールを確認できるので // リフレクションを使ったスケールの確認は不要である。 noNeedCheckScaleByReflection = JavaVersionUtils.getJavaVersion() >= 9; } private ScaleSupport(double scaleX, double scaleY) { this.scaleX = scaleX; this.scaleY = scaleY; if (scaleX > 1 || scaleY > 1 || Boolean.getBoolean("disableScaleCalibrate")) { // システム側でスケールがかかっていれば、アプリ側ではスケールする必要はない。 // もしくはシステムプロパティでアプリによるスケールを無効にしている場合。 manualScaleX = 1; manualScaleY = 1; } else { // システム側でスケールがかかっていない場合はアプリ側でスケールする // スクリーン解像度とDPIから必要なスケールを求める manualScaleX = computeScale; manualScaleY = computeScale; } } public static int getScreenResolution() { return resolution; } public static float getScreenScale() { return computeScale; } private void setRetina(boolean retina) { this.retina = retina; } public boolean isRetina() { return retina; } /** * コンポーネントのグラフィクス設定からスケールを取得する。 * まだ画面に関連付けられていない場合はnullを返す。 * @param comp * @return */ public static ScaleSupport getInstance(Component comp) { GraphicsConfiguration gconf = comp.getGraphicsConfiguration(); if (gconf == null) { return null; } return getInstance(gconf); } public static ScaleSupport getDefault() { GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gdev = genv.getDefaultScreenDevice(); return getInstance(gdev.getDefaultConfiguration()); } public static ScaleSupport getInstance(GraphicsConfiguration gconf) { // java9以降であれば、GraphicsConfigurationのデフォルトのアフィン変換に // スクリーンのスケールがかけられている。 AffineTransform trans = gconf.getDefaultTransform(); double scaleX = trans.getScaleX(); double scaleY = trans.getScaleY(); boolean retina = false; if (scaleX == 1 && scaleY == 1 && !noNeedCheckScaleByReflection) { // Java8まではデフォルトのアフィン変換はスクリーンスケールは設定されていないので // 等倍を返してきた場合は、グラフィクスデバイスがスケールメソッドをもっているかリフレクションで確かめる。 // Mac版のJava8であればスケーメメソッドをもっている。 // (Java9以降であれば確認は不要である。) // http://hg.openjdk.java.net/jdk9/client/jdk/file/1089d8a8a6e1/src/java.desktop/macosx/classes/sun/awt/CGraphicsDevice.java // https://www.programcreek.com/java-api-examples/?code=SensorsINI/jaer/jaer-master/src/net/sf/jaer/graphics/ChipCanvas.java final GraphicsDevice device = gconf.getDevice(); Object scaleObj = null; try { // public methodがあれば、そちらを試す。 Method methodGetScaleFactor = device.getClass().getMethod("getScaleFactor"); scaleObj = methodGetScaleFactor.invoke(device); } catch (Exception ex) { try { // sun.awt.CGraphicsDevice固有の内部フィールドを試す Field field = device.getClass().getDeclaredField("scale"); field.setAccessible(true); scaleObj = field.get(device); } catch (Exception ex2) { // 何もしない } } if (scaleObj instanceof Number) { int scale = ((Number) scaleObj).intValue(); scaleX = scaleY = scale; if (scale >= 2) { retina = true; } } } ScaleSupport inst = new ScaleSupport(scaleX, scaleY); inst.setRetina(retina); return inst; } public double getDefaultScaleX() { return scaleX; } public double getDefaultScaleY() { return scaleY; } public double getManualScaleX() { return manualScaleX; } public double getManualScaleY() { return manualScaleY; } public Dimension manualScaled(Dimension dim) { return new Dimension((int) (dim.getWidth() * manualScaleX), (int) (dim.getHeight() * manualScaleY)); } }CharacterManaJ/src/main/java/charactermanaj/ui/util/FileDropTarget.java0000644000175000017500000001011213615720000026265 0ustar paulliupaulliupackage charactermanaj.ui.util; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTargetAdapter; import java.awt.dnd.DropTargetDropEvent; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; /** * ファイルドロップターゲット.
* Windows/Macと、Linuxの両方のデスクトップのドロップをサポートする. * @author seraphy */ public class FileDropTarget extends DropTargetAdapter { /** * ロガー */ private final Logger logger = Logger.getLogger(getClass().getName()); protected FileDropListener fileDropListener; public FileDropTarget() { this(null); } public FileDropTarget(FileDropListener fileDropListener) { this.fileDropListener = fileDropListener; } public FileDropListener getFileDropListener() { return fileDropListener; } public void setFileDropListener(FileDropListener fileDropListener) { this.fileDropListener = fileDropListener; } protected void onDropFiles(List dropFiles) { if (fileDropListener != null) { if ( !dropFiles.isEmpty()) { fileDropListener.onDropFiles(dropFiles); } } } public void drop(DropTargetDropEvent dtde) { try { // urlListFlavor (RFC 2483 for the text/uri-list format) DataFlavor uriListFlavor; try { uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String"); } catch (ClassNotFoundException ex) { logger.log(Level.WARNING, "urlListFlavor is not supported.", ex); uriListFlavor = null; } final List dropFiles = new ArrayList(); // ドロップされたものが1つのファイルであれば受け入れる。 for (DataFlavor flavor : dtde.getCurrentDataFlavors()) { logger.log(Level.FINE, "flavor: " + flavor); if (DataFlavor.javaFileListFlavor.equals(flavor)) { dtde.acceptDrop(DnDConstants.ACTION_COPY); @SuppressWarnings({ "unchecked", "rawtypes" }) List files = (List) dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); logger.log(Level.FINER, "DragAndDrop files(javaFileListFlavor)=" + files); dropFiles.addAll(files); break; } if (uriListFlavor != null && uriListFlavor.equals(flavor)) { // LinuxではjavaFileListFlavorではなく、text/uri-listタイプで送信される. dtde.acceptDrop(DnDConstants.ACTION_COPY); String uriList = (String) dtde.getTransferable().getTransferData(uriListFlavor); logger.log(Level.FINER, "DragAndDrop files(text/uri-list)=" + uriList); for (String fileStr : uriList.split("\r\n")) { // RFC2483によると改行コードはCRLF fileStr = fileStr.trim(); if (fileStr.startsWith("#")) { continue; } try { File dropFile; if (fileStr.startsWith("/")) { // protocolがなく、ルートから始まる場合はファイルと仮定する dropFile = new File(fileStr); } else { URI uri = new URI(fileStr); dropFile = new File(uri); } dropFiles.add(dropFile); break; } catch (RuntimeException ex) { logger.log(Level.WARNING, "invalid drop file: " + fileStr, ex); } catch (URISyntaxException ex) { logger.log(Level.WARNING, "invalid drop file: " + fileStr, ex); } } } } // 存在しないファイルを除去する. for (Iterator ite = dropFiles.iterator(); ite.hasNext();) { File dropFile = ite.next(); if (dropFile == null || !dropFile.exists()) { ite.remove(); } } // ドロップされたファイルを通知する. onDropFiles(dropFiles); } catch (UnsupportedFlavorException ex) { logger.log(Level.WARNING, "unsipported flovaor." , ex); onException(ex); } catch (IOException ex) { logger.log(Level.WARNING, "drop target failed." , ex); onException(ex); } } protected void onException(Exception ex) { // do nothing. } } CharacterManaJ/src/main/java/charactermanaj/ui/MenuData.java0000644000175000017500000000643113615720000024144 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.event.ActionListener; import java.util.AbstractCollection; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JMenuItem; import javax.swing.KeyStroke; import charactermanaj.Main; public class MenuData extends AbstractCollection { private String name; private boolean checkbox; private String text; private Character mnemonic; private String mnemonicDisp; private boolean ignoreMacOSX; private String shortcutKey; private ActionListener actionListener; private ArrayList children = new ArrayList(); public MenuData() { this(null, false, null, null, false, null, null); } public MenuData(String text, boolean checkbox, Character mnemonic, String mnemonicDisp, boolean ignoreMacOSX, String shortcutKey, ActionListener actionListener) { this.text = text; this.checkbox = checkbox; this.mnemonic = mnemonic; this.mnemonicDisp = mnemonicDisp; this.ignoreMacOSX = ignoreMacOSX; this.shortcutKey = shortcutKey; this.actionListener = actionListener; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setCheckbox(boolean checkbox) { this.checkbox = checkbox; } public boolean isCheckbox() { return checkbox; } public String getText() { return text; } public void setText(String text) { this.text = text; } public Character getMnemonic() { return mnemonic; } public void setMnemonic(Character mnemonic) { this.mnemonic = mnemonic; } public String getMnemonicDisp() { return mnemonicDisp; } public void setMnimonicDisp(String mnemonicDisp) { this.mnemonicDisp = mnemonicDisp; } public boolean isIgnoreMacOSX() { return ignoreMacOSX; } public void setIgnoreMacOSX(boolean ignoreMacOSX) { this.ignoreMacOSX = ignoreMacOSX; } public ActionListener getActionListener() { return actionListener; } public void setActionListener(ActionListener actionListener) { this.actionListener = actionListener; } public String getShortcutKey() { return shortcutKey; } public void setShortcutKey(String shortcutKey) { this.shortcutKey = shortcutKey; } @Override public int size() { return children.size(); } @Override public Iterator iterator() { return children.iterator(); } @Override public boolean add(MenuData o) { return children.add(o); } public boolean makeMenu(JMenuItem menu) { if (! isIgnoreMacOSX() || ! Main.isMacOSX()) { if (Main.isMacOSX()) { menu.setText(getText()); } else { Character mnemonic = getMnemonic(); String mnemonicDisp =getMnemonicDisp(); if (mnemonicDisp == null) { mnemonicDisp = ""; } menu.setName(getName()); menu.setText(getText() + mnemonicDisp); if (mnemonic != null) { menu.setMnemonic(mnemonic); } } if (actionListener != null) { menu.addActionListener(actionListener); } if (shortcutKey != null && shortcutKey.length() > 0) { if (Main.isMacOSX()) { shortcutKey = shortcutKey.replace("?", "meta"); } else { shortcutKey = shortcutKey.replace("?", "control"); } KeyStroke ks = KeyStroke.getKeyStroke(shortcutKey); if (ks != null) { menu.setAccelerator(ks); } } return true; } return false; } } CharacterManaJ/src/main/java/charactermanaj/ui/scrollablemenu/0000755000175000017500000000000013615720000024606 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/ui/scrollablemenu/ScrollableMenuEvent.java0000644000175000017500000000222113615720000031357 0ustar paulliupaulliupackage charactermanaj.ui.scrollablemenu; import java.util.EventObject; /** * スクローラブルメニューのイベント * * @author seraphy */ public class ScrollableMenuEvent extends EventObject { /** * シリアライズバージョンID */ private static final long serialVersionUID = 5686533260565824649L; /** * スクロール中フラグ */ private boolean _scrolling; /** * イベントのコンストラクタ * * @param s * イベントソース * @param scrolling * スクロール中フラグ */ public ScrollableMenuEvent(JScrollerMenuItem s, boolean scrolling) { super(s); this._scrolling = scrolling; } /** * スクロール中か? * * @return スクロール中であればtrue */ public boolean isScrolling() { return _scrolling; } /** * 診断用 * * @return 診断用文字列 */ @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append(getClass().getSimpleName()); buf.append("["); buf.append(this.source); buf.append(",scrolling=").append(this._scrolling); buf.append("]"); return buf.toString(); } } CharacterManaJ/src/main/java/charactermanaj/ui/scrollablemenu/ScrollableMenuEventListener.java0000644000175000017500000000077313615720000033077 0ustar paulliupaulliupackage charactermanaj.ui.scrollablemenu; import java.util.EventListener; /** * スクローラブルメニューのイベントリスナ * * @author seraphy */ public interface ScrollableMenuEventListener extends EventListener { /** * スクロール開始を通知する. * * @param e * イベント */ void start(ScrollableMenuEvent e); /** * スクロール終了を通知する. * * @param e * イベント */ void end(ScrollableMenuEvent e); } CharacterManaJ/src/main/java/charactermanaj/ui/scrollablemenu/JScrollableMenu.java0000644000175000017500000002762013615720000030501 0ustar paulliupaulliupackage charactermanaj.ui.scrollablemenu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import javax.swing.ImageIcon; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.Timer; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; /** * スクロール可能メニュー. メニュー項目を設定したあと、{@link #initScroller() }でスクローラーを初期化します. つぎに、 * {@link #setScrollableItems(java.util.Collection) }で、スクロールさせる メニュー項目を設定します。 * 表示可能なアイテム数を調整するために、このメニューオブジェクトのselectedイベントの タイミングで、 * {@link #adjustMaxVisible(int) }を呼び出して表示項目数を調整します。 * * @author seraphy */ public class JScrollableMenu extends JMenu { /** * シリアライズバージョンID */ private static final long serialVersionUID = -5174737355715398136L; /** * 自動スクロールの既定の間隔(mSec). */ public static final int DEFAULT_REPEAT_DELAY = 200; /** * 高速自動スクロールの既定の間隔(mSec). */ public static final int DEFAULT_FAST_REPEAT_DELAY = 80; /** * 既定の最大表示アイテム数. */ public static final int DEFAULT_MAX_VISIBLE = 10; /** * リピートの閾値. スクロール数が、この数値を超えた場合に高速スクロール化する. */ public static final int DEFAULT_REPEAT_THRESHOLD = 3; /** * スクロールするアイテムのメニューの開始位置. */ private int _startPos; /** * 現在表示されている最初のアイテムのオフセット. */ private int _offset; /** * スクロールするメニュー項目のリスト. */ private ArrayList _menus = new ArrayList(); /** * 自動スクロールのためのタイマー. */ private Timer _timer; /** * 自動スクロールしたカウント. */ private int _scrollCount; /** * スクローラー(上). */ private JScrollerMenuItem _upButton; /** * スクローラー(下). */ private JScrollerMenuItem _downButton; /** * 通常スクロール時の自動スクロールの間隔. */ private int _delay = DEFAULT_REPEAT_DELAY; /** * 高速スクロール時の自動スクロールの間隔. */ private int _delayFast = DEFAULT_FAST_REPEAT_DELAY; /** * リピートの閾値. スクロール数が、この数値を超えた場合に高速スクロール化する. */ private int _repeat_threshold = DEFAULT_REPEAT_THRESHOLD; /** * 現在のスクロール方向を示すフラグ. タイマーハンドラの中で判定するため. nullの場合はスクロールしていないを示す. */ private Boolean _directionUp; /** * 最大表示アイテム数. */ private int maxVisible = DEFAULT_MAX_VISIBLE; /** * 表示名を省略してメニューを構築する. */ public JScrollableMenu() { this(""); } /** * 表示名を指定してメニューを構築する. * * @param name */ public JScrollableMenu(String name) { super(name); initScrollableMenu(); } /** * スクロール可能メニューの基本状態を設定する. */ private void initScrollableMenu() { // 自動スクロールのためのタイマ this._timer = new Timer(_delay, new ActionListener() { public void actionPerformed(ActionEvent e) { // スクロール doScroll(); // スクロール数をカウントアップ _scrollCount++; // スクロール数が閾値を超えたら高速化 if (_scrollCount >= _repeat_threshold) { ((Timer) e.getSource()).setDelay(_delayFast); } } }); addMenuListener(new MenuListener() { public void menuCanceled(MenuEvent e) { // このメニューがキャンセルされたときにスクロールを停止する JScrollableMenu.this._timer.stop(); _directionUp = null; } public void menuDeselected(MenuEvent e) { // このメニューが非選択状態になったときスクロールを停止する JScrollableMenu.this._timer.stop(); _directionUp = null; } public void menuSelected(MenuEvent e) { // 何もしない } }); } /** * スクローラーを初期化します. スクロールしない固定のメニュー項目などを設定したあとで、このメソッドを呼び出します. * すでに初期化されている場合は何もしません. */ public void initScroller() { if (_upButton != null || _downButton != null) { // すでに初期化済み removeAllScrollableItems(); return; } // スクローラー用ボタンアイコンを、このクラスからの相対パスで取得する. // (派生クラスからでもリソースの相対位置を変えないようにするためクラス名は固定とする) Class cls = JScrollableMenu.class; URL downPngURL = cls.getResource("/icons/scroll_arrow_down.png"); URL upPngURL = cls.getResource("/icons/scroll_arrow_up.png"); if (downPngURL == null || upPngURL == null) { throw new RuntimeException("png resource not found."); } ImageIcon iconDown = new ImageIcon(downPngURL); ImageIcon iconUp = new ImageIcon(upPngURL); // スクローラー用メニュー項目 _upButton = new JScrollerMenuItem(iconUp); _downButton = new JScrollerMenuItem(iconDown); // スクローラーのマウスイベントを受け取る final ScrollableMenuEventListener sc = new ScrollableMenuEventListener() { public void start(ScrollableMenuEvent e) { Boolean direction; if (e.getSource().equals(_upButton)) { // 上スクロール direction = Boolean.TRUE; } else { // 下スクロール direction = Boolean.FALSE; } // マウスクリックに対するスクロール doScroll(direction); // 自動スクロール開始 _scrollCount = 0; _timer.setDelay(_delay); _timer.start(); } public void end(ScrollableMenuEvent e) { // 自動スクロール停止 _timer.stop(); _directionUp = null; } }; _upButton.addScrollableMenuEventListener(sc); _downButton.addScrollableMenuEventListener(sc); add(_upButton); _startPos = getItemCount(); // upButtonの次のインデックス add(_downButton); // Mac OS Xのスクリーンメニューはスクロール可能なので、 // スクローラー用アイテムは非表示にして、デフォルトの機能に任せる。 // (逆に、スクリーンメニューではカスタムメニューは、うまく機能しない。) if (isScreenMenu()) { _upButton.setVisible(false); _downButton.setVisible(false); } } /** * 1行スクロールする * * @param direction * 上方向の場合はtrue、下の場合はfalse、停止はnull */ public void doScroll(Boolean direction) { _directionUp = direction; doScroll(); } /** * スクロールする. */ protected void doScroll() { // 現在の方向に応じて処理内容を分岐する. if (_directionUp != null) { if (_directionUp.booleanValue()) { scrollDown(); } else { scrollUp(); } } } /** * Mac OS Xのスクリーンメニューを使用しているか? * * @return 使用している場合はtrue */ public static boolean isScreenMenu() { String macScreenMenu = System.getProperty("apple.laf.useScreenMenuBar"); if (macScreenMenu != null && macScreenMenu.toLowerCase().equals("true")) { return true; } return false; } /** * 表示可能な最大行数を設定する. * * @param maxVisible * 最大行数 */ public void setMaxVisible(int maxVisible) { this.maxVisible = maxVisible; } /** * 表示可能な最大行数を取得する. * * @return 表示可能な最大行数 */ public int getMaxVisible() { return this.maxVisible; } /** * 画面の高さを指定して、表示可能なスクロールのアイテム数を算定し、 スクロールを表示し直す. * * @param height * 画面の高さを示す(px) */ public void adjustMaxVisible(int height) { int numOfItems = 0; if (_menus.size() > 0) { int heightPerItem = _menus.get(0).getPreferredSize().height; if (heightPerItem <= 0) { // 調整できないので何もしない. return; } numOfItems = height / heightPerItem; } numOfItems = numOfItems - (_startPos + 1 + 2); // 既存 + up/downボタン分 + // 上下余白を差し引く if (numOfItems < 0) { numOfItems = 1; } this.maxVisible = numOfItems; updateScrollableMenus(); } /** * 通常スクロールの間隔を取得する. * * @return 通常スクロールの間隔(mSec) */ public int getRepeatDelay() { return this._delay; } /** * 高速スクロールの間隔を取得する. * * @return 高速スクロールの間隔(mSec) */ public int getRepeatDelayFast() { return this._delayFast; } /** * 通常スクロールの間隔を設定する. * * @param delay * 通常スクロールの間隔(mSec) */ public void setRepeatDelay(int delay) { this._delay = delay; } /** * 高速スクロールの間隔を設定する. * * @param delayFast * 高速スクロールの間隔(mSec) */ public void setRepeatDelayFast(int delayFast) { this._delayFast = delayFast; } /** * スクロール可能アイテムを設定します. 既存のアイテムがある場合は、すべて登録解除されます. 事前にスクローラーは初期化済みでなければなりません. * * @param menus * メニューリスト */ public void setScrollableItems(Collection menus) { if (_upButton == null || _downButton == null) { throw new IllegalStateException("initScrollerを先に呼び出してください"); } removeAllScrollableItems(); if (menus != null) { for (JMenuItem item : menus) { int idx = _startPos + _menus.size(); this.add(item, idx); _menus.add(item); } } updateScrollableMenus(); } /** * 現在のスクロール可能アイテムをすべて除去します. */ public void removeAllScrollableItems() { for (JMenuItem item : _menus) { this.remove(item); } _menus.clear(); _offset = 0; } /** * 現在のスクロール範囲でスクロール可能項目を表示します. */ public void updateScrollableMenus() { boolean screenMenu = isScreenMenu(); int numOfItems = _menus.size(); for (int idx = 0; idx < numOfItems; idx++) { boolean visible = false; if (idx >= _offset && idx < (_offset + maxVisible) || screenMenu) { // メニュー項目が表示範囲内であれば表示、範囲外であれび非表示とする。 // ただし、Mac OS Xのスクリーンメニューであれば無条件にすべて表示。 visible = true; } _menus.get(idx).setVisible(visible); } } /** * 現在表示されているスクロール項目のオフセットを取得する. * * @return 現在のオフセット */ public int getOffset() { return _offset; } /** * 上方向にスクロールします. これ以上スクロールできない場合は何もしません. その場合、自動スクロール中であればスクロールは停止します. */ public void scrollUp() { int numOfItems = _menus.size(); int limit = numOfItems - maxVisible; if (limit < 0) { limit = 0; } _offset++; if (_offset >= limit) { _offset = limit; _timer.stop(); _directionUp = null; } updateScrollableMenus(); } /** * 下方向にスクロールします. これ以上スクロールできない場合は何もしません。 その場合、自動スクロール中であればスクロールは停止します。 */ public void scrollDown() { _offset--; if (_offset < 0) { _offset = 0; _timer.stop(); _directionUp = null; } updateScrollableMenus(); } } CharacterManaJ/src/main/java/charactermanaj/ui/scrollablemenu/JScrollerMenuItem.java0000644000175000017500000000477513615720000031031 0ustar paulliupaulliupackage charactermanaj.ui.scrollablemenu; import java.awt.event.MouseEvent; import javax.swing.Icon; import javax.swing.JMenuItem; import javax.swing.event.EventListenerList; /** * スクローラブルメニューのスクローラーアイテムのメニュー項目 * * @author seraphy */ public class JScrollerMenuItem extends JMenuItem { /** * シリアライズバージョンID */ private static final long serialVersionUID = -1749741596476938310L; /** * イベントリスナのコレクション */ protected EventListenerList _listeners = new EventListenerList(); /** * スクローラーのアイコンを指定してスクローラーアイテムのメニュー項目を構築します. * * @param icon * アイコン */ public JScrollerMenuItem(Icon icon) { setIcon(icon); } /** * スクローラブルメニューイベントのイベントリスナを登録します. * * @param l * リスナー */ public void addScrollableMenuEventListener(ScrollableMenuEventListener l) { _listeners.add(ScrollableMenuEventListener.class, l); } /** * スクローラブルメニューイベントのイベントリスナを登録解除します. * * @param l * リスナー */ public void removeScrollableMenuEventListener(ScrollableMenuEventListener l) { _listeners.remove(ScrollableMenuEventListener.class, l); } /** * マウスクリックでメニューアイテムとしてのイベントが発生しないように、 マウスイベントをキャプチャして、スクローラブルメニューイベントに変換する。 * * @param e */ @Override protected void processMouseEvent(MouseEvent e) { ScrollableMenuEvent ee = null; int mouseEventId = e.getID(); if (mouseEventId == MouseEvent.MOUSE_PRESSED) { // マウスダウン時、スクロール開始 ee = new ScrollableMenuEvent(this, true); } if (mouseEventId == MouseEvent.MOUSE_RELEASED) { // マウスアップされた場合、スクロール停止 ee = new ScrollableMenuEvent(this, false); } if (ee != null) { fireScrollableMenuEvent(ee); } } /** * スクローラブルメニューイベントを送信する * * @param e * メニューイベント */ protected void fireScrollableMenuEvent(ScrollableMenuEvent e) { for (ScrollableMenuEventListener l : _listeners .getListeners(ScrollableMenuEventListener.class)) { if (e.isScrolling()) { l.start(e); } else { l.end(e); } } } } CharacterManaJ/src/main/java/charactermanaj/ui/SamplePicturePanel.java0000644000175000017500000001743313615720000026207 0ustar paulliupaulliupackage charactermanaj.ui; import static java.lang.Math.min; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.font.FontRenderContext; import java.awt.image.BufferedImage; import java.util.Properties; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JViewport; import charactermanaj.model.AppConfig; import charactermanaj.ui.util.ScrollPaneDragScrollSupport; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * サンプルピクチャ用パネル.
* ピクチャの自動縮小と等倍表示切り替えをサポートする.
* * @author seraphy */ public class SamplePicturePanel extends JPanel { private static final long serialVersionUID = 4026181978500938152L; protected BufferedImage samplePicture; protected boolean visiblePicture = true; protected Color sampleImageBgColor = AppConfig.getInstance().getSampleImageBgColor(); protected String alternateText = ""; protected boolean enableRealsize; /** * マウスドラッグによるスクロールのサポート */ protected ScrollPaneDragScrollSupport scrollSupport; { setMinimumSize(new Dimension(64, 64)); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { // 正確に2回 onDblClick(); e.consume(); } } }); } @Override public void addNotify() { super.addNotify(); // 親がJScrollPaneである場合、 // マウスのドラッグによるスクロールをサポートするようにマウスリスナをセットアップする. Component parent = getParent(); if (parent != null && (parent instanceof JViewport)) { Component gparent = parent.getParent(); if (gparent != null && (gparent instanceof JScrollPane)) { JScrollPane scrollPane = (JScrollPane) gparent; scrollSupport = new ScrollPaneDragScrollSupport(scrollPane); scrollSupport.installDraggingListener(this, null); } } } @Override public void removeNotify() { if (scrollSupport != null) { scrollSupport.uninstallDraggingListener(); scrollSupport = null; } super.removeNotify(); } public SamplePicturePanel() { super(); } public SamplePicturePanel(BufferedImage samplePicture) { super(); this.samplePicture = samplePicture; this.alternateText = ""; this.enableRealsize = false; adjustPreferrerdSize(false); } public SamplePicturePanel(BufferedImage samplePicture, String alternateText) { super(); if (alternateText == null) { alternateText = ""; } this.samplePicture = samplePicture; this.alternateText = alternateText; this.enableRealsize = false; adjustPreferrerdSize(false); } @Override protected void paintComponent(Graphics g0) { Graphics2D g = (Graphics2D) g0; super.paintComponent(g); if (samplePicture != null && isVisiblePicture()) { Rectangle rct = getBounds(); Insets insets = getInsets(); int x = insets.left; int y = insets.top; int w = rct.width - insets.left - insets.right; int h = rct.height - insets.top - insets.bottom; int imgW = samplePicture.getWidth(); int imgH = samplePicture.getHeight(); double factor1 = (double) h / (double) imgH; // 縦を納めた場合の、縦の縮小率 double factor2 = (double) w / (double) imgW; // 横を納めた場合の、横の縮小率 double factor = min(factor1, factor2); // 縦横を納めるのに最低必要な縮小率 int scaledW = (int)(imgW * factor); int scaledH = (int)(imgH * factor); int offset_x = (w - scaledW) / 2; int offset_y = (h - scaledH) / 2; Object renderingHint; if (factor <= 1.) { // 等倍未満 renderingHint = RenderingHints.VALUE_INTERPOLATION_BILINEAR; } else if (factor <= 2.) { // 2倍まで renderingHint = RenderingHints.VALUE_INTERPOLATION_BICUBIC; } else { // それ以上 renderingHint = RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR; } g.setRenderingHint( RenderingHints.KEY_INTERPOLATION, renderingHint); g.drawImage(samplePicture, x + offset_x, y + offset_y, x + offset_x + scaledW, y + offset_y + scaledH, 0, 0, imgW, imgH, sampleImageBgColor, null); } else if (alternateText.length() > 0) { Rectangle rct = getBounds(); Insets insets = getInsets(); int x = insets.left; int y = insets.top; int w = rct.width - insets.left - insets.right; int h = rct.height - insets.top - insets.bottom; Font font = g.getFont(); FontRenderContext frc = g.getFontRenderContext(); int textHeight = (int) font.getMaxCharBounds(frc).getHeight(); Shape clipOld = g.getClip(); g.setClip(x, y, w, h); g.drawString(alternateText, x, y + textHeight); g.setClip(clipOld); } } public void adjustPreferrerdSize(boolean fullsize) { Dimension minSize = getMinimumSize(); Dimension siz = minSize; String tooltip = null; if (samplePicture != null) { int div = fullsize ? 1 : 2; Insets insets = getInsets(); siz = new Dimension(samplePicture.getWidth() / div + insets.left + insets.right, samplePicture.getHeight() / div + insets.top + insets.bottom); Container parent = getParent(); if (parent != null && parent instanceof JViewport) { Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties("languages/samplepicturepanel"); if (!fullsize) { tooltip = strings.getProperty("dblclick.fullsize"); } else { tooltip = strings.getProperty("dblclick.fit"); } } } setToolTipText(tooltip); siz.width = Math.max(minSize.width, siz.width); siz.height = Math.max(minSize.height, siz.height); Dimension ord = getPreferredSize(); if (ord == null || !ord.equals(siz)) { setPreferredSize(siz); revalidate(); } } @Override public Dimension getPreferredSize() { Container parent = getParent(); if (!enableRealsize && parent != null && parent instanceof JViewport) { JViewport viewport = (JViewport) parent; Dimension siz = viewport.getExtentSize(); Insets insets = viewport.getInsets(); Dimension preferredSize = new Dimension(siz.width - insets.left - insets.right, siz.height - insets.top - insets.bottom); return preferredSize; } return super.getPreferredSize(); } protected void onDblClick() { Container parent = getParent(); if (parent != null && parent instanceof JViewport) { enableRealsize = !enableRealsize; adjustPreferrerdSize(enableRealsize); } } public boolean isVisiblePicture() { return visiblePicture; } public void setVisiblePicture(boolean visiblePicture) { if (this.visiblePicture != visiblePicture) { this.visiblePicture = visiblePicture; repaint(); } } public void setSamplePicture(BufferedImage samplePicture) { if (this.samplePicture != samplePicture) { this.samplePicture = samplePicture; enableRealsize = false; adjustPreferrerdSize(false); repaint(); } } public BufferedImage getSamplePictrue() { return this.samplePicture; } public Color getSamplePictureBgColor() { return this.sampleImageBgColor; } public void setSamplePictureBgColor(Color color) { if (color == null) { throw new IllegalArgumentException(); } if (!sampleImageBgColor.equals(color)) { this.sampleImageBgColor = color; repaint(); } } public String getAlternateText() { return alternateText; } public void setAlternateText(String alternateText) { if (alternateText == null) { alternateText = ""; } if (!this.alternateText.equals(alternateText)) { this.alternateText = alternateText; repaint(); } } } CharacterManaJ/src/main/java/charactermanaj/ui/MenuBuilder.java0000644000175000017500000001476713615720000024674 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.util.HashMap; import java.util.Properties; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JSeparator; import charactermanaj.ui.scrollablemenu.JScrollableMenu; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * メニューを構築します. * * @author seraphy */ public class MenuBuilder { /** * メニュー項目のリソース */ protected static final String MENU_STRINGS_RESOURCE = "menu/menu"; /** * アンチエイリアスの設定が必要か? */ private static final boolean needAntiAlias = isNeedAntialias(); /** * メニュー項目のアンチエイリアスが必要か判定する.
* java.specification.versionが1.5で始まる場合は必要とみなす.
* * @return アンチエイリアスが必要であればtrue */ private static boolean isNeedAntialias() { return System.getProperty("java.specification.version").startsWith("1.5"); } /** * 生成したメニューのマップ */ private final HashMap menuMap = new HashMap(); /** * 生成したメニュー項目のマップ */ private final HashMap menuItemMap = new HashMap(); /** * 生成されたメニューを名前を指定して取得します.
* 存在しない場合は実行時例外が発生します.
* * @param name * メニュー名 * @return メニュー */ public JMenu getJMenu(String name) { JMenu menu = menuMap.get(name); if (menu == null) { throw new RuntimeException("登録されていないメニューです. " + name); } return menu; } /** * 生成されたメニュー項目を名前を指定して取得します.
* 存在しない場合は実行時例外が発生します.
* * @param name * メニュー項目名 * @return メニュー項目 */ public JMenuItem getJMenuItem(String name) { JMenuItem menuItem = menuItemMap.get(name); if (menuItem == null) { throw new RuntimeException("登録されていないメニュー項目です. " + name); } return menuItem; } /** * メニュー設定に従いメニューバーを構築して返します.
* 生成したメニューとメニュー項目は、{@link #getJMenu(String)}, {@link #getJMenuItem(String)} * で取得できます.
* * @param menus * メニュー設定 * @return 構築されたメニューバー */ public JMenuBar createMenuBar(MenuDataFactory[] menus) { // メニューリソース Properties menuProps = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(MENU_STRINGS_RESOURCE); // メニューバー final JMenuBar menuBar = createJMenuBar(); // 現在のメニュー設定をクリアする. menuMap.clear(); menuItemMap.clear(); // メニュー設定に従いメニューを構築する. for (MenuDataFactory menuDataFactory : menus) { MenuData menuData = menuDataFactory.createMenuData(menuProps); createMenu(new MenuAppender() { public void addMenu(JMenu menu) { menuBar.add(menu); } }, menuData, menuProps); } return menuBar; } private interface MenuAppender { void addMenu(JMenu menu); } protected void createMenu(MenuAppender parentMenu, MenuData menuData, Properties menuProps) { final JMenu menu = createJMenu(); if (menuData.makeMenu(menu)) { parentMenu.addMenu(menu); menuMap.put(menuData.getName(), menu); for (MenuData child : menuData) { if (child == null) { // セパレータ menu.add(new JSeparator()); } else if (child.getActionListener() == null) { // アクションリスナなしの場合はサブメニューと見なす createMenu(new MenuAppender() { public void addMenu(JMenu childMenu) { menu.add(childMenu); } }, child, menuProps); } else { // メニュー項目(チェックボックスつきメニュー項目を含む) JMenuItem menuItem; if (child.isCheckbox()) { menuItem = createJCheckBoxMenuItem(); } else { menuItem = createJMenuItem(); } if (child.makeMenu(menuItem)) { menu.add(menuItem); menuItemMap.put(child.getName(), menuItem); } } } } } /** * JMenuBarを構築します.
* アンチエイリアスが必要な場合はアンチエイリアスが設定されます.
* * @return JMenuBar */ public JMenuBar createJMenuBar() { return new JMenuBar() { private static final long serialVersionUID = 1L; @Override public void paint(Graphics g) { setAntiAlias(g); super.paint(g); } }; } /** * JMenuを構築します.
* アンチエイリアスが必要な場合はアンチエイリアスが設定されます.
* * @return JMenu */ public JMenu createJMenu() { if (JScrollableMenu.isScreenMenu()) { return new JMenu() { private static final long serialVersionUID = 1L; @Override public void paint(Graphics g) { setAntiAlias(g); super.paint(g); } }; } else { return new JScrollableMenu() { private static final long serialVersionUID = 1L; @Override public void paint(Graphics g) { setAntiAlias(g); super.paint(g); } }; } } /** * JCheckBoxMenuItemを構築します.
* アンチエイリアスが必要な場合はアンチエイリアスが設定されます.
* * @return JCheckBoxMenuItem */ public JCheckBoxMenuItem createJCheckBoxMenuItem() { return new JCheckBoxMenuItem() { private static final long serialVersionUID = 1L; @Override public void paint(Graphics g) { setAntiAlias(g); super.paint(g); } }; } /** * JMenuItemを構築します.
* アンチエイリアスが必要な場合はアンチエイリアスが設定されます.
* * @return JMenuItem */ public JMenuItem createJMenuItem() { return new JMenuItem() { private static final long serialVersionUID = 1L; @Override public void paint(Graphics g) { setAntiAlias(g); super.paint(g); } }; } /** * アンチエイリアスを有効にする. * * @param g */ private static void setAntiAlias(Graphics g) { if (needAntiAlias) { ((Graphics2D) g).setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); } } } CharacterManaJ/src/main/java/charactermanaj/ui/ImportWizardDialog.java0000644000175000017500000031732413615720000026227 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.dnd.DropTarget; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import java.sql.Timestamp; import java.text.MessageFormat; import java.util.AbstractCollection; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButton; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import charactermanaj.Main; import charactermanaj.graphics.io.PNGFileImageHeader; import charactermanaj.model.AppConfig; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.PartsAuthorInfo; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsManageData; import charactermanaj.model.PartsSet; import charactermanaj.model.PartsSpec; import charactermanaj.model.io.AbstractCharacterDataArchiveFile.CategoryLayerPair; import charactermanaj.model.io.AbstractCharacterDataArchiveFile.PartsImageContent; import charactermanaj.model.io.CharacterDataFileReaderWriterFactory; import charactermanaj.model.io.CharacterDataPersistent; import charactermanaj.model.io.ImportModel; import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel; import charactermanaj.ui.progress.ProgressHandle; import charactermanaj.ui.progress.Worker; import charactermanaj.ui.progress.WorkerException; import charactermanaj.ui.progress.WorkerWithProgessDialog; import charactermanaj.ui.util.FileDropTarget; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.DownloadUtils; import charactermanaj.util.DownloadUtils.HeadResponse; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * インポートウィザードダイアログ.
* * @author seraphy */ public class ImportWizardDialog extends JDialog { private static final long serialVersionUID = 1L; protected static final String STRINGS_RESOURCE = "languages/importwizdialog"; public static final int EXIT_PROFILE_UPDATED = 1; public static final int EXIT_PROFILE_CREATED = 2; public static final int EXIT_CANCELED = 0; /** * インポートウィザードの実行結果.
*/ private int exitCode = EXIT_CANCELED; /** * インポートされたキャラクターデータ.
*/ private CharacterData importedCharacterData; /** * 現在表示中もしくは選択中のプロファイル.
* 新規の場合はnull */ private final CharacterData targetCd; private CardLayout mainPanelLayout; private ImportWizardCardPanel activePanel; private AbstractAction actNext; private AbstractAction actPrev; private AbstractAction actFinish; protected ImportFileSelectPanel importFileSelectPanel; protected ImportTypeSelectPanel importTypeSelectPanel; protected ImportPartsSelectPanel importPartsSelectPanel; protected ImportPresetSelectPanel importPresetSelectPanel; protected ImportModel importModel = new ImportModel(); /** * プロファイルにパーツデータ・プリセットデータをインポートします.
* * @param parent * 親フレーム * @param current * 更新対象となる現在のプロファイル(新規インポートの場合はnull) */ public ImportWizardDialog(JFrame parent, CharacterData current) { super(parent, true); this.targetCd = current; if (targetCd != null && !targetCd.getDocBase().getScheme().equals("file")) { throw new IllegalArgumentException("ファイルベース以外のキャラクターデータにインポートできません"); } if (targetCd != null && !targetCd.isValid()) { throw new IllegalArgumentException("妥当でないキャラクターデータにはインポートできません"); } initComponent(); } /** * プロファイルにパーツデータ・プリセットデータをインポートします.
* * @param parent * 親ダイアログ * @param current * 選択していてるプロファイル、新規インポートの場合はnull */ public ImportWizardDialog(JDialog parent, CharacterData current) { super(parent, true); this.targetCd = current; if (targetCd != null && !targetCd.getDocBase().getScheme().equals("file")) { throw new IllegalArgumentException("ファイルベース以外のキャラクターデータにインポートできません"); } if (targetCd != null && !targetCd.isValid()) { throw new IllegalArgumentException("妥当でないキャラクターデータにはインポートできません"); } initComponent(); } /** * インポート先のキャラクターデータを返す。新規の場合はnull * @return インポート先、新規の場合はnull */ public CharacterData getTargetCharacterData() { if (targetCd != null && !targetCd.getDocBase().getScheme().equals("file")) { throw new IllegalStateException("ファイルベース以外のキャラクターデータにインポートできません: " + targetCd); } return targetCd; } /** * @param initFiles * アーカイブファィルまたはディレクトリの初期選択、なければnullまたは空 */ public void initSelectFile(File initFile) { importFileSelectPanel.setSelectFile(initFile); } public void initSelectURL(String url) { importFileSelectPanel.initSelectURL(url); } /** * ウィザードダイアログのコンポーネントを初期化します.
* currentがnullの場合は新規インポート、そうでない場合は更新インポートとります。 */ private void initComponent() { setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClose(); } }); Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); // タイトル if (targetCd == null) { setTitle(strings.getProperty("title.new")); } else { setTitle(strings.getProperty("title.update")); } // メインパネル ScaleSupport scaleSupport = ScaleSupport.getInstance(this); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); final JPanel mainPanel = new JPanel(); mainPanel.setBorder(BorderFactory.createEtchedBorder()); int gap = (int)(5 * scaleSupport.getManualScaleX()); this.mainPanelLayout = new CardLayout(gap, gap); mainPanel.setLayout(mainPanelLayout); contentPane.add(mainPanel, BorderLayout.CENTER); ChangeListener changeListener = new ChangeListener() { public void stateChanged(ChangeEvent e) { updateBtnPanelState(); } }; ComponentListener componentListener = new ComponentAdapter() { public void componentShown(ComponentEvent e) { onComponentShown((ImportWizardCardPanel) e.getComponent()); } }; // アクション this.actNext = new AbstractAction(strings.getProperty("btn.next")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { setEnableButtons(false); String nextPanelName = doNext(); if (nextPanelName != null) { mainPanelLayout.show(mainPanel, nextPanelName); } else { // 移動先ページ名なければ、現在のページでボタン状態を再設定する. // 移動先ページ名がある場合、実際に移動し表示されるまでディセーブルのままとする. updateBtnPanelState(); } } }; this.actPrev = new AbstractAction(strings.getProperty("btn.prev")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { setEnableButtons(false); String prevPanelName = doPrevious(); if (prevPanelName != null) { mainPanelLayout.show(mainPanel, prevPanelName); } else { updateBtnPanelState(); } } }; this.actFinish = new AbstractAction(strings.getProperty("btn.finish")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onFinish(); } }; AbstractAction actCancel = new AbstractAction(strings.getProperty("btn.cancel")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onClose(); } }; // ImportFileSelectPanel this.importFileSelectPanel = new ImportFileSelectPanel(scaleSupport); this.importFileSelectPanel.addComponentListener(componentListener); this.importFileSelectPanel.addChangeListener(changeListener); mainPanel.add(this.importFileSelectPanel, ImportFileSelectPanel.PANEL_NAME); // ImportTypeSelectPanel this.importTypeSelectPanel = new ImportTypeSelectPanel(scaleSupport); this.importTypeSelectPanel.addComponentListener(componentListener); this.importTypeSelectPanel.addChangeListener(changeListener); mainPanel.add(this.importTypeSelectPanel, ImportTypeSelectPanel.PANEL_NAME); // ImportPartsSelectPanel this.importPartsSelectPanel = new ImportPartsSelectPanel(scaleSupport); this.importPartsSelectPanel.addComponentListener(componentListener); this.importPartsSelectPanel.addChangeListener(changeListener); mainPanel.add(this.importPartsSelectPanel, ImportPartsSelectPanel.PANEL_NAME); // ImportPresetSelectPanel this.importPresetSelectPanel = new ImportPresetSelectPanel(scaleSupport); this.importPresetSelectPanel.addComponentListener(componentListener); this.importPresetSelectPanel.addChangeListener(changeListener); mainPanel.add(this.importPresetSelectPanel, ImportPresetSelectPanel.PANEL_NAME); // button panel JPanel btnPanel = new JPanel(); int mergin = (int)(3 * scaleSupport.getManualScaleX()); btnPanel.setBorder(BorderFactory.createEmptyBorder(mergin, mergin, mergin, mergin * 15)); // 3,3,3,45 GridBagLayout btnPanelLayout = new GridBagLayout(); btnPanel.setLayout(btnPanelLayout); actPrev.setEnabled(false); actNext.setEnabled(false); actFinish.setEnabled(false); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; gbc.ipadx = 0; gbc.ipady = 0; gbc.insets = new Insets(mergin, mergin, mergin, mergin); gbc.weightx = 1.; gbc.weighty = 0.; btnPanel.add(Box.createHorizontalGlue(), gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 2 : 1; gbc.gridy = 0; gbc.weightx = 0.; btnPanel.add(new JButton(this.actPrev), gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 3 : 2; gbc.gridy = 0; JButton btnNext = new JButton(this.actNext); btnPanel.add(btnNext, gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 4 : 3; gbc.gridy = 0; btnPanel.add(new JButton(this.actFinish), gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 1 : 4; gbc.gridy = 0; JButton btnCancel = new JButton(actCancel); btnPanel.add(btnCancel, gbc); contentPane.add(btnPanel, BorderLayout.SOUTH); // インプットマップ/アクションマップ Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); rootPane.setDefaultButton(btnNext); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeImportWizDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeImportWizDialog"); am.put("closeImportWizDialog", actCancel); // 表示 Dimension dim = new Dimension(500, 500); // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する dim = scaleSupport.manualScaled(dim); setSize(dim); setLocationRelativeTo(getParent()); mainPanelLayout.first(mainPanel); updateBtnPanelState(); } protected void onComponentShown(JPanel panel) { ImportWizardCardPanel activePanel = (ImportWizardCardPanel) panel; activePanel.onActive(this, this.activePanel); this.activePanel = activePanel; updateBtnPanelState(); } protected void updateBtnPanelState() { if (activePanel != null) { actPrev.setEnabled(activePanel.isReadyPrevious()); actNext.setEnabled(activePanel.isReadyNext()); actFinish.setEnabled(activePanel.isReadyFinish()); } else { setEnableButtons(false); } } public void setEnableButtons(boolean enabled) { actPrev.setEnabled(enabled); actNext.setEnabled(enabled); actFinish.setEnabled(enabled); } protected String doNext() { if (activePanel == null) { throw new IllegalStateException(); } String nextPanelName; setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { nextPanelName = activePanel.doNext(); } finally { setCursor(Cursor.getDefaultCursor()); } return nextPanelName; } protected String doPrevious() { if (activePanel == null) { throw new IllegalStateException(); } return activePanel.doPrevious(); } protected void onClose() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.close"), strings.getProperty("confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.YES_OPTION) { return; } // アーカイブを閉じる. importFileSelectPanel.closeArchive(); // キャンセル this.exitCode = EXIT_CANCELED; this.importedCharacterData = null; // ウィンドウを閉じる dispose(); } /** * インポートの実行.
*/ protected void onFinish() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE); try { // 新規プロファイル作成、または更新の実行 setEnableButtons(false); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); int exitCode; CharacterData importedCharacterData; try { if (targetCd == null) { // 新規作成 importedCharacterData = createNewProfile(); exitCode = EXIT_PROFILE_CREATED; } else { // 更新 importedCharacterData = updateProfile(targetCd.duplicateBasicInfo()); exitCode = EXIT_PROFILE_UPDATED; } } finally { setCursor(Cursor.getDefaultCursor()); } // アーカイブを閉じる importFileSelectPanel.closeArchive(); // 完了メッセージ JOptionPane.showMessageDialog(this, strings.getProperty("complete")); // 完了後、ウィンドウを閉じる. this.exitCode = exitCode; this.importedCharacterData = importedCharacterData; dispose(); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); // ディセーブルにしていたボタンをパネルの状態に戻す. updateBtnPanelState(); } } /** * ウィザードが閉じられた場合の終了コード. {@link #EXIT_PROFILE_UPDATED}であればプロファイルが更新されており,
* {@link #EXIT_PROFILE_CREATED}であればプロファイルが作成されている.
* {@link #EXIT_CANCELED}であればキャンセルされている.
* * @return 終了コード */ public int getExitCode() { return exitCode; } /** * 新規または更新されたプロファイル、キャンセルされた場合はnull * * @return プロファイル */ public CharacterData getImportedCharacterData() { return importedCharacterData; } /** * アーカイブからの新規プロファイルの作成 * * @return 作成された新規プロファイル * @throws IOException * 失敗 */ protected CharacterData createNewProfile() throws IOException { CharacterData cd = importModel.getCharacterData(); if (cd == null || !cd.isValid()) { throw new IllegalStateException("imported caharcer data is invalid." + cd); } CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); CharacterData characterData = cd.duplicateBasicInfo(); // インポートしたキャラクターデータ Map> customLayerPatterns = importModel.getCustomLayerPatternMap(); // キャラクターセット名と作者名を設定する characterData.setName(importTypeSelectPanel.getCharacterName()); characterData.setAuthor(importTypeSelectPanel.getAuthor()); // プリセットをインポートする場合 characterData.clearPartsSets(false); if (importTypeSelectPanel.isImportPreset()) { for (PartsSet partsSet : importPresetSelectPanel.getSelectedPartsSets()) { PartsSet ps = partsSet.clone(); ps.setPresetParts(true); characterData.addPartsSet(ps); } characterData.setDefaultPartsSetId(importPresetSelectPanel.getPrefferedDefaultPartsSetId()); } // プロファイルの新規作成 // docBaseが設定されて返される. persist.createProfile(characterData, customLayerPatterns); // インポートするパーツの更新 if (importTypeSelectPanel.isImportPartsImages()) { // パーツのコピー Collection partsImageContents = importPartsSelectPanel.getSelectedPartsImageContents(); importModel.copyPartsImageContents(partsImageContents, characterData); // パーツ管理情報の登録 PartsManageData partsManageData = importModel.getPartsManageData(); importModel.updatePartsManageData(partsImageContents, partsManageData, null, characterData); } // インポートするピクチャの更新 if (importTypeSelectPanel.isImportSampleImage()) { BufferedImage samplePicture = importModel.getSamplePicture(); if (samplePicture != null) { persist.saveSamplePicture(characterData, samplePicture); } } return characterData; } /** * プロファイルの更新 * * @return 更新されたプロファイル * @throws IOException * 失敗 */ protected CharacterData updateProfile(CharacterData characterData) throws IOException { CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); boolean imported = false; boolean modCharacterDef = false; boolean modFavories = false; // インポートするパーツの更新 if (importTypeSelectPanel.isImportPartsImages()) { // パーツのコピー Collection partsImageContents = importPartsSelectPanel.getSelectedPartsImageContents(); importModel.copyPartsImageContents(partsImageContents, characterData); // パーツ管理情報の追記・更新 PartsManageData partsManageData = importModel.getPartsManageData(); importModel.updatePartsManageData(partsImageContents, partsManageData, characterData, characterData); imported = true; } // インポートするピクチャの更新 if (importTypeSelectPanel.isImportSampleImage()) { BufferedImage samplePicture = importModel.getSamplePicture(); if (samplePicture != null) { persist.saveSamplePicture(characterData, samplePicture); imported = true; } } // インポートするパーツセットの更新 if (importTypeSelectPanel.isImportPreset()) { for (PartsSet partsSet : importPresetSelectPanel.getSelectedPartsSets()) { PartsSet ps = partsSet.clone(); ps.setPresetParts(false); characterData.addPartsSet(ps); } imported = true; modCharacterDef = true; modFavories = true; } // 説明の更新 if (importTypeSelectPanel.isAddDescription() && imported) { URI archivedFile = importModel.getImportSource(); String note = importTypeSelectPanel.getAdditionalDescription(); if (note != null && note.length() > 0) { String description = characterData.getDescription(); if (description == null) { description = ""; } String lf = System.getProperty("line.separator"); Timestamp tm = new Timestamp(System.currentTimeMillis()); description += lf + "--- import: " + tm + " : " + archivedFile + " ---" + lf; description += note + lf; characterData.setDescription(description); modCharacterDef = true; } } // キャラクター定義の更新 if (modCharacterDef) { persist.updateProfile(characterData); // キャラクター定義の構造に変化なし targetCd.setDescription(characterData.getDescription()); // 現在保持しているCdの説明文は更新しておく(念のため) } // お気に入りの更新 if (modFavories) { persist.saveFavorites(characterData); } return characterData; } } /** * タブの抽象基底クラス.
* * @author seraphy */ abstract class ImportWizardCardPanel extends JPanel { private static final long serialVersionUID = 1L; private LinkedList listeners = new LinkedList(); public void addChangeListener(ChangeListener l) { if (l != null) { listeners.add(l); } } public void removeChangeListener(ChangeListener l) { if (l != null) { listeners.remove(l); } } public void fireChangeEvent() { ChangeEvent e = new ChangeEvent(this); for (ChangeListener l : listeners) { l.stateChanged(e); } } public void onActive(ImportWizardDialog parent, ImportWizardCardPanel previousPanel) { // なにもしない } public boolean isReadyPrevious() { return false; } public boolean isReadyNext() { return false; } public boolean isReadyFinish() { return false; } public String doNext() { throw new UnsupportedOperationException(); } public String doPrevious() { throw new UnsupportedOperationException(); } } /** * ファイル選択パネル * * @author seraphy */ class ImportFileSelectPanel extends ImportWizardCardPanel { private static final long serialVersionUID = 1L; public static final String PANEL_NAME = "fileSelectPanel"; /** * アーカイブ用ファイルダイアログ */ private static ArchiveFileDialog archiveFileDialog = new ArchiveFileDialog(); private ImportWizardDialog parent; /** * ファイル名を指定してインポート */ private JRadioButton radioArchiveFile; /** * ファイル名入力ボックス */ private JTextField txtArchiveFile; /** * ファイル選択ボタン */ private Action actChooseFile; /** * ディレクトリを指定してインポート */ private JRadioButton radioDirectory; /** * ディレクトリ入力ボックス */ private JTextField txtDirectory; /** * ディレクトリ選択ボタン */ private Action actChooseDirectory; /** * URLを指定してインポート */ private JRadioButton radioURL; /** * URL入力ボックス */ private JTextField txtURL; /* 以下、対象ファイルの読み取り結果 */ public ImportFileSelectPanel(ScaleSupport scaleSupport) { setLayout(new BorderLayout()); Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE); DocumentListener documentListener = new DocumentListener() { public void removeUpdate(DocumentEvent e) { fireEvent(); } public void insertUpdate(DocumentEvent e) { fireEvent(); } public void changedUpdate(DocumentEvent e) { fireEvent(); } protected void fireEvent() { fireChangeEvent(); } }; txtArchiveFile = new JTextField(); txtDirectory = new JTextField(); txtURL = new JTextField(); txtArchiveFile.getDocument().addDocumentListener(documentListener); txtDirectory.getDocument().addDocumentListener(documentListener); txtURL.getDocument().addDocumentListener(documentListener); actChooseFile = new AbstractAction(strings.getProperty("browse")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onChooseFile(); } }; actChooseDirectory = new AbstractAction(strings.getProperty("browse")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onChooseDirectory(); } }; JPanel fileChoosePanel = new JPanel(); GridBagLayout fileChoosePanelLayout = new GridBagLayout(); fileChoosePanel.setLayout(fileChoosePanelLayout); radioArchiveFile = new JRadioButton(strings.getProperty("importingArchiveFile")); radioDirectory = new JRadioButton(strings.getProperty("importingDirectory")); radioURL = new JRadioButton(strings.getProperty("importingURL")); ChangeListener radioChangeListener = new ChangeListener() { public void stateChanged(ChangeEvent e) { updateUIState(); fireChangeEvent(); } }; radioArchiveFile.addChangeListener(radioChangeListener); radioDirectory.addChangeListener(radioChangeListener); radioURL.addChangeListener(radioChangeListener); ButtonGroup btnGroup = new ButtonGroup(); btnGroup.add(radioArchiveFile); btnGroup.add(radioDirectory); btnGroup.add(radioURL); // アーカイブからのインポートをデフォルトとする radioArchiveFile.setSelected(true); GridBagConstraints gbc = new GridBagConstraints(); gbc.ipadx = 0; gbc.ipady = 0; int gap = (int)(3 * scaleSupport.getManualScaleX()); gbc.insets = new Insets(gap, gap, gap, gap); gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; // アーカイブ gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 1.; gbc.weighty = 0.; gbc.gridheight = 1; gbc.gridwidth = 3; fileChoosePanel.add(radioArchiveFile, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 1; gbc.ipadx = 45; gbc.weightx = 0; fileChoosePanel.add(Box.createHorizontalGlue(), gbc); gbc.gridx = 1; gbc.gridy = 1; gbc.ipadx = 0; gbc.weightx = 1.; fileChoosePanel.add(txtArchiveFile, gbc); gbc.gridx = 2; gbc.gridy = 1; gbc.ipadx = 0; gbc.weightx = 0.; fileChoosePanel.add(new JButton(actChooseFile), gbc); // ディレクトり gbc.gridx = 0; gbc.gridy = 2; gbc.ipadx = 0; gbc.gridwidth = 3; gbc.weightx = 1.; fileChoosePanel.add(radioDirectory, gbc); gbc.gridx = 0; gbc.gridy = 3; gbc.ipadx = 45; gbc.gridwidth = 1; gbc.weightx = 0; fileChoosePanel.add(Box.createHorizontalGlue(), gbc); gbc.gridx = 1; gbc.gridy = 3; gbc.ipadx = 0; gbc.weightx = 1.; fileChoosePanel.add(txtDirectory, gbc); gbc.gridx = 2; gbc.gridy = 3; gbc.ipadx = 0; gbc.weightx = 0.; fileChoosePanel.add(new JButton(actChooseDirectory), gbc); // URL gbc.gridx = 0; gbc.gridy = 4; gbc.weightx = 1.; gbc.weighty = 0.; gbc.gridheight = 1; gbc.gridwidth = 3; fileChoosePanel.add(radioURL, gbc); gbc.gridx = 0; gbc.gridy = 4; gbc.gridwidth = 1; gbc.ipadx = 45; gbc.weightx = 0; fileChoosePanel.add(Box.createHorizontalGlue(), gbc); gbc.gridx = 1; gbc.gridy = 5; gbc.ipadx = 0; gbc.weightx = 1.; fileChoosePanel.add(txtURL, gbc); // パディング gbc.gridx = 0; gbc.gridy = 6; gbc.ipadx = 0; gbc.gridwidth = 3; gbc.weightx = 1.; gbc.weighty = 1.; fileChoosePanel.add(Box.createGlue(), gbc); add(fileChoosePanel, BorderLayout.CENTER); // ドロップターゲット new DropTarget(this, new FileDropTarget() { @Override protected void onDropFiles(List dropFiles) { if (dropFiles == null || dropFiles.isEmpty()) { return; } File dropFile = dropFiles.get(0); setSelectFile(dropFile); } @Override protected void onException(Exception ex) { ErrorMessageHelper.showErrorDialog(ImportFileSelectPanel.this, ex); } }); updateUIState(); } /** * アーカイブファイルまたはディレクトリを選択状態とする.
* nullの場合は選択を解除する. * * @param dropFile * アーカイブファイルまたはディレクトリ、もしくはnull */ public void setSelectFile(File dropFile) { if (dropFile == null) { // 選択なしの場合 txtDirectory.setText(""); txtArchiveFile.setText(""); txtURL.setText(""); radioDirectory.setSelected(false); radioArchiveFile.setSelected(false); radioURL.setSelected(false); } else if (dropFile.isDirectory()) { // ディレクトリの場合 txtDirectory.setText(dropFile.getPath()); radioDirectory.setSelected(true); } else if (dropFile.isFile()) { // ファイルの場合 txtArchiveFile.setText(dropFile.getPath()); radioArchiveFile.setSelected(true); } } /** * URL入力を選択状態とする * @param url URL */ public void initSelectURL(String url) { if (url != null && (url.startsWith("http://") || url.startsWith("https://"))) { // URL指定の場合 txtURL.setText(url); radioURL.setSelected(true); } else { // 選択なしの場合 txtDirectory.setText(""); txtArchiveFile.setText(""); txtURL.setText(""); radioDirectory.setSelected(false); radioArchiveFile.setSelected(false); radioURL.setSelected(false); } } protected void updateUIState() { boolean enableArchiveFile = radioArchiveFile.isSelected(); boolean enableDirectory = radioDirectory.isSelected(); boolean enableURL = radioURL.isSelected(); txtArchiveFile.setEnabled(enableArchiveFile); actChooseFile.setEnabled(enableArchiveFile); txtDirectory.setEnabled(enableDirectory); actChooseDirectory.setEnabled(enableDirectory); txtURL.setEnabled(enableURL); } protected void onChooseFile() { File initFile = null; if (txtArchiveFile.getText().trim().length() > 0) { initFile = new File(txtArchiveFile.getText()); } File file = archiveFileDialog.showOpenDialog(this, initFile); if (file != null) { txtArchiveFile.setText(file.getPath()); fireChangeEvent(); } } protected void onChooseDirectory() { String directoryTxt = txtDirectory.getText(); JFileChooser dirChooser = new JFileChooser(directoryTxt); dirChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); if (dirChooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) { return; } File dir = dirChooser.getSelectedFile(); if (dir != null) { txtDirectory.setText(dir.getPath()); fireChangeEvent(); } } @Override public boolean isReadyNext() { if (radioArchiveFile.isSelected()) { String fileTxt = txtArchiveFile.getText(); if (fileTxt != null && fileTxt.trim().length() > 0) { return true; } } else if (radioDirectory.isSelected()) { String directoryTxt = txtDirectory.getText(); if (directoryTxt != null && directoryTxt.trim().length() > 0) { return true; } } else if (radioURL.isSelected()) { String url = txtURL.getText(); if (url != null && (url.startsWith("http://") || url.startsWith("https://"))) { return true; } } return false; } @Override public void onActive(ImportWizardDialog parent, ImportWizardCardPanel previousPanel) { this.parent = parent; // 開いているアーカイブがあれば閉じる closeArchive(); } /** * 開いているアーカイブがあればクローズする. */ public void closeArchive() { try { parent.importModel.closeImportSource(); } catch (IOException ex) { ErrorMessageHelper.showErrorDialog(this, ex); // エラーが発生しても、とりあえず無視する. } } @Override public String doNext() { if (!isReadyNext()) { return null; } Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE); URI importArchive; if (radioArchiveFile.isSelected()) { // ファイルによるインポート File file = new File(txtArchiveFile.getText()); if (!file.exists() || !file.isFile()) { JOptionPane.showMessageDialog(this, strings .getProperty("fileNotFound"), "ERROR", JOptionPane.ERROR_MESSAGE); return null; } importArchive = file.toURI(); } else if (radioDirectory.isSelected()) { // ディレクトリによるインポート File file = new File(txtDirectory.getText()); if ( !file.exists() || !file.isDirectory()) { JOptionPane.showMessageDialog(this, strings .getProperty("directoryNotFound"), "ERROR", JOptionPane.ERROR_MESSAGE); return null; } importArchive = file.toURI(); } else if (radioURL.isSelected()) { // URLからダウンロード File tmpFile = loadTemporaryFromURL(txtURL.getText()); if (tmpFile == null) { // エラーメッセージは表示済みのため、単にnullでnextを拒否する return null; } importArchive = tmpFile.toURI(); } else { // それ以外はサポートしていない. return null; } try { parent.importModel.openImportSource(importArchive, parent.getTargetCharacterData()); // ワーカースレッドでアーカイブの読み込みを行う. Worker worker = new Worker() { public Void doWork(ProgressHandle progressHandle) throws IOException { parent.importModel.loadContents(progressHandle); return null; } }; WorkerWithProgessDialog dlg = new WorkerWithProgessDialog(parent, worker); dlg.startAndWait(); // 読み込めたら次ページへ return ImportTypeSelectPanel.PANEL_NAME; } catch (WorkerException ex) { ErrorMessageHelper.showErrorDialog(this, ex.getCause()); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } return null; } /** * 指定されたURLからテンポラリにダウンロードして、そのファイルを返す。 * URLが適切でない場合、もしくはエラーが発生した場合はnullを返す。 * @param url URL * @return ダウンロードしたファイル */ private File loadTemporaryFromURL(final String url) { final Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE); final AppConfig appConfig = AppConfig.getInstance(); final DownloadUtils downloader = new DownloadUtils(); downloader.setImpersonateUserAgent(appConfig.getImpersonateUserAgent()); downloader.setDeleteDownloadFileOnExit(appConfig.isDeleteDownloadFileOnExit()); try { // ワーカースレッドでアーカイブの読み込みを行う. Worker worker = new Worker() { public File doWork(ProgressHandle progressHandle) throws IOException { progressHandle.setIndeterminate(true); progressHandle.setCaption(strings.getProperty("downloading.checkhead")); HeadResponse headResponse = downloader.getHead(url); String contentType = headResponse.getContentType(); String ext = headResponse.getDotExtension(); CharacterDataFileReaderWriterFactory archiveRdWrFactory = CharacterDataFileReaderWriterFactory.getInstance(); if (contentType == null || !contentType.startsWith("application/") || !archiveRdWrFactory.isSupportedFile(ext)) { // コンテンツタイプが不明、もしくはバイナリではない // あるいは、ファイル名がzip, jar, cmjのいずれでもない場合 return null; } progressHandle.setCaption(strings.getProperty("downloading.waitForDownload")); return downloader.downloadTemporary(headResponse); } }; WorkerWithProgessDialog dlg = new WorkerWithProgessDialog(parent, worker); try { File tempFile = dlg.startAndWait(); if (tempFile != null) { return tempFile; } JOptionPane.showMessageDialog(this, strings.getProperty("downloading.invalidFileType"), "ERROR", JOptionPane.ERROR_MESSAGE); return null; } catch (WorkerException ex) { Throwable iex = ex.getCause(); throw (iex == null) ? ex : (Exception) iex; } } catch (FileNotFoundException ex) { JOptionPane.showMessageDialog(this, strings.getProperty("downloading.notFound"), "ERROR", JOptionPane.ERROR_MESSAGE); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } return null; } } class URLTableRow { private String downloadURL; private String author; public String getAuthor() { return author; } public String getDownloadURL() { return downloadURL; } public void setAuthor(String author) { this.author = author; } public void setDownloadURL(String downloadURL) { this.downloadURL = downloadURL; } } class URLTableModel extends AbstractTableModelWithComboBoxModel { private static final long serialVersionUID = 7075478118793390224L; private static final String[] COLUMN_NAMES; private static final int[] COLUMN_WIDTHS; static { COLUMN_NAMES = new String[] { "作者", "URL", }; COLUMN_WIDTHS = new int[] { 100, 300, }; } @Override public String getColumnName(int column) { return COLUMN_NAMES[column]; } public int getColumnCount() { return COLUMN_NAMES.length; } public Object getValueAt(int rowIndex, int columnIndex) { URLTableRow row = getRow(rowIndex); switch (columnIndex) { case 0: return row.getAuthor(); case 1: return row.getDownloadURL(); } return ""; } @Override public Class getColumnClass(int columnIndex) { return String.class; } public void adjustColumnModel(TableColumnModel columnModel, double scale) { for (int idx = 0; idx < COLUMN_WIDTHS.length; idx++) { columnModel.getColumn(idx).setPreferredWidth((int)(COLUMN_WIDTHS[idx] * scale)); } } public void initModel(CharacterData characterData) { clear(); HashMap downloadUrlsMap = new HashMap(); if (characterData != null) { for (PartsCategory category : characterData.getPartsCategories()) { for (Map.Entry entry : characterData .getPartsSpecMap(category).entrySet()) { PartsSpec partsSpec = entry.getValue(); String author = partsSpec.getAuthor(); String downloadURL = partsSpec.getDownloadURL(); if (downloadURL != null && downloadURL.trim().length() > 0) { if (author == null || author.trim().length() == 0) { author = ""; } downloadUrlsMap.put(downloadURL, author); } } } } for (Map.Entry entry : downloadUrlsMap.entrySet()) { String downloadURL = entry.getKey(); String author = entry.getValue(); URLTableRow row = new URLTableRow(); row.setDownloadURL(downloadURL); row.setAuthor(author); addRow(row); } Collections.sort(elements, new Comparator() { public int compare(URLTableRow o1, URLTableRow o2) { int ret = o1.getAuthor().compareTo(o2.getAuthor()); if (ret == 0) { ret = o1.getDownloadURL().compareTo(o2.getDownloadURL()); } return ret; } }); fireTableDataChanged(); } } /** * ファイル選択パネル * * @author seraphy */ class ImportTypeSelectPanel extends ImportWizardCardPanel { private static final long serialVersionUID = 1L; public static final String PANEL_NAME = "importTypeSelectPanel"; private ImportWizardDialog parent; private SamplePicturePanel samplePicturePanel; private JTextField txtCharacterId; private JTextField txtCharacterRev; private JTextField txtCharacterName; private JTextField txtAuthor; private JTextArea txtDescription; private JCheckBox chkPartsImages; private JCheckBox chkPresets; private JCheckBox chkSampleImage; private JCheckBox chkAddDescription; private String additionalDescription; /* 以下、選択結果 */ public ImportTypeSelectPanel(ScaleSupport scaleSupport) { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE); GridBagLayout basicPanelLayout = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); setLayout(basicPanelLayout); JPanel contentsSpecPanel = new JPanel(); int mergin = (int)(5 * scaleSupport.getManualScaleX()); contentsSpecPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(mergin, mergin, mergin, mergin), BorderFactory.createTitledBorder(strings.getProperty("basic.contentsSpec")))); BoxLayout contentsSpecPanelLayout = new BoxLayout(contentsSpecPanel, BoxLayout.PAGE_AXIS); contentsSpecPanel.setLayout(contentsSpecPanelLayout); chkPartsImages = new JCheckBox(strings.getProperty("basic.chk.partsImages")); chkPresets = new JCheckBox(strings.getProperty("basic.chk.presets")); chkSampleImage = new JCheckBox(strings.getProperty("basic.chk.samplePicture")); contentsSpecPanel.add(chkPartsImages); contentsSpecPanel.add(chkPresets); contentsSpecPanel.add(chkSampleImage); // JPanel archiveInfoPanel = new JPanel(); archiveInfoPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory .createEmptyBorder(mergin, mergin, mergin, mergin), BorderFactory.createTitledBorder(strings.getProperty("basic.archiveInfo")))); Dimension archiveInfoPanelMinSize = scaleSupport.manualScaled(new Dimension(300, 200)); archiveInfoPanel.setMinimumSize(archiveInfoPanelMinSize); archiveInfoPanel.setPreferredSize(archiveInfoPanelMinSize); GridBagLayout commentPanelLayout = new GridBagLayout(); archiveInfoPanel.setLayout(commentPanelLayout); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 2; gbc.weightx = 0.; gbc.weighty = 0.; int gap = (int)(3 * scaleSupport.getManualScaleX()); gbc.insets = new Insets(gap, gap, gap, gap); gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 1; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; archiveInfoPanel.add(new JLabel(strings.getProperty("basic.profileId"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 1; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; txtCharacterId = new JTextField(); txtCharacterId.setEditable(false); // 読み取り専用 txtCharacterId.setEnabled(false); archiveInfoPanel.add(txtCharacterId, gbc); gbc.gridx = 0; gbc.gridy = 2; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; archiveInfoPanel.add(new JLabel(strings.getProperty("basic.profileRev"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 2; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; txtCharacterRev = new JTextField(); txtCharacterRev.setEditable(false); // 読み取り専用 txtCharacterRev.setEnabled(false); archiveInfoPanel.add(txtCharacterRev, gbc); gbc.gridx = 0; gbc.gridy = 3; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; archiveInfoPanel.add(new JLabel(strings.getProperty("basic.profileName"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 3; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; txtCharacterName = new JTextField(); archiveInfoPanel.add(txtCharacterName, gbc); gbc.gridx = 0; gbc.gridy = 4; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; archiveInfoPanel.add( new JLabel(strings.getProperty("author"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 4; gbc.gridwidth = 1; gbc.weightx = 1.; txtAuthor = new JTextField(); archiveInfoPanel.add(txtAuthor, gbc); gbc.gridx = 0; gbc.gridy = 5; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.; archiveInfoPanel.add(new JLabel(strings.getProperty("description"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 5; gbc.gridwidth = 1; gbc.gridheight = 5; gbc.weighty = 1.; gbc.weightx = 1.; txtDescription = new JTextArea(); // 説明は更新可能にしておく。 archiveInfoPanel.add(new JScrollPane(txtDescription), gbc); gbc.gridx = 0; gbc.gridy = 10; gbc.gridheight = 1; gbc.gridwidth = 2; gbc.weightx = 0.; gbc.weighty = 0.; gbc.weighty = 0.; gbc.weightx = 0.; chkAddDescription = new JCheckBox(strings.getProperty("appendDescription")); archiveInfoPanel.add(chkAddDescription, gbc); // / samplePicturePanel = new SamplePicturePanel(); JScrollPane samplePicturePanelSP = new JScrollPane(samplePicturePanel); samplePicturePanelSP.setBorder(null); JPanel samplePictureTitledPanel = new JPanel(new BorderLayout()); samplePictureTitledPanel.add(samplePicturePanelSP, BorderLayout.CENTER); samplePictureTitledPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(mergin, mergin, mergin, mergin), BorderFactory.createTitledBorder(strings.getProperty("basic.sampleImage")))); // / gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 2; gbc.weightx = 1.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; add(contentsSpecPanel, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 1.; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; add(archiveInfoPanel, gbc); gbc.gridx = 1; gbc.gridy = 1; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 1; gbc.weighty = 1.; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; add(samplePictureTitledPanel, gbc); // アクションリスナ ActionListener modListener = new ActionListener() { public void actionPerformed(ActionEvent e) { fireChangeEvent(); } }; chkPartsImages.addActionListener(modListener); chkPresets.addActionListener(modListener); chkSampleImage.addActionListener(modListener); chkAddDescription.addActionListener(modListener); } @Override public void onActive(ImportWizardDialog parent, ImportWizardCardPanel previousPanel) { this.parent = parent; if (previousPanel == parent.importPartsSelectPanel) { return; } Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE); // 呼び出しもと情報 CharacterData current = parent.getTargetCharacterData(); // キャラクター定義情報 CharacterData cd = parent.importModel.getCharacterData(); String readme; // 開いているか選択しているプロファイルが有効であれば更新可能 final boolean updatable = (current != null && current.isValid()); // 新規の場合でインポートもとが有効なキャラクターセットであれば作成可能 final boolean creatable = (current == null && cd != null && cd.isValid()); // 新規作成の場合はキャラクター定義名と作者名を更新可能とする txtCharacterName.setEnabled(current == null); txtCharacterName.setEditable(current == null); txtAuthor.setEditable(current == null); txtAuthor.setEnabled(current == null); // ID、REVが一致するか? boolean matchID = false; boolean matchREV = false; if (cd != null && cd.isValid()) { txtCharacterId.setText(cd.getId()); txtCharacterRev.setText(cd.getRev()); txtCharacterName.setText(cd.getName()); if (current != null) { // 既存のプロファイルを選択していてインポート結果のキャラクター定義がある場合はID, REVを比較する. matchID = current.getId() == null ? cd.getId() == null : current.getId().equals(cd.getId()); matchREV = current.getRev() == null ? cd.getRev() == null : current.getRev().equals(cd.getRev()); } else { // 既存のプロファイルが存在しない場合は、ID,REVの比較は成功とみなす matchID = true; matchREV = true; } AppConfig appConfig = AppConfig.getInstance(); Color invalidBgColor = appConfig.getInvalidBgColor(); txtCharacterId.setBackground(matchID ? getBackground() : invalidBgColor); txtCharacterRev.setBackground(matchREV ? getBackground() : invalidBgColor); txtAuthor.setText(cd.getAuthor()); readme = cd.getDescription(); } else { // ID, REV等は存在しないので空にする txtCharacterId.setText(""); txtCharacterRev.setText(""); txtCharacterName.setText(""); txtAuthor.setText(""); // readmeで代用 readme = parent.importModel.getReadme(); } // 説明を追記する. boolean existsReadme = (readme != null && readme.trim().length() > 0); additionalDescription = existsReadme ? readme : ""; txtDescription.setText(additionalDescription); chkAddDescription.setEnabled((updatable || creatable) && existsReadme); chkAddDescription.setSelected((updatable || creatable) && existsReadme); // プリセットまたはお気に入りが存在するか? boolean hasPresetOrFavorites = (cd == null) ? false : !cd.getPartsSets().isEmpty(); chkPresets.setEnabled(hasPresetOrFavorites); chkPresets.setSelected(hasPresetOrFavorites); // パーツイメージ Collection partsImageContentsMap = parent.importModel.getPartsImageContents(); // パーツが存在するか? boolean hasParts = !partsImageContentsMap.isEmpty(); chkPartsImages.setEnabled(hasParts); chkPartsImages.setSelected(hasParts); // サンプルピクチャ BufferedImage samplePicture = parent.importModel.getSamplePicture(); if (samplePicture != null && (updatable || creatable)) { // サンプルピクチャが存在し、インポートか新規作成が可能であれば有効にする. samplePicturePanel.setSamplePicture(samplePicture); chkSampleImage.setEnabled(true); chkSampleImage.setSelected(current == null); // 新規作成の場合のみデフォルトでON } else { samplePicturePanel.setSamplePicture(samplePicture); chkSampleImage.setEnabled(false); chkSampleImage.setSelected(false); } // パーツまたはお気に入り・プリセットが存在する場合、 // および、新規の場合はキャラクター定義が存在する場合はコンテンツ有り boolean hasContents = hasParts || hasPresetOrFavorites || (current == null && cd != null && cd.isValid()); if (!hasContents) { JOptionPane.showMessageDialog(this, strings.getProperty("noContents")); } else if (cd == null) { JOptionPane.showMessageDialog(this, strings.getProperty("notFormalArchive")); } else if (!matchID) { String fmt = strings.getProperty("unmatchedProfileId"); String msg = MessageFormat.format(fmt, cd.getId() == null ? "" : cd.getId()); JOptionPane.showMessageDialog(this, msg); } else if (!matchREV) { String fmt = strings.getProperty("unmatchedProfileRev"); String msg = MessageFormat.format(fmt, cd.getRev() == null ? "" : cd.getRev()); JOptionPane.showMessageDialog(this, msg); } } public boolean isImportPreset() { return chkPresets.isSelected(); } public boolean isImportPartsImages() { return chkPartsImages.isSelected(); } public boolean isImportSampleImage() { return chkSampleImage.isSelected(); } public boolean isAddDescription() { return chkAddDescription.isSelected(); } /** * 説明として追加するドキュメント.
* これはユーザーが編集可能であり、ユーザー編集後の値が取得される.
* * @return 説明として追加するドキュメント */ public String getAdditionalDescription() { return txtDescription.getText(); } /** * キャラクター定義名を取得する. * * @return キャラクター定義名 */ public String getCharacterName() { return txtCharacterName.getText(); } /** * 作者名を取得する. * * @return 作者名 */ public String getAuthor() { return txtAuthor.getText(); } @Override public boolean isReadyPrevious() { return true; } @Override public String doPrevious() { return ImportFileSelectPanel.PANEL_NAME; } @Override public boolean isReadyNext() { if (isImportPartsImages() || isImportPreset()) { // パーツイメージの選択もしくはパーツセットの選択を指定している場合は次へ進む return true; } return false; } @Override public boolean isReadyFinish() { if (!isImportPartsImages() && !isImportPreset()) { if ((parent != null && parent.getTargetCharacterData() == null) || isImportSampleImage()) { // 新規プロファイル作成か、サンプルイメージの更新のみで // イメージもパーツセットもいらなければ、ただちに作成可能. return true; } } return false; } @Override public String doNext() { return ImportPartsSelectPanel.PANEL_NAME; } } /** * パーツ選択パネル * * @author seraphy */ class ImportPartsSelectPanel extends ImportWizardCardPanel { private static final long serialVersionUID = 1L; public static final String PANEL_NAME = "importPartsSelectPanel"; private ImportWizardDialog parent; private ImportPartsTableModel partsTableModel; private JPanel profileSizePanel; private JTextField txtProfileHeight; private int profileWidth; private int profileHeight; private JTextField txtProfileWidth; private JTable partsTable; private Action actSelectAll; private Action actDeselectAll; private Action actSort; private Action actSortByTimestamp; public ImportPartsSelectPanel(ScaleSupport scaleSupport) { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE); setLayout(new BorderLayout()); profileSizePanel = new JPanel(); GridBagLayout profileSizePanelLayout = new GridBagLayout(); profileSizePanel.setLayout(profileSizePanelLayout); profileSizePanel.setBorder(BorderFactory.createTitledBorder(strings.getProperty("sizeOfProfile"))); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; int gap = (int)(3 * scaleSupport.getManualScaleX()); gbc.insets = new Insets(gap, gap, gap, gap); gbc.weightx = 0.; gbc.weighty = 0.; gbc.ipadx = 0; gbc.ipady = 0; profileSizePanel.add(new JLabel(strings.getProperty("widthOfProfile"), JLabel.RIGHT), gbc); txtProfileWidth = new JTextField(); txtProfileWidth.setEditable(false); gbc.gridx = 1; gbc.gridy = 0; profileSizePanel.add(txtProfileWidth, gbc); gbc.gridx = 2; gbc.gridy = 0; profileSizePanel.add(new JLabel(strings.getProperty("heightOfProfile"), JLabel.RIGHT), gbc); txtProfileHeight = new JTextField(); txtProfileHeight.setEditable(false); gbc.gridx = 3; gbc.gridy = 0; profileSizePanel.add(txtProfileHeight, gbc); gbc.gridx = 4; gbc.gridy = 0; gbc.weightx = 1.; profileSizePanel.add(Box.createHorizontalGlue(), gbc); add(profileSizePanel, BorderLayout.NORTH); partsTableModel = new ImportPartsTableModel(); partsTableModel.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { fireChangeEvent(); } }); AppConfig appConfig = AppConfig.getInstance(); final Color disabledForeground = appConfig.getDisabledCellForgroundColor(); partsTable = new JTable(partsTableModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component comp = super.prepareRenderer(renderer, row, column); if (comp instanceof JCheckBox) { // BooleanのデフォルトのレンダラーはJCheckBoxを継承したJTable$BooleanRenderer comp.setEnabled(isCellEditable(row, column) && isEnabled()); } // 行モデル取得 ImportPartsTableModel model = (ImportPartsTableModel) getModel(); ImportPartsModel rowModel = model.getRow(row); Long lastModifiedAtCur = rowModel.getLastModifiedAtCurrentProfile(); if (lastModifiedAtCur != null) { // 既存のパーツが存在すれば太字 comp.setFont(getFont().deriveFont(Font.BOLD)); } else { // 新規パーツであれば通常フォント comp.setFont(getFont()); } // 列ごとの警告の判定 boolean warnings = false; if (column == ImportPartsTableModel.COLUMN_LASTMODIFIED) { // 既存のほうが日付が新しければワーニング if (lastModifiedAtCur != null && rowModel.getLastModified() < lastModifiedAtCur.longValue()) { warnings = true; } } else if (column == ImportPartsTableModel.COLUMN_ALPHA) { // アルファ情報がない画像は警告 if (!rowModel.isAlphaColor()) { warnings = true; } } else if (column == ImportPartsTableModel.COLUMN_SIZE) { // プロファイルの画像サイズと一致しないか、不揃いな画像であれば警告 if (rowModel.isUnmatchedSize() || profileWidth != rowModel.getWidth() || profileHeight != rowModel.getHeight()) { warnings = true; } } // 前景色、ディセーブル時は灰色 Color foregroundColor = isCellSelected(row, column) ? getSelectionForeground() : getForeground(); comp.setForeground(isEnabled() ? foregroundColor : disabledForeground); // 背景色、警告行は赤色に if (warnings) { AppConfig appConfig = AppConfig.getInstance(); Color invalidBgColor = appConfig.getInvalidBgColor(); comp.setBackground(invalidBgColor); } else { if (isCellSelected(row, column)) { comp.setBackground(getSelectionBackground()); } else { comp.setBackground(getBackground()); } } return comp; } }; partsTable.setShowGrid(true); partsTable.setGridColor(appConfig.getGridColor()); partsTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); partsTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); partsTable.setRowSelectionAllowed(true); // 行の高さをフォントの高さにする partsTable.setRowHeight((int)(partsTable.getFont().getSize() * 1.2)); // 列幅の調整 partsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); partsTableModel.adjustColumnModel(partsTable.getColumnModel(), scaleSupport.getManualScaleX()); Action actPartsSetCheck = new AbstractAction(strings.getProperty("parts.popup.check")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int[] selRows = partsTable.getSelectedRows(); partsTableModel.setCheck(selRows, true); } }; Action actPartsUnsetCheck = new AbstractAction(strings.getProperty("parts.popup.uncheck")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int[] selRows = partsTable.getSelectedRows(); partsTableModel.setCheck(selRows, false); } }; final JPopupMenu partsTablePopupMenu = new JPopupMenu(); partsTablePopupMenu.add(actPartsSetCheck); partsTablePopupMenu.add(actPartsUnsetCheck); partsTable.setComponentPopupMenu(partsTablePopupMenu); JScrollPane partsTableSP = new JScrollPane(partsTable); partsTableSP.setBorder(null); JPanel partsTableTitledPanel = new JPanel(new BorderLayout()); partsTableTitledPanel.add(partsTableSP, BorderLayout.CENTER); partsTableTitledPanel.setBorder(BorderFactory.createTitledBorder(strings .getProperty("parts.title"))); add(partsTableTitledPanel, BorderLayout.CENTER); actSelectAll = new AbstractAction(strings .getProperty("parts.btn.selectAll")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSelectAll(); } }; actDeselectAll = new AbstractAction(strings .getProperty("parts.btn.deselectAll")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onDeselectAll(); } }; actSort = new AbstractAction(strings.getProperty("parts.btn.sort")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSort(); } }; actSortByTimestamp = new AbstractAction(strings .getProperty("parts.btn.sortByTimestamp")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSortByTimestamp(); } }; JPanel btnPanel = new JPanel(); GridBagLayout btnPanelLayout = new GridBagLayout(); btnPanel.setLayout(btnPanelLayout); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; gbc.insets = new Insets(gap, gap, gap, gap); gbc.ipadx = 0; gbc.ipady = 0; JButton btnSelectAll = new JButton(actSelectAll); btnPanel.add(btnSelectAll, gbc); gbc.gridx = 1; gbc.gridy = 0; JButton btnDeselectAll = new JButton(actDeselectAll); btnPanel.add(btnDeselectAll, gbc); gbc.gridx = 2; gbc.gridy = 0; JButton btnSort = new JButton(actSort); btnPanel.add(btnSort, gbc); gbc.gridx = 3; gbc.gridy = 0; JButton btnSortByTimestamp = new JButton(actSortByTimestamp); btnPanel.add(btnSortByTimestamp, gbc); gbc.gridx = 4; gbc.gridy = 0; gbc.weightx = 1.; btnPanel.add(Box.createHorizontalGlue(), gbc); add(btnPanel, BorderLayout.SOUTH); } @Override public void onActive(ImportWizardDialog parent, ImportWizardCardPanel previousPanel) { this.parent = parent; if (previousPanel == parent.importPresetSelectPanel) { return; } // インポート対象のプロファイルサイズ CharacterData characterData; if (parent.getTargetCharacterData() == null) { // 新規インポート characterData = parent.importModel.getCharacterData(); } else { // 更新インポート characterData = parent.getTargetCharacterData(); } int profileWidth = 0; int profileHeight = 0; if (characterData != null) { Dimension imageSize = characterData.getImageSize(); if (imageSize != null) { profileWidth = imageSize.width; profileHeight = imageSize.height; } } txtProfileWidth.setText(Integer.toString(profileWidth)); txtProfileHeight.setText(Integer.toString(profileHeight)); profileSizePanel.revalidate(); this.profileHeight = profileHeight; this.profileWidth = profileWidth; // パーツのインポート指定があれば編集可能に、そうでなければ表示のみ // (パーツセットのインポートの確認のため、パーツ一覧は表示できるようにしておく) boolean enabled = parent.importTypeSelectPanel.isImportPartsImages(); partsTable.setEnabled(enabled); actDeselectAll.setEnabled(enabled); actSelectAll.setEnabled(enabled); actSort.setEnabled(enabled); actSortByTimestamp.setEnabled(enabled); CharacterData currentProfile = parent.getTargetCharacterData(); Collection partsImageContents = parent.importModel.getPartsImageContents(); PartsManageData partsManageData = parent.importModel.getPartsManageData(); partsTableModel.initModel(partsImageContents, partsManageData, currentProfile); // プリセットのモデルも更新する. Collection partsSets = null; if (parent.importTypeSelectPanel.isImportPreset()) { CharacterData cd = parent.importModel.getCharacterData(); if (cd != null && cd.isValid()) { partsSets = cd.getPartsSets().values(); } } final String defaultPartsSetId; final CharacterData presetImportTarget = parent.getTargetCharacterData(); final boolean selectAllPreset; if (presetImportTarget == null) { // 新規の場合 CharacterData cd = parent.importModel.getCharacterData(); if (cd != null) { defaultPartsSetId = cd.getDefaultPartsSetId(); } else { defaultPartsSetId = null; } selectAllPreset = true; // 新規プロファイルの場合はプリセットをインポートする } else { defaultPartsSetId = null; // 既存の場合はデフォルトのパーツセットであるかは表示する必要ないのでnullにする. selectAllPreset = (presetImportTarget.getPartsCount() == 0); // パーツが空の場合はプリセットをインポートする } parent.importPresetSelectPanel.initModel(partsSets, defaultPartsSetId, presetImportTarget, selectAllPreset); } @Override public boolean isReadyPrevious() { return true; } @Override public String doPrevious() { this.partsTableModel.clear(); return ImportTypeSelectPanel.PANEL_NAME; } @Override public boolean isReadyNext() { if (this.parent != null) { if (this.parent.importTypeSelectPanel.isImportPreset()) { // パーツセットのインポート指定があれば次へ return true; } } return false; } @Override public boolean isReadyFinish() { if (this.parent != null) { if (this.parent.importTypeSelectPanel.isImportPartsImages() && !this.parent.importTypeSelectPanel.isImportPreset()) { // パーツセットのインポート指定がなければ可 return true; } } return false; } public String doNext() { return ImportPresetSelectPanel.PANEL_NAME; }; protected void onSelectAll() { partsTableModel.selectAll(); } protected void onDeselectAll() { partsTableModel.deselectAll(); } protected void onSort() { partsTableModel.sort(); if (partsTableModel.getRowCount() > 0) { Rectangle rct = partsTable.getCellRect(0, 0, true); partsTable.scrollRectToVisible(rct); } } protected void onSortByTimestamp() { partsTableModel.sortByTimestamp(); if (partsTableModel.getRowCount() > 0) { Rectangle rct = partsTable.getCellRect(0, 0, true); partsTable.scrollRectToVisible(rct); } } /** * 選択されたイメージコンテンツのコレクション.
* * @return 選択されたイメージコンテンツのコレクション、なければ空 */ public Collection getSelectedPartsImageContents() { return partsTableModel.getSelectedPartsImageContents(); } /** * すでにプロファイルに登録済みのパーツ識別子、および、これからインポートする予定の選択されたパーツ識別子のコレクション.
* * @return インポートされた、またはインポートするパーツ識別子のコレクション.なければ空. */ public Collection getImportedPartsIdentifiers() { HashSet partsIdentifiers = new HashSet(); partsIdentifiers.addAll(partsTableModel.getCurrentProfilePartsIdentifers()); partsIdentifiers.addAll(partsTableModel.getSelectedPartsIdentifiers()); return partsIdentifiers; } public void selectByPartsIdentifiers(Collection partsIdentifiers) { partsTableModel.selectByPartsIdentifiers(partsIdentifiers); } } /** * 同じパーツ名をもつイメージのコレクション.
* パーツの各レイヤーの集合を想定する.
* * @author seraphy */ class ImportPartsImageSet extends AbstractCollection { /** * パーツ名 */ private String partsName; /** * 各レイヤー */ private ArrayList contentSet = new ArrayList(); private Long lastModified; private int width; private int height; private boolean unmatchedSize; private boolean alphaColor; private Collection partsCategories; private boolean checked; public ImportPartsImageSet(String partsName) { if (partsName == null || partsName.length() == 0) { throw new IllegalArgumentException(); } this.partsName = partsName; } public String getPartsName() { return partsName; } @Override public int size() { return contentSet.size(); } public Iterator iterator() { return contentSet.iterator(); } @Override public boolean add(PartsImageContent o) { if (o == null) { throw new IllegalArgumentException(); } if (!partsName.equals(o.getPartsName())) { throw new IllegalArgumentException(); } lastModified = null; // リセットする. return contentSet.add(o); } public int getWidth() { recheck(); return width; } public int getHeight() { recheck(); return height; } public boolean isUnmatchedSize() { recheck(); return unmatchedSize; } public boolean isAlphaColor() { recheck(); return alphaColor; } public long lastModified() { recheck(); return lastModified.longValue(); } public Collection getPartsCategories() { recheck(); return this.partsCategories; } protected void recheck() { if (lastModified != null) { return; } long lastModified = 0; int maxWidth = 0; int maxHeight = 0; int minWidth = 0; int minHeight = 0; boolean alphaColor = !this.contentSet.isEmpty(); HashSet partsCategories = new HashSet(); for (PartsImageContent partsImageContent : this.contentSet) { PNGFileImageHeader header = partsImageContent.getPngFileImageHeader(); maxWidth = Math.max(maxWidth, header.getWidth()); maxHeight = Math.max(maxHeight, header.getHeight()); minWidth = Math.max(minWidth, header.getWidth()); minHeight = Math.max(minHeight, header.getHeight()); if (header.getColorType() != 6 && !header.hasTransparencyInformation()) { // TrueColor + Alpha (6)か、アルファ情報があるもの以外はアルファなしとする. alphaColor = false; } for (CategoryLayerPair clPair : partsImageContent.getCategoryLayerPairs()) { partsCategories.add(clPair.getPartsCategory()); } long tm = partsImageContent.lastModified(); lastModified = Math.max(lastModified, tm); } this.lastModified = Long.valueOf(lastModified); this.width = maxWidth; this.height = maxHeight; this.unmatchedSize = (minWidth != maxWidth) || (minHeight != maxHeight); this.alphaColor = alphaColor; this.partsCategories = Collections.unmodifiableCollection(partsCategories); } public void setChecked(boolean checked) { this.checked = checked; } public boolean isChecked() { return checked; } } class ImportPartsModel { private PartsIdentifier partsIdentifier; private PartsAuthorInfo authorInfo; private PartsManageData.PartsVersionInfo versionInfo; private PartsSpec partsSpecAtCurrent; private ImportPartsImageSet imageSet; private int numOfLink; private Long lastModifiedAtCurrentProfile; /** * 行モデルを構築する * * @param partsIdentifier * パーツ識別子 * @param authorInfo * 作者情報(なければnull) * @param versionInfo * バージョン情報(なければnull) * @param imageSet * イメージファイルのセット * @param numOfLink * カテゴリの参照カウント数(複数カテゴリに参照される場合は2以上となる) */ public ImportPartsModel(PartsIdentifier partsIdentifier, PartsAuthorInfo authorInfo, PartsManageData.PartsVersionInfo versionInfo, PartsSpec partsSpecAtCurrent, ImportPartsImageSet imageSet, int numOfLink) { if (partsIdentifier == null || imageSet == null) { throw new IllegalArgumentException(); } this.partsIdentifier = partsIdentifier; this.authorInfo = authorInfo; this.versionInfo = versionInfo; this.partsSpecAtCurrent = partsSpecAtCurrent; this.imageSet = imageSet; this.numOfLink = numOfLink; if (partsSpecAtCurrent != null) { lastModifiedAtCurrentProfile = Long.valueOf(partsSpecAtCurrent .getPartsFiles().lastModified()); } else { lastModifiedAtCurrentProfile = null; } } public int getNumOfLink() { return numOfLink; } public PartsIdentifier getPartsIdentifier() { return partsIdentifier; } public ImportPartsImageSet getImageSet() { return imageSet; } public String getPartsName() { return partsIdentifier.getLocalizedPartsName(); } public String getAuthor() { if (authorInfo != null) { return authorInfo.getAuthor(); } return null; } public String getAuthorAtCurrent() { if (partsSpecAtCurrent != null) { PartsAuthorInfo partsAuthorInfo = partsSpecAtCurrent.getAuthorInfo(); if (partsAuthorInfo != null) { return partsAuthorInfo.getAuthor(); } } return null; } public double getVersion() { if (versionInfo != null) { return versionInfo.getVersion(); } return 0; } public double getVersionAtCurrent() { if (partsSpecAtCurrent != null) { return partsSpecAtCurrent.getVersion(); } return 0; } public PartsCategory getPartsCategory() { return partsIdentifier.getPartsCategory(); } public void setChecked(boolean checked) { imageSet.setChecked(checked); } public boolean isChecked() { return imageSet.isChecked(); } public int getWidth() { return imageSet.getWidth(); } public int getHeight() { return imageSet.getHeight(); } public boolean isUnmatchedSize() { return imageSet.isUnmatchedSize(); } public boolean isAlphaColor() { return imageSet.isAlphaColor(); } public long getLastModified() { return imageSet.lastModified(); } public Long getLastModifiedAtCurrentProfile() { return lastModifiedAtCurrentProfile; } } class ImportPartsTableModel extends AbstractTableModelWithComboBoxModel { private static final long serialVersionUID = 1L; private static final String[] COLUMN_NAMES; private static final int[] COLUMN_WIDTHS; public static final int COLUMN_LASTMODIFIED = 5; public static final int COLUMN_ALPHA = 4; public static final int COLUMN_SIZE = 3; private Set currentProfilePartsIdentifiers; static { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE); COLUMN_NAMES = new String[] { strings.getProperty("parts.column.check"), strings.getProperty("parts.column.partsname"), strings.getProperty("parts.column.category"), strings.getProperty("parts.column.imagesize"), strings.getProperty("parts.column.alpha"), strings.getProperty("parts.column.lastmodified"), strings.getProperty("parts.column.org-lastmodified"), strings.getProperty("parts.column.author"), strings.getProperty("parts.column.org-author"), strings.getProperty("parts.column.version"), strings.getProperty("parts.column.org-version"), }; COLUMN_WIDTHS = new int[] { Integer.parseInt(strings.getProperty("parts.column.check.size")), Integer.parseInt(strings.getProperty("parts.column.partsname.size")), Integer.parseInt(strings.getProperty("parts.column.category.size")), Integer.parseInt(strings.getProperty("parts.column.imagesize.size")), Integer.parseInt(strings.getProperty("parts.column.alpha.size")), Integer.parseInt(strings.getProperty("parts.column.lastmodified.size")), Integer.parseInt(strings.getProperty("parts.column.org-lastmodified.size")), Integer.parseInt(strings.getProperty("parts.column.author.size")), Integer.parseInt(strings.getProperty("parts.column.org-author.size")), Integer.parseInt(strings.getProperty("parts.column.version.size")), Integer.parseInt(strings.getProperty("parts.column.org-version.size")), }; } /** * モデルを初期化する.
* * @param partsImageContents * インポートもとアーカイブに含まれる、全パーツイメージコンテンツ * @param currentProfile * インポート先のプロファイル、現在プロファイルが既に持っているパーツを取得するためのもの。 */ public void initModel(Collection partsImageContents, PartsManageData partsManageData, CharacterData currentProfile) { clear(); if (partsImageContents == null || partsManageData == null) { return; } // 現在のプロファイルが所有する全パーツ一覧を構築する. // 現在のプロファイルがなければ空. HashSet currentProfilePartsIdentifiers = new HashSet(); if (currentProfile != null) { for (PartsCategory partsCategory : currentProfile.getPartsCategories()) { currentProfilePartsIdentifiers.addAll(currentProfile.getPartsSpecMap(partsCategory).keySet()); } } this.currentProfilePartsIdentifiers = Collections.unmodifiableSet(currentProfilePartsIdentifiers); // 同じパーツ名をもつ各レイヤーを集める HashMap partsImageSets = new HashMap(); for (PartsImageContent content : partsImageContents) { String partsName = content.getPartsName(); ImportPartsImageSet partsImageSet = partsImageSets.get(partsName); if (partsImageSet == null) { partsImageSet = new ImportPartsImageSet(partsName); partsImageSets.put(partsName, partsImageSet); } partsImageSet.add(content); } // 名前順に並び替える ArrayList partsNames = new ArrayList(partsImageSets.keySet()); Collections.sort(partsNames); // 登録する for (String partsName : partsNames) { ImportPartsImageSet partsImageSet = partsImageSets.get(partsName); int numOfLink = partsImageSet.getPartsCategories().size(); for (PartsCategory partsCategory : partsImageSet.getPartsCategories()) { // パーツ管理情報の索引キー PartsManageData.PartsKey partsKey = new PartsManageData.PartsKey(partsName, partsCategory.getCategoryId()); // ローカライズされたパーツ名があれば取得する。なければオリジナルのまま String localizedPartsName = partsManageData.getLocalizedName(partsKey); if (localizedPartsName == null || localizedPartsName.length() == 0) { localizedPartsName = partsName; } // 作者情報・バージョン情報があれば取得する. PartsAuthorInfo partsAuthorInfo = partsManageData.getPartsAuthorInfo(partsKey); PartsManageData.PartsVersionInfo versionInfo = partsManageData.getVersion(partsKey); // パーツ識別子を構築する PartsIdentifier partsIdentifier = new PartsIdentifier(partsCategory, partsName, localizedPartsName); // 現在のプロファイル上のパーツ情報を取得する.(なければnull) PartsSpec partsSpec; if (currentProfile != null) { partsSpec = currentProfile.getPartsSpec(partsIdentifier); } else { partsSpec = null; } // 行モデルを構築する. ImportPartsModel rowModel = new ImportPartsModel( partsIdentifier, partsAuthorInfo, versionInfo, partsSpec, partsImageSet, numOfLink); addRow(rowModel); } } // 既存がないか、既存よりも新しい日付であれば自動的にチェックを設定する. // もしくはバージョンが上であれば自動的にチェックをつける. for (ImportPartsModel rowModel : elements) { // 現在のプロファイル上のファイル群の最終更新日 Long lastModifiedAtCurrent = rowModel.getLastModifiedAtCurrentProfile(); if (lastModifiedAtCurrent == null) { lastModifiedAtCurrent = Long.valueOf(0); } // インポートするファイル群の最終更新日 ImportPartsImageSet partsImageSet = rowModel.getImageSet(); // 新しければ自動的にチェックをつける. if (lastModifiedAtCurrent.longValue() < partsImageSet.lastModified()) { partsImageSet.setChecked(true); } // バージョンが新しければチェックをつける. (改変版や作者名改名もあるので、作者名が同一であるかは問わない.) double versionAtCurrent = rowModel.getVersionAtCurrent(); double version = rowModel.getVersion(); if (versionAtCurrent < version) { partsImageSet.setChecked(true); } } // 並び替え sort(); } /** * 選択されているパーツを構成するファイルのコレクションを返します.
* * @return パーツイメージコンテンツのコレクション、選択がなければ空 */ public Collection getSelectedPartsImageContents() { IdentityHashMap partsImageSets = new IdentityHashMap(); for (ImportPartsModel rowModel : elements) { ImportPartsImageSet partsImageSet = rowModel.getImageSet(); if (partsImageSet.isChecked()) { partsImageSets.put(partsImageSet, partsImageSet); } } ArrayList partsImageContents = new ArrayList(); for (ImportPartsImageSet partsImageSet : partsImageSets.values()) { partsImageContents.addAll(partsImageSet); } return partsImageContents; } /** * 選択されているパーツ識別子のコレクションを返します.
* 返されるコレクションには同一のパーツ識別子が複数存在しないことが保証されます.
* 一つも選択がない場合は空が返されます.
* * @return パーツ識別子のコレクション.
*/ public Collection getSelectedPartsIdentifiers() { HashSet partsIdentifiers = new HashSet(); for (ImportPartsModel rowModel : elements) { if (rowModel.isChecked()) { partsIdentifiers.add(rowModel.getPartsIdentifier()); } } return partsIdentifiers; } /** * 現在のプロファイルが所有している全パーツの識別子.
* 現在のプロファイルがないか、まったく所有していなければ空.
* * @return 現在のプロファイルが所有するパーツの識別子のコレクション.(重複しない一意であることが保証される.) */ public Collection getCurrentProfilePartsIdentifers() { return currentProfilePartsIdentifiers; } public int getColumnCount() { return COLUMN_NAMES.length; } @Override public String getColumnName(int column) { return COLUMN_NAMES[column]; } public Object getValueAt(int rowIndex, int columnIndex) { ImportPartsModel rowModel = getRow(rowIndex); switch (columnIndex) { case 0: return rowModel.isChecked(); case 1: return rowModel.getPartsName(); case 2: return rowModel.getPartsCategory().getLocalizedCategoryName(); case 3: return rowModel.getWidth() + "x" + rowModel.getHeight() + (rowModel.isUnmatchedSize() ? "*" : ""); case 4: return rowModel.isAlphaColor(); case 5: long lastModified = rowModel.getLastModified(); if (lastModified > 0) { return new Timestamp(lastModified).toString(); } return ""; case 6: Long lastModifiedAtCur = rowModel.getLastModifiedAtCurrentProfile(); if (lastModifiedAtCur != null && lastModifiedAtCur.longValue() > 0) { return new Timestamp(lastModifiedAtCur.longValue()).toString(); } return ""; case 7: return rowModel.getAuthor(); case 8: return rowModel.getAuthorAtCurrent(); case 9: double version = rowModel.getVersion(); if (version > 0) { return Double.toString(version); } return ""; case 10: double versionAtCurrent = rowModel.getVersionAtCurrent(); if (versionAtCurrent > 0) { return Double.toString(versionAtCurrent); } return ""; } return ""; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { ImportPartsModel rowModel = getRow(rowIndex); switch (columnIndex) { case 0: rowModel.setChecked(((Boolean) aValue).booleanValue()); break; default: return; } if (rowModel.getNumOfLink() > 1) { fireTableDataChanged(); } else { fireListUpdated(rowIndex, rowIndex); } } @Override public Class getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return Boolean.class; case 1: return String.class; case 2: return String.class; case 3: return String.class; case 4: return Boolean.class; case 5: return String.class; case 6: return String.class; case 7: return String.class; case 8: return String.class; case 9: return String.class; case 10: return String.class; } return String.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (columnIndex == 0) { return true; } return false; } public void adjustColumnModel(TableColumnModel columnModel, double scale) { int mx = columnModel.getColumnCount(); for (int idx = 0; idx < mx; idx++) { columnModel.getColumn(idx).setPreferredWidth((int)(COLUMN_WIDTHS[idx] * scale)); } } public void selectAll() { boolean modified = false; for (ImportPartsModel rowModel : elements) { if (!rowModel.isChecked()) { rowModel.setChecked(true); modified = true; } } if (modified) { fireTableDataChanged(); } } public void deselectAll() { boolean modified = false; for (ImportPartsModel rowModel : elements) { if (rowModel.isChecked()) { rowModel.setChecked(false); modified = true; } } if (modified) { fireTableDataChanged(); } } public void sort() { Collections.sort(elements, new Comparator () { public int compare(ImportPartsModel o1, ImportPartsModel o2) { int ret = (o1.isChecked() ? 0 : 1) - (o2.isChecked() ? 0 : 1); if (ret == 0) { ret = o1.getPartsIdentifier().compareTo(o2.getPartsIdentifier()); } return ret; } }); fireTableDataChanged(); } public void sortByTimestamp() { Collections.sort(elements, new Comparator () { public int compare(ImportPartsModel o1, ImportPartsModel o2) { long ret = (o1.isChecked() ? 0 : 1) - (o2.isChecked() ? 0 : 1); if (ret == 0) { Long tm1 = o1.getLastModifiedAtCurrentProfile(); Long tm2 = o2.getLastModifiedAtCurrentProfile(); long lastModified1 = Math.max(o1.getLastModified(), tm1 == null ? 0 : tm1.longValue()); long lastModified2 = Math.max(o2.getLastModified(), tm2 == null ? 0 : tm2.longValue()); ret = lastModified1 - lastModified2; } if (ret == 0) { ret = o1.getPartsIdentifier().compareTo(o2.getPartsIdentifier()); } return ret == 0 ? 0 : ret > 0 ? 1 : -1; } }); fireTableDataChanged(); } /** * 指定したパーツ識別子をチェック状態にする. * * @param partsIdentifiers * パーツ識別子のコレクション、nullの場合は何もしない. */ public void selectByPartsIdentifiers(Collection partsIdentifiers) { boolean modified = false; if (partsIdentifiers != null) { for (PartsIdentifier partsIdentifier : partsIdentifiers) { for (ImportPartsModel rowModel : elements) { if (rowModel.getPartsIdentifier().equals(partsIdentifier)) { if (!rowModel.isChecked()) { rowModel.setChecked(true); modified = true; } } } } } if (modified) { fireTableDataChanged(); } } public void setCheck(int[] selRows, boolean checked) { if (selRows == null || selRows.length == 0) { return; } Arrays.sort(selRows); for (int selRow : selRows) { ImportPartsModel rowModel = getRow(selRow); rowModel.setChecked(checked); } fireTableRowsUpdated(selRows[0], selRows[selRows.length - 1]); } } /** * プリセット選択パネル * * @author seraphy */ class ImportPresetSelectPanel extends ImportWizardCardPanel { private static final long serialVersionUID = 1L; public static final String PANEL_NAME = "importPresetSelectPanel"; private ImportPresetTableModel presetTableModel; private ImportWizardDialog parent; private JTable presetTable; private Action actSelectAll; private Action actDeselectAll; private Action actSelectUsedParts; public ImportPresetSelectPanel(ScaleSupport scaleSupport) { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE); setBorder(BorderFactory.createTitledBorder(strings.getProperty("preset.title"))); setLayout(new BorderLayout()); presetTableModel = new ImportPresetTableModel(); presetTableModel.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { if (e.getType() == TableModelEvent.UPDATE) { fireChangeEvent(); } } }); AppConfig appConfig = AppConfig.getInstance(); final Color warningForegroundColor = appConfig.getExportPresetWarningsForegroundColor(); final Color disabledForeground = appConfig.getDisabledCellForgroundColor(); presetTable = new JTable(presetTableModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component comp = super.prepareRenderer(renderer, row, column); if (comp instanceof JCheckBox) { // BooleanのデフォルトのレンダラーはJCheckBoxを継承したJTable$BooleanRenderer comp.setEnabled(isCellEditable(row, column) && isEnabled()); } ImportPresetModel presetModel = presetTableModel.getRow(row); // インポート先のプリセットを上書きする場合、もしくはデフォルトのパーツセットの場合は太字にする. if (presetModel.isOverwrite() || presetTableModel.isDefaultPartsSet(row)) { comp.setFont(getFont().deriveFont(Font.BOLD)); } else { comp.setFont(getFont()); } // インポートするプリセットのパーツが不足している場合、警告色にする. if (!isEnabled()) { comp.setForeground(disabledForeground); } else { if (presetModel.isCheched() && presetModel.getMissingPartsIdentifiers().size() > 0) { comp.setForeground(warningForegroundColor); } else { comp.setForeground(getForeground()); } } return comp; } }; presetTable.setShowGrid(true); presetTable.setGridColor(appConfig.getGridColor()); presetTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); // 行の高さをフォントの高さにする presetTable.setRowHeight((int)(presetTable.getFont().getSize() * 1.2)); actSelectUsedParts = new AbstractAction(strings.getProperty("preset.popup.selectUsedParts")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { exportUsedParts(); } }; final JPopupMenu popupMenu = new JPopupMenu(); popupMenu.add(actSelectUsedParts); presetTable.setComponentPopupMenu(popupMenu); // 列幅の調整 presetTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); presetTableModel.adjustColumnModel(presetTable.getColumnModel(), scaleSupport.getManualScaleX()); add(new JScrollPane(presetTable), BorderLayout.CENTER); actSelectAll = new AbstractAction(strings.getProperty("parts.btn.selectAll")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSelectAll(); } }; actDeselectAll = new AbstractAction(strings.getProperty("parts.btn.deselectAll")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onDeselectAll(); } }; Action actSort = new AbstractAction(strings .getProperty("parts.btn.sort")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSort(); } }; JPanel btnPanel = new JPanel(); GridBagLayout btnPanelLayout = new GridBagLayout(); btnPanel.setLayout(btnPanelLayout); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; int gap = (int)(3 * scaleSupport.getManualScaleX()); gbc.insets = new Insets(gap, gap, gap, gap); gbc.ipadx = 0; gbc.ipady = 0; JButton btnSelectAll = new JButton(actSelectAll); btnPanel.add(btnSelectAll, gbc); gbc.gridx = 1; gbc.gridy = 0; JButton btnDeselectAll = new JButton(actDeselectAll); btnPanel.add(btnDeselectAll, gbc); gbc.gridx = 2; gbc.gridy = 0; JButton btnSort = new JButton(actSort); btnPanel.add(btnSort, gbc); gbc.gridx = 3; gbc.gridy = 0; gbc.weightx = 1.; btnPanel.add(Box.createHorizontalGlue(), gbc); add(btnPanel, BorderLayout.SOUTH); } @Override public void onActive(ImportWizardDialog parent, ImportWizardCardPanel previousPanel) { this.parent= parent; actSelectUsedParts.setEnabled(parent.importTypeSelectPanel.isImportPartsImages()); checkMissingParts(); } public void checkMissingParts() { Collection importedPartsIdentifiers = this.parent.importPartsSelectPanel.getImportedPartsIdentifiers(); presetTableModel.checkMissingParts(importedPartsIdentifiers); } protected void onSelectAll() { presetTableModel.selectAll(); } protected void onDeselectAll() { presetTableModel.deselectAll(); } protected void onSort() { presetTableModel.sort(); if (presetTableModel.getRowCount() > 0) { Rectangle rct = presetTable.getCellRect(0, 0, true); presetTable.scrollRectToVisible(rct); } } protected void exportUsedParts() { ArrayList requirePartsIdentifiers = new ArrayList(); int[] selRows = presetTable.getSelectedRows(); for (int selRow : selRows) { ImportPresetModel presetModel = presetTableModel.getRow(selRow); PartsSet partsSet = presetModel.getPartsSet(); for (List partsIdentifiers : partsSet.values()) { for (PartsIdentifier partsIdentifier : partsIdentifiers) { requirePartsIdentifiers.add(partsIdentifier); } } } this.parent.importPartsSelectPanel.selectByPartsIdentifiers(requirePartsIdentifiers); checkMissingParts(); } @Override public boolean isReadyPrevious() { return true; } @Override public boolean isReadyNext() { return false; } @Override public boolean isReadyFinish() { if (this.parent != null) { return true; } return false; } @Override public String doPrevious() { return ImportPartsSelectPanel.PANEL_NAME; } @Override public String doNext() { return null; } public Collection getSelectedPartsSets() { return presetTableModel.getSelectedPartsSets(); } /** * デフォルトのパーツセットIDとして使用されることが推奨されるパーツセットIDを取得する.
* 明示的なデフォルトのパーツセットIDがなければ、もしくは、 明示的に指定されているパーツセットIDが選択されているパーツセットの中になければ、 * 選択されているパーツセットの最初のアイテムを返す.
* 選択しているパーツセットが一つもなければnullを返す.
* * @return デフォルトのパーツセット */ public String getPrefferedDefaultPartsSetId() { String defaultPartsSetId = presetTableModel.getDefaultPartsSetId(); String firstPartsSetId = null; boolean existsDefaultPartsSetId = false; for (PartsSet partsSet : getSelectedPartsSets()) { if (firstPartsSetId == null) { firstPartsSetId = partsSet.getPartsSetId(); } if (partsSet.getPartsSetId().equals(defaultPartsSetId)) { existsDefaultPartsSetId = true; } } if (!existsDefaultPartsSetId || defaultPartsSetId == null || defaultPartsSetId.length() == 0) { defaultPartsSetId = firstPartsSetId; } return defaultPartsSetId; } public void initModel(Collection partsSets, String defaultPartsSetId, CharacterData presetImportTarget, boolean selectAll) { presetTableModel.initModel(partsSets, defaultPartsSetId, presetImportTarget); if (selectAll) { presetTableModel.selectAll(); } } } class ImportPresetModel { private boolean cheched; private PartsSet partsSet; private boolean overwrite; private Collection missingPartsIdentifiers = Collections.emptySet(); public ImportPresetModel(PartsSet partsSet, boolean overwrite, boolean checked) { if (partsSet == null) { throw new IllegalArgumentException(); } this.partsSet = partsSet; this.cheched = checked; this.overwrite = overwrite; } public boolean isCheched() { return cheched; } public void setCheched(boolean cheched) { this.cheched = cheched; } public PartsSet getPartsSet() { return partsSet; } public String getPartsSetName() { return partsSet.getLocalizedName(); } public void setPartsSetName(String name) { if (name == null || name.trim().length() == 0) { throw new IllegalArgumentException(); } partsSet.setLocalizedName(name); } public Collection getMissingPartsIdentifiers() { return missingPartsIdentifiers; } public boolean hasMissingParts() { return true; } public boolean isOverwrite() { return overwrite; } public boolean checkMissingParts(Collection importedPartsIdentifiers) { HashSet missingPartsIdentifiers = new HashSet(); for (List partsIdentifiers : partsSet.values()) { for (PartsIdentifier partsIdentifier : partsIdentifiers) { boolean exists = false; if (importedPartsIdentifiers != null && importedPartsIdentifiers.contains(partsIdentifier)) { exists = true; } if (!exists) { missingPartsIdentifiers.add(partsIdentifier); } } } boolean modified = (!missingPartsIdentifiers.equals(this.missingPartsIdentifiers)); if (modified) { this.missingPartsIdentifiers = missingPartsIdentifiers; } return modified; } } class ImportPresetTableModel extends AbstractTableModelWithComboBoxModel { private static final long serialVersionUID = 1L; private static final String[] COLUMN_NAMES; // = {"選択", "プリセット名", // "不足するパーツ"}; private static final int[] COLUMN_WIDTHS; // = {50, 100, 200}; static { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE); COLUMN_NAMES = new String[] { strings.getProperty("preset.column.check"), strings.getProperty("preset.column.name"), strings.getProperty("preset.column.missings"), }; COLUMN_WIDTHS = new int[] { Integer.parseInt(strings.getProperty("preset.column.check.size")), Integer.parseInt(strings.getProperty("preset.column.name.size")), Integer.parseInt(strings.getProperty("preset.column.missings.size")), }; } private String defaultPartsSetId; public String getDefaultPartsSetId() { return defaultPartsSetId; } public void setDefaultPartsSetId(String defaultPartsSetId) { this.defaultPartsSetId = defaultPartsSetId; } public int getColumnCount() { return COLUMN_NAMES.length; } @Override public String getColumnName(int column) { return COLUMN_NAMES[column]; } @Override public Class getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return Boolean.class; case 1: return String.class; case 2: return String.class; } return String.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (columnIndex == 0 || columnIndex == 1) { return true; } return false; } public Object getValueAt(int rowIndex, int columnIndex) { ImportPresetModel rowModel = getRow(rowIndex); switch (columnIndex) { case 0: return rowModel.isCheched(); case 1: return rowModel.getPartsSetName(); case 2: return getMissingPartsIdentifiersString(rowModel); } return ""; } private String getMissingPartsIdentifiersString(ImportPresetModel rowModel) { StringBuilder buf = new StringBuilder(); for (PartsIdentifier partsIdentifier : rowModel.getMissingPartsIdentifiers()) { if (buf.length() > 0) { buf.append(", "); } buf.append(partsIdentifier.getLocalizedPartsName()); } return buf.toString(); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { ImportPresetModel rowModel = getRow(rowIndex); switch (columnIndex) { case 0: rowModel.setCheched(((Boolean) aValue).booleanValue()); break; case 1: String name = (String) aValue; name = (name != null) ? name.trim() : ""; if (name.length() > 0) { rowModel.setPartsSetName(name); } default: return; } fireTableRowsUpdated(rowIndex, rowIndex); } /** * 指定した行のパーツセットがデフォルトパーツセットであるか? * * @param rowIndex * 行インデックス * @return デフォルトパーツセットであればtrue、そうでなければfalse */ public boolean isDefaultPartsSet(int rowIndex) { ImportPresetModel rowModel = getRow(rowIndex); return rowModel.getPartsSet().getPartsSetId().equals(defaultPartsSetId); } public void adjustColumnModel(TableColumnModel columnModel, double scale) { int mx = columnModel.getColumnCount(); for (int idx = 0; idx < mx; idx++) { columnModel.getColumn(idx).setPreferredWidth((int)(COLUMN_WIDTHS[idx] * scale)); } } /** * パーツセットリストを構築する.
* * @param partsSets * 登録するパーツセット * @param defaultPartsSetId * デフォルトのパーツセットID、なければnull * @param presetImportTarget * インポート先、新規の場合はnull (上書き判定のため) */ public void initModel(Collection partsSets, String defaultPartsSetId, CharacterData presetImportTarget) { clear(); if (partsSets == null) { return; } // インポート先の既存のパーツセット Map currentProfilesPartsSet; if (presetImportTarget != null) { currentProfilesPartsSet = presetImportTarget.getPartsSets(); } else { // 新規の場合は既存パーツセットは空. currentProfilesPartsSet = Collections.emptyMap(); } // インポートもとのパーツセットをテープルモデルに登録する. for (PartsSet partsSet : partsSets) { String partsSetId = partsSet.getPartsSetId(); if (partsSetId == null || partsSetId.length() == 0) { continue; } PartsSet compatiblePartsSet; if (presetImportTarget != null) { // 既存のキャラクター定義へのインポート時は、パーツセットのカテゴリを合わせる. // 一つもカテゴリが合わない場合は空のパーツセットになる. compatiblePartsSet = partsSet.createCompatible(presetImportTarget); } else { compatiblePartsSet = partsSet; // 新規の場合はフィッティングの必要なし. } if (!compatiblePartsSet.isEmpty()) { // 空のパーツセットは登録対象にしない. boolean overwrite = currentProfilesPartsSet.containsKey(partsSetId); boolean checked = (presetImportTarget == null); // 新規の場合は既定で選択状態とする. ImportPresetModel rowModel = new ImportPresetModel(partsSet, overwrite, checked); addRow(rowModel); } } // デフォルトのパーツセットIDを設定、存在しない場合はnull this.defaultPartsSetId = defaultPartsSetId; sort(); } public Collection getSelectedPartsSets() { ArrayList partsSets = new ArrayList(); for (ImportPresetModel rowModel : elements) { if (rowModel.isCheched()) { partsSets.add(rowModel.getPartsSet()); } } return partsSets; } public void selectAll() { boolean modified = false; for (ImportPresetModel rowModel : elements) { if (!rowModel.isCheched()) { rowModel.setCheched(true); modified = true; } } if (modified) { fireTableDataChanged(); } } public void deselectAll() { boolean modified = false; for (ImportPresetModel rowModel : elements) { if (rowModel.isCheched()) { rowModel.setCheched(false); modified = true; } } if (modified) { fireTableDataChanged(); } } public void sort() { Collections.sort(elements, new Comparator() { public int compare(ImportPresetModel o1, ImportPresetModel o2) { int ret = (o1.isCheched() ? 0 : 1) - (o2.isCheched() ? 0 : 1); if (ret == 0) { ret = o1.getPartsSetName().compareTo(o2.getPartsSetName()); } return ret; } }); fireTableDataChanged(); } public void checkMissingParts(Collection importedPartsIdentifiers) { boolean changed = false; for (ImportPresetModel rowModel : elements) { if (rowModel.checkMissingParts(importedPartsIdentifiers)) { changed = true; } } if (changed) { fireTableDataChanged(); } } } CharacterManaJ/src/main/java/charactermanaj/ui/SelectCharatersDirDialog.java0000644000175000017500000004023013615720000027274 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.Dimension; import java.awt.Font; import java.awt.GraphicsEnvironment; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.dnd.DropTarget; import java.awt.event.ActionEvent; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRootPane; import javax.swing.KeyStroke; import charactermanaj.Main; import charactermanaj.model.io.WorkingSetPersist; import charactermanaj.ui.util.FileDropTarget; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.LocalizedResourcePropertyLoader; import charactermanaj.util.UIHelper; /** * 起動時にキャラクターデータディレクトリを選択するためのモーダルダイアログ.
* * @author seraphy */ public class SelectCharatersDirDialog extends JDialog { private static final long serialVersionUID = -888834575856349442L; private static final Logger logger = Logger.getLogger(SelectCharatersDirDialog.class.getName()); /** * 最後に使用したキャラクターデータディレクトリと、その履歴情報. */ private final RecentCharactersDir recentCharactersDir; /** * 既定のディレクトリ */ private File defaultCharactersDir; /** * 選択されたディレクトリ */ private File selectedCharacterDir; /** * 次回起動時に問い合わせない */ private boolean doNotAskAgain; /** * ディレクトリ選択コンボ */ private JComboBox combDir; /** * 次回起動時に問い合わせないチェックボックス */ private JCheckBox chkDoNotAsk; public File getDefaultCharactersDir() { return defaultCharactersDir; } public void setDefaultCharactersDir(File defaultCharactersDir) { this.defaultCharactersDir = defaultCharactersDir; } public File getSelectedCharacterDir() { return selectedCharacterDir; } public boolean isDoNotAskAgain() { return doNotAskAgain; } /** * コンストラクタ * * @param parent * 親(通常は、null) * @param recentCharactersDir * 最後に使用したキャラクターデータディレクトリと、その履歴情報. */ protected SelectCharatersDirDialog(JFrame parent, RecentCharactersDir recentCharactersDir) { super(parent, true); try { if (recentCharactersDir == null) { throw new IllegalArgumentException( "recentCharactersDirにnullは指定できません。"); } this.recentCharactersDir = recentCharactersDir; setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClose(); } }); initComponent(); } catch (RuntimeException ex) { logger.log(Level.SEVERE, "キャラクターディレクトリ選択ダイアログの生成に失敗しました。", ex); dispose(); throw ex; } } private void initComponent() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/selectCharatersDirDialog"); AbstractAction actOk = new AbstractAction(strings.getProperty("btn.ok")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onOK(); } }; AbstractAction actClose = new AbstractAction(strings.getProperty("btn.cancel")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onClose(); } }; AbstractAction actBrowse = new AbstractAction(strings.getProperty("btn.chooseDir")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onBrowse(); } }; AbstractAction actRemoveRecent = new AbstractAction(strings.getProperty("btn.clearRecentList")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onRemoveRecent(); } }; AbstractAction actRemoveWorkingSets = new AbstractAction(strings.getProperty("btn.clearWorkingSets")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onRemoveWorkingSets(); } }; final JButton btnRemoveWorkingSets = new JButton(actRemoveWorkingSets); final JButton btnRemoveRecent = new JButton(actRemoveRecent); final JButton btnOK = new JButton(actOk); final JButton btnCancel = new JButton(actClose); final JButton btnBroseForDir = new JButton(actBrowse); Toolkit tk = Toolkit.getDefaultToolkit(); final JRootPane rootPane = getRootPane(); FocusAdapter focusAdapter = new FocusAdapter() { @Override public void focusGained(FocusEvent e) { JButton btn = (JButton) e.getSource(); rootPane.setDefaultButton(btn); } @Override public void focusLost(FocusEvent e) { rootPane.setDefaultButton(btnOK); } }; rootPane.setDefaultButton(btnOK); InputMap im = rootPane.getInputMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "close"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "close"); rootPane.getActionMap().put("close", actClose); btnRemoveWorkingSets.addFocusListener(focusAdapter); btnRemoveRecent.addFocusListener(focusAdapter); btnOK.addFocusListener(focusAdapter); btnCancel.addFocusListener(focusAdapter); btnBroseForDir.addFocusListener(focusAdapter); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); JPanel contentPane = (JPanel) getContentPane(); int borderSize = (int)(5 * scaleSupport.getManualScaleX()); contentPane.setBorder(BorderFactory.createEmptyBorder(0, borderSize, borderSize, borderSize)); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); { JLabel lbl = new JLabel(strings.getProperty("caption")); lbl.setFont(lbl.getFont().deriveFont(Font.BOLD)); lbl.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); Dimension dim = lbl.getPreferredSize(); dim.width = Integer.parseInt(strings.getProperty("width")); dim = scaleSupport.manualScaled(dim); lbl.setPreferredSize(dim); Box header = Box.createHorizontalBox(); header.add(lbl); contentPane.add(header); } { JPanel dirPanel = new JPanel(new GridBagLayout()); dirPanel.setBorder(BorderFactory.createEmptyBorder(3, 10, 3, 3)); combDir = new JComboBox(); combDir.setEditable(true); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.insets = new Insets(3, 3, 3, 3); dirPanel.add(new JLabel(strings.getProperty("lbl.dir")), gbc); gbc.gridx = 1; gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1; dirPanel.add(combDir, gbc); gbc.gridx = 2; gbc.weightx = 0; dirPanel.add(btnBroseForDir, gbc); // リサイズ時に開く余白部 gbc.gridx = 0; gbc.gridy = 1; gbc.weighty = 1; dirPanel.add(Box.createGlue(), gbc); contentPane.add(dirPanel); } { chkDoNotAsk = new JCheckBox(strings.getProperty("chk.doNotAskAgein")); chkDoNotAsk.setSelected(recentCharactersDir.isDoNotAskAgain()); Box chkPanel = Box.createHorizontalBox(); chkPanel.add(chkDoNotAsk); chkPanel.add(Box.createHorizontalGlue()); contentPane.add(chkPanel); } { Box btnsBox = Box.createHorizontalBox(); btnsBox.add(btnRemoveRecent); btnsBox.add(btnRemoveWorkingSets); btnsBox.add(Box.createHorizontalGlue()); // OK, CANCELボタンのサイズを合わせる Dimension dim = btnOK.getPreferredSize(); int btnWidth = Math.max(btnOK.getPreferredSize().width, btnCancel.getPreferredSize().width); dim.setSize(btnWidth, dim.height); btnOK.setPreferredSize(dim); btnCancel.setPreferredSize(dim); if (!Main.isLinuxOrMacOSX()) { btnsBox.add(btnOK); btnsBox.add(btnCancel); } else { btnsBox.add(btnCancel); btnsBox.add(btnOK); } btnsBox.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 24)); contentPane.add(btnsBox); } setTitle(strings.getProperty("title")); setResizable(true); // フォルダのドロップによる入力を許可 new DropTarget(this, new FileDropTarget() { @Override protected void onDropFiles(List dropFiles) { setSelectFile(dropFiles); } @Override protected void onException(Exception ex) { ErrorMessageHelper.showErrorDialog(SelectCharatersDirDialog.this, ex); } }); pack(); setLocationRelativeTo(null); } /** * ドロップによるファイル名の設定.
* 最初の1つだけを使用する.
* リストが空であるか、最初のファイルが、フォルダでなければ何もしない.
* * @param dropFiles * ドロップされたファイルリスト */ protected void setSelectFile(List dropFiles) { if (dropFiles.isEmpty()) { return; } File dropFile = dropFiles.get(0); if ( !dropFile.exists() || !dropFile.isDirectory()) { return; } combDir.setSelectedItem(dropFile); } protected void onClose() { selectedCharacterDir = null; dispose(); } protected void onOK() { try { Object value = combDir.getSelectedItem(); if (value != null && value instanceof String) { value = new File((String) value); } if (value != null && value instanceof File) { File file = (File) value; if (!file.exists()) { boolean result = file.mkdirs(); logger.log(Level.INFO, "mkdirs(" + file+ ") succeeded=" + result); } if (file.isDirectory()) { logger.log(Level.CONFIG, "selectedCharactersDir=" + file); selectedCharacterDir = file; doNotAskAgain = chkDoNotAsk.isSelected(); dispose(); return; } } // 選択されていないかファイルでない場合 Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } protected void onBrowse() { try { Object selectedItem = combDir.getSelectedItem(); String directoryTxt = null; if (selectedItem != null) { directoryTxt = selectedItem.toString(); } JFileChooser dirChooser = new JFileChooser(directoryTxt); dirChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); if (dirChooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) { return; } File dir = dirChooser.getSelectedFile(); if (dir != null) { combDir.setSelectedItem(dir); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } protected void onRemoveWorkingSets() { try { Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties( "languages/selectCharatersDirDialog"); // 削除の確認ダイアログ if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.clearWorkingSets"), strings.getProperty("confirm.clearWorkingSets.title"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION) { return; } // 全てのワーキングセットをクリアする. WorkingSetPersist workingSetPersist = WorkingSetPersist.getInstance(); workingSetPersist.removeAllWorkingSet(); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } protected void onRemoveRecent() { try { Object current = combDir.getSelectedItem(); recentCharactersDir.clrar(); setRecents(); if (current != null) { combDir.setSelectedItem(current); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } protected void setRecents() { // 現在の候補をクリア. while (combDir.getItemCount() > 0) { combDir.removeItemAt(0); } // 前回使用したディレクトリを最優先候補 ArrayList priorityDirs = new ArrayList(); File lastUseCatacterDir = recentCharactersDir.getLastUseCharacterDir(); if (lastUseCatacterDir != null) { if (defaultCharactersDir != null && !lastUseCatacterDir.equals(defaultCharactersDir)) { combDir.addItem(lastUseCatacterDir); priorityDirs.add(lastUseCatacterDir); } } // デフォルトのキャラクターデータを第2位に設定 if (defaultCharactersDir != null) { combDir.addItem(defaultCharactersDir); priorityDirs.add(defaultCharactersDir); } // それ以外の履歴を設定 for (File charactersDir : recentCharactersDir .getRecentCharacterDirsOrderByNewly()) { if (charactersDir == null) { continue; } if (!priorityDirs.contains(charactersDir)) { combDir.addItem(charactersDir); } } // 第一候補を選択状態とする. if (combDir.getItemCount() > 0) { combDir.setSelectedIndex(0); } } /** * キャラクターデータディレクトリを履歴および既定のディレクトリから、任意の使用するディレクトリを選択する.
* 既定のディレクトリは常に選択候補とする.
* 新しいディレクトリを指定した場合は、履歴に追加される.
* 「再度問い合わせなし」を選択している場合で、そのディレクトリが実在すれば、選択ダイアログを表示せず、それを返す.
* * @param defaultCharacterDir * 既定のディレクトリ * @return 選択したディレクトリ、キャンセルした場合はnull */ public static File getCharacterDir(File defaultCharacterDir) { RecentCharactersDir recentChars; try { recentChars = RecentCharactersDir.load(); } catch (Exception ex) { logger.log(Level.WARNING, "最後に使用したキャラクターディレクトリ情報の読み込みに失敗しました。", ex); recentChars = null; } if (recentChars == null) { recentChars = new RecentCharactersDir(); } logger.log(Level.CONFIG, "RecentCharacterDirs.doNotAskAgain=" + recentChars.isDoNotAskAgain()); if (recentChars.isDoNotAskAgain()) { // 「再度問い合わせ無し」の場合で、過去のディレクトリが有効であれば、それを返す. File recentCharDir = recentChars.getLastUseCharacterDir(); if (recentCharDir != null && recentCharDir.exists() && recentCharDir.isDirectory()) { return recentCharDir; } recentChars.setDoNotAskAgain(false); // 不正である場合は「再度問い合わせ無し」をリセットする. } // タスクバーに表示するため、サイズ0の見えないダミーのフレームを作成する // (タスクバーにないとダイアログが他のウィンドウの下にはいったら探すのが大変なため) JFrame dummyFrame = new JFrame(); dummyFrame.setUndecorated(true); dummyFrame.setSize(0, 0); dummyFrame.setLocation(GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint()); // 主画面の中央 dummyFrame.setIconImage(UIHelper.getInstance().getImage("icons/icon.png")); // アイコンの設定(MainFrameと同じ) dummyFrame.setVisible(true); // キャラクターデータディレクトリ選択ダイアログを表示する File selectedCharacterDir; SelectCharatersDirDialog dlg = new SelectCharatersDirDialog(dummyFrame, recentChars); dlg.setDefaultCharactersDir(defaultCharacterDir); dlg.setRecents(); dlg.setVisible(true); // ダミーのフレームを破棄する dummyFrame.dispose(); selectedCharacterDir = dlg.getSelectedCharacterDir(); if (selectedCharacterDir != null) { recentChars.setLastUseCharacterDir(selectedCharacterDir); try { recentChars.setDoNotAskAgain(dlg.isDoNotAskAgain()); recentChars.saveRecents(); } catch (Exception ex) { logger.log(Level.WARNING, "最後に使用したキャラクターディレクトリ情報の保存に失敗しました。", ex); } } return selectedCharacterDir; } } CharacterManaJ/src/main/java/charactermanaj/ui/ExportWizardDialog.java0000644000175000017500000015416313615720000026236 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import charactermanaj.Main; import charactermanaj.model.AppConfig; import charactermanaj.model.CharacterData; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSet; import charactermanaj.model.PartsSpec; import charactermanaj.model.PartsSpecResolver; import charactermanaj.model.io.CharacterDataFileReaderWriterFactory; import charactermanaj.model.io.CharacterDataWriter; import charactermanaj.model.io.CustomLayerOrderPersist; import charactermanaj.model.io.ExportInfoKeys; import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel; import charactermanaj.ui.progress.ProgressHandle; import charactermanaj.ui.progress.Worker; import charactermanaj.ui.progress.WorkerException; import charactermanaj.ui.progress.WorkerWithProgessDialog; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.LocalizedResourcePropertyLoader; public class ExportWizardDialog extends JDialog { private static final long serialVersionUID = 1L; protected static final String STRINGS_RESOURCE = "languages/exportwizdialog"; protected static ArchiveFileDialog archiveFileDialog = new ArchiveFileDialog(); private JPanel activePanel; private AbstractAction actNext; private AbstractAction actPrev; private AbstractAction actFinish; private ExportInformationPanel basicPanel; private ExportPartsSelectPanel partsSelectPanel; private ExportPresetSelectPanel presetSelectPanel; private CharacterData source; public static File getLastUsedDir() { return archiveFileDialog.getLastUSedDir(); } public static void setLastUsedDir(File lastUsedDir) { archiveFileDialog.setLastUSedDir(lastUsedDir); } public ExportWizardDialog(JFrame parent, CharacterData characterData, BufferedImage samplePicture) { super(parent, true); initComponent(parent, characterData, samplePicture); } public ExportWizardDialog(JDialog parent, CharacterData characterData, BufferedImage samplePicture) { super(parent, true); initComponent(parent, characterData, samplePicture); } private void initComponent(Component parent, CharacterData characterData, BufferedImage samplePicture) { if (characterData == null) { throw new IllegalArgumentException(); } this.source = characterData; setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClose(); } }); Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); // タイトル setTitle(strings.getProperty("title")); // メインパネル ScaleSupport scaleSupport = ScaleSupport.getInstance(this); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); final JPanel mainPanel = new JPanel(); mainPanel.setBorder(BorderFactory.createEtchedBorder()); int mergin = (int)(5 * scaleSupport.getManualScaleX()); final CardLayout mainPanelLayout = new CardLayout(mergin, mergin); mainPanel.setLayout(mainPanelLayout); contentPane.add(mainPanel, BorderLayout.CENTER); ComponentListener componentListener = new ComponentAdapter() { public void componentShown(ComponentEvent e) { onComponentShown((JPanel) e.getComponent()); } }; // アクション this.actNext = new AbstractAction(strings.getProperty("btn.next")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { mainPanelLayout.next(mainPanel); } }; this.actPrev = new AbstractAction(strings.getProperty("btn.prev")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { mainPanelLayout.previous(mainPanel); } }; this.actFinish = new AbstractAction(strings.getProperty("btn.finish")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onFinish(); } }; AbstractAction actCancel = new AbstractAction(strings.getProperty("btn.cancel")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onClose(); } }; ChangeListener actChangeValue = new ChangeListener() { public void stateChanged(ChangeEvent e) { updateBtnPanelState(); } }; ChangeListener actPanelEnabler = new ChangeListener() { public void stateChanged(ChangeEvent e) { updatePanelStatus(); } }; // panel1 : basic this.basicPanel = new ExportInformationPanel(characterData, samplePicture, scaleSupport); this.basicPanel.addComponentListener(componentListener); this.basicPanel.addChangeListener(actChangeValue); this.basicPanel.addChangeListener(actPanelEnabler); mainPanel.add(this.basicPanel, "basicPanel"); // panel2 : panelSelectPanel this.partsSelectPanel = new ExportPartsSelectPanel(characterData, scaleSupport); this.partsSelectPanel.addComponentListener(componentListener); this.partsSelectPanel.addChangeListener(actChangeValue); mainPanel.add(this.partsSelectPanel, "partsSelectPanel"); // panel3 : presetSelectPanel this.presetSelectPanel = new ExportPresetSelectPanel( this.partsSelectPanel, this.basicPanel, characterData.getPartsSets().values(), characterData.getDefaultPartsSetId(), scaleSupport); this.presetSelectPanel.addComponentListener(componentListener); this.presetSelectPanel.addChangeListener(actChangeValue); mainPanel.add(this.presetSelectPanel, "presetSelectPanel"); // button panel JPanel btnPanel = new JPanel(); int gap = (int)(3 * scaleSupport.getManualScaleX()); btnPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap * 15)); // 3, 3, 3, 45 GridBagLayout btnPanelLayout = new GridBagLayout(); btnPanel.setLayout(btnPanelLayout); actPrev.setEnabled(false); actNext.setEnabled(false); actFinish.setEnabled(false); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; gbc.ipadx = 0; gbc.ipady = 0; gbc.insets = new Insets(gap, gap, gap, gap); gbc.weightx = 1.; gbc.weighty = 0.; btnPanel.add(Box.createHorizontalGlue(), gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 2 : 1; gbc.gridy = 0; gbc.weightx = 0.; btnPanel.add(new JButton(this.actPrev), gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 3 : 2; gbc.gridy = 0; JButton btnNext = new JButton(this.actNext); btnPanel.add(btnNext, gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 4 : 3; gbc.gridy = 0; btnPanel.add(new JButton(this.actFinish), gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 1 : 4; gbc.gridy = 0; JButton btnCancel = new JButton(actCancel); btnPanel.add(btnCancel, gbc); contentPane.add(btnPanel, BorderLayout.SOUTH); // インプットマップ/アクションマップ Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); rootPane.setDefaultButton(btnNext); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeExportWizDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeExportWizDialog"); am.put("closeExportWizDialog", actCancel); // 表示 // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する setSize(scaleSupport.manualScaled(new Dimension(500, 500))); setLocationRelativeTo(parent); mainPanelLayout.first(mainPanel); updateBtnPanelState(); updatePanelStatus(); } protected void onComponentShown(JPanel panel) { activePanel = panel; updateBtnPanelState(); } protected void updatePanelStatus() { partsSelectPanel.setEnabled(basicPanel.isExportPartsImages()); presetSelectPanel.setEnabled(basicPanel.isExportPresets()); } protected void updateBtnPanelState() { actPrev.setEnabled(activePanel != null && activePanel != basicPanel); actNext.setEnabled(activePanel != null && activePanel != presetSelectPanel); actFinish.setEnabled(isComplete()); } protected void checkMissingParts(Collection partaSets) { if (partaSets == null) { partaSets = presetSelectPanel.getSelectedPresets(); } partsSelectPanel.checkMissingPartsList(partaSets); } protected boolean isComplete() { if (basicPanel.isExportPartsImages()) { if (partsSelectPanel.getSelectedCount() == 0) { // パーツイメージのエクスポートを指定した場合、エクスポートするパーツの選択は必須 return false; } } if (basicPanel.isExportPresets()) { if (presetSelectPanel.getSelectedCount() == 0) { // プリセットのエクスポートを指定した場合、エクスポートするプリセットの選択は必須 return false; } } return true; } protected void onClose() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ExportWizardDialog.STRINGS_RESOURCE); if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.close"), strings.getProperty("confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.YES_OPTION) { return; } dispose(); } protected void onFinish() { if (!isComplete()) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } try { final File outFile = archiveFileDialog.showSaveDialog(this); if (outFile == null) { return; } // 出力 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { Worker worker = new Worker() { public Object doWork(ProgressHandle progressHandle) throws IOException { doExport(outFile); return null; } }; WorkerWithProgessDialog dlg = new WorkerWithProgessDialog(this, worker); dlg.startAndWait(); } finally { setCursor(Cursor.getDefaultCursor()); } // 完了メッセージ Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ExportWizardDialog.STRINGS_RESOURCE); JOptionPane.showMessageDialog(this, strings.getProperty("complete")); // 完了後、ウィンドウを閉じる. dispose(); } catch (WorkerException ex) { ErrorMessageHelper.showErrorDialog(this, ex.getCause()); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } protected void doExport(File outFile) throws IOException { CharacterDataFileReaderWriterFactory writerFactory = CharacterDataFileReaderWriterFactory.getInstance(); CharacterDataWriter exportWriter = writerFactory.createWriter(outFile); try { // 基本情報のみをコピーし、これをエクスポートするキャラクター定義のベースとする。 // (プリセットとパーツイメージはリセットされている状態。) CharacterData cd = source.duplicateBasicInfo(); cd.clearPartsSets(false); boolean exportPresets = basicPanel.isExportPresets(); boolean exportSamplePicture = basicPanel.isExportSamplePicture(); boolean exportCharacterData = true; boolean exportPartsImages = basicPanel.isExportPartsImages(); // 基本情報を設定する. cd.setAuthor(basicPanel.getAuthor()); cd.setDescription(basicPanel.getDescription()); // エクスポート情報を出力する. Properties exportProp = new Properties(); exportProp.setProperty(ExportInfoKeys.EXPORT_PRESETS, Boolean.toString(exportPresets)); exportProp.setProperty(ExportInfoKeys.EXPORT_SAMPLE_PICTURE, Boolean.toString(exportSamplePicture)); exportProp.setProperty(ExportInfoKeys.EXPORT_CHARACTER_DATA, Boolean.toString(exportCharacterData)); exportProp.setProperty(ExportInfoKeys.EXPORT_PARTS_IMAGES, Boolean.toString(exportPartsImages)); exportProp.setProperty(ExportInfoKeys.EXPORT_TIMESTAMP, Long.toString(System.currentTimeMillis())); exportWriter.writeExportProp(exportProp); // プリセットをエクスポートする場合、プリセット情報を登録する. if (exportPresets) { HashSet registered = new HashSet(); for (PartsSet partsSet : presetSelectPanel.getSelectedPresets()) { registered.add(partsSet.getPartsSetId()); cd.addPartsSet(partsSet); } // プリセットとして登録済みのもののみ既定に設定可能 String defaultPresetId = presetSelectPanel.getDefaultPresetId(); if (registered.contains(defaultPresetId)) { cd.setDefaultPartsSetId(defaultPresetId); } } // キャラクターデータを出力する. exportWriter.writeCharacterData(cd); // カスタムレイヤーパターンを出力する(有効であれば) if (cd.isEnableCustonLayerPattern()) { Map> customLayerPatternMap = CustomLayerOrderPersist .newInstance(cd).load(); if (customLayerPatternMap != null) { exportWriter.writeCustomLayerPatterns(customLayerPatternMap); } } // readme.txtを出力する. String readmeContents = cd.getDescription(); if (readmeContents != null && readmeContents.trim().length() > 0) { AppConfig appConfig = AppConfig.getInstance(); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); pw.println("exported by CharacterManaJ (version " + appConfig.getSpecificationVersion() + " " + appConfig.getImplementationVersion() + ")"); pw.println(); pw.println(readmeContents); pw.close(); exportWriter.writeTextUTF16LE("readme.txt", sw.toString()); } // サンプルピクチャをエクスポートする if (exportSamplePicture) { BufferedImage pic = null; pic = basicPanel.getSamplePicture(); if (pic != null) { exportWriter.writeSamplePicture(pic); } } if (exportPartsImages) { Map partsSpecMap = partsSelectPanel.getSelectedParts(); // パーツ管理情報を出力する exportWriter.writePartsManageData(partsSpecMap); // パーツイメージを出力する exportWriter.writePartsImages(partsSpecMap); } } finally { exportWriter.close(); } } } interface ExportResolverBase { void addChangeListener(ChangeListener l); void removeChangeListener(ChangeListener l); } /** * 基本情報 * @author seraphy */ interface ExportInformationResolver extends ExportResolverBase { BufferedImage getSamplePicture(); boolean isExportSamplePicture(); boolean isExportPartsImages(); boolean isExportPresets(); String getAuthor(); String getDescription(); } abstract class AbstractImportPanel extends JPanel implements ExportResolverBase { private static final long serialVersionUID = 1L; protected LinkedList listeners = new LinkedList(); public void addChangeListener(ChangeListener l) { if (l != null) { listeners.add(l); } } public void removeChangeListener(ChangeListener l) { if (l != null) { listeners.remove(l); } } protected void fireChangeEvent() { ChangeEvent e = new ChangeEvent(this); for (ChangeListener listener : listeners) { listener.stateChanged(e); } } } /** * 基本情報パネル * @author seraphy */ class ExportInformationPanel extends AbstractImportPanel implements ExportInformationResolver { private static final long serialVersionUID = 1L; private BufferedImage samplePicture; private SamplePicturePanel sampleImagePanel; private JTextField txtAuthor; private JTextArea txtDescription; private JCheckBox chkPartsImages; private JCheckBox chkPresets; private JCheckBox chkSampleImage; protected ExportInformationPanel(final CharacterData characterData, final BufferedImage samplePicture, ScaleSupport scaleSupport) { if (characterData == null) { throw new IllegalArgumentException(); } setName("basicPanel"); this.samplePicture = samplePicture; Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ExportWizardDialog.STRINGS_RESOURCE); GridBagLayout basicPanelLayout = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); setLayout(basicPanelLayout); JPanel contentsSpecPanel = new JPanel(); int mergin = (int)(5 * scaleSupport.getManualScaleX()); contentsSpecPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(mergin, mergin, mergin, mergin), BorderFactory.createTitledBorder(strings.getProperty("basic.contentsSpec")))); BoxLayout contentsSpecPanelLayout = new BoxLayout(contentsSpecPanel, BoxLayout.PAGE_AXIS); contentsSpecPanel.setLayout(contentsSpecPanelLayout); JCheckBox chkCharacterDef = new JCheckBox(strings.getProperty("characterdef")); chkPartsImages = new JCheckBox(strings.getProperty("basic.chk.partsImages")); chkPresets = new JCheckBox(strings.getProperty("basic.chk.presets")); chkSampleImage = new JCheckBox(strings.getProperty("basic.chk.samplePicture")); chkCharacterDef.setEnabled(false); // キャラクター定義は固定 chkCharacterDef.setSelected(true); contentsSpecPanel.add(chkCharacterDef); contentsSpecPanel.add(chkPartsImages); contentsSpecPanel.add(chkPresets); contentsSpecPanel.add(chkSampleImage); /// JPanel commentPanel = new JPanel(); Dimension archiveInfoPanelMinSize = scaleSupport.manualScaled(new Dimension(300, 200)); commentPanel.setMinimumSize(archiveInfoPanelMinSize); commentPanel.setPreferredSize(archiveInfoPanelMinSize); commentPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(mergin, mergin, mergin, mergin), BorderFactory.createTitledBorder(strings.getProperty("basic.comment")))); GridBagLayout commentPanelLayout = new GridBagLayout(); commentPanel.setLayout(commentPanelLayout); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; int gap = (int)(3 * scaleSupport.getManualScaleX()); gbc.insets = new Insets(gap, gap, gap, gap); gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; commentPanel.add(new JLabel(strings.getProperty("author"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 0; gbc.gridwidth = 1; gbc.weightx = 1.; gbc.weighty = 0.; txtAuthor = new JTextField(); commentPanel.add(txtAuthor, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.weightx = 0.; gbc.weighty = 0.; commentPanel.add(new JLabel(strings.getProperty("description"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 1; gbc.gridwidth = 1; gbc.gridheight = 2; gbc.weighty = 1.; gbc.weightx = 1.; txtDescription = new JTextArea(); commentPanel.add(new JScrollPane(txtDescription), gbc); /// sampleImagePanel = new SamplePicturePanel(samplePicture); sampleImagePanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(mergin, mergin, mergin, mergin), BorderFactory.createTitledBorder(strings.getProperty("basic.sampleImage")))); /// gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 2; gbc.weightx = 1.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; add(contentsSpecPanel, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 1.; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; add(commentPanel, gbc); gbc.gridx = 1; gbc.gridy = 1; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 1.; gbc.weighty = 1.; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; add(sampleImagePanel, gbc); loadBasicInfo(characterData); // アクションリスナ ActionListener modListener = new ActionListener() { public void actionPerformed(ActionEvent e) { updateSamplePicture(); fireChangeEvent(); } }; chkPartsImages.addActionListener(modListener); chkPresets.addActionListener(modListener); chkSampleImage.addActionListener(modListener); } protected void updateSamplePicture() { sampleImagePanel.setVisiblePicture(chkSampleImage.isSelected()); } protected void loadBasicInfo(CharacterData characterData) { if (samplePicture == null) { // サンプルイメージがなければディセーブル chkSampleImage.setEnabled(false); chkSampleImage.setSelected(false); sampleImagePanel.setVisiblePicture(false); } else { chkSampleImage.setSelected(true); sampleImagePanel.setVisiblePicture(true); } chkPartsImages.setSelected(true); chkPresets.setSelected(true); String author = characterData.getAuthor(); String description = characterData.getDescription(); txtAuthor.setText(author == null ? "" : author); txtDescription.setText(description == null ? "" : description); } public BufferedImage getSamplePicture() { return samplePicture; } public boolean isExportSamplePicture() { return chkSampleImage.isSelected(); } public boolean isExportPartsImages() { return chkPartsImages.isSelected(); } public boolean isExportPresets() { return chkPresets.isSelected(); } public String getAuthor() { return txtAuthor.getText(); } public String getDescription() { return txtDescription.getText(); } } /** * エクスポート対象パーツ * @author seraphy */ interface ExportPartsResolver extends ExportResolverBase { int getSelectedCount(); void selectByPartsSet(Collection partsSet); Map getSelectedParts(); Map> checkMissingPartsList(Collection partsSets); } /** * エクスポート対象パーツ選択パネル * @author seraphy */ class ExportPartsSelectPanel extends AbstractImportPanel implements ExportPartsResolver { private static final long serialVersionUID = 1L; private ExportPartsTableModel partsTableModel; private JTable partsTable; private Action actSelectAll; private Action actDeselectAll; private Action actSort; private Action actSortByTimestamp; protected ExportPartsSelectPanel(PartsSpecResolver partsSpecResolver, ScaleSupport scaleSupport) { if (partsSpecResolver == null) { throw new IllegalArgumentException(); } Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ExportWizardDialog.STRINGS_RESOURCE); setName("choosePartsPanel"); setBorder(BorderFactory.createTitledBorder(strings.getProperty("parts.title"))); setLayout(new BorderLayout()); partsTableModel = new ExportPartsTableModel(); partsTableModel.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { fireChangeEvent(); } }); loadPartsInfo(partsSpecResolver); AppConfig appConfig = AppConfig.getInstance(); final Color disabledForeground = appConfig.getDisabledCellForgroundColor(); partsTable = new JTable(partsTableModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component comp = super.prepareRenderer(renderer, row, column); if (comp instanceof JCheckBox) { // BooleanのデフォルトのレンダラーはKCheckBoxを継承したJTable$BooleanRenderer comp.setEnabled(isCellEditable(row, column) && isEnabled()); } comp.setForeground(isEnabled() ? (isCellSelected(row,column) ? getSelectionForeground() : getForeground()) : disabledForeground); return comp; } }; partsTable.setShowGrid(true); partsTable.setGridColor(appConfig.getGridColor()); partsTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); partsTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); partsTable.setRowSelectionAllowed(true); // 行の高さをフォントの高さにする partsTable.setRowHeight((int)(partsTable.getFont().getSize() * 1.2)); // 列幅を調整する partsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); partsTableModel.adjustColumnModel(partsTable.getColumnModel(), scaleSupport.getManualScaleX()); Action actPartsSetCheck = new AbstractAction(strings.getProperty("parts.popup.check")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int[] selRows = partsTable.getSelectedRows(); partsTableModel.setCheck(selRows, true); } }; Action actPartsUnsetCheck = new AbstractAction(strings.getProperty("parts.popup.uncheck")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int[] selRows = partsTable.getSelectedRows(); partsTableModel.setCheck(selRows, false); } }; final JPopupMenu partsTablePopupMenu = new JPopupMenu(); partsTablePopupMenu.add(actPartsSetCheck); partsTablePopupMenu.add(actPartsUnsetCheck); partsTable.setComponentPopupMenu(partsTablePopupMenu); add(new JScrollPane(partsTable), BorderLayout.CENTER); actSelectAll = new AbstractAction(strings.getProperty("parts.btn.selectAll")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSelectAll(); } }; actDeselectAll = new AbstractAction(strings.getProperty("parts.btn.deselectAll")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onDeselectAll(); } }; actSort = new AbstractAction(strings.getProperty("parts.btn.sort")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSort(); } }; actSortByTimestamp = new AbstractAction(strings.getProperty("parts.btn.sortByTimestamp")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSortByTimestamp(); } }; JPanel btnPanel = new JPanel(); GridBagLayout btnPanelLayout = new GridBagLayout(); btnPanel.setLayout(btnPanelLayout); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; int gap = (int)(3 * scaleSupport.getManualScaleX()); gbc.insets = new Insets(gap, gap, gap, gap); gbc.ipadx = 0; gbc.ipady = 0; JButton btnSelectAll = new JButton(actSelectAll); btnPanel.add(btnSelectAll, gbc); gbc.gridx = 1; gbc.gridy = 0; JButton btnDeselectAll = new JButton(actDeselectAll); btnPanel.add(btnDeselectAll, gbc); gbc.gridx = 2; gbc.gridy = 0; JButton btnSort = new JButton(actSort); btnPanel.add(btnSort, gbc); gbc.gridx = 3; gbc.gridy = 0; JButton btnSortByTimestamp = new JButton(actSortByTimestamp); btnPanel.add(btnSortByTimestamp, gbc); gbc.gridx = 4; gbc.gridy = 0; gbc.weightx = 1.; btnPanel.add(Box.createHorizontalGlue(), gbc); add(btnPanel, BorderLayout.SOUTH); } protected void loadPartsInfo(PartsSpecResolver partsSpecResolver) { partsTableModel.clear(); for (PartsCategory partsCategory : partsSpecResolver.getPartsCategories()) { Map partsSpecMap = partsSpecResolver.getPartsSpecMap(partsCategory); for (Map.Entry entry : partsSpecMap.entrySet()) { PartsIdentifier partsIdentifier = entry.getKey(); PartsSpec partsSpec = entry.getValue(); ExportPartsSelectModel model = new ExportPartsSelectModel(partsIdentifier, partsSpec, false); partsTableModel.addRow(model); } } partsTableModel.sort(); } protected void onSelectAll() { partsTableModel.selectAll(); } protected void onDeselectAll() { partsTableModel.deselectAll(); } protected void onSort() { partsTableModel.sort(); if (partsTableModel.getRowCount() > 0) { Rectangle rct = partsTable.getCellRect(0, 0, true); partsTable.scrollRectToVisible(rct); } } protected void onSortByTimestamp() { partsTableModel.sortByTimestamp(); if (partsTableModel.getRowCount() > 0) { Rectangle rct = partsTable.getCellRect(0, 0, true); partsTable.scrollRectToVisible(rct); } } public Map getSelectedParts() { return partsTableModel.getSelectedParts(); } public Map> checkMissingPartsList(Collection partsSets) { return partsTableModel.checkMissingPartsList(partsSets); } public void selectByPartsSet(Collection partsSets) { partsTableModel.selectByPartsSet(partsSets); } public int getSelectedCount() { return partsTableModel.getSelectedCount(); } @Override public void setEnabled(boolean enabled) { partsTable.setEnabled(enabled); partsTableModel.setEnabled(enabled); actSelectAll.setEnabled(enabled); actDeselectAll.setEnabled(enabled); super.setEnabled(enabled); } } interface ExportPresetResolve extends ExportResolverBase { int getSelectedCount(); List getSelectedPresets(); } class ExportPresetSelectPanel extends AbstractImportPanel implements ExportPresetResolve { private static final long serialVersionUID = 1L; private ExportPartsResolver exportPartsResolver; private ExportPresetTableModel presetTableModel; private JTable presetTable; private Action actSelectAll; private Action actDeselectAll; protected ExportPresetSelectPanel( final ExportPartsResolver exportPartsResolver, final ExportInformationResolver exportInfoResolver, Collection partsSets, String defaultPresetId, ScaleSupport scaleSupport) { this.exportPartsResolver = exportPartsResolver; setName("presetSelectPanel"); Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ExportWizardDialog.STRINGS_RESOURCE); setName("choosePartsPanel"); setBorder(BorderFactory.createTitledBorder(strings.getProperty("preset.title"))); setLayout(new BorderLayout()); presetTableModel = new ExportPresetTableModel(); presetTableModel.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { if (e.getType() == TableModelEvent.UPDATE) { fireChangeEvent(); } } }); exportPartsResolver.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { checkMissingParts(); } }); loadPresetInfo(partsSets, defaultPresetId); AppConfig appConfig = AppConfig.getInstance(); final Color warningForegroundColor = appConfig.getExportPresetWarningsForegroundColor(); final Color disabledForeground = appConfig.getDisabledCellForgroundColor(); presetTable = new JTable(presetTableModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component comp = super.prepareRenderer(renderer, row, column); if (comp instanceof JCheckBox) { // BooleanのデフォルトのレンダラーはKCheckBoxを継承したJTable$BooleanRenderer comp.setEnabled(isCellEditable(row, column) && isEnabled()); } ExportPresetModel presetModel = presetTableModel.getRow(row); if (presetModel.isPresetParts()) { comp.setFont(getFont().deriveFont(Font.BOLD)); } else { comp.setFont(getFont()); } if (!isEnabled()) { comp.setForeground(disabledForeground); } else { if (presetModel.isSelected() && presetModel.getMissingPartsIdentifiers().size() > 0) { comp.setForeground(warningForegroundColor); } else { comp.setForeground(getForeground()); } } return comp; } }; presetTable.setShowGrid(true); presetTable.setGridColor(appConfig.getGridColor()); presetTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); // 行の高さをフォントの高さにする presetTable.setRowHeight((int)(presetTable.getFont().getSize() * 1.2)); // 列幅を調整する presetTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); presetTableModel.adjustColumnModel(presetTable.getColumnModel(), scaleSupport.getManualScaleX()); final Action actSelectUsedParts = new AbstractAction( strings.getProperty("preset.popup.selectUsedParts")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { exportUsedParts(); } }; final JPopupMenu popupMenu = new JPopupMenu(); popupMenu.add(actSelectUsedParts); presetTable.setComponentPopupMenu(popupMenu); add(new JScrollPane(presetTable), BorderLayout.CENTER); actSelectAll = new AbstractAction(strings.getProperty("parts.btn.selectAll")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSelectAll(); } }; actDeselectAll = new AbstractAction(strings.getProperty("parts.btn.deselectAll")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onDeselectAll(); } }; Action actSort = new AbstractAction(strings.getProperty("parts.btn.sort")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSort(); } }; JPanel btnPanel = new JPanel(); GridBagLayout btnPanelLayout = new GridBagLayout(); btnPanel.setLayout(btnPanelLayout); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; int gap = (int)(3 * scaleSupport.getManualScaleX()); gbc.insets = new Insets(gap, gap, gap, gap); gbc.ipadx = 0; gbc.ipady = 0; JButton btnSelectAll = new JButton(actSelectAll); btnPanel.add(btnSelectAll, gbc); gbc.gridx = 1; gbc.gridy = 0; JButton btnDeselectAll = new JButton(actDeselectAll); btnPanel.add(btnDeselectAll, gbc); gbc.gridx = 2; gbc.gridy = 0; JButton btnSort = new JButton(actSort); btnPanel.add(btnSort, gbc); gbc.gridx = 3; gbc.gridy = 0; gbc.weightx = 1.; btnPanel.add(Box.createHorizontalGlue(), gbc); add(btnPanel, BorderLayout.SOUTH); } protected void loadPresetInfo(Collection partsSets, String defaultPresetId) { presetTableModel.clear(); for (PartsSet orgPartsSet : partsSets) { PartsSet partsSet = orgPartsSet.clone(); ExportPresetModel model = new ExportPresetModel(partsSet, partsSet.isPresetParts()); presetTableModel.addRow(model); } presetTableModel.setDefaultPresetId(defaultPresetId); presetTableModel.sort(); checkMissingParts(); } public void checkMissingParts() { ArrayList changedPartsSets = new ArrayList(); HashMap partsSetModelMap = new HashMap(); int mx = presetTableModel.getRowCount(); for (int idx = 0; idx < mx; idx++) { ExportPresetModel presetModel = presetTableModel.getRow(idx); PartsSet partsSet = presetModel.getPartsSet(); partsSetModelMap.put(partsSet, presetModel); changedPartsSets.add(partsSet); } Map> missingPartsIdentifiersMap = exportPartsResolver .checkMissingPartsList(changedPartsSets); for (Map.Entry> entry : missingPartsIdentifiersMap.entrySet()) { PartsSet partsSet = entry.getKey(); List missingPartsIdentifiers = entry.getValue(); ExportPresetModel presetModel = partsSetModelMap.get(partsSet); presetModel.setMissingPartsIdentifiers(missingPartsIdentifiers); } if (!missingPartsIdentifiersMap.isEmpty()) { presetTableModel.fireTableDataChanged(); } } protected void onSelectAll() { presetTableModel.selectAll(); } protected void onDeselectAll() { presetTableModel.deselectAll(); } protected void onSort() { presetTableModel.sort(); if (presetTableModel.getRowCount() > 0) { Rectangle rct = presetTable.getCellRect(0, 0, true); presetTable.scrollRectToVisible(rct); } } public List getSelectedPresets() { return presetTableModel.getSelectedPresets(); } protected void exportUsedParts() { ArrayList partsSets = new ArrayList(); int[] selRows = presetTable.getSelectedRows(); for (int selRow : selRows) { ExportPresetModel presetModel = presetTableModel.getRow(selRow); partsSets.add(presetModel.getPartsSet()); } exportPartsResolver.selectByPartsSet(partsSets); } public int getSelectedCount() { return presetTableModel.getSelectedCount(); } public String getDefaultPresetId() { return presetTableModel.getDefaultPresetId(); } @Override public void setEnabled(boolean enabled) { this.presetTable.setEnabled(enabled); this.presetTableModel.setEnabled(enabled); this.actSelectAll.setEnabled(enabled); this.actDeselectAll.setEnabled(enabled); super.setEnabled(enabled); } } class ExportPartsTableModel extends AbstractTableModelWithComboBoxModel { private static final long serialVersionUID = 1L; private static final String[] columnNames; private static final int[] columnWidths; private boolean enabled = true; static { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ExportWizardDialog.STRINGS_RESOURCE); columnNames = new String[] { strings.getProperty("parts.column.selected"), strings.getProperty("parts.column.category"), strings.getProperty("parts.column.name"), strings.getProperty("parts.column.timestamp"), strings.getProperty("parts.column.author"), strings.getProperty("parts.column.version"), }; columnWidths = new int[] { Integer.parseInt(strings.getProperty("parts.column.selected.width")), Integer.parseInt(strings.getProperty("parts.column.category.width")), Integer.parseInt(strings.getProperty("parts.column.name.width")), Integer.parseInt(strings.getProperty("parts.column.timestamp.width")), Integer.parseInt(strings.getProperty("parts.column.author.width")), Integer.parseInt(strings.getProperty("parts.column.version.width")), }; } public void adjustColumnModel(TableColumnModel columnModel, double scale) { for (int idx = 0; idx < columnWidths.length; idx++) { columnModel.getColumn(idx).setPreferredWidth((int)(columnWidths[idx] * scale)); } } public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int column) { return columnNames[column]; } public Object getValueAt(int rowIndex, int columnIndex) { ExportPartsSelectModel partsSelectModel = getRow(rowIndex); switch (columnIndex) { case 0: return Boolean.valueOf(partsSelectModel.isChecked() && enabled); case 1: return partsSelectModel.getPartsCategory().getLocalizedCategoryName(); case 2: return partsSelectModel.getPartsName(); case 3: Timestamp tm = partsSelectModel.getTimestamp(); if (tm != null) { return tm.toString(); } return ""; case 4: return partsSelectModel.getAuthor(); case 5: return partsSelectModel.getVersion(); default: } return ""; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { ExportPartsSelectModel partsSelectModel = getRow(rowIndex); switch (columnIndex) { case 0: partsSelectModel.setChecked(((Boolean) aValue).booleanValue()); break; default: return; } fireTableRowsUpdated(rowIndex, rowIndex); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (columnIndex == 0) { return isEnabled(); } return false; } @Override public Class getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return Boolean.class; case 1: return String.class; case 2: return String.class; case 3: return String.class; default: } return String.class; } public void sort() { Collections.sort(elements); fireTableDataChanged(); } public void sortByTimestamp() { Collections.sort(elements, new Comparator() { public int compare(ExportPartsSelectModel o1, ExportPartsSelectModel o2) { int ret = 0; Timestamp t1 = o1.getTimestamp(); Timestamp t2 = o2.getTimestamp(); if (t1 == null || t2 == null) { if (t1 == null && t2 == null) { ret = 0; } else if (t1 == null) { ret = 1; } else { ret = -1; } } else { ret = t2.compareTo(t1); // 逆順(日付の新しいもの順) } if (ret == 0) { ret = o1.compareTo(o2); } return ret; } }); fireTableDataChanged(); } public void selectAll() { for (ExportPartsSelectModel model : elements) { model.setChecked(true); } fireTableDataChanged(); } public void deselectAll() { for (ExportPartsSelectModel model : elements) { model.setChecked(false); } fireTableDataChanged(); } /** * 選択されているパーツイメージのマップを返す.
* @return 選択されているパーツイメージのマップ */ public Map getSelectedParts() { HashMap selectedPartsMap = new HashMap(); for (ExportPartsSelectModel partsSelectModel : elements) { if (partsSelectModel.isChecked() && isEnabled()) { selectedPartsMap.put(partsSelectModel.getPartsIdentifier(), partsSelectModel.getPartsSpec()); } } return selectedPartsMap; } /** * パーツセットのコレクションを指定し、パーツセットの各パーツがすべてエクスポート対象になっているものだけを返す.
* @param partsSets パーツセットのリスト * @return 不足しているパーツセットと、その不足しているパーツリストを返す. */ public Map> checkMissingPartsList(Collection partsSets) { if (partsSets == null) { throw new IllegalArgumentException(); } Map selectedPartsMap = getSelectedParts(); HashMap> missingPartsMap = new HashMap>(); for (PartsSet partsSet : partsSets) { ArrayList missingPartss = new ArrayList(); for (List partsIdentifiers : partsSet.values()) { for (PartsIdentifier requirePartsIdentifier : partsIdentifiers) { if (!selectedPartsMap.containsKey(requirePartsIdentifier)) { missingPartss.add(requirePartsIdentifier); } } } Collections.sort(missingPartss); missingPartsMap.put(partsSet, missingPartss); } return missingPartsMap; } /** * パーツセットで使用されているパーツを選択状態にする. * @param partsSet パーツセットのコレクション */ public void selectByPartsSet(Collection partsSets) { if (partsSets == null) { throw new IllegalArgumentException(); } HashSet requirePartsIdentifiers = new HashSet(); for (PartsSet partsSet : partsSets) { for (List partsIdentifiers : partsSet.values()) { for (PartsIdentifier partsIdentifier : partsIdentifiers) { requirePartsIdentifiers.add(partsIdentifier); } } } for (ExportPartsSelectModel partsSelectModel : elements) { if (requirePartsIdentifiers.contains(partsSelectModel.getPartsIdentifier())) { partsSelectModel.setChecked(true); } } fireTableDataChanged(); } /** * 選択されているパーツ数を返す. * @return パーツ数 */ public int getSelectedCount() { int count = 0; for (ExportPartsSelectModel partsSelectModel : elements) { if (partsSelectModel.isChecked() && isEnabled()) { count++; } } return count; } public void setEnabled(boolean enabled) { if (this.enabled != enabled) { this.enabled = enabled; fireTableDataChanged(); } } public boolean isEnabled() { return enabled; } public void setCheck(int[] selRows, boolean checked) { if (selRows == null || selRows.length == 0) { return; } Arrays.sort(selRows); for (int selRow : selRows) { ExportPartsSelectModel rowModel = getRow(selRow); rowModel.setChecked(checked); } fireTableRowsUpdated(selRows[0], selRows[selRows.length - 1]); } } class ExportPartsSelectModel implements Comparable { private boolean checked; private PartsIdentifier partsIdentifier; private PartsSpec partsSpec; private Timestamp timestamp; public ExportPartsSelectModel(PartsIdentifier partsIdentifier, PartsSpec partsSpec, boolean selected) { if (partsIdentifier == null || partsSpec == null) { throw new IllegalArgumentException(); } this.partsIdentifier = partsIdentifier; this.partsSpec = partsSpec; this.checked = selected; long maxLastModified = partsSpec.getPartsFiles().lastModified(); if (maxLastModified > 0) { timestamp = new Timestamp(maxLastModified); } else { timestamp = null; } } @Override public int hashCode() { return partsIdentifier.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof ExportPartsSelectModel) { ExportPartsSelectModel o = (ExportPartsSelectModel) obj; return partsIdentifier.equals(o.partsIdentifier); } return false; } public int compareTo(ExportPartsSelectModel o) { int ret = (checked ? 0 : 1) - (o.checked ? 0 : 1); // 逆順 if (ret == 0) { ret = partsIdentifier.compareTo(o.partsIdentifier); } return ret; } public PartsIdentifier getPartsIdentifier() { return this.partsIdentifier; } public PartsSpec getPartsSpec() { return this.partsSpec; } public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } public PartsCategory getPartsCategory() { return this.partsIdentifier.getPartsCategory(); } public String getPartsName() { return this.partsIdentifier.getLocalizedPartsName(); } public Timestamp getTimestamp() { return timestamp == null ? null : (Timestamp) timestamp.clone(); } public String getAuthor() { return partsSpec.getAuthor(); } public String getVersion() { double version = partsSpec.getVersion(); if (version <= 0) { return ""; } return Double.toString(version); } } class ExportPresetTableModel extends AbstractTableModelWithComboBoxModel { private static final long serialVersionUID = 1L; private static final String[] columnNames; private static final int[] columnWidths; private boolean enabled = true; static { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(ExportWizardDialog.STRINGS_RESOURCE); columnNames = new String[] { strings.getProperty("preset.column.selected"), strings.getProperty("preset.column.default"), strings.getProperty("preset.column.name"), strings.getProperty("preset.column.missingparts"), }; columnWidths = new int[] { Integer.parseInt(strings.getProperty("preset.column.selected.width")), Integer.parseInt(strings.getProperty("preset.column.default.width")), Integer.parseInt(strings.getProperty("preset.column.name.width")), Integer.parseInt(strings.getProperty("preset.column.missingparts.width")), }; } private String defaultPresetId; public void adjustColumnModel(TableColumnModel columnModel, double scale) { for (int idx = 0; idx < columnWidths.length; idx++) { columnModel.getColumn(idx).setPreferredWidth((int)(columnWidths[idx] * scale)); } } public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int column) { return columnNames[column]; } public Object getValueAt(int rowIndex, int columnIndex) { ExportPresetModel presetModel = getRow(rowIndex); switch (columnIndex) { case 0: return Boolean.valueOf(presetModel.isSelected() && isEnabled()); case 1: return Boolean.valueOf(presetModel.getPartsSet().getPartsSetId().equals(defaultPresetId) && isEnabled()); case 2: return presetModel.getPartsSetName(); case 3: StringBuilder buf = new StringBuilder(); for (PartsIdentifier partsIdentifier : presetModel.getMissingPartsIdentifiers()) { if (buf.length() > 0) { buf.append(", "); } buf.append(partsIdentifier.getLocalizedPartsName()); } return buf.toString(); default: } return ""; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { ExportPresetModel presetModel = getRow(rowIndex); switch (columnIndex) { case 0: if (((Boolean) aValue).booleanValue()) { presetModel.setSelected(true); } else { presetModel.setSelected(false); if (presetModel.getPartsSet().getPartsSetId().equals(defaultPresetId)) { // 選択解除したものが既定のパーツセットであった場合、既定も解除する. defaultPresetId = null; fireTableRowsUpdated(rowIndex, rowIndex); return; } } break; case 1: if (((Boolean) aValue).booleanValue()) { defaultPresetId = presetModel.getPartsSet().getPartsSetId(); presetModel.setSelected(true); // 既定のパーツセットにした場合は自動的にエクスポート対象にもする。 fireTableDataChanged(); return; } default: return; } fireTableRowsUpdated(rowIndex, rowIndex); } @Override public Class getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return Boolean.class; case 1: return Boolean.class; case 2: return String.class; case 3: return String.class; default: } return String.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (columnIndex == 0 || columnIndex == 1) { return isEnabled(); } return false; } public void sort() { Collections.sort(elements); fireTableDataChanged(); } public void selectAll() { for (ExportPresetModel model : elements) { model.setSelected(true); } fireTableDataChanged(); } public void deselectAll() { for (ExportPresetModel model : elements) { model.setSelected(false); } fireTableDataChanged(); } /** * 選択されているパーツセットのリストを返す.
* なにもなければ空.
* @return 選択されているパーツセットのリスト */ public List getSelectedPresets() { ArrayList partsSets = new ArrayList(); for (ExportPresetModel presetModel : elements) { if (presetModel.isSelected() && isEnabled()) { PartsSet partsSet = presetModel.getPartsSet().clone(); partsSet.setPresetParts(true); partsSets.add(partsSet); } } return partsSets; } public int getSelectedCount() { int count = 0; for (ExportPresetModel presetModel : elements) { if (presetModel.isSelected() && isEnabled()) { count++; } } return count; } public String getDefaultPresetId() { return defaultPresetId; } /** * デフォルトのプリセットを設定する.
* @param defaultPresetId */ public void setDefaultPresetId(String defaultPresetId) { this.defaultPresetId = defaultPresetId; } public void setEnabled(boolean enabled) { if (this.enabled != enabled) { this.enabled = enabled; fireTableDataChanged(); } } public boolean isEnabled() { return enabled; } } class ExportPresetModel implements Comparable { private boolean selected; private PartsSet partsSet; private List missingPartsIdentifiers; public ExportPresetModel(PartsSet partsSet, boolean selected) { if (partsSet == null) { throw new IllegalArgumentException(); } this.partsSet = partsSet; this.selected = selected; } @Override public int hashCode() { return partsSet.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof ExportPresetModel) { ExportPresetModel o = (ExportPresetModel) obj; return partsSet.equals(o.partsSet); } return false; } public int compareTo(ExportPresetModel o) { int ret = (selected ? 0 : 1) - (o.selected ? 0 : 1); if (ret == 0) { ret = getPartsSetName().compareTo(o.getPartsSetName()); } return ret; } public String getPartsSetName() { String name = partsSet.getLocalizedName(); return name == null ? "" : name; } public boolean isPresetParts() { return partsSet.isPresetParts(); } public boolean isSelected() { return selected; } public void setSelected(boolean selected) { this.selected = selected; } public PartsSet getPartsSet() { return partsSet; } public void setMissingPartsIdentifiers( List missingPartsIdentifiers) { this.missingPartsIdentifiers = Collections.unmodifiableList(missingPartsIdentifiers); } public List getMissingPartsIdentifiers() { if (missingPartsIdentifiers == null) { return Collections.emptyList(); } return missingPartsIdentifiers; } } CharacterManaJ/src/main/java/charactermanaj/ui/SearchPartsDialog.java0000644000175000017500000003530613615720000026010 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.WeakHashMap; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.table.TableColumnModel; import charactermanaj.model.AppConfig; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSpec; import charactermanaj.model.PartsSpecResolver; import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel; import charactermanaj.ui.model.PartsSelectionManager; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.LocalizedResourcePropertyLoader; public class SearchPartsDialog extends JDialog { private static final long serialVersionUID = 1L; private static final WeakHashMap ALL_DIALOGS = new WeakHashMap(); protected static final String STRINGS_RESOURCE = "languages/searchpartsdialog"; private PartsSpecResolver partsSpecResolver; private PartsSelectionManager partsSelectionManager; private JTable searchPartsTable; private SearchPartsTableModel searchPartsTableModel; private JTextField txtPartsName; private JComboBox cmbAuthors; private JComboBox cmbCategories; public static SearchPartsDialog[] getDialogs() { return ALL_DIALOGS.keySet().toArray(new SearchPartsDialog[ALL_DIALOGS.size()]); } public SearchPartsDialog(JFrame parent, PartsSpecResolver partsSpecResolver, PartsSelectionManager partsSelectionManager) { super(parent, false); if (partsSpecResolver == null) { throw new IllegalArgumentException(); } this.partsSpecResolver = partsSpecResolver; this.partsSelectionManager = partsSelectionManager; setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClose(); } }); Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); setTitle(strings.getProperty("title")); // モデル searchPartsTableModel = new SearchPartsTableModel(); // 検索条件パネル JPanel searchCondPanel = new JPanel(); GridBagLayout searchCondPanelLayout = new GridBagLayout(); searchCondPanel.setLayout(searchCondPanelLayout); GridBagConstraints gbc = new GridBagConstraints(); searchCondPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(5, 5, 5, 5), BorderFactory .createTitledBorder(strings.getProperty("search.condition")))); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; gbc.ipadx = 0; gbc.ipady = 0; gbc.insets = new Insets(3, 3, 3, 3); gbc.weightx = 0.; gbc.weighty = 0.; searchCondPanel.add(new JLabel(strings.getProperty("partsname"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 0; gbc.weightx = 1.; txtPartsName = new JTextField(); searchCondPanel.add(txtPartsName, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 1; gbc.weightx = 0.; searchCondPanel.add(new JLabel(strings.getProperty("author"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 1; gbc.gridwidth = 2; gbc.weightx = 1.; ArrayList authors = new ArrayList(); authors.add(""); authors.addAll(getAuthors(partsSpecResolver)); cmbAuthors = new JComboBox(authors.toArray(new String[authors.size()])); searchCondPanel.add(cmbAuthors, gbc); gbc.gridx = 0; gbc.gridy = 2; gbc.gridwidth = 1; gbc.weightx = 0.; searchCondPanel.add(new JLabel(strings.getProperty("partscategory"), JLabel.RIGHT), gbc); gbc.gridx = 1; gbc.gridy = 2; gbc.gridwidth = 2; gbc.weightx = 1.; ArrayList categories = new ArrayList(); categories.add(null); categories.addAll(partsSpecResolver.getPartsCategories()); cmbCategories = new JComboBox(categories.toArray(new PartsCategory[categories.size()])); searchCondPanel.add(cmbCategories, gbc); gbc.gridx = 2; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 1.; gbc.anchor = GridBagConstraints.SOUTH; gbc.fill = GridBagConstraints.HORIZONTAL; JButton btnClear = new JButton(new AbstractAction(strings.getProperty("clear")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { txtPartsName.setText(""); } }); searchCondPanel.add(btnClear, gbc); // 検索結果 JPanel searchResult = new JPanel(new BorderLayout()); searchResult.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(0, 5, 0, 5), BorderFactory .createTitledBorder(strings.getProperty("results")))); searchPartsTable = new JTable(searchPartsTableModel); searchPartsTable.setShowGrid(true); searchPartsTable.setGridColor(AppConfig.getInstance().getGridColor()); // 行の高さをフォントの高さにする searchPartsTable.setRowHeight((int)(searchPartsTable.getFont().getSize() * 1.2)); JScrollPane searchPartsTableSP = new JScrollPane(searchPartsTable); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); searchPartsTableModel.adjustColumnModel(searchPartsTable.getColumnModel(), scaleSupport.getManualScaleX()); searchResult.add(searchPartsTableSP, BorderLayout.CENTER); searchPartsTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { // ダブルクリック // 正確に2回 onSelect(); } } }); // テーブルのキーイベント ActionMap tblAm = searchPartsTable.getActionMap(); InputMap tblIm = searchPartsTable.getInputMap(); tblIm.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "onSelect"); tblAm.put("onSelect", new AbstractAction() { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSelect(); } }); JPanel btnPanel = new JPanel(); btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 10)); GridBagLayout btnPanelLayout = new GridBagLayout(); btnPanel.setLayout(btnPanelLayout); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.BOTH; gbc.ipadx = 0; gbc.ipady = 0; gbc.insets = new Insets(3, 3, 3, 3); gbc.weightx = 1.; gbc.weighty = 0.; btnPanel.add(Box.createHorizontalGlue(), gbc); gbc.gridx = 1; gbc.gridy = 0; gbc.weightx = 0.; JButton btnSelect = new JButton(new AbstractAction(strings.getProperty("select")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSelect(); } }); btnPanel.add(btnSelect, gbc); searchResult.add(btnPanel, BorderLayout.SOUTH); // 検索条件の入力が変更されたことを検知するリスナの登録 txtPartsName.getDocument().addDocumentListener(new DocumentListener() { public void removeUpdate(DocumentEvent e) { onChangeCondition(); } public void insertUpdate(DocumentEvent e) { onChangeCondition(); } public void changedUpdate(DocumentEvent e) { onChangeCondition(); } }); ActionListener changeListener = new ActionListener() { public void actionPerformed(ActionEvent e) { onChangeCondition(); } }; cmbAuthors.addActionListener(changeListener); cmbCategories.addActionListener(changeListener); // ESCキーとCTRL-Wで閉じる. Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeSearchDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeSearchDialog"); am.put("closeSearchDialog", new AbstractAction() { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onClose(); } }); // ウィンドウがアクティブになったときに検索フィールドにフォーカスをあてる addWindowFocusListener(new WindowAdapter() { public void windowGainedFocus(WindowEvent e) { txtPartsName.requestFocusInWindow(); } }); // 画面の設定 Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(searchCondPanel, BorderLayout.NORTH); contentPane.add(searchResult, BorderLayout.CENTER); Dimension dim = new Dimension(250, 300); // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する dim = scaleSupport.manualScaled(dim); setSize(dim); setLocationRelativeTo(parent); // ダイアログの登録 ALL_DIALOGS.put(this, null); } public List getAuthors(PartsSpecResolver partsSpecResolver) { if (partsSpecResolver == null) { throw new IllegalArgumentException(); } HashSet authorsSet = new HashSet(); for (PartsCategory category : partsSpecResolver.getPartsCategories()) { for (Map.Entry entry : partsSpecResolver.getPartsSpecMap(category).entrySet()) { PartsSpec partsSpec = entry.getValue(); String author = partsSpec.getAuthor(); if (author != null) { authorsSet.add(author); } } } ArrayList authors = new ArrayList(authorsSet); Collections.sort(authors); return authors; } protected void onClose() { dispose(); } /** * 「選択」ボタンまたはテーブルのダブルクリックのハンドラ.
* 選択されている行のパーツ識別子をもとに、パーツにフォーカスをあてる.
*/ protected void onSelect() { int selRow = searchPartsTable.getSelectedRow(); if (selRow >= 0) { Map.Entry entry = searchPartsTableModel.getRow(selRow); PartsIdentifier partsIdentifier = entry.getKey(); partsSelectionManager.setSelection(partsIdentifier); } } protected void onChangeCondition() { String partsNamesRaw = txtPartsName.getText(); partsNamesRaw = partsNamesRaw.replace(" ", " "); // 全角空白を半角に変換 String[] condPartsNames = partsNamesRaw.split("\\s+"); PartsCategory condPartsCategory = (PartsCategory) cmbCategories.getSelectedItem(); String condAuthor = (String) cmbAuthors.getSelectedItem(); if (condAuthor != null && condAuthor.trim().length() == 0) { condAuthor = null; } ArrayList> partsIdentifiers = new ArrayList>(); for (PartsCategory partsCategory : partsSpecResolver.getPartsCategories()) { if (condPartsCategory != null && !condPartsCategory.equals(partsCategory)) { continue; } for (Map.Entry entry : partsSpecResolver.getPartsSpecMap(partsCategory).entrySet()) { PartsIdentifier partsIdentifier = entry.getKey(); PartsSpec partsSpec = entry.getValue(); if (condAuthor != null) { String author = partsSpec.getAuthor(); if (author == null || !author.equals(condAuthor)) { continue; } } String localizedPartsName = partsIdentifier.getLocalizedPartsName(); if (localizedPartsName != null) { for (String condPartsName : condPartsNames) { if (localizedPartsName.indexOf(condPartsName) >= 0) { partsIdentifiers.add(entry); continue; } } } } } Collections.sort(partsIdentifiers, new Comparator>() { public int compare(Entry o1, Entry o2) { PartsIdentifier partsIdentifier1 = o1.getKey(); PartsIdentifier partsIdentifier2 = o2.getKey(); return partsIdentifier1.compareTo(partsIdentifier2); } }); searchPartsTableModel.initModel(partsIdentifiers); } } class SearchPartsTableModel extends AbstractTableModelWithComboBoxModel> { private static final long serialVersionUID = 1L; private static final String[] COLUMN_NAMES; private static final int[] COLUMN_WIDTHS; static { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(SearchPartsDialog.STRINGS_RESOURCE); COLUMN_NAMES = new String[] { strings.getProperty("column.partsname"), strings.getProperty("column.category"), strings.getProperty("column.author"), }; COLUMN_WIDTHS = new int[] { Integer.parseInt(strings.getProperty("column.partsname.width")), Integer.parseInt(strings.getProperty("column.category.width")), Integer.parseInt(strings.getProperty("column.author.width")), }; } public void adjustColumnModel(TableColumnModel columnModel, double scale) { for (int idx = 0; idx < COLUMN_WIDTHS.length; idx++) { columnModel.getColumn(idx).setPreferredWidth((int)(COLUMN_WIDTHS[idx] * scale)); } } public int getColumnCount() { return COLUMN_NAMES.length; } @Override public String getColumnName(int column) { return COLUMN_NAMES[column]; } public Object getValueAt(int rowIndex, int columnIndex) { Map.Entry row = getRow(rowIndex); PartsIdentifier partsIdentifier = row.getKey(); PartsSpec partsSpec = row.getValue(); switch (columnIndex) { case 0: return partsIdentifier.getLocalizedPartsName(); case 1: return partsIdentifier.getPartsCategory().getLocalizedCategoryName(); case 2: return partsSpec.getAuthor(); } return ""; } public void initModel(List> partsIdentifiers) { clear(); if (partsIdentifiers != null) { for (Map.Entry entry : partsIdentifiers) { addRow(entry); } } } } CharacterManaJ/src/main/java/charactermanaj/ui/AppConfigDialog.java0000644000175000017500000010113713615720000025433 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.AbstractCellEditor; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JColorChooser; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import javax.swing.border.Border; import javax.swing.border.LineBorder; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import charactermanaj.Main; import charactermanaj.model.AppConfig; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.BeanPropertiesUtilities; import charactermanaj.util.BeanPropertiesUtilities.PropertyAccessor; import charactermanaj.util.BeanPropertiesUtilities.PropertyAccessorMap; import charactermanaj.util.ConfigurationDirUtilities; import charactermanaj.util.DesktopUtilities; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.LocalizedResourcePropertyLoader; import charactermanaj.util.SetupLocalization; /** * アプリケーション設定ダイアログ * * @author seraphy */ public class AppConfigDialog extends JDialog { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(AppConfigDialog.class.getName()); private AppConfigTableModel appConfigTableModel; private JTable appConfigTable; private JCheckBox chkResetDoNotAskAgain; private RecentCharactersDir recentCharactersDir; private AbstractAction actApply; private boolean orgDoNotAskAgain; public enum ColumnDef { NAME("column.key", String.class, false) { @Override public Object getValue(AppConfigRow row) { return row.getDisplayName(); } }, VALUE("column.value", String.class, true) { @Override public Object getValue(AppConfigRow row) { return row.getValue(); } @Override public void setValue(AppConfigRow row, Object value) { row.setValue(value); } }; private final String reskey; private final Class type; private final boolean editable; ColumnDef(String reskey, Class type, boolean editable) { this.reskey = reskey; this.type = type; this.editable = editable; } public boolean isEditable() { return editable; } public String getResourceKey() { return reskey; } public Class getType() { return type; } public abstract Object getValue(AppConfigRow row); public void setValue(AppConfigRow row, Object value) { throw new UnsupportedOperationException(name()); } } private static class AppConfigRow { private final String name; private final PropertyAccessor accessor; private String order = ""; private String displayName; private Object orgValue; private Object value; private boolean rejected; public AppConfigRow(String name, PropertyAccessor accessor, Object value) { this.name = name; this.accessor = accessor; this.value = value; this.orgValue = value; } public String getName() { return name; } public Class getPropertyType() { Class dataType = accessor.getPropertyType(); // JTableのセルレンダラーではプリミティブ型の編集は対応していないので // ラッパー型に置き換える if (dataType.isPrimitive()) { if (dataType.equals(int.class)) { dataType = Integer.class; } else if (dataType.equals(long.class)) { dataType = Long.class; } else if (dataType.equals(float.class)) { dataType = Float.class; } else if (dataType.equals(double.class)) { dataType = Double.class; } else if (dataType.equals(boolean.class)) { dataType = Boolean.class; } } return dataType; } public String getOrder() { return order; } public void setOrder(String order) { if (order == null) { order = ""; } this.order = order; } public String getDisplayName() { return (displayName == null || displayName.length() == 0) ? name : displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } public boolean isRejected() { return rejected; } public void setRejected(boolean rejected) { this.rejected = rejected; } public boolean isModified() { return orgValue == null ? value != null : !orgValue.equals(value); } } private static class AppConfigTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; protected static final ColumnDef[] COLUMNS = ColumnDef.values(); private List items = Collections.emptyList(); public List getItems() { return items; } public void setItems(List items) { if (items == null) { items = Collections.emptyList(); } this.items = items; fireTableDataChanged(); } public void setRejectNames(Set rejectNames) { if (rejectNames == null) { rejectNames = Collections.emptySet(); } for (AppConfigRow item : items) { String key = item.getName(); boolean rejected = rejectNames.contains(key); item.setRejected(rejected); } fireTableDataChanged(); } /** * 編集されているか? * * @return 編集されていればtrue、そうでなければfalse */ public boolean isModified() { for (AppConfigRow rowItem : items) { if (rowItem.isModified()) { return true; } } return false; } @Override public int getRowCount() { return items.size(); } public int getColumnCount() { return COLUMNS.length; } @Override public Class getColumnClass(int columnIndex) { return COLUMNS[columnIndex].getType(); } @Override public String getColumnName(int column) { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/appconfigdialog"); String reskey = COLUMNS[column].getResourceKey(); return strings.getProperty(reskey, reskey); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return COLUMNS[columnIndex].isEditable(); } public Object getValueAt(int rowIndex, int columnIndex) { AppConfigRow row = items.get(rowIndex); return COLUMNS[columnIndex].getValue(row); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { AppConfigRow row = items.get(rowIndex); COLUMNS[columnIndex].setValue(row, aValue); fireTableRowsUpdated(rowIndex, rowIndex); } public void adjustColumnModel(TableColumnModel columnModel, double scale) { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/appconfigdialog"); int mx = columnModel.getColumnCount(); for (int idx = 0; idx < mx; idx++) { String reskey = COLUMNS[idx].getResourceKey() + ".width"; int width = Integer.parseInt(strings.getProperty(reskey)); columnModel.getColumn(idx).setPreferredWidth((int)(width * scale)); } } } public AppConfigDialog(JFrame parent) { super(parent, true); try { setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClose(); } }); initComponent(); loadData(); } catch (RuntimeException ex) { logger.log(Level.SEVERE, "appConfig construct failed.", ex); dispose(); throw ex; } } private void initComponent() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/appconfigdialog"); setTitle(strings.getProperty("title")); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); // buttons JPanel btnPanel = new JPanel(); btnPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 45)); GridBagLayout btnPanelLayout = new GridBagLayout(); btnPanel.setLayout(btnPanelLayout); GridBagConstraints gbc = new GridBagConstraints(); actApply = new AbstractAction(strings.getProperty("btn.apply")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onUpdate(); } }; Action actCancel = new AbstractAction(strings.getProperty("btn.cancel")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onClose(); } }; Action actLocalization = new AbstractAction(strings.getProperty("btn.setupLocalization")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSetupLocalization(); } }; Action actResetSettings = new AbstractAction(strings.getProperty("btn.resetSettingsToDefault")) { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onResetSettings(); } }; Box pnlButtons = Box.createHorizontalBox(); pnlButtons.add(new JButton(actLocalization)); pnlButtons.add(new JButton(actResetSettings)); chkResetDoNotAskAgain = new JCheckBox(strings.getProperty("chk.askForCharactersDir")); chkResetDoNotAskAgain.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 保存ボタンの状態更新のため updateUIState(); } }); gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 3; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.NONE; gbc.insets = new Insets(0, 0, 0, 0); gbc.ipadx = 0; gbc.ipady = 0; gbc.weightx = 1.; gbc.weighty = 0.; btnPanel.add(chkResetDoNotAskAgain, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.gridheight = 1; gbc.gridwidth = 3; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.NONE; gbc.insets = new Insets(3, 3, 3, 3); gbc.ipadx = 0; gbc.ipady = 0; gbc.weightx = 1.; gbc.weighty = 0.; btnPanel.add(pnlButtons, gbc); gbc.gridx = 0; gbc.gridy = 2; gbc.gridheight = 1; gbc.gridwidth = 1; gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1.; gbc.weighty = 0.; btnPanel.add(Box.createHorizontalGlue(), gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 2 : 1; gbc.weightx = 0.; JButton btnApply = new JButton(actApply); btnPanel.add(btnApply, gbc); gbc.gridx = Main.isLinuxOrMacOSX() ? 1 : 2; gbc.weightx = 0.; JButton btnCancel = new JButton(actCancel); btnPanel.add(btnCancel, gbc); add(btnPanel, BorderLayout.SOUTH); Dimension dim = new Dimension(600, 400); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); if (scaleSupport != null) { // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する dim = scaleSupport.manualScaled(dim); } setSize(dim); setLocationRelativeTo(getParent()); // Notes JLabel lblCaution = new JLabel(strings.getProperty("caution"), JLabel.CENTER); lblCaution.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); lblCaution.setForeground(Color.red); contentPane.add(lblCaution, BorderLayout.NORTH); // Model appConfigTableModel = new AppConfigTableModel(); // JTable AppConfig appConfig = AppConfig.getInstance(); final Color invalidBgColor = appConfig.getInvalidBgColor(); appConfigTable = new JTable(appConfigTableModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component comp = super.prepareRenderer(renderer, row, column); AppConfigRow configRow = appConfigTableModel.getItems().get(row); if (configRow.isRejected()) { // 差し戻された項目は警告色とする comp.setBackground(invalidBgColor); } else { // そうでなければ標準色に戻す if (isCellSelected(row, column)) { comp.setBackground(getSelectionBackground()); } else { comp.setBackground(getBackground()); } } if (configRow.isModified() && !configRow.isRejected()) { // 変更行の色を警告色にする // (ただし、rejectのものは背景色を変えているので何もしない) comp.setForeground(invalidBgColor); } else { // そうでなければ標準色に戻す comp.setForeground(getForeground()); } return comp; } @Override public String getToolTipText(MouseEvent event) { int row = rowAtPoint(event.getPoint()); int col = columnAtPoint(event.getPoint()); if (AppConfigTableModel.COLUMNS[col] == ColumnDef.NAME) { // 最初の列の表示をツールチップとして表示させる int modelRow = convertRowIndexToModel(row); return appConfigTableModel.getItems().get(modelRow).getDisplayName(); } return super.getToolTipText(event); } // 1つの列で複数のデータタイプの編集を可能にする // Jtable with different types of cells depending on data type // https://stackoverflow.com/questions/16970824/jtable-with-different-types-of-cells-depending-on-data-type private Class editingClass; @Override public TableCellRenderer getCellRenderer(int row, int column) { editingClass = null; int modelColumn = convertColumnIndexToModel(column); if (AppConfigTableModel.COLUMNS[modelColumn] == ColumnDef.VALUE) { // VALUE列の場合 int modelRow = convertRowIndexToModel(row); AppConfigRow rowData = appConfigTableModel.getItems().get(modelRow); // 行のデータ型に対応するレンダラーを取得する Class dataType = rowData.getPropertyType(); TableCellRenderer renderer = getDefaultRenderer(dataType); if (renderer != null) { return renderer; } } // VALUE列以外は、標準のまま (もしくはレンダラーがみつからない場合) return super.getCellRenderer(row, column); } @Override public TableCellEditor getCellEditor(int row, int column) { editingClass = null; int modelColumn = convertColumnIndexToModel(column); if (AppConfigTableModel.COLUMNS[modelColumn] == ColumnDef.VALUE) { // VALUE列の場合 int modelRow = convertRowIndexToModel(row); AppConfigRow rowData = appConfigTableModel.getItems().get(modelRow); // 行のデータ型に対応するレンダラーを取得する editingClass = rowData.getPropertyType(); return getDefaultEditor(editingClass); } else { // VALUE列以外は、標準のまま return super.getCellEditor(row, column); } } // This method is also invoked by the editor when the value in the editor // component is saved in the TableModel. The class was saved when the // editor was invoked so the proper class can be created. @Override public Class getColumnClass(int column) { return editingClass != null ? editingClass : super.getColumnClass(column); } }; appConfigTable.setShowGrid(true); appConfigTable.setGridColor(appConfig.getGridColor()); appConfigTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); appConfigTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); appConfigTable.setCellSelectionEnabled(true); // 行の高さをフォントの高さにする appConfigTable.setRowHeight((int)(appConfigTable.getFont().getSize() * 1.2)); // データタイプがColorの場合のセルレンダラーとエディタを設定する appConfigTable.setDefaultRenderer(Color.class, new ColorCellRender()); appConfigTable.setDefaultEditor(Color.class, new ColorCellEditor()); appConfigTableModel.adjustColumnModel(appConfigTable.getColumnModel(), scaleSupport.getManualScaleX()); appConfigTableModel.addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { // テーブルが変更された場合、保存ボタンの活性やReject状態の変更のため updateUIState(); } }); JScrollPane appConfigTableSP = new JScrollPane(appConfigTable); appConfigTableSP.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(0, 3, 0, 3), BorderFactory.createTitledBorder(strings.getProperty("table.caption"))) ); appConfigTableSP.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); contentPane.add(appConfigTableSP, BorderLayout.CENTER); // RootPane Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeAppConfigDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeAppConfigDialog"); am.put("closeAppConfigDialog", actCancel); // 保存ボタンの活性制御 updateUIState(); } /** * 保存ボタンの活性制御とテーブルの編集状態の表示の更新 * (テーブルが編集された場合に更新される) */ protected void updateUIState() { boolean hasModified = false; // テーブルを走査して変更を確認する for (AppConfigRow itemRow : appConfigTableModel.getItems()) { if (itemRow.isModified()) { // 変更あり hasModified = true; } else if (itemRow.isRejected()) { // 変更されていない状態であれば、差し戻し状態を解除する itemRow.setRejected(false); } } // キャラクターデータディレクトリの問い合わせ状態が変わっているか? if (orgDoNotAskAgain != chkResetDoNotAskAgain.isSelected()) { hasModified = true; } // 保存先が無効であれば適用ボタンを有効にしない. AppConfig appConfig = AppConfig.getInstance(); boolean enableSave = !appConfig.getPrioritySaveFileList().isEmpty(); // 保存が有効であり、且つ、変更された行があれば保存ボタンを有効とする actApply.setEnabled(enableSave && hasModified); } private void loadData() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/appconfigdialog"); // AppConfigへのアクセッサを取得する PropertyAccessorMap accessorMap = BeanPropertiesUtilities.getPropertyAccessorMap(AppConfig.class); AppConfig appConfig = AppConfig.getInstance(); accessorMap.setBean(appConfig); List items = new ArrayList(); int fallbackOrder = 1000; for (Map.Entry accessorEntry : accessorMap.entrySet()) { // プロパティ名と現在値を取得する String name = accessorEntry.getKey(); PropertyAccessor accessor = accessorEntry.getValue(); Object value = accessor.getValue(); // リソースからプロパティ名に対応する表示名を取得する(なければプロパティ名のまま) String displayName = strings.getProperty(name, name); int pt = displayName.indexOf(";"); String order = Integer.toString(fallbackOrder++); if (pt > 0) { order = displayName.substring(0, pt); displayName = displayName.substring(pt + 1); } // 行オブジェクト作成 AppConfigRow rowItem = new AppConfigRow(name, accessor, value); rowItem.setDisplayName(displayName); rowItem.setOrder(order); items.add(rowItem); } // 表示順に並べる Collections.sort(items, new Comparator() { @Override public int compare(AppConfigRow o1, AppConfigRow o2) { int ret = o1.getOrder().compareTo(o2.getOrder()); if (ret == 0) { ret = o1.getDisplayName().compareTo(o2.getDisplayName()); } if (ret == 0) { ret = o1.getName().compareTo(o2.getName()); } return ret; } }); appConfigTableModel.setItems(items); // 最後に使ったキャラクターデータディレクトリの自動選択設定 try { recentCharactersDir = RecentCharactersDir.load(); if (recentCharactersDir != null) { File lastUseCharactersDir = recentCharactersDir.getLastUseCharacterDir(); boolean enableLastUseCharacterDir = lastUseCharactersDir != null && lastUseCharactersDir.isDirectory(); boolean doNotAskAgain = enableLastUseCharacterDir && recentCharactersDir.isDoNotAskAgain(); chkResetDoNotAskAgain.setEnabled(enableLastUseCharacterDir); chkResetDoNotAskAgain.setSelected(!doNotAskAgain); } } catch (Exception ex) { recentCharactersDir = null; logger.log(Level.WARNING, "RecentCharactersDir load failed.", ex); } // 初期状態の保存 this.orgDoNotAskAgain = chkResetDoNotAskAgain.isSelected(); } /** * 設定値を初期化する */ protected void onResetSettings() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/appconfigdialog"); if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.resetSettingsToDefault"), strings.getProperty("confirm.close.caption"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.YES_OPTION) { return; } Map defMap = AppConfig.getDefaultProperties(); for (AppConfigRow rowItem : appConfigTableModel.getItems()) { String name = rowItem.getName(); if (defMap.containsKey(name)) { Object value = defMap.get(name); rowItem.setValue(value); } } appConfigTableModel.fireTableDataChanged(); } /** * ローカライズリソースをユーザディレクトリ上に展開する. */ protected void onSetupLocalization() { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/appconfigdialog"); if (JOptionPane.showConfirmDialog(this, strings.getProperty("setupLocalization"), strings.getProperty("confirm.setupLocalization.caption"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE) != JOptionPane.OK_OPTION) { return; } try { File baseDir = ConfigurationDirUtilities.getUserDataDir(); SetupLocalization setup = new SetupLocalization(baseDir); setup.setupToLocal( EnumSet.allOf(SetupLocalization.Resources.class), true); File resourceDir = setup.getResourceDir(); DesktopUtilities.open(resourceDir); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } protected void onClose() { if (appConfigTableModel.isModified()) { Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/appconfigdialog"); if (JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.close"), strings.getProperty("confirm.close.caption"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.YES_OPTION) { return; } } dispose(); } /** * AppConfigと、キャラクターデータディレクトリの起動時の選択有無の設定値を保存する。 */ protected void onUpdate() { if (appConfigTable.isEditing()) { // 編集中ならば許可しない. Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return; } Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("languages/appconfigdialog"); // 編集されたAppConfigの設定値を取得する. (変更のあるもののみ) Map modifiedValues = new HashMap(); for (AppConfigRow rowItem : appConfigTableModel.getItems()) { if (rowItem.isModified()) { String name = rowItem.getName(); Object value = rowItem.getValue(); modifiedValues.put(name, value); } } // キャラクターデータディレクトリの起動時の選択状態の変更状態 boolean updateRecentCharactersDir = (orgDoNotAskAgain != chkResetDoNotAskAgain.isSelected()); if (!updateRecentCharactersDir && modifiedValues.isEmpty()) { // 変更点がないので何もしない return; } // AppConfigの保存 if (!modifiedValues.isEmpty()) { // 編集されたプロパティが適用可能か検証する. Set rejectNames = AppConfig.checkProperties(modifiedValues); if (!rejectNames.isEmpty()) { // エラーがある場合 appConfigTableModel.setRejectNames(rejectNames); JOptionPane.showMessageDialog(this, strings.getProperty("error.message"), strings.getProperty("error.caption"), JOptionPane.ERROR_MESSAGE); return; } try { // アプリケーション設定を更新し、保存する. AppConfig appConfig = AppConfig.getInstance(); appConfig.update(modifiedValues); appConfig.saveConfig(); } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); return; } } // キャラクターデータディレクトリの起動時の選択の保存 if (updateRecentCharactersDir) { try { if (chkResetDoNotAskAgain.isEnabled()) { boolean doNotAskAgain = !chkResetDoNotAskAgain.isSelected(); if (doNotAskAgain != recentCharactersDir.isDoNotAskAgain()) { recentCharactersDir.setDoNotAskAgain(doNotAskAgain); recentCharactersDir.saveRecents(); } } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); return; } } // アプリケーションの再起動が必要なことを示すダイアログを表示する. String message = strings.getProperty("caution"); JOptionPane.showMessageDialog(this, message); dispose(); } } /** * カラーセル */ class ColorCell extends JPanel { private static final long serialVersionUID = 1L; private String title = "Color"; private JPanel box; private JLabel label; private JButton button; private ActionListener actionListener; public ColorCell() { this(null); } /** * ボタンのアクションリスナを指定して構築する * @param actionListener */ public ColorCell(ActionListener actionListener) { super(new BorderLayout()); this.actionListener = actionListener; box = new JPanel(new BorderLayout()); label = new JLabel(); label.setHorizontalAlignment(SwingConstants.CENTER); box.add(label, BorderLayout.CENTER); AbstractAction actColorChoose = new AbstractAction() { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { onClick(e); } }; button = new JButton(actColorChoose); Dimension dim = button.getPreferredSize(); dim.width = 24; button.setPreferredSize(dim); add(box, BorderLayout.CENTER); add(button, BorderLayout.EAST); setSelectedColor(Color.BLACK); // ボックスのダブルクリックで、ボタンクリックと同じ動きとする box.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { onClick(null); e.consume(); } } }); // このセルのスペースキー押下で、ボタンクリックと同じ動きとする InputMap im = getInputMap(WHEN_FOCUSED); im.put(KeyStroke.getKeyStroke(' '), "ON_CLICK_COLOR_CHOOSER"); ActionMap am = getActionMap(); am.put("ON_CLICK_COLOR_CHOOSER", actColorChoose); setMinimumSize(new Dimension(50, 30)); } public String getTitle() { return title; } public void setTitle(String title) { String old = this.title; if (old == null ? title != null : !old.equals(title)) { this.title = title; firePropertyChange("title", old, title); } } public Border getBoxBorder() { return box.getBorder(); } public void setBoxBorder(Border border) { box.setBorder(border); } public void onClick(ActionEvent e) { // ※ カラー選択ダイアログは、Java7以降でないとアルファ値の設定はできない。 // Java6で実行するとアルファチャネルが消されたものになる。 // (設定ファイルとしては手作業では設定可能なので、とりあえず、このまま。) Color selColor = JColorChooser.showDialog(ColorCell.this, title, selectedColor); if (selColor != null) { setSelectedColor(selColor); if (actionListener != null) { actionListener.actionPerformed(e); } } } private Color bgColor = Color.WHITE; private Color selectedColor; public Color getSelectedColor() { return selectedColor; } public void setSelectedColor(Color color) { Color old = this.selectedColor; if (old == null ? color != null : !old.equals(color)) { this.selectedColor = color; // nullの場合は黒と見なして処理をつづける // (プロパティにはnullを格納したまま) boolean dummyColor = false; if (color == null) { color = Color.BLACK; dummyColor = true; } // テキスト色は塗りつぶし色と反転色にする (同系で重なりにくくするため) Color colorForeground = new Color(color.getRGB() ^ 0xffffff).brighter(); int alpha = color.getAlpha(); // JPanelの背景色としてアルファの透過色をそのまま使うと // 親コンポーネントの背景色と混じり、色のカタログとして用をなさないので // 固定された背景色(たとえば白)と予め合成済みに補正しておく // (アルファが255の場合は合成する必要はない) Color premultipliedColor; if (alpha == 255) { premultipliedColor = color; } else { float[] rgb = color.getRGBColorComponents(null); float[] bgRgb = bgColor.getRGBColorComponents(null); // 背景色 // アルファを合成済みにする float a = ((float) alpha) / 255f; rgb[0] = rgb[0] * a + bgRgb[0] * (1 - a); rgb[1] = rgb[1] * a + bgRgb[1] * (1 - a); rgb[2] = rgb[2] * a + bgRgb[2] * (1 - a); premultipliedColor = new Color(rgb[0], rgb[1], rgb[2]); } box.setBackground(premultipliedColor); label.setForeground(colorForeground); String msg; if (dummyColor) { // NULLの場合はテキストは表示しない msg = ""; } else if (alpha != 255) { // アルファが255以外の場合はアルファ値も含めてARGBで表示する msg = String.format("#%08X", ((long) color.getRGB()) & 0xffffffffL); } else { // アルファが255の場合はRGBのみ表示する。 msg = String.format("#%06X", ((long) color.getRGB()) & 0xffffffL); } label.setText(msg); firePropertyChange("selectedColor", old, color); } } } /** * カラーセルのレンダラー * 参考: https://github.com/haifengl/smile/blob/master/plot/src/main/java/smile/swing/table/ButtonCellRenderer.java */ class ColorCellRender extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; private ColorCell colorCell = new ColorCell(); @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Color color = (Color) value; colorCell.setSelectedColor(color); LineBorder focusedBorder = null; if (hasFocus) { // フォーカスがある場合はボーダーをつける Color colorBorder = Color.CYAN; focusedBorder = new LineBorder(colorBorder, 2); } colorCell.setBoxBorder(focusedBorder); return colorCell; } } /** * カラーセルを編集モードにした場合のエディタ */ class ColorCellEditor extends AbstractCellEditor implements TableCellEditor { private static final long serialVersionUID = 1L; private Border focusedBorder = BorderFactory.createLineBorder(Color.WHITE, 2); private ColorCell colorCell = new ColorCell(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { fireEditingStopped(); } }); public Component getTableCellEditorComponent(final JTable table, final Object value, final boolean isSelected, final int row, final int column) { colorCell.setSelectedColor((Color) value); colorCell.setBoxBorder(focusedBorder); // 編集中はボーターをつける return colorCell; } public Object getCellEditorValue() { return colorCell.getSelectedColor(); } } CharacterManaJ/src/main/java/charactermanaj/ui/MenuDataFactory.java0000644000175000017500000000560113615720000025472 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.event.ActionListener; import java.util.AbstractCollection; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Properties; public class MenuDataFactory extends AbstractCollection { private String name; private boolean checkbox; private ActionListener actionListener; private MenuDataFactory[] factories; public MenuDataFactory(String name) { this(name, false, null, null); } public MenuDataFactory(String name, MenuDataFactory[] factories) { this(name, false, null, factories); } public MenuDataFactory(String name, ActionListener actionListener) { this(name, false, actionListener, null); } public MenuDataFactory(String name, boolean checkbox, ActionListener actionListener) { this(name, checkbox, actionListener, null); } public String getName() { return name; } public boolean isCheckbox() { return checkbox; } public MenuDataFactory(String name, boolean checkbox, ActionListener actionListener, MenuDataFactory[] factories) { if (name == null || name.length() == 0) { throw new IllegalArgumentException(); } if (factories == null) { factories = new MenuDataFactory[0]; } this.name = name; this.checkbox = checkbox; this.actionListener = actionListener; this.factories = factories; } public MenuData createMenuData(Properties props) { if (props == null) { throw new IllegalArgumentException(); } String text = props.getProperty(name + ".text"); String mnemonic = props.getProperty(name + ".mnemonic"); String mnemonicDisp = props.getProperty(name + ".mnemonicDisp"); String ignoreMacOSX = props.getProperty(name + ".ignoreMacOSX"); String shortcutKey = props.getProperty(name + ".shortcut-key"); MenuData menuData = new MenuData(); menuData.setName(getName()); menuData.setCheckbox(isCheckbox()); menuData.setText(text); if (mnemonic != null && mnemonic.length() > 0) { menuData.setMnemonic(mnemonic.charAt(0)); menuData.setMnimonicDisp(mnemonicDisp); } menuData.setIgnoreMacOSX(ignoreMacOSX != null && Boolean.valueOf(ignoreMacOSX)); menuData.setActionListener(actionListener); menuData.setShortcutKey(shortcutKey); for (MenuDataFactory factory : factories) { if (factory != null) { menuData.add(factory.createMenuData(props)); } else { menuData.add(null); } } return menuData; } @Override public int size() { return factories.length; } @Override public Iterator iterator() { return new Iterator() { private int idx = 0; public boolean hasNext() { return idx < factories.length; } public MenuDataFactory next() { if (idx >= factories.length) { throw new NoSuchElementException(); } return factories[idx++]; } public void remove() { throw new UnsupportedOperationException(); } }; } } CharacterManaJ/src/main/java/charactermanaj/ui/ImageSelectPanel.java0000644000175000017500000012441013615720000025606 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.EventListener; import java.util.EventObject; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Properties; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.DefaultListSelectionModel; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import charactermanaj.model.AppConfig; import charactermanaj.model.PartsCategory; import charactermanaj.model.PartsIdentifier; import charactermanaj.model.PartsSpec; import charactermanaj.model.PartsSpecResolver; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.LocalizedResourcePropertyLoader; import charactermanaj.util.UIHelper; /** * 各パーツの選択パネル(カテゴリ別) * @author seraphy */ public class ImageSelectPanel extends JPanel { private static final long serialVersionUID = 1L; protected static final String STRINGS_RESOURCE = "languages/imageselectpanel"; /** * 変更通知を受けるリスナ * @author seraphy */ public interface ImageSelectPanelListener extends EventListener { /** * 選択が変更された場合 * @param event */ void onSelectChange(ImageSelectPanelEvent event); /** * アイテムが選択された場合 * @param event */ void onChange(ImageSelectPanelEvent event); /** * 色変更ボタンが押された場合 * @param event */ void onChangeColor(ImageSelectPanelEvent event); /** * 設定ボタンが押された場合 * @param event */ void onPreferences(ImageSelectPanelEvent event); /** * タイトルがクリックされた場合 * @param event */ void onTitleClick(ImageSelectPanelEvent event); /** * タイトルがクリックされた場合 * @param event */ void onTitleDblClick(ImageSelectPanelEvent event); }; /** * 変更通知イベント * @author seraphy */ public static class ImageSelectPanelEvent extends EventObject { private static final long serialVersionUID = 1L; public ImageSelectPanelEvent(ImageSelectPanel src) { super(src); } public ImageSelectPanel getImageSelectPanel() { return (ImageSelectPanel) getSource(); } } /** * 表示モード * @author seraphy */ public enum DisplayMode { /** * 最小化モード */ MINIMIZED, /** * 通常モード */ NORMAL, /** * 最大サイズフリーモード */ EXPANDED } /** * パネルノ拡大・縮小時のステップサイズ */ private static final int rowStep = 2; /** * 変更通知を受けるリスナー */ private final LinkedList listeners = new LinkedList(); /** * リストの一行の高さ */ private final int rowHeight; /** * パネルの最小高さ (ボーダー上限 + ヘッダ行の高さ) */ private final int minHeight; /** * 現在の表示行数 */ private int numOfVisibleRows; /** * 最小化モードであるか? */ private DisplayMode displayMode; /** * パーツ情報ソース */ private PartsSpecResolver partsSpecResolver; /** * パーツ選択テーブル */ private final JTable partsSelectTable; /** * パーツ選択テーブルモデル */ private final PartsSelectListModel partsSelectTableModel; /** * 選択中のアイテム(複数選択の場合はフォーカスされているもの)、もしくはnull */ private PartsIdentifier selectedPartsIdentifier; /** * 選択中のアイテムのリスト(順序あり)、もしくは空 */ private List selectedPartsIdentifiers = Collections.emptyList(); /** * このパネルが対象とするカテゴリ情報 */ private final PartsCategory partsCategory; private final JLabel title; /** * イメージ選択パネルを構築する * @param partsCategory パーツカテゴリ * @param partsSpecResolver キャラクターデータ */ public ImageSelectPanel(ScaleSupport scaleSupport, final PartsCategory partsCategory, final PartsSpecResolver partsSpecResolver) { if (partsCategory == null || partsSpecResolver == null) { throw new IllegalArgumentException(); } this.partsCategory = partsCategory; this.partsSpecResolver = partsSpecResolver; setLayout(new BorderLayout()); setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(3, 3, 3, 3), BorderFactory.createCompoundBorder( BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder(3, 3, 3, 3)) ) ); partsSelectTableModel = new PartsSelectListModel(partsCategory); double scale = scaleSupport.getManualScaleX(); final DefaultTableColumnModel columnModel = new DefaultTableColumnModel(); TableColumn checkColumn = new TableColumn(0, (int)(32 * scale)); checkColumn.setMaxWidth((int)(42 * scale)); columnModel.addColumn(checkColumn); columnModel.addColumn(new TableColumn(1, (int)(100 * scale))); final DefaultListSelectionModel selectionModel = new DefaultListSelectionModel(); selectionModel.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { onSelectChange(new ImageSelectPanelEvent(ImageSelectPanel.this)); } } }); final Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties(STRINGS_RESOURCE); partsSelectTable = new JTable(partsSelectTableModel, columnModel, selectionModel) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component comp = super.prepareRenderer(renderer, row, column); if (isCellSelected(row, column) && hasFocus()) { // フォーカスのあるセル選択の背景色 comp.setBackground(getSelectionBackground()); } else { // フォーカスのないセル選択行 Boolean chk = (Boolean) getModel().getValueAt(row, 0); comp.setForeground(getForeground()); if (chk.booleanValue()) { // チェック済みの場合の背景色 AppConfig appConfig = AppConfig.getInstance(); Color selectedItemColor = appConfig.getCheckedItemBgColor(); comp.setBackground(selectedItemColor); } else { // 通常の背景色 comp.setBackground(getBackground()); } } return comp; } @Override public String getToolTipText(MouseEvent event) { // マウスが置かれている行のツールチップとしてパーツ名を表示する. int row = rowAtPoint(event.getPoint()); int mx = partsSelectTableModel.getRowCount(); if (row >= 0 && row < mx) { PartsSelectRow rowModel = partsSelectTableModel.getRow(row); PartsIdentifier partsIdentifier = rowModel.getPartsIdentifier(); PartsSpec partsSpec = partsSpecResolver.getPartsSpec(partsIdentifier); String suffix = ""; if (partsSpec != null) { // パーツの作者名とバージョンがあれば、それを末尾につけて表示する. String author = partsSpec.getAuthor(); double version = partsSpec.getVersion(); if (author != null) { if (version > 0) { suffix = " (" + author + " " + version + ")"; } else { suffix = " (" + author + ")"; } } } return partsIdentifier.getLocalizedPartsName() + suffix; } return null; } }; partsSelectTable.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { partsSelectTable.repaint(); } @Override public void focusLost(FocusEvent e) { partsSelectTable.repaint(); } }); // 行の高さをフォントの高さにする partsSelectTable.setRowHeight((int)(partsSelectTable.getFont().getSize() * 1.2)); final JPopupMenu partsSelectTablePopupMenu = new JPopupMenu(); Action actDeselectAll = new AbstractAction( strings.getProperty("popupmenu.deselectall")) { private static final long serialVersionUID = 9132032971228670868L; public void actionPerformed(ActionEvent e) { deselectAll(); } }; partsSelectTablePopupMenu.add(actDeselectAll); partsSelectTable.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { evaluatePopup(e); } @Override public void mouseReleased(MouseEvent e) { evaluatePopup(e); } private void evaluatePopup(MouseEvent e) { if ((partsCategory.isOptional() || isDeselectableAlways()) && e.isPopupTrigger()) { partsSelectTablePopupMenu.show(partsSelectTable, e.getX(), e.getY()); } } }); partsSelectTableModel.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { if (e.getType() == TableModelEvent.UPDATE) { onChange(new ImageSelectPanelEvent(ImageSelectPanel.this)); } } }); if (partsCategory.isMultipleSelectable()) { partsSelectTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); } else { partsSelectTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); } partsSelectTable.setRowSelectionAllowed(true); partsSelectTable.setTableHeader(null); partsSelectTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); partsSelectTable.setShowVerticalLines(false); partsSelectTable.setShowHorizontalLines(false); InputMap im = partsSelectTable.getInputMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "toggleCheck"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "resetCheck"); ActionMap am = partsSelectTable.getActionMap(); am.put("toggleCheck", new AbstractAction() { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { int[] selectedRows = partsSelectTable.getSelectedRows(); boolean[] checks = partsSelectTableModel.getChecks(selectedRows); int checkedCount = 0; for (boolean checked : checks) { if (checked) { checkedCount++; } } if (checks.length == checkedCount) { // 選択しているアイテムのすべてがチェック済みである partsSelectTableModel.setChecks(false, selectedRows); } else { // 選択しているアイテムの一部もしくは全部がチェックされていない partsSelectTableModel.setChecks(true, selectedRows); } } }); am.put("resetCheck", new AbstractAction() { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { partsSelectTableModel.setChecks(false, partsSelectTable.getSelectedRows()); } }); JScrollPane scrollPane = new JScrollPane(partsSelectTable); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); UIHelper uiUtl = UIHelper.getInstance(); JButton leftBtn = uiUtl.createTransparentButton("icons/left.png", "icons/left2.png"); JButton rightBtn = uiUtl.createTransparentButton("icons/right.png", "icons/right2.png"); JButton colorBtn = uiUtl.createTransparentButton("icons/color.png", "icons/color2.png"); JButton configBtn = uiUtl.createTransparentButton("icons/config.png", "icons/config2.png"); leftBtn.setToolTipText(strings.getProperty("tooltip.shrink")); rightBtn.setToolTipText(strings.getProperty("tooltip.expand")); colorBtn.setToolTipText(strings.getProperty("tooltip.color")); configBtn.setToolTipText(strings.getProperty("tooltip.config")); leftBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (isMinimizeMode()) { setMinimizeMode(false); } else { shrink(); } } }); rightBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (isMinimizeMode()) { setMinimizeMode(false); } else { expand(); } } }); colorBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onChangeColor(); } }); configBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onPreferences(); } }); JPanel btnPanelGrp = new JPanel(new BorderLayout()); JToolBar toolBar = new JToolBar(); toolBar.setFloatable(false); toolBar.add(leftBtn); toolBar.add(rightBtn); toolBar.add(colorBtn); //toolBar.add(configBtn); // 設定ボタン (現在は非表示) btnPanelGrp.add(toolBar, BorderLayout.NORTH); if (partsCategory.isMultipleSelectable()) { JButton upBtn = uiUtl.createTransparentButton("icons/arrow_up.png", "icons/arrow_up2.png"); JButton downBtn = uiUtl.createTransparentButton("icons/arrow_down.png", "icons/arrow_down2.png"); JButton sortBtn = uiUtl.createTransparentButton("icons/sort.png", "icons/sort2.png"); upBtn.setToolTipText(strings.getProperty("tooltip.up")); downBtn.setToolTipText(strings.getProperty("tooltip.down")); sortBtn.setToolTipText(strings.getProperty("tooltip.sort")); upBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onUp(); } }); downBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onDown(); } }); sortBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onSort(); } }); JToolBar toolBar2 = new JToolBar(); toolBar2.setFloatable(false); toolBar2.add(upBtn); toolBar2.add(downBtn); toolBar2.add(sortBtn); btnPanelGrp.add(toolBar2, BorderLayout.SOUTH); } JPanel header = new JPanel(new BorderLayout()); header.add(btnPanelGrp, BorderLayout.EAST); title = new JLabel(" " + partsCategory.getLocalizedCategoryName() + " "); final Color defaultTitleColor = title.getForeground(); title.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (e.getClickCount() == 2) { // 正確に2回 onTitleDblClick(); } else if (e.getClickCount() == 1) { // 正確に1回 onTitleClick(); } } @Override public void mouseEntered(MouseEvent e) { AppConfig appConfig = AppConfig.getInstance(); Color hilightColor = appConfig.getSelectPanelTitleColor(); title.setForeground(hilightColor); } @Override public void mouseExited(MouseEvent e) { title.setForeground(defaultTitleColor); } }); header.add(title, BorderLayout.CENTER); add(header, BorderLayout.NORTH); add(scrollPane, BorderLayout.CENTER); rowHeight = partsSelectTable.getRowHeight(); // パネルの最小高さ (ボーダー上下 + ヘッダ行高さ) Insets insets = getInsets(); minHeight = header.getPreferredSize().height + insets.top + insets.bottom; // デフォルトのパネル幅を設定する. Dimension dim = new Dimension(200, 200); dim = scaleSupport.manualScaled(dim); setPreferredSize(dim); // パネルの初期サイズ numOfVisibleRows = partsCategory.getVisibleRows(); setDisplayMode(DisplayMode.NORMAL); // AppConfigによるUIの設定をロードする loadAppConfig(); } /** * AppConfigによるUIの設定をロードする */ private void loadAppConfig() { AppConfig appConfig = AppConfig.getInstance(); partsSelectTable.setSelectionBackground(appConfig.getSelectedItemBgColor()); } /** * AppConfigの変更により最新のUIパラメータを再取り込みするためのリスナ */ private final PropertyChangeListener propChangeListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { // AppConfigの変更後の再描画で、ただちに最新の設定を使えるようにする loadAppConfig(); } }; @Override public void addNotify() { super.addNotify(); AppConfig.getInstance().addPropertyChangeListener(propChangeListener); } @Override public void removeNotify() { AppConfig.getInstance().removePropertyChangeListener(propChangeListener); super.removeNotify(); } @Override public void doLayout() { // AppConfigのFontサイズ変更はUIManagerの更新で全フレームを再適用するので、 // ここで最新のフォントを再適用できるようにする。 Font font = getFont(); title.setFont(font.deriveFont(Font.BOLD)); super.doLayout(); } /** * 表示行数から推奨のパネル高さを求める.
* パネル高さは1行の高さ x 表示行数 + ヘッダ + ボーダー上下である.
* @param numOfVisibleRows 表示行数 * @return 推奨のパネル高さ */ protected int calcPreferredHeight(int numOfVisibleRows) { return minHeight + Math.max(0, rowHeight * numOfVisibleRows); } /** * パーツをパネルにロードします.
* 既存の内容はリセットされたのち、現在の選択パーツ位置にスクロールします.
*/ public void loadParts() { partsSelectTableModel.load(partsSpecResolver.getPartsSpecMap(partsCategory).keySet()); scrollToSelectedRow(); } /** * このイメージ選択パネルの該当カテゴリを返します.
* @return カテゴリ */ public PartsCategory getPartsCategory() { return partsCategory; } /** * 現在選択している、すべてのパーツの選択を解除します.
* 単一選択カテゴリであるかどうかを問わず、常にすべて解除されます.
* 変更イベントが発生します.
*/ public void deselectAll() { PartsSelectListModel rowModelList = (PartsSelectListModel) partsSelectTable.getModel(); ArrayList rowModels = rowModelList.getRowModelList(); // すべての選択を解除する. for (PartsSelectRow rowModel : rowModels) { rowModel.setChecked(false); } // コンポーネントではなく、モデルに対する直接変更であるため、イベントは発生しません. // そのため再描画させる必要があります. partsSelectTable.repaint(); // アイテムの選択が変更されたことを通知する. onChange(new ImageSelectPanelEvent(ImageSelectPanel.this)); } /** * カテゴリのリストでパーツを選択しなおします.
* 変更イベントは発生しません.
* @param partsIdentifiers */ public void selectParts(Collection partsIdentifiers) { if (partsIdentifiers == null) { partsIdentifiers = Collections.emptyList(); } PartsSelectListModel rowModelList = (PartsSelectListModel) partsSelectTable.getModel(); ArrayList rowModels = rowModelList.getRowModelList(); for (PartsSelectRow rowModel : rowModels) { rowModel.setChecked(false); } ArrayList partsIdentifiersBuf = new ArrayList(partsIdentifiers); Collections.reverse(partsIdentifiersBuf); for (PartsIdentifier partsIdentifier : partsIdentifiersBuf) { Iterator ite = rowModels.iterator(); while (ite.hasNext()) { PartsSelectRow rowModel = ite.next(); if (rowModel.getPartsIdentifier().equals(partsIdentifier)) { rowModel.setChecked(true); if (partsIdentifiersBuf.size() >= 2 && partsCategory.isMultipleSelectable()) { ite.remove(); rowModels.add(0, rowModel); } break; } } } // 選択を保存する selectedPartsIdentifier = getSelectedPartsIdentifier(); selectedPartsIdentifiers = getSelectedPartsIdentifiers(); // コンポーネントではなく、モデルに対する直接変更であるため、イベントは発生しません. // そのため再描画させる必要があります. partsSelectTable.repaint(); // あたらしく選択されたアイテムが表示されるようにスクロールします. scrollToSelectedRow(); } /** * カテゴリのリストで選択中のアイテムが見えるようにスクロールする. */ public void scrollToSelectedRow() { PartsSelectListModel rowModelList = (PartsSelectListModel) partsSelectTable.getModel(); ArrayList rowModels = rowModelList.getRowModelList(); int mx = rowModels.size(); for (int row = 0; row < mx; row++) { if (rowModels.get(row).isChecked()) { Rectangle rct = partsSelectTable.getCellRect(row, 0, true); partsSelectTable.scrollRectToVisible(rct); break; } } } /** * カテゴリのパネルを最小表示.
* 最小化の場合は、高さは表示行数ゼロとなりタイトルとボーダーだけとなる.
* 最小化解除した場合は、標準高さは既定、最大サイズはフリーとなる.
* @param shrinkMode 最小化モードならばtrue、フリーモードならばfalse */ public void setMinimizeMode(boolean minimizeMode) { setDisplayMode(minimizeMode ? DisplayMode.MINIMIZED : DisplayMode.EXPANDED); } /** * 表示モードを切り替えパネルサイズを調整する.
* @param displayMode 表示モード */ public void setDisplayMode(DisplayMode displayMode) { if (displayMode == null) { displayMode = DisplayMode.NORMAL; } Dimension siz = getPreferredSize(); Dimension sizMax = getMaximumSize(); if (displayMode == DisplayMode.MINIMIZED) { int preferredHeight = calcPreferredHeight(0); siz.height = preferredHeight; sizMax.height = preferredHeight; } else if (displayMode == DisplayMode.EXPANDED) { int preferredHeight = calcPreferredHeight(numOfVisibleRows); siz.height = preferredHeight; sizMax.height = Integer.MAX_VALUE; } else { // DisplayMode.NORMALの場合 int preferredHeight = calcPreferredHeight(numOfVisibleRows); siz.height = preferredHeight; sizMax.height = preferredHeight; } setPreferredSize(siz); setMinimumSize(siz); setMaximumSize(sizMax); this.displayMode = displayMode; revalidate(); } public DisplayMode getDisplayMode() { return displayMode; } public boolean isMinimizeMode() { return displayMode == DisplayMode.MINIMIZED; } /** * カテゴリのパネルを縮小する.
* ただし、ヘッダ部よりは小さくならない.
* 現在の表示モードが標準でなければ縮小せず標準に戻す.
*/ public void shrink() { if (displayMode == DisplayMode.NORMAL) { // 表示行数を減ずる numOfVisibleRows = Math.max(0, numOfVisibleRows - rowStep); } // 通常モードの適用 setDisplayMode(DisplayMode.NORMAL); } /** * カテゴリのパネルを拡大する.
* 現在の表示モードが標準でなければ拡大前せず標準に戻す.
*/ public void expand() { if (displayMode == DisplayMode.NORMAL) { // 表示行数を加算する numOfVisibleRows += Math.max(0, rowStep); } // 通常モードの適用 setDisplayMode(DisplayMode.NORMAL); } public void addImageSelectListener(ImageSelectPanelListener listener) { if (listener == null) { throw new IllegalArgumentException(); } listeners.add(listener); } public void removeImageSelectListener(ImageSelectPanelListener listener) { listeners.remove(listener); } public void requestListFocus() { partsSelectTable.requestFocus(); } /** * 指定したパーツ識別子にフォーカスを当てます.
* 必要に応じてスクロールされます.
* 該当するパーツ識別子がなければ何もしません.
* @param partsIdentifier パーツ識別子 */ public void setSelection(PartsIdentifier partsIdentifier) { if (partsIdentifier == null) { return; } PartsCategory partsCategory = partsIdentifier.getPartsCategory(); if (!this.partsCategory.equals(partsCategory)) { return; } ArrayList rowModelList = ((PartsSelectListModel) partsSelectTable.getModel()).getRowModelList(); int mx = rowModelList.size(); for (int idx = 0; idx < mx; idx++) { PartsSelectRow partsSelectRow = rowModelList.get(idx); if (partsSelectRow.getPartsIdentifier().equals(partsIdentifier)) { partsSelectTable.getSelectionModel().setSelectionInterval(idx, idx); Rectangle rct = partsSelectTable.getCellRect(idx, 0, true); partsSelectTable.scrollRectToVisible(rct); partsSelectTable.requestFocus(); return; } } } /** * フォーカスのあるアイテムを1つ上に移動します. */ protected void onUp() { int selRow = partsSelectTable.getSelectedRow(); if (selRow < 0) { return; } if (selRow > 0) { ArrayList rowModelList = ((PartsSelectListModel) partsSelectTable.getModel()).getRowModelList(); PartsSelectRow rowModel = rowModelList.get(selRow); rowModelList.remove(selRow); rowModelList.add(selRow - 1, rowModel); partsSelectTable.setRowSelectionInterval(selRow - 1, selRow - 1); Rectangle rct = partsSelectTable.getCellRect(selRow - 1, 0, true); partsSelectTable.scrollRectToVisible(rct); onChange(new ImageSelectPanelEvent(this)); } partsSelectTable.repaint(); partsSelectTable.requestFocus(); } /** * フォーカスのあるアイテムを1つ下に移動します. */ protected void onDown() { int selRow = partsSelectTable.getSelectedRow(); if (selRow < 0) { return; } int mx = partsSelectTable.getRowCount(); if (selRow < mx - 1) { ArrayList rowModelList = ((PartsSelectListModel) partsSelectTable.getModel()).getRowModelList(); PartsSelectRow rowModel = rowModelList.get(selRow); rowModelList.remove(selRow); rowModelList.add(selRow + 1, rowModel); partsSelectTable.setRowSelectionInterval(selRow + 1, selRow + 1); Rectangle rct = partsSelectTable.getCellRect(selRow + 1, 0, true); partsSelectTable.scrollRectToVisible(rct); onChange(new ImageSelectPanelEvent(this)); } partsSelectTable.repaint(); partsSelectTable.requestFocus(); } /** * 選択中のアイテムを選択順序を維持したまま上側に、それ以外は名前順で下側に集めるようにソートします.
*/ protected void onSort() { if (partsSelectTable.getRowCount() > 0) { partsSelectTableModel.sort(); partsSelectTable.setRowSelectionInterval(0, 0); Rectangle rct = partsSelectTable.getCellRect(0, 0, true); partsSelectTable.scrollRectToVisible(rct); partsSelectTable.repaint(); } partsSelectTable.requestFocus(); } /** * タイトルがクリックされた場合 */ protected void onTitleClick() { ImageSelectPanelEvent event = new ImageSelectPanelEvent(this); for (ImageSelectPanelListener listener : listeners) { listener.onTitleClick(event); } } /** * タイトルがダブルクリックされた場合 */ protected void onTitleDblClick() { ImageSelectPanelEvent event = new ImageSelectPanelEvent(this); for (ImageSelectPanelListener listener : listeners) { listener.onTitleDblClick(event); } } /** * カラー変更ボタンが押下された場合 * @param event */ protected void onChangeColor() { ImageSelectPanelEvent event = new ImageSelectPanelEvent(this); for (ImageSelectPanelListener listener : listeners) { listener.onChangeColor(event); } } /** * 設定ボタンが押下された場合 * @param event */ protected void onPreferences() { ImageSelectPanelEvent event = new ImageSelectPanelEvent(this); for (ImageSelectPanelListener listener : listeners) { listener.onPreferences(event); } } /** * アイテムのチェック状態が変更された場合. * @param event */ protected void onChange(ImageSelectPanelEvent event) { List selectedNews = getSelectedPartsIdentifiers(); if (!selectedNews.equals(selectedPartsIdentifiers)) { selectedPartsIdentifiers = selectedNews; for (ImageSelectPanelListener listener : listeners) { listener.onChange(event); } onSelectChange(event); } } /** * アイテムの選択(フォーカス)が変更された場合. * @param event */ protected void onSelectChange(ImageSelectPanelEvent event) { PartsIdentifier selectedNew = getSelectedPartsIdentifier(); if (!PartsIdentifier.equals(selectedNew, selectedPartsIdentifier)) { selectedPartsIdentifier = selectedNew; for (ImageSelectPanelListener listener : listeners) { listener.onSelectChange(event); } } } /** * 使用中のアイテムの一覧を返す.(選択順)
* @return 使用中のアイテムの一覧.(選択順)、ひとつもなければ空 */ public List getSelectedPartsIdentifiers() { return partsSelectTableModel.getSelectedPartsIdentifiers(); } /** * 使用中のアイテムを返す.
* 複数選択可能である場合は、使用中のアイテムでフォーカスがある最初のアイテムを返す.
* 単一選択の場合は、最初の使用中アイテムを返す.
* 複数選択可能で、使用中のアイテムにひとつもフォーカスがあたってない場合は、 * 最初の使用中アイテムを返す.
* 使用中アイテムがなければnullを返す. * @return 使用中アイテム、もしくはnull */ public PartsIdentifier getSelectedPartsIdentifier() { // フォーカスがあたっていて、且つ、チェック状態のアイテムを上から順に走査し、 // 該当があれば、最初のものを返す. int[] selRows = partsSelectTable.getSelectedRows(); Arrays.sort(selRows); for (int selRow : selRows) { PartsSelectRow row = partsSelectTableModel.getRow(selRow); if (row.isChecked()) { return row.getPartsIdentifier(); } } // チェック状態のアイテムの最初のものを返す. List checkedRows = getSelectedPartsIdentifiers(); if (checkedRows.size() > 0) { return checkedRows.get(0); } // 該当なし return null; } /** * 選択選択パーツカテゴリの選択解除を許可するか?
* @return 許可する場合はtrue */ public boolean isDeselectableAlways() { return partsSelectTableModel.isDeselectableAlways(); } /** * 選択選択パーツカテゴリの選択解除を許可するか設定する.
* @param deselectable 許可する場合はtrue */ public void setDeselectableAlways(boolean deselectable) { partsSelectTableModel.setDeselectableAlways(deselectable); } } /** * リストの行モデル.
* パーツデータ、表示名と使用中フラグを管理する. * @author seraphy */ final class PartsSelectRow implements Comparable { private PartsIdentifier partsIdentifier; private boolean checked; private int displayOrder; public PartsSelectRow(final PartsIdentifier partsIdentifier, final boolean checked) { this.partsIdentifier = partsIdentifier; this.checked = checked; } /** * 選択されているものを上、そうでないものを下に振り分ける。 * 選択されているもの同士、選択されていないもの同士は、互いのディスプレイ順でソートされる.
* 選択されているもの同士、選択されていないもの同士で、且つ、同一のディスプレイ順序であればパーツの表示名順でソートされる.
* @param o 対象 * @return 比較結果 */ public int compareTo(PartsSelectRow o) { int ret = (checked == o.checked) ? 0 : (checked ? -1 : 1); if (ret == 0 && checked) { ret = displayOrder - o.displayOrder; } if (ret == 0) { ret = partsIdentifier.compareTo(o.partsIdentifier); } return ret; } public void setDisplayOrder(int displayOrder) { this.displayOrder = displayOrder; } public int getDisplayOrder() { return this.displayOrder; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof PartsSelectRow) { return this.compareTo((PartsSelectRow) obj) == 0; } return false; } public int hashCode() { return partsIdentifier.hashCode(); } public PartsIdentifier getPartsIdentifier() { return partsIdentifier; } /** * {@link PartsIdentifier#getLocalizedPartsName()}に委譲します. * @return パーツ名 */ public String getPartsName() { return partsIdentifier.getLocalizedPartsName(); } public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } } /** * リストのモデル * @author seraphy */ class PartsSelectListModel extends AbstractTableModel { private static final long serialVersionUID = 7604828023134579608L; private PartsCategory partsCategory; private ArrayList partsSelectRowList; /** * カテゴリが複数パーツでない場合でも選択解除を許可するフラグ. */ private boolean deselectableAlways; public PartsSelectListModel(PartsCategory partsCategory) { if (partsCategory == null) { throw new IllegalArgumentException(); } this.partsSelectRowList = new ArrayList(); this.partsCategory = partsCategory; } public void load(Collection partsIdentifiers) { if (partsIdentifiers == null) { throw new IllegalArgumentException(); } // 現在選択されているパーツを保存する HashMap selectedPartsIdentifiers = new HashMap(); for (PartsIdentifier partsIdentifier : getSelectedPartsIdentifiers()) { selectedPartsIdentifiers.put(partsIdentifier, selectedPartsIdentifiers.size()); } // パーツイメージマップからパーツ名を列挙する. ArrayList partsSelectList = new ArrayList(); for (PartsIdentifier partsIdentifier : partsIdentifiers) { Integer selIndex = selectedPartsIdentifiers.get(partsIdentifier); PartsSelectRow rowModel = new PartsSelectRow(partsIdentifier, selIndex != null); // 選択されているものは、選択されているものの順序を維持する.それ以外は名前順でソートされる. int order = (selIndex != null) ? selIndex.intValue() : 0; rowModel.setDisplayOrder(order); partsSelectList.add(rowModel); } if (partsCategory.isMultipleSelectable()) { // パーツを選択有無(順序維持)・名前順に並び替える. Collections.sort(partsSelectList); } else { // 単一選択モード時はパーツ識別子でソートする. Collections.sort(partsSelectList, new Comparator() { public int compare(PartsSelectRow o1, PartsSelectRow o2) { return o1.getPartsIdentifier().compareTo(o2.getPartsIdentifier()); } }); } this.partsSelectRowList = partsSelectList; fireTableDataChanged(); } /** * 選択選択パーツカテゴリの選択解除を許可するか?
* @return 許可する場合はtrue */ public boolean isDeselectableAlways() { return deselectableAlways; } /** * 選択選択パーツカテゴリの選択解除を許可するか設定する.
* @param deselectable 許可する場合はtrue */ public void setDeselectableAlways(boolean deselectableAlways) { this.deselectableAlways = deselectableAlways; } public PartsSelectRow getRow(int rowIndex) { return partsSelectRowList.get(rowIndex); } public ArrayList getRowModelList() { return this.partsSelectRowList; } public int getColumnCount() { // ヘッダは非表示のためヘッダ名は取得する必要なし. // col 0: 選択ボックス // col 1: パーツ表示名 return 2; } public int getRowCount() { return partsSelectRowList.size(); } public Object getValueAt(int rowIndex, int columnIndex) { PartsSelectRow rowModel = partsSelectRowList.get(rowIndex); switch (columnIndex) { case 0: return Boolean.valueOf(rowModel.isChecked()); case 1: return rowModel.getPartsName(); default: } return ""; } @Override public Class getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return Boolean.class; case 1: return String.class; default: } return String.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (columnIndex == 0) { return true; } return false; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { if (columnIndex != 0) { return; } PartsSelectRow rowModel = partsSelectRowList.get(rowIndex); boolean checked = ((Boolean) aValue).booleanValue(); if (!checked && rowModel.isChecked() && !partsCategory.isOptional() && !deselectableAlways) { // チェックをはずそうしている場合、省略可能でなく、 // 全カテゴリの選択解除も許可されていない場合、 // 選択数が2つ以上でなければ選択解除しない。(選択数をゼロにしない) int numOfSelected = 0; int mx = partsSelectRowList.size(); for (int idx = 0; idx < mx; idx++) { PartsSelectRow otherRow = partsSelectRowList.get(idx); if (otherRow.isChecked()) { numOfSelected++; } } if (numOfSelected <= 1) { // 選択数が1未満である return; } } rowModel.setChecked(checked); // カテゴリが複数パーツ選択を許可しておらず、且つ、チェックをつけた場合、 // すでにチェックされている他の パーツ行のチェックを外す必要がある。 boolean unchecked = false; if (checked && !partsCategory.isMultipleSelectable()) { int mx = partsSelectRowList.size(); for (int idx = 0; idx < mx; idx++) { if (idx != rowIndex) { PartsSelectRow otherRow = partsSelectRowList.get(idx); if (otherRow.isChecked()) { otherRow.setChecked(false); unchecked = true; } } } } if (!unchecked) { // 指定されたセルの変更のみなので単一変更を通知する. fireTableCellUpdated(rowIndex, columnIndex); } else { // 他のセルも変更されたので一括変更を通知する. fireTableDataChanged(); } } /** * 選択されているパーツを上に、それ以外を下に振り分ける.
* それぞれはパーツの表示名順でソートされる.
*/ public void sort() { int mx = partsSelectRowList.size(); for (int idx = 0; idx < mx; idx++) { partsSelectRowList.get(idx).setDisplayOrder(idx); } Collections.sort(partsSelectRowList); fireTableDataChanged(); } /** * チェックされているパーツのパーツ識別子のリストを返す.
* リストの順序はパーツの表示されている順序と等しい.
* 選択がなければ空のリストが返される. * @return チェックされているパーツのパーツ識別子のリスト、もしくは空 */ public List getSelectedPartsIdentifiers() { ArrayList selectedRows = new ArrayList(); for (PartsSelectRow rowModel : partsSelectRowList) { if (rowModel.isChecked()) { selectedRows.add(rowModel.getPartsIdentifier()); } } return selectedRows; } /** * 指定したインデックスのパーツのチェック状態を返す. * @param rowIndexes 調べるインデックスの配列 * @return 引数に対応したインデックスのチェック状態、nullまたは空の場合は空を返す */ public boolean[] getChecks(int[] rowIndexes) { if (rowIndexes == null) { rowIndexes = new int[0]; } int mx = rowIndexes.length; boolean[] results = new boolean[mx]; for (int idx = 0; idx < mx; idx++) { int rowIndex = rowIndexes[idx]; PartsSelectRow row = partsSelectRowList.get(rowIndex); results[idx] = row.isChecked(); } return results; } /** * 指定したインデックスのチェック状態を設定する. * @param checked チェックする場合はtrue、チェックを解除する場合はfalse * @param selectedRows インデックスの配列、nullまたは空の場合は何もしない. */ public void setChecks(boolean checked, int[] selectedRows) { if (selectedRows == null || selectedRows.length == 0) { return; } ArrayList affectRows = new ArrayList(); if (!checked) { // 選択解除 if (!partsCategory.isMultipleSelectable()) { // 複数選択可能でない場合、選択はひとつしかないはずなので // クリアする必要はない。 return; } // 選択を解除する. for (int selRow : selectedRows) { PartsSelectRow row = partsSelectRowList.get(selRow); if (row.isChecked()) { row.setChecked(false); affectRows.add(selRow); } } } else { // 選択 if (partsCategory.isMultipleSelectable()) { // 複数選択可能であれば単純に選択を有効にする for (int selRow : selectedRows) { PartsSelectRow row = partsSelectRowList.get(selRow); if (!row.isChecked()) { row.setChecked(true); affectRows.add(selRow); } } } else { // 複数選択可能でない場合は最初のアイテムのみをチェックをつけ、 // それ以外のチェックを外す. int selRow = selectedRows[0]; PartsSelectRow row = partsSelectRowList.get(selRow); if (!row.isChecked()) { row.setChecked(true); affectRows.add(selRow); int mx = partsSelectRowList.size(); for (int idx = 0; idx < mx; idx++) { PartsSelectRow otherRow = partsSelectRowList.get(idx); if (idx != selRow) { if (otherRow.isChecked()) { otherRow.setChecked(false); affectRows.add(idx); } } } } } } if (affectRows.isEmpty()) { // なにも変わりないのでイベントも発生しない. return; } // 変更された最初の行から最後の行までの範囲で変更を通知する. // (変更されていない中間も含まれる) int minIdx = 0; int maxIdx = 0; for (int idx : affectRows) { minIdx = Math.min(minIdx, idx); maxIdx = Math.max(maxIdx, idx); } fireTableRowsUpdated(minIdx, maxIdx); } } CharacterManaJ/src/main/java/charactermanaj/ui/LayerOrderCustomizeDialog.java0000644000175000017500000015156013615720000027545 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Point; import java.awt.Toolkit; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.EventListener; import java.util.EventObject; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.UIManager; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.EventListenerList; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.plaf.basic.BasicComboBoxEditor; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumnModel; import charactermanaj.Main; import charactermanaj.model.CustomLayerOrder; import charactermanaj.model.CustomLayerOrderKey; import charactermanaj.model.Layer; import charactermanaj.model.ListChangeListener; import charactermanaj.model.ObservableList; import charactermanaj.model.PartsCategory; import charactermanaj.ui.model.SimpleComboBoxModel; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * レイヤーのカスタマイズを行う編集ダイアログ */ public class LayerOrderCustomizeDialog extends JDialog { private static final long serialVersionUID = 525988497443897372L; private static final String STRINGS_RESOURCE = "languages/layerordercustomizedialog"; /** * レイヤーの編集がされたときに通知されるリスナ */ public interface LayerOrderCustomizeListener extends EventListener { public static class Change extends EventObject { private static final long serialVersionUID = -6203020622537017109L; public Change(LayerOrderCustomizeDialog source) { super(source); } @Override public LayerOrderCustomizeDialog getSource() { return (LayerOrderCustomizeDialog) super.getSource(); } } void onChange(Change e); } /** * カテゴリのリスト */ private List categories; /** * コンストラクタ * @param window 親ウィンドウ * @param categories カテゴリのリスト */ public LayerOrderCustomizeDialog(Window window, List categories) { super(window); try { setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { onClosing(); } }); this.categories = categories; initLayout(); } catch (RuntimeException ex) { dispose(); throw ex; } } /** * イベントリスナ */ private final EventListenerList listeners = new EventListenerList(); /** * このダイアログのデータモデル */ private LayerOrderCustomizeDialogModel model; /** * 変更通知リスナを登録する * @param l リスナ */ public void addLayerOrderCustomizeListener(LayerOrderCustomizeListener l) { listeners.add(LayerOrderCustomizeListener.class, l); } /** * 変更通知リスナを登録解除する * @param l リスナ */ public void removeLayerOrderCustomizeListener(LayerOrderCustomizeListener l) { listeners.remove(LayerOrderCustomizeListener.class, l); } /** * 全ての変更通知リスナに対して変更イベントを通知する。 * @param type 変更タイプ * @param name 名前 */ protected void fireEvent() { // Guaranteed to return a non-null array Object[] ll = listeners.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event // ※ 逆順で通知するのがSwingの作法らしい。 LayerOrderCustomizeListener.Change event = null; for (int i = ll.length - 2; i >= 0; i -= 2) { if (ll[i] == LayerOrderCustomizeListener.class) { // Lazily create the event: if (event == null) { event = new LayerOrderCustomizeListener.Change(this); } ((LayerOrderCustomizeListener) ll[i + 1]).onChange(event); } } } public LayerOrderCustomizeDialogModel getModel() { return model; } /** * LayerOrderCustomizeDialogModelの更新リスナ */ private final LayerOrderCustomizeDialogModel.ChangeListener modelChangeListener = new LayerOrderCustomizeDialogModel.ChangeListener() { @Override public void onChange(Change change) { CustomLayerOrderKey orderKey = change.getName(); String name = orderKey.getDisplayName(); if (name == null || name.isEmpty()) { // ※空文字の場合はcurrentプロパティの変更 return; } switch (change.getChangeType()) { case ADD: // レイヤーパターンが追加された場合 if (patternsModel.indexOf(orderKey) < 0) { patternsModel.add(orderKey); patternsModel.setSelectedItem(orderKey); // 登録された名前で選択しなおす為 } break; case MODIFY: // レイヤーパターンが更新された場合 break; case REMOVE: // レイヤーパターンが削除された場合 if (name != null) { patternsModel.remove(orderKey); // 削除時は現在の選択もクリアする。(現在選択のものを削除しているので) patternsModel.setSelectedItem(null); } break; } } }; public void setModel(LayerOrderCustomizeDialogModel model) { LayerOrderCustomizeDialogModel old = this.model; if (old != null) { old.removeListChangeListener(modelChangeListener); } this.model = model; loadModel(); if (model != null) { model.addListChangeListener(modelChangeListener); } if (old == null ? model != null : !old.equals(model)) { firePropertyChange("model", old, model); } } private void loadModel() { patternsModel.clear(); if (model == null) { return; } patternsModel.addAll(model.getPatternNames()); patternsModel.setSelectedItem(null); dataModel.setList(model.getCurrentList()); lastPatternName = null; } private JComboBox cmbPatternName = new JComboBox(); private SimpleComboBoxModel patternsModel = new SimpleComboBoxModel(); private final JTable tblLayerOrder = new JTable(); private final LayerOrderTableModel dataModel = new LayerOrderTableModel(); private CustomLayerOrderKey lastPatternName; private AbstractAction actRemove; private AbstractAction actSave; private void initLayout() { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); setTitle(strings.getProperty("title")); Container container = getContentPane(); container.setLayout(new BorderLayout()); JPanel selectorPanel = new JPanel(new BorderLayout(3, 3)); selectorPanel.add(new JLabel(strings.getProperty("patternName")), BorderLayout.WEST); cmbPatternName.setEditable(true); selectorPanel.add(cmbPatternName, BorderLayout.CENTER); cmbPatternName.setModel(patternsModel); cmbPatternName.setSelectedItem(null); cmbPatternName.addActionListener(new AbstractAction() { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { CustomLayerOrderKey item = findBy(cmbPatternName.getSelectedItem()); if (item != null) { if (patternsModel.contains(item)) { onSelect(item); } } } }); Box selectorBtns = Box.createHorizontalBox(); actSave = new AbstractAction(strings.getProperty("btnSave")) { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { Object inp = cmbPatternName.getSelectedItem(); if (inp != null) { CustomLayerOrderKey name = findBy(inp); if (name == null) { // 既存の一覧にないので新規キーの作成 String inpName = inp.toString(); name = makeOrderKey(inpName); } lastPatternName = name; // discard changesの確認が出ないように先に保存済みパターン名にしておく onSave(name); // 現在の入力のパターン名で削除可能にするためUI更新を呼び出す onChangeComboText(); } } }; actRemove = new AbstractAction(strings.getProperty("btnRemove")) { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { CustomLayerOrderKey name = findBy(cmbPatternName.getSelectedItem()); if (name != null) { onRemove(name); } } }; // コンボボックスのテキストが既存のパターン名と合致するかによって // ADD/REMOVEボタンを制御するためのリスナ final BasicComboBoxEditor cmbEditor = (BasicComboBoxEditor) cmbPatternName.getEditor(); JTextField cmbEditorField = (JTextField) cmbEditor.getEditorComponent(); cmbEditorField.getDocument().addDocumentListener(new DocumentListener() { @Override public void removeUpdate(DocumentEvent e) { changed(e); } @Override public void insertUpdate(DocumentEvent e) { changed(e); } @Override public void changedUpdate(DocumentEvent e) { changed(e); } protected void changed(DocumentEvent e) { onChangeComboText(); } }); selectorBtns.add(new JButton(actSave)); selectorBtns.add(new JButton(actRemove)); selectorPanel.add(selectorBtns, BorderLayout.EAST); selectorPanel.setBorder(BorderFactory.createTitledBorder( strings.getProperty("pattern.groupTitle"))); container.add(selectorPanel, BorderLayout.NORTH); // セルの編集はフォーカスの移動でコミットする tblLayerOrder.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); tblLayerOrder.setModel(dataModel); dataModel.addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { fireEvent(); }}); JPanel tablePanel = new JPanel(new BorderLayout(3, 3)); tablePanel.setBorder(BorderFactory.createTitledBorder( strings.getProperty("edittable.groupTitle"))); JScrollPane scr = new JScrollPane(tblLayerOrder); scr.setPreferredSize(new Dimension(450, 250)); tablePanel.add(scr); tblLayerOrder.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); tblLayerOrder.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 行の高さをフォントの高さにする tblLayerOrder.setRowHeight((int)(tblLayerOrder.getFont().getSize() * 1.2)); ScaleSupport scaleSupport = ScaleSupport.getInstance(this); int tableWidth = dataModel.adjustColumnModel(tblLayerOrder.getColumnModel(), scaleSupport.getManualScaleX()); Dimension tablePrefSize = scr.getPreferredSize(); tablePrefSize.width = tableWidth + 10; scr.setPreferredSize(tablePrefSize); AbstractAction actAddLayer = new AbstractAction(strings.getProperty("btnAdd")) { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { onAddLayer(); } }; AbstractAction actDeleteLayer = new AbstractAction(strings.getProperty("btnDelete")) { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { onDeleteLayer(); } }; JButton btnOK = new JButton(actAddLayer); JButton btnCancel = new JButton(actDeleteLayer); JPanel layerOpeBtns = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 1; gbc.fill = GridBagConstraints.BOTH; layerOpeBtns.add(btnOK, gbc); gbc.gridx = 0; gbc.gridy = 1; layerOpeBtns.add(btnCancel, gbc); gbc.gridx = 0; gbc.gridy = 2; gbc.weighty = 1; layerOpeBtns.add(Box.createGlue(), gbc); tablePanel.add(layerOpeBtns, BorderLayout.EAST); container.add(tablePanel, BorderLayout.CENTER); AbstractAction actClose = new AbstractAction(strings.getProperty("btnClose")) { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { onClosing(); } }; JButton btnClose = new JButton(actClose); Box btns = Box.createHorizontalBox(); btns.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 42)); btns.add(Box.createHorizontalGlue()); btns.add(btnClose); container.add(btns, BorderLayout.SOUTH); Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); rootPane.setDefaultButton(btnOK); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeLayerOrderCustomizeDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeLayerOrderCustomizeDialog"); am.put("closeLayerOrderCustomizeDialog", actClose); setModel(new LayerOrderCustomizeDialogModel()); // コンボボックスの状態からボタンのUI状態を更新する。 onChangeComboText(); pack(); } /** * パターン名コンボボックスのテキストが入力された場合に * ADD/REMOVEボタンのUI状態を更新するためのハンドラ */ protected void onChangeComboText() { BasicComboBoxEditor cmbEditor = (BasicComboBoxEditor) cmbPatternName.getEditor(); Object inp = cmbEditor.getItem(); if (inp == null || (inp instanceof String && ((String) inp).trim().length() == 0)) { // 空の場合 actRemove.setEnabled(false); actSave.setEnabled(false); } else { actRemove.setEnabled(patternsModel.contains(findBy(inp))); // 既存のパターン名と合致すれば削除可 actSave.setEnabled(true); // 文字が入力されていれば登録・更新可 } } /** * 引数が文字列の場合、コンボボックスに登録されているパターンリストの表示名と一致するオブジェクトを取得する。 * なければnullを返す。 * 引数がCustomLayerOrderKey型の場合は、そのまま返す。 * nullの場合はnullを返す。 * @param inp 文字列またはCustomLayerOrderKey * @return CustomLayerOrderKey、またはnull */ private CustomLayerOrderKey findBy(Object inp) { if (inp instanceof CustomLayerOrderKey) { return (CustomLayerOrderKey) inp; } if (inp instanceof String) { String inpName = (String) inp; int mx = patternsModel.size(); for (int idx = 0; idx < mx; idx++) { CustomLayerOrderKey item = patternsModel.get(idx); if (item.toString().equals(inpName)) { return item; } } } return null; } /** * キーを作成する * @param displayName * @return */ private CustomLayerOrderKey makeOrderKey(String displayName) { // 現在保持しているIDの一覧を取得する Set usedIds = new HashSet(); int mx = patternsModel.size(); for (int idx = 0; idx < mx; idx++) { CustomLayerOrderKey key = patternsModel.get(idx); usedIds.add(key.getId()); } // IDとしてふさわしいように空白は除外しておく String canonicalName = displayName.replace(" ", "_"); if (!canonicalName.matches("[A-Za-z0-9_]+")) { // アルファベット以外が含まれている場合はランダムなUUIDにする canonicalName = UUID.randomUUID().toString(); } // 名前をもとにIDを衝突しないように振る String id = canonicalName; for (int idx = 2;; idx++) { if (!usedIds.contains(id)) { // 既存のIDではないのでOK. break; } id = canonicalName + idx; } // 現在のロケールでローカライズ文字列を構築しておく Map langMap = new HashMap(); Locale locale = Locale.getDefault(); String lang = locale.getLanguage(); langMap.put(lang, displayName); langMap.put(CustomLayerOrderKey.DEFAULT_NAME_KEY, displayName); return new CustomLayerOrderKey(id, displayName, langMap); } /** * カラム定義 */ private enum ColumnDef { CATEGORY("column.category", String.class, 120) { @Override public Object getValue(CustomLayerOrder item) { return item.getCategory().getLocalizedCategoryName(); } }, LAYER("column.layer", String.class, 120) { @Override public Object getValue(CustomLayerOrder item) { return item.getLayer().getLocalizedName(); } }, DEFAULT_ORDER("column.defaultOrder", Integer.class, 80) { @Override public Object getValue(CustomLayerOrder item) { return item.getLayer().getOrder(); } }, CUSTOM_ORDER("column.order", Float.class, 80, true) { @Override public Object getValue(CustomLayerOrder item) { return item.getLayerOrder(); } }; private final String resourceKey; private final Class dataType; private final int prefWidth; private final boolean editable; ColumnDef(String resourceKey, Class dataType, int prefWidth) { this(resourceKey, dataType, prefWidth, false); } ColumnDef(String resourceKey, Class dataType, int prefWidth, boolean editable) { this.resourceKey = resourceKey; this.dataType = dataType; this.prefWidth = prefWidth; this.editable = editable; } public String getResourceKey() { return resourceKey; } public int getPrefWidth() { return prefWidth; } public abstract Object getValue(CustomLayerOrder item); public Class getDataType() { return dataType; } public boolean isEditable() { return editable; } } /** * レイヤー編集テーブルのテーブルモデル */ protected static class LayerOrderTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; private final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); /** * カラム定義リスト */ private static final ColumnDef[] columns = ColumnDef.values(); /** * テーブルに設定されているレイヤーリスト。 * このリストでデータの追加更新削除を行い、変更リスナによってUI更新を行わせる。 */ private ObservableList layerOrderList; /** * テーブルに設定されているレイヤーリストが変更された場合に * テーブルモデルが更新されたことをUIに通知するための接続用リスナ。 */ private final ListChangeListener changeListener = new ListChangeListener() { @Override public void onChanged(Change c) { int idx = c.getIndex(); if (idx >= 0) { switch (c.getType()) { case ADD: fireTableRowsInserted(idx, idx); return; case MODIFIY: fireTableRowsUpdated(idx, idx); return; case REMOVE: fireTableRowsDeleted(idx, idx); return; default: break; } } fireTableDataChanged(); } }; /** * コンストラクタ */ public LayerOrderTableModel() { setList(new ObservableList()); } /** * カラム幅を設定する。 * @param columnModel */ public int adjustColumnModel(TableColumnModel columnModel, double scale) { int total = 0; for (int idx = 0; idx < columns.length; idx++) { int width = (int)(columns[idx].getPrefWidth() * scale); columnModel.getColumn(idx).setPreferredWidth(width); total += width; } return total; } /** * 現在編集中のテーブル上のレイヤーリストを差し替える。 * レイヤーリストはcategory, layerの順序となるようにソートされる。 * @param layerOrderList */ public final void setList(ObservableList layerOrderList) { if (this.layerOrderList != null) { this.layerOrderList.removeListChangeListener(changeListener); } // テーブルには既定の順序で並べる Collections.sort(layerOrderList, new Comparator() { @Override public int compare(CustomLayerOrder o1, CustomLayerOrder o2) { int ret = o1.getCategory().compareTo(o2.getCategory()); if (ret == 0) { ret = o1.getLayer().compareTo(o2.getLayer()); } if (ret == 0) { ret = Float.compare(o1.getLayerOrder(), o2.getLayerOrder()); } return ret; } }); this.layerOrderList = layerOrderList; layerOrderList.addListChangeListener(changeListener); fireTableDataChanged(); } /** * 現在編集中のテーブル上のレイヤーリストを取得する。 * @return */ public final List getList() { return layerOrderList; } /** * レイヤーを追加する。 * レイヤーは既存のレイヤーのリストに対してcategory, layerの順序となるように挿入される。 * @param category * @param layer * @param layerOrder */ public void add(PartsCategory category, Layer layer, float layerOrder) { if (category == null || layer == null) { throw new NullPointerException("category, layerにnullは指定できません。"); } CustomLayerOrder item = null; int idx = 0; for (; idx < layerOrderList.size(); idx++) { CustomLayerOrder selItem = layerOrderList.get(idx); PartsCategory selCategory = selItem.getCategory(); Layer selLayer = selItem.getLayer(); int ret = category.compareTo(selCategory); if (ret == 0) { ret = layer.compareTo(selLayer); } if (ret == 0) { // 一致するアイテムが発見された。 item = selItem; break; } else if (ret < 0) { // 自分より大きなアイテムを発見 break; } } if (item == null) { item = new CustomLayerOrder(); item.setCategory(category); item.setLayer(layer); item.setLayerOrder(layerOrder); layerOrderList.add(idx, item); } else { item.setLayerOrder(layerOrder); } } public void remove(int rowIndex) { layerOrderList.remove(rowIndex); } @Override public int getRowCount() { return layerOrderList.size(); } @Override public int getColumnCount() { return columns.length; } @Override public String getColumnName(int column) { return strings.getProperty(columns[column].getResourceKey()); } @Override public Class getColumnClass(int columnIndex) { return columns[columnIndex].getDataType(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { CustomLayerOrder item = layerOrderList.get(rowIndex); return columns[columnIndex].getValue(item); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { if (columns[columnIndex].isEditable()) { CustomLayerOrder item = layerOrderList.get(rowIndex); if (aValue != null) { item.setLayerOrder(((Number) aValue).floatValue()); } } } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return columns[columnIndex].isEditable(); } } /** * ダイアログを閉じる */ protected void onClosing() { if (canDiscardChanges()) { dispose(); } } /** * 現在編集中のカスタムレイヤーパターンを取得する。 * @return */ public List getEdittingCustomLayerOrderList() { return dataModel.getList(); } /** * 現在の編集を破棄してよいか確認する。 * パターンをロードしている場合は変更があれば保存するか問い合わせる。 * パターンをロードしていない場合は破棄してよいか問い合わせる。 * @return 破棄して良い場合(もしくは保存した場合) */ private boolean canDiscardChanges() { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); if (lastPatternName == null) { // パターンをロードしていない場合 ObservableList oldLayerOrderList = model.getCurrentList(); if (!oldLayerOrderList.equals(dataModel.getList())) { int ret = JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.discardChanges.message"), strings.getProperty("confirm.discardChanges.title"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); if (ret != JOptionPane.YES_OPTION) { // コンボボックスの選択を空にして戻す patternsModel.setSelectedItem(null); return false; // 破棄不可 } } } else { // すでにパターンをロードしており、且つ、レイヤーリストを修正している場合 // 新たに選択したパターンのロード前に、現在の編集を保存するか確認する。 ObservableList oldLayerOrderList = model.getCopy(lastPatternName); if (oldLayerOrderList == null) { oldLayerOrderList = model.createObservableList(); } if (!oldLayerOrderList.equals(dataModel.getList())) { // パターンを編集中の場合、保存するか問い合わせる int ret = JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.savechanges.message") + lastPatternName, strings.getProperty("confirm.savechanges.title"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (ret == JOptionPane.YES_OPTION) { onSave(lastPatternName); // 現在の編集を保存する } } } return true; // 現在の編集は破棄して良い } /** * レイヤーパターン名を選択した場合 * @param name */ protected void onSelect(CustomLayerOrderKey name) { if (canDiscardChanges()) { // 選択したパターンのロード ObservableList layerOrderList = model.getCopy(name); if (layerOrderList == null) { layerOrderList = model.createObservableList(); } dataModel.setList(layerOrderList); CustomLayerOrderKey old = this.lastPatternName; this.lastPatternName = name; firePropertyChange("lastPatternName", old, name); } } /** * 最後に選択したパターン名を取得する * @return */ public CustomLayerOrderKey getLastPatternName() { return lastPatternName; } /** * 現在の編集をパターン名をつけて保存し、現在の選択パターン名とする。 * @param name */ protected void onSave(CustomLayerOrderKey name) { model.put(name, dataModel.getList()); CustomLayerOrderKey old = this.lastPatternName; if (old == null ? name != null : !old.equals(name)) { this.lastPatternName = name; firePropertyChange("lastPatternName", old, name); } } /** * 指定したパターン名を削除して、選択状態を解除する。 * @param name */ protected void onRemove(CustomLayerOrderKey name) { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); int ret = JOptionPane.showConfirmDialog(this, strings.getProperty("confirm.removepattern.message") + lastPatternName, strings.getProperty("confirm.removepattern.title"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (ret != JOptionPane.YES_OPTION) { return; } model.setCurrentList(dataModel.getList()); // 無名の編集状態になるため、discard changesで判定されないように。 model.remove(name); CustomLayerOrderKey old = this.lastPatternName; if (old != null) { this.lastPatternName = null; firePropertyChange("lastPatternName", old, null); } } /** * レイヤーの追加ダイアログのデータモデル */ public static class AddLayerDialogModel { public static final String PARTS_CATEGORIES = "partsCategories"; public static final String RESULT = "result"; public static final String SELECTED_PARTS_CATEGORY = "partsCategory"; public static final String SELECTED_LAYER = "layer"; public static final String DEFAULT_ORDER = "defaultOrder"; public static final String ORDER = "order"; private final PropertyChangeSupport propChangeSupport = new PropertyChangeSupport(this); /** * コンボボックスの候補とするカテゴリのリスト */ private List partsCategories = new ArrayList(); /** * ダイアログを閉じたときのOK/CANCEL状態 */ private boolean result; /** * 選択されているカテゴリ、なければnull */ private PartsCategory selectedPartsCategory; /** * 選択されているレイヤー、なければnull */ private Layer selectedLayer; /** * デフォルト順序 */ private int defaultOrder; /** * 順序 */ private float order; /** * 入力確定可能であるか? * @return */ public boolean isValid() { return selectedPartsCategory != null && selectedLayer != null; } public List getPartsCategories() { return partsCategories; } public void setPartsCategories(List partsCategories) { List old = this.partsCategories; this.partsCategories = partsCategories; propChangeSupport.firePropertyChange(PARTS_CATEGORIES, old, partsCategories); } public void setResult(boolean result) { boolean old = this.result; this.result = result; propChangeSupport.firePropertyChange(RESULT, old, result); } public boolean isResult() { return result; } public void setSelectedPartsCategory(PartsCategory selectedPartsCategory) { PartsCategory old = this.selectedPartsCategory; if (!(old == null && selectedPartsCategory == null) || (old != null && !old.equals(selectedPartsCategory))) { this.selectedPartsCategory = selectedPartsCategory; propChangeSupport.firePropertyChange(SELECTED_PARTS_CATEGORY, old, selectedPartsCategory); } } public PartsCategory getSelectedPartsCategory() { return selectedPartsCategory; } public void setSelectedLayer(Layer selectedLayer) { Layer old = this.selectedLayer; if (!(old == null && selectedLayer == null) || (old != null && !old.equals(selectedLayer))) { this.selectedLayer = selectedLayer; propChangeSupport.firePropertyChange(SELECTED_LAYER, old, selectedLayer); } } public Layer getSelectedLayer() { return selectedLayer; } public void setOrder(float order) { float old = this.order; if (old != order) { this.order = order; propChangeSupport.firePropertyChange(ORDER, old, order); } } public float getOrder() { return order; } public void setDefaultOrder(int defaultOrder) { int old = this.defaultOrder; this.defaultOrder = defaultOrder; if (old != defaultOrder) { this.defaultOrder = defaultOrder; propChangeSupport.firePropertyChange(DEFAULT_ORDER, old, defaultOrder); } } public int getDefaultOrder() { return defaultOrder; } public void addPropertyChangeListener(PropertyChangeListener listener) { propChangeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propChangeSupport.removePropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propChangeSupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propChangeSupport.removePropertyChangeListener(propertyName, listener); } } /** * レイヤーの追加ダイアログ */ public static class AddLayerDialog extends JDialog { private static final long serialVersionUID = 1L; public static final String MODEL = "model"; public AddLayerDialog(JDialog parent, boolean modal) { super(parent, modal); try { initLayout(); } catch (RuntimeException ex) { dispose(); throw ex; } } private SimpleComboBoxModel cmbLayerModel = new SimpleComboBoxModel(); private SimpleComboBoxModel cmbCategoryModel = new SimpleComboBoxModel(); private JTextField txtDefaultOrder = new JTextField(); private JTextField txtOrder = new JTextField(); private AbstractAction actOK; private void initLayout() { final Properties strings = LocalizedResourcePropertyLoader .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE); setTitle(strings.getProperty("addLayerDialog.title")); Container container = getContentPane(); container.setLayout(new BorderLayout()); JPanel editPanel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(3, 3, 3, 3); JComboBox cmbCategory = new JComboBox(cmbCategoryModel); JComboBox cmbLayer = new JComboBox(cmbLayerModel); cmbLayer.setRenderer(new ListCellRenderer() { private JLabel label = new JLabel(); @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Layer selectedLayer = (Layer) value; // 背景色透過制御 label.setOpaque(isSelected && index >= 0); if (isSelected) { label.setBackground(list.getSelectionBackground()); label.setForeground(list.getSelectionForeground()); } else { label.setBackground(list.getBackground()); label.setForeground(list.getForeground()); } if (selectedLayer == null) { label.setText(""); } else { label.setFont(list.getFont()); label.setText(selectedLayer.getLocalizedName()); } return label; } }); gbc.gridx = 0; gbc.gridy = 0; editPanel.add(new JLabel(strings.getProperty("column.category")), gbc); gbc.gridx = 0; gbc.gridy = 1; editPanel.add(new JLabel(strings.getProperty("column.layer")), gbc); gbc.gridx = 0; gbc.gridy = 2; editPanel.add(new JLabel(strings.getProperty("column.defaultOrder")), gbc); gbc.gridx = 0; gbc.gridy = 3; editPanel.add(new JLabel(strings.getProperty("column.order")), gbc); gbc.gridx = 1; gbc.gridy = 0; gbc.weightx = 1; gbc.fill = GridBagConstraints.BOTH; editPanel.add(cmbCategory, gbc); gbc.gridx = 1; gbc.gridy = 1; editPanel.add(cmbLayer, gbc); gbc.gridx = 1; gbc.gridy = 2; editPanel.add(txtDefaultOrder, gbc); txtDefaultOrder.setEditable(false); gbc.gridx = 1; gbc.gridy = 3; editPanel.add(txtOrder, gbc); gbc.gridx = 0; gbc.gridy = 4; gbc.weighty = 1; editPanel.add(Box.createGlue(), gbc); container.add(editPanel, BorderLayout.CENTER); actOK = new AbstractAction(strings.getProperty("btnOK")) { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { onOK(); } }; AbstractAction actCancel = new AbstractAction(strings.getProperty("btnCancel")) { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { onCancel(); } }; JButton btnOK = new JButton(actOK); JButton btnCancel = new JButton(actCancel); Box btnPanel = Box.createHorizontalBox(); btnPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 42)); btnPanel.add(Box.createHorizontalGlue()); if (Main.isLinuxOrMacOSX()) { btnPanel.add(btnCancel); btnPanel.add(btnOK); } else { btnPanel.add(btnOK); btnPanel.add(btnCancel); } container.add(btnPanel, BorderLayout.SOUTH); // カタログの選択が変更された場合、初期化中のイベントでなければハンドラに渡す cmbCategory.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (updaingCmbCategoryModel.get() == 0) { onChangeSelectCategory((PartsCategory) cmbCategoryModel.getSelectedItem()); } } }); // レイヤーの選択が変更された場合、初期渦中のイベントでなければハンドラに渡す cmbLayer.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (updaingCmbLayerModel.get() == 0) { onChangeSelectLayer((Layer) cmbLayerModel.getSelectedItem()); } } }); // レイヤー順序テキストボックスの入力イベントが初期化中のイベントでなければ // UIモデルの更新のハンドラに引き渡す。 txtOrder.getDocument().addDocumentListener(new DocumentListener() { @Override public void removeUpdate(DocumentEvent e) { onChange(e); } @Override public void insertUpdate(DocumentEvent e) { onChange(e); } @Override public void changedUpdate(DocumentEvent e) { onChange(e); } protected void onChange(DocumentEvent e) { if (updaingTxtOrderModel.get() == 0) { onChangeTxtOrder(txtOrder.getText()); } } }); // AddLayerDialogModelのプロパティ変更を監視し、対応するUIを更新するためのリスナ modelPropChangeListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { String propName = evt.getPropertyName(); if (AddLayerDialogModel.SELECTED_PARTS_CATEGORY.equals(propName)) { updateCmbCategory(); } else if (AddLayerDialogModel.SELECTED_LAYER.equals(propName)) { updateCmbLayer(); } else if (AddLayerDialogModel.DEFAULT_ORDER.equals(propName)) { updateTxtDefaultOrder(); } else if (AddLayerDialogModel.ORDER.equals(propName)) { updateTxtOrder(); } // モデルの状態をOKボタンの状態に反映する updateButtonState(); } }; // デフォルトキーの設定 Toolkit tk = Toolkit.getDefaultToolkit(); JRootPane rootPane = getRootPane(); rootPane.setDefaultButton(btnOK); InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap am = rootPane.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeAddLayerDialog"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeAddLayerDialog"); am.put("closeAddLayerDialog", actCancel); // コンボボックスの推奨幅を明示的に指定する。(言語によっては幅が小さくなりすぎるため) ScaleSupport scaleSupport = ScaleSupport.getInstance(this); Dimension prefSize = cmbCategory.getPreferredSize(); prefSize.width = (int)(200 * scaleSupport.getManualScaleX()); cmbCategory.setPreferredSize(prefSize); pack(); // 初期化モデルの設定(dummy) setModel(new AddLayerDialogModel()); } /** * AddLayerDialogModelのプロパティ変更を監視するリスナ */ private PropertyChangeListener modelPropChangeListener; /** * レイヤー追加ダイアログのモデル */ private AddLayerDialogModel model = new AddLayerDialogModel(); public AddLayerDialogModel getModel() { return model; } public void setModel(AddLayerDialogModel model) { if (model == null) { throw new NullPointerException(); } AddLayerDialogModel old = this.model; if (old.equals(model)) { // 同じなので何もしない return; } old.removePropertyChangeListener(modelPropChangeListener); this.model = model; model.addPropertyChangeListener(modelPropChangeListener); // モデルの内容でUIを更新する。 // ※ UI更新中はイベントの発生を無視させる initCmbCategory(); initCmbLayer(); initDefaultOrder(); initOrder(); updateButtonState(); firePropertyChange(MODEL, old, model); } /** * cmbCategoryModelのUIの初期化中であることを表す。 * UIのイベントリスナで初期化中のイベントは別コンポーネントに連携させないようにする。 */ private final AtomicInteger updaingCmbCategoryModel = new AtomicInteger(); protected void initCmbCategory() { updaingCmbCategoryModel.incrementAndGet(); try { List categories = model.getPartsCategories(); cmbCategoryModel.setAll(categories); cmbCategoryModel.setSelectedItem(model.getSelectedPartsCategory()); } finally { updaingCmbCategoryModel.decrementAndGet(); } } protected void onChangeSelectCategory(PartsCategory selectedCategory) { model.setSelectedPartsCategory(selectedCategory); model.setSelectedLayer(null); } /** * モデルのCategory現在値が変更されたので画面に反映する */ protected void updateCmbCategory() { PartsCategory selCategory = model.getSelectedPartsCategory(); cmbCategoryModel.setSelectedItem(selCategory); initCmbLayer(); } /** * cmbLayerModelのUIの初期化中であることを表す。 * UIのイベントリスナで初期化中のイベントは別コンポーネントに連携させないようにする。 */ private final AtomicInteger updaingCmbLayerModel = new AtomicInteger(); protected void initCmbLayer() { updaingCmbLayerModel.incrementAndGet(); try { PartsCategory selCategory = model.getSelectedPartsCategory(); if (selCategory != null) { cmbLayerModel.setAll(selCategory.getLayers()); } else { cmbLayerModel.setAll(null); } cmbLayerModel.setSelectedItem(model.getSelectedLayer()); } finally { updaingCmbLayerModel.decrementAndGet(); } } protected void onChangeSelectLayer(Layer selectedLayer) { model.setSelectedLayer(selectedLayer); // レイヤーの既定の順序を設定する int defaultOrder = 0; if (selectedLayer != null) { defaultOrder = selectedLayer.getOrder(); } model.setDefaultOrder(defaultOrder); model.setOrder(defaultOrder); } /** * モデルのLayer現在値が変更されたので画面に反映する */ protected void updateCmbLayer() { Layer selLayer = model.getSelectedLayer(); cmbLayerModel.setSelectedItem(selLayer); } private void initDefaultOrder() { // txtDefaultOrderは編集不可のテキストボックスでイベントは監視していない。 if (model.getSelectedLayer() != null) { txtDefaultOrder.setText(Integer.toString(model.getDefaultOrder())); } else { txtDefaultOrder.setText(""); } } /** * txtOrderのUIの初期化中であることを表す。 * UIのイベントリスナで初期化中のイベントは別コンポーネントに連携させないようにする。 */ private final AtomicInteger updaingTxtOrderModel = new AtomicInteger(); /** * txtOrderを初期設定する * この処理期間中は{@link #updaingCmbLayerModel}を0以上とすることで * コンボボックスからのイベントが、この初期設定によるものであることを判別できる。 */ private void initOrder() { updaingTxtOrderModel.incrementAndGet(); try { txtOrder.setText(Float.toString(model.getOrder())); updateTxtOrderState(false); } finally { updaingTxtOrderModel.decrementAndGet(); } } private void updateTxtOrderState(boolean error) { Color color; if (error) { color = Color.RED; } else { color = UIManager.getColor("TextField.background"); } txtOrder.setBackground(color); } /** * ユーザー操作によりテキストボックスが変更された場合 * @param text */ protected void onChangeTxtOrder(String text) { boolean error = true; try { if (text != null && text.length() > 0) { float order = Float.parseFloat(text); model.setOrder(order); error = false; } } catch (RuntimeException ex) { // なにもしない } updateTxtOrderState(error); } protected void updateTxtDefaultOrder() { // DefaultOrderテキストボックスは編集はしないのでinitと同じで良い initDefaultOrder(); } /** * モデルのorderが変更されたので画面に反映する */ protected void updateTxtOrder() { float order = model.getOrder(); Float old; try { old = Float.parseFloat(txtOrder.getText()); } catch (RuntimeException ex) { old = null; } if (old == null || old != order) { // 現在の入力している値と数値的に異なる場合のみ再設定する // (自分のテキストボックス変更イベントによりモデルが変更され、その結果、 // テキストボックスへの値変更が呼び出された場合に状態エラーが発生する。) txtOrder.setText(Float.toString(order)); updateTxtOrderState(false); } } protected void updateButtonState() { actOK.setEnabled(model.isValid()); } protected void onOK() { if (!model.isValid()) { return; } model.setResult(true); dispose(); } protected void onCancel() { model.setResult(false); dispose(); } } /** * レイヤーの追加ダイアログを開く */ protected void onAddLayer() { AddLayerDialogModel model = new AddLayerDialogModel(); model.setPartsCategories(categories); final AddLayerDialog dlg = new AddLayerDialog(this, true); dlg.setModel(model); // 中央に配置 Point loc = getLocationOnScreen(); int centerX = loc.x + getWidth() / 2; int centerY = loc.y + getHeight() / 2; int x = centerX - dlg.getWidth() / 2; int y = centerY - dlg.getHeight() / 2; dlg.setLocation(x, y); dlg.setVisible(true); if (model.isResult()) { PartsCategory category = model.getSelectedPartsCategory(); Layer layer = model.getSelectedLayer(); float layerOrder = model.getOrder(); dataModel.add(category, layer, layerOrder); } } /** * 選択レイヤーを削除する */ protected void onDeleteLayer() { int selrow = tblLayerOrder.getSelectedRow(); if (selrow >= 0) { dataModel.remove(selrow); } } } /** * レイヤーカスタマイズダイアログのデータモデル */ class LayerOrderCustomizeDialogModel { /** * 保持しているレイヤーパターンの登録・変更・削除を通知されるリスナ */ public interface ChangeListener extends EventListener { /** * 通知タイプ */ public enum ChangeType { ADD, MODIFY, REMOVE } /** * 無名のキー名 */ public static final CustomLayerOrderKey ANONYMOUS = new CustomLayerOrderKey("", "", null); /** * イベント */ public class Change extends EventObject { private static final long serialVersionUID = -4578290841626577210L; /** * レイヤーパターン名 */ private CustomLayerOrderKey name; /** * 変更タイプ */ private ChangeType changeType; public Change(LayerOrderCustomizeDialogModel source, CustomLayerOrderKey name, ChangeType changeType) { super(source); this.name = name; this.changeType = changeType; } public CustomLayerOrderKey getName() { return name; } public ChangeType getChangeType() { return changeType; } @Override public LayerOrderCustomizeDialogModel getSource() { return (LayerOrderCustomizeDialogModel) super.getSource(); } @Override public String toString() { return "Change [name=" + name + ", changeType=" + changeType + "]"; } } void onChange(Change change); } /** * イベントリスナのリスト */ private final EventListenerList listeners = new EventListenerList(); /** * レイヤー名パターンを保持する。(patternsMapから導出され、以後、監視される。) */ private final ObservableList patternNames = new ObservableList(); /** * レイヤーパターン名をキーとして、レイヤーの構成リストを値とするマップ。 * キーはpatternNamesの監視リストと連携する。 */ private final Map> patternsMap = new HashMap>(); /** * レイヤー編集画面の初期値 */ private List currentList = Collections.emptyList(); /** * コンストラクタ */ public LayerOrderCustomizeDialogModel() { patternNames.addListChangeListener(new ListChangeListener() { @Override public void onChanged(Change c) { switch (c.getType()) { case ADD: // パターン名が追加された場合は、あわせて導出元のマップも追加する CustomLayerOrderKey newName = c.getNewValue(); if (!patternsMap.containsKey(newName)) { // まだマップに存在しなければ空のリストを作成しておく patternsMap.put(newName, new ArrayList()); fireEvent(ChangeListener.ChangeType.ADD, newName); } break; case REMOVE: // パターン名が削除された場合は、導出元のマップも削除する。 CustomLayerOrderKey oldName = c.getOldValue(); patternsMap.remove(oldName); fireEvent(ChangeListener.ChangeType.REMOVE, oldName); break; } } }); } /** * 変更通知リスナを登録する * @param l リスナ */ public void addListChangeListener(ChangeListener l) { listeners.add(ChangeListener.class, l); } /** * 変更通知リスナを登録解除する * @param l リスナ */ public void removeListChangeListener(ChangeListener l) { listeners.remove(ChangeListener.class, l); } /** * 全ての変更通知リスナに対して変更イベントを通知する。 * @param type 変更タイプ * @param name 名前 */ protected void fireEvent(ChangeListener.ChangeType type, CustomLayerOrderKey name) { // Guaranteed to return a non-null array Object[] ll = listeners.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event // ※ 逆順で通知するのがSwingの作法らしい。 ChangeListener.Change event = null; for (int i = ll.length - 2; i >= 0; i -= 2) { if (ll[i] == ChangeListener.class) { // Lazily create the event: if (event == null) { event = new ChangeListener.Change(this, name, type); } ((ChangeListener) ll[i + 1]).onChange(event); } } } public ObservableList getCurrentList() { return copyWithoutListeners(currentList); } public void setCurrentList(List currentList) { if (!currentList.equals(this.currentList)) { this.currentList = copyWithoutListeners( currentList != null ? currentList : new ArrayList()); fireEvent(ChangeListener.ChangeType.MODIFY, ChangeListener.ANONYMOUS); } } public ObservableList getPatternNames() { return patternNames; } public ObservableList getCopy(CustomLayerOrderKey name) { return copyWithoutListeners(patternsMap.get(name)); } public void put(CustomLayerOrderKey name, List layerOrderList) { boolean exist = patternsMap.containsKey(name); patternsMap.put(name, copyWithoutListeners(layerOrderList)); if (!exist) { patternNames.add(name); fireEvent(ChangeListener.ChangeType.ADD, name); } else { fireEvent(ChangeListener.ChangeType.MODIFY, name); } } public void remove(CustomLayerOrderKey name) { if (patternNames.contains(name)) { // 名前の削除によりリスナーでマップも削除される patternNames.remove(name); } } /** * 監視可能なリストをコピーして返す。ただし、既存のリスナーはコピーされない。 * 返される可能可能リストは要素の変更を監視してリストの変更通知として返すように設定される。 * @param src * @return */ public ObservableList copyWithoutListeners(List src) { if (src == null) { return null; } ObservableList list = createObservableList(); for (CustomLayerOrder item : src) { list.add(item.copy()); } return list; } /** * 内包する要素の変更通知をリストの更新通知に接続する要素を含めた監視可能なリストを作成して返す。 * @return */ public ObservableList createObservableList() { final List rawList = new ArrayList(); final ObservableList obsList = new ObservableList(rawList); final PropertyChangeListener listener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { CustomLayerOrder source = (CustomLayerOrder) evt.getSource(); int index = rawList.indexOf(source); obsList.fireEvent(ListChangeListener.ChangeType.MODIFIY, index, null, source); } }; ObservableList.Hook hook = new ObservableList.Hook() { @Override public void add(CustomLayerOrder item) { item.addPropertyChangeListener(listener); } @Override public void remove(CustomLayerOrder item) { item.removePropertyChangeListener(listener); } }; obsList.setHook(hook); return obsList; } } CharacterManaJ/src/main/java/charactermanaj/ui/AboutBox.java0000644000175000017500000003034613615720000024173 0ustar paulliupaulliupackage charactermanaj.ui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.StringReader; import java.io.Writer; import java.net.URL; import java.nio.charset.Charset; import java.text.DecimalFormat; import java.util.Enumeration; import java.util.Map; import java.util.Properties; import java.util.TreeMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.Document; import javax.swing.text.EditorKit; import charactermanaj.model.AppConfig; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.DesktopUtilities; import charactermanaj.util.DirectoryConfig; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.LocalizedTextResource; import charactermanaj.util.SystemUtil; /** * Aboutボックスを表示する. * * @author seraphy */ public class AboutBox { /** * ロガー */ private static Logger logger = Logger.getLogger(AboutBox.class.getName()); private JFrame parent; public AboutBox(JFrame parent) { if (parent == null) { throw new IllegalArgumentException(); } this.parent = parent; } /** * Aboutボックスを表示する. */ public void showAboutBox() { final JTabbedPane tabs = new JTabbedPane(); // 解像度スケールで補正する Dimension dim = new Dimension(500, 400); if (this.parent != null) { ScaleSupport scaleSupport = ScaleSupport.getInstance(this.parent); if (scaleSupport != null) { dim = scaleSupport.manualScaled(dim); } } tabs.setPreferredSize(dim); final JPanel aboutPanel = createAboutPanel(); final JSysInfoPanel sysInfoPanel = new JSysInfoPanel() { private static final long serialVersionUID = 1L; @Override protected void onGc() { super.onGc(); setText(getSysInfoText()); } }; tabs.addTab("About", aboutPanel); tabs.addTab("System", sysInfoPanel); tabs.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { if (tabs.getSelectedIndex() == 1) { sysInfoPanel.setText(getSysInfoText()); } } }); JOptionPane.showMessageDialog(parent, tabs, "About", JOptionPane.INFORMATION_MESSAGE); } protected JPanel createAboutPanel() { LocalizedTextResource textResource = new LocalizedTextResource() { @Override protected URL getResource(String resourceName) { return getClass().getClassLoader().getResource(resourceName); } }; String message = textResource.getText("appinfo/about.html", Charset.forName("UTF-8")); AppConfig appConfig = AppConfig.getInstance(); String versionInfo = appConfig.getImplementationVersion(); String specificationVersionInfo = appConfig.getSpecificationVersion(); message = message.replace("@@IMPLEMENTS-VERSIONINFO@@", versionInfo); message = message.replace("@@SPECIFICATION-VERSIONINFO@@", specificationVersionInfo); JPanel aboutPanel = new JPanel(new BorderLayout()); JEditorPane editorPane = new JEditorPane(); editorPane.addHyperlinkListener(new HyperlinkListener() { public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) { URL url = e.getURL(); if (url != null) { try { if (!DesktopUtilities.browse(url.toURI())) { JOptionPane.showMessageDialog(parent, url.toString()); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(parent, ex); } } } } }); editorPane.setEditable(false); editorPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE); editorPane.setContentType("text/html"); // HTML上のcharsetの指定を無視する. Document doc = editorPane.getDocument(); doc.putProperty("IgnoreCharsetDirective", Boolean.TRUE); // editorPane.setText(message); // HTML上のcontent-typeを無視する設定はread時のみ有効のようなのでreadを使う. EditorKit editorKit = editorPane.getEditorKit(); try { StringReader rd = new StringReader(message); try { editorKit.read(rd, doc, 0); } finally { rd.close(); } } catch (Exception ex) { logger.log(Level.SEVERE, ex.toString(), ex); } editorPane.setSelectionStart(0); editorPane.setSelectionEnd(0); aboutPanel.add(new JScrollPane(editorPane), BorderLayout.CENTER); return aboutPanel; } /** * システム情報を取得してHTML形式の文字列として返す.
* ランタイム情報、システムプロパティ情報、環境変数情報を取得する.
* * @return システム情報のHTML文字列 */ protected String getSysInfoText() { // ランタイム情報の取得 long freeMem, totalMem, maxMem; Runtime rt = Runtime.getRuntime(); totalMem = rt.totalMemory() / 1024; freeMem = rt.freeMemory() / 1024; maxMem = rt.maxMemory() / 1024; DecimalFormat decimalFmt = new DecimalFormat("#,###,##0"); StringBuilder buf = new StringBuilder(); buf.append(""); buf.append("

Runtime Information

"); buf.append(""); buf.append(""); buf.append(""); buf.append(""); buf.append("
Max Memory:" + decimalFmt.format(maxMem) + " KiB
Total Memory:" + decimalFmt.format(totalMem) + " KiB
Free Memory:" + decimalFmt.format(freeMem) + " KiB
"); // スクリーンスケールの取得 ScaleSupport scaleSupport = ScaleSupport.getInstance(parent); if (scaleSupport == null) { scaleSupport = ScaleSupport.getDefault(); } String strRetina = scaleSupport.isRetina() ? "(Retina)" : ""; buf.append("

Screen Scale

"); buf.append(""); buf.append(""); buf.append(""); buf.append(""); buf.append(""); buf.append(""); buf.append(""); buf.append("
system scale x" + scaleSupport.getDefaultScaleX() + strRetina + "
system scale y" + scaleSupport.getDefaultScaleY() + strRetina + "
calibrate scale x" + scaleSupport.getManualScaleX() + "
calibrate scale y" + scaleSupport.getManualScaleY() + "
screen resolution" + ScaleSupport.getScreenResolution() + "
screen scale" + ScaleSupport.getScreenScale() + "
"); // キャラクターデータベースの取得 DirectoryConfig dirConfig = DirectoryConfig.getInstance(); String charactersDir = null; try { charactersDir = dirConfig.getCharactersDir().toString(); } catch (RuntimeException ex) { charactersDir = "**INVALID**"; } buf.append("

Character Database

"); buf.append(""); buf.append(""); buf.append(""); buf.append("
Location" + escape(charactersDir) + "
"); // サポートしているエンコーディングの列挙 buf.append("

Available Charsets

"); Charset defaultCharset = Charset.defaultCharset(); StringBuilder bufChars = new StringBuilder(); boolean foundWin31j = false; bufChars.append(""); for (Map.Entry entry : Charset.availableCharsets().entrySet()) { String name = entry.getKey(); Charset charset = entry.getValue(); boolean isDef = charset.equals(defaultCharset); boolean win31j = name.toLowerCase().equals("windows-31j"); StringBuilder aliasBuf = new StringBuilder(); for (String alias : charset.aliases()) { if (aliasBuf.length() > 0) { aliasBuf.append(", "); } aliasBuf.append(alias); if (alias.toLowerCase().equals("cswindows31j")) { win31j = true; } } foundWin31j = foundWin31j || win31j; bufChars.append(""); } bufChars.append("
"); if (isDef || win31j) { bufChars.append(""); } if (win31j) { bufChars.append(""); } bufChars.append(name); if (win31j) { bufChars.append(""); } if (isDef || win31j) { bufChars.append("*"); } bufChars.append("" + aliasBuf.toString() + "
"); if (!foundWin31j) { buf.append("

This system is not supporting Japanese.

"); } buf.append(bufChars.toString()); // システムプロパティの取得 buf.append("

System Properties

"); try { Properties sysprops = System.getProperties(); Enumeration enmKey = sysprops.keys(); TreeMap propMap = new TreeMap(); // プロパティキーのアルファベッド順にソート while (enmKey.hasMoreElements()) { String key = (String) enmKey.nextElement(); String value = sysprops.getProperty(key); propMap.put(key, value == null ? "null" : value); } for (Map.Entry entry : propMap.entrySet()) { buf.append(""); buf.append(""); buf.append(""); } buf.append("
" + escape(entry.getKey()) + "" + escape(entry.getValue()) + "
"); } catch (Exception ex) { buf.append(escape(ex.toString())); } // 環境変数の取得 buf.append("

System Environments

"); try { TreeMap envMap = new TreeMap(); // 環境変数名のアルファベット順にソート envMap.putAll(System.getenv()); buf.append(""); for (Map.Entry entry : envMap.entrySet()) { buf.append(""); buf.append(""); buf.append(""); } buf.append("
" + escape(entry.getKey()) + "" + escape(entry.getValue()) + "
"); } catch (Exception ex) { buf.append(escape(ex.toString())); } // HTMLとして文字列を返す. buf.append(""); return buf.toString(); } protected String escape(String value) { if (value == null) { return null; } value = value.replace("&", "&"); value = value.replace("<", "<"); value = value.replace(">", ">"); return value; } } class JSysInfoPanel extends JPanel { private static final long serialVersionUID = 1L; private JEditorPane editorPane; public JSysInfoPanel() { super(new BorderLayout()); editorPane = new JEditorPane(); editorPane.setEditable(false); editorPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE); editorPane.setContentType("text/html"); editorPane.setText(""); JButton btnSave = new JButton(new AbstractAction("save") { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onSave(); } }); JButton btnGc = new JButton(new AbstractAction("garbage collect") { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { onGc(); } }); JPanel btnPanel = new JPanel(new BorderLayout()); btnPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); btnPanel.add(btnSave, BorderLayout.EAST); btnPanel.add(btnGc, BorderLayout.WEST); add(new JScrollPane(editorPane), BorderLayout.CENTER); add(btnPanel, BorderLayout.SOUTH); } public void setText(String message) { editorPane.setText(message); editorPane.setSelectionStart(0); editorPane.setSelectionEnd(0); } protected void onGc() { SystemUtil.gc(); } protected void onSave() { JFileChooser chooser = new JFileChooser(); chooser.setSelectedFile(new File("sysinfo.html")); if (chooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) { return; } File file = chooser.getSelectedFile(); try { FileOutputStream os = new FileOutputStream(file); try { Writer wr = new OutputStreamWriter(os, Charset.forName("UTF-8")); try { wr.write(editorPane.getText()); wr.flush(); } finally { wr.close(); } } finally { os.close(); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(this, ex); } } } CharacterManaJ/src/main/java/charactermanaj/util/0000755000175000017500000000000013615720000022137 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/util/SetupLocalization.java0000644000175000017500000001622313615720000026457 0ustar paulliupaulliupackage charactermanaj.util; import java.io.File; import java.io.FileFilter; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.JarURLConnection; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.Level; import java.util.logging.Logger; /** * 言語リソースを管理する. * * @author seraphy */ public class SetupLocalization { private final Logger logger = Logger.getLogger(getClass().getName()); public static final String DIRNAME_RESOURCES = "resources"; /** * リソースフォルダ下のサブディレクトリ一覧.
*/ public enum Resources { Languages("languages"), Menu("menu"), Template("template"); private final String dirName; private Resources(String dirName) { this.dirName = dirName; } public String getDirName() { return dirName; } @Override public String toString() { return getDirName(); } } private File baseDir; /** * アプリケーションデータ用ディレクトリを指定して構築する. * * @param baseDir * データディレクトリ */ public SetupLocalization(File baseDir) { if (baseDir == null || !baseDir.isDirectory()) { throw new IllegalArgumentException(); } this.baseDir = baseDir; } /** * コピー対象とするリソース一覧を取得する.
* * @param resourceSet * リソースディレクトリのサブディレクトリ名のリスト * @return リソース一覧(言語関連リソース、テンプレートなど) * @throws IOException * 失敗 */ protected Collection getResourceList(EnumSet resourceSet) throws IOException { if (resourceSet == null) { resourceSet = EnumSet.noneOf(Resources.class); } ArrayList resources = new ArrayList(); ClassLoader cl = getClass().getClassLoader(); for (Resources resourceKey : resourceSet) { String name = resourceKey.getDirName(); URL loc = cl.getResource(name); if (loc == null) { continue; } String protocol = loc.getProtocol(); if ("file".equals(protocol)) { // ファイル上にクラスやリソースがある場合 try { File dir = new File(loc.toURI()); File[] files = dir.listFiles(); if (files != null) { for (File file : files) { if (file.isDirectory()) { continue; } resources.add(name + "/" + file.getName()); } } } catch (URISyntaxException e) { throw new RuntimeException(e); } } else if ("jar".equals(protocol)) { // jarにクラスやリソースがある場合 JarURLConnection conn = (JarURLConnection) loc.openConnection(); JarEntry dirEntry = conn.getJarEntry(); assert dirEntry != null; // "jar:file:xxxx.jar!yyyy" のyyyyの部分 String prefix = dirEntry.getName() + "/"; JarFile jarFile = conn.getJarFile(); try { Enumeration enm = jarFile.entries(); while (enm.hasMoreElements()) { JarEntry entry = enm.nextElement(); if (entry.isDirectory()) { continue; } String entryName = entry.getName(); if (entryName.startsWith(prefix)) { resources.add(entryName); } } } finally { if (!conn.getUseCaches()) { // キャッシュしてある場合は明示的にクローズしない. // (そもそもクローズする必要はないかも) // (たぶん、システムなどがインスタンスを再利用していると思われるため) // (jdk5でクローズすると例外が発生する。jdk7のリビジョンによっても発生するようだ) // http://bugs.sun.com/view_bug.do?bug_id=7050028 jarFile.close(); } } } } logger.log(Level.FINE, "resource list: " +resources); return resources; } /** * リソースをファイルにコピーする.
* * @param fromURL * @param toFile * @throws IOException */ protected void copyResource(URL fromURL, File toFile) throws IOException { logger.log(Level.INFO, "copy resource '" + fromURL + "' to '" + toFile + "'"); File dir = toFile.getParentFile(); if ( !dir.exists()) { if ( !dir.mkdirs()) { throw new IOException("can't create directory. " + dir); } } URLConnection conn = fromURL.openConnection(); conn.setDoInput(true); InputStream is = conn.getInputStream(); try { long lastModified = conn.getLastModified(); OutputStream os = new FileOutputStream(toFile); try { byte[] buf = new byte[4096]; for (;;) { int rd = is.read(buf); if (rd <= 0) { break; } os.write(buf, 0, rd); } } finally { os.close(); } boolean result = toFile.setLastModified(lastModified); logger.log(Level.FINE, "setLastModified(" + toFile+ ") succeeded=" + result); } finally { is.close(); } } /** * リソースディレクトリを返す. * * @return リソースディレクトリ */ public File getResourceDir() { try { return new File(baseDir, DIRNAME_RESOURCES).getCanonicalFile(); } catch (Exception ex) { throw new RuntimeException(ex); } } /** * ローカルシステム上のアプリケーションデータディレクトリに言語リソースをコピーする. * * @param resourceSet * コピーするリソースセット. * @param overwrite * 上書きを許可する場合はtrue、スキップする場合はfalse * @param filter * ファイルの出力先パスを得てコピーの有無を判断するフィルタ、nullの場合はすべて許可する * @throws IOException * 失敗 */ public void setupToLocal(EnumSet resourceSet, boolean overwrite, FileFilter filter) throws IOException { File toDir = getResourceDir(); ClassLoader cl = ResourceLoader.getDefaultClassLoader(); for (String resourceName : getResourceList(resourceSet)) { URL url = cl.getResource(resourceName); if (url != null) { File toFile = new File(toDir, resourceName).getCanonicalFile(); if (overwrite || !toFile.exists()) { // 上書き許可か、まだファイルが存在しなければ if (filter == null || filter.accept(toFile)) { // フィルタが指定されていないか、フィルタによって許可された場合はコピーする copyResource(url, toFile); } } } else { logger.log(Level.WARNING, "missing resource: " + resourceName); } } } /** * ローカルシステム上のアプリケーションデータディレクトリに言語リソースをコピーする. * * @param resourceSet * コピーするリソースセット. * @param overwrite * 上書きを許可する場合はtrue、スキップする場合はfalse * @throws IOException * 失敗 */ public void setupToLocal(EnumSet resourceSet, boolean overwrite) throws IOException { setupToLocal(resourceSet, overwrite, null); } } CharacterManaJ/src/main/java/charactermanaj/util/ResourceNames.java0000644000175000017500000000252113615720000025555 0ustar paulliupaulliupackage charactermanaj.util; import java.util.AbstractList; import java.util.Arrays; /** * 関連もしくは類似するリソースをまとめて取り扱うためにグループ化するためのクラス.
* * @author seraphy */ public class ResourceNames extends AbstractList { private final String[] resourceNames; public ResourceNames(String[] resourceNames) { if (resourceNames == null) { throw new IllegalArgumentException(); } this.resourceNames = resourceNames; } /** * 順次を逆転させた新しいインスタンスを返す * * @return 順序を逆転させたインスタンス */ public ResourceNames reverse() { int len = resourceNames.length; String[] tmp = new String[len]; for (int idx = 0; idx < len; idx++) { tmp[len - idx - 1] = resourceNames[idx]; } return new ResourceNames(tmp); } @Override public int hashCode() { return Arrays.hashCode(resourceNames); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof ResourceNames) { ResourceNames o = (ResourceNames) obj; return Arrays.equals(resourceNames, o.resourceNames); } return false; } @Override public int size() { return resourceNames.length; } @Override public String get(int index) { return resourceNames[index]; } } CharacterManaJ/src/main/java/charactermanaj/util/LocalizedMessageComboBoxRender.java0000644000175000017500000000350313615720000031007 0ustar paulliupaulliupackage charactermanaj.util; import java.awt.Component; import java.util.Properties; import javax.swing.JList; import javax.swing.plaf.basic.BasicComboBoxRenderer; /** * ローカライズリソースをサポートするオブジェクトをコンボボックスに表示するコンボボックスレンダー */ public class LocalizedMessageComboBoxRender extends BasicComboBoxRenderer { /** * シリアライズバージョンID */ private static final long serialVersionUID = 2148264299941543651L; /** * リソースホルダ */ private Properties strings; public LocalizedMessageComboBoxRender(Properties strings) { if (strings == null) { throw new IllegalArgumentException(); } this.strings = strings; } @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Object localizedString = getLocalizedString(value); return super.getListCellRendererComponent(list, localizedString, index, isSelected, cellHasFocus); } /** * ローカライズリソースIDを取得する.
* サポートしていないか、該当がなければ、toString()の結果を返す.
* @param value オブジェクト * @return ローカライズされた文字列、もしくは通常の文字列 */ protected String getLocalizedString(Object value) { if (value == null) { return "(null)"; } if (value instanceof LocalizedMessageAware) { LocalizedMessageAware o = (LocalizedMessageAware) value; String id = o.getLocalizedResourceId(); String localizedString = null; if (id != null) { localizedString = strings.getProperty(id); if (localizedString == null) { return id; } } if (localizedString != null) { return localizedString; } } return value.toString(); } } CharacterManaJ/src/main/java/charactermanaj/util/UserDataFactory.java0000644000175000017500000002125113615720000026043 0ustar paulliupaulliupackage charactermanaj.util; import java.io.File; import java.net.URI; import java.nio.charset.Charset; import java.util.Arrays; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; /** * ユーザーデータの保存先を生成するファクトリ * * @author seraphy */ public class UserDataFactory { /** * ロガー */ private static final Logger logger = Logger.getLogger(UserDataFactory.class.getName()); private final File userDataDir; private UserDataFactory(File userDataDir) { this.userDataDir = userDataDir; } /** * インスタンスを取得する. * * @return インスタンス */ public static UserDataFactory getInstance() { return new UserDataFactory(ConfigurationDirUtilities.getUserDataDir()); } /** * ローカルデータ用のインスタンスを取得する. * * @return インスタンス */ public static UserDataFactory getLocalInstance() { return new UserDataFactory(ConfigurationDirUtilities.getLocalUserDataDir()); } /** * 拡張子を含むファイル名を指定し、そのファイルが保存されるべきユーザディレクトリを判定して返す.
* nullまたは空の場合、もしくは拡張子がない場合はユーザディレクトリのルートを返します.
* フォルダがなければ作成されます.
* * @param name * ファイル名、もしくはnull * @return ファィルの拡張子に対応したデータ保存先フォルダ */ public File getSpecialDataDir(String name) { return getSpecialDataDir(name, userDataDir); } /** * 拡張子を含むファイル名を指定し、そのファイルが保存されるべきユーザディレクトリを判定して返す.
* nullまたは空の場合、もしくは拡張子がない場合はユーザディレクトリのルートを返します.
* フォルダがなければ作成されます.
* * @param name ファイル名、もしくはnull * @param userDataDir ユーザーディレクトリ * @return ファィルの拡張子に対応したデータ保存先フォルダ */ private File getSpecialDataDir(String name, File userDataDir) { if (name != null && name.length() > 0) { int seppos = name.lastIndexOf('-'); if (name.endsWith(".xml") && seppos >= 0) { // 「foo-????.xml」形式の場合は「????」でグループ化する String groupName = name.substring(seppos + 1, name.length() - 4); if (groupName.length() > 0) { userDataDir = new File(userDataDir, groupName); } } else { // 拡張子によるグループ化 int pos = name.lastIndexOf('.'); if (pos >= 0) { String ext = name.substring(pos + 1); if (ext.length() > 0) { if ("ser".equals(ext)) { userDataDir = new File(userDataDir, "caches"); } else { userDataDir = new File(userDataDir, ext + "s"); } } } } } // フォルダがなければ作成する. if (!userDataDir.exists()) { boolean result = userDataDir.mkdirs(); logger.log(Level.INFO, "makeDir: " + userDataDir + " /succeeded=" + result); } return userDataDir; } /** * 指定した名前のユーザーデータ保存先を作成する. * * @param name * ファイル名 * @return 保存先 */ public UserData getUserData(String name) { if (name == null || name.trim().length() == 0) { throw new IllegalArgumentException(); } return new FileUserData(new File(getSpecialDataDir(name), name)); } /** * docBaseの名前ベースのUUIDをプレフィックスをもつユーザーデータ保存先を作成する.
* * @param docBase * URI、null可 * @param name * ファイル名 * @return 保存先 */ public UserData getMangledNamedUserData(URI docBase, String name) { // Mangled名はファイル名を既定でUTF-8変換しハッシュ化したものを使用する Charset fileNameEncoding = getMangledEncoding(); String mangledName = getMangledName(docBase, fileNameEncoding); FileUserData userData = (FileUserData) getUserData(mangledName + "-" + name); if (!userData.exists()) { // 指定されたMangled名が、まだ実在しない場合 // システムデフォルトの文字コードでMangledされた旧名があれば // 旧名のファイル名をUTF-8によるMangledされたものにリネームする。 // (ver0.999まではmangledの文字コードを明示していなかったため、 // java5以前はシステム固有、java6以降ではfile.encodingのシステムプロパティで変動していた) for (Charset defaultEncoding : getSystemEncodings()) { if (!fileNameEncoding.equals(defaultEncoding)) { String oldMangledName = getMangledName(docBase, defaultEncoding); FileUserData oldUserData = (FileUserData) getUserData(oldMangledName + "-" + name); if (oldUserData.exists()) { logger.log(Level.INFO, "rename mangled: (" + defaultEncoding + ")" + oldUserData.getFile() + " -> (" + fileNameEncoding + ")" + userData.getFile()); oldUserData.getFile().renameTo(userData.getFile()); break; } } } } return userData; } /** * docBaseをハッシュ値化文字列にした、名前ベースのUUIDを返す.
* docBaseがnullの場合は空文字とみなして変換する.
* (衝突の可能性は無視する。)
* * @param docBase * URI、null可 * @param encoding * docBase名をハッシュ化するための文字コード * @return 名前ベースのUUID */ private String getMangledName(URI docBase, Charset encoding) { String docBaseStr; if (docBase == null) { docBaseStr = ""; } else { docBaseStr = docBase.toString(); } String mangledName = UUID.nameUUIDFromBytes(docBaseStr.getBytes(encoding)).toString(); if (logger.isLoggable(Level.FINEST)) { logger.log(Level.FINEST, "mangledName " + docBase + "=" + mangledName); } return mangledName; } /** * Mangled名生成に使う文字コード */ private static Charset mangledEncoding; /** * システムのデフォルトの文字コードの候補。 */ private static Charset[] systemEncodings; /** * Mandled名生成に使う文字コードを指定するシステムプロパティ名 */ public static final String KEY_MANGLED_ENCODING = "charactermanaj.mangled.encoding"; /** * * @return */ private static Charset getMangledEncoding() { if (mangledEncoding == null) { String encName = System.getProperty(KEY_MANGLED_ENCODING, "UTF-8"); Charset fileNameEncoding = null; if (encName != null && encName.length() > 0) { try { fileNameEncoding = Charset.forName(encName); } catch (Exception ex) { logger.log(Level.SEVERE, "unsupported charset: " + encName, ex); } } if (fileNameEncoding == null) { // だめならシステム標準にする fileNameEncoding = Charset.defaultCharset(); } mangledEncoding = fileNameEncoding; } return mangledEncoding; } /** * システムのデフォルトの文字コードの候補リストを取得する。 * コンテンツの文字コード(file.encoding)とファイル名の文字コード(sun.jnu.encoding)の両方を取得する。 * ただし、どちらも同じコードである場合は1つにまとめられる。 * これらのシステムプロパティのデフォルト値が、どのように決定されるかは以下参照。 * https://stackoverflow.com/questions/1006276/what-is-the-default-encoding-of-the-jvm * http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/native/java/lang/System.c#l169 * http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/solaris/native/java/lang/java_props_md.c#l427 * @return システムのデフォルトの文字コードの候補リスト */ private static Charset[] getSystemEncodings() { if (systemEncodings == null) { String[] keys = { "file.encoding", "sun.jnu.encoding" }; Charset[] encodings = new Charset[keys.length]; int cnt = 0; for (String key : keys) { String encodingName = System.getProperty(key); if (encodingName != null && encodingName.length() > 0) { Charset encoding; try { encoding = Charset.forName(encodingName); } catch (Exception ex) { // 基本的にはありえない logger.log(Level.SEVERE, "invalid charset:" + encodingName, ex); continue; } boolean found = false; for (int idx = 0; idx < cnt; idx++) { if (encodings[idx].equals(encoding)) { found = true; break; } } if (!found) { encodings[cnt++] = encoding; } } } systemEncodings = Arrays.copyOf(encodings, cnt); } return systemEncodings; } } CharacterManaJ/src/main/java/charactermanaj/util/ErrorMessageHelper.java0000644000175000017500000000751013615720000026543 0ustar paulliupaulliupackage charactermanaj.util; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Frame; import java.awt.HeadlessException; import java.awt.Window; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.PrintWriter; import java.io.StringWriter; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JDialog; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import charactermanaj.ui.util.ScaleSupport; /** * 例外を表示するダイアログ.
* ログにも記録される.
* @author seraphy */ public final class ErrorMessageHelper { /** * ロガー */ private static final Logger logger = Logger.getLogger(ErrorMessageHelper.class.getName()); private ErrorMessageHelper() { super(); } /** * 例外が発生したことを示すダイアログを表示し、ログに記録する.
* @param parent ダイアログを表示する親、null可 * @param ex 例外、nullの場合はなにもせずに戻る. */ public static void showErrorDialog(Component parent, Throwable ex) { if (ex == null) { return; } // ログに記録する. logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); // 例外を表示するパネルの生成 JTextArea textArea = new JTextArea(); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); // 例外のコールスタックをパネルに表示できるように出力 pw.close(); textArea.setText(sw.toString()); textArea.setSelectionStart(0); textArea.setSelectionEnd(0); textArea.setEditable(false); JScrollPane scr = new JScrollPane(textArea); scr.setPreferredSize(new Dimension(400, 150)); scr.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scr.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); // ダイアログの表示 //JOptionPane.showMessageDialog(parent, scr, "ERROR", JOptionPane.ERROR_MESSAGE); // 以下、JOptionPaneの既定の処理を真似つつ、リサイズ可能なダイアログを作成する JOptionPane pane = new JOptionPane(scr, JOptionPane.ERROR_MESSAGE); Window window = getWindowForComponent(parent); final JDialog dialog; String title = "ERROR"; if (window instanceof Frame) { dialog = new JDialog((Frame) window, title, true); } else { dialog = new JDialog((Dialog) window, title, true); } Container contentPane = dialog.getContentPane(); // xボタンでダイアログを破棄する dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); contentPane.setLayout(new BorderLayout()); contentPane.add(pane, BorderLayout.CENTER); dialog.setResizable(true); ScaleSupport scaleSupport = ScaleSupport.getInstance(dialog); Dimension wnddim = dialog.getPreferredSize(); wnddim = scaleSupport.manualScaled(wnddim); dialog.setSize(wnddim); dialog.setLocationRelativeTo(parent); pane.addPropertyChangeListener(JOptionPane.VALUE_PROPERTY, new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if (dialog.isVisible() && event.getNewValue() != null) { // ボタン押下等によりダイアログの結果が確定したらダイアログを破棄する dialog.dispose(); } } }); dialog.setVisible(true); } static Window getWindowForComponent(Component parentComponent) throws HeadlessException { if (parentComponent == null) return JOptionPane.getRootFrame(); if (parentComponent instanceof Frame || parentComponent instanceof Dialog) return (Window) parentComponent; return getWindowForComponent(parentComponent.getParent()); } } CharacterManaJ/src/main/java/charactermanaj/util/UserData.java0000644000175000017500000000170713615720000024517 0ustar paulliupaulliupackage charactermanaj.util; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * ユーザーデータの保存先 * @author seraphy */ public interface UserData { /** * データを開く * @return 入力ストリーム * @throws IOException 開けなかった場合 */ InputStream openStream() throws IOException; /** * データを書き込む * @return 出力ストリーム * @throws IOException 開けなかった場合 */ OutputStream getOutputStream() throws IOException; /** * 更新日時(エポックタイム)、まだ存在しない場合は0 * @return 更新日時 */ long lastModified(); /** * サイズ * @return */ long length(); /** * 存在するか? * @return 存在すればtrue */ boolean exists(); /** * 削除する.
* すでに存在しない場合は何もしない.
* @return 削除された場合はtrue */ boolean delete(); } CharacterManaJ/src/main/java/charactermanaj/util/XMLUtilities.java0000644000175000017500000001447113615720000025345 0ustar paulliupaulliupackage charactermanaj.util; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.NoSuchElementException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; /** * XML用のユーテリティ.
* * @author seraphy */ public final class XMLUtilities { /** * プライベートコンストラクタ */ private XMLUtilities() { super(); } /** * XMLドキュメントをロードして返します. 名前空間を有効とします. * * @param is * ロードするXMLドキュメントの入力ストリーム * @return ドキュメント * @throws IOException * 読み込みに失敗した場合 */ public static Document loadDocument(InputStream is) throws IOException { Document doc; try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); final ArrayList errors = new ArrayList(); builder.setErrorHandler(new ErrorHandler() { public void error(SAXParseException exception) throws SAXException { errors.add(exception); } public void fatalError(SAXParseException exception) throws SAXException { errors.add(exception); } public void warning(SAXParseException exception) throws SAXException { errors.add(exception); } }); doc = builder.parse(is); if (errors.size() > 0) { throw errors.get(0); } return doc; } catch (ParserConfigurationException ex) { throw new RuntimeException("JAXP Configuration Exception.", ex); } catch (SAXException ex) { IOException ex2 = new IOException("xml read failed."); ex2.initCause(ex); throw ex2; } } /** * 指定した名前の子要素で、lang属性が一致するものの値を返す.
* langが一致するものがない場合は最初の要素の値を返す.
* 一つも要素がない場合はnullを返す. * * @param parent * 親要素 * @param elementName * 子要素の名前 * @param lang * 言語属性 * @return 言語属性が一致する子要素の値、もしくは最初の子要素の値、もしくはnull */ public static String getLocalizedElementText(Element parent, String elementName, String lang) { String text = null; for (Element childelm : getChildElements(parent, elementName)) { String val = childelm.getTextContent(); // 最初の定義をデフォルト値として用いる. if (text == null) { text = val; } // lang指定が一致すれば、それを優先する. String langNm = childelm.getAttributeNS( "http://www.w3.org/XML/1998/namespace", "lang"); if (lang.equals(langNm) && val.length() > 0) { text = val; break; } } return text; } /** * 指定した名前の子要素の最初の値を返す. * * @param parent * 親要素 * @param elementName * 子要素の名前 * @return 値、要素がなければnull */ public static String getElementText(Element parent, String elementName) { for (Element childelm : getChildElements(parent, elementName)) { return childelm.getTextContent(); } return null; } /** * 指定した名前の最初の子要素を返す. なければnull. * * @param parent * 親要素 * @param name * 子要素の名前 * @return 最初の子要素、もしくはnull */ public static Element getFirstChildElement(Element parent, final String name) { for (Element elm : getChildElements(parent, name)) { return elm; } return null; } /** * 指定した名前の子要素の列挙子を返す. nullの場合は、すべての子要素を返す. * * @param elm * 親要素 * @param name * 子要素の名前、もしくはnull * @return 子要素の列挙子、該当がない場合は空の列挙子が返される */ public static Iterable getChildElements(Element elm, final String name) { return iterable(elm.getChildNodes(), new Filter() { public boolean isAccept(Node node) { if (node != null && node.getNodeType() == Node.ELEMENT_NODE) { if (name == null || name.equals(node.getNodeName())) { return true; } } return false; } }); } /** * すべての子ノードを列挙子として返す * * @param nodeList * @return */ public static Iterable iterable(final NodeList nodeList) { return iterable(nodeList, null); } /** * フィルタ */ public interface Filter { boolean isAccept(Node node); } /** * 指定したノードリストからフィルタ条件にマッチするものだけを列挙子として返す. * * @param nodeList * ノードリスト、nullの場合は空とみなす * @param filter * フィルタ条件、nullの場合はすべて合致とみなす * @return 合致するものだけを列挙する列挙子 */ public static Iterable iterable( final NodeList nodeList, final Filter filter) { final int mx; if (nodeList == null) { mx = 0; } else { mx = nodeList.getLength(); } return new Iterable() { public Iterator iterator() { return new Iterator() { private int idx = 0; private Node nextNode = getNextNode(); private Node getNextNode() { while (idx < mx) { Node node = nodeList.item(idx++); if (filter == null || filter.isAccept(node)) { return node; } } return null; } public boolean hasNext() { return nextNode != null; } @SuppressWarnings("unchecked") public T next() { Node cur = nextNode; if (cur == null) { throw new NoSuchElementException(); } nextNode = getNextNode(); return (T) cur; } public void remove() { throw new UnsupportedOperationException(); } }; } }; } } CharacterManaJ/src/main/java/charactermanaj/util/LocalizedMessageAware.java0000644000175000017500000000063313615720000027177 0ustar paulliupaulliupackage charactermanaj.util; /** * ローカライズリソースを持っていることを示すインターフェイス.
* @author seraphy */ public interface LocalizedMessageAware { /** * ローカライズリソースのIDを取得する.
* 設定されていない場合はnullが返される.
* @return リソースID、もしくはnull */ String getLocalizedResourceId(); } CharacterManaJ/src/main/java/charactermanaj/util/ResourceLoader.java0000644000175000017500000001147613615720000025731 0ustar paulliupaulliupackage charactermanaj.util; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.security.AccessController; import java.security.PrivilegedAction; import java.security.PrivilegedExceptionAction; /** * リソースをロードするためのクラス. * * @author seraphy */ public class ResourceLoader { private final ClassLoader classLoader; /** * ローカル優先でリソースを探索するリソースローダーを構築します。 */ public ResourceLoader() { this(true); } /** * ローカル優先か、クラス優先のいずれかを指定してリソースローダーを構築します。 * @param preferredLocal */ public ResourceLoader(boolean preferredLocal) { this(getUsersResourceDirClassLoader(getDefaultClassLoader(), preferredLocal)); } /** * クラスローダーを指定してリソースローダーを構築します。 * @param classLoader */ public ResourceLoader(ClassLoader classLoader) { if (classLoader == null) { throw new IllegalArgumentException("classLoader is required."); } this.classLoader = classLoader; } /** * クラスローダを取得する.
* まずローカルファイル上のリソースディレクトリがあれば、それを検索する.
* つぎにスレッドに関連づけられているコンテキストクラスローダか、もしなければ、このクラスをロードしたクラスローダを用いて検索する.
* * @return クラスローダ */ public ClassLoader getClassLoader() { return classLoader; } /** * クラスローダによりリソースをロードする.
* 該当するリソースが存在しない場合はnullを返す.
* リソース名がnullの場合もnullを返す.
* * @param name * リソース名またはnull * @return リソースがあれば、そのURL。なければnull */ public URL getResource(String name) { if (name == null) { return null; } return getClassLoader().getResource(name); } /** * クラスローダを取得する.
* スレッドに関連づけられているコンテキストクラスローダか、もしなければ、このクラスをロードしたクラスローダを返す.
* * @return クラスローダ */ public static ClassLoader getDefaultClassLoader() { return AccessController.doPrivileged(new PrivilegedAction() { public ClassLoader run() { ClassLoader cl = Thread.currentThread().getContextClassLoader(); if (cl == null) { cl = ResourceLoader.class.getClassLoader(); } return cl; } }); } /** * ユーザー用のローカルファイル上のリソースディレクトリにアクセスするクラスローダ取得する.
* 作成されていなければparentをそのまま返す.
* ローカル優先の場合、リソースはローカルファイル上のパスで検索されたのちにparentで検索されます.(標準のURLClassLoaderとは違う探索方法)
* ローカル優先ではない場合は通常どおり、親クラスローダを優先して検索されます.
* * @param parent * 親クラスローダ、nullの場合は親の探索をしない. * @param preferredLocal * ローカル優先か? * @return ローカルシステム上のリソースディレクトリにアクセスするクラスローダ、なければparentのまま */ public static ClassLoader getUsersResourceDirClassLoader(final ClassLoader parent, final boolean preferredLocal) { try { File baseDir = ConfigurationDirUtilities.getUserDataDir(); SetupLocalization localize = new SetupLocalization(baseDir); final File resourceDir = localize.getResourceDir(); if (!resourceDir.exists() || !resourceDir.isDirectory()) { return parent; } URLClassLoader cl = AccessController.doPrivileged(new PrivilegedExceptionAction() { public URLClassLoader run() throws MalformedURLException { URL[] urls = new URL[] { resourceDir.toURI().toURL() }; if (preferredLocal) { // リソースの探索順序をローカル優先にするURLクラスローダ return new URLClassLoader(urls, parent) { @Override public URL getResource(String name) { URL url = findResource(name); // 子が優先 (標準と逆) if (url == null) { ClassLoader parent = getParent(); if (parent != null) { url = parent.getResource(name); } } return url; } }; } else { // リソースの探索順序を親優先(標準)にするURLクラスローダー return new URLClassLoader(urls, parent); } } }); return cl; } catch (Exception ex) { ex.printStackTrace(); return null; } } } CharacterManaJ/src/main/java/charactermanaj/util/FileUserData.java0000644000175000017500000000321613615720000025314 0ustar paulliupaulliupackage charactermanaj.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.logging.Level; import java.util.logging.Logger; /** * ファイルベースのユーザーデータの保存先の実装 * @author seraphy */ public class FileUserData implements UserData { /** * ロガー */ private static final Logger logger = Logger.getLogger(FileUserData.class.getName()); /** * 保存先ファイル */ private File file; public FileUserData(File file) { if (file == null) { throw new IllegalArgumentException(); } this.file = file; } public File getFile() { return file; } @Override public boolean exists() { return file.exists() && file.isFile(); } @Override public long lastModified() { return file.lastModified(); } @Override public long length() { return file.length(); } @Override public InputStream openStream() throws IOException { return new BufferedInputStream(new FileInputStream(file)); } @Override public OutputStream getOutputStream() throws IOException { return new BufferedOutputStream(new FileOutputStream(file)); } @Override public boolean delete() { try { if (exists()) { FileUtilities.delete(file); } return true; } catch (Exception ex) { // セキュリティ例外ぐらい. logger.log(Level.WARNING, "file removing failed." + file, ex); return false; } } @Override public String toString() { return "FileUserData{file:" + file + "}"; } } CharacterManaJ/src/main/java/charactermanaj/util/BeanPropertiesUtilities.java0000644000175000017500000003121413615720000027621 0ustar paulliupaulliupackage charactermanaj.util; import java.awt.Color; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Method; import java.math.BigDecimal; import java.math.BigInteger; import java.util.AbstractMap; import java.util.HashSet; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.TreeMap; import java.util.logging.Level; import java.util.logging.Logger; /** * Setter/Getterのペアをもつビーンのプロパティを文字列化してプロパティに設定するか、 * プロパティからビーンに値を設定するためのユーテリティクラス.
* @author seraphy */ public final class BeanPropertiesUtilities { private static final Logger logger = Logger.getLogger(BeanPropertiesUtilities.class.getName()); private BeanPropertiesUtilities() { throw new RuntimeException("utilities class."); } /** * プロパティ値を文字列として変換する */ public interface StringConverter { Object valueOf(String text); String toString(Object obj); } /** * int値をunsigned 32bit integerとして#つき16進数として文字列化し、 * それをint値として受け取れるようにするための文字列変換クラス. */ public static class UnsignedHexStringConverter implements StringConverter { @Override public Object valueOf(String text) { text = (text != null) ? text.trim() : null; if (text != null && text.length() > 0) { return (int)(long) Long.decode(text); // 符号無し32ビット値を受け取るためにlongで受け取ってintにする。 } return 0; } @Override public String toString(Object obj) { if (obj != null) { return "#" + Long.toString(((Number) obj).longValue() & 0xffffffffL, 16); } return ""; } } /** * プロパティのgetter(またはsetter)のメソッドに付与して、 * プロパティファイルへの読み書きや編集時の文字列変換を行うクラスを明示的に指定できるようにする。 */ @Target({ ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface StringConverterSpec { Class value(); } /** * プロパティへのアクセッサをまとめたもの。 * 実際にビーンにアクセスするためには、{@link #setBean(Object)}でビーンを設定する必要がある。 */ public static class PropertyAccessorMap extends AbstractMap { private final BeanHolder beanHolder; private final Map accessorMap; public PropertyAccessorMap(Map accessorMap, BeanHolder beanHolder) { this.accessorMap = accessorMap; this.beanHolder = beanHolder; } public T getBean() { return beanHolder.getBean(); } public void setBean(T bean) { beanHolder.setBean(bean); } @Override public Set> entrySet() { return accessorMap.entrySet(); } } /** * アクセッサからビーンを間接参照するためのホルダ。 * (実際にビーンにアクセスするまでビーンの設定を遅延させるため。) */ public static class BeanHolder { private T bean; public T getBean() { return bean; } public void setBean(T bean) { this.bean = bean; } } /** * プロパティへのアクセッサ */ public interface PropertyAccessor { /** * プロパティのタイプ * @return */ Class getPropertyType(); /** * ビーンからプロパティを取得する。 * @return */ Object getValue(); /** * ビーンのプロパティを設定する。 * @param value */ void setValue(Object value); /** * プロパティがもつアノテーションを取得する。 * @param annotationClass * @return アノテーション、なければnull */ T getAnnotation(Class annotationClass); } /** * クラスを指定してプロパティアクセッサのマップを生成して返す。 * @param beanClass * @return * @throws IntrospectionException */ public static PropertyAccessorMap getPropertyAccessorMap(final Class beanClass) { if (beanClass == null) { throw new NullPointerException("beanClass"); } Map accessorMap = new TreeMap(); final BeanHolder beanHolder = new BeanHolder(); BeanInfo beanInfo; try { beanInfo = Introspector.getBeanInfo(beanClass); } catch (IntrospectionException ex) { throw new RuntimeException("bean intorospector failed. :" + beanClass, ex); } for (PropertyDescriptor propDesc : beanInfo .getPropertyDescriptors()) { String name = propDesc.getName(); final Class typ = propDesc.getPropertyType(); final Method mtdReader = propDesc.getReadMethod(); final Method mtdWriter = propDesc.getWriteMethod(); if (mtdReader != null && mtdWriter != null) { // 読み書き双方が可能なもののみ対象とする. PropertyAccessor accessor = new PropertyAccessor() { private Object getBean() { Object bean = beanHolder.getBean(); if (bean == null) { throw new IllegalStateException("bean not set."); } return bean; } @Override public Class getPropertyType() { return typ; } @Override public Object getValue() { try { return mtdReader.invoke(getBean()); } catch (RuntimeException ex) { throw ex; } catch (Exception ex) { if (ex.getCause() instanceof RuntimeException) { throw (RuntimeException) ex.getCause(); } throw new RuntimeException(ex); } } @Override public void setValue(Object value) { try { mtdWriter.invoke(getBean(), value); } catch (RuntimeException ex) { throw ex; } catch (Exception ex) { if (ex.getCause() instanceof RuntimeException) { throw (RuntimeException) ex.getCause(); } throw new RuntimeException(ex); } } @Override public E getAnnotation(Class annotationClass) { E annt = mtdReader.getAnnotation(annotationClass); if (annt == null) { annt = mtdWriter.getAnnotation(annotationClass); } return annt; } }; accessorMap.put(name, accessor); } } return new PropertyAccessorMap(accessorMap, beanHolder); } /** * ビーンのSetter/Getterのペアをもつプロパティに対して、Propertiesより該当するプロパティの値を * 読み取り、プロパティに設定します.
* Propertiesに該当するプロパティ名が設定されていなければスキップされます.
* Propertiesにビーンにないプロパティ名があった場合、それは単に無視されます.
* Propertyの値が空文字の場合、Beanのプロパティの型が文字列以外であればnullが設定されます.
* (文字列の場合、空文字のまま設定されます.書き込み時、nullは空文字にされるため、文字列についてはnullを表現することはできません。)
* @param bean 設定されるビーン * @param props プロパティソース * @return 値の設定を拒否されたプロパティの名前、エラーがなければ空 */ public static Set loadFromProperties(Object bean, Properties props) { if (bean == null || props == null) { throw new IllegalArgumentException(); } HashSet rejectNames = new HashSet(); @SuppressWarnings("unchecked") PropertyAccessorMap accessorMap = (PropertyAccessorMap)getPropertyAccessorMap(bean.getClass()); accessorMap.setBean(bean); for (Map.Entry accessorEntry : accessorMap.entrySet()) { String name = accessorEntry.getKey(); PropertyAccessor accessor = accessorEntry.getValue(); Class typ = accessor.getPropertyType(); // プロパティのStringConverterSpecアノテーションがあれば取得する StringConverterSpec anntStringConverter = accessor.getAnnotation(StringConverterSpec.class); String strVal = props.getProperty(name); if (strVal == null) { // 設定値がないのでスキップ continue; } Object val; Throwable reject = null; try { if (anntStringConverter != null) { Class convCls = anntStringConverter.value(); StringConverter conv = convCls.getConstructor().newInstance(); val = conv.valueOf(strVal); } else if (String.class.equals(typ)) { val = strVal; } else if (strVal.length() == 0) { val = null; } else { if (Boolean.class.equals(typ) || boolean.class.equals(typ)) { val = Boolean.valueOf(strVal); } else if (Integer.class.equals(typ) || int.class.equals(typ)) { val = Integer.valueOf(strVal); } else if (Long.class.equals(typ) || long.class.equals(typ)) { val = Long.valueOf(strVal); } else if (Float.class.equals(typ) || float.class.equals(typ)) { val = Float.valueOf(strVal); } else if (Double.class.equals(typ) || double.class.equals(typ)) { val = Double.valueOf(strVal); } else if (BigInteger.class.equals(typ)) { val = new BigInteger(strVal); } else if (BigDecimal.class.equals(typ)) { val = new BigDecimal(strVal); } else if (Color.class.equals(typ)) { long decode = Long.decode(strVal).longValue(); if ((decode & 0xff000000) != 0) { // アルファの指定あり val = new Color((int) decode, true); } else { // アルファの指定なし // (仕組み上、アルファ0の設定値は受け取れないが実用性に問題ないと思われる。) val = new Color((int) decode, false); } } else { rejectNames.add(name); logger.log(Level.WARNING, "unsupported propery type: " + typ + "/beanClass=" + bean.getClass() + " #" + name); continue; } } accessor.setValue(val); reject = null; } catch (Exception ex) { reject = ex; } if (reject != null) { rejectNames.add(name); logger.log(Level.WARNING, "invalid propery: " + typ + "/beanClass=" + bean.getClass() + " #" + name + " /val=" + strVal , reject); } } return rejectNames; } /** * ビーンのSetter/Getterのペアをもつプロパティの各値をPropertiesに文字列として登録します.
* nullの場合は空文字が設定されます.
* @param bean プロパティに転送する元情報となるビーン * @param props 設定されるプロパティ */ public static void saveToProperties(Object bean, Properties props) { if (bean == null || props == null) { throw new IllegalArgumentException(); } try { @SuppressWarnings("unchecked") PropertyAccessorMap accessorMap = (PropertyAccessorMap) getPropertyAccessorMap( bean.getClass()); accessorMap.setBean(bean); for (Map.Entry accessorEntry : accessorMap.entrySet()) { String name = accessorEntry.getKey(); PropertyAccessor accessor = accessorEntry.getValue(); // プロパティのStringConverterSpecアノテーションがあれば取得する StringConverterSpec anntStringConverter = accessor.getAnnotation(StringConverterSpec.class); Object val = accessor.getValue(); String strVal; if (anntStringConverter != null) { StringConverter conv = anntStringConverter.value().getConstructor().newInstance(); strVal = conv.toString(val); } else if (val == null) { strVal = ""; } else if (val instanceof String) { strVal = (String) val; } else if (val instanceof Number) { strVal = ((Number) val).toString(); } else if (val instanceof Boolean) { strVal = ((Boolean) val).booleanValue() ? "true" : "false"; } else if (val instanceof Color) { Color color = (Color) val; int alpha = color.getAlpha(); if (alpha == 255) { strVal = "#" + Integer.toHexString(color.getRGB() & 0xffffff); } else { strVal = "#" + Long.toHexString(color.getRGB() & 0xffffffffL); } } else { logger.log(Level.WARNING, "unsupported propery type: " + val.getClass() + "/beanClass=" + bean.getClass() + " #" + name); continue; } props.setProperty(name, strVal); } } catch (Exception ex) { throw new RuntimeException("bean property read failed. :" + bean.getClass(), ex); } } } CharacterManaJ/src/main/java/charactermanaj/util/AWTExceptionLoggingHandler.java0000644000175000017500000000226013615720000030121 0ustar paulliupaulliupackage charactermanaj.util; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.SwingUtilities; import charactermanaj.ui.MainFrame; /** * SwingのEDT内での例外をロギングするためのハンドラ. * @author seraphy */ public class AWTExceptionLoggingHandler { /** * ロガー */ private static final Logger logger = Logger.getLogger(AWTExceptionLoggingHandler.class.getName()); /** * 例外のハンドル.
* @param ex 例外 */ public void handle(final Throwable ex) { // まずはロギング logger.log(Level.SEVERE, "exception occurred on the event dispatch thread. " + ex, ex); // エラーダイアログを表示する.(非同期) SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame currentFrame = MainFrame.getActivedMainFrame(); if (currentFrame == null || !currentFrame.isDisplayable() || !currentFrame.isVisible()) { // メインフレームがまだ無いか、表示されていないか破棄済みであれば無いとみなす. currentFrame = null; } ErrorMessageHelper.showErrorDialog(currentFrame, ex); } }); } } CharacterManaJ/src/main/java/charactermanaj/util/LocalizedResourceTextLoader.java0000644000175000017500000000264513615720000030423 0ustar paulliupaulliupackage charactermanaj.util; import java.net.URL; import java.nio.charset.Charset; import java.util.Locale; /** * リソースからローカライズされたテキストを取得する.
* * @author seraphy * */ @Deprecated public class LocalizedResourceTextLoader { private static final LocalizedResourceTextLoader inst = new LocalizedResourceTextLoader(); private final ResourceLoader resourceLoader = new ResourceLoader(); private LocalizedTextResource textResource = new LocalizedTextResource() { @Override protected URL getResource(String resourceName) { return resourceLoader.getResource(resourceName); } }; private LocalizedResourceTextLoader() { super(); } public static LocalizedResourceTextLoader getInstance() { return inst; } /** * リソース名を指定して、テキストファイルを読み込んで、その文字列を返す.
* リソースは現在のデフォルトロケールを優先で検索されます.
* ファイルエンコーディングを引数csで指定する.
* * @param name * リソース名 * @param cs * ファイルのエンコーディング * @return ファイルの内容(テキスト) */ public String getText(String name, Charset cs) { return textResource.getText(name, cs); } public String getText(String name, Charset cs, Locale locale) { return textResource.getText(name, cs, locale); } } CharacterManaJ/src/main/java/charactermanaj/util/LocalizedResourcePropertyLoader.java0000644000175000017500000002023713615720000031320 0ustar paulliupaulliupackage charactermanaj.util; import java.io.InputStream; import java.net.URL; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Properties; /** * xml形式のリソース上のプロパティファイルのローカライズされた読み込みを行うためのクラス.
* リソースは、単純名、言語名を末尾に付与したもの、言語名と国を末尾に付与したもの、言語名と国とバリアントを末尾に付与したもの、の順で読み取られる.
* 順番に読み込んで重ね合わせる.
* 一度読み込んだものはキャッシュに保存され次回以降は、それが用いられる.
*/ public class LocalizedResourcePropertyLoader { /** * プロパティファイル群と、それに対するキャッシュ */ private Map propCache; /** * キャッシュを共有するシングルトンインスタンス. */ private static final LocalizedResourcePropertyLoader inst = new LocalizedResourcePropertyLoader( new HashMap()); /** * キャッシュしないローカライズされた読み込み順序をもつプロパティローダー */ protected LocalizedResourcePropertyLoader() { this.propCache = null; } /** * 独立したキャッシュを指定することのできるコンストラクタ.
* * @param propCache * キャッシュ、不要であればnull可 */ protected LocalizedResourcePropertyLoader(Map propCache) { if (propCache == null) { throw new NullPointerException("propCache is required."); } this.propCache = propCache; } /** * プロパティをキャッシュするインスタンスを取得する * * @return インスタンス */ public static LocalizedResourcePropertyLoader getCachedInstance() { return inst; } /** * プロパティをキャッシュしないインスタンスを取得する。 * @return */ public static LocalizedResourcePropertyLoader getNonCachedInstance() { return new LocalizedResourcePropertyLoader(); } /** * リソース名を指定してデフォルトのロケールでローカライズされたリソースプロパティを読み込む.
* リソースはxml形式である。リソース名には.xmlを付与しない.(自動的に内部で付与される.) * * @param name * リソース名 * @return プロパティ */ public Properties getLocalizedProperties(String name) { return getLocalizedProperties(name, null); } /** * リソース名を指定して指定したロケールでローカライズされたリソースプロパティを読み込む.
* リソースはxml形式である。リソース名には.xmlを付与しない.(自動的に内部で付与される.) * * @param name * リソース名 * @param locale * ロケール、nullの場合はデフォルトのロケール * @return プロパティ */ public Properties getLocalizedProperties(String name, Locale locale) { return getLocalizedProperties(name, locale, false); } /** * リソース名を指定して指定したロケールでローカライズされたリソースプロパティを読み込む.
* リソースはxml形式である。リソース名には.xmlを付与しない.(自動的に内部で付与される.) * * @param name * リソース名 * @param locale * ロケール、nullの場合はデフォルトのロケール * @param preferredNatural * リソースの適用優先度を逆順にして、Naturalを優先させる場合はtrue * @return プロパティ */ public Properties getLocalizedProperties(String name, Locale locale, boolean preferredNatural) { ResourceNames resNames = getResourceNames(name, locale); if (preferredNatural) { resNames = resNames.reverse(); } return getProperties(resNames); } /** * リソース名を指定して指定したロケールでローカライズされたリソースプロパティの一覧を取得する.
* リソースはxml形式である。リソース名には.xmlを付与しない.(自動的に内部で付与される.)
* 返される順序は、読み込み順となる。(順番に読み込んで上書きしてゆくことを想定する).
* ロケール中立のものが先頭となり、指定したロケールにもっとも一致するものが最後となる.
* * @param name * リソース名 * @param locale * ロケール、nullの場合はデフォルトのロケール * @return プロパティリソースの一覧(読み込み順) */ protected static ResourceNames getResourceNames(String name, Locale locale) { if (name == null || name.length() == 0) { throw new IllegalArgumentException(); } if (locale == null) { locale = Locale.getDefault(); } String language = locale.getLanguage(); String country = locale.getCountry(); String variant = locale.getVariant(); String[] resourceNames = { name + ".xml", name + "_" + language + ".xml", name + "_" + language + "_" + country + ".xml", name + "_" + language + "_" + country + "_" + variant + ".xml", }; return new ResourceNames(resourceNames); } /** * リソース名群をもとにキャッシュもしくはプロパティをロードして返す.
* キャッシュされていない場合はプロパティをロードして、それをキャッシュに格納する.
* (共有キャッシュ時、もしくは独自のキャッシュが指定されている場合).
* リソースが一つも存在しない場合は実行時例外を発生させる.
* * @param resourceNames * リソース名群 * @return プロパティ */ public Properties getProperties(ResourceNames resourceNames) { if (resourceNames == null) { throw new IllegalArgumentException(); } Properties prop; if (propCache != null) { synchronized (propCache) { prop = propCache.get(resourceNames); if (prop == null) { prop = loadProperties(resourceNames); propCache.put(resourceNames, prop); } } } else { prop = loadProperties(resourceNames); } if (prop == null) { throw new RuntimeException("missing resource: " + resourceNames); } return prop; } /** * リソース名群からリソースプロパティをロードして返す.
* リソースはクラスパス上のリソースを探索した結果に、ローカルディレクトリ上の探索結果を上書きしたものが返される。 * 一つも存在しない場合はnullを返す.
* * @param resourceNames * リソース群名 * @return プロパティ */ protected Properties loadProperties(ResourceNames resourceNames) { if (resourceNames == null) { throw new IllegalArgumentException(); } // システム埋め込みリソースでプロパティを取得したのちに、ユーザ指定のプロパティの内容で上書きする. // バージョンアップによりキーが増えて、既存のローカルファイル上のプロパティファイルにキーが存在しない場合でも // 安全なようにするためのもの。 ClassLoader[] loaders = new ClassLoader[] { ResourceLoader.getDefaultClassLoader(), // クラスパス上のクラスローダー ResourceLoader.getUsersResourceDirClassLoader(null, true), // ローカル用クラスローダ(親指定なし) }; boolean foundResource = false; Properties props = new Properties(); for (ClassLoader loader : loaders) { if (loader == null) { continue; } for (String resourceName : resourceNames) { URL resource = loader.getResource(resourceName); if (resource != null) { Properties org = new Properties(); try { InputStream is = resource.openStream(); try { org.loadFromXML(is); } finally { is.close(); } } catch (Exception ex) { throw new RuntimeException("resource loading error." + resource, ex); } foundResource = true; props.putAll(org); } } } if (foundResource) { return props; } return null; } } CharacterManaJ/src/main/java/charactermanaj/util/ConfigurationDirUtilities.java0000644000175000017500000001663413615720000030156 0ustar paulliupaulliupackage charactermanaj.util; import java.io.File; import java.io.IOException; import java.net.URL; import java.security.CodeSource; import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; import charactermanaj.Main; /** * アプリケーションの設定ファイル等の位置を取得するユーテリティクラス.
* Mainクラスのロード時に最も早くロードされるであろうクラスの一つである.
* @author seraphy */ public final class ConfigurationDirUtilities { public static final String CONFIGURATION_DIR_NAME = "CharacterManaJ"; private static File userDataDir; private static File localUserDataDir; private static File applicationBaseDir; private ConfigurationDirUtilities() { throw new RuntimeException("utilities class."); } /** * ユーザーごとのアプリケーションデータ保存先を取得する.
* 環境変数「APPDATA」もしくはシステムプロパティ「appdata.dir」からベース位置を取得する.
* いずれも設定されておらず、Mac OS Xであれば「~/Library」をベース位置とする。 * Mac OS Xでなければ「~/」をベース位置とする.
* これに対してシステムプロパティ「characterdata.dirname」(デフォルトは「CharacterManaJ」)という * フォルダをユーザー毎のアプリケーションデータの保存先ディレクトリとする.
* * @return アプリケーションデータの保存先 */ public synchronized static File getUserDataDir() { if (userDataDir == null) { String appData = null; // システムプロパティ「appdata.dir」を探す appData = System.getProperty("appdata.dir"); if (appData == null) { // なければ環境変数APPDATAを探す // Windows2000/XP/Vista/Windows7には存在する. appData = System.getenv("APPDATA"); } if (appData == null && Main.isMacOSX()) { // システムプロパティも環境変数にも設定がなく、実行環境がMac OS Xであれば // ~/Libraryをベースにする.(Mac OS Xならば必ずある。) appData = new File(System.getProperty("user.home"), "Library").getPath(); } if (appData == null || appData.trim().length() == 0) { // なければシステムプロパティ「user.home」を使う // このプロパティは必ず存在する. appData = System.getProperty("user.home"); } // ディレクトリを準備する userDataDir = ensureAppDataDir(appData); } return userDataDir; } /** * ユーザーごとのローカルアプリケーションデータ保存先を取得する.
* システムプロパティlocal.appdata.dir、環境変数LOCALAPPDATAのいずれも設定されていない場合は * {@link #getUserDataDir()}と同じである。 * * @return ローカルなアプリケーションデータ保存先 */ public synchronized static File getLocalUserDataDir() { if (userDataDir == null) { String appData = null; // システムプロパティ「local.appdata.dir」を探す appData = System.getProperty("local.appdata.dir"); if (appData == null) { // なければ環境変数LOCALAPPDATAを探す // Windows2000/XP/Vista/Windows7には存在する. appData = System.getenv("LOCALAPPDATA"); } if (appData != null && appData.trim().length() > 0) { localUserDataDir = ensureAppDataDir(appData); } else { // local.appdata.dirシステムプロパティ、LOCALAPPDATA環境変数、いずれもない場合は // getUserDataDir()と同じものとする。 localUserDataDir = getUserDataDir(); } } return localUserDataDir; } /** * ベースとなるディレクトリ名を指定し、本アプリケーション名を付与したディレクトリを準備して、 * そのパスとなるファイルオブジェクトを返す。 * @param baseDir ベースとなるディレクトリ * @return 本アプリケーション用のディレクトリ */ private static File ensureAppDataDir(String baseDir) { // システムプロパティ「characterdata.dirname」のディレクトリ名、なければ「CharacterManaJ」を設定する. String characterDirName = System.getProperty("characterdata.dirname", CONFIGURATION_DIR_NAME); File userDataDir = new File(baseDir, characterDirName).getAbsoluteFile(); // ディレクトリを準備する. if (!userDataDir.exists()) { if (!userDataDir.mkdirs()) { // ログ保管場所も設定されていないのでコンソールに出すしかない. System.err.println("can't create the user data directory. " + userDataDir); } } return userDataDir; } /** * アプリケーションディレクトリを取得する.
* このクラスをコードソースから、ベースとなる位置を割り出す.
* クラスが格納されているクラスパスのフォルダか、JARに固められている場合は、そのJARファイルの、その親ディレクトリを指し示す.
* このクラスのプロテクションドメインのコードソースがnullでコードの位置が取得できないか、 * コードの位置を示すURLがファイルプロトコルでない場合は実行時例外が返される.
* ただし、システムプロパティ「appbase.dir」が明示的に設定されていれば、それが優先される.
*/ public synchronized static File getApplicationBaseDir() { if (applicationBaseDir == null) { String appbaseDir = System.getProperty("appbase.dir"); if (appbaseDir != null && appbaseDir.length() > 0) { // 明示的にアプリケーションベースディレクトリが指定されている場合. try { applicationBaseDir = new File(appbaseDir).getCanonicalFile(); } catch (IOException ex) { ex.printStackTrace(); // 継続する.まだログの準備ができていない可能性が高いので標準エラー出力へ. } } if (applicationBaseDir == null) { // 明示的に指定されていない場合はコードの実行位置から割り出す. ProtectionDomain pdomain = ConfigurationDirUtilities.class.getProtectionDomain(); CodeSource codeSource = pdomain.getCodeSource(); if (codeSource == null) { throw new RuntimeException("codeSource is null: domain=" + pdomain); } URL codeBaseUrl = codeSource.getLocation(); if (!codeBaseUrl.getProtocol().equals("file")) { throw new RuntimeException("codeLocation is not file protocol.: " + codeBaseUrl); } // クラスパスフォルダ、またはJARファイルの、その親 applicationBaseDir = new File(codeBaseUrl.getPath()).getParentFile(); } } return applicationBaseDir; } /** * デフォルトのユーザー固有のキャラクターデータディレクトリを取得する.
* ユーザー固有のキャラクターディレクトリがまだ存在しない場合は作成される.
* @return ユーザー固有のキャラクターデータディレクトリ */ public static File getDefaultCharactersDir() { Logger logger = Logger.getLogger(ConfigurationDirUtilities.class.getName()); File characterBaseDir = new File(ConfigurationDirUtilities.getUserDataDir(), "characters"); if (!characterBaseDir.exists()) { if (!characterBaseDir.mkdirs()) { logger.log(Level.WARNING, "can't create the charatcer base directory. " + characterBaseDir); } } return characterBaseDir; } } CharacterManaJ/src/main/java/charactermanaj/util/SystemUtil.java0000644000175000017500000000357513615720000025136 0ustar paulliupaulliupackage charactermanaj.util; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * システムクラスのためのユーテリティ.
* Findbugsの警告がうっとおしいのでリフレクションで隠す.
* * @author seraphy */ public final class SystemUtil { private static final Class clsSystem; private static final Method garbageCollection; private static final Method exit; private static final int gcLoop = 3; private static final long sleepTime = 100; static { try { clsSystem = System.class; garbageCollection = clsSystem.getMethod("gc"); exit = clsSystem.getMethod("exit", int.class); } catch (NoSuchMethodException ex) { throw new RuntimeException(ex.getMessage(), ex); } catch (SecurityException ex) { throw new RuntimeException(ex.getMessage(), ex); } } private SystemUtil() { super(); } /** * 数回ガベージコレクションをかける.
*/ public static void gc() { try { for (int i = 0; i < gcLoop; i++) { if (i != 0) { Thread.sleep(sleepTime); } garbageCollection.invoke(null); } } catch (InterruptedException ex) { // 無視する. } catch (InvocationTargetException ex) { Throwable iex = ex.getCause(); if (iex == null) { iex = ex; } throw new RuntimeException(iex.getMessage(), iex); } catch (IllegalAccessException ex) { throw new RuntimeException(ex.getMessage(), ex); } } /** * JVMを終了する. * @param exitCode 終了コード */ public static void exit(int exitCode) { try { exit.invoke(null, exitCode); } catch (InvocationTargetException ex) { Throwable iex = ex.getCause(); if (iex == null) { iex = ex; } throw new RuntimeException(iex.getMessage(), iex); } catch (IllegalAccessException ex) { throw new RuntimeException(ex.getMessage(), ex); } } } CharacterManaJ/src/main/java/charactermanaj/util/FileUtilities.java0000644000175000017500000000635013615720000025561 0ustar paulliupaulliupackage charactermanaj.util; import java.awt.Desktop; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import charactermanaj.model.AppConfig; public final class FileUtilities { private static final Method methodMoveToTrash = getMethodMoveToTrash(); private FileUtilities() { super(); } private static Method getMethodMoveToTrash() { try { // MOVE_TO_TRASHアクションを取得する(定義されていないバージョンの場合は実行時例外) Desktop.Action moveToTrashType = Enum.valueOf(Desktop.Action.class, "MOVE_TO_TRASH"); // MOVE_TO_TRASHアクションがサポートされているか? Desktop desktop = Desktop.getDesktop(); if (!desktop.isSupported(moveToTrashType)) { return null; } // moveToTrashメソッドを取得する。(定義されていなければ実行時例外) return Desktop.class.getMethod("moveToTrash", File.class); } catch (Exception ex) { return null; } } /** * ゴミ箱が有効であるか? * @return 有効であればtrue */ public static boolean isSupportMoveToTrash() { return methodMoveToTrash != null; } /** * ゴミ箱にファイルまたはディレクトリを捨てる。 * * @param file * @throws IOException 削除に失敗した場合 */ public static void moveToTrash(File file) throws IOException { if (file == null) { throw new NullPointerException(); } if (!isSupportMoveToTrash()) { throw new UnsupportedOperationException("moveToTrash is not supported."); } if (!file.exists()) { return; } try { Desktop desktop = Desktop.getDesktop(); Boolean ret = (Boolean) methodMoveToTrash.invoke(desktop, file); if (ret == null || !ret) { throw new IOException("failed to move to recyclebin. " + file); } } catch (IllegalAccessException ex) { throw new RuntimeException(ex); } catch (InvocationTargetException ex) { Throwable cause = ex.getCause(); throw new IOException("failed to move to recyclebin. " + file, cause); } } /** * 指定したファイルまたはディレクトリを削除します.
* 指定した引数がディレクトリを示す場合、このディレクトリを含む配下のすべてのファイルとディレクトリを削除します.
* * @param file * ファイル、またはディレクトリ * @throws IOException * 削除できない場合 */ public static void deleteRecursive(File file) throws IOException { if (file == null) { throw new IllegalArgumentException(); } if (!file.exists()) { return; } if (file.isDirectory()) { File[] children = file.listFiles(); if (children != null) { for (File child : children) { deleteRecursive(child); } } } if (!file.delete()) { throw new IOException("can't delete file. " + file); } } /** * ファイルまたはフォルダを削除します。 * @param file * @throws IOException */ public static void delete(File file) throws IOException { AppConfig appConfig = AppConfig.getInstance(); if (isSupportMoveToTrash() && appConfig.isUseRecycleBinIfSupported()) { moveToTrash(file); } else { deleteRecursive(file); } } } CharacterManaJ/src/main/java/charactermanaj/util/LocalizedTextResource.java0000644000175000017500000001066513615720000027275 0ustar paulliupaulliupackage charactermanaj.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.nio.charset.Charset; import java.util.Locale; /** * リソース名を指定してローカライズされたテキストを取得するための抽象実装.
* リソースの取得部は派生クラスにて実装する必要がある.
* * @author seraphy */ public abstract class LocalizedTextResource { /** * リソース名を指定して、テキストファイルを読み込んで、その文字列を返す.
* リソースは現在のデフォルトロケールを優先で検索されます.
* ファイルエンコーディングを引数csで指定する.
* * @param name * リソース名 * @param cs * ファイルのエンコーディング * @return ファイルの内容(テキスト) */ public String getText(String name, Charset cs) { return getText(name, cs, Locale.getDefault()); } /** * リソース名と文字コードを指定して、ロケールに対応する文字列を取得する.
* リソースがなければ実行時例外が発生する. * * @param name * リソース名 * @param cs * 文字コード * @param locale * 取得するロケール * @return テキスト */ public String getText(String name, Charset cs, Locale locale) { ResourceNames resourceNames = createResourceNames(name, locale); String text = loadText(resourceNames, cs); if (text == null) { throw new RuntimeException("resource not found: " + resourceNames); } return text; } /** * リソース名とロケールを指定して読み込む実リソース名のグループを作成して返す. * * @param name * リソース名 * @param locale * ロケール * @return リソース名グループ(優先順) */ protected ResourceNames createResourceNames(String name, Locale locale) { if (name == null || name.length() == 0 || locale == null) { throw new IllegalArgumentException(); } String language = locale.getLanguage(); String country = locale.getCountry(); String variant = locale.getVariant(); int extpos = name.lastIndexOf("."); int folderpos = name.lastIndexOf("/"); String basename; String ext; if (folderpos > extpos) { basename = name; ext = ""; } else { basename = name.substring(0, extpos); ext = name.substring(extpos); } String[] resourceNamesStr = { basename + "_" + language + "_" + country + "_" + variant + ext, basename + "_" + language + "_" + country + ext, basename + "_" + language + ext, basename + ext,}; return new ResourceNames(resourceNamesStr); } /** * リソース名グループを指定して、リソースをテキストとして取得する.
* リソース名グループの優先順にリソースの取得を試みて最初に成功したものを返す.
* ひとつも成功しなければnullが返される.
* * @param resourceNames * リソース名グループ * @param cs * 文字コード * @return リソースのテキスト */ protected String loadText(ResourceNames resourceNames, Charset cs) { if (resourceNames == null || cs == null) { throw new IllegalArgumentException(); } for (String resourceName : resourceNames) { URL url = getResource(resourceName); if (url == null) { // リソースがなければ次の候補へスキップする. continue; } StringBuilder buf = new StringBuilder(); try { InputStream is = url.openStream(); try { BufferedReader rd = new BufferedReader( new InputStreamReader(is, cs)); try { int ch; while ((ch = rd.read()) != -1) { buf.append((char) ch); } } finally { rd.close(); } } finally { is.close(); } } catch (IOException ex) { throw new RuntimeException("resource loading error: " + ex, ex); } // 1つでも成功すれば、それで終了する. return buf.toString(); } // 一つも成功しなかった場合 return null; } /** * リソース名からリソースを取得する.
* 存在しなければnullを返す.
* * @param resourceName * リソース名 * @return リソース、またはnull */ protected abstract URL getResource(String resourceName); } CharacterManaJ/src/main/java/charactermanaj/util/ApplicationLogHandler.java0000644000175000017500000001235013615720000027206 0ustar paulliupaulliupackage charactermanaj.util; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; import charactermanaj.model.AppConfig; /** * このアプリケーションの活動を記録するログハンドラ.
* アプリケーション用のディレクトリのlogsフォルダ下に開始日時のファイル名をもつログファイルを作成し、ログを記録する.
* ただし、終了時、警告以上のログが一度も書き込まれなかった場合はログファィルは自動的に削除される.
* * @author seraphy */ public class ApplicationLogHandler extends Handler { private static final String LOGS_DIR = "logs"; private final Object lock = new Object(); private final File logFile; private PrintWriter pw; private boolean notRemove; public ApplicationLogHandler() { File localAppDir = ConfigurationDirUtilities.getLocalUserDataDir(); File logsDir = new File(localAppDir, LOGS_DIR); if (!logsDir.exists()) { if (!logsDir.mkdirs()) { // ログ記録場所が作成できていないのでコンソールに出すしかない. System.err.println("can't create the log directory. " + logsDir); } } String fname = getCurrentTimeForFileName() + ".log"; logFile = new File(logsDir, fname); PrintWriter tmp; try { tmp = new PrintWriter(new OutputStreamWriter(new FileOutputStream(logFile))); } catch (Exception ex) { ex.printStackTrace(); // ロガーが失敗しているので、この失敗はコンソールに出すしかない。 tmp = null; } this.pw = tmp; } @Override public void close() throws SecurityException { synchronized (lock) { // 終了時にAppConfigにアクセスする. // (アプリケーションの終了時にアクセスすることで初期化タイミングの問題を避ける.) try { AppConfig appConfig = AppConfig.getInstance(); if (appConfig.isNoRemoveLog()) { notRemove = true; } } catch (Exception ex) { // なんらかのアクセスに失敗した場合でも継続できるようにする. // ロガーが閉じられようとしているので、pwに直接出力する notRemove = true; try { if (pw != null) { ex.printStackTrace(pw); } } catch (Exception iex) { iex.printStackTrace(); // コンソールに出す他ない } } if (pw != null) { pw.close(); pw = null; } if (logFile != null && !notRemove) { // 警告未満のログしかない場合はログファイルは毎回削除する. if (!logFile.delete()) { System.err.println("can't delete file. " + logFile); } } } } @Override public void flush() { synchronized (lock) { if (pw != null) { pw.flush(); } } } @Override public void publish(LogRecord record) { if (record == null) { return; } // メッセージの記録 synchronized (lock) { if (pw == null) { return; } Level lv = record.getLevel(); String name = record.getLoggerName(); pw.println("#" + getCurrentTime() + " " + name + " " + lv.getLocalizedName() + " " + record.getMessage()); // 例外があれば、例外の記録 Throwable tw = record.getThrown(); if (tw != null) { tw.printStackTrace(pw); // 例外のコールスタックをロガーに出力 } // フラッシュする.(随時、ファイルの中身を見ることができるように.) pw.flush(); // 警告以上であれば終了時にファイルを消さない if (lv.intValue() >= Level.WARNING.intValue()) { notRemove = true; } } } public String getCurrentTime() { Timestamp tm = new Timestamp(System.currentTimeMillis()); SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); return dt.format(tm); } public String getCurrentTimeForFileName() { Timestamp tm = new Timestamp(System.currentTimeMillis()); SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd_HHmmssSSS"); return dt.format(tm); } /** * ログフォルダ上にある、指定した期限以前のログファイルを削除する。 * @param expiredDate 期限切れとなる日時 */ public static void purge(long expiredDate) { Logger logger = Logger.getLogger(ApplicationLogHandler.class.getName()); File localAppDir = ConfigurationDirUtilities.getLocalUserDataDir(); File logsDir = new File(localAppDir, LOGS_DIR); File[] files = logsDir.listFiles(); if (files == null) { logger.log(Level.WARNING, "log-dir access failed."); return; } for (File file : files) { try { String name = file.getName(); if (file.isFile() && file.canWrite() && name.endsWith(".log")) { long lastModified = file.lastModified(); if (lastModified > 0 && lastModified < expiredDate) { boolean result = file.delete(); // 直接消す。ユーザ走査ではないのでゴミ箱にはいれない。 logger.log(Level.INFO, "remove file " + file + "/succeeded=" + result); } } } catch (Exception ex) { logger.log(Level.WARNING, "remove file failed. " + file, ex); } } } } CharacterManaJ/src/main/java/charactermanaj/util/DownloadUtils.java0000644000175000017500000002643313615720000025602 0ustar paulliupaulliupackage charactermanaj.util; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.logging.Level; import java.util.logging.Logger; /** * ダウンロードをサポートする */ public final class DownloadUtils { /** * ロガー */ private static final Logger logger = Logger.getLogger(DownloadUtils.class.getName()); /** * 偽装するユーザーエージェント名(nullまたは空文字の場合は偽装しない) */ private String impersonateUserAgent; /** * 最大ホップ数 */ private int maxHop = 10; /** * ダウンロードファイルを終了時に削除するか? */ private boolean deleteDownloadFileOnExit = true; public void setImpersonateUserAgent(String impersonateUserAgent) { this.impersonateUserAgent = impersonateUserAgent; } public String getImpersonateUserAgent() { return impersonateUserAgent; } public void setMaxHop(int maxHop) { this.maxHop = maxHop; } public int getMaxHop() { return maxHop; } public void setDeleteDownloadFileOnExit(boolean deleteOnExit) { deleteDownloadFileOnExit = deleteOnExit; } public boolean isDeleteDownloadFileOnExit() { return deleteDownloadFileOnExit; } /** * ヘッドレスポンス */ public static final class HeadResponse { String location; String contentType; String fileName; public String getLocation() { return location; } public String getContentType() { return contentType; } public String getFileName() { return fileName; } /** * ファイルの拡張子、なければ空。 * 返される拡張子はドットを含む。 * @return ドットで始まる拡張子、もしくは空 */ public String getDotExtension() { String name = fileName; int pos = name.lastIndexOf('/'); if (pos >= 0) { name = name.substring(pos + 1); } pos = name.lastIndexOf('\\'); if (pos >= 0) { name = name.substring(pos + 1); } int extPos = name.lastIndexOf("."); String ext = ""; if (extPos > 0) { // ドットから始まる拡張子に切り取る ext = name.substring(extPos).toLowerCase(); } return ext; } @Override public String toString() { return "location=" + location + ", contentType=" + contentType + ", fileName=" + fileName; } } /** * 指定したURLのコンテンツをダウンロードする * @param location URL * @param os 出力先 * @throws IOException 失敗した場合 */ public void loadContents(String location, OutputStream os) throws IOException { loadContents(getHead(location), os); } public void loadContents(HeadResponse headResponse, OutputStream os) throws IOException { String realLoction = headResponse.getLocation(); URL url = new URL(realLoction); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); if (impersonateUserAgent != null && impersonateUserAgent.length() > 0) { conn.setRequestProperty("User-Agent", impersonateUserAgent); } conn.connect(); try { int status = conn.getResponseCode(); if (status == HttpURLConnection.HTTP_NOT_FOUND) { // 404 throw new FileNotFoundException("Failed to load contents. status=" + status + ", url=" + url); } if (status < HttpURLConnection.HTTP_OK || status >= HttpURLConnection.HTTP_MULT_CHOICE) { // 200未満、300以上 throw new IOException("Failed to load contents. status=" + status + ", url=" + url); } byte[] buf = new byte[4096]; InputStream is = conn.getInputStream(); try { for (;;) { int rd = is.read(buf); if (rd < 0) { break; } os.write(buf, 0, rd); } os.flush(); } finally { is.close(); } } finally { conn.disconnect(); } } /** * テンポラリディレクトりにコンテンツをダウンロードする * @param headResponse * @return テンポラリファイル * @throws IOException */ public File downloadTemporary(HeadResponse headResponse) throws IOException { String ext = headResponse.getDotExtension(); if (ext == null || ext.length() == 0) { ext = ".tmp"; } File tmpFile = File.createTempFile("cmj-", ext); if (isDeleteDownloadFileOnExit()) { tmpFile.deleteOnExit(); // 終了時にファイルを消す。(気休め程度) } logger.log(Level.INFO, "Create temporary file: " + tmpFile); try { OutputStream bos = new BufferedOutputStream(new FileOutputStream(tmpFile)); try { loadContents(headResponse, bos); } finally { bos.close(); } } catch (RuntimeException ex) { tmpFile.delete(); logger.log(Level.INFO, "Delete temporary file: " + tmpFile); throw ex; } catch (IOException ex) { logger.log(Level.INFO, "Delete temporary file: " + tmpFile); tmpFile.delete(); throw ex; } return tmpFile; } /** * URLを指定してリダイレクトがある場合はリダイレクトでなくなるまで探索した最後のURLを返す。 * @param location 開始するURL * @return 探索されたURL * @throws IOException 読み込みに失敗した場合、もしくは最大ホップ数を超えた場合 */ public HeadResponse getHead(String location) throws IOException { String initLocation = location; int hopCount = 0; for (;;) { logger.log(Level.INFO, "Connect to " + location); URL url = new URL(location); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); int status; conn.setRequestMethod("HEAD"); conn.setInstanceFollowRedirects(false); // 自動リダイレクトはしない if (impersonateUserAgent != null && impersonateUserAgent.length() > 0) { conn.setRequestProperty("User-Agent", impersonateUserAgent); } conn.connect(); try { status = conn.getResponseCode(); } finally { conn.disconnect(); } if (status == HttpURLConnection.HTTP_MOVED_TEMP || // 302 status == HttpURLConnection.HTTP_MOVED_PERM || // 301 status == HttpURLConnection.HTTP_SEE_OTHER) { // 303 if (hopCount > maxHop) { // 転送回数が多すぎる! throw new IOException("too many hops! " + hopCount); } location = conn.getHeaderField("Location"); if (location == null || location.isEmpty()) { // locationヘッダがない throw new IOException("bad response. location not found."); } hopCount++; logger.log(Level.INFO, "Location to " + location); continue; } if (status >= HttpURLConnection.HTTP_OK && status < HttpURLConnection.HTTP_MULT_CHOICE) { // 200以上 300未満 HeadResponse response = new HeadResponse(); response.location = location; response.contentType = conn.getContentType(); String contentDisposition = conn.getHeaderField("Content-Disposition"); String fileName = null; if (contentDisposition != null && contentDisposition.length() > 0) { fileName = parseAttachmentFileName(contentDisposition); } if (fileName == null || fileName.length() == 0) { fileName = initLocation; // ファイル名の指定がない場合は最初のロケーション名を使用する } response.fileName = fileName; logger.log(Level.INFO, "response success. " + response); return response; } if (status == HttpURLConnection.HTTP_NOT_FOUND) { // 404 // ファイルが見つからない場合 throw new FileNotFoundException("Failed to load contents. status=" + status + ", url=" + url); } // 何らかのエラー logger.log(Level.WARNING, "response failed. status=" + status); throw new IOException("response failed. status=" + status); } } /** * セミコロンで行を区切る。 * (ダブルクォートがある場合は、閉じられるまではセミコロンは無視する。) * @param line * @return */ private static List splitSemicolon(String line) { List lines = new ArrayList(); StringBuilder buf = new StringBuilder(); int mode = 0; for (char ch : line.toCharArray()) { if (mode == 0) { if (ch == '"') { // ダブルクォートがある場合は閉じるまでセミコロンを無視する buf.append((char) ch); mode = 1; } else if (ch == ';') { lines.add(buf.toString()); buf.setLength(0); } else { buf.append((char) ch); } } else if (mode == 1) { if (ch == '"') { buf.append((char) ch); mode = 0; } else { buf.append((char) ch); } } } if (buf.length() > 0) { lines.add(buf.toString()); } return lines; } /** * key=value形式の文字列のリストからマップを生成する。 * valueがダブルクォートで囲まれている場合はダブルクォートを除去する。 * @param lines * @return */ private static Map parseKeyValuePair(List lines) { Map keyValueMap = new TreeMap(String.CASE_INSENSITIVE_ORDER); for (String line : lines) { line = line.trim(); if (!line.isEmpty()) { int pos = line.indexOf("="); String key, value; if (pos >= 0) { key = line.substring(0, pos); value = line.substring(pos + 1); value = value.trim(); if (value.startsWith("\"") && value.endsWith("\"")) { // ダブルクォートで囲まれている場合は外す value = value.substring(1, value.length() - 1); } } else { key = line; value = ""; } keyValueMap.put(key, value); } } return keyValueMap; } /** * Content-Dispositionのヘッダーパラメータからファイル名を取得する。 * @param contentDisposition * @return */ private static String parseAttachmentFileName(String contentDisposition) { List lines = splitSemicolon(contentDisposition); logger.log(Level.FINE, "content-dispotion: " + lines); Map kv = parseKeyValuePair(lines); String fileName = null; // 文字コードつきファイル名パラメータがあれば、それを解析・取得する String encodedFileName = kv.get("filename*"); if (encodedFileName != null && encodedFileName.length() > 0) { // 文字コードの取得(空の場合もありえる) int pos = encodedFileName.indexOf('\''); String encoding = encodedFileName.substring(0, pos); if (encoding.isEmpty()) { encoding = "utf-8"; // UTF-8をデフォルトとみなす } // 言語の取得(空の場合もありえる) int pos2 = encodedFileName.indexOf('\'', pos + 1); String language = encodedFileName.substring(pos + 1, pos2); // ファイル名 try { fileName = URLDecoder.decode(encodedFileName.substring(pos2 + 1), encoding); } catch (UnsupportedEncodingException ex) { logger.log(Level.WARNING, "url encoding error: " + encodedFileName, ex); fileName = null; } logger.log(Level.INFO, "attachment filename*=" + encoding + "," + language + "," + fileName); } // 文字コードつきファイル名がなければ、文字コードなしファイル名を取得する if (fileName == null || fileName.length() == 0) { fileName = kv.get("filename"); logger.log(Level.INFO, "attachment filename=" + fileName); } return fileName; } } CharacterManaJ/src/main/java/charactermanaj/util/DesktopUtilities.java0000644000175000017500000001375413615720000026321 0ustar paulliupaulliupackage charactermanaj.util; import java.awt.Component; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URI; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.BoxLayout; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; /** * デスクトップへのアクセスを提供するユーテリティ.
* JDK6の機能を使うため、JDK5以前では何もしない.(エラーにはならない) * @author seraphy */ public class DesktopUtilities { /** * ロガー */ private static final Logger logger = Logger.getLogger(DesktopUtilities.class.getName()); /** * デスクトップオブジェクト。JDK6以降でなければ、もしくはデスクトップをサポートしていなければnull */ private static Object desktopObj; /** * ブラウズメソッド */ private static Method methodBrowse; /** * 編集メソッド */ private static Method methodEdit; /** * 開くメソッド */ private static Method methodOpen; static { try { Class clz = Class.forName("java.awt.Desktop"); Method mtdGetDesktop = clz.getMethod("getDesktop"); methodBrowse = clz.getMethod("browse", URI.class); methodEdit = clz.getMethod("edit", File.class); methodOpen = clz.getMethod("open", File.class); desktopObj = mtdGetDesktop.invoke(null); } catch (ClassNotFoundException ex) { // JDK6以降でない場合 logger.log(Level.CONFIG, "AWT Desktop is not suuported."); desktopObj = null; } catch (Exception ex) { // その他の例外は基本的に発生しないが、発生したとしても // 単にサポートしていないと見なして継続する. logger.log(Level.SEVERE, "AWT Desktop failed.", ex); desktopObj = null; } } private DesktopUtilities() { throw new RuntimeException("utilities class."); } public static boolean isSupported() { return desktopObj != null; } protected static boolean callMethod(Method method, Object arg) throws IOException { if (desktopObj == null) { return false; } try { if (logger.isLoggable(Level.FINER)) { logger.log(Level.FINER, "invoke: " + method + "/arg=" + arg); } method.invoke(desktopObj, arg); return true; } catch (InvocationTargetException ex) { Throwable iex = ex.getCause(); if (iex != null && iex instanceof IOException) { throw (IOException) iex; } throw new RuntimeException(ex.getMessage(), ex); } catch (IllegalAccessException ex) { throw new RuntimeException(ex.getMessage(), ex); } } /** * ファイルを開く. * @param uri ファイル * @return サポートしていない場合はfalse、実行できればtrue。 * @throws IOException 実行できなかった場合 */ public static boolean browse(URI uri) throws IOException { return callMethod(methodBrowse, uri); } /** * 指定したdocBaseの親ディレクトリを開く. * @param docBase * @return サポートしていない場合はfalse、実行できればtrue。 * @throws IOException 実行できなかった場合 */ public static boolean browseBaseDir(URI docBase) throws IOException { File baseDir = null; try { if (docBase != null) { baseDir = new File(docBase).getParentFile(); } } catch (Exception ex) { baseDir = null; } if (baseDir == null) { Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep(); return false; } return DesktopUtilities.open(baseDir); } /** * ファイルを編集する. * @param file ファイル * @return サポートしていない場合はfalse、実行できればtrue。 * @throws IOException 実行できなかった場合 */ public static boolean edit(File file) throws IOException { return callMethod(methodEdit, file); } /** * ファイルを編集する. * @param file ファイル * @return サポートしていない場合はfalse、実行できればtrue。 * @throws IOException 実行できなかった場合 */ public static boolean open(File file) throws IOException { return callMethod(methodOpen, file); } /** * ブラウザでURLを開きます.
* JDK1.6未満の場合はブラウザを開く代わりにURLと、それを説明するメッセージボックスが表示されます.
* @param parent 親フレーム、またはダイアログ * @param url URL * @param description ブラウズがサポートされていない場合に表示するダイアログでのURLの説明文 */ public static void browse(final Component parent, final String url, final String description) { try { URI helpURI = new URI(url); if (!DesktopUtilities.browse(helpURI) ){ // JDK5で実行中の場合 JPanel panel = new JPanel(); BoxLayout layout = new BoxLayout(panel, BoxLayout.Y_AXIS); panel.setLayout(layout); panel.add(new JLabel(description)); JTextField txtURL = new JTextField(url); panel.add(txtURL); JOptionPane.showMessageDialog(parent, panel); } } catch (Exception ex) { ErrorMessageHelper.showErrorDialog(parent, ex); } } /** * ブラウザでURLを開くアクションの生成.
* エラー時はエラーダイアログが開かれる.
* 返されるアクションがとるアクションイベントは無視されるため、nullを渡しても問題ありません.
* @param parent 親フレーム、またはダイアログ * @param url URLの文字列 * @param description ブラウズがサポートされていない場合に表示するダイアログでのURLの説明文 * @return アクション */ public static ActionListener createBrowseAction(final Component parent, final String url, final String description) { return new ActionListener() { public void actionPerformed(ActionEvent e) { browse(parent, url, description); } }; } } CharacterManaJ/src/main/java/charactermanaj/util/DirectoryConfig.java0000644000175000017500000000175413615720000026103 0ustar paulliupaulliupackage charactermanaj.util; import java.io.File; /** * 起動時に選択するキャラクターデータを格納する親ディレクトリ * * @author seraphy */ public class DirectoryConfig { /** * シングルトン */ private static final DirectoryConfig inst = new DirectoryConfig(); private File charactersDir; private DirectoryConfig() { super(); } /** * キャラクターデータを格納するディレクトリを取得する.
* まだ未設定であればIllegalStateException例外が発生する.
* * @return キャラクターデータを格納するディレクトリ */ public File getCharactersDir() { if (charactersDir == null) { throw new IllegalStateException("キャラクターディレクトリが設定されていません."); } return charactersDir; } public void setCharactersDir(File charactersDir) { this.charactersDir = charactersDir; } public static DirectoryConfig getInstance() { return inst; } } CharacterManaJ/src/main/java/charactermanaj/util/FileNameNormalizer.java0000644000175000017500000000256613615720000026536 0ustar paulliupaulliupackage charactermanaj.util; import java.lang.reflect.Method; /** * ファイル名をノーマライズする.
* ただし、サポートされていない場合は何もしない.
* @author seraphy */ public class FileNameNormalizer { private static FileNameNormalizer DEFAULT = new FileNameNormalizer(); public static void setDefault(FileNameNormalizer def) { if (def == null) { throw new IllegalArgumentException(); } DEFAULT = def; } public static FileNameNormalizer getDefault() { return DEFAULT; } public String normalize(String name) { return name; } public static boolean setupNFCNormalizer() { final Method method; final Object nfd; try { Class normalizerCls = Class.forName("java.text.Normalizer"); Class formCls = Class.forName("java.text.Normalizer$Form"); method = normalizerCls.getMethod("normalize", CharSequence.class, formCls); nfd = formCls.getField("NFC").get(null); } catch (Exception ex) { ex.printStackTrace(System.err); return false; } FileNameNormalizer normalizer = new FileNameNormalizer() { @Override public String normalize(String name) { if (name != null) { try { return (String) method.invoke(null, name, nfd); } catch (Exception ex) { ex.printStackTrace(System.err); } } return name; } }; setDefault(normalizer); return true; } } CharacterManaJ/src/main/java/charactermanaj/util/JavaVersionUtils.java0000644000175000017500000000317713615720000026262 0ustar paulliupaulliupackage charactermanaj.util; public final class JavaVersionUtils { private JavaVersionUtils() { super(); } /** * Javaの簡易なバージョンを取得する.
* 不明な場合は0を返す.
* * @return バージョン */ public static double getJavaVersion() { try { String version = System.getProperty("java.version"); version = version.split("[_|-]")[0]; String[] versions = version.split("\\."); if (versions.length == 1) { return Double.valueOf(versions[0]); } else if (versions.length > 2) { return Double.valueOf(versions[0] + "." + versions[1]); } } catch (RuntimeException ex) { ex.printStackTrace(); } return 0d; } /** * Javaの詳細なバージョンを取得する. メジャー・マイナー・メンテナンス・アップデートの4要素を返す.
* * @return */ public static int[] getJavaVersions() { return getJavaVersions(System.getProperty("java.version")); } private static int[] getJavaVersions(String version) { int[] ret = new int[4]; try { int posIdentifier = version.indexOf('-'); if (posIdentifier >= 0) { version = version.substring(0, posIdentifier); } int posUpdate = version.indexOf("_"); int update = 0; if (posUpdate >= 0) { update = Integer.parseInt(version.substring(posUpdate + 1)); version = version.substring(0, posUpdate); } String[] versions = version.split("\\."); for (int idx = 0; idx < 3 && idx < versions.length; idx++) { ret[idx] = Integer.parseInt(versions[idx]); } ret[3] = update; } catch (RuntimeException ex) { ex.printStackTrace(); } return ret; } } CharacterManaJ/src/main/java/charactermanaj/util/ApplicationLoggerConfigurator.java0000644000175000017500000000670013615720000030773 0ustar paulliupaulliupackage charactermanaj.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.logging.ConsoleHandler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; public final class ApplicationLoggerConfigurator { private static final String LOGGING_PROPERTIES = "logging.properties"; private ApplicationLoggerConfigurator() { super(); } public static void configure() { // ログマネージャ. // 初期時にJRE等にある初期設定がなされている. LogManager logManager = LogManager.getLogManager(); // 設定を一旦クリアする. // ルートロガーがInfoになり、ハンドラはすべてリセット。ルートロガー以外の設定は空にされる. logManager.reset(); Exception configurationError = null; try { // ユーザーごとのローカルアプリケーション設定ディレクトリ上の設定ファイルを取得する. File localAppDataDir = ConfigurationDirUtilities.getLocalUserDataDir(); File logConfig = new File(localAppDataDir, LOGGING_PROPERTIES); if ( !logConfig.exists()) { // ユーザ指定のロギングプロパティがない場合、リソースからコピーする copyDefaultLogProperty(logConfig); } InputStream is = null; if (logConfig.exists()) { // ユーザー指定のロギングプロパティがある場合 is = new FileInputStream(logConfig); } else { // リソース上のロギングプロパティ is = ApplicationLoggerConfigurator.class.getResourceAsStream("/" + LOGGING_PROPERTIES); } if (is != null) { try { // ログを再設定する. logManager.readConfiguration(is); } finally { is.close(); } } } catch (Exception ex) { // 初期化に失敗した場合はログに記録するために例外を保存するが、 // 処理は継続する. configurationError = ex; } // ロガーを取得 Logger logger = Logger.getLogger(ApplicationLoggerConfigurator.class.getName()); // 初期化時に失敗した場合、デフォルトのコンソールハンドラを設定し、ログに出力する. if (configurationError != null) { logger.addHandler(new ConsoleHandler()); logger.addHandler(new ApplicationLogHandler()); logger.log(Level.WARNING, "LogConfigurationFailed", configurationError); } // 初期化時のログ logger.info("open logger."); logger.info("application configuration: baseDir=" + ConfigurationDirUtilities.getApplicationBaseDir() + " appData=" + ConfigurationDirUtilities.getUserDataDir()); } /** * デフォルトのログプロパティをユーザディレクトリにコピーする. * @param logConfig ユーザディレクトリ上のログプロパティファイル位置 */ private static void copyDefaultLogProperty(File logConfig) { try { InputStream is = ApplicationLoggerConfigurator.class .getResourceAsStream("/" + LOGGING_PROPERTIES); if (is != null) { try { FileOutputStream fos = new FileOutputStream(logConfig); try { byte buf[] = new byte[4096]; for (;;) { int rd = is.read(buf); if (rd <= 0) { break; } fos.write(buf, 0, rd); } } finally { fos.close(); } } finally { is.close(); } } } catch (Exception ex) { ex.printStackTrace(); // 失敗しても継続する } } } CharacterManaJ/src/main/java/charactermanaj/util/UIHelper.java0000644000175000017500000001540113615720000024460 0ustar paulliupaulliupackage charactermanaj.util; import java.awt.Component; import java.awt.Container; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import javax.imageio.ImageIO; import javax.swing.AbstractButton; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JMenu; public final class UIHelper { private static final UIHelper singleton = new UIHelper(); /** * クラスパスからのみ探索するリソースローダー */ private final ResourceLoader resourceLoader = new ResourceLoader(ResourceLoader.getDefaultClassLoader()); private UIHelper() { super(); } public static final UIHelper getInstance() { return singleton; } private double scaleX = 1; private double scaleY = 1; public void setScaleX(double scaleX) { this.scaleX = scaleX; } public double getScaleX() { return scaleX; } public void setScaleY(double scaleY) { this.scaleY = scaleY; } public double getScaleY() { return scaleY; } /** * 指定したコンテナに含まれる指定したコンポーネント型のすべてのコンポーネントを返す.
* 一つも該当するものがなければ空を返す * @param 対象のコンポーネントのクラス型 * @param clz クラス * @param container 対象のコンテナ * @return コンポーネントのコレクション、もしくは空 */ @SuppressWarnings("unchecked") public Collection getDescendantOfClass(Class clz, Container container) { if (container == null || clz == null) { throw new IllegalArgumentException(); } Collection components = new ArrayList(); getDescendantOfClass(clz, container, components); return (Collection) components; } private void getDescendantOfClass(Class clz, Container container, Collection results) { if (container == null) { return; } Component[] children = (container instanceof JMenu) ? ((JMenu) container).getMenuComponents() : container.getComponents(); int mx = children.length; for (int idx = 0; idx < mx; idx++) { Component comp = children[idx]; if (clz.isInstance(comp)) { results.add(comp); } else if (comp instanceof Container) { getDescendantOfClass(clz, (Container) comp, results); } } } /** * 2つのステートをもつアイコンを作成します.
* このアイコンは、使用するコンポーネントがAbstractButton派生クラスであれば、isSelectedの結果が * trueである場合は2番目のアイコンイメージを表示します.
* isSelectedの結果がfalseであるか、もしくはAbstractButton派生クラスでなければ * 最初のアイコンイメージを表示します.
* @param iconName1 アイコン1 * @param iconName2 アイコン2 * @return アイコン */ public Icon createTwoStateIcon(String iconName1, String iconName2) { if (iconName1 == null || iconName2 == null || iconName1.length() == 0 || iconName2.length() == 0) { throw new IllegalArgumentException(); } final BufferedImage pinIcon1 = getImage(iconName1); final BufferedImage pinIcon2 = getImage(iconName2); Icon icon = new Icon() { public void paintIcon(Component c, Graphics g, int x, int y) { boolean selected = false; if (c instanceof AbstractButton) { AbstractButton btn = (AbstractButton) c; selected = btn.isSelected(); } BufferedImage iconImage; if ( !selected) { iconImage = pinIcon1; } else { iconImage = pinIcon2; } int w = iconImage.getWidth(); int h = iconImage.getHeight(); g.drawImage(iconImage, x, y, (int)(w * scaleX), (int)(h * scaleY), 0, 0, w, h, null); } public int getIconHeight() { return (int)(pinIcon1.getHeight() * scaleY); } public int getIconWidth() { return (int)(pinIcon1.getWidth() * scaleX); } }; return icon; } /** * アイコンボタン(非透過)を作成して返す.
* リソースが取得できない場合は実行時例外が返される.
* @param iconName 画像リソース名 * @return アイコンボタン */ public JButton createIconButton(String iconName) { if (iconName == null || iconName.length() == 0) { throw new IllegalArgumentException(); } JButton btn = new JButton(); btn.setIcon(createImageIcon(iconName)); return btn; } /** * 通常時の画像のみをもつ透過ボタンを作成して返す.
* リソースが取得できない場合は実行時例外が返される.
* @param normal 通常時の画像リソース * @return 透過ボタン */ public JButton createTransparentButton(String normal) { return createTransparentButton(normal, null); } /** * リソースから通常とホバー時の画像をもつ透過ボタンを作成して返す.
* リソースが取得できない場合は実行時例外が返される.
* @param normal 通常時の画像リソース * @param rollover ホバー時の画像リソース * @return 透過ボタン */ public JButton createTransparentButton(String normal, String rollover) { if (normal == null || normal.length() == 0) { throw new IllegalArgumentException(); } ImageIcon normIcon = createImageIcon(normal); JButton btn = new JButton(normIcon); if (rollover != null && rollover.length() != 0) { ImageIcon rolloverIcon = createImageIcon(rollover); btn.setRolloverEnabled(true); btn.setRolloverIcon(rolloverIcon); btn.setPressedIcon(rolloverIcon); } btn.setOpaque(false); btn.setBorderPainted(false); btn.setContentAreaFilled(false); return btn; } /** * イメージアイコンを取得する。 * 設定されているスケールに拡大されたイメージでアイコンが設定される。 * @param name アイコンリソース名 * @return スケール済みのイメージアイコン */ public ImageIcon createImageIcon(String name) { Image img; if (scaleX != 1 || scaleY != 1) { BufferedImage bimg = getImage(name); img = bimg.getScaledInstance( (int)(bimg.getWidth() * scaleX), (int)(bimg.getHeight() * scaleY), Image.SCALE_DEFAULT); } else { img = getImage(name); } return new ImageIcon(img); } /** * リソースから画像を取得する.
* 画像が取得できない場合は実行時例外を返す.
* @param name リソース * @return 画像 */ public BufferedImage getImage(String name) { URL url = resourceLoader.getResource(name); if (url == null) { throw new RuntimeException("resource not found. " + name); } try { return ImageIO.read(url); } catch (IOException ex) { throw new RuntimeException("image load error." + ex.getMessage(), ex); } } } CharacterManaJ/src/main/java/charactermanaj/clipboardSupport/0000755000175000017500000000000013615720000024516 5ustar paulliupaulliuCharacterManaJ/src/main/java/charactermanaj/clipboardSupport/ImageSelection.java0000644000175000017500000001774613615720000030270 0ustar paulliupaulliupackage charactermanaj.clipboardSupport; import java.awt.Color; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.FlavorMap; import java.awt.datatransfer.SystemFlavorMap; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import charactermanaj.graphics.io.ImageSaveHelper; import charactermanaj.model.AppConfig; /** * クリップボードに画像をコピーするためのセレクション.
* @author seraphy */ public class ImageSelection implements Transferable { /** * ロガー */ private static final Logger logger = Logger.getLogger(ImageSelection.class.getName()); /** * 実行環境がWindowsであるか? */ private static final boolean platformWindows; /** * 対象となるイメージ */ private BufferedImage img; /** * 背景色(jpeg画像変換時) */ private Color bgColor; /** * MIME汎用(PNG). */ private static final DataFlavor PNG_FLAVOR = new DataFlavor("image/png", "image/png"); /** * MIME汎用(JPEG). */ private static final DataFlavor JPEG_FLAVOR = new DataFlavor("image/jpeg", "image/jpeg"); /** * MIME汎用(BMP). */ private static final DataFlavor BMP_FLAVOR = new DataFlavor("image/bmp", "image/bmp"); /** * サポートされている形式.
* 順序は優先順.
*/ private static final List SUPPORTED_FLAVORS; /** * クラスイニシャライザ */ static { String lcOS = System.getProperty("os.name").toLowerCase(); platformWindows = lcOS.indexOf("windows") >= 0; if (platformWindows) { // Windowsの場合 SUPPORTED_FLAVORS = Arrays.asList(new DataFlavor[] { PNG_FLAVOR, DataFlavor.imageFlavor, }); } else { // Linux, Mac OS Xの場合を想定 SUPPORTED_FLAVORS = Arrays.asList(new DataFlavor[] { PNG_FLAVOR, JPEG_FLAVOR, BMP_FLAVOR, DataFlavor.imageFlavor, }); } } /** * システムのフレーバーマップを設定する.
* @return 正常にセットアップできた場合はtrue、そうでなければfalse */ public static boolean setupSystemFlavorMap() { try { AppConfig appConfig = AppConfig.getInstance(); if (appConfig.isEnablePNGSupportForWindows()) { // "PNG"へのマップを明示的に設定する. // (Windowsの場合、デフォルトでは、画像はDBI転送となり透過情報を持つことができないため.) FlavorMap defFlavorMap = SystemFlavorMap.getDefaultFlavorMap(); if (defFlavorMap instanceof SystemFlavorMap) { SystemFlavorMap sysFlavorMap = (SystemFlavorMap) defFlavorMap; sysFlavorMap.setNativesForFlavor(PNG_FLAVOR, new String[] {"PNG"}); sysFlavorMap.setNativesForFlavor(JPEG_FLAVOR, new String[] {"JFIF"}); } } return true; } catch (Exception ex) { logger.log(Level.SEVERE, "systemFlavorMap setup failed.", ex); } return false; } /** * セレクションを構築する. * @param img 対象となるイメージ */ public ImageSelection(BufferedImage img, Color bgColor) { if (img == null) { throw new IllegalArgumentException(); } this.img = img; this.bgColor = (bgColor == null) ? Color.white : bgColor; } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (flavor != null) { logger.log(Level.FINE, "getTransferData flavor=" + flavor); try { ImageSaveHelper imageSaveHelper = new ImageSaveHelper(); if (flavor.equals(PNG_FLAVOR) || flavor.equals(JPEG_FLAVOR) || flavor.equals(BMP_FLAVOR)) { // image/png, image/jpeg, image/bmpの場合は、 // そのファイル形式のデータを生成して、それを返す. ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { imageSaveHelper.savePicture(img, bgColor, bos, flavor.getMimeType(), null); } finally { bos.close(); } return new ByteArrayInputStream(bos.toByteArray()); } if (flavor.equals(DataFlavor.imageFlavor)) { // "image/x-java-image"の場合 AppConfig appConfig = AppConfig.getInstance(); if (platformWindows || !appConfig.isEnablePNGSupportForWindows()) { // Windowsの場合は、背景色で塗りつぶしたBMP画像に変換して返す. // JDK5/6のシステムクリップボードへのコピーでは透過画像をサポートしておらず透過部分が黒色になるため. // ネイティブPNGとのマッピングが有効であれば、Windowsでは、そちらで対応する. return imageSaveHelper.createBMPFormatPicture(img, bgColor); } else { // Windows以外、且つ、透過サポートが有効の場合 return img; } } } catch (RuntimeException ex) { logger.log(Level.WARNING, "The exception occurred during the data transfer of a clipboard.", ex); throw ex; } catch (IOException ex) { logger.log(Level.WARNING, "The exception occurred during the data transfer of a clipboard.", ex); throw ex; } } throw new UnsupportedFlavorException(flavor); } public DataFlavor[] getTransferDataFlavors() { return SUPPORTED_FLAVORS.toArray(new DataFlavor[SUPPORTED_FLAVORS.size()]); } public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor != null && SUPPORTED_FLAVORS.contains(flavor); } public static boolean isSupprotedFlavorAvailable(Clipboard cb) { if (cb != null) { for (DataFlavor flavor : SUPPORTED_FLAVORS) { if (cb.isDataFlavorAvailable(flavor)) { return true; } } } return false; } public static BufferedImage getImage(Clipboard cb) throws IOException { if (cb == null) { return null; } try { // サポートされている形式をチェックする. for (DataFlavor flavor : cb.getAvailableDataFlavors()) { logger.log(Level.FINE, "dataFlavor(in Clipboard)=" + flavor); } DataFlavor availableFlavor = null; for (DataFlavor flavor : SUPPORTED_FLAVORS) { // 優先順にチェックし最初に見つかったサポートされている形式を採用する. if (cb.isDataFlavorAvailable(flavor)) { availableFlavor = flavor; break; } } logger.log(Level.FINE, "selected flavor=" + availableFlavor); if (availableFlavor != null) { if (availableFlavor.equals(DataFlavor.imageFlavor)) { // 汎用の画像形式で取得を試みる。 // 透過画像は使えないため、ここで取得されるものは非透過画像である。 return (BufferedImage) cb.getData(DataFlavor.imageFlavor); } if (availableFlavor.equals(PNG_FLAVOR) || availableFlavor.equals(JPEG_FLAVOR) || availableFlavor.equals(BMP_FLAVOR)) { // image/png, image/bmp, image/jpegのいずれか InputStream is = (InputStream) cb.getData(availableFlavor); if (is != null) { BufferedImage img; try { img = ImageIO.read(is); } finally { is.close(); } return img; } } } } catch (IOException ex) { logger.log(Level.WARNING, "The exception occurred in access to a clipboard.", ex); throw ex; } catch (UnsupportedFlavorException ex) { // 直前にisDataFlavorAvailableで確認しているので、 // よほどタイミングが悪くなければエラーは発生しないはず。 logger.log(Level.WARNING, "The exception occurred in access to a clipboard.", ex); throw new IOException(ex.getMessage()); } // サポートしているものが無い場合. return null; } } CharacterManaJ/src/main/java/charactermanaj/clipboardSupport/ClipboardUtil.java0000644000175000017500000000344413615720000030123 0ustar paulliupaulliupackage charactermanaj.clipboardSupport; import java.awt.Color; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.image.BufferedImage; import java.io.IOException; /** * クリップボード用ユーテリティクラス.
* @author seraphy */ public final class ClipboardUtil { private ClipboardUtil() { super(); } /** * クリップボードにイメージを設定する.
* JDKのクリップボード経由の画像転送では透過色を表現できないので、背景色を指定する必要がある.
* (ただし、このアプリケーション内であれば透過色を維持したままコピー可能.)
* @param img イメージ * @param bgColor 背景色 */ public static void setImage(BufferedImage img, Color bgColor) { if (img == null || bgColor == null) { throw new IllegalArgumentException(); } Toolkit tk = Toolkit.getDefaultToolkit(); Clipboard cb = tk.getSystemClipboard(); ImageSelection imageSelection = new ImageSelection(img, bgColor); cb.setContents(imageSelection, null); } /** * クリップボード内にイメージがあるか? * @return イメージがあればtrue */ public static boolean hasImage() { Toolkit tk = Toolkit.getDefaultToolkit(); Clipboard cb = tk.getSystemClipboard(); return ImageSelection.isSupprotedFlavorAvailable(cb); } /** * クリップボードからイメージを取得する.
* 取得できる形式がない場合はnullを返す.
* @return 画像、もしくはnull * @throws IOException 読み取り中に例外が発生した場合 */ public static BufferedImage getImage() throws IOException { Toolkit tk = Toolkit.getDefaultToolkit(); Clipboard cb = tk.getSystemClipboard(); return ImageSelection.getImage(cb); } } CharacterManaJ/src/main/java/charactermanaj/Main.java0000644000175000017500000003766413615720000022731 0ustar paulliupaulliupackage charactermanaj; import java.awt.Font; import java.awt.Frame; import java.awt.GraphicsEnvironment; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.lang.Thread.UncaughtExceptionHandler; import java.util.Enumeration; import java.util.HashSet; import java.util.Locale; import java.util.Properties; import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; import javax.management.JMException; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.plaf.FontUIResource; import charactermanaj.clipboardSupport.ImageSelection; import charactermanaj.graphics.io.ImageCacheMBeanImpl; import charactermanaj.model.AppConfig; import charactermanaj.model.util.StartupSupport; import charactermanaj.ui.MainFrame; import charactermanaj.ui.MainFramePartialForMacOSX; import charactermanaj.ui.MainFramePartialForMacOSX9; import charactermanaj.ui.ProfileListManager; import charactermanaj.ui.SelectCharatersDirDialog; import charactermanaj.ui.util.ScaleSupport; import charactermanaj.util.AWTExceptionLoggingHandler; import charactermanaj.util.ApplicationLoggerConfigurator; import charactermanaj.util.ConfigurationDirUtilities; import charactermanaj.util.DirectoryConfig; import charactermanaj.util.ErrorMessageHelper; import charactermanaj.util.JavaVersionUtils; import charactermanaj.util.LocalizedResourcePropertyLoader; /** * エントリポイント用クラス * * @author seraphy */ public final class Main implements Runnable { /** * ロガー.
*/ private static final Logger logger = Logger.getLogger(Main.class.getName()); /** * Mac OS Xであるか? */ private static final boolean isMacOSX; /** * Linuxであるか? */ private static final boolean isLinux; /** * クラスイニシャライザ.
* 実行環境に関する定数を取得・設定する.
*/ static { // Mac OS Xでの実行判定 // システムプロパティos.nameは、すべてのJVM実装に存在する. // 基本ディレクトリの位置の決定に使うため、 // なによりも、まず、これを判定しないとダメ.(順序が重要) String lcOS = System.getProperty("os.name").toLowerCase(); isMacOSX = lcOS.startsWith("mac os x"); isLinux = lcOS.indexOf("linux") >= 0; } /** * ロガーの初期化.
* 失敗しても継続する.
*/ private static void initLogger() { try { // ロガーの準備 // ローカルファイルシステム上のユーザ定義ディレクトリから // ログの設定を読み取る.(OSにより、設定ファイルの位置が異なることに注意) ApplicationLoggerConfigurator.configure(); if (JavaVersionUtils.getJavaVersion() >= 1.7) { // java7以降は、sun.awt.exception.handlerが使えないので、 // EDTスレッドで未処理例外ハンドラを明示的に設定する. final AWTExceptionLoggingHandler logHandler = new AWTExceptionLoggingHandler(); SwingUtilities.invokeLater(new Runnable() { public void run() { final UncaughtExceptionHandler handler = Thread .getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { public void uncaughtException(Thread t, Throwable ex) { logHandler.handle(ex); if (handler != null) { handler.uncaughtException(t, ex); } } }); } }); } else { // SwingのEDT内の例外ハンドラの設定 (ロギングするだけ) // (ただし、unofficial trickである.) System.setProperty("sun.awt.exception.handler", AWTExceptionLoggingHandler.class.getName()); } } catch (Throwable ex) { // ロガーの準備に失敗した場合はロガーがないかもなので // コンソールに出力する. ex.printStackTrace(); logger.log(Level.SEVERE, "logger initiation failed. " + ex, ex); } } /** * UIをセットアップする. * * @throws Exception * いろいろな失敗 */ private static void setupUIManager(final AppConfig appConfig) throws Exception { // System.setProperty("swing.aatext", "true"); // System.setProperty("awt.useSystemAAFontSettings", "on"); if (isMacOSX()) { // MacOSXであれば、スクリーンメニューを有効化 System.setProperty("apple.laf.useScreenMenuBar", "true"); System.setProperty( "com.apple.mrj.application.apple.menu.about.name", "CharacterManaJ"); // Java7以降であればノーマライズをセットアップする. if (JavaVersionUtils.getJavaVersion() >= 1.7) { charactermanaj.util.FileNameNormalizer.setupNFCNormalizer(); } } // 実行プラットフォームのネイティブな外観にする. UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // JSpliderのvalueを非表示 (GTKではデフォルトで有効のため) UIManager.put("Slider.paintValue", Boolean.FALSE); // デフォルトフォントを設定する setupDefaultFont(appConfig); // アプリケーション設定でデフォルトフォントサイズが変更された場合は // 現在表示されている、すべてのフレームに再適用を試行する。 appConfig.addPropertyChangeListener(AppConfig.DEFAULT_FONT_SIZE, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { setupDefaultFont(appConfig); try { for (Frame frame : Frame.getFrames()) { SwingUtilities.updateComponentTreeUI(frame); } } catch (Exception ex) { logger.log(Level.WARNING, "failed revalidate frames", ex); } } }); } private static void setupDefaultFont(AppConfig appConfig) { // 優先するフォントファミリ中の実在するフォントファミリのセット(大文字小文字の区別なし) TreeSet availablePriorityFontSets = new TreeSet( String.CASE_INSENSITIVE_ORDER); // 少なくともメニューが表示できるようなフォントを選択する Properties strings = LocalizedResourcePropertyLoader.getCachedInstance() .getLocalizedProperties("menu/menu"); HashSet useCodePoints = new HashSet(); Enumeration enmStrings = strings.propertyNames(); while (enmStrings.hasMoreElements()) { String propertyName = (String) enmStrings.nextElement(); String propertyValue = strings.getProperty(propertyName); int len = propertyValue.length(); for (int idx = 0; idx < len;) { int codepoint = propertyValue.codePointAt(idx); useCodePoints.add(codepoint); idx += Character.charCount(codepoint); } } // 優先するフォントファミリの実在チェックと、もっとも優先されるフォントファミリの確定 String selectedFontFamily = null; String fontPriorityStr = appConfig.getFontPriority(); if (fontPriorityStr.trim().length() > 0) { String[] fontPriority = fontPriorityStr.split(","); for (String availableFontFamily : GraphicsEnvironment .getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.ENGLISH)) { for (String fontFamily : fontPriority) { fontFamily = fontFamily.trim(); if (fontFamily.length() > 0) { if (availableFontFamily.equalsIgnoreCase(fontFamily)) { // 見つかった実在フォントが、現在のロケールのメニューを正しく表示できるか? Font font = Font.decode(availableFontFamily); logger.log(Level.INFO, "実在するフォントの確認:" + availableFontFamily); boolean canDisplay = false; for (Integer codepoint : useCodePoints) { canDisplay = font.canDisplay(codepoint); if (!canDisplay) { logger.log(Level.INFO, "このフォントはメニュー表示に使用できません: " + selectedFontFamily + "/codepoint=0x" + Integer.toHexString(codepoint)); break; } } if (canDisplay) { if (selectedFontFamily == null) { // 最初に見つかったメニューを表示可能な優先フォント selectedFontFamily = availableFontFamily; } // メニューを表示可能なフォントのみ候補に入れる availablePriorityFontSets.add(fontFamily); } } } } } if (selectedFontFamily == null) { // フォールバック用フォントとして「Dialog」を用いる. // 仮想フォントファミリである「Dialog」は日本語も表示可能である. selectedFontFamily = "Dialog"; } } // デフォルトのフォントサイズ、0以下の場合はシステム標準のまま int defFontSize = appConfig.getDefaultFontSize(); // フォントサイズを画面のスケールの補正にあわせる if (defFontSize > 0) { ScaleSupport scaleSupport = ScaleSupport.getDefault(); defFontSize = (int)(defFontSize * scaleSupport.getManualScaleY()); } // UIデフォルトのフォント設定で、優先フォント以外のフォントファミリが指定されているものを // すべて最優先フォントファミリに設定する. // また、設定されたフォントサイズが0よりも大きければ、そのサイズに設定する. for (java.util.Map.Entry entry : UIManager.getDefaults() .entrySet()) { Object key = entry.getKey(); Object val = UIManager.get(key); if (val instanceof FontUIResource) { FontUIResource fontUIResource = (FontUIResource) val; int fontSize = fontUIResource.getSize(); String fontFamily = fontUIResource.getFamily(); if (defFontSize > 0) { fontSize = defFontSize; } if (selectedFontFamily != null && !availablePriorityFontSets.contains(fontFamily)) { // 現在のデフォルトUIに指定された優先フォント以外が設定されており、 // 且つ、優先フォントの指定があれば、優先フォントに差し替える. if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "UIDefaultFont: " + key + "= " + fontFamily + " -> " + selectedFontFamily); } fontFamily = selectedFontFamily; } fontUIResource = new FontUIResource(fontFamily, fontUIResource.getStyle(), fontSize); UIManager.put(entry.getKey(), fontUIResource); } } } /** * 初期処理およびメインフレームを構築する.
* SwingのUIスレッドで実行される.
*/ public void run() { try { // アプリケーション設定の読み込み AppConfig appConfig = AppConfig.getInstance(); appConfig.loadConfig(); // UIManagerのセットアップ. try { setupUIManager(appConfig); } catch (Exception ex) { // UIManagerの設定に失敗した場合はログに書いて継続する. ex.printStackTrace(); logger.log(Level.WARNING, "UIManager setup failed.", ex); } // クリップボードサポートの設定 if (!ImageSelection.setupSystemFlavorMap()) { logger.log(Level.WARNING, "failed to set the clipboard-support."); } // LANG, またはLC_CTYPEが設定されていない場合はエラーを表示する // OSXのJava7(Oracle)を実行する場合、環境変数LANGまたはLC_CTYPEに正しくファイル名の文字コードが設定されていないと // ファイル名を正しく取り扱えず文字化けするため、実行前に確認し警告を表示する。 // ただし、この挙動はJava7u60では修正されているので、それ以降であれば除外する. int[] versions = JavaVersionUtils.getJavaVersions(); if (isMacOSX() && (versions[0] == 1 && versions[1] == 7 && versions[3] < 60)) { String lang = System.getenv("LANG"); String lcctype = System.getenv("LC_CTYPE"); if ((lang == null || lang.trim().length() == 0) && (lcctype == null || lcctype.trim().length() == 0)) { JOptionPane .showMessageDialog( null, "\"LANG\" or \"LC_CTYPE\" environment variable must be set.", "Configuration Error", JOptionPane.ERROR_MESSAGE); } } // スタートアップ時の初期化 // ver0.999ではキャラクターデータディレクトリに依存しない初期化部しかないので最初に実行する。 // (APPDATAからLOCALAPPDATAへの移動処理などがあるため、先に行う必要がある。) StartupSupport.getInstance().doStartup(); // 起動時のシステムプロパティでキャラクターディレクトリが指定されていて実在すれば、それを優先する. File currentCharacterDir = null; String charactersDir = System.getProperty("charactersDir"); if (charactersDir != null && charactersDir.length() > 0) { File charsDir = new File(charactersDir); if (charsDir.exists() && charsDir.isDirectory()) { currentCharacterDir = charsDir; } } // OSXであれば、DockIconを先に設定する if (isMacOSX()) { try { if (JavaVersionUtils.getJavaVersion() >= 9) { // OSXでJava9以降であればOracle実装でDockIconを設定する. MainFramePartialForMacOSX9.setupDockIcon(); // スクリーンメニュー類を設定する. // (メニュー項目は、その時点でアクティブになっているメインフレームに転送される) MainFramePartialForMacOSX9.setupScreenMenu(); } else { // Java9未満であればeawtでDockIcon類を設定する. MainFramePartialForMacOSX.setupDockIcon(); // スクリーンメニューからのイベントをハンドルできるようにする. // (メニュー項目は、その時点でアクティブになっているメインフレームに転送される) MainFramePartialForMacOSX.setupScreenMenu(); } } catch (Throwable ex) { logger.log(Level.CONFIG, "Failed to setup the dock icon.", ex); } } if (currentCharacterDir == null) { // キャラクターセットディレクトリの選択 File defaultCharacterDir = ConfigurationDirUtilities.getDefaultCharactersDir(); currentCharacterDir = SelectCharatersDirDialog.getCharacterDir(defaultCharacterDir); if (currentCharacterDir == null) { // キャンセルされたので終了する. logger.info("launcher canceled."); return; } } // キャラクターデータフォルダの設定 DirectoryConfig.getInstance().setCharactersDir(currentCharacterDir); // デフォルトのプロファイルを開く. // (最後に使ったプロファイルがあれば、それが開かれる.) final MainFrame mainFrame = ProfileListManager.openDefaultProfile(); // 表示(および位置あわせ) mainFrame.showMainFrame(); } catch (Throwable ex) { // なんらかの致命的な初期化エラーがあった場合、ログとコンソールに表示 // ダイアログが表示されるかどうかは状況次第. ex.printStackTrace(); logger.log(Level.SEVERE, "Application initiation failed.", ex); ErrorMessageHelper.showErrorDialog(null, ex); // メインフレームを破棄します. MainFrame.closeAllProfiles(); } } /** * エントリポイント.
* 最初のメインフレームを開いたときにMac OS Xであればスクリーンメニューの登録も行う.
* * @param args * 引数(未使用) */ public static void main(String[] args) { // ロガー等の初期化 initLogger(); // MBeanのセットアップ try { ImageCacheMBeanImpl.setupMBean(); } catch (JMException ex) { // 失敗しても無視して継続する. logger.log(Level.SEVERE, ex.getMessage(), ex); } // フレームの生成等は、SwingのEDTで実行する. SwingUtilities.invokeLater(new Main()); } /** * Mac OS Xで動作しているか? * * @return Max OS X上であればtrue */ public static boolean isMacOSX() { return isMacOSX; } /** * Mac OS X、もしくはlinuxで動作しているか? * * @return Mac OS X、もしくはlinuxで動作していればtrue */ public static boolean isLinuxOrMacOSX() { return isLinux || isMacOSX; } } CharacterManaJ/src/main/assembly/0000755000175000017500000000000013615720000017115 5ustar paulliupaulliuCharacterManaJ/src/main/assembly/charactermanaj_with_jre_zip.xml0000644000175000017500000000162113615720000025357 0ustar paulliupaulliu charactermanaj_with_jre_zip zip false ${project.basedir}/target . *.exe ${project.basedir}/src/main/resources . appConfig.xml ${project.basedir}/src/main/attachment . charactermanaj.l4j.ini README_ja_withJRE.txt ${copyJrePath} jre CharacterManaJ/src/main/assembly/charactermanaj_zip.xml0000644000175000017500000000142413615720000023465 0ustar paulliupaulliu charactermanaj_zip zip false ${project.basedir}/target . *.exe ${project.basedir}/src/main/resources . appConfig.xml ${project.basedir}/src/main/attachment . charactermanaj.l4j.ini README_ja.txt CharacterManaJ/src/main/resources/0000755000175000017500000000000013615720000017310 5ustar paulliupaulliuCharacterManaJ/src/main/resources/icons/0000755000175000017500000000000013615720000020423 5ustar paulliupaulliuCharacterManaJ/src/main/resources/icons/scroll_arrow_down.png0000644000175000017500000000375713615720000024704 0ustar paulliupaulliuPNG  IHDR iCCPICC Profile(UoT?o\?US[IB*unS6mUo xB ISA$=t@hpS]Ƹ9w>5@WI`]5;V! A'@{N\..ƅG_!7suV$BlW=}i; F)A<.&Xax,38S(b׵*%31l #O-zQvaXOP5o6Zz&⻏^wkI/#&\%x/@{7S މjPh͔&mry>k7=ߪB#@fs_{덱п0-LZ~%Gpˈ{YXf^+_s-T>D@קƸ-9!r[2]3BcnCs?>*ԮeD|%4` :X2 pQSLPRaeyqĘ י5Fit )CdL$o$rpӶb>4+̹F_{Яki+x.+B.{L<۩ =UHcnf<>F ^e||pyv%b:iX'%8Iߔ? rw[vITVQN^dpYI"|#\cz[2M^S0[zIJ/HHȟ- Ic Adobe ImageReady PT{IDAT8ӻK#Qq""FDB  "Z NbH%(fe&iD5Q`?d' 5/}(;'PJ5&kuCϮW it:."5 -.-W} !pgײD"?ã#X8ռv@) D W4>3ف~2++m۞ "rW+ HE"i3\_o,Y޶y]iN=:19E ]`cme1^oD|op8::6:R)f}|F?`p\.e29z~ PAfr{-\f-<IENDB`CharacterManaJ/src/main/resources/icons/pin-icon2.png0000644000175000017500000000154613615720000022735 0ustar paulliupaulliuPNG  IHDR sRGBbKGD pHYs  tIMEIDAT8MoUUߵ9{HoRRjF!Q6ƁSf!FXc#ȀD2 AZ,n{=콗#F:t;\d>hKs?8qth} 6dAtn߰1V:g 2O]3LPʂC/_¬qq SRhf=[5%J"*xXㄹCVqӥ~cz[iR{l~?"|x|+~ ̓Gfҗ 10vߚan'+씾ݘS-FGD@X߼qvV} n^Z P+JҲ Ւ;; Wľi($ $ Ѭv'J% !8K˓ ani˅l` v%|=#e?>Ș\{l * 0( '7-n&|g뷝}K?Msɉy?윎CScϾ@QxgcFJQiȸyDXk~~h685hny07ػQf%7:tE'. 1P֘)p«Oy3'׏~cgx^і\;Jv iދͧZHz@Ȁ!O݄[ +k%ӢIENDB`CharacterManaJ/src/main/resources/icons/config2.png0000644000175000017500000000670113615720000022464 0ustar paulliupaulliuPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڌ]hu?99b/u8Vi,4H&&H zAyh`$M%Zlvs BH{} _/? *$&x`&y9 g/ȇQ,WAm zZɞoc 84gT":TK%.7)b[\ {pft{<3~IT:˝Ht01"\ЇX bQ(,~638c+}?[TAfp)L_Od'psO#N2 1 -Cmvc85X5v.TƆk)wC8 @03\ 7Mōd]BRBr-0<4 ЊXV^n~V̪r! ѹhK?`৯ȒrrL.2CWUQ=yPUU_V.{[wvh>;Խڑ%V&zGp f7r'hN%=AS QaLCd IZRGЌbмFyT^J)G:: ;?[̥dya9 mog/ML/_[dv4\x蛫Pm6">]D[_"oߺ3?c=WۃkZD!gJ=e$cD3u; ?>ڤ[IENDB`CharacterManaJ/src/main/resources/icons/color2.png0000644000175000017500000000576713615720000022350 0ustar paulliupaulliuPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F"IDATxڔJ@ώӥ X,`e#,N}$t{(/K_|d] 1od1>+H/˟q|X5b(@H/˟_4``/*tr/03*M3222?aP 䌻߿~cdc ;`_P ؼ=L@Sϟ6(JA]wNHمK9??IÓmoH&;#G?~y5"$gZ"&/ ||9*deT T!oe'*Q5@M IENDB`CharacterManaJ/src/main/resources/icons/arrow_up2.png0000644000175000017500000000614313615720000023055 0ustar paulliupaulliuPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx쐽K[a_AG(th!(qPp(BC U3cBi 7cb4MyoK1YDz<;1P'ozjf_{BہnL m&"NzI+EReI])T#| s|vɷqrg˴LʀNiBκ2vCᩭ BXt;ƖI|Ft|- |/[%$gSQVQUi 0j{b w+UZ,!uD H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx;K#QI6f2hBBlN邐EP!XHXtAB "6Z,VֲZ lb$3s7謏U,{NjZxOx8PjWKo~՘vM{?_ V3ܮCuUN9bYL `Y_X[ ݱBMO\oNlE`A6B"a'OGr͐QN:fȵo#X+#y׳{?5x2'|J8%`6 i PC* ynĦ 64|EWbW 41\> X X DArl,Ekg{Ȋ?-onIENDB`CharacterManaJ/src/main/resources/icons/right2.png0000644000175000017500000000651613615720000022340 0ustar paulliupaulliuPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FyIDATxڤ;Vgs]oKRd$ nP$+Q@"b)*xiV\rYQ ^Iha {axG1hjOl ODfi @CoFgbw p ;]#% .JS禡>2ΣDLrI8t:%h C'@9.!a9 bw;Z- >k?U30X)1i2#S{ه p,I 2_LjEBúgH;q$/3ܝO} IENDB`CharacterManaJ/src/main/resources/icons/paste.png0000644000175000017500000000070013615720000022242 0ustar paulliupaulliuPNG  IHDRabKGD pHYs  tIME  IMIDAT8ˍJAȊ-DQH4a#[!P-"ئnNE ٌؙ$90033^1 Rt۶]&k]-jV {QBtcyf<3Ͼ /+ l_p]wz61wֿ!&TBbnÒq.z#3^fTzxIQڙv۱ -.!Hի3KBRr(@J)%&Y"Vv'8v qS9AdoIg*TJQHz8y#Џ/IENDB`CharacterManaJ/src/main/resources/icons/config.png0000644000175000017500000000670513615720000022406 0ustar paulliupaulliuPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڌ]hUGϽsgg6d15lk?-hG V "Ƣ`A}|QQ**$" ?؇ZSB+IKILMvwvfTPyS JC*x!ڰOs<{< mG  @Eh@ݯ釵pE PlqOo-T@k}7l9R< āCĥ.nM-$1RbbzniBIqlNqpa\ Yۋ98Q+`5w?w3[n VYkG"=~XN@#YP JM;1yd2OE)ݽptޞ#pW f`1Lde2mҍaZ EcV`vjB)lR\鮁+aM{\N-  hOoP]dfoY> wz_yql!L$""gIDDS"XK^)G[m;d:?>Es3ke/߆ޟXNZ0MjBCCg%[W%1Qy?ZR]vl5"Q3egm<枽~ȿ6yQT0̗SrPg?߷|!;7RUetap5 TSk[m;H<=n%OqA/_ A+.4Bw+Ň~ kȧ=8楄þn:@SD`Y8J!%>j:M]/_WmJ Bl$0ҋ39dc7D*4Ab{ :{ ۭO\wNE8tDer!S@l:JCCŷ S|uFzRK0IMafHp(W{QV"Ѣ8.*(PrC*B& ipf>~ON ,7+B۵l_޼kk~+Gz1KF4qguG5ظaL\cI@/w[w"K$9%IENDB`CharacterManaJ/src/main/resources/icons/copy.png0000644000175000017500000000061113615720000022101 0ustar paulliupaulliuPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<+IDATxڔD@r .@2TDm7JA-h]NWP?LX&gsNy'3uVqߟ++p00 yOןqh3emK˲LY'PEo-+Ik$!,y6Ms8e0e-]׷ra!i4*(_{0@UU<(8#A<$뎖>uIWv!g(gY.x>iE[;30 m )' DIENDB`CharacterManaJ/src/main/resources/icons/sort.png0000644000175000017500000000062713615720000022125 0ustar paulliupaulliuPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<9IDATxڔSˎP -*0`\pc`+~!uNp&Ҟ֐R(D\l7Ҵy'8.AAer=#buܸ\.tvt^&(IulFu͈xɡ%ڶ%d GkB /YEAeY< 3p d !}ߧ5SUA;S1ég@-7zGc6Mq&mWB-9Np7aJ?dY_NVE7sֱ<'.W +>IENDB`CharacterManaJ/src/main/resources/icons/sort2.png0000644000175000017500000000605013615720000022203 0ustar paulliupaulliuPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FSIDATxڔ?KAw9+?}/`P Y*rl AH ڈv[I#D {S͙?Y o7 Tx1 _,~|u$hZUU:v{|"竬uXކ&@#ЧKeeL nP:Q@!%'t|(sDǎ7 Xk0 `GCF.7IFf;9q~jV@ X3k04[1DHꆶNXwBkG( )&kK`u7s,.*`R"$m9S؃ů𵬶*/7ǭ$Ӡ]uv@Ղμ<ܕ_~Vx}IENDB`CharacterManaJ/src/main/resources/icons/pin-icon1.png0000644000175000017500000000177413615720000022737 0ustar paulliupaulliuPNG  IHDR sRGBbKGD pHYs  tIME0oϫ|IDAT8ˍMlEƟB) ē 7c9P4"D9ΦR6Њ\͂AMfG7@3j9כX^Q]'1Iuo˺/^mh%Fwï`,+䩆g\dϟg^n^ӼK%)_ߦdwUN;SӘ1t-M9[eXWBr3p28RR|_wXKf*heLSYoY)G+u[m}Vn\ C H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F}IDATxڔ;hVi;PVo,"V֢66ł6bŢM`XmZzQ`-.E ҷax0T` SOŘf%Yj %.vJ~*< K0s+6])̘t;#CO}5zm¬o#`252C pŌI8&* 7R8>'7o F*Y1v(1y\Z,&8@j@\LGUbBIg`z\Q1`_6_O[Fl #RHH2$92ge=0hcry-%%$$'4%NO'C.?kBqAb=RKS?-R E)$\~ 33hUpSv0ո׉aB%fxI 9W,L!`p/ŭ^Śkbpp#-8^`NYZ~f໴t]ץKAgZ<ĉ&r4y=r93V{V߯b{5kIENDB`CharacterManaJ/src/main/resources/icons/arrow_down2.png0000644000175000017500000000613313615720000023377 0ustar paulliupaulliuPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx;,Cq?PA, lH (ڨ4LFF`&6qS%M޺}{jka%g/|k}zEbId 2)^sWea(C@N@(p\tÝtgͮ3ۅ 9g?9}z<{S8,i!v]~Da_ ip{,3$k+mN>Jv](ޱ/ ǫvT =s;Y2Qka./+0^>n6R_cx6 t$ ,IENDB`CharacterManaJ/src/main/resources/icons/scroll_arrow_up.png0000644000175000017500000000372513615720000024354 0ustar paulliupaulliuPNG  IHDR iCCPICC Profile(UoT?o\?US[IB*unS6mUo xB ISA$=t@hpS]Ƹ9w>5@WI`]5;V! A'@{N\..ƅG_!7suV$BlW=}i; F)A<.&Xax,38S(b׵*%31l #O-zQvaXOP5o6Zz&⻏^wkI/#&\%x/@{7S މjPh͔&mry>k7=ߪB#@fs_{덱п0-LZ~%Gpˈ{YXf^+_s-T>D@קƸ-9!r[2]3BcnCs?>*ԮeD|%4` :X2 pQSLPRaeyqĘ י5Fit )CdL$o$rpӶb>4+̹F_{Яki+x.+B.{L<۩ =UHcnf<>F ^e||pyv%b:iX'%8Iߔ? rw[vITVQN^dpYI"|#\cz[2M^S0[zIJ/HHȟ- Ic Adobe ImageReady PTaIDAT8œJPƿDpk.-tw"F.͜$-]X"}Ь*$Vq:I4|?9)miV f.3Gn̑UJ{~"K) /X{~uuɞpP<&DҰ"Z]݁m!DҐRֈH 7Nu]7͖J8?ku]R1Gl"Lt66r;xx|Zn7WRɘa~AB\:`8bj`8B:m@K\%Փx `_aF (0).3?X `1dD# T˰>IENDB`CharacterManaJ/src/main/resources/icons/left.png0000644000175000017500000000652313615720000022071 0ustar paulliupaulliuPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F~IDATxڔ=eooo1Q%^ IبDNAENV4L"&mrWID j^BvoߏYT33]v<]ȜÊ +;JfW "W>kD"p6l{~ !v34ZGL#:C\tuMp ٱ 4l 0b0A όfINFp1-PCcyM;B4g8_n Fɓ@ɐHqfJ M6Mə[nNC0ԊkF4|jE 5#9M0> d8ȡI@ ,m[IMр8>R7YI;,vt~3aa+jk\r){in`{n H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڤkg?wrN1E!&^pZ(u)9D8(^(-.\KT.ZoKLN]p\N/;q*dB mHQ16ls ,- Z{ ˤ uق!MB6ϑ$ !Q7SB3O'! OJ?~hlaQ0ћ@ 8~oWf(:CM$[ .!]AU v7z!s᠖/>sg~  q@(/! nL nL5<)ժn} ) ?WX$xM9ix1"ٺP#~pp9=֟& B k*!\.)F d=`)r`(AR,v~8Sz#xYص&"aLTdǹ'ꥶ"%45Q -LG}@f?b͕o1B_LC&;}^[?l&}VKKÀbvmV1yLY;NIENDB`CharacterManaJ/src/main/resources/icons/arrow_down.png0000644000175000017500000000614213615720000023315 0ustar paulliupaulliuPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxSKBq=>#hi#6 $jp #|D zM-YRBT5Ԩ}<(;pss5 !Nw`n0y1ܑBn>bu!petP& b:N/>H%@=IOLs;`粜<$kmqՂp, bb#d 3n <ğl[cu܇6H&s NAKskD|wVghi$}- DCIh4h/&NX* H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F LIDATxڌK\Wuu媮nw]b8zxD?JI^T$q,ւus<ZIBߧ[SY dd %- Qq$>)GiRUn%F)F $+"њBz ]+{(18)h EaQJaH!XZG+)flsդ5N+>EN*v!`9 Džd9cck~R0'f'.sXTuvZ<.#"z,/t)n!yaqSX+PPAb8ORDRǐF#= dyg|]e\:RS e z4ARdEAH!H)OfXO;!`$e}NpRBI$N:'@k͙Fn!$Kɲ  4{~ŋ}Nrc4XYY!N)xAH1ʭeXÀ,(M9s$i-I(|yJkλf4ۼ7IҴi> 8:>aIzvw?aZ-`{;,Zx`p Oi5iֻw6;<~EXqwtq9µRO;I7O#j`eG=H MGGG9 )%IEt[m"VS 4RF1NM,\trN )beDQ箳swm58H+%J)TՈ{]&ʵO^ }I `w]~ܲH')i1gB9RBe͗WVssTҋ$^ں0g_GOdqiFlc4'ܸ蹋qe]ZB(X_Zgvo">yͭMut]K}_>׹qG;l7_re!$"8n޹ɍgnp29a>sx3ݝ',7`>t[_BV#/l!`zB߾%~?$4M g(PJ_n~+\y 8S@vs/<${Y)U9rp^kwhrk8!Ilaq!m,9te71DNU)ٸÝز?Ya3BPd֖ߥ*ijʗ{.v2j H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx=K[a&6~@"6iTit{KA.rEh!].ЭP! B-V`L?s9}t\V|;]lĈٻD4 >m;8}05J|4ugmG_WfTϵָZc\p|Wfn>_v>y!,7\ms@+ҹ̝,[{|cDQ``+e`T}-xH=LL==KxOH4xC&5/*??VO[[Z7+Z>xzi`sc %U~"ƥ XPUX!TςAq~VR"ORI P< 6}Z7IENDB`CharacterManaJ/src/main/resources/icons/save.png0000644000175000017500000000635113615720000022074 0ustar paulliupaulliuPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڌ=kQ{n6Kb -$iҋ?R m?@ Bj,$H|mV63;sϽbAS^^cu7!JeRI-Y{pZN`v6.@ Jat -Le0`G XknA0= DcSt dfwAf"lӈ UqhWBpREB=zE|WHgpTnfa9 >+42Eyخ  /K$M'JiO"Bb @@ D*+rL R V7[x/Pgy<ǷuYEP}b4c?]~xn5mj%M;hef #?.Zvwz]~G'zj5JSxp]ՎF:mj#<;91$+RV{axzh KY҆ϷhYzmy$&QaIENDB`CharacterManaJ/src/main/resources/appConfig_ja.xml0000644000175000017500000000037413615720000022416 0ustar paulliupaulliu Lucida Grande, Meiryo, MS UI Gothic, MS Gothic CharacterManaJ/src/main/resources/appinfo/0000755000175000017500000000000013615720000020744 5ustar paulliupaulliuCharacterManaJ/src/main/resources/appinfo/about_ja.html0000644000175000017500000001231413615720000023417 0ustar paulliupaulliu

ChracterManaJ Version @@SPECIFICATION-VERSIONINFO@@

実装バージョン: @@IMPLEMENTS-VERSIONINFO@@

[このアプリケーションについて]

このアプリケーションは複数の画像を選択し重ね合わせることで一つの画像を作り出す、モンタージュを行うアプリケーションです。

用途としてパーツを組み合わせてキャラクターをデザインするという、一種の着せ替えを楽しむことを想定していますが、それに限りません。

モンタージュするための素材の画像データがないと、このアプリケーションは何もできません。ご自身で作成するか、既にある画像データを用意するなどしてください。

カテゴリ、レイヤー、カラーグループを増減させたりなど、画像の組み合わせ方については新しいプロファイルを作成することで自分好みの設定にすることができます。

このアプリケーションは、K.Hみっくす ふぁーすとえでぃしょん さんの
「キャラクターなんとか機」
を目標にJAVAによりフルスクラッチから書き起こしたものです。

初期状態で、「キャラクターなんとか機」と同じカテゴリ、レイヤー順序、ディレクトリ、カラーグループの設定がされたプロファイルが作成されますので、 「キャラクターなんとか機」のパーツデータをインポートして使うことができます。

[ライセンス/使用許諾条件]

「キャラクターなんとかJ」はオープンソースソフトウェアです。ソースコードは「The Apache License Version 2.0」です。

本ソフトウェアは完全に無保証です。本ソフトウェアは「現状のまま」、かつ明示か暗黙であるかを問わず、一切の保証を付けずに提供されます。

ここから最新リリース 、 および最新リリースのソースコードを取得することができます。

商用利用であるかを否かを問わず、どなたでも、自由にお使いいただけます。登録や費用は一切必要ありません。再配布も自由になさってかまいません。

このアプリケーション自身(javaコード)はseraphyによって書かれました。
人的リソースに限りがあるため、メンテナンスや改善に時間がかかることが予想されます。
このアプリケーションをより良くしようという有志がおられましたら、ぜひ、ご協力・ご連絡くださいますようお願いいたします。歓迎いたします。

また、バグレポート等ありましたら、どなた様も上記プロジェクトページにてご報告くださいますよう、お願いいたします。

[キャラクターデータについて]

このアプリケーションを動作させるためには、パーツの画像データが必要です。

初期状態のプロファイルでは「キャラクターなんとか機 Ver3」で使える画像を利用できるよう設定されます。 キャラクターデータのインポート方法はヘルプをご参照ください。

 「キャラクターなんとか機 Ver3」を目標としましたが、色調整等のパラメータを解析しきれなかったため完全には色を再現できていません。 そのかわり、各レイヤーごとに色の微調整ができるようにしているため、近い色を再現するはできると思います。 その他、いろいろ不備があると思いますがご容赦ください。

[動作環境]

以下の環境での利用を想定しています。

  • Microsoft Windows 7 or 10 (32bit, 64bit)
  • Mac OSX 10.8 Mountain Lion 以降 (JRE同梱版を使う場合は OSX 10.10 Yosemite以降が必要です)
  • Ubuntu 14,16, etc. (JRE同梱版を使う場合は Ubuntu 16 以降が必要です。)

Java6互換でコンパイルしているため、基本的にはJava6以降のJavaがあれば動作します。Java11も利用可能です。

[利用コンポーネントについて]

J2SE5の標準APIの他、Apache Antの一部(The Apache License Version 2.0)をライブラリとして使用しています。

また、カラーモデルのHSY(色相・彩度・輝度)計算には、 "gununuの日記"さん のところのC++計算ルーチンをJava用に書き直したものを使用しています。

CharacterManaJ/src/main/resources/appinfo/about.html0000644000175000017500000001304313615720000022745 0ustar paulliupaulliu

ChracterManaJ Version @@SPECIFICATION-VERSIONINFO@@

Implementation-Version: @@IMPLEMENTS-VERSIONINFO@@

[About this software]

CharacterManaJ is an application to create a single image by superimposing multiple selected images.

It is able to design the avatar by different dresses and different parts by layering them, but not limited to it.

In order to run charactermanaj you need to have some images first.

Important! This program does not include image data.

Please prepare the data yourself. Refer to the Wiki document for the procedure.

このアプリケーションは、K.Hみっくす ふぁーすとえでぃしょん さんの
「キャラクターなんとか機」
を目標にJAVAによりフルスクラッチから書き起こしたものです。

初期状態で、「キャラクターなんとか機」と同じカテゴリ、レイヤー順序、ディレクトリ、カラーグループの設定がされたプロファイルが作成されますので、 「キャラクターなんとか機」のパーツデータをインポートして使うことができます。

[Software Requirements]

Use in the following environment is assumed.

  • Microsoft Windows 7 or 10 (32bit, 64bit)
  • Mac OSX 10.8 Mountain Lion or later (To use the bundled JRE, OSX 10.10 Yosemite or later is required.)
  • Ubuntu 14,16, etc. (To use the bundled JRE, Ubuntu 16 or later is required.)

This application can run in an environment compatible with Java 6.

It is recommended to run it in Java 8.

Basically, it should work if Java 6 desktop is working environment.

If Java is not installed on your system or if you do not want to use Java on your system, please use the JRE bundled version. (The included JRE is used only in this application. This will not install Java on your system. Registry, system folders etc are not rewritten at all.)

[ライセンス/使用許諾条件]

「キャラクターなんとかJ」はオープンソースソフトウェアです。ソースコードは「The Apache License Version 2.0」です。

本ソフトウェアは完全に無保証です。本ソフトウェアは「現状のまま」、かつ明示か暗黙であるかを問わず、一切の保証を付けずに提供されます。

ここから最新リリース 、 および最新リリースのソースコードを取得することができます。

商用利用であるかを否かを問わず、どなたでも、自由にお使いいただけます。登録や費用は一切必要ありません。再配布も自由になさってかまいません。

このアプリケーション自身(javaコード)はseraphyによって書かれました。
人的リソースに限りがあるため、メンテナンスや改善に時間がかかることが予想されます。
このアプリケーションをより良くしようという有志がおられましたら、ぜひ、ご協力・ご連絡くださいますようお願いいたします。歓迎いたします。

また、バグレポート等ありましたら、どなた様も上記プロジェクトページにてご報告くださいますよう、お願いいたします。

[キャラクターデータについて]

このアプリケーションを動作させるためには、パーツの画像データが必要です。

初期状態のプロファイルでは「キャラクターなんとか機 Ver2」で使える画像を利用できるよう設定されます。 キャラクターデータのインポート方法はヘルプをご参照ください。

 「キャラクターなんとか機 Ver2」を目標としましたが、色調整等のパラメータを解析しきれなかったため完全には色を再現できていません。 そのかわり、各レイヤーごとに色の微調整ができるようにしているため、近い色を再現するはできると思います。 その他、いろいろ不備があると思いますがご容赦ください。

[パーツデータの作者様へ]

パーツデータをお持ちか、作成された方で、オープンソース系(たとえばクリエイティブコモンズなど) のライセンスで配布を許可くださる方は、ぜひ、ご連絡ください。

プロジェクトの配布ファイルに加えさせていただこうと思います。

[利用コンポーネントについて]

J2SE5の標準APIの他、Apache Antの一部(The Apache License Version 2.0)をライブラリとして使用しています。

また、カラーモデルのHSY(色相・彩度・輝度)計算には、 "gununuの日記"さん のところのC++計算ルーチンをJava用に書き直したものを使用しています。

CharacterManaJ/src/main/resources/appinfo/about_zh.html0000644000175000017500000001452113615720000023450 0ustar paulliupaulliu

ChracterManaJ Version @@SPECIFICATION-VERSIONINFO@@

实际版本: @@IMPLEMENTS-VERSIONINFO@@

[关于此程序]

このアプリケーションは複数の画像を選択し重ね合わせることで一つの画像を作り出す、モンタージュを行うアプリケーションです。

用途としてパーツを組み合わせてキャラクターをデザインするという、一種の着せ替えを楽しむことを想定していますが、それに限りません。

モンタージュするための素材の画像データがないと、このアプリケーションは何もできません。ご自身で作成するか、既にある画像データを用意するなどしてください。

カテゴリ、レイヤー、カラーグループを増減させたりなど、画像の組み合わせ方については新しいプロファイルを作成することで自分好みの設定にすることができます。

このアプリケーションは、K.Hみっくす ふぁーすとえでぃしょん さんの
「キャラクターなんとか機」
を目標にJAVAによりフルスクラッチから書き起こしたものです。

初期状態で、「キャラクターなんとか機」と同じカテゴリ、レイヤー順序、ディレクトリ、カラーグループの設定がされたプロファイルが作成されますので、 「キャラクターなんとか機」のパーツデータをインポートして使うことができます。

[程序使用许可条件]

「CharacterManaJ」是一个开源软件。源代码遵从「The Apache License Version 2.0」协议。

本ソフトウェアは完全に無保証です。本ソフトウェアは「現状のまま」、かつ明示か暗黙であるかを問わず、一切の保証を付けずに提供されます。

ここから最新リリース 、 および最新リリースのソースコードを取得することができます。

商用利用であるかを否かを問わず、どなたでも、自由にお使いいただけます。登録や費用は一切必要ありません。再配布も自由になさってかまいません。

このアプリケーション自身(javaコード)はseraphyによって書かれました。
人的リソースに限りがあるため、メンテナンスや改善に時間がかかることが予想されます。
このアプリケーションをより良くしようという有志がおられましたら、ぜひ、ご協力・ご連絡くださいますようお願いいたします。歓迎いたします。

また、バグレポート等ありましたら、どなた様も上記プロジェクトページにてご報告くださいますよう、お願いいたします。

[キャラクターデータについて]

このアプリケーションを動作させるためには、パーツの画像データが必要です。

初期状態のプロファイルでは「キャラクターなんとか機 Ver2」で使える画像を利用できるよう設定されます。 キャラクターデータのインポート方法はヘルプをご参照ください。

 「キャラクターなんとか機 Ver2」を目標としましたが、色調整等のパラメータを解析しきれなかったため完全には色を再現できていません。 そのかわり、各レイヤーごとに色の微調整ができるようにしているため、近い色を再現するはできると思います。 その他、いろいろ不備があると思いますがご容赦ください。

[パーツデータの作者様へ]

パーツデータをお持ちか、作成された方で、オープンソース系(たとえばクリエイティブコモンズなど) のライセンスで配布を許可くださる方は、ぜひ、ご連絡ください。

プロジェクトの配布ファイルに加えさせていただこうと思います。

[软件需求]

以下操作环境可以正常运行

  • Microsoft Windows 7 or 10 (32bit, 64bit)
  • Mac OSX 10.8 Mountain Lion or later (To use the bundled JRE, OSX 10.10 Yosemite or later is required.)
  • Ubuntu 14,16, etc. (To use the bundled JRE, Ubuntu 16 or later is required.)

推荐Java8以上


求好心人帮忙翻译下面的日文

[使用的组件]

除了J2SE5的标准API之外还是用了Apache Ant(The Apache License Version 2.0)的一部分库

また、カラーモデルのHSY(色相・彩度・輝度)計算には、 "gununuの日記"さん のところのC++計算ルーチンをJava用に書き直したものを使用しています。

[关于汉化]

本人日语盲,只会谷歌+润色,还好会点英文,总算是翻出来了

新版本不定时更新,如果自行下载的版本可以将程序的JAR解包,把Translate文件夹和menu文件夹内带_zh的文件复制到新版本的JAR文件的相同位置即可,感谢作者菊苣给了如此方便的汉化模式

选择面板的英文暂时没找到汉化方式,可能连日文版也是英文的,求证

appinfo里面的about大段的日文,本人无能为力,还好不影响程序使用,如果有志愿者可以联系suzunemaiki@alicemargatriod.moe(邮箱)或183604610(QQ)

如果对汉化有什么建议可以联系上面的邮箱

本汉化版在不违反原始的软件利用条约之下可以随意传播,但是希望能够放上转载地址,请尊重每一个人的努力和汗水,谢谢!

CharacterManaJ/src/main/resources/images/0000755000175000017500000000000013615720000020555 5ustar paulliupaulliuCharacterManaJ/src/main/resources/images/lattice_l.png0000644000175000017500000000031613615720000023223 0ustar paulliupaulliuPNG  IHDR szzsRGBbKGD pHYs  tIME({NIDATX a6rm g6UD8$+G8o8| xp &qfiIENDB`CharacterManaJ/src/main/resources/images/wallpaper.xml0000644000175000017500000000034413615720000023267 0ustar paulliupaulliu wallpaper.xml 01;lattice_s 02;lattice_l CharacterManaJ/src/main/resources/images/lattice_s.png0000644000175000017500000000030113615720000023224 0ustar paulliupaulliuPNG  IHDRw=sRGBbKGD pHYs  tIME% ;BgAIDATHc$p-|cccJh ,st8 Gh>|0F、&!Qy2—IENDB`CharacterManaJ/src/main/resources/logging.properties0000644000175000017500000000037013615720000023054 0ustar paulliupaulliu# for Debug #handlers=java.util.logging.ConsoleHandler,charactermanaj.util.ApplicationLogHandler #java.util.logging.ConsoleHandler.level=FINEST #.level=FINE handlers=charactermanaj.util.ApplicationLogHandler .level=INFO charactermanaj.level=INFO CharacterManaJ/src/main/resources/menu/0000755000175000017500000000000013615720000020254 5ustar paulliupaulliuCharacterManaJ/src/main/resources/menu/menu_ja.xml0000644000175000017500000001670713615720000022427 0ustar paulliupaulliu ファイル F (F) 編集 E (E) お気に入り A (A) レイヤー L (L) ツール T (T) false ヘルプ H (H) プロファイルを開く O (O) 画像を保存する S (S) 伺か用に保存する U (U) false 伺か用PNG/PNAの保存 S (S) false 32ビット透過PNGを伺か用PNG/PNAに変換する C (C) false パーツフォルダを開く D (D) false ? D このプロファイルを編集する E (E) false パーツの管理 M (M) インポート I (I) このプロファイルにインポートする I (I) 新規プロファイルを作成する N (N) エクスポート E (E) 設定 C (C) プロファイルを閉じる X (X) パーツの検索 F (F) 画像をクリップボードにコピーする C (C) 画像を左右反転する H (H) 色情報のリセット R (R) false サンプルピクチャに設定する P (P) false 情報 I (I) パーツの選択を解除する 全カテゴリのパーツを解除可能にする カテゴリパネルを切替え時に縮小する false ズーム Z (Z) false 背景色の変更 B (B) false 背景の設定 W (W) false お気に入りに追加 A (A) お気に入りの管理 M (M) レイヤーパターンの管理 M (M) ランダム R (R) false ヘルプ H (H) バグレポート R (R) フォーラム F (F) CharacterManaJについて A (A) お勧めサイト CharacterManaJ/src/main/resources/menu/menu.xml0000644000175000017500000002211413615720000021742 0ustar paulliupaulliu File F false Edit E false Favorites A false Custom Layer L false Tool T false Help H false Open Profile O false ? N Save the picture S false ? S Ukagaka U false Save as Ukagaka S false ? alt S Convert C false Browse this parts data B false ? D Edit this profile E false Manage the Parts Collection M false ? P Import I false Import to this profile I false Create New Profile N false Export E false Preference C true Close profile X false ? W Find F false ? F Copy to the clipboard C false control C Flip Horizontal H false Reset Colors R false ? R Set As Sample picture P false Information I false ? I Deselect all false All category is Deselectable false Auto shrink category panels false Zoom Z false Background color B false Background Setup W false Add Favorite A false ? B Manage Favorite M false ? M Manage Custom Layer M false ? L Random R false Help H false Report Bugs R false Forum F false About A true Recommended link false CharacterManaJ/src/main/resources/menu/menu_zh.xml0000644000175000017500000002160013615720000022442 0ustar paulliupaulliu 文件 F false 编辑 E false 预设 A false 定制图层 L 工具 T false 帮助 H false 打开配置 O false ? N 保存为图片 S false ? S 伪春菜 U false 保存为伪春菜图像 S false ? alt S 转换 C false 打开当前配置目录 B false ? D 编辑当前配置 E false 管理部件 M false ? P 导入 I false 向当前配置导入 I false 新建配置 N false 导出 E false 设置 C true 关闭配置 X false ? W 查找 F false ? F 复制到剪贴板 C false control C 水平翻转 H false 重置颜色 R false ? R 设置为例图 P false 信息 I false ? I 全部取消 false 所有项目均可取消 false 自动缩放项目栏 false 缩放 Z false 背景色 B false 背景设置 W false 添加到预设 A false ? B 管理预设 M false ? M 管理定制图层 M 随机生成 R false 帮助 H false 错误反馈(日) R false 论坛(日) F false 关于 A true 相关链接 false CharacterManaJ/src/main/resources/splash.png0000644000175000017500000013633513615720000021323 0ustar paulliupaulliuPNG  IHDR+miCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATxx\y`3(EUX,ˎ,;n&l/q6/uҞYr\e9bYT(Eb `zo %[Ypp{?o+G.Y.lh.$3ɬD7l6^3 p̌w.2uf %*ZJ|*QNI6PPe Cs\Dc^bYl*cp8NL&L'NS(KJ%JDgGlyEI>K(9JIY,EݡD<;Fܵ6A+N\զYTJM6Ӆ+^umedD"LtL&H$bX<OtB,~Fr'6׽ekNTR%J$:#&a4PZ> I|Q%%lT.+7>5P$OD u^Qj e΢1i Da:R8dɹp*;1rTV7̉Xd=#NVYѯ+rZ>P*UBV1|.0Dfѱ1^fmmZ-.-LioWjAkTrH4 'I,.)7O8/jp-h8I燦}Aޢo2)2r9CX_NJ}1#2x4'ghRiLT$oհS\YjԗT< jq0^Եy淺ii]<.t Fsl2kxr^Vk_.ƢLcN›ʄPPKA_,J(&iHl$`ˤ>V}ryC~3&ہH(6=f3f^fQjKŅ<(=ت"st:F(tRQkZj6K\|SU=^G*?l:1,6˴*UU8dGYBV1* !_LՖme.%0A. 9(LKT|wsB>j Ccse MppEI&?4D#BFU:ljjRa)I+ߓ#peҴ^mX.B (j 毅*)YTHpB%QR O yCO$c)QѪO |pm/g4+J #}De1e/`L ,1\C\t3Ͳĭ*g AkRxʇx=\t떵ެg/YG*?ږ&ɀ%S f=D D$| n2IDB^)lUֹƾ JRUJVkٟ7>BN\:a *>UTAĹwA4*OcĐwcdUԖ^r'f:BosOɬi---?P;w`44ohY^_''w{ey`{RJMu^T5olv׸50)K?WyՆFz:fYUEU-*eZ6Z/*=JhrmOZtfӂB@y6WKgAu!t"ɲ7T6h،7175LDܵd6s wvڶmڪ߼^{ŋn#Ȫu.W877_/W\fW4^~1LádmFV%1PԌwޖwd" įY!R3+6؅0R̊lA _X|^QQEHC!PR x1LyuuEfcZJDSY"4=Ó-;**fҊb3^~ݻw+_җ8pe7ډ;Kaju&k ߥBUNt Xj)MC*-p^Zq94\ +(J'3-+JƣԗED)PR(U5eQPfYj*gTFm}[[i0T%º:twbbog.O]bz S|/?dߎYMo Lޫ z+l0dy "-8¨ F@ v:֠V(̰S4I¡ϷdKEԉK78~T{-%8-U3fx< օFx<8ʼK7?!T/0JWOqkhXz mky=71a^ţ?}? 媽r(eAv_ZRfq)qVxG@=O}\VӄBqkP(-4I_X~_}G\-_sekpDX7_F^oqoݾ ɠꇽ} Ru.xF߸yX gƼS]cSLyEv8voLP>ӗu]:IwV2,ъ2Dw/}o5⏽ŕ?i8vwRcLSaӶZ<_\XSeZa¡~m1p:h:|7F='fq|*﬍UX +mYpFKA_RkZw7B؟]sOww/WW:G~qe=U+]c%^0tl|t˖-_ʗs8iwɠ!eaxWotxLp%dXݧեׂM"7}8:-jfq6v-l /js\QثoW g|dg>Yx7x#t{8}c3 ;>XI;7/kva@gMgY9\ÑrD~)_ԯxm])8췸B @,"*7fc;Pu*5KԬvCk,OCy^/x; %^¨RUֻ|~^Osfk!* s{:ܾ3csNtC I2a)msCPZ?_3‰Kp9<7?O@JmTͱTG|̚OZ$}A3=:˽ ##[>Tf}$!-Zav2s%`U. t+Dz5&M7lj'0>rg<4ۍԐYe'N{}ӖygfC5#p8>:SN:;g>G9DGUH > siQ&vzk](?0w~?FTKm\KC3rW-$geaɍ/YsGÀd"J(7^DA-3t-Mft |p|rm07! f~n=;TaiUZr$J]JXPY _SXYU VF*8xZTU^8YQYNiA%'*E78voqWuvuk};+ʴC<1Tj""!!yI4P\6]SF 97a_܊uKS}3IW+i9vTBӣMn82^d&Z IjԡtTXиҚDDPsvYgT'iNssuNxтW\_Q/>TdeR4iC9T&֪n=QJid{F'|q\dH@Fe}OR2۫g&0!z*a1! -h?rH  ٲ!GGhQ›\K;\לmwC(Nz>ݗK$IwZ ݲ{.z=AlVKrhPK|@+j\7nHNlv1X|¥:K[T?ˡIIDO4ḾQ>oͩܗ%E‚oGCOcOѽѺf*7"s˖&%0["76IeE S;=fjӧ+k,N i \Ha39֨'[[#z``#Ql{zճkp';p Fgzl;*/#*"M] F|5S^H_Y=X6/]8vAe*(:UNf4e%O*ЩR{GܚKيIcL -[ƻ|US$_6#Hh3#nZ*"’fp~R_2LM9v–#"XS էNؒcM"͕~H%*̳&D:X[ډ#?K} =5.wH$;q?7gv]!BOFaqs`5psSW, yp,ɱC Ql, cMrep4$$0y1gJNYIeοq "AYE^IOL}}G;;}3 j 2A*wرg_E۬/#d?xoCd E&;$Tɩy+2X/~M h~Sg[l#UPb;1_+843f?9JdðU!zd$*$uqמ]IJ(^f )7/bduu _nf;D|,XbtT@jNi'A7c3;LzPJXRO'KfK2t`&62;~z_\tvvj.Äv%"Rz@Z=LܾryJ: 3GyWd\ ^~ߤ;.ݓN =9HX80Hjl5|֫xef!S;~M.6_ɴFkNcQe F]sI YL%K6'wc:u:-9)4%6dqp)s;`)_h+60JMy%l\(pI1 ѽho2[,~Dro2!KF!BPf3yVM]h Jv IDAT`򤍞ĪܓCQ<Zulj>6XBHeF*Jǝ6ZoIAtcVV:bΡ#;v-#pɯySn˒# Tt8&bx\r&:gdC'F C3d&X3 v2R,'YOƅю0Wf=!PAԴKP-^>ft.% K.IK)mиv\:ߺ6U8/ ꓧ "b+J0,Lb'm"^#W#hhltzpϡ-B&X gѠ̈́kiW>U8.ߩ|5%?w y{kF[mr *N)c]Դ?s£r X1<8Ne14O Xێu.,e#" HzNfiQLNN>VP`fȐRPK,*H PDAhH&,iXub1BR$ɫ\(_!^ДeeUlfmz vH dRZkj,tj߼#B5xx7v7McOGjܼWxZ&&.? }<كkeɢd6sS,Hx09/Bډ7Bgw v S-ꏨL4c ̰OH,렺rWC,-+JBFf"[=c?[k/CXWGĺ>aK7x3`Q@}|`*J$ȼ+#Fx%n(QF.Pd.rB`ݞ1HƜsQLQwvx,}∹SYzǖbk!:Ow_׀xǐ|j+|,( VhyYBsxu-UժT C0s%Q`ɅQALL͈j1OK.QiC 5XZZ,m/-wۇІD> DoW\uS\}4[oG֝nܶ{ \*1;9b|31QA>|݀>_zy1苺k#B<#?AG'yi2@vYat TN c{;?~ݱgΊtP z=ˀ-a1sRR)[?ERt-hVg+hTzm{7WC~N!)`^fKDxDey\XftT LU: kfg2/U5[peF_^]bސ!:O+zC[-iΞ7OcmφH^B=N1ti<A/|S-c3|SaK@*|y=<( Fhךl3KԛwdshKd* `.2B-xB !d:0 PH]Ih ]sG/uU/!|EQQ&B:? ݦ9O _kg5S/B; ZY%o9]V%bLlb8`~{. mՆ)NH(Sdq1S&3i"Z ut<\Un07T'4.P9 8Lstj_ %X"1@4 P ?슉Xbm[L6hߴ|w*+-8ݐj0}gjIeOގc~΅*k]g/6hTdS~('C)7=" oڻ>Mpj9SS0A66v.CӮ vK$"E ^TeZ|M|$uِx_$<*1HGiҘAH7q?3L=%mZ E A`e{a (25. 6Ky)cc1`9d_u3 .bg~p~ڲ=]s{_|HX:x-65:ad[)K`$% VF O)B̷ 9% Yai$@"Rg:ǥۤbi2XJ ͝/\2 QoԢudLG& }f:[D68drr!MА*Jrse-aEFFFsICY o#bɐԅ;U)%}NZ"Ys/o432Kru&=}L꪿1D 6VjAq[b L@+k-$hXv-MpdJd`h&nMGP@/P2&*Ϥۂ $S!4BIjNuryB Bږ3 0rZ-A?Eq¾|9oXa'N:F2Sp `uv*8T|$%YC1+(-L(i ;dgg%Z{SΊb 5M|n~]c\1V$#{8y5{P["PXK"XoIR",@⸐W ת6Q'18M {4YODFLj-lU1R{'maQq$-Fүh<쮯~#'6 KHhFA|X&pF^ S" ^x˒3|I"唓LH/]F/}=Z^|k W>ץhb̑ c{{>)WJu9 DlcDc-%2 ɋAnqe$V"ɠdlr!WAb G%Bc܂2L ӑ}"mȪbX?@ iYq@R"\P&TWeiwF'ŪC݂gqY~y5!Z=߀|RǔZW%f&KXp 1,5;;3K /9>:Xy7zώ~O#}Q`[(gaCg0LpRj 0 wJh\LK|"&lD\gF!"ic$K5حft' G?F8BQv: #b#_^hTIOLQo2WN ԤLNV `p`wRZv Aegr7aGZK/vy2'j;RaԒpY`GaY|J=6yHRd12F)aB}#SѤbw#ARQauG m9XX:S\֍C/KMkI1q +*+Ӿ|WE ԀWsd`.|/ZtՎ֬?1ZG*,b*\^ʖBanګ nO_zvy䫯2.ϼ0z1, 3`x@Mx#`+ZN$6 lli4z87j2jJx"DMaT4fáHHԇC lȀ!f>?6 w !$jo !zɹ4; rQ uHd1 9il^! @x.i+-x~su4DO-{ia[tM $(ޘȶCHq_ c/?Zye]pur|4h-DwJVO0WV;2 fN|TQ܈&ZqyJU>&#,cP~qqkMBdҫR܌7(%}Rb~9$ᮻԡ T 0'qzB):QYӬS.YHYlwot $!92c?ܳrfec?› %U8Fy[>t/B= FcBZY2V҃?M߸Cnϕ IQPH0:93M 'B`U9« CL(EK&*"!|#s4y5'a 9BRsw&&^Tb]qgyC^e6M ׻^&t VOd6lglY[hS4LO}-3ŞR4}1gB) t.^(_$* R|1- ˉ7j2篿1Vp4J=ᙺJvêTp]lD7y(6uիz43H[o\T0 :/̖}wĠ TT CNx$F3/Anԇe G[ AP^fp_'R:]fJfpj!|Hւ9V{Zb8ݪRV)L%_4WH)p(߻u绐SqPefnWhL80mf77nyF~d0/T>#,ژJH*zRzʻbXC 2FebjBgǿގ-]\Yx9*O;?~Il3/KF1;_޼; QC? ,RWܷqإi(4Ņ_`@[6ϒvn2 Tq1-JZ!>rPH*?.I;r zJ!B}e4/QX h4UH̭BMTLƐ7#@'ue2+r0Bj.X~1iwUDzwt9M-8CnA[+eopp9矎 L^*M Dc F(bOnڿjsP[w'ΌY b(,QF lq{m=6vm _ u gJćSh!N[ΌYjD"PߤAz`eUg;64 `ӔiA{vi3Wiq_}m_Zjߴ%4dR>榅WK7y{bi^YE{[wȽ+s:9<uۉv[JD5y/aD 5?&!Q*EozN>y5Qn%Ju,{Dα8QTb: $\];1L@F9v,Dgr!o-[PbG`5:\E3ۚ7 jT.:@mRTbScls8: /l΍[kyhw oS, W,;5jF' IDATF{`JI(HY}~ﮏޣS[g'8_;:GxeW}s^4C !P,Q"vML ֺgwfcM g͠,KVHYAdFXEDWeN`ջ6 ɐP(ėfFsirj0U"¤CB$rQDdYYtnM:SEJ{.%/,)hc ˸:BUjdž©UwAܼoCյwF^-\GOt裷uW"7%iZiWexY3pA(ܻk'x$$FCYNd`|7xON@Xee"{2&CӜ/WNm*r,mo!U$ɒ>2$ T8zqHJ7&LΑiwpjO$$D$qE3mMF}8`-`/Ńd]7P*GFmi@ %a_8d*Չ55oD_ySKN_[vO`S/_8a ֫z8I+\YG~v&`̄}XAQbn|SlZ# l.9{ZG ;'xK@E*sd2ir3g,|W t!;T+w͍M04޶EӲdX, p˥`b  OfT*HM3;,.A$T08̫G$¡J; `łM7!z*kF;Wֹr 8H*~:K}'q%&9m.`&M:g4h !8>C  A!(loYS` +.xu޿| U~&F 0K%K۴?zC[yɴJS(a\·efԄvn±XHM&DR%Bݵ_}H4Y o\vEBrk:^Us;N~ X*B#oΛ3FRʮ| ŋy?xIEBRuyJk}o2Cino&2o1CdqQJe}UP-APQDqWCi4fi6k>wp e2T(O ͭ|9ooBmķ_:AYw4j|ϰ;k>c8kWQ .ZX~҂+QF713*c GDᶮT.}G4:وGDKݖӽnyŻ\mzˬrUD8HMAФVl <Ɨm['K+l9GEl,Z>#PV1|iLUY nWY=29MՈJFoXLZ\LR @X('E]׶Ppo$6xTEмyĀӪ UZ%l_6m̌Pߣ j"LTdvNI4:ϩCڬ5UV[݁h{d FMmYnuAFm#iM"+Ye{ Eh`')>ǎ{'y VirY.ŷYoi񁮘 7\5SPvֶ)<7R13D "kņT|4l׻/ {9+ z)bU\]T81Oڬ7z?'?~[?z_!["/p BJ?76QΠy zGhDP4 5{:$wmSkuUNgpxz!Yv1;::&''A]4hYYAf5&PH&"MMLseC9"8 ncM+j r`[΃'?zd)B ~8mO y!(A e&JI;]K](!7|_{wNAEѨK4:AlJCuaS'])@#jQG _2=?_n@r9Z5iuiFp8<00PWWW 2/DH7UmզEskUu.N9<\{Laeϲ<yeNɵN`,fˊKJ1x◽|&{Z&ʧ`M%@/|B7>G ~˚ #/~o?,/sߵaF}B>,>JR:*! |G#<95Íp5f٨54|PUd7 G立'$e J>s`Tj& Fa87FР f-$ʡKc,PR`9>ݶk8_x6t[IqQH]QZF_!wOC<߄o/ofb8y[`]N\G˹<>[c%pb S{ƀ0!.HE +(BeN =̏~?,)shTt؝UZpHFFF{7 D΁֍p Ts0{ +W..U-i!sP1Bl*l[;GG:Zfdj6?'>_~m=+4l|pwPCCEѣg;~?}0cس]Sc[Yrv/t̹P(,n./  Q.lXo -ՄBD8 V4V_멫z 􍣕oM A憇\W_dYM̀9oVw\$r~v^[ED| r'}cmݴ|M\rW7sv[/\,q\\ ⳿oͣ;ooU]^WVa\9ct*8 W9\]g&ooܳ+L75];}t\y~ɧ&&9GoT^A^yo[Rpb].Vl47/j}2D8M77TkV0zdZԎ0HtʂeY2E8陌S^?Mbr[͎>~<-:6Ӣ|^JVy"}~ Fɑ] ,!Y<r.ԕ?ٽm3ߘ捲2SdwZnj'aU"[;nS$~\"G*U tjaU'3|fŮvViUj;;90;z<ݮu֕mp+-i챱C0JL~?}Dl 8%=M<>o<ɔ'`&2}crzG`ItOU cG@@P,XVKܱGy]_S!vχ0UFWNM|es&o'i .T4jb{~Ž +bBn5*Yh 4|IE|7]M]:e`I{Iao8oP$5da7R' kGG|{ ctѨ8ߕQā475>];.M #~+TyHK/5M '8nR=w.imcޑxNUտ{q>al\8Xzu(|4J/ˮk}fb赧BJ2P:W۞FX/^?|Yp6`9LMf5_eϓ;- G{sh*RivZJک7B]֛Vߵr>ǵ)cڢ}xVECEB`& n1>at!^T3;:l oO߇i YK}BYGWΖ8@ߧ9x7Ô! i۫7l%c- &9;&Cϔ&%VSmS;=Ao,^O0u] ]^9#c";:ԹDVk8~Ua~p:%{:d|[8Ld>[>ubf9 .≳cp-S:Xeo(4rVG\YYsmsw4x>?ʐiƒi$8^3/|m@•; XOB89V)QM$/Mj.4# ϵml??W?,ix,eyBEfX8p<|WwF}Rvsuں==,HO |`d8=Ҵ~ɉxW%7ᩣKeMnd΍|'7y< J؛l{rRz-ϟORpJ!V0G0ʜ4IL{plL$Z`AI6uvj)) ;pY'fQdġw߂._SY?0xjWaO.ʺ_p:ҩ;WZahU8?#\]@]eRtBY_BT7-8^B}IEQEiW\pSbccT}py"ho}[x3DҞHH V!ɨ]yb jH[Lk)CYng?}nzk'/tStw⿋4jNhVdD-ؓ-N.2X8<4(4H|PuJ[R ,h .<=u7S frh"9NqˎN2_uXAVnXkp?߮}7߷7"9a$h(@"2쉢M#cR) @,Nve f?$xa_ T0>Ʉ7UWȅO:vZYڐl`r'iM+W[g' O?lkt\x dl :8DQ(p]O2﷒N@D$4a>ɋB:']i:y(;␇~ԉ-7pՋ[I˼-ja*8jG'VZc%뚘wu;Np4v:ZOOXQn~OՕ h+ZGFފmu+?'ޡc%7s\D9Qd4(Uy۪$d$@q0_WSg Ah 3'% =T)Rxho_4{iЊl)Ztu\|b[ot|6sb"1$k[\sm^xf߻Ѩ/瓩\2% [,KV \ψ!| Z"T;{ F0F'tRtS%b% !@1H>{{EJދ-[cjB |$^RHB yCfk%mӮgZ57lb4jvf{9sj|$W F\#!9 !eLON h4= a{ |s%SImpyNBEyXj,b}P<$A|FX aD=bI,L: Pf-9I7pH.|vάADxVmy˯BHbP v,0gpbHNeΌ[ \ `,)mOF@9/(+T8|!MPdHZQQ|8AΑe('Jr%ܭ p8Dt8_&xQIut0|p\_7=x / n(H(($G"I$C\[K4 ^)> hf́& vtRfHQo~n!ۗ)%UAd |pK>Y4E0=VLB~!Jb@|@'0ϣy8u. @#i4ukeBo;w p@tщw-YE'`( ο].TCL,O'}rDDVMjv&*sLVeU~96\NFvѣG8j5Y|>S,b )0%F@XI}Wjmt>_G.Iʆ3z}6HǕa j'z (!/4w&lY|п,+olA˾%u"6KEݠ&K8S@ yavF3&_ tH3 Tm IDAT<.m?"$DoH܅|~ٲ_/`RKv O8tj9͟nXP yߟm[&-Mn?.]h) .+'ojhtNd#0t& D1/4 ݂B0 ?|⥋c.w,$7xJ#^ ĝL&FxQӝ6Qg zr##±bv67qm,(qa{l}eWC* d1w΂ŕׁZE)boI5g0,lM 2H'PβK:/м {l/ p2LQr$ Dfq9ryf޾I4AȤ"!Tz^=|O>jy˳55 aV&Z&WP"i;Fo+C#'c" BG|~M.Px#kkk}y5k9x )4X/D= AqngSsj %\ 1`V^SC&͕+*H !Gc&n+f ׃~qu*kNJa;եmJ%0c29M唙6AW;"}Ͻ~O5kji5 H8No1؀(`uhÅ!&L~s^Co\k$Yl?&[mR3}; %YZ(~pPa*F2UY=j.x(9\`LBH+W"Boӧ8jkHاnY;#UJE٩53 ͒ŔA eᆌD,#V9W,>1ʻd,&H$ *+C,*i CbL4;`39 *sÆӢD_l۲bC(T1XpF'^0 c4/ =(UyaŚShnq(3Phpbq[F)*6-a?ģ0# w^_"GHWInn 8\^3)Nw .g O,da+hw#`M S*'CaPa ̨HbBd2Qy` -m|Aftx d: 8,;' ?޸a=`}ă/y~ҥR]ྤJR$ !ABoK>(y ra bIgIPP vJ8Lj%)DY2Y<4 f2EHЯ:[>S/t\S4m %$X[nu SvL%lK#Àdܩ[&m %I&"oDOK%0<5P i"hLO~!_Pĸ/`D.$^N4 ^M?AT:a=pQyAA< G֖K=с .0!1$|t3jgER|^ZoD(И1pEf.jZut5E cavY\>'I 8#p ld3d:7E[Ͷyㆽw]$S kP88,k5]2cLB%*AСHc>RXW[s֦c=>=moj"bnO QR pk F}? bPbs 0A3x,Jm_ 9|O>`>ѹB!aw .c1eW7 W{i%[q⫴]6No8\h~U?~m% "vh ".Wy}@(OɁPO_+uC͇CmzOrqK q4'!~ |S}}}bfAoP&ۥJ*]>Ckl G.SUy9YM'[urX(!4 h6 6] PGIdBv˾`UY5u9۳4ڧij,J|S-(RWU3= xC0Å HEcJ*DɌ T6n1w[FW"7D$|xjnor"f"+7sG~`͘.WX}#ݱW"!~HY.7kXJ}=OMW>A_~yT: :S[}(|MaQnI|U 05T:NW2 LYxg1ڈݩ[Lb֬X XY^S5ލ˗r ^;,nokmհJIP7AڞUm(bݙ~x3-Mg{v@ݎ\.("ˊ9" 1MV)oʲs8s/ơpD΂5 ԧO2OSV]wd֬؏~A#X(Jʊ@#<^AijH\\tJaFLu˖3wѾC˼"a NB,QΘ=XI Z'˖h3>\s =+qoT醩B]~hdX^i&NJxa#_8 EW hgg?~t+]WM?Yf]#L\bp(|LBgzukW f{@ !@9Aٺrr KQd 2uubwf3 Y,9C"7{`Ӈ3lU~E%! F -l|Pe05$' 3vL?_U3CmT`3;y;ۻoKiȮ{O>*RvXM[6"Jiyi%0{*<3' LaxE|$~<|ۺ o^ D*#!PͶ5e̤43w^#UIJKmi4|NL$sPҿ=_xviXlzUܑ74PCd/3%95]zk}P4Tתԙ:~$r 2u{h-x !;ofDq{Q?WLBg}YyꙹV\Q__aMS8(0@UVزdX,X!ʯBv:C?io2YKSNٲi.KDlCTˉ2[',糯\1^{~+7_ //W*S1}.Aұ)J@PN뷘o+gN7}H 0&!0L'xMND܊ʊcGOtM] 7[+t,]"&ҭ?믈 ʟܚP(qHºpJ29ήmvljv]`sͼJvpor@kd?ݽZ&[ףfpaP(~/uo}n.-&`r.j*p"=+.^Vœ83Nx.P4o|`{~h |Ji0^Ӯ;h?{ ;Z!0hZpK֛UkWר{Q`gW5lqY\tLQ^?L8AƽiyLӝ?50wb ESyNC\ux^]^;`zz8gNc_?V[cO}J 9ߴI =2|l% O2Jv+n{-|(!ZBdp ?2l߼]ΜK*/.+^b! Iu7, ^/qHxAAQ"Ii^T3pʢB:!ѹ<M'JbB0,JJY_W=.9,-;%rɈ4ӤrѴY8,.I߯;e=~suEƔprZtR(G"`ߠu\F6 -a(D縧wW3=8Y:\-VfJx"Ѫ7h M^V'VP4t_ {`bmk ټe"񌲢ESz9%P`] IDAT(UJYF@D, '\3M;}s1W40X<+|`[>k 7&3J ܁ T*z5 8cs/ZIxo *Lٶ+TOV]/I 79W(@kS-K/P+(麂ݺ7Yʌ\vZ1 p7kH[{z#@.wJ~?s9le]K ,SP`TvgΩ) MޫoqYuͷd+`Oc F< q7՝;Lº]{"sVUŃ{8[;XL֚+Vy ֽXR֬y`lH0Z":`S jEmaA4zߴm攪oNXV 8 L߸#PF5Qk3M8wtɎ˖HUFJ:}u}̂0.P%O`ꯜx j4暠)yء;|:[ 7-g ,lMFɁ<n˞xht> > aeҽ;xH-e25__bz- % p[$˫ -ho~4sکS yRZ|&@_K|f0D+$8'z>}~Jgۧ U; L=榆=cŚ1l`/5 hHCjq09tyz<~ӧm޾kGSs/J9u3Uj"&wm!D%w3H&JN3Te"L T6EVң "+Bd&`_ȧz۬ vzl-$WQYqf ޫ7XZtF;++*rVWVV@:ߴm'>߲h^ou0%!xH D%`0)** JX~El[M*3ޞƶx$Vf)I[,>e+Te/;_&ݑ0//l @Ę+c xoR=(l"C"PuDcirH^T|zEzzwm b8- a`?8EtD!BU"ZMTՈ ` ΔQGʪe-X2d4tW_qcm?t {/~0*K-[@ȅv&Ůā<:D ~IaWAa^aY NA^,km64 h]Œ1OrAKAXG\  0ED.R`s` %@x]R<|0@oZ8Un>ظNb YgP8fc  wS`P>𭃴ZUQJ\P. u] O ˔bª Ӱ1%DBX6x+ e{LDZfLSsFmnhR6h2á~r;:pĥTc<% zN#e6 rV_]rs<@$&ytNh8ڮь} Q">][`VxiC|w6ˀK ˜3; S]kkJVE$,,%%bXz|`Kÿ5KC?IڣC0BD2>JWrϦ7^lֿ_K"^\-ɀQZgryC]8+x&!ޙk2c.bp mnz /d9.I(O=ym9*ڐ 5Blo;z %S*:;l4W/*WKE! "ep,@{)&RA1 I^ (eX,jl;vnFӟ}ǹ|[ZTh2(vƆ 1P[dUhM9L& 1=.c^CM[N|C+`z:;?4ҪJHB֌I“-{2ɮsg.~5o2k\4X$F86#a)s)I 9Nod$k;j5sW{{јW3L4|0ڛPxh Yi wO=69@(Ȃ-P/ױB|9`sykV0\Fa6̱}VM#bi,1&SfMxA @Md!>qB-&ogjM8qV%|>Zg\ǥX4.&QBRHK(Zױ|_ΞqlR^- z=T " ~_0gAq]cyBÚ>|.vXXXdQDG3Y"zLnwn^<32K+]ř'M~o0$*fTIn)Τ538$Iegm~]Z )nϤK׸:IwMBBl%)TXK\M:R.D@'&s{템SZ_P$uVx,8`ןh8kVteԕ%YťB(! p]lc މB%O8D&PQ0Wh(?Yp,D{5,3Q)U_cQI6Jֱu1T{AcQg:|P%3̖-0d2,&鱸%X_SRT.ȁ@^Qfa8~Z>V >7h4%53fD0ZcQ+&3;G q'vp&y D7#d5}^-f#c tOP&Y=@.ǽv?y3'LƠ֜wGBg]?Ң2 ,S[F4k Î=G x\TUgi=>%0v)3rBg8#S$ƞLiK,BU[&!T(X3Npn6z`IM,} O-n_pA C3LRô~4b60IK|?&l,aAD!8_K t;:l&;7`FI%ĘΎ,jybI}w9rNn@=np_ʷvoM㢸Bxce˖@eDaW( BDC{茄&O*n#'9h(l vyG0a </9+H#g5 (3aL|h2%Z,l8,ļ ȱ.Oԃpnno,΀Ge)a_c,:*fU/oϾ{z%#+QHqS#q8}LE~#H˙ө˖n߼wʥYڑ4[2(v}!eDbV |Z|NmҐ\h)Ԋ o/E7_ nPΐEDN3* nM:pAY 6K*b :. HX"=ݺ%eIn^q&sf]%dy@Хsg/Q3A L_0j G~z/Ι[+ԙZ0~wLY% h*%ބp+QbdS7s-!0eX`to*_!*՞x[mل` xMNUwF!u~LOwԲGWg/O7}ퟨD[^|YB+$?Bu(Qex ! /}YIT@u\Ûr5h 'deaqj {vSา_ޱ@]-;zɬęUIv̚oR~Kb/,Zӧ4|%~V !jRbI+^w gߞvBbHuoygQ`%w5okyx' L"9z ,n;{A\HtJȱ!{G1ZɴeG + F 8ń:uٽgo}O[7jnE?Ĩ Psm[>OgVV/9^L'4n׽ol#ZZNn /~ݣ./2K95KуJ0@N+7`޲18mh GObbddpY[[:!,GfUL\ճc_>IK&G6K ]8l9oQ(}6I ȸPaH,eWRܚC>mӋS>og.Yu)B`@@]lp<"zE/s ! I$ve }p(5?> b b-֨*i~:ξkZÉc;zG] !od;_x`C]˕)>:D28/}><(AB=ÀxrBn;iJ WwW9Z͡oFmx4g jDag U_&jtp_?x7`gCFQc]sܟ/tefMz,$xMR?~6>m˦QWi=; RUNO?^H/ ,k| <_,u]"%]SԷĀgjidk6 Ά =yI_LӇ@Q=bgȨJ?-ZJ5Z)33f 弄JoT_%B|M| @OܦA0Cs__ȮX2Do* Rצ2msΊ&i5}s~"Ϯo-^,Ort?|gb'zx]ʇ\jL:9_hbE\Fz7%1#am߸1U}/H %֤)JF5޼y|[Dbڿhk\P"d O۩3h~+~aù_F:*kdIltȚ~g=nȝ5j-P ~pyDоuSټ}\Ӯ6#=rǝ7~sG&gTTB-J^7܎?L:}+oT@,q%24#Y?c#x0cësKpGO_[? Om<ʃ1_O5kŵ%JmtZ)UrN!ޅ[@㼸YIDATU Xw. G ~˗] VQtN 49CcП9f;H8 \P|E&c]#CyJ'L`*qؾeB]H:aR*VlGr3TrY6#۶,yR;a.}h4ԋ?mNwIB%"Ac(78TL+]K'BT^3U5UfNR?Ia n>؉BТGy5MV9'Q fP #1&gd,f_w 5rg.\t !N)\<ŕAdB0/ R !d||O}C#v)]VU`[?ű dD= {<1Y<NҒG P9j!gU@&y+ {֮AͰw(Eā! D̜R8{Ce{F^Uo=Fy}7Cp@oq=}[5 E<.RdJz cKNA;0tee,ui9~uYvJBP ү @Q9jR\Vg:zuF&L,UrVv7-HJO~hk={~ `i pҐM՞o*.YIp,#ŤI]X@<,0Hzby\A;jx]j&7p9aŨXt7*C`IDgw!'9]Ê5Wۚ1 yN(R1-?#[M` y{GA"50#Nñf[#Ll1))WN6}JJ1o~b>98g4ÌH]RƗJblU,G,K)DMz ,R(3 GPc[5{20[t9a|\zix]zs1#XBRHN_kݨy%#&HB4RL84UXP 6ͪ&ʍR| PBjN@LL `"wҍb0‰r2CR,}8HW8qL)*(L }PRWPOPwR-*K)eq)լu>m iI%8ETp*zɈj6tֶgXh#%+;H^zZ #"-4mz6@z vj;'[fI;!%"\v;1FڶP9:P;P -'mim 8 x`+m]`TzZe^opbyI)UUr!Ը IK::dT3'@YZ 6ܒ L,#C*AahPcuN*3?L N$[[CH@t|T fd. L:[Li=5FU)d/;7}响# *bޝɽ`!TFSVS풀[+4O39_h~N] jF:_m>e=6|7Ģٷ6t<Jv='a^dԂ5ZFkjjqe߳]O#nb6&d.%jvps2chܓp:LFnUbނh8t^-M]憮۩eW]+&ftd|^_ gI_/i`z]7 by3<AaeCK|~ taRn|]>gJSgLyIIͷU4 n{;LCb # `BZsh?5֧~FjKA47~o>Wپ6N< A)7${wMh65ڀDQEՕփǩIX*+`xOdP$HP&˗][>'B\k&Z 8a$'39v.O^59nyz/9D|Xxmf)]:A*,}5Hg"BC/~tC{x+F >$SAa lj,..Ѭ}8>"F|.0)ކryFm.^ysuTj LϔR,35 < /`%IT]} /#"- х~id >!6!?-?^JTnХB@sy)_-.b=*kHx屡T3^Xp)~BX$sE]? pRBG', !BfXHHS=e}i?5{f\{`Pn.T aۏ,)+Wl6?+wz$[SΛSd՜9J4U;Q&e0QӔCeAmAz{‡wϧ7px!_jr@.~y+I{6SW\-)&W3AlBLUO$|Q1Υ(ڠ|:= 4{bv( A}mœ?iY]G}KY v@+ +*4.A3J?1!M3?;tj;M43{;*) z5Cs?B!7a.rgϻef}WL(*eQIά!uUoCK_H|b~AVZŗKrIVUT#f^SJ59n7| (Su0H  :,gZ & eqji$D{]9p'w\(ZRX3:m^IQ]zG/.H*r@}!u_< I`Z_2'vg]``DV>".׫]dLJ[)\\]d1(jNP3WV(؀Nz$9SD1%w,P)N enr(k^ MJ@#O{I]͛ 8k71*Odꊳuφ gϖOyBNDb'ALN4ACx$WbI]z5EXp7F~ْ tcڎϯ͛q@W^v5K,`s;<+:%CVg}W:L=*|F?o[?OȞ5҅wރqώP0+>?~cҢH5RcϪpFmuD8T-]NQحlڸYfY)ٳCYA x)0C`ի\Ȯ(wB"{ۓ1fmujF*Vp\ ~$~3x^z4)laA=kQM30b:=6#j00kW>3glKKu8T+NcZN[RZ[0]eפZ'5ٔ(eBBT%Q<أJ7D{"mH||DV ]U 9=Gۂ!?,gzˁQ;0bjWCqv8XJP= _4k6ǪQ26mb8Y*׆'-x1ݣx͐:k#_uLin(Ғo{jwkBwkR|(}gGTTJE!ydn'X`FX'ZJjF'55bIaOl8iոhW{IaMĎ汦ZJ~NJG!9Mt ?'2P6++_ !HuQ+Ҡ*V' YF65·U28&SG^Tk=\ؗgKFȩ NbSȮAs^::*1HL-B%Bƨc>dcG8_l{3YS) [q "sŧpVX`qb\ NW-NjL キャラクターデータの定義 キャラクターデータ名。該当するlangがなければ最初の定義をデフォルト値とする。 備考 作者名 説明文 イメージのサイズ(幅と高さ) 雑多なプロパティのコレクション 雑多なプロパティ カテゴリの定義リスト、出現順で画面に表示される。 カテゴリの定義 表示するパーツの行数(初期値) カテゴリの表示名、該当するlangがない場合は最初のものをデフォルトとする。 パーツを構成するレイヤーの定義リスト パーツを構成するレイヤーの定義 レイヤーの表示名、該当するlangがない場合は最初のものをデフォルトとする。 パーツ全体でレイヤーを重ね合わせる順序。 色設定を連動させるグループの指定(省略可) カラーグループID 初期状態で連動させるか? このレイヤーの画像を格納しているディレクトリ名 カラーモデル名 レイヤーの識別子 カテゴリーの識別子 このカテゴリで複数のパーツが選択可能であるか? このカテゴリでパーツが省略可能であるか? カラーグループの定義リスト カラーグループの定義 カラーグループの表示名。該当するlangがない場合は最初をデフォルトとする。 カラーグループの識別子 お薦めリンクのリスト お勧めリンク 説明文 言語 URL 言語 定義済みパーツ組み合わせ例(プリセット)の定義リスト、定義順に表示される。 このXMLのバージョン番号、1.0固定。 CharacterManaJ/src/main/resources/schema/0.8/0000755000175000017500000000000013615720000021055 5ustar paulliupaulliuCharacterManaJ/src/main/resources/schema/0.8/character.xsd0000644000175000017500000003530113615720000023533 0ustar paulliupaulliu キャラクターデータの定義 キャラクターデータ名。該当するlangがなければ最初の定義をデフォルト値とする。 備考 作者名 説明文 イメージのサイズ(幅と高さ) 雑多なプロパティのコレクション 雑多なプロパティ カテゴリの定義リスト、出現順で画面に表示される。 カテゴリの定義 表示するパーツの行数(初期値) カテゴリの表示名、該当するlangがない場合は最初のものをデフォルトとする。 パーツを構成するレイヤーの定義リスト パーツを構成するレイヤーの定義 レイヤーの表示名、該当するlangがない場合は最初のものをデフォルトとする。 パーツ全体でレイヤーを重ね合わせる順序。 色設定を連動させるグループの指定(省略可) カラーグループID 初期状態で連動させるか? このレイヤーの画像を格納しているディレクトリ名 レイヤーの識別子 カテゴリーの識別子 このカテゴリで複数のパーツが選択可能であるか? カラーグループの定義リスト カラーグループの定義 カラーグループの表示名。該当するlangがない場合は最初をデフォルトとする。 カラーグループの識別子 定義済みパーツ組み合わせ例(プリセット)の定義リスト、定義順に表示される。 このXMLのバージョン番号、1.0固定。 CharacterManaJ/src/main/resources/schema/0.8/character_inc.xsd0000644000175000017500000002727413615720000024376 0ustar paulliupaulliu 空文字を許可しないトークンの定義 RGB変換パラメータ オフセット 倍率 ガンマ HSB変換パラメータ RGB置換タイプ RGB置換タイプ 淡色化(0でグレー化、1で淡色化なし) 定義済みパーツ組み合わせ例(プリセット)の定義リスト、定義順に表示される。 定義済みパーツ組み合わせ例(プリセット)の定義 表示名、該当するlangがない場合は最初をデフォルトとする。 背景色 アフィン変換用パラメータ、4または6つの要素からなるマトリックス カテゴリごとのパーツ定義、パーツが空の場合は該当カテゴリは選択なし パーツ 色定義(オプション) カラーグループ カラーグループの同期を行う RGB変換 HSB変換 RGB置換 レイヤー識別子 パーツ名 カテゴリの識別子 定義済みパーツ組み合わせ例(プリセット)の識別子 デフォルトのプリセットを示す識別子 CharacterManaJ/src/main/resources/schema/0.8/partsset.xsd0000644000175000017500000000077013615720000023446 0ustar paulliupaulliu CharacterManaJ/src/main/resources/schema/character_inc.xsd0000644000175000017500000003037613615720000024066 0ustar paulliupaulliu 空文字を許可しないトークンの定義 RGB変換パラメータ オフセット 倍率 ガンマ HSB変換パラメータ RGB置換タイプ RGB置換タイプ 淡色化(0でグレー化、1で淡色化なし) 定義済みパーツ組み合わせ例(プリセット)の定義リスト、定義順に表示される。 定義済みパーツ組み合わせ例(プリセット)の定義 表示名、該当するlangがない場合は最初をデフォルトとする。 背景色 アフィン変換用パラメータ、4または6つの要素からなるマトリックス カテゴリごとのパーツ定義、パーツが空の場合は該当カテゴリは選択なし パーツ 色定義(オプション) カラーグループ カラーグループの同期を行う RGB変換 HSB変換 RGB置換 レイヤー識別子 パーツ名 カテゴリの識別子 定義済みパーツ組み合わせ例(プリセット)の識別子 デフォルトのプリセットを示す識別子 キャラクターデータディレクトリのURI CharacterManaJ/src/main/resources/schema/partsset.xsd0000644000175000017500000000102313615720000023131 0ustar paulliupaulliu CharacterManaJ/src/main/resources/schema/customlayerorder.xsd0000644000175000017500000000274413615720000024702 0ustar paulliupaulliu CharacterManaJ/src/main/resources/schema/xml.xsd0000644000175000017500000002120413615720000022067 0ustar paulliupaulliu

About the XML namespace

This schema document describes the XML namespace, in a form suitable for import by other schema documents.

See http://www.w3.org/XML/1998/namespace.html and http://www.w3.org/TR/REC-xml for information about this namespace.

Note that local names in this namespace are intended to be defined only by the World Wide Web Consortium or its subgroups. The names currently defined in this namespace are listed below. They should not be used with conflicting semantics by any Working Group, specification, or document instance.

See further below in this document for more information about how to refer to this schema document from your own XSD schema documents and about the namespace-versioning policy governing this schema document.

lang (as an attribute name)

denotes an attribute whose value is a language code for the natural language of the content of any element; its value is inherited. This name is reserved by virtue of its definition in the XML specification.

Notes

Attempting to install the relevant ISO 2- and 3-letter codes as the enumerated possible values is probably never going to be a realistic possibility.

See BCP 47 at http://www.rfc-editor.org/rfc/bcp/bcp47.txt and the IANA language subtag registry at http://www.iana.org/assignments/language-subtag-registry for further information.

The union allows for the 'un-declaration' of xml:lang with the empty string.

space (as an attribute name)

denotes an attribute whose value is a keyword indicating what whitespace processing discipline is intended for the content of the element; its value is inherited. This name is reserved by virtue of its definition in the XML specification.

base (as an attribute name)

denotes an attribute whose value provides a URI to be used as the base for interpreting any relative URIs in the scope of the element on which it appears; its value is inherited. This name is reserved by virtue of its definition in the XML Base specification.

See http://www.w3.org/TR/xmlbase/ for information about this attribute.

id (as an attribute name)

denotes an attribute whose value should be interpreted as if declared to be of type ID. This name is reserved by virtue of its definition in the xml:id specification.

See http://www.w3.org/TR/xml-id/ for information about this attribute.

Father (in any context at all)

denotes Jon Bosak, the chair of the original XML Working Group. This name is reserved by the following decision of the W3C XML Plenary and XML Coordination groups:

In appreciation for his vision, leadership and dedication the W3C XML Plenary on this 10th day of February, 2000, reserves for Jon Bosak in perpetuity the XML name "xml:Father".

About this schema document

This schema defines attributes and an attribute group suitable for use by schemas wishing to allow xml:base, xml:lang, xml:space or xml:id attributes on elements they define.

To enable this, such a schema must import this schema for the XML namespace, e.g. as follows:

          <schema . . .>
           . . .
           <import namespace="http://www.w3.org/XML/1998/namespace"
                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
     

or

           <import namespace="http://www.w3.org/XML/1998/namespace"
                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
     

Subsequently, qualified reference to any of the attributes or the group defined below will have the desired effect, e.g.

          <type . . .>
           . . .
           <attributeGroup ref="xml:specialAttrs"/>
     

will define a type which will schema-validate an instance element with any of those attributes.

Versioning policy for this schema document

In keeping with the XML Schema WG's standard versioning policy, this schema document will persist at http://www.w3.org/2009/01/xml.xsd.

At the date of issue it can also be found at http://www.w3.org/2001/xml.xsd.

The schema document at that URI may however change in the future, in order to remain compatible with the latest version of XML Schema itself, or with the XML namespace itself. In other words, if the XML Schema or XML namespaces change, the version of this document at http://www.w3.org/2001/xml.xsd will change accordingly; the version at http://www.w3.org/2009/01/xml.xsd will not change.

Previous dated (and unchanging) versions of this schema document are at:

CharacterManaJ/src/main/resources/schema/parts-definition.xsd0000644000175000017500000001151013615720000024545 0ustar paulliupaulliu 空文字を許可しないトークンの定義 パーツリストの定義 パーツの作者 パーツのダウンロードURL パーツの定義 パーツのローカライズ名 パーツ名(ファイルのネームボディ) カテゴリ、省略時は任意のカテゴリ パーツのバージョン 最終更新日時(代表) キャラクターデータディレクトリのURI CharacterManaJ/src/main/resources/schema/parts-definition.xml0000644000175000017500000000227013615720000024552 0ustar paulliupaulliu 緋龍華 麒麟 K.Hmix 1st Edition http://khmix.sakura.ne.jp/ http://khmix.sakura.ne.jp/file/character_02.08.zip Intake インテーク 緋龍華 麒麟 K.Hmix 1st Edition http://khmix.sakura.ne.jp/ Wave ウェーブ CharacterManaJ/src/main/resources/appConfig.xml0000644000175000017500000000173113615720000021742 0ustar paulliupaulliu 7000 #ffc800 false #ff0000 #ffff 0.8 true #808080 #ffffff #ffffff #ff0000 csWindows31J 4096 4096 true true #ffff00 CharacterManaJ/src/main/resources/_HOW_TO_LOCALIZE.txt0000644000175000017500000000136613615720000022537 0ustar paulliupaulliuローカライズしたい言語ごとにリソースファイルをコピーしてください。 Please copy the resource file for each language you want to localize. ファイル名の末尾は言語コードを指定する必要があります。 The end of the file name must be specified language code. http://www.loc.gov/standards/iso639-2/php/English_list.php 例 (Example) mainframe_ja.xml : 日本語 Japanese mainframe_en.xml : 英語 English mainframe_pt_BR : ブラジル Brazil mainframe_zh_TW : 台湾 Chinese mainframe.xml : デフォルト default * 作成したリソースファイルを募集しております。 We are looking for a resource that you created. https://osdn.net/forum/forum.php?forum_id=23932 CharacterManaJ/src/main/resources/template/0000755000175000017500000000000013615720000021123 5ustar paulliupaulliuCharacterManaJ/src/main/resources/template/characterDataTemplates.xml0000644000175000017500000000050313615720000026250 0ustar paulliupaulliu character3.xml,character2.xml CharacterNantokaki Ver2.x Compatible CharacterNantokaki Ver3 Compatible CharacterManaJ/src/main/resources/template/character3-customlayerorders.xml0000644000175000017500000000334413615720000027454 0ustar paulliupaulliu CharacterManaJ/src/main/resources/template/character3.xml0000644000175000017500000004005413615720000023667 0ustar paulliupaulliu Default(v3) デフォルト(v3) Unknown 名無し 无名 無名 300 400 true 6 Hair - Front 髪型 - 手前 发型 - 这边 髮型 - 這邊 Variable 可変色 可变颜色 可變顏色 13 hair_front HSB Accessory アクセサリ 饰品 飾品 14 hair_front_accessory HSB 6 Hair - Back 髪型 - 後ろ 发型 - 背后 髮型 - 背後 Variable 可変色 可变颜色 可變顏色 2 hair_back HSB Accessory アクセサリ 饰品 飾品 3 hair_back_accessory HSB 6 Head Head 10 head HSB 6 Expression 表情 脸色 臉色 Face 表情 脸色 臉色 15 face_front HSB Accessory アクセサリ 饰品 飾品 12 face_back HSB Hair 髪色 头发颜色 頭髮顏色 16 face_haircolor HSB 6 Eyes Eye 17 eye HSB Variable 可変色 可变颜色 可變顏色 18 eye_color HSB 6 Body 身体 身体 身體 Variable 可変色 可变颜色 可變顏色 7 body_front_color HSB Clothes ドレス 衣服 衣服 6 body_front HSB Skin 皮肤 皮膚 4 body_back HSB Accessory アクセサリ 饰品 飾品 8 body_front_accessory HSB 10 Accessory アクセサリー 饰品 飾品 Top 最前面 最跟前 最跟前 19 accessory_front HSB Middle(R) 中間(R) 中间(右) 中間(右) 11 accessory_middle_front HSB Middle(L) 中間(L) 中间(左) 中間(左) 9 accessory_middle_back HSB Underwear アンダーウェア 内衣 內衣 5 accessory_underwear HSB Back 最背面 最后面 最後面 1 accessory_back HSB Hair 头发 頭髮 Eye 瞳孔 瞳孔 Skin 肤色 膚色 Dress 衣服 衣服 Originator (K.Hmix 1st Edition) (キャラクターなんとか機本家) K.Hmix 1st Edition http://khmix.sakura.ne.jp/ The storage of an additional parts パーツ保管庫 パーツ保管庫 (零件的保管库) パーツ保管庫 (零件的保管庫) https://charactermanaj.osdn.jp/upload.html *Default PartsSet (K.Hmix 1st Edition) *キャラクターなんとか機のパーツデータをダウンロードする (K.Hmix 1st Edition) http://charactermanaj.osdn.jp/ext/default_characterset_v3.zip CharacterManaJ/src/main/resources/template/characterDataTemplates_ja.xml0000644000175000017500000000053013615720000026722 0ustar paulliupaulliu character3.xml,character2.xml キャラクターなんとか機 ver2.x 互換 キャラクターなんとか機 ver3 互換 CharacterManaJ/src/main/resources/template/characterDataTemplates_zh.xml0000644000175000017500000000053013615720000026751 0ustar paulliupaulliu character3.xml,character2.xml キャラクターなんとか機 ver2.x 互換 キャラクターなんとか機 ver3 互換 CharacterManaJ/src/main/resources/template/character2.xml0000644000175000017500000003416713615720000023676 0ustar paulliupaulliu Default デフォルト Unknown 名無し 无名 無名 300 400 true 6 Hair - Front 髪型 - 手前 发型 - 这边 髮型 - 這邊 Variable 可変色 可变颜色 可變顏色 12 hair_front HSB Accessory アクセサリ 饰品 飾品 13 hair_front_accessory HSB 6 Hair - Back 髪型 - 後ろ 发型 - 背后 髮型 - 背後 Variable 可変色 可变颜色 可變顏色 2 hair_back HSB Accessory アクセサリ 饰品 飾品 3 hair_back_accessory HSB 6 Head Head 9 head HSB 6 Expression 表情 脸色 臉色 Face 表情 脸色 臉色 14 face_front HSB Accessory アクセサリ 饰品 飾品 11 face_back HSB 6 Eyes Eye 15 eye HSB 6 Body 身体 身体 身體 Variable 可変色 可变颜色 可變顏色 7 body_front_color HSB Clothes ドレス 衣服 衣服 6 body_front HSB Skin 皮肤 皮膚 4 body_back HSB 10 Accessory アクセサリー 饰品 飾品 Top 最前面 最跟前 最跟前 16 accessory_front HSB Middle(R) 中間(R) 中间(右) 中間(右) 10 accessory_middle_front HSB Middle(L) 中間(L) 中间(左) 中間(左) 8 accessory_middle_back HSB Underwear アンダーウェア 内衣 內衣 5 accessory_underwear HSB Back 最背面 最后面 最後面 1 accessory_back HSB Hair 头发 頭髮 Eye 瞳孔 瞳孔 Skin 肤色 膚色 Dress 衣服 衣服 Originator (K.Hmix 1st Edition) (キャラクターなんとか機本家) K.Hmix 1st Edition http://khmix.sakura.ne.jp/ The storage of an additional parts パーツ保管庫 パーツ保管庫 (零件的保管库) パーツ保管庫 (零件的保管庫) https://charactermanaj.osdn.jp/upload.html CharacterManaJ/src/main/resources/languages/0000755000175000017500000000000013615720000021256 5ustar paulliupaulliuCharacterManaJ/src/main/resources/languages/colordialog_ja.xml0000644000175000017500000000332613615720000024754 0ustar paulliupaulliu 色 - 適用 リセット すべてのアイテム RGB置換 置換パターン 明るさ コントラスト RGB 透過 オフセット 倍率 ガンマ補正 HSB + コントラスト HSY + コントラスト 色相 彩度 明度 色相 彩度 輝度 色グループ 色グループ 連動する 詳細設定 設定値をクリップボードにコピーする(シフトキーで詳細設定を含む) 設定値をクリップボードから貼り付ける 不正なパラメータ CharacterManaJ/src/main/resources/languages/ukagakaConvertDialog_ja.xml0000644000175000017500000000104013615720000026532 0ustar paulliupaulliu 伺か用PNG/PNAの出力 キャンセル 保存 プレビュー 自動 手動 既存のファイルに上書きする 透過とする色の選択 CharacterManaJ/src/main/resources/languages/exportwizdialog_zh.xml0000644000175000017500000000537613615720000025747 0ustar paulliupaulliu 作者 描述 人物设定 导出部分(使用不同设置) 导出 完成 确认 你确定要取消么? 文件已存在,是否覆盖文件? 文件不存在。 下一步 上一步 完成 取消 导出内容 描述 例图 部件 默认/预设 例图 部件列表 选择 分类 名称 最后更新 作者 版本 50 100 150 100 80 50 全部选择 全部取消 按名称排序 按更新时间排序 选择 取消 默认/预设列表 选择 名称 默认 缺失的部件 50 50 150 300 全部选择 全部取消 按名称排序 导出使用的部件 CharacterManaJ/src/main/resources/languages/layerordercustomizedialog_ja.xml0000644000175000017500000000260013615720000027743 0ustar paulliupaulliu レイヤー順序のカスタマイズ レイヤーパターン パターン名 保存 削除 レイヤー順序 追加 削除 閉じる カテゴリ レイヤー 既定の順序 実際の順序 レイヤーの追加 OK キャンセル 破棄の確認 変更を破棄してもよろしいですか? 変更を保存しますか? 変更の確認 パターンを削除してもよろしいですか? パターン削除の確認 CharacterManaJ/src/main/resources/languages/colorbox_zh.xml0000644000175000017500000000033513615720000024331 0ustar paulliupaulliu 选择颜色 选择颜色 CharacterManaJ/src/main/resources/languages/partsrandomchooserdialog_ja.xml0000644000175000017500000000063713615720000027555 0ustar paulliupaulliu パーツのランダム選択 閉じる ランダム 除外 追加 ランダム一括 Back CharacterManaJ/src/main/resources/languages/profileditdialog_ja.xml0000644000175000017500000001263613615720000026003 0ustar paulliupaulliu プロファイルの編集 プロファイルの作成 更新 作成 キャンセル フォルダを表示 構造が変更されます。よろしいですか? 構造が変更されます。リビジョンを更新しますか? ID: キャラクターセットごとにユニークな名前をつけます。英数字および記号のみ。
たとえば、キャラクターなんとか機デフォルトパーツセット(Ver2)であれば「Default」とします。]]>
カテゴリやレイヤーの構造が変るたびに違う識別子を割り当てます。英数字および記号のみ。 Rev: 設定ファイル: 名前: キャンバスの幅: キャンバスの高さ: 作者: 説明: 追加 削除 このカラーグループは使用中のため削除できません。 上へ 下へ 追加 削除 このカテゴリは使用中のため削除できません。 上へ 下へ 追加 削除 整列 上へ 下へ フォルダを監視し、パーツ画像の変更を検知できるようにする。 カスタムレイヤーを有効にする 基本 カラーグループ カテゴリ レイヤー 確認 編集をキャンセルしますか? カラーグループ名 カテゴリ名 複数選択可 省略可 表示行数 使用しているレイヤー 100 50 50 50 300 レイヤー名 カテゴリ カラーグループ 重ね順 カラーモデル フォルダ 100 100 100 50 100 300 プリセット デフォルト プリセット パーツセット名 使用パーツ 50 50 150 200 お勧めリンク 説明 URL 200 200 追加 削除 上へ 下へ
CharacterManaJ/src/main/resources/languages/profileditdialog.xml0000644000175000017500000001151613615720000025325 0ustar paulliupaulliu Profile(Edit) Profile(New) Update Create Cancel Show Directory Are you sure you want to change the structure? Structure is changed. Is revision updated? ID: The unique identifier to a character is specified here.
For example, "default" is the standard profile of the “character-nantoka-ki”.]]>
revision Rev: Config: Name: Picture Width: Picture Height: Author: Description: Add Remove Can not remove the color group because it is being used. Up Down Add Remove Can not remove the category because it is being used. Up Down Add Remove Sort Up Down Watch directories Enable the Custom layer pattern Basic Color Group Categories Layers Confirm Are you sure you want to cancel? Color Group Name Category Name Multiple selectable Optional Display Row Count Used Layers 100 50 50 50 300 Layer Name Category Color Group Order Color Model Directory 100 100 100 50 100 300 Presets Default Preset Name Parts 50 50 150 200 Recommendations description URL 200 200 Add Remove Up Down
CharacterManaJ/src/main/resources/languages/imageSaveHelper_zh.xml0000644000175000017500000000227113615720000025544 0ustar paulliupaulliu 确认 输出设置 JPEG 质量 范围 比例 模式 图片类型 类型 需要指定背景色 无修正 双次线性 双三次插值 正常 不透明 灰度 Alpha通道 CharacterManaJ/src/main/resources/languages/previewpanel_zh.xml0000644000175000017500000000155313615720000025206 0ustar paulliupaulliu 载入中... 保存图像 复制到剪贴板 更改背景 显示信息 增加到预设 翻转 固定 检查透明通道 检查亮度 缩放 缩放 30 CharacterManaJ/src/main/resources/languages/exportwizdialog_ja.xml0000644000175000017500000000611513615720000025710 0ustar paulliupaulliu 作者 説明 キャラクター定義 部分的なエクスポート(差分セット) エクスポート 完了しました。 確認 キャンセルしますか? ファイルが既に存在します。上書きしてもよろしいですか? ファイルがありません。 次へ 戻る 実行 キャンセル エクスポートするコンテンツ コメント サンプルイメージ パーツ プリセット/お気に入り サンプルイメージ パーツの選択 選択 カテゴリ パーツ名 更新日時 作者 バージョン 50 100 150 100 80 50 すべて選択 すべて選択解除 名前順で整列 日付順で整列 チェックする チェックを外す プリセット/お気に入りの選択 選択 既定 名前 不足するパーツ 50 50 150 300 すべて選択 すべて選択解除 整列 使用パーツをエクスポート対象にする CharacterManaJ/src/main/resources/languages/informationdialog_zh.xml0000644000175000017500000000221513615720000026206 0ustar paulliupaulliu 信息 关闭 部件 分类 图层 默認排序 實際排序 大小 颜色模式 图片路径 动作 80 80 80 50 50 50 150 80 复制文件路径 编辑 打开 CharacterManaJ/src/main/resources/languages/layerordercustomizedialog_zh.xml0000644000175000017500000000227113615720000027776 0ustar paulliupaulliu 定制图层 圖案 名称 保存 移除 配置 增加 移除 关闭 分类 图层 默認排序 實際排序 添加圖图层 OK 取消 确认 你确定要取消么? 你想保存更改嗎? 确认 您確定要刪除該圖案嗎? 确认 CharacterManaJ/src/main/resources/languages/importwizdialog_zh.xml0000644000175000017500000000774313615720000025740 0ustar paulliupaulliu 导入 导入(新的配置) 完成 下一步 上一部 完成 取消 浏览 导入压缩文件(zip,cmj) 从文件夹导入 通过指定URL导入 找不到文件 找不到文件夹 检查... 在下载... 不支持的格式 找不到档案 你确认要取消么? 确认 导入内容 默认/预设 部件 例图 压缩信息 ID 版本 名称 作者 说明 例图 将说明添加到此配置 没有内容 这不是一个标准CMJ的压缩包,但可能包含了一些图片. 配置的ID不匹配。 id="{0}" 配置的版本不匹配。 rev="{0}" 导入部件 全部选择 全部取消 按名称排序 按更新时间排序 选择 取消 选择 名称 分类 图像大小 透明 最后更新 当前配置的最后更新 作者 当前配置的作者 版本 当前配置的版本 50 100 80 50 50 80 80 80 80 50 50 导入默认/预设 导入使用的部件 选择 名称 缺失的部件 50 100 200 完成 CharacterManaJ/src/main/resources/languages/informationdialog.xml0000644000175000017500000000241613615720000025510 0ustar paulliupaulliu Information Close Parts Category Layer Default Order Actual Order No. Size Color Mode Image Action 80 80 80 50 50 50 50 50 150 80 Copy the file path Edit Open CharacterManaJ/src/main/resources/languages/profileselectordialog_zh.xml0000644000175000017500000000521713615720000027067 0ustar paulliupaulliu 500 500 选择配置 新建 复制配置 编辑 预览 移除 浏览.. 导入 导出 创建缓存 选择一个人物数据缓存 300 描述 配置 例图 300 打开 取消 在此填充 无图片 剪切 复制 你确认要删除 {0}? 完全删除 确认 无法删除此配置 (已打开) (无编辑) 选择配置 向选择的配置导入 导入新的配置 名称 ID 版本 大小 描述 作者 路径 200 100 100 80 300 150 300 缓存名称 空白 确认 CharacterManaJ/src/main/resources/languages/partsmanagedialog.xml0000644000175000017500000000343013615720000025462 0ustar paulliupaulliu Manage Parts's author Parts List Sort by name Sort by Author Sort by Last-modified Up to date Batch input for the download URL. Batch input for the version. Author Information Author: Homepage: Open Cancel Update Is the batch application done though two or more authors have been selected? Confirm Input the Download URL Input the version number May I annul the edit? Parts ID Last-Modified Category Localized name Author Version Download URL 100 80 80 100 80 50 150 CharacterManaJ/src/main/resources/languages/selectCharatersDirDialog_zh.xml0000644000175000017500000000133113615720000027372 0ustar paulliupaulliu 550 CharacterManaJ 选择工作路径 工作路径: 确认 取消 浏览 删除最近的列表 删除缓存 将当前设置为默认并不再询问 你确定要删除所有缓存么? 确认 CharacterManaJ/src/main/resources/languages/imageselectpanel_ja.xml0000644000175000017500000000073213615720000025756 0ustar paulliupaulliu 縮小する 拡大する 色ダイアログを開く 上へ 下へ 並び替え 全て選択解除する CharacterManaJ/src/main/resources/languages/managefavoritesdialog_ja.xml0000644000175000017500000000110313615720000027000 0ustar paulliupaulliu お気に入りの管理 選択する 削除する 名前を変更する 閉じる お気に入りの名前を入力する 選択したお気に入りを消去してもよろしいですか? 確認 CharacterManaJ/src/main/resources/languages/colorbox.xml0000644000175000017500000000034513615720000023631 0ustar paulliupaulliu Select the color Select the color CharacterManaJ/src/main/resources/languages/exportwizdialog.xml0000644000175000017500000000542013615720000025234 0ustar paulliupaulliu Author Description Character definition Export a subset Export Complete Confirm Are you sure you want to cancel? File already exists. Are you sure you want to overwrite? File not exists. Next Previous Finish Cancel Include contents Comments Sample picture Parts Preset/Favorites Sample picture Parts List Selected Category Parts name Last-Modified Author Version 50 100 150 100 80 50 Select All Deselect All Sort Sort By Timestamp Check Uncheck Preset/Favorite List Selected Name Default Missing parts 50 50 150 300 Select All Deselect All Sort Export used parts CharacterManaJ/src/main/resources/languages/imageSaveHelper.xml0000644000175000017500000000226313615720000025044 0ustar paulliupaulliu Confirm Output options JPEG Quality Zoom Factor Mode Picture type Type A background color is forced. NONE BILINER BICUBIC Normal Opaque Gray Alpha CharacterManaJ/src/main/resources/languages/colordialog_zh.xml0000644000175000017500000000301413615720000024775 0ustar paulliupaulliu 颜色 应用 重置 应用到所有项目 RGB替换 替换 亮度 对比度 RGB R G B Alpha通道 偏移量 倍率 Gamma修正 HSB + 对比度 HSY + 对比度 色相 饱和度 亮度 色相 饱和度 辉度 颜色组 同步 高级设置 复制到剪贴板 從剪貼板粘貼 参数无效 CharacterManaJ/src/main/resources/languages/partsmanagedialog_ja.xml0000644000175000017500000000357613615720000026147 0ustar paulliupaulliu パーツの管理 パーツリスト 名前順に整列 作者順に整列 更新日順に整列 最新にする ダウンロードURLを一括指定 バージョンを一括指定 作者情報 作者名: ホームページ: 開く キャンセル 更新 複数の作者が選択されていますが、一括適用を行いますか? 確認 ダウンロードURLの入力 バージョン番号の入力 編集を破棄してもよろしいですか? パーツID 更新日 カテゴリ パーツ名 作者 バージョン ダウンロードURL 100 80 80 100 80 50 150 CharacterManaJ/src/main/resources/languages/appconfigdialog_ja.xml0000644000175000017500000001513713615720000025607 0ustar paulliupaulliu appConfig.xml アプリケーションの設定 更新 キャンセル 起動時にデータフォルダを選択する. プロパティ名 設定値 300 200 確認 編集を破棄しますか? エラー 不備があります。修正してください。 設定を変更した場合、アプリケーションの再起動が必要です。 設定 言語のカスタマイズ 確認 設定のリセット 設定をリセットしてもよろしいですか? 01;JPEG圧縮時のクオリティ(1が最大、0.1が最小) 02;クリップボードの透過サポートを有効にする.(Windows/OSX) 03;ZIPファイルに格納されているファイル名のエンコーディング(csWindows31Jが標準) 04;パーツ名からカラーグループを判定するパターン(正規表現)(@がカラーグループ名の場所になります.) 05;自動的にパーツ選択パネルを縮小する. 06;PSD出力時にRLE圧縮を使用する. 10;プレビューの初期表示の最大幅 11;プレビューの初期表示の最大高さ 12;レンダリングヒントを使用する. 13;拡大時にバイキュービック方式による最適化を使用する. 14;表示最適化を適用するズームの閾値(通常モード)(0は常に無効) 15;表示最適化を適用するズームの閾値(チェックモード)(0は常に無効) 16;ズーム倍率の選択候補(カンマ区切り) 17;ズームパネルを表示する. 18;ズームパネルをアクティブにする範囲(0で常に無効) 19;ホイールによるスクロールの単位 1A;壁紙をオフスクリーンで描画する. 1B;オフスクリーンの既定サイズ 1C;ウィンドウサイズ、位置、ズームの復元を行う. 20;カラー変更時、自動的にプレビューに適用する. 21;カラーダイアログで存在しないレイヤーをディセーブルにしない. 22;カラーダイアログの詳細設定を有効にする. 31;フォルダ監視の有効・無効 32;フォルダに書き込み権限がない場合は監視しない. 33;フォルダの監視間隔(mSec) 34;正常時でもログを終了時に消去しない. 35;起動時に古いログを消去するまでの日数。(0の場合は削除しない) 36;情報ダイアログのアクションを「開く」にする。(false時は「編集」) 37;ファイルの削除にゴミ箱を使う。(サポートされている場合) 50;アイテム選択行(フォーカス行)の背景色 51;パーツセットのエクスポート時の警告色 52;アイテム選択(チェック行)の背景色 53;サンプルピクチャの背景色 54;プレビューの背景色(デフォルト) 55;不正行の背景色 56;グリッド(罫線)の色 57;パーツ作者入力で複数作者選択時の入力ボックスの背景色 58;パーツ選択パネルのホバー色 59;デフォルトのフォントサイズ 5a;優先するフォントファミリー名(カンマ区切り) 90;JARファイル用バッファサイズ 91;ファイル転送用バッファサイズ 92;ダウンロード時に偽装するユーザーエージェント名 93;終了時にテンポラリディレクトり上にダウンロードしたファイルを消す A0;グリッドを描画する確認モードのビットマスク(0-3, 0は無効にする場合) A1;プレビュー画面のグリッドカラー(ARGB) A2;プレビュー画面のグリッドサイズ A3;チェックモード時の余白 A4;チェックモードの情報ツールチップの表示有無 B0;パーツのランダム選択の最大履歴数 CharacterManaJ/src/main/resources/languages/partsrandomchooserdialog.xml0000644000175000017500000000057313615720000027102 0ustar paulliupaulliu Random Chooser Close Random Ignore More Random All Back CharacterManaJ/src/main/resources/languages/imageselectpanel.xml0000644000175000017500000000065613615720000025311 0ustar paulliupaulliu Shrink Expand Open the color dialog Up Down Sort Deselect all CharacterManaJ/src/main/resources/languages/previewpanel_ja.xml0000644000175000017500000000241413615720000025154 0ustar paulliupaulliu Loading... 画像をファイルに保存する
(シフトキーで「伺か」用出力)]]>
画像をクリップボードにコピーする
(シフトキーでスクリーンイメージ取得)]]>
背景を設定する
(シフトキーで背景色のみ変更)]]>
情報を表示する お気に入りに追加する
(シフトキーで「お気に入りの管理」)]]>
画像を左右反転する 固定する 透過確認 輝度確認 表示倍率 表示倍率 30
CharacterManaJ/src/main/resources/languages/profileselectordialog.xml0000644000175000017500000000532113615720000026362 0ustar paulliupaulliu 500 500 Profile Selector New Copy Structure Edit Preview Remove Browse Import Export Create Template Choose a Character Data Template 300 Description Profiles Sample 300 Open Cancel dropHere No Picture Cut Paste ARE YOU SURE YOU WANT TO DELETE {0}? Delete completely. CONFIRM can not delete this profile. (Opened) (no edit) Select profile Import to the selected profile. Import to the new profile. Name ID Revision Size Description Author Location 200 100 100 80 300 150 300 Template Name Blank Confirm CharacterManaJ/src/main/resources/languages/ukagakaImageSaveHelper_ja.xml0000644000175000017500000000051513615720000027001 0ustar paulliupaulliu surface 確認 CharacterManaJ/src/main/resources/languages/importwizdialog.xml0000644000175000017500000001024613615720000025227 0ustar paulliupaulliu Import Import (new profile) Complete Next Previous Finish Cancel Browse Import archived File (zip, cmj) Import from Directory Import from URL File not found. Directory not found. checking... Downloading... Unsupported file type. File not found. Are you sure you want to cancel? Confirm Import contents Presets/Favorites Parts Sample picture Archive information ID Rev. Name Author Note Sample picture Append this description to the profile. No contents. This is not a formal archive, but may be containing some picture. Profile ID mismatch. id="{0}" Profile REV mismatch. rev="{0}" Profile Size Width: Height: Import parts select All deselect All Sort Sort by timestamp Check Uncheck Checked Parts name Category Image size Transparency Last-Modified Last-Modified on the current profile Author Author on the current profile Version Version on the current profile 50 100 80 50 50 80 80 80 80 50 50 Import favorites Import used parts Checked Name Missing parts 50 100 200 Complete CharacterManaJ/src/main/resources/languages/ukagakaConvertDialog_zh.xml0000644000175000017500000000076313615720000026574 0ustar paulliupaulliu 输出到伪春菜 (PNG/PNA) 取消 保存 预览 自动 手动 覆盖原始文件 选择透明颜色 CharacterManaJ/src/main/resources/languages/imageselectpanel_zh.xml0000644000175000017500000000072413615720000026006 0ustar paulliupaulliu 缩小 放大 打开颜色窗口 置于下一图层 置于上一图层 按名称排序 全部取消 CharacterManaJ/src/main/resources/languages/ukagakaImageSaveHelper_zh.xml0000644000175000017500000000043013615720000027024 0ustar paulliupaulliu surface 确认 CharacterManaJ/src/main/resources/languages/mainframe_ja.xml0000644000175000017500000000276613615720000024424 0ustar paulliupaulliu キャラクターなんとかJ 無題 http://charactermanaj.sourceforge.jp/help/0.9/ ヘルプドキュメントは以下のURLにあります。 確認 パーツ固有の色情報をリセットしますか? 背景色の選択 お気に入りの名前 色情報を含める 上書きする バグレポートは以下のURLにあります。 http://osdn.net/projects/charactermanaj/ticket/ フォーラムは以下のURLにあります。 http://osdn.net/projects/charactermanaj/forums/ デフォルトのキャラクターデータがあります。ダウンロードしますか? キャラクターデータのダウンロード ダウンロードしない。今後の確認も不要である。 CharacterManaJ/src/main/resources/languages/colorbox_ja.xml0000644000175000017500000000032713615720000024303 0ustar paulliupaulliu 色選択 色選択 CharacterManaJ/src/main/resources/languages/layerordercustomizedialog.xml0000644000175000017500000000240213615720000027271 0ustar paulliupaulliu Layer Order Customize Layer Order Patterns Pattern Name Save Remove Layer Order Add Delete Close Category Layer Default Order Customized Order Add Layer OK Cancel Discard? Are you sure you want to discard the changes? Do you want to save changes? Save? Are you sure you want to remove the pattern? Remove? CharacterManaJ/src/main/resources/languages/samplepicturepanel_ja.xml0000644000175000017500000000050613615720000026350 0ustar paulliupaulliu ダブルクリックでピクチャサイズをフィットする ダブルクリックでピクチャサイズをフルサイズにする CharacterManaJ/src/main/resources/languages/wallpaperdialog_ja.xml0000644000175000017500000000207013615720000025620 0ustar paulliupaulliu 背景の設定 壁紙(タイル)の選択 背景色の選択 壁紙画像の不透明率 市松模様 (小) 市松模様 (大) なし ファイルから選択 既定から選択 選択 OK キャンセル 画像ファイルを指定してください。 定義済み壁紙を選択してください。 指定したファイルが存在しないか、読み取りできません。 CharacterManaJ/src/main/resources/languages/importwizdialog_ja.xml0000644000175000017500000001152513615720000025702 0ustar paulliupaulliu インポート インポート (新規プロファイル作成) 次へ 戻る 実行 キャンセル Complete 参照... アーカイブファイル(zip,cmj)からインポート フォルダからインポート URLからダウンロードしてインポート ファイル: ファイルがありません。 フォルダがありません。 確認中... ダウンロード中... サポートされていない形式です ファイルがみつかりません キャンセルしますか? 確認 インポートするコンテンツ プリセット/お気に入り パーツ サンプルピクチャ アーカイブ情報 ID REV 名前 作者 説明 サンプルピクチャ キャラクター定義の説明に上記の説明を追記する。 インポートできる内容がありません。 CharacterManaJのエクスポート形式と異なりますが、使用できる可能性のあるパーツがあります。 プロファイルIDが一致しません。 id="{0}" プロファイルIDは一致しますが、リビジョンが一致しません。 rev="{0}" プロファイルのサイズ 幅: 高さ: インポートするパーツ 全て選択 全て解除 名前順で整列 日付順で整列 チェックする チェックを外す 選択 パーツ名 カテゴリ名 イメージサイズ 透過 最終更新日 現在の最終更新日 作者 現在の作者 バージョン 現在のバージョン 50 100 80 50 50 80 80 80 80 50 50 インポートするお気に入り 使用しているパーツのインポート 選択 プリセット名 不足するパーツ 50 100 200 インポートが完了しました。 CharacterManaJ/src/main/resources/languages/selectCharatersDirDialog.xml0000644000175000017500000000133413615720000026674 0ustar paulliupaulliu 550 CharacterManaJ Select a workspace Workspace: OK Cancel Browse Clear recent list Clear cache Use this as the default and do not ask again. Are you sure you want to delete all cache? CONFIRM CharacterManaJ/src/main/resources/languages/managefavoritesdialog.xml0000644000175000017500000000100113615720000026323 0ustar paulliupaulliu Manage favorites Select Remove Rename Close Input the Favorite's name ARE YOU SURE YOU WANT TO REMOVE THE SELECTED FAVORITES? CONFIRM CharacterManaJ/src/main/resources/languages/ukagakaConvertDialog.xml0000644000175000017500000000077013615720000026071 0ustar paulliupaulliu Export for Ukagaka (PNG/PNA) Cancel Save Preview Auto Manual Overwrite original file Transparent color key CharacterManaJ/src/main/resources/languages/mainframe.xml0000644000175000017500000000236513615720000023745 0ustar paulliupaulliu CharacterManaJ no name http://charactermanaj.sourceforge.jp/help/0.9/ Help Document is here. CONFIRM AER YOU SURE? Choose the background-color Favorites Include colors Overwrite Report bugs http://osdn.net/projects/charactermanaj/ticket/ Forum http://osdn.net/projects/charactermanaj/forums/ You can download the default parts set. Do you want to download it? Default character data download I do not want to download, and do not ask me again. CharacterManaJ/src/main/resources/languages/imageSaveHelper_ja.xml0000644000175000017500000000247713615720000025525 0ustar paulliupaulliu 確認 出力オプション JPEG 品質 拡大・縮小 倍率 モード 画像タイプ タイプ 常に背景色を使用する 補正なし バイリニア バイキュービック 通常 透過なし グレースケール アルファチャネル CharacterManaJ/src/main/resources/languages/searchpartsdialog.xml0000644000175000017500000000131313615720000025475 0ustar paulliupaulliu Search Search Condition Parts Name: Author: Category: Clear Results Select Parts Category Author 100 50 80 CharacterManaJ/src/main/resources/languages/searchpartsdialog_ja.xml0000644000175000017500000000135413615720000026154 0ustar paulliupaulliu パーツの検索 検索条件 バーツ名: 作者: カテゴリ: クリア 該当結果 選択 パーツ名 カテゴリ 作者 100 50 80 CharacterManaJ/src/main/resources/languages/samplepicturepanel.xml0000644000175000017500000000037113615720000025676 0ustar paulliupaulliu Double-click to fit. Double-click to view the image full size. CharacterManaJ/src/main/resources/languages/searchpartsdialog_zh.xml0000644000175000017500000000130613615720000026200 0ustar paulliupaulliu 搜索 搜索条件 部件名称 作者: 分类: 清除 结果 S选择 部件 分类 作者 100 50 80 CharacterManaJ/src/main/resources/languages/mainframe_zh.xml0000644000175000017500000000226613615720000024446 0ustar paulliupaulliu CharacterManaJ 无标题 http://charactermanaj.sourceforge.jp/help/0.9/ 帮助文档(日) 确认 你确定么? 选择背景色 预设 包括颜色设定 覆盖 问题反馈(日) http://osdn.net/projects/charactermanaj/ticket/ 论坛(日) http://osdn.net/projects/charactermanaj/forums/ 有默认数据。你想下载吗? 下载默认数据 我不想下载,也不要再问我了 CharacterManaJ/src/main/resources/languages/selectCharatersDirDialog_ja.xml0000644000175000017500000000151613615720000027350 0ustar paulliupaulliu キャラクターなんとかJ キャラクターデータを格納するフォルダを選択してください。 フォルダ: 選択 キャンセル 参照 履歴のクリア キャッシュのクリア 次回から、このフォルダを使用する. 全てのキャッシュをクリアしてもよろしいですか? 確認 CharacterManaJ/src/main/resources/languages/profileditdialog_zh.xml0000644000175000017500000001143313615720000026024 0ustar paulliupaulliu 配置(编辑) 配置(新建) 更新 创建 取消 打开位置 你确认要改变图层构造么? 图层构造以已改变,是否立刻更新版本? ID: 当前使用的ID为保留字段
例如,"default"是“character-nantoka-ki”配置的标准ID!]]>
版本 版本: 设置: 名称: 图像宽度: 图像高度: 作者: 说明: 增加 移除 无法移除此颜色组,当前颜色组正在使用。 向上 向下 增加 移除 无法移除此分类,当前分类正在使用。 向上 向下 增加 移除 排序 向上 向下 显示目录 启用自定义图层模式 基本设置 颜色组 分类 图层 确认 你确定要取消么? 颜色组名称 分类名称 可多选 可选的 显示行数 使用的图层 100 50 50 50 300 图层名称 分类 颜色组 排序 颜色模式 目录 100 100 100 50 100 300 预设 默认 预设 名称 部件 50 50 150 200 相关链接 描述 URL 200 200 增加 移除 向上 向下
CharacterManaJ/src/main/resources/languages/wallpaperdialog.xml0000644000175000017500000000162013615720000025146 0ustar paulliupaulliu Background Wallpaper Background color Opacity Lattice (small) Lattice (large) None File Predefined Choose OK Cancel The file is required. The predefined image is required. A file does not exist, or it cannot read. CharacterManaJ/src/main/resources/languages/partsmanagedialog_zh.xml0000644000175000017500000000333713615720000026171 0ustar paulliupaulliu 部件管理 部件列表 按名称排序 按作者排序 按最后更新排序 更新 批量输入下载地址 批量输入版本 作者信息 作者: 主页: 打开 取消 更新 有多个不同的作者被选中,确定要批量输入同一数值么? 确认 输入下载地址 输入版本号 确定要放弃编辑么? 部件ID 最后更新 分类 名称 作者 版本 下载地址 100 80 80 100 80 50 150 CharacterManaJ/src/main/resources/languages/partsrandomchooserdialog_zh.xml0000644000175000017500000000060013615720000027572 0ustar paulliupaulliu 随机工具 关闭 随机 忽略 更多 全部随机 撤销 CharacterManaJ/src/main/resources/languages/previewpanel.xml0000644000175000017500000000160213615720000024500 0ustar paulliupaulliu Loading... Save the image Copy to the clipboard Change the background Show the information Add to Favorites Flip Pin Check Alpha Check Brightness Zoom factor Zoom factor 30 CharacterManaJ/src/main/resources/languages/colordialog.xml0000644000175000017500000000310713615720000024277 0ustar paulliupaulliu Color - Apply Reset All items Replace RGB Replace Bright Contrast RGB Red Green Blue Alpha Offset Factor Gamma HSB + Contrast HSY + Contrast Hue Saturation Brightness Hue Saturation Luminance Color Group Group Synchronized Advenced Settings Copy setting values.(If press the shift key, Copy the advanced setting.) Paste setting values. Bad parameters CharacterManaJ/src/main/resources/languages/samplepicturepanel_zh.xml0000644000175000017500000000034013615720000026373 0ustar paulliupaulliu 双击填充 双击查看完整图像 CharacterManaJ/src/main/resources/languages/informationdialog_ja.xml0000644000175000017500000000234713615720000026165 0ustar paulliupaulliu 情報 閉じる パーツ名 カテゴリ名 レイヤー 既定の順序 実際の順序 サイズ カラーモード 画像ファイル アクション 80 80 80 50 50 50 150 80 ファイルパスをクリップボードにコピー 編集 開く CharacterManaJ/src/main/resources/languages/ukagakaImageSaveHelper.xml0000644000175000017500000000045313615720000026330 0ustar paulliupaulliu surface Confirm CharacterManaJ/src/main/resources/languages/profileselectordialog_ja.xml0000644000175000017500000000620013615720000027031 0ustar paulliupaulliu 500 500 プロファイルの選択 新規 構造の複製 修正 照会 削除 場所を開く インポート エクスポート テンプレートの作成 キャラクターデータのテンプレートの選択 300 プロファイルの説明 プロファイル一覧 サンプルピクチャ 300 プロファイルを開く キャンセル ここにピクチャをドロップします ピクチャはありません カット ペースト 「{0}」を削除してもよろしいですか? 完全に削除する 削除の確認 このプロファイルは削除できません (使用中) (編集不可) プロファイルの選択 選択されたプロファイルへのインポートを行う。 新規にプロファイルを作成してインポートを行う。 名前 ID リビジョン サイズ 説明 作者 場所 200 100 100 80 300 150 300 テンプレートの名前 確認 CharacterManaJ/src/main/resources/languages/wallpaperdialog_zh.xml0000644000175000017500000000155613615720000025657 0ustar paulliupaulliu 背景 壁纸 背景色 背景图不透明率 网格 (小) 网格 (大) 文件 预设 选择 确认 取消 需要图像文件 需要预设图像 文件不存在或无法读取 CharacterManaJ/src/main/resources/languages/managefavoritesdialog_zh.xml0000644000175000017500000000075213615720000027040 0ustar paulliupaulliu 预设管理 选择 删除 重命名 关闭 输入预设的名称 你确定要删除选择的预设么? 确认 CharacterManaJ/src/main/resources/languages/appconfigdialog_zh.xml0000644000175000017500000001147113615720000025633 0ustar paulliupaulliu appConfig.xml 程序设置 应用 取消 启动时询问工作路径 300 200 确认 你确定要关闭么? 错误 请填充未填项 应用新设置需要重新启动程序 设置 自定义语言 确认 将设置重置为默认值 您确定要重置设置吗? 01;JPEG压缩质量(1最好,0.1最差) 02;复制到剪贴板时使用透明图像(Windows/OSX) 03;ZIP解码(默认为csWindows31J) 04;以部件名称判定图案的颜色组(使用正则表达式)('@'后面为色组名) 05;自动缩放项目栏 06;输出PSD时使用RLE压缩 10;预览图最大宽度 11;预览图最大高度 12;使用提示渲染 13;使用二次立方 14;最佳渲染时缩放倍率的阈值(通常模式)(0为不缩放) 15;最佳渲染时缩放倍率的阈值(检查模式)(0为不缩放) 16;预定义缩放 17;显示缩放栏 18;缩放栏位置 19;滚轮调整单元 1A;背景全屏显示 1B;默认全屏大小 1C;恢復窗口大小/位置 20;自动刷新颜色 21;在颜色菜单显示不存在的图层 22;启用高级颜色设置 31;开启文件夹监视 32;文件只读时关闭文件夹监视 33;监视间隔时间(ms) 34;退出时不清除log 35;启动时清除多少天以上的log(0表示不清除) 36;信息栏动作(true为打开;false为编辑) 37;使用回收站(如果支持) 50;选择时的背景色 51;警告时的背景色 52;已检查项目的背景色 53;例图的背景色 54;预览的背景色 55;Invalid Cell的背景色 56;网格颜色 57;作者冲突的背景色 58;鼠标悬停于部件选择面板时文字颜色 59;默认字体大小 5a;字体系列 90;Jar文件缓存 91;文件缓存 92;模拟用户代理名称以供下载 93;终止后,在临时目录中删除下载的文件 A0;预览时显示网格 A1;网格颜色(ARGB) A2;网格大小 A3;保留空白空间(检查模式) A4;开启运行状态控件(检查模式) B0;随机模式记忆的历史数量 CharacterManaJ/src/main/resources/languages/appconfigdialog.xml0000644000175000017500000001211513615720000025126 0ustar paulliupaulliu appConfig.xml Application Configurations Apply Cancel Ask the data directory during startup. Key Value 300 200 Confirm Are you sure want to close? Error Please correct incompleteness. Change to property needs an application restart. Settings Custom Localization Confirm Reset settings to default. Are you sure you want to reset the setting? 01;Compression Quality 02;Use the transparency image in Clipboard.(Windows/OSX) 03;ZIP File Encoding 04;The judgment pattern of a color group.('@' is color group name) 05;Auto shrink category panels 06;Use RLE compression when outputting PSD 10;Preview Max-Width 11;Preview Max-Height 12;Use rendering hints 13;Use Bicubic 14;Threshold of zoom factor of the rendering optimization.(normal) 15;Threshold of zoom factor of the rendering optimization.(check) 16;Predefined zoom factors 17;Enable zoom panel 18;Area where zoom is activated. 19;The unit of scrolling by a wheel 1A;Draw Wallpaper by offscreen. 1B;Offscreen default size. 1C;Restore window size and location, zoom 20;Auto Color Refresh 21;The layer not existing is not disabled in the color dialog. 22;Enable the advanced color setting. 31;Enable Watch Directory 32;Disable Watch Directory If Not Writable 33;Directory Watch Interval (mSec) 34;No Remove Log 35;a number in days until purge log 36;Information Dialog Open Mode 37;Use the recycle bin if it is supported. 50;Selected Item's Background Color 51;Export Preset's Warnings Foreground Color 52;Checked Item Background Color 53;Sample Picture Background Color 54;Preview Background Color 55;Invalid Cell's Background Color 56;Grid Color 57;Author Conflict Background Color 58;Parts Select Panel Hovering Color 59;Default Font Size 5a;Default Font Family Name 90;Jar File Buffer 91;File Buffer 92;Impersonation of user agent name for download 93;Delete the downloaded file in temporary directory upon termination A0;Draw grid on preview A1;Grid color (ARGB) A2;Grid size A3;Unfilled space (check-mode only) A4;Enable CheckInfo tooltip (check-mode only) B0;Limit Of The Random Parts History CharacterManaJ/src/main/attachment/0000755000175000017500000000000013615720000017426 5ustar paulliupaulliuCharacterManaJ/src/main/attachment/README_mac.txt0000644000175000017500000001211513615720000021744 0ustar paulliupaulliuキャラクターなんとかJ Ver0.999 2018/12/07 ホームページ http://osdn.jp/projects/charactermanaj/ == ver0.998からの変更点 == ・JRE同梱版のJavaランタイムは AdoptOpenJDK 8u192-b12 です。 === 機能的変更点 === ・ 高画素密度画面(HiDPI)環境でもレイアウトが潰れずに表示できるようにしました。   (WindowsのJava8では画像は等倍で表示されます。Java11では画像を含めアプリケーション全体がスケールされます。)   (Macの場合はJavaの既定の動作により、Java8, Java11ともにRetinaの場合はアプリケーション全体が2倍にスケールされます。) ・お気に入りに登録した場合、アクセサリ等同一のカテゴリに複数のアイテムがある場合の順序がでたらめになっていた問題を修正しました。 ・ レイヤーを保持したままPSD形式での画像の保存に対応しました。(レイヤーを保持したまま画像をzip形式で保存する機能も作成しています。) ・カスタムレイヤーパターンによる、レイヤー順序の変更に対応しました。   ・ これは既定のレイヤー順序を一時的に変更するもので、既存の構造に割り込めるように小数点での指定が可能になっています。   ・ デフォルトのキャラクターデータ構造(v3)の場合、自動的に「目を前髪で隠す」設定が追加されます。 ・ カテゴリの設定で、単一選択カテゴリでもパーツの選択を解除できる構造を設定できるようにしました。 ・アプリケーション設定で「ウィンドウサイズ、位置、ズームの復元」をtrueにすると、起動時に前回終了時のズーム状態やウィンドウサイズを復元します。 ・情報ウィンドウをモードレスにし、現在の表示中の画像の重ね順を把握できるように修正しました。 ・ カラーダイアログの設定値をクリップボードのコピーとペーストができるようにしました。 ・ カラーダイアログはよく使う項目だけに表示切り替えできるようにしました。 ・ログ、ワーキング状態などのファイルを%APPDATA%フォルダから%LOCALAPPDATA%フォルダに変更しました。   ・ 既存のログファイル等は自動的には削除しないので不要であれば消してください。   ・ 初回起動時に前回の作業状態が無くなっている状態になるのでご注意ください。(キャラクターデータ等はそのままです。) ・ アプリケーション設定ダイアログの設定UIを直感的に入力しやすい形式に改めました。 === 内部的変更点 === ・Java11でも実行できるように修正しています。Java6以降で実行できます。(Java6互換でビルドしているためJava5では実行できなくなりました。)   ・Windowsの場合、exe形式をサポートするLaunch4jもJava9以降に対応している3系に変更しています。 ・内部的にシリアライズ形式の読み書きは全廃しました。(ver0.997の時点でシリアライズで保存しておらず、ver0.999でソースからも消しました。) ・古いワーキング状態で対象となるデータセットが存在しなくなっている場合はゴミとみなして削除するようにしました。 ・フォント除外判定をCodePointで行うように修正しました。 ・Mac版では ~/Library/CharacterManaJ/vm_optionsファイルで起動時のJavaパラメータを指定できるようにしました。(また、その際には$APP_ROOT変数展開ができます。) ・Windowsのexe版では、Javaの位置が不明の場合は初回起動時にJavaの場所を問い合わせるダイアログを表示するようにしました。 ・ Windowsのexe版の著作権情報等を更新しました。 [ファイルの説明] * キャラクターなんとかJ.app  アプリケーション本体です。好きなフォルダにコピーしてください。 JRE同梱版の場合は、Javaがアプリケーションに含まれています。Javaのインストール作業は不要です。  ※ バンドルファイルを展開すると Contents/Plugins/JRE というフォルダがあり、ここにあるJavaを利用します。  異なるバージョンのJavaを使いたい場合は、このフォルダを差し替えてください。  (また、このJREフォルダを消すと、JREを同梱していないものと同じになります。) Ver0.999より、~/Library/CharacterManaJ/jvm_options というテキストファイルに起動オプションを指定できようになりました。 たとえば、-Xmx256mと指定した場合は、最大で256MBのメモリを使用します。 (このファイルがない場合はデフォルト値を用います。) 不明な点があればプロジェクトのWikiを参照してください。 https://sourceforge.jp/projects/charactermanaj/wiki/FrontPage 以上です。 CharacterManaJ/src/main/attachment/.gitattributes0000644000175000017500000000022713615720000022322 0ustar paulliupaulliu*.ini text eol=crlf *.txt text eol=crlf *_mac.txt text eol=lf *.sh text eol=lf Info.plist text eol=lf InfoPlist.strings text eol=lf CharacterManaJ/src/main/attachment/charactermanaj.l4j.ini0000644000175000017500000000014413615720000023561 0ustar paulliupaulliu-Xms64m -Xmx128m "-DcharactersDir=%EXEDIR%\characters" "-DappConfigFile=%EXEDIR%\appConfig.xml" CharacterManaJ/src/main/attachment/README_ja.txt0000644000175000017500000001307313615720000021602 0ustar paulliupaulliu[[リリースノート (キャラクターなんとかJ - 0.999)]] 2019/1/28 ホームページ http://osdn.jp/projects/charactermanaj/ == ver0.998からの変更点 == ・JRE同梱版のJavaランタイムは AdoptOpenJDK 8u192-b12 です。 === 機能的変更点 === ・ 高画素密度画面(HiDPI)環境でもレイアウトが潰れずに表示できるようにしました。   (WindowsのJava8では画像は等倍で表示されます。Java11では画像を含めアプリケーション全体がスケールされます。)   (Macの場合はJavaの既定の動作により、Java8, Java11ともにRetinaの場合はアプリケーション全体が2倍にスケールされます。) ・お気に入りに登録した場合、アクセサリ等同一のカテゴリに複数のアイテムがある場合の順序がでたらめになっていた問題を修正しました。 ・ レイヤーを保持したままPSD形式での画像の保存に対応しました。(レイヤーを保持したまま画像をzip形式で保存する機能も作成しています。) ・カスタムレイヤーパターンによる、レイヤー順序の変更に対応しました。   ・ これは既定のレイヤー順序を一時的に変更するもので、既存の構造に割り込めるように小数点での指定が可能になっています。   ・ デフォルトのキャラクターデータ構造(v3)の場合、自動的に「目を前髪で隠す」設定が追加されます。 ・ カテゴリの設定で、単一選択カテゴリでもパーツの選択を解除できる構造を設定できるようにしました。 ・アプリケーション設定で「ウィンドウサイズ、位置、ズームの復元」をtrueにすると、起動時に前回終了時のズーム状態やウィンドウサイズを復元します。 ・情報ウィンドウをモードレスにし、現在の表示中の画像の重ね順を把握できるように修正しました。 ・ カラーダイアログの設定値をクリップボードのコピーとペーストができるようにしました。 ・ カラーダイアログはよく使う項目だけに表示切り替えできるようにしました。 ・ログ、ワーキング状態などのファイルを%APPDATA%フォルダから%LOCALAPPDATA%フォルダに変更しました。   ・ 既存のログファイル等は自動的には削除しないので不要であれば消してください。   ・ 初回起動時に前回の作業状態が無くなっている状態になるのでご注意ください。(キャラクターデータ等はそのままです。) ・ アプリケーション設定ダイアログの設定UIを直感的に入力しやすい形式に改めました。 === 内部的変更点 === ・Java11でも実行できるように修正しています。Java6以降で実行できます。(Java6互換でビルドしているためJava5では実行できなくなりました。)   ・Windowsの場合、exe形式をサポートするLaunch4jもJava9以降に対応している3系に変更しています。 ・内部的にシリアライズ形式の読み書きは全廃しました。(ver0.997の時点でシリアライズで保存しておらず、ver0.999でソースからも消しました。) ・古いワーキング状態で対象となるデータセットが存在しなくなっている場合はゴミとみなして削除するようにしました。 ・フォント除外判定をCodePointで行うように修正しました。 ・Mac版では ~/Library/CharacterManaJ/vm_optionsファイルで起動時のJavaパラメータを指定できるようにしました。(また、その際には$APP_ROOT変数展開ができます。) ・Windowsのexe版では、Javaの位置が不明の場合は初回起動時にJavaの場所を問い合わせるダイアログを表示するようにしました。 ・ Windowsのexe版の著作権情報等を更新しました。 [インストール方法] charactermamaj.exeを好きなフォルダに置いて実行するだけです。 特にインストール作業は必要ありません。 ※ 本アプリケーションには画像データは含まれていません。 パーツセットを配布しているサイト等より、画像データを入手してください。 (詳しくはWikiに本家のキャラクターセットの利用方法について記載しております。) charactermanaj.l4j.iniファイルは起動時の設定を調整する場合に、exeと同じフォルダに置いて使います。 たとえば、-Xmx256mと指定した場合は、最大で256MBのメモリを使用します。 (このファイルがない場合はデフォルト値を用います。) [動作環境について] 以下の環境での想定を行っております。 Windows 7(32/64) Windows 10(32/64) 可能であればJava8での利用をおすすめします。 Java11でも利用可能です。 Java6でコンパイルしているため、Java6のデスクトップをサポートする環境であれば基本的には動作すると思います。 [使用・作成されるファイル等について] 使用・作成されるフォルダ等についてはWikiをご参照ください。 https://osdn.net/projects/charactermanaj/wiki/FrontPage [ソースコードについて] ver0.995からソースコードはGitで管理しています。 https://sourceforge.jp/projects/charactermanaj/scm/git/CharacterManaJ/ CharacterManaJ/src/main/attachment/bundle/0000755000175000017500000000000013615720000020677 5ustar paulliupaulliuCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/0000755000175000017500000000000013615720000024261 5ustar paulliupaulliuCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/0000755000175000017500000000000013615720000026056 5ustar paulliupaulliuCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Characters/0000755000175000017500000000000013615720000030135 5ustar paulliupaulliuCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Characters/appConfig.xml0000644000175000017500000000015713615720000032570 0ustar paulliupaulliu CharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Resources/0000755000175000017500000000000013615720000030030 5ustar paulliupaulliuCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Resources/en.lproj/0000755000175000017500000000000013615720000031557 5ustar paulliupaulliu././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Resources/en.lproj/InfoPlist.stringsCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Resources/en.lproj/InfoPlist.s0000755000175000017500000000000013615720000033643 0ustar paulliupaulliu././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Resources/en.lproj/Localizable.stringsCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Resources/en.lproj/Localizable0000644000175000017500000000020713615720000033722 0ustar paulliupaulliu"JRELoadError" = "Unable to load Java Runtime Environment."; "JavaDirectoryNotFound" = "Unable to enumerate Java directory contents."; CharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Resources/ja.lproj/0000755000175000017500000000000013615720000031547 5ustar paulliupaulliu././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Resources/ja.lproj/InfoPlist.stringsCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Resources/ja.lproj/InfoPlist.s0000755000175000017500000000015313615720000033644 0ustar paulliupaulliuCFBundleName = "キャラクターなんとかJ"; CFBundleDisplayName = "キャラクターなんとかJ"; ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Resources/ja.lproj/Localizable.stringsCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/Resources/ja.lproj/Localizable0000644000175000017500000000020313615720000033706 0ustar paulliupaulliu"JRELoadError" = "Javaの起動に失敗しました。"; "JavaDirectoryNotFound" = "Javaランタイムが見つかりません"; CharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/MacOS/0000755000175000017500000000000013615720000027020 5ustar paulliupaulliuCharacterManaJ/src/main/attachment/bundle/CharacterManaJ.app/Contents/MacOS/JavaLaunch0000755000175000017500000022316013615720000030766 0ustar paulliupaulliu H__PAGEZERO__TEXTpp __text__TEXT2__stubs__TEXTNbN__stub_helper__TEXTP^P__const__TEXTpRpR__gcc_except_tab__TEXTRR__objc_methname__TEXTPY|PY__cstring__TEXT^p^__objc_classname__TEXTLջa$  * ` ,/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation 8/usr/lib/libobjc.A.dylib 8/usr/lib/libSystem.B.dylib Xj -/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit h /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation&P)؊LjHHH}HuHHHH9uH2UHAWAVAUATSHH=^L5\L=6TLAH5\HAIH=i^H5\AH3IH5[HULAH=A^H5[HU11AH2HH5[LHAH2H5[LLAH5[LAH5[LeLAH2H5[HEHAHz2IH=]LAH5{[HLAHH5k[LAH5f[LA׉tH=SUE111fH=f]H5?[AH2IH52[HLAH1IH1L1H=U1L0L1HIH1L1H}1H}1L{1LH[A\A]A^A_]1UHAWAVAUATSH8HQHHEH=\H5ZH(RH5ZHH H=\H5]ZH1IH5QZLQH0HH=VT1H/H5-ZH^THPHQH0IH5 ZLQH0IH5YH:TLqQH0HLH5YHSQHc0IHF0L>0L60H= T1L`L(/HTHPH5kYPH 0HH= T1H.H/HH=O[H5HYPH/HHSHHH5YPH/HH5 YHHsPt7HSHH5XTPHd/IHC/HSHH5XPH-/IH/HH5XLOtLLH=aZH5bXOH.IH5RXLOH.IH?SLH5 XOH.HH~.Lv.Ln.HHu Hk.LIH=S1LL-H(Mu|H5WHSH SL4SL OH.IH=YH5WH+SE1LNH-HH5}WHNH-L-H5eWLNH-IHRLH5WNH-HLu-H=R1Hn,Hh-H5WHhH?NH-H=XH5V#NH3-HLH5zVNH-IHRLH5`VMH,HL,HXHLLxWH)C0)C )C)HX,H5UVHPAHHHeMHH#HH@HHHVHHVHE1HHHH9t H+HN,HH5FUL%LAH+ILHHQLAH+HL+HHHAH+IHI9ZAHH54UHHPPLHHLLxH0+LH5TLH*+HHPHH5vTKH+HpH*)H*IH=*VH5THP1HpKH*HLH5THKH*IH*Lz*H=P1Ls)HH5SLLKL0H=UH5TE1LKH.*IH=tUH5SJH*HH5SLHJLH)IH)WH)C0)C )C)L)H5oSHAHHHJHHLHH@HHHRHHRHHHMHQHA@HHHDHHpH9HUz@HEH@(HHEHEHH HMHh@DHEE1HEAHM;EsVMtQHHMH]AE1IHEJ<0Hwt EAM9rHEJD0HhJEd$L9ewHUHPH;p5HuȋFHHxDuD9Hx[A\A]A^A_]UHH5$D]%:UHAWAVSPIIHH5 D}:L9uH5QCHLH[A^A_]%[:H5CHLLH[A^A_]%;:UHH5B]%):UHH5C]%:UHH5C]%:UHHtH5C]%9H5CH]%9UHFtH50F ]H*HFHGHFH*H FHHFH*HEHHEH~*HEHHEHo*HEHHEHe*HEHHEHW*HEHHEHM*HEHHEHI*HEHHEHJ*HEHHEHQ*HEHHEHY*HEHHEEUHAWAVATSIII1Mt2Mt-LWHLHHtLHLB1H[A\A^A_]UHAWAVAUATSPIIIMteMt`LHLtIHL(L9tH'HHu1LKHH#K IHA8xO4H}HIuLuUHH5>]%35UH]?UHH5>]%5UHH5>]%5UHSPH5>H4H5>HHH[]UHH5>]%4UHSPH5s>H4H5s>HHH[]UHH5J>]%4UHAWAVATSHIM7I9t.H5#>L%d4HAIH5>LL[A\A^A_][A\A^A_]UHyBtH5A ]H~&HAH/HAHv&HAHHAH3H%BHd&HAHHyAH3HBHR&HeAH" H_AH`3HAH7&HKAHM HEAH>3HAH &H1AHx H+AH$3HAH &HAH HAH3H{AH%H@H H@H2HYAH%H@H H@Hf2H7AH%H@H H@H2HAH%H@H H@H22H@@"UHSPHH5o?^ H9tHHu1H[]UHD?H]UH9?H]UHAWAVSPI%?AEtDI?IHuDH[A^A_]UHAWAVATSIIILHLLH>IL9tH56;Hm1L[A\A^A_]UHAWAVATSIIILnHLLH>IL9tH5:H1L[A\A^A_]UHAWAVATSIIILHLLHY>IL9tH5:H0L[A\A^A_]UHAWAVATSIIIL HLLH>L9tH5C:H[A\A^A_]%r0[A\A^A_]UHAWAVAUATSPIIIILp HLLLH=L9tH59HH[A\A]A^A_]%0H[A\A]A^A_]UHAWAVAUATSH8HIIH=/=H57L=/AH57HAHEH59H]HAH59HEHAIMLeLuH7HEL59L%9H'9HEL HH}HuLAH}LHHAL9t HHuAH}LAIMuLuLeL}L=8LLH]H<HLH8[A\A]A^A_]%.UHAWAVAUATSHIHa.HHEHI$IT$ II!A}yMmHs HH!ȃ8yH@I|$Hu AEHXHhHPID$ HEID$HEID$HEI$IL$HMHEHHKHpHxHCHEHCHEHC HEH57-IǾ(L (H IuLLH IML`HLhI!LXI!L IM |$ L k HI#v >MyHvL`IE0HM@DNEeDXMHh8A1ALމH|tL ADA9DBHuAE)DDAEA!1HhM8HT8HtD DXD9rdHEID$ HEID$HEID$HEHMIL$I$HEHC HEHCHEHCHpHxHKHE1E)A}xH HNHN8IMHNIM8HN8HF0AEDȉFEMDNLLLHPHLL)LHLL^LHSAEtH55HH L L H2+HH;EuLHĈ[A\A]A^A_] UHAWAVAUATSPIIHi IC u'AF u H9HLLH[A\A]A^A_]HL(ILLIHLLL HK I M IN I L$ H[A\A]A^A_]UHSPHHt)H H tC uHH[]%81C8K"%@"%B"%D"%F"%H"%J"%L"%N"%P"%R"%T"%V"%X"%Z"%\"%^"%`"%b"%d"%f"%h"%j"%l"%n"%p"%r"%t"%v"%x"%z"%|"%~"%"%"%"%"%"%"%"%"%"%"L AS% hh6hhh h:hZhxhhhhxhnhkdhZhPhFhT T T/TT6@Tm@ @ R RRR68<KH[ fH}]#2T ^kb bb+Z#5BE PBg~PP P(P0.AZ6`r 6~B#,r \ ` `H` $ `> Y (` ! +X = F 0 F@ Z =F *  7N  N ( #NY !4 (  &  bD6 3> $  0  0 $ 0- [  A - 6k}allocinitpipesetLaunchPath:arrayWithObjects:setArguments:setStandardOutput:launchfileHandleForReadingreadDataToEndOfFileinitWithData:encoding:waitUntilExitterminationStatuswhitespaceAndNewlineCharacterSetstringByTrimmingCharactersInSet:mainBundlebundlePathstringByAppendingPathComponent:infoDictionaryobjectForKey:defaultManagerfileExistsAtPath:processInfoenvironmentlocalizedStringForKey:value:table:exceptionWithName:reason:userInfo:raiselocalizedInfoDictionaryUTF8StringarraycountByEnumeratingWithState:objects:count:stringByReplacingOccurrencesOfString:withString:addObject:stringWithFormat:stringWithContentsOfFile:encoding:error:newlineCharacterSetcomponentsSeparatedByCharactersInSet:hasPrefix:lengthstringByAppendingString:addObjectsFromArray:setStandardError:timeIntervalSinceReferenceDatereasonsetAlertStyle:setMessageText:runModaldrainloadnewobjectAtIndexedSubscript:setObject:atIndexedSubscript:objectForKeyedSubscript:objectAtIndex:countreplaceObjectAtIndex:withObject:setObject:forKeyedSubscript:setObject:atIndex:setObject:forKey:removeObjectForKey:retainreleaseautoreleaseisKindOfClass:allocWithEntity:allocBatch:withEntity:count:fastIndexForKnownKey:indexForKey:addEntriesFromDictionary:selfinitializelengthOfBytesUsingEncoding:getCString:maxLength:encoding:initWithBytes:length:encoding:keyEnumeratornextObject/usr/libexec/java_home-vnot found system java_home (exit:%d)found system java_home=(%@)mainBundlePath=%@ContentsExecutableJarjarPath=%@Contents/Plugins/JREpluginJreDir=%@Home/bin/javaHomebin/javaJAVA_HOMEJreDir=%@JavaDirectoryNotFoundJRE Not Found ErrorLocalizableJavaLaunchErrorCFBundleDisplayNamedisplayAppName=%@JVMOptions$APP_ROOTCFBundleName/Library/%@/jvm_optionsuse define jvmoptions path=%@#option: %@-Xdock:name=-jarError Message=%@exitCode=%dJRELoadErrorJRE Load Error%@ %@error=%@NSAutoreleasePool_objc_autoreleasePoolPush_objc_autoreleasePoolPop__TEXT__LINKEDITNSArrayNSMutableArrayNSDictionaryNSOrderedSetNSMutableOrderedSetNSMutableDictionary_object_setInstanceVariable_object_setIvar_object_copy_objc_retain_objc_retainBlock_objc_release_objc_autorelease_objc_retainAutorelease_objc_autoreleaseReturnValue_objc_retainAutoreleaseReturnValue_objc_retainAutoreleasedReturnValue_objc_storeStrongNSUndoManagerProxy_targetClass@:#NSManagedObjectNSConstantStringNSStringNSKnownKeysMappingStrategy1NSKnownKeysDictionary1_objc_readClassPair_objc_allocateClassPair_object_getIndexedIvars_objc_getClass_objc_getMetaClass_objc_getRequiredClass_objc_lookUpClass_objc_getProtocol_class_getName_protocol_getName_objc_copyClassNamesForImagev@:Swift_Tt%cSs%zu%.*s%s__Tt%c%zu%.*s%zu%.*s%s_TtP_TtCSs%.*s.%.*s__ARCLite____ARCLiteIndexedSubscripting____ARCLiteKeyedSubscripting__v@:@24@0:8Q16v32@0:8@16Q24@24@0:8@16v32@0:8@16@2404 XaHpTLNTIR &<96a]7S ] I""""/$)$*++_,,.---@._/111XQzRx ,lAC MzPLRx-  4$?AC PzRx ,jAC G$L AC B$tnAC $_AC ,IAC M$AC $bAC F$DAC $lAC $AC $(AC $|AC , YAC G,<,AC J,lAC M$cAC $M AC $/AC $AC $<+AC B$dAC $+AC B$AC ,PAC G$ AC $49AC B$\AC $AC $=AC F,RAC G,RAC G,4RAC G,d#TAC G,GiAC J,)AC M,ypAC P,$AC J$T(TAC B$|TUAC F$UAC F$UAC F$UAC F$XAC F$D8AC $l%AC ,bAC K,GAC J$KAC F,|AC J$L AC ,tAC G$HPC B,?AC K$uAC $$ AC $L 0AC B,t AC J||||dR P*PQQQQQQQQ4P>PHPRP\PfPpPzPPPPQQR RPPRRPPPPPPPPQQQ$Q.Q8QBQLQVQ`QjQtQ~QQ(R2R`V`t`v` ` ``` ` ```{{|@(($Y>$9N9.>b$>$N.>$>$N.>$>$=N=.>G$>$RNR.G?$G?$RNR.?$?$RNR.?$?$TNT.?@h$?@$iNi.@$@$)N).A$A$pNp.AET$AE$N.E$E$TNT.4F$4F$UNU.F$F$UNU.F$F$UNU.3G0$3G$UNU.GT$G$XNX.Gx$G$N.G$G$N. H$ H$bNb.oH$oH$N.H6$H$KNK.>Io$>I$|N|.I$I$N.I$I$N.PJ $PJ$N.oK,$oK$N.&MD$&Mg$uNu.M$M$N.M$M$0N0.M0$M$NY l&Hw&w&w &{&h|+&|I&|&}&}&}1&}V&}z&}&}&}&~&~%&~P&~r& ~&(~&0~&8~&@~K&~&~&&&&3& S&(s&0&8&@&HdLI-2JF3t_3q35 6m66@66.6WG889c;% u;T ; ; ; ;!;]! <!<!m<!Y>Z">">">?#>#G?#?$?`$?@$@ %AL%AE%E%4F%F%F(&3GL&Gp&G&G& H&oH.'Hg'>I'I'I(PJ$(oK<(&M_(M(M(M(R(\(Ům $ME:"M6 їG\-f*4 I3qcEtݘo盥l7CΧE{\1[)cA ap \(]dԛzق10h<2+(>rˉJr Y:  qq com.apple.security.get-task-allow 0  JavaLaunch-555549441b2da6de44f53346a43ee74cb3d5bb61;@J)<|:Mm/)S敥(ay NeuxJRNj-7CyVL 9oEjز H礁-Vl_5J@g+ ˧U& Mw.XFo<"̷c>OJj٫RW+ti6aHnм@jEGH8 qJ$n2^/R|Cg1kؿ0c)az7j[#3SD|/"oF@Uz,=P}n{vi[8 `lwj5+݉A''ISTis d\pDmE6jYV8OeU8+nb':{#6v髿7-"u<EW$݈GJhygK=xr֚6c@aDFů,16}.{g=xvD[C3:~#\(1Ge)xF CFBundleDevelopmentRegion English CFBundleExecutable JavaLaunch CFBundleIconFile icon.icns CFBundleIdentifier charactermanaj.CharacterManaJ CFBundleDisplayName CharacterManaJ CFBundleInfoDictionaryVersion 6.0 CFBundleName CharacterManaJ CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion @BundleVersion@ CFBundleShortVersionString @BundleShortVersionString@ NSHumanReadableCopyright @NSHumanReadableCopyright@ NSHighResolutionCapable NSSupportsAutomaticGraphicsSwitching JVMOptions ExecutableJar Resources/CharacterManaJ.jar CharacterManaJ/src/main/attachment/README_ja_withJRE.txt0000644000175000017500000001406313615720000023176 0ustar paulliupaulliu[[リリースノート (キャラクターなんとかJ - 0.999 - JRE8同梱版)]] 2019/1/28 ホームページ http://osdn.jp/projects/charactermanaj/ == ver0.998からの変更点 == ・JRE同梱版のJavaランタイムは AdoptOpenJDK 8u192-b12 です。 === 機能的変更点 === ・ 高画素密度画面(HiDPI)環境でもレイアウトが潰れずに表示できるようにしました。   (WindowsのJava8では画像は等倍で表示されます。Java11では画像を含めアプリケーション全体がスケールされます。)   (Macの場合はJavaの既定の動作により、Java8, Java11ともにRetinaの場合はアプリケーション全体が2倍にスケールされます。) ・お気に入りに登録した場合、アクセサリ等同一のカテゴリに複数のアイテムがある場合の順序がでたらめになっていた問題を修正しました。 ・ レイヤーを保持したままPSD形式での画像の保存に対応しました。(レイヤーを保持したまま画像をzip形式で保存する機能も作成しています。) ・カスタムレイヤーパターンによる、レイヤー順序の変更に対応しました。   ・ これは既定のレイヤー順序を一時的に変更するもので、既存の構造に割り込めるように小数点での指定が可能になっています。   ・ デフォルトのキャラクターデータ構造(v3)の場合、自動的に「目を前髪で隠す」設定が追加されます。 ・ カテゴリの設定で、単一選択カテゴリでもパーツの選択を解除できる構造を設定できるようにしました。 ・アプリケーション設定で「ウィンドウサイズ、位置、ズームの復元」をtrueにすると、起動時に前回終了時のズーム状態やウィンドウサイズを復元します。 ・情報ウィンドウをモードレスにし、現在の表示中の画像の重ね順を把握できるように修正しました。 ・ カラーダイアログの設定値をクリップボードのコピーとペーストができるようにしました。 ・ カラーダイアログはよく使う項目だけに表示切り替えできるようにしました。 ・ログ、ワーキング状態などのファイルを%APPDATA%フォルダから%LOCALAPPDATA%フォルダに変更しました。   ・ 既存のログファイル等は自動的には削除しないので不要であれば消してください。   ・ 初回起動時に前回の作業状態が無くなっている状態になるのでご注意ください。(キャラクターデータ等はそのままです。) ・ アプリケーション設定ダイアログの設定UIを直感的に入力しやすい形式に改めました。 === 内部的変更点 === ・Java11でも実行できるように修正しています。Java6以降で実行できます。(Java6互換でビルドしているためJava5では実行できなくなりました。)   ・Windowsの場合、exe形式をサポートするLaunch4jもJava9以降に対応している3系に変更しています。 ・内部的にシリアライズ形式の読み書きは全廃しました。(ver0.997の時点でシリアライズで保存しておらず、ver0.999でソースからも消しました。) ・古いワーキング状態で対象となるデータセットが存在しなくなっている場合はゴミとみなして削除するようにしました。 ・フォント除外判定をCodePointで行うように修正しました。 ・Mac版では ~/Library/CharacterManaJ/vm_optionsファイルで起動時のJavaパラメータを指定できるようにしました。(また、その際には$APP_ROOT変数展開ができます。) ・Windowsのexe版では、Javaの位置が不明の場合は初回起動時にJavaの場所を問い合わせるダイアログを表示するようにしました。 ・ Windowsのexe版の著作権情報等を更新しました。 [インストール方法] CharacterManaJ_0.999_with_JREを好きなフォルダに展開して実行するだけです。 特にインストール作業は必要ありません。 AdoptOpenJDK 8u192-b12の32ビットJavaランタイムがアプリケーションに同梱されています。 https://adoptopenjdk.net/ マシンにJavaをインストールしていない場合でも、Javaのインストールなしに実行できます。 ※ 本アプリケーションには画像データは含まれていません。 パーツセットを配布しているサイト等より、画像データを入手してください。 (詳しくはWikiに本家のキャラクターセットの利用方法について記載しております。) charactermanaj.l4j.iniファイルは起動時の設定を調整する場合に、exeと同じフォルダに置いて使います。 たとえば、-Xmx256mと指定した場合は、最大で256MBのメモリを使用します。 (このファイルがない場合はデフォルト値を用います。) [動作環境について] 以下の環境での想定を行っております。 Windows 7(32/64) Windows 10(32/64) AdoptOpenJDK 8u192-b12のJavaランタイムがアプリケーションに同梱されています。 より新しいJavaを利用したい場合は、jreフォルダの中身を新しいjreのものとまるごと差し替えてください。 Java11での利用も可能です。 また、jreフォルダを削除するとシステムにインストールされているJavaを利用するようになります。(レジストリに登録されていれば) [使用・作成されるファイル等について] 使用・作成されるフォルダ等についてはWikiをご参照ください。 https://osdn.net/projects/charactermanaj/wiki/FrontPage [ソースコードについて] ver0.995からソースコードはGitで管理しています。 https://sourceforge.jp/projects/charactermanaj/scm/git/CharacterManaJ/CharacterManaJ/src/test/0000755000175000017500000000000013615720000015331 5ustar paulliupaulliuCharacterManaJ/src/test/java/0000755000175000017500000000000013615720000016252 5ustar paulliupaulliuCharacterManaJ/src/test/java/charactermanaj/0000755000175000017500000000000013615720000021215 5ustar paulliupaulliuCharacterManaJ/src/test/java/charactermanaj/model/0000755000175000017500000000000013615720000022315 5ustar paulliupaulliuCharacterManaJ/src/test/java/charactermanaj/model/AppConfigTest.java0000644000175000017500000000642113615720000025671 0ustar paulliupaulliupackage charactermanaj.model; import java.awt.Color; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.util.Properties; import charactermanaj.util.BeanPropertiesUtilities; import junit.framework.TestCase; public class AppConfigTest extends TestCase { public static class Bean1 { private int val1; private String val2; private Color val3; private boolean val4; public int getVal1() { return val1; } public void setVal1(int val1) { this.val1 = val1; } public String getVal2() { return val2; } public void setVal2(String val2) { this.val2 = val2; } public Color getVal3() { return val3; } public void setVal3(Color val3) { this.val3 = val3; } public boolean isVal4() { return val4; } public void setVal4(boolean val4) { this.val4 = val4; } @Override public String toString() { return val1 + ":" + val2 + ":" + val3; } public String getX() { throw new UnsupportedOperationException(); } public void setY() { throw new UnsupportedOperationException(); } } public void test1() throws Exception { Properties prop = new Properties(); assertTrue(prop.isEmpty()); URL[] urls = new URL[] { getClass().getResource("prop1.xml"), getClass().getResource("prop2.xml"), }; for (URL url : urls) { assertTrue(url != null); InputStream is = url.openStream(); try { prop.loadFromXML(is); } finally { is.close(); } } assertTrue(prop.size() == 2); System.out.println(prop); } public void test2() throws Exception { Bean1 o = new Bean1(); o.setVal1(123); o.setVal2("abc"); o.setVal3(Color.blue); o.setVal4(true); Properties props = new Properties(); BeanPropertiesUtilities.saveToProperties(o, props); System.out.println(props); assertTrue(props.size() == 4); assertTrue(props.getProperty("val1").equals("123")); assertTrue(props.getProperty("val2").equals("abc")); assertTrue(props.getProperty("val3").equals("#ff")); assertTrue(props.getProperty("val4").equals("true")); Bean1 o2 = new Bean1(); BeanPropertiesUtilities.loadFromProperties(o2, props); System.out.println(o2); assertTrue(o2.getVal1() == 123); assertTrue(o2.getVal2().equals("abc")); assertTrue(o2.getVal3().equals(Color.blue)); assertTrue(o2.isVal4()); } public void test3() throws Exception { Properties props1 = new Properties(); AppConfig appConfig = AppConfig.getInstance(); BeanPropertiesUtilities.saveToProperties(appConfig, props1); String val1 = props1.toString(); System.out.println(val1); BeanPropertiesUtilities.loadFromProperties(appConfig, props1); Properties props2 = new Properties(); BeanPropertiesUtilities.saveToProperties(appConfig, props2); String val2 = props1.toString(); System.out.println(val2); assertTrue(val1.equals(val2)); ByteArrayOutputStream bos = new ByteArrayOutputStream(); props2.storeToXML(bos, "appConfig.xml"); bos.close(); Reader rd = new InputStreamReader(new ByteArrayInputStream(bos.toByteArray()), "UTF-8"); int ch; while ((ch = rd.read()) != -1) { System.out.print((char) ch); } rd.close(); appConfig.saveConfig(); } } CharacterManaJ/src/test/java/charactermanaj/model/CharacterDataPersistentTest.java0000644000175000017500000000110513615720000030564 0ustar paulliupaulliupackage charactermanaj.model; import java.net.URI; import charactermanaj.model.io.CharacterDataXMLReader; public class CharacterDataPersistentTest { public static void main(String[] args) throws Exception { (new CharacterDataPersistentTest()).run(); } public void run() { try { URI uri = getClass().getResource("character.xml").toURI(); CharacterDataXMLReader persist = new CharacterDataXMLReader(); CharacterData cd = persist.loadCharacterDataFromXML(uri); System.out.println("result=" + cd); } catch (Exception ex) { ex.printStackTrace(); } } } CharacterManaJ/src/test/java/charactermanaj/model/CharacterDataFactoryTest.java0000644000175000017500000000255213615720000030042 0ustar paulliupaulliupackage charactermanaj.model; import java.io.File; import junit.framework.TestCase; public class CharacterDataFactoryTest extends TestCase { public void testLoad() throws Exception { // CharacterDataPersistent cf = CharacterDataPersistent.getInstance(); // File baseDir = new File("./characters/default/character.xml"); // CharacterData cd = cf.loadProfile(baseDir.toURL()); // PartsDataLoader loader = new PartsDataLoader(baseDir); // cd.appendCharacterDataChangeListsner(new CharacterDataChangeListener() { // public void characterDataChange(CharacterDataChangeEvent e) { // System.out.println(e.getPartsIdentifier().getPartsCategory() // .getLocalizedCategoryName() // + ":" // + e.getPartsIdentifier().getLocalizedPartsName() // + ":" + e.getMode()); // } // }); // cd.loadPartsData(loader); // System.out.println("*2nd"); // cd.loadPartsData(loader); } public void testSave() throws Exception { // CharacterDataPersistent cf = CharacterDataPersistent.getInstance(); // CharacterData cd = cf.load(new File("./characters/default2/character.xml").toURL()); // // cf.save(cd, new File("./characters/default2")); } public void test1() throws Exception { File d = new File("a").getAbsoluteFile(); System.out.println(d); File f = new File(d, "b/c/d").getCanonicalFile(); System.out.println(f.isAbsolute() + ":" + f); } } CharacterManaJ/src/test/resources/0000755000175000017500000000000013615720000017343 5ustar paulliupaulliuCharacterManaJ/src/test/resources/charactermanaj/0000755000175000017500000000000013615720000022306 5ustar paulliupaulliuCharacterManaJ/src/test/resources/charactermanaj/model/0000755000175000017500000000000013615720000023406 5ustar paulliupaulliuCharacterManaJ/src/test/resources/charactermanaj/model/prop1.xml0000644000175000017500000000021413615720000025166 0ustar paulliupaulliu 1 CharacterManaJ/src/test/resources/charactermanaj/model/character.xml0000644000175000017500000217214513615720000026100 0ustar paulliupaulliu デフォルト 名無し デフォルトのキャラクター 300 400 true 6 髪型 - 手前 可変色 12 hair_front HSY アクセサリ 13 hair_front_accessory HSY 6 髪型 - 後ろ 可変色 2 hair_back HSY アクセサリ 3 hair_back_accessory HSY 6 9 head HSY 6 表情 アクセサリ 11 face_back HSY 表情 14 face_front HSY 6 15 eye HSY 可変色 16 eye_color HSY 6 身体 4 body_back HSY ドレス 6 body_front HSY 可変色 7 body_front_color HSY 10 アクセサリー 最背面 1 accessory_back HSY アンダーウェア 5 accessory_underwear HSY 中間(L) 8 accessory_middle_back HSY 中間(R) 10 accessory_middle_front HSY 最前面 17 accessory_front HSY (キャラクターなんとか機本家) K.Hmix 1st Edition http://khmix.sakura.ne.jp/x キャラクターなんとか機 追加パーツ保管庫 http://nantoka.main.jp/x お気に入り1b -1.0 0.0 0.0 1.0 300.0 0.0 sample1c 6aaa 6aaa 012反転 -1.0 0.0 0.0 1.0 300.0 0.0 010c sample1b 89 012色なし -1.0 0.0 0.0 1.0 300.0 0.0 010 001REV -1.0 0.0 0.0 1.0 300.0 0.0 お気に入り3 9 sample2b favorites--1 お気に入り2 sample1 0101b お気に入り1 sample1e お気に入り2 プリセットとかとか sample3 0101b プリセット2 プリセット1 お気に入り1 TESTREV 0101GREEN プリセット3 わりと好み 000 sample1d むらさき sample2 0101c sample1f sample1a 001 foxy 0101 default 0101c TESTREV2 -1.0 0.0 0.0 1.0 300.0 0.0 001REV2 -1.0 0.0 0.0 1.0 600.0 0.0 11 0101GREEN CharacterManaJ/src/test/resources/charactermanaj/model/prop2.xml0000644000175000017500000000021413615720000025167 0ustar paulliupaulliu 2 CharacterManaJ/icon.ico0000644000175000017500000001246613615720000015220 0ustar paulliupaulliu  & h( @ tyx}~+#+x[xgb{YyyVx[~dgk}]|<1;||@B@oOoס˖ϜשΜќw2,2Y^{|.*.p׼տӳM7MTX}|~,#,gv¬<6<9-9@4@?7?UOUu^B^dddAA[v}|}%%pRps0)0C0CfLfgNgQ" !!!$$"''%**)110&&' ..=13Iopos``@@U88Kci{~x~rxsyX\m?@R33D""-"-1?>BT>BUHK^QUh92>nhn|\|e,",K?K'"'ONh}{jNjmSm""00065?mr;:85.4F4E;,9ooo_brx'(7"6:C7;E24=#%'..0734</0BRRlxxSRlYXtUUqTSny~WWr`bWVqTUp{{WWrhk~~XXtXXszXXs\\{ooYYuegvvXYuVUoqvUUouuccZZvgjhhZZwVUn}fiUUoYYu[Zvgk\\z[\yWVpsy`aZZw}}ZZw]]ybfVVr\\zZZubgYYvkkCharacterManaJ/mvnw.cmd0000644000175000017500000001326213615720000015243 0ustar paulliupaulliu@REM ---------------------------------------------------------------------------- @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @REM distributed with this work for additional information @REM regarding copyright ownership. The ASF licenses this file @REM to you under the Apache License, Version 2.0 (the @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM @REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @REM KIND, either express or implied. See the License for the @REM specific language governing permissions and limitations @REM under the License. @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- @REM Maven2 Start Up Batch script @REM @REM Required ENV vars: @REM JAVA_HOME - location of a JDK home dir @REM @REM Optional ENV vars @REM M2_HOME - location of maven2's installed home dir @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven @REM e.g. to debug Maven itself, use @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files @REM ---------------------------------------------------------------------------- @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' @echo off @REM set title of command window title %0 @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% @REM set %HOME% to equivalent of $HOME if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") @REM Execute a user defined script before this one if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre @REM check for pre script, once with legacy .bat ending and once with .cmd ending if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" :skipRcPre @setlocal set ERROR_CODE=0 @REM To isolate internal variables from possible post scripts, we use another setlocal @setlocal @REM ==== START VALIDATION ==== if not "%JAVA_HOME%" == "" goto OkJHome echo. echo Error: JAVA_HOME not found in your environment. >&2 echo Please set the JAVA_HOME variable in your environment to match the >&2 echo location of your Java installation. >&2 echo. goto error :OkJHome if exist "%JAVA_HOME%\bin\java.exe" goto init echo. echo Error: JAVA_HOME is set to an invalid directory. >&2 echo JAVA_HOME = "%JAVA_HOME%" >&2 echo Please set the JAVA_HOME variable in your environment to match the >&2 echo location of your Java installation. >&2 echo. goto error @REM ==== END VALIDATION ==== :init @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". @REM Fallback to current working directory if not found. set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir set EXEC_DIR=%CD% set WDIR=%EXEC_DIR% :findBaseDir IF EXIST "%WDIR%"\.mvn goto baseDirFound cd .. IF "%WDIR%"=="%CD%" goto baseDirNotFound set WDIR=%CD% goto findBaseDir :baseDirFound set MAVEN_PROJECTBASEDIR=%WDIR% cd "%EXEC_DIR%" goto endDetectBaseDir :baseDirNotFound set MAVEN_PROJECTBASEDIR=%EXEC_DIR% cd "%EXEC_DIR%" :endDetectBaseDir IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig @setlocal EnableExtensions EnableDelayedExpansion for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% :endReadAdditionalConfig SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B ) @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central @REM This allows using the maven wrapper in projects that prohibit checking in binary data. if exist %WRAPPER_JAR% ( echo Found %WRAPPER_JAR% ) else ( echo Couldn't find %WRAPPER_JAR%, downloading it ... echo Downloading from: %DOWNLOAD_URL% powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" echo Finished downloading %WRAPPER_JAR% ) @REM End of extension %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* if ERRORLEVEL 1 goto error goto end :error set ERROR_CODE=1 :end @endlocal & set ERROR_CODE=%ERROR_CODE% if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost @REM check for post script, once with legacy .bat ending and once with .cmd ending if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" :skipRcPost @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' if "%MAVEN_BATCH_PAUSE%" == "on" pause if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% exit /B %ERROR_CODE% CharacterManaJ/mvnw0000755000175000017500000002163113615720000014503 0ustar paulliupaulliu#!/bin/sh # ---------------------------------------------------------------------------- # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- # Maven2 Start Up Batch script # # Required ENV vars: # ------------------ # JAVA_HOME - location of a JDK home dir # # Optional ENV vars # ----------------- # M2_HOME - location of maven2's installed home dir # MAVEN_OPTS - parameters passed to the Java VM when running Maven # e.g. to debug Maven itself, use # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 # MAVEN_SKIP_RC - flag to disable loading of mavenrc files # ---------------------------------------------------------------------------- if [ -z "$MAVEN_SKIP_RC" ] ; then if [ -f /etc/mavenrc ] ; then . /etc/mavenrc fi if [ -f "$HOME/.mavenrc" ] ; then . "$HOME/.mavenrc" fi fi # OS specific support. $var _must_ be set to either true or false. cygwin=false; darwin=false; mingw=false case "`uname`" in CYGWIN*) cygwin=true ;; MINGW*) mingw=true;; Darwin*) darwin=true # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home # See https://developer.apple.com/library/mac/qa/qa1170/_index.html if [ -z "$JAVA_HOME" ]; then if [ -x "/usr/libexec/java_home" ]; then export JAVA_HOME="`/usr/libexec/java_home`" else export JAVA_HOME="/Library/Java/Home" fi fi ;; esac if [ -z "$JAVA_HOME" ] ; then if [ -r /etc/gentoo-release ] ; then JAVA_HOME=`java-config --jre-home` fi fi if [ -z "$M2_HOME" ] ; then ## resolve links - $0 may be a link to maven's home PRG="$0" # need this for relative symlinks while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG="`dirname "$PRG"`/$link" fi done saveddir=`pwd` M2_HOME=`dirname "$PRG"`/.. # make it fully qualified M2_HOME=`cd "$M2_HOME" && pwd` cd "$saveddir" # echo Using m2 at $M2_HOME fi # For Cygwin, ensure paths are in UNIX format before anything is touched if $cygwin ; then [ -n "$M2_HOME" ] && M2_HOME=`cygpath --unix "$M2_HOME"` [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"` fi # For Mingw, ensure paths are in UNIX format before anything is touched if $mingw ; then [ -n "$M2_HOME" ] && M2_HOME="`(cd "$M2_HOME"; pwd)`" [ -n "$JAVA_HOME" ] && JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" # TODO classpath? fi if [ -z "$JAVA_HOME" ]; then javaExecutable="`which javac`" if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then # readlink(1) is not available as standard on Solaris 10. readLink=`which readlink` if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then if $darwin ; then javaHome="`dirname \"$javaExecutable\"`" javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" else javaExecutable="`readlink -f \"$javaExecutable\"`" fi javaHome="`dirname \"$javaExecutable\"`" javaHome=`expr "$javaHome" : '\(.*\)/bin'` JAVA_HOME="$javaHome" export JAVA_HOME fi fi fi if [ -z "$JAVACMD" ] ; then if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi else JAVACMD="`which java`" fi fi if [ ! -x "$JAVACMD" ] ; then echo "Error: JAVA_HOME is not defined correctly." >&2 echo " We cannot execute $JAVACMD" >&2 exit 1 fi if [ -z "$JAVA_HOME" ] ; then echo "Warning: JAVA_HOME environment variable is not set." fi CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher # traverses directory structure from process work directory to filesystem root # first directory with .mvn subdirectory is considered project base directory find_maven_basedir() { if [ -z "$1" ] then echo "Path not specified to find_maven_basedir" return 1 fi basedir="$1" wdir="$1" while [ "$wdir" != '/' ] ; do if [ -d "$wdir"/.mvn ] ; then basedir=$wdir break fi # workaround for JBEAP-8937 (on Solaris 10/Sparc) if [ -d "${wdir}" ]; then wdir=`cd "$wdir/.."; pwd` fi # end of workaround done echo "${basedir}" } # concatenates all lines of a file concat_lines() { if [ -f "$1" ]; then echo "$(tr -s '\n' ' ' < "$1")" fi } BASE_DIR=`find_maven_basedir "$(pwd)"` if [ -z "$BASE_DIR" ]; then exit 1; fi ########################################################################################## # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central # This allows using the maven wrapper in projects that prohibit checking in binary data. ########################################################################################## if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then if [ "$MVNW_VERBOSE" = true ]; then echo "Found .mvn/wrapper/maven-wrapper.jar" fi else if [ "$MVNW_VERBOSE" = true ]; then echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." fi jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" while IFS="=" read key value; do case "$key" in (wrapperUrl) jarUrl="$value"; break ;; esac done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" if [ "$MVNW_VERBOSE" = true ]; then echo "Downloading from: $jarUrl" fi wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" if command -v wget > /dev/null; then if [ "$MVNW_VERBOSE" = true ]; then echo "Found wget ... using wget" fi wget "$jarUrl" -O "$wrapperJarPath" elif command -v curl > /dev/null; then if [ "$MVNW_VERBOSE" = true ]; then echo "Found curl ... using curl" fi curl -o "$wrapperJarPath" "$jarUrl" else if [ "$MVNW_VERBOSE" = true ]; then echo "Falling back to using Java to download" fi javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" if [ -e "$javaClass" ]; then if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then if [ "$MVNW_VERBOSE" = true ]; then echo " - Compiling MavenWrapperDownloader.java ..." fi # Compiling the Java class ("$JAVA_HOME/bin/javac" "$javaClass") fi if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then # Running the downloader if [ "$MVNW_VERBOSE" = true ]; then echo " - Running MavenWrapperDownloader.java ..." fi ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") fi fi fi fi ########################################################################################## # End of extension ########################################################################################## export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} if [ "$MVNW_VERBOSE" = true ]; then echo $MAVEN_PROJECTBASEDIR fi MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" # For Cygwin, switch paths to Windows format before running java if $cygwin; then [ -n "$M2_HOME" ] && M2_HOME=`cygpath --path --windows "$M2_HOME"` [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --windows "$CLASSPATH"` [ -n "$MAVEN_PROJECTBASEDIR" ] && MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` fi WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain exec "$JAVACMD" \ $MAVEN_OPTS \ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" CharacterManaJ/.project0000644000175000017500000000140413615720000015231 0ustar paulliupaulliu CharacterManaJ org.eclipse.wst.common.project.facet.core.builder org.eclipse.jdt.core.javabuilder org.eclipse.m2e.core.maven2Builder org.eclipse.m2e.core.maven2Nature org.eclipse.jdt.core.javanature org.eclipse.wst.common.project.facet.core.nature CharacterManaJ/.classpath0000644000175000017500000000302413615720000015545 0ustar paulliupaulliu CharacterManaJ/.gitignore0000644000175000017500000000042713615720000015556 0ustar paulliupaulliu/characters /docs /lib /bin /target/ .DS_Store # Xcode (from gitignore.io) build/ *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata *.xccheckout *.moved-aside DerivedData *.hmap *.ipa *.xcuserstateCharacterManaJ/.settings/0000755000175000017500000000000013615720000015501 5ustar paulliupaulliuCharacterManaJ/.settings/org.eclipse.jst.jsp.core.prefs0000644000175000017500000000235513615720000023302 0ustar paulliupaulliu#Wed Jul 21 22:46:49 JST 2010 eclipse.preferences.version=1 validation.actions-missing-required-attribute=1 validation.actions-non-empty-inline-tag=2 validation.actions-unknown-attribute=2 validation.directive-include-fragment-file-not-found=1 validation.directive-include-fragment-file-not-specified=1 validation.directive-taglib-duplicate-prefixes-different-uris=1 validation.directive-taglib-duplicate-prefixes-same-uris=-1 validation.directive-taglib-missing-prefix=1 validation.directive-taglib-missing-uri-or-tagdir=1 validation.directive-taglib-unresolvable-uri-or-tagdir=1 validation.el-general-syntax=1 validation.el-lexical-failure=-1 validation.java-=-1 validation.java-local-variable-is-never-used=-1 validation.java-null-local-variable-reference=-1 validation.java-potential-null-local-variable-reference=-1 validation.java-unused-import=-1 validation.translation-tag-class-not-found=2 validation.translation-tei-class-not-found=2 validation.translation-tei-class-not-instantiated=2 validation.translation-tei-class-runtime-exception=2 validation.translation-tei-message=1 validation.translation-usebean-ambiguous-type-info=2 validation.translation-usebean-invalid-id=1 validation.translation-usebean-missing-type-info=1 CharacterManaJ/.settings/org.eclipse.jdt.core.prefs0000644000175000017500000001166013615720000022467 0ustar paulliupaulliueclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning org.eclipse.jdt.core.compiler.problem.deadCode=warning org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=ignore org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.6 CharacterManaJ/.settings/org.eclipse.core.runtime.prefs0000644000175000017500000000012313615720000023361 0ustar paulliupaulliu#Wed Jul 21 22:48:08 JST 2010 eclipse.preferences.version=1 line.separator=\r\n CharacterManaJ/.settings/org.eclipse.wst.common.project.facet.core.xml0000644000175000017500000000016613615720000026220 0ustar paulliupaulliu CharacterManaJ/.settings/org.eclipse.jst.j2ee.ejb.annotations.xdoclet.prefs0000644000175000017500000000016513615720000027135 0ustar paulliupaulliuXDOCLETBUILDERACTIVE=true XDOCLETHOME= XDOCLETUSEGLOBAL=true XDOCLETVERSION=1.2.1 eclipse.preferences.version=1 CharacterManaJ/.settings/de.loskutov.anyedit.AnyEditTools.prefs0000644000175000017500000000106713615720000025034 0ustar paulliupaulliuactiveContentFilterList=*.makefile,makefile,*.Makefile,Makefile,Makefile.*,*.mk,MANIFEST.MF,.project addNewLine=true convertActionOnSaave=AnyEdit.CnvrtTabToSpaces eclipse.preferences.version=1 fixLineDelimiters=false ignoreBlankLinesWhenTrimming=false inActiveContentFilterList= javaTabWidthForJava=true org.eclipse.jdt.ui.editor.tab.width=2 projectPropsEnabled=false removeTrailingSpaces=true replaceAllSpaces=false replaceAllTabs=false saveAndAddLine=false saveAndConvert=false saveAndFixLineDelimiters=false saveAndTrim=true useModulo4Tabs=false CharacterManaJ/.settings/org.eclipse.ltk.core.refactoring.prefs0000644000175000017500000000021113615720000024770 0ustar paulliupaulliu#Wed Jul 21 22:46:49 JST 2010 eclipse.preferences.version=1 org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false CharacterManaJ/.settings/org.eclipse.core.resources.prefs0000644000175000017500000000046013615720000023714 0ustar paulliupaulliueclipse.preferences.version=1 encoding//src/main/java=UTF-8 encoding//src/main/resources=UTF-8 encoding//src/main/resources/appinfo/about.html=UTF-8 encoding//src/main/resources/appinfo/about_ja.html=UTF-8 encoding//src/test/java=UTF-8 encoding//src/test/resources=UTF-8 encoding/=UTF-8 CharacterManaJ/.settings/org.eclipse.jdt.ui.prefs0000644000175000017500000000017413615720000022152 0ustar paulliupaulliueclipse.preferences.version=1 formatter_profile=org.eclipse.jdt.ui.default.eclipse_profile formatter_settings_version=12 CharacterManaJ/.settings/org.eclipse.m2e.core.prefs0000644000175000017500000000013213615720000022361 0ustar paulliupaulliuactiveProfiles= eclipse.preferences.version=1 resolveWorkspaceProjects=true version=1 CharacterManaJ/.fbprefs0000644000175000017500000002045413615720000015220 0ustar paulliupaulliu#FindBugs User Preferences #Tue Feb 13 18:51:32 JST 2018 cloud_id=edu.umd.cs.findbugs.cloud.doNothingCloud detectorAppendingToAnObjectOutputStream=AppendingToAnObjectOutputStream|true detectorAtomicityProblem=AtomicityProblem|true detectorBadAppletConstructor=BadAppletConstructor|false detectorBadResultSetAccess=BadResultSetAccess|true detectorBadSyntaxForRegularExpression=BadSyntaxForRegularExpression|true detectorBadUseOfReturnValue=BadUseOfReturnValue|true detectorBadlyOverriddenAdapter=BadlyOverriddenAdapter|true detectorBooleanReturnNull=BooleanReturnNull|true detectorCallToUnsupportedMethod=CallToUnsupportedMethod|false detectorCheckExpectedWarnings=CheckExpectedWarnings|false detectorCheckImmutableAnnotation=CheckImmutableAnnotation|true detectorCheckRelaxingNullnessAnnotation=CheckRelaxingNullnessAnnotation|true detectorCheckTypeQualifiers=CheckTypeQualifiers|true detectorCloneIdiom=CloneIdiom|true detectorComparatorIdiom=ComparatorIdiom|true detectorConfusedInheritance=ConfusedInheritance|true detectorConfusionBetweenInheritedAndOuterMethod=ConfusionBetweenInheritedAndOuterMethod|true detectorCovariantArrayAssignment=CovariantArrayAssignment|false detectorCrossSiteScripting=CrossSiteScripting|true detectorDefaultEncodingDetector=DefaultEncodingDetector|true detectorDoInsideDoPrivileged=DoInsideDoPrivileged|true detectorDontCatchIllegalMonitorStateException=DontCatchIllegalMonitorStateException|true detectorDontIgnoreResultOfPutIfAbsent=DontIgnoreResultOfPutIfAbsent|true detectorDontUseEnum=DontUseEnum|true detectorDroppedException=DroppedException|true detectorDumbMethodInvocations=DumbMethodInvocations|true detectorDumbMethods=DumbMethods|true detectorDuplicateBranches=DuplicateBranches|true detectorEmptyZipFileEntry=EmptyZipFileEntry|true detectorEqualsOperandShouldHaveClassCompatibleWithThis=EqualsOperandShouldHaveClassCompatibleWithThis|true detectorExplicitSerialization=ExplicitSerialization|true detectorFinalizerNullsFields=FinalizerNullsFields|true detectorFindBadCast2=FindBadCast2|true detectorFindBadForLoop=FindBadForLoop|true detectorFindCircularDependencies=FindCircularDependencies|false detectorFindComparatorProblems=FindComparatorProblems|true detectorFindDeadLocalStores=FindDeadLocalStores|true detectorFindDoubleCheck=FindDoubleCheck|true detectorFindEmptySynchronizedBlock=FindEmptySynchronizedBlock|true detectorFindFieldSelfAssignment=FindFieldSelfAssignment|true detectorFindFinalizeInvocations=FindFinalizeInvocations|true detectorFindFloatEquality=FindFloatEquality|true detectorFindHEmismatch=FindHEmismatch|true detectorFindInconsistentSync2=FindInconsistentSync2|true detectorFindJSR166LockMonitorenter=FindJSR166LockMonitorenter|true detectorFindLocalSelfAssignment2=FindLocalSelfAssignment2|true detectorFindMaskedFields=FindMaskedFields|true detectorFindMismatchedWaitOrNotify=FindMismatchedWaitOrNotify|true detectorFindNakedNotify=FindNakedNotify|true detectorFindNonSerializableStoreIntoSession=FindNonSerializableStoreIntoSession|true detectorFindNonSerializableValuePassedToWriteObject=FindNonSerializableValuePassedToWriteObject|true detectorFindNonShortCircuit=FindNonShortCircuit|true detectorFindNullDeref=FindNullDeref|true detectorFindNullDerefsInvolvingNonShortCircuitEvaluation=FindNullDerefsInvolvingNonShortCircuitEvaluation|true detectorFindOpenStream=FindOpenStream|true detectorFindPuzzlers=FindPuzzlers|true detectorFindRefComparison=FindRefComparison|true detectorFindReturnRef=FindReturnRef|true detectorFindRoughConstants=FindRoughConstants|true detectorFindRunInvocations=FindRunInvocations|true detectorFindSelfComparison=FindSelfComparison|true detectorFindSelfComparison2=FindSelfComparison2|true detectorFindSleepWithLockHeld=FindSleepWithLockHeld|true detectorFindSpinLoop=FindSpinLoop|true detectorFindSqlInjection=FindSqlInjection|true detectorFindTwoLockWait=FindTwoLockWait|true detectorFindUncalledPrivateMethods=FindUncalledPrivateMethods|true detectorFindUnconditionalWait=FindUnconditionalWait|true detectorFindUninitializedGet=FindUninitializedGet|true detectorFindUnrelatedTypesInGenericContainer=FindUnrelatedTypesInGenericContainer|true detectorFindUnreleasedLock=FindUnreleasedLock|true detectorFindUnsatisfiedObligation=FindUnsatisfiedObligation|true detectorFindUnsyncGet=FindUnsyncGet|true detectorFindUseOfNonSerializableValue=FindUseOfNonSerializableValue|true detectorFindUselessControlFlow=FindUselessControlFlow|true detectorFindUselessObjects=FindUselessObjects|true detectorFormatStringChecker=FormatStringChecker|true detectorHugeSharedStringConstants=HugeSharedStringConstants|true detectorIDivResultCastToDouble=IDivResultCastToDouble|true detectorIncompatMask=IncompatMask|true detectorInconsistentAnnotations=InconsistentAnnotations|true detectorInefficientIndexOf=InefficientIndexOf|false detectorInefficientInitializationInsideLoop=InefficientInitializationInsideLoop|false detectorInefficientMemberAccess=InefficientMemberAccess|false detectorInefficientToArray=InefficientToArray|true detectorInfiniteLoop=InfiniteLoop|true detectorInfiniteRecursiveLoop=InfiniteRecursiveLoop|true detectorInfiniteRecursiveLoop2=InfiniteRecursiveLoop2|false detectorInheritanceUnsafeGetResource=InheritanceUnsafeGetResource|true detectorInitializationChain=InitializationChain|true detectorInitializeNonnullFieldsInConstructor=InitializeNonnullFieldsInConstructor|true detectorInstantiateStaticClass=InstantiateStaticClass|true detectorIntCast2LongAsInstant=IntCast2LongAsInstant|true detectorInvalidJUnitTest=InvalidJUnitTest|true detectorIteratorIdioms=IteratorIdioms|true detectorLazyInit=LazyInit|true detectorLoadOfKnownNullValue=LoadOfKnownNullValue|true detectorLostLoggerDueToWeakReference=LostLoggerDueToWeakReference|true detectorMethodReturnCheck=MethodReturnCheck|true detectorMultithreadedInstanceAccess=MultithreadedInstanceAccess|true detectorMutableEnum=MutableEnum|true detectorMutableLock=MutableLock|true detectorMutableStaticFields=MutableStaticFields|true detectorNaming=Naming|true detectorNoteUnconditionalParamDerefs=NoteUnconditionalParamDerefs|true detectorNumberConstructor=NumberConstructor|true detectorOptionalReturnNull=OptionalReturnNull|true detectorOverridingEqualsNotSymmetrical=OverridingEqualsNotSymmetrical|true detectorPreferZeroLengthArrays=PreferZeroLengthArrays|true detectorPublicSemaphores=PublicSemaphores|false detectorQuestionableBooleanAssignment=QuestionableBooleanAssignment|true detectorReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass=ReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass|true detectorReadReturnShouldBeChecked=ReadReturnShouldBeChecked|true detectorRedundantConditions=RedundantConditions|true detectorRedundantInterfaces=RedundantInterfaces|true detectorRepeatedConditionals=RepeatedConditionals|true detectorRuntimeExceptionCapture=RuntimeExceptionCapture|true detectorSerializableIdiom=SerializableIdiom|true detectorStartInConstructor=StartInConstructor|true detectorStaticCalendarDetector=StaticCalendarDetector|true detectorStringConcatenation=StringConcatenation|true detectorSuperfluousInstanceOf=SuperfluousInstanceOf|true detectorSuspiciousThreadInterrupted=SuspiciousThreadInterrupted|true detectorSwitchFallthrough=SwitchFallthrough|true detectorSynchronizationOnSharedBuiltinConstant=SynchronizationOnSharedBuiltinConstant|true detectorSynchronizeAndNullCheckField=SynchronizeAndNullCheckField|true detectorSynchronizeOnClassLiteralNotGetClass=SynchronizeOnClassLiteralNotGetClass|true detectorSynchronizingOnContentsOfFieldToProtectField=SynchronizingOnContentsOfFieldToProtectField|true detectorURLProblems=URLProblems|true detectorUncallableMethodOfAnonymousClass=UncallableMethodOfAnonymousClass|true detectorUnnecessaryMath=UnnecessaryMath|true detectorUnreadFields=UnreadFields|true detectorUseObjectEquals=UseObjectEquals|false detectorUselessSubclassMethod=UselessSubclassMethod|false detectorVarArgsProblems=VarArgsProblems|true detectorVolatileUsage=VolatileUsage|true detectorWaitInLoop=WaitInLoop|true detectorWrongMapIterator=WrongMapIterator|true detectorXMLFactoryBypass=XMLFactoryBypass|true detector_threshold=2 effort=default filter_settings=Medium|BAD_PRACTICE,CORRECTNESS,MT_CORRECTNESS,PERFORMANCE,STYLE|false|15 filter_settings_neg=MALICIOUS_CODE,SECURITY,EXPERIMENTAL,NOISE,I18N| run_at_full_build=false CharacterManaJ/pom.xml0000644000175000017500000003636413615720000015114 0ustar paulliupaulliu 4.0.0 jp.seraphyware.charactermanaj CharacterManaJ 0.9.9.9 https://osdn.net/projects/charactermanaj/ scm:git:https://scm.osdn.net/gitroot/charactermanaj/CharacterManaJ.git HEAD https://osdn.net/projects/charactermanaj/scm/git/CharacterManaJ/ seraphyware https://osdn.net/projects/charactermanaj/ seraphy seraphy seraphy@users.osdn.me https://osdn.net/users/seraphy/ seraphyware architect developer Asia/Tokyo charactermanaj.CharacterManaJ UTF-8 1.6 1.6 java16 1.1 yyyy-MM-dd com.apple AppleJavaExtensions 1.4 provided junit junit 4.11 test org.codehaus.mojo buildnumber-maven-plugin 1.4 validate create false true {0,date,yyyyMM}.{0,date,ddHHmm} timestamp org.apache.maven.plugins maven-compiler-plugin 3.1 ${maven.compiler.source} ${maven.compiler.target} -Xlint:all org.codehaus.mojo animal-sniffer-maven-plugin 1.16 org.codehaus.mojo.signature ${animalSnifferArtifact} ${animalSnifferArtifactVersion} true check-java-api test check org.apache.maven.plugins maven-jar-plugin 3.1.0 ${project.artifactId} ${mainClass} true true splash.png ${maven.build.timestamp} ${project.developers[0].id} ${maven.build.timestamp} ${project.name} ${project.version} ${project.organization.name} ${project.name} ${project.version}.${buildNumber} ${project.organization.name} ${project.organization.name} windows-profile windows ${java.home} com.akathist.maven.plugins.launch4j launch4j-maven-plugin 1.7.25 l4j-gui package launch4j gui target/${project.artifactId}.exe target/${project.artifactId}.jar Failed to execute the ${project.artifactId} icon.ico https://adoptopenjdk.net/ https://osdn.net/projects/charactermanaj/ src/Launch4JStub/w32api/crt2.o src/Launch4JStub/head/head.o src/Launch4JStub/head/guihead.o src/Launch4jStub/w32api/libmingw32.a src/Launch4jStub/w32api/libgcc.a src/Launch4jStub/w32api/libmsvcrt.a src/Launch4jStub/w32api/libkernel32.a src/Launch4jStub/w32api/libuser32.a src/Launch4jStub/w32api/libadvapi32.a src/Launch4jStub/w32api/libshell32.a src/Launch4jStub/w32api/libshfolder.a jre 1.6.0 64 128 ${project.version} ${project.version}.${buildNumber} ${project.artifactId} ${project.version} ${buildNumber} ${project.version} ${project.version} ${project.artifactId} ${project.artifactId} ${project.artifactId}.exe org.apache.maven.plugins maven-assembly-plugin 2.6 create-distribution-with-jre package single ${project.artifactId}_${project.version}_with_JRE false src/main/assembly/charactermanaj_with_jre_zip.xml create-distribution package single ${project.artifactId}_${project.version} false src/main/assembly/charactermanaj_zip.xml osx-profile mac ${java.home} org.apache.maven.plugins maven-antrun-plugin 1.8 package run CharacterManaJ/.checkstyle0000644000175000017500000000047713615720000015732 0ustar paulliupaulliu