ocaml-http_0.1.5/0000755000175000017500000000000011507242147013142 5ustar celticcelticocaml-http_0.1.5/mt/0000755000175000017500000000000011507242065013561 5ustar celticcelticocaml-http_0.1.5/mt/http_threaded_tcp_server.ml0000644000175000017500000000156711457270246021205 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) let serve callback arg = ignore (Thread.create callback arg) ocaml-http_0.1.5/mt/.gitignore0000644000175000017500000000003511457546371015562 0ustar celticceltichttp_threaded_tcp_server.mli ocaml-http_0.1.5/doc/0000755000175000017500000000000011507235561013711 5ustar celticcelticocaml-http_0.1.5/doc/dot/0000755000175000017500000000000011507240335014472 5ustar celticcelticocaml-http_0.1.5/doc/dot/ocaml-http.ps0000644000175000017500000006125111507240335017113 0ustar celticceltic%!PS-Adobe-3.0 %%Creator: graphviz version 2.26.3 (20100126.1600) %%Title: G %%Pages: (atend) %%BoundingBox: (atend) %%EndComments save %%BeginProlog /DotDict 200 dict def DotDict begin /setupLatin1 { mark /EncodingVector 256 array def EncodingVector 0 ISOLatin1Encoding 0 255 getinterval putinterval EncodingVector 45 /hyphen put % Set up ISO Latin 1 character encoding /starnetISO { dup dup findfont dup length dict begin { 1 index /FID ne { def }{ pop pop } ifelse } forall /Encoding EncodingVector def currentdict end definefont } def /Times-Roman starnetISO def /Times-Italic starnetISO def /Times-Bold starnetISO def /Times-BoldItalic starnetISO def /Helvetica starnetISO def /Helvetica-Oblique starnetISO def /Helvetica-Bold starnetISO def /Helvetica-BoldOblique starnetISO def /Courier starnetISO def /Courier-Oblique starnetISO def /Courier-Bold starnetISO def /Courier-BoldOblique starnetISO def cleartomark } bind def %%BeginResource: procset graphviz 0 0 /coord-font-family /Times-Roman def /default-font-family /Times-Roman def /coordfont coord-font-family findfont 8 scalefont def /InvScaleFactor 1.0 def /set_scale { dup 1 exch div /InvScaleFactor exch def scale } bind def % styles /solid { [] 0 setdash } bind def /dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def /dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def /invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def /bold { 2 setlinewidth } bind def /filled { } bind def /unfilled { } bind def /rounded { } bind def /diagonals { } bind def % hooks for setting color /nodecolor { sethsbcolor } bind def /edgecolor { sethsbcolor } bind def /graphcolor { sethsbcolor } bind def /nopcolor {pop pop pop} bind def /beginpage { % i j npages /npages exch def /j exch def /i exch def /str 10 string def npages 1 gt { gsave coordfont setfont 0 0 moveto (\() show i str cvs show (,) show j str cvs show (\)) show grestore } if } bind def /set_font { findfont exch scalefont setfont } def % draw text fitted to its expected width /alignedtext { % width text /text exch def /width exch def gsave width 0 gt { [] 0 setdash text stringwidth pop width exch sub text length div 0 text ashow } if grestore } def /boxprim { % xcorner ycorner xsize ysize 4 2 roll moveto 2 copy exch 0 rlineto 0 exch rlineto pop neg 0 rlineto closepath } bind def /ellipse_path { /ry exch def /rx exch def /y exch def /x exch def matrix currentmatrix newpath x y translate rx ry scale 0 0 1 0 360 arc setmatrix } bind def /endpage { showpage } bind def /showpage { } def /layercolorseq [ % layer color sequence - darkest to lightest [0 0 0] [.2 .8 .8] [.4 .8 .8] [.6 .8 .8] [.8 .8 .8] ] def /layerlen layercolorseq length def /setlayer {/maxlayer exch def /curlayer exch def layercolorseq curlayer 1 sub layerlen mod get aload pop sethsbcolor /nodecolor {nopcolor} def /edgecolor {nopcolor} def /graphcolor {nopcolor} def } bind def /onlayer { curlayer ne {invis} if } def /onlayers { /myupper exch def /mylower exch def curlayer mylower lt curlayer myupper gt or {invis} if } def /curlayer 0 def %%EndResource %%EndProlog %%BeginSetup 14 default-font-family set_font 1 setmiterlimit % /arrowlength 10 def % /arrowwidth 5 def % make sure pdfmark is harmless for PS-interpreters other than Distiller /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse % make '<<' and '>>' safe on PS Level 1 devices /languagelevel where {pop languagelevel}{1} ifelse 2 lt { userdict (<<) cvn ([) cvn load put userdict (>>) cvn ([) cvn load put } if %%EndSetup setupLatin1 %%Page: 1 1 %%PageBoundingBox: 36 36 500 756 %%PageOrientation: Landscape 0 0 1 beginpage gsave 36 36 464 720 boxprim clip newpath 0.550502 0.550502 set_scale 90 rotate 69.3948 -904.895 translate % Cookie_lexer gsave 0.50196 1 0.81961 nodecolor 810.9 289 73.04 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 810.9 289 73.04 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 766.9 285.4 moveto 88 (Cookie_lexer) alignedtext grestore % Http_common gsave 0.50196 1 0.81961 nodecolor 375.9 289 79.9 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 375.9 289 79.9 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 327.4 285.4 moveto 97 (Http_common) alignedtext grestore % Http_constants gsave 0.50196 1 0.81961 nodecolor 634.9 161 85.77 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 634.9 161 85.77 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 581.9 157.4 moveto 106 (Http_constants) alignedtext grestore % Http_common->Http_constants gsave 1 setlinewidth 0 0 0 edgecolor newpath 410.02 272.13 moveto 456.58 249.13 540.03 207.89 591.13 182.63 curveto stroke 0 0 0 edgecolor newpath 592.87 185.68 moveto 600.28 178.11 lineto 589.77 179.4 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 592.87 185.68 moveto 600.28 178.11 lineto 589.77 179.4 lineto closepath stroke grestore % Http_types gsave 0.50196 1 0.81961 nodecolor 520.9 33 65.05 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 520.9 33 65.05 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 482.9 29.4 moveto 76 (Http_types) alignedtext grestore % Http_common->Http_types gsave 1 setlinewidth 0 0 0 edgecolor newpath 386.32 270.59 moveto 411.5 226.14 475.72 112.76 505.41 60.34 curveto stroke 0 0 0 edgecolor newpath 508.48 62.01 moveto 510.37 51.59 lineto 502.39 58.56 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 508.48 62.01 moveto 510.37 51.59 lineto 502.39 58.56 lineto closepath stroke grestore % Http_constants->Http_types gsave 1 setlinewidth 0 0 0 edgecolor newpath 618.56 142.66 moveto 599.01 120.7 566.13 83.79 543.98 58.92 curveto stroke 0 0 0 edgecolor newpath 546.46 56.45 moveto 537.2 51.31 lineto 541.24 61.1 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 546.46 56.45 moveto 537.2 51.31 lineto 541.24 61.1 lineto closepath stroke grestore % Http_daemon gsave 0.50196 1 0.81961 nodecolor 574.9 674 77.78 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 574.9 674 77.78 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 527.9 670.4 moveto 94 (Http_daemon) alignedtext grestore % Http_daemon->Http_common gsave 1 setlinewidth 0 0 0 edgecolor newpath 557.17 655.9 moveto 538.11 635.45 508.22 600.41 490.9 565 curveto 457.4 496.54 478.73 468.7 447.9 399 curveto 434.36 368.41 412.73 336.8 396.71 315.35 curveto stroke 0 0 0 edgecolor newpath 399.49 313.23 moveto 390.65 307.38 lineto 393.91 317.46 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 399.49 313.23 moveto 390.65 307.38 lineto 393.91 317.46 lineto closepath stroke grestore % Http_daemon->Http_constants gsave 1 setlinewidth 0 0 0 edgecolor newpath 600.15 656.35 moveto 665.15 609.11 837 472.14 892.9 308 curveto 920.51 226.91 803.57 189.15 718.1 172.64 curveto stroke 0 0 0 edgecolor newpath 718.58 169.17 moveto 708.11 170.78 lineto 717.3 176.05 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 718.58 169.17 moveto 708.11 170.78 lineto 717.3 176.05 lineto closepath stroke grestore % Http_daemon->Http_types gsave 1 setlinewidth 0 0 0 edgecolor newpath 500.26 668.4 moveto 375.28 657.36 132 628.13 77.9 565 curveto -45.36 421.17 -17.72 260.69 129.9 142 curveto 180.09 101.65 357.93 63.35 455.56 44.75 curveto stroke 0 0 0 edgecolor newpath 456.43 48.14 moveto 465.61 42.85 lineto 455.13 41.26 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 456.43 48.14 moveto 465.61 42.85 lineto 455.13 41.26 lineto closepath stroke grestore % Http_misc gsave 0.50196 1 0.81961 nodecolor 141.9 289 60.1 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 141.9 289 60.1 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 107.4 285.4 moveto 69 (Http_misc) alignedtext grestore % Http_daemon->Http_misc gsave 1 setlinewidth 0 0 0 edgecolor newpath 500.87 667.97 moveto 380.32 656.46 150.07 626.77 100.9 565 curveto 42.12 491.17 96.54 369.89 125.91 316.12 curveto stroke 0 0 0 edgecolor newpath 129.08 317.63 moveto 130.9 307.19 lineto 122.97 314.21 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 129.08 317.63 moveto 130.9 307.19 lineto 122.97 314.21 lineto closepath stroke grestore % Http_parser gsave 0.50196 1 0.81961 nodecolor 615.9 418 68.8 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 615.9 418 68.8 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 574.9 414.4 moveto 82 (Http_parser) alignedtext grestore % Http_daemon->Http_parser gsave 1 setlinewidth 0 0 0 edgecolor newpath 595.13 655.89 moveto 615.72 635.97 646.34 601.86 658.9 565 curveto 673.04 523.48 651.11 474.44 633.72 444.81 curveto stroke 0 0 0 edgecolor newpath 636.7 442.98 moveto 628.51 436.26 lineto 630.72 446.63 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 636.7 442.98 moveto 628.51 436.26 lineto 630.72 446.63 lineto closepath stroke grestore % Http_parser_sanity gsave 0.50196 1 0.81961 nodecolor 577.9 289 104.15 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 577.9 289 104.15 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 511.9 285.4 moveto 132 (Http_parser_sanity) alignedtext grestore % Http_daemon->Http_parser_sanity gsave 1 setlinewidth 0 0 0 edgecolor newpath 597.77 656.26 moveto 621.27 636.64 656.88 602.79 674.9 565 curveto 699.65 513.09 689.66 494.36 693.9 437 curveto 695.14 420.16 700.57 414.52 693.9 399 curveto 678.12 362.3 643.42 332.1 616.06 312.69 curveto stroke 0 0 0 edgecolor newpath 617.69 309.56 moveto 607.47 306.77 lineto 613.72 315.33 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 617.69 309.56 moveto 607.47 306.77 lineto 613.72 315.33 lineto closepath stroke grestore % Http_request gsave 0.50196 1 0.81961 nodecolor 574.9 546 75.16 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 574.9 546 75.16 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 529.4 542.4 moveto 91 (Http_request) alignedtext grestore % Http_daemon->Http_request gsave 1 setlinewidth 0 0 0 edgecolor newpath 574.9 655.39 moveto 574.9 634.25 574.9 599.5 574.9 574.84 curveto stroke 0 0 0 edgecolor newpath 578.4 574.63 moveto 574.9 564.63 lineto 571.4 574.63 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 578.4 574.63 moveto 574.9 564.63 lineto 571.4 574.63 lineto closepath stroke grestore % Http_tcp_server gsave 0.50196 1 0.81961 nodecolor 1056.9 546 89.8 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 1056.9 546 89.8 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 1001.4 542.4 moveto 111 (Http_tcp_server) alignedtext grestore % Http_daemon->Http_tcp_server gsave 1 setlinewidth 0 0 0 edgecolor newpath 626.94 660.18 moveto 715.45 636.67 895.11 588.96 991.8 563.29 curveto stroke 0 0 0 edgecolor newpath 992.98 566.59 moveto 1001.75 560.64 lineto 991.19 559.83 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 992.98 566.59 moveto 1001.75 560.64 lineto 991.19 559.83 lineto closepath stroke grestore % Http_misc->Http_types gsave 1 setlinewidth 0 0 0 edgecolor newpath 146.4 270.43 moveto 154.83 239.51 175.86 177.38 215.9 142 curveto 282.92 82.76 384.43 55.05 451.67 42.57 curveto stroke 0 0 0 edgecolor newpath 452.52 45.97 moveto 461.75 40.76 lineto 451.29 39.08 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 452.52 45.97 moveto 461.75 40.76 lineto 451.29 39.08 lineto closepath stroke grestore % Http_parser->Cookie_lexer gsave 1 setlinewidth 0 0 0 edgecolor newpath 642.19 400.6 moveto 676.75 377.75 737.53 337.54 775.93 312.13 curveto stroke 0 0 0 edgecolor newpath 778.29 314.76 moveto 784.7 306.33 lineto 774.43 308.93 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 778.29 314.76 moveto 784.7 306.33 lineto 774.43 308.93 lineto closepath stroke grestore % Http_parser->Http_common gsave 1 setlinewidth 0 0 0 edgecolor newpath 585.01 401.4 moveto 542.08 378.32 464.27 336.5 416.63 310.89 curveto stroke 0 0 0 edgecolor newpath 418.27 307.8 moveto 407.81 306.15 lineto 414.96 313.97 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 418.27 307.8 moveto 407.81 306.15 lineto 414.96 313.97 lineto closepath stroke grestore % Http_parser->Http_constants gsave 1 setlinewidth 0 0 0 edgecolor newpath 633.33 400 moveto 651.75 379.61 679.65 344.44 690.9 308 curveto 704.16 265.01 677.16 216.47 656.23 187.33 curveto stroke 0 0 0 edgecolor newpath 659.03 185.23 moveto 650.25 179.3 lineto 653.41 189.41 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 659.03 185.23 moveto 650.25 179.3 lineto 653.41 189.41 lineto closepath stroke grestore % Http_parser->Http_types gsave 1 setlinewidth 0 0 0 edgecolor newpath 679.71 410.87 moveto 774.47 397.21 936.76 360.23 892.9 270 curveto 831.33 143.38 666.32 76.39 578.21 48.69 curveto stroke 0 0 0 edgecolor newpath 579.22 45.34 moveto 568.63 45.74 lineto 577.16 52.03 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 579.22 45.34 moveto 568.63 45.74 lineto 577.16 52.03 lineto closepath stroke grestore % Http_parser->Http_parser_sanity gsave 1 setlinewidth 0 0 0 edgecolor newpath 610.45 399.52 moveto 604.14 378.09 593.66 342.51 586.3 317.53 curveto stroke 0 0 0 edgecolor newpath 589.64 316.47 moveto 583.45 307.87 lineto 582.92 318.45 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 589.64 316.47 moveto 583.45 307.87 lineto 582.92 318.45 lineto closepath stroke grestore % Http_parser_sanity->Http_constants gsave 1 setlinewidth 0 0 0 edgecolor newpath 586.18 270.39 moveto 595.72 248.96 611.49 213.56 622.49 188.85 curveto stroke 0 0 0 edgecolor newpath 625.73 190.19 moveto 626.6 179.63 lineto 619.33 187.35 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 625.73 190.19 moveto 626.6 179.63 lineto 619.33 187.35 lineto closepath stroke grestore % Http_parser_sanity->Http_types gsave 1 setlinewidth 0 0 0 edgecolor newpath 570.1 270.45 moveto 561.42 249.03 547.59 212.57 539.9 180 curveto 530.36 139.63 525.3 91.81 522.86 61.94 curveto stroke 0 0 0 edgecolor newpath 526.34 61.49 moveto 522.08 51.79 lineto 519.36 62.03 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 526.34 61.49 moveto 522.08 51.79 lineto 519.36 62.03 lineto closepath stroke grestore % Http_request->Http_common gsave 1 setlinewidth 0 0 0 edgecolor newpath 565.53 527.44 moveto 550.59 498.62 519.58 441.97 485.9 399 curveto 461.04 367.3 427.82 335.2 404.4 313.93 curveto stroke 0 0 0 edgecolor newpath 406.64 311.23 moveto 396.87 307.15 lineto 401.96 316.44 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 406.64 311.23 moveto 396.87 307.15 lineto 401.96 316.44 lineto closepath stroke grestore % Http_request->Http_types gsave 1 setlinewidth 0 0 0 edgecolor newpath 624.72 532.1 moveto 729 499.96 956.9 412.2 909.9 270 curveto 887.66 202.73 871.56 184.52 814.9 142 curveto 745.35 89.82 648.16 60.33 584.88 45.52 curveto stroke 0 0 0 edgecolor newpath 585.55 42.08 moveto 575.02 43.27 lineto 583.99 48.91 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 585.55 42.08 moveto 575.02 43.27 lineto 583.99 48.91 lineto closepath stroke grestore % Http_request->Http_misc gsave 1 setlinewidth 0 0 0 edgecolor newpath 507.36 537.94 moveto 434.27 526.32 317.39 498.96 236.9 437 curveto 195.79 405.35 167.4 350.51 152.95 317.21 curveto stroke 0 0 0 edgecolor newpath 156.02 315.48 moveto 148.92 307.62 lineto 149.57 318.19 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 156.02 315.48 moveto 148.92 307.62 lineto 149.57 318.19 lineto closepath stroke grestore % Http_request->Http_parser gsave 1 setlinewidth 0 0 0 edgecolor newpath 580.86 527.39 moveto 587.69 506.06 598.96 470.87 606.87 446.18 curveto stroke 0 0 0 edgecolor newpath 610.21 447.23 moveto 609.93 436.63 lineto 603.54 445.09 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 610.21 447.23 moveto 609.93 436.63 lineto 603.54 445.09 lineto closepath stroke grestore % Http_message gsave 0.50196 1 0.81961 nodecolor 325.9 418 80.11 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 325.9 418 80.11 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 276.9 414.4 moveto 98 (Http_message) alignedtext grestore % Http_request->Http_message gsave 1 setlinewidth 0 0 0 edgecolor newpath 542.34 529.27 moveto 497.64 506.28 417.19 464.93 367.96 439.62 curveto stroke 0 0 0 edgecolor newpath 369.35 436.4 moveto 358.85 434.94 lineto 366.15 442.63 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 369.35 436.4 moveto 358.85 434.94 lineto 366.15 442.63 lineto closepath stroke grestore % Http_tcp_server->Http_types gsave 1 setlinewidth 0 0 0 edgecolor newpath 1097.9 529.37 moveto 1151.18 505.07 1234.17 456.43 1204.9 399 curveto 1082.89 159.66 735.77 71.1 588.39 43.65 curveto stroke 0 0 0 edgecolor newpath 588.6 40.13 moveto 578.13 41.78 lineto 587.34 47.01 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 588.6 40.13 moveto 578.13 41.78 lineto 587.34 47.01 lineto closepath stroke grestore % Http_threaded_tcp_server gsave 0.50196 1 0.81961 nodecolor 1056.9 418 138.8 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 1056.9 418 138.8 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 966.4 414.4 moveto 181 (Http_threaded_tcp_server) alignedtext grestore % Http_tcp_server->Http_threaded_tcp_server gsave 1 setlinewidth 0 0 0 edgecolor newpath 1056.9 527.39 moveto 1056.9 506.25 1056.9 471.5 1056.9 446.84 curveto stroke 0 0 0 edgecolor newpath 1060.4 446.63 moveto 1056.9 436.63 lineto 1053.4 446.63 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 1060.4 446.63 moveto 1056.9 436.63 lineto 1053.4 446.63 lineto closepath stroke grestore % Http_message->Http_common gsave 1 setlinewidth 0 0 0 edgecolor newpath 333.06 399.52 moveto 341.41 377.96 355.31 342.11 365 317.1 curveto stroke 0 0 0 edgecolor newpath 368.4 318.04 moveto 368.75 307.45 lineto 361.87 315.51 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 368.4 318.04 moveto 368.75 307.45 lineto 361.87 315.51 lineto closepath stroke grestore % Http_message->Http_constants gsave 1 setlinewidth 0 0 0 edgecolor newpath 311.84 399.3 moveto 291.12 369.26 257.79 309.62 286.9 270 curveto 319.13 226.13 465.12 192.01 557.47 174.34 curveto stroke 0 0 0 edgecolor newpath 558.16 177.77 moveto 567.34 172.47 lineto 556.86 170.89 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 558.16 177.77 moveto 567.34 172.47 lineto 556.86 170.89 lineto closepath stroke grestore % Http_message->Http_types gsave 1 setlinewidth 0 0 0 edgecolor newpath 310.05 399.52 moveto 287.85 371.25 252.28 315.75 271.9 270 curveto 315.07 169.31 424.37 91.16 482.75 55 curveto stroke 0 0 0 edgecolor newpath 484.61 57.96 moveto 491.32 49.76 lineto 480.97 51.98 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 484.61 57.96 moveto 491.32 49.76 lineto 480.97 51.98 lineto closepath stroke grestore % Http_message->Http_misc gsave 1 setlinewidth 0 0 0 edgecolor newpath 300.7 400.33 moveto 267.89 377.34 210.51 337.1 174.44 311.82 curveto stroke 0 0 0 edgecolor newpath 176.4 308.92 moveto 166.21 306.04 lineto 172.38 314.65 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 176.4 308.92 moveto 166.21 306.04 lineto 172.38 314.65 lineto closepath stroke grestore % Http_message->Http_parser_sanity gsave 1 setlinewidth 0 0 0 edgecolor newpath 358.84 401.14 moveto 403.93 378.05 484.94 336.59 534.8 311.06 curveto stroke 0 0 0 edgecolor newpath 536.43 314.16 moveto 543.73 306.49 lineto 533.24 307.93 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 536.43 314.16 moveto 543.73 306.49 lineto 533.24 307.93 lineto closepath stroke grestore % Http_response gsave 0.50196 1 0.81961 nodecolor 503.9 803 82.02 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 503.9 803 82.02 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 453.9 799.4 moveto 100 (Http_response) alignedtext grestore % Http_response->Http_common gsave 1 setlinewidth 0 0 0 edgecolor newpath 500.63 784.27 moveto 490.33 726.38 456.79 545.38 414.9 399 curveto 406.77 370.62 395.26 338.92 386.86 316.86 curveto stroke 0 0 0 edgecolor newpath 390.09 315.53 moveto 383.23 307.46 lineto 383.56 318.05 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 390.09 315.53 moveto 383.23 307.46 lineto 383.56 318.05 lineto closepath stroke grestore % Http_response->Http_constants gsave 1 setlinewidth 0 0 0 edgecolor newpath 579.29 795.69 moveto 712.99 778.85 992.85 725.52 1155.9 565 curveto 1199.3 522.26 1193.82 496.9 1204.9 437 curveto 1232.35 288.47 1048.33 328.1 908.9 270 curveto 831.77 237.86 741.63 202.4 686.4 180.92 curveto stroke 0 0 0 edgecolor newpath 687.43 177.56 moveto 676.84 177.2 lineto 684.9 184.09 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 687.43 177.56 moveto 676.84 177.2 lineto 684.9 184.09 lineto closepath stroke grestore % Http_response->Http_types gsave 1 setlinewidth 0 0 0 edgecolor newpath 578.42 795.09 moveto 776.3 772.02 1299.9 696.76 1299.9 546 curveto 1299.9 546 1299.9 546 1299.9 289 curveto 1299.9 140.66 783.67 64.19 591.69 40.88 curveto stroke 0 0 0 edgecolor newpath 592.04 37.39 moveto 581.7 39.68 lineto 591.21 44.34 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 592.04 37.39 moveto 581.7 39.68 lineto 591.21 44.34 lineto closepath stroke grestore % Http_response->Http_daemon gsave 1 setlinewidth 0 0 0 edgecolor newpath 514.07 784.52 moveto 526.04 762.77 546.02 726.47 559.8 701.44 curveto stroke 0 0 0 edgecolor newpath 562.99 702.9 moveto 564.74 692.45 lineto 556.85 699.52 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 562.99 702.9 moveto 564.74 692.45 lineto 556.85 699.52 lineto closepath stroke grestore % Http_response->Http_misc gsave 1 setlinewidth 0 0 0 edgecolor newpath 445.05 789.99 moveto 348.49 765.14 159.03 700.82 77.9 565 curveto 40.06 501.66 56.2 470.11 75.9 399 curveto 84.57 367.69 104.79 336.34 120.59 315.16 curveto stroke 0 0 0 edgecolor newpath 123.52 317.09 moveto 126.82 307.02 lineto 117.96 312.83 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 123.52 317.09 moveto 126.82 307.02 lineto 117.96 312.83 lineto closepath stroke grestore % Http_response->Http_message gsave 1 setlinewidth 0 0 0 edgecolor newpath 487.02 784.82 moveto 468.43 763.99 438.7 728.18 419.9 693 curveto 374.72 608.46 344.82 497.94 332.41 446.56 curveto stroke 0 0 0 edgecolor newpath 335.74 445.45 moveto 330.03 436.53 lineto 328.93 447.07 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 335.74 445.45 moveto 330.03 436.53 lineto 328.93 447.07 lineto closepath stroke grestore % Http_user_agent gsave 0.50196 1 0.81961 nodecolor 202.9 546 92.84 18.38 ellipse_path fill 1 setlinewidth filled 0.50196 1 0.81961 nodecolor 202.9 546 92.84 18.38 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font 144.9 542.4 moveto 116 (Http_user_agent) alignedtext grestore % Http_user_agent->Http_common gsave 1 setlinewidth 0 0 0 edgecolor newpath 203.33 527.32 moveto 204.83 497.85 211.12 439.73 236.9 399 curveto 260.94 361.02 302.8 330.56 334.32 311.42 curveto stroke 0 0 0 edgecolor newpath 336.51 314.19 moveto 343.33 306.08 lineto 332.94 308.17 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 336.51 314.19 moveto 343.33 306.08 lineto 332.94 308.17 lineto closepath stroke grestore % Http_user_agent->Http_types gsave 1 setlinewidth 0 0 0 edgecolor newpath 183.08 527.75 moveto 138.34 484.24 36.17 370.49 72.9 270 curveto 128.99 116.53 339.44 61 450.79 42.08 curveto stroke 0 0 0 edgecolor newpath 451.63 45.49 moveto 460.93 40.41 lineto 450.49 38.58 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 451.63 45.49 moveto 460.93 40.41 lineto 450.49 38.58 lineto closepath stroke grestore % Http_user_agent->Http_misc gsave 1 setlinewidth 0 0 0 edgecolor newpath 195.51 527.38 moveto 187.25 505.9 173.96 469.38 165.9 437 curveto 155.76 396.28 148.87 348.16 145.16 318.1 curveto stroke 0 0 0 edgecolor newpath 148.6 317.41 moveto 143.94 307.89 lineto 141.65 318.24 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 148.6 317.41 moveto 143.94 307.89 lineto 141.65 318.24 lineto closepath stroke grestore % Http_user_agent->Http_parser gsave 1 setlinewidth 0 0 0 edgecolor newpath 253.54 530.3 moveto 331.41 506.17 479.99 460.12 560.58 435.14 curveto stroke 0 0 0 edgecolor newpath 562.03 438.36 moveto 570.54 432.06 lineto 559.95 431.67 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor newpath 562.03 438.36 moveto 570.54 432.06 lineto 559.95 431.67 lineto closepath stroke grestore endpage showpage grestore %%PageTrailer %%EndPage: 1 %%Trailer %%Pages: 1 %%BoundingBox: 36 36 500 756 end restore %%EOF ocaml-http_0.1.5/doc/dot/ocaml-http.dot0000644000175000017500000000431711507240335017257 0ustar celticcelticdigraph G { size="10,7.5"; ratio="fill"; rotate=90; fontsize="12pt"; rankdir = TB ; "Cookie_lexer" [style=filled, color=darkturquoise]; "Http_common" [style=filled, color=darkturquoise]; "Http_common" -> "Http_constants"; "Http_common" -> "Http_types"; "Http_constants" [style=filled, color=darkturquoise]; "Http_constants" -> "Http_types"; "Http_daemon" [style=filled, color=darkturquoise]; "Http_daemon" -> "Http_common"; "Http_daemon" -> "Http_constants"; "Http_daemon" -> "Http_misc"; "Http_daemon" -> "Http_parser"; "Http_daemon" -> "Http_parser_sanity"; "Http_daemon" -> "Http_request"; "Http_daemon" -> "Http_tcp_server"; "Http_daemon" -> "Http_types"; "Http_message" [style=filled, color=darkturquoise]; "Http_message" -> "Http_common"; "Http_message" -> "Http_constants"; "Http_message" -> "Http_misc"; "Http_message" -> "Http_parser_sanity"; "Http_message" -> "Http_types"; "Http_misc" [style=filled, color=darkturquoise]; "Http_misc" -> "Http_types"; "Http_parser" [style=filled, color=darkturquoise]; "Http_parser" -> "Cookie_lexer"; "Http_parser" -> "Http_common"; "Http_parser" -> "Http_constants"; "Http_parser" -> "Http_parser_sanity"; "Http_parser" -> "Http_types"; "Http_parser_sanity" [style=filled, color=darkturquoise]; "Http_parser_sanity" -> "Http_constants"; "Http_parser_sanity" -> "Http_types"; "Http_request" [style=filled, color=darkturquoise]; "Http_request" -> "Http_common"; "Http_request" -> "Http_message"; "Http_request" -> "Http_misc"; "Http_request" -> "Http_parser"; "Http_request" -> "Http_types"; "Http_response" [style=filled, color=darkturquoise]; "Http_response" -> "Http_common"; "Http_response" -> "Http_constants"; "Http_response" -> "Http_daemon"; "Http_response" -> "Http_message"; "Http_response" -> "Http_misc"; "Http_response" -> "Http_types"; "Http_tcp_server" [style=filled, color=darkturquoise]; "Http_tcp_server" -> "Http_threaded_tcp_server"; "Http_tcp_server" -> "Http_types"; "Http_types" [style=filled, color=darkturquoise]; "Http_user_agent" [style=filled, color=darkturquoise]; "Http_user_agent" -> "Http_common"; "Http_user_agent" -> "Http_misc"; "Http_user_agent" -> "Http_parser"; "Http_user_agent" -> "Http_types"; "Http_threaded_tcp_server" [style=filled, color=darkturquoise]; } ocaml-http_0.1.5/doc/html/0000755000175000017500000000000011507240334014647 5ustar celticcelticocaml-http_0.1.5/doc/html/type_Http_types.response.html0000644000175000017500000001750711507240333022607 0ustar celticceltic Http_types.response object
  method addBasicHeaders : unit
  method addBody : string -> unit
  method addBodyBuf : Buffer.t -> unit
  method addHeader : name:string -> value:string -> unit
  method addHeaders : (string * string) list -> unit
  method body : string
  method bodyBuf : Buffer.t
  method clientAddr : string
  method clientPort : int
  method clientSockaddr : Unix.sockaddr
  method code : int
  method connection : string
  method contentEncoding : string
  method contentType : string
  method date : string
  method expires : string
  method hasHeader : name:string -> bool
  method header : name:string -> string
  method headers : (string * string) list
  method isClientError : bool
  method isError : bool
  method isInformational : bool
  method isRedirection : bool
  method isServerError : bool
  method isSuccess : bool
  method reason : string
  method removeHeader : name:string -> unit
  method replaceHeader : name:string -> value:string -> unit
  method replaceHeaders : (string * string) list -> unit
  method serialize : out_channel -> unit
  method server : string
  method serverAddr : string
  method serverPort : int
  method serverSockaddr : Unix.sockaddr
  method setBody : string -> unit
  method setBodyBuf : Buffer.t -> unit
  method setCode : int -> unit
  method setConnection : string -> unit
  method setContentEncoding : string -> unit
  method setContentType : string -> unit
  method setDate : string -> unit
  method setExpires : string -> unit
  method setReason : string -> unit
  method setServer : string -> unit
  method setStatus : Http_types.status -> unit
  method setStatusLine : string -> unit
  method setVersion : version -> unit
  method status : Http_types.status
  method statusLine : string
  method toString : string
  method version : version option
end
ocaml-http_0.1.5/doc/html/Http_types.request.html0000644000175000017500000001312611507240333021371 0ustar celticceltic Http_types.request

Class type Http_types.request


class type request = object .. end
HTTP requests
Inherits
method meth : meth
Returns request method
method uri : string
Returns requested URI (including query string, fragment, ...)
method path : string
Returns requested path
method param : ?meth:meth -> ?default:string -> string -> string
lookup a given parameter
Raises Param_not_found if parameter name was not found
Returns value associated to parameter name
meth : if given restrict the lookup area (e.g. if meth = POST than only parameters received via POST are searched), if not given both GET and POST parameter are searched in an unspecified order (actually the implementation prefers POST parameters but this is not granted, you've been warned)
default : if provided, this value will be returned in case no parameter of that name is available instead of raising Param_not_found
method paramAll : ?meth:meth -> string -> string list
like param above but return a list of values associated to given parameter (a parameter could be defined indeed more than once: passed more than once in a query string or passed both insider the url (the GET way) and inside message body (the POST way))
method params : (string * string) list
Returns the list of all received parameters
method params_GET : (string * string) list
Returns the list of all parameters received via GET
method params_POST : (string * string) list
Returns the list of all parameter received via POST
method cookies : (string * string) list option
method authorization : auth_info option
Returns authorization information, if given by the client
ocaml-http_0.1.5/doc/html/Http_types.message.html0000644000175000017500000001306711507240333021331 0ustar celticceltic Http_types.message

Class type Http_types.message


class type message = object .. end
HTTP generic messages. See Http_message.message

method version : version option
method setVersion : version -> unit
method body : string
method setBody : string -> unit
method bodyBuf : Buffer.t
method setBodyBuf : Buffer.t -> unit
method addBody : string -> unit
method addBodyBuf : Buffer.t -> unit
method addHeader : name:string -> value:string -> unit
method addHeaders : (string * string) list -> unit
method replaceHeader : name:string -> value:string -> unit
method replaceHeaders : (string * string) list -> unit
method removeHeader : name:string -> unit
method hasHeader : name:string -> bool
method header : name:string -> string
method headers : (string * string) list
method clientSockaddr : Unix.sockaddr
method clientAddr : string
method clientPort : int
method serverSockaddr : Unix.sockaddr
method serverAddr : string
method serverPort : int
method toString : string
method serialize : Pervasives.out_channel -> unit
ocaml-http_0.1.5/doc/html/type_Http_types.request.html0000644000175000017500000001456711507240333022444 0ustar celticceltic Http_types.request object
  method addBody : string -> unit
  method addBodyBuf : Buffer.t -> unit
  method addHeader : name:string -> value:string -> unit
  method addHeaders : (string * string) list -> unit
  method authorization : Http_types.auth_info option
  method body : string
  method bodyBuf : Buffer.t
  method clientAddr : string
  method clientPort : int
  method clientSockaddr : Unix.sockaddr
  method cookies : (string * string) list option
  method hasHeader : name:string -> bool
  method header : name:string -> string
  method headers : (string * string) list
  method meth : Http_types.meth
  method param : ?meth:Http_types.meth -> ?default:string -> string -> string
  method paramAll : ?meth:Http_types.meth -> string -> string list
  method params : (string * string) list
  method params_GET : (string * string) list
  method params_POST : (string * string) list
  method path : string
  method removeHeader : name:string -> unit
  method replaceHeader : name:string -> value:string -> unit
  method replaceHeaders : (string * string) list -> unit
  method serialize : out_channel -> unit
  method serverAddr : string
  method serverPort : int
  method serverSockaddr : Unix.sockaddr
  method setBody : string -> unit
  method setBodyBuf : Buffer.t -> unit
  method setVersion : version -> unit
  method toString : string
  method uri : string
  method version : version option
end
ocaml-http_0.1.5/doc/html/style.css0000644000175000017500000000433111507240333016521 0ustar celticceltica:visited {color : #416DFF; text-decoration : none; } a:link {color : #416DFF; text-decoration : none;} a:hover {color : Red; text-decoration : none; background-color: #5FFF88} a:active {color : Red; text-decoration : underline; } .keyword { font-weight : bold ; color : Red } .keywordsign { color : #C04600 } .superscript { font-size : 4 } .subscript { font-size : 4 } .comment { color : Green } .constructor { color : Blue } .type { color : #5C6585 } .string { color : Maroon } .warning { color : Red ; font-weight : bold } .info { margin-left : 3em; margin-right : 3em } .param_info { margin-top: 4px; margin-left : 3em; margin-right : 3em } .code { color : #465F91 ; } h1 { font-size : 20pt ; text-align: center; } h2 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90BDFF ;padding: 2px; } h3 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90DDFF ;padding: 2px; } h4 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90EDFF ;padding: 2px; } h5 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90FDFF ;padding: 2px; } h6 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #C0FFFF ; padding: 2px; } div.h7 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #E0FFFF ; padding: 2px; } div.h8 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #F0FFFF ; padding: 2px; } div.h9 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #FFFFFF ; padding: 2px; } .typetable { border-style : hidden } .indextable { border-style : hidden } .paramstable { border-style : hidden ; padding: 5pt 5pt} body { background-color : White } tr { background-color : White } td.typefieldcomment { background-color : #FFFFFF ; font-size: smaller ;} pre { margin-bottom: 4px } div.sig_block {margin-left: 2em}ocaml-http_0.1.5/doc/html/type_Http_types.message.html0000644000175000017500000001207211507240333022365 0ustar celticceltic Http_types.message object
  method addBody : string -> unit
  method addBodyBuf : Buffer.t -> unit
  method addHeader : name:string -> value:string -> unit
  method addHeaders : (string * string) list -> unit
  method body : string
  method bodyBuf : Buffer.t
  method clientAddr : string
  method clientPort : int
  method clientSockaddr : Unix.sockaddr
  method hasHeader : name:string -> bool
  method header : name:string -> string
  method headers : (string * string) list
  method removeHeader : name:string -> unit
  method replaceHeader : name:string -> value:string -> unit
  method replaceHeaders : (string * string) list -> unit
  method serialize : Pervasives.out_channel -> unit
  method serverAddr : string
  method serverPort : int
  method serverSockaddr : Unix.sockaddr
  method setBody : string -> unit
  method setBodyBuf : Buffer.t -> unit
  method setVersion : Http_types.version -> unit
  method toString : string
  method version : Http_types.version option
end
ocaml-http_0.1.5/doc/html/Http_types.connection.html0000644000175000017500000000636511507240333022047 0ustar celticceltic Http_types.connection

Class type Http_types.connection


class type connection = object .. end
an HTTP connection from a client to a server

method getRequest : request option
Returns next request object, may block if client hasn't submitted any request yet, may be None if client request was ill-formed
method respond_with : response -> unit
respond to client sending it a response
method close : unit
close connection to client. Warning: this object can't be used any longer after this method has been called
ocaml-http_0.1.5/doc/html/Http_types.html0000644000175000017500000005504211507240333017705 0ustar celticceltic Http_types

Module Http_types


module Http_types: sig .. end
Type definitions

type version = [ `HTTP_1_0 | `HTTP_1_1 ] 
HTTP version, actually only 1.0 and 1.1 are supported. Note that 'supported' here means only 'accepted inside a HTTP request line', no different behaviours are actually implemented depending on HTTP version
type meth = [ `GET | `POST ] 
HTTP method, actually only GET and POST methods are supported
type daemon_mode = [ `Fork | `Single | `Thread ] 
Daemon behaviour wrt request handling. `Single mode use a single process to handle all requests, no request is served until a previous one has been fully served. `Fork mode fork a new process for each request, the new process will execute the callback function and then exit. `Thread mode create a new thread for each request, the new thread will execute the callback function and then exit, threads can communicate using standard OCaml Thread library.
type tcp_server = sockaddr:Unix.sockaddr ->
timeout:int option ->
(Pervasives.in_channel -> Pervasives.out_channel -> unit) -> unit
A TCP server is a function taking an address on which bind and listen for connections, an optional timeout after which abort client connections and a callback function which in turn takes an input and an output channel as arguments. After receiving this argument a TCP server sits and waits for connection, on each connection it apply the callback function to channels connected to client.
type auth_info = [ `Basic of string * string ] 
authentication information
type informational_substatus = [ `Continue | `Switching_protocols ] 
See also RFC2616 informational HTTP status
type success_substatus = [ `Accepted
| `Created
| `No_content
| `Non_authoritative_information
| `OK
| `Partial_content
| `Reset_content ]
See also RFC2616 success HTTP status
type redirection_substatus = [ `Found
| `Moved_permanently
| `Multiple_choices
| `Not_modified
| `See_other
| `Temporary_redirect
| `Use_proxy ]
See also RFC2616 redirection HTTP status
type client_error_substatus = [ `Bad_request
| `Conflict
| `Expectation_failed
| `Forbidden
| `Gone
| `Length_required
| `Method_not_allowed
| `Not_acceptable
| `Not_found
| `Payment_required
| `Precondition_failed
| `Proxy_authentication_required
| `Request_URI_too_large
| `Request_entity_too_large
| `Request_time_out
| `Requested_range_not_satisfiable
| `Unauthorized
| `Unsupported_media_type ]
See also RFC2616 client error HTTP status
type server_error_substatus = [ `Bad_gateway
| `Gateway_time_out
| `HTTP_version_not_supported
| `Internal_server_error
| `Not_implemented
| `Service_unavailable ]
See also RFC2616 server error HTTP status
type informational_status = [ `Informational of informational_substatus ] 
type success_status = [ `Success of success_substatus ] 
type redirection_status = [ `Redirection of redirection_substatus ] 
type client_error_status = [ `Client_error of client_error_substatus ] 
type server_error_status = [ `Server_error of server_error_substatus ] 
type error_status = [ `Client_error of client_error_substatus
| `Server_error of server_error_substatus ]
type status = [ `Client_error of client_error_substatus
| `Informational of informational_substatus
| `Redirection of redirection_substatus
| `Server_error of server_error_substatus
| `Success of success_substatus ]
HTTP status
type status_code = [ `Code of int | `Status of status ] 

type file_source =
| FileSrc of string (*filename*)
| InChanSrc of Pervasives.in_channel (*input channel*)
File sources

Exceptions


exception Invalid_header of string
invalid header encountered
exception Invalid_header_name of string
invalid header name encountered
exception Invalid_header_value of string
invalid header value encountered
exception Invalid_HTTP_version of string
unsupported or invalid HTTP version encountered
exception Invalid_HTTP_method of string
unsupported or invalid HTTP method encountered
exception Invalid_code of int
invalid HTTP status code integer representation encountered
exception Malformed_URL of string
invalid URL encountered
exception Malformed_query of string
invalid query string encountered
exception Malformed_query_part of string * string
invalid query string part encountered, arguments are parameter name and parameter value
exception Malformed_request_URI of string
invalid request URI encountered
exception Malformed_cookies of string
malformed cookies
exception Malformed_request of string
malformed request received
exception Malformed_response of string
malformed response received, argument is response's first line
exception Param_not_found of string
a parameter you were looking for was not found
exception Invalid_status_line of string
invalid HTTP status line encountered
exception Header_not_found of string
an header you were looking for was not found
exception Quit
raisable by callbacks to make main daemon quit, this is the only 'clean' way to make start functions return
exception Unauthorized of string
raisable by callbacks to force a 401 (unauthorized) HTTP answer. This exception should be raised _before_ sending any data over given out channel.

OO representation of HTTP messages


class type message = object .. end
HTTP generic messages.
class type request = object .. end
HTTP requests
class type response = object .. end
HTTP responses

Daemon specification



type daemon_spec = {
   address : string;
   auth : (string * auth_info) option; (*authentication requirements (currently only basic authentication is supported). If set to None no authentication is required. If set to Some ("realm", `Basic ("foo", "bar")), only clients authenticated with baisc authentication, for realm "realm", providing username "foo" and password "bar" are accepted; others are rejected with a 401 response code*)
   callback : request -> Pervasives.out_channel -> unit; (*function which will be called each time a correct HTTP request will be received. 1st callback argument is an Http_types.request object corresponding to the request received; 2nd argument is an output channel corresponding to the socket connected to the client*)
   mode : daemon_mode; (*requests handling mode, it can have three different values:
  • `Single -> all requests will be handled by the same process,
  • `Fork -> each request will be handled by a child process,
  • `Thread -> each request will be handled by a (new) thread
*)
   port : int; (*TCP port on which the daemon will be listening*)
   root_dir : string option; (*directory to which ocaml http will chdir before starting handling requests; if None, no chdir will be performed (i.e. stay in the current working directory)*)
   exn_handler : (exn -> Pervasives.out_channel -> unit) option; (*what to do when executing callback raises an exception. If None, the exception will be re-raised: in `Fork/`Thread mode the current process/thread will be terminated. in `Single mode the exception is ignored and the client socket closed. If Some callback, the callback will be executed before acting as per None; the callback is meant to perform some clean up actions, like releasing global mutexes in `Thread mode*)
   timeout : int option; (*timeout in seconds after which an incoming HTTP request will be terminated closing the corresponding TCP connection; None disable the timeout*)
   auto_close : bool; (*whether ocaml-http will automatically close the connection with the client after callback has completed its execution. If set to true, close will be attempted no matter if the callback raises an exception or not*)
}
daemon specification, describe the behaviour of an HTTP daemon.

The default daemon specification is Http_daemon.default_spec


OO representation of other HTTP entities


class type connection = object .. end
an HTTP connection from a client to a server
class type daemon = object .. end
an HTTP daemon
ocaml-http_0.1.5/doc/html/type_Http_message.message.html0000644000175000017500000001332411507240333022646 0ustar celticceltic Http_message.message body:string ->
headers:(string * string) list ->
version:Http_types.version option ->
clisockaddr:Unix.sockaddr ->
srvsockaddr:Unix.sockaddr ->
object
  method addBody : string -> unit
  method addBodyBuf : Buffer.t -> unit
  method addHeader : name:string -> value:string -> unit
  method addHeaders : (string * string) list -> unit
  method body : string
  method bodyBuf : Buffer.t
  method clientAddr : string
  method clientPort : int
  method clientSockaddr : Unix.sockaddr
  method private virtual fstLineToString : string
  method hasHeader : name:string -> bool
  method header : name:string -> string
  method headers : (string * string) list
  method removeHeader : name:string -> unit
  method replaceHeader : name:string -> value:string -> unit
  method replaceHeaders : (string * string) list -> unit
  method serialize : Pervasives.out_channel -> unit
  method serverAddr : string
  method serverPort : int
  method serverSockaddr : Unix.sockaddr
  method setBody : string -> unit
  method setBodyBuf : Buffer.t -> unit
  method setVersion : Http_types.version -> unit
  method toString : string
  method version : Http_types.version option
end
ocaml-http_0.1.5/doc/html/type_Http_response.response.html0000644000175000017500000000472111507240333023273 0ustar celticceltic Http_response.response ?body:string ->
?headers:(string * string) list ->
?version:Http_types.version ->
?clisockaddr:Unix.sockaddr ->
?srvsockaddr:Unix.sockaddr ->
?code:int -> ?status:Http_types.status -> unit -> Http_types.response
ocaml-http_0.1.5/doc/html/Http_response.response.html0000644000175000017500000000477011507240333022236 0ustar celticceltic Http_response.response

Class Http_response.response


class response : ?body:string -> ?headers:(string * string) list -> ?version:Http_types.version -> ?clisockaddr:Unix.sockaddr -> ?srvsockaddr:Unix.sockaddr -> ?code:int -> ?status:Http_types.status -> unit -> Http_types.response
OO representation of an HTTP response.

ocaml-http_0.1.5/doc/html/Http_daemon.daemon.html0000644000175000017500000000503311507240333021241 0ustar celticceltic Http_daemon.daemon

Class Http_daemon.daemon


class daemon : ?addr:string -> ?port:int -> unit -> Http_types.daemon
Object oriented interface to HTTP daemons.
addr : address on which daemon will listen for connections
port : port which daemon will bind see Http_types.daemon

ocaml-http_0.1.5/doc/html/type_Http_daemon.daemon.html0000644000175000017500000000367411507240333022313 0ustar celticceltic Http_daemon.daemon ?addr:string -> ?port:int -> unit -> Http_types.daemonocaml-http_0.1.5/doc/html/Http_daemon.html0000644000175000017500000002540411507240333020003 0ustar celticceltic Http_daemon

Module Http_daemon


module Http_daemon: sig .. end
Main OCaml HTTP module. Here you can find two set of functions:

val send_CRLF : Pervasives.out_channel -> unit
send a CRLF sequence on the given output channel, this is mandatory after the last header was sent and before start sending the response body
val send_status_line : ?version:Http_types.version ->
code:Http_types.status_code -> Pervasives.out_channel -> unit
send response status line, version is the http version used in response, either code or status must be given (not both, not none) which represent the HTTP response code, outchan is the output channel to which send status line
val get_basic_headers : unit -> (string * string) list
returns the basic headers "Date", "Server" and "Connection" used in send_basic_headers
val send_basic_headers : ?version:Http_types.version ->
code:Http_types.status_code -> Pervasives.out_channel -> unit
like send_status_line but additionally will also send "Date", "Server" and "Connection" standard headers
val send_header : header:string -> value:string -> Pervasives.out_channel -> unit
send an HTTP header on outchan
val send_headers : headers:(string * string) list -> Pervasives.out_channel -> unit
as send_header, but for a list of pairs <header, value>
val send_file : src:Http_types.file_source -> Pervasives.out_channel -> unit
send a file through an out_channel
val respond : ?body:string ->
?headers:(string * string) list ->
?version:Http_types.version ->
?code:Http_types.status_code -> Pervasives.out_channel -> unit
high level response function, respond on outchan sending: basic headers (including Content-Length computed using 'body' argument), headers probided via 'headers' argument, body given via 'body' argument. Default response status is 200, default response HTTP version is Http_common.http_version
val respond_not_found : url:string -> ?version:Http_types.version -> Pervasives.out_channel -> unit
send a 404 (not found) HTTP response
val respond_forbidden : url:string -> ?version:Http_types.version -> Pervasives.out_channel -> unit
send a 403 (forbidden) HTTP response
val respond_redirect : location:string ->
?body:string ->
?version:Http_types.version ->
?code:Http_types.status_code -> Pervasives.out_channel -> unit
send a "redirection" class response, optional body argument contains data that will be displayed in the body of the response, default response status is 301 (moved permanently), only redirection status are accepted by this function, other values will raise Failure
val respond_unauthorized : ?version:Http_types.version ->
?realm:string -> Pervasives.out_channel -> unit
respond with a 401 (Unauthorized) response asking for authentication against given realm (default is the server name)
val respond_error : ?body:string ->
?version:Http_types.version ->
?code:Http_types.status_code -> Pervasives.out_channel -> unit
send an "error" response (i.e. 400 <= status < 600), optional body argument as per send_redirect, default response status is 400 (bad request), only error status are accepted by this function, other values will raise Failure
val respond_file : fname:string -> ?version:Http_types.version -> Pervasives.out_channel -> unit
tipical static pages http daemon behaviour, if requested url is a file, return it, it it is a directory return a directory listing of it
val respond_with : Http_types.response -> Pervasives.out_channel -> unit
respond using a prebuilt Http_types.response object
val main : Http_types.daemon_spec -> unit
start an HTTP daemon
val default_spec : Http_types.daemon_spec
default daemon specification:
val daemon_spec : ?address:string ->
?auth:(string * Http_types.auth_info) option ->
?auto_close:bool ->
?callback:(Http_types.request -> Pervasives.out_channel -> unit) ->
?mode:Http_types.daemon_mode ->
?port:int ->
?root_dir:string option ->
?exn_handler:(exn -> Pervasives.out_channel -> unit) option ->
?timeout:int option -> unit -> Http_types.daemon_spec
currified daemon_spec constructor. Each parameter of this function corresponds to one field of Http_types.daemon_spec and defaults to the corresponding field of Http_daemon.default_spec
class daemon : ?addr:string -> ?port:int -> unit -> Http_types.daemon
Object oriented interface to HTTP daemons.
module Trivial: sig .. end
Trivial static pages HTTP daemon.
ocaml-http_0.1.5/doc/html/Http_message.message.html0000644000175000017500000002153011507240333021603 0ustar celticceltic Http_message.message

Class virtual Http_message.message


class virtual message : body:string -> headers:(string * string) list -> version:Http_types.version option -> clisockaddr:Unix.sockaddr -> srvsockaddr:Unix.sockaddr -> object .. end
OO representation of an HTTP message
headers : message headers shipped with the message

method version : Http_types.version option
Returns message HTTP version, it can be None because older version of the HTTP protocol don't require HTTP version to be told between message source and destination
method setVersion : Http_types.version -> unit
set message HTTP version
method body : string
Returns message body
method setBody : string -> unit
set message body
method bodyBuf : Buffer.t
Returns a Buffer.t connected to message body (Warning: changing this buffer will change message body too)
method setBodyBuf : Buffer.t -> unit
set a new Buffer.t used to keep message body
method addBody : string -> unit
append a string to message body
method addBodyBuf : Buffer.t -> unit
append a whole buffer to message body
header name comparison are performed in a case-insensitive manner as required by RFC2616, actually the implementation works converting all header names in lowercase
method addHeader : name:string -> value:string -> unit
add an HTTP header
name : header's name
value : header's value
method addHeaders : (string * string) list -> unit
add a list of HTTP headers
method replaceHeader : name:string -> value:string -> unit
like addHeader but replace previous definition of the same header
method replaceHeaders : (string * string) list -> unit
like addHeaders but replace previous definition of headers that were already defined
method removeHeader : name:string -> unit
remove _all_ occurences of an HTTP header from the message
name : name of the header to be removed
method hasHeader : name:string -> bool
Returns true if given header exists in message, false otherwise
method header : name:string -> string
Raises Header_not_found if given header wasn't defined in message
Returns value associated to a given header
name : name of the header to lookup
method headers : (string * string) list
Returns the full set of headers defined for this message, the value returned is an association list from headers name to headers value, an header may occurs more that once in the list
method clientSockaddr : Unix.sockaddr
Returns client Unix.sockaddr
method clientAddr : string
Returns client address pretty printed
method clientPort : int
Returns client port
method serverSockaddr : Unix.sockaddr
Returns server Unix.sockaddr
method serverAddr : string
Returns server address pretty printed
method serverPort : int
Returns server port
method private virtual fstLineToString : string
Returns for requests first request line, for responses first response line. User by derived requests and responses to implement toString method
method toString : string
Returns a string representation of the message
method serialize : Pervasives.out_channel -> unit
serialize the message over an output channel
ocaml-http_0.1.5/doc/html/Http_constants.html0000644000175000017500000001057111507240333020553 0ustar celticceltic Http_constants

Module Http_constants


module Http_constants: sig .. end
Constants

val version : Http_types.version
default HTTP version
val server_string : string
string returned as value of "Server:" response header
val crlf : string
"\r\n" string

daemon default values


val default_addr : string
val default_auth : (string * Http_types.auth_info) option
val default_auto_close : bool
val default_callback : Http_types.request -> Pervasives.out_channel -> unit
val default_mode : Http_types.daemon_mode
val default_port : int
val default_root_dir : string option
val default_exn_handler : (exn -> Pervasives.out_channel -> unit) option
val default_timeout : int option
ocaml-http_0.1.5/doc/html/type_Http_threaded_tcp_server.html0000644000175000017500000000415211507240333023612 0ustar celticceltic Http_threaded_tcp_server sig val serve : ('-> 'b) -> '-> unit endocaml-http_0.1.5/doc/html/index_values.html0000644000175000017500000005255411507240334020236 0ustar celticceltic Index of values

Index of values


B
buf_of_inchan [Http_misc]
reads from an input channel till it End_of_file and returns what has been read; if limit is given returned buffer will contains at most first 'limit' bytes read from input channel
build_sockaddr [Http_misc]
build a Unix.sockaddr inet address from a string representation of an IP address and a port number

C
callback [Http_daemon.Trivial]
callback function, exposed if you like to use it as a basis to define a more powerful daemon
code_of_status [Http_common]
converts an HTTP status to the corresponding integer value
crlf [Http_constants]
"\r\n" string

D
daemon_spec [Http_daemon]
currified daemon_spec constructor.
date_822 [Http_misc]
debug [Http_common]
whether debugging messages are enabled or not, can be changed at runtime
debug_print [Http_common]
print a string on stderr only if debugging is enabled
default_addr [Http_constants]
default_auth [Http_constants]
default_auto_close [Http_constants]
default_callback [Http_constants]
default_exn_handler [Http_constants]
default_mode [Http_constants]
default_port [Http_constants]
default_root_dir [Http_constants]
default_spec [Http_daemon]
default daemon specification: listen on 0.0.0.0, port 80, "always ok" callback (return an empty response, response code 200), fork a child for each request, do not change to a root directory (i.e. keep cwd), 300 seconds timeout, ignores exceptions, no authentication required, do not automatically close client connections after callback
default_timeout [Http_constants]

E
error [Http_misc]
print an error msg to stderr.
explode_sockaddr [Http_misc]
explode an _inet_ Unix.sockaddr address in a string representation of an IP address and a port number

F
filesize [Http_misc]
finally [Http_misc]
fork [Http_tcp_server]
multi process server

G
get [Http_user_agent]
get_basic_headers [Http_daemon]
returns the basic headers "Date", "Server" and "Connection" used in send_basic_headers
get_iter [Http_user_agent]
as above but iter callback function on HTTP response's body instead of returning it as a string

H
head [Http_user_agent]
heal_header [Http_parser_sanity]
heal_header_name [Http_parser_sanity]
heal_header_value [Http_parser_sanity]
http_version [Http_common]

I
init_socket [Http_tcp_server]
initialize a passive socket listening on given Unix.sockaddr
is_client_error [Http_common]
is_directory [Http_misc]
is_error [Http_common]
is_informational [Http_common]
is_redirection [Http_common]
is_server_error [Http_common]
is_success [Http_common]

L
list_assoc_all [Http_misc]
like List.assoc but return all bindings of a given key instead of the leftmost one only
ls [Http_misc]
given a dir handle

M
main [Http_daemon.Trivial]
start the "trivial" HTTP daemon
main [Http_daemon]
start an HTTP daemon
method_of_string [Http_common]
parse an HTTP method from a string

N
normalize_header_value [Http_parser_sanity]
remove heading and/or trailing LWS sequences as per RFC2616

P
parse_cookies [Http_parser]
parse a Cookie header, extracting an associative list <attribute name, attribute value>.
parse_headers [Http_parser]
parse HTTP headers.
parse_path [Http_parser]
parse the base path (removing query string, fragment, ....) from an URL
parse_query_get_params [Http_parser]
parse HTTP GET parameters from an URL; paramater which were passed with no value (like 'x' in "/foo.cgi?a=10&x=&c=9") are returned associated with the empty ("") string.
parse_request [Http_parser]
given an input channel, reads from it a GET HTTP request and
parse_request_fst_line [Http_parser]
parse 1st line of an HTTP request
parse_response_fst_line [Http_parser]
parse 1st line of an HTTP response
peername_of_in_channel [Http_misc]
as above but works on in_channels
peername_of_out_channel [Http_misc]
given an out_channel build on top of a socket, return peername related to that socket

R
reason_phrase_of_code [Http_misc]
given an HTTP response code return the corresponding reason phrase
respond [Http_daemon]
high level response function, respond on outchan sending: basic headers (including Content-Length computed using 'body' argument), headers probided via 'headers' argument, body given via 'body' argument.
respond_error [Http_daemon]
send an "error" response (i.e.
respond_file [Http_daemon]
tipical static pages http daemon behaviour, if requested url is a file, return it, it it is a directory return a directory listing of it
respond_forbidden [Http_daemon]
send a 403 (forbidden) HTTP response
respond_not_found [Http_daemon]
send a 404 (not found) HTTP response
respond_redirect [Http_daemon]
send a "redirection" class response, optional body argument contains data that will be displayed in the body of the response, default response status is 301 (moved permanently), only redirection status are accepted by this function, other values will raise Failure
respond_unauthorized [Http_daemon]
respond with a 401 (Unauthorized) response asking for authentication against given realm (default is the server name)
respond_with [Http_daemon]
respond using a prebuilt Http_types.response object

S
send_CRLF [Http_daemon]
send a CRLF sequence on the given output channel, this is mandatory after the last header was sent and before start sending the response body
send_basic_headers [Http_daemon]
like send_status_line but additionally will also send "Date", "Server" and "Connection" standard headers
send_file [Http_daemon]
send a file through an out_channel
send_header [Http_daemon]
send an HTTP header on outchan
send_headers [Http_daemon]
as send_header, but for a list of pairs <header, value>
send_status_line [Http_daemon]
send response status line, version is the http version used in response, either code or status must be given (not both, not none) which represent the HTTP response code, outchan is the output channel to which send status line
serve [Http_threaded_tcp_server]
serve an HTTP request for a multi threaded TCP server
server_string [Http_constants]
string returned as value of "Server:" response header
server_string [Http_common]
simple [Http_tcp_server]
single process server
sockname_of_in_channel [Http_misc]
as above but works on in_channels
sockname_of_out_channel [Http_misc]
given an out_channel build on top of a socket, return sockname related to that socket
split_query_params [Http_parser]
given an HTTP like query string (e.g.
status_of_code [Http_common]
converts an integer HTTP status to the corresponding status value
string_explode [Http_misc]
explode a string in a char list
string_implode [Http_misc]
implode a char list in a string
string_of_method [Http_common]
pretty print an HTTP method
string_of_url [Http_parser_sanity]
pretty print an URL
string_of_version [Http_common]
pretty print an HTTP version
strip_heading_slash [Http_misc]
strip heading '/', if any, from a string and
strip_trailing_slash [Http_misc]
strip trailing '/', if any, from a string and

T
thread [Http_tcp_server]
multi threaded server
token [Cookie_lexer]

U
url_of_string [Http_parser_sanity]
parse an URL from a string.

V
version [Http_constants]
default HTTP version
version_of_string [Http_common]
parse an HTTP version from a string

W
warn [Http_misc]
print a warning msg to stderr.

ocaml-http_0.1.5/doc/html/index.html0000644000175000017500000001013311507240334016642 0ustar celticceltic

Index of types
Index of exceptions
Index of values
Index of class methods
Index of classes
Index of class types
Index of modules


Cookie_lexer
Http_common
Common functionalities shared by other OCaml HTTP modules
Http_constants
Constants
Http_daemon
Main OCaml HTTP module.
Http_message
Object Oriented representation of HTTP messages
Http_misc
Helpers and other not better classified functions which should not be exposed in the final API
Http_parser
HTTP messages parsing
Http_parser_sanity
Sanity test functions related to HTTP message parsing
Http_request
Object Oriented representation of HTTP requests
Http_response
Object Oriented representation of HTTP responses
Http_tcp_server
TCP servers used as low-levels for HTTP daemons
Http_threaded_tcp_server
Multithreaded part of Http_tcp_server
Http_types
Type definitions
Http_user_agent
Minimal implementation of an HTTP 1.0/1.1 client.
ocaml-http_0.1.5/doc/html/type_Http_constants.html0000644000175000017500000000654411507240333021621 0ustar celticceltic Http_constants sig
  val version : Http_types.version
  val server_string : string
  val crlf : string
  val default_addr : string
  val default_auth : (string * Http_types.auth_info) option
  val default_auto_close : bool
  val default_callback : Http_types.request -> Pervasives.out_channel -> unit
  val default_mode : Http_types.daemon_mode
  val default_port : int
  val default_root_dir : string option
  val default_exn_handler : (exn -> Pervasives.out_channel -> unit) option
  val default_timeout : int option
end
ocaml-http_0.1.5/doc/html/type_Http_types.connection.html0000644000175000017500000000430311507240333023076 0ustar celticceltic Http_types.connection object
  method close : unit
  method getRequest : Http_types.request option
  method respond_with : Http_types.response -> unit
end
ocaml-http_0.1.5/doc/html/type_Http_daemon.html0000644000175000017500000002467411507240333021054 0ustar celticceltic Http_daemon sig
  val send_CRLF : Pervasives.out_channel -> unit
  val send_status_line :
    ?version:Http_types.version ->
    code:Http_types.status_code -> Pervasives.out_channel -> unit
  val get_basic_headers : unit -> (string * string) list
  val send_basic_headers :
    ?version:Http_types.version ->
    code:Http_types.status_code -> Pervasives.out_channel -> unit
  val send_header :
    header:string -> value:string -> Pervasives.out_channel -> unit
  val send_headers :
    headers:(string * string) list -> Pervasives.out_channel -> unit
  val send_file :
    src:Http_types.file_source -> Pervasives.out_channel -> unit
  val respond :
    ?body:string ->
    ?headers:(string * string) list ->
    ?version:Http_types.version ->
    ?code:Http_types.status_code -> Pervasives.out_channel -> unit
  val respond_not_found :
    url:string ->
    ?version:Http_types.version -> Pervasives.out_channel -> unit
  val respond_forbidden :
    url:string ->
    ?version:Http_types.version -> Pervasives.out_channel -> unit
  val respond_redirect :
    location:string ->
    ?body:string ->
    ?version:Http_types.version ->
    ?code:Http_types.status_code -> Pervasives.out_channel -> unit
  val respond_unauthorized :
    ?version:Http_types.version ->
    ?realm:string -> Pervasives.out_channel -> unit
  val respond_error :
    ?body:string ->
    ?version:Http_types.version ->
    ?code:Http_types.status_code -> Pervasives.out_channel -> unit
  val respond_file :
    fname:string ->
    ?version:Http_types.version -> Pervasives.out_channel -> unit
  val respond_with : Http_types.response -> Pervasives.out_channel -> unit
  val main : Http_types.daemon_spec -> unit
  val default_spec : Http_types.daemon_spec
  val daemon_spec :
    ?address:string ->
    ?auth:(string * Http_types.auth_info) option ->
    ?auto_close:bool ->
    ?callback:(Http_types.request -> Pervasives.out_channel -> unit) ->
    ?mode:Http_types.daemon_mode ->
    ?port:int ->
    ?root_dir:string option ->
    ?exn_handler:(exn -> Pervasives.out_channel -> unit) option ->
    ?timeout:int option -> unit -> Http_types.daemon_spec
  class daemon : ?addr:string -> ?port:int -> unit -> Http_types.daemon
  module Trivial :
    sig
      val callback : Http_types.request -> Pervasives.out_channel -> unit
      val main : Http_types.daemon_spec -> unit
    end
end
ocaml-http_0.1.5/doc/html/index_exceptions.html0000644000175000017500000001366711507240334021122 0ustar celticceltic Index of exceptions

Index of exceptions


H
Header_not_found [Http_types]
an header you were looking for was not found
Http_error [Http_user_agent]

I
Invalid_HTTP_method [Http_types]
unsupported or invalid HTTP method encountered
Invalid_HTTP_version [Http_types]
unsupported or invalid HTTP version encountered
Invalid_code [Http_types]
invalid HTTP status code integer representation encountered
Invalid_header [Http_types]
invalid header encountered
Invalid_header_name [Http_types]
invalid header name encountered
Invalid_header_value [Http_types]
invalid header value encountered
Invalid_status_line [Http_types]
invalid HTTP status line encountered

M
Malformed_URL [Http_types]
invalid URL encountered
Malformed_cookies [Http_types]
malformed cookies
Malformed_query [Http_types]
invalid query string encountered
Malformed_query_part [Http_types]
invalid query string part encountered, arguments are parameter name and parameter value
Malformed_request [Http_types]
malformed request received
Malformed_request_URI [Http_types]
invalid request URI encountered
Malformed_response [Http_types]
malformed response received, argument is response's first line

P
Param_not_found [Http_types]
a parameter you were looking for was not found

Q
Quit [Http_types]
raisable by callbacks to make main daemon quit, this is the only 'clean' way to make start functions return

U
Unauthorized [Http_types]
raisable by callbacks to force a 401 (unauthorized) HTTP answer.

ocaml-http_0.1.5/doc/html/Http_user_agent.html0000644000175000017500000000753511507240334020702 0ustar celticceltic Http_user_agent

Module Http_user_agent


module Http_user_agent: sig .. end
Minimal implementation of an HTTP 1.0/1.1 client. Interface is similar to Gerd Stoplmann's Http_client module. Implementation is simpler and doesn't handle HTTP redirection, proxies, ecc. The only reason for the existence of this module is for performances and incremental elaboration of response's bodies

exception Http_error of (int * string)
val get : ?head_callback:(Http_types.status -> (string * string) list -> unit) ->
string -> string
Raises Http_error when response code <> 200
Returns HTTP response's body
head_callback : optional calllback invoked on response's status and headers. If not provided no callback will be invoked
val get_iter : ?head_callback:(Http_types.status -> (string * string) list -> unit) ->
(string -> unit) -> string -> unit
as above but iter callback function on HTTP response's body instead of returning it as a string
val head : string -> string
Raises Http_error when response code <> 200
Returns HTTP HEAD raw response
ocaml-http_0.1.5/doc/html/type_Http_tcp_server.html0000644000175000017500000000457211507240333021760 0ustar celticceltic Http_tcp_server sig
  val simple : Http_types.tcp_server
  val thread : Http_types.tcp_server
  val fork : Http_types.tcp_server
  val init_socket : Unix.sockaddr -> Unix.file_descr
end
ocaml-http_0.1.5/doc/html/Http_parser_sanity.html0000644000175000017500000000757611507240333021435 0ustar celticceltic Http_parser_sanity

Module Http_parser_sanity


module Http_parser_sanity: sig .. end
Sanity test functions related to HTTP message parsing

val heal_header_name : string -> unit
Raises Invalid_header_name if name isn't a valid HTTP header name
val heal_header_value : string -> unit
Raises Invalid_header_value if value isn't a valid HTTP header value
val heal_header : string * string -> unit
Raises
val normalize_header_value : string -> string
remove heading and/or trailing LWS sequences as per RFC2616
val url_of_string : string -> Neturl.url
parse an URL from a string.
Raises Malformed_URL if an invalid URL is encountered
val string_of_url : Neturl.url -> string
pretty print an URL
ocaml-http_0.1.5/doc/html/type_Http_parser_sanity.html0000644000175000017500000000533711507240333022467 0ustar celticceltic Http_parser_sanity sig
  val heal_header_name : string -> unit
  val heal_header_value : string -> unit
  val heal_header : string * string -> unit
  val normalize_header_value : string -> string
  val url_of_string : string -> Neturl.url
  val string_of_url : Neturl.url -> string
end
ocaml-http_0.1.5/doc/html/index_methods.html0000644000175000017500000004637311507240334020404 0ustar celticceltic Index of class methods

Index of class methods


A
accept [Http_types.daemon]
addBasicHeaders [Http_types.response]
add basic headers to response, see Http_daemon.send_basic_headers
addBody [Http_types.message]
addBody [Http_message.message]
append a string to message body
addBodyBuf [Http_types.message]
addBodyBuf [Http_message.message]
append a whole buffer to message body
addHeader [Http_types.message]
addHeader [Http_message.message]
add an HTTP header
addHeaders [Http_types.message]
addHeaders [Http_message.message]
add a list of HTTP headers
authorization [Http_types.request]

B
body [Http_types.message]
body [Http_message.message]
bodyBuf [Http_types.message]
bodyBuf [Http_message.message]

C
clientAddr [Http_types.message]
clientAddr [Http_message.message]
clientPort [Http_types.message]
clientPort [Http_message.message]
clientSockaddr [Http_types.message]
clientSockaddr [Http_message.message]
close [Http_types.connection]
close connection to client.
code [Http_types.response]
connection [Http_types.response]
contentEncoding [Http_types.response]
contentType [Http_types.response]
cookies [Http_types.request]

D
date [Http_types.response]

E
expires [Http_types.response]

F
fstLineToString [Http_message.message]

G
getRequest [Http_types.connection]
getRequest [Http_types.daemon]
shortcut method, blocks until a client has submit a request and return a pair request * connection

H
hasHeader [Http_types.message]
hasHeader [Http_message.message]
header [Http_types.message]
header [Http_message.message]
headers [Http_types.message]
headers [Http_message.message]

I
isClientError [Http_types.response]
response is a client error one
isError [Http_types.response]
response is either a client error or a server error response
isInformational [Http_types.response]
response is an informational one
isRedirection [Http_types.response]
response is a redirection one
isServerError [Http_types.response]
response is a server error one
isSuccess [Http_types.response]
response is a success one

M
meth [Http_types.request]

P
param [Http_types.request]
lookup a given parameter
paramAll [Http_types.request]
like param above but return a list of values associated to given parameter (a parameter could be defined indeed more than once: passed more than once in a query string or passed both insider the url (the GET way) and inside message body (the POST way))
params [Http_types.request]
params_GET [Http_types.request]
params_POST [Http_types.request]
path [Http_types.request]

R
reason [Http_types.response]
removeHeader [Http_types.message]
removeHeader [Http_message.message]
remove _all_ occurences of an HTTP header from the message
replaceHeader [Http_types.message]
replaceHeader [Http_message.message]
like addHeader but replace previous definition of the same header
replaceHeaders [Http_types.message]
replaceHeaders [Http_message.message]
like addHeaders but replace previous definition of headers that were already defined
respond_with [Http_types.connection]
respond to client sending it a response

S
serialize [Http_types.message]
serialize [Http_message.message]
serialize the message over an output channel
server [Http_types.response]
serverAddr [Http_types.message]
serverAddr [Http_message.message]
serverPort [Http_types.message]
serverPort [Http_message.message]
serverSockaddr [Http_types.message]
serverSockaddr [Http_message.message]
setBody [Http_types.message]
setBody [Http_message.message]
set message body
setBodyBuf [Http_types.message]
setBodyBuf [Http_message.message]
set a new Buffer.t used to keep message body
setCode [Http_types.response]
set response code
setConnection [Http_types.response]
set Connection header value
setContentEncoding [Http_types.response]
set Content-Encoding header value
setContentType [Http_types.response]
set Content-Type header value
setDate [Http_types.response]
set Date header value
setExpires [Http_types.response]
set Expires header value
setReason [Http_types.response]
set reason string
setServer [Http_types.response]
set Server header value
setStatus [Http_types.response]
set response status
setStatusLine [Http_types.response]
set status line
setVersion [Http_types.message]
setVersion [Http_message.message]
set message HTTP version
status [Http_types.response]
statusLine [Http_types.response]

T
toString [Http_types.message]
toString [Http_message.message]

U
uri [Http_types.request]

V
version [Http_types.message]
version [Http_message.message]

ocaml-http_0.1.5/doc/html/Http_daemon.Trivial.html0000644000175000017500000000553011507240333021412 0ustar celticceltic Http_daemon.Trivial

Module Http_daemon.Trivial


module Trivial: sig .. end
Trivial static pages HTTP daemon. Daemons created using this module will serve directory indexes and files found starting from the working directory

val callback : Http_types.request -> Pervasives.out_channel -> unit
callback function, exposed if you like to use it as a basis to define a more powerful daemon
val main : Http_types.daemon_spec -> unit
start the "trivial" HTTP daemon
ocaml-http_0.1.5/doc/html/type_Http_request.html0000644000175000017500000000377011507240333021273 0ustar celticceltic Http_request sig class request : Pervasives.in_channel -> Http_types.request endocaml-http_0.1.5/doc/html/type_Http_message.html0000644000175000017500000001520711507240333021225 0ustar celticceltic Http_message sig
  class virtual message :
    body:string ->
    headers:(string * string) list ->
    version:Http_types.version option ->
    clisockaddr:Unix.sockaddr ->
    srvsockaddr:Unix.sockaddr ->
    object
      method addBody : string -> unit
      method addBodyBuf : Buffer.t -> unit
      method addHeader : name:string -> value:string -> unit
      method addHeaders : (string * string) list -> unit
      method body : string
      method bodyBuf : Buffer.t
      method clientAddr : string
      method clientPort : int
      method clientSockaddr : Unix.sockaddr
      method private virtual fstLineToString : string
      method hasHeader : name:string -> bool
      method header : name:string -> string
      method headers : (string * string) list
      method removeHeader : name:string -> unit
      method replaceHeader : name:string -> value:string -> unit
      method replaceHeaders : (string * string) list -> unit
      method serialize : Pervasives.out_channel -> unit
      method serverAddr : string
      method serverPort : int
      method serverSockaddr : Unix.sockaddr
      method setBody : string -> unit
      method setBodyBuf : Buffer.t -> unit
      method setVersion : Http_types.version -> unit
      method toString : string
      method version : Http_types.version option
    end
end
ocaml-http_0.1.5/doc/html/type_Http_types.html0000644000175000017500000011131411507240334020742 0ustar celticceltic Http_types sig
  type version = [ `HTTP_1_0 | `HTTP_1_1 ]
  type meth = [ `GET | `POST ]
  type daemon_mode = [ `Fork | `Single | `Thread ]
  type tcp_server =
      sockaddr:Unix.sockaddr ->
      timeout:int option ->
      (Pervasives.in_channel -> Pervasives.out_channel -> unit) -> unit
  type auth_info = [ `Basic of string * string ]
  type informational_substatus = [ `Continue | `Switching_protocols ]
  type success_substatus =
      [ `Accepted
      | `Created
      | `No_content
      | `Non_authoritative_information
      | `OK
      | `Partial_content
      | `Reset_content ]
  type redirection_substatus =
      [ `Found
      | `Moved_permanently
      | `Multiple_choices
      | `Not_modified
      | `See_other
      | `Temporary_redirect
      | `Use_proxy ]
  type client_error_substatus =
      [ `Bad_request
      | `Conflict
      | `Expectation_failed
      | `Forbidden
      | `Gone
      | `Length_required
      | `Method_not_allowed
      | `Not_acceptable
      | `Not_found
      | `Payment_required
      | `Precondition_failed
      | `Proxy_authentication_required
      | `Request_URI_too_large
      | `Request_entity_too_large
      | `Request_time_out
      | `Requested_range_not_satisfiable
      | `Unauthorized
      | `Unsupported_media_type ]
  type server_error_substatus =
      [ `Bad_gateway
      | `Gateway_time_out
      | `HTTP_version_not_supported
      | `Internal_server_error
      | `Not_implemented
      | `Service_unavailable ]
  type informational_status =
      [ `Informational of Http_types.informational_substatus ]
  type success_status = [ `Success of Http_types.success_substatus ]
  type redirection_status =
      [ `Redirection of Http_types.redirection_substatus ]
  type client_error_status =
      [ `Client_error of Http_types.client_error_substatus ]
  type server_error_status =
      [ `Server_error of Http_types.server_error_substatus ]
  type error_status =
      [ `Client_error of Http_types.client_error_substatus
      | `Server_error of Http_types.server_error_substatus ]
  type status =
      [ `Client_error of Http_types.client_error_substatus
      | `Informational of Http_types.informational_substatus
      | `Redirection of Http_types.redirection_substatus
      | `Server_error of Http_types.server_error_substatus
      | `Success of Http_types.success_substatus ]
  type status_code = [ `Code of int | `Status of Http_types.status ]
  type file_source = FileSrc of string | InChanSrc of Pervasives.in_channel
  exception Invalid_header of string
  exception Invalid_header_name of string
  exception Invalid_header_value of string
  exception Invalid_HTTP_version of string
  exception Invalid_HTTP_method of string
  exception Invalid_code of int
  exception Malformed_URL of string
  exception Malformed_query of string
  exception Malformed_query_part of string * string
  exception Malformed_request_URI of string
  exception Malformed_cookies of string
  exception Malformed_request of string
  exception Malformed_response of string
  exception Param_not_found of string
  exception Invalid_status_line of string
  exception Header_not_found of string
  exception Quit
  exception Unauthorized of string
  class type message =
    object
      method addBody : string -> unit
      method addBodyBuf : Buffer.t -> unit
      method addHeader : name:string -> value:string -> unit
      method addHeaders : (string * string) list -> unit
      method body : string
      method bodyBuf : Buffer.t
      method clientAddr : string
      method clientPort : int
      method clientSockaddr : Unix.sockaddr
      method hasHeader : name:string -> bool
      method header : name:string -> string
      method headers : (string * string) list
      method removeHeader : name:string -> unit
      method replaceHeader : name:string -> value:string -> unit
      method replaceHeaders : (string * string) list -> unit
      method serialize : Pervasives.out_channel -> unit
      method serverAddr : string
      method serverPort : int
      method serverSockaddr : Unix.sockaddr
      method setBody : string -> unit
      method setBodyBuf : Buffer.t -> unit
      method setVersion : Http_types.version -> unit
      method toString : string
      method version : Http_types.version option
    end
  class type request =
    object
      method addBody : string -> unit
      method addBodyBuf : Buffer.t -> unit
      method addHeader : name:string -> value:string -> unit
      method addHeaders : (string * string) list -> unit
      method authorization : Http_types.auth_info option
      method body : string
      method bodyBuf : Buffer.t
      method clientAddr : string
      method clientPort : int
      method clientSockaddr : Unix.sockaddr
      method cookies : (string * string) list option
      method hasHeader : name:string -> bool
      method header : name:string -> string
      method headers : (string * string) list
      method meth : Http_types.meth
      method param :
        ?meth:Http_types.meth -> ?default:string -> string -> string
      method paramAll : ?meth:Http_types.meth -> string -> string list
      method params : (string * string) list
      method params_GET : (string * string) list
      method params_POST : (string * string) list
      method path : string
      method removeHeader : name:string -> unit
      method replaceHeader : name:string -> value:string -> unit
      method replaceHeaders : (string * string) list -> unit
      method serialize : out_channel -> unit
      method serverAddr : string
      method serverPort : int
      method serverSockaddr : Unix.sockaddr
      method setBody : string -> unit
      method setBodyBuf : Buffer.t -> unit
      method setVersion : version -> unit
      method toString : string
      method uri : string
      method version : version option
    end
  class type response =
    object
      method addBasicHeaders : unit
      method addBody : string -> unit
      method addBodyBuf : Buffer.t -> unit
      method addHeader : name:string -> value:string -> unit
      method addHeaders : (string * string) list -> unit
      method body : string
      method bodyBuf : Buffer.t
      method clientAddr : string
      method clientPort : int
      method clientSockaddr : Unix.sockaddr
      method code : int
      method connection : string
      method contentEncoding : string
      method contentType : string
      method date : string
      method expires : string
      method hasHeader : name:string -> bool
      method header : name:string -> string
      method headers : (string * string) list
      method isClientError : bool
      method isError : bool
      method isInformational : bool
      method isRedirection : bool
      method isServerError : bool
      method isSuccess : bool
      method reason : string
      method removeHeader : name:string -> unit
      method replaceHeader : name:string -> value:string -> unit
      method replaceHeaders : (string * string) list -> unit
      method serialize : out_channel -> unit
      method server : string
      method serverAddr : string
      method serverPort : int
      method serverSockaddr : Unix.sockaddr
      method setBody : string -> unit
      method setBodyBuf : Buffer.t -> unit
      method setCode : int -> unit
      method setConnection : string -> unit
      method setContentEncoding : string -> unit
      method setContentType : string -> unit
      method setDate : string -> unit
      method setExpires : string -> unit
      method setReason : string -> unit
      method setServer : string -> unit
      method setStatus : Http_types.status -> unit
      method setStatusLine : string -> unit
      method setVersion : version -> unit
      method status : Http_types.status
      method statusLine : string
      method toString : string
      method version : version option
    end
  type daemon_spec = {
    address : string;
    auth : (string * Http_types.auth_info) option;
    callback : Http_types.request -> Pervasives.out_channel -> unit;
    mode : Http_types.daemon_mode;
    port : int;
    root_dir : string option;
    exn_handler : (exn -> Pervasives.out_channel -> unit) option;
    timeout : int option;
    auto_close : bool;
  }
  class type connection =
    object
      method close : unit
      method getRequest : Http_types.request option
      method respond_with : Http_types.response -> unit
    end
  class type daemon =
    object
      method accept : Http_types.connection
      method getRequest : Http_types.request * Http_types.connection
    end
end
ocaml-http_0.1.5/doc/html/Http_common.html0000644000175000017500000001474711507240333020040 0ustar celticceltic Http_common

Module Http_common


module Http_common: sig .. end
Common functionalities shared by other OCaml HTTP modules

val debug : bool Pervasives.ref
whether debugging messages are enabled or not, can be changed at runtime
val debug_print : string -> unit
print a string on stderr only if debugging is enabled
val http_version : Http_types.version
see Http_constants.version
val server_string : string
see Http_constants.server_string
val string_of_version : Http_types.version -> string
pretty print an HTTP version
val version_of_string : string -> Http_types.version
parse an HTTP version from a string
Raises Invalid_HTTP_version if given string doesn't represent a supported HTTP version
val string_of_method : Http_types.meth -> string
pretty print an HTTP method
val method_of_string : string -> Http_types.meth
parse an HTTP method from a string
Raises Invalid_HTTP_method if given string doesn't represent a supported method
val status_of_code : int -> Http_types.status
converts an integer HTTP status to the corresponding status value
Raises Invalid_code if given integer isn't a valid HTTP status code
val code_of_status : [< Http_types.status ] -> int
converts an HTTP status to the corresponding integer value
val is_informational : int -> bool
Returns true on "informational" status codes, false elsewhere
val is_success : int -> bool
Returns true on "success" status codes, false elsewhere
val is_redirection : int -> bool
Returns true on "redirection" status codes, false elsewhere
val is_client_error : int -> bool
Returns true on "client error" status codes, false elsewhere
val is_server_error : int -> bool
Returns true on "server error" status codes, false elsewhere
val is_error : int -> bool
Returns true on "client error" and "server error" status code, false elsewhere
ocaml-http_0.1.5/doc/html/Http_types.daemon.html0000644000175000017500000000562511507240333021151 0ustar celticceltic Http_types.daemon

Class type Http_types.daemon


class type daemon = object .. end
an HTTP daemon

method accept : connection
Returns a connection to a client, may block if no client has connected yet
method getRequest : request * connection
shortcut method, blocks until a client has submit a request and return a pair request * connection
ocaml-http_0.1.5/doc/html/Http_misc.html0000644000175000017500000001617611507240333017501 0ustar celticceltic Http_misc

Module Http_misc


module Http_misc: sig .. end
Helpers and other not better classified functions which should not be exposed in the final API

val date_822 : unit -> string
Returns the current date compliant to RFC 1123, which updates RFC 822 zone info are retrieved from UTC
val is_directory : string -> bool
Returns true if 'name' is a directory on the file system, false otherwise
val filesize : string -> int
Returns the filesize of fname
val strip_trailing_slash : string -> string
strip trailing '/', if any, from a string and
Returns the new string
val strip_heading_slash : string -> string
strip heading '/', if any, from a string and
Returns the new string
val ls : Unix.dir_handle -> string list
given a dir handle
Returns a list of entries contained
val string_explode : string -> char list
explode a string in a char list
val string_implode : char list -> string
implode a char list in a string
val reason_phrase_of_code : int -> string
given an HTTP response code return the corresponding reason phrase
val build_sockaddr : string * int -> Unix.sockaddr
build a Unix.sockaddr inet address from a string representation of an IP address and a port number
val explode_sockaddr : Unix.sockaddr -> string * int
explode an _inet_ Unix.sockaddr address in a string representation of an IP address and a port number
val peername_of_out_channel : Pervasives.out_channel -> Unix.sockaddr
given an out_channel build on top of a socket, return peername related to that socket
val peername_of_in_channel : Pervasives.in_channel -> Unix.sockaddr
as above but works on in_channels
val sockname_of_out_channel : Pervasives.out_channel -> Unix.sockaddr
given an out_channel build on top of a socket, return sockname related to that socket
val sockname_of_in_channel : Pervasives.in_channel -> Unix.sockaddr
as above but works on in_channels
val buf_of_inchan : ?limit:int -> Pervasives.in_channel -> Buffer.t
reads from an input channel till it End_of_file and returns what has been read; if limit is given returned buffer will contains at most first 'limit' bytes read from input channel
val list_assoc_all : 'a -> ('a * 'b) list -> 'b list
like List.assoc but return all bindings of a given key instead of the leftmost one only
val warn : string -> unit
print a warning msg to stderr. Adds trailing \n
val error : string -> unit
print an error msg to stderr. Adds trailing \n
val finally : (unit -> unit) -> ('a -> 'b) -> 'a -> 'b
ocaml-http_0.1.5/doc/html/index_modules.html0000644000175000017500000000773111507240334020404 0ustar celticceltic Index of modules

Index of modules


C
Cookie_lexer

H
Http_common
Common functionalities shared by other OCaml HTTP modules
Http_constants
Constants
Http_daemon
Main OCaml HTTP module.
Http_message
Object Oriented representation of HTTP messages
Http_misc
Helpers and other not better classified functions which should not be exposed in the final API
Http_parser
HTTP messages parsing
Http_parser_sanity
Sanity test functions related to HTTP message parsing
Http_request
Object Oriented representation of HTTP requests
Http_response
Object Oriented representation of HTTP responses
Http_tcp_server
TCP servers used as low-levels for HTTP daemons
Http_threaded_tcp_server
Multithreaded part of Http_tcp_server
Http_types
Type definitions
Http_user_agent
Minimal implementation of an HTTP 1.0/1.1 client.

T
Trivial [Http_daemon]
Trivial static pages HTTP daemon.

ocaml-http_0.1.5/doc/html/type_Http_common.html0000644000175000017500000001027011507240333021064 0ustar celticceltic Http_common sig
  val debug : bool Pervasives.ref
  val debug_print : string -> unit
  val http_version : Http_types.version
  val server_string : string
  val string_of_version : Http_types.version -> string
  val version_of_string : string -> Http_types.version
  val string_of_method : Http_types.meth -> string
  val method_of_string : string -> Http_types.meth
  val status_of_code : int -> Http_types.status
  val code_of_status : [< Http_types.status ] -> int
  val is_informational : int -> bool
  val is_success : int -> bool
  val is_redirection : int -> bool
  val is_client_error : int -> bool
  val is_server_error : int -> bool
  val is_error : int -> bool
end
ocaml-http_0.1.5/doc/html/Http_request.html0000644000175000017500000000521611507240333020227 0ustar celticceltic Http_request

Module Http_request


module Http_request: sig .. end
Object Oriented representation of HTTP requests

class request : Pervasives.in_channel -> Http_types.request
OO representation of an HTTP request
ocaml-http_0.1.5/doc/html/Http_message.html0000644000175000017500000000552511507240333020166 0ustar celticceltic Http_message

Module Http_message


module Http_message: sig .. end
Object Oriented representation of HTTP messages

class virtual message : body:string -> headers:(string * string) list -> version:Http_types.version option -> clisockaddr:Unix.sockaddr -> srvsockaddr:Unix.sockaddr -> object .. end
OO representation of an HTTP message
ocaml-http_0.1.5/doc/html/type_Http_response.html0000644000175000017500000000535211507240333021437 0ustar celticceltic Http_response sig
  class response :
    ?body:string ->
    ?headers:(string * string) list ->
    ?version:Http_types.version ->
    ?clisockaddr:Unix.sockaddr ->
    ?srvsockaddr:Unix.sockaddr ->
    ?code:int -> ?status:Http_types.status -> unit -> Http_types.response
end
ocaml-http_0.1.5/doc/html/index_classes.html0000644000175000017500000000514011507240334020361 0ustar celticceltic Index of classes

Index of classes


D
daemon [Http_daemon]
Object oriented interface to HTTP daemons.

M
message [Http_message]
OO representation of an HTTP message

R
request [Http_request]
OO representation of an HTTP request
response [Http_response]
OO representation of an HTTP response.

ocaml-http_0.1.5/doc/html/type_Http_daemon.Trivial.html0000644000175000017500000000436411507240333022457 0ustar celticceltic Http_daemon.Trivial sig
  val callback : Http_types.request -> Pervasives.out_channel -> unit
  val main : Http_types.daemon_spec -> unit
end
ocaml-http_0.1.5/doc/html/Http_parser.html0000644000175000017500000001365511507240333020041 0ustar celticceltic Http_parser

Module Http_parser


module Http_parser: sig .. end
HTTP messages parsing

val split_query_params : string -> (string * string) list
given an HTTP like query string (e.g. "name1=value1&name2=value2&...")
Raises Returns a list of pairs ("name1", "value1"); ("name2", "value2")
val parse_request_fst_line : Pervasives.in_channel ->
Http_types.meth * Neturl.url * Http_types.version option
parse 1st line of an HTTP request
Raises Returns a triple meth * url * version, meth is the HTTP method invoked, url is the requested url, version is the HTTP version specified or None if no version was specified
val parse_response_fst_line : Pervasives.in_channel -> Http_types.version * Http_types.status
parse 1st line of an HTTP response
Raises Malformed_response if first line isn't well formed
val parse_query_get_params : Neturl.url -> (string * string) list
parse HTTP GET parameters from an URL; paramater which were passed with no value (like 'x' in "/foo.cgi?a=10&x=&c=9") are returned associated with the empty ("") string.
Returns a list of pairs param_name * param_value
val parse_path : Neturl.url -> string
parse the base path (removing query string, fragment, ....) from an URL
val parse_headers : Pervasives.in_channel -> (string * string) list
parse HTTP headers. Consumes also trailing CRLF at the end of header list
Raises Invalid_header if a not well formed header is encountered
Returns a list of pairs header_name * header_value
val parse_cookies : string -> (string * string) list
parse a Cookie header, extracting an associative list <attribute name, attribute value>. See RFC 2965
Raises Malformed_cookies if raw_cookies does not conform to RFC 2965
Returns a list of pairs cookie_name * cookie_value
val parse_request : Pervasives.in_channel -> string * (string * string) list
given an input channel, reads from it a GET HTTP request and
Returns a pair <path, query_params> where path is a string representing the requested path and query_params is a list of pairs <name, value> (the GET parameters)
ocaml-http_0.1.5/doc/html/Http_threaded_tcp_server.html0000644000175000017500000000510711507240333022552 0ustar celticceltic Http_threaded_tcp_server

Module Http_threaded_tcp_server


module Http_threaded_tcp_server: sig .. end
Multithreaded part of Http_tcp_server

val serve : ('a -> 'b) -> 'a -> unit
serve an HTTP request for a multi threaded TCP server
ocaml-http_0.1.5/doc/html/type_Http_misc.html0000644000175000017500000001343011507240333020530 0ustar celticceltic Http_misc sig
  val date_822 : unit -> string
  val is_directory : string -> bool
  val filesize : string -> int
  val strip_trailing_slash : string -> string
  val strip_heading_slash : string -> string
  val ls : Unix.dir_handle -> string list
  val string_explode : string -> char list
  val string_implode : char list -> string
  val reason_phrase_of_code : int -> string
  val build_sockaddr : string * int -> Unix.sockaddr
  val explode_sockaddr : Unix.sockaddr -> string * int
  val peername_of_out_channel : Pervasives.out_channel -> Unix.sockaddr
  val peername_of_in_channel : Pervasives.in_channel -> Unix.sockaddr
  val sockname_of_out_channel : Pervasives.out_channel -> Unix.sockaddr
  val sockname_of_in_channel : Pervasives.in_channel -> Unix.sockaddr
  val buf_of_inchan : ?limit:int -> Pervasives.in_channel -> Buffer.t
  val list_assoc_all : '-> ('a * 'b) list -> 'b list
  val warn : string -> unit
  val error : string -> unit
  val finally : (unit -> unit) -> ('-> 'b) -> '-> 'b
end
ocaml-http_0.1.5/doc/html/type_Http_parser.html0000644000175000017500000000733511507240333021100 0ustar celticceltic Http_parser sig
  val split_query_params : string -> (string * string) list
  val parse_request_fst_line :
    Pervasives.in_channel ->
    Http_types.meth * Neturl.url * Http_types.version option
  val parse_response_fst_line :
    Pervasives.in_channel -> Http_types.version * Http_types.status
  val parse_query_get_params : Neturl.url -> (string * string) list
  val parse_path : Neturl.url -> string
  val parse_headers : Pervasives.in_channel -> (string * string) list
  val parse_cookies : string -> (string * string) list
  val parse_request :
    Pervasives.in_channel -> string * (string * string) list
end
ocaml-http_0.1.5/doc/html/type_Cookie_lexer.html0000644000175000017500000000472511507240333021215 0ustar celticceltic Cookie_lexer sig
  type cookie_token = [ `ASSIGNMENT of string * string | `EOF | `SEP ]
  val token : Lexing.lexbuf -> Cookie_lexer.cookie_token
end
ocaml-http_0.1.5/doc/html/Http_response.html0000644000175000017500000000561611507240333020401 0ustar celticceltic Http_response

Module Http_response


module Http_response: sig .. end
Object Oriented representation of HTTP responses

class response : ?body:string -> ?headers:(string * string) list -> ?version:Http_types.version -> ?clisockaddr:Unix.sockaddr -> ?srvsockaddr:Unix.sockaddr -> ?code:int -> ?status:Http_types.status -> unit -> Http_types.response
OO representation of an HTTP response.
ocaml-http_0.1.5/doc/html/index_types.html0000644000175000017500000001341011507240334020067 0ustar celticceltic Index of types

Index of types


A
auth_info [Http_types]
authentication information

C
client_error_status [Http_types]
client_error_substatus [Http_types]
cookie_token [Cookie_lexer]

D
daemon_mode [Http_types]
Daemon behaviour wrt request handling.
daemon_spec [Http_types]
daemon specification, describe the behaviour of an HTTP daemon.

E
error_status [Http_types]

F
file_source [Http_types]
File sources

I
informational_status [Http_types]
informational_substatus [Http_types]

M
meth [Http_types]
HTTP method, actually only GET and POST methods are supported

R
redirection_status [Http_types]
redirection_substatus [Http_types]

S
server_error_status [Http_types]
server_error_substatus [Http_types]
status [Http_types]
HTTP status
status_code [Http_types]
success_status [Http_types]
success_substatus [Http_types]

T
tcp_server [Http_types]
A TCP server is a function taking an address on which bind and listen for connections, an optional timeout after which abort client connections and a callback function which in turn takes an input and an output channel as arguments.

V
version [Http_types]
HTTP version, actually only 1.0 and 1.1 are supported.

ocaml-http_0.1.5/doc/html/type_Http_request.request.html0000644000175000017500000000357011507240333022760 0ustar celticceltic Http_request.request Pervasives.in_channel -> Http_types.requestocaml-http_0.1.5/doc/html/Http_types.response.html0000644000175000017500000001746211507240333021546 0ustar celticceltic Http_types.response

Class type Http_types.response


class type response = object .. end
HTTP responses
Inherits
method code : int
Returns response code
method setCode : int -> unit
set response code
method status : status
Returns response status
method setStatus : status -> unit
set response status
method reason : string
Returns reason string
method setReason : string -> unit
set reason string
method statusLine : string
Returns status line
method setStatusLine : string -> unit
set status line
Raises Invalid_status_line if an invalid HTTP status line was passed
method isInformational : bool
response is an informational one
method isSuccess : bool
response is a success one
method isRedirection : bool
response is a redirection one
method isClientError : bool
response is a client error one
method isServerError : bool
response is a server error one
method isError : bool
response is either a client error or a server error response
method addBasicHeaders : unit
add basic headers to response, see Http_daemon.send_basic_headers

facilities to access some frequently used headers

method contentType : string
Returns Content-Type header value
method setContentType : string -> unit
set Content-Type header value
method contentEncoding : string
Returns Content-Encoding header value
method setContentEncoding : string -> unit
set Content-Encoding header value
method date : string
Returns Date header value
method setDate : string -> unit
set Date header value
method expires : string
Returns Expires header value
method setExpires : string -> unit
set Expires header value
method server : string
Returns Server header value
method setServer : string -> unit
set Server header value
method connection : string
Returns Connection header value
method setConnection : string -> unit
set Connection header value
ocaml-http_0.1.5/doc/html/Http_tcp_server.html0000644000175000017500000000675111507240333020720 0ustar celticceltic Http_tcp_server

Module Http_tcp_server


module Http_tcp_server: sig .. end
TCP servers used as low-levels for HTTP daemons


servers


val simple : Http_types.tcp_server
single process server
val thread : Http_types.tcp_server
multi threaded server
val fork : Http_types.tcp_server
multi process server

low level functions


val init_socket : Unix.sockaddr -> Unix.file_descr
initialize a passive socket listening on given Unix.sockaddr
ocaml-http_0.1.5/doc/html/index_class_types.html0000644000175000017500000000533611507240334021264 0ustar celticceltic Index of class types

Index of class types


C
connection [Http_types]
an HTTP connection from a client to a server

D
daemon [Http_types]
an HTTP daemon

M
message [Http_types]
HTTP generic messages.

R
request [Http_types]
HTTP requests
response [Http_types]
HTTP responses

ocaml-http_0.1.5/doc/html/type_Http_user_agent.html0000644000175000017500000000605311507240334021735 0ustar celticceltic Http_user_agent sig
  exception Http_error of (int * string)
  val get :
    ?head_callback:(Http_types.status -> (string * string) list -> unit) ->
    string -> string
  val get_iter :
    ?head_callback:(Http_types.status -> (string * string) list -> unit) ->
    (string -> unit) -> string -> unit
  val head : string -> string
end
ocaml-http_0.1.5/doc/html/index_attributes.html0000644000175000017500000000342311507240334021114 0ustar celticceltic Index of class attributes

Index of class attributes


ocaml-http_0.1.5/doc/html/index_module_types.html0000644000175000017500000000341311507240334021436 0ustar celticceltic Index of module types

Index of module types


ocaml-http_0.1.5/doc/html/Http_request.request.html0000644000175000017500000000436011507240333021715 0ustar celticceltic Http_request.request

Class Http_request.request


class request : Pervasives.in_channel -> Http_types.request
OO representation of an HTTP request

ocaml-http_0.1.5/doc/html/Cookie_lexer.html0000644000175000017500000000505111507240333020145 0ustar celticceltic Cookie_lexer

Module Cookie_lexer


module Cookie_lexer: sig .. end

type cookie_token = [ `ASSIGNMENT of string * string | `EOF | `SEP ] 
val token : Lexing.lexbuf -> cookie_token
ocaml-http_0.1.5/doc/html/type_Http_types.daemon.html0000644000175000017500000000415411507240333022206 0ustar celticceltic Http_types.daemon object
  method accept : Http_types.connection
  method getRequest : Http_types.request * Http_types.connection
end
ocaml-http_0.1.5/doc/latex/0000755000175000017500000000000011507240336015022 5ustar celticcelticocaml-http_0.1.5/doc/latex/ocaml-http.ps0000644000175000017500000125254111507240336017450 0ustar celticceltic%!PS-Adobe-2.0 %%Creator: dvips(k) 5.98 Copyright 2009 Radical Eye Software %%Title: ocaml-http.dvi %%CreationDate: Fri Dec 31 13:33:02 2010 %%Pages: 23 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%DocumentFonts: CMSY10 CMMI10 CMR10 %%DocumentPaperSizes: a4 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips ocaml-http %DVIPSParameters: dpi=600 %DVIPSSource: TeX output 2010.12.31:1333 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: texps.pro 0 0 %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end %%EndProcSet %%BeginFont: CMR10 %!PS-AdobeFont-1.0: CMR10 003.002 %%Title: CMR10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup /UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR10 def /FontBBox {-40 -250 1009 750 }readonly def /UniqueID 5000793 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR10.) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 61 /equal put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8 569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079 24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A 2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944 8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E 3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26 D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24 D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B 03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685 767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A 8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E 94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004 22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7 72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C 8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491 344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A 64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B 07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC 1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8 78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51 CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120 7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782 BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462 4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A 5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622 4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE 0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5 C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904 314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029 EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13 DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084 7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91 1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155 69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5 7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67 CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D 38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3 22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C 0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1 BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D 4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F 3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE 15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9 849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3 FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84 4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76 1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798 84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF 7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122 CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA 4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B 3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394 F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140 DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7 D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886 56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4 8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53 59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED 49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86 87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B 8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60 C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342 D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64 D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1 F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178 0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B 5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448 229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC 17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4 01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616 F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662 3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0 689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20 4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03 DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D 364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F 7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F 26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1 43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD 8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7 C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08 94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5 C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1 B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56 4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5 7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01 204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56 7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6 279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346 CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A 65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78 BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285 6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7 B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3 63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89 4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6 67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A 5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9 C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C 9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51 963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0 D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B 72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358 8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB 3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0 668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152 ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5 69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118 C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754 3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13 407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01 11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF 2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87 4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40 2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF 9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889 CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8 DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973 0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362 5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7 9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2 09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A 2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2 AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420 324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786 486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660 52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5 9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3 4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7 BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14 6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0 B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359 16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6 546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED 6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507 559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354 04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B 7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A 8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02 94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC 41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654 7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5 18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76 9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD E0B5622DF6FC4BF52147208D9A91EB49B03BB40DE7F8FBFB566F251942C8FFB1 1DFA50465919400C21CE4724D12E4EB47AA5F392BA927329DBCA28A78FC1DF2E 6FF27F4E4E3F8971D7BCB5F3FBF8F30C214A26E5E32E0E8CBC71BF20AE573BBB 163DD66E89F2C4E2B1A1532AE81C060146F755A1ABA3F1365FEA30B403DE7B22 76F43EDDF7CB0C5D3E3F2B9043D33654BDE23221D16CABE4D559575AC8D01281 379FC2AD33242EDDECAABC38D94B5261F13375D63207B3EEBFE27697FF9C6A98 08A260CE1264FC647AA4F80E0A2EC2EEF124A38C35F829B03305C61CF9F26DAA 1BC0457D1C7FA65DF52C453AA851A791E6993CB4BC0C0A449D6F0C01D2217330 5336C0A329988AA21A0EAC50B8762A97226A8570C956800D2BDA5431EA9CA3FB 64186466DA95E5EB4B417A2E43A627BF3874A2E20F381285D1D430D5C2711222 7387EA17E909D6BE064690A19C443A90C245E50B144E2C2143F4D5B3AA1A20E4 FAFC09B269E6CB0B 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMMI10 %!PS-AdobeFont-1.0: CMMI10 003.002 %%Title: CMMI10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI10 known{/CMMI10 findfont dup/UniqueID known{dup /UniqueID get 5087385 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI10 def /FontBBox {-32 -250 1048 750 }readonly def /UniqueID 5087385 def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI10.) readonly def /FullName (CMMI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put dup 60 /less put dup 62 /greater put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBC7878DFBD546AC2 1EF6CC527FEEA044B7C8E686367E920F575AD585387358FFF41BCB212922791C 7B0BD3BED7C6D8F3D9D52D0F181CD4D164E75851D04F64309D810A0DEA1E257B 0D7633CEFE93FEF9D2FB7901453A46F8ACA007358D904E0189AE7B7221545085 EDD3D5A3CEACD6023861F13C8A345A68115425E94B8FDCCEC1255454EC3E7A37 404F6C00A3BCCF851B929D4FE66B6D8FD1C0C80130541609759F18EF07BCD133 78CBC4A0D8A796A2574260C6A952CA73D9EB5C28356F5C90D1A59DC788762BFF A1B6F0614958D09751C0DB2309406F6B4489125B31C5DD365B2F140CB5E42CEE 88BE11C7176E6BBC90D24E40956279FBDC9D89A6C4A1F4D27EC57F496602FBC4 C854143903A53EF1188D117C49F8B6F2498B4698C25F2C5E8D8BD833206F88FC BD5B495EB993A26B6055BD0BBA2B3DDFD462C39E022D4A1760C845EA448DED88 98C44BAAB85CD0423E00154C4741240EB3A2290B67144A4C80C88BE3D59AD760 E553DAC4E8BA00B06398B1D0DFE96FB89449D4AE18CE8B27AFE75D2B84EFDB44 143FD887F8FB364D000651912E40B0BAEDDA5AD57A3BC0E411E1AD908C77DCE3 981985F98E258A9BB3A1B845FC4A21BCC54559E51BC0E6C22F0C38540F8C9490 88A0E23EA504FA79F8960CC9D58611C519D3ACDC63FB2FBCAE6674357D7F2285 4BCC9F54D3DA421D744D3A341DA3B494BB526C0734E1A8FC71501745399F7683 FD17EC3044419A88C3979FD2ABA5B0130907B145A8462AAF0A9B511D2C8A7C7F 347FF6AC057E6512902BFD2918E2CD31DE615F5D643764E900B60287670AE18F FDE15545D8BC69591A8CBBB275AFFC9B14BD68DF0AAB32268FB84844D4DBC7BB C591C1AC5102C50A9C7BAAA848DA88B0519F0F5F0813BF055CF0E3C86F633A04 B779D2E8E656DB1E09A66A85FE21CA8BA5523F472A229E83F2C4E91ABA46C733 F3C7B5775B06C97782BC225C46385BEBDC61572458EFC5CF4190AB7A9C1C92DA 29F84BAACF552089195966E3AD9E57CC914D20B6962BE80429A16D4DF1ECAA66 36C4343FADF0B2B48F12E2EB8443C4AA29D00949255F3968617F98B8ABD4CC12 048B838EE243A21AC808BD295195E4AE9027005F52258BFCA915C8D9AED9A2C0 80814F79CF943FBE3594C530A22A92E11BE80FCEC1684C4F56712D5846B0749C 9B54A979B315222F209DEE72583B03093EC38F7C5B9F9BCB21DBE8EDDAE9BE8B 75ACE6B12A31083AC8348EC84D1D29D2297A266284B7E9734E207DAF59A25F4E 4AA38509E993C5394FED76E6A2F25462685C4C86C6E8CFC9863338EC1428BDFC 74616BB1BC8948B0ED4C87C15B4405F3A7796F9DB3798FFFE8BD0A94E834817B D5E9812E308D0CC920470A6F2CD088FCB80462BF7CB3F039A7DF3DAF5B2B5355 E083A385CD2EAF0FC181E40E96DD7E9AB9EF5C7E6866A13B8A54718E950FE097 EF0951A357114F18CE9933D28B3A77AA71E3CE884661F13284BCED5D5FD1A86D 543E588FF473DC2CF9A4DC312500135F29C2D0174B32018C8DBD40EF9A232883 710A1F2AB2CD11312300ACDF789A9B7B93D2035D81D1C84984D92D78A53A00C6 EDA94B24BBAC1AD17774A4E07E6F74ABD90415965616AD540C8ECD8C3A44EE4F 7F4F6BB6238C5062D63FA59B7BF08BE93FAEA70A2AB08FBEAAF7DBF56B95FD93 03CA406543BA6C9527D0DF01F5108D31A51778A5EB1C93F27B72B46146A353A2 01CACBC829603B9989A87CF64528682CCBA0562A8165B185C58A5C6BB72F5E89 500ACCAAB8ECEFBB2640E99EAEEC4EA979AA793D013D61D8ACF8784FF8D9398F F6A252A709324FB39509F0B3A4E725E82F53543383C6765BE556CC897C758208 AA3AD37B0406E4A79F8F0A6C1983FC73E71CD858C0DB66ED66D5D992978614EE 1EA91EBE191E082EBA1FC040AF19A2202575C2EBEB8058833E3520FA03D2F915 85C1ED337E457B9FEEB0C6EF2735EFDA6E0D05FA641BCF698AC6B97751E8306C 4DF00A39B8581FF53DB8F8525FDB196D85950906CCB59B8EF171349AA3B567B1 6A00819947A995FB383C3C1709C9A2C113B2E40BB832B7D4A0FBA0B16A2C455F 55809CC425C403E9668DC66BE45B71A81C332FD4DB279D22A2959962304A8F18 085893DAC61317D24A8F198FDAB95F3B86F0AFD35047B868A9A17037A2829A02 BAB042F75F349E197A7EED41984C2859754CAFD0251439921C248B463B516951 2E1322C80D73F9CBCAA63A585450275AC2492E4D3FB78E800F788254DB5E610D CF788DF5C70FF99892BCDF16133E34B24B77C8F097F546B87C603DDB8998B66E BACB68BA27462AF54AA405682EC96D701F0D474DECD5F95CA2102DF639EB169E D518162C2BAE45FF698B6DE15FC6E7DE48C336C40A670FD26952A6BAB09115E1 991F0073419F2CC2A1C08BE91096936AA0C37E4ED3CCCEE235476074B8FF1125 6BDE3701F85532D8BB64CCC927CC335281C95EA689706F0AC717DC2CF680C754 E5EFD7FA4BB8880B2B727A964C876D4A223069D4E6001771F0E23EAD2A4BBC80 E76675297B2EF05F52BF4E71B3EE2BE3048CF088C79540113C66AE98B2FD3CB1 B0741A215FD070882C52765009D7D711DAA2508F19AE7DDA15229A856AC49BC3 4DDF40814FF96500E4B9B02D412E94623C5FDCC76C0FB8E42DF56A904FE49D65 1DA7C53901B2EA71AB658A464D3ABDE27D9DB8D9E0B48F64E61A2495AD5D8DAB B5E72424AD017DF37964AF911BD7FA21A5EB4775DC8E95EF0C0EB856B00D89D7 8172A1DE8530767D317B8256103E53CFB877E10686A04F5A08F8DC58D843DEBA FD5F40597588663D103689F6EB3EB14D06E18C8078F2538B43E712DF491FC5C6 AF639256C8C6134B64D560D8476DEA6329D995E46CC4BC78841C59E73648B47E BFA7DE0846422F738454AE77E822A083405289247BD7C478BE4974F742CD6051 E99FBB1D1B3FBABFEE855174734EE45E87D0AADF32B1283B911162A9955847FD 38944D70584FAA6B1A7191C5C134B73F98EB632B69E2F0C0F94156787C34C8A3 7622A029D58F9626B74F8A8A1F3803E0BC20E0EADEB1E99B70F1BD9F980FB751 2A842843DE42EB142A84D5D3138629AE9EAF6F3479C423E8829C8816FA6EFA27 DCE5580E65AA9854B1C64163DC318420CD993C15BFD76A8BA1182860A6B03D6D 22B8CF43CFE6C8AB27C64842E239CAE707D3086BADDE1D7C94E3BC96319470D6 8D26915C575CFDD03271D6BB9DE86A0EB6EEA6E768B224A626C62A9AB48A6EDB 44F70BB5AF991CDF9736D65933E81CC57A78F623F33EC9AF535F2F25FA4EEC90 D50DB7E87F31E971A75A33A301CA6013EEC5A4E179D695B33DADF2C98364434A 42926776000B610E17524162253F6FA638D6581C18F99EA0BD1D2E24D2424ADF C05010D08192485153DD03930C7BF45237593E484F9851E6D464FA10FECA5D9E 0C8CCC97DE029030900CDBB491C5CF226DBF903CFE7735D939C3FDF3A20B70CE 66579B28B99313FEE914E295388C7BC8E055A2E54EA3A8206D3C8F4F7C0BA5E6 E519419FD8CE215F7B8E9BEC604A9E3FE272A0328A24E31997C8A91E0946BCF1 6943A97CBED2AB9FC636B49828BBB8B89E0BBC2653796431224895ABA5DAC41E 1854BD9764E86147FD7624F736F40DE3B7582EDDFD15C2BDE3F22B5A54D7DF10 B87A1301CE85CFC061689A890A321412A13314AE96DCD3EDA75035FDD8F4AB9B 897A2C68263A68457032C469987970648BA2D88B1C5375DFEAA35A917B8A952E EE670427942AEDB3CB599C5746180E392837D371E15D860620ABDB6AA7772C40 A5E346661673ACA530BE3D8E3FFB895E5DA3DC23B1B43C080C77F7E47847F0F3 F3AA5CA9E4BF75FC5EBD18D19F21A7DAA3B11CABC6E4070A15F7DBC8B05EB6AA A02EF1B078EB66D61D6AFE41DA9B36FE7EC9EF94D1EA26282A9871E2CACB3126 2AD49C2D9B50A6E47D8F2CCAD50992D1B430979A45FD9E76182A19964BB2A1F6 51779A2B258DC1DF4C2F3074621286831F3848AC152DDD2BA561E6586ADA88D3 598A2CE2CD048F027CE0008B828BD915887D7785341E8305DF2346ADB76BE99F 87B02173BDC334E9221C8DF54114A6B24C1C5340299512FA6C8C51AB4C8778CE 178CEF531C6D1B5FF0A1BE8EFF767F959BD4C345C52699A29A17B2A230842BF6 4B011217D6D24EDAC3F6D53482786F1CA33169B90ECD499407D37CE9B70DDF78 7B7547B32952535BA9ACD1E244447AE3FCED3AF28717083CF9590A09780984D6 AF0743C82AE4FB3E2BB2856A4153A3967A023FFC35382D6C22D84A924900B6A6 3DDD400E6D2418DA6C27F2FA34C075C902B89EBAE658B3C9A18EEE449DA5A379 337DE95CB7AB3F0970CF1A5D8FAD8090E495570FDFB2FBBA79244780D8035547 C5A55BB21A2270F724BF5D442CDC5BB9F09BE0CAE59B1C2270F0BDACE698F2C5 DE8F66BFB9634904B161F5BA2B1950048300D69BABD312D58D89C4ED527AF7BA 7DA2478EDC2CDEE3473DD8A8ED9D891CD1FC21F23013228BB3281B71FCE959BD 6F8E9059D682A7FCC5265A0620992D4FA8D78377EB34CE3ECA070EE3707239BC 98907DB0120CE42ABA32CF97127E28382BDDFD685674279F588D4F951216C355 821361790F64C2CC720DE97E8ECB57326C43EE47367628E05769E106868B54F4 C33C9951908DF6FC4F5ED2C7787BD8FA591BBB3E9C6C1DA94CC5E38D9B20C886 7D237572FF46DD896A4D6163408EA6CEFAC398EE041EAE29D577E75326CA17A6 B072D47A7B13EC441CE6DAA042ECD02134CBFA6809A435050413817193DAEB16 A5882C8AEA44BCF36E74E9ECCDFE7E19FF5A5DD7A94E5AB4F8702C3DA7F42325 23C808670A0490F5B373DADE40814FF9650241D3D69C91FBC5ECE728F827D9BF C928602E05477903449E079164CA39859C4BCA60C579F490AA455F82B5050BB3 969AFB478E0D4A257B3356EA3CD62051FCE6C6B1929CFF85BFDF166BEF658E10 3A55E007F38EBBB248B3F0B8ED1925106B499B762E45113AE1AC9DE09644C84B 9C08034B297314EE69BC32DB6E7D7FB9913CE5AC17E7335979E9DCCE2BAB3725 1976155551F9706A576FE0E3ADCCF72C87683291528ECB749CB0ED291966E239 B5E3630676BD409E08F85BC1AEC9A2D4135376284A96EA24431243BD6FE8B966 95F11A4BB53F392E0AEFEA623064FF8A7002367B0A515635CB2D2DDFB9B4A8D7 FE721754E81BBA548848A235B91AD4E4F7DB19CCE2F61D277FC00AB956EB93BE 44AB4970CA56BF59506C94ED160FB1E25D3DF2988A532BDB787BFB8539D22986 FDC378AC31444E63C4727FEE121A43751043849E6DCAC5B59D0FC703AAFBBFD4 E8B7C268F21615AD02CE9DABEFA27B5FE6A6441B619539CAB1F810F1263447AA 633F5DAF483752EF1A0421740E3A811D2D2898CBF53E7F686C9223FD7235F02D 6F90D2D48CC20AB87778DE3C6FB335E0F0EC20B5DC5B65223FE117526DE2C72F FE839DF93CB2A7D66CD900CB325F891E311BEC932F703FB4FEFA29DB8B9C88DD 375EC71B3D58C7BC59ADA91971A3BDA1ADEA629CE6CC92BD542CDDFAA7706FB2 6CDDE2DF07E56D6741916AE8E8744339816F3E6C38062747AA9FDA2A2678A6B7 EFEA870AA3A4D71B25EE3013EAB1DBA34401B867C7A41AE51E0421D41D3BB83C E120C8FEABA6E5DEC53A689C21426D4BBCB68CB37568761C360E6D4E3596FB7D F4DEC7918E58C0293D12D6DDA7E9DCDAAD7C939F55CD1BC4A228B31E9A904156 DA6B40B08E6ACE674618B768DD681C772A3E55FE096CF949CF3B0460ABDCD891 D17B37B355B29AB5137899C036F31DA026244FA25FB798FBE5105BDA29F46538 D3D3AC1001A7BCECE64DE94FFE6C354166A0F97256137BDFA07F6E22A3D1D2F4 9588DBAE95E895BC5E64DDCBBAA8D0A22C229B42CB717FC711E7E9DF793DF80B 9F14754585A3C7E17F37B32924B9F9870DA8635E3E18BD1DCD81EDF01834D9C6 B33F23C956C2FCBFA47D84422F583459D827D1E120B97694D12F1F54D02379C0 D288F7104F3FFCF4F76E3494F4ACBD1BE3A15543CC680924C78A473F8E311ADF 8FE00A04C6C393DE61AD3EDA5BC031E2353076A2489391B52632387CA28A7B93 FBB065A6EF3658AE80B1ADA47E9B2539E73A71FA75645F85ED8ECC257FB4CF26 B6C912DE9D0F9899E70BECCB934AD32CF49A093371A9F73DE6255EBC39DE1E7F 00D0CBDABD4D0383977E694890E71FBE5C376BE5F3A80C28987417504F515C50 909F3D31178BB9B1D085BE514F71B910A9085BD6122DDC72A150BFE266920E49 5661BCB4BAB51D6DEFE32B616963DBD989FCDD1637B294CE4E288655FBEFA1BF 7F25BBF8CF17C2D5FD161A7C2CC9CC7490D9BF15A1D35B3BFA43ADE256E88BDA BD490D92907C57BAC408A575EC84D6AEE070148C7C9A91C03B09FDBD792E8FF0 C0B886AAD2EDD86541E5E579359D40E3AC312ACD3D8FD49F71BD533DDF8859B1 BAF17F1884E331DD07CEEF93B71D492AEBAADF7A263450A7A72210CE630A0D37 BF024BDC09ACC882816B8C22C62AE38A3A8D0F6EBC2B1B2C0B8161A8B076DD5D 4B779C0788546BB4CF57332230D237856B00D79C28A7C01D11F44B7304F69075 94B97A745DA43D1BE561372CE611C345A843834E46AD9DDB16CABCD3FA33D6F1 F6B5C0497F5EE5400B305CDC16A7EC286AA4D45D0EEBB9DA06AC9C5294D68EC9 E4DC3CA2B92CE8FC0526184A86EDC7AB34D67E60AC12D9CA8FD300235EC968BA 92C6FBDA47572BC5600F25249F60AD287CBDAE980E747FCBE7EE5CD323E733F0 63553B494D3DDEB9CC1480B5C3BB79A28E419AA65B18CB297AB383419E890E2A CE6F98C9900CCB4675280A10CF060B8D220DDA1BE55DFA65715EABCC1AFAA271 B1F8732341613E17B231231A0D24D4D7FC198AE04D89A99C4536217769C6FBD9 5EE24A6302F97438F7C0E311C878F674B4477A5ADA3952CDE4055AC408B8174E 86F8FB797646DFFFE0ECA25D1BAB9A9F71F3926D3D85AA63E7A8C931D71E79E0 AF1EAC26FADE468F4FF7F3861D14C10E3BE1F9EAFD6D3A544E8108D5DAB5B180 3950C74818BC8AF4758A108F462EF1826647A49667F5E482038C54716856D9BC 35F29922846D2148F92F943E951D7438C73D6A60459A8003174036C64E1629CD 155D47FD04B03C023AD67CD5A70C98AB556EEAB8C48169706E5B352F6505D580 AC945171BFE62E81F8F500438AC3B64D857BA5BC54C2C4BBB237F8FA51296255 E66A92A61FE13FDE781D393557EB72CEBAD86511035F775FAC39A0479CCD400F 226709118F887F47CC2ECC8F79816D4A945B2845F50AFD62D8C9A9BBF4739496 9E644BC9F7B04803B7EE75A09EAE94365F6F374B4FCEB0B506C76297564B9B6B 8B812BC3A33929AA94692572B010E6210AEAA312BDFC88BF302244AB9D587A9B 919823FD01DE12438D960944D1977800FEB49E638C32E5B188B1CA033E0C37EE A142F746367888AA119535F0CCAF7EAA461B790EB089D2D6962E28A398439BB7 9C9943654D7A2D765B46BC0DD1F915327F369162E1BA1BA83110B93F442905E0 523BFF5E279508A98568CD5CFD18FABBE9D17265A9081E7BF64155A2CE3C0DF7 88D00671AD65654709589BAD7EA65BBA811387ABA5CA0BC3F66D3D48597A0D1D 2C268375DF47CCF62166262AE4840AB03BF49BE67A05EF66328EC729F03CA5FF AD3937FC053E223303565DC771ACF32E63DFB96D5030E787961D72D02C195C66 B48E9AF0309DC169CFE8D16E2818DA94693A18F027DEA0D91051800EE6C54285 AB0594D87D05EB4CB44FFC094DA0072AE7D4BF2F4F9BB812FED256B937BC2574 8C529F97ABAE081B0702A3349EC9A6641770F5E9F75CBD40A2C2BA1DBD67A5CF D70BE80E6FEA2DEC57585BC12DD19303032F784B5EA8A81B9F57068AE5ACB44C 9F238F165B21A92EB04D52A426EDAC9C51AA89590A9FE55EDD61D4DEA371A755 470BA3003F4A2C090541FF7338D596C136190843524476A243575ECAF29C73F9 77FEA4CBE6A6B2F78681D8F646CECE4A2FB1DD76480AD3B1F887422DD5ACF9FF F0778F9CACFE4DEE5085B01A48F1568BAD834879452B01750AD448731F9C4FBA D695860DEFE1FA3FDF7EB0E91F3970017B4AE918E58DB0CC3C002A0EB03811DF 56C850E2D9A2D0B8725FD5CC26DA65923007A0756A1F0F558E92DBDE57FB1368 DCC00D70A3DA5D9C2620A5E366D2E48F05D6F8228EC0D101E3E2CACA9EEB4D7E 9D74FF5175802E1C15E5DBEB7A9BFC5E31ABE9F50D35E35C68E07C398C79D3DE 25E000CA48F61BB6A3EDB84BF5A44CF67AC30C5DACE75F9991F188DEA89E8F5A EC160CEF0ED1AD45CC8FC1172F02372E312505 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSY10 %!PS-AdobeFont-1.0: CMSY10 003.002 %%Title: CMSY10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSY10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup /UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSY10 def /FontBBox {-29 -960 1116 775 }readonly def /UniqueID 5096651 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSY10.) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 15 /bullet put dup 20 /lessequal put dup 33 /arrowright put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD 028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4 3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021 91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2 E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A 11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97 C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857 D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20 B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3 93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F 10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D 7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B 491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6 019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6 915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36 356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0 5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D 9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64 3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1 FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252 720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5 D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726 BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5 7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377 DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56 AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7 A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E 0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743 AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18 CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023 0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD 5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B 5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB 54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809 E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906 4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378 4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4 038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4 B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308 5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837 A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD 2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246 455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03 16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C 16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F 483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352 67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2 3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472 1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770 93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA 051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B 8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4 8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436 6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0 06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7 84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0 D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6 DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB 0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD 8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34 754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406 1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05 CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523 1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F 153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02 905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718 617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2 8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A 98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278 53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B 888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D 052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501 A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F 07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56 B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672 10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2 CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D 3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12 D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F 849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16 648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE 84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA 2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD 2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204 9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0 B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7 135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939 C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782 7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0 4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2 9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171 050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486 3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271 C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8 843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342 CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50 3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175 19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946 FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0 17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6 8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003 F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194 1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E 4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194 2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929 9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593 E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB 8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027 04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5 C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404 ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C 4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909 84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6 C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6 09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777 D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503 56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF 035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333 CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663 B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B 0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9 33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6 4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E 2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5 88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37 17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0 55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50 2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3 406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8 AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B 60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388 C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6 5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50 822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E 94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02 D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA 343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE 894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5 DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327 DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F 8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324 A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270 E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947 DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC 4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653 5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1 02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8 88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70B1491 307A6D9A2F2BA5099C8A07762E70BDAA74BA5E2BAB260C1352107EB8A96523D9 4BA3082B99772D585329AB8645C3BBD11D72BA01F95CCF11C6DEBFDAAF7F5C4D 795F99DAE6A8D59462D759001BBEBB59AB0C322EFE02904D82B424649C2FA593 0E23281DECC5AA908E54244566055D418602EEDBE78843300158908F77C0AC75 9562065826D34C38C598D8626BFED7CB672F132E065E2C27932F709935988376 94901EBAEAEC410E2B36575A71EBB8954C3A90EEC264E6115950FC91D0D54999 323D8B4FF8129A8EEC3900A00CCB026E6943BE105BF5F504AB332FC17E568681 F423D1125A596766BE58ADC658888DB39BA74F67CE0E26C392220832FB036E93 7587E96684BFB78BD035F54AF71B2408241AAF548F996AD440155624B3EDDC79 2102EE58E1E27EAA0675F1F13297A4CAF514CB319E58D424A820B8F489849879 318727C1DA0210C5CB197EBFB73A079929B1165E25679B60E72E2BB02631FEC3 CA5F25F5BCD827F23FDDAF58A888C403880E4E35037A8FFBA4B184C6783E6BA7 94E2B49ED3C490D140901C913AB9BEEDCE223DA1161D6302D6AB6E52BDCF5361 0B3359290AF0C6D4E507FE6C285DF15143F0E4FA26ED2BD186D3B309896AFC0F E5B4628817E6349200578DC07365F32E28B0161B3DB97DBDED52F6A422745ED7 137DB0FA14DA2AE2275529793C3698CC8900C2CCA6BA36E3525EF8AD5ED3278E C53F10DC7324F1A6DE8B98AF382E678472701E8271E0539A096243E9741E4E0F C93E81131152AECE76F5BBB7860823ED7E9D2FA6DCDD3E3DC85E8F170D89D6C4 246A0CE21BD731B1261EC832E3D6FEC650FE113F0297D59DCE237DF6E37F8FF2 BFDD80197A52EB6A353528EA2A9CAC645E8FB0630C32D35201C2FC7E64454D4A 083112BD65C505B677BC274388A7E6FA7A9CDE9AF3A89D599652B5606AE13DAB 31249CCCC02E0F681306BB74F4FB9C03C153D59F48E59F4203CE3AFA106093A3 EACD0C9EB51CF11D13EC0ACE0B46E82AA8FFC9A1DD864A8E00969007F5663834 60D2B0E3AA7377555C3721D9C293CCD687EE44D04ADA10E8C4EF26BB73 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont TeXDict begin 39158280 55380996 1000 600 600 (ocaml-http.dvi) @start /Fa 194[71 61[{}1 90.9091 /CMR10 rf /Fb 193[71 1[71 1[25 58[{}3 90.9091 /CMMI10 rf /Fc 222[91 12[71 4[45 15[{}3 90.9091 /CMSY10 rf %DVIPSBitmapFont: Fd ecbx1200 12 32 /Fd 32 121 df<0000000FFF0000000001FFFFC00000000FFFFFF00000007FFFFFF80000 01FFF803FC000003FFC000FE00000FFF0003FE00001FFE0007FF00003FFC000FFF00003F F8000FFF00007FF0000FFF00007FF0001FFF8000FFF0000FFF0000FFE0000FFF0000FFE0 000FFF0000FFE0000FFF0000FFE00007FE0000FFE00001F80000FFE00000000000FFE000 00000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000 000000FFE001FFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF 80FFFFFFFFFFFF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF80 00FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000 FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FF E00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE0 0003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE000 03FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003 FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF807FFFFFC1FFFF FF7FFFFFC1FFFFFF7FFFFFC1FFFFFF7FFFFFC1FFFFFF7FFFFFC1FFFFFF38467EC53E>28 D<07C01FF03FF87FFCFFFEFFFEFFFEFFFEFFFEFFFEFFFE7FFC3FF81FF007C00F0F788E1F >46 D<000003C000000007C00000001FC00000007FC0000003FFC000003FFFC000FFFFFF C000FFFFFFC000FFFFFFC000FFFFFFC000FFC3FFC0000003FFC0000003FFC0000003FFC0 000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC000 0003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC00000 03FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003 FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FF C0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0 000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC000 0003FFC0000003FFC0000003FFC000FFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFF FFFFFFFC264177C038>49 D<0000FFE00000000FFFFE0000003FFFFF800000FFFFFFE000 03FFFFFFF80007FC03FFFE000FE0007FFF001F80003FFF803F00000FFFC07F000007FFC0 7FC00007FFE07FF00003FFE0FFF00001FFF0FFF80001FFF0FFF80001FFF8FFF80000FFF8 FFF80000FFF8FFF80000FFF8FFF80000FFF87FF00000FFF83FE00000FFF81FC00000FFF8 00000000FFF800000000FFF000000001FFF000000001FFF000000001FFE000000003FFE0 00000003FFC000000007FF800000000FFF000000000FFF000000001FFC000000003FF800 0000003FF0000000007FE000000000FFC000000001FF0000000003FE0000000007FC0000 00000FF0000000001FE0000000003F80000000007F0000780000FE0000780001FC000078 0003F80000F80007E00000F0000FC00000F0001F800000F0003F000000F0007C000001F0 00F8000003F001FFFFFFFFF003FFFFFFFFE007FFFFFFFFE00FFFFFFFFFE01FFFFFFFFFE0 3FFFFFFFFFE07FFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0 FFFFFFFFFFC02D417BC038>I<0000FFF000000007FFFF0000001FFFFFC000007FFFFFF0 0000FF007FF80003F8003FFE0007E0001FFF0007E0000FFF000FF80007FF800FFE0007FF 801FFE0007FFC01FFF0007FFC01FFF0007FFC01FFF0007FFC01FFF0007FFC01FFF0007FF C01FFF0007FFC00FFE0007FFC007FC0007FF8003F8000FFF800000000FFF000000001FFF 000000001FFE000000003FFC000000007FF800000000FFF000000001FFE00000000FFF80 000007FFFE00000007FFF800000007FFFF00000007FFFFC000000000FFF0000000003FFC 000000000FFE000000000FFF8000000007FF8000000003FFC000000003FFE000000003FF E000000001FFF000000001FFF000000001FFF800000001FFF800000001FFF80FC00001FF F83FF00001FFF87FF80001FFF87FF80001FFF8FFFC0001FFF8FFFC0001FFF8FFFC0001FF F0FFFC0001FFF0FFFC0003FFF0FFFC0003FFE07FF80003FFE07FF00007FFC07FE00007FF C03F80000FFF801FF0001FFF000FFE00FFFE0007FFFFFFF80001FFFFFFF000007FFFFFC0 00001FFFFE00000001FFE000002D427BC038>I<000000003F0000000000003F00000000 00007F000000000000FF000000000001FF000000000003FF000000000003FF0000000000 07FF00000000000FFF00000000001FFF00000000003FFF00000000003FFF00000000007F FF0000000000FFFF0000000001F7FF0000000003E7FF0000000007E7FF0000000007C7FF 000000000F87FF000000001F07FF000000003E07FF000000007E07FF000000007C07FF00 000000F807FF00000001F007FF00000003E007FF00000007E007FF00000007C007FF0000 000F8007FF0000001F0007FF0000003E0007FF0000007C0007FF0000007C0007FF000000 F80007FF000001F00007FF000003E00007FF000007C00007FF00000FC00007FF00000F80 0007FF00001F000007FF00003E000007FF00007C000007FF0000FC000007FF0000FFFFFF FFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF800000000F FF00000000000FFF00000000000FFF00000000000FFF00000000000FFF00000000000FFF 00000000000FFF00000000000FFF00000000000FFF00000000000FFF00000000000FFF00 000000000FFF000000007FFFFFFF8000007FFFFFFF8000007FFFFFFF8000007FFFFFFF80 00007FFFFFFF8031417DC038>I68 DI72 D<00000007FFC0000000000000FFFFFE000000000007FFFFFFC0000000001FFFFFFFF000 0000007FFE00FFFC00000001FFF0001FFF00000007FF800003FFC000000FFF000001FFE0 00001FFC0000007FF000003FF80000003FF800007FF00000001FFC0000FFF00000001FFE 0001FFE00000000FFF0003FFC000000007FF8003FFC000000007FF8007FF8000000003FF C007FF8000000003FFC00FFF0000000001FFE00FFF0000000001FFE01FFF0000000001FF F01FFE0000000000FFF03FFE0000000000FFF83FFE0000000000FFF83FFE0000000000FF F87FFE0000000000FFFC7FFC00000000007FFC7FFC00000000007FFC7FFC00000000007F FC7FFC00000000007FFCFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007F FEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007F FEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007F FEFFFC00000000007FFEFFFC00000000007FFE7FFC00000000007FFC7FFE0000000000FF FC7FFE0000000000FFFC7FFE0000000000FFFC3FFE0000000000FFF83FFE0000000000FF F83FFF0000000001FFF81FFF0000000001FFF01FFF0000000001FFF01FFF8000000003FF F00FFF8000000003FFE00FFF8000000003FFE007FFC000000007FFC003FFC000000007FF 8003FFE00000000FFF8001FFF00000001FFF0000FFF80000003FFE00007FFC0000007FFC 00003FFE000000FFF800001FFF000001FFF000000FFFC00007FFE0000007FFF0001FFFC0 000001FFFE00FFFF00000000FFFFFFFFFE000000003FFFFFFFF80000000007FFFFFFC000 00000000FFFFFE00000000000007FFC000000047467AC454>79 DI<3FFF FFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03FFF FFFFFFFFFFFFE03FFE000FFF8003FFE07FE0000FFF80003FF07FC0000FFF80001FF07F00 000FFF800007F07F00000FFF800007F07E00000FFF800003F07C00000FFF800001F07C00 000FFF800001F07C00000FFF800001F07800000FFF800000F07800000FFF800000F07800 000FFF800000F07800000FFF800000F0F800000FFF800000F8F000000FFF80000078F000 000FFF80000078F000000FFF80000078F000000FFF80000078F000000FFF800000780000 000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000 000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000 000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000 000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000 000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000 000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000 000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000 000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000 000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000 000FFF800000000000000FFF800000000007FFFFFFFFFF00000007FFFFFFFFFF00000007 FFFFFFFFFF00000007FFFFFFFFFF00000007FFFFFFFFFF000045437CC24E>84 D<0001FFE0000000001FFFFE000000007FFFFF80000001FFFFFFE0000003FE007FF80000 07FC001FFC000007FE000FFE00000FFF0007FF00000FFF0007FF00000FFF0003FF80000F FF0003FF80000FFF0003FF80000FFF0001FFC00007FE0001FFC00003FC0001FFC00000F0 0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000000003 FFFFC0000000FFFFFFC0000007FFFFFFC000003FFFF1FFC00000FFFC01FFC00003FFE001 FFC00007FF8001FFC0001FFE0001FFC0003FFC0001FFC0003FF80001FFC0007FF80001FF C0007FF00001FFC000FFF00001FFC000FFE00001FFC000FFE00001FFC000FFE00001FFC0 00FFE00003FFC000FFE00003FFC000FFF00007FFC0007FF8000FFFC0007FF8001FFFF000 3FFE003EFFFFC01FFF80FC7FFFC007FFFFF87FFFC003FFFFE01FFFC0007FFF8007FFC000 0FFC00000000322F7DAD36>97 D<00003FFC00000001FFFFC000000FFFFFF000003FFFFF FC00007FF003FE0000FFC001FF0003FF8003FF0007FF0007FF8007FE0007FF800FFE0007 FF801FFC0007FF801FFC0007FF803FF80007FF803FF80003FF007FF80001FE007FF80000 78007FF0000000007FF000000000FFF000000000FFF000000000FFF000000000FFF00000 0000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF00000 0000FFF000000000FFF0000000007FF8000000007FF8000000007FF8000000003FF80000 00003FFC000003C03FFC000003C01FFE000007C00FFE000007800FFF00000F8007FF8000 1F0003FFC0003E0001FFF0007C00007FFC03F800003FFFFFF000000FFFFFC0000003FFFF 000000003FF800002A2F7CAD32>99 D<0000000003FE0000000007FFFE0000000007FFFE 0000000007FFFE0000000007FFFE0000000007FFFE00000000001FFE00000000000FFE00 000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE0000 0000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE000000 00000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000 000FFE0000003FE00FFE000003FFFC0FFE00000FFFFF8FFE00003FFFFFCFFE0000FFF807 FFFE0001FFC001FFFE0003FF80007FFE0007FF00003FFE000FFE00001FFE000FFC00000F FE001FFC00000FFE003FF800000FFE003FF800000FFE003FF800000FFE007FF800000FFE 007FF000000FFE007FF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00 FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FF F000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE007FF000000FFE007FF0 00000FFE007FF000000FFE007FF800000FFE003FF800000FFE003FF800000FFE001FFC00 001FFE001FFC00001FFE000FFE00003FFE0007FE00007FFE0003FF0000FFFF0001FFC003 FFFFFC00FFF01FEFFFFC007FFFFF8FFFFC001FFFFE0FFFFC0007FFF80FFFFC00007FC00F F80036467CC43E>I<00003FF800000003FFFF8000000FFFFFE000003FFFFFF000007FF8 3FF80000FFC007FC0001FF8003FE0003FF0001FF0007FE0000FF800FFC0000FF801FFC00 007FC01FF800007FC03FF800003FE03FF800003FE07FF800003FE07FF000003FE07FF000 003FF07FF000001FF0FFF000001FF0FFF000001FF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFF FFFFF0FFFFFFFFFFF0FFF000000000FFF000000000FFF000000000FFF000000000FFF000 0000007FF0000000007FF0000000007FF8000000007FF8000000003FF8000000003FF800 0000F01FFC000000F01FFC000001F00FFE000001E007FF000003E003FF800007C001FFC0 000F8000FFF0003F00007FFE01FE00001FFFFFFC000007FFFFF0000001FFFFC00000001F FE00002C2F7DAD33>I<000000FF8000000FFFE000007FFFF00001FFFFF80003FF8FFC00 0FFE0FFE001FFC1FFE001FF81FFE003FF81FFE007FF01FFE007FF01FFE007FF00FFC00FF E00FFC00FFE003F000FFE000C000FFE0000000FFE0000000FFE0000000FFE0000000FFE0 000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00000FFFFFFF8 00FFFFFFF800FFFFFFF800FFFFFFF800FFFFFFF80000FFE0000000FFE0000000FFE00000 00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF E0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0 000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000 0000FFE0000000FFE000007FFFFFE0007FFFFFE0007FFFFFE0007FFFFFE0007FFFFFE000 27467DC522>I<0000FFE0007E00000FFFFE03FF80003FFFFF8FFF8000FFFFFFFFFFC001 FFC07FFF3FC003FF001FF83FC007FE000FFC3FC00FFC0007FE1F801FFC0007FF0F001FF8 0003FF00001FF80003FF00003FF80003FF80003FF80003FF80003FF80003FF80003FF800 03FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80001FF80003 FF00001FF80003FF00001FFC0007FF00000FFC0007FE000007FE000FFC000003FF001FF8 000001FFC07FF0000003FFFFFFE0000003FFFFFF800000078FFFFE0000000780FFE00000 000F8000000000000F8000000000000F8000000000000F8000000000000FC00000000000 0FE000000000000FF000000000000FFFFFFFC000000FFFFFFFFC000007FFFFFFFF800007 FFFFFFFFE00003FFFFFFFFF00001FFFFFFFFFC0000FFFFFFFFFC0003FFFFFFFFFE000FFF FFFFFFFF001FF000007FFF003FC0000007FF007F80000001FF807F80000000FF80FF0000 0000FF80FF000000007F80FF000000007F80FF000000007F80FF000000007F80FF800000 00FF807F80000000FF007FC0000001FF003FE0000003FE001FF0000007FC000FFE00003F F80007FFC001FFF00001FFFFFFFFC000007FFFFFFF0000000FFFFFF8000000007FFF0000 0032427DAC38>I<007FC000000000FFFFC000000000FFFFC000000000FFFFC000000000 FFFFC000000000FFFFC00000000003FFC00000000001FFC00000000001FFC00000000001 FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF C00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0 0000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC007 FE000001FFC03FFF800001FFC0FFFFE00001FFC1FFFFF80001FFC7F03FFC0001FFCF801F FC0001FFDF000FFE0001FFDE000FFE0001FFFC000FFE0001FFF80007FF0001FFF00007FF 0001FFF00007FF0001FFE00007FF0001FFE00007FF0001FFE00007FF0001FFC00007FF00 01FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001 FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FF C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00FFFFFF83FFFFFEFFFFFF83FF FFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFE37457CC43E>I<007C0001FF00 03FF8007FFC007FFC00FFFE00FFFE00FFFE00FFFE00FFFE007FFC007FFC003FF8001FF00 007C00000000000000000000000000000000000000000000000000000000000000007FC0 7FFFC07FFFC07FFFC07FFFC07FFFC003FFC001FFC001FFC001FFC001FFC001FFC001FFC0 01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 01FFC001FFC001FFC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18467CC520>I<007FC000FF FFC000FFFFC000FFFFC000FFFFC000FFFFC00003FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000FF FFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF8019457CC420>108 D<007F8007FE00000FFC0000FFFF803FFFC0007FFF8000FFFF80FFFFF001FFFFE000FFFF 81FFFFF803FFFFF000FFFF87F01FFC0FE03FF800FFFF8FC00FFE1F801FFC0003FF9F000F FF3E001FFE0001FF9E0007FF3C000FFE0001FFBC0007FF78000FFE0001FFF80003FFF000 07FF0001FFF80003FFF00007FF0001FFF00003FFE00007FF0001FFE00003FFC00007FF00 01FFE00003FFC00007FF0001FFE00003FFC00007FF0001FFC00003FF800007FF0001FFC0 0003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF 800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007 FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001 FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC000 03FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF80 0007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF 0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FF C00003FF800007FF00FFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FF FFFF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFE572D7CAC5E>I<00 7F8007FE0000FFFF803FFF8000FFFF80FFFFE000FFFF81FFFFF800FFFF87F03FFC00FFFF 8F801FFC0003FF9F000FFE0001FF9E000FFE0001FFBC000FFE0001FFF80007FF0001FFF0 0007FF0001FFF00007FF0001FFE00007FF0001FFE00007FF0001FFE00007FF0001FFC000 07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007 FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF 0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00 01FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001 FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00FFFFFF83FFFFFEFFFF FF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFE372D7CAC3E>I<00001F FC0000000001FFFFC000000007FFFFF00000001FFFFFFC0000007FF80FFF000000FFC001 FF800001FF8000FFC00003FE00003FE00007FE00003FF0000FFC00001FF8000FF800000F F8001FF800000FFC001FF800000FFC003FF800000FFE003FF0000007FE007FF0000007FF 007FF0000007FF007FF0000007FF007FF0000007FF00FFF0000007FF80FFF0000007FF80 FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FF F0000007FF80FFF0000007FF80FFF0000007FF807FF0000007FF007FF0000007FF007FF0 000007FF007FF0000007FF003FF800000FFE003FF800000FFE001FF800000FFC001FFC00 001FFC000FFC00001FF80007FE00003FF00007FE00003FF00003FF8000FFE00001FFC001 FFC000007FF80FFF0000003FFFFFFE0000000FFFFFF800000001FFFFC0000000001FFC00 0000312F7DAD38>I<007FC00FF80000FFFFC0FFFF8000FFFFC3FFFFE000FFFFCFFFFFF8 00FFFFDFC03FFC00FFFFFF001FFE0003FFFC0007FF0001FFF80003FF8001FFF00003FFC0 01FFE00001FFE001FFC00001FFE001FFC00000FFF001FFC00000FFF001FFC000007FF801 FFC000007FF801FFC000007FF801FFC000007FF801FFC000003FFC01FFC000003FFC01FF C000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC0 00003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000 007FF801FFC000007FF801FFC000007FF801FFC000007FF001FFC00000FFF001FFC00000 FFF001FFC00001FFE001FFE00001FFC001FFF00003FFC001FFF80007FF8001FFFC000FFF 0001FFFE001FFE0001FFDFC07FFC0001FFCFFFFFF00001FFC3FFFFC00001FFC0FFFF0000 01FFC01FF0000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001 FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF C00000000001FFC00000000001FFC00000000001FFC000000000FFFFFF80000000FFFFFF 80000000FFFFFF80000000FFFFFF80000000FFFFFF8000000036407DAC3E>I<007F807F 00FFFF81FFE0FFFF83FFF0FFFF8FFFF8FFFF8F8FFCFFFF9F1FFE03FFBE1FFE01FFBC1FFE 01FFF81FFE01FFF81FFE01FFF01FFE01FFF00FFC01FFE007F801FFE001E001FFE0000001 FFE0000001FFE0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FF C0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0 000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC000 0001FFC0000001FFC0000001FFC00000FFFFFFE000FFFFFFE000FFFFFFE000FFFFFFE000 FFFFFFE000272D7DAC2E>114 D<001FFC038000FFFF878003FFFFFF800FFFFFFF801FF0 03FF803FC000FF803F80003F807F00001F807E00001F80FE00000F80FE00000F80FE0000 0780FF00000780FF00000780FF80000780FFE0000000FFFE0000007FFFF000007FFFFF00 003FFFFFC0003FFFFFF0001FFFFFFC000FFFFFFE0003FFFFFF0001FFFFFF80007FFFFF80 000FFFFFC000003FFFC0000003FFE0000000FFE0F000003FE0F000003FE0F800001FE0F8 00000FE0F800000FE0FC00000FE0FC00000FE0FE00000FC0FF00001FC0FF00001FC0FF80 003F80FFE0007F00FFF803FE00FFFFFFFC00FCFFFFF800F03FFFE000E007FE0000232F7C AD2C>I<0001E000000001E000000001E000000001E000000001E000000003E000000003 E000000003E000000003E000000007E000000007E00000000FE00000000FE00000001FE0 0000001FE00000003FE00000007FE0000000FFE0000003FFE000000FFFFFFF80FFFFFFFF 80FFFFFFFF80FFFFFFFF80FFFFFFFF8000FFE0000000FFE0000000FFE0000000FFE00000 00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF E0000000FFE0000000FFE0000000FFE001E000FFE001E000FFE001E000FFE001E000FFE0 01E000FFE001E000FFE001E000FFE001E000FFE001E000FFE003E000FFF003C0007FF003 C0007FF007C0003FF80F80001FFC1F00000FFFFF000007FFFC000001FFF80000003FE000 23407EBE2C>I<007FC00001FF00FFFFC003FFFF00FFFFC003FFFF00FFFFC003FFFF00FF FFC003FFFF00FFFFC003FFFF0003FFC0000FFF0001FFC00007FF0001FFC00007FF0001FF C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007 FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF 0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0000FFF0001FFC0000FFF00 01FFC0001FFF0001FFC0001FFF0001FFC0003FFF0000FFC0003FFF0000FFE0007FFF8000 7FE001F7FFFE007FF807E7FFFE003FFFFFC7FFFE000FFFFF07FFFE0003FFFE07FFFE0000 7FF007FC00372E7CAC3E>IIII E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fe ectt1440 14.4 24 /Fe 24 122 df<000001FF00078000000FFFE007C000007FFFF80FC00000FFFFFE0FC000 03FFFFFF1FC00007FFFFFF9FC0000FFFFFFFDFC0001FFF80FFFFC0003FFC001FFFC0007F F0000FFFC000FFE00007FFC000FFC00003FFC001FF000001FFC003FE000000FFC003FE00 0000FFC007FC0000007FC007F80000007FC00FF00000003FC00FF00000003FC01FE00000 003FC01FE00000003FC01FC00000001FC03FC00000001FC03F800000001FC03F80000000 1FC07F800000000F807F0000000000007F0000000000007F0000000000007F0000000000 00FF000000000000FE000000000000FE000000000000FE000000000000FE000000000000 FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE 000000000000FE000000000000FE000000000000FE000000000000FF0000000000007F00 00000000007F0000000000007F0000000000007F0000000000007F8000000000003F8000 00000F803F800000001FC03FC00000001FC01FC00000001FC01FE00000001FC01FE00000 001FC00FF00000003FC00FF00000003F8007F80000003F8007FC0000003F8003FE000000 7F8003FE000000FF0001FF000000FF0000FFC00001FE0000FFE00003FC00007FF00007FC 00003FFC001FF800001FFF80FFF000000FFFFFFFE0000007FFFFFFC0000003FFFFFF8000 0000FFFFFE000000007FFFFC000000000FFFE00000000001FF000000324B7BC93D>67 D<7FFFF0003FFFF8FFFFF8007FFFFCFFFFF8007FFFFCFFFFF8007FFFFCFFFFF8007FFFFC FFFFF8007FFFFC7FFFF0003FFFF801FC000000FE0001FC000000FE0001FC000000FE0001 FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC 000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC00 0000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC0000 00FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC000000 FE0001FC000000FE0001FFFFFFFFFE0001FFFFFFFFFE0001FFFFFFFFFE0001FFFFFFFFFE 0001FFFFFFFFFE0001FFFFFFFFFE0001FFFFFFFFFE0001FC000000FE0001FC000000FE00 01FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001 FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC 000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC00 0000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC0000 00FE0001FC000000FE0001FC000000FE0001FC000000FE0001FC000000FE007FFFF0003F FFF8FFFFF8007FFFFCFFFFF8007FFFFCFFFFF8007FFFFCFFFFF8007FFFFCFFFFF8007FFF FC7FFFF0003FFFF836497DC83D>72 D<3FFFFFFFFFFC7FFFFFFFFFFEFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFE3FFFFFFFFFFC30087A7C3D>95 D<000FFFC000000000FFFFF800000003FFFFFE00000007FFFFFF8000000FFFFFFFC00000 0FFFFFFFE000001FFFFFFFF000001FF800FFF800001FF0001FFC00001FF00007FC00001F F00003FE00000FE00001FE000007C00000FF0000000000007F0000000000007F80000000 00003F8000000000003F8000000000003F8000000000003F8000000000003F8000000000 003F80000000007FFF800000001FFFFF80000001FFFFFF8000000FFFFFFF8000003FFFFF FF800000FFFFFFFF800003FFFFFC3F800007FFFC003F80000FFFC0003F80001FFE00003F 80003FF000003F80003FE000003F80007F8000003F80007F0000003F8000FF0000003F80 00FE0000003F8000FE0000003F8000FE0000003F8000FE0000003F8000FE0000003F8000 FF0000007F80007F0000007F80007F800000FF80007FC00003FF80003FF0000FFFE0003F FE00FFFFFFF01FFFFFFFFFFFF80FFFFFFFFFFFF807FFFFFFCFFFF803FFFFFF07FFF801FF FFFC03FFF8007FFFE0007FF0000FFE00000000353679B43D>97 D<00000FFFC0000000FF FFFC000003FFFFFF000007FFFFFF80001FFFFFFFC0003FFFFFFFC0007FFFFFFFE000FFF8 007FE001FFC0003FE003FF00003FE007FE00003FE007FC00001FC00FF800000F801FF000 0000001FE0000000003FC0000000003FC0000000003F80000000007F80000000007F0000 0000007F00000000007F0000000000FF0000000000FE0000000000FE0000000000FE0000 000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000 000000FF00000000007F00000000007F00000000007F80000000007F80000000003FC000 0000003FE0000001F01FE0000003F81FF0000003F80FF8000007F80FFC000007F007FF00 000FF003FF80001FE003FFF0007FE001FFFE01FFC000FFFFFFFF80003FFFFFFF00001FFF FFFE00000FFFFFFC000003FFFFF0000000FFFFC00000001FFC00002D3677B43D>99 D<0000000FFFC0000000001FFFE0000000001FFFE0000000001FFFE0000000001FFFE000 0000001FFFE0000000000FFFE000000000000FE000000000000FE000000000000FE00000 0000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000000 00000FE000000000000FE000000000000FE000000000000FE000000000000FE000000000 000FE00000007FC00FE0000003FFF80FE000000FFFFE0FE000001FFFFF8FE000007FFFFF CFE00000FFFFFFEFE00001FFFFFFFFE00003FFF01FFFE00003FF8007FFE00007FE0001FF E0000FFC0000FFE0000FF800007FE0001FF000007FE0001FE000003FE0003FC000001FE0 003FC000001FE0003F8000000FE0007F8000000FE0007F0000000FE0007F0000000FE000 FF0000000FE000FF0000000FE000FE0000000FE000FE0000000FE000FE0000000FE000FE 0000000FE000FE0000000FE000FE0000000FE000FE0000000FE000FE0000000FE000FE00 00000FE000FF0000000FE000FF0000000FE0007F0000000FE0007F0000001FE0007F8000 001FE0007F8000001FE0003FC000003FE0003FC000003FE0001FE000007FE0001FF00000 FFE0000FF00001FFE0000FF80001FFE00007FE0007FFE00007FF000FFFE00003FFE07FFF FFE001FFFFFFEFFFF000FFFFFFCFFFF0007FFFFF8FFFF0003FFFFF0FFFF0000FFFFC0FFF F00003FFF007FFE00000FF80000000344A7BC83D>I<00001FF800000000FFFF80000003 FFFFE000000FFFFFF800001FFFFFFC00003FFFFFFE00007FFFFFFF0000FFF80FFF8001FF C001FFC003FF00007FE007FC00001FE00FF800000FF00FF000000FF01FE0000007F81FE0 000003F83FC0000003F83F80000003FC3F80000001FC7F80000001FC7F00000001FC7F00 000001FEFF00000000FEFE00000000FEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFF FFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFCFE0000000000FF00000000007F00 000000007F00000000007F00000000007F80000000003F80000000003FC0000000001FE0 0000007C1FE0000000FE0FF0000000FE0FF8000000FE07FC000001FE03FF000003FC03FF 800007FC01FFF0001FF800FFFE00FFF0007FFFFFFFE0003FFFFFFFC0000FFFFFFF800007 FFFFFF000001FFFFFC0000007FFFE000000007FF00002F3679B43D>I<00001FF0003FE0 0000FFFE01FFF80003FFFF87FFFC0007FFFFDFFFFE000FFFFFFFFFFE001FFFFFFFFFFE00 3FFFFFFFFFFE007FF01FFFE0FC00FFC007FE007800FF0001FE000001FE0000FF000001FE 0000FF000003FC00007F800003F800003F800007F800003FC00007F800003FC00007F000 001FC00007F000001FC00007F000001FC00007F000001FC00007F000001FC00007F00000 1FC00007F800003FC00007F800003FC00003F800003F800003FC00007F800001FE0000FF 000001FE0000FF000000FF0001FE000000FFC007FE0000007FF01FFC000000FFFFFFF800 0001FFFFFFF0000001FFFFFFE0000001FFFFFFC0000003FBFFFF80000003F0FFFE000000 03F01FF000000003F0000000000003F0000000000003F0000000000003F8000000000001 F8000000000001FC000000000000FE400000000000FFFFFFF80000007FFFFFFF800000FF FFFFFFF00001FFFFFFFFFC0003FFFFFFFFFF0007FFFFFFFFFF800FFC00000FFFC01FF000 0000FFE03FC00000001FE03F800000000FF07F0000000007F07F0000000003F87E000000 0001F8FE0000000001FCFC0000000001FCFC0000000000FCFC0000000000FCFC00000000 00FCFC0000000000FCFC0000000000FCFE0000000001FC7E0000000001F87F0000000003 F87F8000000007F83FC00000000FF01FF00000003FE01FFC000000FFE00FFF800007FFC0 07FFF8007FFF8003FFFFFFFFFF0000FFFFFFFFFC00007FFFFFFFF800001FFFFFFFE00000 07FFFFFF80000000FFFFFC000000000FFFC0000037517DB33D>103 D<7FFE0000000000FFFF0000000000FFFF0000000000FFFF0000000000FFFF0000000000 FFFF00000000007FFF0000000000007F0000000000007F0000000000007F000000000000 7F0000000000007F0000000000007F0000000000007F0000000000007F0000000000007F 0000000000007F0000000000007F0000000000007F0000000000007F0000000000007F00 00000000007F003FE00000007F01FFFC0000007F07FFFE0000007F1FFFFF8000007F3FFF FF8000007F7FFFFFC000007FFFFFFFE000007FFFC07FE000007FFE001FF000007FFC000F F000007FF80007F000007FF00007F800007FE00007F800007FC00003F800007FC00003F8 00007F800003F800007F800003F800007F800003F800007F000003F800007F000003F800 007F000003F800007F000003F800007F000003F800007F000003F800007F000003F80000 7F000003F800007F000003F800007F000003F800007F000003F800007F000003F800007F 000003F800007F000003F800007F000003F800007F000003F800007F000003F800007F00 0003F800007F000003F800007F000003F800007F000003F800007F000003F800007F0000 03F800007F000003F800007F000003F800007F000003F800007F000003F8007FFFFF01FF FFF8FFFFFF83FFFFFCFFFFFF87FFFFFCFFFFFF87FFFFFCFFFFFF87FFFFFCFFFFFF83FFFF FC7FFFFF01FFFFF836497DC83D>I<00003C00000000007E0000000000FF0000000001FF 8000000001FF8000000001FF8000000001FF8000000000FF00000000007E00000000003C 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000001FFFFF0000003FFFFF8000007FFFFF8000007FFFFF8000007FFFFF 8000003FFFFF8000001FFFFF80000000003F80000000003F80000000003F80000000003F 80000000003F80000000003F80000000003F80000000003F80000000003F80000000003F 80000000003F80000000003F80000000003F80000000003F80000000003F80000000003F 80000000003F80000000003F80000000003F80000000003F80000000003F80000000003F 80000000003F80000000003F80000000003F80000000003F80000000003F80000000003F 80000000003F80000000003F80000000003F80000000003F80000000003F80000000003F 80000000003F80000000003F80000000003F8000003FFFFFFFFE007FFFFFFFFF00FFFFFF FFFF80FFFFFFFFFF80FFFFFFFFFF807FFFFFFFFF003FFFFFFFFE00294A76C93D>I<3FFE 00000000007FFF0000000000FFFF0000000000FFFF0000000000FFFF00000000007FFF00 000000003FFF0000000000003F0000000000003F0000000000003F0000000000003F0000 000000003F0000000000003F0000000000003F0000000000003F0000000000003F000000 0000003F0000000000003F0000000000003F0000000000003F0000000000003F00000000 00003F0000000000003F0007FFFFE0003F000FFFFFF0003F001FFFFFF8003F001FFFFFF8 003F001FFFFFF8003F000FFFFFF0003F0007FFFFE0003F00001FE000003F00003FC00000 3F00007F8000003F0000FF0000003F0001FE0000003F0003FC0000003F0007F80000003F 000FF00000003F001FE00000003F003FC00000003F007F800000003F00FF000000003F01 FE000000003F03FC000000003F0FFC000000003F1FFE000000003F3FFF000000003F7FFF 000000003FFFBF800000003FFE1FC00000003FFC1FE00000003FF80FE00000003FF007F0 0000003FE003F80000003FC003FC0000003F8001FC0000003F0000FE0000003F0000FF00 00003F00007F0000003F00003F8000003F00001FC000003F00001FE000003F00000FE000 003F000007F000003F000003F800003F000003FC00003F000001FC003FFFFF001FFFF87F FFFF803FFFFCFFFFFFC07FFFFEFFFFFFC07FFFFEFFFFFFC07FFFFE7FFFFF803FFFFC3FFF FF001FFFF837497DC83D>107 D<3FFFFF8000007FFFFFC00000FFFFFFC00000FFFFFFC0 0000FFFFFFC000007FFFFFC000003FFFFFC0000000001FC0000000001FC0000000001FC0 000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0 000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0 000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0 000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0 000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0 000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0 000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0 000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0 000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0 000000001FC0000000001FC000003FFFFFFFFFE07FFFFFFFFFF0FFFFFFFFFFF8FFFFFFFF FFF8FFFFFFFFFFF87FFFFFFFFFF03FFFFFFFFFE02D4978C83D>I<00001FC000FE00007F E0FFF007FF8000FFF1FFF80FFFC000FFF7FFFC3FFFE000FFFFFFFC7FFFE000FFFFFFFEFF FFF000FFFFFFFEFFFFF0007FFFE0FFFF07F80003FF807FFC03F80003FF003FF801F80003 FE003FF001FC0003FC003FE001FC0003FC001FE000FC0003FC001FE000FC0003F8001FC0 00FC0003F8001FC000FC0003F8001FC000FC0003F0001F8000FC0003F0001F8000FC0003 F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F80 00FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003 F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F80 00FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003 F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F80 00FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC007FFF81FFFC0FFFE0FF FFC3FFFE1FFFF0FFFFC7FFFE3FFFF0FFFFC7FFFE3FFFF0FFFFC7FFFE3FFFF0FFFFC3FFFE 1FFFF07FFF81FFFC0FFFE03C3480B33D>I<0000003FE000007FFE01FFFC0000FFFF07FF FE0000FFFF1FFFFF8000FFFF3FFFFF8000FFFF7FFFFFC000FFFFFFFFFFE0007FFFFFC07F E000007FFE001FF000007FFC000FF000007FF80007F000007FF00007F800007FE00007F8 00007FC00003F800007FC00003F800007F800003F800007F800003F800007F800003F800 007F000003F800007F000003F800007F000003F800007F000003F800007F000003F80000 7F000003F800007F000003F800007F000003F800007F000003F800007F000003F800007F 000003F800007F000003F800007F000003F800007F000003F800007F000003F800007F00 0003F800007F000003F800007F000003F800007F000003F800007F000003F800007F0000 03F800007F000003F800007F000003F800007F000003F800007F000003F800007F000003 F800007F000003F8007FFFFF01FFFFF8FFFFFF83FFFFFCFFFFFF87FFFFFCFFFFFF87FFFF FCFFFFFF87FFFFFCFFFFFF83FFFFFC7FFFFF01FFFFF836347DB33D>I<00001FE0000000 00FFFC00000007FFFF8000000FFFFFC000003FFFFFF000007FFFFFF80000FFFFFFFC0001 FFE01FFE0003FF8007FF0003FE0001FF0007FC0000FF800FF800007FC00FF000003FC01F E000001FE01FC000000FE03FC000000FF03F80000007F03F80000007F07F00000003F87F 00000003F87F00000003F87F00000003F8FE00000001FCFE00000001FCFE00000001FCFE 00000001FCFE00000001FCFE00000001FCFE00000001FCFE00000001FCFE00000001FCFE 00000001FCFF00000003FC7F00000003F87F00000003F87F80000007F87F80000007F83F 80000007F03FC000000FF03FE000001FF01FE000001FE01FF000003FE00FF800007FC007 FC0000FF8007FE0001FF8003FF8007FF0001FFF03FFE0000FFFFFFFC00007FFFFFF80000 3FFFFFF000000FFFFFC0000007FFFF80000001FFFE000000001FE000002E3679B43D>I< 0000001FF000007FFE00FFFC0000FFFF03FFFF0000FFFF0FFFFFC000FFFF3FFFFFE000FF FF7FFFFFF000FFFFFFFFFFF8007FFFFFC07FFC00007FFF000FFE00007FFC0007FE00007F F80001FF00007FF00000FF00007FE00000FF80007FC000007F80007F8000003FC0007F80 00003FC0007F8000001FE0007F0000001FE0007F0000000FE0007F0000000FE0007F0000 000FF0007F0000000FF0007F00000007F0007F00000007F0007F00000007F0007F000000 07F0007F00000007F0007F00000007F0007F00000007F0007F00000007F0007F00000007 F0007F0000000FF0007F0000000FF0007F0000000FE0007F8000000FE0007F8000001FE0 007F8000001FC0007FC000003FC0007FC000003FC0007FE000007F80007FE00000FF8000 7FF00001FF00007FF80003FF00007FFC0007FE00007FFE001FFC00007FFFC0FFF800007F FFFFFFF800007F7FFFFFE000007F3FFFFFC000007F0FFFFF8000007F07FFFE0000007F01 FFF80000007F003FE00000007F0000000000007F0000000000007F0000000000007F0000 000000007F0000000000007F0000000000007F0000000000007F0000000000007F000000 0000007F0000000000007F0000000000007F0000000000007F0000000000007F00000000 00007F0000000000007F0000000000007F0000000000007F0000000000007F0000000000 7FFFFF00000000FFFFFF80000000FFFFFF80000000FFFFFF80000000FFFFFF80000000FF FFFF800000007FFFFF00000000344F7DB33D>I<00003FF000F8000001FFFE01FC000007 FFFF81FC00000FFFFFC1FC00003FFFFFF1FC00007FFFFFF9FC0000FFFFFFFDFC0001FFF8 0FFFFC0003FFC001FFFC0007FF0000FFFC0007FE00007FFC000FF800003FFC001FF00000 1FFC001FE000000FFC003FE000000FFC003FC0000007FC003F80000007FC007F80000003 FC007F80000003FC007F00000003FC007F00000001FC00FF00000001FC00FE00000001FC 00FE00000001FC00FE00000001FC00FE00000001FC00FE00000001FC00FE00000001FC00 FE00000001FC00FE00000001FC00FE00000001FC00FF00000001FC00FF00000001FC007F 00000003FC007F00000003FC007F80000003FC003F80000007FC003FC0000007FC003FC0 00000FFC001FE000001FFC001FF000001FFC000FF800003FFC000FFC00007FFC0007FE00 01FFFC0003FF8003FFFC0001FFF01FFDFC0001FFFFFFF9FC0000FFFFFFF1FC00003FFFFF E1FC00001FFFFFC1FC000007FFFF01FC000001FFFC01FC0000007FE001FC000000000001 FC000000000001FC000000000001FC000000000001FC000000000001FC000000000001FC 000000000001FC000000000001FC000000000001FC000000000001FC000000000001FC00 0000000001FC000000000001FC000000000001FC000000000001FC000000000001FC0000 00000001FC000000000001FC000000000001FC0000000001FFFFFC00000003FFFFFE0000 0007FFFFFF00000007FFFFFF00000007FFFFFF00000003FFFFFE00000001FFFFFC384F7B B33D>I<000000001FF8007FFFE000FFFF00FFFFF007FFFF80FFFFF01FFFFFC0FFFFF03F FFFFC0FFFFF07FFFFFE0FFFFF1FFFFFFE07FFFF3FFF03FE00007F7FF803FE00007F7FE00 1FC00007FFF8000F800007FFF00000000007FFE00000000007FFC00000000007FF800000 000007FF000000000007FE000000000007FE000000000007FC000000000007FC00000000 0007F8000000000007F8000000000007F8000000000007F8000000000007F00000000000 07F0000000000007F0000000000007F0000000000007F0000000000007F0000000000007 F0000000000007F0000000000007F0000000000007F0000000000007F0000000000007F0 000000000007F0000000000007F0000000000007F0000000000007F0000000000007F000 0000000007F0000000000007F0000000000007F0000000000007F0000000007FFFFFFFE0 0000FFFFFFFFF00000FFFFFFFFF80000FFFFFFFFF80000FFFFFFFFF80000FFFFFFFFF000 007FFFFFFFE0000033347BB33D>I<0001FFF00F00001FFFFE0F8000FFFFFF9F8003FFFF FFFF8007FFFFFFFF800FFFFFFFFF801FFFFFFFFF803FFF001FFF807FF00007FF807FC000 01FF807F800000FF80FF0000007F80FE0000007F80FE0000003F80FE0000003F80FE0000 003F80FF0000003F807F0000003F807F8000001F007FE0000000003FFC000000001FFFE0 0000000FFFFF00000007FFFFFC000001FFFFFF8000007FFFFFE000000FFFFFF8000000FF FFFE00000007FFFF000000001FFF8000000001FFC0000000007FE07C0000001FE0FE0000 000FF0FE00000007F0FE00000007F8FF00000003F8FF00000003F8FF00000003F8FF8000 0003F8FFC0000003F8FFC0000007F8FFE000000FF0FFF000000FF0FFF800003FF0FFFE00 00FFE0FFFFC007FFC0FFFFFFFFFFC0FFFFFFFFFF80FCFFFFFFFF00FC3FFFFFFC00FC0FFF FFF000F803FFFFC00078007FFC00002D3678B43D>I<0000780000000000FC0000000001 FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 FC0000003FFFFFFFFFF87FFFFFFFFFFCFFFFFFFFFFFCFFFFFFFFFFFCFFFFFFFFFFFCFFFF FFFFFFFC7FFFFFFFFFF80001FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC00003E0001FC00007F0001FC00007F0001FC00007F0001 FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FE0000FF0001 FE0001FE0000FF0003FE0000FF8007FC00007FF01FFC00007FFFFFF800003FFFFFF00000 3FFFFFE000001FFFFF80000007FFFF00000003FFFC000000007FC00030437DC13D>I<7F FE0003FFF000FFFF0007FFF800FFFF0007FFF800FFFF0007FFF800FFFF0007FFF800FFFF 0007FFF8007FFF0003FFF800007F000003F800007F000003F800007F000003F800007F00 0003F800007F000003F800007F000003F800007F000003F800007F000003F800007F0000 03F800007F000003F800007F000003F800007F000003F800007F000003F800007F000003 F800007F000003F800007F000003F800007F000003F800007F000003F800007F000003F8 00007F000003F800007F000003F800007F000003F800007F000003F800007F000003F800 007F000003F800007F000003F800007F000003F800007F000003F800007F000003F80000 7F000003F800007F000007F800007F000007F800007F00000FF800007F00001FF800007F 80003FF800007F80007FF800003FC000FFF800003FF807FFFFF8001FFFFFFFFFFC001FFF FFFFFFFC000FFFFFFBFFFC0007FFFFE3FFFC0003FFFFC3FFFC0000FFFF01FFF800003FF0 00000036347DB23D>I<7FFFE0001FFFF8FFFFF0003FFFFCFFFFF8007FFFFCFFFFF8007F FFFCFFFFF8007FFFFCFFFFF0003FFFFC7FFFE0001FFFF800FC000000FC0000FC000000FC 0000FE000001FC00007E000001F800007E000001F800007F000003F800003F000003F000 003F000003F000003F800007F000001F800007E000001F800007E000001FC0000FE00000 0FC0000FC000000FC0000FC000000FE0001FC0000007E0001F80000007E0001F80000007 F0003F80000003F0003F00000003F0003F00000003F8007F00000001F8007E00000001F8 007E00000001FC00FE00000000FC00FC00000000FC00FC00000000FE01FC000000007E01 F8000000007E01F8000000007F03F8000000003F03F0000000003F03F0000000003F87F0 000000001F87E0000000001F87E0000000001FCFE0000000000FCFC0000000000FCFC000 0000000FFFC00000000007FF800000000007FF800000000007FF800000000003FF000000 000003FF000000000000FC00000036347DB23D>I<3FFFF000FFFFE07FFFF801FFFFF07F FFFC01FFFFF07FFFFC01FFFFF07FFFFC01FFFFF07FFFF801FFFFF03FFFF000FFFFE0003F 80000FE000001FC0001FC000000FE0003F8000000FF0007F80000007F0007F00000003F8 00FE00000001FC01FC00000000FE01FC00000000FF03F8000000007F07F0000000003F8F E0000000001FCFC0000000000FFFC0000000000FFF800000000007FF000000000003FE00 0000000001FE000000000000FC000000000001FC000000000003FE000000000003FF0000 00000007FF80000000000FDF80000000001F8FC0000000001F87E0000000003F07F00000 00007E03F800000000FE01F800000001FC00FC00000001F800FE00000003F8007F000000 07F0003F8000000FE0001F8000000FC0001FC000001FC0000FE000003F800007F000007F 000007F0007FFFF0003FFFF0FFFFF8007FFFF8FFFFF8007FFFFCFFFFF8007FFFFCFFFFF8 007FFFFCFFFFF8007FFFF87FFFF0003FFFF036337DB23D>120 D<7FFFF0003FFFF8FFFF F8007FFFFCFFFFF8007FFFFCFFFFF8007FFFFCFFFFF8007FFFFCFFFFF8007FFFFC7FFFF0 003FFFF800FC000000FC0000FE000000FC00007E000001FC00007F000001F800003F0000 01F800003F000003F800003F800003F000001F800003F000001FC00007F000001FC00007 E000000FC00007E000000FE0000FE0000007E0000FC0000007E0000FC0000007F0001FC0 000003F0001F80000003F8001F80000001F8003F80000001F8003F00000001FC003F0000 0000FC007E00000000FE007E000000007E007E000000007E00FC000000007F00FC000000 003F00FC000000003F01F8000000001F81F8000000001F81F8000000001F83F000000000 0FC3F0000000000FC3F00000000007C7E00000000007E7E00000000007E7E00000000003 E7C00000000003F7C00000000003FFC00000000001FF800000000001FF800000000000FF 800000000000FF000000000000FF0000000000007F0000000000007E0000000000007E00 0000000000FE000000000000FC000000000001FC000000000001F8000000000001F80000 00000003F8000000000003F0000000000003F0000000000007F0000000000007E0000000 000007E000000000000FE00000000F800FC00000001FC01FC00000003FE01F800000003F E03F800000003FE07F000000003FE0FF000000003FE3FE000000003FFFFC000000001FFF FC000000001FFFF8000000000FFFF00000000007FFE00000000003FF800000000000FE00 00000000364F7DB23D>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Ff ecti1095 10.95 31 /Ff 31 122 df<01E003F807F80FF80FFC0FFC0FF80FF803D80018003800300030007000 6000E000C001C00380030007000E001C0038007000E000C0000E1B7A881C>44 D<7FFFFC7FFFFC7FFFFCFFFFFCFFFFFC1605799520>I<000000060000000E0000001E00 00001E0000003C0000007C000000FC000001FC000007F800000FF800003FF80001FFF800 0FF3F0001FC3F0000E07F0000007F0000007E0000007E000000FE000000FE000000FC000 000FC000001FC000001FC000001F8000001F8000003F8000003F8000003F0000003F0000 007F0000007F0000007E0000007E000000FE000000FE000000FC000000FC000001FC0000 01FC000001F8000001F8000003F8000003F8000003F0000003F0000007F0000007F00000 07E0000007E000000FE000000FE000000FC000000FC000001FC000001FC000001F800000 7FC000FFFFFFE0FFFFFFE0FFFFFFC01F3D76BC2E>49 D<000000FE0000000003FFC00000 000F01F00000003C00F800000078007C000000F0003E000001E0003F000003C0001F0000 0380001F80000700001F80000F00001F80000E0C001F80001E0C001FC0001C0E001FC000 3C06001FC0003806001FC0007806001FC0007006001FC000700E003FC000F00C003F8000 E00C003F8000E01C003F8000E018007F8001E018007F0001C038007F0001C07000FE0001 C06001FE0001C0E001FC0000E3C003F80000FF0007F000003C000FE0000000001FC00000 00001F80000000007F0000000000FC0000000001F80000000003F0000000000FC0000000 001F00000000007E0000000000F80000000003E00000000007C0000000001F0000000000 3E00000000007C0000180000F000003C0001E00000380003C00000380003C00000780007 80000078000F000000F0000E000000F0001E000001E0003FE00003E0003FFF0007C0007C 3FF01FC000780FFFFF80007003FFFF0000F001FFFE0000E0007FFC0000E0003FF80000E0 0007C000002A3F79BC2E>I<0000000FE00000007FF8000001FFFE000007F01F00001F80 0F00003F000700007E003F0000F8007F0001F0007F0003E0007F0007E0007F000FC0007E 001F800000003F000000003F000000007E00000000FE00000000FC00000001FC00000001 F800000003F800000003F800000007F01FC00007F0FFF0000FE1E07C000FE7803E000FEE 001E001FFC001F001FD8000F801FF8000F801FF0000FC03FE0000FC03FE0000FC03FC000 0FC03FC0000FE07F80000FE07F80000FE07F00000FE07F00001FC07F00001FC0FE00001F C0FE00001FC0FE00003FC0FE00003F80FE00003F80FC00003F80FC00007F80FC00007F00 FC00007F00FC0000FE00FC0000FE00FC0001FC00FC0001F8007C0003F8007C0003F0007C 0007E0003E000FC0003E001F80001F007E00000F81FC000007FFF8000003FFE00000007F 000000283F76BC2E>54 D<00000000FF8001C00000000FFFE001C00000003FFFF8038000 0000FF807C0780000003FC001E0F8000000FF0000F1F8000003FC000079F0000007F0000 03FF000000FE000001FF000001FC000001FF000003F8000000FE000007F0000000FE0000 0FE0000000FE00001FC00000007E00003F800000007C00007F800000007C0000FF000000 007C0000FE000000007C0001FE00000000780003FC00000000780003F800000000780007 F800000000780007F80000000070000FF00000000070000FF00000000070001FE0000000 0070001FE00000000000003FE00000000000003FC00000000000003FC00000000000007F C00000000000007F800000000000007F800000000000007F80000000000000FF80000000 000000FF00000000000000FF00000000000000FF00000000000000FF00000000000000FF 00000000000000FE00000000000000FE000000000F0000FE000000000F0000FE00000000 0E0000FE000000000E0000FE000000001E0000FE000000001C0000FE000000003C0000FE 00000000380000FE000000007800007F000000007000007F00000000F000007F00000001 E000003F00000001C000003F80000003C000001F800000078000001FC000000F0000000F E000001E00000007E000003C00000007F00000F800000003FC0001E000000000FE0007C0 000000007FC03F00000000001FFFFE000000000007FFF0000000000000FF80000000003A 4272BF41>67 D<0001FFFFFFFFFFF00001FFFFFFFFFFF00001FFFFFFFFFFF0000003FC00 003FF0000003FC00000FF0000003F8000007F0000003F8000003F0000003F8000001E000 0007F8000001E0000007F0000001E0000007F0000001E0000007F0000001E000000FF000 0001E000000FE0000001E000000FE0000001C000000FE0000001C000001FE0000001C000 001FC0000001C000001FC0007001C000001FC000F003C000003FC000E0038000003F8000 E0000000003F8000E0000000003F8001E0000000007F8001C0000000007F0003C0000000 007F0003C0000000007F0007C000000000FF001F8000000000FFFFFF8000000000FFFFFF 8000000000FFFFFF8000000001FE003F0000000001FC001F0000000001FC000F00000000 01FC000F0000000003FC000E0000000003F8000E0000000003F8000E0000000003F8001E 0000000007F8001C0000000007F0001C0000000007F0001C0000000007F0000000000000 0FF00000000000000FE00000000000000FE00000000000000FE00000000000001FE00000 000000001FC00000000000001FC00000000000001FC00000000000003FC0000000000000 3F800000000000003F800000000000007F800000000000007F800000000000007F000000 00000000FF8000000000007FFFFF8000000000FFFFFF8000000000FFFFFF80000000003C 3E7BBD3B>70 D<0001FFFFFFFC00000001FFFFFFFF80000001FFFFFFFFF000000003FC00 0FF800000003FC0001FE00000003F80000FF00000003F800007F00000003F800003F8000 0007F800001FC0000007F000001FC0000007F000001FC0000007F000001FE000000FF000 001FE000000FE000001FE000000FE000001FE000000FE000001FE000001FE000003FC000 001FC000003FC000001FC000003FC000001FC000007F8000003FC000007F8000003F8000 007F0000003F800000FE0000003F800001FC0000007F800001F80000007F000003F00000 007F00000FE00000007F00001F80000000FF00007E00000000FE0007F800000000FFFFFF E000000000FFFFFF8000000001FE000FE000000001FC0003F000000001FC0001F8000000 01FC0000FC00000003FC0000FE00000003F800007E00000003F800007F00000003F80000 7F00000007F800007F00000007F000007F00000007F000007F00000007F00000FF000000 0FF00000FF0000000FE00000FF0000000FE00000FE0000000FE00001FE0000001FE00001 FE0000001FC00001FE0000001FC00001FE0000001FC00001FE0000003FC00003FE004000 3F800003FE00E0003F800003FC00E0007F800003FC01E0007F800003FC01C0007F000001 FC03C000FF800001FC0380FFFFFF0001FC0780FFFFFF0000FE0F00FFFFFE00007E1E0000 000000001FFC00000000000007F0003B407BBD42>82 D<00007E00000001FF80000007C1 C380001F80EFC0003F00FFC0007E007FC000FC007F8001F8003F8003F0003F8003F0003F 8007E0003F000FE0003F000FC0003F001FC0007F001FC0007E003F80007E003F80007E00 3F8000FE007F8000FC007F0000FC007F0000FC007F0001FC00FF0001F800FE0001F800FE 0001F800FE0003F800FE0003F038FC0003F038FC0003F038FC0007F038FC0007E078FC00 0FE0707C000FE0707C001FE0F07E003FE0E03E007FE0E03E00F3E1E01F01E3E1C00F8781 E38003FF00FF0000FC003E00252977A72E>97 D<001FC0000FFFC0000FFF80000FFF8000 003F8000003F8000003F0000003F0000007F0000007F0000007E0000007E000000FE0000 00FE000000FC000000FC000001FC000001FC000001F8000001F8000003F8000003F80000 03F0000003F07C0007F1FF0007F787C007EE03E007FC01F00FF801F00FF001F80FF000F8 0FE000F81FC000F81FC000FC1F8000FC1F8001FC3F8001FC3F8001FC3F0001FC3F0001FC 7F0003FC7F0003F87E0003F87E0003F87E0007F8FE0007F0FC0007F0FC0007F0FC000FE0 FC000FE0FC000FE0F8001FC0F8001F80F8003F80F8003F00F8007E0078007E007C00FC00 7C01F8003C03F0001E07E0000F0F800007FE000001F800001E4076BE29>I<00001FC000 00FFF00003F07C000FC01E001F000E003E000F007C001F00FC007F01F8007F03F0007F07 F0007E07E0007E0FE000381FC000001FC000003F8000003F8000003F8000007F8000007F 0000007F0000007F000000FF000000FE000000FE000000FE000000FE000000FE000000FC 000000FC000006FC00000E7E00001E7E00003C7E0000783E0000F03F0001E01F0007C00F 800F0007C07E0001FFF000007F8000202977A729>I<000000003F800000001FFF800000 001FFF000000001FFF00000000007F00000000007F00000000007E00000000007E000000 0000FE0000000000FE0000000000FC0000000000FC0000000001FC0000000001FC000000 0001F80000000001F80000000003F80000000003F80000000003F00000000003F0000000 0007F00000000007F00000000007E00000007E07E0000001FF8FE0000007C1CFE000001F 80EFC000003F00FFC000007E007FC00000FC007FC00001F8003F800003F0003F800003F0 003F800007E0003F80000FE0003F00000FC0003F00001FC0007F00001FC0007F00003F80 007E00003F80007E00003F8000FE00007F8000FE00007F0000FC00007F0000FC00007F00 01FC0000FF0001FC0000FE0001F80000FE0001F80000FE0003F80000FE0003F83800FC00 03F03800FC0003F03800FC0007F03800FC0007F07800FC000FE070007C000FE070007C00 1FE0F0007E003FE0E0003E007FE0E0003E00F3E1E0001F01E3E1C0000F8781E3800003FF 00FF000000FC003E0000294077BE2E>I<00003F000001FFE00007C0F0001F0078007E00 7800FC003C01F8003C03F0003C07F0003C0FE0007C0FC000781FC000783F8000F83F8001 F07F8007E07F001FC07F01FF007FFFF800FFFF8000FE000000FE000000FE000000FE0000 00FC000000FC000000FC000000FC000000FC000000FC000000FC00000CFC00001CFC0000 3C7C0000787C0000F07E0001E03E0003C01F000F800F001E000780FC0003FFE00000FF00 001E2976A729>I<000000007C0000000001FF0000000007C7800000000F83C00000001F 83C00000001F0FC00000003F1FC00000003F1FC00000007E1FC00000007E1F800000007E 0F000000007E0000000000FC0000000000FC0000000000FC0000000000FC0000000001FC 0000000001F80000000001F80000000001F80000000001F80000000003F80000000003F0 0000000003F00000000003F000000003FFFFF8000003FFFFF8000003FFFFF800000007E0 0000000007E00000000007E0000000000FE0000000000FC0000000000FC0000000000FC0 000000000FC0000000000FC0000000001FC0000000001F80000000001F80000000001F80 000000001F80000000003F80000000003F00000000003F00000000003F00000000003F00 000000007F00000000007E00000000007E00000000007E00000000007E0000000000FE00 00000000FC0000000000FC0000000000FC0000000000FC0000000001FC0000000001F800 00000001F80000000001F80000000001F80000000003F00000000003F00000000003F000 00000003F00000000007E00000000007E00000000007E00000000007E0000000000FC000 0000000FC00000001C0FC00000007E0F80000000FE0F80000000FE1F00000000FE1F0000 0000FC1E00000000F83C00000000F03C000000007878000000003FE0000000000F800000 00002A5383BF1C>I<000003E00000001FF80000003E1E380000F80EFC0001F007FC0003 E007FC0007E003FC000FC003F8001F8003F8003F8003F8003F0003F8007F0003F0007E00 03F000FE0007F000FE0007F001FC0007E001FC0007E001FC000FE003FC000FE003F8000F C003F8000FC003F8001FC007F8001FC007F0001F8007F0001F8007F0003F8007F0003F80 07E0003F0007E0003F0007E0007F0007E0007F0003E000FE0003E001FE0003F001FE0001 F003FE0001F007FC0000F80EFC00007C3DFC00001FF1FC000007C1F800000001F8000000 03F800000003F800000003F000000003F000000007F000000007F000000007E00000000F E0003C000FC0007E000FC000FE001F8000FE003F0000FE007E0000FC00FC0000F001F800 007C03E000003FFF80000007FE000000263B7CA729>I<0001FC000000FFFC000000FFF8 000000FFF800000003F800000003F800000003F000000003F000000007F000000007F000 000007E000000007E00000000FE00000000FE00000000FC00000000FC00000001FC00000 001FC00000001F800000001F800000003F800000003F800000003F000000003F03F80000 7F0FFE00007F3E0F80007E780FC0007EE007C000FFC007E000FF8007E000FF0007E000FF 0007E001FE0007E001FC0007E001FC0007E001F80007E003F8000FE003F8000FC003F000 0FC003F0000FC007F0001FC007F0001F8007E0001F8007E0001F800FE0003F800FE0003F 000FC0003F000FC0007F001FC0007E001FC000FE071F8000FC071F8000FC073F8001FC0F 3F8001F80E3F0001F80E3F0001F81E7F0001F01C7F0001F01C7E0001F0387E0001F038FE 0001F070FE0000F0E0FC00007FC03800001F0028407ABE2E>I<0000700001FC0001FC00 01FC0001F80001F80000E000000000000000000000000000000000000000000000000000 0000000000000000000000000000007C0001FF00038F800707800E07C01E07C01C07C03C 0FC0380FC0380FC0781FC0701F80701F80F03F80F03F00003F00007F00007E0000FE0000 FC0000FC0001FC0001F80001F80003F80003F00003F03807F03807E0380FE0780FC0700F C0700FC0F00F80E00F80E00F81C00F83C00F838007870003FE0000F800163D79BB1C>I< 0001FC000000FFFC000000FFF8000000FFF800000003F800000003F800000003F0000000 03F000000007F000000007F000000007E000000007E00000000FE00000000FE00000000F C00000000FC00000001FC00000001FC00000001F800000001F800000003F800000003F80 0000003F000000003F0007C0007F001FF0007F007838007E00E078007E01C1FC00FE0381 FC00FE0703F800FC0E03F800FC0C03F801FC1C00E001FC38000001F870000001F8E00000 03F9C0000003FB80000003F700000003FE00000007FC00000007FFC0000007EFF0000007 E1FC00000FE0FE00000FE07F00000FC03F00000FC01F80001FC01F80001FC01F80E01F80 1F80E01F801F80E03F801F81E03F803F81C03F003F01C03F003F01C07F003F03C07F003F 03807E001F07807E001F0700FE001F0F00FE000F1E00FC0007FC00380001F00026407ABE 29>107 D<0007F003FFF003FFE003FFE0000FE0000FE0000FC0000FC0001FC0001FC000 1F80001F80003F80003F80003F00003F00007F00007F00007E00007E0000FE0000FE0000 FC0000FC0001FC0001FC0001F80001F80003F80003F80003F00003F00007F00007F00007 E00007E0000FE0000FE0000FC0000FC0001FC0001FC0001F80001F80003F80003F80003F 00003F00007F00007F07007E07007E0700FE0F00FE0E00FC0E00FC0E00FC1E00FC1C00FC 1C007C38007C78003C70001FE000078000144079BE17>I<01F0003F80007F000007FC01 FFE003FFC0000F3E07C1F80F83F0000E1F0F00FC1E01F8001E1F1C007C3800F8001C1F38 007E7000FC003C1FF0007EE000FC00381FF0007FE000FC00381FE0007FC000FC00783FC0 007F8000FC00703FC0007F8000FC00703F80007F0000FC00703F00007E0000FC00F03F00 00FE0001FC00F07F0000FC0001F800007E0000FC0001F800007E0000FC0001F800007E00 01FC0003F80000FE0001FC0003F00000FC0001F80003F00000FC0001F80003F00000FC00 03F80007F00001FC0003F80007E00001F80003F00007E00001F80003F0000FE00001F800 07F0000FC00003F80007F0001FC0E003F00007E0001F80E003F00007E0001F80E003F000 0FE0003F81E007F0000FE0003F01C007E0000FC0003F01C007E0000FC0003F01C007E000 1FC0003E03800FE0001FC0003E03800FC0001F80003E07000FC0001F80003E07000FC000 3F80003E0E001FC0003F80001E1C001F80003F00000FF8000700000E000003E000432979 A74A>I<01F0003F800007FC01FFE0000F3E07C1F8000E1F0F00FC001E1F1C007C001C1F 38007E003C1FF0007E00381FF0007E00381FE0007E00783FC0007E00703FC0007E00703F 80007E00703F00007E00F03F0000FE00F07F0000FC00007E0000FC00007E0000FC00007E 0001FC0000FE0001F80000FC0001F80000FC0001F80000FC0003F80001FC0003F00001F8 0003F00001F80007F00001F80007E00003F8000FE07003F0000FC07003F0000FC07003F0 001FC0F007F0001F80E007E0001F80E007E0001F81E007E0001F01C00FE0001F01C00FC0 001F03800FC0001F03800FC0001F07001FC0000F0E001F800007FC0007000001F0002C29 79A733>I<00001FC0000000FFF8000003F07C00000FC01F00001F801F00003F000F8000 7E000FC000FC0007C001F80007E003F00007E007F00007E007E00007E00FE00007F01FC0 0007F01FC00007F03F800007F03F800007F03F80000FE07F80000FE07F00000FE07F0000 0FE07F00001FE0FF00001FC0FE00001FC0FE00001FC0FE00003F80FE00003F80FE00007F 00FE00007F00FC00007E007C0000FC007E0001FC007E0001F8007E0003F0003E0007E000 1F000FC0001F001F80000F803E000007C0FC000001FFF00000003F800000242977A72E> I<0003E001F800000FF807FE00001E7C1E0F80001C3E3C07C0003C3E7807C000383EE003 E000783FE003E000703FC003F000703F8001F000F07F0001F000E07F0001F800E07E0001 F800E07E0003F801E0FE0003F801E0FE0003F80000FC0003F80000FC0003F80001FC0007 F80001FC0007F00001F80007F00001F80007F00003F8000FF00003F8000FE00003F0000F E00003F0000FE00007F0001FC00007F0001FC00007E0001F800007E0003F80000FE0003F 00000FE0007F00000FE0007E00000FE000FC00001FE000FC00001FE001F800001FF003F0 00001FF007E000003FB80F8000003F9C1F0000003F0FFC0000003F03E00000007F000000 00007F00000000007E00000000007E0000000000FE0000000000FE0000000000FC000000 0000FC0000000001FC0000000001FC0000000001F80000000001F80000000003F8000000 0003F8000000007FFFE0000000FFFFE0000000FFFFE00000002D3A80A72E>I<00007C00 C00001FF03C00007C387C0001F01CF80003E00EF80007C00FF8000FC007F8001F8007F00 03F0007F0003F0007F0007E0007F000FE0007E000FC0007E001FC0007E001FC000FE003F 8000FC003F8000FC003F8000FC007F8001FC007F0001F8007F0001F8007F0001F800FF00 03F800FE0003F000FE0003F000FE0003F000FE0007F000FC0007E000FC0007E000FC0007 E000FC000FE000FC000FC0007C001FC0007C003FC0007C007FC0003E00FF80003E01FF80 001F03DF80000F07BF800007FE3F000001F83F000000003F000000007F000000007E0000 00007E000000007E00000000FE00000000FC00000000FC00000000FC00000001FC000000 01F800000001F800000003F800000007F8000001FFFFE00001FFFFE00001FFFFE000223A 77A729>I<01F000FE0007FC03FF800F3E0F03E00E1F1C01E01E1F3807E01C1F7007F03C 1FF00FE0381FE00FE0381FC00FE0783FC00380703F800000703F800000703F000000F03F 000000F07F000000007E000000007E000000007E00000000FE00000000FC00000000FC00 000000FC00000001FC00000001F800000001F800000001F800000003F800000003F00000 0003F000000003F000000007F000000007E000000007E000000007E00000000FE0000000 0FC00000000FC00000000FC00000001FC00000001F800000000700000000242979A726> I<00007F800001FFE00007C0F8001E003C003C001C003C001E0078000E00F0003E00F000 7E00F0007E01F0007C01F0007C01F0001001F8000001FC000001FF800001FFF80000FFFF 0000FFFF80007FFFC0001FFFE00007FFE000007FF000000FF0000003F0000003F0000001 F03E0001F07E0000F07F0001F0FE0001E0FE0001E0FC0001E0F80003C0F0000780700007 8078000F003C003C001F00F80007FFE00000FF00001F297AA725>I<0001C0000003F000 0007F0000007F0000007E0000007E000000FE000000FE000000FC000000FC000001FC000 001FC000001F8000001F8000003F8000003F8000003F0000003F00007FFFFF80FFFFFF80 FFFFFF00007E000000FE000000FE000000FC000000FC000001FC000001FC000001F80000 01F8000003F8000003F8000003F0000003F0000007F0000007F0000007E0000007E00000 0FE000000FE000000FC000000FC000001FC000001FC01C001F801C001F801C003F803C00 3F8038003F0078003F0070003F00F0003F00E0003F01C0001F03C0001F0780000F0F0000 07FC000001F00000193A78B81E>I<007C0000000001FF00003800038F8000FC00070780 00FC000E07C000FC001E07C001FC001C07C001FC003C0FC001F800380FC001F800380FC0 03F800781FC003F800701F8003F000701F8003F000F03F8007F000F03F0007F000003F00 07E000007F0007E000007E000FE000007E000FE00000FE000FC00000FC000FC00000FC00 1FC00001FC001FC00001F8001F800001F8001F800001F8003F800003F8003F838003F000 3F038003F0003F038003F0007F038003F0007F078003F0007E070003F0007E070003F000 FE0F0003F000FE0E0001F001FE0E0001F803BE1C0000F8073E1C00007C1E1E3800003FF8 0FF0000007E003E000292979A730>I<007C00038001FF0007E0038F800FE00707800FE0 0E07C00FF01E07C00FF01C07C007F03C0FC007F0380FC003F0380FC003E0781FC001E070 1F8001E0701F8001E0F03F8001E0F03F0001C0003F0001C0007F0001C0007E0003C0007E 00038000FE00038000FC00038000FC00078001FC00070001F800070001F800070001F800 0E0003F8000E0003F0000E0003F0001C0003F0001C0003F000380003F000380003F00070 0003F000700001F000E00001F001C00001F803C00000F8078000007E0F0000001FFC0000 0007F00000242979A729>I<007C000000007001FF00007001FC038F8001F801FC070780 01F801FC0E07C001F801FE1E07C003F801FE1C07C003F000FE3C0FC003F000FE380FC003 F0007C380FC007F0007C781FC007E0003C701F8007E0003C701F8007E0003CF03F800FE0 003CF03F000FC00038003F000FC00038007F000FC00038007E001FC00078007E001F8000 7000FE001F80007000FC001F80007000FC003F8000F001FC003F0000E001F8003F0000E0 01F8003F0000E001F8003F0001E003F8007F0001C003F0007E0001C003F0007E0003C003 F0007E00038003F0007E00038003F0007E00070003F000FE00070003F000FE000E0001F0 01FE001E0001F801FF001C0000F8039F00380000FC079F807000003E0F07C1E000001FFC 03FFC0000003F0007F0000372979A73C>I<007C00000001FF000038038F8000FC070780 00FC0E07C000FC1E07C001FC1C07C001F83C0FC001F8380FC001F8380FC003F8781FC003 F0701F8003F0701F8003F0F03F8007F0F03F0007E0003F0007E0007F0007E0007E000FE0 007E000FC000FE000FC000FC000FC000FC001FC001FC001FC001F8001F8001F8001F8001 F8003F8003F8003F0003F0003F0003F0003F0003F0007F0003F0007E0003F0007E0003F0 007E0003F000FE0003F000FC0001F001FC0001F803FC0000F807FC00007C1FF800003FF9 F8000007E1F800000003F800000003F000000003F000000007F000000007E0001F0007E0 003F800FC0003F800FC0003F801F80007F001F00007E003E000038007E00003800FC0000 3801F000001C03E000001E0FC0000007FF00000001F8000000263B79A72C>121 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fg ecrm1095 10.95 75 /Fg 75 123 df<000003FF000FE000001FFFC07FF80000FE00F1F81C0001F8003BE07E00 07E0007FC0FF000FC001FFC0FF001F8001FF80FF003F0001FF00FF007F0001FF00FF007E 0001FF007E00FE0000FE000000FC00007E000000FC00007E000000FC00007E000000FC00 007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC0000 7E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E 0000FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF8000FC00007E000000FC00007E00 0000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E0000 00FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000 FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC 00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00 007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC0000 7E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000001FE0000FF 00007FFFF83FFFFF007FFFF83FFFFF007FFFF83FFFFF0038407FBF35>27 D<000003FE000000001FFFC0000000FE01E0000001F80078000007E0001C00000FC0007C 00001F8000FE00003F0001FE00007F0001FE00007E0001FE0000FE0001FE0000FC0000FC 0000FC0000780000FC0000000000FC0000000000FC0000000000FC0000000000FC000000 0000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC000000 0000FC00007E00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE0000FC0001FE0000FC0000FE 0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E 0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E 0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E 0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E 0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E 0001FE0000FF007FFFF83FFFFC7FFFF83FFFFC7FFFF83FFFFC2E407FBF32>I<000003FF 000000001FFFEE000000FE00FE000001F800FE000007E001FE00000FC001FE00001F8001 FE00003F0001FE00007F0001FE00007E0000FE0000FE00007E0000FC00007E0000FC0000 7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 7E00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE0000FC00007E0000FC00007E0000FC0000 7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000 7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0001FE0000 FF007FFFF83FFFFC7FFFF83FFFFC7FFFF83FFFFC2E407FBF32>I<3E001F007F003F807F 003F80FF807FC07F003F807F003F807F003F807F003F807F003F807F003F807F003F807F 003F807F003F807E001F803E001F003E001F003E001F003E001F003E001F003E001F003E 001F003E001F003E001F001C000E001C000E001C000E001C000E001C000E001C000E001C 000E001C000E001C000E00180006001A2177BF2D>34 D<00000F800000000000003FE000 0000000000F870000000000001E030000000000003E038000000000007C0180000000000 07C01800000000000F801C00000000000F800C00000000000F800C00000000001F800C00 000000001F000C00000000001F000C00000000001F800C00000000001F800C0000000000 1F801C00000000001F801800000000001F803800000000001F803000000000001F807000 000000001F80E000000000001F80C000000000000FC1C000000000000FC3800000000000 0FC70000000000000FC60000000000000FEE00003FFFF80007FC00003FFFF80007F80000 3FFFF80007F0000007FF800003F0000001FC000003F0000000F8000003F8000000F00000 03F8000000E0000007FC000001C000000FFC0000018000001CFE00000380000038FE0000 03000000707F000007000000E07F00000E000001C03F80000C000003803FC0001C000007 801FC0001800000F000FE0003800001F000FF0007000001F0007F0006000003E0007F800 E000007E0003FC00C000007E0001FC01C00000FE0001FE03800000FE0000FF07000000FE 00007F07000000FE00003F8E000000FE00003FDC000000FE00001FF8000030FF00000FF0 000030FF000007F00000307F000003F80000707F800003FC0000603F800007FE0000E03F C0000F7F0000C01FE0003C3F8001C00FF000F81FE0078007F807E007F81F0001FFFFC003 FFFE00007FFE0000FFF800000FF000001FE0003D437CC046>38 D<1C007F00FF80FF80FF C0FFC0FFC07FC01CC000C000C000C000C000C001C00180018003800300070006000E000C 001C003800700060000A1B78BE19>I<0000300000700000E00001C0000380000700000F 00001E00003C00003C0000780000F00000F00001E00001E00003C00003C00007C0000780 000F80000F80000F00001F00001F00001E00003E00003E00003E00003C00007C00007C00 007C00007C00007C00007C0000780000F80000F80000F80000F80000F80000F80000F800 00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F800007800 007C00007C00007C00007C00007C00007C00003C00003E00003E00003E00001E00001F00 001F00000F00000F80000F800007800007C00003C00003C00001E00001E00000F00000F0 00007800003C00003C00001E00000F000007000003800001C00000E0000070000030145A 77C323>II<0003C0000003 C0000003E0000003C0000003C0000003C0000003C0000003C0000003C000F003C00FFC03 C03FFE03C07FFF03C0FF3FC3C3FC0FE187F003F18FC000FDBF00003FFC00000FF0000003 C000000FF000003FFC0000FDBF0003F18FC00FE187F03FC3C3FCFF03C0FFFE03C07FFC03 C03FF003C00F0003C0000003C0000003C0000003C0000003C0000003C0000003E0000003 C0000003C00020277AC32D>I<1C007F00FF80FF80FFC0FFC0FFC07FC01CC000C000C000 C000C000C001C00180018003800300070006000E000C001C003800700060000A1B788819 >44 DI<1C007F00FF80FF80FF80FF 80FF807F001C000909788819>I<00000000C000000000C000000001C000000001800000 000180000000038000000003000000000700000000060000000006000000000E00000000 0C000000000C000000001C00000000180000000018000000003800000000300000000030 0000000070000000006000000000E000000000C000000000C000000001C0000000018000 00000180000000038000000003000000000300000000070000000006000000000E000000 000C000000000C000000001C000000001800000000180000000038000000003000000000 3000000000700000000060000000006000000000E000000000C000000001C00000000180 000000018000000003800000000300000000030000000007000000000600000000060000 00000E000000000C000000000C000000001C000000001800000000380000000030000000 003000000000700000000060000000006000000000E000000000C000000000C000000001 C00000000180000000038000000003000000000300000000070000000006000000000600 0000000E000000000C000000000C000000001C0000000018000000001800000000380000 00003000000000700000000060000000006000000000E000000000C000000000C0000000 00225B7BC32D>I<0003FC0000001FFF8000003E07C00000F801F00001F000F80003E000 7C0003C0003C0007C0003E000F80001F000F80001F001F00000F801F00000F803F00000F C03F00000FC03F00000FC03F00000FC07E000007E07E000007E07E000007E07E000007E0 7E000007E0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE 000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE00 0007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE0000 07F07E000007E07E000007E07E000007E07E000007E07F00000FE03F00000FC03F00000F C03F00000FC03F00000FC01F00000F801F80001F800F80001F000F80001F0007C0003E00 07C0003E0003E0007C0001F000F80000F801F000003E07C000001FFF80000003FC000024 3F7CBC2D>I<0000C0000003C0000007C000001FC000007FC00007FFC000FFFFC000FF9F C000F81FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000007FF000FFFFFFF8FFFFFFF8FFFFFFF81D3D 78BC2D>I<0007FC0000003FFF800000FFFFE00001F00FF800078003FC000F0001FE000E 0000FF001C00007F803800003FC03000003FC07000001FE06000001FE06000001FE0FE00 000FF0FF00000FF0FF80000FF0FF80000FF0FF80000FF0FF80000FF0FF80000FF07F0000 0FF01C00000FF00000000FE00000001FE00000001FE00000001FC00000003FC00000003F 800000007F800000007F00000000FE00000001FC00000001FC00000003F800000007F000 00000FE00000000FC00000001F800000003E000000007C00000000F800000001F0000000 03E000000003C000000007800000000F000030001E000030003C000030007800003000F0 00006001E000006003C0000060078000006007000000E00FFFFFFFE01FFFFFFFE03FFFFF FFE07FFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0243D7CBC2D>I<0007FC0000003F FF800000FFFFE00001F807F80007C003FC000F0001FE000E0000FF001C00007F801F8000 7F803FC0003FC03FE0003FC03FE0003FC03FE0003FC03FE0003FC03FE0003FC01FC0003F C00700003FC00000003F800000007F800000007F800000007F00000000FF00000000FE00 000001FC00000003F800000003F00000000FC00000003F0000001FFC0000001FFF800000 000FE000000003F800000001FC00000000FE000000007F000000007F800000003FC00000 003FC00000003FE00000003FE00000001FE00000001FF00000001FF00C00001FF03F0000 1FF07F80001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0003FE0FF80003F E07F00003FC07000003FC07000007F803800007F801C0000FF000F0001FE0007C003FC00 03F80FF00000FFFFE000003FFF80000007FC0000243F7CBC2D>I<0000000E000000000E 000000001E000000003E000000003E000000007E00000000FE00000000FE00000001FE00 000003FE00000003FE00000006FE0000000EFE0000000CFE00000018FE00000038FE0000 0030FE00000060FE000000E0FE000000C0FE00000180FE00000380FE00000300FE000006 00FE00000E00FE00000C00FE00001800FE00003800FE00003000FE00006000FE0000E000 FE0000C000FE00018000FE00038000FE00030000FE00060000FE000E0000FE000C0000FE 00180000FE00380000FE00300000FE00600000FE00E00000FE00FFFFFFFFFFFFFFFFFFFF FFFFFFFFFF000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 0000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000001FF000001 FFFFFF0001FFFFFF0001FFFFFF283E7EBD2D>I<060000030007C0000F0007F800FE0007 FFFFFC0007FFFFFC0007FFFFF00007FFFFE00007FFFFC00007FFFF0000063FF800000600 000000060000000006000000000600000000060000000006000000000600000000060000 0000060000000006000000000600000000060000000006000000000601FE0000060FFF80 00063E03E000067001F80006E000FC0007C0007E000780003F000700003F800600001F80 0000001FC00000001FC00000001FE00000000FE00000000FE00000000FE00000000FF000 00000FF00000000FF00000000FF03E00000FF07F00000FF0FF80000FF0FF80000FF0FF80 000FF0FF80000FF0FF00000FE0FE00001FE0E000001FE06000001FC07000001FC0300000 3F803800003F801C00007F001E0000FE000F0001FC0007C003F80003F00FE00000FFFFC0 00003FFF00000007F80000243F7CBC2D>I<00001FE0000000FFF8000003FFFE00000FF0 1F00001F800780003F000380007E000FC000FC001FC001F8003FC003F0003FC003F0003F C007E0003FC00FE0001F800FC0000F001FC00000001FC00000001F800000003F80000000 3F800000003F800000007F800000007F000000007F01FE00007F07FF8000FF0E03E000FF 1C01F000FF3800FC00FF70007E00FF60003E00FFE0003F00FFC0001F80FFC0001FC0FF80 001FC0FF80001FE0FF80000FE0FF80000FE0FF00000FF0FF00000FF0FF00000FF0FF0000 0FF0FF00000FF0FF00000FF07F00000FF07F00000FF07F00000FF07F00000FF07F00000F F03F80000FF03F80000FE03F80000FE01F80000FE01F80001FC01FC0001FC00FC0001F80 0FC0003F8007E0003F0003F0007E0001F800FC0000FC01F800007E07F000003FFFE00000 0FFF80000003FC0000243F7CBC2D>I<300000000038000000003E000000003FFFFFFFFC 3FFFFFFFFC3FFFFFFFFC3FFFFFFFF87FFFFFFFF87FFFFFFFF07FFFFFFFE070000000E060 000001C0600000038060000003006000000700C000000E00C000000C00C000001C00C000 00380000000030000000007000000000E000000001C00000000180000000038000000007 0000000007000000000E000000000E000000001C000000001C000000003C000000003800 00000078000000007800000000F800000000F000000001F000000001F000000001F00000 0003F000000003F000000003F000000007F000000007E000000007E000000007E0000000 0FE00000000FE00000000FE00000000FE00000000FE00000001FE00000001FE00000001F E00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE0 0000000FC00000000780000026407BBD2D>I<0003FC0000001FFF8000007FFFE00000FC 03F80001E000FC0003C0003E000780001F000F00000F000E00000F801E000007801C0000 07C03C000003C03C000003C03C000003C03E000003C03E000003C03F000003C03F000007 C03F800007801FE0000F801FF0000F001FFC001E000FFE003C000FFF80780007FFC0F000 03FFF1E00001FFFF800000FFFF0000003FFF0000001FFFC000000FFFE000001FFFF80000 78FFFC0001F07FFE0003C01FFF0007800FFF800F0003FFC01F0001FFC01E00007FE03C00 003FE07C00000FE078000007F078000003F0F8000003F0F0000001F0F0000001F0F00000 00F0F0000000F0F0000000F0F0000000F0F8000000E078000001E078000001E07C000001 C03E000003C01E000007801F00000F000FC0001E0007E0007C0001FC03F80000FFFFE000 001FFF80000003FC0000243F7CBC2D>I<0003FC0000001FFF0000003FFFC00000FE07F0 0001F801F80003F000FC0007E0007C000FE0007E001FC0003F001F80003F003F80001F80 3F80001F807F80001F807F00001FC07F00001FC0FF00001FC0FF00000FE0FF00000FE0FF 00000FE0FF00000FE0FF00000FE0FF00000FF0FF00000FF0FF00000FF0FF00000FF0FF00 000FF0FF00000FF07F00001FF07F00001FF07F80001FF03F80001FF03F80003FF01F8000 3FF00FC0007FF007C0006FF007E000EFF003F001CFF000F8038FF0007C070FF0001FFE0F E00007F80FE00000000FE00000001FE00000001FE00000001FC00000001FC00000001FC0 0000003F800000003F800F00003F001F80007F003FC0007E003FC0007E003FC000FC003F C001F8003F8001F8003F0003F0001C0007E0001E001FC0000FC07F000003FFFE000001FF F80000003FC00000243F7CBC2D>I<1C007F00FF80FF80FF80FF80FF807F001C00000000 000000000000000000000000000000000000000000000000000000000000000000000000 0000001C007F00FF80FF80FF80FF80FF807F001C00092778A619>I<1C007F00FF80FF80 FF80FF80FF807F001C000000000000000000000000000000000000000000000000000000 000000000000000000000000000000001C007F00FF80FF80FFC0FFC0FFC07FC01CC000C0 00C000C000C000C001C00180018003800300070006000E000C001C003800700060000A39 78A619>I<003FF80000FFFF0003C01FC00F0007F01C0001F8380001FC700000FE600000 FE7C00007FFE00007FFF00007FFF00007FFF00007FFF00007F7E00007F3C0000FF000000 FE000000FE000001FC000003F8000007F000000FE000000F8000001F0000003E0000003C 00000078000000F8000000F0000000E0000001E0000001C0000001800000038000000380 000003000000030000000300000003000000030000000300000003000000030000000300 000003000000030000000000000000000000000000000000000000000000000000000000 00000000000000000000070000001FC000003FE000003FE000003FE000003FE000003FE0 00001FC0000007000020407BBF2B>63 D<00000007000000000000000700000000000000 07000000000000000F800000000000000F800000000000001FC00000000000001FC00000 000000001FC00000000000003FE00000000000003FE00000000000003FE0000000000000 7FF00000000000006FF00000000000006FF0000000000000CFF8000000000000C7F80000 00000000C7F800000000000187FC00000000000183FC00000000000183FC000000000003 01FE00000000000301FE00000000000301FE00000000000600FF00000000000600FF0000 0000000E00FF80000000000C007F80000000000C007F80000000001C007FC00000000018 003FC00000000018003FC00000000030003FE00000000030001FE00000000030001FE000 00000060001FF00000000060000FF00000000060000FF000000000C00007F800000000C0 0007F800000000C00007F800000001800003FC00000001FFFFFFFC00000003FFFFFFFE00 000003FFFFFFFE00000003000001FE00000007000001FF00000006000000FF0000000600 0000FF0000000C000000FF8000000C0000007F8000000C0000007F800000180000007FC0 0000180000003FC00000180000003FC00000300000001FE00000300000001FE000007000 00001FE00000700000000FF00000F00000000FF00001F00000000FF80003F80000000FF8 000FFE0000003FFE00FFFFC00007FFFFF8FFFFC00007FFFFF8FFFFC00007FFFFF83D417D C044>65 DI<0000003FF0000C000003FFFE001C00001FFFFF801C00 007FE00FC03C0000FF0001F07C0003FC0000787C0007F000003CFC001FE000000FFC003F C0000007FC007F80000003FC00FF00000003FC01FE00000001FC01FC00000000FC03FC00 000000FC07F8000000007C07F8000000007C0FF0000000003C0FF0000000003C1FE00000 00001C1FE0000000001C3FE0000000001C3FC0000000001C3FC0000000000C7FC0000000 000C7FC0000000000C7FC0000000000C7F800000000000FF800000000000FF8000000000 00FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000 FF800000000000FF800000000000FF800000000000FF800000000000FF8000000000007F 8000000000007FC000000000007FC0000000000C7FC0000000000C3FC0000000000C3FC0 000000000C3FE0000000000C1FE0000000001C1FE000000000180FF000000000180FF000 0000001807F8000000003807F8000000003003FC000000007001FC000000006001FE0000 0000E000FF00000001C0007F8000000380003FC000000780001FE000000F000007F00000 1E000003FC00003C000000FF0000F00000007FE007E00000001FFFFF8000000003FFFE00 000000003FF0000036427BBF41>IIII<0000003F F0000C00000003FFFE001C0000001FFFFF801C0000007FE00FC03C000000FF0001F07C00 0003FC0000787C000007F000003CFC00001FE000000FFC00003FC0000007FC00007F8000 0003FC0000FF00000003FC0001FE00000001FC0001FC00000000FC0003FC00000000FC00 07F8000000007C0007F8000000007C000FF0000000003C000FF0000000003C001FE00000 00001C001FE0000000001C003FE0000000001C003FC0000000001C003FC0000000000C00 7FC0000000000C007FC0000000000C007FC0000000000C007F80000000000000FF800000 00000000FF80000000000000FF80000000000000FF80000000000000FF80000000000000 FF80000000000000FF80000000000000FF80000000000000FF80000000000000FF800000 00000000FF80000000000000FF8000001FFFFFF07F8000001FFFFFF07FC000001FFFFFF0 7FC00000000FFE007FC000000003FC003FC000000003FC003FC000000003FC003FE00000 0003FC001FE000000003FC001FE000000003FC000FF000000003FC000FF000000003FC00 07F800000003FC0007F800000003FC0003FC00000003FC0001FE00000003FC0001FE0000 0003FC0000FF00000003FC00007F80000007FC00003FC0000007FC00001FE000000FFC00 0007F800001CFC000003FC0000387C000000FF0000F03C0000007FF007E01C0000001FFF FF800C00000003FFFE0000000000003FF00000003C427BBF47>III76 D78 D<000000FFE0000000000007FFFC00000000003FC07F8000 000000FE000FE000000001F80003F000000007E00000FC0000000FC000007E0000001F80 00003F0000003F0000001F8000007E0000000FC00000FE0000000FE00001FC00000007F0 0003F800000003F80003F800000003F80007F000000001FC0007F000000001FC000FE000 000000FE001FE000000000FF001FE000000000FF001FC0000000007F003FC0000000007F 803FC0000000007F803FC0000000007F807FC0000000007FC07F80000000003FC07F8000 0000003FC07F80000000003FC0FF80000000003FE0FF80000000003FE0FF80000000003F E0FF80000000003FE0FF80000000003FE0FF80000000003FE0FF80000000003FE0FF8000 0000003FE0FF80000000003FE0FF80000000003FE0FF80000000003FE0FF80000000003F E07F80000000003FC07FC0000000007FC07FC0000000007FC07FC0000000007FC07FC000 0000007FC03FC0000000007F803FE000000000FF801FE000000000FF001FE000000000FF 001FE000000000FF000FF000000001FE000FF000000001FE0007F800000003FC0003F800 000003F80003FC00000007F80001FC00000007F00000FE0000000FE000007F0000001FC0 00003F8000003F8000001F8000003F0000000FE00000FE00000007F00001FC00000001F8 0003F000000000FE000FE0000000003FC07F800000000007FFFC000000000000FFE00000 003B427BBF46>II82 D<0007FC0018003FFF803800FFFFE03801FC03F87803F0007C7807C0001EF80F80000FF8 1F000007F83F000003F83E000001F87E000000F87E000000F87C00000078FC00000078FC 00000078FC00000038FC00000038FC00000038FE00000018FE00000018FF00000018FF00 0000187F800000007FC00000007FE00000003FF80000003FFF0000001FFFF000000FFFFF 00000FFFFFF00007FFFFFC0001FFFFFE0000FFFFFF80003FFFFFC00007FFFFE000007FFF E0000007FFF00000007FF80000001FF80000000FFC00000007FC00000003FC00000001FE 00000001FEC0000000FEC0000000FEC0000000FEC00000007EC00000007EE00000007EE0 0000007EE00000007EE00000007CF00000007CF0000000FCF8000000F8FC000001F8FE00 0001F0FF000003F0FF800007E0FBE0000FC0F1F8001F80F07F007F00E01FFFFC00E007FF F000C0007FC00027427BBF32>I<3FFFFFFFFFFFFF003FFFFFFFFFFFFF003FFFFFFFFFFF FF003FE000FFC001FF003F00007F80003F007E00007F80001F807C00007F80000F807800 007F800007807000007F800003807000007F800003807000007F800003806000007F8000 01806000007F800001806000007F800001806000007F800001806000007F80000180C000 007F800000C0C000007F800000C0C000007F800000C0C000007F800000C0C000007F8000 00C00000007F800000000000007F800000000000007F800000000000007F800000000000 007F800000000000007F800000000000007F800000000000007F800000000000007F8000 00000000007F800000000000007F800000000000007F800000000000007F800000000000 007F800000000000007F800000000000007F800000000000007F800000000000007F8000 00000000007F800000000000007F800000000000007F800000000000007F800000000000 007F800000000000007F800000000000007F800000000000007F800000000000007F8000 00000000007F800000000000007F800000000000007F800000000000007F800000000000 007F800000000000007F800000000000007F800000000000007F800000000000007F8000 0000000000FFC0000000000001FFE00000000007FFFFFFF800000007FFFFFFF800000007 FFFFFFF800003A3E7DBD41>II87 D91 DII<7FFFFFFFFFFFFCFFFFFFFFFFFFFEFFFFFFFFFFFFFE7FFFFFFFFFFFFC3704796E 46>95 D<0180038007000E000C001C00180038003000700060006000E000C000C000C000 C000C000CE00FF80FFC0FFC0FFC07FC07FC03F800E000A1B79BE19>I<001FF0000000FF FC000003E03F00000F000FC0001C0007E0001F0003F0003F8001F8003FC000FC003FC000 FC003FC000FC003FC0007E001F80007E000F00007E000000007E000000007E000000007E 000000007E0000001FFE000003FFFE00001FF87E00007F807E0001FC007E0007F0007E00 0FE0007E001FC0007E003F80007E007F80007E007F00007E007F00007E03FE00007E03FE 00007E03FE00007E03FE0000FE03FE0000FE03FE0001FE037F0001BE037F0003BE033F80 071F061FC00E1F8E0FF03C0FFC03FFF007F8003FC003E0282A7CA82D>I<01F800000000 FFF800000000FFF800000000FFF80000000007F80000000003F80000000001F800000000 01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 01F80000000001F80000000001F80000000001F80000000001F807F8000001F81FFF0000 01F8780FC00001F9E003F00001FB8001F80001FF0000FC0001FE00007E0001FC00003F00 01FC00001F8001F800001F8001F800001FC001F800000FC001F800000FE001F800000FE0 01F8000007E001F8000007F001F8000007F001F8000007F001F8000007F001F8000007F0 01F8000007F001F8000007F001F8000007F001F8000007F001F8000007F001F8000007E0 01F800000FE001F800000FE001F800000FE001F800000FC001F800001FC001F800001F80 01FC00003F0001FE00003F0001F600007E0001F70000FC0001E38001F80001C1C003E000 01C0F81F800001803FFE0000000007F000002C407EBE32>I<0001FF0000000FFFE00000 3F00F800007C001E0001F800070003F0001F0007E0003F800FC0007F800FC0007F801F80 007F801F80007F803F00003F003F00001E007F000000007F000000007E00000000FE0000 0000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000 00FE00000000FE00000000FE000000007F000000007F000000007F000000003F000000C0 3F800000C01F800001C01FC00001800FC000038007E000070003F000060001F8001E0000 FC003800003F01F000000FFFC0000001FE0000222A7DA828>I<00000001F800000000FF F800000000FFF800000000FFF80000000007F80000000003F80000000001F80000000001 F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 F80000000001F80000000001F80000000001F8000000FF01F8000007FFC1F800001F80F1 F800007C0039F80001F8001DF80003F0000FF80007E00007F8000FC00003F8000FC00003 F8001F800001F8003F800001F8003F000001F8007F000001F8007F000001F8007F000001 F8007E000001F800FE000001F800FE000001F800FE000001F800FE000001F800FE000001 F800FE000001F800FE000001F800FE000001F800FE000001F800FE000001F8007E000001 F8007F000001F8007F000001F8003F000001F8003F800001F8001F800003F8001F800003 F8000FC00007F80007E0000FF80003F0000DFC0001F8003DFE0000FC0071FFF0003F01E1 FFF0000FFF81FFF00001FE01F8002C407DBE32>I<0003FC0000001FFF8000007E07E000 00F801F00001F000F80003E0007C0007C0003E000FC0003F001F80001F001F80001F803F 00001F803F00000F807F00000F807F00000FC07E00000FC07E00000FC0FE00000FC0FE00 000FC0FFFFFFFFC0FFFFFFFFC0FE00000000FE00000000FE00000000FE00000000FE0000 0000FE000000007E000000007F000000007F000000007F000000003F000000C03F800000 C01F800001C00FC00001800FC000038007E000070003F0000E0001F8001C0000FC003800 003F01F000000FFFC0000001FE0000222A7DA828>I<00001FC00000FFF00003F0380007 C0FC000F81FE001F81FE003F01FE003E01FE007E01FE007E00FC00FC000000FC000000FC 000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC 000000FC000000FC000000FC0000FFFFFF00FFFFFF00FFFFFF0000FC000000FC000000FC 000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC 000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC 000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC 000000FC000000FC000001FE00007FFFFE007FFFFE007FFFFE001F407FBF1C>I<000000 007E000003FC01FF00000FFF078780003E07CE0F8000FC03FC0F8001F801F80F8003F000 FC070003E0007C000007E0007E000007E0007E00000FC0003F00000FC0003F00000FC000 3F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F000007E000 7E000007E0007E000003E0007C000003F000FC000001F801F8000001FC03F0000001BE07 C00000038FFF0000000303FC000000070000000000070000000000070000000000070000 00000007800000000007800000000007C00000000003E00000000003FFFFF0000001FFFF FE000001FFFFFF8000007FFFFFE00001FFFFFFF80007C0001FF8001F800003FC003F0000 00FE003E0000007E007C0000003E007C0000003F00F80000001F00F80000001F00F80000 001F00F80000001F00F80000001F00FC0000003F007C0000003E007E0000007E003F0000 00FC001F800001F8000FC00003F00003F0000FC00000FE007F0000003FFFFC00000003FF C00000293D7EA82D>I<01F800000000FFF800000000FFF800000000FFF80000000007F8 0000000003F80000000001F80000000001F80000000001F80000000001F80000000001F8 0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8 0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8 0000000001F803FC000001F80FFF800001F83C0FC00001F8F003E00001F9C003F00001FB 8001F80001FB0001F80001FF0000FC0001FE0000FC0001FE0000FC0001FC0000FC0001FC 0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 0000FC0003FC0001FE00FFFFF07FFFF8FFFFF07FFFF8FFFFF07FFFF82D3F7EBE32>I<01 C00007F0000FF8000FF8000FF8000FF8000FF80007F00001C00000000000000000000000 000000000000000000000000000000000000000000000000000001F8007FF8007FF8007F F80007F80003F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 F80001F80001F80001F80001F80001F80001F80001F80001F80003FC00FFFFE0FFFFE0FF FFE0133D7EBC19>I<0000700001FC0003FE0003FE0003FE0003FE0003FE0001FC000070 000000000000000000000000000000000000000000000000000000000000000000000000 0000FE003FFE003FFE003FFE0001FE0000FE00007E00007E00007E00007E00007E00007E 00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E 00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E 00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E 3C007E7E007CFF00FCFF00FCFF00F8FF01F8FE01F07803E03E07C00FFF0001FC00175084 BC1C>I<01F800000000FFF800000000FFF800000000FFF80000000007F80000000003F8 0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8 0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8 0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8 0000000001F8007FFF8001F8007FFF8001F8007FFF8001F8001FFC0001F8000FE00001F8 000F800001F8001F000001F8001C000001F80038000001F80070000001F800E0000001F8 03C0000001F80700000001F80E00000001F81E00000001F83E00000001F87F00000001F9 FF80000001FB9FC0000001FF0FC0000001FE07E0000001FC07F0000001F803F0000001F8 01F8000001F801FC000001F800FE000001F8007E000001F8003F000001F8003F800001F8 001F800001F8000FC00001F8000FE00001F80007F00001F80007F00001F80007F80003FC 0007FE00FFFFF03FFFE0FFFFF03FFFE0FFFFF03FFFE02B3F7EBE30>I<01F800FFF800FF F800FFF80007F80003F80001F80001F80001F80001F80001F80001F80001F80001F80001 F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 F80001F80001F80001F80001F80001F80001F80001F80001F80003FC00FFFFF0FFFFF0FF FFF0143F7EBE19>I<01F803FC0001FE0000FFF80FFF8007FFC000FFF83C0FC01E07E000 FFF8F003E07801F00007F9C003F0E001F80003FB8001F9C000FC0001FB0001F98000FC00 01FF0000FF80007E0001FE0000FF00007E0001FE0000FF00007E0001FC0000FE00007E00 01FC0000FE00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E00 01F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E00 01F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E00 01F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E00 01F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E00 01F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E00 01F80000FC00007E0003FC0001FE0000FF00FFFFF07FFFF83FFFFCFFFFF07FFFF83FFFFC FFFFF07FFFF83FFFFC46287EA74B>I<01F803FC0000FFF80FFF8000FFF83C0FC000FFF8 F003E00007F9C003F00003FB8001F80001FB0001F80001FF0000FC0001FE0000FC0001FE 0000FC0001FC0000FC0001FC0000FC0001F80000FC0001F80000FC0001F80000FC0001F8 0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8 0000FC0001F80000FC0001F80000FC0003FC0001FE00FFFFF07FFFF8FFFFF07FFFF8FFFF F07FFFF82D287EA732>I<0001FE0000000FFFC000003F03F000007C00F80001F0003E00 03E0001F0007C0000F8007C0000F800F800007C01F800007E01F000003E03F000003F03F 000003F07E000001F87E000001F87E000001F87E000001F8FE000001FCFE000001FCFE00 0001FCFE000001FCFE000001FCFE000001FCFE000001FCFE000001FCFE000001FC7E0000 01F87E000001F87E000001F87F000003F83F000003F03F000003F01F800007E00F800007 C00FC0000FC007C0000F8003E0001F0001F0003E0000FC00FC00003F03F000000FFFC000 0001FE0000262A7DA82D>I<01F807F80000FFF81FFF0000FFF8780FC000FFF9E003F000 03FB8001F80001FF0000FC0001FE00007E0001FC00007F0001FC00003F8001F800001F80 01F800001FC001F800001FC001F800000FE001F800000FE001F800000FE001F800000FF0 01F8000007F001F8000007F001F8000007F001F8000007F001F8000007F001F8000007F0 01F8000007F001F8000007F001F8000007F001F800000FE001F800000FE001F800000FE0 01F800000FE001F800001FC001F800001FC001F800003F8001FC00003F0001FE00007F00 01FE0000FE0001FF0001FC0001FB8003F80001F9C007E00001F8F81F800001F83FFE0000 01F807F0000001F80000000001F80000000001F80000000001F80000000001F800000000 01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 01F80000000001F80000000003FC00000000FFFFF0000000FFFFF0000000FFFFF0000000 2C3A7EA732>I<0000FF000C000007FFC01C00001F80F01C00007E00381C0000FC001C3C 0003F8000E3C0007F000077C0007E000037C000FC00003FC001FC00001FC003F800001FC 003F800000FC007F000000FC007F000000FC007F000000FC007F000000FC00FE000000FC 00FE000000FC00FE000000FC00FE000000FC00FE000000FC00FE000000FC00FE000000FC 00FE000000FC00FE000000FC00FF000000FC007F000000FC007F000000FC007F000000FC 003F800000FC003F800001FC001FC00001FC000FC00003FC000FE00003FC0007E00007FC 0003F0000EFC0001F8001CFC00007E0078FC00003F01E0FC00000FFFC0FC000001FE00FC 0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC 0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC 0000000000FC0000000001FE000000007FFFF80000007FFFF80000007FFFF82D3A7DA730 >I<03F00FC0FFF03FF0FFF0F0F8FFF1C3FC07F183FC03F383FC01F703FC01F603FC01F6 01F801FE006001FC000001FC000001FC000001FC000001F8000001F8000001F8000001F8 000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8 000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8 000003FC0000FFFFF800FFFFF800FFFFF8001E287EA723>I<007FC06003FFF8E007C03D E01E000FE03C0003E0780001E0780001E0700000E0F00000E0F0000060F0000060F80000 60F8000060FC000060FF0000007FC000007FFE00003FFFE0001FFFFC0007FFFE0003FFFF 80007FFFC00007FFE000003FE000000FF0C00003F0C00001F8C00000F8E00000F8E00000 78E0000078F0000078F0000078F8000078F80000F0FC0000F0FC0001E0FE0001C0F78007 80F1E01F00E0FFFC00C01FE0001D2A7DA824>I<00180000001800000018000000180000 001800000018000000380000003800000038000000380000007800000078000000F80000 00F8000001F8000003F8000007F800001FFFFFC0FFFFFFC0FFFFFFC001F8000001F80000 01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000 01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000 01F8006001F8006001F8006001F8006001F8006001F8006001F8006001F8006001F80060 00FC00E000FC00C000FC00C0007E01C0003F0380001F87000007FE000001F8001B397EB7 23>I<01F80000FC00FFF8007FFC00FFF8007FFC00FFF8007FFC0007F80003FC0003F800 01FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F800 00FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F800 00FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F800 00FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F800 01FC0001F80001FC0001F80001FC0001F80003FC0000F80003FC0000FC0007FC0000FC00 0EFE00007C001CFF00003E0038FFF8001F80F0FFF80007FFE0FFF80000FF00FC002D297E A732>III<7FFFC00FFFE07FFFC00FFFE07FFFC00FFFE003FF0007FE0000FF0003F800007F0003 E000003F0003C000003F80038000001FC0070000000FC00E00000007E00C00000007F018 00000003F83800000001F87000000000FCE000000000FEC0000000007F80000000003F80 000000001F80000000000FC0000000000FE0000000001FE0000000003BF00000000071F8 00000000E1FC00000000C0FE00000001807E00000003803F00000007003F8000000E001F C000000C000FC000001C0007E00000380007F00000F80003F80001F80003FC000FFC0007 FE00FFFF001FFFF8FFFF001FFFF8FFFF001FFFF82D277FA630>II<1FFFFFFF801FFFFFFF801FE0007F 801F00007F001E0000FE001C0001FC001C0003FC00180003F800380007F00038000FE000 30001FE00030001FC00030003F800030007F000030007F00000000FE00000001FC000000 03FC00000003F800000007F00000000FE00000001FE00000001FC00180003F800180007F 000180007F00018000FE00018001FC00018003FC00038003F800038007F00003000FE000 03001FE00007001FC0000F003F80000F007F00003F00FF0001FF00FFFFFFFF00FFFFFFFF 0021277EA628>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fh ectt1095 10.95 72 /Fh 72 126 df<3C000F007E001F80FF003FC0FF003FC0FF003FC0FF003FC0FF003FC0FF 003FC0FF003FC0FF003FC0FF003FC07F003F807F003F807F003F807F003F807F003F807F 003F807F003F807E001F807E001F807E001F807E001F807E001F807E001F807E001F807E 001F803C000F001A1B76B82F>34 D<07C00FF01FF83FFC3FFC3FFE3FFE3FFF1FFF0FFF07 FF003F003F003F003F007F007E007E00FE00FC01FC03F803F80FF01FF03FE0FFC0FF80FF 007C003800101F70B72F>39 D<00003C00007E0001FE0003FE0007FC000FF8001FE0003F C0007F8000FF0000FE0001FC0003F80003F80007F00007E0000FE0000FC0001FC0001F80 001F80003F80003F00003F00007F00007E00007E00007E0000FE0000FC0000FC0000FC00 00FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FE00007E00 007E00007E00007F00003F00003F00003F80001F80001F80001FC0000FC0000FE00007E0 0007F00003F80003F80001FC0000FE0000FF00007F80003FC0001FE0000FF80007FC0003 FE0001FE00007E00003C174771BE2F>I<780000FC0000FF0000FF80007FC0003FE0000F F00007F80003FC0001FE0000FE00007F00003F80003F80001FC0000FC0000FE00007E000 07F00003F00003F00003F80001F80001F80001FC0000FC0000FC0000FC0000FE00007E00 007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00 00FE0000FC0000FC0000FC0001FC0001F80001F80003F80003F00003F00007F00007E000 0FE0000FC0001FC0003F80003F80007F0000FE0001FE0003FC0007F8000FF0003FE0007F C000FF8000FF0000FC0000780000174778BE2F>I<0001E000000003F000000003F00000 0003F000000003F000000003F000000003F000000003F000003003F003007C03F00F80FE 03F01FC0FF83F07FC0FFE3F1FFC07FF3F3FF801FFFFFFE000FFFFFFC0003FFFFF00000FF FFC000003FFF0000000FFC0000003FFF000000FFFFC00003FFFFF0000FFFFFFC001FFFFF FE007FF3F3FF80FFE3F1FFC0FF83F07FC0FE03F01FC07C03F00F803003F003000003F000 000003F000000003F000000003F000000003F000000003F000000003F000000001E00000 22277AAE2F>I<07C00FF01FF83FF83FFC3FFC3FFE3FFE1FFE0FFE07FE007E00FE00FC01 FC01FC03F80FF03FF0FFE0FFC0FF807E0038000F18708A2F>44 D<7FFFFFF8FFFFFFFCFF FFFFFCFFFFFFFCFFFFFFFC7FFFFFF81E0678962F>I<1F003F807FC0FFE0FFE0FFE0FFE0 FFE07FC03F801F000B0B6E8A2F>I<0001FE00000007FF8000001FFFE000003FFFF00000 7FFFF80000FFFFFC0001FF03FE0003FC00FF0003F8007F0007F0003F800FE0001FC00FC0 000FC01FC0000FE01F800007E01F800007E03F000003F03F000003F03F000003F07E0000 01F87E000001F87E000001F87E000001F8FC000000FCFC000000FCFC000000FCFC000000 FCFC000000FCFC000000FCFC000000FCFC000000FCFC000000FCFC000000FCFC000000FC FC000000FCFC000000FCFE000001FC7E000001F87E000001F87E000001F87F000003F83F 000003F03F000003F03F800007F01F800007E01FC0000FE01FC0000FE00FE0001FC00FE0 001FC007F0003F8003F8007F0003FC00FF0001FF03FE0000FFFFFC00007FFFF800003FFF F000001FFFE0000007FF80000001FE0000263A7CB82F>48 D<000380000007C0000007C0 00000FC000000FC000001FC000003FC000003FC000007FC00001FFC00003FFC0007FFFC0 00FFFFC000FFFFC000FFCFC000FF8FC0007E0FC000000FC000000FC000000FC000000FC0 00000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0 00000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0 00000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0 00000FC000000FC000000FC0003FFFFFF87FFFFFF87FFFFFFC7FFFFFFC7FFFFFF87FFFFF F81E3977B82F>I<000FFC0000003FFF800000FFFFE00003FFFFF80007FFFFFC000FFFFF FE001FF80FFF003FE001FF803F80007F807F00003FC07E00001FC07E00000FE0FE000007 E0FE000007F0FF000007F0FF000003F0FF000003F0FF000003F07E000003F018000003F0 00000003F000000003F000000007F000000007E00000000FE00000000FC00000001FC000 00001FC00000003F800000007F00000000FF00000001FE00000003FC00000007F8000000 0FF00000001FE00000003FC00000007F80000000FF00000001FE00000007FC0000000FF8 0000001FF00000003FE00000007F80000000FF00000001FE00000003FC0001E00FF80003 F01FF00003F03FE00003F07FFFFFFFF0FFFFFFFFF0FFFFFFFFF0FFFFFFFFF0FFFFFFFFF0 7FFFFFFFE024397BB82F>I<0003FF0000001FFFE000007FFFF80001FFFFFE0003FFFFFF 0007FFFFFF800FFE01FFC01FF0003FE01FE0001FE03F800007F03F800007F07F000003F8 7E000001F87E000001F87E000001F87E000001F87E000001F87F000003F83F000003F03F 800007F01FC0000FE00FE0001FC00FF8007FC003FF03FF0001FFFFFE00007FFFF800001F FFE000003FFFF00000FFFFFC0003FFFFFF0007FC00FF800FF0003FC01FC0000FE03F8000 07F03F000003F07F000003F87E000001F8FE000001FCFC000000FCFC000000FCFC000000 FCFC000000FCFC000000FCFC000000FCFE000001FC7E000001F87F000003F87F800007F8 3FC0000FF01FE0001FE01FF0003FE00FFE01FFC007FFFFFF8003FFFFFF0001FFFFFE0000 7FFFF800001FFFE0000003FF0000263A7CB82F>56 D<1F003F807FC0FFE0FFE0FFE0FFE0 FFE07FC03F801F0000000000000000000000000000000000000000000000000000000000 0000000000001F003F807FC0FFE0FFE0FFE0FFE0FFE07FC03F801F000B276EA62F>58 D<07C00FE01FF03FF83FF83FF83FF83FF81FF00FE007C000000000000000000000000000 00000000000000000000000000000000000000000007C00FF01FF83FF83FFC3FFC3FFE3F FE1FFE0FFE07FE007E00FE00FC01FC01FC03F80FF03FF0FFE0FFC0FF807E0038000F3470 A62F>I<000000004000000001E000000007F00000000FF00000003FF00000007FE00000 01FFC0000003FF0000000FFE0000001FF80000007FF0000000FFC0000003FF80000007FE 0000001FFC0000003FF0000000FFE0000001FF80000007FF0000000FFC0000003FF80000 007FE0000000FFC0000000FF00000000FFC00000007FE00000003FF80000000FFC000000 07FF00000001FF80000000FFE00000003FF00000001FFC00000007FE00000003FF800000 00FFC00000007FF00000001FF80000000FFE00000003FF00000001FFC00000007FE00000 003FF00000000FF000000007F000000001E00000000040242F7BB22F>I<3FFFFFFFFC7F FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000007FFFFF FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE3FFFFFFFFC28157DA52F>I<3000 0000007800000000FE00000000FF00000000FFC00000007FE00000003FF80000000FFC00 000007FF00000001FF80000000FFE00000003FF00000001FFC00000007FE00000003FF80 000000FFC00000007FF00000001FF80000000FFE00000003FF00000001FFC00000007FE0 0000003FF00000000FF00000003FF00000007FE0000001FFC0000003FF0000000FFE0000 001FF80000007FF0000000FFC0000003FF80000007FE0000001FFC0000003FF0000000FF E0000001FF80000007FF0000000FFC0000003FF80000007FE0000000FFC0000000FF0000 0000FE0000000078000000003000000000242F7BB22F>I<001FFF000000FFFFF00003FF FFFC000FFFFFFF001FFFFFFF803FFFFFFFC07FF001FFC07F80003FE0FE00000FE0FE0000 07F0FF000003F0FF000003F0FF000003F07E000007F07E00000FE00000001FE00000007F C0000001FFC0000003FF8000000FFF0000001FFC0000003FF00000007FE00000007F8000 0000FF00000001FE00000001FE00000003FC00000003F800000003F800000007F8000000 07F000000007F000000007F000000007F000000007F000000007F000000007F000000003 F00000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000001C000000007F000000007F00000000FF80000000FF800 00000FF800000007F000000007F000000001C0000024397BB82F>I<00003F0000000000 7F80000000007F8000000000FFC000000000FFC000000000FFC000000000FFC000000001 F3E000000001F3E000000001F3E000000001F3E000000001F3E000000003F3F000000003 F3F000000003F3F000000003E1F000000007E1F800000007E1F800000007E1F800000007 E1F800000007C0F80000000FC0FC0000000FC0FC0000000FC0FC0000000FC0FC0000001F 807E0000001F807E0000001F807E0000001F807E0000003F807F0000003F003F0000003F 003F0000003F003F0000003F003F0000007E001F8000007E001F8000007FFFFF8000007F FFFF800000FFFFFFC00000FFFFFFC00000FFFFFFC00000FFFFFFC00000FC000FC00001F8 0007E00001F80007E00001F80007E00001F80007E00003F80007F00003F00003F00003F0 0003F00003F00003F0007FFF003FFF807FFF003FFF80FFFF807FFFC0FFFF807FFFC07FFF 003FFF807FFF003FFF802A397EB82F>65 D<7FFFFFE000FFFFFFFC00FFFFFFFF00FFFFFF FF80FFFFFFFFC07FFFFFFFE003F0001FF003F0000FF003F00003F803F00003F803F00001 F803F00001FC03F00000FC03F00000FC03F00000FC03F00000FC03F00000FC03F00001FC 03F00001F803F00003F803F00003F003F00007F003F0001FE003F0007FC003FFFFFF8003 FFFFFF0003FFFFFC0003FFFFFF0003FFFFFFC003FFFFFFE003F0000FF003F00003F803F0 0001FC03F00000FC03F00000FE03F000007E03F000007E03F000003F03F000003F03F000 003F03F000003F03F000003F03F000003F03F000007F03F000007E03F00000FE03F00000 FE03F00001FC03F00007FC03F0001FF87FFFFFFFF8FFFFFFFFF0FFFFFFFFE0FFFFFFFF80 FFFFFFFF007FFFFFF80028387EB72F>I<00007F80380003FFE07C000FFFF8FC001FFFFC FC003FFFFFFC007FFFFFFC00FFC0FFFC01FF003FFC03FE000FFC07F8000FFC07F00007FC 0FE00003FC0FE00003FC1FC00001FC1F800001FC3F800001FC3F000000FC3F000000FC7F 000000FC7E000000FC7E000000787E00000000FE00000000FC00000000FC00000000FC00 000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC0000 0000FC00000000FC00000000FE000000007E000000007E000000007E000000787F000000 FC3F000000FC3F000000FC3F800000FC1F800000FC1FC00001FC0FE00001F80FF00003F8 07F00003F807F80007F003FE000FF001FF001FE000FFC07FC0007FFFFF80003FFFFF0000 1FFFFE00000FFFFC000003FFF00000007F8000263A7CB82F>I<7FFFFF800000FFFFFFF0 0000FFFFFFFC0000FFFFFFFE0000FFFFFFFF00007FFFFFFF800007E001FFC00007E0003F E00007E0001FE00007E0000FF00007E00007F80007E00003F80007E00001FC0007E00001 FC0007E00000FE0007E00000FE0007E000007E0007E000007F0007E000003F0007E00000 3F0007E000003F0007E000003F0007E000003F8007E000001F8007E000001F8007E00000 1F8007E000001F8007E000001F8007E000001F8007E000001F8007E000001F8007E00000 1F8007E000001F8007E000001F8007E000003F8007E000003F0007E000003F0007E00000 3F0007E000007F0007E000007E0007E000007E0007E00000FE0007E00001FC0007E00001 FC0007E00003F80007E00007F80007E0000FF00007E0001FF00007E0003FE00007E001FF C0007FFFFFFF8000FFFFFFFF0000FFFFFFFE0000FFFFFFFC0000FFFFFFF000007FFFFF80 000029387EB72F>I<7FFFFFFFFC00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE00FFFFFF FFFE007FFFFFFFFE0003F000007E0003F000007E0003F000007E0003F000007E0003F000 007E0003F000007E0003F000007E0003F000003C0003F00000000003F00000000003F000 00000003F00000000003F00000000003F000F0000003F001F8000003F001F8000003F001 F8000003F001F8000003FFFFF8000003FFFFF8000003FFFFF8000003FFFFF8000003FFFF F8000003FFFFF8000003F001F8000003F001F8000003F001F8000003F001F8000003F000 F0000003F00000000003F00000000003F00000000003F00000000003F00000000003F000 000F0003F000001F8003F000001F8003F000001F8003F000001F8003F000001F8003F000 001F8003F000001F8003F000001F8003F000001F807FFFFFFFFF80FFFFFFFFFF80FFFFFF FFFF80FFFFFFFFFF80FFFFFFFFFF807FFFFFFFFF0029387DB72F>I<7FFFFFFFFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFF03F000003F03F000003F03F00000 3F03F000003F03F000003F03F000003F03F000003F03F000001E03F000000003F0000000 03F000000003F000000003F000000003F000000003F000780003F000FC0003F000FC0003 F000FC0003F000FC0003FFFFFC0003FFFFFC0003FFFFFC0003FFFFFC0003FFFFFC0003FF FFFC0003F000FC0003F000FC0003F000FC0003F000FC0003F000780003F000000003F000 000003F000000003F000000003F000000003F000000003F000000003F000000003F00000 0003F000000003F000000003F000000003F000000003F00000007FFFE00000FFFFF00000 FFFFF00000FFFFF00000FFFFF000007FFFE0000028387DB72F>I<0000FE00E00007FFC1 F0000FFFF3F0003FFFFBF0007FFFFFF000FFFFFFF001FF81FFF003FE007FF003FC003FF0 07F8001FF00FF0001FF00FE0000FF01FC0000FF01FC00007F01F800007F03F800007F03F 000003F07F000003F07F000003F07E000003F07E000001E07E00000000FE00000000FC00 000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC0000 0000FC00000000FC0000FFFEFC0001FFFFFC0001FFFFFE0001FFFF7E0001FFFF7E0000FF FE7E000003F07F000003F07F000007F03F000007F03F800007F01F800007F01FC0000FF0 1FC0000FF00FE0000FF00FF0001FF007F8003FF003FC003FF003FE007FF001FF81FFF000 FFFFFFF0007FFFFFF0003FFFFBF0000FFFE3F00007FFC1E00000FE0000283A7DB82F>I< 7FFF807FFF807FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC07FFF807FFF807FFF807FFF80 03F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F000 03F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F000 03F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F000 03FFFFFFF00003FFFFFFF00003FFFFFFF00003FFFFFFF00003FFFFFFF00003FFFFFFF000 03F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F000 03F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F000 03F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F000 03F00003F00003F00003F0007FFF807FFF807FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC0 7FFF807FFF807FFF807FFF802A387EB72F>I<7FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7FFFFFFE0007E0000007E0000007E0000007E0000007E0000007E0000007E00000 07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000 07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000 07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000 07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000 07E0007FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFE203879B72F>I<7FFC 007FFCFFFE007FFEFFFE00FFFEFFFE00FFFEFFFE007FFE7FFC007FFC07C0001FC007C000 1F8007C0003F0007C0007E0007C000FE0007C000FC0007C001F80007C003F00007C007F0 0007C007E00007C00FC00007C01F800007C03F800007C03F000007C07E000007C0FC0000 07C1FC000007C1F8000007C3FC000007C7FC000007CFFE000007CFFF000007DFBF000007 FF1F800007FF0F800007FE0FC00007FC07C00007F807E00007F803E00007F003F00007E0 01F00007C001F80007C000F80007C000FC0007C0007C0007C0007E0007C0003E0007C000 3F0007C0001F8007C0001F8007C0000FC007C00007C007C00007E007C00003E07FFC000F FEFFFE001FFFFFFE001FFFFFFE001FFFFFFE001FFF7FFC000FFE28387DB72F>75 D<7FFFF000007FFFF80000FFFFF80000FFFFF800007FFFF800007FFFF0000001F8000000 01F800000001F800000001F800000001F800000001F800000001F800000001F800000001 F800000001F800000001F800000001F800000001F800000001F800000001F800000001F8 00000001F800000001F800000001F800000001F800000001F800000001F800000001F800 000001F800000001F800000001F800000001F800000001F800000001F800000001F80000 0001F800000001F800000001F800000001F800000001F800001E01F800003F01F800003F 01F800003F01F800003F01F800003F01F800003F01F800003F01F800003F01F800003F7F FFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFF7FFFFFFFFE28387DB72F>I< 7FF00000FFE07FF80001FFE0FFF80001FFF0FFFC0003FFF07FFC0003FFE07FFC0003FFE0 07DE0007BE0007DE0007BE0007DE0007BE0007DF000FBE0007CF000F3E0007CF000F3E00 07CF801F3E0007CF801F3E0007C7801E3E0007C7801E3E0007C7C03E3E0007C7C03E3E00 07C3C03C3E0007C3E07C3E0007C3E07C3E0007C1E0783E0007C1F0F83E0007C1F0F83E00 07C1F0F83E0007C0F0F03E0007C0F9F03E0007C0F9F03E0007C079E03E0007C079E03E00 07C079E03E0007C03FC03E0007C03FC03E0007C03FC03E0007C01F803E0007C01F803E00 07C00F003E0007C000003E0007C000003E0007C000003E0007C000003E0007C000003E00 07C000003E0007C000003E0007C000003E0007C000003E0007C000003E0007C000003E00 07C000003E0007C000003E007FFC0003FFE07FFC0003FFE0FFFE0007FFF0FFFE0007FFF0 7FFC0003FFE07FFC0003FFE02C387FB72F>I<7FF8003FFF807FFC003FFF80FFFC007FFF C0FFFE007FFFC07FFE003FFF807FFE003FFF8003EF0001F00003EF0001F00003EF8001F0 0003E78001F00003E78001F00003E7C001F00003E3C001F00003E3C001F00003E3E001F0 0003E3E001F00003E1E001F00003E1F001F00003E1F001F00003E0F001F00003E0F801F0 0003E0F801F00003E07801F00003E07C01F00003E07C01F00003E03E01F00003E03E01F0 0003E03E01F00003E01F01F00003E01F01F00003E01F01F00003E00F81F00003E00F81F0 0003E00781F00003E007C1F00003E007C1F00003E003C1F00003E003E1F00003E003E1F0 0003E001E1F00003E001F1F00003E001F1F00003E000F1F00003E000F1F00003E000F9F0 0003E00079F00003E00079F00003E0007DF00003E0003DF00003E0003DF0007FFF001FF0 007FFF001FF000FFFF801FF000FFFF800FF0007FFF000FF0007FFF0007E0002A387EB72F >I<003FFFC00003FFFFFC0007FFFFFE000FFFFFFF001FFFFFFF803FFFFFFFC03FF000FF C03FC0003FC07F80001FE07F00000FE07E000007E07E000007E07E000007E07E000007E0 FE000007F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC 000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC00 0003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC0000 03F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FE000007 F0FE000007F07E000007E07E000007E07E000007E07F00000FE07F00000FE07F80001FE0 3FC0003FC03FF801FFC03FFFFFFFC01FFFFFFF800FFFFFFF0007FFFFFE0003FFFFFC0000 3FFFC000243A7BB82F>I<7FFFFFE000FFFFFFF800FFFFFFFE00FFFFFFFF80FFFFFFFFC0 7FFFFFFFE003F0007FF003F0001FF003F00007F803F00003F803F00001FC03F00001FC03 F00000FC03F00000FE03F000007E03F000007E03F000007E03F000007E03F000007E03F0 00007E03F00000FE03F00000FC03F00001FC03F00001FC03F00003F803F00007F803F000 1FF003F0007FF003FFFFFFE003FFFFFFC003FFFFFF8003FFFFFE0003FFFFF80003FFFFE0 0003F000000003F000000003F000000003F000000003F000000003F000000003F0000000 03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 F000000003F00000007FFF800000FFFFC00000FFFFC00000FFFFC00000FFFFC000007FFF 80000027387DB72F>I<003FFFC00003FFFFFC0007FFFFFE000FFFFFFF001FFFFFFF803F FFFFFFC03FF000FFC03FC0003FC07F80001FE07F00000FE07F00000FE07E000007E07E00 0007E07E000007E0FE000007F0FC000003F0FC000003F0FC000003F0FC000003F0FC0000 03F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003 F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0 FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC 00FC03F0FC01FC03F0FE00FE07F07E00FE07E07E007F07E07E007F07E07F003F8FE07F00 3F8FE07F801FDFE03FC01FFFC03FF00FFFC03FFFFFFFC01FFFFFFF800FFFFFFF0007FFFF FE0003FFFFFC00003FFFFC00000001FC00000000FE00000000FE000000007F000000007F 000000003F800000003F800000001FC00000001FC00000000FE00000000FE000000007C0 24467BB82F>I<7FFFFE0000007FFFFFC00000FFFFFFF00000FFFFFFFC00007FFFFFFE00 007FFFFFFF000003F003FF800003F0007FC00003F0003FC00003F0001FE00003F0000FE0 0003F00007E00003F00007F00003F00003F00003F00003F00003F00003F00003F00003F0 0003F00003F00003F00007F00003F00007E00003F0000FE00003F0001FE00003F0003FC0 0003F0007FC00003F003FF800003FFFFFF000003FFFFFE000003FFFFFC000003FFFFF800 0003FFFFFC000003FFFFFE000003F003FF000003F0007F800003F0003F800003F0001F80 0003F0001FC00003F0000FC00003F0000FC00003F0000FC00003F0000FC00003F0000FC0 0003F0000FC00003F0000FC00003F0000FC00003F0000FC00003F0000FC1E003F0000FC3 F003F0000FC3F003F0000FC3F003F0000FE3F07FFF8007E7F07FFF8007FFE0FFFFC007FF E0FFFFC003FFC07FFF8001FFC07FFF8000FF80000000003E002C397EB72F>I<001FF803 80007FFF07C001FFFFC7C003FFFFEFC007FFFFFFC00FFFFFFFC01FF80FFFC03FC003FFC0 3F8000FFC07F00007FC07E00003FC0FE00003FC0FC00001FC0FC00001FC0FC00000FC0FC 00000FC0FC00000FC0FC00000FC0FE000007807E000000007F000000003F800000003FC0 0000001FF80000000FFF80000007FFF8000003FFFF800001FFFFE000007FFFF800000FFF FC000000FFFE0000000FFF00000000FF800000003FC00000001FC00000000FE000000007 E000000007E000000007F078000003F0FC000003F0FC000003F0FC000003F0FC000003F0 FC000003F0FE000007F0FE000007E0FF00000FE0FF80000FE0FFC0001FC0FFF0007FC0FF FE01FF80FFFFFFFF00FFFFFFFE00FDFFFFFC00F87FFFF800F81FFFE0007003FF0000243A 7BB82F>I<7FFFFFFFFF80FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FF FFFFFFFFC0FC003F000FC0FC003F000FC0FC003F000FC0FC003F000FC0FC003F000FC0FC 003F000FC0FC003F000FC078003F00078000003F00000000003F00000000003F00000000 003F00000000003F00000000003F00000000003F00000000003F00000000003F00000000 003F00000000003F00000000003F00000000003F00000000003F00000000003F00000000 003F00000000003F00000000003F00000000003F00000000003F00000000003F00000000 003F00000000003F00000000003F00000000003F00000000003F00000000003F00000000 003F00000000003F00000000003F00000000003F00000000003F00000000003F00000000 003F00000000003F00000000003F000000001FFFFE0000003FFFFF0000003FFFFF000000 3FFFFF0000003FFFFF0000001FFFFE00002A387EB72F>I<7FFF801FFFE0FFFFC03FFFF0 FFFFC03FFFF0FFFFC03FFFF0FFFFC03FFFF07FFF801FFFE003F00000FC0003F00000FC00 03F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC00 03F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC00 03F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC00 03F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC00 03F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC00 03F00000FC0003F00000FC0003F00000FC0003F80001FC0003F80001FC0001F80001F800 01F80001F80001FC0003F80000FE0007F00000FE0007F000007F000FE000007F801FE000 003FE07FC000001FFFFF8000000FFFFF00000007FFFE00000003FFFC00000000FFF00000 00003FC000002C397FB72F>I<7FFE001FFF80FFFE001FFFC0FFFF003FFFC0FFFF003FFF C0FFFE001FFFC07FFE001FFF8007E00001F80007E00001F80007E00001F80007F00003F8 0003F00003F00003F00003F00003F00003F00003F80007F00001F80007E00001F80007E0 0001F80007E00001FC000FE00000FC000FC00000FC000FC00000FC000FC00000FE001FC0 00007E001F8000007E001F8000007E001F8000007E001F8000003F003F0000003F003F00 00003F003F0000003F003F0000001F807E0000001F807E0000001F807E0000001F807E00 00000FC0FC0000000FC0FC0000000FC0FC0000000FC0FC00000007C0F800000007E1F800 000007E1F800000007E1F800000003E1F000000003F3F000000003F3F000000003F3F000 000001F3E000000001F3E000000001F3E000000001F3E000000000FFC000000000FFC000 000000FFC000000000FFC000000000FFC0000000007F80000000003F0000002A397EB72F >I<7FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFC0000FC0000FC0000FC0000FC0000FC 0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC 0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC 0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC 0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC 0000FC0000FC0000FC0000FC0000FC0000FFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7FFFFE18 476DBE2F>91 D<7FFFFEFFFFFFFFFFFFFFFFFFFFFFFF7FFFFF00003F00003F00003F0000 3F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0000 3F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0000 3F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0000 3F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0000 3F00003F00003F00003F00003F00003F00003F00003F7FFFFFFFFFFFFFFFFFFFFFFFFFFF FF7FFFFE18477DBE2F>93 D<7FFFFFFFE07FFFFFFFE0FFFFFFFFF0FFFFFFFFF0FFFFFFFF F07FFFFFFFE07FFFFFFFE024077B7D2F>95 D<001C003E00FF01FF03FF07FC0FF80FF01F C01FC03F803F007F007E007E00FE00FC00FC00FC00FC00FFE0FFF0FFF8FFFC7FFC7FFC3F FC3FFC1FF80FF003E0101F71BE2F>I<007FF000000003FFFE00000007FFFF8000000FFF FFC000001FFFFFE000003FFFFFF000003FC01FF800003FC003FC00003FC001FC00003FC0 00FE00001F80007E00000F00007F00000000003F00000000003F00000000003F00000000 003F000000007FFF00000007FFFF0000003FFFFF000001FFFFFF000007FFFFFF00000FFF F83F00001FFE003F00003FF0003F00007FC0003F00007F00003F0000FE00003F0000FC00 003F0000FC00003F0000FC00003F0000FC00003F0000FC00007F0000FE00007F00007F00 00FF00007F8003FF80003FE01FFFFF003FFFFFFFFF801FFFFFFFFF800FFFFFDFFF8007FF FF0FFF8001FFFC01FF00007FE0000000292A7BA82F>I<7FF000000000FFF800000000FF F800000000FFF800000000FFF8000000007FF80000000001F80000000001F80000000001 F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 F80000000001F80000000001F80FF0000001F83FFC000001F8FFFF000001FBFFFFC00001 FFFFFFE00001FFFFFFF00001FFF03FF00001FFC00FF80001FF8003FC0001FF0001FC0001 FE0000FE0001FC0000FE0001FC00007F0001F800003F0001F800003F0001F800003F8001 F800001F8001F800001F8001F800001F8001F800001F8001F800001F8001F800001F8001 F800001F8001F800001F8001F800003F8001F800003F8001FC00003F0001FC00007F0001 FC00007F0001FE0000FE0001FE0000FE0001FF0001FC0001FF8007FC0001FFC00FF80001 FFF03FF00001FFFFFFE00001FFFFFFC00001FBFFFF800001F9FFFF000000F07FFC000000 001FE0000029397EB72F>I<0003FFC000000FFFF800003FFFFC0000FFFFFE0001FFFFFF 0003FFFFFF8007FF007F800FF8007F800FF0007F801FE0007F801FC0003F003F80001E00 3F000000007F000000007E000000007E00000000FE00000000FC00000000FC00000000FC 00000000FC00000000FC00000000FC00000000FC00000000FC00000000FE000000007E00 0000007E000000007F000000007F000007803F80000FC03FC0000FC01FE0001FC01FF000 1F800FFC007F8007FF81FF0003FFFFFF0001FFFFFE0000FFFFFC00003FFFF000000FFFC0 000003FE0000222A79A82F>I<000003FF8000000007FFC000000007FFC000000007FFC0 00000007FFC000000003FFC0000000000FC0000000000FC0000000000FC0000000000FC0 000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0 000003FC0FC000001FFF0FC000007FFFCFC00000FFFFEFC00001FFFFFFC00003FFFFFFC0 0007FE07FFC0000FF801FFC0001FF0007FC0001FC0003FC0003F80003FC0003F80001FC0 007F00001FC0007F00000FC0007E00000FC000FE00000FC000FE00000FC000FC00000FC0 00FC00000FC000FC00000FC000FC00000FC000FC00000FC000FC00000FC000FC00000FC0 00FC00000FC000FE00000FC0007E00001FC0007E00001FC0007F00001FC0003F80003FC0 003F80007FC0001FC0007FC0001FE000FFC0000FF801FFC00007FE07FFFF0007FFFFFFFF 8003FFFFEFFF8001FFFFCFFF80007FFF8FFF80001FFE07FF000007F800000029397DB72F >I<0003FE0000000FFF8000003FFFE00000FFFFF00001FFFFF80003FFFFFC0007FE07FE 000FF800FF000FF0007F001FC0003F803FC0001F803F80001FC03F00000FC07F00000FC0 7E00000FC07E00000FE0FE000007E0FC000007E0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FF FFFFFFE0FFFFFFFFE0FFFFFFFFC0FC00000000FE000000007E000000007E000000007F00 0000003F800003C03F800007E01FC00007E01FE0000FE00FF8001FC007FE003FC007FF80 FF8003FFFFFF8001FFFFFF00007FFFFC00003FFFF800000FFFE0000001FF0000232A7BA8 2F>I<000001FF00000007FFC000001FFFE000007FFFE00000FFFFF00000FFFFF00001FF 0FF00003FC0FF00003F807E00007F001800007E000000007E000000007E000000007E000 000007E000000007E000000007E000000007E000007FFFFFFF80FFFFFFFFC0FFFFFFFFC0 FFFFFFFFC0FFFFFFFFC07FFFFFFF800007E000000007E000000007E000000007E0000000 07E000000007E000000007E000000007E000000007E000000007E000000007E000000007 E000000007E000000007E000000007E000000007E000000007E000000007E000000007E0 00000007E000000007E000000007E000000007E000000007E000000007E000000007E000 000007E000003FFFFFFC007FFFFFFE007FFFFFFE007FFFFFFE007FFFFFFE003FFFFFFC00 24397DB82F>I<0003F801FE00001FFF07FF80007FFFDFFF8000FFFFFFFFC001FFFFFFFF C003FFFFFFFFC003FE0FFF0F8007F803FC07000FF001FE00000FE000FE00000FC0007E00 001FC0007F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00 001F80003F00001FC0007F00000FC0007E00000FE000FE00000FF001FE000007F803FC00 0003FE0FF8000003FFFFF8000007FFFFF0000007FFFFE000000FFFFFC000000F9FFF0000 000F83F80000000F80000000000F80000000000F80000000000FC00000000007E4000000 0007FFFFF0000003FFFFFF000007FFFFFFC0000FFFFFFFE0001FFFFFFFF0003FC0001FF8 003F000001FC007E000000FE007C0000007E00FC0000003E00F80000003F00F80000001F 00F80000001F00F80000001F00F80000001F00FC0000003F007C0000003E007F000000FE 003F800001FC003FE00007FC001FFE007FF8000FFFFFFFF00007FFFFFFE00001FFFFFF80 0000FFFFFF0000001FFFF800000003FFC000002A3E7DA72F>I<7FF000000000FFF80000 0000FFF800000000FFF800000000FFF8000000007FF80000000001F80000000001F80000 000001F80000000001F80000000001F80000000001F80000000001F80000000001F80000 000001F80000000001F80000000001F80FF0000001F83FFC000001F8FFFE000001FBFFFF 000001FFFFFF800001FFFFFF800001FFF03FC00001FFC01FC00001FF800FE00001FF000F E00001FE0007E00001FC0007E00001FC0007E00001FC0007E00001F80007E00001F80007 E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007 E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007 E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007 E0007FFFE07FFF80FFFFF0FFFFC0FFFFF0FFFFC0FFFFF0FFFFC0FFFFF0FFFFC07FFFE07F FF802A387EB72F>I<0003800000000FE00000000FE00000001FF00000001FF00000001F F00000000FE00000000FE000000003800000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000003FFFE000007FFFF000 007FFFF000007FFFF000007FFFF000003FFFF000000003F000000003F000000003F00000 0003F000000003F000000003F000000003F000000003F000000003F000000003F0000000 03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0 00000003F000000003F000007FFFFFFF00FFFFFFFF00FFFFFFFF80FFFFFFFF80FFFFFFFF 007FFFFFFF00213979B82F>I<0000038000000FE000000FE000001FF000001FF000001F F000000FE000000FE0000003800000000000000000000000000000000000000000000000 0000000000000000000000000000FFFFE000FFFFF001FFFFF001FFFFF000FFFFF000FFFF F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003 F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003 F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003 F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003 F0000003F0000003F0000003F0000003F0000003F0000007F0000007E07E000FE07E000F C0FF001FC0FF003F80FF00FF80FFFFFF007FFFFE007FFFFC003FFFF8000FFFE00001FF80 001C4E7CB82F>I<7FF000000000FFF800000000FFF800000000FFF800000000FFF80000 00007FF80000000000F80000000000F80000000000F80000000000F80000000000F80000 000000F80000000000F80000000000F80000000000F80000000000F80000000000F80000 000000F807FFFF0000F80FFFFF0000F80FFFFF8000F80FFFFF8000F80FFFFF0000F807FF FF0000F8003F800000F8007F000000F800FE000000F801FC000000F803F8000000F807F0 000000F80FE0000000F81FC0000000F83F80000000F87F00000000F8FF00000000F9FF80 000000FBFF80000000FFFFC0000000FFE7E0000000FFC7F0000000FF83F0000000FF01F8 000000FE00FC000000FC00FE000000F8007E000000F8003F000000F8001F800000F8001F 800000F8000FC00000F80007E00000F80007F0007FFFF03FFFC0FFFFF87FFFC0FFFFF87F FFE0FFFFF87FFFE0FFFFF87FFFC07FFFF03FFFC02B387EB72F>I<7FFFF000007FFFF800 00FFFFF80000FFFFF800007FFFF800007FFFF800000001F800000001F800000001F80000 0001F800000001F800000001F800000001F800000001F800000001F800000001F8000000 01F800000001F800000001F800000001F800000001F800000001F800000001F800000001 F800000001F800000001F800000001F800000001F800000001F800000001F800000001F8 00000001F800000001F800000001F800000001F800000001F800000001F800000001F800 000001F800000001F800000001F800000001F800000001F800000001F800000001F80000 0001F800000001F800000001F800000001F800000001F800007FFFFFFFE07FFFFFFFE0FF FFFFFFF0FFFFFFFFF07FFFFFFFE07FFFFFFFE024387BB72F>I<0001F801F8007F8FFC0F FC00FFDFFE1FFE00FFFFFF3FFF00FFFFFFFFFF80FFFFFFFFFF807FFE1FFE1F8007FC0FFC 0FC007F80FF80FC007F007F007C007E007E007C007E007E007C007E007E007C007C007C0 07C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C0 07C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C0 07C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C0 07C007C007C007C007C007C007C07FFC3FFC3FFCFFFE3FFE3FFEFFFE7FFE7FFEFFFE7FFE 7FFEFFFE3FFE3FFE7FFC3FFC3FFC2F2880A72F>I<00000FF000007FF03FFC0000FFF8FF FE0000FFFBFFFF0000FFFFFFFF8000FFFFFFFF80007FFFF03FC00001FFC01FC00001FF80 0FE00001FF000FE00001FE0007E00001FC0007E00001FC0007E00001FC0007E00001F800 07E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F800 07E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F800 07E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F800 07E00001F80007E0007FFFE07FFF80FFFFF0FFFFC0FFFFF0FFFFC0FFFFF0FFFFC0FFFFF0 FFFFC07FFFE07FFF802A287EA72F>I<0003FC0000001FFF8000003FFFC00000FFFFF000 01FFFFF80003FFFFFC0007FE07FE000FF801FF000FE0007F001FC0003F801F80001F803F 80001FC03F00000FC07F00000FE07E000007E07E000007E0FC000003F0FC000003F0FC00 0003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FE0000 07F07E000007E07E000007E07F00000FE07F00000FE03F80001FC03F80001FC01FC0003F 801FE0007F800FF801FF0007FE07FE0003FFFFFC0001FFFFF80000FFFFF000007FFFE000 001FFF80000003FC0000242A7BA82F>I<00000FF000007FF03FFC0000FFF8FFFF0000FF FBFFFFC000FFFFFFFFE000FFFFFFFFF0007FFFF03FF00001FFC00FF80001FF8003FC0001 FF0001FC0001FE0000FE0001FC0000FE0001FC00007F0001F800003F0001F800003F0001 F800003F8001F800001F8001F800001F8001F800001F8001F800001F8001F800001F8001 F800001F8001F800001F8001F800001F8001F800003F8001F800003F8001FC00003F0001 FC00007F0001FC00007F0001FE0000FE0001FE0000FE0001FF0001FC0001FF8007FC0001 FFC00FF80001FFF03FF00001FFFFFFE00001FFFFFFC00001FBFFFF800001F9FFFF000001 F87FFC000001F81FE0000001F80000000001F80000000001F80000000001F80000000001 F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 F80000000001F80000000001F8000000007FFFE0000000FFFFF0000000FFFFF0000000FF FFF0000000FFFFF00000007FFFE0000000293C7EA72F>I<0003FE01E000000FFF83F000 003FFFE3F00000FFFFF3F00001FFFFFBF00003FFFFFFF00007FF03FFF0000FFC00FFF000 0FF0003FF0001FE0001FF0003FC0001FF0003F80000FF0007F000007F0007F000007F000 7E000007F0007E000003F000FE000003F000FC000003F000FC000003F000FC000003F000 FC000003F000FC000003F000FC000003F000FC000003F000FE000003F000FE000007F000 7E000007F0007F000007F0007F00000FF0003F80000FF0003F80001FF0001FC0003FF000 1FF0007FF0000FF800FFF00007FE03FFF00003FFFFFFF00001FFFFFBF00000FFFFF3F000 007FFFC3F000001FFF03F0000003FC03F00000000003F00000000003F00000000003F000 00000003F00000000003F00000000003F00000000003F00000000003F00000000003F000 00000003F00000000003F00000000003F00000000003F000000001FFFFE0000001FFFFE0 000003FFFFF0000003FFFFF0000001FFFFE0000001FFFFE02C3C7DA72F>I<0000000FF0 007FFF007FFE007FFF81FFFF00FFFF87FFFF00FFFF8FFFFF807FFF9FFFFF807FFFBFF87F 80001FFFC07F80001FFF003F00001FFE001E00001FFC000000001FF8000000001FF00000 00001FF0000000001FE0000000001FC0000000001FC0000000001FC0000000001FC00000 00001F80000000001F80000000001F80000000001F80000000001F80000000001F800000 00001F80000000001F80000000001F80000000001F80000000001F80000000001F800000 00001F80000000001F80000000001F800000007FFFFFF800007FFFFFFC0000FFFFFFFC00 00FFFFFFFC00007FFFFFFC00007FFFFFF8000029287EA72F>I<001FFC0E0001FFFF9F00 07FFFFFF000FFFFFFF001FFFFFFF003FFFFFFF007FF007FF007F8000FF00FE00007F00FE 00007F00FC00003F00FC00003F00FC00003F00FE00003F007F00001E007FC00000003FFC 0000001FFFF000000FFFFF800003FFFFE00000FFFFF800001FFFFE0000007FFF00000001 FF800000007F807800001FC0FC00000FC0FC000007E0FC000007E0FE000007E0FE000007 E0FF000007E0FF80000FE0FFC0001FC0FFE0003FC0FFFC01FF80FFFFFFFF80FFFFFFFF00 FFFFFFFE00F8FFFFF800F83FFFE0007007FF0000232A7AA82F>I<000F000000001F8000 00001F800000001F800000001F800000001F800000001F800000001F800000001F800000 001F800000001F8000007FFFFFFFC0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE07F FFFFFFC0001F800000001F800000001F800000001F800000001F800000001F800000001F 800000001F800000001F800000001F800000001F800000001F800000001F800000001F80 0000001F800000001F800000001F800000001F800000001F8000F0001F8001F8001F8001 F8001F8001F8001F8001F8001F8001F8001FC003F8001FC007F0000FE00FF0000FF81FE0 0007FFFFC00007FFFFC00003FFFF800001FFFE0000007FF80000001FE00025337EB12F> I<7FF001FFC000FFF803FFE000FFF803FFE000FFF803FFE000FFF803FFE0007FF801FFE0 0001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E0 0001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E0 0001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E0 0001F80007E00001F80007E00001F80007E00001F80007E00001F8000FE00001F8000FE0 0001F8001FE00001F8003FE00001FC007FE00000FF01FFFF8000FFFFFFFFC0007FFFFFFF C0007FFFFFFFC0003FFFE7FFC0000FFF83FF800003FE0000002A287EA62F>I<7FFF003F FF80FFFF807FFFC0FFFF807FFFC0FFFF807FFFC0FFFF807FFFC07FFF003FFF8001F00003 E00001F00003E00001F80007E00000F80007C00000F80007C00000FC000FC000007C000F 8000007C000F8000007C000F8000003E001F0000003E001F0000003E001F0000001F003E 0000001F003E0000001F003E0000000F807C0000000F807C0000000F807C00000007C0F8 00000007C0F800000007C0F800000003E1F000000003E1F000000003E1F000000001F3E0 00000001F3E000000001F3E000000000FFC000000000FFC000000000FFC0000000007F80 000000007F80000000003F0000002A277EA62F>I<7FFF801FFFE07FFFC03FFFE0FFFFC0 3FFFF0FFFFC03FFFF07FFFC03FFFE07FFF801FFFE007C000003E0007C000003E0007C000 003E0007E000007E0003E000007C0003E000007C0003E000007C0003E000007C0003E000 007C0001F00000F80001F00F80F80001F01FC0F80001F03FE0F80001F03FE0F80001F03F E0F80000F87FF0F00000F87DF1F00000F87DF1F00000F8FDF1F00000F8FDF9F00000F8F9 F9F0000078F8F9E0000079F8F9E000007DF8F9E000007DF8F9E000007DF079E000007DF0 7BE000003FF07FC000003FE07FC000003FE03FC000003FE03FC000003FC01FC000001F80 0F80002C277FA62F>I<3FFF80FFFE007FFFC1FFFF007FFFC1FFFF007FFFC1FFFF007FFF C1FFFF003FFF80FFFE00007E001F0000003F003F0000003F007E0000001F80FC0000000F C0FC00000007C1F800000007E3F000000003F3E000000001FFE000000000FFC000000000 FF80000000007F00000000003F00000000003F00000000007F0000000000FF8000000000 FFC000000001F3E000000003E3F000000007E1F000000007C0F80000000F80FC0000001F 807E0000003F003E0000003E001F0000007E001F800000FC000FC0007FFF807FFF807FFF C0FFFF80FFFFC0FFFFC0FFFFC0FFFFC07FFFC0FFFF807FFF807FFF802A277EA62F>I<7F FF803FFF80FFFF807FFFC0FFFFC07FFFC0FFFFC07FFFC0FFFF807FFFC07FFF803FFF8001 F00003E00001F80003E00000F80003E00000F80007C00000FC0007C000007C0007C00000 7E000F8000003E000F8000003E000F8000003F001F0000001F001F0000001F001F000000 0F803E0000000F803E0000000FC03E00000007C07C00000007C07C00000007E07C000000 03E0F800000003E0F800000001F0F800000001F0F000000001F1F000000000F9F0000000 00F9E000000000F9E0000000007BE0000000007FC0000000003FC0000000003FC0000000 003F80000000001F80000000001F80000000001F00000000001F00000000001F00000000 003E00000000003E00000000003E00000000007C00000000007C0000000000FC0000000F 00F80000001F81F80000003FC1F80000003FC3F00000003F07E00000003F1FE00000003F FFC00000001FFF800000001FFF800000000FFE0000000007FC0000000003F0000000002A 3C7EA62F>I<3FFFFFFFF87FFFFFFFFC7FFFFFFFFC7FFFFFFFFC7FFFFFFFFC7FFFFFFFF8 7E00000FF07E00001FE07E00003FC07E00007F807E0000FF003C0001FE00000003FC0000 0007F80000000FF00000001FE00000003FC00000007F80000000FF00000001FE00000003 FC00000007F80000000FF00000001FE00000003FC00000007F80000000FF00003C01FE00 007E03FC00007E07F800007E0FF000007E1FE000007E3FC000007E7FFFFFFFFEFFFFFFFF FEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFE7FFFFFFFFC27277DA62F>I<0000003FE0000003 FFF000000FFFF000001FFFF000007FFFF000007FFFE00000FFE0000000FE00000001FC00 000001F800000001F800000001F800000001F800000001F800000001F800000001F80000 0001F800000001F800000001F800000001F800000001F800000001F800000001F8000000 01F800000001F800000001F800000001F800000001F800000001F800000003F800000007 F00000003FF000003FFFE00000FFFFC00000FFFF800000FFFE000000FFFF800000FFFFC0 00003FFFE00000003FF000000007F000000003F800000001F800000001F800000001F800 000001F800000001F800000001F800000001F800000001F800000001F800000001F80000 0001F800000001F800000001F800000001F800000001F800000001F800000001F8000000 01F800000001F800000001F800000001FC00000000FE00000000FFE00000007FFFE00000 7FFFF000001FFFF000000FFFF0000003FFF00000003FE024477BBE2F>I<7C7CFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE7C7C07476CBE2F>I< 7FC0000000FFFC000000FFFF000000FFFF800000FFFFE000007FFFE00000007FF0000000 07F000000003F800000001F800000001F800000001F800000001F800000001F800000001 F800000001F800000001F800000001F800000001F800000001F800000001F800000001F8 00000001F800000001F800000001F800000001F800000001F800000001F800000001F800 000001FC00000000FE00000000FFC00000007FFFC000003FFFF000001FFFF0000007FFF0 00001FFFF000003FFFF000007FFFC00000FFC0000000FE00000001FC00000001F8000000 01F800000001F800000001F800000001F800000001F800000001F800000001F800000001 F800000001F800000001F800000001F800000001F800000001F800000001F800000001F8 00000001F800000001F800000001F800000001F800000003F800000007F00000007FF000 007FFFE00000FFFFE00000FFFF800000FFFF000000FFFC0000007FC000000024477BBE2F >I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fi ecbx1095 10.95 50 /Fi 50 122 df<0000007FF8000000000FFFFE000000007FFFFF80000001FFC01FC00000 07FE0003E000001FFC0007F000003FF0001FF800007FE0003FF800007FE0003FF80000FF C0003FF80000FFC0007FFC0001FF80003FF80001FF80003FF80001FF80003FF80001FF80 001FF00001FF80000FE00001FF800003800001FF800000000001FF800000000001FF8000 00000001FF800000000001FF800000000001FF800000000001FF8003FFFC00FFFFFFFFFF FC00FFFFFFFFFFFC00FFFFFFFFFFFC00FFFFFFFFFFFC0001FF80000FFC0001FF80000FFC 0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC00 01FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001 FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF 80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80 000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF8000 0FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC007FFFFE03FF FFF07FFFFE03FFFFF07FFFFE03FFFFF07FFFFE03FFFFF034407EBF3A>28 D45 D<07801FE03FF07FF8FFFCFFFCFFFCFFFCFFFCFFFC7FF83FF01FE007800E0E79 8D1D>I<0000000006000000000E000000001E000000001C000000001C000000003C0000 00003800000000780000000070000000007000000000F000000000E000000001E0000000 01C000000003C000000003800000000380000000078000000007000000000F000000000E 000000000E000000001E000000001C000000003C00000000380000000038000000007800 0000007000000000F000000000E000000000E000000001E000000001C000000003C00000 0003800000000780000000070000000007000000000F000000000E000000001E00000000 1C000000001C000000003C000000003800000000780000000070000000007000000000F0 00000000E000000001E000000001C000000001C000000003C00000000380000000078000 000007000000000F000000000E000000000E000000001E000000001C000000003C000000 003800000000380000000078000000007000000000F000000000E000000000E000000001 E000000001C000000003C000000003800000000380000000078000000007000000000F00 0000000E000000001E000000001C000000001C000000003C000000003800000000780000 000070000000007000000000F000000000E000000000E000000000275B7AC334>I<0000 FFE000000007FFFC0000001FFFFF0000007FE0FFC00000FF803FE00001FE000FF00003FE 000FF80007FC0007FC0007F80003FC000FF80003FE001FF80003FF001FF80003FF001FF8 0003FF003FF00001FF803FF00001FF803FF00001FF807FF00001FFC07FF00001FFC07FF0 0001FFC07FF00001FFC07FF00001FFC0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF0 0001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF0 0001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF0 0001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE07FF00001FFC07FF0 0001FFC07FF00001FFC07FF00001FFC07FF00001FFC03FF00001FF803FF00001FF803FF8 0003FF801FF80003FF001FF80003FF000FF80003FE000FFC0007FE0007FC0007FC0003FE 000FF80001FF001FF00000FF803FE000007FE0FFC000001FFFFF00000007FFFC00000000 FFE000002B3D7CBB34>I<00000F000000001F000000007F00000001FF0000000FFF0000 01FFFF0000FFFFFF0000FFFFFF0000FFF7FF0000FE07FF00000007FF00000007FF000000 07FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007 FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF 00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00 000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF0000 0007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF000000 07FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007 FF00003FFFFFFFF83FFFFFFFF83FFFFFFFF83FFFFFFFF8253C79BB34>I<0003FF800000 003FFFF8000000FFFFFE000003FFFFFF800007F80FFFC0000FC001FFF0001F8000FFF800 3F00007FFC007FC0003FFE007FE0003FFE00FFF0001FFF00FFF8001FFF00FFF8001FFF00 FFF8000FFF80FFF8000FFF80FFF8000FFF80FFF8000FFF807FF0000FFF807FF0000FFF80 1FC0000FFF800700000FFF800000000FFF000000001FFF000000001FFF000000001FFE00 0000003FFE000000003FFC000000007FF8000000007FF000000000FFE000000001FFC000 000001FF8000000003FF0000000007FE000000000FF8000000001FF0000000001FE00000 00003F80000000007F0000000000FE0000000001F80007800003F00007800007E0000780 000FC0000F00001F80000F00003E00000F00007C00000F0000F800001F0001F000001F00 01FFFFFFFF0003FFFFFFFE0007FFFFFFFE000FFFFFFFFE001FFFFFFFFE003FFFFFFFFE00 7FFFFFFFFE00FFFFFFFFFE00FFFFFFFFFC00FFFFFFFFFC00FFFFFFFFFC00293C7BBB34> I<0000FFE00000000FFFFC0000003FFFFF800000FF01FFE00001F8007FF00003E0003FF8 0007C0003FFC000FF0001FFE000FFC001FFE001FFE001FFF001FFE001FFF001FFE001FFF 001FFE001FFF001FFF001FFF001FFE001FFF001FFE001FFF000FFE001FFF0007FC001FFE 0003F0003FFE000000003FFC000000003FFC000000007FF8000000007FF000000000FFE0 00000001FFC000000003FF000000000FFC00000007FFF000000007FFE000000007FFFE00 00000001FF80000000007FE0000000003FF8000000001FFC000000001FFE000000000FFF 000000000FFF8000000007FFC000000007FFC000000007FFC007800007FFE01FE00007FF E07FF80007FFE07FF80007FFE0FFFC0007FFE0FFFC0007FFE0FFFC0007FFE0FFFC0007FF E0FFFC0007FFC0FFFC0007FFC0FFF8000FFFC07FF8000FFF807FF0000FFF003FC0001FFF 001FC0003FFE000FF0007FFC0007FE01FFF00003FFFFFFE00000FFFFFF8000001FFFFC00 000001FFC000002B3D7CBB34>I<00000001F00000000001F00000000003F00000000007 F0000000000FF0000000001FF0000000001FF0000000003FF0000000007FF000000000FF F000000000FFF000000001FFF000000003FFF000000007FFF00000000FBFF00000000F3F F00000001E3FF00000003C3FF00000007C3FF0000000783FF0000000F03FF0000001E03F F0000003E03FF0000003C03FF0000007803FF000000F003FF000001F003FF000003E003F F000003C003FF0000078003FF00000F0003FF00001F0003FF00001E0003FF00003C0003F F0000780003FF0000F80003FF0001F00003FF0001E00003FF0003C00003FF0007800003F F000F800003FF000FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF80000007F F0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007F F0000000007FF0000000007FF0000000007FF0000000007FF0000001FFFFFFF80001FFFF FFF80001FFFFFFF80001FFFFFFF82D3C7DBB34>I<0E00000018000FC00000F8000FFC00 1FF8000FFFFFFFF0000FFFFFFFF0000FFFFFFFE0000FFFFFFFC0000FFFFFFF80000FFFFF FF00000FFFFFFC00000FFFFFF800000FFFFFE000000FFFFF0000000FFFF80000000F8000 0000000F80000000000F80000000000F80000000000F80000000000F80000000000F8000 0000000F80000000000F80000000000F81FFC000000F8FFFF800000FBFFFFE00000FFF01 FF80000FF8007FE0000FE0003FF0000FC0003FF8000F80001FFC000700001FFC00000000 1FFE000000000FFE000000000FFF000000000FFF000000000FFF000000000FFF80000000 0FFF800F00000FFF803FC0000FFF807FE0000FFF80FFF0000FFF80FFF0000FFF80FFF000 0FFF80FFF0000FFF80FFF0000FFF00FFF0000FFF00FFE0000FFF007FC0001FFE007F8000 1FFE007C00001FFC003E00003FFC003F00003FF8001F80007FF0000FE000FFE00007FC07 FFC00001FFFFFF000000FFFFFC0000003FFFF000000007FF000000293D7BBB34>I<0000 03FE000000003FFFC0000000FFFFF0000003FE01F800000FF8007C00003FE0003E00007F C001FE0000FF8003FF0001FF8007FF0003FF0007FF0003FE0007FF0007FE0007FF000FFE 0007FF000FFC0007FF001FFC0003FE001FFC0001FC003FFC000000003FFC000000003FF8 000000007FF8000000007FF8000000007FF8000000007FF83FFC0000FFF87FFF8000FFF9 FFFFC000FFFBC03FF000FFFB800FF800FFFF000FFC00FFFF0007FE00FFFE0007FF00FFFE 0003FF80FFFC0003FF80FFFC0003FFC0FFFC0003FFC0FFFC0003FFC0FFF80003FFE0FFF8 0003FFE0FFF80003FFE0FFF80003FFE0FFF80003FFE07FF80003FFE07FF80003FFE07FF8 0003FFE07FF80003FFE07FF80003FFE03FF80003FFE03FF80003FFE03FF80003FFC01FF8 0003FFC01FFC0003FFC00FFC0003FF800FFC0007FF8007FE0007FF0003FE0007FE0003FF 000FFC0001FF801FF80000FFE07FF000003FFFFFE000000FFFFF80000003FFFE00000000 7FE000002B3D7CBB34>I<1E00000000001F00000000001FF0000000001FFFFFFFFFF01F FFFFFFFFF01FFFFFFFFFF03FFFFFFFFFF03FFFFFFFFFE03FFFFFFFFFC03FFFFFFFFF803F FFFFFFFF003FFFFFFFFE003FFFFFFFFE007FFFFFFFFC007C000001F8007C000003F00078 000007E00078000007C0007800000FC0007800001F8000F000003F0000F000007E0000F0 0000FC0000000000F80000000001F80000000003F00000000007E00000000007E0000000 000FC0000000001FC0000000001F80000000003F80000000003F80000000007F00000000 007F0000000000FF0000000000FF0000000001FE0000000001FE0000000003FE00000000 03FE0000000003FE0000000007FE0000000007FC0000000007FC000000000FFC00000000 0FFC000000000FFC000000000FFC000000000FFC000000001FFC000000001FFC00000000 1FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC00000000 1FFC000000001FFC000000000FF80000000007F00000000003E00000002C3F7ABD34>I< 0000FFE000000007FFFE0000001FFFFF8000007F803FE00000FC000FF00001F00007F800 03E00003FC0007E00001FE0007C00000FE000FC00000FF000FC000007F000FC000007F00 1FE000007F001FE000007F001FF000007F001FF800007F001FFC00007F001FFF0000FE00 1FFFC000FE001FFFE001FE000FFFF803FC000FFFFE03F8000FFFFF87F00007FFFFDFE000 07FFFFFF800003FFFFFE000001FFFFFF000000FFFFFF8000007FFFFFE000001FFFFFF000 001FFFFFFC00007FFFFFFE0001FEFFFFFE0003F83FFFFF0007F00FFFFF800FE007FFFF80 1FC001FFFFC03FC0007FFFC07F80001FFFE07F00000FFFE07F000003FFE0FF000000FFE0 FE0000007FE0FE0000003FE0FE0000001FE0FE0000001FE0FE0000000FE0FE0000000FE0 FE0000000FC0FF0000000FC07F0000000FC07F8000001F803FC000001F003FC000003F00 1FF000007E000FF80001FC0007FF801FF80001FFFFFFE000007FFFFF8000001FFFFE0000 0001FFE000002B3D7CBB34>I<0000FFE00000000FFFFC0000003FFFFF0000007FC07FC0 0001FF003FE00003FE001FF00007FE000FF8000FFC000FFC001FFC0007FC003FFC0007FE 003FF80007FF007FF80003FF007FF80003FF007FF80003FF80FFF80003FF80FFF80003FF 80FFF80003FFC0FFF80003FFC0FFF80003FFC0FFF80003FFC0FFF80003FFC0FFF80003FF E0FFF80003FFE0FFF80003FFE0FFF80003FFE0FFF80003FFE07FF80007FFE07FF80007FF E07FF80007FFE03FF80007FFE03FF8000FFFE01FFC000FFFE00FFC001FFFE007FE001FFF E003FE003BFFE001FF807BFFE0007FFFF3FFE0001FFFC3FFE00007FF83FFC000000003FF C000000003FFC000000003FFC000000003FF8000000007FF8000000007FF8007F00007FF 000FF80007FF001FFC0007FE001FFC000FFE001FFC000FFC001FFC000FFC001FFC001FF8 001FFC003FF0001FF8007FE0000FF000FFC0000FC001FF800007F807FF000003FFFFFC00 0001FFFFF00000007FFFC00000000FFC0000002B3D7CBB34>I<07801FE03FF07FF8FFFC FFFCFFFCFFFCFFFCFFFC7FF83FF01FE00780000000000000000000000000000000000000 00000000000007801FE03FF07FF8FFFCFFFCFFFCFFFCFFFCFFFC7FF83FF01FE007800E28 79A71D>I<00000000F80000000000000001FC0000000000000001FC0000000000000003 FE0000000000000003FE0000000000000003FE0000000000000007FF0000000000000007 FF000000000000000FFF800000000000000FFF800000000000000FFF800000000000001F FFC00000000000001FFFC00000000000003FFFE00000000000003FFFE00000000000003F FFE00000000000007FFFF00000000000007DFFF0000000000000FDFFF8000000000000F8 FFF8000000000000F8FFF8000000000001F8FFFC000000000001F07FFC000000000003F0 7FFE000000000003E03FFE000000000003E03FFE000000000007C03FFF000000000007C0 1FFF00000000000FC01FFF80000000000F800FFF80000000001F800FFFC0000000001F00 0FFFC0000000001F0007FFC0000000003F0007FFE0000000003E0003FFE0000000007E00 03FFF0000000007C0003FFF0000000007C0001FFF000000000FC0001FFF800000000F800 00FFF800000001F80000FFFC00000001F00000FFFC00000001FFFFFFFFFC00000003FFFF FFFFFE00000003FFFFFFFFFE00000007FFFFFFFFFF00000007C000003FFF00000007C000 001FFF0000000FC000001FFF8000000F8000000FFF8000001F8000000FFFC000001F0000 000FFFC000001F00000007FFC000003F00000007FFE000003E00000003FFE000007E0000 0003FFF000007C00000003FFF000007C00000001FFF00001FE00000001FFF800FFFFFC00 01FFFFFFF8FFFFFC0001FFFFFFF8FFFFFC0001FFFFFFF8FFFFFC0001FFFFFFF8453F7CBE 4E>65 D<00000007FF80001C000000FFFFF8003C000007FFFFFE007C00003FFFFFFF80FC 0000FFFF003FE1FC0003FFF00007F7FC0007FFC00001FFFC001FFF000000FFFC003FFC00 00003FFC007FF80000001FFC00FFF00000001FFC01FFE00000000FFC03FFE000000007FC 07FFC000000003FC07FF8000000003FC0FFF8000000001FC0FFF0000000001FC1FFF0000 000000FC1FFF0000000000FC3FFE0000000000FC3FFE0000000000FC3FFE00000000007C 7FFE00000000007C7FFE00000000007C7FFC0000000000007FFC000000000000FFFC0000 00000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC000000000000 FFFC000000000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC0000 00000000FFFC000000000000FFFC0000000000007FFC0000000000007FFC000000000000 7FFE0000000000007FFE00000000003C3FFE00000000003C3FFE00000000003C3FFE0000 0000003C1FFF00000000003C1FFF00000000007C0FFF0000000000780FFF800000000078 07FF8000000000F807FFC000000000F003FFE000000001F001FFE000000003E000FFF000 000007C0007FF80000000FC0003FFE0000001F80001FFF0000003F000007FFC00000FE00 0003FFF00003F8000000FFFF001FF00000003FFFFFFFC000000007FFFFFF0000000000FF FFF8000000000007FF8000003E407ABE4B>67 D72 DI77 D<0000003FFE00000000000003FFFFE000000000001FFFFFFC0000000000FFF007FF8000 000001FF8000FFC000000007FF00007FF00000000FFC00001FF80000003FF800000FFE00 00007FF0000007FF000000FFE0000003FF800001FFC0000001FFC00001FFC0000001FFC0 0003FF80000000FFE00007FF80000000FFF0000FFF000000007FF8000FFF000000007FF8 001FFF000000007FFC001FFE000000003FFC001FFE000000003FFC003FFE000000003FFE 003FFE000000003FFE003FFE000000003FFE007FFC000000001FFF007FFC000000001FFF 007FFC000000001FFF007FFC000000001FFF00FFFC000000001FFF80FFFC000000001FFF 80FFFC000000001FFF80FFFC000000001FFF80FFFC000000001FFF80FFFC000000001FFF 80FFFC000000001FFF80FFFC000000001FFF80FFFC000000001FFF80FFFC000000001FFF 80FFFC000000001FFF80FFFC000000001FFF80FFFC000000001FFF807FFC000000001FFF 007FFC000000001FFF007FFE000000003FFF007FFE000000003FFF003FFE000000003FFE 003FFE000000003FFE003FFE000000003FFE001FFF000000007FFC001FFF000000007FFC 000FFF000000007FF8000FFF80000000FFF80007FF80000000FFF00003FFC0000001FFE0 0003FFE0000003FFE00001FFE0000003FFC00000FFF0000007FF8000007FF800000FFF00 00003FFC00001FFE0000001FFF00007FFC00000007FFC001FFF000000003FFF007FFE000 000000FFFFFFFF80000000001FFFFFFC000000000007FFFFF00000000000003FFE000000 0041407ABE4E>79 DI82 D<0001FF8001C0001FFFF803C0007FFFFE07C001FFFFFF8FC003FF007FDFC007F8000FFF C00FF00003FFC01FE00001FFC03FC000007FC03FC000003FC07FC000003FC07F8000001F C07F8000000FC0FF8000000FC0FF80000007C0FF80000007C0FFC0000007C0FFC0000007 C0FFE0000003C0FFE0000003C0FFF0000003C0FFFC00000000FFFF000000007FFFF80000 007FFFFF8000007FFFFFFC00003FFFFFFF80001FFFFFFFE0001FFFFFFFF8000FFFFFFFFC 0007FFFFFFFE0003FFFFFFFF0001FFFFFFFF80007FFFFFFFC0001FFFFFFFC00007FFFFFF E000007FFFFFE0000003FFFFF00000001FFFF000000003FFF000000000FFF8000000007F F8000000003FF8F00000003FF8F00000001FF8F00000001FF8F00000000FF8F00000000F F8F80000000FF8F80000000FF8F80000000FF0FC0000000FF0FE0000000FF0FE0000001F E0FF0000001FE0FF8000003FC0FFE000003FC0FFF000007F80FFFE0001FF00FEFFE007FE 00FC3FFFFFF800F80FFFFFF000F003FFFF8000E0001FFC00002D407ABE3A>I<3FFFFFFF FFFFFFF83FFFFFFFFFFFFFF83FFFFFFFFFFFFFF83FFFFFFFFFFFFFF83FFC007FFC007FF8 3FE0007FFC000FF87F80007FFC0003FC7F00007FFC0001FC7E00007FFC0000FC7E00007F FC0000FC7C00007FFC00007C7C00007FFC00007C7800007FFC00003C7800007FFC00003C 7800007FFC00003C7800007FFC00003C7800007FFC00003CF000007FFC00001EF000007F FC00001EF000007FFC00001EF000007FFC00001EF000007FFC00001E0000007FFC000000 0000007FFC0000000000007FFC0000000000007FFC0000000000007FFC0000000000007F FC0000000000007FFC0000000000007FFC0000000000007FFC0000000000007FFC000000 0000007FFC0000000000007FFC0000000000007FFC0000000000007FFC0000000000007F FC0000000000007FFC0000000000007FFC0000000000007FFC0000000000007FFC000000 0000007FFC0000000000007FFC0000000000007FFC0000000000007FFC0000000000007F FC0000000000007FFC0000000000007FFC0000000000007FFC0000000000007FFC000000 0000007FFC0000000000007FFC0000000000007FFC0000000000007FFC0000000000007F FC0000000000007FFC0000000000007FFC000000001FFFFFFFFFF000001FFFFFFFFFF000 001FFFFFFFFFF000001FFFFFFFFFF0003F3D7CBC48>I<7FFFFFFFFFFFFFF8FFFFFFFFFF FFFFFCFFFFFFFFFFFFFFFCFFFFFFFFFFFFFFFCFFFFFFFFFFFFFFFC7FFFFFFFFFFFFFF83E 06776851>95 D<0007FF800000003FFFF0000001FFFFFC000003FC03FF000007E000FFC0 000FF8007FE0001FF8003FF0001FFC003FF0001FFC001FF8001FFC001FF8001FFC000FFC 001FFC000FFC000FF8000FFC0007F0000FFC0001C0000FFC000000000FFC000000000FFC 000000000FFC00000003FFFC000001FFFFFC00000FFFFFFC00007FFF8FFC0001FFF00FFC 0007FF800FFC000FFF000FFC001FFC000FFC003FF8000FFC007FF8000FFC007FF0000FFC 00FFF0000FFC00FFE0000FFC00FFE0000FFC00FFE0000FFC00FFE0001FFC00FFE0001FFC 00FFF0003FFC007FF0003FFC007FF8007FFF003FFC01F7FFFC1FFE07E3FFFC07FFFF81FF FC01FFFE007FFC001FF80000002E2B7DA932>97 D<00FF0000000000FFFF0000000000FF FF0000000000FFFF0000000000FFFF000000000007FF000000000003FF000000000003FF 000000000003FF000000000003FF000000000003FF000000000003FF000000000003FF00 0000000003FF000000000003FF000000000003FF000000000003FF000000000003FF0000 00000003FF000000000003FF000000000003FF000000000003FF000000000003FF007FE0 000003FF07FFFC000003FF1FFFFF000003FF7F00FFC00003FFF8003FF00003FFF0001FF8 0003FFE0000FFC0003FF800007FE0003FF800007FF0003FF000003FF0003FF000003FF80 03FF000003FF8003FF000003FFC003FF000001FFC003FF000001FFC003FF000001FFC003 FF000001FFE003FF000001FFE003FF000001FFE003FF000001FFE003FF000001FFE003FF 000001FFE003FF000001FFE003FF000001FFE003FF000001FFE003FF000001FFE003FF00 0001FFC003FF000001FFC003FF000001FFC003FF000003FFC003FF000003FF8003FF0000 03FF8003FF000007FF0003FF800007FE0003FFC0000FFE0003FFE0000FFC0003FDF0001F F80003F8F8007FE00003F07F01FFC00003E01FFFFF000003C007FFF80000000000FFC000 0033407DBE3A>I<00007FF0000003FFFF00001FFFFFC0007FE01FE000FF8003F001FF00 0FF803FE000FFC07FE001FFC0FFC001FFC1FFC001FFC1FF8001FFC3FF8001FFC3FF8000F F87FF80007F07FF00001C07FF0000000FFF0000000FFF0000000FFF0000000FFF0000000 FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF00000007F F00000007FF00000007FF80000007FF80000003FF800001E3FFC00001E1FFC00003E0FFC 00003C0FFE00007C07FF0000F803FF8001F000FFC003E0007FF00FC0001FFFFF000007FF FC0000007FE000272B7DA92E>I<0000000007F80000000007FFF80000000007FFF80000 000007FFF80000000007FFF800000000003FF800000000001FF800000000001FF8000000 00001FF800000000001FF800000000001FF800000000001FF800000000001FF800000000 001FF800000000001FF800000000001FF800000000001FF800000000001FF80000000000 1FF800000000001FF800000000001FF800000000001FF80000007FE01FF8000003FFFC1F F800001FFFFF1FF800007FF00FDFF80000FFC003FFF80003FF0000FFF80007FE00007FF8 000FFE00003FF8000FFC00001FF8001FFC00001FF8003FF800001FF8003FF800001FF800 7FF800001FF8007FF000001FF8007FF000001FF8007FF000001FF800FFF000001FF800FF F000001FF800FFF000001FF800FFF000001FF800FFF000001FF800FFF000001FF800FFF0 00001FF800FFF000001FF800FFF000001FF800FFF000001FF8007FF000001FF8007FF000 001FF8007FF000001FF8007FF800001FF8003FF800001FF8003FF800001FF8001FF80000 1FF8001FFC00003FF8000FFC00007FF80007FE0000FFF80003FF0001FFFC0001FF8007FF FFE0007FE01F9FFFE0001FFFFE1FFFE00007FFF81FFFE000007FC01FE00033407DBE3A> I<0000FFE0000007FFFC00003FFFFF00007FE0FF8001FF803FC003FF001FE007FE000FF0 0FFC000FF80FFC0007FC1FF80007FC3FF80003FE3FF80003FE3FF80003FE7FF00003FE7F F00003FF7FF00003FFFFF00001FFFFF00001FFFFF00001FFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFF0000000FFF0000000FFF0000000FFF0000000FFF00000007FF00000007FF000 00007FF00000003FF80000003FF800000F1FF800000F1FFC00001F0FFC00001E07FE0000 3E03FE00007C01FF0000F800FFC003F0007FF01FE0001FFFFFC00007FFFE0000007FF000 282B7DA92F>I<000007FC0000007FFF000001FFFFC00007FE1FE0001FF83FE0003FF07F F0007FE07FF0007FE07FF000FFC07FF000FFC07FF001FF807FF001FF803FE001FF800F80 01FF80000001FF80000001FF80000001FF80000001FF80000001FF80000001FF80000001 FF80000001FF80000001FF80000001FF800000FFFFFFE000FFFFFFE000FFFFFFE000FFFF FFE00001FF80000001FF80000001FF80000001FF80000001FF80000001FF80000001FF80 000001FF80000001FF80000001FF80000001FF80000001FF80000001FF80000001FF8000 0001FF80000001FF80000001FF80000001FF80000001FF80000001FF80000001FF800000 01FF80000001FF80000001FF80000001FF80000001FF80000001FF80000001FF80000001 FF80000001FF80000001FF80000001FF8000007FFFFF80007FFFFF80007FFFFF80007FFF FF800024407DBF20>I<0003FF8003F0003FFFF81FFC00FFFFFE7FFE03FF01FFFCFE07FC 007FE1FE0FFC007FE0FE1FF8003FF0FE3FF8003FF87C3FF0001FF8003FF0001FF8007FF0 001FFC007FF0001FFC007FF0001FFC007FF0001FFC007FF0001FFC007FF0001FFC007FF0 001FFC003FF0001FF8003FF0001FF8003FF8003FF8001FF8003FF0000FFC007FE00007FC 007FC00007FF01FF800007FFFFFE00000F3FFFF800000F03FF8000001E00000000001E00 000000001F00000000001F00000000001F00000000001F80000000001FC0000000001FFF FFFF00000FFFFFFFF0000FFFFFFFFC0007FFFFFFFF0007FFFFFFFF8003FFFFFFFFC003FF FFFFFFE00FFFFFFFFFE01FC00001FFF03F8000001FF07F0000000FF87F00000007F8FE00 000007F8FE00000003F8FE00000003F8FE00000003F8FE00000003F8FF00000007F87F00 000007F07F8000000FF03FC000001FE01FE000003FC00FF80000FF8003FF800FFE0000FF FFFFF800001FFFFFC0000001FFFC00002F3D7DA834>I<00FF0000000000FFFF00000000 00FFFF0000000000FFFF0000000000FFFF000000000007FF000000000003FF0000000000 03FF000000000003FF000000000003FF000000000003FF000000000003FF000000000003 FF000000000003FF000000000003FF000000000003FF000000000003FF000000000003FF 000000000003FF000000000003FF000000000003FF000000000003FF000000000003FF00 3FF0000003FF00FFFE000003FF03FFFF800003FF0FC0FFC00003FF1E007FE00003FF3C00 3FF00003FF78003FF00003FFF0003FF00003FFE0001FF80003FFC0001FF80003FFC0001F F80003FF80001FF80003FF80001FF80003FF80001FF80003FF00001FF80003FF00001FF8 0003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF800 03FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003 FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF 00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00 001FF800FFFFFC07FFFFE0FFFFFC07FFFFE0FFFFFC07FFFFE0FFFFFC07FFFFE0333F7CBE 3A>I<01F80003FC0007FE000FFF001FFF801FFF801FFF801FFF801FFF801FFF800FFF00 07FE0003FC0001F800000000000000000000000000000000000000000000000000000000 00FF00FFFF00FFFF00FFFF00FFFF0007FF0003FF0003FF0003FF0003FF0003FF0003FF00 03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 03FF00FFFFF8FFFFF8FFFFF8FFFFF815407CBF1D>I<00001F8000003FC000007FE00000 FFF00001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80000FFF000007FE00000 3FC000001F80000000000000000000000000000000000000000000000000000000000000 000000000000000007F8000FFFF8000FFFF8000FFFF8000FFFF800003FF800001FF80000 1FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF80000 1FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF80000 1FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF80000 1FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF80000 1FF800001FF800001FF81F001FF83F801FF87FC01FF8FFE01FF0FFE03FF0FFE03FF0FFE0 3FE0FFE07FC07FC07F807F80FF003F81FE001FFFFC0007FFF00000FF80001D5385BF20> I<00FF00FFFF00FFFF00FFFF00FFFF0007FF0003FF0003FF0003FF0003FF0003FF0003FF 0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF 0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF 0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF 0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00FFFF FCFFFFFCFFFFFCFFFFFC163F7CBE1D>108 D<01FE003FF00001FF8000FFFE00FFFE0007 FFF000FFFE03FFFF801FFFFC00FFFE0FC0FFC07E07FE00FFFE1E007FE0F003FF0007FE3C 003FF1E001FF8003FE78003FF3C001FF8003FEF0003FF78001FF8003FFE0001FFF0000FF C003FFC0001FFE0000FFC003FFC0001FFE0000FFC003FF80001FFC0000FFC003FF80001F FC0000FFC003FF80001FFC0000FFC003FF00001FF80000FFC003FF00001FF80000FFC003 FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF800 00FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00 001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FF C003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001F F80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003 FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC0FFFFFC07FFFFE0 3FFFFFFFFFFC07FFFFE03FFFFFFFFFFC07FFFFE03FFFFFFFFFFC07FFFFE03FFFFF50297C A857>I<01FE003FF00000FFFE00FFFE0000FFFE03FFFF8000FFFE0FC0FFC000FFFE1E00 7FE00007FE3C003FF00003FE78003FF00003FEF0003FF00003FFE0001FF80003FFC0001F F80003FFC0001FF80003FF80001FF80003FF80001FF80003FF80001FF80003FF00001FF8 0003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF800 03FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003 FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF 00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00 001FF80003FF00001FF800FFFFFC07FFFFE0FFFFFC07FFFFE0FFFFFC07FFFFE0FFFFFC07 FFFFE033297CA83A>I<00007FF000000003FFFE0000001FFFFFC000007FE03FF00000FF 800FF80001FF0007FC0003FE0003FE0007FC0001FF000FF80000FF801FF80000FFC01FF8 0000FFC03FF80000FFE03FF000007FE07FF000007FF07FF000007FF07FF000007FF07FF0 00007FF0FFF000007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF0 00007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF000007FF87FF000007FF07FF0 00007FF07FF000007FF07FF000007FF03FF80000FFE03FF80000FFE01FF80000FFC00FF8 0000FF800FFC0001FF8007FE0003FF0003FF0007FE0001FF800FFC00007FE03FF000001F FFFFC0000007FFFF000000007FF000002D2B7DA934>I<00FF007FE00000FFFF07FFFC00 00FFFF1FFFFF0000FFFF7F01FFC000FFFFF8007FF00007FFF0003FF80003FFE0001FFC00 03FF80000FFE0003FF80000FFF0003FF000007FF0003FF000007FF8003FF000003FF8003 FF000003FFC003FF000003FFC003FF000003FFC003FF000001FFC003FF000001FFE003FF 000001FFE003FF000001FFE003FF000001FFE003FF000001FFE003FF000001FFE003FF00 0001FFE003FF000001FFE003FF000001FFE003FF000001FFE003FF000001FFC003FF0000 03FFC003FF000003FFC003FF000003FFC003FF000007FF8003FF000007FF8003FF000007 FF0003FF80000FFE0003FFC0001FFE0003FFE0001FFC0003FFF0003FF80003FFF800FFE0 0003FF7F03FFC00003FF1FFFFF000003FF07FFF8000003FF00FFC0000003FF0000000000 03FF000000000003FF000000000003FF000000000003FF000000000003FF000000000003 FF000000000003FF000000000003FF000000000003FF000000000003FF000000000003FF 000000000003FF0000000000FFFFFC00000000FFFFFC00000000FFFFFC00000000FFFFFC 00000000333B7DA83A>I<00007FE00078000003FFFC00F800001FFFFE01F800007FF81F 81F80000FFE007C3F80001FF8001E3F80007FF0000F7F80007FF0000FFF8000FFE00007F F8001FFC00003FF8003FFC00003FF8003FFC00001FF8003FF800001FF8007FF800001FF8 007FF800001FF8007FF000001FF800FFF000001FF800FFF000001FF800FFF000001FF800 FFF000001FF800FFF000001FF800FFF000001FF800FFF000001FF800FFF000001FF800FF F000001FF800FFF000001FF8007FF000001FF8007FF800001FF8007FF800001FF8007FF8 00001FF8003FF800001FF8003FFC00001FF8001FFC00003FF8000FFE00007FF8000FFE00 00FFF80007FF0000FFF80003FF8003FFF80001FFC007DFF800007FF03F9FF800001FFFFE 1FF8000007FFF81FF80000007FC01FF800000000001FF800000000001FF800000000001F F800000000001FF800000000001FF800000000001FF800000000001FF800000000001FF8 00000000001FF800000000001FF800000000001FF800000000001FF800000000001FF800 00000007FFFFE000000007FFFFE000000007FFFFE000000007FFFFE0333B7DA837>I<01 FE01FC00FFFE07FF80FFFE0FFFE0FFFE3F1FF0FFFE3C1FF007FE783FF803FEF03FF803FE E03FF803FFE03FF803FFC03FF803FFC01FF003FF800FE003FF80038003FF80000003FF80 000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF0000 0003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF000000 03FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003 FF000000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF000025297DA82B>I<001FF80E00 01FFFF3E0007FFFFFE000FE007FE001F8001FE003F0000FE007E00007E007C00003E00FC 00003E00FC00001E00FC00001E00FE00001E00FF00001E00FF80000000FFE0000000FFFF 0000007FFFFC00007FFFFF80003FFFFFE0001FFFFFF8000FFFFFFC0003FFFFFE0000FFFF FF00003FFFFF000003FFFF8000000FFF80000001FFC0F000007FC0F000003FC0F800001F C0F800001FC0F800000FC0FC00000FC0FC00000FC0FE00000F80FE00001F80FF00001F00 FF80003F00FFE0007E00FFF803FC00FCFFFFF000F03FFFC000E007FE0000222B7DA929> I<0007800000078000000780000007800000078000000F8000000F8000000F8000000F80 00001F8000001F8000001F8000003F8000007F8000007F800000FF800001FF800007FF80 001FFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC01FF800001FF800001FF800001FF800001FF80 0001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF80 0001FF800001FF800001FF800001FF800001FF800001FF800001FF801E01FF801E01FF80 1E01FF801E01FF801E01FF801E01FF801E01FF801E01FF801E00FF803C00FFC03C00FFC0 3C007FE078003FF0F0001FFFE00007FFC00000FF001F3B7EB928>I<00FF000007F800FF FF0007FFF800FFFF0007FFF800FFFF0007FFF800FFFF0007FFF80007FF00003FF80003FF 00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00 001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF0000 1FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001F F80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF8 0003FF00001FF80003FF00001FF80003FF00001FF80003FF00003FF80003FF00003FF800 03FF00003FF80003FF00007FF80001FF0000FFF80001FF0000FFF80001FF8001FFFC0000 FF8007DFFFE0007FE01F9FFFE0001FFFFE1FFFE00007FFF81FFFE00000FFE01FE000332A 7CA83A>IIIII E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fj ecbx1440 14.4 49 /Fj 49 122 df<000000007FFC0000000000001FFFFF800000000001FFFFFFE000000000 07FFFFFFF8000000003FFFC00FFC00000000FFFC0001FE00000001FFF000007F00000007 FFC00003FF0000000FFF800007FF8000001FFF00000FFF8000003FFF00000FFF8000003F FE00000FFF8000007FFC00000FFF8000007FFC00001FFFC00000FFFC00000FFF800000FF F800000FFF800000FFF800000FFF800000FFF8000007FF000000FFF8000003FE000000FF F8000000F8000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF80007FFFFC000FFFF FFFFFFFFFFC000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFC000FFFF FFFFFFFFFFC00000FFF800000FFFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC000FFFF FFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFF FFF807FFFFFFC042547DD349>28 D45 D<07E01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE7FFE3FFC1FF8 07E01010768F25>I<000000000000C0000000000001E0000000000003E0000000000003 E0000000000003C0000000000007C0000000000007C000000000000F8000000000000F80 00000000000F0000000000001F0000000000001F0000000000003E0000000000003E0000 000000003C0000000000007C0000000000007C000000000000F8000000000000F8000000 000000F0000000000001F0000000000001F0000000000003E0000000000003E000000000 0007C0000000000007C00000000000078000000000000F8000000000000F800000000000 1F0000000000001F0000000000001E0000000000003E0000000000003E0000000000007C 0000000000007C00000000000078000000000000F8000000000000F8000000000001F000 0000000001F0000000000001E0000000000003E0000000000003E0000000000007C00000 00000007C00000000000078000000000000F8000000000000F8000000000001F00000000 00001F0000000000001E0000000000003E0000000000003E0000000000007C0000000000 007C00000000000078000000000000F8000000000000F8000000000001F0000000000001 F0000000000003E0000000000003E0000000000003C0000000000007C0000000000007C0 00000000000F8000000000000F8000000000000F0000000000001F0000000000001F0000 000000003E0000000000003E0000000000003C0000000000007C0000000000007C000000 000000F8000000000000F8000000000000F0000000000001F0000000000001F000000000 0003E0000000000003E0000000000003C0000000000007C0000000000007C00000000000 0F8000000000000F8000000000000F0000000000001F0000000000001F0000000000003E 0000000000003E0000000000003C0000000000007C0000000000007C000000000000F800 0000000000F8000000000001F0000000000001F0000000000001E0000000000003E00000 00000003E0000000000007C0000000000007C00000000000078000000000000F80000000 00000F8000000000001F0000000000001F0000000000001E0000000000003E0000000000 003E0000000000007C0000000000007C00000000000078000000000000F8000000000000 F8000000000000F000000000000060000000000000337879D942>I<000003FF80000000 003FFFF800000001FFFFFF00000007FFFFFFC000000FFF01FFE000003FFC007FF800007F F0001FFC0000FFE0000FFE0001FFC00007FF0001FF800003FF0003FF800003FF8007FF00 0001FFC007FF000001FFC00FFE000000FFE00FFE000000FFE01FFE000000FFF01FFE0000 00FFF01FFE000000FFF03FFE000000FFF83FFE000000FFF83FFC0000007FF83FFC000000 7FF87FFC0000007FFC7FFC0000007FFC7FFC0000007FFC7FFC0000007FFC7FFC0000007F FC7FFC0000007FFCFFFC0000007FFEFFFC0000007FFEFFFC0000007FFEFFFC0000007FFE FFFC0000007FFEFFFC0000007FFEFFFC0000007FFEFFFC0000007FFEFFFC0000007FFEFF FC0000007FFEFFFC0000007FFEFFFC0000007FFEFFFC0000007FFEFFFC0000007FFEFFFC 0000007FFEFFFC0000007FFEFFFC0000007FFEFFFC0000007FFEFFFC0000007FFEFFFC00 00007FFEFFFC0000007FFEFFFC0000007FFEFFFC0000007FFE7FFC0000007FFC7FFC0000 007FFC7FFC0000007FFC7FFC0000007FFC7FFC0000007FFC7FFC0000007FFC3FFC000000 7FF83FFE000000FFF83FFE000000FFF83FFE000000FFF81FFE000000FFF01FFE000000FF F01FFE000000FFF00FFE000000FFE00FFF000001FFE007FF000001FFC007FF000001FFC0 03FF800003FF8001FF800003FF0001FFC00007FF0000FFE0000FFE00007FF0001FFC0000 3FFC007FF800000FFF01FFE0000007FFFFFFC0000001FFFFFF000000003FFFF800000000 03FF800000374F7BCD42>I<0000001E00000000003E0000000000FE0000000003FE0000 00000FFE000000007FFE00000007FFFE000003FFFFFE0000FFFFFFFE0000FFFFFFFE0000 FFFFFFFE0000FFF87FFE0000FC007FFE000000007FFE000000007FFE000000007FFE0000 00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000 00007FFE000000007FFE000000007FFE00007FFFFFFFFFFC7FFFFFFFFFFC7FFFFFFFFFFC 7FFFFFFFFFFC7FFFFFFFFFFC2E4E76CD42>I<00001FFE0000000001FFFFF00000000FFF FFFC0000003FFFFFFF8000007FFFFFFFE00001FF803FFFF00003FC0007FFFC0007F00001 FFFE000FE00000FFFF001F8000007FFF803F0000003FFF803F0000001FFFC07FE000001F FFE07FF800000FFFE07FFC00000FFFF0FFFC000007FFF0FFFE000007FFF0FFFE000003FF F8FFFE000003FFF8FFFE000003FFF8FFFE000003FFF8FFFE000003FFF87FFC000003FFF8 7FFC000003FFF83FF8000003FFF81FF0000003FFF80380000003FFF80000000003FFF000 00000007FFF00000000007FFF00000000007FFE0000000000FFFE0000000000FFFC00000 00001FFFC0000000001FFF80000000003FFF00000000003FFE00000000007FFC00000000 00FFF80000000000FFF00000000001FFE00000000003FFC00000000007FF800000000007 FF00000000000FFC00000000001FF800000000003FF000000000007FC00000000000FF80 0000000001FF000000000003FC000000000007F800000000000FF00000F800001FE00000 F800003FC00000F800007F000000F80000FE000001F00001FC000001F00003F8000001F0 0007F0000001F00007E0000001F0000F80000003F0001F00000003F0003E00000007F000 7FFFFFFFFFF000FFFFFFFFFFE001FFFFFFFFFFE003FFFFFFFFFFE007FFFFFFFFFFE00FFF FFFFFFFFE01FFFFFFFFFFFE03FFFFFFFFFFFE07FFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFF FFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0354E7ACD42>I<000007FF C0000000007FFFFC00000003FFFFFF8000000FFFFFFFE000001FF803FFF800007FC000FF FC0000FE00003FFE0001FC00003FFF0003F800001FFF8003FE00001FFF8007FF80000FFF C007FFC0000FFFC00FFFC0000FFFE00FFFE0000FFFE00FFFE0000FFFE00FFFE0000FFFE0 0FFFE0000FFFE00FFFE0000FFFE00FFFE0000FFFE007FFC0000FFFE007FFC0000FFFC003 FF80000FFFC001FF00001FFFC0003800001FFF80000000001FFF80000000003FFF000000 00003FFF00000000007FFE00000000007FFC0000000000FFF80000000001FFF000000000 03FFC0000000000FFF80000000007FFE000000007FFFF8000000007FFFC0000000007FFF FC000000007FFFFF800000000003FFE000000000007FF800000000003FFE00000000001F FF00000000000FFF80000000000FFFC00000000007FFE00000000007FFF00000000003FF F80000000003FFF80000000003FFFC0000000001FFFC0000000001FFFC0000000001FFFE 0000000001FFFE0000000001FFFE03C0000001FFFE0FF0000001FFFE3FFC000001FFFE7F FE000001FFFE7FFE000001FFFEFFFF000001FFFEFFFF000001FFFEFFFF000001FFFCFFFF 000001FFFCFFFF000003FFFCFFFF000003FFF8FFFF000003FFF87FFE000003FFF07FFC00 0007FFF07FF8000007FFE03FE000000FFFC01FC000001FFFC00FF000003FFF8007FE0000 7FFE0003FFE003FFFC0001FFFFFFFFF800007FFFFFFFE000000FFFFFFF00000001FFFFFC 000000001FFF800000374F7BCD42>I<0000000000FC00000000000001FC000000000000 01FC00000000000003FC00000000000007FC0000000000000FFC0000000000000FFC0000 000000001FFC0000000000003FFC0000000000007FFC0000000000007FFC000000000000 FFFC000000000001FFFC000000000003FFFC000000000003FFFC000000000007FFFC0000 0000000FFFFC00000000001FFFFC00000000001F7FFC00000000003E7FFC00000000007E 7FFC0000000000FC7FFC0000000000F87FFC0000000001F07FFC0000000003F07FFC0000 000007E07FFC0000000007C07FFC000000000F807FFC000000001F807FFC000000003F00 7FFC000000003E007FFC000000007C007FFC00000000FC007FFC00000001F8007FFC0000 0001F0007FFC00000003E0007FFC00000007E0007FFC0000000FC0007FFC0000000F8000 7FFC0000001F00007FFC0000003F00007FFC0000007E00007FFC0000007C00007FFC0000 00F800007FFC000001F800007FFC000003F000007FFC000003E000007FFC000007C00000 7FFC00000FC000007FFC00001F8000007FFC00001F0000007FFC00003E0000007FFC0000 7E0000007FFC0000FC0000007FFC0000FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFF FFFFFF80FFFFFFFFFFFFFF80FFFFFFFFFFFFFF8000000000FFFC000000000000FFFC0000 00000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC000000000000 FFFC000000000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC0000 00000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC000000001FFF FFFFFF8000001FFFFFFFFF8000001FFFFFFFFF8000001FFFFFFFFF8000001FFFFFFFFF80 394F7CCE42>I<0180000000060001F00000003E0001FE000001FE0001FFF0003FFE0001 FFFFFFFFFC0001FFFFFFFFF80001FFFFFFFFF00001FFFFFFFFE00001FFFFFFFFC00001FF FFFFFF800001FFFFFFFF000001FFFFFFFC000001FFFFFFF8000001FFFFFFE0000001FFFF FF00000001FFFFFC00000001F0FF8000000001F0000000000001F0000000000001F00000 00000001F0000000000001F0000000000001F0000000000001F0000000000001F0000000 000001F0000000000001F0000000000001F0000000000001F0000000000001F007FF8000 0001F03FFFF8000001F0FFFFFE000001F3FFFFFF800001FFFC01FFE00001FFE0007FF800 01FF00003FFC0001FE00001FFE0001F800000FFF0001F000000FFF0001F0000007FF8001 E0000007FFC00000000007FFC00000000007FFE00000000003FFE00000000003FFF00000 000003FFF00000000003FFF00000000003FFF00000000003FFF80000000003FFF8000000 0003FFF80300000003FFF80FE0000003FFF83FF8000003FFF87FFC000003FFF87FFC0000 03FFF8FFFC000003FFF8FFFE000003FFF8FFFE000003FFF8FFFE000003FFF0FFFE000003 FFF0FFFC000003FFF0FFFC000007FFF07FF8000007FFE07FF0000007FFE07FC0000007FF C03F0000000FFFC03F0000000FFF801F8000001FFF001FC000001FFF000FF000003FFE00 07F80000FFFC0003FE0001FFF00001FFE00FFFE000007FFFFFFF8000003FFFFFFF000000 0FFFFFF800000001FFFFC0000000003FFC000000354F7ACD42>I<00000007FE00000000 00FFFFC000000003FFFFF00000001FFFFFFC0000007FFC01FE000000FFE0007F000003FF 80003F800007FF00001F80000FFE00007FC0001FFC0000FFC0003FF80003FFE0007FF000 03FFE000FFE00007FFE001FFE00007FFE003FFC00007FFE003FFC00007FFE007FF800007 FFE007FF800007FFE00FFF800003FFC00FFF000003FFC01FFF000000FF001FFF0000007E 001FFF00000000003FFF00000000003FFF00000000003FFE00000000007FFE0000000000 7FFE00000000007FFE003FF000007FFE01FFFF00007FFE07FFFFC000FFFE0FFFFFF000FF FE1F807FF800FFFE3E001FFE00FFFE78000FFF00FFFEF00007FF80FFFEF00003FFC0FFFF E00003FFC0FFFFC00001FFE0FFFFC00001FFF0FFFF800001FFF0FFFF800000FFF8FFFF80 0000FFF8FFFF000000FFFCFFFF000000FFFCFFFF000000FFFCFFFF000000FFFCFFFE0000 00FFFEFFFE000000FFFEFFFE000000FFFE7FFE000000FFFE7FFE000000FFFE7FFE000000 FFFE7FFE000000FFFE7FFE000000FFFE7FFE000000FFFE3FFE000000FFFE3FFE000000FF FE3FFE000000FFFE3FFF000000FFFE1FFF000000FFFC1FFF000000FFFC1FFF000000FFFC 0FFF000000FFF80FFF000001FFF807FF000001FFF807FF800001FFF003FF800001FFE001 FFC00003FFE001FFE00003FFC000FFE00007FF80007FF0000FFF00003FFC001FFE00001F FF00FFFC000007FFFFFFF0000003FFFFFFE0000000FFFFFF800000001FFFFC0000000003 FFC00000374F7BCD42>I<1F0000000000001F8000000000001FC000000000001FFF8000 0000001FFFFFFFFFFFFF1FFFFFFFFFFFFF1FFFFFFFFFFFFF1FFFFFFFFFFFFF3FFFFFFFFF FFFF3FFFFFFFFFFFFE3FFFFFFFFFFFFC3FFFFFFFFFFFF83FFFFFFFFFFFF03FFFFFFFFFFF F03FFFFFFFFFFFE03FFFFFFFFFFFC03FFFFFFFFFFF807FFFFFFFFFFF007F800000003E00 7E000000007E007E00000000FC007C00000001F8007C00000003F0007C00000003E0007C 00000007E0007C0000000FC000F80000001F8000F80000003F0000F80000007E0000F800 00007C000000000000FC000000000001F8000000000003F0000000000003F00000000000 07E000000000000FE000000000001FC000000000001FC000000000003F8000000000003F 8000000000007F000000000000FF000000000000FF000000000001FF000000000001FE00 0000000003FE000000000003FE000000000007FE000000000007FC00000000000FFC0000 0000000FFC00000000000FFC00000000001FFC00000000001FFC00000000003FFC000000 00003FFC00000000003FFC00000000007FF800000000007FF800000000007FF800000000 007FF80000000000FFF80000000000FFF80000000000FFF80000000000FFF80000000000 FFF80000000000FFF80000000001FFF80000000001FFF80000000001FFF80000000001FF F80000000001FFF80000000001FFF80000000001FFF80000000001FFF80000000001FFF8 0000000001FFF80000000001FFF80000000000FFF000000000007FE000000000003FC000 000000001F80000000385279D042>I<000003FFC0000000003FFFFC00000001FFFFFF80 000007FFFFFFE000000FFC00FFF800003FE0001FFC00007F800007FE0000FF000003FF00 00FE000001FF8001FC000000FF8003FC000000FFC003F80000007FC007F80000007FC007 F80000007FE007F80000003FE00FF80000003FE00FF80000003FE00FFC0000003FE00FFC 0000003FE00FFE0000003FE00FFF0000003FE00FFF8000007FE00FFFE000007FC00FFFF0 00007FC00FFFFC0000FFC007FFFF0000FF8007FFFF8001FF0007FFFFE003FF0003FFFFF8 07FE0003FFFFFC0FFC0001FFFFFF1FF00000FFFFFFFFE00000FFFFFFFF8000007FFFFFFE 0000003FFFFFFE0000000FFFFFFF80000007FFFFFFC0000001FFFFFFF0000000FFFFFFF8 000003FFFFFFFE00000FFFFFFFFF00003FF7FFFFFF80007FC1FFFFFFC001FF807FFFFFE0 03FF001FFFFFE007FE000FFFFFF00FFC0003FFFFF81FF80000FFFFF81FF000007FFFFC3F F000001FFFFC3FE0000007FFFC7FE0000003FFFE7FC0000000FFFE7FC00000007FFEFFC0 0000003FFEFF800000001FFEFF800000000FFEFF8000000007FEFF8000000007FEFF8000 000003FEFF8000000003FEFF8000000003FCFF8000000003FCFFC000000003FC7FC00000 0003FC7FE000000007F87FE000000007F83FF00000000FF03FF80000000FF01FFC000000 1FE00FFE0000003FC007FF000000FF8003FFC00003FF0001FFFC003FFE00007FFFFFFFF8 00001FFFFFFFE0000007FFFFFF80000000FFFFFC000000000FFFC00000374F7BCD42>I< 000007FF80000000007FFFF800000001FFFFFE00000007FFFFFF8000001FFE01FFE00000 7FF8003FF00000FFF0001FF80001FFE0000FFC0003FFC00007FE0007FF800007FF000FFF 800003FF800FFF000003FF801FFF000001FFC03FFF000001FFC03FFF000001FFE07FFE00 0001FFE07FFE000001FFF07FFE000001FFF07FFE000000FFF8FFFE000000FFF8FFFE0000 00FFF8FFFE000000FFF8FFFE000000FFFCFFFE000000FFFCFFFE000000FFFCFFFE000000 FFFCFFFE000000FFFCFFFE000000FFFCFFFE000000FFFEFFFE000000FFFEFFFE000000FF FEFFFE000001FFFE7FFE000001FFFE7FFE000001FFFE7FFE000001FFFE7FFE000001FFFE 3FFE000003FFFE3FFE000003FFFE1FFF000003FFFE1FFF000007FFFE0FFF000007FFFE07 FF80000FFFFE07FF80001EFFFE03FFC0001EFFFE01FFE0003CFFFE007FF000F8FFFE003F FC03F0FFFE001FFFFFE0FFFE0007FFFFC0FFFC0000FFFF00FFFC00001FF800FFFC000000 0000FFFC0000000000FFFC0000000000FFF80000000001FFF80000000001FFF800000000 01FFF800FC000001FFF001FE000001FFF007FF800001FFE007FF800003FFE00FFFC00003 FFC00FFFC00003FFC00FFFC00007FF800FFFC00007FF800FFFC0000FFF000FFFC0000FFE 000FFF80001FFE0007FF80003FFC0007FE00007FF80007FC0000FFF00003F80001FFE000 03FC0007FFC00001FF803FFF000000FFFFFFFC0000003FFFFFF80000001FFFFFC0000000 07FFFF00000000007FF0000000374F7BCD42>I<07E01FF83FFC7FFE7FFEFFFFFFFFFFFF FFFFFFFFFFFF7FFE7FFE3FFC1FF807E00000000000000000000000000000000000000000 0000000000000000000000000000000000000000000007E01FF83FFC7FFE7FFEFFFFFFFF FFFFFFFFFFFFFFFF7FFE7FFE3FFC1FF807E0103576B425>I<00000000003F0000000000 0000000000003F00000000000000000000007F80000000000000000000007F8000000000 0000000000007F8000000000000000000000FFC000000000000000000000FFC000000000 000000000001FFE000000000000000000001FFE000000000000000000001FFE000000000 000000000003FFF000000000000000000003FFF000000000000000000007FFF800000000 000000000007FFF800000000000000000007FFF80000000000000000000FFFFC00000000 00000000000FFFFC0000000000000000001FFFFE0000000000000000001FFFFE00000000 00000000001FFFFE0000000000000000003FFFFF0000000000000000003EFFFF00000000 00000000003E7FFF0000000000000000007E7FFF8000000000000000007C3FFF80000000 0000000000FC3FFFC00000000000000000F83FFFC00000000000000000F81FFFC0000000 0000000001F81FFFE00000000000000001F00FFFE00000000000000003F00FFFF0000000 0000000003E00FFFF00000000000000003E007FFF00000000000000007E007FFF8000000 0000000007C003FFF8000000000000000FC003FFFC000000000000000F8003FFFC000000 000000000F8001FFFC000000000000001F8001FFFE000000000000001F0001FFFE000000 000000001F0000FFFE000000000000003F0000FFFF000000000000003E00007FFF000000 000000007E00007FFF800000000000007C00007FFF800000000000007C00003FFF800000 00000000FC00003FFFC0000000000000F800001FFFC0000000000001F800001FFFE00000 00000001F000001FFFE0000000000001F000000FFFE0000000000003F000000FFFF00000 00000003E0000007FFF0000000000007E0000007FFF8000000000007C0000007FFF80000 00000007FFFFFFFFFFF800000000000FFFFFFFFFFFFC00000000000FFFFFFFFFFFFC0000 0000000FFFFFFFFFFFFC00000000001FFFFFFFFFFFFE00000000001F00000000FFFE0000 0000003F00000000FFFF00000000003E00000000FFFF00000000003E000000007FFF0000 0000007E000000007FFF80000000007C000000003FFF8000000000FC000000003FFFC000 000000F8000000003FFFC000000000F8000000001FFFC000000001F8000000001FFFE000 000001F0000000000FFFE000000003F0000000000FFFF000000003E0000000000FFFF000 000003E00000000007FFF000000007E00000000007FFF800000007C00000000003FFF800 000007C00000000003FFF80000000F800000000003FFFC0000003FF00000000001FFFC00 00FFFFFFF000000FFFFFFFFFC0FFFFFFF000000FFFFFFFFFC0FFFFFFF000000FFFFFFFFF C0FFFFFFF000000FFFFFFFFFC0FFFFFFF000000FFFFFFFFFC05A547CD363>65 D<0000000003FFF0000007000000007FFFFF00000F00000007FFFFFFE0001F0000003FFF FFFFF8003F000000FFFFFFFFFE007F000003FFFFC003FF00FF00000FFFF800003FC1FF00 003FFFC000000FE3FF0000FFFF00000003FFFF0001FFFC00000001FFFF0003FFF8000000 00FFFF0007FFE0000000007FFF001FFFC0000000003FFF003FFF80000000001FFF003FFF 00000000000FFF007FFE000000000007FF00FFFC000000000003FF01FFFC000000000003 FF01FFF8000000000001FF03FFF0000000000001FF07FFF0000000000000FF07FFF00000 00000000FF0FFFE00000000000007F0FFFE00000000000007F1FFFC00000000000007F1F FFC00000000000003F1FFFC00000000000003F3FFF800000000000003F3FFF8000000000 00001F3FFF800000000000001F7FFF800000000000001F7FFF800000000000001F7FFF80 000000000000007FFF00000000000000007FFF0000000000000000FFFF00000000000000 00FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF000000 0000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FF FF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000 000000FFFF0000000000000000FFFF00000000000000007FFF00000000000000007FFF00 000000000000007FFF80000000000000007FFF80000000000000007FFF80000000000000 003FFF800000000000001F3FFF800000000000001F3FFF800000000000001F1FFFC00000 000000001F1FFFC00000000000001F1FFFC00000000000003F0FFFE00000000000003F0F FFE00000000000003E07FFF00000000000003E07FFF00000000000007E03FFF800000000 00007C01FFF8000000000000FC01FFFC000000000000F800FFFC000000000001F8007FFE 000000000003F0003FFF000000000003F0003FFF800000000007E0001FFFC0000000000F C00007FFE0000000001F800003FFF8000000003F000001FFFC00000000FE000000FFFF00 000001FC0000003FFFC0000007F80000000FFFFC00003FF000000003FFFFC001FFC00000 0000FFFFFFFFFF00000000003FFFFFFFFC000000000007FFFFFFF00000000000007FFFFF 8000000000000003FFF0000000505479D25F>67 D72 DI< FFFFFFF000000000000001FFFFFFF0FFFFFFF800000000000003FFFFFFF0FFFFFFFC0000 0000000007FFFFFFF0FFFFFFFC00000000000007FFFFFFF0FFFFFFFC00000000000007FF FFFFF00007FFFE0000000000000FFFFE00000007FFFE0000000000000FFFFE00000007DF FF0000000000001F7FFE00000007DFFF0000000000001F7FFE00000007CFFF8000000000 003E7FFE00000007CFFF8000000000003E7FFE00000007CFFF8000000000003E7FFE0000 0007C7FFC000000000007C7FFE00000007C7FFC000000000007C7FFE00000007C3FFE000 00000000F87FFE00000007C3FFE00000000000F87FFE00000007C1FFF00000000001F07F FE00000007C1FFF00000000001F07FFE00000007C0FFF80000000003E07FFE00000007C0 FFF80000000003E07FFE00000007C0FFF80000000003E07FFE00000007C07FFC00000000 07C07FFE00000007C07FFC0000000007C07FFE00000007C03FFE000000000F807FFE0000 0007C03FFE000000000F807FFE00000007C01FFF000000001F007FFE00000007C01FFF00 0000001F007FFE00000007C01FFF000000001F007FFE00000007C00FFF800000003E007F FE00000007C00FFF800000003E007FFE00000007C007FFC00000007C007FFE00000007C0 07FFC00000007C007FFE00000007C003FFE0000000F8007FFE00000007C003FFE0000000 F8007FFE00000007C003FFE0000000F8007FFE00000007C001FFF0000001F0007FFE0000 0007C001FFF0000001F0007FFE00000007C000FFF8000003E0007FFE00000007C000FFF8 000003E0007FFE00000007C0007FFC000007C0007FFE00000007C0007FFC000007C0007F FE00000007C0007FFC000007C0007FFE00000007C0003FFE00000F80007FFE00000007C0 003FFE00000F80007FFE00000007C0001FFF00001F00007FFE00000007C0001FFF00001F 00007FFE00000007C0000FFF80003E00007FFE00000007C0000FFF80003E00007FFE0000 0007C0000FFF80003E00007FFE00000007C00007FFC0007C00007FFE00000007C00007FF C0007C00007FFE00000007C00003FFE000F800007FFE00000007C00003FFE000F800007F FE00000007C00001FFF001F000007FFE00000007C00001FFF001F000007FFE00000007C0 0000FFF803E000007FFE00000007C00000FFF803E000007FFE00000007C00000FFF803E0 00007FFE00000007C000007FFC07C000007FFE00000007C000007FFC07C000007FFE0000 0007C000003FFE0F8000007FFE00000007C000003FFE0F8000007FFE00000007C000001F FF1F0000007FFE00000007C000001FFF1F0000007FFE00000007C000001FFF1F0000007F FE00000007C000000FFFBE0000007FFE00000007C000000FFFBE0000007FFE00000007C0 000007FFFC0000007FFE00000007C0000007FFFC0000007FFE00000007C0000003FFF800 00007FFE00000007C0000003FFF80000007FFE00000007C0000003FFF80000007FFE0000 0007C0000001FFF00000007FFE00000007C0000001FFF00000007FFE00000007C0000000 FFE00000007FFE00000007C0000000FFE00000007FFE0000001FF00000007FC00000007F FE0000FFFFFFFE00007FC0000FFFFFFFFFF0FFFFFFFE00007FC0000FFFFFFFFFF0FFFFFF FE00003F80000FFFFFFFFFF0FFFFFFFE00003F80000FFFFFFFFFF0FFFFFFFE00001F0000 0FFFFFFFFFF074527CD17D>77 D<000000001FFF800000000000000003FFFFFC00000000 0000003FFFFFFFC0000000000000FFFFFFFFF0000000000007FFF801FFFE00000000001F FF80001FFF80000000003FFE000007FFC000000000FFF8000001FFF000000001FFF00000 00FFF800000003FFC00000003FFC00000007FF800000001FFE0000000FFF000000000FFF 0000001FFE0000000007FF8000003FFE0000000007FFC000007FFC0000000003FFE00000 FFF80000000001FFF00001FFF80000000001FFF80001FFF00000000000FFF80003FFF000 00000000FFFC0003FFE000000000007FFC0007FFE000000000007FFE000FFFC000000000 003FFF000FFFC000000000003FFF000FFFC000000000003FFF001FFFC000000000003FFF 801FFF8000000000001FFF803FFF8000000000001FFFC03FFF8000000000001FFFC03FFF 8000000000001FFFC03FFF8000000000001FFFC07FFF0000000000000FFFE07FFF000000 0000000FFFE07FFF0000000000000FFFE07FFF0000000000000FFFE07FFF000000000000 0FFFE0FFFF0000000000000FFFF0FFFF0000000000000FFFF0FFFF0000000000000FFFF0 FFFF0000000000000FFFF0FFFF0000000000000FFFF0FFFF0000000000000FFFF0FFFF00 00000000000FFFF0FFFF0000000000000FFFF0FFFF0000000000000FFFF0FFFF00000000 00000FFFF0FFFF0000000000000FFFF0FFFF0000000000000FFFF0FFFF0000000000000F FFF0FFFF0000000000000FFFF0FFFF0000000000000FFFF07FFF0000000000000FFFE07F FF8000000000001FFFE07FFF8000000000001FFFE07FFF8000000000001FFFE07FFF8000 000000001FFFE03FFF8000000000001FFFC03FFF8000000000001FFFC03FFFC000000000 003FFFC01FFFC000000000003FFF801FFFC000000000003FFF801FFFC000000000003FFF 800FFFE000000000007FFF000FFFE000000000007FFF0007FFF00000000000FFFE0007FF F00000000000FFFE0003FFF00000000000FFFC0001FFF80000000001FFF80001FFFC0000 000003FFF80000FFFC0000000003FFF000007FFE0000000007FFE000007FFF000000000F FFE000003FFF800000001FFFC000001FFFC00000003FFF8000000FFFE00000007FFF0000 0007FFF0000000FFFE00000001FFF8000001FFF800000000FFFE000007FFF0000000003F FFC0003FFFC0000000001FFFF801FFFF800000000007FFFFFFFFFE000000000001FFFFFF FFF80000000000003FFFFFFFC000000000000007FFFFFE00000000000000001FFF800000 0000545479D263>79 DI<00000FFE00001C000000FFFFF0003C000007FFFFFC007C00001FFF FFFF00FC00007FFFFFFFC1FC0000FFF001FFE1FC0001FF80001FFBFC0003FF000007FFFC 0007FC000001FFFC000FF8000000FFFC001FF00000003FFC001FF00000001FFC003FE000 00000FFC003FE00000000FFC007FE000000007FC007FC000000003FC007FC000000003FC 007FC000000001FC00FFC000000001FC00FFC000000001FC00FFC000000000FC00FFE000 000000FC00FFE000000000FC00FFF0000000007C00FFF0000000007C00FFF8000000007C 00FFFC000000007C00FFFE0000000000007FFF0000000000007FFFC000000000007FFFF8 00000000007FFFFF80000000003FFFFFF8000000003FFFFFFFC00000001FFFFFFFFC0000 000FFFFFFFFF8000000FFFFFFFFFF0000007FFFFFFFFFC000003FFFFFFFFFE000001FFFF FFFFFF800000FFFFFFFFFFC000007FFFFFFFFFE000001FFFFFFFFFF0000007FFFFFFFFF8 000001FFFFFFFFF80000007FFFFFFFFC00000007FFFFFFFE000000007FFFFFFE00000000 03FFFFFF00000000003FFFFF000000000003FFFF800000000000FFFF8000000000003FFF 8000000000001FFF8000000000000FFFC0000000000007FFC0000000000003FFC0F80000 000003FFC0F80000000001FFC0F80000000001FFC0F80000000001FFC0F80000000000FF C0FC0000000000FFC0FC0000000000FFC0FC0000000000FFC0FC0000000000FF80FE0000 000000FF80FE0000000000FF80FF0000000001FF80FF0000000001FF00FF8000000001FF 00FFC000000003FE00FFE000000003FE00FFF000000007FC00FFFC0000000FF800FFFE00 00001FF800FFFFC000003FF000FF7FF80000FFE000FE1FFF8007FFC000FE07FFFFFFFF00 00FC01FFFFFFFC0000F8007FFFFFF00000F0000FFFFFC00000E000007FFC0000003A5479 D249>83 D<3FFFFFFFFFFFFFFFFFFC3FFFFFFFFFFFFFFFFFFC3FFFFFFFFFFFFFFFFFFC3F FFFFFFFFFFFFFFFFFC3FFFFFFFFFFFFFFFFFFC3FFFC0007FFF0003FFFC3FFC00007FFF00 003FFC7FF000007FFF00000FFE7FE000007FFF000007FE7FC000007FFF000003FE7F8000 007FFF000001FE7F0000007FFF000000FE7F0000007FFF000000FE7E0000007FFF000000 7E7E0000007FFF0000007E7E0000007FFF0000007E7C0000007FFF0000003E7C0000007F FF0000003E7C0000007FFF0000003E7C0000007FFF0000003E7C0000007FFF0000003EFC 0000007FFF0000003FF80000007FFF0000001FF80000007FFF0000001FF80000007FFF00 00001FF80000007FFF0000001FF80000007FFF0000001FF80000007FFF0000001F000000 007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF000000 00000000007FFF00000000000000007FFF00000000000000007FFF00000000000000007F FF00000000000000007FFF00000000000000007FFF00000000000000007FFF0000000000 0000007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF00 000000000000007FFF00000000000000007FFF00000000000000007FFF00000000000000 007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF000000 00000000007FFF00000000000000007FFF00000000000000007FFF00000000000000007F FF00000000000000007FFF00000000000000007FFF00000000000000007FFF0000000000 0000007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF00 000000000000007FFF00000000000000007FFF00000000000000007FFF00000000000000 007FFF00000000000000007FFF00000000000000007FFF00000000000000007FFF000000 00000000007FFF00000000000000007FFF00000000000000007FFF00000000000000007F FF00000000000000007FFF00000000000000007FFF00000000000000007FFF0000000000 0000007FFF000000000001FFFFFFFFFFFFC0000001FFFFFFFFFFFFC0000001FFFFFFFFFF FFC0000001FFFFFFFFFFFFC0000001FFFFFFFFFFFFC00050517BD05B>I<7FFFFFFFFFFF FFFFFFFC7FFFFFFFFFFFFFFFFFFCFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFEFFFF FFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFC7FFFFFFFFFFFFFFFFFFC4F07756366>95 D<00003FFE000000000007FFFFE0000000001FFFFFFC000000007FFFFFFF00000001FFC0 0FFFC0000003FE0003FFE0000007FF0000FFF0000007FF80007FF800000FFFC0007FFC00 000FFFC0003FFE00000FFFC0003FFE00000FFFC0001FFF00000FFFC0001FFF00000FFFC0 001FFF00000FFFC0000FFF800007FF80000FFF800003FF00000FFF800001FE00000FFF80 00000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000 000FFF8000000000000FFF800000000007FFFF8000000003FFFFFF800000007FFFFFFF80 000003FFFFFFFF8000001FFFF00FFF8000007FFF000FFF800000FFFC000FFF800003FFF0 000FFF800007FFC0000FFF80000FFF80000FFF80001FFF00000FFF80003FFF00000FFF80 003FFE00000FFF80007FFC00000FFF80007FFC00000FFF81F0FFFC00000FFF81F0FFF800 000FFF81F0FFF800000FFF81F0FFF800000FFF81F0FFF800001FFF81F0FFF800001FFF81 F0FFFC00003FFF81F07FFC00003FFF81F07FFE00007FFF81F03FFE0000F7FFC3F03FFF00 01E3FFC3E01FFFC007E3FFFFE007FFF01F81FFFFC003FFFFFF00FFFF8000FFFFFC007FFF 00001FFFF0003FFC000001FF800007F0003C387CB642>97 D<003FF8000000000000FFFF F8000000000000FFFFF8000000000000FFFFF8000000000000FFFFF8000000000000FFFF F800000000000003FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F8007FF000000000FFF807FFFF00000000FFF81FFFFFC0000000FFF87FFFFFF0000000FF F9FF007FFC000000FFFFF8001FFF000000FFFFE00007FF800000FFFF800003FFC00000FF FF000001FFE00000FFFE000000FFF00000FFFC000000FFF00000FFF80000007FF80000FF F80000007FFC0000FFF80000003FFC0000FFF80000003FFE0000FFF80000003FFE0000FF F80000003FFE0000FFF80000003FFF0000FFF80000001FFF0000FFF80000001FFF0000FF F80000001FFF0000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FF F80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FF F80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FF F80000001FFF8000FFF80000001FFF8000FFF80000001FFF0000FFF80000001FFF0000FF F80000001FFF0000FFF80000003FFF0000FFF80000003FFE0000FFF80000003FFE0000FF F80000003FFC0000FFF80000007FFC0000FFF80000007FF80000FFFC000000FFF80000FF FC000000FFF00000FFFE000001FFE00000FFFF000003FFC00000FFFF800007FF800000FF CFE0000FFF000000FF87F0003FFE000000FF01FE01FFF8000000FE00FFFFFFF0000000FC 003FFFFFC0000000F80007FFFE00000000000000FFE000000041547DD249>I<000003FF E0000000003FFFFE00000000FFFFFF80000003FFFFFFE000000FFF003FF800003FFC0007 FC00007FF8000FFE0000FFF0001FFE0001FFE0003FFF0003FFC0003FFF0007FF80003FFF 0007FF80003FFF000FFF00003FFF001FFF00003FFF001FFE00003FFF003FFE00001FFE00 3FFE00000FFC003FFE000007F8007FFE00000000007FFC00000000007FFC00000000007F FC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC 0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC00 00000000FFFC0000000000FFFC0000000000FFFC00000000007FFC00000000007FFE0000 0000007FFE00000000007FFE00000000003FFE00000000003FFF00000000001FFF000000 0F801FFF0000000F800FFF8000001F800FFF8000001F0007FFC000003F0003FFE000003E 0001FFF000007E0000FFF80000FC00007FFC0001F800003FFF0007F000000FFFC01FE000 0007FFFFFF80000001FFFFFE000000003FFFF80000000003FF80000031387CB63A>I<00 0000000003FF8000000000000FFFFF8000000000000FFFFF8000000000000FFFFF800000 0000000FFFFF8000000000000FFFFF800000000000003FFF800000000000000FFF800000 000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000 000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000 000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000 000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000 000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800000 000000000FFF8000000003FF800FFF800000003FFFF80FFF80000001FFFFFE0FFF800000 07FFFFFF8FFF8000001FFFC03FEFFF8000003FFE0007FFFF8000007FF80001FFFF800000 FFF00000FFFF800001FFE000007FFF800003FFC000003FFF800007FF8000001FFF80000F FF8000000FFF80000FFF0000000FFF80001FFF0000000FFF80001FFE0000000FFF80003F FE0000000FFF80003FFE0000000FFF80007FFE0000000FFF80007FFC0000000FFF80007F FC0000000FFF80007FFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FF FC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FF FC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FF FC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF80007FFC0000000FFF80007F FC0000000FFF80007FFC0000000FFF80007FFE0000000FFF80003FFE0000000FFF80003F FE0000000FFF80003FFE0000000FFF80001FFE0000000FFF80001FFF0000000FFF80000F FF0000001FFF800007FF8000003FFF800007FF8000007FFF800003FFC00000FFFF800001 FFE00001FFFF800000FFF00003FFFFE000007FFC000FEFFFFF80001FFF007F8FFFFF8000 07FFFFFF0FFFFF800001FFFFFC0FFFFF8000007FFFE00FFFFF80000007FF000FFE000041 547CD249>I<000007FF80000000007FFFF800000001FFFFFE00000007FFFFFF8000001F FF03FFE000003FFC007FF000007FF0003FF80000FFE0001FFC0001FFC0000FFC0003FF80 0007FE0007FF800007FF000FFF000003FF000FFF000003FF801FFE000003FF801FFE0000 01FF803FFE000001FFC03FFE000001FFC03FFE000001FFC07FFC000001FFC07FFC000001 FFE07FFC000000FFE07FFC000000FFE0FFFC000000FFE0FFFC000000FFE0FFFFFFFFFFFF E0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFC0000000000FFFC0000000000 FFFC0000000000FFFC0000000000FFFC0000000000FFFC00000000007FFC00000000007F FC00000000007FFC00000000007FFE00000000003FFE00000000003FFE00000000003FFE 00000003E01FFF00000003E01FFF00000007E00FFF00000007C007FF8000000FC007FF80 00000F8003FFC000001F8001FFE000003F0000FFF000007E00007FFC0001FC00001FFF00 07F800000FFFE03FF0000003FFFFFFC0000000FFFFFF800000003FFFFC0000000001FFE0 000033387CB63C>I<0000001FF800000003FFFE0000000FFFFF8000003FFFFFC00000FF F83FE00003FFE0FFF00007FF80FFF0000FFF01FFF8001FFF01FFF8003FFE01FFF8003FFE 01FFF8007FFC01FFF8007FFC01FFF8007FFC00FFF000FFF800FFF000FFF8007FE000FFF8 001F8000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF8000000FFFFFFFFC000FFFFFFFFC000FFFFFFFFC000FFFFFF FFC000FFFFFFFFC00000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF8000000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFF FE0000FFFFFFFE00002D547CD328>I<00001FFE0000FE000001FFFFE007FF80000FFFFF FC1FFFC0003FFFFFFF7FFFE0007FF807FFFF07E001FFE001FFF07FE003FFC000FFF07FE0 07FF80007FF83FE007FF00003FF83FC00FFF00003FFC1FC01FFF00003FFE07001FFE0000 1FFE00001FFE00001FFE00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF0000 3FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE0000 1FFF00003FFE00001FFF00001FFE00001FFE00001FFE00001FFE00001FFF00003FFE0000 0FFF00003FFC000007FF00003FF8000007FF80007FF8000003FFC000FFF0000001FFE001 FFE0000000FFF807FF80000001FFFFFFFF00000003EFFFFFFC00000003C1FFFFE0000000 07C01FFE00000000078000000000000007800000000000000FC00000000000000FC00000 000000000FC00000000000000FE00000000000000FE00000000000000FF0000000000000 0FFC0000000000000FFFFFFFFE00000007FFFFFFFFF0000007FFFFFFFFFC000007FFFFFF FFFF800003FFFFFFFFFFC00003FFFFFFFFFFF00001FFFFFFFFFFF80000FFFFFFFFFFFC00 007FFFFFFFFFFC0001FFFFFFFFFFFE0007FFFFFFFFFFFE000FFC000003FFFF001FF80000 003FFF003FF00000000FFF007FE000000007FF807FE000000003FF80FFC000000003FF80 FFC000000001FF80FFC000000001FF80FFC000000001FF80FFC000000001FF80FFC00000 0001FF80FFE000000003FF807FE000000003FF007FF000000007FF003FF000000007FE00 1FF80000000FFC001FFE0000003FFC0007FF0000007FF00003FFC00001FFE00000FFFC00 1FFF8000003FFFFFFFFE0000000FFFFFFFF800000001FFFFFFC0000000000FFFF8000000 3B4F7CB542>I<003FF8000000000000FFFFF8000000000000FFFFF8000000000000FFFF F8000000000000FFFFF8000000000000FFFFF800000000000003FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FF F800000000000000FFF800000000000000FFF8001FFC00000000FFF800FFFF80000000FF F803FFFFE0000000FFF80FFFFFF8000000FFF81FC07FFC000000FFF87E003FFE000000FF F8F8001FFF000000FFF9F0001FFF000000FFF9E0000FFF800000FFFBC0000FFF800000FF FF80000FFF800000FFFF000007FFC00000FFFF000007FFC00000FFFE000007FFC00000FF FE000007FFC00000FFFC000007FFC00000FFFC000007FFC00000FFFC000007FFC00000FF FC000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FF F8000007FFC00000FFF8000007FFC00000FFF8000007FFC000FFFFFFF807FFFFFFC0FFFF FFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC04253 7CD249>I<003F000000FFC00001FFE00003FFF00003FFF00007FFF80007FFF80007FFF8 0007FFF80007FFF80007FFF80003FFF00003FFF00001FFE00000FFC000003F0000000000 000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000001FF800FFFFF800FFFFF800FFFFF800FFFFF8 00FFFFF80001FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8 0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF800FFFFFF F0FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF01C547CD324>I<0000003F00000000FFC00000 01FFE0000003FFF0000003FFF0000007FFF8000007FFF8000007FFF8000007FFF8000007 FFF8000007FFF8000003FFF0000003FFF0000001FFE0000000FFC00000003F0000000000 000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000003FF800 01FFFFF80001FFFFF80001FFFFF80001FFFFF80001FFFFF8000003FFF8000000FFF80000 00FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000 FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FF F8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8 000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF800 0000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF80000 00FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000 FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FFF8000000FF F8000000FFF8078000FFF81FE000FFF83FF000FFF87FF800FFF8FFFC00FFF0FFFC01FFF0 FFFC01FFF0FFFC01FFE0FFFC01FFE0FFFC03FFC07FF803FF807FF807FF003FF00FFE001F F03FFC000FFFFFF00007FFFFE00001FFFF0000003FF80000256C87D328>I<003FF800FF FFF800FFFFF800FFFFF800FFFFF800FFFFF80003FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000 FFF80000FFF80000FFF80000FFF80000FFF800FFFFFFF8FFFFFFF8FFFFFFF8FFFFFFF8FF FFFFF81D537CD224>108 D<003FF0001FF8000001FF800000FFFFF000FFFF80000FFFF8 0000FFFFF003FFFFE0003FFFFE0000FFFFF00FFFFFF000FFFFFF0000FFFFF03F80FFF803 F80FFF8000FFFFF07E007FFC07E007FFC00003FFF0F8003FFE0F8003FFE00000FFF1F000 1FFE1F0001FFE00000FFF3E0001FFF3E0001FFF00000FFF3C0001FFF3C0001FFF00000FF F780001FFF780001FFF00000FFF700000FFFF00000FFF80000FFFF00000FFFF00000FFF8 0000FFFE00000FFFE00000FFF80000FFFE00000FFFE00000FFF80000FFFC00000FFFC000 00FFF80000FFFC00000FFFC00000FFF80000FFFC00000FFFC00000FFF80000FFF800000F FF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF8 00000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF800 00FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000 FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF 800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800 000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000 FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FF F80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF80 0000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF80000 0FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FF F800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF8 00FFFFFFF80FFFFFFF80FFFFFFF8FFFFFFF80FFFFFFF80FFFFFFF8FFFFFFF80FFFFFFF80 FFFFFFF8FFFFFFF80FFFFFFF80FFFFFFF8FFFFFFF80FFFFFFF80FFFFFFF865367BB56E> I<003FF0001FFC000000FFFFF000FFFF800000FFFFF003FFFFE00000FFFFF00FFFFFF800 00FFFFF01FC07FFC0000FFFFF07E003FFE000003FFF0F8001FFF000000FFF1F0001FFF00 0000FFF1E0000FFF800000FFF3C0000FFF800000FFF780000FFF800000FFF7000007FFC0 0000FFFF000007FFC00000FFFE000007FFC00000FFFE000007FFC00000FFFC000007FFC0 0000FFFC000007FFC00000FFFC000007FFC00000FFFC000007FFC00000FFF8000007FFC0 0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0 0000FFF8000007FFC000FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFF C0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC042367CB549>I<000001FFC00000000000 3FFFFE0000000000FFFFFF8000000003FFFFFFE00000000FFF80FFF80000003FFC001FFE 0000007FF00007FF000000FFE00003FF800001FFC00001FFC00003FF800000FFE00003FF 0000007FE00007FF0000007FF0000FFF0000007FF8000FFE0000003FF8001FFE0000003F FC001FFE0000003FFC003FFE0000003FFE003FFC0000001FFE003FFC0000001FFE007FFC 0000001FFF007FFC0000001FFF007FFC0000001FFF007FFC0000001FFF00FFFC0000001F FF80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC 0000001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001F FF80FFFC0000001FFF80FFFC0000001FFF807FFC0000001FFF007FFC0000001FFF007FFC 0000001FFF003FFC0000001FFE003FFE0000003FFE003FFE0000003FFE001FFE0000003F FC001FFE0000003FFC000FFF0000007FF8000FFF0000007FF80007FF800000FFF00003FF 800000FFE00001FFC00001FFC00000FFE00003FF8000007FF00007FF0000003FFC001FFE 0000001FFF80FFFC00000007FFFFFFF000000001FFFFFFC0000000003FFFFE0000000000 03FFE000000039387CB642>I<003FF8007FF0000000FFFFF807FFFF000000FFFFF81FFF FFC00000FFFFF87FFFFFF00000FFFFF9FF00FFFC0000FFFFFFF8003FFF000003FFFFE000 0FFF800000FFFF800007FFC00000FFFF000003FFE00000FFFE000003FFF00000FFFC0000 01FFF00000FFF8000000FFF80000FFF8000000FFFC0000FFF80000007FFC0000FFF80000 007FFE0000FFF80000007FFE0000FFF80000003FFE0000FFF80000003FFF0000FFF80000 003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF80000001FFF8000FFF80000 001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000 001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000 001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000 003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF80000 007FFE0000FFF80000007FFE0000FFF80000007FFC0000FFF8000000FFFC0000FFF80000 00FFF80000FFFC000001FFF80000FFFC000001FFF00000FFFE000003FFE00000FFFF0000 07FFC00000FFFF80000FFF800000FFFFE0001FFF000000FFFFF0007FFE000000FFF9FE01 FFF8000000FFF8FFFFFFF0000000FFF83FFFFFC0000000FFF807FFFE00000000FFF800FF E000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000 0000000000FFF8000000000000FFFFFFF80000000000FFFFFFF80000000000FFFFFFF800 00000000FFFFFFF80000000000FFFFFFF80000000000414D7DB549>I<000003FF80000F 800000003FFFF0001F80000000FFFFFC003F80000007FFFFFF003F8000000FFFC03F807F 8000003FFF000FC07F8000007FFC0003E0FF800000FFF80001F1FF800001FFF00000F9FF 800003FFE000007FFF800007FFC000007FFF80000FFFC000003FFF80000FFF8000001FFF 80001FFF8000001FFF80001FFF0000000FFF80003FFF0000000FFF80003FFF0000000FFF 80007FFE0000000FFF80007FFE0000000FFF80007FFE0000000FFF80007FFE0000000FFF 8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF 8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF 8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF 8000FFFC0000000FFF80007FFE0000000FFF80007FFE0000000FFF80007FFE0000000FFF 80007FFE0000000FFF80003FFE0000000FFF80003FFF0000000FFF80003FFF0000000FFF 80001FFF0000000FFF80001FFF8000001FFF80000FFF8000003FFF800007FFC000003FFF 800007FFE000007FFF800003FFE00000FFFF800001FFF00001FFFF800000FFF80007EFFF 8000003FFE000FCFFF8000001FFF807F8FFF80000007FFFFFE0FFF80000001FFFFF80FFF 800000007FFFE00FFF8000000007FF000FFF800000000000000FFF800000000000000FFF 800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF 800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF 800000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF 800000000000000FFF800000000000000FFF800000000000000FFF8000000000000FFFFF FF80000000000FFFFFFF80000000000FFFFFFF80000000000FFFFFFF80000000000FFFFF FF80414D7CB545>I<003FF001FC00FFFFF00FFF80FFFFF01FFFE0FFFFF07FFFF0FFFFF0 FE1FF8FFFFF1F83FF801FFF1F07FFC00FFF3E07FFC00FFF3C07FFC00FFF7807FFC00FFF7 807FFC00FFFF007FFC00FFFF003FF800FFFE001FF000FFFE000FE000FFFE00000000FFFC 00000000FFFC00000000FFFC00000000FFFC00000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF800000000FFF8000000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFF FE0000FFFFFFFE00002E367DB535>I<0003FFC00E00001FFFFC1E0000FFFFFF7E0003FF FFFFFE0007FE003FFE000FF0000FFE001FE00003FE003FC00001FE003F800000FE007F80 0000FE007F0000007E007F0000007E00FF0000003E00FF0000003E00FF8000003E00FF80 00003E00FFC000003E00FFF000000000FFFC00000000FFFF800000007FFFFE0000007FFF FFF000003FFFFFFE00003FFFFFFF80001FFFFFFFE0000FFFFFFFF00007FFFFFFFC0003FF FFFFFE0000FFFFFFFF00003FFFFFFF00000FFFFFFF800001FFFFFF8000000FFFFFC00000 003FFFC000000007FFE000000001FFE0F8000000FFE0F80000007FE0FC0000003FE0FC00 00003FE0FC0000001FE0FE0000001FE0FE0000001FE0FE0000001FC0FF0000001FC0FF80 00003FC0FF8000003F80FFC000003F80FFE000007F00FFF80000FF00FFFC0003FE00FFFF 801FFC00FE7FFFFFF000F81FFFFFC000F007FFFF0000E0007FF000002B387CB634>I<00 007C00000000007C00000000007C00000000007C00000000007C00000000007C00000000 00FC0000000000FC0000000000FC0000000000FC0000000001FC0000000001FC00000000 01FC0000000003FC0000000003FC0000000007FC0000000007FC000000000FFC00000000 1FFC000000003FFC000000007FFC00000000FFFC00000003FFFC0000000FFFFFFFFE00FF FFFFFFFE00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE00007FFC000000007FFC00000000 7FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00000000 7FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00000000 7FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00000000 7FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00000000 7FFC000000007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC000F8000 7FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC000F8000 7FFC001F00003FFE001F00003FFE001F00001FFE003E00001FFF003E00000FFF807C0000 07FFC1F8000003FFFFF0000000FFFFE00000003FFF8000000003FE0000294D7ECB33>I< 003FF8000001FFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFFF80007FFFFC000 FFFFF80007FFFFC000FFFFF80007FFFFC00003FFF800001FFFC00000FFF8000007FFC000 00FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC000 00FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC000 00FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC000 00FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC000 00FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC000 00FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC000 00FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC000 00FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800000FFFC000 00FFF800000FFFC00000FFF800000FFFC00000FFF800001FFFC00000FFF800001FFFC000 00FFF800003FFFC000007FF800003FFFC000007FF800007FFFC000003FFC0000F7FFC000 003FFC0001E7FFF000001FFE0007C7FFFFC0000FFF801F87FFFFC00007FFFFFF07FFFFC0 0001FFFFFC07FFFFC000007FFFF007FFFFC0000007FFC007FF000042377CB549>IIIII E %EndDVIPSBitmapFont end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%BeginPaperSize: a4 /setpagedevice where { pop << /PageSize [595 842] >> setpagedevice } { /a4 where { pop a4 } if } ifelse %%EndPaperSize end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop 0 91 a Fj(Con)l(ten)l(ts)0 295 y Fi(1)84 b(Mo)s(dule)34 b Fh(Cookie_lexer)2769 b Fi(1)0 498 y(2)84 b(Mo)s(dule)44 b Fh(Http_common)h Fi(:)66 b(Common)43 b(functionalities)i(shared)g(b)m(y)f(other)h(OCaml)f(HTTP) 136 611 y(mo)s(dules)3337 b(1)0 814 y(3)84 b(Mo)s(dule)34 b Fh(Http_constants)h Fi(:)46 b(Constan)m(ts)2113 b(2)136 927 y Fg(3.1)92 b(daemon)32 b(default)f(v)-5 b(alues)70 b(.)46 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h (.)137 b(2)0 1130 y Fi(4)84 b(Mo)s(dule)34 b Fh(Http_daemon)h Fi(:)46 b(Main)35 b(OCaml)f(HTTP)h(mo)s(dule.)1389 b(3)0 1334 y(5)84 b(Mo)s(dule)34 b Fh(Http_message)h Fi(:)46 b(Ob)6 b(ject)34 b(Orien)m(ted)h(represen)m(tation)h(of)e(HTTP)h (messages)345 b(6)343 1447 y Fg(5.0.1)105 b Ff(he)-5 b(ader)41 b(name)e(c)-5 b(omp)g(arison)40 b(ar)-5 b(e)41 b(p)-5 b(erforme)g(d)41 b(in)e(a)g(c)-5 b(ase-insensitive)41 b(manner)e(as)g(r)-5 b(e-)633 1559 y(quir)g(e)g(d)36 b(by)e(RF)n(C2616,)g(actual)5 b(ly)34 b(the)h(implementation)f(works)g (c)-5 b(onverting)36 b(al)5 b(l)34 b(he)-5 b(ader)633 1672 y(names)32 b(in)g(lower)-5 b(c)g(ase)46 b Fg(.)g(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)137 b(6)0 1876 y Fi(6)84 b(Mo)s(dule)23 b Fh(Http_misc)g Fi(:)40 b(Help)s(ers)24 b(and)f(other)h(not)f(b)s(etter)h(classi\034ed)g(functions)e(whic)m(h)h (should)136 1989 y(not)34 b(b)s(e)h(exp)s(osed)f(in)h(the)g(\034nal)f (API)2271 b(8)0 2192 y(7)84 b(Mo)s(dule)34 b Fh(Http_parser)h Fi(:)46 b(HTTP)35 b(messages)g(parsing)1551 b(10)0 2395 y(8)84 b(Mo)s(dule)48 b Fh(Http_parser_sanity)h Fi(:)75 b(Sanit)m(y)48 b(test)j(functions)d(related)h(to)h(HTTP)f(message)136 2508 y(parsing)3329 b(11)0 2711 y(9)84 b(Mo)s(dule)34 b Fh(Http_request)h Fi(:)46 b(Ob)6 b(ject)34 b(Orien)m(ted)h(represen)m (tation)h(of)e(HTTP)h(requests)327 b(11)0 2915 y(10)32 b(Mo)s(dule)i Fh(Http_response)h Fi(:)46 b(Ob)6 b(ject)34 b(Orien)m(ted)h(represen)m(tation)h(of)e(HTTP)h(resp)s(onses)221 b(12)0 3118 y(11)32 b(Mo)s(dule)i Fh(Http_tcp_server)h Fi(:)46 b(TCP)34 b(serv)m(ers)h(used)f(as)h(lo)m(w-lev)m(els)g(for)f (HTTP)h(daemons)148 b(12)136 3231 y Fg(11.1)47 b(serv)m(ers)h(.)d(.)h (.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)f(.)h(.)92 b(12)136 3344 y(11.2)47 b(lo)m(w)32 b(lev)m(el)f(functions)80 b(.)46 b(.)f(.)h(.)f(.)h(.)f(.)h (.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 b(12)0 3547 y Fi(12)32 b(Mo)s(dule)i Fh(Http_threaded_tcp_server)g Fi(:)46 b(Multithreaded)36 b(part)e(of)h(Http_tcp_serv)m(er)211 b(12)0 3750 y(13)32 b(Mo)s(dule)i Fh(Http_types)h Fi(:)46 b(T)m(yp)s(e)34 b(de\034nitions)1965 b(12)136 3863 y Fg(13.1)47 b(Exceptions)26 b(.)46 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 b(15)136 3976 y(13.2)47 b(OO)31 b(represen)m(tation)i(of)d(HTTP)h (messages)77 b(.)46 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 b(16)343 4089 y(13.2.1)60 b(facilities)30 b(to)h(access)f(some)h (frequen)m(tly)f(used)h(headers)42 b(.)k(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 b(19)136 4202 y(13.3)47 b(Daemon)32 b(sp)s(eci\034cation)40 b(.)45 b(.)h(.)f(.)h(.)f(.)h(.)g(.) f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h (.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 b(20)136 4315 y(13.4)47 b(OO)31 b(represen)m(tation)i(of)d(other)h(HTTP)g(en)m (tities)52 b(.)46 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 b(21)0 4518 y Fi(14)32 b(Mo)s(dule)i Fh(Http_user_agent)h Fi(:)46 b(Minimal)34 b(implemen)m(tation)h(of)f(an)h(HTTP)g(1.0/1.1)f(clien)m (t.)90 b(22)0 4805 y Fj(1)131 b(Mo)t(dule)44 b Fe(Cookie_lexer)0 5151 y Fh(type)j(cookie_token)g(=)g([)f(`ASSIGNMENT)h(of)g(string)g(*)g (string)g(|)g(`EOF)g(|)g(`SEP)f(])1927 5400 y Fg(1)p eop end %%Page: 2 2 TeXDict begin 2 1 bop 0 91 a Fh(val)47 b(token)g(:)g(Lexing.lexbuf)f (->)h(cookie_token)0 377 y Fj(2)131 b(Mo)t(dule)55 b Fe(Http_common)d Fj(:)82 b(Common)54 b(functionalities)k(shared)e(b)l (y)g(other)197 527 y(OCaml)44 b(HTTP)g(mo)t(dules)0 872 y Fh(val)j(debug)g(:)g(bool)g(Pervasives.ref)227 1010 y Fg(whether)32 b(debugging)g(messages)e(are)h(enabled)g(or)g(not,)f (can)h(b)s(e)f(c)m(hanged)i(at)f(run)m(time)0 1220 y Fh(val)47 b(debug_print)g(:)g(string)f(->)h(unit)227 1358 y Fg(prin)m(t)32 b(a)e(string)h(on)f(stderr)h(only)f(if)g (debugging)i(is)e(enabled)0 1568 y Fh(val)47 b(http_version)g(:)g (Http_types.version)227 1706 y Fg(see)30 b Fh(Http_constants.version)p Fg([3])0 1917 y Fh(val)47 b(server_string)g(:)g(string)227 2054 y Fg(see)30 b Fh(Http_constants.server_string)p Fg([3])0 2265 y Fh(val)47 b(string_of_version)f(:)h(Http_types.version) g(->)g(string)227 2402 y Fg(prett)m(y)31 b(prin)m(t)h(an)f(HTTP)f(v)m (ersion)0 2613 y Fh(val)47 b(version_of_string)f(:)h(string)g(->)g (Http_types.version)227 2750 y Fg(parse)31 b(an)f(HTTP)h(v)m(ersion)g (from)g(a)f(string)227 2900 y Fi(Raises)h Fh(Invalid_HTTP_version)e Fg(if)h(giv)m(en)h(string)g(do)s(esn't)f(represen)m(t)i(a)f(supp)s (orted)f(HTTP)h(v)m(ersion)0 3111 y Fh(val)47 b(string_of_method)g(:)f (Http_types.meth)h(->)g(string)227 3248 y Fg(prett)m(y)31 b(prin)m(t)h(an)f(HTTP)f(metho)s(d)0 3459 y Fh(val)47 b(method_of_string)g(:)f(string)h(->)g(Http_types.meth)227 3596 y Fg(parse)31 b(an)f(HTTP)h(metho)s(d)g(from)g(a)f(string)227 3746 y Fi(Raises)h Fh(Invalid_HTTP_method)e Fg(if)h(giv)m(en)h(string)g (do)s(esn't)f(represen)m(t)i(a)f(supp)s(orted)f(metho)s(d)0 3957 y Fh(val)47 b(status_of_code)g(:)g(int)f(->)h(Http_types.status) 227 4094 y Fg(con)m(v)m(erts)32 b(an)e(in)m(teger)i(HTTP)f(status)f(to) h(the)g(corresp)s(onding)g(status)f(v)-5 b(alue)227 4244 y Fi(Raises)31 b Fh(Invalid_code)f Fg(if)g(giv)m(en)h(in)m(teger)g (isn't)g(a)f(v)-5 b(alid)31 b(HTTP)g(status)f(co)s(de)0 4455 y Fh(val)47 b(code_of_status)g(:)g([<)f(Http_types.status)h(])g (->)g(int)227 4592 y Fg(con)m(v)m(erts)32 b(an)e(HTTP)h(status)g(to)f (the)h(corresp)s(onding)g(in)m(teger)h(v)-5 b(alue)0 4803 y Fh(val)47 b(is_informational)g(:)f(int)h(->)g(bool)227 4940 y Fi(Returns)34 b Fg(true)d(on)g("informational")h(status)e(co)s (des,)g(false)g(elsewhere)0 5151 y Fh(val)47 b(is_success)g(:)g(int)g (->)f(bool)1927 5400 y Fg(2)p eop end %%Page: 3 3 TeXDict begin 3 2 bop 227 91 a Fi(Returns)34 b Fg(true)d(on)g ("success")f(status)g(co)s(des,)g(false)g(elsewhere)0 304 y Fh(val)47 b(is_redirection)g(:)g(int)f(->)h(bool)227 442 y Fi(Returns)34 b Fg(true)d(on)g("redirection")h(status)e(co)s (des,)g(false)g(elsewhere)0 654 y Fh(val)47 b(is_client_error)g(:)f (int)h(->)g(bool)227 792 y Fi(Returns)34 b Fg(true)d(on)g("clien)m(t)g (error")h(status)e(co)s(des,)g(false)g(elsewhere)0 1005 y Fh(val)47 b(is_server_error)g(:)f(int)h(->)g(bool)227 1142 y Fi(Returns)34 b Fg(true)d(on)g("serv)m(er)g(error")g(status)f (co)s(des,)g(false)g(elsewhere)0 1355 y Fh(val)47 b(is_error)g(:)g(int) g(->)f(bool)227 1493 y Fi(Returns)34 b Fg(true)d(on)g("clien)m(t)g (error")h(and)e("serv)m(er)h(error")g(status)g(co)s(de,)f(false)g (elsewhere)0 1854 y Fj(3)131 b(Mo)t(dule)44 b Fe(Http_constants)39 b Fj(:)58 b(Constan)l(ts)0 2200 y Fh(val)47 b(version)g(:)g (Http_types.version)227 2338 y Fg(default)31 b(HTTP)g(v)m(ersion)0 2550 y Fh(val)47 b(server_string)g(:)g(string)227 2688 y Fg(string)31 b(returned)h(as)e(v)-5 b(alue)30 b(of)g("Serv)m(er:")i (resp)s(onse)e(header)0 2900 y Fh(val)47 b(crlf)g(:)g(string)227 3038 y Fg("\\r\\n")32 b(string)0 3356 y Fd(3.1)112 b(daemon)38 b(default)f(v)-6 b(alues)0 3553 y Fh(val)47 b(default_addr)g(:)g (string)0 3691 y(val)g(default_auth)g(:)g(\(string)f(*)h (Http_types.auth_info\))g(option)0 3829 y(val)g(default_auto_close)f(:) h(bool)0 3966 y(val)g(default_callback)g(:)f(Http_types.request)h(->)g (Pervasives.out_channel)f(->)h(unit)0 4104 y(val)g(default_mode)g(:)g (Http_types.daemon_mode)0 4242 y(val)g(default_port)g(:)g(int)0 4380 y(val)g(default_root_dir)g(:)f(string)h(option)0 4518 y(val)g(default_exn_handler)f(:)h(\(exn)g(->)g (Pervasives.out_channel)g(->)g(unit\))f(option)0 4655 y(val)h(default_timeout)g(:)f(int)h(option)1927 5400 y Fg(3)p eop end %%Page: 4 4 TeXDict begin 4 3 bop 0 91 a Fj(4)131 b(Mo)t(dule)44 b Fe(Http_daemon)c Fj(:)58 b(Main)44 b(OCaml)f(HTTP)h(mo)t(dule.)0 294 y Fg(Here)30 b(y)m(ou)h(can)g(\034nd)g(t)m(w)m(o)g(set)g(of)f (functions:)136 482 y Fc(\017)46 b Fg(functions)31 b(whic)m(h)h(let)e (y)m(ou)h(start)f(an)h(HTTP)g(Daemon)g(\(start*)g(functions\))136 669 y Fc(\017)46 b Fg(facilit)m(y)31 b(functions)g(whic)m(h)h(let)e(y)m (ou)h(sen)m(t)g(resp)s(onses)e(bac)m(k)i(to)g(clien)m(ts)0 1000 y Fh(val)47 b(send_CRLF)g(:)g(Pervasives.out_channel)f(->)h(unit) 227 1138 y Fg(send)31 b(a)f(CRLF)g(sequence)h(on)g(the)f(giv)m(en)h (output)h(c)m(hannel,)g(this)e(is)g(mandatory)h(after)g(the)g(last)f (header)227 1251 y(w)m(as)h(sen)m(t)g(and)g(b)s(efore)f(start)g (sending)h(the)g(resp)s(onse)f(b)s(o)s(dy)0 1463 y Fh(val)47 b(send_status_line)g(:)94 1576 y(?version:Http_types.version)f(->)94 1689 y(code:Http_types.status_code)g(->)h(Pervasives.out_channel)g(->)g (unit)227 1827 y Fg(send)31 b(resp)s(onse)f(status)g(line,)h(v)m (ersion)g(is)f(the)g(h)m(ttp)i(v)m(ersion)f(used)f(in)h(resp)s(onse,)f (either)h(co)s(de)f(or)h(status)227 1940 y(m)m(ust)g(b)s(e)e(giv)m(en)h (\(not)h(b)s(oth,)f(not)g(none\))g(whic)m(h)h(represen)m(t)g(the)f (HTTP)g(resp)s(onse)g(co)s(de,)g(outc)m(han)h(is)e(the)227 2053 y(output)j(c)m(hannel)g(to)e(whic)m(h)i(send)e(status)g(line)0 2265 y Fh(val)47 b(get_basic_headers)f(:)h(unit)g(->)g(\(string)g(*)g (string\))g(list)227 2403 y Fg(returns)31 b(the)g(basic)f(headers)h ("Date",)h("Serv)m(er")f(and)g("Connection")h(used)f(in)f (send_basic_headers)0 2616 y Fh(val)47 b(send_basic_headers)f(:)94 2729 y(?version:Http_types.version)g(->)94 2842 y (code:Http_types.status_code)g(->)h(Pervasives.out_channel)g(->)g(unit) 227 2979 y Fg(lik)m(e)31 b(send_status_line)h(but)e(additionally)i (will)f(also)f(send)h("Date",)g("Serv)m(er")h(and)e("Connection")227 3092 y(standard)h(headers)0 3305 y Fh(val)47 b(send_header)g(:)94 3418 y(header:string)g(->)g(value:string)f(->)h(Pervasives.out_channel) g(->)g(unit)227 3556 y Fg(send)31 b(an)f(HTTP)h(header)g(on)g(outc)m (han)0 3768 y Fh(val)47 b(send_headers)g(:)94 3881 y(headers:\(string)g (*)g(string\))f(list)h(->)g(Pervasives.out_channel)g(->)g(unit)227 4019 y Fg(as)30 b(send_header,)i(but)f(for)f(a)g(list)h(of)f(pairs)g Fb(<)p Fg(header,)h(v)-5 b(alue)p Fb(>)0 4231 y Fh(val)47 b(send_file)g(:)g(src:Http_types.file_source)f(->)h (Pervasives.out_channel)f(->)h(unit)227 4369 y Fg(send)31 b(a)f(\034le)h(through)g(an)g(out_c)m(hannel)0 4582 y Fh(val)47 b(respond)g(:)94 4695 y(?body:string)g(->)94 4808 y(?headers:\(string)g(*)g(string\))f(list)h(->)94 4920 y(?version:Http_types.version)f(->)94 5033 y (?code:Http_types.status_code)g(->)h(Pervasives.out_channel)g(->)g (unit)1927 5400 y Fg(4)p eop end %%Page: 5 5 TeXDict begin 5 4 bop 227 91 a Fg(high)31 b(lev)m(el)g(resp)s(onse)f (function,)h(resp)s(ond)g(on)f(outc)m(han)i(sending:)42 b(basic)30 b(headers)h(\(including)227 204 y(Con)m(ten)m(t-Length)j (computed)d(using)f('b)s(o)s(dy')f(argumen)m(t\),)j(headers)e(probided) h(via)e('headers')i(argumen)m(t,)227 317 y(b)s(o)s(dy)f(giv)m(en)h(via) f('b)s(o)s(dy')g(argumen)m(t.)42 b(Default)31 b(resp)s(onse)f(status)g (is)g(200,)h(default)g(resp)s(onse)f(HTTP)227 430 y(v)m(ersion)h(is)f (Http_common.h)m(ttp_v)m(ersion)0 643 y Fh(val)47 b(respond_not_found)f (:)94 756 y(url:string)h(->)g(?version:Http_types.version)f(->)h (Pervasives.out_channel)f(->)h(unit)227 893 y Fg(send)31 b(a)f(404)h(\(not)g(found\))f(HTTP)h(resp)s(onse)0 1106 y Fh(val)47 b(respond_forbidden)f(:)94 1219 y(url:string)h(->)g (?version:Http_types.version)f(->)h(Pervasives.out_channel)f(->)h(unit) 227 1357 y Fg(send)31 b(a)f(403)h(\(forbidden\))g(HTTP)g(resp)s(onse)0 1569 y Fh(val)47 b(respond_redirect)g(:)94 1682 y(location:string)g(->) 94 1795 y(?body:string)g(->)94 1908 y(?version:Http_types.version)f(->) 94 2021 y(?code:Http_types.status_code)g(->)h(Pervasives.out_channel)g (->)g(unit)227 2159 y Fg(send)31 b(a)f("redirection")i(class)e(resp)s (onse,)h(optional)g(b)s(o)s(dy)f(argumen)m(t)i(con)m(tains)g(data)e (that)h(will)g(b)s(e)227 2271 y(displa)m(y)m(ed)h(in)f(the)f(b)s(o)s (dy)g(of)g(the)g(resp)s(onse,)h(default)f(resp)s(onse)h(status)f(is)g (301)g(\(mo)m(v)m(ed)i(p)s(ermanen)m(tly\),)227 2384 y(only)f(redirection)h(status)e(are)h(accepted)g(b)m(y)g(this)f (function,)h(other)g(v)-5 b(alues)31 b(will)f(raise)h(F)-8 b(ailure)0 2597 y Fh(val)47 b(respond_unauthorized)f(:)94 2710 y(?version:Http_types.version)g(->)94 2823 y(?realm:string)h(->)g (Pervasives.out_channel)f(->)h(unit)227 2961 y Fg(resp)s(ond)31 b(with)g(a)f(401)h(\(Unauthorized\))h(resp)s(onse)e(asking)g(for)h (authen)m(tication)i(against)e(giv)m(en)g(realm)227 3073 y(\(default)g(is)f(the)h(serv)m(er)g(name\))0 3286 y Fh(val)47 b(respond_error)g(:)94 3399 y(?body:string)g(->)94 3512 y(?version:Http_types.version)f(->)94 3625 y (?code:Http_types.status_code)g(->)h(Pervasives.out_channel)g(->)g (unit)227 3763 y Fg(send)31 b(an)f("error")i(resp)s(onse)e(\(i.e.)41 b(400)30 b Fc(\024)g Fg(status)g Fb(<)g Fg(600\),)h(optional)h(b)s(o)s (dy)d(argumen)m(t)k(as)d(p)s(er)227 3875 y(send_redirect,)i(default)d (resp)s(onse)g(status)h(is)f(400)g(\(bad)h(request\),)g(only)f(error)h (status)f(are)h(accepted)h(b)m(y)227 3988 y(this)g(function,)g(other)g (v)-5 b(alues)30 b(will)h(raise)f(F)-8 b(ailure)0 4201 y Fh(val)47 b(respond_file)g(:)94 4314 y(fname:string)g(->)g (?version:Http_types.version)f(->)h(Pervasives.out_channel)f(->)h(unit) 227 4452 y Fg(tipical)32 b(static)e(pages)h(h)m(ttp)g(daemon)h(b)s(eha) m(viour,)f(if)f(requested)h(url)f(is)g(a)h(\034le,)f(return)i(it,)e(it) h(it)f(is)g(a)227 4565 y(directory)h(return)h(a)e(directory)h(listing)g (of)f(it)0 4777 y Fh(val)47 b(respond_with)g(:)g(Http_types.response)f (->)h(Pervasives.out_channel)g(->)f(unit)227 4915 y Fg(resp)s(ond)31 b(using)f(a)h(prebuilt)g(Http_t)m(yp)s(es.resp)s(onse)g(ob)5 b(ject)0 5127 y Fh(val)47 b(main)g(:)g(Http_types.daemon_spec)f(->)h (unit)1927 5400 y Fg(5)p eop end %%Page: 6 6 TeXDict begin 6 5 bop 227 91 a Fg(start)31 b(an)f(HTTP)h(daemon)0 284 y Fh(val)47 b(default_spec)g(:)g(Http_types.daemon_spec)227 417 y Fg(default)31 b(daemon)h(sp)s(eci\034cation:)336 595 y Fc(\017)46 b Fg(listen)31 b(on)f(0.0.0.0,)i(p)s(ort)e(80)336 731 y Fc(\017)46 b Fg("alw)m(a)m(ys)32 b(ok")e(callbac)m(k)i(\(return)f (an)f(empt)m(y)i(resp)s(onse,)e(resp)s(onse)g(co)s(de)g(200\))336 868 y Fc(\017)46 b Fg(fork)30 b(a)g(c)m(hild)i(for)e(eac)m(h)h(request) 336 1004 y Fc(\017)46 b Fg(do)31 b(not)g(c)m(hange)g(to)g(a)f(ro)s(ot)h (directory)g(\(i.e.)41 b(k)m(eep)31 b(cwd\))336 1141 y Fc(\017)46 b Fg(300)31 b(seconds)f(timeout)336 1277 y Fc(\017)46 b Fg(ignores)31 b(exceptions)336 1413 y Fc(\017)46 b Fg(no)31 b(authen)m(tication)i(required)336 1550 y Fc(\017)46 b Fg(do)31 b(not)g(automatically)h(close)e(clien)m(t) i(connections)f(after)g(callbac)m(k)0 1788 y Fh(val)47 b(daemon_spec)g(:)94 1900 y(?address:string)g(->)94 2013 y(?auth:\(string)g(*)g(Http_types.auth_info\))f(option)h(->)94 2126 y(?auto_close:bool)g(->)94 2239 y(?callback:\(Http_types.request)f (->)h(Pervasives.out_channel)g(->)g(unit\))f(->)94 2352 y(?mode:Http_types.daemon_mode)g(->)94 2465 y(?port:int)h(->)94 2578 y(?root_dir:string)g(option)f(->)94 2691 y(?exn_handler:\(exn)h (->)f(Pervasives.out_channel)h(->)g(unit\))g(option)g(->)94 2804 y(?timeout:int)g(option)f(->)h(unit)g(->)g(Http_types.daemon_spec) 227 2937 y Fg(curri\034ed)32 b(daemon_sp)s(ec)f(constructor.)42 b(Eac)m(h)32 b(parameter)g(of)e(this)g(function)h(corresp)s(onds)g(to)f (one)h(\034eld)227 3050 y(of)f(Http_t)m(yp)s(es.daemon_sp)s(ec)i(and)f (defaults)g(to)f(the)h(corresp)s(onding)g(\034eld)g(of)227 3162 y(Http_daemon.default_sp)s(ec)0 3355 y Fh(class)47 b(daemon)g(:)g(?addr:string)f(->)h(?port:int)g(->)g(unit)g(->)g (Http_types.daemon)227 3488 y Fg(Ob)5 b(ject)31 b(orien)m(ted)h(in)m (terface)g(to)e(HTTP)h(daemons.)0 3681 y Fh(module)47 b(Trivial)g(:)90 3794 y(sig)227 3945 y(val)g(callback)g(:)g (Http_types.request)f(->)h(Pervasives.out_channel)g(->)g(unit)427 4111 y Fg(callbac)m(k)32 b(function,)f(exp)s(osed)f(if)g(y)m(ou)h(lik)m (e)f(to)h(use)f(it)h(as)f(a)g(basis)g(to)g(de\034ne)i(a)e(more)h(p)s(o) m(w)m(erful)427 4223 y(daemon)227 4416 y Fh(val)47 b(main)g(:)g (Http_types.daemon_spec)f(->)h(unit)427 4582 y Fg(start)31 b(the)f("trivial")i(HTTP)f(daemon)90 4787 y Fh(end)227 4960 y Fg(T)-8 b(rivial)32 b(static)e(pages)h(HTTP)g(daemon.)41 b(Daemons)31 b(created)h(using)e(this)h(mo)s(dule)f(will)h(serv)m(e)g (directory)227 5073 y(indexes)g(and)f(\034les)h(found)f(starting)h (from)g(the)g(w)m(orking)g(directory)1927 5400 y(6)p eop end %%Page: 7 7 TeXDict begin 7 6 bop 0 91 a Fj(5)131 b(Mo)t(dule)41 b Fe(Http_message)d Fj(:)57 b(Ob)7 b(ject)42 b(Orien)l(ted)g(represen)l (tation)g(of)g(HTTP)197 241 y(messages)0 586 y Fh(class)47 b(virtual)g(message)f(:)h(body:string)g(->)g(headers:\(string)g(*)g (string\))g(list)f(->)h(version:Http_types.version)g(option)g(->)f (clisockaddr:Unix.sockaddr)h(->)g(srvsockaddr:Unix.sockaddr)f(->)90 699 y(object)227 869 y(method)h(version)g(:)g(Http_types.version)f (option)427 1042 y Fi(Returns)34 b Fg(message)d(HTTP)g(v)m(ersion,)g (it)f(can)h(b)s(e)f(None)g(b)s(ecause)h(older)g(v)m(ersion)g(of)f(the)g (HTTP)427 1155 y(proto)s(col)f(don't)g(require)g(HTTP)g(v)m(ersion)g (to)g(b)s(e)f(told)g(b)s(et)m(w)m(een)j(message)d(source)h(and)g (destination)227 1364 y Fh(method)47 b(setVersion)g(:)g (Http_types.version)f(->)h(unit)427 1537 y Fg(set)30 b(message)h(HTTP)g(v)m(ersion)227 1745 y Fh(method)47 b(body)g(:)g(string)427 1918 y Fi(Returns)34 b Fg(message)d(b)s(o)s(dy) 227 2127 y Fh(method)47 b(setBody)g(:)g(string)g(->)g(unit)427 2300 y Fg(set)30 b(message)h(b)s(o)s(dy)227 2509 y Fh(method)47 b(bodyBuf)g(:)g(Buffer.t)427 2682 y Fi(Returns)34 b Fg(a)d(Bu\033er.t)f (connected)i(to)f(message)f(b)s(o)s(dy)g(\(W)-8 b(arning:)42 b(c)m(hanging)32 b(this)e(bu\033er)h(will)427 2795 y(c)m(hange)h (message)f(b)s(o)s(dy)e(to)s(o\))227 3004 y Fh(method)47 b(setBodyBuf)g(:)g(Buffer.t)g(->)g(unit)427 3177 y Fg(set)30 b(a)h(new)g(Bu\033er.t)f(used)h(to)f(k)m(eep)h(message)g(b)s(o)s(dy)227 3385 y Fh(method)47 b(addBody)g(:)g(string)g(->)g(unit)427 3558 y Fg(app)s(end)31 b(a)f(string)h(to)g(message)f(b)s(o)s(dy)227 3767 y Fh(method)47 b(addBodyBuf)g(:)g(Buffer.t)g(->)g(unit)427 3940 y Fg(app)s(end)31 b(a)f(whole)i(bu\033er)e(to)h(message)f(b)s(o)s (dy)227 4288 y Fi(5.0.1)104 b Ff(he)-5 b(ader)40 b(name)g(c)-5 b(omp)g(arison)39 b(ar)-5 b(e)41 b(p)-5 b(erforme)g(d)40 b(in)f(a)g(c)-5 b(ase-insensitive)40 b(manner)f(as)g(r)-5 b(e)g(quir)g(e)g(d)43 b(by)227 4400 y(RF)n(C2616,)31 b(actual)5 b(ly)33 b(the)g(implementation)f(works)h(c)-5 b(onverting)33 b(al)5 b(l)33 b(he)-5 b(ader)34 b(names)e(in)f(lower)-5 b(c)g(ase)227 4596 y Fh(method)47 b(addHeader)g(:)g(name:string)g(->)f (value:string)h(->)g(unit)427 4769 y Fg(add)31 b(an)g(HTTP)g(header)227 4978 y Fh(method)47 b(addHeaders)g(:)g(\(string)g(*)g(string\))f(list)h (->)g(unit)427 5151 y Fg(add)31 b(a)f(list)h(of)f(HTTP)g(headers)1927 5400 y(7)p eop end %%Page: 8 8 TeXDict begin 8 7 bop 227 91 a Fh(method)47 b(replaceHeader)g(:)g (name:string)f(->)h(value:string)g(->)g(unit)427 267 y Fg(lik)m(e)31 b(addHeader)g(but)g(replace)h(previous)e(de\034nition)i (of)e(the)h(same)f(header)227 479 y Fh(method)47 b(replaceHeaders)g(:)g (\(string)g(*)f(string\))h(list)g(->)g(unit)427 654 y Fg(lik)m(e)31 b(addHeaders)g(but)g(replace)g(previous)g(de\034nition)h (of)e(headers)h(that)f(w)m(ere)i(already)f(de\034ned)227 867 y Fh(method)47 b(removeHeader)g(:)g(name:string)f(->)h(unit)427 1042 y Fg(remo)m(v)m(e)32 b(_all_)f(o)s(ccurences)g(of)f(an)h(HTTP)g (header)g(from)f(the)h(message)227 1254 y Fh(method)47 b(hasHeader)g(:)g(name:string)g(->)f(bool)427 1430 y Fi(Returns)34 b Fg(true)d(if)f(giv)m(en)h(header)g(exists)f(in)g (message,)h(false)f(otherwise)227 1642 y Fh(method)47 b(header)g(:)g(name:string)g(->)g(string)427 1817 y Fi(Raises)31 b Fh(Header_not_found)f Fg(if)f(giv)m(en)i(header)h(w)m(asn't)f (de\034ned)g(in)g(message)427 1947 y Fi(Returns)j Fg(v)-5 b(alue)31 b(asso)s(ciated)f(to)h(a)f(giv)m(en)h(header)227 2159 y Fh(method)47 b(headers)g(:)g(\(string)g(*)g(string\))f(list)427 2335 y Fi(Returns)34 b Fg(the)d(full)f(set)g(of)g(headers)h(de\034ned)h (for)e(this)g(message,)h(the)f(v)-5 b(alue)31 b(returned)h(is)d(an)427 2447 y(asso)s(ciation)i(list)f(from)g(headers)h(name)g(to)g(headers)g (v)-5 b(alue,)31 b(an)f(header)h(ma)m(y)g(o)s(ccurs)f(more)h(that)427 2560 y(once)g(in)g(the)f(list)227 2773 y Fh(method)47 b(clientSockaddr)g(:)g(Unix.sockaddr)427 2948 y Fi(Returns)34 b Fg(clien)m(t)e(Unix.so)s(c)m(k)-5 b(addr)227 3161 y Fh(method)47 b(clientAddr)g(:)g(string)427 3336 y Fi(Returns)34 b Fg(clien)m(t)e(address)e(prett)m(y)h(prin)m(ted)227 3548 y Fh(method)47 b(clientPort)g(:)g(int)427 3724 y Fi(Returns)34 b Fg(clien)m(t)e(p)s(ort)227 3936 y Fh(method)47 b(serverSockaddr)g(:)g(Unix.sockaddr)427 4111 y Fi(Returns)34 b Fg(serv)m(er)d(Unix.so)s(c)m(k)-5 b(addr)227 4324 y Fh(method)47 b(serverAddr)g(:)g(string)427 4499 y Fi(Returns)34 b Fg(serv)m(er)d(address)f(prett)m(y)i(prin)m(ted)227 4711 y Fh(method)47 b(serverPort)g(:)g(int)427 4887 y Fi(Returns)34 b Fg(serv)m(er)d(p)s(ort)227 5099 y Fh(method)47 b(private)g(virtual)g(fstLineToString)f(:)h(string)1927 5400 y Fg(8)p eop end %%Page: 9 9 TeXDict begin 9 8 bop 427 91 a Fi(Returns)34 b Fg(for)c(requests)g (\034rst)h(request)f(line,)h(for)f(resp)s(onses)g(\034rst)g(resp)s (onse)g(line.)41 b(User)30 b(b)m(y)427 204 y(deriv)m(ed)i(requests)e (and)h(resp)s(onses)e(to)i(implemen)m(t)h(toString)g(metho)s(d)227 417 y Fh(method)47 b(toString)g(:)g(string)427 592 y Fi(Returns)34 b Fg(a)d(string)f(represen)m(tation)j(of)d(the)h(message) 227 804 y Fh(method)47 b(serialize)g(:)g(Pervasives.out_channel)f(->)h (unit)427 980 y Fg(serialize)31 b(the)g(message)g(o)m(v)m(er)g(an)f (output)i(c)m(hannel)90 1205 y Fh(end)227 1392 y Fg(OO)f(represen)m (tation)i(of)d(an)g(HTTP)h(message)0 1753 y Fj(6)131 b(Mo)t(dule)41 b Fe(Http_misc)e Fj(:)57 b(Help)t(ers)42 b(and)f(other)h(not)f(b)t(etter)h(classi\034ed)g(func-)197 1903 y(tions)i(whic)l(h)h(should)g(not)e(b)t(e)h(exp)t(osed)f(in)h(the) g(\034nal)g(API)0 2249 y Fh(val)j(date_822)g(:)g(unit)g(->)f(string)227 2387 y Fi(Returns)34 b Fg(the)d(curren)m(t)h(date)f(complian)m(t)h(to)f (RF)m(C)f(1123,)h(whic)m(h)h(up)s(dates)e(RF)m(C)h(822)f(zone)h(info)f (are)227 2499 y(retriev)m(ed)i(from)e(UTC)0 2712 y Fh(val)47 b(is_directory)g(:)g(string)f(->)h(bool)227 2850 y Fi(Returns)34 b Fg(true)d(if)f('name')h(is)f(a)h(directory)g(on)f(the)h(\034le)g (system,)f(false)g(otherwise)0 3062 y Fh(val)47 b(filesize)g(:)g (string)f(->)h(int)227 3200 y Fi(Returns)34 b Fg(the)d(\034lesize)g(of) f(fname)0 3413 y Fh(val)47 b(strip_trailing_slash)f(:)h(string)g(->)g (string)227 3551 y Fg(strip)31 b(trailing)g('/',)g(if)f(an)m(y)-8 b(,)31 b(from)g(a)f(string)h(and)227 3701 y Fi(Returns)j Fg(the)d(new)g(string)0 3913 y Fh(val)47 b(strip_heading_slash)f(:)h (string)g(->)g(string)227 4051 y Fg(strip)31 b(heading)g('/',)g(if)f (an)m(y)-8 b(,)31 b(from)g(a)f(string)h(and)227 4201 y Fi(Returns)j Fg(the)d(new)g(string)0 4414 y Fh(val)47 b(ls)g(:)g(Unix.dir_handle)f(->)h(string)g(list)227 4552 y Fg(giv)m(en)31 b(a)g(dir)f(handle)227 4702 y Fi(Returns)k Fg(a)d(list)f(of)g(en)m(tries)h(con)m(tained)0 4915 y Fh(val)47 b(string_explode)g(:)g(string)f(->)h(char)g(list)227 5052 y Fg(explo)s(de)31 b(a)f(string)h(in)f(a)h(c)m(har)g(list)1927 5400 y(9)p eop end %%Page: 10 10 TeXDict begin 10 9 bop 0 91 a Fh(val)47 b(string_implode)g(:)g(char)f (list)h(->)g(string)227 229 y Fg(implo)s(de)31 b(a)g(c)m(har)g(list)f (in)h(a)f(string)0 442 y Fh(val)47 b(reason_phrase_of_code)f(:)h(int)g (->)g(string)227 579 y Fg(giv)m(en)31 b(an)g(HTTP)g(resp)s(onse)f(co)s (de)g(return)i(the)e(corresp)s(onding)i(reason)f(phrase)0 792 y Fh(val)47 b(build_sockaddr)g(:)g(string)f(*)h(int)g(->)g (Unix.sockaddr)227 930 y Fg(build)31 b(a)g(Unix.so)s(c)m(k)-5 b(addr)30 b(inet)h(address)f(from)h(a)f(string)h(represen)m(tation)i (of)c(an)i(IP)f(address)h(and)g(a)f(p)s(ort)227 1043 y(n)m(um)m(b)s(er)0 1255 y Fh(val)47 b(explode_sockaddr)g(:)f (Unix.sockaddr)h(->)g(string)g(*)g(int)227 1393 y Fg(explo)s(de)31 b(an)f(_inet_)i(Unix.so)s(c)m(k)-5 b(addr)30 b(address)h(in)f(a)h (string)f(represen)m(tation)j(of)d(an)g(IP)h(address)f(and)h(a)227 1506 y(p)s(ort)g(n)m(um)m(b)s(er)0 1719 y Fh(val)47 b (peername_of_out_channel)f(:)h(Pervasives.out_channel)g(->)g (Unix.sockaddr)227 1856 y Fg(giv)m(en)31 b(an)g(out_c)m(hannel)i(build) e(on)f(top)h(of)f(a)g(so)s(c)m(k)m(et,)h(return)g(p)s(eername)h (related)f(to)f(that)h(so)s(c)m(k)m(et)0 2069 y Fh(val)47 b(peername_of_in_channel)f(:)h(Pervasives.in_channel)g(->)g (Unix.sockaddr)227 2207 y Fg(as)30 b(ab)s(o)m(v)m(e)h(but)g(w)m(orks)g (on)f(in_c)m(hannels)0 2419 y Fh(val)47 b(sockname_of_out_channel)f(:)h (Pervasives.out_channel)g(->)g(Unix.sockaddr)227 2557 y Fg(giv)m(en)31 b(an)g(out_c)m(hannel)i(build)e(on)f(top)h(of)f(a)g (so)s(c)m(k)m(et,)h(return)g(so)s(c)m(kname)g(related)g(to)g(that)g(so) s(c)m(k)m(et)0 2770 y Fh(val)47 b(sockname_of_in_channel)f(:)h (Pervasives.in_channel)g(->)g(Unix.sockaddr)227 2907 y Fg(as)30 b(ab)s(o)m(v)m(e)h(but)g(w)m(orks)g(on)f(in_c)m(hannels)0 3120 y Fh(val)47 b(buf_of_inchan)g(:)g(?limit:int)f(->)h (Pervasives.in_channel)g(->)g(Buffer.t)227 3258 y Fg(reads)31 b(from)f(an)h(input)g(c)m(hannel)h(till)f(it)f(End_of_\034le)i(and)f (returns)g(what)g(has)f(b)s(een)g(read;)h(if)f(limit)h(is)227 3371 y(giv)m(en)g(returned)h(bu\033er)f(will)f(con)m(tains)i(at)e(most) h(\034rst)f('limit')i(b)m(ytes)e(read)h(from)f(input)h(c)m(hannel)0 3583 y Fh(val)47 b(list_assoc_all)g(:)g('a)f(->)h(\('a)g(*)g('b\))g (list)g(->)g('b)g(list)227 3721 y Fg(lik)m(e)31 b(List.asso)s(c)f(but)h (return)g(all)g(bindings)g(of)f(a)g(giv)m(en)h(k)m(ey)f(instead)h(of)f (the)h(leftmost)f(one)h(only)0 3934 y Fh(val)47 b(warn)g(:)g(string)g (->)g(unit)227 4071 y Fg(prin)m(t)32 b(a)e(w)m(arning)i(msg)e(to)h (stderr.)41 b(A)m(dds)30 b(trailing)i(\\n)0 4284 y Fh(val)47 b(error)g(:)g(string)g(->)f(unit)227 4422 y Fg(prin)m(t)32 b(an)e(error)h(msg)g(to)f(stderr.)41 b(A)m(dds)30 b(trailing)i(\\n)0 4634 y Fh(val)47 b(finally)g(:)g(\(unit)g(->)f(unit\))h(->)g(\('a)g(->) g('b\))g(->)g('a)g(->)g('b)1905 5400 y Fg(10)p eop end %%Page: 11 11 TeXDict begin 11 10 bop 0 91 a Fj(7)131 b(Mo)t(dule)44 b Fe(Http_parser)c Fj(:)58 b(HTTP)44 b(messages)e(parsing)0 437 y Fh(val)47 b(split_query_params)f(:)h(string)g(->)g(\(string)g(*)g (string\))g(list)227 575 y Fg(giv)m(en)31 b(an)g(HTTP)g(lik)m(e)g (query)f(string)g(\(e.g.)41 b("name1)p Fa(=)p Fg(v)-5 b(alue1&name2)p Fa(=)p Fg(v)g(alue2&)p Fb(:)15 b(:)g(:)5 b Fg("\))227 725 y Fi(Raises)336 913 y Fc(\017)46 b Fh(Malformed_query) 30 b Fg(if)g(the)h(string)f(isn't)h(a)f(v)-5 b(alid)31 b(query)f(string)336 1059 y Fc(\017)46 b Fh(Malformed_query_part)30 b Fg(if)g(some)g(piece)h(of)f(the)h(query)f(isn't)h(v)-5 b(alid)227 1247 y Fi(Returns)34 b Fg(a)d(list)f(of)g(pairs)g Fh(\("name1",)47 b("value1"\);)g(\("name2",)g("value2"\))0 1459 y(val)g(parse_request_fst_line)f(:)94 1572 y (Pervasives.in_channel)g(->)94 1685 y(Http_types.meth)h(*)g(Neturl.url) f(*)h(Http_types.version)g(option)227 1823 y Fg(parse)31 b(1st)f(line)h(of)f(an)g(HTTP)h(request)227 1973 y Fi(Raises)336 2161 y Fc(\017)46 b Fh(Malformed_request)30 b Fg(if)g(request)g(1st)g (linst)h(isn't)f(w)m(ell)i(formed)336 2307 y Fc(\017)46 b Fh(Malformed_request_URI)30 b Fg(if)g(requested)h(URI)e(isn't)h(w)m (ell)h(formed)227 2495 y Fi(Returns)j Fg(a)d(triple)g(meth)g(*)f(url)h (*)f(v)m(ersion,)h(meth)g(is)f(the)h(HTTP)g(metho)s(d)f(in)m(v)m(ok)m (ed,)j(url)d(is)g(the)227 2607 y(requested)h(url,)g(v)m(ersion)g(is)f (the)g(HTTP)h(v)m(ersion)g(sp)s(eci\034ed)g(or)f(None)h(if)f(no)g(v)m (ersion)h(w)m(as)g(sp)s(eci\034ed)0 2820 y Fh(val)47 b(parse_response_fst_line)f(:)94 2933 y(Pervasives.in_channel)g(->)h (Http_types.version)g(*)g(Http_types.status)227 3071 y Fg(parse)31 b(1st)f(line)h(of)f(an)g(HTTP)h(resp)s(onse)227 3221 y Fi(Raises)g Fh(Malformed_response)e Fg(if)h(\034rst)h(line)g (isn't)f(w)m(ell)h(formed)0 3434 y Fh(val)47 b(parse_query_get_params)f (:)h(Neturl.url)g(->)g(\(string)g(*)g(string\))g(list)227 3571 y Fg(parse)31 b(HTTP)g(GET)g(parameters)g(from)g(an)f(URL;)g (paramater)i(whic)m(h)g(w)m(ere)f(passed)f(with)h(no)g(v)-5 b(alue)227 3684 y(\(lik)m(e)31 b('x')f(in)h("/fo)s(o.cgi?a)p Fa(=)p Fg(10&x)p Fa(=)p Fg(&c)p Fa(=)p Fg(9"\))g(are)g(returned)g(asso) s(ciated)g(with)g(the)f(empt)m(y)h(\(""\))g(string.)227 3835 y Fi(Returns)j Fg(a)d(list)f(of)g(pairs)g(param_name)j(*)d (param_v)-5 b(alue)0 4047 y Fh(val)47 b(parse_path)g(:)g(Neturl.url)f (->)h(string)227 4185 y Fg(parse)31 b(the)g(base)f(path)h(\(remo)m (ving)h(query)e(string,)h(fragmen)m(t,)g Fb(:)15 b(:)g(:)q Fg(.\))41 b(from)30 b(an)h(URL)0 4397 y Fh(val)47 b(parse_headers)g(:)g (Pervasives.in_channel)f(->)h(\(string)g(*)g(string\))g(list)227 4535 y Fg(parse)31 b(HTTP)g(headers.)41 b(Consumes)31 b(also)f(trailing)h(CRLF)g(at)f(the)h(end)g(of)f(header)h(list)227 4685 y Fi(Raises)g Fh(Invalid_header)f Fg(if)f(a)i(not)g(w)m(ell)g (formed)g(header)g(is)f(encoun)m(tered)227 4836 y Fi(Returns)k Fg(a)d(list)f(of)g(pairs)g(header_name)j(*)d(header_v)-5 b(alue)0 5048 y Fh(val)47 b(parse_cookies)g(:)g(string)f(->)h(\(string) g(*)g(string\))g(list)1905 5400 y Fg(11)p eop end %%Page: 12 12 TeXDict begin 12 11 bop 227 91 a Fg(parse)31 b(a)f(Co)s(okie)g(header,) i(extracting)f(an)g(asso)s(ciativ)m(e)f(list)h Fb(<)p Fg(attribute)g(name,)g(attribute)h(v)-5 b(alue)p Fb(>)p Fg(.)40 b(See)227 204 y(RF)m(C)31 b(2965)227 348 y Fi(Raises)g Fh(Malformed_cookies)e Fg(if)h(ra)m(w_co)s(okies)i(do)s(es)e(not)g (conform)h(to)g(RF)m(C)f(2965)227 492 y Fi(Returns)k Fg(a)d(list)f(of)g(pairs)g(co)s(okie_name)i(*)e(co)s(okie_v)-5 b(alue)0 680 y Fh(val)47 b(parse_request)g(:)g(Pervasives.in_channel)f (->)h(string)g(*)g(\(string)g(*)g(string\))f(list)227 812 y Fg(giv)m(en)31 b(an)g(input)g(c)m(hannel,)h(reads)f(from)f(it)g (a)h(GET)g(HTTP)g(request)f(and)227 956 y Fi(Returns)k Fg(a)d(pair)f Fb(<)p Fg(path,)h(query_params)p Fb(>)g Fg(where)g(path)g(is)f(a)g(string)h(represen)m(ting)h(the)f(requested) 227 1069 y(path)g(and)g(query_params)g(is)f(a)g(list)h(of)f(pairs)g Fb(<)p Fg(name,)h(v)-5 b(alue)p Fb(>)30 b Fg(\(the)h(GET)g (parameters\))0 1405 y Fj(8)131 b(Mo)t(dule)68 b Fe(Http_parser_sanity) 63 b Fj(:)107 b(Sanit)l(y)70 b(test)f(functions)g(related)g(to)197 1555 y(HTTP)44 b(message)f(parsing)0 1895 y Fh(val)k(heal_header_name)g (:)f(string)h(->)g(unit)227 2026 y Fi(Raises)31 b Fh (Invalid_header_name)e Fg(if)h(name)h(isn't)g(a)f(v)-5 b(alid)31 b(HTTP)g(header)g(name)0 2214 y Fh(val)47 b (heal_header_value)f(:)h(string)g(->)g(unit)227 2346 y Fi(Raises)31 b Fh(Invalid_header_value)e Fg(if)h(v)-5 b(alue)31 b(isn't)f(a)h(v)-5 b(alid)30 b(HTTP)h(header)g(v)-5 b(alue)0 2533 y Fh(val)47 b(heal_header)g(:)g(string)f(*)h(string)g(->) g(unit)227 2665 y Fi(Raises)336 2840 y Fc(\017)f Fh (Invalid_header_name)30 b Fg(if)g(name)h(isn't)f(a)h(v)-5 b(alid)30 b(HTTP)h(header)g(name)336 2974 y Fc(\017)46 b Fh(Invalid_header_value)30 b Fg(if)g(v)-5 b(alue)30 b(isn't)h(a)f(v)-5 b(alid)31 b(HTTP)g(header)g(v)-5 b(alue)0 3205 y Fh(val)47 b(normalize_header_value)f(:)h(string)g(->)g(string) 227 3337 y Fg(remo)m(v)m(e)32 b(heading)g(and/or)f(trailing)g(L)-10 b(WS)31 b(sequences)f(as)g(p)s(er)h(RF)m(C2616)0 3525 y Fh(val)47 b(url_of_string)g(:)g(string)f(->)h(Neturl.url)227 3656 y Fg(parse)31 b(an)f(URL)g(from)h(a)f(string.)227 3800 y Fi(Raises)h Fh(Malformed_URL)f Fg(if)f(an)i(in)m(v)-5 b(alid)31 b(URL)f(is)g(encoun)m(tered)0 3988 y Fh(val)47 b(string_of_url)g(:)g(Neturl.url)f(->)h(string)227 4120 y Fg(prett)m(y)31 b(prin)m(t)h(an)f(URL)0 4456 y Fj(9)131 b(Mo)t(dule)41 b Fe(Http_request)d Fj(:)57 b(Ob)7 b(ject)42 b(Orien)l(ted)g(represen)l(tation)g(of)g(HTTP)197 4606 y(requests)0 4946 y Fh(class)47 b(request)g(:)g(Pervasives.in_channel)f (->)h(Http_types.request)227 5077 y Fg(OO)31 b(represen)m(tation)i(of)d (an)g(HTTP)h(request)1905 5400 y(12)p eop end %%Page: 13 13 TeXDict begin 13 12 bop 0 91 a Fj(10)131 b(Mo)t(dule)29 b Fe(Http_response)c Fj(:)50 b(Ob)7 b(ject)30 b(Orien)l(ted)g(represen) l(tation)g(of)f(HTTP)263 241 y(resp)t(onses)0 586 y Fh(class)47 b(response)g(:)g(?body:string)f(->)h(?headers:\(string)g(*)g(string\))g (list)g(->)f(?version:Http_types.version)h(->)g (?clisockaddr:Unix.sockaddr)f(->)h(?srvsockaddr:Unix.sockaddr)f(->)h (?code:int)g(->)g(?status:Http_types.status)f(->)h(unit)g(->)g (Http_types.response)227 724 y Fg(OO)31 b(represen)m(tation)i(of)d(an)g (HTTP)h(resp)s(onse.)0 1084 y Fj(11)131 b(Mo)t(dule)58 b Fe(Http_tcp_server)c Fj(:)88 b(TCP)59 b(serv)l(ers)g(used)g(as)f(lo)l (w-lev)l(els)j(for)263 1233 y(HTTP)44 b(daemons)0 1557 y Fd(11.1)112 b(serv)m(ers)0 1754 y Fh(val)47 b(simple)g(:)g (Http_types.tcp_server)227 1891 y Fg(single)31 b(pro)s(cess)f(serv)m (er)0 2102 y Fh(val)47 b(thread)g(:)g(Http_types.tcp_server)227 2240 y Fg(m)m(ulti)32 b(threaded)f(serv)m(er)0 2451 y Fh(val)47 b(fork)g(:)g(Http_types.tcp_server)227 2589 y Fg(m)m(ulti)32 b(pro)s(cess)e(serv)m(er)0 2906 y Fd(11.2)112 b(lo)m(w)37 b(lev)m(el)e(functions)0 3102 y Fh(val)47 b(init_socket)g(:)g(Unix.sockaddr)f(->)h(Unix.file_descr)227 3239 y Fg(initialize)32 b(a)e(passiv)m(e)h(so)s(c)m(k)m(et)f(listening) i(on)e(giv)m(en)h(Unix.so)s(c)m(k)-5 b(addr)0 3599 y Fj(12)131 b(Mo)t(dule)29 b Fe(Http_threaded_tcp_s)o(erve)o(r)23 b Fj(:)51 b(Multithreaded)30 b(part)f(of)g(Http_tcp_serv)l(er)0 3945 y Fh(val)47 b(serve)g(:)g(\('a)g(->)g('b\))f(->)h('a)g(->)g(unit) 227 4082 y Fg(serv)m(e)31 b(an)f(HTTP)h(request)g(for)f(a)g(m)m(ulti)i (threaded)f(TCP)h(serv)m(er)0 4442 y Fj(13)131 b(Mo)t(dule)43 b Fe(Http_types)e Fj(:)58 b(T)l(yp)t(e)44 b(de\034nitions)0 4788 y Fh(type)j(version)g(=)g([)g(`HTTP_1_0)f(|)h(`HTTP_1_1)g(])227 4925 y Fg(HTTP)31 b(v)m(ersion,)g(actually)g(only)g(1.0)f(and)h(1.1)g (are)f(supp)s(orted.)41 b(Note)31 b(that)g('supp)s(orted')g(here)g (means)227 5038 y(only)e('accepted)i(inside)e(a)g(HTTP)g(request)g (line',)h(no)g(di\033eren)m(t)g(b)s(eha)m(viours)f(are)h(actually)f (implemen)m(ted)227 5151 y(dep)s(ending)j(on)e(HTTP)h(v)m(ersion)1905 5400 y(13)p eop end %%Page: 14 14 TeXDict begin 14 13 bop 0 91 a Fh(type)47 b(meth)g(=)g([)g(`GET)g(|)g (`POST)f(])227 229 y Fg(HTTP)31 b(metho)s(d,)g(actually)g(only)g(GET)f (and)h(POST)h(metho)s(ds)e(are)h(supp)s(orted)0 442 y Fh(type)47 b(daemon_mode)g(=)g([)g(`Fork)f(|)h(`Single)g(|)g(`Thread)g (])227 579 y Fg(Daemon)32 b(b)s(eha)m(viour)f(wrt)g(request)f (handling.)42 b(`Single)31 b(mo)s(de)g(use)f(a)g(single)h(pro)s(cess)f (to)g(handle)i(all)227 692 y(requests,)e(no)h(request)f(is)g(serv)m(ed) h(un)m(til)h(a)e(previous)g(one)h(has)f(b)s(een)h(fully)f(serv)m(ed.)41 b(`F)-8 b(ork)30 b(mo)s(de)h(fork)f(a)227 805 y(new)h(pro)s(cess)f(for) g(eac)m(h)i(request,)e(the)h(new)g(pro)s(cess)e(will)i(execute)g(the)g (callbac)m(k)g(function)g(and)g(then)227 918 y(exit.)41 b(`Thread)31 b(mo)s(de)g(create)g(a)f(new)h(thread)g(for)g(eac)m(h)g (request,)f(the)h(new)g(thread)g(will)g(execute)g(the)227 1031 y(callbac)m(k)h(function)f(and)g(then)g(exit,)f(threads)h(can)g (comm)m(unicate)i(using)d(standard)h(OCaml)h(Thread)227 1144 y(library)-8 b(.)0 1357 y Fh(type)47 b(tcp_server)g(=)g (sockaddr:Unix.sockaddr)f(->)94 1469 y(timeout:int)h(option)g(->)94 1582 y(\(Pervasives.in_channel)f(->)h(Pervasives.out_channel)g(->)g (unit\))g(->)g(unit)227 1720 y Fg(A)30 b(TCP)h(serv)m(er)g(is)f(a)g (function)h(taking)g(an)g(address)f(on)h(whic)m(h)g(bind)g(and)g (listen)g(for)f(connections,)h(an)227 1833 y(optional)h(timeout)f (after)g(whic)m(h)g(ab)s(ort)g(clien)m(t)h(connections)f(and)g(a)f (callbac)m(k)i(function)f(whic)m(h)h(in)e(turn)227 1946 y(tak)m(es)h(an)f(input)h(and)g(an)g(output)g(c)m(hannel)h(as)e (argumen)m(ts.)42 b(After)30 b(receiving)h(this)g(argumen)m(t)h(a)e (TCP)227 2059 y(serv)m(er)h(sits)f(and)g(w)m(aits)i(for)e(connection,)i (on)e(eac)m(h)i(connection)g(it)e(apply)h(the)f(callbac)m(k)i(function) f(to)227 2172 y(c)m(hannels)h(connected)g(to)e(clien)m(t.)0 2384 y Fh(type)47 b(auth_info)g(=)g([)g(`Basic)f(of)h(string)g(*)g (string)g(])227 2522 y Fg(authen)m(tication)33 b(information)0 2735 y Fh(type)47 b(informational_substatus)f(=)h([)g(`Continue)g(|)g (`Switching_protocols)f(])227 2873 y Fi(See)36 b(also)30 b Ff(RF)n(C2616)f Fg(informational)j(HTTP)f(status)0 3085 y Fh(type)47 b(success_substatus)f(=)h([)g(`Accepted)94 3198 y(|)g(`Created)94 3311 y(|)g(`No_content)94 3424 y(|)g(`Non_authoritative_information)94 3537 y(|)g(`OK)94 3650 y(|)g(`Partial_content)94 3763 y(|)g(`Reset_content)g(])227 3900 y Fi(See)36 b(also)30 b Ff(RF)n(C2616)f Fg(success)h(HTTP)h (status)0 4113 y Fh(type)47 b(redirection_substatus)f(=)h([)g(`Found)94 4226 y(|)g(`Moved_permanently)94 4339 y(|)g(`Multiple_choices)94 4452 y(|)g(`Not_modified)94 4565 y(|)g(`See_other)94 4677 y(|)g(`Temporary_redirect)94 4790 y(|)g(`Use_proxy)g(])227 4928 y Fi(See)36 b(also)30 b Ff(RF)n(C2616)f Fg(redirection)j(HTTP)f (status)1905 5400 y(14)p eop end %%Page: 15 15 TeXDict begin 15 14 bop 0 91 a Fh(type)47 b(client_error_substatus)f(=) h([)g(`Bad_request)94 204 y(|)g(`Conflict)94 317 y(|)g (`Expectation_failed)94 430 y(|)g(`Forbidden)94 543 y(|)g(`Gone)94 656 y(|)g(`Length_required)94 769 y(|)g(`Method_not_allowed)94 882 y(|)g(`Not_acceptable)94 995 y(|)g(`Not_found)94 1108 y(|)g(`Payment_required)94 1220 y(|)g(`Precondition_failed)94 1333 y(|)g(`Proxy_authentication_required)94 1446 y(|)g (`Request_URI_too_large)94 1559 y(|)g(`Request_entity_too_large)94 1672 y(|)g(`Request_time_out)94 1785 y(|)g (`Requested_range_not_satisfiable)94 1898 y(|)g(`Unauthorized)94 2011 y(|)g(`Unsupported_media_type)f(])227 2143 y Fi(See)36 b(also)30 b Ff(RF)n(C2616)f Fg(clien)m(t)j(error)f(HTTP)g(status)0 2334 y Fh(type)47 b(server_error_substatus)f(=)h([)g(`Bad_gateway)94 2447 y(|)g(`Gateway_time_out)94 2560 y(|)g(`HTTP_version_not_supported) 94 2673 y(|)g(`Internal_server_error)94 2786 y(|)g(`Not_implemented)94 2899 y(|)g(`Service_unavailable)f(])227 3031 y Fi(See)36 b(also)30 b Ff(RF)n(C2616)f Fg(serv)m(er)i(error)g(HTTP)g(status)0 3223 y Fh(type)47 b(informational_status)f(=)h([)g(`Informational)g(of) g(informational_substatus)f(])0 3355 y(type)h(success_status)g(=)f([)h (`Success)g(of)g(success_substatus)g(])0 3488 y(type)g (redirection_status)f(=)h([)g(`Redirection)g(of)g (redirection_substatus)f(])0 3620 y(type)h(client_error_status)f(=)h([) g(`Client_error)g(of)g(client_error_substatus)f(])0 3752 y(type)h(server_error_status)f(=)h([)g(`Server_error)g(of)g (server_error_substatus)f(])0 3885 y(type)h(error_status)g(=)g([)f (`Client_error)h(of)g(client_error_substatus)94 3998 y(|)g(`Server_error)g(of)g(server_error_substatus)f(])0 4130 y(type)h(status)g(=)g([)g(`Client_error)f(of)h (client_error_substatus)94 4243 y(|)g(`Informational)g(of)f (informational_substatus)94 4356 y(|)h(`Redirection)g(of)g (redirection_substatus)94 4469 y(|)g(`Server_error)g(of)g (server_error_substatus)94 4582 y(|)g(`Success)g(of)g (success_substatus)f(])227 4714 y Fg(HTTP)31 b(status)0 4906 y Fh(type)47 b(status_code)g(=)g([)g(`Code)f(of)h(int)g(|)g (`Status)g(of)g(status)g(])0 5038 y(type)g(file_source)g(=)94 5151 y(|)g(FileSrc)g(of)g(string)1905 5400 y Fg(15)p eop end %%Page: 16 16 TeXDict begin 16 15 bop 485 91 a Fg(\034lename)94 251 y Fh(|)47 b(InChanSrc)g(of)g(Pervasives.in_channel)485 388 y Fg(input)31 b(c)m(hannel)227 524 y(File)g(sources)0 837 y Fd(13.1)112 b(Exceptions)0 1032 y Fh(exception)47 b(Invalid_header)f(of)h(string)227 1168 y Fg(in)m(v)-5 b(alid)32 b(header)f(encoun)m(tered)0 1375 y Fh(exception)47 b(Invalid_header_name)f(of)h(string)227 1511 y Fg(in)m(v)-5 b(alid)32 b(header)f(name)g(encoun)m(tered)0 1718 y Fh(exception)47 b(Invalid_header_value)f(of)h(string)227 1855 y Fg(in)m(v)-5 b(alid)32 b(header)f(v)-5 b(alue)30 b(encoun)m(tered)0 2061 y Fh(exception)47 b(Invalid_HTTP_version)f(of)h(string)227 2198 y Fg(unsupp)s(orted)32 b(or)e(in)m(v)-5 b(alid)31 b(HTTP)g(v)m(ersion)g(encoun)m(tered)0 2405 y Fh(exception)47 b(Invalid_HTTP_method)f(of)h(string)227 2541 y Fg(unsupp)s(orted)32 b(or)e(in)m(v)-5 b(alid)31 b(HTTP)g(metho)s(d)g(encoun)m(tered)0 2748 y Fh(exception)47 b(Invalid_code)f(of)h(int)227 2884 y Fg(in)m(v)-5 b(alid)32 b(HTTP)f(status)f(co)s(de)g(in)m(teger)i (represen)m(tation)h(encoun)m(tered)0 3091 y Fh(exception)47 b(Malformed_URL)f(of)h(string)227 3228 y Fg(in)m(v)-5 b(alid)32 b(URL)d(encoun)m(tered)0 3435 y Fh(exception)47 b(Malformed_query)f(of)h(string)227 3571 y Fg(in)m(v)-5 b(alid)32 b(query)e(string)g(encoun)m(tered)0 3778 y Fh(exception)47 b(Malformed_query_part)f(of)h(string)g(*)g(string)227 3914 y Fg(in)m(v)-5 b(alid)32 b(query)e(string)g(part)h(encoun)m (tered,)i(argumen)m(ts)f(are)f(parameter)h(name)f(and)f(parameter)i(v) -5 b(alue)0 4121 y Fh(exception)47 b(Malformed_request_URI)f(of)h (string)227 4258 y Fg(in)m(v)-5 b(alid)32 b(request)e(URI)f(encoun)m (tered)0 4464 y Fh(exception)47 b(Malformed_cookies)f(of)h(string)227 4601 y Fg(malformed)32 b(co)s(okies)0 4808 y Fh(exception)47 b(Malformed_request)f(of)h(string)227 4944 y Fg(malformed)32 b(request)e(receiv)m(ed)0 5151 y Fh(exception)47 b(Malformed_response)f (of)h(string)1905 5400 y Fg(16)p eop end %%Page: 17 17 TeXDict begin 17 16 bop 227 91 a Fg(malformed)32 b(resp)s(onse)e (receiv)m(ed,)i(argumen)m(t)g(is)e(resp)s(onse's)g(\034rst)g(line)0 299 y Fh(exception)47 b(Param_not_found)f(of)h(string)227 436 y Fg(a)31 b(parameter)h(y)m(ou)e(w)m(ere)i(lo)s(oking)e(for)g(w)m (as)h(not)g(found)0 643 y Fh(exception)47 b(Invalid_status_line)f(of)h (string)227 780 y Fg(in)m(v)-5 b(alid)32 b(HTTP)f(status)f(line)g (encoun)m(tered)0 987 y Fh(exception)47 b(Header_not_found)f(of)h (string)227 1124 y Fg(an)31 b(header)g(y)m(ou)g(w)m(ere)g(lo)s(oking)g (for)f(w)m(as)h(not)f(found)0 1332 y Fh(exception)47 b(Quit)227 1468 y Fg(raisable)31 b(b)m(y)g(callbac)m(ks)g(to)g(mak)m(e) g(main)g(daemon)g(quit,)f(this)h(is)f(the)g(only)h('clean')g(w)m(a)m(y) g(to)g(mak)m(e)g(start)227 1581 y(functions)g(return)0 1789 y Fh(exception)47 b(Unauthorized)f(of)h(string)227 1925 y Fg(raisable)31 b(b)m(y)g(callbac)m(ks)g(to)g(force)f(a)g(401)h (\(unauthorized\))i(HTTP)e(answ)m(er.)41 b(This)31 b(exception)g (should)g(b)s(e)227 2038 y(raised)g(_b)s(efore_)g(sending)g(an)m(y)f (data)h(o)m(v)m(er)h(giv)m(en)f(out)f(c)m(hannel.)0 2352 y Fd(13.2)112 b(OO)38 b(represen)m(tation)f(of)g(HTTP)g(messages)0 2547 y Fh(class)47 b(type)g(message)g(=)90 2660 y(object)227 2829 y(method)g(version)g(:)g(Http_types.version)f(option)227 2965 y(method)h(setVersion)g(:)g(Http_types.version)f(->)h(unit)227 3102 y(method)g(body)g(:)g(string)227 3239 y(method)g(setBody)g(:)g (string)g(->)g(unit)227 3375 y(method)g(bodyBuf)g(:)g(Buffer.t)227 3512 y(method)g(setBodyBuf)g(:)g(Buffer.t)g(->)g(unit)227 3648 y(method)g(addBody)g(:)g(string)g(->)g(unit)227 3785 y(method)g(addBodyBuf)g(:)g(Buffer.t)g(->)g(unit)227 3922 y(method)g(addHeader)g(:)g(name:string)g(->)f(value:string)h(->)g (unit)227 4058 y(method)g(addHeaders)g(:)g(\(string)g(*)g(string\))f (list)h(->)g(unit)227 4195 y(method)g(replaceHeader)g(:)g(name:string)f (->)h(value:string)g(->)g(unit)227 4331 y(method)g(replaceHeaders)g(:)g (\(string)g(*)f(string\))h(list)g(->)g(unit)227 4468 y(method)g(removeHeader)g(:)g(name:string)f(->)h(unit)227 4605 y(method)g(hasHeader)g(:)g(name:string)g(->)f(bool)227 4741 y(method)h(header)g(:)g(name:string)g(->)g(string)227 4878 y(method)g(headers)g(:)g(\(string)g(*)g(string\))f(list)227 5014 y(method)h(clientSockaddr)g(:)g(Unix.sockaddr)227 5151 y(method)g(clientAddr)g(:)g(string)1905 5400 y Fg(17)p eop end %%Page: 18 18 TeXDict begin 18 17 bop 227 91 a Fh(method)47 b(clientPort)g(:)g(int) 227 229 y(method)g(serverSockaddr)g(:)g(Unix.sockaddr)227 367 y(method)g(serverAddr)g(:)g(string)227 505 y(method)g(serverPort)g (:)g(int)227 643 y(method)g(toString)g(:)g(string)227 780 y(method)g(serialize)g(:)g(Pervasives.out_channel)f(->)h(unit)90 931 y(end)227 1118 y Fg(HTTP)31 b(generic)h(messages.)40 b(See)31 b Fh(Http_message.message)p Fg([5])0 1331 y Fh(class)47 b(type)g(request)g(=)90 1444 y(object)227 1631 y(inherit)g(Http_types.message)30 b Fg([13.2])227 1782 y(an)h(HTTP)g(request)f(is)g(a)g(\035a)m(v)m(our)i(of)e(HTTP)h (message)227 1919 y Fh(method)47 b(meth)g(:)g(Http_types.meth)427 2095 y Fi(Returns)34 b Fg(request)d(metho)s(d)227 2307 y Fh(method)47 b(uri)g(:)g(string)427 2482 y Fi(Returns)34 b Fg(requested)d(URI)e(\(including)j(query)e(string,)h(fragmen)m(t,)h Fb(:)15 b(:)g(:)q Fg(\))227 2695 y Fh(method)47 b(path)g(:)g(string)427 2870 y Fi(Returns)34 b Fg(requested)d(path)227 3083 y Fh(method)47 b(param)g(:)g(?meth:Http_types.meth)f(->)h (?default:string)g(->)g(string)g(->)g(string)427 3258 y Fg(lo)s(okup)31 b(a)f(giv)m(en)h(parameter)427 3387 y Fi(Raises)g Fh(Param_not_found)f Fg(if)f(parameter)j(name)f(w)m(as)g (not)g(found)427 3517 y Fi(Returns)j Fg(v)-5 b(alue)31 b(asso)s(ciated)f(to)h(parameter)h(name)227 3729 y Fh(method)47 b(paramAll)g(:)g(?meth:Http_types.meth)f(->)h(string)g(->)g(string)g (list)427 3905 y Fg(lik)m(e)31 b(param)g(ab)s(o)m(v)m(e)g(but)g(return) g(a)g(list)f(of)g(v)-5 b(alues)30 b(asso)s(ciated)g(to)h(giv)m(en)g (parameter)h(\(a)e(parameter)427 4017 y(could)h(b)s(e)f(de\034ned)i (indeed)f(more)g(than)g(once:)41 b(passed)30 b(more)h(than)g(once)g(in) g(a)f(query)g(string)h(or)427 4130 y(passed)g(b)s(oth)f(insider)h(the)f (url)h(\(the)g(GET)g(w)m(a)m(y\))g(and)g(inside)g(message)f(b)s(o)s(dy) g(\(the)h(POST)g(w)m(a)m(y\)\))227 4343 y Fh(method)47 b(params)g(:)g(\(string)g(*)g(string\))f(list)427 4518 y Fi(Returns)34 b Fg(the)d(list)f(of)g(all)h(receiv)m(ed)g(parameters) 227 4731 y Fh(method)47 b(params_GET)g(:)g(\(string)g(*)g(string\))f (list)427 4906 y Fi(Returns)34 b Fg(the)d(list)f(of)g(all)h(parameters) g(receiv)m(ed)h(via)e(GET)227 5118 y Fh(method)47 b(params_POST)g(:)g (\(string)g(*)g(string\))f(list)1905 5400 y Fg(18)p eop end %%Page: 19 19 TeXDict begin 19 18 bop 427 91 a Fi(Returns)34 b Fg(the)d(list)f(of)g (all)h(parameter)h(receiv)m(ed)f(via)f(POST)227 304 y Fh(method)47 b(cookies)g(:)g(\(string)g(*)g(string\))f(list)h(option) 227 442 y(method)g(authorization)g(:)g(Http_types.auth_info)f(option) 427 617 y Fi(Returns)34 b Fg(authorization)f(information,)f(if)d(giv)m (en)i(b)m(y)g(the)g(clien)m(t)90 842 y Fh(end)227 1029 y Fg(HTTP)g(requests)0 1242 y Fh(class)47 b(type)g(response)g(=)90 1355 y(object)227 1543 y(inherit)g(Http_types.message)30 b Fg([13.2])227 1680 y Fh(method)47 b(code)g(:)g(int)427 1856 y Fi(Returns)34 b Fg(resp)s(onse)c(co)s(de)227 2068 y Fh(method)47 b(setCode)g(:)g(int)g(->)g(unit)427 2243 y Fg(set)30 b(resp)s(onse)h(co)s(de)227 2456 y Fh(method)47 b(status)g(:)g(Http_types.status)427 2631 y Fi(Returns)34 b Fg(resp)s(onse)c(status)227 2844 y Fh(method)47 b(setStatus)g(:)g (Http_types.status)f(->)h(unit)427 3019 y Fg(set)30 b(resp)s(onse)h (status)227 3231 y Fh(method)47 b(reason)g(:)g(string)427 3406 y Fi(Returns)34 b Fg(reason)d(string)227 3619 y Fh(method)47 b(setReason)g(:)g(string)g(->)g(unit)427 3794 y Fg(set)30 b(reason)h(string)227 4007 y Fh(method)47 b(statusLine)g(:)g(string)427 4182 y Fi(Returns)34 b Fg(status)c(line)227 4394 y Fh(method)47 b(setStatusLine)g(:)g(string)g (->)g(unit)427 4570 y Fg(set)30 b(status)h(line)427 4699 y Fi(Raises)g Fh(Invalid_status_line)e Fg(if)h(an)h(in)m(v)-5 b(alid)31 b(HTTP)g(status)f(line)h(w)m(as)g(passed)227 4912 y Fh(method)47 b(isInformational)g(:)g(bool)427 5087 y Fg(resp)s(onse)30 b(is)g(an)h(informational)h(one)1905 5400 y(19)p eop end %%Page: 20 20 TeXDict begin 20 19 bop 227 91 a Fh(method)47 b(isSuccess)g(:)g(bool) 427 264 y Fg(resp)s(onse)30 b(is)g(a)h(success)f(one)227 471 y Fh(method)47 b(isRedirection)g(:)g(bool)427 643 y Fg(resp)s(onse)30 b(is)g(a)h(redirection)h(one)227 850 y Fh(method)47 b(isClientError)g(:)g(bool)427 1023 y Fg(resp)s(onse)30 b(is)g(a)h(clien)m(t)g(error)g(one)227 1230 y Fh(method)47 b(isServerError)g(:)g(bool)427 1402 y Fg(resp)s(onse)30 b(is)g(a)h(serv)m(er)f(error)h(one)227 1609 y Fh(method)47 b(isError)g(:)g(bool)427 1782 y Fg(resp)s(onse)30 b(is)g(either)h(a)g(clien)m(t)g(error)g(or)g(a)f(serv)m(er)h(error)g (resp)s(onse)227 1989 y Fh(method)47 b(addBasicHeaders)g(:)g(unit)427 2161 y Fg(add)31 b(basic)g(headers)g(to)f(resp)s(onse,)g(see)g Fh(Http_daemon.send_basic_headers)p Fg([4])227 2507 y Fi(13.2.1)104 b(facilities)35 b(to)g(access)h(some)e(frequen)m(tly)g (used)h(headers)227 2702 y Fh(method)47 b(contentType)g(:)g(string)427 2874 y Fi(Returns)34 b Fg(Con)m(ten)m(t-T)m(yp)s(e)f(header)f(v)-5 b(alue)227 3081 y Fh(method)47 b(setContentType)g(:)g(string)g(->)f (unit)427 3254 y Fg(set)30 b(Con)m(ten)m(t-T)m(yp)s(e)j(header)f(v)-5 b(alue)227 3461 y Fh(method)47 b(contentEncoding)g(:)g(string)427 3633 y Fi(Returns)34 b Fg(Con)m(ten)m(t-Enco)s(ding)g(header)e(v)-5 b(alue)227 3840 y Fh(method)47 b(setContentEncoding)g(:)g(string)f(->)h (unit)427 4013 y Fg(set)30 b(Con)m(ten)m(t-Enco)s(ding)k(header)e(v)-5 b(alue)227 4220 y Fh(method)47 b(date)g(:)g(string)427 4392 y Fi(Returns)34 b Fg(Date)d(header)g(v)-5 b(alue)227 4599 y Fh(method)47 b(setDate)g(:)g(string)g(->)g(unit)427 4771 y Fg(set)30 b(Date)h(header)g(v)-5 b(alue)227 4979 y Fh(method)47 b(expires)g(:)g(string)427 5151 y Fi(Returns)34 b Fg(Expires)d(header)g(v)-5 b(alue)1905 5400 y(20)p eop end %%Page: 21 21 TeXDict begin 21 20 bop 227 91 a Fh(method)47 b(setExpires)g(:)g (string)g(->)g(unit)427 265 y Fg(set)30 b(Expires)h(header)g(v)-5 b(alue)227 474 y Fh(method)47 b(server)g(:)g(string)427 648 y Fi(Returns)34 b Fg(Serv)m(er)d(header)h(v)-5 b(alue)227 858 y Fh(method)47 b(setServer)g(:)g(string)g(->)g(unit)427 1031 y Fg(set)30 b(Serv)m(er)i(header)f(v)-5 b(alue)227 1241 y Fh(method)47 b(connection)g(:)g(string)427 1414 y Fi(Returns)34 b Fg(Connection)e(header)g(v)-5 b(alue)227 1624 y Fh(method)47 b(setConnection)g(:)g(string)g(->)g(unit)427 1798 y Fg(set)30 b(Connection)j(header)e(v)-5 b(alue)90 2019 y Fh(end)227 2205 y Fg(HTTP)31 b(resp)s(onses)0 2520 y Fd(13.3)112 b(Daemon)38 b(sp)s(eci\034cation)0 2716 y Fh(type)47 b(daemon_spec)g(=)g({)94 2829 y(address)g(:)g(string) g(;)94 2941 y(auth)g(:)g(\(string)g(*)g(auth_info\))f(option)h(;)485 3079 y Fg(authen)m(tication)33 b(requiremen)m(ts)f(\(curren)m(tly)g (only)e(basic)h(authen)m(tication)i(is)d(supp)s(orted\).)41 b(If)29 b(set)455 3191 y(to)h(None)h(no)f(authen)m(tication)j(is)d (required.)41 b(If)30 b(set)g(to)g(Some)h(\("realm",)h(`Basic)f(\("fo)s (o",)f("bar"\)\),)455 3304 y(only)g(clien)m(ts)h(authen)m(ticated)i (with)e(baisc)g(authen)m(tication,)i(for)d(realm)h("realm",)h(pro)m (viding)455 3417 y(username)f("fo)s(o")f(and)h(passw)m(ord)g("bar")g (are)g(accepted;)g(others)g(are)g(rejected)g(with)g(a)f(401)455 3530 y(resp)s(onse)g(co)s(de)94 3691 y Fh(callback)47 b(:)g(request)g(->)f(Pervasives.out_channel)h(->)g(unit)g(;)485 3828 y Fg(function)31 b(whic)m(h)g(will)g(b)s(e)f(called)h(eac)m(h)h (time)f(a)f(correct)h(HTTP)g(request)g(will)f(b)s(e)h(receiv)m(ed.)41 b(1st)455 3941 y(callbac)m(k)31 b(argumen)m(t)h(is)e(an)h(Http_t)m(yp)s (es.request)g(ob)5 b(ject)31 b(corresp)s(onding)g(to)g(the)f(request) 455 4054 y(receiv)m(ed;)h(2nd)g(argumen)m(t)h(is)e(an)h(output)g(c)m (hannel)h(corresp)s(onding)g(to)e(the)h(so)s(c)m(k)m(et)f(connected)i (to)455 4167 y(the)e(clien)m(t)94 4328 y Fh(mode)47 b(:)g(daemon_mode)g (;)485 4465 y Fg(requests)30 b(handling)h(mo)s(de,)g(it)f(can)h(ha)m(v) m(e)h(three)f(di\033eren)m(t)g(v)-5 b(alues:)564 4652 y Fc(\017)46 b Fg(`Single)31 b Fc(!)f Fg(all)g(requests)h(will)f(b)s(e) g(handled)i(b)m(y)e(the)h(same)g(pro)s(cess,)564 4796 y Fc(\017)46 b Fg(`F)-8 b(ork)30 b Fc(!)g Fg(eac)m(h)i(request)e(will)h (b)s(e)f(handled)i(b)m(y)e(a)g(c)m(hild)i(pro)s(cess,)564 4941 y Fc(\017)46 b Fg(`Thread)31 b Fc(!)f Fg(eac)m(h)h(request)g(will) g(b)s(e)f(handled)h(b)m(y)g(a)f(\(new\))h(thread)94 5151 y Fh(port)47 b(:)g(int)g(;)1905 5400 y Fg(21)p eop end %%Page: 22 22 TeXDict begin 22 21 bop 485 91 a Fg(TCP)31 b(p)s(ort)f(on)h(whic)m(h)g (the)g(daemon)h(will)e(b)s(e)g(listening)94 254 y Fh(root_dir)47 b(:)g(string)g(option)f(;)485 392 y Fg(directory)31 b(to)f(whic)m(h)i (o)s(caml)f(h)m(ttp)g(will)g(c)m(hdir)g(b)s(efore)g(starting)g (handling)g(requests;)f(if)g(None,)h(no)455 505 y(c)m(hdir)g(will)g(b)s (e)f(p)s(erformed)h(\(i.e.)41 b(sta)m(y)30 b(in)h(the)f(curren)m(t)i(w) m(orking)g(directory\))94 667 y Fh(exn_handler)47 b(:)g(\(exn)g(->)f (Pervasives.out_channel)h(->)g(unit\))g(option)g(;)483 805 y Fg(what)30 b(to)f(do)h(when)f(executing)h(callbac)m(k)g(raises)f (an)h(exception.)41 b(If)28 b(None,)h(the)h(exception)g(will)f(b)s(e) 455 918 y(re-raised:)41 b(in)30 b(`F)-8 b(ork/`Thread)33 b(mo)s(de)d(the)h(curren)m(t)h(pro)s(cess/thread)f(will)g(b)s(e)f (terminated.)42 b(in)455 1031 y(`Single)31 b(mo)s(de)f(the)h(exception) g(is)f(ignored)i(and)f(the)f(clien)m(t)i(so)s(c)m(k)m(et)f(closed.)40 b(If)30 b(Some)h(callbac)m(k,)455 1144 y(the)f(callbac)m(k)i(will)f(b)s (e)f(executed)h(b)s(efore)f(acting)h(as)f(p)s(er)g(None;)h(the)g (callbac)m(k)g(is)f(mean)m(t)i(to)455 1257 y(p)s(erform)e(some)h(clean) g(up)f(actions,)h(lik)m(e)g(releasing)g(global)g(m)m(utexes)g(in)g (`Thread)g(mo)s(de)94 1420 y Fh(timeout)47 b(:)g(int)g(option)f(;)485 1557 y Fg(timeout)31 b(in)g(seconds)f(after)h(whic)m(h)g(an)g(incoming) g(HTTP)g(request)g(will)g(b)s(e)f(terminated)i(closing)455 1670 y(the)e(corresp)s(onding)i(TCP)f(connection;)h(None)f(disable)f (the)h(timeout)94 1833 y Fh(auto_close)47 b(:)g(bool)g(;)485 1971 y Fg(whether)31 b(o)s(caml-h)m(ttp)h(will)f(automatically)h(close) f(the)f(connection)i(with)f(the)g(clien)m(t)g(after)455 2084 y(callbac)m(k)g(has)f(completed)i(its)e(execution.)42 b(If)29 b(set)h(to)h(true,)g(close)f(will)h(b)s(e)f(attempted)i(no)f (matter)455 2197 y(if)e(the)i(callbac)m(k)h(raises)e(an)g(exception)i (or)e(not)0 2359 y Fh(})227 2497 y Fg(daemon)i(sp)s(eci\034cation,)f (describ)s(e)g(the)f(b)s(eha)m(viour)i(of)e(an)g(HTTP)h(daemon.)227 2648 y(The)g(default)g(daemon)g(sp)s(eci\034cation)h(is)e Fh(Http_daemon.default_spec)p Fg([4])0 2966 y Fd(13.4)112 b(OO)38 b(represen)m(tation)f(of)g(other)h(HTTP)e(en)m(tities)0 3162 y Fh(class)47 b(type)g(connection)f(=)90 3275 y(object)227 3450 y(method)h(getRequest)g(:)g(Http_types.request)f(option)427 3625 y Fi(Returns)34 b Fg(next)d(request)f(ob)5 b(ject,)31 b(ma)m(y)g(blo)s(c)m(k)f(if)g(clien)m(t)i(hasn't)f(submitted)g(an)m(y)g (request)f(y)m(et,)427 3738 y(ma)m(y)h(b)s(e)f(None)h(if)f(clien)m(t)h (request)g(w)m(as)f(ill-formed)227 3951 y Fh(method)47 b(respond_with)g(:)g(Http_types.response)f(->)h(unit)427 4126 y Fg(resp)s(ond)31 b(to)f(clien)m(t)i(sending)f(it)f(a)h(resp)s (onse)227 4339 y Fh(method)47 b(close)g(:)g(unit)427 4514 y Fg(close)31 b(connection)h(to)e(clien)m(t.)42 b(W)-8 b(arning:)42 b(this)30 b(ob)5 b(ject)31 b(can't)g(b)s(e)f(used)g (an)m(y)h(longer)g(after)g(this)427 4627 y(metho)s(d)g(has)f(b)s(een)h (called)90 4852 y Fh(end)227 5039 y Fg(an)g(HTTP)g(connection)h(from)e (a)h(clien)m(t)g(to)g(a)f(serv)m(er)1905 5400 y(22)p eop end %%Page: 23 23 TeXDict begin 23 22 bop 0 91 a Fh(class)47 b(type)g(daemon)g(=)90 204 y(object)227 379 y(method)g(accept)g(:)g(Http_types.connection)427 555 y Fi(Returns)34 b Fg(a)d(connection)h(to)e(a)g(clien)m(t,)i(ma)m(y) f(blo)s(c)m(k)g(if)e(no)i(clien)m(t)h(has)e(connected)i(y)m(et)227 767 y Fh(method)47 b(getRequest)g(:)g(Http_types.request)f(*)h (Http_types.connection)427 942 y Fg(shortcut)31 b(metho)s(d,)g(blo)s(c) m(ks)g(un)m(til)g(a)f(clien)m(t)i(has)e(submit)h(a)f(request)h(and)g (return)g(a)f(pair)h(request)f(*)427 1055 y(connection)90 1280 y Fh(end)227 1468 y Fg(an)h(HTTP)g(daemon)0 1829 y Fj(14)131 b(Mo)t(dule)33 b Fe(Http_user_agent)28 b Fj(:)53 b(Minimal)34 b(implemen)l(tation)g(of)f(an)h(HTTP)263 1978 y(1.0/1.1)42 b(clien)l(t.)0 2181 y Fg(In)m(terface)23 b(is)f(similar)g(to)g(Gerd)h(Stoplmann's)g(Http_clien)m(t)h(mo)s(dule.) 38 b(Implemen)m(tation)25 b(is)d(simpler)g(and)h(do)s(esn't)0 2294 y(handle)42 b(HTTP)f(redirection,)k(pro)m(xies,)f(ecc.)72 b(The)42 b(only)e(reason)h(for)g(the)g(existence)g(of)g(this)f(mo)s (dule)i(is)e(for)0 2407 y(p)s(erformances)31 b(and)g(incremen)m(tal)h (elab)s(oration)g(of)e(resp)s(onse's)g(b)s(o)s(dies)0 2663 y Fh(exception)47 b(Http_error)g(of)f(\(int)h(*)g(string\))0 2801 y(val)g(get)g(:)94 2914 y(?head_callback:\(Http_types.status)f(->) h(\(string)g(*)g(string\))g(list)g(->)g(unit\))f(->)94 3027 y(string)h(->)g(string)227 3165 y Fi(Raises)31 b Fh(Http_error)f Fg(when)h(resp)s(onse)f(co)s(de)g Fb(<>)g Fg(200)227 3315 y Fi(Returns)k Fg(HTTP)d(resp)s(onse's)f(b)s(o)s(dy)0 3527 y Fh(val)47 b(get_iter)g(:)94 3640 y (?head_callback:\(Http_types.status)f(->)h(\(string)g(*)g(string\))g (list)g(->)g(unit\))f(->)94 3753 y(\(string)h(->)g(unit\))g(->)f (string)h(->)g(unit)227 3891 y Fg(as)30 b(ab)s(o)m(v)m(e)h(but)g(iter)g (callbac)m(k)g(function)h(on)e(HTTP)h(resp)s(onse's)f(b)s(o)s(dy)f (instead)i(of)f(returning)i(it)e(as)g(a)227 4004 y(string)0 4216 y Fh(val)47 b(head)g(:)g(string)g(->)g(string)227 4354 y Fi(Raises)31 b Fh(Http_error)f Fg(when)h(resp)s(onse)f(co)s(de)g Fb(<>)g Fg(200)227 4504 y Fi(Returns)k Fg(HTTP)d(HEAD)f(ra)m(w)i(resp)s (onse)1905 5400 y(23)p eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF ocaml-http_0.1.5/doc/latex/ocaml-http.aux0000644000175000017500000005024411507240336017616 0ustar celticceltic\relax \@writefile{toc}{\contentsline {section}{\numberline {1}Module {\tt {Cookie\_lexer}}}{1}} \newlabel{module:Cookie-underscorelexer}{{1}{1}} \newlabel{type:Cookie-underscorelexer.cookie-underscoretoken}{{1}{1}} \newlabel{val:Cookie-underscorelexer.token}{{1}{1}} \@writefile{toc}{\contentsline {section}{\numberline {2}Module {\tt {Http\_common}} : Common functionalities shared by other OCaml HTTP modules}{2}} \newlabel{module:Http-underscorecommon}{{2}{2}} \newlabel{val:Http-underscorecommon.debug}{{2}{2}} \newlabel{val:Http-underscorecommon.debug-underscoreprint}{{2}{2}} \newlabel{val:Http-underscorecommon.http-underscoreversion}{{2}{2}} \newlabel{val:Http-underscorecommon.server-underscorestring}{{2}{2}} \newlabel{val:Http-underscorecommon.string-underscoreof-underscoreversion}{{2}{2}} \newlabel{val:Http-underscorecommon.version-underscoreof-underscorestring}{{2}{2}} \newlabel{val:Http-underscorecommon.string-underscoreof-underscoremethod}{{2}{2}} \newlabel{val:Http-underscorecommon.method-underscoreof-underscorestring}{{2}{2}} \newlabel{val:Http-underscorecommon.status-underscoreof-underscorecode}{{2}{2}} \newlabel{val:Http-underscorecommon.code-underscoreof-underscorestatus}{{2}{2}} \newlabel{val:Http-underscorecommon.is-underscoreinformational}{{2}{2}} \newlabel{val:Http-underscorecommon.is-underscoresuccess}{{2}{2}} \newlabel{val:Http-underscorecommon.is-underscoreredirection}{{2}{3}} \newlabel{val:Http-underscorecommon.is-underscoreclient-underscoreerror}{{2}{3}} \newlabel{val:Http-underscorecommon.is-underscoreserver-underscoreerror}{{2}{3}} \newlabel{val:Http-underscorecommon.is-underscoreerror}{{2}{3}} \@writefile{toc}{\contentsline {section}{\numberline {3}Module {\tt {Http\_constants}} : Constants}{3}} \newlabel{module:Http-underscoreconstants}{{3}{3}} \newlabel{val:Http-underscoreconstants.version}{{3}{3}} \newlabel{val:Http-underscoreconstants.server-underscorestring}{{3}{3}} \newlabel{val:Http-underscoreconstants.crlf}{{3}{3}} \@writefile{toc}{\contentsline {subsection}{\numberline {3.1}daemon default values}{3}} \newlabel{val:Http-underscoreconstants.default-underscoreaddr}{{3.1}{3}} \newlabel{val:Http-underscoreconstants.default-underscoreauth}{{3.1}{3}} \newlabel{val:Http-underscoreconstants.default-underscoreauto-underscoreclose}{{3.1}{3}} \newlabel{val:Http-underscoreconstants.default-underscorecallback}{{3.1}{3}} \newlabel{val:Http-underscoreconstants.default-underscoremode}{{3.1}{3}} \newlabel{val:Http-underscoreconstants.default-underscoreport}{{3.1}{3}} \newlabel{val:Http-underscoreconstants.default-underscoreroot-underscoredir}{{3.1}{3}} \newlabel{val:Http-underscoreconstants.default-underscoreexn-underscorehandler}{{3.1}{3}} \newlabel{val:Http-underscoreconstants.default-underscoretimeout}{{3.1}{3}} \@writefile{toc}{\contentsline {section}{\numberline {4}Module {\tt {Http\_daemon}} : Main OCaml HTTP module.}{4}} \newlabel{module:Http-underscoredaemon}{{4}{4}} \newlabel{val:Http-underscoredaemon.send-underscoreCRLF}{{4}{4}} \newlabel{val:Http-underscoredaemon.send-underscorestatus-underscoreline}{{4}{4}} \newlabel{val:Http-underscoredaemon.get-underscorebasic-underscoreheaders}{{4}{4}} \newlabel{val:Http-underscoredaemon.send-underscorebasic-underscoreheaders}{{4}{4}} \newlabel{val:Http-underscoredaemon.send-underscoreheader}{{4}{4}} \newlabel{val:Http-underscoredaemon.send-underscoreheaders}{{4}{4}} \newlabel{val:Http-underscoredaemon.send-underscorefile}{{4}{4}} \newlabel{val:Http-underscoredaemon.respond}{{4}{4}} \newlabel{val:Http-underscoredaemon.respond-underscorenot-underscorefound}{{4}{5}} \newlabel{val:Http-underscoredaemon.respond-underscoreforbidden}{{4}{5}} \newlabel{val:Http-underscoredaemon.respond-underscoreredirect}{{4}{5}} \newlabel{val:Http-underscoredaemon.respond-underscoreunauthorized}{{4}{5}} \newlabel{val:Http-underscoredaemon.respond-underscoreerror}{{4}{5}} \newlabel{val:Http-underscoredaemon.respond-underscorefile}{{4}{5}} \newlabel{val:Http-underscoredaemon.respond-underscorewith}{{4}{5}} \newlabel{val:Http-underscoredaemon.main}{{4}{5}} \newlabel{val:Http-underscoredaemon.default-underscorespec}{{4}{6}} \newlabel{val:Http-underscoredaemon.daemon-underscorespec}{{4}{6}} \newlabel{class:Http-underscoredaemon.daemon}{{4}{6}} \newlabel{module:Http-underscoredaemon.Trivial}{{4}{6}} \newlabel{val:Http-underscoredaemon.Trivial.callback}{{4}{6}} \newlabel{val:Http-underscoredaemon.Trivial.main}{{4}{6}} \@writefile{toc}{\contentsline {section}{\numberline {5}Module {\tt {Http\_message}} : Object Oriented representation of HTTP messages}{7}} \newlabel{module:Http-underscoremessage}{{5}{7}} \newlabel{class:Http-underscoremessage.message}{{5}{7}} \newlabel{method:Http-underscoremessage.message.version}{{5}{7}} \newlabel{method:Http-underscoremessage.message.setVersion}{{5}{7}} \newlabel{method:Http-underscoremessage.message.body}{{5}{7}} \newlabel{method:Http-underscoremessage.message.setBody}{{5}{7}} \newlabel{method:Http-underscoremessage.message.bodyBuf}{{5}{7}} \newlabel{method:Http-underscoremessage.message.setBodyBuf}{{5}{7}} \newlabel{method:Http-underscoremessage.message.addBody}{{5}{7}} \newlabel{method:Http-underscoremessage.message.addBodyBuf}{{5}{7}} \@writefile{toc}{\contentsline {subsubsection}{\numberline {5.0.1}{\it header name comparison are performed in a case-insensitive manner as required by RFC2616, actually the implementation works converting all header names in lowercase}}{7}} \newlabel{method:Http-underscoremessage.message.addHeader}{{5.0.1}{7}} \newlabel{method:Http-underscoremessage.message.addHeaders}{{5.0.1}{7}} \newlabel{method:Http-underscoremessage.message.replaceHeader}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.replaceHeaders}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.removeHeader}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.hasHeader}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.header}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.headers}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.clientSockaddr}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.clientAddr}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.clientPort}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.serverSockaddr}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.serverAddr}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.serverPort}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.fstLineToString}{{5.0.1}{8}} \newlabel{method:Http-underscoremessage.message.toString}{{5.0.1}{9}} \newlabel{method:Http-underscoremessage.message.serialize}{{5.0.1}{9}} \@writefile{toc}{\contentsline {section}{\numberline {6}Module {\tt {Http\_misc}} : Helpers and other not better classified functions which should not be exposed in the final API}{9}} \newlabel{module:Http-underscoremisc}{{6}{9}} \newlabel{val:Http-underscoremisc.date-underscore822}{{6}{9}} \newlabel{val:Http-underscoremisc.is-underscoredirectory}{{6}{9}} \newlabel{val:Http-underscoremisc.filesize}{{6}{9}} \newlabel{val:Http-underscoremisc.strip-underscoretrailing-underscoreslash}{{6}{9}} \newlabel{val:Http-underscoremisc.strip-underscoreheading-underscoreslash}{{6}{9}} \newlabel{val:Http-underscoremisc.ls}{{6}{9}} \newlabel{val:Http-underscoremisc.string-underscoreexplode}{{6}{9}} \newlabel{val:Http-underscoremisc.string-underscoreimplode}{{6}{10}} \newlabel{val:Http-underscoremisc.reason-underscorephrase-underscoreof-underscorecode}{{6}{10}} \newlabel{val:Http-underscoremisc.build-underscoresockaddr}{{6}{10}} \newlabel{val:Http-underscoremisc.explode-underscoresockaddr}{{6}{10}} \newlabel{val:Http-underscoremisc.peername-underscoreof-underscoreout-underscorechannel}{{6}{10}} \newlabel{val:Http-underscoremisc.peername-underscoreof-underscorein-underscorechannel}{{6}{10}} \newlabel{val:Http-underscoremisc.sockname-underscoreof-underscoreout-underscorechannel}{{6}{10}} \newlabel{val:Http-underscoremisc.sockname-underscoreof-underscorein-underscorechannel}{{6}{10}} \newlabel{val:Http-underscoremisc.buf-underscoreof-underscoreinchan}{{6}{10}} \newlabel{val:Http-underscoremisc.list-underscoreassoc-underscoreall}{{6}{10}} \newlabel{val:Http-underscoremisc.warn}{{6}{10}} \newlabel{val:Http-underscoremisc.error}{{6}{10}} \newlabel{val:Http-underscoremisc.finally}{{6}{10}} \@writefile{toc}{\contentsline {section}{\numberline {7}Module {\tt {Http\_parser}} : HTTP messages parsing}{11}} \newlabel{module:Http-underscoreparser}{{7}{11}} \newlabel{val:Http-underscoreparser.split-underscorequery-underscoreparams}{{7}{11}} \newlabel{val:Http-underscoreparser.parse-underscorerequest-underscorefst-underscoreline}{{7}{11}} \newlabel{val:Http-underscoreparser.parse-underscoreresponse-underscorefst-underscoreline}{{7}{11}} \newlabel{val:Http-underscoreparser.parse-underscorequery-underscoreget-underscoreparams}{{7}{11}} \newlabel{val:Http-underscoreparser.parse-underscorepath}{{7}{11}} \newlabel{val:Http-underscoreparser.parse-underscoreheaders}{{7}{11}} \newlabel{val:Http-underscoreparser.parse-underscorecookies}{{7}{11}} \newlabel{val:Http-underscoreparser.parse-underscorerequest}{{7}{12}} \@writefile{toc}{\contentsline {section}{\numberline {8}Module {\tt {Http\_parser\_sanity}} : Sanity test functions related to HTTP message parsing}{12}} \newlabel{module:Http-underscoreparser-underscoresanity}{{8}{12}} \newlabel{val:Http-underscoreparser-underscoresanity.heal-underscoreheader-underscorename}{{8}{12}} \newlabel{val:Http-underscoreparser-underscoresanity.heal-underscoreheader-underscorevalue}{{8}{12}} \newlabel{val:Http-underscoreparser-underscoresanity.heal-underscoreheader}{{8}{12}} \newlabel{val:Http-underscoreparser-underscoresanity.normalize-underscoreheader-underscorevalue}{{8}{12}} \newlabel{val:Http-underscoreparser-underscoresanity.url-underscoreof-underscorestring}{{8}{12}} \newlabel{val:Http-underscoreparser-underscoresanity.string-underscoreof-underscoreurl}{{8}{12}} \@writefile{toc}{\contentsline {section}{\numberline {9}Module {\tt {Http\_request}} : Object Oriented representation of HTTP requests}{12}} \newlabel{module:Http-underscorerequest}{{9}{12}} \newlabel{class:Http-underscorerequest.request}{{9}{12}} \@writefile{toc}{\contentsline {section}{\numberline {10}Module {\tt {Http\_response}} : Object Oriented representation of HTTP responses}{13}} \newlabel{module:Http-underscoreresponse}{{10}{13}} \newlabel{class:Http-underscoreresponse.response}{{10}{13}} \@writefile{toc}{\contentsline {section}{\numberline {11}Module {\tt {Http\_tcp\_server}} : TCP servers used as low-levels for HTTP daemons}{13}} \newlabel{module:Http-underscoretcp-underscoreserver}{{11}{13}} \@writefile{toc}{\contentsline {subsection}{\numberline {11.1}servers}{13}} \newlabel{val:Http-underscoretcp-underscoreserver.simple}{{11.1}{13}} \newlabel{val:Http-underscoretcp-underscoreserver.thread}{{11.1}{13}} \newlabel{val:Http-underscoretcp-underscoreserver.fork}{{11.1}{13}} \@writefile{toc}{\contentsline {subsection}{\numberline {11.2}low level functions}{13}} \newlabel{val:Http-underscoretcp-underscoreserver.init-underscoresocket}{{11.2}{13}} \@writefile{toc}{\contentsline {section}{\numberline {12}Module {\tt {Http\_threaded\_tcp\_server}} : Multithreaded part of Http\_tcp\_server}{13}} \newlabel{module:Http-underscorethreaded-underscoretcp-underscoreserver}{{12}{13}} \newlabel{val:Http-underscorethreaded-underscoretcp-underscoreserver.serve}{{12}{13}} \@writefile{toc}{\contentsline {section}{\numberline {13}Module {\tt {Http\_types}} : Type definitions}{13}} \newlabel{module:Http-underscoretypes}{{13}{13}} \newlabel{type:Http-underscoretypes.version}{{13}{13}} \newlabel{type:Http-underscoretypes.meth}{{13}{14}} \newlabel{type:Http-underscoretypes.daemon-underscoremode}{{13}{14}} \newlabel{type:Http-underscoretypes.tcp-underscoreserver}{{13}{14}} \newlabel{type:Http-underscoretypes.auth-underscoreinfo}{{13}{14}} \newlabel{type:Http-underscoretypes.informational-underscoresubstatus}{{13}{14}} \newlabel{type:Http-underscoretypes.success-underscoresubstatus}{{13}{14}} \newlabel{type:Http-underscoretypes.redirection-underscoresubstatus}{{13}{14}} \newlabel{type:Http-underscoretypes.client-underscoreerror-underscoresubstatus}{{13}{15}} \newlabel{type:Http-underscoretypes.server-underscoreerror-underscoresubstatus}{{13}{15}} \newlabel{type:Http-underscoretypes.informational-underscorestatus}{{13}{15}} \newlabel{type:Http-underscoretypes.success-underscorestatus}{{13}{15}} \newlabel{type:Http-underscoretypes.redirection-underscorestatus}{{13}{15}} \newlabel{type:Http-underscoretypes.client-underscoreerror-underscorestatus}{{13}{15}} \newlabel{type:Http-underscoretypes.server-underscoreerror-underscorestatus}{{13}{15}} \newlabel{type:Http-underscoretypes.error-underscorestatus}{{13}{15}} \newlabel{type:Http-underscoretypes.status}{{13}{15}} \newlabel{type:Http-underscoretypes.status-underscorecode}{{13}{15}} \newlabel{type:Http-underscoretypes.file-underscoresource}{{13}{15}} \@writefile{toc}{\contentsline {subsection}{\numberline {13.1}Exceptions}{16}} \newlabel{exception:Http-underscoretypes.Invalid-underscoreheader}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Invalid-underscoreheader-underscorename}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Invalid-underscoreheader-underscorevalue}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Invalid-underscoreHTTP-underscoreversion}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Invalid-underscoreHTTP-underscoremethod}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Invalid-underscorecode}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Malformed-underscoreURL}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Malformed-underscorequery}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Malformed-underscorequery-underscorepart}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Malformed-underscorerequest-underscoreURI}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Malformed-underscorecookies}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Malformed-underscorerequest}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Malformed-underscoreresponse}{{13.1}{16}} \newlabel{exception:Http-underscoretypes.Param-underscorenot-underscorefound}{{13.1}{17}} \newlabel{exception:Http-underscoretypes.Invalid-underscorestatus-underscoreline}{{13.1}{17}} \newlabel{exception:Http-underscoretypes.Header-underscorenot-underscorefound}{{13.1}{17}} \newlabel{exception:Http-underscoretypes.Quit}{{13.1}{17}} \newlabel{exception:Http-underscoretypes.Unauthorized}{{13.1}{17}} \@writefile{toc}{\contentsline {subsection}{\numberline {13.2}OO representation of HTTP messages}{17}} \newlabel{classtype:Http-underscoretypes.message}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.version}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.setVersion}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.body}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.setBody}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.bodyBuf}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.setBodyBuf}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.addBody}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.addBodyBuf}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.addHeader}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.addHeaders}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.replaceHeader}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.replaceHeaders}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.removeHeader}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.hasHeader}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.header}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.headers}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.clientSockaddr}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.clientAddr}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.clientPort}{{13.2}{17}} \newlabel{method:Http-underscoretypes.message.serverSockaddr}{{13.2}{18}} \newlabel{method:Http-underscoretypes.message.serverAddr}{{13.2}{18}} \newlabel{method:Http-underscoretypes.message.serverPort}{{13.2}{18}} \newlabel{method:Http-underscoretypes.message.toString}{{13.2}{18}} \newlabel{method:Http-underscoretypes.message.serialize}{{13.2}{18}} \newlabel{classtype:Http-underscoretypes.request}{{13.2}{18}} \newlabel{method:Http-underscoretypes.request.meth}{{13.2}{18}} \newlabel{method:Http-underscoretypes.request.uri}{{13.2}{18}} \newlabel{method:Http-underscoretypes.request.path}{{13.2}{18}} \newlabel{method:Http-underscoretypes.request.param}{{13.2}{18}} \newlabel{method:Http-underscoretypes.request.paramAll}{{13.2}{18}} \newlabel{method:Http-underscoretypes.request.params}{{13.2}{18}} \newlabel{method:Http-underscoretypes.request.params-underscoreGET}{{13.2}{18}} \newlabel{method:Http-underscoretypes.request.params-underscorePOST}{{13.2}{18}} \newlabel{method:Http-underscoretypes.request.cookies}{{13.2}{19}} \newlabel{method:Http-underscoretypes.request.authorization}{{13.2}{19}} \newlabel{classtype:Http-underscoretypes.response}{{13.2}{19}} \newlabel{method:Http-underscoretypes.response.code}{{13.2}{19}} \newlabel{method:Http-underscoretypes.response.setCode}{{13.2}{19}} \newlabel{method:Http-underscoretypes.response.status}{{13.2}{19}} \newlabel{method:Http-underscoretypes.response.setStatus}{{13.2}{19}} \newlabel{method:Http-underscoretypes.response.reason}{{13.2}{19}} \newlabel{method:Http-underscoretypes.response.setReason}{{13.2}{19}} \newlabel{method:Http-underscoretypes.response.statusLine}{{13.2}{19}} \newlabel{method:Http-underscoretypes.response.setStatusLine}{{13.2}{19}} \newlabel{method:Http-underscoretypes.response.isInformational}{{13.2}{19}} \newlabel{method:Http-underscoretypes.response.isSuccess}{{13.2}{20}} \newlabel{method:Http-underscoretypes.response.isRedirection}{{13.2}{20}} \newlabel{method:Http-underscoretypes.response.isClientError}{{13.2}{20}} \newlabel{method:Http-underscoretypes.response.isServerError}{{13.2}{20}} \newlabel{method:Http-underscoretypes.response.isError}{{13.2}{20}} \newlabel{method:Http-underscoretypes.response.addBasicHeaders}{{13.2}{20}} \@writefile{toc}{\contentsline {subsubsection}{\numberline {13.2.1}facilities to access some frequently used headers}{20}} \newlabel{method:Http-underscoretypes.response.contentType}{{13.2.1}{20}} \newlabel{method:Http-underscoretypes.response.setContentType}{{13.2.1}{20}} \newlabel{method:Http-underscoretypes.response.contentEncoding}{{13.2.1}{20}} \newlabel{method:Http-underscoretypes.response.setContentEncoding}{{13.2.1}{20}} \newlabel{method:Http-underscoretypes.response.date}{{13.2.1}{20}} \newlabel{method:Http-underscoretypes.response.setDate}{{13.2.1}{20}} \newlabel{method:Http-underscoretypes.response.expires}{{13.2.1}{20}} \newlabel{method:Http-underscoretypes.response.setExpires}{{13.2.1}{21}} \newlabel{method:Http-underscoretypes.response.server}{{13.2.1}{21}} \newlabel{method:Http-underscoretypes.response.setServer}{{13.2.1}{21}} \newlabel{method:Http-underscoretypes.response.connection}{{13.2.1}{21}} \newlabel{method:Http-underscoretypes.response.setConnection}{{13.2.1}{21}} \@writefile{toc}{\contentsline {subsection}{\numberline {13.3}Daemon specification}{21}} \newlabel{type:Http-underscoretypes.daemon-underscorespec}{{13.3}{21}} \@writefile{toc}{\contentsline {subsection}{\numberline {13.4}OO representation of other HTTP entities}{22}} \newlabel{classtype:Http-underscoretypes.connection}{{13.4}{22}} \newlabel{method:Http-underscoretypes.connection.getRequest}{{13.4}{22}} \newlabel{method:Http-underscoretypes.connection.respond-underscorewith}{{13.4}{22}} \newlabel{method:Http-underscoretypes.connection.close}{{13.4}{22}} \newlabel{classtype:Http-underscoretypes.daemon}{{13.4}{23}} \newlabel{method:Http-underscoretypes.daemon.accept}{{13.4}{23}} \newlabel{method:Http-underscoretypes.daemon.getRequest}{{13.4}{23}} \@writefile{toc}{\contentsline {section}{\numberline {14}Module {\tt {Http\_user\_agent}} : Minimal implementation of an HTTP 1.0/1.1 client.}{23}} \newlabel{module:Http-underscoreuser-underscoreagent}{{14}{23}} \newlabel{exception:Http-underscoreuser-underscoreagent.Http-underscoreerror}{{14}{23}} \newlabel{val:Http-underscoreuser-underscoreagent.get}{{14}{23}} \newlabel{val:Http-underscoreuser-underscoreagent.get-underscoreiter}{{14}{23}} \newlabel{val:Http-underscoreuser-underscoreagent.head}{{14}{23}} ocaml-http_0.1.5/doc/latex/ocaml-http.dvi0000644000175000017500000013426411507240336017610 0ustar celticceltic÷ƒ’À;è TeX output 2010.12.31:1333‹ÿÿÿÿ Šn ýu‘ë ln ýž‘ëó&Lt$ffffecbx1440¼Con•cten“tsޤ|æóíÄ]] ó3 ó3ecbx1095½1Ž‘TòMoXïdule‘+¡óÚvªh ó3 ó3ectt1095¾Cookie_lexer’MŠR½1ŽŽ¡2Ž‘TòMoXïdule–b§¾Http_common“½:‘ýjCommon“functionalities‘b¦shared“b§y“other“OCaml“HTTPŽ© ™š‘TòmoXïdules’’*1ŽŽ¡3Ž‘TòMoXïdule–+¡¾Http_constants“½:‘^Constan§ts’þ~Û2ŽŽ¦‘Tòó$•Hd ó3 ó3ecrm1095º3.1Ž‘)_¼daemon–¡kdefault“v‘ÿeBalues‘¹‘¼É.ŽŽ–€@‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ‘B£2ŽŽ¡½4Ž‘TòMošXïdule–+¡¾Http_daemon“½:‘^Main“OCaml“HTTP“mo˜dule.’§c~3ŽŽ¡5Ž‘TòMoXïdule–+¡¾Http_message“½:‘^Ob‘±Þject“Orienš§ted“represen˜tation“of“HTTP“messages‘)r#6ŽŽ¦‘)_¼º5.0.1Ž‘L7ó–¤ð ó3 ó3ecti1095Çhe›ÿqîader–¿ name“c˜omp˜arison“ar˜e“p˜erforme˜d“in“a“c˜ase-insensitive“manner“as“r˜e-ަ‘L7quir–ÿqîe“d–¢by›£RF¸öC2616,‘)¼actual‘Žly“the“implementation˜works“c‘ÿqîonverting˜al‘Žl“he‘ÿqîaderަ‘L7names–ã=in“lower–ÿqîc“ase‘™j‘¼Éº.ŽŽ–€@‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ‘B£6ŽŽ¡½6Ž‘TòMo•Xïdule‘Ð*¾Http_misc›Ð)½:‘á£Help“ers˜and–Ð*other˜not“bXïetter˜classied“functions˜whic§h“shouldަ‘Tònot–+¡bšXïe“exp˜osed“in“the“nal“API’‚8ŽŽ¡7Ž‘TòMoXïdule–+¡¾Http_parser“½:‘^HTTP“messages“parsing’ºçë10ŽŽ¡8Ž‘TòMoXïdule›ãl¾Http_parser_sanity–ãk½:‘þôSanit§y“test˜functions˜related˜to“HTTP‘âûmessageަ‘Tòparsing’‘$é11ŽŽ¡9Ž‘TòMoXïdule–+¡¾Http_request“½:‘^Ob‘±Þject“Orienš§ted“represen˜tation“of“HTTP“requests‘'X?11ŽŽ¡10Ž‘TòMoXïdule–+¡¾Http_response“½:‘^Ob‘±Þject“Orienš§ted“represen˜tation“of“HTTP“respXïonses‘ªË12ŽŽ¡11Ž‘TòMoXïdule–+¡¾Http_tcp_server“½:‘^TCP“servš§ers“used“as“lo˜w-lev˜els“for“HTTP“daemons‘Û12ŽŽ¦‘Tòº11.1Ž‘)_¼serv² ers‘ót‘¼É.ŽŽ–€@‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ‘Ðý12ŽŽ¦‘Tò11.2Ž‘)_¼lo•² w›¡klev“el˜functions‘ÜÌ‘¼É.ŽŽ–€@‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ‘Ðý12ŽŽ¡½12Ž‘TòMoXïdule–+¡¾Http_threaded_tcp_server“½:‘^Multithreaded“part“of“Http_tcp_serv§er‘l-12ŽŽ¡13Ž‘TòMošXïdule–+¡¾Http_types“½:‘^T§yp˜e“denitions’ìºÛ12ŽŽ¦‘Tòº13.1Ž‘)_¼Exceptions5‘¼É.ŽŽ–€@‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ‘Ðý15ŽŽ¦‘Tò13.2Ž‘)_¼OO–¡krepresen² tation“of“HTTP“messages‘™a‘¼É.ŽŽ–€@‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ‘Ðý16ŽŽ¦‘)_¼13.2.1Ž‘L7facilities–¡kto“access“some“frequen² tly“used“headers‘Kø‘¼É.ŽŽ–€@‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ‘Ðý19ŽŽ¦‘Tò13.3Ž‘)_¼Daemon‘¡kspM_ecication‘éo‘¼É.ŽŽ–€@‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ‘Ðý20ŽŽ¦‘Tò13.4Ž‘)_¼OO–¡krepresenš² tation“of“other“HTTP“en˜tities‘s)‘¼É.ŽŽ–€@‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ“‘¼É.ŽŽ‘Ðý21ŽŽ¡½14Ž‘TòMoXïdule–+¡¾Http_user_agent“½:‘^Minimal“implemenš§tation“of“an“HTTP“1.0/1.1“clien˜t.‘ Ô×22ŽŽŸ"7¼1Ž‘ÁMopœdule‘G\óÄN½¿ffffectt1440ÈCookie_lexerŽŸ)ªÏ¾type–¨‹cookie_token“=“[“`ASSIGNMENT“of“string“*“string“|“`EOF“|“`SEP“]ŽŽŸ’è'Òº1ŽŽŒ‹* Šn ýu‘ë ln ýž‘ë¾val–¨‹token“:“Lexing.lexbuf“->“cookie_tokenŽŸ"r2¼2Ž‘ÁMopœdule›³¿ÈHttp_common–³¾¼:‘ â–Common“functionalities˜shared“bcy˜otherŽŸ‘ÁOCaml–G\HTTP“mopœdulesŽŸ)œÿ¾val–¨‹debug“:“bool“Pervasives.refŽŸ‹É‘`ºwhether–¡kdebugging“messages“are“enabled“or“not,“can“bM_e“cš² hanged“at“run˜timeޤbZ¾val–¨‹debug_print“:“string“->“unitŽ©‹Ê‘`ºprin² t–¡ka“string“on“stderr“only“if“debugging“is“enabledŽ¡¾val–¨‹http_version“:“Http_types.versionަ‘`ºsee‘¡k¾Http_constants.versionº[3]ŽŸbY¾val–¨‹server_string“:“stringަ‘`ºsee‘¡k¾Http_constants.server_stringº[3]Ž¡¾val–¨‹string_of_version“:“Http_types.version“->“stringަ‘`ºprett•² y›¡kprin“t˜an˜HTTP˜v“ersionŽŸbY¾val–¨‹version_of_string“:“string“->“Http_types.versionަ‘`ºparse–¡kan“HTTP“v² ersion“from“a“stringŽŸ Ê‘`½Raises–¡k¾Invalid_HTTP_version“ºif“givš² en“string“doM_esn't“represen˜t“a“suppM_orted“HTTP“v˜ersionŽ¡¾val–¨‹string_of_method“:“Http_types.meth“->“stringŽŸ‹É‘`ºprett•² y›¡kprin“t˜an˜HTTP˜methoM_dŽ¡¾val–¨‹method_of_string“:“string“->“Http_types.methަ‘`ºparse–¡kan“HTTP“methoM_d“from“a“stringŽ© Ê‘`½Raises–¡k¾Invalid_HTTP_method“ºif“givš² en“string“doM_esn't“represen˜t“a“suppšM_orted“metho˜dŽ¡¾val–¨‹status_of_code“:“int“->“Http_types.statusŽŸ‹É‘`ºcon•² v“erts–¡kan“in² teger“HTTP“status“to“the“correspM_onding“status“v‘ÿeBalueަ‘`½Raises–¡k¾Invalid_code“ºif“givš² en“in˜teger“isn't“a“v‘ÿeBalid“HTTP“status“coM_deŽ¡¾val–¨‹code_of_status“:“[<“Http_types.status“]“->“intޤ‹Ê‘`ºcon•² v“erts–¡kan“HTTP“status“to“the“correspM_onding“in² teger“v‘ÿeBalueŽŸbY¾val–¨‹is_informational“:“int“->“boolŽ¡‘`½Returns‘+¡ºtrue–¡kon“"informational"“status“coM_des,“false“elsewhereŽŸbZ¾val–¨‹is_success“:“int“->“boolŽŽŸ’è'Òº2ŽŽŒ‹u Šn ýu‘ë ln ýž‘ë‘`½Returns‘+¡ºtrue–¡kon“"success"“status“coM_des,“false“elsewhereޤ™š¾val–¨‹is_redirection“:“int“->“boolŽ©™š‘`½Returns‘+¡ºtrue–¡kon“"redirection"“status“coM_des,“false“elsewhereŽ¡¾val–¨‹is_client_error“:“int“->“boolަ‘`½Returns‘+¡ºtrue–¡kon“"clien² t“error"“status“coM_des,“false“elsewhereŽ¡¾val–¨‹is_server_error“:“int“->“boolަ‘`½Returns‘+¡ºtrue–¡kon“"serv² er“error"“status“coM_des,“false“elsewhereŽ¡¾val–¨‹is_error“:“int“->“boolަ‘`½Returns‘+¡ºtrue–¡kon“"clienš² t“error"“and“"serv˜er“error"“status“coM_de,“false“elsewhereŽŸ+7¼3Ž‘ÁMopœdule–G\ÈHttp_constants“¼:‘ ÐConstanctsŽŸ)ªÏ¾val–¨‹version“:“Http_types.versionަ‘`ºdefault–¡kHTTP“v² ersionŽ¡¾val–¨‹server_string“:“stringަ‘`ºstring–¡kreturned“as“v‘ÿeBalue“of“"Serv² er:"“respM_onse“headerŽ¡¾val–¨‹crlf“:“stringަ‘`º"\r\n"‘¡kstringŽŸ&QŽó¥!¢N ecbx1200Ê3.1Ž‘¾daemon–¸default“v‘ÿ@ aluesŽŸ«¾val–¨‹default_addr“:“stringަval–¨‹default_auth“:“(string“*“Http_types.auth_info)“optionަval–¨‹default_auto_close“:“boolަval–¨‹default_callback“:“Http_types.request“->“Pervasives.out_channel“->“unitަval–¨‹default_mode“:“Http_types.daemon_modeަval–¨‹default_port“:“intަval–¨‹default_root_dir“:“string“optionަval–¨‹default_exn_handler“:“(exn“->“Pervasives.out_channel“->“unit)“optionަval–¨‹default_timeout“:“int“optionŽŽŸ’è'Òº3ŽŽŒ‹® Šn ýu‘ë ln ýž‘ë¼4Ž‘ÁMošpœdule–G\ÈHttp_daemon“¼:‘ ÐMain“OCaml“HTTP“mo˜dule.ŽŸpܺHere–¡kyš² ou“can“nd“t˜w˜o“set“of“functions:ޤ™š‘lÐó!",š ó3 cmsy10ÄŽŽŽ‘`ºfunctions–¡kwhicš² h“let“y˜ou“start“an“HTTP“Daemon“(start*“functions)Ž¡‘lÐÄŽŽŽ‘`ºfacilitš² y–¡kfunctions“whic˜h“let“y˜ou“sen˜t“respM_onses“bac˜k“to“clien˜tsŽŸ'Ó¾val–¨‹send_CRLF“:“Pervasives.out_channel“->“unitŽ©™š‘`ºsend–¡ka“CRLF“sequence“on“the“givš² en“output“c˜hannel,“this“is“mandatory“after“the“last“headerޤ ™š‘`w•² as›¡ksen“t˜and˜b•M_efore˜start˜sending˜the˜resp“onse˜b“o“dyŽŸ™š¾val–¨‹send_status_line“:Ž¡‘ Q?version:Http_types.version‘¨‹->Ž¡‘ Qcode:Http_types.status_code–¨‹->“Pervasives.out_channel“->“unitަ‘`ºsend–¡krespM_onse“status“line,“vš² ersion“is“the“h˜ttp“v˜ersion“used“in“respšM_onse,“either“co˜de“or“statusŽ¡‘`m•² ust›ŒÙbM_e‘ŒØgiv“en˜(not–ŒØbM_oth,‘önot“none)˜whicš² h“represen˜t‘ŒÙthe“HTTP‘ŒÔrespšM_onse“co˜de,‘öoutc² han“is‘ŒÙtheŽ¡‘`output–¡kcš² hannel“to“whic˜h“send“status“lineޤ™š¾val–¨‹get_basic_headers“:“unit“->“(string“*“string)“listަ‘`ºreturns–¡kthe“basic“headers“"Date",“"Serv² er"“and“"Connection"“used“in“send_basic_headersŽ¡¾val–¨‹send_basic_headers“:ޤ ™š‘ Q?version:Http_types.version‘¨‹->Ž¡‘ Qcode:Http_types.status_code–¨‹->“Pervasives.out_channel“->“unitަ‘`ºlikš² e–¡ksend_status_line“but“additionally“will“also“send“"Date",“"Serv˜er"“and“"Connection"Ž¡‘`standard‘¡kheadersŽŸ™š¾val–¨‹send_header“:Ž¡‘ Qheader:string–¨‹->“value:string“->“Pervasives.out_channel“->“unitަ‘`ºsend–¡kan“HTTP“header“on“outc² hanŽŸ™š¾val–¨‹send_headers“:Ž¡‘ Qheaders:(string–¨‹*“string)“list“->“Pervasives.out_channel“->“unitަ‘`ºas–¡ksend_header,“but“for“a“list“of“pairs“ó  b> ó3 cmmi10Á<ºheader,“v‘ÿeBalueÁ>ޤ™š¾val–¨‹send_file“:“src:Http_types.file_source“->“Pervasives.out_channel“->“unitަ‘`ºsend–¡ka“le“through“an“out_c² hannelŽ¡¾val–¨‹respond“:ޤ ™š‘ Q?body:string‘¨‹->Ž¡‘ Q?headers:(string–¨‹*“string)“list“->Ž¡‘ Q?version:Http_types.version‘¨‹->Ž¡‘ Q?code:Http_types.status_code–¨‹->“Pervasives.out_channel“->“unitŽŽŸ’è'Òº4ŽŽŒ‹"a Šn ýu‘ë ln ýž‘ë‘`ºhigh–¡klev² el“respšM_onse“function,“resp˜ond“on“outc² han“sending:‘Öçbasic“headers“(includingޤ ™š‘`Con•² ten“t-Length–‹žcomputed›‹using“'b•M_o“dy'˜argumen² t),‘úheaders˜probided–‹žvia˜'headers'“argumen² t,Ž¡‘`b•M_o“dy–¡kgivš² en“via“'b•M_o“dy'–¡kargumen˜t.‘ÖçDefault“respšM_onse“status“is“200,“default“resp˜onse“HTTPŽ¡‘`vš² ersion–¡kis“Http_common.h˜ttp_v˜ersionŽ©™š¾val–¨‹respond_not_found“:Ž¡‘ Qurl:string–¨‹->“?version:Http_types.version“->“Pervasives.out_channel“->“unitŽŸ™š‘`ºsend–¡ka“404“(not“found)“HTTP“respM_onseަ¾val–¨‹respond_forbidden“:Ž¡‘ Qurl:string–¨‹->“?version:Http_types.version“->“Pervasives.out_channel“->“unitŽŸ™š‘`ºsend–¡ka“403“(forbidden)“HTTP“respM_onseަ¾val–¨‹respond_redirect“:Ž¡‘ Qlocation:string‘¨‹->Ž¡‘ Q?body:string‘¨‹->Ž¡‘ Q?version:Http_types.version‘¨‹->Ž¡‘ Q?code:Http_types.status_code–¨‹->“Pervasives.out_channel“->“unitŽŸ™š‘`ºsend–¡ka“"redirection"“class“respšM_onse,“optional“b˜o˜dy“argumenš² t“con˜tains“data“that“will“bM_eŽ¡‘`displa•² y“ed–¡kin“the“b•M_o“dy–¡kof“the“respšM_onse,“default“resp˜onse“status“is“301“(mo•² v“ed‘¡kp˜ermanen“tly),Ž¡‘`only–¡kredirection“status“are“accepted“b² y“this“function,“other“v‘ÿeBalues“will“raise“F‘ÿãailureަ¾val–¨‹respond_unauthorized“:Ž¡‘ Q?version:Http_types.version‘¨‹->Ž¡‘ Q?realm:string–¨‹->“Pervasives.out_channel“->“unitŽŸ™š‘`ºrespšM_ond–¡kwith“a“401“(Unauthorized)“resp˜onse“asking“for“authenš² tication“against“giv˜en“realmŽ¡‘`(default–¡kis“the“serv² er“name)ަ¾val–¨‹respond_error“:Ž¡‘ Q?body:string‘¨‹->Ž¡‘ Q?version:Http_types.version‘¨‹->Ž¡‘ Q?code:Http_types.status_code–¨‹->“Pervasives.out_channel“->“unitŽŸ™š‘`ºsend–¡kan“"error"“respšM_onse“(i.e.‘Öç400“Ä“ºstatus“Á<“º600),“optional“b˜o˜dy“argumen² t“as“p˜erŽ¡‘`send_redirect,‘‡”default–respM_onse›status“is“400˜(bad“request),‘‡”only˜error“status“are˜accepted“b² yŽ¡‘`this–¡kfunction,“other“v‘ÿeBalues“will“raise“F‘ÿãailureަ¾val–¨‹respond_file“:Ž¡‘ Qfname:string–¨‹->“?version:Http_types.version“->“Pervasives.out_channel“->“unitŽŸ™š‘`ºtipical–¡kstatic“pages“hš² ttp“daemon“bM_eha˜viour,“if“requested“url“is“a“le,“return“it,“it“it“is“aŽ¡‘`directory–¡kreturn“a“directory“listing“of“itަ¾val–¨‹respond_with“:“Http_types.response“->“Pervasives.out_channel“->“unitŽŸ™š‘`ºrespšM_ond–¡kusing“a“prebuilt“Http_t² yp˜es.resp˜onse“ob‘š½jectަ¾val–¨‹main“:“Http_types.daemon_spec“->“unitŽŽŸ’è'Òº5ŽŽŒ‹+ Šn ýu‘ë ln ýž‘ë‘`ºstart–¡kan“HTTP“daemonŽŸ?_¾val–¨‹default_spec“:“Http_types.daemon_specŽŸ ‘`ºdefault–¡kdaemon“spM_ecication:ŽŸl}‘(ƒÜÄŽŽŽ‘3wºlisten–¡kon“0.0.0.0,“pM_ort“80ޤl|‘(ƒÜÄŽŽŽ‘3wº"alw•² a“ys–¡kok"“callbacš² k“(return“an“empt˜y“respšM_onse,“resp˜onse“co˜de“200)Ž©l}‘(ƒÜÄŽŽŽ‘3wºfork–¡ka“cš² hild“for“eac˜h“requestŽ¡‘(ƒÜÄŽŽŽ‘3wºdo–¡knot“cš² hange“to“a“roM_ot“directory“(i.e.‘Öçk˜eep“cwd)ަ‘(ƒÜÄŽŽŽ‘3wº300–¡kseconds“timeoutŽ¡‘(ƒÜÄŽŽŽ‘3wºignores‘¡kexceptionsަ‘(ƒÜÄŽŽŽ‘3wºno–¡kauthen² tication“requiredŽ¡‘(ƒÜÄŽŽŽ‘3wºdo–¡knot“automatically“close“clienš² t“connections“after“callbac˜kŽŸ¨Ð¾val–¨‹daemon_spec“:ޤ ™š‘ Q?address:string‘¨‹->Ž¡‘ Q?auth:(string–¨‹*“Http_types.auth_info)“option“->Ž¡‘ Q?auto_close:bool‘¨‹->Ž¡‘ Q?callback:(Http_types.request–¨‹->“Pervasives.out_channel“->“unit)“->Ž¡‘ Q?mode:Http_types.daemon_mode‘¨‹->Ž¡‘ Q?port:int‘¨‹->Ž¡‘ Q?root_dir:string–¨‹option“->Ž¡‘ Q?exn_handler:(exn–¨‹->“Pervasives.out_channel“->“unit)“option“->Ž¡‘ Q?timeout:int–¨‹option“->“unit“->“Http_types.daemon_specŽŸ ‘`ºcurried–¡kdaemon_spšM_ec“constructor.‘ÖçEac² h“parameter“of“this“function“corresp˜onds“to“one“eldŽ¡‘`of›¡kHttp_t² yp•M_es.daemon_sp“ec˜and˜defaults˜to˜the˜corresp“onding˜eld˜ofŽ¡‘`Http_daemon.default_spM_ecޤ?_¾class–¨‹daemon“:“?addr:string“->“?port:int“->“unit“->“Http_types.daemonŽŸ ‘`ºOb‘š½ject–¡korienš² ted“in˜terface“to“HTTP“daemons.Ž¡¾module–¨‹Trivial“:ޤ ™š‘ ãLsigŽŸ(Б`val–¨‹callback“:“Http_types.request“->“Pervasives.out_channel“->“unitŽŸì|‘3wºcallbacš² k–¡kfunction,“expM_osed“if“y˜ou“lik˜e“to“use“it“as“a“basis“to“dene“a“more“pM_o˜w˜erfulŽ¡‘3wdaemonŽŸ?_‘`¾val–¨‹main“:“Http_types.daemon_spec“->“unitŽŸì}‘3wºstart–¡kthe“"trivial"“HTTP“daemonŽŸ¿_‘ ãL¾endŽŸÕí‘`ºT‘ÿãrivial–¡kstatic“pages“HTTP“daemon.‘ÖçDaemons“created“using“this“moM_dule“will“serv² e“directoryŽ¡‘`indexes–¡kand“les“found“starting“from“the“w² orking“directoryŽŽŸ’è'Ò6ŽŽŒ‹5 Šn ýu‘ë ln ýž‘ë¼5Ž‘ÁMopœdule–,ÈHttp_message“¼:‘æ8Ob‘á9ject‘+Orienšcted“represen˜tation“of“HTTPŽŸ‘ÁmessagesŽŸ)ŒG¾class–¨‹virtual“message“:“body:string“->“headers:(string“*“string)“list“->“version:Http_types.version“option“->“clisockaddr:Unix.sockaddr“->“srvsockaddr:Unix.sockaddr“->ޤ ™š‘ ãLobjectŽŸ€ò‘`method–¨‹version“:“Http_types.version“optionŽ©܉‘3w½Returns‘+¡ºmessage–¡kHTTP“v² ersion,“it“can“bšM_e“None“b˜ecause“older“v² ersion“of“the“HTTPŽ¡‘3wprotoM_col–cêdon't›cérequire“HTTP‘cÚv² ersion˜to“bM_e˜told“bM_et•² w“een˜message–cêsource˜and“destinationޤz‘`¾method–¨‹setVersion“:“Http_types.version“->“unitŽŸÜŠ‘3wºset–¡kmessage“HTTP“v² ersionŽ¡‘`¾method–¨‹body“:“stringަ‘3w½Returns‘+¡ºmessage‘¡kb•M_o“dyŽ¡‘`¾method–¨‹setBody“:“string“->“unitŽŸÜŠ‘3wºset–¡kmessage“b•M_o“dyŽ¡‘`¾method–¨‹bodyBuf“:“Buffer.tަ‘3w½Returns‘+¡ºa–¡kBuer.t“connected“to“message“b•M_o“dy–¡k(W‘ÿãarning:‘Öçc² hanging“this“buer“willŽŸ ™š‘3wc² hange–¡kmessage“b•M_o“dy‘¡kto“o)Ž¡‘`¾method–¨‹setBodyBuf“:“Buffer.t“->“unitŽŸÜŠ‘3wºset–¡ka“new“Buer.t“used“to“k² eep“message“b•M_o“dyŽ¡‘`¾method–¨‹addBody“:“string“->“unitަ‘3wºappšM_end–¡ka“string“to“message“b˜o˜dyŽ¡‘`¾method–¨‹addBodyBuf“:“Buffer.t“->“unitŽŸÜŠ‘3wºappšM_end–¡ka“whole“buer“to“message“b˜o˜dyŽŸ)Ô@‘`½5.0.1Ž‘A™ÄÇhe›ÿqîader–¶6name“c˜omp˜arison‘¶5ar˜e“p˜erforme˜d“in“a“c˜ase-insensitive“manner‘¶5as“r˜e˜quir˜e˜d“byŽŸ ™š‘`RF¸öC2616,–ã=actual›Žly“the“implementation“works“c‘ÿqîonverting“al˜l“he›ÿqîader“names“in“lower˜c˜aseŽŸ‘`¾method–¨‹addHeader“:“name:string“->“value:string“->“unitަ‘3wºadd–¡kan“HTTP“headerŽ¡‘`¾method–¨‹addHeaders“:“(string“*“string)“list“->“unitŽŸÜŠ‘3wºadd–¡ka“list“of“HTTP“headersŽŽŸ’è'Ò7ŽŽŒ‹=Q Šn ýu‘ë ln ýž‘ë‘`¾method–¨‹replaceHeader“:“name:string“->“value:string“->“unitޤš‘3wºlik² e–¡kaddHeader“but“replace“previous“denition“of“the“same“headerŽ©™š‘`¾method–¨‹replaceHeaders“:“(string“*“string)“list“->“unitŽ¡‘3wºlikš² e–¡kaddHeaders“but“replace“previous“denition“of“headers“that“w˜ere“already“denedަ‘`¾method–¨‹removeHeader“:“name:string“->“unitŽ¡‘3wºremo•² v“e–¡k_all_“oM_ccurences“of“an“HTTP“header“from“the“messageަ‘`¾method–¨‹hasHeader“:“name:string“->“boolŽ¡‘3w½Returns‘+¡ºtrue–¡kif“giv² en“header“exists“in“message,“false“otherwiseަ‘`¾method–¨‹header“:“name:string“->“stringŽ¡‘3w½Raises–¡k¾Header_not_found“ºif“givš² en“header“w˜asn't“dened“in“messageŽŸ™š‘3w½Returns‘+¡ºv‘ÿeBalue–¡kassoM_ciated“to“a“giv² en“headerަ‘`¾method–¨‹headers“:“(string“*“string)“listŽ¡‘3w½Returns‘+¡ºthe–¡kfull“set“of“headers“dened“for“this“message,“the“v‘ÿeBalue“returned“is“anޤ ™š‘3wassošM_ciation–¡klist“from“headers“name“to“headers“v‘ÿeBalue,“an“header“ma² y“o˜ccurs“more“thatŽ¡‘3wonce–¡kin“the“listަ‘`¾method–¨‹clientSockaddr“:“Unix.sockaddrޤš‘3w½Returns‘+¡ºclien•² t‘¡kUnix.soM_c“k‘ÿeBaddrަ‘`¾method–¨‹clientAddr“:“stringŽ¡‘3w½Returns‘+¡ºclienš² t–¡kaddress“prett˜y“prin˜tedަ‘`¾method–¨‹clientPort“:“intŽ¡‘3w½Returns‘+¡ºclien² t‘¡kpM_ortަ‘`¾method–¨‹serverSockaddr“:“Unix.sockaddrŽ¡‘3w½Returns‘+¡ºserv•² er‘¡kUnix.soM_c“k‘ÿeBaddrަ‘`¾method–¨‹serverAddr“:“stringŽ¡‘3w½Returns‘+¡ºservš² er–¡kaddress“prett˜y“prin˜tedަ‘`¾method–¨‹serverPort“:“intŽ¡‘3w½Returns‘+¡ºserv² er‘¡kpM_ortަ‘`¾method–¨‹private“virtual“fstLineToString“:“stringŽŽŸ’è'Òº8ŽŽŒ‹ Dˆ Šn ýu‘ë ln ýž‘ë‘3w½Returns‘+¡ºfor–¡krequests“rst“request“line,“for“respšM_onses“rst“resp˜onse“line.‘ÖçUser“b² yŽŸ ™š‘3wderivš² ed–¡krequests“and“respM_onses“to“implemen˜t“toString“methoM_dޤ™š‘`¾method–¨‹toString“:“stringŽ©š‘3w½Returns‘+¡ºa–¡kstring“represen² tation“of“the“messageŽ¡‘`¾method–¨‹serialize“:“Pervasives.out_channel“->“unitަ‘3wºserialize–¡kthe“message“o•² v“er–¡kan“output“c² hannelŽŸš‘ ãL¾endŽŸ™š‘`ºOO–¡krepresen² tation“of“an“HTTP“messageŽŸ+7¼6Ž‘ÁMošpœdule–ÏÈHttp_misc“¼:‘é Help˜ers“and“other“not‘Îb˜etter“classied“func-ŽŸ‘Átions–G\whicch“should“not“bšpœe“exp˜osed“in“the“nal“APIŽŸ)ªÏ¾val–¨‹date_822“:“unit“->“stringŽ©™š‘`½Returns‘+¡ºthe–¡kcurrenš² t“date“complian˜t“to“RF˜C“1123,“whic˜h“upM_dates“RF˜C“822“zone“info“areŽŸ ™š‘`retriev² ed–¡kfrom“UTCŽ¡¾val–¨‹is_directory“:“string“->“boolަ‘`½Returns‘+¡ºtrue–¡kif“'name'“is“a“directory“on“the“le“system,“false“otherwiseŽ¡¾val–¨‹filesize“:“string“->“intަ‘`½Returns‘+¡ºthe–¡klesize“of“fnameŽ¡¾val–¨‹strip_trailing_slash“:“string“->“stringަ‘`ºstrip–¡ktrailing“'/',“if“an² y‘ÿã,“from“a“string“andŽŸš‘`½Returns‘+¡ºthe–¡knew“stringŽ¡¾val–¨‹strip_heading_slash“:“string“->“stringަ‘`ºstrip–¡kheading“'/',“if“an² y‘ÿã,“from“a“string“andŽŸš‘`½Returns‘+¡ºthe–¡knew“stringŽ¡¾val–¨‹ls“:“Unix.dir_handle“->“string“listަ‘`ºgiv² en–¡ka“dir“handleŽŸš‘`½Returns‘+¡ºa–¡klist“of“enš² tries“con˜tainedŽ¡¾val–¨‹string_explode“:“string“->“char“listަ‘`ºexploM_de–¡ka“string“in“a“c² har“listŽŽŸ’è'Ò9ŽŽŒ‹ KR Šn ýu‘ë ln ýž‘ë¾val–¨‹string_implode“:“char“list“->“stringޤ™š‘`ºimploM_de–¡ka“c² har“list“in“a“stringŽ©™š¾val–¨‹reason_phrase_of_code“:“int“->“stringŽ¡‘`ºgiv² en–¡kan“HTTP“respšM_onse“co˜de“return“the“corresp˜onding“reason“phraseަ¾val–¨‹build_sockaddr“:“string“*“int“->“Unix.sockaddrŽ¡‘`ºbuild–¡ka“Unix.soM_cš² k‘ÿeBaddr“inet“address“from“a“string“represen˜tation“of“an“IP“address“and“a“pM_ortŽŸ ™š‘`n•² um“bM_erަ¾val–¨‹explode_sockaddr“:“Unix.sockaddr“->“string“*“intŽ¡‘`ºexplošM_de–¡kan“_inet_“Unix.so˜cš² k‘ÿeBaddr“address“in“a“string“represen˜tation“of“an“IP“address“and“aŽŸ ™š‘`pšM_ort‘¡kn•² um“b˜erަ¾val–¨‹peername_of_out_channel“:“Pervasives.out_channel“->“Unix.sockaddrŽ¡‘`ºgivš² en–¡kan“out_c˜hannel“build“on“top“of“a“soM_c˜k˜et,“return“pšM_eername“related“to“that“so˜c•² k“etަ¾val–¨‹peername_of_in_channel“:“Pervasives.in_channel“->“Unix.sockaddrŽ¡‘`ºas›¡kabM_o•² v“e˜but˜w“orks˜on˜in_c“hannelsަ¾val–¨‹sockname_of_out_channel“:“Pervasives.out_channel“->“Unix.sockaddrŽ¡‘`ºgivš² en–¡kan“out_c˜hannel“build“on“top“of“a“soM_c˜k˜et,“return“soM_c˜kname“related“to“that“soM_c˜k˜etަ¾val–¨‹sockname_of_in_channel“:“Pervasives.in_channel“->“Unix.sockaddrŽ¡‘`ºas›¡kabM_o•² v“e˜but˜w“orks˜on˜in_c“hannelsަ¾val–¨‹buf_of_inchan“:“?limit:int“->“Pervasives.in_channel“->“Buffer.tŽ¡‘`ºreads–¡kfrom“an“input“c² hannel“till“it“End_of_le“and“returns“what“has“bM_een“read;“if“limit“isŽŸ ™š‘`givš² en–¡kreturned“buer“will“con˜tains“at“most“rst“'limit'“b˜ytes“read“from“input“c˜hannelަ¾val–¨‹list_assoc_all“:“'a“->“('a“*“'b)“list“->“'b“listŽ¡‘`ºlikš² e–¡kList.assoM_c“but“return“all“bindings“of“a“giv˜en“k˜ey“instead“of“the“leftmost“one“onlyަ¾val–¨‹warn“:“string“->“unitŽ¡‘`ºprinš² t–¡ka“w˜arning“msg“to“stderr.‘ÖçA˜dds“trailing“\nަ¾val–¨‹error“:“string“->“unitŽ¡‘`ºprinš² t–¡kan“error“msg“to“stderr.‘ÖçA˜dds“trailing“\nަ¾val–¨‹finally“:“(unit“->“unit)“->“('a“->“'b)“->“'a“->“'bŽ¡ŽŸ’ånÿº10ŽŽŒ‹ QÅ Šn ýu‘ë ln ýž‘ë¼7Ž‘ÁMopœdule–G\ÈHttp_parser“¼:‘ ÐHTTP“messages“parsingŽŸ)ªÏ¾val–¨‹split_query_params“:“string“->“(string“*“string)“listŽ©™š‘`ºgivš² en–¡kan“HTTP“lik˜e“query“string“(e.g.‘Öç"name1óKñ`y ó3 cmr10¹=ºv–ÿeBalue1&name2¹=ºv“alue2&Á:–Ó1:“:Ž‘ Æcº")ŽŸš‘`½Raisesޤ™š‘(ƒÜÄŽŽŽ‘3w¾Malformed_query–¡kºif“the“string“isn't“a“v‘ÿeBalid“query“stringŽŸ™š‘(ƒÜÄŽŽŽ‘3w¾Malformed_query_part–¡kºif“some“piece“of“the“query“isn't“v‘ÿeBalidŽ¡‘`½Returns‘+¡ºa–¡klist“of“pairs“¾("name1",–¨‹"value1");“("name2",“"value2")ŽŸ™šval–¨‹parse_request_fst_line“:ޤ ™š‘ QPervasives.in_channel‘¨‹->Ž¡‘ QHttp_types.meth–¨‹*“Neturl.url“*“Http_types.version“optionަ‘`ºparse–¡k1st“line“of“an“HTTP“requestŽŸš‘`½Raisesޤ™š‘(ƒÜÄŽŽŽ‘3w¾Malformed_request–¡kºif“request“1st“linst“isn't“w² ell“formedŽŸ™š‘(ƒÜÄŽŽŽ‘3w¾Malformed_request_URI–¡kºif“requested“URI“isn't“w² ell“formedŽ¡‘`½Returns‘+¡ºa–¡ktriple“meth“*“url“*“vš² ersion,“meth“is“the“HTTP“methoM_d“in˜v˜ok˜ed,“url“is“theޤ ™š‘`requested–¡kurl,“vš² ersion“is“the“HTTP“v˜ersion“spM_ecied“or“None“if“no“v˜ersion“w˜as“spM_eciedŽŸ™š¾val–¨‹parse_response_fst_line“:Ž¡‘ QPervasives.in_channel–¨‹->“Http_types.version“*“Http_types.statusަ‘`ºparse–¡k1st“line“of“an“HTTP“respM_onseŽŸš‘`½Raises–¡k¾Malformed_response“ºif“rst“line“isn't“w² ell“formedŽŸ™š¾val–¨‹parse_query_get_params“:“Neturl.url“->“(string“*“string)“listަ‘`ºparse–¡kHTTP“GET“parameters“from“an“URL;“paramater“whicš² h“w˜ere“passed“with“no“v‘ÿeBalueŽ¡‘`(lik² e–¡k'x'“in“"/fošM_o.cgi?a¹=º10&x¹=º&c¹=º9")“are“returned“asso˜ciated“with“the“empt² y“("")“string.ŽŸš‘`½Returns‘+¡ºa–¡klist“of“pairs“param_name“*“param_v‘ÿeBalueޤ™š¾val–¨‹parse_path“:“Neturl.url“->“stringަ‘`ºparse–¡kthe“base“path“(remoš² ving“query“string,“fragmen˜t,“Á:–Ó1:“:Ž‘gκ.)‘Öçfrom“an“URLŽ¡¾val–¨‹parse_headers“:“Pervasives.in_channel“->“(string“*“string)“listަ‘`ºparse–¡kHTTP“headers.‘ÖçConsumes“also“trailing“CRLF“at“the“end“of“header“listޤš‘`½Raises–¡k¾Invalid_header“ºif“a“not“wš² ell“formed“header“is“encoun˜teredŽ¡‘`½Returns‘+¡ºa–¡klist“of“pairs“header_name“*“header_v‘ÿeBalueŽŸ™š¾val–¨‹parse_cookies“:“string“->“(string“*“string)“listŽŽŸ’ånÿº11ŽŽŒ‹ YÍ Šn ýu‘ë ln ýž‘ë‘`ºparse–¡ka“CošM_okie“header,“extracting“an“asso˜ciativ² e“list“Á<ºattribute“name,“attribute“v‘ÿeBalueÁ>º.‘ÖçSeeŽ© ™š‘`RF² C‘¡k2965ŽŸZ}‘`½Raises–¡k¾Malformed_cookies“ºif“ra² w_cošM_okies“do˜es“not“conform“to“RF² C“2965ޤZ~‘`½Returns‘+¡ºa–¡klist“of“pairs“cošM_okie_name“*“co˜okie_v‘ÿeBalueŽŸ'¾val–¨‹parse_request“:“Pervasives.in_channel“->“string“*“(string“*“string)“listŽŸÚ}‘`ºgivš² en–¡kan“input“c˜hannel,“reads“from“it“a“GET“HTTP“request“andŽ¡‘`½Returns‘+¡ºa–¡kpair“Á<ºpath,“query_paramsÁ>“ºwhere“path“is“a“string“represen² ting“the“requestedަ‘`path–¡kand“query_params“is“a“list“of“pairs“Á<ºname,“v‘ÿeBalueÁ>“º(the“GET“parameters)ŽŸ(¹¼8Ž‘ÁMopœdule–BPÈHttp_parser_sanity›BO¼:‘ ÿ·Sanitcy“test˜functions“related˜toŽŸ‘ÁHTTP–G\message“parsingŽŸ(ë³¾val–¨‹heal_header_name“:“string“->“unitŽ©Ú}‘`½Raises–¡k¾Invalid_header_name“ºif“name“isn't“a“v‘ÿeBalid“HTTP“header“nameޤ'¾val–¨‹heal_header_value“:“string“->“unitŽŸÚ~‘`½Raises–¡k¾Invalid_header_value“ºif“v›ÿeBalue“isn't“a“v˜alid“HTTP“header“v˜alueŽ¡¾val–¨‹heal_header“:“string“*“string“->“unitަ‘`½RaisesŽŸa‘(ƒÜÄŽŽŽ‘3w¾Invalid_header_name–¡kºif“name“isn't“a“v‘ÿeBalid“HTTP“header“nameŽŸa‘(ƒÜÄŽŽŽ‘3w¾Invalid_header_value–¡kºif“v›ÿeBalue“isn't“a“v˜alid“HTTP“header“v˜alueŽŸÞ ¾val–¨‹normalize_header_value“:“string“->“stringަ‘`ºremo•² v“e–¡kheading“and/or“trailing“L‘þʃWS“sequences“as“pM_er“RF² C2616Ž¡¾val–¨‹url_of_string“:“string“->“Neturl.urlŽ©Ú~‘`ºparse–¡kan“URL“from“a“string.ŽŸZ}‘`½Raises–¡k¾Malformed_URL“ºif“an“inš² v‘ÿeBalid“URL“is“encoun˜teredŽ¡¾val–¨‹string_of_url“:“Neturl.url“->“stringަ‘`ºprett•² y›¡kprin“t˜an˜URLŽŸ(¹¼9Ž‘ÁMopœdule–,ÈHttp_request“¼:‘æ8Ob‘á9ject‘+Orienšcted“represen˜tation“of“HTTPŽŸ‘ÁrequestsŽŸ(ë³¾class–¨‹request“:“Pervasives.in_channel“->“Http_types.requestŽŸÚ}‘`ºOO–¡krepresen² tation“of“an“HTTP“requestŽŽŸ’ånÿ12ŽŽŒ‹ bê Šn ýu‘ë ln ýž‘ë¼10Ž‘¬%Mopœdule–„èÈHttp_response“¼:‘(–Ob‘á9ject“Orienšcted“represen˜tation“of“HTTPޤ‘¬%resppœonsesŽŸ) ß¾class–¨‹response“:“?body:string“->“?headers:(string“*“string)“list“->“?version:Http_types.version“->“?clisockaddr:Unix.sockaddr“->“?srvsockaddr:Unix.sockaddr“->“?code:int“->“?status:Http_types.status“->“unit“->“Http_types.responseŽ©ª‘`ºOO–¡krepresen² tation“of“an“HTTP“respM_onse.ŽŸ+X ¼11Ž‘¬%Mopœdule›¡ÈHttp_tcp_server–¢¼:‘ ¤[TCP‘+servcers“used˜as“lo•cw-lev“els˜forŽ¡‘¬%HTTP‘G\daemonsŽŸ'5Ê11.1Ž‘%}¨serv ersŽŸ¡¾val–¨‹simple“:“Http_types.tcp_serverަ‘`ºsingle–¡kproM_cess“serv² erޤqÚ¾val–¨‹thread“:“Http_types.tcp_serverަ‘`ºmš² ulti–¡kthreaded“serv˜erŽ¡¾val–¨‹fork“:“Http_types.tcp_serverަ‘`ºmš² ulti–¡kproM_cess“serv˜erŽŸ&*`Ê11.2Ž‘%}¨lo• w›¸lev“el˜functionsŽŸ¡¾val–¨‹init_socket“:“Unix.sockaddr“->“Unix.file_descrަ‘`ºinitialize–¡ka“passivš² e“soM_c˜k˜et“listening“on“giv˜en“Unix.soM_c˜k‘ÿeBaddrޤ+X ¼12Ž‘¬%Mopœdule–„èÈHttp_threaded_tcp_server“¼:‘(–Multithreaded“part“of“Http_tcp_servcerŽŸ) ß¾val–¨‹serve“:“('a“->“'b)“->“'a“->“unitަ‘`ºservš² e–¡kan“HTTP“request“for“a“m˜ulti“threaded“TCP“serv˜erŽ¡¼13Ž‘¬%Mošpœdule–G\ÈHttp_types“¼:‘ ÐTcyp˜e“denitionsŽŸ) ß¾type–¨‹version“=“[“`HTTP_1_0“|“`HTTP_1_1“]ަ‘`ºHTTP–¡kv² ersion,“actually“only“1.0“and“1.1“are“suppšM_orted.‘ÖçNote“that“'supp˜orted'“here“meansޤ ™š‘`only–v«'accepted›v¬inside“a“HTTP‘v¡request“line',‘8no˜dierenš² t“bM_eha˜viours“are‘v¬actually“implemen˜tedŽ¡‘`depM_ending–¡kon“HTTP“v² ersionŽŽŸ’ånÿ13ŽŽŒ‹jÏ Šn ýu‘ë ln ýž‘ë¾type–¨‹meth“=“[“`GET“|“`POST“]ޤ™š‘`ºHTTP–¡kmethošM_d,“actually“only“GET“and“POST“metho˜ds“are“supp˜ortedŽ©™š¾type–¨‹daemon_mode“=“[“`Fork“|“`Single“|“`Thread“]Ž¡‘`ºDaemon–¡kbšM_eha² viour“wrt“request“handling.‘Öç`Single“mo˜de“use“a“single“pro˜cess“to“handle“allޤ ™š‘`requests,–¡kno“request“is“servš² ed“un˜til“a“previous“one“has“bM_een“fully“serv˜ed.‘Öç`F‘ÿãork“moM_de“fork“aŽ¡‘`new–¡kprošM_cess“for“eac² h“request,“the“new“pro˜cess“will“execute“the“callbac² k“function“and“thenŽ¡‘`exit.‘Öç`Thread–¡kmoM_de“create“a“new“thread“for“eac² h“request,“the“new“thread“will“execute“theŽ¡‘`callbacš² k–¡kfunction“and“then“exit,“threads“can“comm˜unicate“using“standard“OCaml“ThreadŽ¡‘`library‘ÿã.ަ¾type–¨‹tcp_server“=“sockaddr:Unix.sockaddr“->Ž¡‘ Qtimeout:int–¨‹option“->Ž¡‘ Q(Pervasives.in_channel–¨‹->“Pervasives.out_channel“->“unit)“->“unitŽŸ™š‘`ºA–¡kTCP“servš² er“is“a“function“taking“an“address“on“whic˜h“bind“and“listen“for“connections,“anŽ¡‘`optional–¡ktimeout“after“whicš² h“abM_ort“clien˜t“connections“and“a“callbac˜k“function“whic˜h“in“turnŽ¡‘`takš² es–¡kan“input“and“an“output“c˜hannel“as“argumen˜ts.‘ÖçAfter“receiving“this“argumen˜t“a“TCPŽ¡‘`servš² er–¡ksits“and“w˜aits“for“connection,“on“eac˜h“connection“it“apply“the“callbac˜k“function“toŽ¡‘`cš² hannels–¡kconnected“to“clien˜t.ަ¾type–¨‹auth_info“=“[“`Basic“of“string“*“string“]ޤ™š‘`ºauthen² tication‘¡kinformationަ¾type–¨‹informational_substatus“=“[“`Continue“|“`Switching_protocols“]Ž¡‘`½See‘+¡also–¡kÇRF¸öC2616“ºinformational“HTTP“statusަ¾type–¨‹success_substatus“=“[“`Acceptedޤ ™š‘ Q|‘¨‹`CreatedŽ¡‘ Q|‘¨‹`No_contentŽ¡‘ Q|‘¨‹`Non_authoritative_informationŽ¡‘ Q|‘¨‹`OKŽ¡‘ Q|‘¨‹`Partial_contentŽ¡‘ Q|–¨‹`Reset_content“]ŽŸ™š‘`½See‘+¡also–¡kÇRF¸öC2616“ºsuccess“HTTP“statusަ¾type–¨‹redirection_substatus“=“[“`FoundŽ¡‘ Q|‘¨‹`Moved_permanentlyŽ¡‘ Q|‘¨‹`Multiple_choicesŽ¡‘ Q|‘¨‹`Not_modifiedŽ¡‘ Q|‘¨‹`See_otherŽ¡‘ Q|‘¨‹`Temporary_redirectŽ¡‘ Q|–¨‹`Use_proxy“]ŽŸ™š‘`½See‘+¡also–¡kÇRF¸öC2616“ºredirection“HTTP“statusŽŽŸ’ånÿ14ŽŽŒ‹qT Šn ýu‘ë ln ýž‘ë¾type–¨‹client_error_substatus“=“[“`Bad_requestޤ ™š‘ Q|‘¨‹`ConflictŽ¡‘ Q|‘¨‹`Expectation_failedŽ¡‘ Q|‘¨‹`ForbiddenŽ¡‘ Q|‘¨‹`GoneŽ¡‘ Q|‘¨‹`Length_requiredŽ¡‘ Q|‘¨‹`Method_not_allowedŽ¡‘ Q|‘¨‹`Not_acceptableŽ¡‘ Q|‘¨‹`Not_foundŽ¡‘ Q|‘¨‹`Payment_requiredŽ¡‘ Q|‘¨‹`Precondition_failedŽ¡‘ Q|‘¨‹`Proxy_authentication_requiredŽ¡‘ Q|‘¨‹`Request_URI_too_largeŽ¡‘ Q|‘¨‹`Request_entity_too_largeŽ¡‘ Q|‘¨‹`Request_time_outŽ¡‘ Q|‘¨‹`Requested_range_not_satisfiableŽ¡‘ Q|‘¨‹`UnauthorizedŽ¡‘ Q|–¨‹`Unsupported_media_type“]Ž©ô¶‘`½See‘+¡also–¡kÇRF¸öC2616“ºclien² t“error“HTTP“statusŽŸ ¾type–¨‹server_error_substatus“=“[“`Bad_gatewayŽ¡‘ Q|‘¨‹`Gateway_time_outŽ¡‘ Q|‘¨‹`HTTP_version_not_supportedŽ¡‘ Q|‘¨‹`Internal_server_errorŽ¡‘ Q|‘¨‹`Not_implementedŽ¡‘ Q|–¨‹`Service_unavailable“]ަ‘`½See‘+¡also–¡kÇRF¸öC2616“ºserv² er“error“HTTP“statusŽŸ ¾type–¨‹informational_status“=“[“`Informational“of“informational_substatus“]ަtype–¨‹success_status“=“[“`Success“of“success_substatus“]ŽŸô·type–¨‹redirection_status“=“[“`Redirection“of“redirection_substatus“]ަtype–¨‹client_error_status“=“[“`Client_error“of“client_error_substatus“]ަtype–¨‹server_error_status“=“[“`Server_error“of“server_error_substatus“]ަtype–¨‹error_status“=“[“`Client_error“of“client_error_substatusŽ¡‘ Q|–¨‹`Server_error“of“server_error_substatus“]ަtype–¨‹status“=“[“`Client_error“of“client_error_substatusŽ¡‘ Q|–¨‹`Informational“of“informational_substatusŽ¡‘ Q|–¨‹`Redirection“of“redirection_substatusŽ¡‘ Q|–¨‹`Server_error“of“server_error_substatusŽ¡‘ Q|–¨‹`Success“of“success_substatus“]ަ‘`ºHTTP‘¡kstatusŽŸ ¾type–¨‹status_code“=“[“`Code“of“int“|“`Status“of“status“]ަtype–¨‹file_source“=Ž¡‘ Q|–¨‹FileSrc“of“stringŽŽŸ’ånÿº15ŽŽŒ‹yð Šn ýu‘ë ln ýž‘ë‘:asºlenameŽŸBF‘ Q¾|–¨‹InChanSrc“of“Pervasives.in_channelŽŸmñ‘:asºinput‘¡kc² hannelޤmð‘`File‘¡ksourcesŽŸ%¥gÊ13.1Ž‘%}¨ExceptionsŽŸä¾exception–¨‹Invalid_header“of“stringŽ¡‘`ºinš² v‘ÿeBalid–¡kheader“encoun˜teredŽ©êó¾exception–¨‹Invalid_header_name“of“stringŽ¡‘`ºinš² v‘ÿeBalid–¡kheader“name“encoun˜teredަ¾exception–¨‹Invalid_header_value“of“stringŽ¡‘`ºin² v›ÿeBalid–¡kheader“v˜alue“encoun² teredޤêò¾exception–¨‹Invalid_HTTP_version“of“stringŽ©mñ‘`ºunsuppM_orted–¡kor“inš² v‘ÿeBalid“HTTP“v˜ersion“encoun˜teredŽ¡¾exception–¨‹Invalid_HTTP_method“of“stringަ‘`ºunsuppšM_orted–¡kor“in² v‘ÿeBalid“HTTP“metho˜d“encoun² teredŽ¡¾exception–¨‹Invalid_code“of“intަ‘`ºinš² v‘ÿeBalid–¡kHTTP“status“coM_de“in˜teger“represen˜tation“encoun˜teredŽ¡¾exception–¨‹Malformed_URL“of“stringަ‘`ºinš² v‘ÿeBalid–¡kURL“encoun˜teredŽ¡¾exception–¨‹Malformed_query“of“stringޤmð‘`ºinš² v‘ÿeBalid–¡kquery“string“encoun˜teredŽ©êó¾exception–¨‹Malformed_query_part“of“string“*“stringŽ¡‘`ºinš² v‘ÿeBalid–¡kquery“string“part“encoun˜tered,“argumen˜ts“are“parameter“name“and“parameter“v‘ÿeBalueަ¾exception–¨‹Malformed_request_URI“of“stringŽ¡‘`ºinš² v‘ÿeBalid–¡krequest“URI“encoun˜teredަ¾exception–¨‹Malformed_cookies“of“stringŽ¡‘`ºmalformed‘¡kcoM_okiesަ¾exception–¨‹Malformed_request“of“stringŽ¡‘`ºmalformed–¡krequest“receiv² edަ¾exception–¨‹Malformed_response“of“stringŽŽŸ’ånÿº16ŽŽŒ‹I Šn ýu‘ë ln ýž‘ë‘`ºmalformed–¡krespM_onse“receivš² ed,“argumen˜t“is“respM_onse's“rst“lineޤ¾exception–¨‹Param_not_found“of“stringŽ©sÛ‘`ºa–¡kparameter“yš² ou“w˜ere“loM_oking“for“w˜as“not“foundŽ¡¾exception–¨‹Invalid_status_line“of“stringަ‘`ºinš² v‘ÿeBalid–¡kHTTP“status“line“encoun˜teredŽ¡¾exception–¨‹Header_not_found“of“stringަ‘`ºan–¡kheader“yš² ou“w˜ere“loM_oking“for“w˜as“not“foundŽ¡¾exception‘¨‹Quitަ‘`ºraisable–¡kbš² y“callbac˜ks“to“mak˜e“main“daemon“quit,“this“is“the“only“'clean'“w˜a˜y“to“mak˜e“startŽŸ ™š‘`functions‘¡kreturnŽ¡¾exception–¨‹Unauthorized“of“stringަ‘`ºraisable–¡kbš² y“callbac˜ks“to“force“a“401“(unauthorized)“HTTP“answ˜er.‘ÖçThis“exception“should“bM_eޤ ™š‘`raised–¡k_bM_efore_“sending“anš² y“data“o˜v˜er“giv˜en“out“c˜hannel.ŽŸ%¼»Ê13.2Ž‘%}¨OO–¸represen tation“of“HTTP“messagesŽŸ…ξclass–¨‹type“message“=Ž¡‘ ãLobjectŽŸ\Þ‘`method–¨‹version“:“Http_types.version“optionަ‘`method–¨‹setVersion“:“Http_types.version“->“unitަ‘`method–¨‹body“:“stringަ‘`method–¨‹setBody“:“string“->“unitަ‘`method–¨‹bodyBuf“:“Buffer.tޤsÚ‘`method–¨‹setBodyBuf“:“Buffer.t“->“unitަ‘`method–¨‹addBody“:“string“->“unitަ‘`method–¨‹addBodyBuf“:“Buffer.t“->“unitަ‘`method–¨‹addHeader“:“name:string“->“value:string“->“unitަ‘`method–¨‹addHeaders“:“(string“*“string)“list“->“unitŽ¡‘`method–¨‹replaceHeader“:“name:string“->“value:string“->“unitަ‘`method–¨‹replaceHeaders“:“(string“*“string)“list“->“unitަ‘`method–¨‹removeHeader“:“name:string“->“unitަ‘`method–¨‹hasHeader“:“name:string“->“boolަ‘`method–¨‹header“:“name:string“->“stringŽ¡‘`method–¨‹headers“:“(string“*“string)“listަ‘`method–¨‹clientSockaddr“:“Unix.sockaddrަ‘`method–¨‹clientAddr“:“stringŽŽŸ’ånÿº17ŽŽŒ‹‡A Šn ýu‘ë ln ýž‘ë‘`¾method–¨‹clientPort“:“intޤ™š‘`method–¨‹serverSockaddr“:“Unix.sockaddrŽ¡‘`method–¨‹serverAddr“:“stringŽ¡‘`method–¨‹serverPort“:“intŽ¡‘`method–¨‹toString“:“stringŽ¡‘`method–¨‹serialize“:“Pervasives.out_channel“->“unitŽ©š‘ ãLendޤ™š‘`ºHTTP–¡kgeneric“messages.‘ÖçSee“¾Http_message.messageº[5]ŽŸ™š¾class–¨‹type“request“=ŽŸ ™š‘ ãLobjectŽ¡‘`inherit‘¨‹Http_types.message‘¡kº[13.2]ަ‘`an–¡kHTTP“request“is“a“a•² v“our–¡kof“HTTP“messageŽŸ™š‘`¾method–¨‹meth“:“Http_types.methޤš‘3w½Returns‘+¡ºrequest‘¡kmethoM_dŽ©™š‘`¾method–¨‹uri“:“stringŽ¡‘3w½Returns‘+¡ºrequested–¡kURI“(including“query“string,“fragmen² t,“Á:–Ó1:“:Ž‘gκ)ަ‘`¾method–¨‹path“:“stringŽ¡‘3w½Returns‘+¡ºrequested‘¡kpathަ‘`¾method–¨‹param“:“?meth:Http_types.meth“->“?default:string“->“string“->“stringŽ¡‘3wºloM_okup–¡ka“giv² en“parameterޤ™š‘3w½Raises–¡k¾Param_not_found“ºif“parameter“name“w² as“not“foundŽ¡‘3w½Returns‘+¡ºv‘ÿeBalue–¡kassoM_ciated“to“parameter“nameަ‘`¾method–¨‹paramAll“:“?meth:Http_types.meth“->“string“->“string“listŽŸš‘3wºlikš² e–¡kparam“abM_o˜v˜e“but“return“a“list“of“v‘ÿeBalues“assoM_ciated“to“giv˜en“parameter“(a“parameterޤ ™š‘3wcould–¡kbM_e“dened“indeed“more“than“once:‘Öçpassed“more“than“once“in“a“query“string“orŽ¡‘3wpassed–¡kbšM_oth“insider“the“url“(the“GET“w•² a“y)–¡kand“inside“message“b˜o˜dy“(the“POST“w•² a“y))ަ‘`¾method–¨‹params“:“(string“*“string)“listޤš‘3w½Returns‘+¡ºthe–¡klist“of“all“receiv² ed“parametersަ‘`¾method–¨‹params_GET“:“(string“*“string)“listŽ¡‘3w½Returns‘+¡ºthe–¡klist“of“all“parameters“receiv² ed“via“GETަ‘`¾method–¨‹params_POST“:“(string“*“string)“listŽŽŸ’ånÿº18ŽŽŒ‹Ž… Šn ýu‘ë ln ýž‘ë‘3w½Returns‘+¡ºthe–¡klist“of“all“parameter“receiv² ed“via“POSTޤ™š‘`¾method–¨‹cookies“:“(string“*“string)“list“optionŽŸ™š‘`method–¨‹authorization“:“Http_types.auth_info“optionŽŸš‘3w½Returns‘+¡ºauthorization–¡kinformation,“if“givš² en“b˜y“the“clien˜tŽŸš‘ ãL¾endŽ©™š‘`ºHTTP‘¡krequestsŽ¡¾class–¨‹type“response“=ŽŸ ™š‘ ãLobjectަ‘`inherit‘¨‹Http_types.message‘¡kº[13.2]ŽŸ™š‘`¾method–¨‹code“:“intŽ©š‘3w½Returns‘+¡ºresp•M_onse‘¡kco“deŽ¡‘`¾method–¨‹setCode“:“int“->“unitަ‘3wºset–¡krespšM_onse“co˜deŽ¡‘`¾method–¨‹status“:“Http_types.statusަ‘3w½Returns‘+¡ºrespM_onse‘¡kstatusŽ¡‘`¾method–¨‹setStatus“:“Http_types.status“->“unitަ‘3wºset–¡krespM_onse“statusŽ¡‘`¾method–¨‹reason“:“stringަ‘3w½Returns‘+¡ºreason‘¡kstringŽ¡‘`¾method–¨‹setReason“:“string“->“unitަ‘3wºset–¡kreason“stringŽ¡‘`¾method–¨‹statusLine“:“stringަ‘3w½Returns‘+¡ºstatus‘¡klineŽ¡‘`¾method–¨‹setStatusLine“:“string“->“unitަ‘3wºset–¡kstatus“lineŽŸ™š‘3w½Raises–¡k¾Invalid_status_line“ºif“an“inš² v‘ÿeBalid“HTTP“status“line“w˜as“passedŽ¡‘`¾method–¨‹isInformational“:“boolަ‘3wºrespM_onse–¡kis“an“informational“oneŽŽŸ’ånÿ19ŽŽŒ‹•ˆ Šn ýu‘ë ln ýž‘ë‘`¾method–¨‹isSuccess“:“boolޤÄî‘3wºrespM_onse–¡kis“a“success“oneŽ©ðC‘`¾method–¨‹isRedirection“:“boolŽ¡‘3wºrespM_onse–¡kis“a“redirection“oneަ‘`¾method–¨‹isClientError“:“boolŽ¡‘3wºrespM_onse–¡kis“a“clien² t“error“oneޤðB‘`¾method–¨‹isServerError“:“boolŽ©Äï‘3wºrespM_onse–¡kis“a“serv² er“error“oneŽ¡‘`¾method–¨‹isError“:“boolަ‘3wºrespM_onse–¡kis“either“a“clienš² t“error“or“a“serv˜er“error“respM_onseŽ¡‘`¾method–¨‹addBasicHeaders“:“unitޤÄî‘3wºadd–¡kbasic“headers“to“respM_onse,“see“¾Http_daemon.send_basic_headersº[4]ŽŸ)™é‘`½13.2.1Ž‘GÛfacilities–+¡to“access“some“frequen§tly“used“headersŽŸ7‘`¾method–¨‹contentType“:“stringŽ¡‘3w½Returns‘+¡ºCon•² ten“t-T“ypM_e–¡kheader“v‘ÿeBalueŽŸðC‘`¾method–¨‹setContentType“:“string“->“unitŽ¡‘3wºset›¡kCon•² ten“t-T“ypM_e˜header˜v‘ÿeBalueޤðB‘`¾method–¨‹contentEncoding“:“stringަ‘3w½Returns‘+¡ºCon•² ten“t-EncoM_ding–¡kheader“v‘ÿeBalueŽ¡‘`¾method–¨‹setContentEncoding“:“string“->“unitަ‘3wºset›¡kCon•² ten“t-EncoM_ding˜header˜v‘ÿeBalueŽ¡‘`¾method–¨‹date“:“stringޤÄî‘3w½Returns‘+¡ºDate–¡kheader“v‘ÿeBalueŽ©ðC‘`¾method–¨‹setDate“:“string“->“unitŽ¡‘3wºset–¡kDate“header“v‘ÿeBalueަ‘`¾method–¨‹expires“:“stringŽ¡‘3w½Returns‘+¡ºExpires–¡kheader“v‘ÿeBalueŽŽŸ’ånÿ20ŽŽŒ‹š| Šn ýu‘ë ln ýž‘ë‘`¾method–¨‹setExpires“:“string“->“unitޤꉑ3wºset–¡kExpires“header“v‘ÿeBalueŽ©;w‘`¾method–¨‹server“:“stringŽ¡‘3w½Returns‘+¡ºServ² er–¡kheader“v‘ÿeBalueޤ;x‘`¾method–¨‹setServer“:“string“->“unitŽŸꈑ3wºset–¡kServ² er“header“v‘ÿeBalueŽ¡‘`¾method–¨‹connection“:“stringޤꉑ3w½Returns‘+¡ºConnection–¡kheader“v‘ÿeBalueަ‘`¾method–¨‹setConnection“:“string“->“unitŽ¡‘3wºset–¡kConnection“header“v‘ÿeBalueŽŸ»w‘ ãL¾endŽŸS‘`ºHTTP‘¡krespM_onsesŽŸ%ôÅÊ13.3Ž‘%}¨Daemon‘¸sp_úecicationŽŸ”¾type–¨‹daemon_spec“=“{ޤ ™š‘ Qaddress–¨‹:“string“;Ž¡‘ Qauth–¨‹:“(string“*“auth_info)“option“;Ž©‚‘:asºauthen•² tication›¡krequiremen“ts˜(curren“tly˜only˜basic˜authen“tication˜is˜suppM_orted).‘ÖçIf˜setŽ¡‘6Àto–¡kNone“no“authen² tication“is“required.‘ÖçIf“set“to“Some“("realm",“`Basic“("foM_o",“"bar")),Ž¡‘6Àonly–¡kclienš² ts“authen˜ticated“with“baisc“authen˜tication,“for“realm“"realm",“pro˜vidingŽ¡‘6Àusername–¡k"foM_o"“and“passw² ord“"bar"“are“accepted;“others“are“rejected“with“a“401Ž¡‘6Àresp•M_onse‘¡kco“deŽŸj‰‘ Q¾callback–¨‹:“request“->“Pervasives.out_channel“->“unit“;ަ‘:asºfunction–¡kwhicš² h“will“bM_e“called“eac˜h“time“a“correct“HTTP“request“will“bM_e“receiv˜ed.‘Öç1stŽ¡‘6Àcallbac•² k›¡kargumen“t˜is˜an˜Http_t“yp•M_es.request˜ob‘š½ject˜corresp“onding˜to˜the˜requestŽ¡‘6Àreceivš² ed;–¡k2nd“argumen˜t“is“an“output“c˜hannel“correspšM_onding“to“the“so˜c•² k“et–¡kconnected“toŽ¡‘6Àthe‘¡kclien² tŽŸj‰‘ Q¾mode–¨‹:“daemon_mode“;ŽŸ‚‘:asºrequests–¡khandling“moM_de,“it“can“ha•² v“e–¡kthree“dieren² t“v‘ÿeBalues:ŽŸjˆ‘CãàÄŽŽŽ‘N׺`Single–¡kÄ!“ºall“requests“will“bšM_e“handled“b² y“the“same“pro˜cess,ޤj‰‘CãàÄŽŽŽ‘N׺`F‘ÿãork–¡kÄ!“ºeacš² h“request“will“bM_e“handled“b˜y“a“c˜hild“proM_cess,Ž¡‘CãàÄŽŽŽ‘N׺`Thread–¡kÄ!“ºeacš² h“request“will“bM_e“handled“b˜y“a“(new)“threadŽŸS‘ Q¾port–¨‹:“int“;ŽŽŸ’ånÿº21ŽŽŒ‹Ÿñ Šn ýu‘ë ln ýž‘ë‘:asºTCP–¡kpšM_ort“on“whic² h“the“daemon“will“b˜e“listeningޤ™š‘ Q¾root_dir–¨‹:“string“option“;Ž©™š‘:asºdirectory–¡kto“whicš² h“oM_caml“h˜ttp“will“c˜hdir“bM_efore“starting“handling“requests;“if“None,“noŽŸ ™š‘6Àc² hdir–¡kwill“bšM_e“p˜erformed“(i.e.‘Öçstaš² y“in“the“curren˜t“w˜orking“directory)Ž¡‘ Q¾exn_handler–¨‹:“(exn“->“Pervasives.out_channel“->“unit)“option“;ަ‘:9Tºwhat–yKto›yLdo“when˜executing“callbac² k˜raises“an˜exception.‘ɇIf˜None,‘Qthe˜exception“will˜bM_eޤ ™š‘6Àre-raised:‘Öçin–¡k`F‘ÿãork/`Thread“mošM_de“the“curren² t“pro˜cess/thread“will“b˜e“terminated.‘ÖçinŽ¡‘6À`Single–¡kmošM_de“the“exception“is“ignored“and“the“clien² t“so˜c•² k“et–¡kclosed.‘ÖçIf“Some“callbac² k,Ž¡‘6Àthe–¡kcallbac² k“will“bšM_e“executed“b˜efore“acting“as“p˜er“None;“the“callbacš² k“is“mean˜t“toŽ¡‘6ÀpM_erform–¡ksome“clean“up“actions,“likš² e“releasing“global“m˜utexes“in“`Thread“moM_deŽŸ™š‘ Q¾timeout–¨‹:“int“option“;ަ‘:asºtimeout–¡kin“seconds“after“whic² h“an“incoming“HTTP“request“will“bM_e“terminated“closingŽ¡‘6Àthe–¡kcorrespM_onding“TCP“connection;“None“disable“the“timeoutŽŸ™š‘ Q¾auto_close–¨‹:“bool“;ަ‘:asºwhether–¡koM_caml-hš² ttp“will“automatically“close“the“connection“with“the“clien˜t“afterŽ¡‘6Àcallbac² k–¡khas“completed“its“execution.‘ÖçIf“set“to“true,“close“will“bM_e“attempted“no“matterŽ¡‘6Àif–¡kthe“callbac² k“raises“an“exception“or“notŽŸ™š¾}ަ‘`ºdaemon–¡kspšM_ecication,“describ˜e“the“b˜eha² viour“of“an“HTTP“daemon.ŽŸš‘`The–¡kdefault“daemon“spM_ecication“is“¾Http_daemon.default_specº[4]ŽŸ&QŽÊ13.4Ž‘%}¨OO–¸represenš tation“of“other“HTTP“en˜titiesŽŸ«¾class–¨‹type“connection“=Ž¡‘ ãLobjectޤš‘`method–¨‹getRequest“:“Http_types.request“optionŽ¡‘3w½Returns‘+¡ºnext–¡krequest“ob‘š½ject,“maš² y“bloM_c˜k“if“clien˜t“hasn't“submitted“an˜y“request“y˜et,ŽŸ ™š‘3wmaš² y–¡kbM_e“None“if“clien˜t“request“w˜as“ill-formedŽ©™š‘`¾method–¨‹respond_with“:“Http_types.response“->“unitŽ¡‘3wºrespšM_ond–¡kto“clien² t“sending“it“a“resp˜onseަ‘`¾method–¨‹close“:“unitŽ¡‘3wºclose–¡kconnection“to“clienš² t.–ÖçW‘ÿãarning:“this–¡kob‘š½ject“can't“bM_e“used“an˜y“longer“after“thisŽŸ ™š‘3wmethošM_d–¡khas“b˜een“calledŽŸš‘ ãL¾endŽŸ™š‘`ºan–¡kHTTP“connection“from“a“clienš² t“to“a“serv˜erŽŽŸ’ånÿ22ŽŽŒ‹§¿ Šn ýu‘ë ln ýž‘ë¾class–¨‹type“daemon“=Ž© ™š‘ ãLobjectޤš‘`method–¨‹accept“:“Http_types.connectionŽ¡‘3w½Returns‘+¡ºa–¡kconnection“to“a“clienš² t,“ma˜y“bloM_c˜k“if“no“clien˜t“has“connected“y˜etŽŸ™š‘`¾method–¨‹getRequest“:“Http_types.request“*“Http_types.connectionŽ¡‘3wºshortcut–¡kmethošM_d,“blo˜cš² ks“un˜til“a“clien˜t“has“submit“a“request“and“return“a“pair“request“*ަ‘3wconnectionŽŸš‘ ãL¾endŽŸ™š‘`ºan–¡kHTTP“daemonŽŸ+7¼14Ž‘¬%Mopœdule›}ÈHttp_user_agent–|¼:‘iaMinimal“implemenctation˜of“an˜HTTPŽŸ‘¬%1.0/1.1‘G\clienct.ŽŸpܺInš² terface–¢mis“similar“to“Gerd“Stoplmann's‘¢nHttp_clien˜t“moM_dule.‘èImplemen˜tation“is“simpler“and“doM_esn'tަhandle–âŽHTTP‘â“(string“*“string)“list“->“unit)“->ަ‘ Qstring–¨‹->“stringŽ¡‘`½Raises–¡k¾Http_error“ºwhen“respšM_onse“co˜de“Á<>“º200ŽŸš‘`½Returns‘+¡ºHTTP–¡krespšM_onse's“b˜o˜dyŽŸ™š¾val–¨‹get_iter“:ަ‘ Q?head_callback:(Http_types.status–¨‹->“(string“*“string)“list“->“unit)“->ަ‘ Q(string–¨‹->“unit)“->“string“->“unitŽ¡‘`ºas›¡kabM_o•² v“e˜but˜iter˜callbac“k˜function˜on˜HTTP˜resp•M_onse's˜b“o“dy˜instead˜of˜returning˜it˜as˜aަ‘`stringŽŸ™š¾val–¨‹head“:“string“->“stringŽ¡‘`½Raises–¡k¾Http_error“ºwhen“respšM_onse“co˜de“Á<>“º200ŽŸš‘`½Returns‘+¡ºHTTP–¡kHEAD“ra² w“respM_onseŽŽŸ’ånÿ23ŽŽŒø±ƒ’À;èŠnÕÁIó¥!¢N ecbx1200óÄN½¿ffffectt1440ó–¤ð ó3 ó3ecti1095ó!",š ó3 cmsy10ó  b> ó3 cmmi10óÚvªh ó3 ó3ectt1095óíÄ]] ó3 ó3ecbx1095ó&Lt$ffffecbx1440ó$•Hd ó3 ó3ecrm1095óKñ`y ó3 cmr10ù·¢ßßßßßßocaml-http_0.1.5/doc/latex/ocaml-http.log0000644000175000017500000001165611507240336017606 0ustar celticcelticThis is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian) (format=latex 2010.12.31) 31 DEC 2010 13:33 entering extended mode restricted \write18 enabled. %&-line parsing enabled. **ocaml-http (./ocaml-http.tex LaTeX2e <2009/09/24> Babel and hyphenation patterns for english, usenglishmax, dumylang, noh yphenation, loaded. (/usr/share/texmf-texlive/tex/latex/base/article.cls Document Class: article 2007/10/19 v1.4h Standard LaTeX document class (/usr/share/texmf-texlive/tex/latex/base/size11.clo File: size11.clo 2007/10/19 v1.4h Standard LaTeX file (size option) ) \c@part=\count79 \c@section=\count80 \c@subsection=\count81 \c@subsubsection=\count82 \c@paragraph=\count83 \c@subparagraph=\count84 \c@figure=\count85 \c@table=\count86 \abovecaptionskip=\skip41 \belowcaptionskip=\skip42 \bibindent=\dimen102 ) (/usr/share/texmf-texlive/tex/latex/base/inputenc.sty Package: inputenc 2008/03/30 v1.1d Input encoding file \inpenc@prehook=\toks14 \inpenc@posthook=\toks15 (/usr/share/texmf-texlive/tex/latex/base/latin1.def File: latin1.def 2008/03/30 v1.1d Input encoding file )) (/usr/share/texmf-texlive/tex/latex/base/fontenc.sty Package: fontenc 2005/09/27 v1.99g Standard LaTeX package (/usr/share/texmf-texlive/tex/latex/base/t1enc.def File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file LaTeX Font Info: Redeclaring font encoding T1 on input line 43. )) (/usr/share/texmf-texlive/tex/latex/preprint/fullpage.sty Package: fullpage 1999/02/23 1.1 (PWD) \FP@margin=\skip43 ) (/usr/share/texmf-texlive/tex/latex/ltxmisc/url.sty \Urlmuskip=\muskip10 Package: url 2006/04/12 ver 3.3 Verb mode for urls, etc. ) (./ocamldoc.sty Package: ocamldoc 2001/12/04 v1.0 ocamldoc support ) (./ocaml-http.aux) \openout1 = `ocaml-http.aux'. LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. (./ocaml-http.toc LaTeX Font Info: Try loading font information for T1+cmtt on input line 1. (/usr/share/texmf-texlive/tex/latex/base/t1cmtt.fd File: t1cmtt.fd 1999/05/25 v2.5h Standard LaTeX font definitions ) LaTeX Font Info: External font `cmex10' loaded for size (Font) <10.95> on input line 4. LaTeX Font Info: External font `cmex10' loaded for size (Font) <8> on input line 4. LaTeX Font Info: External font `cmex10' loaded for size (Font) <6> on input line 4. ) \tf@toc=\write3 \openout3 = `ocaml-http.toc'. [1 ] [2] LaTeX Font Info: Try loading font information for OMS+cmr on input line 384. (/usr/share/texmf-texlive/tex/latex/base/omscmr.fd File: omscmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions ) LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10.95> not available (Font) Font shape `OMS/cmsy/m/n' tried instead on input line 384. [3] [4] [5] Overfull \hbox (475.19293pt too wide) in paragraph at lines 757--757 \T1/cmtt/m/n/10.95 class virtual message : body:string -> headers:(string * str ing) list -> version:Http_types.version option -> clisockaddr:Unix.sockaddr -> srvsockaddr:Unix.sockaddr -> [] [6] [7] [8] [9] [10] [11] Overfull \hbox (5.5967pt too wide) in paragraph at lines 1611--1611 []\T1/cmr/bx/n/14.4 Module \T1/cmtt/m/n/14.4 Http_response \T1/cmr/bx/n/14.4 : Ob-ject Ori-ented rep-re-sen-ta-tion of HTTP [] Overfull \hbox (820.35356pt too wide) in paragraph at lines 1622--1622 \T1/cmtt/m/n/10.95 class response : ?body:string -> ?headers:(string * string) list -> ?version:Http_types.version -> ?clisockaddr:Unix.sockaddr -> ?srvsockad dr:Unix.sockaddr -> ?code:int -> ?status:Http_types.status -> unit -> Http_type s.response [] [12] Overfull \hbox (81.72089pt too wide) in paragraph at lines 1704--1704 []\T1/cmr/bx/n/14.4 Module \T1/cmtt/m/n/14.4 Http_threaded_tcp_server \T1/cmr/b x/n/14.4 : Mul-ti-threaded part of Http_tcp_server [] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] (./ocaml-http.aux) LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. ) Here is how much of TeX's memory you used: 892 strings out of 495062 20099 string characters out of 1182643 56293 words of memory out of 3000000 4109 multiletter control sequences out of 15000+50000 12330 words of font info for 32 fonts, out of 3000000 for 9000 28 hyphenation exceptions out of 8191 22i,5n,20p,301b,312s stack positions out of 5000i,500n,10000p,200000b,50000s Output written on ocaml-http.dvi (23 pages, 47284 bytes). ocaml-http_0.1.5/doc/latex/ocaml-http.tex0000644000175000017500000023566111507240336017631 0ustar celticceltic\documentclass[11pt]{article} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage{fullpage} \usepackage{url} \usepackage{ocamldoc} \begin{document} \tableofcontents \section{Module {\tt{Cookie\_lexer}}} \label{module:Cookie-underscorelexer}\index{Cookie-underscorelexer@\verb`Cookie_lexer`} \ocamldocvspace{0.5cm} \label{type:Cookie-underscorelexer.cookie-underscoretoken}\begin{ocamldoccode} type cookie_token = [ `ASSIGNMENT of string * string | `EOF | `SEP ] \end{ocamldoccode} \index{cookie-underscoretoken@\verb`cookie_token`} \label{val:Cookie-underscorelexer.token}\begin{ocamldoccode} val token : Lexing.lexbuf -> cookie_token \end{ocamldoccode} \index{token@\verb`token`} \section{Module {\tt{Http\_common}} : Common functionalities shared by other OCaml HTTP modules} \label{module:Http-underscorecommon}\index{Http-underscorecommon@\verb`Http_common`} \ocamldocvspace{0.5cm} \label{val:Http-underscorecommon.debug}\begin{ocamldoccode} val debug : bool Pervasives.ref \end{ocamldoccode} \index{debug@\verb`debug`} \begin{ocamldocdescription} whether debugging messages are enabled or not, can be changed at runtime \end{ocamldocdescription} \label{val:Http-underscorecommon.debug-underscoreprint}\begin{ocamldoccode} val debug_print : string -> unit \end{ocamldoccode} \index{debug-underscoreprint@\verb`debug_print`} \begin{ocamldocdescription} print a string on stderr only if debugging is enabled \end{ocamldocdescription} \label{val:Http-underscorecommon.http-underscoreversion}\begin{ocamldoccode} val http_version : Http_types.version \end{ocamldoccode} \index{http-underscoreversion@\verb`http_version`} \begin{ocamldocdescription} see {\tt{Http\_constants.version}}[\ref{val:Http-underscoreconstants.version}] \end{ocamldocdescription} \label{val:Http-underscorecommon.server-underscorestring}\begin{ocamldoccode} val server_string : string \end{ocamldoccode} \index{server-underscorestring@\verb`server_string`} \begin{ocamldocdescription} see {\tt{Http\_constants.server\_string}}[\ref{val:Http-underscoreconstants.server-underscorestring}] \end{ocamldocdescription} \label{val:Http-underscorecommon.string-underscoreof-underscoreversion}\begin{ocamldoccode} val string_of_version : Http_types.version -> string \end{ocamldoccode} \index{string-underscoreof-underscoreversion@\verb`string_of_version`} \begin{ocamldocdescription} pretty print an HTTP version \end{ocamldocdescription} \label{val:Http-underscorecommon.version-underscoreof-underscorestring}\begin{ocamldoccode} val version_of_string : string -> Http_types.version \end{ocamldoccode} \index{version-underscoreof-underscorestring@\verb`version_of_string`} \begin{ocamldocdescription} parse an HTTP version from a string {\bf Raises} {\tt{Invalid\_HTTP\_version}} if given string doesn't represent a supported HTTP version \end{ocamldocdescription} \label{val:Http-underscorecommon.string-underscoreof-underscoremethod}\begin{ocamldoccode} val string_of_method : Http_types.meth -> string \end{ocamldoccode} \index{string-underscoreof-underscoremethod@\verb`string_of_method`} \begin{ocamldocdescription} pretty print an HTTP method \end{ocamldocdescription} \label{val:Http-underscorecommon.method-underscoreof-underscorestring}\begin{ocamldoccode} val method_of_string : string -> Http_types.meth \end{ocamldoccode} \index{method-underscoreof-underscorestring@\verb`method_of_string`} \begin{ocamldocdescription} parse an HTTP method from a string {\bf Raises} {\tt{Invalid\_HTTP\_method}} if given string doesn't represent a supported method \end{ocamldocdescription} \label{val:Http-underscorecommon.status-underscoreof-underscorecode}\begin{ocamldoccode} val status_of_code : int -> Http_types.status \end{ocamldoccode} \index{status-underscoreof-underscorecode@\verb`status_of_code`} \begin{ocamldocdescription} converts an integer HTTP status to the corresponding status value {\bf Raises} {\tt{Invalid\_code}} if given integer isn't a valid HTTP status code \end{ocamldocdescription} \label{val:Http-underscorecommon.code-underscoreof-underscorestatus}\begin{ocamldoccode} val code_of_status : [< Http_types.status ] -> int \end{ocamldoccode} \index{code-underscoreof-underscorestatus@\verb`code_of_status`} \begin{ocamldocdescription} converts an HTTP status to the corresponding integer value \end{ocamldocdescription} \label{val:Http-underscorecommon.is-underscoreinformational}\begin{ocamldoccode} val is_informational : int -> bool \end{ocamldoccode} \index{is-underscoreinformational@\verb`is_informational`} \begin{ocamldocdescription} {\bf Returns }true on "informational" status codes, false elsewhere \end{ocamldocdescription} \label{val:Http-underscorecommon.is-underscoresuccess}\begin{ocamldoccode} val is_success : int -> bool \end{ocamldoccode} \index{is-underscoresuccess@\verb`is_success`} \begin{ocamldocdescription} {\bf Returns }true on "success" status codes, false elsewhere \end{ocamldocdescription} \label{val:Http-underscorecommon.is-underscoreredirection}\begin{ocamldoccode} val is_redirection : int -> bool \end{ocamldoccode} \index{is-underscoreredirection@\verb`is_redirection`} \begin{ocamldocdescription} {\bf Returns }true on "redirection" status codes, false elsewhere \end{ocamldocdescription} \label{val:Http-underscorecommon.is-underscoreclient-underscoreerror}\begin{ocamldoccode} val is_client_error : int -> bool \end{ocamldoccode} \index{is-underscoreclient-underscoreerror@\verb`is_client_error`} \begin{ocamldocdescription} {\bf Returns }true on "client error" status codes, false elsewhere \end{ocamldocdescription} \label{val:Http-underscorecommon.is-underscoreserver-underscoreerror}\begin{ocamldoccode} val is_server_error : int -> bool \end{ocamldoccode} \index{is-underscoreserver-underscoreerror@\verb`is_server_error`} \begin{ocamldocdescription} {\bf Returns }true on "server error" status codes, false elsewhere \end{ocamldocdescription} \label{val:Http-underscorecommon.is-underscoreerror}\begin{ocamldoccode} val is_error : int -> bool \end{ocamldoccode} \index{is-underscoreerror@\verb`is_error`} \begin{ocamldocdescription} {\bf Returns }true on "client error" and "server error" status code, false elsewhere \end{ocamldocdescription} \section{Module {\tt{Http\_constants}} : Constants} \label{module:Http-underscoreconstants}\index{Http-underscoreconstants@\verb`Http_constants`} \ocamldocvspace{0.5cm} \label{val:Http-underscoreconstants.version}\begin{ocamldoccode} val version : Http_types.version \end{ocamldoccode} \index{version@\verb`version`} \begin{ocamldocdescription} default HTTP version \end{ocamldocdescription} \label{val:Http-underscoreconstants.server-underscorestring}\begin{ocamldoccode} val server_string : string \end{ocamldoccode} \index{server-underscorestring@\verb`server_string`} \begin{ocamldocdescription} string returned as value of "Server:" response header \end{ocamldocdescription} \label{val:Http-underscoreconstants.crlf}\begin{ocamldoccode} val crlf : string \end{ocamldoccode} \index{crlf@\verb`crlf`} \begin{ocamldocdescription} "{\textbackslash}r{\textbackslash}n" string \end{ocamldocdescription} \subsection{daemon default values} \label{val:Http-underscoreconstants.default-underscoreaddr}\begin{ocamldoccode} val default_addr : string \end{ocamldoccode} \index{default-underscoreaddr@\verb`default_addr`} \label{val:Http-underscoreconstants.default-underscoreauth}\begin{ocamldoccode} val default_auth : (string * Http_types.auth_info) option \end{ocamldoccode} \index{default-underscoreauth@\verb`default_auth`} \label{val:Http-underscoreconstants.default-underscoreauto-underscoreclose}\begin{ocamldoccode} val default_auto_close : bool \end{ocamldoccode} \index{default-underscoreauto-underscoreclose@\verb`default_auto_close`} \label{val:Http-underscoreconstants.default-underscorecallback}\begin{ocamldoccode} val default_callback : Http_types.request -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{default-underscorecallback@\verb`default_callback`} \label{val:Http-underscoreconstants.default-underscoremode}\begin{ocamldoccode} val default_mode : Http_types.daemon_mode \end{ocamldoccode} \index{default-underscoremode@\verb`default_mode`} \label{val:Http-underscoreconstants.default-underscoreport}\begin{ocamldoccode} val default_port : int \end{ocamldoccode} \index{default-underscoreport@\verb`default_port`} \label{val:Http-underscoreconstants.default-underscoreroot-underscoredir}\begin{ocamldoccode} val default_root_dir : string option \end{ocamldoccode} \index{default-underscoreroot-underscoredir@\verb`default_root_dir`} \label{val:Http-underscoreconstants.default-underscoreexn-underscorehandler}\begin{ocamldoccode} val default_exn_handler : (exn -> Pervasives.out_channel -> unit) option \end{ocamldoccode} \index{default-underscoreexn-underscorehandler@\verb`default_exn_handler`} \label{val:Http-underscoreconstants.default-underscoretimeout}\begin{ocamldoccode} val default_timeout : int option \end{ocamldoccode} \index{default-underscoretimeout@\verb`default_timeout`} \section{Module {\tt{Http\_daemon}} : Main OCaml HTTP module.} \label{module:Http-underscoredaemon}\index{Http-underscoredaemon@\verb`Http_daemon`} Here you can find two set of functions:\begin{itemize} \item functions which let you start an HTTP Daemon (start* functions) \item facility functions which let you sent responses back to clients \end{itemize} \ocamldocvspace{0.5cm} \label{val:Http-underscoredaemon.send-underscoreCRLF}\begin{ocamldoccode} val send_CRLF : Pervasives.out_channel -> unit \end{ocamldoccode} \index{send-underscoreCRLF@\verb`send_CRLF`} \begin{ocamldocdescription} send a CRLF sequence on the given output channel, this is mandatory after the last header was sent and before start sending the response body \end{ocamldocdescription} \label{val:Http-underscoredaemon.send-underscorestatus-underscoreline}\begin{ocamldoccode} val send_status_line : ?version:Http_types.version -> code:Http_types.status_code -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{send-underscorestatus-underscoreline@\verb`send_status_line`} \begin{ocamldocdescription} send response status line, version is the http version used in response, either code or status must be given (not both, not none) which represent the HTTP response code, outchan is the output channel to which send status line \end{ocamldocdescription} \label{val:Http-underscoredaemon.get-underscorebasic-underscoreheaders}\begin{ocamldoccode} val get_basic_headers : unit -> (string * string) list \end{ocamldoccode} \index{get-underscorebasic-underscoreheaders@\verb`get_basic_headers`} \begin{ocamldocdescription} returns the basic headers "Date", "Server" and "Connection" used in send\_basic\_headers \end{ocamldocdescription} \label{val:Http-underscoredaemon.send-underscorebasic-underscoreheaders}\begin{ocamldoccode} val send_basic_headers : ?version:Http_types.version -> code:Http_types.status_code -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{send-underscorebasic-underscoreheaders@\verb`send_basic_headers`} \begin{ocamldocdescription} like send\_status\_line but additionally will also send "Date", "Server" and "Connection" standard headers \end{ocamldocdescription} \label{val:Http-underscoredaemon.send-underscoreheader}\begin{ocamldoccode} val send_header : header:string -> value:string -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{send-underscoreheader@\verb`send_header`} \begin{ocamldocdescription} send an HTTP header on outchan \end{ocamldocdescription} \label{val:Http-underscoredaemon.send-underscoreheaders}\begin{ocamldoccode} val send_headers : headers:(string * string) list -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{send-underscoreheaders@\verb`send_headers`} \begin{ocamldocdescription} as send\_header, but for a list of pairs $<$header, value$>$ \end{ocamldocdescription} \label{val:Http-underscoredaemon.send-underscorefile}\begin{ocamldoccode} val send_file : src:Http_types.file_source -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{send-underscorefile@\verb`send_file`} \begin{ocamldocdescription} send a file through an out\_channel \end{ocamldocdescription} \label{val:Http-underscoredaemon.respond}\begin{ocamldoccode} val respond : ?body:string -> ?headers:(string * string) list -> ?version:Http_types.version -> ?code:Http_types.status_code -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{respond@\verb`respond`} \begin{ocamldocdescription} high level response function, respond on outchan sending: basic headers (including Content-Length computed using 'body' argument), headers probided via 'headers' argument, body given via 'body' argument. Default response status is 200, default response HTTP version is Http\_common.http\_version \end{ocamldocdescription} \label{val:Http-underscoredaemon.respond-underscorenot-underscorefound}\begin{ocamldoccode} val respond_not_found : url:string -> ?version:Http_types.version -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{respond-underscorenot-underscorefound@\verb`respond_not_found`} \begin{ocamldocdescription} send a 404 (not found) HTTP response \end{ocamldocdescription} \label{val:Http-underscoredaemon.respond-underscoreforbidden}\begin{ocamldoccode} val respond_forbidden : url:string -> ?version:Http_types.version -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{respond-underscoreforbidden@\verb`respond_forbidden`} \begin{ocamldocdescription} send a 403 (forbidden) HTTP response \end{ocamldocdescription} \label{val:Http-underscoredaemon.respond-underscoreredirect}\begin{ocamldoccode} val respond_redirect : location:string -> ?body:string -> ?version:Http_types.version -> ?code:Http_types.status_code -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{respond-underscoreredirect@\verb`respond_redirect`} \begin{ocamldocdescription} send a "redirection" class response, optional body argument contains data that will be displayed in the body of the response, default response status is 301 (moved permanently), only redirection status are accepted by this function, other values will raise Failure \end{ocamldocdescription} \label{val:Http-underscoredaemon.respond-underscoreunauthorized}\begin{ocamldoccode} val respond_unauthorized : ?version:Http_types.version -> ?realm:string -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{respond-underscoreunauthorized@\verb`respond_unauthorized`} \begin{ocamldocdescription} respond with a 401 (Unauthorized) response asking for authentication against given realm (default is the server name) \end{ocamldocdescription} \label{val:Http-underscoredaemon.respond-underscoreerror}\begin{ocamldoccode} val respond_error : ?body:string -> ?version:Http_types.version -> ?code:Http_types.status_code -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{respond-underscoreerror@\verb`respond_error`} \begin{ocamldocdescription} send an "error" response (i.e. 400 $\leq$ status $<$ 600), optional body argument as per send\_redirect, default response status is 400 (bad request), only error status are accepted by this function, other values will raise Failure \end{ocamldocdescription} \label{val:Http-underscoredaemon.respond-underscorefile}\begin{ocamldoccode} val respond_file : fname:string -> ?version:Http_types.version -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{respond-underscorefile@\verb`respond_file`} \begin{ocamldocdescription} tipical static pages http daemon behaviour, if requested url is a file, return it, it it is a directory return a directory listing of it \end{ocamldocdescription} \label{val:Http-underscoredaemon.respond-underscorewith}\begin{ocamldoccode} val respond_with : Http_types.response -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{respond-underscorewith@\verb`respond_with`} \begin{ocamldocdescription} respond using a prebuilt Http\_types.response object \end{ocamldocdescription} \label{val:Http-underscoredaemon.main}\begin{ocamldoccode} val main : Http_types.daemon_spec -> unit \end{ocamldoccode} \index{main@\verb`main`} \begin{ocamldocdescription} start an HTTP daemon \end{ocamldocdescription} \label{val:Http-underscoredaemon.default-underscorespec}\begin{ocamldoccode} val default_spec : Http_types.daemon_spec \end{ocamldoccode} \index{default-underscorespec@\verb`default_spec`} \begin{ocamldocdescription} default daemon specification:\begin{itemize} \item listen on 0.0.0.0, port 80 \item "always ok" callback (return an empty response, response code 200) \item fork a child for each request \item do not change to a root directory (i.e. keep cwd) \item 300 seconds timeout \item ignores exceptions \item no authentication required \item do not automatically close client connections after callback \end{itemize} \end{ocamldocdescription} \label{val:Http-underscoredaemon.daemon-underscorespec}\begin{ocamldoccode} val daemon_spec : ?address:string -> ?auth:(string * Http_types.auth_info) option -> ?auto_close:bool -> ?callback:(Http_types.request -> Pervasives.out_channel -> unit) -> ?mode:Http_types.daemon_mode -> ?port:int -> ?root_dir:string option -> ?exn_handler:(exn -> Pervasives.out_channel -> unit) option -> ?timeout:int option -> unit -> Http_types.daemon_spec \end{ocamldoccode} \index{daemon-underscorespec@\verb`daemon_spec`} \begin{ocamldocdescription} currified daemon\_spec constructor. Each parameter of this function corresponds to one field of Http\_types.daemon\_spec and defaults to the corresponding field of Http\_daemon.default\_spec \end{ocamldocdescription} \begin{ocamldoccode} {\tt{class daemon : }}{\tt{?addr:string -> ?port:int -> unit -> }}{\tt{Http\_types.daemon}}\end{ocamldoccode} \label{class:Http-underscoredaemon.daemon}\index{daemon@\verb`daemon`} \begin{ocamldocdescription} Object oriented interface to HTTP daemons. \end{ocamldocdescription} \begin{ocamldoccode} {\tt{module }}{\tt{Trivial}}{\tt{ : }}\end{ocamldoccode} \label{module:Http-underscoredaemon.Trivial}\index{Trivial@\verb`Trivial`} \begin{ocamldocsigend} \label{val:Http-underscoredaemon.Trivial.callback}\begin{ocamldoccode} val callback : Http_types.request -> Pervasives.out_channel -> unit \end{ocamldoccode} \index{callback@\verb`callback`} \begin{ocamldocdescription} callback function, exposed if you like to use it as a basis to define a more powerful daemon \end{ocamldocdescription} \label{val:Http-underscoredaemon.Trivial.main}\begin{ocamldoccode} val main : Http_types.daemon_spec -> unit \end{ocamldoccode} \index{main@\verb`main`} \begin{ocamldocdescription} start the "trivial" HTTP daemon \end{ocamldocdescription} \end{ocamldocsigend} \begin{ocamldocdescription} Trivial static pages HTTP daemon. Daemons created using this module will serve directory indexes and files found starting from the working directory \end{ocamldocdescription} \section{Module {\tt{Http\_message}} : Object Oriented representation of HTTP messages} \label{module:Http-underscoremessage}\index{Http-underscoremessage@\verb`Http_message`} \ocamldocvspace{0.5cm} \begin{ocamldoccode} {\tt{class virtual message : }}{\tt{body:string -> headers:(string * string) list -> version:Http\_types.version option -> clisockaddr:Unix.sockaddr -> srvsockaddr:Unix.sockaddr -> }}\end{ocamldoccode} \label{class:Http-underscoremessage.message}\index{message@\verb`message`} \begin{ocamldocobjectend} \label{method:Http-underscoremessage.message.version}\begin{ocamldoccode} method version : Http_types.version option \end{ocamldoccode} \index{version@\verb`version`} \begin{ocamldocdescription} {\bf Returns }message HTTP version, it can be None because older version of the HTTP protocol don't require HTTP version to be told between message source and destination \end{ocamldocdescription} \label{method:Http-underscoremessage.message.setVersion}\begin{ocamldoccode} method setVersion : Http_types.version -> unit \end{ocamldoccode} \index{setVersion@\verb`setVersion`} \begin{ocamldocdescription} set message HTTP version \end{ocamldocdescription} \label{method:Http-underscoremessage.message.body}\begin{ocamldoccode} method body : string \end{ocamldoccode} \index{body@\verb`body`} \begin{ocamldocdescription} {\bf Returns }message body \end{ocamldocdescription} \label{method:Http-underscoremessage.message.setBody}\begin{ocamldoccode} method setBody : string -> unit \end{ocamldoccode} \index{setBody@\verb`setBody`} \begin{ocamldocdescription} set message body \end{ocamldocdescription} \label{method:Http-underscoremessage.message.bodyBuf}\begin{ocamldoccode} method bodyBuf : Buffer.t \end{ocamldoccode} \index{bodyBuf@\verb`bodyBuf`} \begin{ocamldocdescription} {\bf Returns }a Buffer.t connected to message body (Warning: changing this buffer will change message body too) \end{ocamldocdescription} \label{method:Http-underscoremessage.message.setBodyBuf}\begin{ocamldoccode} method setBodyBuf : Buffer.t -> unit \end{ocamldoccode} \index{setBodyBuf@\verb`setBodyBuf`} \begin{ocamldocdescription} set a new Buffer.t used to keep message body \end{ocamldocdescription} \label{method:Http-underscoremessage.message.addBody}\begin{ocamldoccode} method addBody : string -> unit \end{ocamldoccode} \index{addBody@\verb`addBody`} \begin{ocamldocdescription} append a string to message body \end{ocamldocdescription} \label{method:Http-underscoremessage.message.addBodyBuf}\begin{ocamldoccode} method addBodyBuf : Buffer.t -> unit \end{ocamldoccode} \index{addBodyBuf@\verb`addBodyBuf`} \begin{ocamldocdescription} append a whole buffer to message body \end{ocamldocdescription} \subsubsection{{\it header name comparison are performed in a case-insensitive manner as required by RFC2616, actually the implementation works converting all header names in lowercase}} \label{method:Http-underscoremessage.message.addHeader}\begin{ocamldoccode} method addHeader : name:string -> value:string -> unit \end{ocamldoccode} \index{addHeader@\verb`addHeader`} \begin{ocamldocdescription} add an HTTP header \end{ocamldocdescription} \label{method:Http-underscoremessage.message.addHeaders}\begin{ocamldoccode} method addHeaders : (string * string) list -> unit \end{ocamldoccode} \index{addHeaders@\verb`addHeaders`} \begin{ocamldocdescription} add a list of HTTP headers \end{ocamldocdescription} \label{method:Http-underscoremessage.message.replaceHeader}\begin{ocamldoccode} method replaceHeader : name:string -> value:string -> unit \end{ocamldoccode} \index{replaceHeader@\verb`replaceHeader`} \begin{ocamldocdescription} like addHeader but replace previous definition of the same header \end{ocamldocdescription} \label{method:Http-underscoremessage.message.replaceHeaders}\begin{ocamldoccode} method replaceHeaders : (string * string) list -> unit \end{ocamldoccode} \index{replaceHeaders@\verb`replaceHeaders`} \begin{ocamldocdescription} like addHeaders but replace previous definition of headers that were already defined \end{ocamldocdescription} \label{method:Http-underscoremessage.message.removeHeader}\begin{ocamldoccode} method removeHeader : name:string -> unit \end{ocamldoccode} \index{removeHeader@\verb`removeHeader`} \begin{ocamldocdescription} remove \_all\_ occurences of an HTTP header from the message \end{ocamldocdescription} \label{method:Http-underscoremessage.message.hasHeader}\begin{ocamldoccode} method hasHeader : name:string -> bool \end{ocamldoccode} \index{hasHeader@\verb`hasHeader`} \begin{ocamldocdescription} {\bf Returns }true if given header exists in message, false otherwise \end{ocamldocdescription} \label{method:Http-underscoremessage.message.header}\begin{ocamldoccode} method header : name:string -> string \end{ocamldoccode} \index{header@\verb`header`} \begin{ocamldocdescription} {\bf Raises} {\tt{Header\_not\_found}} if given header wasn't defined in message {\bf Returns }value associated to a given header \end{ocamldocdescription} \label{method:Http-underscoremessage.message.headers}\begin{ocamldoccode} method headers : (string * string) list \end{ocamldoccode} \index{headers@\verb`headers`} \begin{ocamldocdescription} {\bf Returns }the full set of headers defined for this message, the value returned is an association list from headers name to headers value, an header may occurs more that once in the list \end{ocamldocdescription} \label{method:Http-underscoremessage.message.clientSockaddr}\begin{ocamldoccode} method clientSockaddr : Unix.sockaddr \end{ocamldoccode} \index{clientSockaddr@\verb`clientSockaddr`} \begin{ocamldocdescription} {\bf Returns }client Unix.sockaddr \end{ocamldocdescription} \label{method:Http-underscoremessage.message.clientAddr}\begin{ocamldoccode} method clientAddr : string \end{ocamldoccode} \index{clientAddr@\verb`clientAddr`} \begin{ocamldocdescription} {\bf Returns }client address pretty printed \end{ocamldocdescription} \label{method:Http-underscoremessage.message.clientPort}\begin{ocamldoccode} method clientPort : int \end{ocamldoccode} \index{clientPort@\verb`clientPort`} \begin{ocamldocdescription} {\bf Returns }client port \end{ocamldocdescription} \label{method:Http-underscoremessage.message.serverSockaddr}\begin{ocamldoccode} method serverSockaddr : Unix.sockaddr \end{ocamldoccode} \index{serverSockaddr@\verb`serverSockaddr`} \begin{ocamldocdescription} {\bf Returns }server Unix.sockaddr \end{ocamldocdescription} \label{method:Http-underscoremessage.message.serverAddr}\begin{ocamldoccode} method serverAddr : string \end{ocamldoccode} \index{serverAddr@\verb`serverAddr`} \begin{ocamldocdescription} {\bf Returns }server address pretty printed \end{ocamldocdescription} \label{method:Http-underscoremessage.message.serverPort}\begin{ocamldoccode} method serverPort : int \end{ocamldoccode} \index{serverPort@\verb`serverPort`} \begin{ocamldocdescription} {\bf Returns }server port \end{ocamldocdescription} \label{method:Http-underscoremessage.message.fstLineToString}\begin{ocamldoccode} method private virtual fstLineToString : string \end{ocamldoccode} \index{fstLineToString@\verb`fstLineToString`} \begin{ocamldocdescription} {\bf Returns }for requests first request line, for responses first response line. User by derived requests and responses to implement toString method \end{ocamldocdescription} \label{method:Http-underscoremessage.message.toString}\begin{ocamldoccode} method toString : string \end{ocamldoccode} \index{toString@\verb`toString`} \begin{ocamldocdescription} {\bf Returns }a string representation of the message \end{ocamldocdescription} \label{method:Http-underscoremessage.message.serialize}\begin{ocamldoccode} method serialize : Pervasives.out_channel -> unit \end{ocamldoccode} \index{serialize@\verb`serialize`} \begin{ocamldocdescription} serialize the message over an output channel \end{ocamldocdescription} \end{ocamldocobjectend} \begin{ocamldocdescription} OO representation of an HTTP message \end{ocamldocdescription} \section{Module {\tt{Http\_misc}} : Helpers and other not better classified functions which should not be exposed in the final API} \label{module:Http-underscoremisc}\index{Http-underscoremisc@\verb`Http_misc`} \ocamldocvspace{0.5cm} \label{val:Http-underscoremisc.date-underscore822}\begin{ocamldoccode} val date_822 : unit -> string \end{ocamldoccode} \index{date-underscore822@\verb`date_822`} \begin{ocamldocdescription} {\bf Returns }the current date compliant to RFC 1123, which updates RFC 822 zone info are retrieved from UTC \end{ocamldocdescription} \label{val:Http-underscoremisc.is-underscoredirectory}\begin{ocamldoccode} val is_directory : string -> bool \end{ocamldoccode} \index{is-underscoredirectory@\verb`is_directory`} \begin{ocamldocdescription} {\bf Returns }true if 'name' is a directory on the file system, false otherwise \end{ocamldocdescription} \label{val:Http-underscoremisc.filesize}\begin{ocamldoccode} val filesize : string -> int \end{ocamldoccode} \index{filesize@\verb`filesize`} \begin{ocamldocdescription} {\bf Returns }the filesize of fname \end{ocamldocdescription} \label{val:Http-underscoremisc.strip-underscoretrailing-underscoreslash}\begin{ocamldoccode} val strip_trailing_slash : string -> string \end{ocamldoccode} \index{strip-underscoretrailing-underscoreslash@\verb`strip_trailing_slash`} \begin{ocamldocdescription} strip trailing '/', if any, from a string and {\bf Returns }the new string \end{ocamldocdescription} \label{val:Http-underscoremisc.strip-underscoreheading-underscoreslash}\begin{ocamldoccode} val strip_heading_slash : string -> string \end{ocamldoccode} \index{strip-underscoreheading-underscoreslash@\verb`strip_heading_slash`} \begin{ocamldocdescription} strip heading '/', if any, from a string and {\bf Returns }the new string \end{ocamldocdescription} \label{val:Http-underscoremisc.ls}\begin{ocamldoccode} val ls : Unix.dir_handle -> string list \end{ocamldoccode} \index{ls@\verb`ls`} \begin{ocamldocdescription} given a dir handle {\bf Returns }a list of entries contained \end{ocamldocdescription} \label{val:Http-underscoremisc.string-underscoreexplode}\begin{ocamldoccode} val string_explode : string -> char list \end{ocamldoccode} \index{string-underscoreexplode@\verb`string_explode`} \begin{ocamldocdescription} explode a string in a char list \end{ocamldocdescription} \label{val:Http-underscoremisc.string-underscoreimplode}\begin{ocamldoccode} val string_implode : char list -> string \end{ocamldoccode} \index{string-underscoreimplode@\verb`string_implode`} \begin{ocamldocdescription} implode a char list in a string \end{ocamldocdescription} \label{val:Http-underscoremisc.reason-underscorephrase-underscoreof-underscorecode}\begin{ocamldoccode} val reason_phrase_of_code : int -> string \end{ocamldoccode} \index{reason-underscorephrase-underscoreof-underscorecode@\verb`reason_phrase_of_code`} \begin{ocamldocdescription} given an HTTP response code return the corresponding reason phrase \end{ocamldocdescription} \label{val:Http-underscoremisc.build-underscoresockaddr}\begin{ocamldoccode} val build_sockaddr : string * int -> Unix.sockaddr \end{ocamldoccode} \index{build-underscoresockaddr@\verb`build_sockaddr`} \begin{ocamldocdescription} build a Unix.sockaddr inet address from a string representation of an IP address and a port number \end{ocamldocdescription} \label{val:Http-underscoremisc.explode-underscoresockaddr}\begin{ocamldoccode} val explode_sockaddr : Unix.sockaddr -> string * int \end{ocamldoccode} \index{explode-underscoresockaddr@\verb`explode_sockaddr`} \begin{ocamldocdescription} explode an \_inet\_ Unix.sockaddr address in a string representation of an IP address and a port number \end{ocamldocdescription} \label{val:Http-underscoremisc.peername-underscoreof-underscoreout-underscorechannel}\begin{ocamldoccode} val peername_of_out_channel : Pervasives.out_channel -> Unix.sockaddr \end{ocamldoccode} \index{peername-underscoreof-underscoreout-underscorechannel@\verb`peername_of_out_channel`} \begin{ocamldocdescription} given an out\_channel build on top of a socket, return peername related to that socket \end{ocamldocdescription} \label{val:Http-underscoremisc.peername-underscoreof-underscorein-underscorechannel}\begin{ocamldoccode} val peername_of_in_channel : Pervasives.in_channel -> Unix.sockaddr \end{ocamldoccode} \index{peername-underscoreof-underscorein-underscorechannel@\verb`peername_of_in_channel`} \begin{ocamldocdescription} as above but works on in\_channels \end{ocamldocdescription} \label{val:Http-underscoremisc.sockname-underscoreof-underscoreout-underscorechannel}\begin{ocamldoccode} val sockname_of_out_channel : Pervasives.out_channel -> Unix.sockaddr \end{ocamldoccode} \index{sockname-underscoreof-underscoreout-underscorechannel@\verb`sockname_of_out_channel`} \begin{ocamldocdescription} given an out\_channel build on top of a socket, return sockname related to that socket \end{ocamldocdescription} \label{val:Http-underscoremisc.sockname-underscoreof-underscorein-underscorechannel}\begin{ocamldoccode} val sockname_of_in_channel : Pervasives.in_channel -> Unix.sockaddr \end{ocamldoccode} \index{sockname-underscoreof-underscorein-underscorechannel@\verb`sockname_of_in_channel`} \begin{ocamldocdescription} as above but works on in\_channels \end{ocamldocdescription} \label{val:Http-underscoremisc.buf-underscoreof-underscoreinchan}\begin{ocamldoccode} val buf_of_inchan : ?limit:int -> Pervasives.in_channel -> Buffer.t \end{ocamldoccode} \index{buf-underscoreof-underscoreinchan@\verb`buf_of_inchan`} \begin{ocamldocdescription} reads from an input channel till it End\_of\_file and returns what has been read; if limit is given returned buffer will contains at most first 'limit' bytes read from input channel \end{ocamldocdescription} \label{val:Http-underscoremisc.list-underscoreassoc-underscoreall}\begin{ocamldoccode} val list_assoc_all : 'a -> ('a * 'b) list -> 'b list \end{ocamldoccode} \index{list-underscoreassoc-underscoreall@\verb`list_assoc_all`} \begin{ocamldocdescription} like List.assoc but return all bindings of a given key instead of the leftmost one only \end{ocamldocdescription} \label{val:Http-underscoremisc.warn}\begin{ocamldoccode} val warn : string -> unit \end{ocamldoccode} \index{warn@\verb`warn`} \begin{ocamldocdescription} print a warning msg to stderr. Adds trailing {\textbackslash}n \end{ocamldocdescription} \label{val:Http-underscoremisc.error}\begin{ocamldoccode} val error : string -> unit \end{ocamldoccode} \index{error@\verb`error`} \begin{ocamldocdescription} print an error msg to stderr. Adds trailing {\textbackslash}n \end{ocamldocdescription} \label{val:Http-underscoremisc.finally}\begin{ocamldoccode} val finally : (unit -> unit) -> ('a -> 'b) -> 'a -> 'b \end{ocamldoccode} \index{finally@\verb`finally`} \begin{ocamldocdescription} \end{ocamldocdescription} \section{Module {\tt{Http\_parser}} : HTTP messages parsing} \label{module:Http-underscoreparser}\index{Http-underscoreparser@\verb`Http_parser`} \ocamldocvspace{0.5cm} \label{val:Http-underscoreparser.split-underscorequery-underscoreparams}\begin{ocamldoccode} val split_query_params : string -> (string * string) list \end{ocamldoccode} \index{split-underscorequery-underscoreparams@\verb`split_query_params`} \begin{ocamldocdescription} given an HTTP like query string (e.g. "name1$=$value1\&name2$=$value2\&$\ldots$") {\bf Raises} \begin{itemize} \item {\tt{Malformed\_query}} if the string isn't a valid query string \item {\tt{Malformed\_query\_part}} if some piece of the query isn't valid \end{itemize} {\bf Returns }a list of pairs {\tt{("name1", "value1"); ("name2", "value2")}} \end{ocamldocdescription} \label{val:Http-underscoreparser.parse-underscorerequest-underscorefst-underscoreline}\begin{ocamldoccode} val parse_request_fst_line : Pervasives.in_channel -> Http_types.meth * Neturl.url * Http_types.version option \end{ocamldoccode} \index{parse-underscorerequest-underscorefst-underscoreline@\verb`parse_request_fst_line`} \begin{ocamldocdescription} parse 1st line of an HTTP request {\bf Raises} \begin{itemize} \item {\tt{Malformed\_request}} if request 1st linst isn't well formed \item {\tt{Malformed\_request\_URI}} if requested URI isn't well formed \end{itemize} {\bf Returns }a triple meth * url * version, meth is the HTTP method invoked, url is the requested url, version is the HTTP version specified or None if no version was specified \end{ocamldocdescription} \label{val:Http-underscoreparser.parse-underscoreresponse-underscorefst-underscoreline}\begin{ocamldoccode} val parse_response_fst_line : Pervasives.in_channel -> Http_types.version * Http_types.status \end{ocamldoccode} \index{parse-underscoreresponse-underscorefst-underscoreline@\verb`parse_response_fst_line`} \begin{ocamldocdescription} parse 1st line of an HTTP response {\bf Raises} {\tt{Malformed\_response}} if first line isn't well formed \end{ocamldocdescription} \label{val:Http-underscoreparser.parse-underscorequery-underscoreget-underscoreparams}\begin{ocamldoccode} val parse_query_get_params : Neturl.url -> (string * string) list \end{ocamldoccode} \index{parse-underscorequery-underscoreget-underscoreparams@\verb`parse_query_get_params`} \begin{ocamldocdescription} parse HTTP GET parameters from an URL; paramater which were passed with no value (like 'x' in "/foo.cgi?a$=$10\&x$=$\&c$=$9") are returned associated with the empty ("") string. {\bf Returns }a list of pairs param\_name * param\_value \end{ocamldocdescription} \label{val:Http-underscoreparser.parse-underscorepath}\begin{ocamldoccode} val parse_path : Neturl.url -> string \end{ocamldoccode} \index{parse-underscorepath@\verb`parse_path`} \begin{ocamldocdescription} parse the base path (removing query string, fragment, $\ldots$.) from an URL \end{ocamldocdescription} \label{val:Http-underscoreparser.parse-underscoreheaders}\begin{ocamldoccode} val parse_headers : Pervasives.in_channel -> (string * string) list \end{ocamldoccode} \index{parse-underscoreheaders@\verb`parse_headers`} \begin{ocamldocdescription} parse HTTP headers. Consumes also trailing CRLF at the end of header list {\bf Raises} {\tt{Invalid\_header}} if a not well formed header is encountered {\bf Returns }a list of pairs header\_name * header\_value \end{ocamldocdescription} \label{val:Http-underscoreparser.parse-underscorecookies}\begin{ocamldoccode} val parse_cookies : string -> (string * string) list \end{ocamldoccode} \index{parse-underscorecookies@\verb`parse_cookies`} \begin{ocamldocdescription} parse a Cookie header, extracting an associative list $<$attribute name, attribute value$>$. See RFC 2965 {\bf Raises} {\tt{Malformed\_cookies}} if raw\_cookies does not conform to RFC 2965 {\bf Returns }a list of pairs cookie\_name * cookie\_value \end{ocamldocdescription} \label{val:Http-underscoreparser.parse-underscorerequest}\begin{ocamldoccode} val parse_request : Pervasives.in_channel -> string * (string * string) list \end{ocamldoccode} \index{parse-underscorerequest@\verb`parse_request`} \begin{ocamldocdescription} given an input channel, reads from it a GET HTTP request and {\bf Returns }a pair $<$path, query\_params$>$ where path is a string representing the requested path and query\_params is a list of pairs $<$name, value$>$ (the GET parameters) \end{ocamldocdescription} \section{Module {\tt{Http\_parser\_sanity}} : Sanity test functions related to HTTP message parsing} \label{module:Http-underscoreparser-underscoresanity}\index{Http-underscoreparser-underscoresanity@\verb`Http_parser_sanity`} \ocamldocvspace{0.5cm} \label{val:Http-underscoreparser-underscoresanity.heal-underscoreheader-underscorename}\begin{ocamldoccode} val heal_header_name : string -> unit \end{ocamldoccode} \index{heal-underscoreheader-underscorename@\verb`heal_header_name`} \begin{ocamldocdescription} {\bf Raises} {\tt{Invalid\_header\_name}} if name isn't a valid HTTP header name \end{ocamldocdescription} \label{val:Http-underscoreparser-underscoresanity.heal-underscoreheader-underscorevalue}\begin{ocamldoccode} val heal_header_value : string -> unit \end{ocamldoccode} \index{heal-underscoreheader-underscorevalue@\verb`heal_header_value`} \begin{ocamldocdescription} {\bf Raises} {\tt{Invalid\_header\_value}} if value isn't a valid HTTP header value \end{ocamldocdescription} \label{val:Http-underscoreparser-underscoresanity.heal-underscoreheader}\begin{ocamldoccode} val heal_header : string * string -> unit \end{ocamldoccode} \index{heal-underscoreheader@\verb`heal_header`} \begin{ocamldocdescription} {\bf Raises} \begin{itemize} \item {\tt{Invalid\_header\_name}} if name isn't a valid HTTP header name \item {\tt{Invalid\_header\_value}} if value isn't a valid HTTP header value \end{itemize} \end{ocamldocdescription} \label{val:Http-underscoreparser-underscoresanity.normalize-underscoreheader-underscorevalue}\begin{ocamldoccode} val normalize_header_value : string -> string \end{ocamldoccode} \index{normalize-underscoreheader-underscorevalue@\verb`normalize_header_value`} \begin{ocamldocdescription} remove heading and/or trailing LWS sequences as per RFC2616 \end{ocamldocdescription} \label{val:Http-underscoreparser-underscoresanity.url-underscoreof-underscorestring}\begin{ocamldoccode} val url_of_string : string -> Neturl.url \end{ocamldoccode} \index{url-underscoreof-underscorestring@\verb`url_of_string`} \begin{ocamldocdescription} parse an URL from a string. {\bf Raises} {\tt{Malformed\_URL}} if an invalid URL is encountered \end{ocamldocdescription} \label{val:Http-underscoreparser-underscoresanity.string-underscoreof-underscoreurl}\begin{ocamldoccode} val string_of_url : Neturl.url -> string \end{ocamldoccode} \index{string-underscoreof-underscoreurl@\verb`string_of_url`} \begin{ocamldocdescription} pretty print an URL \end{ocamldocdescription} \section{Module {\tt{Http\_request}} : Object Oriented representation of HTTP requests} \label{module:Http-underscorerequest}\index{Http-underscorerequest@\verb`Http_request`} \ocamldocvspace{0.5cm} \begin{ocamldoccode} {\tt{class request : }}{\tt{Pervasives.in\_channel -> }}{\tt{Http\_types.request}}\end{ocamldoccode} \label{class:Http-underscorerequest.request}\index{request@\verb`request`} \begin{ocamldocdescription} OO representation of an HTTP request \end{ocamldocdescription} \section{Module {\tt{Http\_response}} : Object Oriented representation of HTTP responses} \label{module:Http-underscoreresponse}\index{Http-underscoreresponse@\verb`Http_response`} \ocamldocvspace{0.5cm} \begin{ocamldoccode} {\tt{class response : }}{\tt{?body:string -> ?headers:(string * string) list -> ?version:Http\_types.version -> ?clisockaddr:Unix.sockaddr -> ?srvsockaddr:Unix.sockaddr -> ?code:int -> ?status:Http\_types.status -> unit -> }}{\tt{Http\_types.response}}\end{ocamldoccode} \label{class:Http-underscoreresponse.response}\index{response@\verb`response`} \begin{ocamldocdescription} OO representation of an HTTP response. \end{ocamldocdescription} \section{Module {\tt{Http\_tcp\_server}} : TCP servers used as low-levels for HTTP daemons} \label{module:Http-underscoretcp-underscoreserver}\index{Http-underscoretcp-underscoreserver@\verb`Http_tcp_server`} \ocamldocvspace{0.5cm} \subsection{servers} \label{val:Http-underscoretcp-underscoreserver.simple}\begin{ocamldoccode} val simple : Http_types.tcp_server \end{ocamldoccode} \index{simple@\verb`simple`} \begin{ocamldocdescription} single process server \end{ocamldocdescription} \label{val:Http-underscoretcp-underscoreserver.thread}\begin{ocamldoccode} val thread : Http_types.tcp_server \end{ocamldoccode} \index{thread@\verb`thread`} \begin{ocamldocdescription} multi threaded server \end{ocamldocdescription} \label{val:Http-underscoretcp-underscoreserver.fork}\begin{ocamldoccode} val fork : Http_types.tcp_server \end{ocamldoccode} \index{fork@\verb`fork`} \begin{ocamldocdescription} multi process server \end{ocamldocdescription} \subsection{low level functions} \label{val:Http-underscoretcp-underscoreserver.init-underscoresocket}\begin{ocamldoccode} val init_socket : Unix.sockaddr -> Unix.file_descr \end{ocamldoccode} \index{init-underscoresocket@\verb`init_socket`} \begin{ocamldocdescription} initialize a passive socket listening on given Unix.sockaddr \end{ocamldocdescription} \section{Module {\tt{Http\_threaded\_tcp\_server}} : Multithreaded part of Http\_tcp\_server} \label{module:Http-underscorethreaded-underscoretcp-underscoreserver}\index{Http-underscorethreaded-underscoretcp-underscoreserver@\verb`Http_threaded_tcp_server`} \ocamldocvspace{0.5cm} \label{val:Http-underscorethreaded-underscoretcp-underscoreserver.serve}\begin{ocamldoccode} val serve : ('a -> 'b) -> 'a -> unit \end{ocamldoccode} \index{serve@\verb`serve`} \begin{ocamldocdescription} serve an HTTP request for a multi threaded TCP server \end{ocamldocdescription} \section{Module {\tt{Http\_types}} : Type definitions} \label{module:Http-underscoretypes}\index{Http-underscoretypes@\verb`Http_types`} \ocamldocvspace{0.5cm} \label{type:Http-underscoretypes.version}\begin{ocamldoccode} type version = [ `HTTP_1_0 | `HTTP_1_1 ] \end{ocamldoccode} \index{version@\verb`version`} \begin{ocamldocdescription} HTTP version, actually only 1.0 and 1.1 are supported. Note that 'supported' here means only 'accepted inside a HTTP request line', no different behaviours are actually implemented depending on HTTP version \end{ocamldocdescription} \label{type:Http-underscoretypes.meth}\begin{ocamldoccode} type meth = [ `GET | `POST ] \end{ocamldoccode} \index{meth@\verb`meth`} \begin{ocamldocdescription} HTTP method, actually only GET and POST methods are supported \end{ocamldocdescription} \label{type:Http-underscoretypes.daemon-underscoremode}\begin{ocamldoccode} type daemon_mode = [ `Fork | `Single | `Thread ] \end{ocamldoccode} \index{daemon-underscoremode@\verb`daemon_mode`} \begin{ocamldocdescription} Daemon behaviour wrt request handling. `Single mode use a single process to handle all requests, no request is served until a previous one has been fully served. `Fork mode fork a new process for each request, the new process will execute the callback function and then exit. `Thread mode create a new thread for each request, the new thread will execute the callback function and then exit, threads can communicate using standard OCaml Thread library. \end{ocamldocdescription} \label{type:Http-underscoretypes.tcp-underscoreserver}\begin{ocamldoccode} type tcp_server = sockaddr:Unix.sockaddr -> timeout:int option -> (Pervasives.in_channel -> Pervasives.out_channel -> unit) -> unit \end{ocamldoccode} \index{tcp-underscoreserver@\verb`tcp_server`} \begin{ocamldocdescription} A TCP server is a function taking an address on which bind and listen for connections, an optional timeout after which abort client connections and a callback function which in turn takes an input and an output channel as arguments. After receiving this argument a TCP server sits and waits for connection, on each connection it apply the callback function to channels connected to client. \end{ocamldocdescription} \label{type:Http-underscoretypes.auth-underscoreinfo}\begin{ocamldoccode} type auth_info = [ `Basic of string * string ] \end{ocamldoccode} \index{auth-underscoreinfo@\verb`auth_info`} \begin{ocamldocdescription} authentication information \end{ocamldocdescription} \label{type:Http-underscoretypes.informational-underscoresubstatus}\begin{ocamldoccode} type informational_substatus = [ `Continue | `Switching_protocols ] \end{ocamldoccode} \index{informational-underscoresubstatus@\verb`informational_substatus`} \begin{ocamldocdescription} {\bf See also} {\it RFC2616} informational HTTP status \end{ocamldocdescription} \label{type:Http-underscoretypes.success-underscoresubstatus}\begin{ocamldoccode} type success_substatus = [ `Accepted | `Created | `No_content | `Non_authoritative_information | `OK | `Partial_content | `Reset_content ] \end{ocamldoccode} \index{success-underscoresubstatus@\verb`success_substatus`} \begin{ocamldocdescription} {\bf See also} {\it RFC2616} success HTTP status \end{ocamldocdescription} \label{type:Http-underscoretypes.redirection-underscoresubstatus}\begin{ocamldoccode} type redirection_substatus = [ `Found | `Moved_permanently | `Multiple_choices | `Not_modified | `See_other | `Temporary_redirect | `Use_proxy ] \end{ocamldoccode} \index{redirection-underscoresubstatus@\verb`redirection_substatus`} \begin{ocamldocdescription} {\bf See also} {\it RFC2616} redirection HTTP status \end{ocamldocdescription} \label{type:Http-underscoretypes.client-underscoreerror-underscoresubstatus}\begin{ocamldoccode} type client_error_substatus = [ `Bad_request | `Conflict | `Expectation_failed | `Forbidden | `Gone | `Length_required | `Method_not_allowed | `Not_acceptable | `Not_found | `Payment_required | `Precondition_failed | `Proxy_authentication_required | `Request_URI_too_large | `Request_entity_too_large | `Request_time_out | `Requested_range_not_satisfiable | `Unauthorized | `Unsupported_media_type ] \end{ocamldoccode} \index{client-underscoreerror-underscoresubstatus@\verb`client_error_substatus`} \begin{ocamldocdescription} {\bf See also} {\it RFC2616} client error HTTP status \end{ocamldocdescription} \label{type:Http-underscoretypes.server-underscoreerror-underscoresubstatus}\begin{ocamldoccode} type server_error_substatus = [ `Bad_gateway | `Gateway_time_out | `HTTP_version_not_supported | `Internal_server_error | `Not_implemented | `Service_unavailable ] \end{ocamldoccode} \index{server-underscoreerror-underscoresubstatus@\verb`server_error_substatus`} \begin{ocamldocdescription} {\bf See also} {\it RFC2616} server error HTTP status \end{ocamldocdescription} \label{type:Http-underscoretypes.informational-underscorestatus}\begin{ocamldoccode} type informational_status = [ `Informational of informational_substatus ] \end{ocamldoccode} \index{informational-underscorestatus@\verb`informational_status`} \label{type:Http-underscoretypes.success-underscorestatus}\begin{ocamldoccode} type success_status = [ `Success of success_substatus ] \end{ocamldoccode} \index{success-underscorestatus@\verb`success_status`} \label{type:Http-underscoretypes.redirection-underscorestatus}\begin{ocamldoccode} type redirection_status = [ `Redirection of redirection_substatus ] \end{ocamldoccode} \index{redirection-underscorestatus@\verb`redirection_status`} \label{type:Http-underscoretypes.client-underscoreerror-underscorestatus}\begin{ocamldoccode} type client_error_status = [ `Client_error of client_error_substatus ] \end{ocamldoccode} \index{client-underscoreerror-underscorestatus@\verb`client_error_status`} \label{type:Http-underscoretypes.server-underscoreerror-underscorestatus}\begin{ocamldoccode} type server_error_status = [ `Server_error of server_error_substatus ] \end{ocamldoccode} \index{server-underscoreerror-underscorestatus@\verb`server_error_status`} \label{type:Http-underscoretypes.error-underscorestatus}\begin{ocamldoccode} type error_status = [ `Client_error of client_error_substatus | `Server_error of server_error_substatus ] \end{ocamldoccode} \index{error-underscorestatus@\verb`error_status`} \label{type:Http-underscoretypes.status}\begin{ocamldoccode} type status = [ `Client_error of client_error_substatus | `Informational of informational_substatus | `Redirection of redirection_substatus | `Server_error of server_error_substatus | `Success of success_substatus ] \end{ocamldoccode} \index{status@\verb`status`} \begin{ocamldocdescription} HTTP status \end{ocamldocdescription} \label{type:Http-underscoretypes.status-underscorecode}\begin{ocamldoccode} type status_code = [ `Code of int | `Status of status ] \end{ocamldoccode} \index{status-underscorecode@\verb`status_code`} \label{type:Http-underscoretypes.file-underscoresource}\begin{ocamldoccode} type file_source = | FileSrc of string \end{ocamldoccode} \begin{ocamldoccomment} filename \end{ocamldoccomment} \begin{ocamldoccode} | InChanSrc of Pervasives.in_channel \end{ocamldoccode} \begin{ocamldoccomment} input channel \end{ocamldoccomment} \index{file-underscoresource@\verb`file_source`} \begin{ocamldocdescription} File sources \end{ocamldocdescription} \subsection{Exceptions} \label{exception:Http-underscoretypes.Invalid-underscoreheader}\begin{ocamldoccode} exception Invalid_header of string \end{ocamldoccode} \index{Invalid-underscoreheader@\verb`Invalid_header`} \begin{ocamldocdescription} invalid header encountered \end{ocamldocdescription} \label{exception:Http-underscoretypes.Invalid-underscoreheader-underscorename}\begin{ocamldoccode} exception Invalid_header_name of string \end{ocamldoccode} \index{Invalid-underscoreheader-underscorename@\verb`Invalid_header_name`} \begin{ocamldocdescription} invalid header name encountered \end{ocamldocdescription} \label{exception:Http-underscoretypes.Invalid-underscoreheader-underscorevalue}\begin{ocamldoccode} exception Invalid_header_value of string \end{ocamldoccode} \index{Invalid-underscoreheader-underscorevalue@\verb`Invalid_header_value`} \begin{ocamldocdescription} invalid header value encountered \end{ocamldocdescription} \label{exception:Http-underscoretypes.Invalid-underscoreHTTP-underscoreversion}\begin{ocamldoccode} exception Invalid_HTTP_version of string \end{ocamldoccode} \index{Invalid-underscoreHTTP-underscoreversion@\verb`Invalid_HTTP_version`} \begin{ocamldocdescription} unsupported or invalid HTTP version encountered \end{ocamldocdescription} \label{exception:Http-underscoretypes.Invalid-underscoreHTTP-underscoremethod}\begin{ocamldoccode} exception Invalid_HTTP_method of string \end{ocamldoccode} \index{Invalid-underscoreHTTP-underscoremethod@\verb`Invalid_HTTP_method`} \begin{ocamldocdescription} unsupported or invalid HTTP method encountered \end{ocamldocdescription} \label{exception:Http-underscoretypes.Invalid-underscorecode}\begin{ocamldoccode} exception Invalid_code of int \end{ocamldoccode} \index{Invalid-underscorecode@\verb`Invalid_code`} \begin{ocamldocdescription} invalid HTTP status code integer representation encountered \end{ocamldocdescription} \label{exception:Http-underscoretypes.Malformed-underscoreURL}\begin{ocamldoccode} exception Malformed_URL of string \end{ocamldoccode} \index{Malformed-underscoreURL@\verb`Malformed_URL`} \begin{ocamldocdescription} invalid URL encountered \end{ocamldocdescription} \label{exception:Http-underscoretypes.Malformed-underscorequery}\begin{ocamldoccode} exception Malformed_query of string \end{ocamldoccode} \index{Malformed-underscorequery@\verb`Malformed_query`} \begin{ocamldocdescription} invalid query string encountered \end{ocamldocdescription} \label{exception:Http-underscoretypes.Malformed-underscorequery-underscorepart}\begin{ocamldoccode} exception Malformed_query_part of string * string \end{ocamldoccode} \index{Malformed-underscorequery-underscorepart@\verb`Malformed_query_part`} \begin{ocamldocdescription} invalid query string part encountered, arguments are parameter name and parameter value \end{ocamldocdescription} \label{exception:Http-underscoretypes.Malformed-underscorerequest-underscoreURI}\begin{ocamldoccode} exception Malformed_request_URI of string \end{ocamldoccode} \index{Malformed-underscorerequest-underscoreURI@\verb`Malformed_request_URI`} \begin{ocamldocdescription} invalid request URI encountered \end{ocamldocdescription} \label{exception:Http-underscoretypes.Malformed-underscorecookies}\begin{ocamldoccode} exception Malformed_cookies of string \end{ocamldoccode} \index{Malformed-underscorecookies@\verb`Malformed_cookies`} \begin{ocamldocdescription} malformed cookies \end{ocamldocdescription} \label{exception:Http-underscoretypes.Malformed-underscorerequest}\begin{ocamldoccode} exception Malformed_request of string \end{ocamldoccode} \index{Malformed-underscorerequest@\verb`Malformed_request`} \begin{ocamldocdescription} malformed request received \end{ocamldocdescription} \label{exception:Http-underscoretypes.Malformed-underscoreresponse}\begin{ocamldoccode} exception Malformed_response of string \end{ocamldoccode} \index{Malformed-underscoreresponse@\verb`Malformed_response`} \begin{ocamldocdescription} malformed response received, argument is response's first line \end{ocamldocdescription} \label{exception:Http-underscoretypes.Param-underscorenot-underscorefound}\begin{ocamldoccode} exception Param_not_found of string \end{ocamldoccode} \index{Param-underscorenot-underscorefound@\verb`Param_not_found`} \begin{ocamldocdescription} a parameter you were looking for was not found \end{ocamldocdescription} \label{exception:Http-underscoretypes.Invalid-underscorestatus-underscoreline}\begin{ocamldoccode} exception Invalid_status_line of string \end{ocamldoccode} \index{Invalid-underscorestatus-underscoreline@\verb`Invalid_status_line`} \begin{ocamldocdescription} invalid HTTP status line encountered \end{ocamldocdescription} \label{exception:Http-underscoretypes.Header-underscorenot-underscorefound}\begin{ocamldoccode} exception Header_not_found of string \end{ocamldoccode} \index{Header-underscorenot-underscorefound@\verb`Header_not_found`} \begin{ocamldocdescription} an header you were looking for was not found \end{ocamldocdescription} \label{exception:Http-underscoretypes.Quit}\begin{ocamldoccode} exception Quit \end{ocamldoccode} \index{Quit@\verb`Quit`} \begin{ocamldocdescription} raisable by callbacks to make main daemon quit, this is the only 'clean' way to make start functions return \end{ocamldocdescription} \label{exception:Http-underscoretypes.Unauthorized}\begin{ocamldoccode} exception Unauthorized of string \end{ocamldoccode} \index{Unauthorized@\verb`Unauthorized`} \begin{ocamldocdescription} raisable by callbacks to force a 401 (unauthorized) HTTP answer. This exception should be raised \_before\_ sending any data over given out channel. \end{ocamldocdescription} \subsection{OO representation of HTTP messages} \begin{ocamldoccode} {\tt{class type message = }}\end{ocamldoccode} \label{classtype:Http-underscoretypes.message}\index{message@\verb`message`} \begin{ocamldocobjectend} \label{method:Http-underscoretypes.message.version}\begin{ocamldoccode} method version : Http_types.version option \end{ocamldoccode} \index{version@\verb`version`} \label{method:Http-underscoretypes.message.setVersion}\begin{ocamldoccode} method setVersion : Http_types.version -> unit \end{ocamldoccode} \index{setVersion@\verb`setVersion`} \label{method:Http-underscoretypes.message.body}\begin{ocamldoccode} method body : string \end{ocamldoccode} \index{body@\verb`body`} \label{method:Http-underscoretypes.message.setBody}\begin{ocamldoccode} method setBody : string -> unit \end{ocamldoccode} \index{setBody@\verb`setBody`} \label{method:Http-underscoretypes.message.bodyBuf}\begin{ocamldoccode} method bodyBuf : Buffer.t \end{ocamldoccode} \index{bodyBuf@\verb`bodyBuf`} \label{method:Http-underscoretypes.message.setBodyBuf}\begin{ocamldoccode} method setBodyBuf : Buffer.t -> unit \end{ocamldoccode} \index{setBodyBuf@\verb`setBodyBuf`} \label{method:Http-underscoretypes.message.addBody}\begin{ocamldoccode} method addBody : string -> unit \end{ocamldoccode} \index{addBody@\verb`addBody`} \label{method:Http-underscoretypes.message.addBodyBuf}\begin{ocamldoccode} method addBodyBuf : Buffer.t -> unit \end{ocamldoccode} \index{addBodyBuf@\verb`addBodyBuf`} \label{method:Http-underscoretypes.message.addHeader}\begin{ocamldoccode} method addHeader : name:string -> value:string -> unit \end{ocamldoccode} \index{addHeader@\verb`addHeader`} \label{method:Http-underscoretypes.message.addHeaders}\begin{ocamldoccode} method addHeaders : (string * string) list -> unit \end{ocamldoccode} \index{addHeaders@\verb`addHeaders`} \label{method:Http-underscoretypes.message.replaceHeader}\begin{ocamldoccode} method replaceHeader : name:string -> value:string -> unit \end{ocamldoccode} \index{replaceHeader@\verb`replaceHeader`} \label{method:Http-underscoretypes.message.replaceHeaders}\begin{ocamldoccode} method replaceHeaders : (string * string) list -> unit \end{ocamldoccode} \index{replaceHeaders@\verb`replaceHeaders`} \label{method:Http-underscoretypes.message.removeHeader}\begin{ocamldoccode} method removeHeader : name:string -> unit \end{ocamldoccode} \index{removeHeader@\verb`removeHeader`} \label{method:Http-underscoretypes.message.hasHeader}\begin{ocamldoccode} method hasHeader : name:string -> bool \end{ocamldoccode} \index{hasHeader@\verb`hasHeader`} \label{method:Http-underscoretypes.message.header}\begin{ocamldoccode} method header : name:string -> string \end{ocamldoccode} \index{header@\verb`header`} \label{method:Http-underscoretypes.message.headers}\begin{ocamldoccode} method headers : (string * string) list \end{ocamldoccode} \index{headers@\verb`headers`} \label{method:Http-underscoretypes.message.clientSockaddr}\begin{ocamldoccode} method clientSockaddr : Unix.sockaddr \end{ocamldoccode} \index{clientSockaddr@\verb`clientSockaddr`} \label{method:Http-underscoretypes.message.clientAddr}\begin{ocamldoccode} method clientAddr : string \end{ocamldoccode} \index{clientAddr@\verb`clientAddr`} \label{method:Http-underscoretypes.message.clientPort}\begin{ocamldoccode} method clientPort : int \end{ocamldoccode} \index{clientPort@\verb`clientPort`} \label{method:Http-underscoretypes.message.serverSockaddr}\begin{ocamldoccode} method serverSockaddr : Unix.sockaddr \end{ocamldoccode} \index{serverSockaddr@\verb`serverSockaddr`} \label{method:Http-underscoretypes.message.serverAddr}\begin{ocamldoccode} method serverAddr : string \end{ocamldoccode} \index{serverAddr@\verb`serverAddr`} \label{method:Http-underscoretypes.message.serverPort}\begin{ocamldoccode} method serverPort : int \end{ocamldoccode} \index{serverPort@\verb`serverPort`} \label{method:Http-underscoretypes.message.toString}\begin{ocamldoccode} method toString : string \end{ocamldoccode} \index{toString@\verb`toString`} \label{method:Http-underscoretypes.message.serialize}\begin{ocamldoccode} method serialize : Pervasives.out_channel -> unit \end{ocamldoccode} \index{serialize@\verb`serialize`} \end{ocamldocobjectend} \begin{ocamldocdescription} HTTP generic messages. See {\tt{Http\_message.message}}[\ref{class:Http-underscoremessage.message}] \end{ocamldocdescription} \begin{ocamldoccode} {\tt{class type request = }}\end{ocamldoccode} \label{classtype:Http-underscoretypes.request}\index{request@\verb`request`} \begin{ocamldocobjectend} {\tt{inherit Http\_types.message}} [\ref{classtype:Http-underscoretypes.message}] an HTTP request is a flavour of HTTP message \label{method:Http-underscoretypes.request.meth}\begin{ocamldoccode} method meth : Http_types.meth \end{ocamldoccode} \index{meth@\verb`meth`} \begin{ocamldocdescription} {\bf Returns }request method \end{ocamldocdescription} \label{method:Http-underscoretypes.request.uri}\begin{ocamldoccode} method uri : string \end{ocamldoccode} \index{uri@\verb`uri`} \begin{ocamldocdescription} {\bf Returns }requested URI (including query string, fragment, $\ldots$) \end{ocamldocdescription} \label{method:Http-underscoretypes.request.path}\begin{ocamldoccode} method path : string \end{ocamldoccode} \index{path@\verb`path`} \begin{ocamldocdescription} {\bf Returns }requested path \end{ocamldocdescription} \label{method:Http-underscoretypes.request.param}\begin{ocamldoccode} method param : ?meth:Http_types.meth -> ?default:string -> string -> string \end{ocamldoccode} \index{param@\verb`param`} \begin{ocamldocdescription} lookup a given parameter {\bf Raises} {\tt{Param\_not\_found}} if parameter name was not found {\bf Returns }value associated to parameter name \end{ocamldocdescription} \label{method:Http-underscoretypes.request.paramAll}\begin{ocamldoccode} method paramAll : ?meth:Http_types.meth -> string -> string list \end{ocamldoccode} \index{paramAll@\verb`paramAll`} \begin{ocamldocdescription} like param above but return a list of values associated to given parameter (a parameter could be defined indeed more than once: passed more than once in a query string or passed both insider the url (the GET way) and inside message body (the POST way)) \end{ocamldocdescription} \label{method:Http-underscoretypes.request.params}\begin{ocamldoccode} method params : (string * string) list \end{ocamldoccode} \index{params@\verb`params`} \begin{ocamldocdescription} {\bf Returns }the list of all received parameters \end{ocamldocdescription} \label{method:Http-underscoretypes.request.params-underscoreGET}\begin{ocamldoccode} method params_GET : (string * string) list \end{ocamldoccode} \index{params-underscoreGET@\verb`params_GET`} \begin{ocamldocdescription} {\bf Returns }the list of all parameters received via GET \end{ocamldocdescription} \label{method:Http-underscoretypes.request.params-underscorePOST}\begin{ocamldoccode} method params_POST : (string * string) list \end{ocamldoccode} \index{params-underscorePOST@\verb`params_POST`} \begin{ocamldocdescription} {\bf Returns }the list of all parameter received via POST \end{ocamldocdescription} \label{method:Http-underscoretypes.request.cookies}\begin{ocamldoccode} method cookies : (string * string) list option \end{ocamldoccode} \index{cookies@\verb`cookies`} \label{method:Http-underscoretypes.request.authorization}\begin{ocamldoccode} method authorization : Http_types.auth_info option \end{ocamldoccode} \index{authorization@\verb`authorization`} \begin{ocamldocdescription} {\bf Returns }authorization information, if given by the client \end{ocamldocdescription} \end{ocamldocobjectend} \begin{ocamldocdescription} HTTP requests \end{ocamldocdescription} \begin{ocamldoccode} {\tt{class type response = }}\end{ocamldoccode} \label{classtype:Http-underscoretypes.response}\index{response@\verb`response`} \begin{ocamldocobjectend} {\tt{inherit Http\_types.message}} [\ref{classtype:Http-underscoretypes.message}] \label{method:Http-underscoretypes.response.code}\begin{ocamldoccode} method code : int \end{ocamldoccode} \index{code@\verb`code`} \begin{ocamldocdescription} {\bf Returns }response code \end{ocamldocdescription} \label{method:Http-underscoretypes.response.setCode}\begin{ocamldoccode} method setCode : int -> unit \end{ocamldoccode} \index{setCode@\verb`setCode`} \begin{ocamldocdescription} set response code \end{ocamldocdescription} \label{method:Http-underscoretypes.response.status}\begin{ocamldoccode} method status : Http_types.status \end{ocamldoccode} \index{status@\verb`status`} \begin{ocamldocdescription} {\bf Returns }response status \end{ocamldocdescription} \label{method:Http-underscoretypes.response.setStatus}\begin{ocamldoccode} method setStatus : Http_types.status -> unit \end{ocamldoccode} \index{setStatus@\verb`setStatus`} \begin{ocamldocdescription} set response status \end{ocamldocdescription} \label{method:Http-underscoretypes.response.reason}\begin{ocamldoccode} method reason : string \end{ocamldoccode} \index{reason@\verb`reason`} \begin{ocamldocdescription} {\bf Returns }reason string \end{ocamldocdescription} \label{method:Http-underscoretypes.response.setReason}\begin{ocamldoccode} method setReason : string -> unit \end{ocamldoccode} \index{setReason@\verb`setReason`} \begin{ocamldocdescription} set reason string \end{ocamldocdescription} \label{method:Http-underscoretypes.response.statusLine}\begin{ocamldoccode} method statusLine : string \end{ocamldoccode} \index{statusLine@\verb`statusLine`} \begin{ocamldocdescription} {\bf Returns }status line \end{ocamldocdescription} \label{method:Http-underscoretypes.response.setStatusLine}\begin{ocamldoccode} method setStatusLine : string -> unit \end{ocamldoccode} \index{setStatusLine@\verb`setStatusLine`} \begin{ocamldocdescription} set status line {\bf Raises} {\tt{Invalid\_status\_line}} if an invalid HTTP status line was passed \end{ocamldocdescription} \label{method:Http-underscoretypes.response.isInformational}\begin{ocamldoccode} method isInformational : bool \end{ocamldoccode} \index{isInformational@\verb`isInformational`} \begin{ocamldocdescription} response is an informational one \end{ocamldocdescription} \label{method:Http-underscoretypes.response.isSuccess}\begin{ocamldoccode} method isSuccess : bool \end{ocamldoccode} \index{isSuccess@\verb`isSuccess`} \begin{ocamldocdescription} response is a success one \end{ocamldocdescription} \label{method:Http-underscoretypes.response.isRedirection}\begin{ocamldoccode} method isRedirection : bool \end{ocamldoccode} \index{isRedirection@\verb`isRedirection`} \begin{ocamldocdescription} response is a redirection one \end{ocamldocdescription} \label{method:Http-underscoretypes.response.isClientError}\begin{ocamldoccode} method isClientError : bool \end{ocamldoccode} \index{isClientError@\verb`isClientError`} \begin{ocamldocdescription} response is a client error one \end{ocamldocdescription} \label{method:Http-underscoretypes.response.isServerError}\begin{ocamldoccode} method isServerError : bool \end{ocamldoccode} \index{isServerError@\verb`isServerError`} \begin{ocamldocdescription} response is a server error one \end{ocamldocdescription} \label{method:Http-underscoretypes.response.isError}\begin{ocamldoccode} method isError : bool \end{ocamldoccode} \index{isError@\verb`isError`} \begin{ocamldocdescription} response is either a client error or a server error response \end{ocamldocdescription} \label{method:Http-underscoretypes.response.addBasicHeaders}\begin{ocamldoccode} method addBasicHeaders : unit \end{ocamldoccode} \index{addBasicHeaders@\verb`addBasicHeaders`} \begin{ocamldocdescription} add basic headers to response, see {\tt{Http\_daemon.send\_basic\_headers}}[\ref{val:Http-underscoredaemon.send-underscorebasic-underscoreheaders}] \end{ocamldocdescription} \subsubsection{facilities to access some frequently used headers} \label{method:Http-underscoretypes.response.contentType}\begin{ocamldoccode} method contentType : string \end{ocamldoccode} \index{contentType@\verb`contentType`} \begin{ocamldocdescription} {\bf Returns }Content-Type header value \end{ocamldocdescription} \label{method:Http-underscoretypes.response.setContentType}\begin{ocamldoccode} method setContentType : string -> unit \end{ocamldoccode} \index{setContentType@\verb`setContentType`} \begin{ocamldocdescription} set Content-Type header value \end{ocamldocdescription} \label{method:Http-underscoretypes.response.contentEncoding}\begin{ocamldoccode} method contentEncoding : string \end{ocamldoccode} \index{contentEncoding@\verb`contentEncoding`} \begin{ocamldocdescription} {\bf Returns }Content-Encoding header value \end{ocamldocdescription} \label{method:Http-underscoretypes.response.setContentEncoding}\begin{ocamldoccode} method setContentEncoding : string -> unit \end{ocamldoccode} \index{setContentEncoding@\verb`setContentEncoding`} \begin{ocamldocdescription} set Content-Encoding header value \end{ocamldocdescription} \label{method:Http-underscoretypes.response.date}\begin{ocamldoccode} method date : string \end{ocamldoccode} \index{date@\verb`date`} \begin{ocamldocdescription} {\bf Returns }Date header value \end{ocamldocdescription} \label{method:Http-underscoretypes.response.setDate}\begin{ocamldoccode} method setDate : string -> unit \end{ocamldoccode} \index{setDate@\verb`setDate`} \begin{ocamldocdescription} set Date header value \end{ocamldocdescription} \label{method:Http-underscoretypes.response.expires}\begin{ocamldoccode} method expires : string \end{ocamldoccode} \index{expires@\verb`expires`} \begin{ocamldocdescription} {\bf Returns }Expires header value \end{ocamldocdescription} \label{method:Http-underscoretypes.response.setExpires}\begin{ocamldoccode} method setExpires : string -> unit \end{ocamldoccode} \index{setExpires@\verb`setExpires`} \begin{ocamldocdescription} set Expires header value \end{ocamldocdescription} \label{method:Http-underscoretypes.response.server}\begin{ocamldoccode} method server : string \end{ocamldoccode} \index{server@\verb`server`} \begin{ocamldocdescription} {\bf Returns }Server header value \end{ocamldocdescription} \label{method:Http-underscoretypes.response.setServer}\begin{ocamldoccode} method setServer : string -> unit \end{ocamldoccode} \index{setServer@\verb`setServer`} \begin{ocamldocdescription} set Server header value \end{ocamldocdescription} \label{method:Http-underscoretypes.response.connection}\begin{ocamldoccode} method connection : string \end{ocamldoccode} \index{connection@\verb`connection`} \begin{ocamldocdescription} {\bf Returns }Connection header value \end{ocamldocdescription} \label{method:Http-underscoretypes.response.setConnection}\begin{ocamldoccode} method setConnection : string -> unit \end{ocamldoccode} \index{setConnection@\verb`setConnection`} \begin{ocamldocdescription} set Connection header value \end{ocamldocdescription} \end{ocamldocobjectend} \begin{ocamldocdescription} HTTP responses \end{ocamldocdescription} \subsection{Daemon specification} \label{type:Http-underscoretypes.daemon-underscorespec}\begin{ocamldoccode} type daemon_spec = \{ address : string ; auth : (string * auth_info) option ; \end{ocamldoccode} \begin{ocamldoccomment} authentication requirements (currently only basic authentication is supported). If set to None no authentication is required. If set to Some ("realm", `Basic ("foo", "bar")), only clients authenticated with baisc authentication, for realm "realm", providing username "foo" and password "bar" are accepted; others are rejected with a 401 response code \end{ocamldoccomment} \begin{ocamldoccode} callback : request -> Pervasives.out_channel -> unit ; \end{ocamldoccode} \begin{ocamldoccomment} function which will be called each time a correct HTTP request will be received. 1st callback argument is an Http\_types.request object corresponding to the request received; 2nd argument is an output channel corresponding to the socket connected to the client \end{ocamldoccomment} \begin{ocamldoccode} mode : daemon_mode ; \end{ocamldoccode} \begin{ocamldoccomment} requests handling mode, it can have three different values:\begin{itemize} \item `Single $\rightarrow$ all requests will be handled by the same process, \item `Fork $\rightarrow$ each request will be handled by a child process, \item `Thread $\rightarrow$ each request will be handled by a (new) thread \end{itemize} \end{ocamldoccomment} \begin{ocamldoccode} port : int ; \end{ocamldoccode} \begin{ocamldoccomment} TCP port on which the daemon will be listening \end{ocamldoccomment} \begin{ocamldoccode} root_dir : string option ; \end{ocamldoccode} \begin{ocamldoccomment} directory to which ocaml http will chdir before starting handling requests; if None, no chdir will be performed (i.e. stay in the current working directory) \end{ocamldoccomment} \begin{ocamldoccode} exn_handler : (exn -> Pervasives.out_channel -> unit) option ; \end{ocamldoccode} \begin{ocamldoccomment} what to do when executing callback raises an exception. If None, the exception will be re-raised: in `Fork/`Thread mode the current process/thread will be terminated. in `Single mode the exception is ignored and the client socket closed. If Some callback, the callback will be executed before acting as per None; the callback is meant to perform some clean up actions, like releasing global mutexes in `Thread mode \end{ocamldoccomment} \begin{ocamldoccode} timeout : int option ; \end{ocamldoccode} \begin{ocamldoccomment} timeout in seconds after which an incoming HTTP request will be terminated closing the corresponding TCP connection; None disable the timeout \end{ocamldoccomment} \begin{ocamldoccode} auto_close : bool ; \end{ocamldoccode} \begin{ocamldoccomment} whether ocaml-http will automatically close the connection with the client after callback has completed its execution. If set to true, close will be attempted no matter if the callback raises an exception or not \end{ocamldoccomment} \begin{ocamldoccode} \} \end{ocamldoccode} \index{daemon-underscorespec@\verb`daemon_spec`} \begin{ocamldocdescription} daemon specification, describe the behaviour of an HTTP daemon. The default daemon specification is {\tt{Http\_daemon.default\_spec}}[\ref{val:Http-underscoredaemon.default-underscorespec}] \end{ocamldocdescription} \subsection{OO representation of other HTTP entities} \begin{ocamldoccode} {\tt{class type connection = }}\end{ocamldoccode} \label{classtype:Http-underscoretypes.connection}\index{connection@\verb`connection`} \begin{ocamldocobjectend} \label{method:Http-underscoretypes.connection.getRequest}\begin{ocamldoccode} method getRequest : Http_types.request option \end{ocamldoccode} \index{getRequest@\verb`getRequest`} \begin{ocamldocdescription} {\bf Returns }next request object, may block if client hasn't submitted any request yet, may be None if client request was ill-formed \end{ocamldocdescription} \label{method:Http-underscoretypes.connection.respond-underscorewith}\begin{ocamldoccode} method respond_with : Http_types.response -> unit \end{ocamldoccode} \index{respond-underscorewith@\verb`respond_with`} \begin{ocamldocdescription} respond to client sending it a response \end{ocamldocdescription} \label{method:Http-underscoretypes.connection.close}\begin{ocamldoccode} method close : unit \end{ocamldoccode} \index{close@\verb`close`} \begin{ocamldocdescription} close connection to client. Warning: this object can't be used any longer after this method has been called \end{ocamldocdescription} \end{ocamldocobjectend} \begin{ocamldocdescription} an HTTP connection from a client to a server \end{ocamldocdescription} \begin{ocamldoccode} {\tt{class type daemon = }}\end{ocamldoccode} \label{classtype:Http-underscoretypes.daemon}\index{daemon@\verb`daemon`} \begin{ocamldocobjectend} \label{method:Http-underscoretypes.daemon.accept}\begin{ocamldoccode} method accept : Http_types.connection \end{ocamldoccode} \index{accept@\verb`accept`} \begin{ocamldocdescription} {\bf Returns }a connection to a client, may block if no client has connected yet \end{ocamldocdescription} \label{method:Http-underscoretypes.daemon.getRequest}\begin{ocamldoccode} method getRequest : Http_types.request * Http_types.connection \end{ocamldoccode} \index{getRequest@\verb`getRequest`} \begin{ocamldocdescription} shortcut method, blocks until a client has submit a request and return a pair request * connection \end{ocamldocdescription} \end{ocamldocobjectend} \begin{ocamldocdescription} an HTTP daemon \end{ocamldocdescription} \section{Module {\tt{Http\_user\_agent}} : Minimal implementation of an HTTP 1.0/1.1 client.} \label{module:Http-underscoreuser-underscoreagent}\index{Http-underscoreuser-underscoreagent@\verb`Http_user_agent`} Interface is similar to Gerd Stoplmann's Http\_client module. Implementation is simpler and doesn't handle HTTP redirection, proxies, ecc. The only reason for the existence of this module is for performances and incremental elaboration of response's bodies \ocamldocvspace{0.5cm} \label{exception:Http-underscoreuser-underscoreagent.Http-underscoreerror}\begin{ocamldoccode} exception Http_error of (int * string) \end{ocamldoccode} \index{Http-underscoreerror@\verb`Http_error`} \label{val:Http-underscoreuser-underscoreagent.get}\begin{ocamldoccode} val get : ?head_callback:(Http_types.status -> (string * string) list -> unit) -> string -> string \end{ocamldoccode} \index{get@\verb`get`} \begin{ocamldocdescription} {\bf Raises} {\tt{Http\_error}} when response code $<$$>$ 200 {\bf Returns }HTTP response's body \end{ocamldocdescription} \label{val:Http-underscoreuser-underscoreagent.get-underscoreiter}\begin{ocamldoccode} val get_iter : ?head_callback:(Http_types.status -> (string * string) list -> unit) -> (string -> unit) -> string -> unit \end{ocamldoccode} \index{get-underscoreiter@\verb`get_iter`} \begin{ocamldocdescription} as above but iter callback function on HTTP response's body instead of returning it as a string \end{ocamldocdescription} \label{val:Http-underscoreuser-underscoreagent.head}\begin{ocamldoccode} val head : string -> string \end{ocamldoccode} \index{head@\verb`head`} \begin{ocamldocdescription} {\bf Raises} {\tt{Http\_error}} when response code $<$$>$ 200 {\bf Returns }HTTP HEAD raw response \end{ocamldocdescription} \end{document}ocaml-http_0.1.5/doc/latex/ocaml-http.toc0000644000175000017500000000464511507240336017612 0ustar celticceltic\contentsline {section}{\numberline {1}Module {\tt {Cookie\_lexer}}}{1} \contentsline {section}{\numberline {2}Module {\tt {Http\_common}} : Common functionalities shared by other OCaml HTTP modules}{2} \contentsline {section}{\numberline {3}Module {\tt {Http\_constants}} : Constants}{3} \contentsline {subsection}{\numberline {3.1}daemon default values}{3} \contentsline {section}{\numberline {4}Module {\tt {Http\_daemon}} : Main OCaml HTTP module.}{4} \contentsline {section}{\numberline {5}Module {\tt {Http\_message}} : Object Oriented representation of HTTP messages}{7} \contentsline {subsubsection}{\numberline {5.0.1}{\it header name comparison are performed in a case-insensitive manner as required by RFC2616, actually the implementation works converting all header names in lowercase}}{7} \contentsline {section}{\numberline {6}Module {\tt {Http\_misc}} : Helpers and other not better classified functions which should not be exposed in the final API}{9} \contentsline {section}{\numberline {7}Module {\tt {Http\_parser}} : HTTP messages parsing}{11} \contentsline {section}{\numberline {8}Module {\tt {Http\_parser\_sanity}} : Sanity test functions related to HTTP message parsing}{12} \contentsline {section}{\numberline {9}Module {\tt {Http\_request}} : Object Oriented representation of HTTP requests}{12} \contentsline {section}{\numberline {10}Module {\tt {Http\_response}} : Object Oriented representation of HTTP responses}{13} \contentsline {section}{\numberline {11}Module {\tt {Http\_tcp\_server}} : TCP servers used as low-levels for HTTP daemons}{13} \contentsline {subsection}{\numberline {11.1}servers}{13} \contentsline {subsection}{\numberline {11.2}low level functions}{13} \contentsline {section}{\numberline {12}Module {\tt {Http\_threaded\_tcp\_server}} : Multithreaded part of Http\_tcp\_server}{13} \contentsline {section}{\numberline {13}Module {\tt {Http\_types}} : Type definitions}{13} \contentsline {subsection}{\numberline {13.1}Exceptions}{16} \contentsline {subsection}{\numberline {13.2}OO representation of HTTP messages}{17} \contentsline {subsubsection}{\numberline {13.2.1}facilities to access some frequently used headers}{20} \contentsline {subsection}{\numberline {13.3}Daemon specification}{21} \contentsline {subsection}{\numberline {13.4}OO representation of other HTTP entities}{22} \contentsline {section}{\numberline {14}Module {\tt {Http\_user\_agent}} : Minimal implementation of an HTTP 1.0/1.1 client.}{23} ocaml-http_0.1.5/doc/latex/ocamldoc.sty0000644000175000017500000000377411507240335017356 0ustar celticceltic %% Support macros for LaTeX documentation generated by ocamldoc. %% This file is in the public domain; do what you want with it. \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{ocamldoc} [2001/12/04 v1.0 ocamldoc support] \newenvironment{ocamldoccode}{% \bgroup \leftskip\@totalleftmargin \rightskip\z@skip \parindent\z@ \parfillskip\@flushglue \parskip\z@skip %\noindent \@@par\smallskip \@tempswafalse \def\par{% \if@tempswa \leavevmode\null\@@par\penalty\interlinepenalty \else \@tempswatrue \ifhmode\@@par\penalty\interlinepenalty\fi \fi} \obeylines \verbatim@font \let\org@prime~% \@noligs \let\org@dospecials\dospecials \g@remfrom@specials{\\} \g@remfrom@specials{\{} \g@remfrom@specials{\}} \let\do\@makeother \dospecials \let\dospecials\org@dospecials \frenchspacing\@vobeyspaces \everypar \expandafter{\the\everypar \unpenalty}} {\egroup\par} \def\g@remfrom@specials#1{% \def\@new@specials{} \def\@remove##1{% \ifx##1#1\else \g@addto@macro\@new@specials{\do ##1}\fi} \let\do\@remove\dospecials \let\dospecials\@new@specials } \newenvironment{ocamldocdescription} {\list{}{\rightmargin0pt \topsep0pt}\raggedright\item\noindent\relax\ignorespaces} {\endlist\medskip} \newenvironment{ocamldoccomment} {\list{}{\leftmargin 2\leftmargini \rightmargin0pt \topsep0pt}\raggedright\item\noindent\relax} {\endlist} \let \ocamldocparagraph \paragraph \def \paragraph #1{\ocamldocparagraph {#1}\noindent} \let \ocamldocsubparagraph \subparagraph \def \subparagraph #1{\ocamldocsubparagraph {#1}\noindent} \let\ocamldocvspace\vspace \newenvironment{ocamldocindent}{\list{}{}\item\relax}{\endlist} \newenvironment{ocamldocsigend} {\noindent\quad\texttt{sig}\ocamldocindent} {\endocamldocindent\vskip -\lastskip \noindent\quad\texttt{end}\medskip} \newenvironment{ocamldocobjectend} {\noindent\quad\texttt{object}\ocamldocindent} {\endocamldocindent\vskip -\lastskip \noindent\quad\texttt{end}\medskip} \endinput ocaml-http_0.1.5/META0000644000175000017500000000041011507240503013600 0ustar celticcelticdescription = "OCaml HTTP daemon library" version = "0.1.5" requires = "unix,pcre,netstring" requires(mt) = "unix,pcre,netstring,threads" archive(byte) = "http.cma" archive(native) = "http.cmxa" archive(mt,byte) = "http_mt.cma" archive(mt,native) = "http_mt.cmxa" ocaml-http_0.1.5/TODO0000644000175000017500000000015511467430070013632 0ustar celticceltic- support for HTTPS - keepalive support (need to hook in with #connection / #setConnection in Http_response) ocaml-http_0.1.5/http_common.mli0000644000175000017500000000510511457270246016202 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Common functionalities shared by other OCaml HTTP modules *) open Http_types;; (** whether debugging messages are enabled or not, can be changed at runtime *) val debug: bool ref (** print a string on stderr only if debugging is enabled *) val debug_print: string -> unit (** see {!Http_constants.version} *) val http_version: version (** see {!Http_constants.server_string} *) val server_string: string (** pretty print an HTTP version *) val string_of_version: version -> string (** parse an HTTP version from a string @raise Invalid_HTTP_version if given string doesn't represent a supported HTTP version *) val version_of_string: string -> version (** pretty print an HTTP method *) val string_of_method: meth -> string (** parse an HTTP method from a string @raise Invalid_HTTP_method if given string doesn't represent a supported method *) val method_of_string: string -> meth (** converts an integer HTTP status to the corresponding status value @raise Invalid_code if given integer isn't a valid HTTP status code *) val status_of_code: int -> status (** converts an HTTP status to the corresponding integer value *) val code_of_status: [< status] -> int (** @return true on "informational" status codes, false elsewhere *) val is_informational: int -> bool (** @return true on "success" status codes, false elsewhere *) val is_success: int -> bool (** @return true on "redirection" status codes, false elsewhere *) val is_redirection: int -> bool (** @return true on "client error" status codes, false elsewhere *) val is_client_error: int -> bool (** @return true on "server error" status codes, false elsewhere *) val is_server_error: int -> bool (** @return true on "client error" and "server error" status code, false elsewhere *) val is_error: int -> bool ocaml-http_0.1.5/Makefile0000644000175000017500000000770711457270246014622 0ustar celticcelticinclude Makefile.defs export SHELL=/bin/bash MODULES = \ http_constants \ http_types \ http_parser_sanity \ http_misc \ http_common \ http_tcp_server \ cookie_lexer \ http_parser \ http_message \ http_request \ http_daemon \ http_response \ http_user_agent \ $(NULL) THREADED_SRV = http_threaded_tcp_server MODULES_MT = $(patsubst http_tcp_server, mt/$(THREADED_SRV) http_tcp_server, $(MODULES)) MODULES_NON_MT = $(patsubst http_tcp_server, non_mt/$(THREADED_SRV) http_tcp_server, $(MODULES)) PUBLIC_MODULES = \ http_types \ http_common \ http_message \ http_request \ http_daemon \ http_response \ http_user_agent OCAMLDOC_STUFF = *.mli DOCDIR = doc/html DOTDIR = doc/dot TEXDIR = doc/latex DESTDIR = $(shell $(OCAMLFIND) printconf destdir) all: all_non_mt all_mt opt: opt_non_mt opt_mt all_non_mt: http.cma opt_non_mt: http.cmxa all_mt: http_mt.cma opt_mt: http_mt.cmxa world: all opt doc: all $(DOCDIR)/index.html $(DOTDIR)/ocaml-http.ps $(TEXDIR)/ocaml-http.ps $(OCAMLDOC_STUFF) $(DOCDIR)/index.html: $(OCAMLDOC) -html -d $(DOCDIR) $(OCAMLDOC_STUFF) $(TEXDIR)/ocaml-http.tex: $(OCAMLDOC_STUFF) $(OCAMLDOC) -latex -o $@ $^ $(TEXDIR)/ocaml-http.ps: $(TEXDIR)/ocaml-http.tex cd $(TEXDIR); \ latex ocaml-http; \ latex ocaml-http; \ dvips ocaml-http $(DOTDIR)/ocaml-http.ps: $(DOTDIR)/ocaml-http.dot $(DOT) -Tps $< > $@ $(DOTDIR)/ocaml-http.dot: *.ml *.mli $(OCAMLDOC) -dot -o $(DOTDIR)/ocaml-http.dot *.ml *.mli examples: $(MAKE) -C examples/ examples.opt: $(MAKE) -C examples/ opt include .depend depend: $(OCAMLDEP) *.ml *.mli > .depend %.ml: %.mll $(OCAMLLEX) $< %.cmi: %.mli $(OCAMLC) -c $< %.cmo: %.ml %.cmi $(OCAMLC) -c $< %.cmx: %.ml %.cmi $(OCAMLOPT) -c $< non_mt/$(THREADED_SRV).cmo: non_mt/$(THREADED_SRV).ml $(THREADED_SRV).cmi cp $(THREADED_SRV).{cmi,mli} non_mt/ $(OCAMLC) -c $< non_mt/$(THREADED_SRV).cmx: non_mt/$(THREADED_SRV).ml $(THREADED_SRV).cmi cp $(THREADED_SRV).{cmi,mli} non_mt/ $(OCAMLOPT) -c $< mt/$(THREADED_SRV).cmo: mt/$(THREADED_SRV).ml $(THREADED_SRV).cmi cp $(THREADED_SRV).{cmi,mli} mt/ $(OCAMLC) $(THREADS_FLAGS) -c $< mt/$(THREADED_SRV).cmx: mt/$(THREADED_SRV).ml $(THREADED_SRV).cmi cp $(THREADED_SRV).{cmi,mli} mt/ $(OCAMLOPT) $(THREADS_FLAGS) -c $< http.cma: $(patsubst %,%.cmo,$(MODULES_NON_MT)) $(OCAMLC) -a -o $@ $^ http.cmxa: $(patsubst %,%.cmx,$(MODULES_NON_MT)) $(OCAMLOPT) -a -o $@ $^ http_mt.cma: $(patsubst %,%.cmo,$(MODULES_MT)) $(OCAMLC) -a -o $@ $^ http_mt.cmxa: $(patsubst %,%.cmx,$(MODULES_MT)) $(OCAMLOPT) -a -o $@ $^ meta: META META: META.in cat META.in | sed -e 's/@DISTVERSION@/$(DISTVERSION)/' > META clean: $(MAKE) -C examples/ clean for d in . mt non_mt; do \ rm -f $$d/*.cm[ioax] $$d/*.cmxa $$d/*.[ao] $$d/test{,.opt}; \ done rm -f {mt,non_mt}/$(THREADED_SRV).mli docclean: -rm -f \ $(DOCDIR)/*.html $(DOCDIR)/*.css \ $(DOTDIR)/*.dot $(DOTDIR)/*.ps \ $(TEXDIR)/*.{dvi,ps,ps.gz,pdf,aux,log,out,toc,tmp,haux,sty,tex} distclean: clean $(MAKE) -C examples/ distclean rm -f META dist: distreal distrm distdoc: all doc if [ -d $(DISTDIR) ]; then rm -rf $(DISTDIR); else true; fi mkdir -p $(DISTDIR)/doc/ cp -r doc/html/ $(DISTDIR)/doc/ cp doc/dot/ocaml-http.ps $(DISTDIR)/doc/modules.ps cp doc/latex/ocaml-http.ps $(DISTDIR)/doc/ distreal: distdoc distclean depend for f in \ $(patsubst %, %.ml, $(MODULES)) \ $(patsubst %, %.mli, $(MODULES) $(THREADED_SRV)) \ mt/ non_mt/ $(EXTRA_DIST) examples/ debian/; \ do \ cp -r $$f $(DISTDIR)/; \ done -find $(DISTDIR)/ -type d -name .svn -exec rm -rf {} \; tar cvzf $(DISTDIR).tar.gz $(DISTDIR)/ distrm: rm -rf $(DISTDIR)/ deb: docclean distreal (cd $(DISTDIR)/ && debuild) rm -rf $(DISTDIR)/ install: META $(OCAMLFIND) install -destdir $(DESTDIR) $(PKGNAME) \ $(patsubst %, %.mli, $(PUBLIC_MODULES)) \ $(patsubst %, %.cmi, $(PUBLIC_MODULES)) \ $(wildcard *.cma *.cmxa *.a) META .PHONY: \ all opt world all_non_mt all_mt opt_non_mt opt_mt \ examples examples.opt depend clean distclean dist \ install meta doc deb distreal distrm ocaml-http_0.1.5/Makefile.defs0000644000175000017500000000143711457270246015534 0ustar celticcelticPKGNAME = http DISTVERSION = $(shell dpkg-parsechangelog | egrep '^Version: ' | sed 's/^Version: //' | sed 's/-.*//') DEBUG_FLAGS = REQUIRES = unix str pcre netstring COMMON_FLAGS = $(DEBUG_FLAGS) -pp camlp4o -package "$(REQUIRES)" THREADS_FLAGS = -package threads -thread OCAMLFIND = ocamlfind OCAMLC = $(OCAMLFIND) ocamlc $(COMMON_FLAGS) OCAMLOPT = $(OCAMLFIND) ocamlopt $(COMMON_FLAGS) OCAMLDEP = $(OCAMLFIND) ocamldep $(COMMON_FLAGS) OCAMLLEX = ocamllex OCAMLDOC := \ ocamldoc -stars \ $(shell $(OCAMLFIND) query -i-format unix) \ $(shell $(OCAMLFIND) query -i-format pcre) \ $(shell $(OCAMLFIND) query -i-format netstring) DOT = dot DISTNAME = ocaml-http DISTDIR = $(DISTNAME)-$(DISTVERSION) EXTRA_DIST = \ INSTALL LICENSE README META.in Makefile Makefile.defs \ .depend ocaml-http_0.1.5/http_parser.ml0000644000175000017500000001451211507224104016023 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2010> Stefano Zacchiroli <2010> Arlen Cuss This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Printf;; open Http_common;; open Http_types;; open Http_constants;; let (bindings_sep, binding_sep, pieces_sep, header_sep) = (Pcre.regexp "&", Pcre.regexp "=", Pcre.regexp " ", Pcre.regexp ":") let header_RE = Pcre.regexp "([^:]*):(.*)" let url_decode url = Netencoding.Url.decode ~plus:true url let split_query_params query = let bindings = Pcre.split ~rex:bindings_sep query in match bindings with | [] -> [] | bindings -> List.map (fun binding -> match Pcre.split ~rex:binding_sep binding with | [ ""; b ] -> (* '=b' *) raise (Malformed_query_part (binding, query)) | [ a; b ] -> (* 'a=b' *) (url_decode a, url_decode b) | [ a ] -> (* 'a=' || 'a' *) (url_decode a, "") | _ -> raise (Malformed_query_part (binding, query))) bindings (** internal, used by generic_input_line *) exception Line_completed;; (** given an input channel and a separator @return a line read from it (like Pervasives.input_line) line is returned only after reading a separator string; separator string isn't included in the returned value TODO what about efficiency?, input is performed char-by-char *) let generic_input_line ~sep ~ic = let sep_len = String.length sep in if sep_len < 1 then failwith ("Separator '" ^ sep ^ "' is too short!") else (* valid separator *) let line = ref "" in let sep_pointer = ref 0 in try while true do if !sep_pointer >= String.length sep then (* line completed *) raise Line_completed else begin (* incomplete line: need to read more *) let ch = input_char ic in if ch = String.get sep !sep_pointer then (* next piece of sep *) incr sep_pointer else begin (* useful char *) for i = 0 to !sep_pointer - 1 do line := !line ^ (String.make 1 (String.get sep i)) done; sep_pointer := 0; line := !line ^ (String.make 1 ch) end end done; assert false (* unreacheable statement *) with Line_completed -> !line let patch_empty_path = function "" -> "/" | s -> s let debug_dump_request path params = debug_print (sprintf "recevied request; path: %s; params: %s" path (String.concat ", " (List.map (fun (n, v) -> n ^ "=" ^ v) params))) let parse_request_fst_line ic = let request_line = generic_input_line ~sep:crlf ~ic in debug_print (sprintf "HTTP request line (not yet parsed): %s" request_line); try (match Pcre.split ~rex:pieces_sep request_line with | [ meth_raw; uri_raw ] -> (* ancient HTTP request line *) (method_of_string meth_raw, (* method *) Http_parser_sanity.url_of_string uri_raw, (* uri *) None) (* no version given *) | [ meth_raw; uri_raw; http_version_raw ] -> (* HTTP 1.{0,1} *) (method_of_string meth_raw, (* method *) Http_parser_sanity.url_of_string uri_raw, (* uri *) Some (version_of_string http_version_raw)) (* version *) | _ -> raise (Malformed_request request_line)) with Malformed_URL url -> raise (Malformed_request_URI url) let parse_response_fst_line ic = let response_line = generic_input_line ~sep:crlf ~ic in debug_print (sprintf "HTTP response line (not yet parsed): %s" response_line); try (match Pcre.split ~rex:pieces_sep response_line with | version_raw :: code_raw :: _ -> (version_of_string version_raw, (* method *) status_of_code (int_of_string code_raw)) (* status *) | _ -> raise (Malformed_response response_line)) with | Malformed_URL _ | Invalid_code _ | Failure "int_of_string" -> raise (Malformed_response response_line) let parse_path uri = patch_empty_path (String.concat "/" (Neturl.url_path uri)) let parse_query_get_params uri = try (* act on HTTP encoded URIs *) split_query_params (Neturl.url_query ~encoded:true uri) with Not_found -> [] let parse_headers ic = (* consume also trailing "^\r\n$" line *) let rec parse_headers' headers = match generic_input_line ~sep:crlf ~ic with | "" -> List.rev headers | line -> (let subs = try Pcre.extract ~rex:header_RE line with Not_found -> raise (Invalid_header line) in let header = try subs.(1) with Invalid_argument "Array.get" -> raise (Invalid_header line) in let value = try Http_parser_sanity.normalize_header_value subs.(2) with Invalid_argument "Array.get" -> "" in Http_parser_sanity.heal_header (header, value); parse_headers' ((header, value) :: headers)) in parse_headers' [] let parse_cookies raw_cookies = let tokens = let lexbuf = Lexing.from_string raw_cookies in let rec aux acc = match Cookie_lexer.token lexbuf with | `EOF -> acc | token -> aux (token :: acc) in List.rev (aux []) in let rec aux = function | [ `ASSIGNMENT (n,v) ] -> [ (n,v) ] | `ASSIGNMENT (n,v) :: `SEP :: tl -> (n,v) :: aux tl | _ -> prerr_endline ("failed to read raw cookies: '" ^ raw_cookies ^ "'"); raise (Malformed_cookies raw_cookies) in aux tokens let parse_request ic = let (meth, uri, version) = parse_request_fst_line ic in let path = parse_path uri in let query_get_params = parse_query_get_params uri in debug_dump_request path query_get_params; (path, query_get_params) ocaml-http_0.1.5/http_tcp_server.mli0000644000175000017500000000233511457270246017070 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** TCP servers used as low-levels for HTTP daemons *) (** {2 servers} *) (** single process server *) val simple: Http_types.tcp_server (** multi threaded server *) val thread: Http_types.tcp_server (** multi process server *) val fork: Http_types.tcp_server (** {2 low level functions} *) (** initialize a passive socket listening on given Unix.sockaddr *) val init_socket: Unix.sockaddr -> Unix.file_descr ocaml-http_0.1.5/LICENSE0000644000175000017500000006130611457270246014162 0ustar celticceltic GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ocaml-http_0.1.5/.depend0000644000175000017500000000533411507240340014400 0ustar celticcelticcookie_lexer.cmo: cookie_lexer.cmi cookie_lexer.cmx: cookie_lexer.cmi http_common.cmo: http_types.cmi http_constants.cmi http_common.cmi http_common.cmx: http_types.cmx http_constants.cmx http_common.cmi http_constants.cmo: http_constants.cmi http_constants.cmx: http_constants.cmi http_daemon.cmo: http_types.cmi http_tcp_server.cmi http_request.cmi \ http_parser_sanity.cmi http_parser.cmi http_misc.cmi http_constants.cmi \ http_common.cmi http_daemon.cmi http_daemon.cmx: http_types.cmx http_tcp_server.cmx http_request.cmx \ http_parser_sanity.cmx http_parser.cmx http_misc.cmx http_constants.cmx \ http_common.cmx http_daemon.cmi http_message.cmo: http_types.cmi http_parser_sanity.cmi http_misc.cmi \ http_constants.cmi http_common.cmi http_message.cmi http_message.cmx: http_types.cmx http_parser_sanity.cmx http_misc.cmx \ http_constants.cmx http_common.cmx http_message.cmi http_misc.cmo: http_types.cmi http_misc.cmi http_misc.cmx: http_types.cmx http_misc.cmi http_parser.cmo: http_types.cmi http_parser_sanity.cmi http_constants.cmi \ http_common.cmi cookie_lexer.cmi http_parser.cmi http_parser.cmx: http_types.cmx http_parser_sanity.cmx http_constants.cmx \ http_common.cmx cookie_lexer.cmx http_parser.cmi http_parser_sanity.cmo: http_types.cmi http_constants.cmi \ http_parser_sanity.cmi http_parser_sanity.cmx: http_types.cmx http_constants.cmx \ http_parser_sanity.cmi http_request.cmo: http_types.cmi http_parser.cmi http_misc.cmi \ http_message.cmi http_common.cmi http_request.cmi http_request.cmx: http_types.cmx http_parser.cmx http_misc.cmx \ http_message.cmx http_common.cmx http_request.cmi http_response.cmo: http_types.cmi http_misc.cmi http_message.cmi \ http_daemon.cmi http_constants.cmi http_common.cmi http_response.cmi http_response.cmx: http_types.cmx http_misc.cmx http_message.cmx \ http_daemon.cmx http_constants.cmx http_common.cmx http_response.cmi http_tcp_server.cmo: http_threaded_tcp_server.cmi http_tcp_server.cmi http_tcp_server.cmx: http_threaded_tcp_server.cmi http_tcp_server.cmi http_types.cmo: http_types.cmi http_types.cmx: http_types.cmi http_user_agent.cmo: http_parser.cmi http_misc.cmi http_common.cmi \ http_user_agent.cmi http_user_agent.cmx: http_parser.cmx http_misc.cmx http_common.cmx \ http_user_agent.cmi cookie_lexer.cmi: http_common.cmi: http_types.cmi http_constants.cmi: http_types.cmi http_daemon.cmi: http_types.cmi http_message.cmi: http_types.cmi http_misc.cmi: http_parser.cmi: http_types.cmi http_parser_sanity.cmi: http_request.cmi: http_types.cmi http_response.cmi: http_types.cmi http_tcp_server.cmi: http_types.cmi http_threaded_tcp_server.cmi: http_types.cmi: http_user_agent.cmi: http_types.cmi ocaml-http_0.1.5/README0000644000175000017500000000017611457270246014033 0ustar celticceltic OCaml HTTP is a simple OCaml library for creating HTTP daemons, it is largely inspired to the Perl's HTTP:: modules family. ocaml-http_0.1.5/http_common.ml0000644000175000017500000001252511457270246016035 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Http_types;; open Printf;; let debug = ref false let debug_print s = if !debug then prerr_endline (sprintf "[OCaml HTTP] DEBUG: %s" s) let http_version = Http_constants.version let server_string = Http_constants.server_string let string_of_version = function | `HTTP_1_0 -> "HTTP/1.0" | `HTTP_1_1 -> "HTTP/1.1" let version_of_string = function | "HTTP/1.0" -> `HTTP_1_0 | "HTTP/1.1" -> `HTTP_1_1 | invalid_version -> raise (Invalid_HTTP_version invalid_version) let string_of_method = function | `GET -> "GET" | `POST -> "POST" let method_of_string = function | "GET" -> `GET | "POST" -> `POST | invalid_method -> raise (Invalid_HTTP_method invalid_method) let status_of_code = function | 100 -> `Informational `Continue | 101 -> `Informational `Switching_protocols | 200 -> `Success `OK | 201 -> `Success `Created | 202 -> `Success `Accepted | 203 -> `Success `Non_authoritative_information | 204 -> `Success `No_content | 205 -> `Success `Reset_content | 206 -> `Success `Partial_content | 300 -> `Redirection `Multiple_choices | 301 -> `Redirection `Moved_permanently | 302 -> `Redirection `Found | 303 -> `Redirection `See_other | 304 -> `Redirection `Not_modified | 305 -> `Redirection `Use_proxy | 307 -> `Redirection `Temporary_redirect | 400 -> `Client_error `Bad_request | 401 -> `Client_error `Unauthorized | 402 -> `Client_error `Payment_required | 403 -> `Client_error `Forbidden | 404 -> `Client_error `Not_found | 405 -> `Client_error `Method_not_allowed | 406 -> `Client_error `Not_acceptable | 407 -> `Client_error `Proxy_authentication_required | 408 -> `Client_error `Request_time_out | 409 -> `Client_error `Conflict | 410 -> `Client_error `Gone | 411 -> `Client_error `Length_required | 412 -> `Client_error `Precondition_failed | 413 -> `Client_error `Request_entity_too_large | 414 -> `Client_error `Request_URI_too_large | 415 -> `Client_error `Unsupported_media_type | 416 -> `Client_error `Requested_range_not_satisfiable | 417 -> `Client_error `Expectation_failed | 500 -> `Server_error `Internal_server_error | 501 -> `Server_error `Not_implemented | 502 -> `Server_error `Bad_gateway | 503 -> `Server_error `Service_unavailable | 504 -> `Server_error `Gateway_time_out | 505 -> `Server_error `HTTP_version_not_supported | invalid_code -> raise (Invalid_code invalid_code) let code_of_status = function | `Informational `Continue -> 100 | `Informational `Switching_protocols -> 101 | `Success `OK -> 200 | `Success `Created -> 201 | `Success `Accepted -> 202 | `Success `Non_authoritative_information -> 203 | `Success `No_content -> 204 | `Success `Reset_content -> 205 | `Success `Partial_content -> 206 | `Redirection `Multiple_choices -> 300 | `Redirection `Moved_permanently -> 301 | `Redirection `Found -> 302 | `Redirection `See_other -> 303 | `Redirection `Not_modified -> 304 | `Redirection `Use_proxy -> 305 | `Redirection `Temporary_redirect -> 307 | `Client_error `Bad_request -> 400 | `Client_error `Unauthorized -> 401 | `Client_error `Payment_required -> 402 | `Client_error `Forbidden -> 403 | `Client_error `Not_found -> 404 | `Client_error `Method_not_allowed -> 405 | `Client_error `Not_acceptable -> 406 | `Client_error `Proxy_authentication_required -> 407 | `Client_error `Request_time_out -> 408 | `Client_error `Conflict -> 409 | `Client_error `Gone -> 410 | `Client_error `Length_required -> 411 | `Client_error `Precondition_failed -> 412 | `Client_error `Request_entity_too_large -> 413 | `Client_error `Request_URI_too_large -> 414 | `Client_error `Unsupported_media_type -> 415 | `Client_error `Requested_range_not_satisfiable -> 416 | `Client_error `Expectation_failed -> 417 | `Server_error `Internal_server_error -> 500 | `Server_error `Not_implemented -> 501 | `Server_error `Bad_gateway -> 502 | `Server_error `Service_unavailable -> 503 | `Server_error `Gateway_time_out -> 504 | `Server_error `HTTP_version_not_supported -> 505 let is_informational code = match status_of_code code with | `Informational _ -> true | _ -> false let is_success code = match status_of_code code with | `Success _ -> true | _ -> false let is_redirection code = match status_of_code code with | `Redirection _ -> true | _ -> false let is_client_error code = match status_of_code code with | `Client_error _ -> true | _ -> false let is_server_error code = match status_of_code code with | `Server_error _ -> true | _ -> false let is_error code = is_client_error code || is_server_error code ocaml-http_0.1.5/http_constants.ml0000644000175000017500000000221711467424257016562 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) let version = `HTTP_1_1 ;; let server_string = "OCaml HTTP Daemon" ;; let crlf = "\r\n" ;; let default_addr = "0.0.0.0" let default_auth = None let default_auto_close = true let default_callback = fun _ _ -> () let default_mode = `Fork let default_port = 80 let default_root_dir = None let default_exn_handler = Some (fun exn outchan -> ()) let default_timeout = Some 300 ocaml-http_0.1.5/http_types.ml0000644000175000017500000001437411467430752015716 0ustar celticceltic(* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2007> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Type definitions *) type version = [ `HTTP_1_0 | `HTTP_1_1 ] type meth = [ `GET | `POST ] type daemon_mode = [ `Single | `Fork | `Thread ] type tcp_server = sockaddr:Unix.sockaddr -> timeout:int option -> (in_channel -> out_channel -> unit) -> unit type auth_info = [ `Basic of string * string (* username, password *) ] type informational_substatus = [ `Continue | `Switching_protocols ] type success_substatus = [ `OK | `Created | `Accepted | `Non_authoritative_information | `No_content | `Reset_content | `Partial_content ] type redirection_substatus = [ `Multiple_choices | `Moved_permanently | `Found | `See_other | `Not_modified | `Use_proxy | `Temporary_redirect ] type client_error_substatus = [ `Bad_request | `Unauthorized | `Payment_required | `Forbidden | `Not_found | `Method_not_allowed | `Not_acceptable | `Proxy_authentication_required | `Request_time_out | `Conflict | `Gone | `Length_required | `Precondition_failed | `Request_entity_too_large | `Request_URI_too_large | `Unsupported_media_type | `Requested_range_not_satisfiable | `Expectation_failed ] type server_error_substatus = [ `Internal_server_error | `Not_implemented | `Bad_gateway | `Service_unavailable | `Gateway_time_out | `HTTP_version_not_supported ] type informational_status = [ `Informational of informational_substatus ] type success_status = [ `Success of success_substatus ] type redirection_status = [ `Redirection of redirection_substatus ] type client_error_status = [ `Client_error of client_error_substatus ] type server_error_status = [ `Server_error of server_error_substatus ] type error_status = [ client_error_status | server_error_status ] type status = [ informational_status | success_status | redirection_status | client_error_status | server_error_status ] type status_code = [ `Code of int | `Status of status ] type file_source = | FileSrc of string | InChanSrc of in_channel exception Invalid_header of string exception Invalid_header_name of string exception Invalid_header_value of string exception Invalid_HTTP_version of string exception Invalid_HTTP_method of string exception Invalid_code of int exception Malformed_URL of string exception Malformed_query of string exception Malformed_query_part of string * string exception Malformed_request_URI of string exception Malformed_cookies of string exception Malformed_request of string exception Malformed_response of string exception Param_not_found of string exception Invalid_status_line of string exception Header_not_found of string exception Quit exception Unauthorized of string class type message = object method version: version option method setVersion: version -> unit method body: string method setBody: string -> unit method bodyBuf: Buffer.t method setBodyBuf: Buffer.t -> unit method addBody: string -> unit method addBodyBuf: Buffer.t -> unit method addHeader: name:string -> value:string -> unit method addHeaders: (string * string) list -> unit method replaceHeader: name:string -> value:string -> unit method replaceHeaders: (string * string) list -> unit method removeHeader: name:string -> unit method hasHeader: name:string -> bool method header: name:string -> string method headers: (string * string) list method clientSockaddr: Unix.sockaddr method clientAddr: string method clientPort: int method serverSockaddr: Unix.sockaddr method serverAddr: string method serverPort: int method toString: string method serialize: out_channel -> unit end class type request = object inherit message method meth: meth method uri: string method path: string method param: ?meth:meth -> ?default:string -> string -> string method paramAll: ?meth:meth -> string -> string list method params: (string * string) list method params_GET: (string * string) list method params_POST: (string * string) list method cookies: (string * string) list option method authorization: auth_info option end class type response = object inherit message method code: int method setCode: int -> unit method status: status method setStatus: status -> unit method reason: string method setReason: string -> unit method statusLine: string method setStatusLine: string -> unit method isInformational: bool method isSuccess: bool method isRedirection: bool method isClientError: bool method isServerError: bool method isError: bool method addBasicHeaders: unit method contentType: string method setContentType: string -> unit method contentEncoding: string method setContentEncoding: string -> unit method date: string method setDate: string -> unit method expires: string method setExpires: string -> unit method server: string method setServer: string -> unit method connection: string method setConnection: string -> unit end class type connection = object method getRequest: request option method respond_with: response -> unit method close: unit end class type daemon = object method accept: connection method getRequest: request * connection end type daemon_spec = { address: string; auth: (string * auth_info) option; callback: request -> out_channel -> unit; mode: daemon_mode; port: int; root_dir: string option; exn_handler: (exn -> out_channel -> unit) option; timeout: int option; auto_close: bool; } ocaml-http_0.1.5/http_message.ml0000644000175000017500000000741211457270246016170 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Http_common;; open Http_constants;; open Http_types;; open Printf;; (* remove all bindings of 'name' from hashtbl 'tbl' *) let rec hashtbl_remove_all tbl name = if not (Hashtbl.mem tbl name) then raise (Header_not_found name); Hashtbl.remove tbl name; if Hashtbl.mem tbl name then hashtbl_remove_all tbl name ;; class virtual message ~body ~headers ~version ~clisockaddr ~srvsockaddr = let ((cliaddr, cliport), (srvaddr, srvport)) = (Http_misc.explode_sockaddr clisockaddr, Http_misc.explode_sockaddr srvsockaddr) in object (self) val _contentsBuf = Buffer.create 1024 val _headers = Hashtbl.create 11 val mutable _version: version option = version initializer self#setBody body; self#addHeaders headers method version = _version method setVersion v = _version <- Some v method body = Buffer.contents _contentsBuf method setBody c = Buffer.clear _contentsBuf; Buffer.add_string _contentsBuf c method bodyBuf = _contentsBuf method setBodyBuf b = Buffer.clear _contentsBuf; Buffer.add_buffer _contentsBuf b method addBody s = Buffer.add_string _contentsBuf s method addBodyBuf b = Buffer.add_buffer _contentsBuf b method addHeader ~name ~value = let name = String.lowercase name in Http_parser_sanity.heal_header (name, value); Hashtbl.add _headers name value method addHeaders = List.iter (fun (name, value) -> self#addHeader ~name ~value) method replaceHeader ~name ~value = let name = String.lowercase name in Http_parser_sanity.heal_header (name, value); Hashtbl.replace _headers name value method replaceHeaders = List.iter (fun (name, value) -> self#replaceHeader ~name ~value) method removeHeader ~name = let name = String.lowercase name in hashtbl_remove_all _headers name method hasHeader ~name = let name = String.lowercase name in Hashtbl.mem _headers name method header ~name = if not (self#hasHeader name) then raise (Header_not_found name); let name = String.lowercase name in String.concat ", " (List.rev (Hashtbl.find_all _headers name)) method headers = List.rev (Hashtbl.fold (fun name _ headers -> (name, self#header ~name)::headers) _headers []) method clientSockaddr = clisockaddr method clientAddr = cliaddr method clientPort = cliport method serverSockaddr = srvsockaddr method serverAddr = srvaddr method serverPort = srvport method private virtual fstLineToString: string method toString = self#fstLineToString ^ (* {request,status} line *) crlf ^ (String.concat (* headers, crlf terminated *) "" (List.map (fun (h,v) -> h ^ ": " ^ v ^ crlf) self#headers)) ^ (sprintf "Content-Length: %d" (String.length self#body)) ^ crlf ^ crlf ^ self#body (* body *) method serialize outchan = output_string outchan self#toString; flush outchan end ocaml-http_0.1.5/http_daemon.ml0000644000175000017500000003711411467430414016005 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Printf open Http_common open Http_types open Http_constants open Http_parser exception Http_daemon_failure of string (** send raw data on outchan, flushing it afterwards *) let send_raw ~data outchan = output_string outchan data; flush outchan let send_CRLF = send_raw ~data:crlf let send_header ~header ~value = let header = String.lowercase header in Http_parser_sanity.heal_header (header, value); send_raw ~data:(header ^ ": " ^ value ^ crlf) let send_headers ~headers outchan = List.iter (fun (header, value) -> send_header ~header ~value outchan) headers (** internal: low level for send_status_line *) let send_status_line' ~version code = let status_line = String.concat " " [ string_of_version version; string_of_int code; Http_misc.reason_phrase_of_code code ] in send_raw ~data:(status_line ^ crlf) let int_of_code = function | `Code code -> code | `Status status -> code_of_status status let send_status_line ?(version = http_version) ~(code: status_code) outchan = send_status_line' ~version (int_of_code code) outchan let get_basic_headers () = ["Date", Http_misc.date_822 (); "Server", server_string; "Connection", "close"] let send_basic_headers ?(version = http_version) ~(code: status_code) outchan = send_status_line' ~version (int_of_code code) outchan; send_headers ~headers:(get_basic_headers ()) outchan (** internal: given a status code and an additional body return a string representing an HTML document that explains the meaning of given status code. Additional data can be added to the body via 'body' argument *) let foo_body code body = let reason_phrase = Http_misc.reason_phrase_of_code code in sprintf " %d %s

%d - %s

%s " code reason_phrase code reason_phrase body (** internal: send a fooish body explaining in HTML form the 'reason phrase' of an HTTP response; body, if given, will be appended to the body *) let send_foo_body code body = send_raw ~data:(foo_body code body) (* Warning: keep default values in sync with Http_response.response class *) let respond ?(body = "") ?(headers = []) ?version ?(code = `Code 200) outchan = send_basic_headers ?version ~code outchan; send_headers ~headers outchan; send_header "Content-Length" (string_of_int (String.length body)) outchan; send_CRLF outchan; send_raw ~data:body outchan (** internal: low level for respond_redirect, respond_error, ... This function send a status line corresponding to a given code, some basic headers, the additional headers (if given) and an HTML page containing the reason phrase; if body is given it will be included in the body of the HTML page *) let send_empty_response func_name ?(is_valid_status = fun _ -> true) ?(headers=[]) ?(body="") () = fun ?version code outchan -> if not (is_valid_status (int_of_code code)) then failwith (sprintf "'%d' isn't a valid status code for %s" (int_of_code code) func_name) else begin (* status code suitable for answering *) let headers = [ "Content-Type", "text/html; charset=iso-8859-1" ] @ headers in let body = (foo_body (int_of_code code) body) ^ body in respond ?version ~code ~headers ~body outchan end let respond_redirect ~location ?body ?version ?(code = `Code 301) outchan = send_empty_response "Daemon.respond_redirect" ~is_valid_status:is_redirection ~headers:["Location", location] ?body () ?version code outchan let respond_error ?body ?version ?(code = `Code 400) outchan = send_empty_response "Daemon.respond_error" ~is_valid_status:is_error ?body () ?version code outchan let respond_not_found ~url ?version outchan = send_empty_response "Daemon.respond_not_found" () ?version (`Code 404) outchan let respond_forbidden ~url ?version outchan = send_empty_response "Daemon.respond_permission_denied" () ?version (`Code 403) outchan let respond_unauthorized ?version ?(realm = server_string) outchan = let body = sprintf "401 - Unauthorized - Authentication failed for realm \"%s\"" realm in respond ~headers:["WWW-Authenticate", sprintf "Basic realm=\"%s\"" realm] ~code:(`Code 401) ~body outchan let send_file ~src outchan = let buflen = 1024 in let buf = String.make buflen ' ' in let (file, cleanup) = match src with | FileSrc fname -> (* if we open the file, we close it before returning *) let f = open_in fname in f, (fun () -> close_in f) | InChanSrc inchan -> inchan, ignore in try while true do let bytes = input file buf 0 buflen in if bytes = 0 then raise End_of_file else output outchan buf 0 bytes done; assert false with End_of_file -> begin flush outchan; cleanup () end (* TODO interface is too ugly to advertise this function in .mli *) (** create a minimal HTML directory listing of a given directory and send it over an out_channel, directory is passed as a dir_handle; name is the directory name, used for pretty printing purposes; path is the opened dir path, used to test its contents with stat *) let send_dir_listing ~dir ~name ~path outchan = fprintf outchan "\n%s\n\n" name; let (dirs, files) = List.partition (fun e -> Http_misc.is_directory (path ^ e)) (Http_misc.ls dir) in List.iter (fun d -> fprintf outchan "%s/
\n" d d) (List.sort compare dirs); List.iter (fun f -> fprintf outchan "%s
\n" f f) (List.sort compare files); fprintf outchan "\n"; flush outchan let respond_file ~fname ?(version = http_version) outchan = (** ASSUMPTION: 'fname' doesn't begin with a "/"; it's relative to the current document root (usually the daemon's cwd) *) let droot = Sys.getcwd () in (* document root *) let path = droot ^ "/" ^ fname in (* full path to the desired file *) if not (Sys.file_exists path) then (* file not found *) respond_not_found ~url:fname outchan else begin try if Http_misc.is_directory path then begin (* file found, is a dir *) let dir = Unix.opendir path in send_basic_headers ~version ~code:(`Code 200) outchan; send_header "Content-Type" "text/html" outchan; send_CRLF outchan; send_dir_listing ~dir ~name:fname ~path outchan; Unix.closedir dir end else begin (* file found, is something else *) let file = open_in fname in send_basic_headers ~version ~code:(`Code 200) outchan; send_header ~header:"Content-Length" ~value:(string_of_int (Http_misc.filesize fname)) outchan; send_CRLF outchan; send_file ~src:(InChanSrc file) outchan; close_in file end with | Unix.Unix_error (Unix.EACCES, _, _) | Sys_error _ -> respond_forbidden ~url:fname ~version outchan end let respond_with (res: Http_types.response) outchan = res#serialize outchan; flush outchan (** internal: this exception is raised after a malformed request has been read by a serving process to signal main server (or itself if mode = `Single) to skip to next request *) exception Again;; let pp_parse_exc e = sprintf "HTTP request parse error: %s" (Printexc.to_string e) (* given a Http_parser.parse_request like function, wrap it in a function that do the same and additionally catch parsing exception sending HTTP error messages back to client as needed. Returned function raises Again when it encounter a parse error (name 'Again' is intended for future versions that will support http keep alive signaling that a new request has to be parsed from client) *) let rec wrap_parse_request_w_safety parse_function inchan outchan = (try parse_function inchan with | (Malformed_request req) as e -> debug_print (pp_parse_exc e); respond_error ~code:(`Code 400) ~body:("request 1st line format should be: " ^ "'<method> <url> <version>'" ^ "
\nwhile received request 1st line was:
\n" ^ req) outchan; raise Again | (Invalid_HTTP_method meth) as e -> debug_print (pp_parse_exc e); respond_error ~code:(`Code 501) ~body:("Method '" ^ meth ^ "' isn't supported (yet)") outchan; raise Again | (Malformed_request_URI uri) as e -> debug_print (pp_parse_exc e); respond_error ~code:(`Code 400) ~body:("Malformed URL: '" ^ uri ^ "'") outchan; raise Again | (Invalid_HTTP_version version) as e -> debug_print (pp_parse_exc e); respond_error ~code:(`Code 505) ~body:("HTTP version '" ^ version ^ "' isn't supported (yet)") outchan; raise Again | (Malformed_query query) as e -> debug_print (pp_parse_exc e); respond_error ~code:(`Code 400) ~body:(sprintf "Malformed query string '%s'" query) outchan; raise Again | (Malformed_query_part (binding, query)) as e -> debug_print (pp_parse_exc e); respond_error ~code:(`Code 400) ~body:(sprintf "Malformed query part '%s' in query '%s'" binding query) outchan; raise Again) (* wrapper around Http_parser.parse_request which catch parsing exceptions and return error messages to client as needed @param inchan in_channel from which read incoming requests @param outchan out_channl on which respond with error messages if needed *) let safe_parse_request = wrap_parse_request_w_safety parse_request (* as above but for OO version (Http_parser.parse_request') *) let safe_parse_request' = wrap_parse_request_w_safety (new Http_request.request) let chdir_to_document_root = function (* chdir to document root *) | Some dir -> Sys.chdir dir | None -> () let server_of_mode = function | `Single -> Http_tcp_server.simple | `Fork -> Http_tcp_server.fork | `Thread -> Http_tcp_server.thread (* TODO what happens when a Quit exception is raised by a callback? Do other callbacks keep on living until the end or are them all killed immediatly? The right semantics should obviously be the first one *) (** - handle HTTP authentication * - handle automatic closures of client connections *) let invoke_callback req spec outchan = let callback req outchan = if spec.auto_close then Http_misc.finally (fun () -> try close_out outchan with Sys_error _ -> ()) (fun () -> spec.callback req outchan) () else spec.callback req outchan in try (match (spec.auth, req#authorization) with | None, _ -> callback req outchan (* no auth required *) | Some (realm, `Basic (spec_username, spec_password)), Some (`Basic (username, password)) when (username = spec_username) && (password = spec_password) -> (* auth ok *) callback req outchan | Some (realm, _), _ -> raise (Unauthorized realm)) (* auth failure *) with | Unauthorized realm -> respond_unauthorized ~realm outchan | Again -> () let main spec = chdir_to_document_root spec.root_dir; let sockaddr = Http_misc.build_sockaddr (spec.address, spec.port) in let daemon_callback inchan outchan = let next_req () = try Some (safe_parse_request' inchan outchan) with _ -> None in let rec loop n = match next_req () with | Some req -> debug_print (sprintf "request #%d" n); invoke_callback req spec outchan; flush outchan; loop (n + 1) | None -> debug_print "server exiting"; () in debug_print "server starting"; try loop 1 with exn -> debug_print (sprintf "uncaught exception: %s" (Printexc.to_string exn)); (match spec.exn_handler with | Some f -> debug_print "executing handler"; f exn outchan | None -> debug_print "no handler given: re-raising"; raise exn) in try (server_of_mode spec.mode) ~sockaddr ~timeout:spec.timeout daemon_callback with Quit -> () module Trivial = struct let heading_slash_RE = Pcre.regexp "^/" let trivial_callback req outchan = let path = req#path in if not (Pcre.pmatch ~rex:heading_slash_RE path) then respond_error ~code:(`Code 400) outchan else respond_file ~fname:(Http_misc.strip_heading_slash path) outchan let callback = trivial_callback let main spec = main { spec with callback = trivial_callback } end (** @param inchan input channel connected to client @param outchan output channel connected to client @param sockaddr client socket address *) class connection inchan outchan sockaddr = (* ASSUMPTION: inchan and outchan are channels built on top of the same Unix.file_descr thus closing one of them will close also the other *) let close' o = try o#close with Http_daemon_failure _ -> () in object (self) initializer Gc.finalise close' self val mutable closed = false method private assertNotClosed = if closed then raise (Http_daemon_failure "Http_daemon.connection: connection is closed") method getRequest = self#assertNotClosed; try Some (safe_parse_request' inchan outchan) with _ -> None method respond_with res = self#assertNotClosed; respond_with res outchan method close = self#assertNotClosed; close_in inchan; (* this close also outchan *) closed <- true end class daemon ?(addr = "0.0.0.0") ?(port = 80) () = object (self) val suck = Http_tcp_server.init_socket (Http_misc.build_sockaddr (addr, port)) method accept = let (cli_suck, cli_sockaddr) = Unix.accept suck in (* may block *) let (inchan, outchan) = (Unix.in_channel_of_descr cli_suck, Unix.out_channel_of_descr cli_suck) in new connection inchan outchan cli_sockaddr method getRequest = let conn = self#accept in match conn#getRequest with | None -> conn#close; self#getRequest | Some req -> (req, conn) end open Http_constants let default_spec = { address = default_addr; auth = default_auth; auto_close = default_auto_close; callback = default_callback; mode = default_mode; port = default_port; root_dir = default_root_dir; exn_handler = default_exn_handler; timeout = default_timeout; } let daemon_spec ?(address = default_addr) ?(auth = default_auth) ?(auto_close = default_auto_close) ?(callback = default_callback) ?(mode = default_mode) ?(port = default_port) ?(root_dir = default_root_dir) ?(exn_handler = default_exn_handler) ?(timeout = default_timeout) () = { default_spec with address = address; auth = auth; auto_close = auto_close; callback = callback; mode = mode; port = port; root_dir = root_dir; exn_handler = exn_handler; timeout = timeout; } ocaml-http_0.1.5/META.in0000644000175000017500000000042011457270246014221 0ustar celticcelticdescription = "OCaml HTTP daemon library" version = "@DISTVERSION@" requires = "unix,pcre,netstring" requires(mt) = "unix,pcre,netstring,threads" archive(byte) = "http.cma" archive(native) = "http.cmxa" archive(mt,byte) = "http_mt.cma" archive(mt,native) = "http_mt.cmxa" ocaml-http_0.1.5/http_parser.mli0000644000175000017500000000633311457270246016212 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** HTTP messages parsing *) open Http_types;; (** given an HTTP like query string (e.g. "name1=value1&name2=value2&...") @return a list of pairs [("name1", "value1"); ("name2", "value2")] @raise Malformed_query if the string isn't a valid query string @raise Malformed_query_part if some piece of the query isn't valid *) val split_query_params: string -> (string * string) list (** parse 1st line of an HTTP request @param inchan input channel from which parse request @return a triple meth * url * version, meth is the HTTP method invoked, url is the requested url, version is the HTTP version specified or None if no version was specified @raise Malformed_request if request 1st linst isn't well formed @raise Malformed_request_URI if requested URI isn't well formed *) val parse_request_fst_line: in_channel -> meth * Neturl.url * version option (** parse 1st line of an HTTP response * @param inchan input channel from which parse response * @raise Malformed_response if first line isn't well formed *) val parse_response_fst_line: in_channel -> version * status (** parse HTTP GET parameters from an URL; paramater which were passed with no value (like 'x' in "/foo.cgi?a=10&x=&c=9") are returned associated with the empty ("") string. @return a list of pairs param_name * param_value *) val parse_query_get_params: Neturl.url -> (string * string) list (** parse the base path (removing query string, fragment, ....) from an URL *) val parse_path: Neturl.url -> string (** parse HTTP headers. Consumes also trailing CRLF at the end of header list @param inchan input channel from which parse headers @return a list of pairs header_name * header_value @raise Invalid_header if a not well formed header is encountered *) val parse_headers: in_channel -> (string * string) list (** parse a Cookie header, extracting an associative list . See RFC 2965 * @param raw_cookies: value of a "Cookies:" header * @return a list of pairs cookie_name * cookie_value * @raise Malformed_cookies if raw_cookies does not conform to RFC 2965 *) val parse_cookies: string -> (string * string) list (** given an input channel, reads from it a GET HTTP request and @return a pair where path is a string representing the requested path and query_params is a list of pairs (the GET parameters) *) val parse_request: in_channel -> string * (string * string) list ocaml-http_0.1.5/http_constants.mli0000644000175000017500000000260011457270246016723 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Constants *) (** default HTTP version *) val version: Http_types.version (** string returned as value of "Server:" response header *) val server_string: string (** "\r\n" string *) val crlf: string (** {2 daemon default values} *) val default_addr: string val default_auth: (string * Http_types.auth_info) option val default_auto_close: bool val default_callback: Http_types.request -> out_channel -> unit val default_mode: Http_types.daemon_mode val default_port: int val default_root_dir: string option val default_exn_handler: (exn -> out_channel -> unit) option val default_timeout: int option ocaml-http_0.1.5/http_types.mli0000644000175000017500000003560611467431012016056 0ustar celticceltic(* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2007> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Type definitions *) (** HTTP version, actually only 1.0 and 1.1 are supported. Note that 'supported' here means only 'accepted inside a HTTP request line', no different behaviours are actually implemented depending on HTTP version *) type version = [ `HTTP_1_0 | `HTTP_1_1 ] (** HTTP method, actually only GET and POST methods are supported *) type meth = [ `GET | `POST ] (** Daemon behaviour wrt request handling. `Single mode use a single process to handle all requests, no request is served until a previous one has been fully served. `Fork mode fork a new process for each request, the new process will execute the callback function and then exit. `Thread mode create a new thread for each request, the new thread will execute the callback function and then exit, threads can communicate using standard OCaml Thread library. *) type daemon_mode = [ `Single | `Fork | `Thread ] (** A TCP server is a function taking an address on which bind and listen for connections, an optional timeout after which abort client connections and a callback function which in turn takes an input and an output channel as arguments. After receiving this argument a TCP server sits and waits for connection, on each connection it apply the callback function to channels connected to client. *) type tcp_server = sockaddr:Unix.sockaddr -> timeout:int option -> (in_channel -> out_channel -> unit) -> unit (** authentication information *) type auth_info = [ `Basic of string * string (* username, password *) (* | `Digest of ... (* TODO digest authentication *) *) ] (** @see "RFC2616" informational HTTP status *) type informational_substatus = [ `Continue | `Switching_protocols ] (** @see "RFC2616" success HTTP status *) type success_substatus = [ `OK | `Created | `Accepted | `Non_authoritative_information | `No_content | `Reset_content | `Partial_content ] (** @see "RFC2616" redirection HTTP status *) type redirection_substatus = [ `Multiple_choices | `Moved_permanently | `Found | `See_other | `Not_modified | `Use_proxy | `Temporary_redirect ] (** @see "RFC2616" client error HTTP status *) type client_error_substatus = [ `Bad_request | `Unauthorized | `Payment_required | `Forbidden | `Not_found | `Method_not_allowed | `Not_acceptable | `Proxy_authentication_required | `Request_time_out | `Conflict | `Gone | `Length_required | `Precondition_failed | `Request_entity_too_large | `Request_URI_too_large | `Unsupported_media_type | `Requested_range_not_satisfiable | `Expectation_failed ] (** @see "RFC2616" server error HTTP status *) type server_error_substatus = [ `Internal_server_error | `Not_implemented | `Bad_gateway | `Service_unavailable | `Gateway_time_out | `HTTP_version_not_supported ] type informational_status = [ `Informational of informational_substatus ] type success_status = [ `Success of success_substatus ] type redirection_status = [ `Redirection of redirection_substatus ] type client_error_status = [ `Client_error of client_error_substatus ] type server_error_status = [ `Server_error of server_error_substatus ] type error_status = [ client_error_status | server_error_status ] (** HTTP status *) type status = [ informational_status | success_status | redirection_status | client_error_status | server_error_status ] type status_code = [ `Code of int | `Status of status ] (** File sources *) type file_source = | FileSrc of string (** filename *) | InChanSrc of in_channel (** input channel *) (** {2 Exceptions} *) (** invalid header encountered *) exception Invalid_header of string (** invalid header name encountered *) exception Invalid_header_name of string (** invalid header value encountered *) exception Invalid_header_value of string (** unsupported or invalid HTTP version encountered *) exception Invalid_HTTP_version of string (** unsupported or invalid HTTP method encountered *) exception Invalid_HTTP_method of string (** invalid HTTP status code integer representation encountered *) exception Invalid_code of int (** invalid URL encountered *) exception Malformed_URL of string (** invalid query string encountered *) exception Malformed_query of string (** invalid query string part encountered, arguments are parameter name and parameter value *) exception Malformed_query_part of string * string (** invalid request URI encountered *) exception Malformed_request_URI of string (** malformed cookies *) exception Malformed_cookies of string (** malformed request received *) exception Malformed_request of string (** malformed response received, argument is response's first line *) exception Malformed_response of string (** a parameter you were looking for was not found *) exception Param_not_found of string (** invalid HTTP status line encountered *) exception Invalid_status_line of string (** an header you were looking for was not found *) exception Header_not_found of string (** raisable by callbacks to make main daemon quit, this is the only * 'clean' way to make start functions return *) exception Quit (** raisable by callbacks to force a 401 (unauthorized) HTTP answer. * This exception should be raised _before_ sending any data over given out * channel. * @param realm authentication realm (usually needed to prompt user) *) exception Unauthorized of string (** {2 OO representation of HTTP messages} *) (** HTTP generic messages. See {! Http_message.message} *) class type message = object method version: version option method setVersion: version -> unit method body: string method setBody: string -> unit method bodyBuf: Buffer.t method setBodyBuf: Buffer.t -> unit method addBody: string -> unit method addBodyBuf: Buffer.t -> unit method addHeader: name:string -> value:string -> unit method addHeaders: (string * string) list -> unit method replaceHeader: name:string -> value:string -> unit method replaceHeaders: (string * string) list -> unit method removeHeader: name:string -> unit method hasHeader: name:string -> bool method header: name:string -> string method headers: (string * string) list method clientSockaddr: Unix.sockaddr method clientAddr: string method clientPort: int method serverSockaddr: Unix.sockaddr method serverAddr: string method serverPort: int method toString: string method serialize: out_channel -> unit end (** HTTP requests *) class type request = object (** an HTTP request is a flavour of HTTP message *) inherit message (** @return request method *) method meth: meth (** @return requested URI (including query string, fragment, ...) *) method uri: string (** @return requested path *) method path: string (** lookup a given parameter @param meth if given restrict the lookup area (e.g. if meth = POST than only parameters received via POST are searched), if not given both GET and POST parameter are searched in an unspecified order (actually the implementation prefers POST parameters but this is not granted, you've been warned) @param default if provided, this value will be returned in case no parameter of that name is available instead of raising Param_not_found @param name name of the parameter to lookup @return value associated to parameter name @raise Param_not_found if parameter name was not found *) method param: ?meth:meth -> ?default:string -> string -> string (** like param above but return a list of values associated to given parameter (a parameter could be defined indeed more than once: passed more than once in a query string or passed both insider the url (the GET way) and inside message body (the POST way)) *) method paramAll: ?meth:meth -> string -> string list (** @return the list of all received parameters *) method params: (string * string) list (** @return the list of all parameters received via GET *) method params_GET: (string * string) list (** @return the list of all parameter received via POST *) method params_POST: (string * string) list method cookies: (string * string) list option (** @return authorization information, if given by the client *) method authorization: auth_info option end (** HTTP responses *) class type response = object inherit message (** @return response code *) method code: int (** set response code *) method setCode: int -> unit (** @return response status *) method status: status (** set response status *) method setStatus: status -> unit (** @return reason string *) method reason: string (** set reason string *) method setReason: string -> unit (** @return status line *) method statusLine: string (** set status line @raise Invalid_status_line if an invalid HTTP status line was passed *) method setStatusLine: string -> unit (** response is an informational one *) method isInformational: bool (** response is a success one *) method isSuccess: bool (** response is a redirection one *) method isRedirection: bool (** response is a client error one *) method isClientError: bool (** response is a server error one *) method isServerError: bool (** response is either a client error or a server error response *) method isError: bool (** add basic headers to response, see {!Http_daemon.send_basic_headers} *) method addBasicHeaders: unit (** facilities to access some frequently used headers *) (** @return Content-Type header value *) method contentType: string (** set Content-Type header value *) method setContentType: string -> unit (** @return Content-Encoding header value *) method contentEncoding: string (** set Content-Encoding header value *) method setContentEncoding: string -> unit (** @return Date header value *) method date: string (** set Date header value *) method setDate: string -> unit (** @return Expires header value *) method expires: string (** set Expires header value *) method setExpires: string -> unit (** @return Server header value *) method server: string (** set Server header value *) method setServer: string -> unit (** @return Connection header value *) method connection: string (** set Connection header value *) method setConnection: string -> unit end (** {2 Daemon specification} *) (** daemon specification, describe the behaviour of an HTTP daemon. * * The default daemon specification is {!Http_daemon.default_spec} *) type daemon_spec = { address: string; (** @param address adress on which daemon will be listening, can be both a * numeric address (e.g. "127.0.0.1") and an hostname (e.g. "localhost") *) auth: (string * auth_info) option; (** authentication requirements (currently only basic authentication is * supported). If set to None no authentication is required. If set to Some * ("realm", `Basic ("foo", "bar")), only clients authenticated with baisc * authentication, for realm "realm", providing username "foo" and password * "bar" are accepted; others are rejected with a 401 response code *) callback: request -> out_channel -> unit; (** function which will be called each time a correct HTTP request will be * received. 1st callback argument is an Http_types.request object * corresponding to the request received; 2nd argument is an output channel * corresponding to the socket connected to the client *) mode: daemon_mode; (** requests handling mode, it can have three different values: * - `Single -> all requests will be handled by the same process, * - `Fork -> each request will be handled by a child process, * - `Thread -> each request will be handled by a (new) thread *) port: int; (** TCP port on which the daemon will be listening *) root_dir: string option; (** directory to which ocaml http will chdir before starting handling * requests; if None, no chdir will be performed (i.e. stay in the current * working directory) *) exn_handler: (exn -> out_channel -> unit) option; (** what to do when executing callback raises an exception. If None, the * exception will be re-raised: in `Fork/`Thread mode the current * process/thread will be terminated. in `Single mode the exception is * ignored and the client socket closed. If Some callback, the callback will * be executed before acting as per None; the callback is meant to perform * some clean up actions, like releasing global mutexes in `Thread mode *) timeout: int option; (** timeout in seconds after which an incoming HTTP request will be * terminated closing the corresponding TCP connection; None disable the * timeout *) auto_close: bool; (** whether ocaml-http will automatically close the connection with the * client after callback has completed its execution. If set to true, close * will be attempted no matter if the callback raises an exception or not *) } (** {2 OO representation of other HTTP entities} *) (** an HTTP connection from a client to a server *) class type connection = object (** @return next request object, may block if client hasn't submitted any request yet, may be None if client request was ill-formed *) method getRequest: request option (** respond to client sending it a response *) method respond_with: response -> unit (** close connection to client. Warning: this object can't be used any longer after this method has been called *) method close: unit end (** an HTTP daemon *) class type daemon = object (** @return a connection to a client, may block if no client has connected yet *) method accept: connection (** shortcut method, blocks until a client has submit a request and return a pair request * connection *) method getRequest: request * connection end ocaml-http_0.1.5/http_user_agent.mli0000644000175000017500000000357211457270246017054 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Minimal implementation of an HTTP 1.0/1.1 client. Interface is similar to * Gerd Stoplmann's Http_client module. Implementation is simpler and doesn't * handle HTTP redirection, proxies, ecc. The only reason for the existence of * this module is for performances and incremental elaboration of response's * bodies *) open Http_types exception Http_error of (int * string) (* code, body *) (** @param head_callback optional calllback invoked on response's status and * headers. If not provided no callback will be invoked * @param url an HTTP url * @return HTTP response's body * @raise Http_error when response code <> 200 *) val get: ?head_callback:(status -> (string * string) list -> unit) -> string -> string (** as above but iter callback function on HTTP response's body instead of * returning it as a string *) val get_iter: ?head_callback:(status -> (string * string) list -> unit) -> (string -> unit) -> string -> unit (** @param url an HTTP url * @return HTTP HEAD raw response * @raise Http_error when response code <> 200 *) val head: string -> string ocaml-http_0.1.5/http_user_agent.ml0000644000175000017500000000667711457270246016714 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Printf open Http_common exception Http_error of (int * string) (* code, body *) let http_scheme_RE = Pcre.regexp ~flags:[`CASELESS] "^http://" let url_RE = Pcre.regexp "^([\\w.-]+)(:(\\d+))?(/.*)?$" let tcp_bufsiz = 4096 (* for TCP I/O *) let parse_url url = try let subs = Pcre.extract ~rex:url_RE (Pcre.replace ~rex:http_scheme_RE url) in (subs.(1), (if subs.(2) = "" then 80 else int_of_string subs.(3)), (if subs.(4) = "" then "/" else subs.(4))) with exc -> failwith (sprintf "Can't parse url: %s (exception: %s)" url (Printexc.to_string exc)) let init_socket addr port = let inet_addr = (Unix.gethostbyname addr).Unix.h_addr_list.(0) in let sockaddr = Unix.ADDR_INET (inet_addr, port) in let suck = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in Unix.connect suck sockaddr; let outchan = Unix.out_channel_of_descr suck in let inchan = Unix.in_channel_of_descr suck in (inchan, outchan) let submit_request kind url = let (address, port, path) = parse_url url in let (inchan, outchan) = init_socket address port in let req_string = match kind with `GET -> "GET" | `HEAD -> "HEAD" in output_string outchan (sprintf "%s %s HTTP/1.0\r\n" req_string path); output_string outchan (sprintf "Host: %s\r\n\r\n" address); flush outchan; (inchan, outchan) let head url = let (inchan, outchan) = submit_request `HEAD url in let (_, status) = Http_parser.parse_response_fst_line inchan in (match code_of_status status with | 200 -> () | code -> raise (Http_error (code, ""))); let buf = Http_misc.buf_of_inchan inchan in close_in inchan; (* close also outchan, same fd *) Buffer.contents buf let get_iter ?(head_callback = fun _ _ -> ()) callback url = let (inchan, outchan) = submit_request `GET url in let buf = String.create tcp_bufsiz in let (_, status) = Http_parser.parse_response_fst_line inchan in (match code_of_status status with | 200 -> () | code -> raise (Http_error (code, ""))); let headers = Http_parser.parse_headers inchan in head_callback status headers; (try while true do match input inchan buf 0 tcp_bufsiz with | 0 -> raise End_of_file | bytes when bytes = tcp_bufsiz -> (* buffer full, no need to slice it *) callback buf | bytes when bytes < tcp_bufsiz -> (* buffer not full, slice it *) callback (String.sub buf 0 bytes) | _ -> (* ( bytes < 0 ) || ( bytes > tcp_bufsiz ) *) assert false done with End_of_file -> ()); close_in inchan (* close also outchan, same fd *) let get ?head_callback url = let buf = Buffer.create 10240 in get_iter ?head_callback (Buffer.add_string buf) url; Buffer.contents buf ocaml-http_0.1.5/http_response.ml0000644000175000017500000001010411467430600016363 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Http_types;; open Http_constants;; open Http_common;; open Http_daemon;; open Printf;; let status_line_RE = Pcre.regexp "^(HTTP/\\d\\.\\d) (\\d{3}) (.*)$" let anyize = function | Some addr -> addr | None -> Unix.ADDR_INET (Unix.inet_addr_any, -1) class response (* Warning: keep default values in sync with Http_daemon.respond function *) ?(body = "") ?(headers = []) ?(version = http_version) ?clisockaddr ?srvsockaddr (* optional because response have to be easily buildable in callback functions *) ?(code = 200) ?status () = (** if no address were supplied for client and/or server, use a foo address instead *) let (clisockaddr, srvsockaddr) = (anyize clisockaddr, anyize srvsockaddr) in (* "version code reason_phrase" *) object (self) (* note that response objects can't be created with a None version *) inherit Http_message.message ~body ~headers ~version:(Some version) ~clisockaddr ~srvsockaddr val mutable _code = match status with | None -> code | Some (s: Http_types.status) -> code_of_status s val mutable _reason: string option = None method private getRealVersion = match self#version with | None -> failwith ("Http_response.fstLineToString: " ^ "can't serialize an HTTP response with no HTTP version defined") | Some v -> string_of_version v method code = _code method setCode c = ignore (status_of_code c); (* sanity check on c *) _code <- c method status = status_of_code _code method setStatus (s: Http_types.status) = _code <- code_of_status s method reason = match _reason with | None -> Http_misc.reason_phrase_of_code _code | Some r -> r method setReason r = _reason <- Some r method statusLine = String.concat " " [self#getRealVersion; string_of_int self#code; self#reason] method setStatusLine s = try let subs = Pcre.extract ~rex:status_line_RE s in self#setVersion (version_of_string subs.(1)); self#setCode (int_of_string subs.(2)); self#setReason subs.(3) with Not_found -> raise (Invalid_status_line s) method isInformational = is_informational _code method isSuccess = is_success _code method isRedirection = is_redirection _code method isClientError = is_client_error _code method isServerError = is_server_error _code method isError = is_error _code method addBasicHeaders = List.iter (fun (n,v) -> self#addHeader n v) (get_basic_headers ()) method contentType = self#header "Content-Type" method setContentType t = self#replaceHeader "Content-Type" t method contentEncoding = self#header "Content-Encoding" method setContentEncoding e = self#replaceHeader "Content-Encoding" e method date = self#header "Date" method setDate d = self#replaceHeader "Date" d method expires = self#header "Expires" method setExpires t = self#replaceHeader "Expires" t method server = self#header "Server" method setServer s = self#replaceHeader "Server" s method connection = self#header "Connection" method setConnection s = self#replaceHeader "Connection" s method private fstLineToString = sprintf "%s %d %s" self#getRealVersion self#code self#reason end ocaml-http_0.1.5/http_misc.ml0000644000175000017500000001106211457270246015473 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Printf open Http_types let date_822 () = Netdate.mk_mail_date ~zone:Netdate.localzone (Unix.time ()) let is_directory name = match Unix.lstat name with | { Unix.st_kind = Unix.S_DIR } -> true | _ -> false let filesize fname = (Unix.stat fname).Unix.st_size let strip_trailing_slash = let rex = Pcre.regexp "/$" in fun s -> Pcre.replace ~rex ~templ:"" s let strip_heading_slash = let rex = Pcre.regexp "^/" in fun s -> Pcre.replace ~rex ~templ:"" s let ls dir = let rec ls' entries = try ls' ((Unix.readdir dir)::entries) with End_of_file -> entries in ls' [] let string_explode s = let rec string_explode' acc = function | "" -> acc | s -> string_explode' (s.[0] :: acc) (String.sub s 1 (String.length s - 1)) in List.rev (string_explode' [] s) let string_implode = List.fold_left (fun s c -> s ^ (String.make 1 c)) "" let reason_phrase_of_code = function | 100 -> "Continue" | 101 -> "Switching protocols" | 200 -> "OK" | 201 -> "Created" | 202 -> "Accepted" | 203 -> "Non authoritative information" | 204 -> "No content" | 205 -> "Reset content" | 206 -> "Partial content" | 300 -> "Multiple choices" | 301 -> "Moved permanently" | 302 -> "Found" | 303 -> "See other" | 304 -> "Not modified" | 305 -> "Use proxy" | 307 -> "Temporary redirect" | 400 -> "Bad request" | 401 -> "Unauthorized" | 402 -> "Payment required" | 403 -> "Forbidden" | 404 -> "Not found" | 405 -> "Method not allowed" | 406 -> "Not acceptable" | 407 -> "Proxy authentication required" | 408 -> "Request time out" | 409 -> "Conflict" | 410 -> "Gone" | 411 -> "Length required" | 412 -> "Precondition failed" | 413 -> "Request entity too large" | 414 -> "Request URI too large" | 415 -> "Unsupported media type" | 416 -> "Requested range not satisfiable" | 417 -> "Expectation failed" | 500 -> "Internal server error" | 501 -> "Not implemented" | 502 -> "Bad gateway" | 503 -> "Service unavailable" | 504 -> "Gateway time out" | 505 -> "HTTP version not supported" | invalid_code -> raise (Invalid_code invalid_code) let build_sockaddr (addr, port) = try Unix.ADDR_INET ((Unix.gethostbyname addr).Unix.h_addr_list.(0), port) with Not_found -> failwith ("OCaml-HTTP, can't resolve hostname: " ^ addr) let explode_sockaddr = function | Unix.ADDR_INET (addr, port) -> (Unix.string_of_inet_addr addr, port) | _ -> assert false (* can explode only inet address *) let peername_of_out_channel outchan = Unix.getpeername (Unix.descr_of_out_channel outchan) let peername_of_in_channel inchan = Unix.getpeername (Unix.descr_of_in_channel inchan) let sockname_of_out_channel outchan = Unix.getsockname (Unix.descr_of_out_channel outchan) let sockname_of_in_channel inchan = Unix.getsockname (Unix.descr_of_in_channel inchan) let buf_of_inchan ?limit ic = let buf = Buffer.create 10240 in let tmp = String.make 1024 '\000' in let rec buf_of_inchan' limit = (match limit with | None -> let bytes = input ic tmp 0 1024 in if bytes > 0 then begin Buffer.add_substring buf tmp 0 bytes; buf_of_inchan' None end | Some lim -> (* TODO what about using a single really_input call? *) let bytes = input ic tmp 0 (min lim 1024) in if bytes > 0 then begin Buffer.add_substring buf tmp 0 bytes; buf_of_inchan' (Some (lim - bytes)) end) in (try buf_of_inchan' limit with End_of_file -> ()); buf let list_assoc_all key pairs = snd (List.split (List.filter (fun (k, v) -> k = key) pairs)) let warn msg = prerr_endline (sprintf "ocaml-http WARNING: %s" msg) let error msg = prerr_endline (sprintf "ocaml-http ERROR: %s" msg) let finally at_end f arg = let res = try f arg with exn -> at_end (); raise exn in at_end (); res ocaml-http_0.1.5/cookie_lexer.mli0000644000175000017500000000171111467420571016321 0ustar celticceltic(* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2010> Stefano Zacchiroli <2010> Arlen Cuss This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) type cookie_token = [ `SEP | `ASSIGNMENT of string * string | `EOF ] val token : Lexing.lexbuf -> cookie_token ocaml-http_0.1.5/cookie_lexer.mll0000644000175000017500000000323711467420573016333 0ustar celticceltic(* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2010> Stefano Zacchiroli <2010> Arlen Cuss This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) { let quoted_RE = Pcre.regexp "\\\\\"" type cookie_token = [ `SEP (* cookie separator (i.e. ";") *) | `ASSIGNMENT of string * string (* assignment x=y *) | `EOF (* end of file *) ] } rule token = parse | [' ' '\t' '\n' '\r'] { token lexbuf } | ([^ ' ' '\t' '\n' '\r' '' ''-'' '\'' '=' ';']+ as name) '=' ([^ '\n' '\r' '' ''-'' ';']* as value) { let val_len = String.length value in let value = if val_len>2 && (value.[0]='"' && value.[val_len-1]='"') then let without_quotes = String.sub value 1 (val_len - 2) in Pcre.replace ~rex:quoted_RE ~templ:"\"" without_quotes else value in `ASSIGNMENT (name,value) } | ';' { `SEP } | eof { `EOF } ocaml-http_0.1.5/http_response.mli0000644000175000017500000000217511457270246016554 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Object Oriented representation of HTTP responses *) open Http_types;; (** OO representation of an HTTP response. *) class response: ?body:string -> ?headers:(string * string) list -> ?version: version -> ?clisockaddr: Unix.sockaddr -> ?srvsockaddr: Unix.sockaddr -> ?code:int -> ?status:Http_types.status -> unit -> Http_types.response ocaml-http_0.1.5/http_threaded_tcp_server.mli0000644000175000017500000000165311457270246020732 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Multithreaded part of Http_tcp_server *) (** serve an HTTP request for a multi threaded TCP server *) val serve : ('a -> 'b) -> 'a -> unit ocaml-http_0.1.5/ocamlinit-stamp0000644000175000017500000000000011507241564016156 0ustar celticcelticocaml-http_0.1.5/cookie_lexer.ml0000644000175000017500000003460111507236574016157 0ustar celticceltic# 22 "cookie_lexer.mll" let quoted_RE = Pcre.regexp "\\\\\"" type cookie_token = [ `SEP (* cookie separator (i.e. ";") *) | `ASSIGNMENT of string * string (* assignment x=y *) | `EOF (* end of file *) ] # 11 "cookie_lexer.ml" let __ocaml_lex_tables = { Lexing.lex_base = "\000\000\252\255\253\255\062\000\255\255\128\000"; Lexing.lex_backtrk = "\255\255\255\255\255\255\255\255\255\255\001\000"; Lexing.lex_default = "\003\000\000\000\000\000\003\000\000\000\005\000"; Lexing.lex_trans = "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\004\000\004\000\255\255\255\255\004\000\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \004\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\002\000\000\000\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\ \000\000\000\000\000\000\000\000\000\000\255\255\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\255\255\000\000\005\000\000\000\000\000\000\000\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\255\255\000\000\255\255\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\ \001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\255\255\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \255\255"; Lexing.lex_check = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\255\255\255\255\255\255\255\255\255\255\255\255\000\000\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\000\000\255\255\000\000\003\000\003\000\ \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ \003\000\003\000\003\000\003\000\003\000\003\000\003\000\255\255\ \255\255\255\255\255\255\255\255\255\255\003\000\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\003\000\255\255\003\000\255\255\255\255\255\255\000\000\ \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\005\000\255\255\003\000\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\005\000\ \000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\003\000\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \005\000"; Lexing.lex_base_code = "\000\000\000\000\000\000\062\000\000\000\000\000"; Lexing.lex_backtrk_code = "\000\000\000\000\000\000\000\000\000\000\004\000"; Lexing.lex_default_code = "\001\000\000\000\000\000\001\000\000\000\000\000"; Lexing.lex_trans_code = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000"; Lexing.lex_check_code = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\255\255\255\255\255\255\255\255\255\255\255\255\000\000\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\000\000\255\255\000\000\003\000\003\000\ \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ \003\000\003\000\003\000\003\000\003\000\003\000\003\000\255\255\ \255\255\255\255\255\255\255\255\255\255\003\000\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\003\000\255\255\003\000\255\255\255\255\255\255\000\000\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\003\000\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ \255\255\255\255\255\255\255\255\255\255\255\255\003\000"; Lexing.lex_code = "\255\001\255\255\000\001\255"; } let rec token lexbuf = lexbuf.Lexing.lex_mem <- Array.create 2 (-1) ; __ocaml_lex_token_rec lexbuf 0 and __ocaml_lex_token_rec lexbuf __ocaml_lex_state = match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with | 0 -> # 32 "cookie_lexer.mll" ( token lexbuf ) # 218 "cookie_lexer.ml" | 1 -> let # 33 "cookie_lexer.mll" name # 224 "cookie_lexer.ml" = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_mem.(0) and # 34 "cookie_lexer.mll" value # 229 "cookie_lexer.ml" = Lexing.sub_lexeme lexbuf (lexbuf.Lexing.lex_mem.(0) + 1) lexbuf.Lexing.lex_curr_pos in # 35 "cookie_lexer.mll" ( let val_len = String.length value in let value = if val_len>2 && (value.[0]='"' && value.[val_len-1]='"') then let without_quotes = String.sub value 1 (val_len - 2) in Pcre.replace ~rex:quoted_RE ~templ:"\"" without_quotes else value in `ASSIGNMENT (name,value) ) # 245 "cookie_lexer.ml" | 2 -> # 48 "cookie_lexer.mll" ( `SEP ) # 250 "cookie_lexer.ml" | 3 -> # 49 "cookie_lexer.mll" ( `EOF ) # 255 "cookie_lexer.ml" | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_token_rec lexbuf __ocaml_lex_state ;; ocaml-http_0.1.5/http_message.mli0000644000175000017500000001102411457270246016333 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Object Oriented representation of HTTP messages *) open Http_types;; (** OO representation of an HTTP message @param entity body included in the message @param headers message headers shipped with the message *) class virtual message: body: string -> headers: (string * string) list -> version: version option -> clisockaddr: Unix.sockaddr -> srvsockaddr: Unix.sockaddr -> object (** @return message HTTP version, it can be None because older version of the HTTP protocol don't require HTTP version to be told between message source and destination *) method version: version option (** set message HTTP version *) method setVersion: version -> unit (** @return message body *) method body: string (** set message body *) method setBody: string -> unit (** @return a Buffer.t connected to message body (Warning: changing this buffer will change message body too) *) method bodyBuf: Buffer.t (** set a new Buffer.t used to keep message body *) method setBodyBuf: Buffer.t -> unit (** append a string to message body *) method addBody: string -> unit (** append a whole buffer to message body *) method addBodyBuf: Buffer.t -> unit (** {i header name comparison are performed in a case-insensitive manner as required by RFC2616, actually the implementation works converting all header names in lowercase} *) (** add an HTTP header @param name header's name @param value header's value *) method addHeader: name:string -> value:string -> unit (** add a list of HTTP headers @param headers a list of pairs: header_name, header_value *) method addHeaders: (string * string) list -> unit (** like addHeader but replace previous definition of the same header *) method replaceHeader: name:string -> value:string -> unit (** like addHeaders but replace previous definition of headers that were already defined *) method replaceHeaders: (string * string) list -> unit (** remove _all_ occurences of an HTTP header from the message @param name name of the header to be removed *) method removeHeader: name:string -> unit (** @return true if given header exists in message, false otherwise *) method hasHeader: name:string -> bool (** @return value associated to a given header @param name name of the header to lookup @raise Header_not_found if given header wasn't defined in message *) method header: name:string -> string (** @return the full set of headers defined for this message, the value returned is an association list from headers name to headers value, an header may occurs more that once in the list *) method headers: (string * string) list (** @return client Unix.sockaddr *) method clientSockaddr: Unix.sockaddr (** @return client address pretty printed *) method clientAddr: string (** @return client port *) method clientPort: int (** @return server Unix.sockaddr *) method serverSockaddr: Unix.sockaddr (** @return server address pretty printed *) method serverAddr: string (** @return server port *) method serverPort: int (** @return for requests first request line, for responses first response line. User by derived requests and responses to implement toString method *) method private virtual fstLineToString: string (** @return a string representation of the message *) method toString: string (** serialize the message over an output channel *) method serialize: out_channel -> unit end ocaml-http_0.1.5/http_daemon.mli0000644000175000017500000001604111467427310016153 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Main OCaml HTTP module. Here you can find two set of functions: - functions which let you start an HTTP Daemon (start* functions) - facility functions which let you sent responses back to clients *) (** send a CRLF sequence on the given output channel, this is mandatory after the last header was sent and before start sending the response body *) val send_CRLF: out_channel -> unit (** send response status line, version is the http version used in response, either code or status must be given (not both, not none) which represent the HTTP response code, outchan is the output channel to which send status line *) val send_status_line: ?version:Http_types.version -> code:Http_types.status_code -> out_channel -> unit (** returns the basic headers "Date", "Server" and "Connection" used in send_basic_headers *) val get_basic_headers: unit -> (string * string) list (** like send_status_line but additionally will also send "Date", "Server" and "Connection" standard headers *) val send_basic_headers: ?version: Http_types.version -> code:Http_types.status_code -> out_channel -> unit (** send an HTTP header on outchan *) val send_header: header: string -> value: string -> out_channel -> unit (** as send_header, but for a list of pairs *) val send_headers: headers:(string * string) list -> out_channel -> unit (* (** send a file through an out_channel, file can be passed as an in_channel (if 'file' is given) or as a file name (if 'name' is given) *) val send_file: ?name:string -> ?file:in_channel -> out_channel -> unit *) (** send a file through an out_channel *) val send_file: src:Http_types.file_source -> out_channel -> unit (** high level response function, respond on outchan sending: basic headers (including Content-Length computed using 'body' argument), headers probided via 'headers' argument, body given via 'body' argument. Default response status is 200, default response HTTP version is Http_common.http_version *) val respond: ?body:string -> ?headers:(string * string) list -> ?version:Http_types.version -> ?code:Http_types.status_code -> out_channel -> unit (** send a 404 (not found) HTTP response *) val respond_not_found: url:string -> ?version: Http_types.version -> out_channel -> unit (** send a 403 (forbidden) HTTP response *) val respond_forbidden: url:string -> ?version: Http_types.version -> out_channel -> unit (** send a "redirection" class response, optional body argument contains data that will be displayed in the body of the response, default response status is 301 (moved permanently), only redirection status are accepted by this function, other values will raise Failure *) val respond_redirect: location:string -> ?body:string -> ?version: Http_types.version -> ?code:Http_types.status_code -> out_channel -> unit (** respond with a 401 (Unauthorized) response asking for authentication * against given realm (default is the server name) *) val respond_unauthorized: ?version: Http_types.version -> ?realm:string -> out_channel -> unit (** send an "error" response (i.e. 400 <= status < 600), optional body argument as per send_redirect, default response status is 400 (bad request), only error status are accepted by this function, other values will raise Failure *) val respond_error: ?body:string -> ?version: Http_types.version -> ?code:Http_types.status_code -> out_channel -> unit (** tipical static pages http daemon behaviour, if requested url is a file, return it, it it is a directory return a directory listing of it *) val respond_file: fname:string -> ?version: Http_types.version -> out_channel -> unit (** respond using a prebuilt Http_types.response object *) val respond_with: Http_types.response -> out_channel -> unit (** start an HTTP daemon * @param spec specification of daemon behaviour *) val main: Http_types.daemon_spec -> unit (** default daemon specification: * - listen on 0.0.0.0, port 80 * - "always ok" callback (return an empty response, response code 200) * - fork a child for each request * - do not change to a root directory (i.e. keep cwd) * - 300 seconds timeout * - ignores exceptions * - no authentication required * - do not automatically close client connections after callback *) val default_spec: Http_types.daemon_spec (** currified daemon_spec constructor. Each parameter of this function * corresponds to one field of Http_types.daemon_spec and defaults to the * corresponding field of Http_daemon.default_spec *) val daemon_spec: ?address:string -> ?auth:(string * Http_types.auth_info) option -> ?auto_close:bool -> ?callback:(Http_types.request -> out_channel -> unit) -> ?mode:(Http_types.daemon_mode) -> ?port:int -> ?root_dir:string option -> ?exn_handler:(exn -> out_channel -> unit) option -> ?timeout:int option -> unit -> Http_types.daemon_spec (* (** XXX * This function has been deprecated for a while. Now it has been removed! *) val start: ?addr: string -> ?port: int -> ?timeout: int option -> ?mode: Http_types.daemon_mode -> ?root: string -> (string -> (string * string) list -> out_channel -> unit) -> unit *) (* (** XXX * This function has been deprecated for a while. Now it has been removed! *) val start': ?addr: string -> ?port: int -> ?timeout: int option -> ?mode: Http_types.daemon_mode -> ?root: string -> (Http_types.request -> out_channel -> unit) -> unit *) (** Object oriented interface to HTTP daemons. * @param addr address on which daemon will listen for connections * @param port port which daemon will bind * see {!Http_types.daemon} *) class daemon: ?addr: string -> ?port: int -> unit -> Http_types.daemon (** Trivial static pages HTTP daemon. * Daemons created using this module will serve directory indexes and files * found starting from the working directory *) module Trivial : sig (** callback function, exposed if you like to use it as a basis to define a more powerful daemon *) val callback : Http_types.request -> out_channel -> unit (** start the "trivial" HTTP daemon * @param spec trivial HTTP daemon specification, "callback" field is * ignored and set to the callback above *) val main : Http_types.daemon_spec -> unit end ocaml-http_0.1.5/non_mt/0000755000175000017500000000000011507242065014433 5ustar celticcelticocaml-http_0.1.5/non_mt/http_threaded_tcp_server.ml0000644000175000017500000000172411457270246022052 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) let serve _ _ = failwith ("Threaded server not supported by the non threaded version " ^ "of ocaml-http, please link against http_mt.cm{,x}a") ocaml-http_0.1.5/non_mt/.gitignore0000644000175000017500000000003511457546402016427 0ustar celticceltichttp_threaded_tcp_server.mli ocaml-http_0.1.5/http_misc.mli0000644000175000017500000000701511457270246015647 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Helpers and other not better classified functions which should not be exposed in the final API *) (** @return the current date compliant to RFC 1123, which updates RFC 822 zone info are retrieved from UTC *) val date_822: unit -> string (** @return true if 'name' is a directory on the file system, false otherwise *) val is_directory: string -> bool (** @return the filesize of fname *) val filesize: string -> int (** strip trailing '/', if any, from a string and @return the new string *) val strip_trailing_slash: string -> string (** strip heading '/', if any, from a string and @return the new string *) val strip_heading_slash: string -> string (** given a dir handle @return a list of entries contained *) val ls: Unix.dir_handle -> string list (** explode a string in a char list *) val string_explode: string -> char list (** implode a char list in a string *) val string_implode: char list -> string (** given an HTTP response code return the corresponding reason phrase *) val reason_phrase_of_code: int -> string (** build a Unix.sockaddr inet address from a string representation of an IP address and a port number *) val build_sockaddr: string * int -> Unix.sockaddr (** explode an _inet_ Unix.sockaddr address in a string representation of an IP address and a port number *) val explode_sockaddr: Unix.sockaddr -> string * int (** given an out_channel build on top of a socket, return peername related to that socket *) val peername_of_out_channel: out_channel -> Unix.sockaddr (** as above but works on in_channels *) val peername_of_in_channel: in_channel -> Unix.sockaddr (** given an out_channel build on top of a socket, return sockname related to that socket *) val sockname_of_out_channel: out_channel -> Unix.sockaddr (** as above but works on in_channels *) val sockname_of_in_channel: in_channel -> Unix.sockaddr (* TODO replace with Buffer.add_channel which does almost the same :-((( *) (** reads from an input channel till it End_of_file and returns what has been read; if limit is given returned buffer will contains at most first 'limit' bytes read from input channel *) val buf_of_inchan: ?limit: int -> in_channel -> Buffer.t (** like List.assoc but return all bindings of a given key instead of the leftmost one only *) val list_assoc_all: 'a -> ('a * 'b) list -> 'b list val warn: string -> unit (** print a warning msg to stderr. Adds trailing \n *) val error: string -> unit (** print an error msg to stderr. Adds trailing \n *) (** @param finalizer finalization function (execution both in case of success * and in case of raised exception * @param f function to be invoked * @param arg argument to be passed to function *) val finally: (unit -> unit) -> ('a -> 'b) -> 'a -> 'b ocaml-http_0.1.5/http_parser_sanity.mli0000644000175000017500000000325711457270246017603 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Sanity test functions related to HTTP message parsing *) (** @param name an HTTP header name @raise Invalid_header_name if name isn't a valid HTTP header name *) val heal_header_name: string -> unit (** @param value an HTTP header value @raise Invalid_header_value if value isn't a valid HTTP header value *) val heal_header_value: string -> unit (** @param header a pair header_name * header_value @raise Invalid_header_name if name isn't a valid HTTP header name @raise Invalid_header_value if value isn't a valid HTTP header value *) val heal_header: string * string -> unit (** remove heading and/or trailing LWS sequences as per RFC2616 *) val normalize_header_value: string -> string (** parse an URL from a string. @raise Malformed_URL if an invalid URL is encountered *) val url_of_string: string -> Neturl.url (** pretty print an URL *) val string_of_url: Neturl.url -> string ocaml-http_0.1.5/.ocamlinit0000644000175000017500000000013711457270246015130 0ustar celticceltic#use "topfind";; #require "unix";; #require "pcre";; #require "netstring";; #load "http.cma";; ocaml-http_0.1.5/http_parser_sanity.ml0000644000175000017500000000730011457270246017423 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Printf open Http_types open Http_constants (* type url_syntax_option = Url_part_not_recognized | Url_part_allowed | Url_part_required * (1) scheme://user:password@host:port/path;params?query#fragment *) let request_uri_syntax = { Neturl.url_enable_scheme = Neturl.Url_part_not_recognized; url_enable_user = Neturl.Url_part_not_recognized; url_enable_user_param = Neturl.Url_part_not_recognized; url_enable_password = Neturl.Url_part_not_recognized; url_enable_host = Neturl.Url_part_not_recognized; url_enable_port = Neturl.Url_part_not_recognized; url_enable_path = Neturl.Url_part_required; url_enable_param = Neturl.Url_part_not_recognized; url_enable_query = Neturl.Url_part_allowed; url_enable_fragment = Neturl.Url_part_not_recognized; url_enable_other = Neturl.Url_part_not_recognized; url_accepts_8bits = false; url_enable_relative = true; url_is_valid = (fun _ -> true); } (* convention: foo_RE_raw is the uncompiled regexp matching foo foo_RE is the compiled regexp matching foo is_foo is the predicate over string matching foo *) let separators_RE_raw = "()<>@,;:\\\\\"/\\[\\]?={} \t" let ctls_RE_raw = "\\x00-\\x1F\\x7F" let token_RE_raw = "[^" ^ separators_RE_raw ^ ctls_RE_raw ^ "]+" let lws_RE_raw = "(\r\n)?[ \t]" let quoted_string_RE_raw = "\"(([^\"])|(\\\\\"))*\"" let text_RE_raw = "(([^" ^ ctls_RE_raw ^ "])|(" ^ lws_RE_raw ^ "))+" let field_content_RE_raw = sprintf "^(((%s)|(%s)|(%s))|(%s))*$" token_RE_raw separators_RE_raw quoted_string_RE_raw text_RE_raw (* (* following RFC 2616 specifications *) let field_value_RE_raw = "((" ^ field_content_RE_raw ^ ")|(" ^ lws_RE_raw^ "))*" *) (* smarter implementation: TEXT production is included in the regexp below *) let field_value_RE_raw = sprintf "^((%s)|(%s)|(%s)|(%s))*$" token_RE_raw separators_RE_raw quoted_string_RE_raw lws_RE_raw let token_RE = Pcre.regexp ("^" ^ token_RE_raw ^ "$") let field_value_RE = Pcre.regexp ("^" ^ field_value_RE_raw ^ "$") let heading_lws_RE = Pcre.regexp (sprintf "^%s*" lws_RE_raw) let trailing_lws_RE = Pcre.regexp (sprintf "%s*$" lws_RE_raw) let is_token s = Pcre.pmatch ~rex:token_RE s let is_field_name = is_token let is_field_value s = Pcre.pmatch ~rex:field_value_RE s let heal_header_name s = if not (is_field_name s) then raise (Invalid_header_name s) else () let heal_header_value s = if not (is_field_value s) then raise (Invalid_header_value s) else () let normalize_header_value s = Pcre.replace ~rex:trailing_lws_RE (Pcre.replace ~rex:heading_lws_RE s) let heal_header (name, value) = heal_header_name name; heal_header_value name let url_of_string s = try Neturl.url_of_string request_uri_syntax s with Neturl.Malformed_URL -> raise (Malformed_URL s) let string_of_url = Neturl.string_of_url ocaml-http_0.1.5/http_request.ml0000644000175000017500000001301311457270246016226 0ustar celticceltic(* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2007> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Printf;; open Http_common;; open Http_types;; let debug_dump_request path params = debug_print ("request path = " ^ path); debug_print ( sprintf"request params = %s" (String.concat ";" (List.map (fun (h,v) -> String.concat "=" [h;v]) params))) let auth_sep_RE = Pcre.regexp ":" let basic_auth_RE = Pcre.regexp "^Basic\\s+" exception Fallback;; (* used internally by request class *) class request ic = let (meth, uri, version) = Http_parser.parse_request_fst_line ic in let uri_str = Neturl.string_of_url uri in let path = Http_parser.parse_path uri in let query_get_params = Http_parser.parse_query_get_params uri in let (headers, body) = (match version with | None -> [], "" (* No version given, use request's 1st line only *) | Some version -> (* Version specified, parse also headers and body *) let headers = List.map (* lowercase header names to ease lookups before having a request object *) (fun (h,v) -> (String.lowercase h, v)) (Http_parser.parse_headers ic) (* trailing \r\n consumed! *) in let body = (* TODO fallback on size defined in Transfer-Encoding if Content-Length isn't defined *) if meth = `POST then Buffer.contents (try (* read only Content-Length bytes *) let limit_raw = (try List.assoc "content-length" headers with Not_found -> raise Fallback) in let limit = (try (* TODO supports only a maximum content-length of 1Gb *) int_of_string limit_raw with Failure "int_of_string" -> raise (Invalid_header ("content-length: " ^ limit_raw))) in Http_misc.buf_of_inchan ~limit ic with Fallback -> Http_misc.buf_of_inchan ic) (* read until EOF *) else (* TODO empty body for methods other than POST, is ok? *) "" in (headers, body)) in let cookies = try let _hdr, raw_cookies = List.find (fun (hdr, _cookie) -> String.lowercase hdr = "cookie") headers in Some (Http_parser.parse_cookies raw_cookies) with | Not_found -> None | Malformed_cookies _ -> None in let query_post_params = match meth with | `POST -> let ct = try List.assoc "content-type" headers with Not_found -> "" in if ct = "application/x-www-form-urlencoded" then Http_parser.split_query_params body else [] | _ -> [] in let params = query_post_params @ query_get_params in (* prefers POST params *) let _ = debug_dump_request path params in let (clisockaddr, srvsockaddr) = (Http_misc.peername_of_in_channel ic, Http_misc.sockname_of_in_channel ic) in object (self) inherit Http_message.message ~body ~headers ~version ~clisockaddr ~srvsockaddr val params_tbl = let tbl = Hashtbl.create (List.length params) in List.iter (fun (n,v) -> Hashtbl.add tbl n v) params; tbl method meth = meth method uri = uri_str method path = path method param ?(meth: meth option) ?(default: string option) name = try (match meth with | None -> Hashtbl.find params_tbl name | Some `GET -> List.assoc name query_get_params | Some `POST -> List.assoc name query_post_params) with Not_found -> (match default with | None -> raise (Param_not_found name) | Some value -> value) method paramAll ?meth name = (match (meth: meth option) with | None -> List.rev (Hashtbl.find_all params_tbl name) | Some `GET -> Http_misc.list_assoc_all name query_get_params | Some `POST -> Http_misc.list_assoc_all name query_post_params) method params = params method params_GET = query_get_params method params_POST = query_post_params method cookies = cookies method private fstLineToString = let method_string = string_of_method self#meth in match self#version with | Some version -> sprintf "%s %s %s" method_string self#uri (string_of_version version) | None -> sprintf "%s %s" method_string self#uri method authorization: auth_info option = try let credentials = Netencoding.Base64.decode (Pcre.replace ~rex:basic_auth_RE (self#header "authorization")) in debug_print ("HTTP Basic auth credentials: " ^ credentials); (match Pcre.split ~rex:auth_sep_RE credentials with | [username; password] -> Some (`Basic (username, password)) | l -> raise Exit) with Header_not_found _ | Invalid_argument _ | Exit -> None end ocaml-http_0.1.5/http_tcp_server.ml0000644000175000017500000001344711457270246016725 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2005> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** raised when a client timeouts *) exception Timeout let backlog = 10 (** if timeout is given (Some _) @return a new callback which establish timeout_callback as callback for signal Sys.sigalrm and register an alarm (expiring after timeout seconds) before invoking the real callback given. If timeout is None, callback is returned unchanged. *) let wrap_callback_w_timeout ~callback ~timeout ~timeout_callback = match timeout with | None -> callback | Some timeout -> (* wrap callback setting an handler for ALRM signal and an alarm that ring after timeout seconds *) (fun inchan outchan -> ignore (Sys.signal Sys.sigalrm (Sys.Signal_handle timeout_callback)); ignore (Unix.alarm timeout); callback inchan outchan) (* try to close nicely a socket *) let shutdown_socket suck = try Unix.shutdown suck Unix.SHUTDOWN_ALL with Unix.Unix_error(_, "shutdown", "") -> () let nice_unix_accept suck = try Unix.accept suck with e -> (* clean up socket before exit *) shutdown_socket suck; raise e let init_socket sockaddr = let suck = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in (* shutdown socket on SIGTERM *) ignore (Sys.signal Sys.sigterm (Sys.Signal_handle (fun _ -> shutdown_socket suck; exit 17))); Unix.setsockopt suck Unix.SO_REUSEADDR true; Unix.bind suck sockaddr; Unix.listen suck backlog; suck let init_callback callback timeout = let timeout_callback signo = if signo = Sys.sigalrm then raise Timeout in wrap_callback_w_timeout ~callback ~timeout ~timeout_callback (** try to close an outchannel connected to a socket, ignore Sys_error since * this probably means that socket is already closed (e.g. on sigpipe) *) let try_close_out ch = try close_out ch with Sys_error _ -> () (** like Unix.establish_server, but shutdown sockets when receiving SIGTERM and before exiting for an uncaught exception *) let my_establish_server server_fun sockaddr = let suck = init_socket sockaddr in while true do let (s, caller) = nice_unix_accept suck in (** "double fork" trick, see {!Unix.establish_server} implementation *) match Unix.fork() with | 0 -> (* parent *) (try if Unix.fork () <> 0 then exit 0; (* The son exits, the grandson works *) let inchan = Unix.in_channel_of_descr s in let outchan = Unix.out_channel_of_descr s in server_fun inchan outchan; try_close_out outchan; (* closes also inchan: socket is the same *) exit 0 with e -> shutdown_socket suck; (* clean up socket before exit *) raise e) | child when (child > 0) -> (* child *) Unix.close s; ignore (Unix.waitpid [] child) (* Reclaim the son *) | _ (* < 0 *) -> failwith "Can't fork" done (** tcp_server which forks a new process for each request *) let fork ~sockaddr ~timeout callback = let timeout_callback signo = if signo = Sys.sigalrm then exit 2 in my_establish_server (wrap_callback_w_timeout ~callback ~timeout ~timeout_callback) sockaddr (** tcp_server which doesn't fork, requests are server sequentially and in the same address space of the calling process *) let simple ~sockaddr ~timeout callback = let suck = init_socket sockaddr in let callback = init_callback callback timeout in try while true do let (client, _) = Unix.accept suck in (* client is now connected *) let (inchan, outchan) = (Unix.in_channel_of_descr client, Unix.out_channel_of_descr client) in (try callback inchan outchan; ignore (Unix.alarm 0) (* reset alarm *) with Timeout -> ()); try_close_out outchan (* this close also inchan: socket is the same *) done with e -> (* clean up socket before exit *) shutdown_socket suck; raise e (** tcp_server which creates a new thread for each request to be served *) let thread ~sockaddr ~timeout callback = let suck = init_socket sockaddr in let callback = init_callback callback timeout in let callback (i, o) = (try callback i o with | Timeout -> () | e -> try_close_out o; raise e); try_close_out o in while true do let (client, _) = nice_unix_accept suck in (* client is now connected *) let (inchan, outchan) = (Unix.in_channel_of_descr client, Unix.out_channel_of_descr client) in Http_threaded_tcp_server.serve callback (inchan, outchan) done (** @param server an Http_types.tcp_server * @return an Http_types.tcp_server which takes care of ignoring SIGPIPE during * server execution and restoring previous handler when (if ever) the server * returns *) let handle_sigpipe server = fun ~sockaddr ~timeout callback -> let old_sigpipe_behavior = Sys.signal Sys.sigpipe Sys.Signal_ignore in server ~sockaddr ~timeout callback; ignore (Sys.signal Sys.sigpipe old_sigpipe_behavior) let simple = handle_sigpipe simple let thread = handle_sigpipe thread let fork = handle_sigpipe fork ocaml-http_0.1.5/INSTALL0000644000175000017500000000153111457270246014200 0ustar celticceltic In order to build ocaml-http you will need: - the ocaml compiler [ http://caml.inria.fr ] - findlib [ http://www.ocaml-programming.de/packages/documentation/findlib/ ] - ocamlnet [ http://sourceforge.net/projects/ocamlnet ] - pcre-ocaml [ http://www.ai.univie.ac.at/~markus/home/ocaml_sources.html ] To build the bytecode library: $ make all To build the nativecode library (only if you have an ocaml native code compiler): $ make opt To install the built stuff in the OCaml standard library directory (as root): # make install To install the built stuff in another directory: $ make install DESTDIR=another_directory To build a debian package of the library (please note that to build a debian package you will also need some additional stuff like debhelper, fakeroot, ...): $ fakeroot debian/rules binary ocaml-http_0.1.5/examples/0000755000175000017500000000000011507224214014753 5ustar celticcelticocaml-http_0.1.5/examples/Makefile0000644000175000017500000000224111457270246016424 0ustar celticcelticinclude ../Makefile.defs OBJS_NON_MT = ../http.cma OBJS_NON_MT_OPT = ../http.cmxa OBJS_MT = ../http_mt.cma OBJS_MT_OPT = ../http_mt.cmxa EXAMPLES_FLAGS = -I .. -linkpkg EXAMPLES := \ always_ok_daemon.ml \ basic_auth.ml \ chdir.ml \ client_address.ml \ damned_recursion.ml \ dump_args.ml \ highlander.ml \ oo_daemon.ml \ threads.ml \ timeout.ml \ webfsd.ml EXAMPLES := $(patsubst %.ml,%,$(EXAMPLES)) all: $(EXAMPLES) opt: $(patsubst %,%.opt,$(EXAMPLES)) %: %.ml $(OBJS_NON_MT) $(OCAMLC) $(EXAMPLES_FLAGS) $(OBJS_NON_MT) -o $@ $< %.opt: %.ml $(OBJS_NON_MT_OPT) $(OCAMLOPT) $(EXAMPLES_FLAGS) $(OBJS_NON_MT_OPT) -o $@ $< threads: threads.ml $(OBJS_MT) $(OCAMLC) $(EXAMPLES_FLAGS) $(OBJS_MT) $(THREADS_FLAGS) -o $@ $< threads.opt: threads.ml $(OBJS_MT_OPT) $(OCAMLOPT) $(EXAMPLES_FLAGS) $(OBJS_MT_OPT) $(THREADS_FLAGS) -o $@ $< damned_recursion: damned_recursion.ml $(OBJS_MT) $(OCAMLC) $(EXAMPLES_FLAGS) $(OBJS_MT) $(THREADS_FLAGS) -o $@ $< damned_recursion.opt: damned_recursion.ml $(OBJS_MT_OPT) $(OCAMLOPT) $(EXAMPLES_FLAGS) $(OBJS_MT_OPT) $(THREADS_FLAGS) -o $@ $< distclean: clean clean: -rm -f *.cm[ioax] *.o $(EXAMPLES) $(patsubst %,%.opt,$(EXAMPLES)) ocaml-http_0.1.5/examples/always_ok_daemon.ml0000644000175000017500000000212211457270246020630 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2004> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Http_types (* start an http daemon that alway respond with a 200 status code and an empty content *) let spec = { Http_daemon.default_spec with callback = (fun _ outchan -> Http_daemon.respond outchan); port = 9999; } let _ = Http_daemon.main spec ocaml-http_0.1.5/examples/dump_args.ml0000644000175000017500000000374211457270246017306 0ustar celticceltic(* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2007> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Printf open Http_types let callback req outchan = let str = (sprintf "request path = %s\n" req#path) ^ (sprintf "request GET params = %s\n" (String.concat ";" (List.map (fun (h,v) -> String.concat "=" [h;v]) req#params_GET))) ^ (sprintf "request POST params = %s\n" (String.concat ";" (List.map (fun (h,v) -> String.concat "=" [h;v]) req#params_POST))) ^ (sprintf "request ALL params = %s\n" (String.concat ";" (List.map (fun (h,v) -> String.concat "=" [h;v]) req#params))) ^ (sprintf "cookies = %s\n" (match req#cookies with | None -> "NO COOKIES " ^ (if req#hasHeader ~name:"cookie" then "('Cookie:' header was '" ^ req#header ~name:"cookie" ^ "')" else "(No 'Cookie:' header received)") | Some cookies -> (String.concat ";" (List.map (fun (n,v) -> String.concat "=" [n;v]) cookies)))) ^ (sprintf "request BODY = '%s'\n\n" req#body) in Http_daemon.respond ~code:(`Code 200) ~body: str outchan let spec = { Http_daemon.default_spec with callback = callback; port = 9999; } let _ = Http_daemon.main spec ocaml-http_0.1.5/examples/highlander.ml0000644000175000017500000000230611457270246017425 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2004> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (* test for fast rebinding of the tcp port *) open Printf open Http_types let spec = { Http_daemon.default_spec with callback = (fun _ outchan -> Http_daemon.respond ~body:"foo" outchan); port = 9999; mode = `Single; } let _ = Sys.catch_break true; while true do try Http_daemon.main spec; with Sys.Break -> prerr_endline "RESURRECTION!!!!" done ocaml-http_0.1.5/examples/chdir.ml0000644000175000017500000000211511457270246016407 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2004> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Printf open Http_types let spec = { Http_daemon.default_spec with callback = (fun _ outchan -> Http_daemon.respond ~body:(sprintf "%s\n" (Sys.getcwd ())) outchan); port = 9999; root_dir = Some "/etc"; } let _ = Http_daemon.main spec ocaml-http_0.1.5/examples/test.sh0000755000175000017500000000016411467414715016306 0ustar celticcelticocaml unix.cma -I +pcre pcre.cma -I +netsys netsys.cma -I +netstring netstring.cma -I .. http.cma client_address.ml ocaml-http_0.1.5/examples/damned_recursion.ml0000644000175000017500000000270311457270246020642 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2004> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Printf open Http_types let port = 9999 let callback (req: Http_types.request) outchan = let i = int_of_string (req#param "x") in let body = match i with | 0 -> "0" | x when x > 0 -> let data = Http_user_agent.get (sprintf "http://127.0.0.1:%d/foo?x=%d" port (x - 1)) in sprintf "%s %d" data x | _ -> assert false in Http_daemon.respond ~code:(`Code 200) ~body outchan; close_out outchan (* Http_user_agent relies on EOF, not Content-Length *) let spec = { Http_daemon.default_spec with callback = callback; port = port; mode = `Thread; } let _ = Http_daemon.main spec ocaml-http_0.1.5/examples/oo_daemon.ml0000644000175000017500000000270411457270246017262 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2004> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Http_daemon open Http_response (* the simple way *) let d = new daemon ~addr:"127.0.0.1" ~port:9999 () let _ = while true do let (req, conn) = d#getRequest in (* wait for valid request *) conn#respond_with (new response ~body:"foo\n" ()); conn#close done (* (* the hard^Wother way *) let d = new daemon ~addr:"127.0.0.1" ~port:9999 () in let _ = while true do let conn = d#accept in (* wait for client connection *) (match conn#getRequest with | None -> () (* invalid request received *) | Some req -> conn#respond_with (new response ~body:"foo\n" ())); conn#close (* close socket *) done *) ocaml-http_0.1.5/examples/timeout.ml0000644000175000017500000000200611457270246017003 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2004> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Http_types let spec = { Http_daemon.default_spec with callback = (fun _ outchan -> Http_daemon.respond ~body:"foo" outchan); timeout = Some 10; } let _ = Http_daemon.main spec ocaml-http_0.1.5/examples/basic_auth.ml0000644000175000017500000000317211457270246017424 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2004> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Http_types (* the easy way: specify authentication requirements within a daemon_spec *) let spec = { Http_daemon.default_spec with (* requires basic authentication, username "foo", password "bar" *) auth = Some ("my realm", `Basic ("foo", "bar")); callback = (fun _ outchan -> Http_daemon.respond ~body:"secret" outchan); port = 9999; } (* (* the hard^Wother way: manual handling of authorization *) let callback req outchan = match req#authorization with | Some (`Basic (username, password)) when username = "foo" && password = "bar" -> Http_daemon.respond ~code:(`Code 200) ~body:"secret" outchan | _ -> raise (Unauthorized "my secret site") let spec = { Http_daemon.default_spec with callback = callback; port = 9999; } *) let _ = Http_daemon.main spec ocaml-http_0.1.5/examples/webfsd.ml0000644000175000017500000000277511457270246016604 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2004> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Http_types let def_port = 80 let def_addr = "0.0.0.0" let def_root = Sys.getcwd () let port = ref def_port let addr = ref def_addr let root = ref def_root let argspec = [ "-p", Arg.Int (fun p -> port := p), "TCP port on which listen, default: " ^ string_of_int !port; "-a", Arg.String (fun a -> addr := a), "IP address on which listen, default: " ^ !addr; "-r", Arg.String (fun r -> root := r), "DocumentRoot, default: current working directory"; ] let _ = Arg.parse argspec (fun _ -> ()) ""; let spec = { Http_daemon.default_spec with address = !addr; port = !port; root_dir = Some !root } in Http_daemon.Trivial.main spec ocaml-http_0.1.5/examples/client_address.ml0000644000175000017500000000234311457270246020304 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2004> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Printf open Http_types let callback req outchan = let body = sprintf "Hi, this is your personal assistant, you are connected from %s:%d\n" req#clientAddr req#clientPort in let res = new Http_response.response ~body () in Http_daemon.respond_with res outchan let spec = { Http_daemon.default_spec with callback = callback; port = 9999 } let _ = Http_daemon.main spec ocaml-http_0.1.5/examples/threads.ml0000644000175000017500000000410011457270246016744 0ustar celticceltic (* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2004> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Http_types let m = Mutex.create () let m_locked = ref true let critical f = Mutex.lock m; m_locked := true; Lazy.force f; m_locked := false; Mutex.unlock m (** ocaml's Thread.unlock suspend the invoking process if the mutex is already * unlocked, therefore we unlock it only if we know that it's currently locked *) let safe_unlock _ _ = if !m_locked then Mutex.unlock m let i = ref 10 let dump_i outchan = Http_daemon.respond ~body:(Printf.sprintf "i = %d\n" !i) outchan let callback req outchan = match req#path with | "/incr" -> critical (lazy (incr i; dump_i outchan; Unix.sleep 5)) | "/decr" -> critical (lazy (decr i; dump_i outchan; Unix.sleep 5)) | "/get" -> critical (lazy (dump_i outchan)) | bad_request -> Http_daemon.respond_error outchan let spec = { Http_daemon.default_spec with port = 9999; mode = `Thread; callback = callback; exn_handler = Some safe_unlock; (** ocaml-http's default exn_handler is Pervasives.ignore. This means * that threads holding the "m" mutex above may die without unlocking it. * Using safe_unlock as an exception handler we ensure that "m" mutex is * unlocked in case of exceptions (e.g. SIGPIPE) *) } let _ = Http_daemon.main spec ocaml-http_0.1.5/http_request.mli0000644000175000017500000000200011457270246016371 0ustar celticceltic(* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002-2007> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) (** Object Oriented representation of HTTP requests *) open Http_types;; (** OO representation of an HTTP request @param inchan input channel from which parse an HTTP request *) class request: in_channel -> Http_types.request