ofs | hex dump | ascii |
---|
0000 | 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 03 23 00 00 02 0d 08 06 00 00 00 2d 02 a0 | .PNG........IHDR...#.........-.. |
0020 | 37 00 00 18 36 69 43 43 50 49 43 43 20 50 72 6f 66 69 6c 65 00 00 58 85 95 79 09 38 55 df d7 ff | 7...6iCCPICC.Profile..X..y.8U... |
0040 | 3e f7 dc c1 e5 5e f3 3c cf f3 3c 0f 99 e7 29 f3 ac 74 5d d3 35 67 26 32 a6 50 d1 a4 42 84 54 32 | >....^.<..<...)..t].5g&2.P..B.T2 |
0060 | 45 03 49 8a 0c 29 91 21 44 03 4a a5 54 2a 8a 4c ef 41 f5 fd bd df f7 ff fc df e7 dd cf 73 ce f9 | E.I..).!D.J.T*.L.A...........s.. |
0080 | 58 7b ed b5 3f 7b af b5 87 e5 02 c0 c5 4e 0a 0f 0f 46 d1 03 10 12 1a 15 61 6f 6a c0 ef ea e6 ce | X{..?{.......N...F......aoj..... |
00a0 | 8f 9b 04 10 e0 06 6c 40 15 68 91 c8 91 e1 fa b6 b6 56 00 29 7f be ff bd fc 18 41 b4 91 32 24 b3 | ......l@.h.......V.)......A..2$. |
00c0 | 69 eb 7f d6 ff 7f 0b 83 8f 6f 24 19 00 c8 16 c1 de 3e 91 e4 10 04 5f 07 00 cd 49 0e 8f 88 02 00 | i........o$......>...._...I..... |
00e0 | f3 04 91 0b c5 46 85 6f e2 05 04 33 47 20 04 01 c0 52 6d 62 ff 6d cc bd 89 bd b7 b1 fc 96 8e a3 | .....F.o...3G....Rmb.m.......... |
0100 | bd 21 82 8d 00 a0 22 90 48 11 fe 00 d0 6e da e7 8f 21 fb 23 76 68 c3 91 3a c6 50 1f 4a 28 a2 9a | .!....".H....n...!.#vh..:.P.J(.. |
0120 | 81 60 1d 72 00 c9 07 00 ce 0e 44 47 3a 24 24 6c 13 cf 23 58 dc fb 3f ec f8 ff 37 9b de 7f 6d 92 | .`.r......DG:$$l..#X..?...7...m. |
0140 | 48 fe 7f f1 f6 58 b6 0a 95 11 25 32 3c 98 14 ff 7f 9c 8e ff bd 84 04 47 ff e9 43 10 79 08 01 11 | H....X....%2<..........G..C.y... |
0160 | 66 f6 9b 63 46 e6 ed 72 50 98 e5 26 26 20 b8 25 d4 7b a7 0d 82 19 11 fc 80 e2 b3 a5 bf 89 c7 03 | f..cF..rP..&&..%.{.............. |
0180 | a2 cd 9c 7e eb cf 91 23 0d 91 39 03 ac 00 a0 80 0f c9 c8 12 c1 c8 5c a2 58 a3 83 9c f4 7f 63 45 | ...~...#..9...........\.X.....cE |
01a0 | 52 c4 56 5b 44 1f b5 93 12 65 ee f8 1b 7b 47 84 d9 ff b6 8f 8a 09 0d de 69 f5 db ce a1 00 5f f3 | R.V[D....e...{G.........i....._. |
01c0 | 3f b8 d8 37 d2 d8 e1 8f 8e 1f c5 c4 1c c1 48 a4 a1 ae 27 04 38 ba 6c f3 44 75 c4 50 9c 77 22 98 | ?..7..........H...'.8.l.Du.P.w". |
01e0 | 16 c1 4f 22 83 1c 2c 7f b7 7d 99 10 60 b8 f3 8f 4e 44 b4 fd 26 67 61 04 2f f8 45 98 d8 6f eb c0 | ..O"..,..}..`...ND..&ga./.E..o.. |
0200 | ec 21 91 7f c6 05 cb 92 49 5b 7d b1 23 58 2f 2a c0 d1 6c bb 2d ec ea 1b e9 6a f5 87 83 8f af 91 | .!......I[}.#X/*..l.-....j...... |
0220 | f1 36 07 d8 c7 37 d4 e9 37 37 18 89 2e 03 fb df 6d 33 c3 83 6d 7f eb c3 c5 be c1 a6 f6 db f3 0c | .6...7..77......m3..m........... |
0240 | 5f 8d 8c 71 f8 d3 76 30 0a 09 b0 ed 79 80 a7 03 49 16 b6 db fc e1 1f e1 51 b6 8e db dc d0 68 60 | _..q..v0....y...I.......Q.....h` |
0260 | 05 0c 81 11 e0 07 d1 c8 e3 0d c2 40 20 a0 f4 cd 35 ce 21 7f 6d d7 98 00 12 88 00 fe c0 17 c8 fc | ...........@....5.!.m........... |
0280 | 96 fc 69 e1 b2 55 13 8a bc 1d 40 02 f8 84 20 5f 10 f9 b7 9d c1 56 ad 2f 88 41 e4 6b 7f a5 db 6f | ..i..U....@...._.....V./.A.k...o |
02a0 | 19 e0 b7 55 1b b3 d5 22 08 bc 45 70 08 9a 13 ad 83 d6 42 5b 21 6f 3d e4 51 44 ab a3 35 fe b4 e3 | ...U..."..Ep......B[!o=.QD..5... |
02c0 | a7 fb d3 2b d6 18 6b 84 35 c3 9a 60 25 fe f2 20 23 ac 83 91 27 02 50 fe 1f 32 4b e4 eb 8b 8c 6e | ...+..k.5..`%...#...'.P..2K....n |
02e0 | 93 4b e8 9f 31 fc 63 0f f3 16 33 80 99 c6 3c c5 4c 62 9e 01 67 f0 66 cb ca 6f 2d 2f 4a 5a c4 bf | .K..1.c...3...<.Lb..g.f..o-/JZ.. |
0300 | 98 f3 03 6b 30 89 58 33 f9 3d 3a 6f c4 e6 ec 1f 1d b4 28 c2 5a 05 6d 80 d6 46 f8 23 dc d1 ac 68 | ...k0.X3.=:o......(.Z.m..F.#...h |
0320 | 4e 20 83 56 46 46 a2 8f d6 45 c6 a6 82 48 ff 93 61 f4 5f 6e ff cc e5 bf fb db 64 fd 9f e3 f9 2d | N..VFF...E...H..a._n......d....- |
0340 | a7 95 a4 55 f9 cd c2 fb af 67 0c ff 6a fd db 8a e1 7f cc 91 0f f2 b5 fc b7 26 7c 08 be 06 77 c3 | ...U.....g..j............&|...w. |
0360 | 6d 70 0f dc 02 37 02 7e f8 2e dc 04 f7 c2 77 36 f1 df 48 78 b3 15 09 7f 7a b3 df e2 16 84 d8 a1 | mp...7.~......w6..Hx....z....... |
0380 | fc d1 91 af 92 9f 95 5f fd 1f bd 93 7e 33 88 d8 f2 37 88 f2 8d 8b da 5c 10 86 61 e1 f1 11 14 ff | ......._....~3...7.....\..a..... |
03a0 | 80 28 7e 7d 64 47 f6 e5 37 0f 25 cb 4a f3 2b ca 2b a8 02 b0 b9 bf 6f 6f 1f df ed b7 f6 6d 88 b5 | .(~}dG..7.%.J.+.+.....oo.....m.. |
03c0 | ff 1f 19 65 04 00 d5 7a 44 38 f6 8f cc 1f 89 e9 e6 69 00 f0 56 ff c8 44 aa 91 90 47 f6 cf 07 78 | ...e...zD8.......i..V..D...G...x |
03e0 | 72 74 44 cc b6 0c bd f9 c2 00 6a 40 87 ac 0c 0e c0 0b 84 80 38 32 26 c5 cd 53 04 e8 01 63 60 01 | rtD.......j@........82&..S...c`. |
0400 | 6c 80 23 70 03 bb 91 59 0f 00 21 08 eb 58 90 08 52 41 26 c8 01 79 e0 14 28 00 25 a0 1c 5c 06 35 | l.#p...Y..!..X..RA&..y..(.%..\.5 |
0420 | a0 01 34 82 16 d0 06 ba c0 23 f0 04 3c 05 13 48 6c cc 80 8f 60 1e fc 00 2b 10 04 e1 20 22 c4 04 | ..4......#..<..Hl...`...+....".. |
0440 | 71 40 7c 90 08 24 05 29 42 ea 90 0e 64 0c 59 41 f6 90 1b b4 07 f2 87 42 a1 68 28 11 4a 87 72 a0 | q@|..$.)B...d.YA.......B.h(.J.r. |
0460 | e3 50 01 54 0a 55 42 f5 d0 2d a8 0d ea 81 06 a0 67 d0 14 34 0b 7d 83 7e a1 60 14 01 c5 8c e2 41 | .P.T.UB..-......g..4.}.~.`.....A |
0480 | 89 a2 e4 50 ea 28 7d 94 25 ca 11 b5 0b e5 8f da 8b 4a 40 65 a0 8e a2 ce a0 ca 50 d5 a8 9b a8 36 | ...P.(}.%........J@e......P....6 |
04a0 | d4 23 d4 53 d4 24 ea 23 6a 11 06 30 0d cc 0a 0b c0 32 b0 3a 6c 08 db c0 ee b0 1f 1c 01 ef 87 b3 | .#.S.$.#j..0.....2.:l........... |
04c0 | e1 7c b8 0c ae 85 9b 11 5f 0f c1 93 f0 1c bc 8c c6 a2 99 d0 fc 68 19 24 3e cd d0 4e 68 32 7a 2f | .|......_............h.$>..Nh2z/ |
04e0 | 7a 3f fa 30 ba 00 7d 19 7d 13 dd 81 1e 42 4f a1 e7 d1 eb 18 22 86 1b 23 85 d1 c4 98 63 5c 31 fe | z?.0..}.}....BO....."..#....c\1. |
0500 | 98 58 4c 26 26 1f 73 11 73 03 d3 89 ac 9d 19 cc 0f 2c 16 cb 8a 15 c3 aa 21 6b d3 0d 1b 88 dd 87 | .XL&&.s.s........,......!k...... |
0520 | 3d 8c 3d 87 ad c3 de c3 0e 60 5f 63 17 71 38 1c 07 4e 0a a7 8d b3 c1 91 70 51 b8 4c dc 59 5c 35 | =.=......`_c.q8..N......pQ.L.Y\5 |
0540 | ee 2e 6e 10 37 83 5b a2 a2 a1 e2 a3 52 a4 32 a1 72 a7 0a a5 4a a3 ca a7 ba 42 d5 4a 35 48 f5 8e | ..n.7.[.....R.2.r...J....B.J5H.. |
0560 | 6a 05 4f 8f 17 c1 6b e2 6d f0 3e f8 78 7c 2e fe 02 be 19 df 8f 9f c1 af 50 33 50 8b 51 6b 53 3b | j.O...k.m.>.x|..........P3P.QkS; |
0580 | 52 07 52 a7 52 9f a1 ae a5 ee a4 7e 4e fd 9d 86 86 46 90 46 83 c6 8e 86 42 93 42 73 86 e6 2a cd | R.R.R......~N....F.F....B.Bs..*. |
05a0 | 03 9a 29 9a 65 02 23 41 92 60 48 f0 24 44 13 8e 12 2e 11 ee 11 9e 11 be 13 89 44 51 a2 1e d1 9d | ..).e.#A.`H.$D............DQ.... |
05c0 | 18 45 3c 4a ac 24 de 27 be 24 2e d1 32 d1 ca d2 9a d3 fa d0 26 d3 16 d2 de a4 1d a4 fd 4c 87 a7 | .E<J.$.'.$..2.......&........L.. |
05e0 | 13 a1 d3 a7 db 4d 97 40 97 4f 77 8d ae 9f 6e 8e 1e 4f 2f 4a 6f 48 4f a2 df 4f 5f 48 7f 8b 7e 94 | .....M.@.Ow...n..O/JoHO..O_H..~. |
0600 | 7e 91 81 89 41 81 c1 86 21 84 e1 30 c3 15 86 1e 86 f7 8c 38 46 51 46 63 46 1f c6 0c c6 72 c6 fb | ~...A...!..0.......8FQFcF....r.. |
0620 | 8c af 99 60 26 21 26 43 26 32 53 3a d3 05 a6 4e a6 19 66 2c b3 18 b3 39 73 20 73 0e 73 0d 73 1f | ...`&!&C&2S:...N..f,...9s.s.s.s. |
0640 | f3 3c 0b 23 8b 32 8b 33 4b 1c 4b 21 cb 1d 96 49 56 98 55 94 d5 9c 35 98 35 97 b5 81 75 84 f5 17 | .<.#.2.3K.K!...IV.U...5.5...u... |
0660 | 1b 0f 9b 3e 9b 2f 5b 16 5b 2d db 20 db 4f 76 2e 76 3d 76 5f f6 6c f6 3a f6 a7 ec bf 38 f8 39 8c | ...>./[.[-...Ov.v=v_.l.:....8.9. |
0680 | 39 82 38 8e 71 34 72 bc e0 44 73 4a 72 da 71 c6 72 16 73 76 72 ce 71 31 73 69 71 91 b9 b2 b9 1a | 9.8.q4r..DsJr.q.r.svr.q1siq..... |
06a0 | b8 c6 b9 51 dc 92 dc f6 dc fb b8 cb b9 7b b9 17 79 78 79 4c 79 c2 79 ce f2 dc e7 99 e3 65 e5 d5 | ...Q.........{..yxyLy.y......e.. |
06c0 | e3 0d e4 3d c9 db ca 3b cb c7 c4 a7 c3 47 e1 3b c9 77 97 ef 03 3f 0b bf 3e 7f 30 ff 19 fe 0e fe | ...=...;.....G.;.w...?..>.0..... |
06e0 | 79 01 6e 01 33 81 68 81 52 81 3e 81 15 41 31 41 27 c1 34 c1 3a c1 17 42 d4 42 ea 42 7e 42 27 85 | y.n.3.h.R.>..A1A'.4.:..B.B.B~B'. |
0700 | da 85 e6 85 f9 84 ad 85 13 85 ab 84 c7 45 f0 22 ea 22 01 22 a7 45 ba 45 7e 8a 8a 89 ba 88 1e 14 | .............E.".".".E.E~....... |
0720 | 6d 14 7d 2f c6 2e 66 2e 96 20 56 25 f6 5c 9c 28 ae 2b be 57 bc 4c 7c 58 02 2b a1 2e 11 24 71 4e | m.}/..f...V%.\.(.+.W.L|X.+...$qN |
0740 | e2 89 24 4a 52 45 32 40 b2 50 b2 5f 0a 25 a5 2a 45 91 3a 27 35 20 8d 91 d6 90 0e 95 2e 93 1e 95 | ..$JRE2@.P._.%.*E.:'5........... |
0760 | 21 c8 e8 cb c4 c8 54 c9 4c c9 b2 ca 5a c9 a6 c9 36 ca 7e 96 13 96 73 97 3b 26 d7 2d b7 2e af 22 | !.....T.L...Z...6.~...s.;&.-..." |
0780 | 1f 2c 7f 41 7e 42 81 51 c1 42 21 4d a1 59 e1 9b a2 a4 22 59 b1 50 71 58 89 a8 64 a2 94 ac d4 a4 | .,.A~B.Q.B!M.Y...."Y.PqX..d..... |
07a0 | f4 55 59 4a d9 57 b9 58 79 4c 85 49 c5 5a e5 a0 4a bb ca 9a aa 9a 6a 84 6a ad ea ac 9a b0 da 1e | .UYJ.W.XyL.I.Z..J.....j.j....... |
07c0 | b5 22 b5 51 75 66 75 5b f5 c3 ea 0f 34 30 1a 06 1a c9 1a 2d 1a cb 9a aa 9a 51 9a 0d 9a 5f b4 64 | .".Qufu[....40.....-.....Q..._.d |
07e0 | b4 82 b4 ae 68 bd df 21 b6 c3 77 c7 85 1d af b5 05 b5 49 da a5 da 93 3a fc 3a 7b 74 ce eb 4c ea | ....h..!..w.......I....:.:{t..L. |
0800 | 0a e8 92 74 cb 74 a7 f5 84 f4 7c f4 2e ea bd d3 97 d0 0f d4 af d6 ff 6c 20 6f 10 61 70 c3 e0 a7 | ...t.t....|............l.o.ap... |
0820 | a1 a6 61 92 e1 3d 23 d8 c8 d4 28 db a8 cf 98 d1 d8 c9 b8 c0 f8 a5 89 a0 89 bf 49 95 c9 bc a9 8a | ..a..=#...(...............I..... |
0840 | e9 3e d3 7b 66 18 33 4b b3 63 66 a3 e6 3c e6 64 f3 4a f3 79 0b 35 8b 24 8b 0e 4b 82 a5 83 65 81 | .>.{f.3K.cf..<.d.J.y.5.$..K...e. |
0860 | e5 b4 95 a4 55 84 55 b3 35 ca da c2 fa 84 f5 f3 9d 22 3b 43 77 36 da 00 1b 73 9b 13 36 2f 6c c5 | ....U.U.5........";Cw6...s..6/l. |
0880 | 6c f7 da de b6 c3 da d9 da 15 da bd b5 57 b0 4f b4 ef 76 60 72 f0 72 b8 e2 f0 c3 d1 c0 31 d7 71 | l............W.O..v`r.r......1.q |
08a0 | c2 49 dc 29 da a9 dd 99 ce d9 d3 b9 d2 f9 a7 8b 91 cb 71 97 49 57 39 d7 24 d7 47 6e 9c 6e 14 b7 | .I.)..............q.IW9.$.Gn.n.. |
08c0 | 26 77 9c bb b3 fb 45 f7 45 0f 63 8f 53 1e 33 9e 2a 9e 99 9e 23 bb c4 76 c5 ed ea d9 cd b9 3b 78 | &w....E.E.c.S.3.*...#..v......;x |
08e0 | f7 1d 2f 3a 2f 92 d7 b5 3d 98 3d 2e 7b ae ec 59 25 d9 90 ca 48 8b de e6 de 45 de f3 64 43 f2 69 | ../:/...=.=.{..Y%...H....E..dC.i |
0900 | f2 47 1f 3d 9f 93 3e b3 be da be c7 7d df f9 69 fb 1d f7 7b ef af ed 7f c2 7f 36 40 37 20 3f 60 | .G.=..>.....}..i...{......6@7.?` |
0920 | 8e 62 48 29 a0 7c 0d 34 0b 2c 09 fc 19 64 13 74 29 68 23 d8 25 b8 2e 84 2a 64 4f c8 ad 50 c6 d0 | .bH).|.4.,...d.t)h#.%...*dO..P.. |
0940 | a0 d0 8e 30 de b0 b8 b0 81 70 a9 f0 cc f0 c9 bd 9a 7b 4f ed 9d 8f b0 8c b8 18 09 45 ee 8a 6c 8a | ...0.....p.......{O........E..l. |
0960 | 62 46 ae 3a bd d1 e2 d1 07 a2 a7 62 74 62 0a 63 96 62 9d 63 af c5 31 c4 85 c6 f5 c6 4b c6 67 c5 | bF.:.......btb.c.b.c..1.....K.g. |
0980 | bf 4b 30 49 a8 d8 87 de 47 de d7 9e 28 90 98 9a 38 95 a4 9f 54 ba 1f da ef bd bf 3d 59 28 39 23 | .K0I....G...(...8...T......=Y(9# |
09a0 | 79 26 c5 34 e5 72 2a 75 6a 50 ea e3 34 f9 b4 e3 69 0b e9 2e e9 cd 19 3c 19 29 19 af 0f 98 1e a8 | y&.4.r*ujP..4...i......<.)...... |
09c0 | ca a4 cd 8c c8 1c 3d a8 75 b0 e4 10 fa 10 e5 50 5f 96 52 d6 d9 ac f5 6c 9f ec 87 39 f2 39 f9 39 | ......=.u......P_.R....l...9.9.9 |
09e0 | ab 87 c9 87 1f 1e 51 38 72 e6 c8 c6 51 bf a3 7d b9 aa b9 c5 79 d8 bc d0 bc 91 63 ba c7 2e 1f 67 | ......Q8r...Q..}....y.....c....g |
0a00 | 38 9e 70 fc f5 09 eb 13 37 4f f2 9f cc 3e b9 70 ca eb 54 4f be 72 7e c9 69 ea d3 d1 a7 27 cf 58 | 8.p.....7O...>.p..TO.r~.i....'.X |
0a20 | 9d 69 3a 2b 7c 36 ef ec 6a 41 40 c1 d3 42 83 c2 ba 22 ee a2 ac a2 9f e7 7c ce 0d 16 eb 15 d7 96 | .i:+|6..jA@..B..."......|....... |
0a40 | f0 94 e4 94 fc 3a 4f 39 3f 56 6a 5a 7a b3 4c b4 2c bf 1c 5b 1e 53 fe f6 82 f3 85 ee 0a f5 8a ca | .....:O9?VjZz.L.,..[.S.......... |
0a60 | 8b 9c 17 73 2e ae 5d 0a bd 34 79 d9 fe 72 47 a5 5a 65 e5 15 ee 2b b9 55 a8 aa e8 aa d9 6a cf ea | ...s..]..4y..rG.Ze...+.U.....j.. |
0a80 | 27 35 46 35 4d b5 32 b5 a5 75 ac 75 39 57 c1 d5 e8 ab 1f ea f7 d4 8f 34 58 36 b4 5f 53 bf 56 7b | '5F5M.2..u.u9W.........4X6._S.V{ |
0aa0 | 5d e4 7a d1 0d a6 1b d9 37 a1 9b f1 37 e7 1b 03 1a 27 9b dc 9a 06 6e 59 dc 6a 6f d6 6a be 71 5b | ].z.....7...7....'....nY.jo.j.q[ |
0ac0 | f6 f6 a5 16 81 96 c2 3b 2c 77 72 5b a9 5b 33 5a 37 ee 26 dc 5d bc 17 7e 6f ae cd bf ed 75 bb 57 | .......;,wr[.[3Z7.&.]..~o....u.W |
0ae0 | fb c4 7d d7 fb c3 1d 76 1d 7d 9d 96 9d 0f ba 4c ba ee 77 eb 77 df 7d a0 fd a0 a5 47 b3 e7 d6 43 | ..}....v.}.....L..w.w.}....G...C |
0b00 | f5 87 8d 8f 54 1f dd ec 55 e9 bd f1 58 e5 f1 8d 3e d5 be 9b fd 6a fd 4d 4f 34 9e 34 0f ec 18 68 | ....T...U...X...>....j.MO4.4...h |
0b20 | 1d d4 1d 6c 1b 32 1a ea 1a 36 1f 7e f4 74 e7 d3 81 11 a7 91 b1 51 cf d1 c9 31 9f b1 f7 cf 82 9f | ...l.2...6.~.t.......Q...1...... |
0b40 | 7d 1d 8f 19 5f 99 48 79 8e 79 9e fd 82 fe 45 fe 4b ee 97 65 af 24 5e d5 4d aa 4e de 99 32 9a ea | }..._.Hy.y....E.K..e.$^.M.N..2.. |
0b60 | 9d 76 98 9e 78 4d 7e fd f1 4d e4 9b d5 99 8c b7 c4 b7 f9 ef f8 de 55 be 57 7c df 32 6b 32 fb e4 | .v..xM~..M............U.W|.2k2.. |
0b80 | 83 c7 87 99 8f e1 1f 57 e6 32 3f 31 7c 2a fa 2c fe f9 fa 17 bd 2f bd f3 ae f3 33 5f 23 be 6e 7c | .......W.2?1|*.,...../....3_#.n| |
0ba0 | 3b fc 9d e3 fb a5 05 e5 85 f6 45 db c5 97 3f 42 7e ac fc cc 5e e2 58 ba bc ac be dc fd cb e5 d7 | ;.........E...?B~...^.X......... |
0bc0 | bb 95 d8 55 dc ea 99 35 89 b5 e6 75 cb f5 e7 1b 21 1b 1b e1 a4 08 d2 d6 55 00 46 1e 94 9f 1f 00 | ...U...5...u....!.......U.F..... |
0be0 | df 2e 01 40 74 03 80 09 c9 e3 a8 69 b7 f3 af df 05 86 36 d3 0e 00 9c 21 59 e8 23 aa 03 8e 44 8b | ...@t......i......6....!Y.#...D. |
0c00 | a0 3f 60 4a b1 5e 38 01 dc 04 55 19 3e 90 5a 91 7a 95 a6 9f 50 42 8c a2 dd 49 27 41 8f a5 9f 66 | .?`J.^8...U.>.Z.z...PB...I'A...f |
0c20 | e8 64 bc c8 94 c5 1c c6 e2 cc 6a cc e6 c2 1e c2 91 c9 79 9e ab 99 7b 90 67 8e 0f cf 2f 2c a0 2f | .d........j.......y...{.g.../,./ |
0c40 | b8 47 28 49 b8 50 e4 96 e8 b8 d8 2f 09 2e 49 1d 29 6f e9 74 99 4a d9 7e b9 ef 0a ec 8a ba 4a 64 | .G(I.P...../..I.)o.t.J.~......Jd |
0c60 | e5 1c 95 7a d5 01 b5 cf 1a 44 4d 49 2d 93 1d de da fb 75 0a 74 af eb f5 e9 bf 33 58 37 62 37 96 | ...z.....DMI-.....u.t.....3X7b7. |
0c80 | 35 31 32 75 31 0b 32 4f b4 38 6a 59 6c 55 6b 7d 67 67 af cd b8 ed 5b bb 05 07 c8 91 e0 c4 e6 cc | 512u1.2O.8jYlUk}gg....[......... |
0ca0 | ed c2 e7 2a e4 26 e6 2e ed a1 e8 a9 b9 cb 70 b7 a5 97 d3 1e 32 29 cc 7b 3f f9 88 4f 89 6f bd 5f | ...*.&........p.....2).{?..O.o._ |
0cc0 | a7 ff 78 c0 7c 20 55 10 7f b0 46 88 43 68 58 58 76 78 c5 de b6 88 97 91 2b d1 ec 31 2a b1 8e 71 | ..x.|.U...F.ChXXvx......+..1*..q |
0ce0 | 7b e3 f3 12 ea f6 f5 27 7e d9 4f 9f ac 94 e2 94 1a 97 56 94 de 96 f1 36 93 70 50 e9 90 7b 56 5a | {......'~.O.......V....6.pP..{VZ |
0d00 | 76 65 ce d0 e1 d5 a3 a2 b9 36 79 f1 c7 2e 1c 7f 7c e2 cb 29 ba 7c 85 d3 4e 67 e2 ce 16 15 b4 15 | ve.......6y.....|..).|..Ng...... |
0d20 | be 3b 47 2c 56 29 f1 3c 9f 5e 7a a5 6c a0 fc 67 05 f7 45 fd 4b be 97 0f 56 5e be d2 5d f5 a6 7a | .;G,V).<.^z.l..g..E.K...V^..]..z |
0d40 | a3 96 bd 4e fe aa 69 bd 67 43 c4 b5 ac eb c5 37 ae de 6c 69 bc df d4 75 eb 7e f3 ed db 35 2d 05 | ...N..i.gC.....7..li...u.~...5-. |
0d60 | 77 52 5b c9 77 f5 ee b1 dd fb d0 76 ab 3d f5 be 69 07 be e3 61 67 66 97 7e d7 4a f7 f5 07 41 3d | wR[.w......v.=..i...agf.~.J...A= |
0d80 | 82 3d e3 0f 8f 3d b2 ea 25 f4 0e 3c ce ef 73 ef e7 ed 9f 7e 72 61 c0 6f 50 7c 70 76 e8 ca 70 e0 | .=...=..%..<..s....~ra.oP|pv..p. |
0da0 | 53 c9 a7 1f 47 aa 46 83 c6 a4 c7 3e 3d ab 1b df 3b a1 3c b1 f4 bc e5 45 ea 4b 93 57 c4 57 c3 93 | S...G.F....>=...;.<....E.K.W.W.. |
0dc0 | 05 53 bb a7 05 a7 67 5f df 78 73 70 c6 eb ad f6 3b a1 f7 f4 b3 98 0f a8 8f d4 73 5c 9f d4 3e 7b | .S....g_.xsp....;.........s\..>{ |
0de0 | 7c 39 38 df fc 75 e1 bb f2 42 dc 62 eb 4f dc 92 dd 72 d1 af b7 ab b2 6b d1 eb cd 1b 1b 5b fe 17 | |98..u...B.b.O...r.....k.....[.. |
0e00 | 82 ae a2 dc 60 06 b8 01 ed 81 a1 c6 d4 60 5d 91 5b 4d 1d 15 09 cf 8e 7f 44 9d 41 63 40 c0 10 ee | ....`........`].[M......D.Ac@... |
0e20 | 13 0f d0 9a d3 d1 d2 8d d1 97 31 04 33 aa 31 e1 98 5e 30 f7 b2 74 b1 de 63 bb c3 de c4 71 8d f3 | ..........1.3.1..^0..t..c....q.. |
0e40 | 2a 57 35 f7 25 9e 0b bc e5 7c e5 fc 65 02 a5 82 65 42 17 84 2f 89 54 8a d6 88 d5 8b 5f 97 68 96 | *W5.%....|..e...eB../.T....._.h. |
0e60 | 6c 93 ea 94 7e 28 33 28 3b 26 f7 42 fe a5 c2 0b c5 e7 4a e3 ca a3 2a 4f 55 87 d4 fa d5 1f 6a 74 | l...~(3(;&.B......J...*OU.....jt |
0e80 | 6a b6 69 dd de 71 5d bb 46 e7 82 6e 81 5e ae 7e ba 41 ac 61 a0 d1 2e e3 9d 26 7a a6 0a 66 fc e6 | j.i..q].F..n.^.~.A.a.....&z..f.. |
0ea0 | f4 16 c0 62 de f2 b9 55 a7 75 f5 ce 13 36 fb 6c bd ed cc ed e5 1d 38 1c 21 c7 59 a7 41 e7 db 2e | ...b...U.u...6.l......8.!.Y.A... |
0ec0 | 15 ae b9 6e 09 ee be 1e 36 9e 3b 76 89 ed 66 f2 82 bc 3e ef 99 20 f5 78 37 92 2b 7c 4e f8 66 f8 | ...n....6.;v..f...>....x7.+|N.f. |
0ee0 | a5 fa a7 05 a4 53 d2 03 d3 82 d2 83 d3 42 d2 43 d3 c3 d2 c2 d3 f6 a6 45 a4 45 a6 45 a5 46 a7 c4 | .....S.......B.C.......E.E.E.F.. |
0f00 | a4 c4 26 c7 25 c7 ef 4f 48 da 97 98 98 98 b4 6f 7f 42 72 7c 4a 1c 12 1d b9 e9 15 19 2d 07 86 33 | ..&.%..OH......o.Br|J.......-..3 |
0f20 | 3f 1e 82 b3 38 b3 15 73 cc 0e ef 39 12 7b f4 70 ee 85 bc e6 63 4f 8e bf 3d b1 7a 8a 21 5f ec b4 | ?...8..s...9.{.p....cO..=.z.!_.. |
0f40 | f6 19 bb b3 7e 05 89 85 c7 8a 2e 9c 6b 2e ee 2f 79 7d fe 67 19 a1 5c e0 82 6a 85 c5 c5 dd 97 22 | ....~.......k../y}.g..\..j....." |
0f60 | 90 08 29 bc 52 5b d5 56 3d 5c f3 ae f6 d7 55 42 3d 6f 83 dc 35 fd eb f6 37 c8 37 23 1b 33 9a 4e | ..).R[.V=\....UB=o..5...7.7#.3.N |
0f80 | de aa 40 76 b0 8e 96 a1 3b af 5b 3f dc 7d 72 af a6 2d bb dd ff be 51 07 7f c7 6a e7 58 d7 b5 ee | ..@v....;.[?.}r..-....Q...j.X... |
0fa0 | a3 0f 28 3d 86 0f 79 1e fe 78 d4 df 7b e9 71 72 9f 73 bf cc 13 f4 93 f1 81 fa c1 cc 21 cf 61 85 | ..(=..y..x..{.qr.s..........!.a. |
0fc0 | a7 98 a7 13 23 f5 a3 d9 63 94 67 96 e3 8a 13 7c cf 99 5e d0 bd 64 7a 25 30 a9 35 b5 67 fa c4 eb | ....#...c.g....|..^..dz%0.5.g... |
0fe0 | e1 19 f1 b7 87 df 83 d9 ac 8f 82 73 8f 3f 67 cd db 7d 13 5f a0 59 5c fa f9 65 f9 c3 ca a7 b5 ef | ...........s.?g..}._.Y\..e...... |
1000 | 5b fe 97 02 1d 90 25 34 86 f2 40 7d 82 83 e0 25 74 1a 86 1d 53 86 55 c1 3e 42 6e b4 6b 54 85 78 | [.....%4..@}...%t...S.U.>Bn.kT.x |
1020 | 1d fc 24 f5 41 1a 45 9a 57 84 1c e2 0e e2 1c ed 39 3a 7b 7a 1a fa 4e 86 a3 8c 5e 4c 0a cc 68 e6 | ..$.A.E.W.......9:{z..N...^L..h. |
1040 | 61 96 0a d6 38 36 6b 76 3e f6 45 8e 87 9c a5 5c 71 dc 36 3c e2 bc 10 ef 38 df 35 fe 5c 81 40 41 | a...86kv>.E....\q.6<....8.5.\.@A |
1060 | 13 21 21 a1 75 e4 1e d5 24 9a 2f 16 25 6e 2b 21 2e b1 2a 39 20 55 21 1d 2f 63 2d 2b 20 fb 55 ae | .!!.u...$./.%n+!..*9.U!./c-+..U. |
1080 | 4d fe 98 c2 1e 45 59 c5 65 a5 76 64 7f 70 50 65 57 9d 50 2b 51 27 69 08 6a 4c 69 96 68 ed de c1 | M....EY.e.vd.pPeW.P+Q'i.jLi.h... |
10a0 | b5 63 54 fb 84 8e 8d 2e 51 77 50 af 40 9f 6c 20 6d f0 dd f0 b6 51 86 b1 95 09 b3 c9 84 69 39 b2 | .cT.....QwP.@.l.m....Q.......i9. |
10c0 | 5f 28 9a 2f 5b dc b3 3c 68 65 63 cd 8a dc 27 ca 6c 28 b6 b2 b6 0b 76 cd f6 c9 0e c6 8e d4 8e 7d | _(./[..<hec...'.l(....v........} |
10e0 | 4e c7 9c 1d 5d d8 5c c6 5d 8b dd bc dd c5 dd 3f 7b dc f4 4c d9 65 b1 9b 75 f7 1b e4 1e 90 41 72 | N...].\.]......?{..L.e..u.....Ar |
1100 | f1 96 26 a3 c8 e3 3e d7 7d f3 fc 42 fc 2d 03 a4 28 34 94 4f 81 4f 82 ae 07 e7 87 c4 86 ba 86 69 | ..&...>.}..B.-..(4.O.O.........i |
1120 | 86 73 85 af ed 7d 15 d1 16 59 1e 95 19 4d 89 b1 8e 55 88 63 8d 5b 89 9f 4e 78 b8 af 21 b1 30 e9 | .s...}...Y...M...U.c.[..Nx..!.0. |
1140 | c0 fe f0 64 cf 14 f3 54 d5 34 a1 74 c6 0c 28 e3 eb 81 b7 99 33 07 67 0f 7d ce fa 96 fd 23 e7 d7 | ...d...T.4.t..(.....3.g.}....#.. |
1160 | e1 f5 a3 a8 5c 6c 1e fe 18 f1 38 fd 09 e6 93 6c a7 38 f3 79 4f 0b 9c 11 3e 2b 56 20 59 28 53 a4 | ....\l....8....l.8.yO...>+V.Y(S. |
1180 | 70 4e b9 58 ad 44 eb bc 4e a9 7e 99 65 39 f9 42 6a 45 c9 c5 d6 4b e3 97 97 ae b0 56 29 57 db d5 | pN.X.D..N.~.e9.BjE...K.....V)W.. |
11a0 | 84 d4 66 d7 5d ba da 51 3f d9 b0 7a 9d ed 86 d2 4d 9b c6 c0 a6 03 b7 4a 9b 5b 6e 8f b4 7c 6d 25 | ..f.]..Q?..z....M......J.[n..|m% |
11c0 | dc 15 bd a7 d7 b6 ab 7d df fd d3 1d b5 9d 5d 5d 2f ba 17 7a e8 1e ca 3d 72 ea 3d f0 b8 b5 1f fb | .......}......]]/..z...=r.=..... |
11e0 | c4 6b a0 7b c8 72 78 7a a4 68 2c 76 3c e1 f9 c5 57 f8 a9 ea 37 a7 df 0d 7c 8c fe 92 bb a0 b7 5c | .k.{.rxz.h,v<...W...7...|......\ |
1200 | bd e9 ff ed ff c3 6d 16 2c 92 9d 56 e8 22 1b 02 72 6e 38 94 01 50 de 82 e4 99 ea c8 f9 51 01 80 | ......m.,..V."..rn8..P.......Q.. |
1220 | 2d 11 00 47 0d 80 72 4c 00 d0 cb 26 00 b9 9d fd 7b 7e 40 48 e2 49 05 e8 91 8c 53 04 28 21 59 b1 | -..G..rL...&....{~@H.I....S.(!Y. |
1240 | 33 92 39 a7 21 b9 e4 0d 30 00 be 40 74 90 02 e4 08 25 20 39 e0 43 68 11 c5 85 32 40 05 a2 4e a0 | 3.9.!...0..@t....%.9.Ch...2@..N. |
1260 | 5a 51 1f 60 76 d8 14 8e 85 2b e1 e7 68 7a b4 09 3a 09 c9 c9 e6 91 3c 2c 00 c9 bd 66 b0 22 d8 00 | ZQ.`v....+..hz..:.....<,...f.".. |
1280 | 6c 15 f6 0b 4e 05 97 84 eb a2 a2 a7 f2 a4 aa a4 fa 89 37 c3 17 e1 bf 51 9b 53 97 51 af d1 b8 d3 | l...N.............7....Q.S.Q.... |
12a0 | 34 11 d8 09 09 84 97 44 23 62 35 2d 2b 6d 2a ed 17 3a 2f ba 41 7a 13 fa 3b 0c aa 0c f5 8c b2 8c | 4......D#b5-+m*..:/.Az..;....... |
12c0 | b5 4c 72 4c d7 98 35 98 db 59 2c 59 c6 58 fd 59 97 d8 f2 d8 25 d9 3b 39 bc 39 21 24 4a 0d b8 66 | .LrL..5..Y,Y.X.Y....%.;9.9!$J..f |
12e0 | b8 b3 79 e4 79 46 78 93 f9 c4 f9 86 f8 f7 0b 48 09 3c 13 3c 24 a4 21 f4 41 f8 9c 88 9d 28 4e b4 | ..y.yFx........H.<.<$.!.A....(N. |
1300 | 55 2c 46 5c 5e 7c 4e a2 52 d2 5f 4a 4c ea 83 74 8d 4c a4 ac 86 1c 4a ae 57 fe 8c 82 8f a2 92 12 | U,F\^|N.R._JL..t.L....J.W....... |
1320 | ac 34 ac 7c 51 25 41 d5 56 4d 54 6d 5d 7d 54 a3 41 f3 a8 56 d0 0e 0b 6d 49 1d 82 ce 67 dd 21 bd | .4.|Q%A.VMTm]}T.A..V...mI...g.!. |
1340 | 26 fd f3 06 59 86 51 46 7b 8c ad 4d 0c 4d 75 cc 34 cc 95 2d 14 2c e5 ad e4 ad 15 76 2a da a8 da | &...Y.QF{..M.Mu.4..-.,.....v*... |
1360 | 6a d9 e9 db 9b 3b 38 38 7a 39 85 38 27 b9 e4 b9 56 b8 b5 b8 8f 7a 2c ee 62 dd ad e9 45 de 73 94 | j....;88z9.8'...V....z,.b...E.s. |
1380 | d4 ea fd cd 47 dc 97 ec 77 de ff 15 85 37 90 1c 54 13 02 42 3d c2 ee ee 95 89 a8 88 92 8c be 1d | ....G...w....7..T..B=........... |
13a0 | eb 16 8f 4d b8 9f 98 b7 3f 38 c5 33 cd 23 c3 3f 33 e3 50 75 f6 8b 23 ec b9 ce c7 0a 4f 0c 9e 5a | ...M....?8.3.#.?3.Pu..#.....O..Z |
13c0 | 3a c3 5f 60 53 94 59 dc 51 4a 55 6e 57 51 76 e9 e7 15 87 ea 86 3a 96 fa c4 6b af 6f da 34 dd be | :._`S.Y.QJUnWQv......:...k.o.4.. |
13e0 | 2d 71 e7 ec 3d ea f6 c4 8e c5 ee fd 3d 1b bd 7b fb 06 07 84 86 48 4f 73 47 ab 9f dd 9a b8 fe a2 | -q..=.......=..{.....HOsG....... |
1400 | ec 55 ca 94 e3 6b de 37 af de 16 bc b7 99 dd f8 58 fd c9 f5 0b 7a be f6 9b eb 02 7a b1 fe 27 69 | .U...k.7........X....z.....z..'i |
1420 | 99 f9 57 cf 6a fa ba fe d6 fe 01 01 0c a0 01 cc 80 1f c8 01 7d c4 fb 21 e0 20 28 07 6d 60 1a c2 | ..W.j...............}..!..(.m`.. |
1440 | 40 52 90 3d 94 88 64 ff a3 28 2c 4a 01 c9 ed 73 50 cd a8 39 98 0f 76 84 73 e0 0e 78 1d ad 89 8e | @R.=..d..(,J...sP..9..v.s..x.... |
1460 | 45 37 a2 97 30 5a 98 64 4c 27 96 88 75 c6 96 21 5e d7 c6 1d c1 4d 52 29 53 65 51 4d e1 b5 f0 67 | E7..0Z.dL'..u..!^....MR)SeQM...g |
1480 | f1 cb d4 1e d4 f7 68 c4 68 72 69 7e 11 02 08 63 44 0b 62 2b ad 2a 6d 1d 9d 34 5d 15 bd 0c 7d 03 | ......h.hri~...cD.b+.*m..4]...}. |
14a0 | 83 26 43 07 a3 1d e3 14 53 24 33 15 73 29 8b 16 e2 ed 38 24 c3 7c c0 1e c3 21 c2 31 c6 79 84 cb | .&C.....S$3.s)....8$.|...!.1.y.. |
14c0 | 98 6b 9d fb 36 4f 02 af 16 ef 3a 5f 07 ff 61 01 67 41 21 c1 af 42 f7 85 f3 45 82 44 0d c5 78 c4 | .k..6O....:_..a.gA!..B...E.D..x. |
14e0 | 7e 89 3f 93 b8 2d 59 2c 15 2b 6d 23 23 29 8b 93 7d 2f d7 23 5f ab 70 52 31 49 89 a2 ec a2 62 aa | ~.?..-Y,.+m##)..}/.#_.pR1I....b. |
1500 | aa a1 26 ab 2e aa c1 af c9 ad c5 b9 83 4b 9b 4f 47 44 57 46 4f 4d df c8 c0 d1 d0 cf 28 c1 38 d7 | ..&..........K.OGDWFOM......(.8. |
1520 | 24 cf f4 a4 d9 19 f3 62 8b 4b 96 f5 56 ad d6 bd 3b 5f d8 7c b5 c3 d8 73 3b a8 39 da 39 85 3b e7 | $......b.K..V...;_.|...s;.9.9.;. |
1540 | b9 34 b8 8e b8 ad 79 88 79 da ed 4a de 5d e7 35 45 62 f1 b6 24 1f f0 b9 eb bb e2 af 15 90 48 b9 | .4....y.y..J.].5Eb..$.........H. |
1560 | 1b 84 0e b6 0a 39 15 3a 15 2e bf 37 35 62 28 4a 1c 39 91 26 e2 d4 e2 f3 13 96 12 3d 93 ee 27 4b | .....9.:...75b(J.9.&.......=..'K |
1580 | a7 9c 49 c3 a6 c7 66 7c cc 24 1d 7c 96 e5 98 3d 70 d8 f6 c8 70 ae 5b de e4 71 ca 49 ed 7c d1 33 | ..I...f|.$.|...=p...p.[..q.I.|.3 |
15a0 | 4c 05 70 e1 f2 b9 6f 25 5f 4a bf 95 2f 5f 44 5f 66 b9 22 59 6d 54 eb 73 f5 60 c3 d5 eb af 1a 19 | L.p...o%_J../_D_f."YmT.s.`...... |
15c0 | 6e 99 dd ce b8 d3 79 8f a6 dd b1 a3 b8 eb 55 0f eb 23 e3 c7 01 fd 49 03 19 43 c9 4f 03 46 0d 9f | n.....y.......U..#....I..C.O.F.. |
15e0 | 11 c7 7b 9e 47 bf 64 7e 55 36 25 3c 5d f8 06 37 e3 f7 b6 f5 3d 71 d6 e1 c3 a9 8f 7d 9f d0 9f 55 | ..{.G.d~U6%<]..7....=q.....}...U |
1600 | bf 78 cf 1f fe 7a f5 db f0 f7 ef 8b 8c 3f 64 7e 9a 2e 91 96 f7 fd 3a be 52 b9 7a 77 6d 64 fd c3 | .x...z.......?d~......:.R.zwmd.. |
1620 | 96 ff 51 c8 ea 67 04 02 c8 da b7 00 3e c8 ca 2f 03 5d 60 0e 62 81 f4 a1 70 a8 0c 1a 41 11 50 ba | ..Q..g......>../.]`.b...p...A.P. |
1640 | a8 68 54 0d ea 3d 2c 0a fb c2 97 e1 39 b4 12 3a 11 fd 00 c3 8a f1 c3 dc c2 d2 62 7d b1 77 71 5c | .hT..=,.....9..:..........b}.wq\ |
1660 | b8 04 e4 ce a9 43 75 01 4f c4 ef c3 7f a6 26 53 3f a7 71 a5 19 25 78 10 a6 89 21 c4 55 da 3c 3a | .highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long *//* ppa.c -- low level driver for the IOMEGA PPA3
* parallel port SCSI host adapter.
*
* (The PPA3 is the embedded controller in the ZIP drive.)
*
* (c) 1995,1996 Grant R. Guenther, grant@torque.net,
* under the terms of the GNU General Public License.
*
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/blkdev.h>
#include <linux/parport.h>
#include <linux/workqueue.h>
#include <linux/delay.h>
#include <linux/jiffies.h>
#include <asm/io.h>
#include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
static void ppa_reset_pulse(unsigned int base);
typedef struct {
struct pardevice *dev; /* Parport device entry */
int base; /* Actual port address */
int mode; /* Transfer mode */
struct scsi_cmnd *cur_cmd; /* Current queued command */
struct delayed_work ppa_tq; /* Polling interrupt stuff */
unsigned long jstart; /* Jiffies at start */
unsigned long recon_tmo; /* How many usecs to wait for reconnection (6th bit) */
unsigned int failed:1; /* Failure flag */
unsigned wanted:1; /* Parport sharing busy flag */
wait_queue_head_t *waiting;
struct Scsi_Host *host;
struct list_head list;
} ppa_struct;
#include "ppa.h"
static inline ppa_struct *ppa_dev(struct Scsi_Host *host)
{
return *(ppa_struct **)&host->hostdata;
}
static DEFINE_SPINLOCK(arbitration_lock);
static void got_it(ppa_struct *dev)
{
dev->base = dev->dev->port->base;
if (dev->cur_cmd)
dev->cur_cmd->SCp.phase = 1;
else
wake_up(dev->waiting);
}
static void ppa_wakeup(void *ref)
{
ppa_struct *dev = (ppa_struct *) ref;
unsigned long flags;
spin_lock_irqsave(&arbitration_lock, flags);
if (dev->wanted) {
parport_claim(dev->dev);
got_it(dev);
dev->wanted = 0;
}
spin_unlock_irqrestore(&arbitration_lock, flags);
return;
}
static int ppa_pb_claim(ppa_struct *dev)
{
unsigned long flags;
int res = 1;
spin_lock_irqsave(&arbitration_lock, flags);
if (parport_claim(dev->dev) == 0) {
got_it(dev);
res = 0;
}
dev->wanted = res;
spin_unlock_irqrestore(&arbitration_lock, flags);
return res;
}
static void ppa_pb_dismiss(ppa_struct *dev)
{
unsigned long flags;
int wanted;
spin_lock_irqsave(&arbitration_lock, flags);
wanted = dev->wanted;
dev->wanted = 0;
spin_unlock_irqrestore(&arbitration_lock, flags);
if (!wanted)
parport_release(dev->dev);
}
static inline void ppa_pb_release(ppa_struct *dev)
{
parport_release(dev->dev);
}
/*
* Start of Chipset kludges
*/
/* This is to give the ppa driver a way to modify the timings (and other
* parameters) by writing to the /proc/scsi/ppa/0 file.
* Very simple method really... (To simple, no error checking :( )
* Reason: Kernel hackers HATE having to unload and reload modules for
* testing...
* Also gives a method to use a script to obtain optimum timings (TODO)
*/
static inline int ppa_write_info(struct Scsi_Host *host, char *buffer, int length)
{
ppa_struct *dev = ppa_dev(host);
unsigned long x;
if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) {
x = simple_strtoul(buffer + 5, NULL, 0);
dev->mode = x;
return length;
}
if ((length > 10) && (strncmp(buffer, "recon_tmo=", 10) == 0)) {
x = simple_strtoul(buffer + 10, NULL, 0);
dev->recon_tmo = x;
printk(KERN_INFO "ppa: recon_tmo set to %ld\n", x);
return length;
}
printk(KERN_WARNING "ppa /proc: invalid variable\n");
return -EINVAL;
}
static int ppa_show_info(struct seq_file *m, struct Scsi_Host *host)
{
ppa_struct *dev = ppa_dev(host);
seq_printf(m, "Version : %s\n", PPA_VERSION);
seq_printf(m, "Parport : %s\n", dev->dev->port->name);
seq_printf(m, "Mode : %s\n", PPA_MODE_STRING[dev->mode]);
#if PPA_DEBUG > 0
seq_printf(m, "recon_tmo : %lu\n", dev->recon_tmo);
#endif
return 0;
}
static int device_check(ppa_struct *dev);
#if PPA_DEBUG > 0
#define ppa_fail(x,y) printk("ppa: ppa_fail(%i) from %s at line %d\n",\
y, __func__, __LINE__); ppa_fail_func(x,y);
static inline void ppa_fail_func(ppa_struct *dev, int error_code)
#else
static inline void ppa_fail(ppa_struct *dev, int error_code)
#endif
{
/* If we fail a device then we trash status / message bytes */
if (dev->cur_cmd) {
dev->cur_cmd->result = error_code << 16;
dev->failed = 1;
}
}
/*
* Wait for the high bit to be set.
*
* In principle, this could be tied to an interrupt, but the adapter
* doesn't appear to be designed to support interrupts. We spin on
* the 0x80 ready bit.
*/
static unsigned char ppa_wait(ppa_struct *dev)
{
int k;
unsigned short ppb = dev->base;
unsigned char r;
k = PPA_SPIN_TMO;
/* Wait for bit 6 and 7 - PJC */
for (r = r_str(ppb); ((r & 0xc0) != 0xc0) && (k); k--) {
udelay(1);
r = r_str(ppb);
}
/*
* return some status information.
* Semantics: 0xc0 = ZIP wants more data
* 0xd0 = ZIP wants to send more data
* 0xe0 = ZIP is expecting SCSI command data
* 0xf0 = end of transfer, ZIP is sending status
*/
if (k)
return (r & 0xf0);
/* Counter expired - Time out occurred */
ppa_fail(dev, DID_TIME_OUT);
printk(KERN_WARNING "ppa timeout in ppa_wait\n");
return 0; /* command timed out */
}
/*
* Clear EPP Timeout Bit
*/
static inline void epp_reset(unsigned short ppb)
{
int i;
i = r_str(ppb);
w_str(ppb, i);
w_str(ppb, i & 0xfe);
}
/*
* Wait for empty ECP fifo (if we are in ECP fifo mode only)
*/
static inline void ecp_sync(ppa_struct *dev)
{
int i, ppb_hi = dev->dev->port->base_hi;
if (ppb_hi == 0)
return;
if ((r_ecr(ppb_hi) & 0xe0) == 0x60) { /* mode 011 == ECP fifo mode */
for (i = 0; i < 100; i++) {
if (r_ecr(ppb_hi) & 0x01)
return;
udelay(5);
}
printk(KERN_WARNING "ppa: ECP sync failed as data still present in FIFO.\n");
}
}
static int ppa_byte_out(unsigned short base, const char *buffer, int len)
{
int i;
for (i = len; i; i--) {
w_dtr(base, *buffer++);
w_ctr(base, 0xe);
w_ctr(base, 0xc);
}
return 1; /* All went well - we hope! */
}
static int ppa_byte_in(unsigned short base, char *buffer, int len)
{
int i;
for (i = len; i; i--) {
*buffer++ = r_dtr(base);
w_ctr(base, 0x27);
w_ctr(base, 0x25);
}
return 1; /* All went well - we hope! */
}
static int ppa_nibble_in(unsigned short base, char *buffer, int len)
{
for (; len; len--) {
unsigned char h;
w_ctr(base, 0x4);
h = r_str(base) & 0xf0;
w_ctr(base, 0x6);
*buffer++ = h | ((r_str(base) & 0xf0) >> 4);
}
return 1; /* All went well - we hope! */
}
static int ppa_out(ppa_struct *dev, char *buffer, int len)
{
int r;
unsigned short ppb = dev->base;
r = ppa_wait(dev);
if ((r & 0x50) != 0x40) {
ppa_fail(dev, DID_ERROR);
return 0;
}
switch (dev->mode) {
case PPA_NIBBLE:
case PPA_PS2:
/* 8 bit output, with a loop */
r = ppa_byte_out(ppb, buffer, len);
break;
case PPA_EPP_32:
case PPA_EPP_16:
case PPA_EPP_8:
epp_reset(ppb);
w_ctr(ppb, 0x4);
#ifdef CONFIG_SCSI_IZIP_EPP16
if (!(((long) buffer | len) & 0x01))
outsw(ppb + 4, buffer, len >> 1);
#else
if (!(((long) buffer | len) & 0x03))
outsl(ppb + 4, buffer, len >> 2);
#endif
else
outsb(ppb + 4, buffer, len);
w_ctr(ppb, 0xc);
r = !(r_str(ppb) & 0x01);
w_ctr(ppb, 0xc);
ecp_sync(dev);
break;
default:
printk(KERN_ERR "PPA: bug in ppa_out()\n");
r = 0;
}
return r;
}
static int ppa_in(ppa_struct *dev, char *buffer, int len)
{
int r;
unsigned short ppb = dev->base;
r = ppa_wait(dev);
if ((r & 0x50) != 0x50) {
ppa_fail(dev, DID_ERROR);
return 0;
}
switch (dev->mode) {
case PPA_NIBBLE:
/* 4 bit input, with a loop */
r = ppa_nibble_in(ppb, buffer, len);
w_ctr(ppb, 0xc);
break;
case PPA_PS2:
/* 8 bit input, with a loop */
w_ctr(ppb, 0x25);
r = ppa_byte_in(ppb, buffer, len);
w_ctr(ppb, 0x4);
w_ctr(ppb, 0xc);
break;
case PPA_EPP_32:
case PPA_EPP_16:
case PPA_EPP_8:
epp_reset(ppb);
w_ctr(ppb, 0x24);
#ifdef CONFIG_SCSI_IZIP_EPP16
if (!(((long) buffer | len) & 0x01))
insw(ppb + 4, buffer, len >> 1);
#else
if (!(((long) buffer | len) & 0x03))
insl(ppb + 4, buffer, len >> 2);
#endif
else
insb(ppb + 4, buffer, len);
w_ctr(ppb, 0x2c);
r = !(r_str(ppb) & 0x01);
w_ctr(ppb, 0x2c);
ecp_sync(dev);
break;
default:
printk(KERN_ERR "PPA: bug in ppa_ins()\n");
r = 0;
break;
}
return r;
}
/* end of ppa_io.h */
static inline void ppa_d_pulse(unsigned short ppb, unsigned char b)
{
w_dtr(ppb, b);
w_ctr(ppb, 0xc);
w_ctr(ppb, 0xe);
w_ctr(ppb, 0xc);
w_ctr(ppb, 0x4);
w_ctr(ppb, 0xc);
}
static void ppa_disconnect(ppa_struct *dev)
{
unsigned short ppb = dev->base;
ppa_d_pulse(ppb, 0);
ppa_d_pulse(ppb, 0x3c);
ppa_d_pulse(ppb, 0x20);
ppa_d_pulse(ppb, 0xf);
}
static inline void ppa_c_pulse(unsigned short ppb, unsigned char b)
{
w_dtr(ppb, b);
w_ctr(ppb, 0x4);
w_ctr(ppb, 0x6);
w_ctr(ppb, 0x4);
w_ctr(ppb, 0xc);
}
static inline void ppa_connect(ppa_struct *dev, int flag)
{
unsigned short ppb = dev->base;
ppa_c_pulse(ppb, 0);
ppa_c_pulse(ppb, 0x3c);
ppa_c_pulse(ppb, 0x20);
if ((flag == CONNECT_EPP_MAYBE) && IN_EPP_MODE(dev->mode))
ppa_c_pulse(ppb, 0xcf);
else
ppa_c_pulse(ppb, 0x8f);
}
static int ppa_select(ppa_struct *dev, int target)
{
int k;
unsigned short ppb = dev->base;
/*
* Bit 6 (0x40) is the device selected bit.
* First we must wait till the current device goes off line...
*/
k = PPA_SELECT_TMO;
do {
k--;
udelay(1);
} while ((r_str(ppb) & 0x40) && (k));
if (!k)
return 0;
w_dtr(ppb, (1 << target));
w_ctr(ppb, 0xe);
w_ctr(ppb, 0xc);
w_dtr(ppb, 0x80); /* This is NOT the initator */
w_ctr(ppb, 0x8);
k = PPA_SELECT_TMO;
do {
k--;
udelay(1);
}
while (!(r_str(ppb) & 0x40) && (k));
if (!k)
return 0;
return 1;
}
/*
* This is based on a trace of what the Iomega DOS 'guest' driver does.
* I've tried several different kinds of parallel ports with guest and
* coded this to react in the same ways that it does.
*
* The return value from this function is just a hint about where the
* handshaking failed.
*
*/
static int ppa_init(ppa_struct *dev)
{
int retv;
unsigned short ppb = dev->base;
ppa_disconnect(dev);
ppa_connect(dev, CONNECT_NORMAL);
retv = 2; /* Failed */
w_ctr(ppb, 0xe);
if ((r_str(ppb) & 0x08) == 0x08)
retv--;
w_ctr(ppb, 0xc);
if ((r_str(ppb) & 0x08) == 0x00)
retv--;
if (!retv)
ppa_reset_pulse(ppb);
udelay(1000); /* Allow devices to settle down */
ppa_disconnect(dev);
udelay(1000); /* Another delay to allow devices to settle */
if (retv)
return -EIO;
return device_check(dev);
}
static inline int ppa_send_command(struct scsi_cmnd *cmd)
{
ppa_struct *dev = ppa_dev(cmd->device->host);
int k;
w_ctr(dev->base, 0x0c);
for (k = 0; k < cmd->cmd_len; k++)
if (!ppa_out(dev, &cmd->cmnd[k], 1))
return 0;
return 1;
}
/*
* The bulk flag enables some optimisations in the data transfer loops,
* it should be true for any command that transfers data in integral
* numbers of sectors.
*
* The driver appears to remain stable if we speed up the parallel port
* i/o in this function, but not elsewhere.
*/
static int ppa_completion(struct scsi_cmnd *cmd)
{
/* Return codes:
* -1 Error
* 0 Told to schedule
* 1 Finished data transfer
*/
ppa_struct *dev = ppa_dev(cmd->device->host);
unsigned short ppb = dev->base;
unsigned long start_jiffies = jiffies;
unsigned char r, v;
int fast, bulk, status;
v = cmd->cmnd[0];
bulk = ((v == READ_6) ||
(v == READ_10) || (v == WRITE_6) || (v == WRITE_10));
/*
* We only get here if the drive is ready to comunicate,
* hence no need for a full ppa_wait.
*/
r = (r_str(ppb) & 0xf0);
while (r != (unsigned char) 0xf0) {
/*
* If we have been running for more than a full timer tick
* then take a rest.
*/
if (time_after(jiffies, start_jiffies + 1))
return 0;
if ((cmd->SCp.this_residual <= 0)) {
ppa_fail(dev, DID_ERROR);
return -1; /* ERROR_RETURN */
}
/* On some hardware we have SCSI disconnected (6th bit low)
* for about 100usecs. It is too expensive to wait a
* tick on every loop so we busy wait for no more than
* 500usecs to give the drive a chance first. We do not
* change things for "normal" hardware since generally
* the 6th bit is always high.
* This makes the CPU load higher on some hardware
* but otherwise we can not get more than 50K/secs
* on this problem hardware.
*/
if ((r & 0xc0) != 0xc0) {
/* Wait for reconnection should be no more than
* jiffy/2 = 5ms = 5000 loops
*/
unsigned long k = dev->recon_tmo;
for (; k && ((r = (r_str(ppb) & 0xf0)) & 0xc0) != 0xc0;
k--)
udelay(1);
if (!k)
return 0;
}
/* determine if we should use burst I/O */
fast = (bulk && (cmd->SCp.this_residual >= PPA_BURST_SIZE))
? PPA_BURST_SIZE : 1;
if (r == (unsigned char) 0xc0)
status = ppa_out(dev, cmd->SCp.ptr, fast);
else
status = ppa_in(dev, cmd->SCp.ptr, fast);
cmd->SCp.ptr += fast;
cmd->SCp.this_residual -= fast;
if (!status) {
ppa_fail(dev, DID_BUS_BUSY);
return -1; /* ERROR_RETURN */
}
if (cmd->SCp.buffer && !cmd->SCp.this_residual) {
/* if scatter/gather, advance to the next segment */
if (cmd->SCp.buffers_residual--) {
cmd->SCp.buffer++;
cmd->SCp.this_residual =
cmd->SCp.buffer->length;
cmd->SCp.ptr = sg_virt(cmd->SCp.buffer);
}
}
/* Now check to see if the drive is ready to comunicate */
r = (r_str(ppb) & 0xf0);
/* If not, drop back down to the scheduler and wait a timer tick */
if (!(r & 0x80))
return 0;
}
return 1; /* FINISH_RETURN */
}
/*
* Since the PPA itself doesn't generate interrupts, we use
* the scheduler's task queue to generate a stream of call-backs and
* complete the request when the drive is ready.
*/
static void ppa_interrupt(struct work_struct *work)
{
ppa_struct *dev = container_of(work, ppa_struct, ppa_tq.work);
struct scsi_cmnd *cmd = dev->cur_cmd;
if (!cmd) {
printk(KERN_ERR "PPA: bug in ppa_interrupt\n");
return;
}
if (ppa_engine(dev, cmd)) {
schedule_delayed_work(&dev->ppa_tq, 1);
return;
}
/* Command must of completed hence it is safe to let go... */
#if PPA_DEBUG > 0
switch ((cmd->result >> 16) & 0xff) {
case DID_OK:
break;
case DID_NO_CONNECT:
printk(KERN_DEBUG "ppa: no device at SCSI ID %i\n", cmd->device->target);
break;
case DID_BUS_BUSY:
printk(KERN_DEBUG "ppa: BUS BUSY - EPP timeout detected\n");
break;
case DID_TIME_OUT:
printk(KERN_DEBUG "ppa: unknown timeout\n");
break;
case DID_ABORT:
printk(KERN_DEBUG "ppa: told to abort\n");
break;
case DID_PARITY:
printk(KERN_DEBUG "ppa: parity error (???)\n");
break;
case DID_ERROR:
printk(KERN_DEBUG "ppa: internal driver error\n");
break;
case DID_RESET:
printk(KERN_DEBUG "ppa: told to reset device\n");
break;
case DID_BAD_INTR:
printk(KERN_WARNING "ppa: bad interrupt (???)\n");
break;
default:
printk(KERN_WARNING "ppa: bad return code (%02x)\n",
(cmd->result >> 16) & 0xff);
}
#endif
if (cmd->SCp.phase > 1)
ppa_disconnect(dev);
ppa_pb_dismiss(dev);
dev->cur_cmd = NULL;
cmd->scsi_done(cmd);
}
static int ppa_engine(ppa_struct *dev, struct scsi_cmnd *cmd)
{
unsigned short ppb = dev->base;
unsigned char l = 0, h = 0;
int retv;
/* First check for any errors that may of occurred
* Here we check for internal errors
*/
if (dev->failed)
return 0;
switch (cmd->SCp.phase) {
case 0: /* Phase 0 - Waiting for parport */
if (time_after(jiffies, dev->jstart + HZ)) {
/*
* We waited more than a second
* for parport to call us
*/
ppa_fail(dev, DID_BUS_BUSY);
return 0;
}
return 1; /* wait until ppa_wakeup claims parport */
case 1: /* Phase 1 - Connected */
{ /* Perform a sanity check for cable unplugged */
int retv = 2; /* Failed */
ppa_connect(dev, CONNECT_EPP_MAYBE);
w_ctr(ppb, 0xe);
if ((r_str(ppb) & 0x08) == 0x08)
retv--;
w_ctr(ppb, 0xc);
if ((r_str(ppb) & 0x08) == 0x00)
retv--;
if (retv) {
if (time_after(jiffies, dev->jstart + (1 * HZ))) {
printk(KERN_ERR "ppa: Parallel port cable is unplugged.\n");
ppa_fail(dev, DID_BUS_BUSY);
return 0;
} else {
ppa_disconnect(dev);
return 1; /* Try again in a jiffy */
}
}
cmd->SCp.phase++;
}
case 2: /* Phase 2 - We are now talking to the scsi bus */
if (!ppa_select(dev, scmd_id(cmd))) {
ppa_fail(dev, DID_NO_CONNECT);
return 0;
}
cmd->SCp.phase++;
case 3: /* Phase 3 - Ready to accept a command */
w_ctr(ppb, 0x0c);
if (!(r_str(ppb) & 0x80))
return 1;
if (!ppa_send_command(cmd))
return 0;
cmd->SCp.phase++;
case 4: /* Phase 4 - Setup scatter/gather buffers */
if (scsi_bufflen(cmd)) {
cmd->SCp.buffer = scsi_sglist(cmd);
cmd->SCp.this_residual = cmd->SCp.buffer->length;
cmd->SCp.ptr = sg_virt(cmd->SCp.buffer);
} else {
cmd->SCp.buffer = NULL;
cmd->SCp.this_residual = 0;
cmd->SCp.ptr = NULL;
}
cmd->SCp.buffers_residual = scsi_sg_count(cmd) - 1;
cmd->SCp.phase++;
case 5: /* Phase 5 - Data transfer stage */
w_ctr(ppb, 0x0c);
if (!(r_str(ppb) & 0x80))
return 1;
retv = ppa_completion(cmd);
if (retv == -1)
return 0;
if (retv == 0)
return 1;
cmd->SCp.phase++;
case 6: /* Phase 6 - Read status/message */
cmd->result = DID_OK << 16;
/* Check for data overrun */
if (ppa_wait(dev) != (unsigned char) 0xf0) {
ppa_fail(dev, DID_ERROR);
return 0;
}
if (ppa_in(dev, &l, 1)) { /* read status byte */
/* Check for optional message byte */
if (ppa_wait(dev) == (unsigned char) 0xf0)
ppa_in(dev, &h, 1);
cmd->result =
(DID_OK << 16) + (h << 8) + (l & STATUS_MASK);
}
return 0; /* Finished */
break;
default:
printk(KERN_ERR "ppa: Invalid scsi phase\n");
}
return 0;
}
static int ppa_queuecommand_lck(struct scsi_cmnd *cmd,
void (*done) (struct scsi_cmnd *))
{
ppa_struct *dev = ppa_dev(cmd->device->host);
if (dev->cur_cmd) {
printk(KERN_ERR "PPA: bug in ppa_queuecommand\n");
return 0;
}
dev->failed = 0;
dev->jstart = jiffies;
dev->cur_cmd = cmd;
cmd->scsi_done = done;
cmd->result = DID_ERROR << 16; /* default return code */
cmd->SCp.phase = 0; /* bus free */
schedule_delayed_work(&dev->ppa_tq, 0);
ppa_pb_claim(dev);
return 0;
}
static DEF_SCSI_QCMD(ppa_queuecommand)
/*
* Apparently the disk->capacity attribute is off by 1 sector
* for all disk drives. We add the one here, but it should really
* be done in sd.c. Even if it gets fixed there, this will still
* work.
*/
static int ppa_biosparam(struct scsi_device *sdev, struct block_device *dev,
sector_t capacity, int ip[])
{
ip[0] = 0x40;
ip[1] = 0x20;
ip[2] = ((unsigned long) capacity + 1) / (ip[0] * ip[1]);
if (ip[2] > 1024) {
ip[0] = 0xff;
ip[1] = 0x3f;
ip[2] = ((unsigned long) capacity + 1) / (ip[0] * ip[1]);
if (ip[2] > 1023)
ip[2] = 1023;
}
return 0;
}
static int ppa_abort(struct scsi_cmnd *cmd)
{
ppa_struct *dev = ppa_dev(cmd->device->host);
/*
* There is no method for aborting commands since Iomega
* have tied the SCSI_MESSAGE line high in the interface
*/
switch (cmd->SCp.phase) {
case 0: /* Do not have access to parport */
case 1: /* Have not connected to interface */
dev->cur_cmd = NULL; /* Forget the problem */
return SUCCESS;
break;
default: /* SCSI command sent, can not abort */
return FAILED;
break;
}
}
static void ppa_reset_pulse(unsigned int base)
{
w_dtr(base, 0x40);
w_ctr(base, 0x8);
udelay(30);
w_ctr(base, 0xc);
}
static int ppa_reset(struct scsi_cmnd *cmd)
{
ppa_struct *dev = ppa_dev(cmd->device->host);
if (cmd->SCp.phase)
ppa_disconnect(dev);
dev->cur_cmd = NULL; /* Forget the problem */
ppa_connect(dev, CONNECT_NORMAL);
ppa_reset_pulse(dev->base);
mdelay(1); /* device settle delay */
ppa_disconnect(dev);
mdelay(1); /* device settle delay */
return SUCCESS;
}
static int device_check(ppa_struct *dev)
{
/* This routine looks for a device and then attempts to use EPP
to send a command. If all goes as planned then EPP is available. */
static u8 cmd[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
int loop, old_mode, status, k, ppb = dev->base;
unsigned char l;
old_mode = dev->mode;
for (loop = 0; loop < 8; loop++) {
/* Attempt to use EPP for Test Unit Ready */
if ((ppb & 0x0007) == 0x0000)
dev->mode = PPA_EPP_32;
second_pass:
ppa_connect(dev, CONNECT_EPP_MAYBE);
/* Select SCSI device */
if (!ppa_select(dev, loop)) {
ppa_disconnect(dev);
continue;
}
printk(KERN_INFO "ppa: Found device at ID %i, Attempting to use %s\n",
loop, PPA_MODE_STRING[dev->mode]);
/* Send SCSI command */
status = 1;
w_ctr(ppb, 0x0c);
for (l = 0; (l < 6) && (status); l++)
status = ppa_out(dev, cmd, 1);
if (!status) {
ppa_disconnect(dev);
ppa_connect(dev, CONNECT_EPP_MAYBE);
w_dtr(ppb, 0x40);
w_ctr(ppb, 0x08);
udelay(30);
w_ctr(ppb, 0x0c);
udelay(1000);
ppa_disconnect(dev);
udelay(1000);
if (dev->mode == PPA_EPP_32) {
dev->mode = old_mode;
goto second_pass;
}
return -EIO;
}
w_ctr(ppb, 0x0c);
k = 1000000; /* 1 Second */
do {
l = r_str(ppb);
k--;
udelay(1);
} while (!(l & 0x80) && (k));
l &= 0xf0;
if (l != 0xf0) {
ppa_disconnect(dev);
ppa_connect(dev, CONNECT_EPP_MAYBE);
ppa_reset_pulse(ppb);
udelay(1000);
ppa_disconnect(dev);
udelay(1000);
if (dev->mode == PPA_EPP_32) {
dev->mode = old_mode;
goto second_pass;
}
return -EIO;
}
ppa_disconnect(dev);
printk(KERN_INFO "ppa: Communication established with ID %i using %s\n",
loop, PPA_MODE_STRING[dev->mode]);
ppa_connect(dev, CONNECT_EPP_MAYBE);
ppa_reset_pulse(ppb);
udelay(1000);
ppa_disconnect(dev);
udelay(1000);
return 0;
}
return -ENODEV;
}
static int ppa_adjust_queue(struct scsi_device *device)
{
blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_HIGH);
return 0;
}
static struct scsi_host_template ppa_template = {
.module = THIS_MODULE,
.proc_name = "ppa",
.show_info = ppa_show_info,
.write_info = ppa_write_info,
.name = "Iomega VPI0 (ppa) interface",
.queuecommand = ppa_queuecommand,
.eh_abort_handler = ppa_abort,
.eh_bus_reset_handler = ppa_reset,
.eh_host_reset_handler = ppa_reset,
.bios_param = ppa_biosparam,
.this_id = -1,
.sg_tablesize = SG_ALL,
.use_clustering = ENABLE_CLUSTERING,
.can_queue = 1,
.slave_alloc = ppa_adjust_queue,
};
/***************************************************************************
* Parallel port probing routines *
***************************************************************************/
static LIST_HEAD(ppa_hosts);
static int __ppa_attach(struct parport *pb)
{
struct Scsi_Host *host;
DECLARE_WAIT_QUEUE_HEAD_ONSTACK(waiting);
DEFINE_WAIT(wait);
ppa_struct *dev;
int ports;
int modes, ppb, ppb_hi;
int err = -ENOMEM;
dev = kzalloc(sizeof(ppa_struct), GFP_KERNEL);
if (!dev)
return -ENOMEM;
dev->base = -1;
dev->mode = PPA_AUTODETECT;
dev->recon_tmo = PPA_RECON_TMO;
init_waitqueue_head(&waiting);
dev->dev = parport_register_device(pb, "ppa", NULL, ppa_wakeup,
NULL, 0, dev);
if (!dev->dev)
goto out;
/* Claim the bus so it remembers what we do to the control
* registers. [ CTR and ECP ]
*/
err = -EBUSY;
dev->waiting = &waiting;
prepare_to_wait(&waiting, &wait, TASK_UNINTERRUPTIBLE);
if (ppa_pb_claim(dev))
schedule_timeout(3 * HZ);
if (dev->wanted) {
printk(KERN_ERR "ppa%d: failed to claim parport because "
"a pardevice is owning the port for too long "
"time!\n", pb->number);
ppa_pb_dismiss(dev);
dev->waiting = NULL;
finish_wait(&waiting, &wait);
goto out1;
}
dev->waiting = NULL;
finish_wait(&waiting, &wait);
ppb = dev->base = dev->dev->port->base;
ppb_hi = dev->dev->port->base_hi;
w_ctr(ppb, 0x0c);
modes = dev->dev->port->modes;
/* Mode detection works up the chain of speed
* This avoids a nasty if-then-else-if-... tree
*/
dev->mode = PPA_NIBBLE;
if (modes & PARPORT_MODE_TRISTATE)
dev->mode = PPA_PS2;
if (modes & PARPORT_MODE_ECP) {
w_ecr(ppb_hi, 0x20);
dev->mode = PPA_PS2;
}
if ((modes & PARPORT_MODE_EPP) && (modes & PARPORT_MODE_ECP))
w_ecr(ppb_hi, 0x80);
/* Done configuration */
err = ppa_init(dev);
ppa_pb_release(dev);
if (err)
goto out1;
/* now the glue ... */
if (dev->mode == PPA_NIBBLE || dev->mode == PPA_PS2)
ports = 3;
else
ports = 8;
INIT_DELAYED_WORK(&dev->ppa_tq, ppa_interrupt);
err = -ENOMEM;
host = scsi_host_alloc(&ppa_template, sizeof(ppa_struct *));
if (!host)
goto out1;
host->io_port = pb->base;
host->n_io_port = ports;
host->dma_channel = -1;
host->unique_id = pb->number;
*(ppa_struct **)&host->hostdata = dev;
dev->host = host;
list_add_tail(&dev->list, &ppa_hosts);
err = scsi_add_host(host, NULL);
if (err)
goto out2;
scsi_scan_host(host);
return 0;
out2:
list_del_init(&dev->list);
scsi_host_put(host);
out1:
parport_unregister_device(dev->dev);
out:
kfree(dev);
return err;
}
static void ppa_attach(struct parport *pb)
{
__ppa_attach(pb);
}
static void ppa_detach(struct parport *pb)
{
ppa_struct *dev;
list_for_each_entry(dev, &ppa_hosts, list) {
if (dev->dev->port == pb) {
list_del_init(&dev->list);
scsi_remove_host(dev->host);
scsi_host_put(dev->host);
parport_unregister_device(dev->dev);
kfree(dev);
break;
}
}
}
static struct parport_driver ppa_driver = {
.name = "ppa",
.attach = ppa_attach,
.detach = ppa_detach,
};
static int __init ppa_driver_init(void)
{
printk(KERN_INFO "ppa: Version %s\n", PPA_VERSION);
return parport_register_driver(&ppa_driver);
}
static void __exit ppa_driver_exit(void)
{
parport_unregister_driver(&ppa_driver);
}
module_init(ppa_driver_init);
module_exit(ppa_driver_exit);
MODULE_LICENSE("GPL");
|