From 155adf54092f145d5e2ebe2b4b11e3080fcb379e Mon Sep 17 00:00:00 2001 From: Erwan Jahier <jahier@imag.fr> Date: Thu, 31 Jan 2013 17:52:54 +0100 Subject: [PATCH] Add support for the Merge operator. nb : do not work for lv4/ec mode --- Makefile | 4 + README.org | 2 +- doc/lpp.dep.ps | 217 -- doc/lpp.depfull.ps | 217 -- doc/lpp.dvi | Bin 28116 -> 0 bytes doc/lpp.ps | 2695 ----------------- doc/lpp.toc | 13 - doc/syntax.dvi | Bin 13980 -> 0 bytes doc/syntax.ps | 1251 -------- lv6-ref-man/Makefile | 25 +- lv6-ref-man/lv6-ref-man.tex | 17 +- lv6-ref-man/utils/lus2tex | 12 +- src/ast2lic.ml | 611 ++-- src/astCore.ml | 9 +- src/astRecognizePredef.ml | 10 +- src/astV6Dump.ml | 604 ++-- src/evalClock.ml | 70 +- src/evalClock.mli | 4 +- src/evalConst.ml | 75 +- src/evalType.ml | 116 +- src/evalType.mli | 4 +- src/l2lCheckLoops.ml | 6 +- src/l2lExpandArrays.ml | 15 +- src/l2lExpandNodes.ml | 9 +- src/l2lRmPoly.ml | 5 +- src/l2lSplit.ml | 1 + src/lexer.mll | 1 + src/lic.ml | 6 +- src/licDump.ml | 32 +- src/licEvalType.ml | 203 +- src/licTab.ml | 11 +- src/lxm.ml | 4 +- src/mainArgs.ml | 2 +- src/parser.mly | 22 +- src/parserUtils.ml | 10 +- src/unifyClock.ml | 7 +- test/lus2lic.log.ref | 87 +- test/lus2lic.sum | 31 +- test/should_fail/type/merge_bad_clk.lus | 12 + test/should_fail/type/merge_bad_enum.lus | 12 + test/should_fail/type/merge_bad_type.lus | 12 + .../type/merge_not_exhaustive.lus} | 9 +- test/should_work/is_stable.lus | 91 + test/should_work/merge.lus | 12 + test/should_work/parametric_node2.lus | 13 - test/should_work/sincos.lus | 14 + todo.org | 1 - todo.org_archive | 13 + 48 files changed, 1276 insertions(+), 5321 deletions(-) delete mode 100644 doc/lpp.dep.ps delete mode 100644 doc/lpp.depfull.ps delete mode 100644 doc/lpp.dvi delete mode 100644 doc/lpp.ps delete mode 100644 doc/lpp.toc delete mode 100644 doc/syntax.dvi delete mode 100644 doc/syntax.ps create mode 100644 test/should_fail/type/merge_bad_clk.lus create mode 100644 test/should_fail/type/merge_bad_enum.lus create mode 100644 test/should_fail/type/merge_bad_type.lus rename test/{should_work/broken/merge.lus => should_fail/type/merge_not_exhaustive.lus} (54%) create mode 100644 test/should_work/is_stable.lus create mode 100644 test/should_work/merge.lus delete mode 100644 test/should_work/parametric_node2.lus create mode 100644 test/should_work/sincos.lus diff --git a/Makefile b/Makefile index a900e570..b4d3aa51 100644 --- a/Makefile +++ b/Makefile @@ -150,6 +150,8 @@ include $(OCAMLMAKEFILE) .PRECIOUS: $(OBJDIR)/version.ml + + $(OBJDIR)/version.ml: Makefile echo "(** Automatically generated from Makefile *) " > $@ echo "let tool = \"lus2lic\"" >> $@ @@ -161,6 +163,8 @@ $(OBJDIR)/version.ml: Makefile + + all: nc lus2lic: make all diff --git a/README.org b/README.org index 04781bef..437b2132 100644 --- a/README.org +++ b/README.org @@ -67,7 +67,7 @@ astV6Dump.{ml|mli} astInstanciateModel.{ml|mli} astRecognizePredef.{ml|mli} -** Then the source is statically evaluated and type, checked +** Then the source is statically evaluated and type/clock checked ast2lic.{ml|mli} lic.ml diff --git a/doc/lpp.dep.ps b/doc/lpp.dep.ps deleted file mode 100644 index 7f64e2c3..00000000 --- a/doc/lpp.dep.ps +++ /dev/null @@ -1,217 +0,0 @@ -%!PS-Adobe-2.0 -%%Creator: dot version 2.8 (Fri Nov 17 20:26:27 UTC 2006) -%%For: (jahier) Erwan Jahier -%%Title: G -%%Pages: (atend) -%%BoundingBox: 36 36 44 44 -%%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 - dup 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 aligned label in bounding box aligned to current point -/alignedtext { % width adj text - /text exch def - /adj exch def - /width exch def - gsave - width 0 gt { - text stringwidth pop adj mul 0 rmoveto - } if - [] 0 setdash - text show - 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 -%%Page: 1 1 -%%PageBoundingBox: 36 36 44 44 -%%PageOrientation: Portrait -gsave -36 36 8 8 boxprim clip newpath -36 36 translate -0 0 1 beginpage -1.0000 set_scale -4 4 translate 0 rotate -0.000 0.000 1.000 graphcolor -0.000 0.000 1.000 graphcolor -newpath -6 -6 moveto --6 6 lineto -6 6 lineto -6 -6 lineto -closepath -fill -0.000 0.000 1.000 graphcolor -newpath -6 -6 moveto --6 6 lineto -6 6 lineto -6 -6 lineto -closepath -stroke -0.000 0.000 0.000 graphcolor -14.00 /Times-Roman set_font -endpage -showpage -grestore -%%PageTrailer -%%EndPage: 1 -%%Trailer -%%Pages: 1 -end -restore -%%EOF diff --git a/doc/lpp.depfull.ps b/doc/lpp.depfull.ps deleted file mode 100644 index 7f64e2c3..00000000 --- a/doc/lpp.depfull.ps +++ /dev/null @@ -1,217 +0,0 @@ -%!PS-Adobe-2.0 -%%Creator: dot version 2.8 (Fri Nov 17 20:26:27 UTC 2006) -%%For: (jahier) Erwan Jahier -%%Title: G -%%Pages: (atend) -%%BoundingBox: 36 36 44 44 -%%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 - dup 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 aligned label in bounding box aligned to current point -/alignedtext { % width adj text - /text exch def - /adj exch def - /width exch def - gsave - width 0 gt { - text stringwidth pop adj mul 0 rmoveto - } if - [] 0 setdash - text show - 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 -%%Page: 1 1 -%%PageBoundingBox: 36 36 44 44 -%%PageOrientation: Portrait -gsave -36 36 8 8 boxprim clip newpath -36 36 translate -0 0 1 beginpage -1.0000 set_scale -4 4 translate 0 rotate -0.000 0.000 1.000 graphcolor -0.000 0.000 1.000 graphcolor -newpath -6 -6 moveto --6 6 lineto -6 6 lineto -6 -6 lineto -closepath -fill -0.000 0.000 1.000 graphcolor -newpath -6 -6 moveto --6 6 lineto -6 6 lineto -6 -6 lineto -closepath -stroke -0.000 0.000 0.000 graphcolor -14.00 /Times-Roman set_font -endpage -showpage -grestore -%%PageTrailer -%%EndPage: 1 -%%Trailer -%%Pages: 1 -end -restore -%%EOF diff --git a/doc/lpp.dvi b/doc/lpp.dvi deleted file mode 100644 index 04f8435a8e85fb398227f141172895b9ddb689d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28116 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 bL)Onfa8~f&Nh|nof_?4rgfAKJCjR~t(f`Ho diff --git a/doc/lpp.ps b/doc/lpp.ps deleted file mode 100644 index 89a608d4..00000000 --- a/doc/lpp.ps +++ /dev/null @@ -1,2695 +0,0 @@ -%!PS-Adobe-2.0 -%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software -%%Title: lpp.dvi -%%Pages: 9 -%%PageOrder: Ascend -%%BoundingBox: 0 0 596 842 -%%EndComments -%DVIPSWebPage: (www.radicaleye.com) -%DVIPSCommandLine: dvips lpp.dvi -o lpp.ps -%DVIPSParameters: dpi=1200, compressed -%DVIPSSource: TeX output 2002.05.24:1448 -%%BeginProcSet: texc.pro -%! -/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/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/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]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ -rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp -gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B -/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ -/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ -A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy -get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} -ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp -fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 -{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add -chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ -1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} -forall N/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 -TeXDict begin 39158280 55380996 1000 1200 1200 (lpp.dvi) -@start -%DVIPSBitmapFont: Fa cmbsy10 10.95 2 -/Fa 2 104 df[<96380FFFE00607B512F0187F0503B6FC171F177F4CB712E00407EDE000 -4C4AC7FC4C14F04C14C04C91C8FC93B512FC4B5C604B5C605D605DA295C9FCB3B3AF5D5F -A25D4B5BA292B55A4A5C5C4A5C021F5C027F5C49B548CAFC010F5C90B612F0007F15C0B7 -CBFC15F815C015F815FF6C15C0C615F0010F14FC0101806D6C6D7E021F800207806E8080 -6E806F7FA26F7F81A28381B3B3AF84A2818481846F80846F807013FF7014C07014F07014 -FE70ECFFE00401EDFFE0706C15F0171F1703EF007F1807DE000F13E0>76 -181 114 263 105 102 D[<EA7FFFB512FEECFFE015FCEDFF8016E06C15F8C66C14FE01 -0780010081023F80020F800203806E80806F7F81838183A281B3B3AF8481A2846F80A26F -806F8084707F706D7E7014E0040714F87014FF040015F0053FECFFE0050F15F01701EF00 -3F4DB6FC170F053F15E094B6EAF000040392C7FC4C14F8041F14E04C14804C49C8FC93B5 -5A604B5C4B5CA24B5C60A25D95C9FCB3B3AF5DA25F5D5F5D92B55A5C4A5C020F5C023F5C -91B65A010792CAFC017F5C007FB612F8B712E0168003FCCBFC15E04ACCFC6C90CDFC>76 -181 114 263 105 I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fb cmr8 8 1 -/Fb 1 44 df<EF07804D7EB3B3A7007FBD12F0BE12F8A46C1CF0CAD80FC0CAFCB3B3A771 -5A5D5E78CF6E>43 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fc cmsy8 8 1 -/Fc 1 4 df<15F04A7E4A7EA2815DA7003EEE07C0007FEE0FE09026C001F8133FD8FFE0 -ED7FF001F015FF01FC1403D87FFE4A13E0D9FF81131F001F01C1491380000701F19038FF -FE000001D9F9F913F827003FFDFB13C0010FB6C7FC010314FC010014F0021F1380DA07FE -C8FC91381FFF8091B512F0010314FC010F14FF90263FFDFB13C02701FFF9F913F80007D9 -F1F813FE001F01C190383FFF80007F01816D13E0D9FE011307D8FFFC6E13F001F0140001 -E0157FD87FC0ED3FE090260003FC130F003EEE07C0C792C7FCA7815DA26E5A6E5A343977 -BD47>3 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fd cmtt10 10.95 50 -/Fd 50 126 df<DB07C0EC07C0DB1FF0EC1FF04B6C4A7EA24B6C4A7EA703FF15FF4C5DA8 -4A5D4C5DA8000FBB12FE003FF2FF80481BC0A2BD12E0A56C1BC0A26C1B80000FF2FE00C7 -000F902680000F0180C7FCA84A5D93C791C8FCA94A5D4B5DA8000FBB12FE003FF2FF8048 -1BC0A2BD12E0A56C1BC0A26C1B80000FF2FE00D800019026F0000101F0C8FCA8495D4B5D -A8495D4B5DA76D496D5BA26D90C76C90C9FCD9007CEC007C536F7AEE60>35 -D<EE01F8EE03FCEE0FFEEE1FFF167F93B5FC5D15074B13FE4B13FC4B13F84B13E092B512 -C04A14804AEBFE004A5B4A5B4A5B4A5B5E4A5B91B5C7FC495B5D495B5B5D495B495BA249 -5BA24990C8FC5C13FF5C5A5C5A5CA25A5C5A5CA25AA25CA25A91C9FCA35AA25BA512FF5B -B17F127FA57FA27EA3807EA280A27EA2807E807EA2807E807E80137F806D7FA26D7FA26D -7F6D7F817F6D7F816D7F6E7F6E7F826E7F6E7F6E7F6E7F6EEBFF806E14C06F13E06F13F8 -6F13FC6F13FE6F13FF15018182161FEE0FFEEE03FCEE01F8308D61FD60>40 -D<EA0F80EA3FC0EA7FF07FEAFFFE7F806C13E0806C7F6C7F00077F6C7F6C806C6C7F6D7F -6D7F6D7F6D7F7F6D7F6D7F6E7F806E7F82806E7F6E7FA26E7FA26E7F157F828117808117 -C081A217E08117F081A217F8A281A217FC81A317FEA2167FA517FF82B15E17FEA516FFA2 -17FCA35D17F8A25DA217F0A25D17E05D17C0A25D17805D17005D5E15FF4A5BA24A5BA24A -5B4A5B5C5E4A5B5C91B5C7FC495B495B5B495B495B495B495B48B55A4891C8FC485B001F -5B485B485B5CB5128091C9FC5BEA7FF85BEA3FC0EA0F80308D70FD60>I<167C4BB4FC4B -7FA24B7FACD80780EF03C0D81FE0EF0FF0D83FF8EF3FF8486CEF7FFC01FFEE01FFB500C0 -030713FE02E05D02F8153F6C01FE92B512FC02FF14C16C02C701C714F803F713DF000F91 -B812E000031980C6F0FE006D5F011F17F0010717C0010194C7FC6D6C15FC6E5D020F15E0 -02031580A2020F15E0023F15F84A8149B8FC010717C0011F17F0017F17FC90B97E0003F0 -FF80000F19E0003F02F701DF14F803C713C748020701C114FC02FE14C0B500F8033F13FE -02E0150F02C0816C0100030113FC01FCEE007F6C48EF3FF8D81FE0EF0FF0D80780EF03C0 -C893C7FCAC6F5BA26F90C9FCED007C474E74DE60>I<EE03E0EE0FF84C7EA24C7EB3AD00 -0FBB12F8003F1AFE4886A2BD1280A56C1B00A26C62000F1AF8C9D83FFECAFCB3AD705AA2 -705AEE03E0515379E060>I<EB1FE0EB7FF8EBFFFE487F4814804814C04814E015F05A15 -F8A215FCA215FEA37EA27E7E7E7E7F131F9038003FFCA2147FA2ECFFF8A24913F05B4913 -E05B4913C0137F48B51280000F1400123F485BB55A5C5C14C05C49C7FCEA7FF8EA3FE0EA -0F801F315F9760>I<000FBA12FE003FF1FF80481AC0A2BC12E0A56C1AC0A26C1A80000F -F1FE004B0D76BD60>I<13FF000313C04813E04813F04813F84813FC4813FEA2B6FCA86C -13FEA26C13FC6C13F86C13F06C13E06C13C0C6130018185C9760>I<EE3FF84BB5FC030F -14E0033F14F892B612FE4A81020716C04A824A824A824A8291B87E49DAF01F7F49DA8003 -804949C78003F8143F49496E7F49496E7F49496E7F4B804990C86C7FA249486F7F4A167F -48854A824849701380A248497013C0A348497013E0A24A82481AF0A291CA7E481AF8A349 -83007F1AFCA549187FA200FF1AFEB16D18FFA2007F1AFCA56D5FA26C1AF8A26E5EA26C1A -F0A26E5E6C1AE06E5EA26C1AC06E5EA26C6D4C1380A26C6D4C1300A26C6D4C5A6E5D6D60 -6F5C6D6D4A5B6F5C6D6D4A5B6D6D4A5B6D6D4A5B6F91B5FC6D9026FF80035C6DDAF01F91 -C7FC6D91B65A6E5E6E5E6E5E6E5E6E5E020193C8FC6E5D033F14F8030F14E0030191C9FC -9238003FF84F7378F060>48 D<ED01F0ED07F84B7E82151FA2153FA2157FA215FF5CA25C -5C5C5C5C5C49B5FC1307133F000FB6FC123F5AA2B7FC157F14FE14F86C13F014C0383FFE -00EA1FF0C8FCB3B3B3AD0007B912E0001F18F84818FCA24818FEA46C18FCA26C18F80007 -18E03F716EF060>I<923803FFFE037FEBFFF00207B612FE021F6F7E027F16E049B812F8 -010717FE498349844984498490BA7EDC8007804802F0C76C7F0380020F7F4849C87E02F8 -03017F48837313806E82851BC0A2856C5BA26C5B6C5B6D5A011FCAFC90CB5AA21B8061A2 -1B006196B5FC62604E5B604E5B063F5B95B55A1707040FB65A031FB75A4B93C7FC4B5D92 -B75A19F06119F819FE737E6F826F826F8292C7000780DD007F7F060F7F06037F72148072 -6C13C0857313E0857313F0A27313F8851BFCA2851BFEA21A7FA3EA07F0EA1FFC487E487E -A2B56C17FFA21BFC61A21BF891CA5A616C4819F06D5F6E4C13E06C6D5E6E4C13C06C6D4B -B5128002FC5D6CD9FF80020F140003F0027F5B6C9126FF8007B55A6C92B75A6C616C6101 -3F606D95C7FC01075F6D17F8010017E0021F168002074BC8FCDA007F14F0030149C9FC4F -7378F060>51 D<943803FFF84D7F4D7F4D7F5FA25F94B6FCA25E18F75E4C13E718C75E4C -138718075EEE7FFEA2EEFFFC17F85D4B13F017E05D4B13C017805D4B1300A24B5A5E15FF -4A5B5E5C4A5B5E5C4A5BA24A90C7FC5D147F4A5A5D5B495B5D5B495BA2495B92C8FC5B49 -5A5C13FF485B5C5A485BA2485B5C5A4890C9FC5B127F485A90BC12C01CE01CF01CF8A66C -1BF06C1BE06C1BC0CB000790C8FCB30403B712FE4C824C17804C17C0A670178070170070 -5E55727BF160>I<013FB912E090BA7E4885865AA562626202F0CCFCB3AAEE7FFF0307B5 -12F0033F14FC02F1B7FC02F716C091B812F019FC8585868686DCE0078003FCC76C7F03E0 -021F7F0380140792C86C7F02FC6F7F4A814A7013806C49824A7013C06C5B013FCA6C13E0 -90CBFC851BF0A285A21BF8A285A4EA03E0EA0FF8487E487E487E61B57E1BF061A21BE061 -91CAFC4F13C06C485F6D4D1380A26C6D93B512006E15036C6D4B5B6E4B5B6C01FC033F5B -02FF92B55A6C02E013076C02FE017F5C6C91B85A6C616D4DC7FC6D5F6D5F010717E06D17 -8001004CC8FC023F15F8020715E0020092C9FC030F13E04D7177EE60>I<13FF000313C0 -4813E04813F04813F84813FC4813FEA2B6FCA86C13FEA26C13FC6C13F86C13F06C13E06C -13C0C6130090C7FCB3AC13FF000313C04813E04813F04813F84813FC4813FEA2B6FCA86C -13FEA26C13FC6C13F86C13F06C13E06C13C0C61300184E5CCD60>58 -D<EB1FE0EB7FF8497E487F487F4814804814C0A24814E0A86C14C0A26C14806C14006C5B -6C5B6D5AEB1FE090C8FCB3ACEB1FC0EB7FF0EBFFFC487F487F4814805A15C05A15E0A315 -F0A47EA27E7E7E7E7F131F130115E05BA215C05B5B15805B4913005B48485A485B120F00 -3F5B485BB55A5C5C91C7FC5B13F86C5AEA3FC0000FC8FC1C675FCD60>I<1A3EF2FF804F -13C019074F13E0193F614EB5FC60060F14C0183F4E14804DB5EAFE004D14F8050F5C4D14 -C0057F5C94B548C7FC04035C4C14F0041F5C047F148093B548C8FC03035C4B14F0031F5C -4B148092B6C9FC4A14FC02075C021F14E04A5C91B6CAFC4914FC01075C4914E0013F5C49 -91CBFC48B55A4814F8000F5C003F14C04891CCFC5CB512F85C14C014F0806C13FE806C14 -C0000F14F00003806C14FE6C6C7F6D14C0010F806D14F80101806D14FF023F14C06E8002 -0714F80201806E14FF033F806F14E00307806F14FC030080706D7E041F14E00407807014 -FC040080716D7E051F807114F00503807114FE716CEBFF807214C0180F060314E084727E -85190F7313C01901731380F23E004B5D76E560>I<000FBB12F8003F1AFE4886A2BD1280 -A56C1B00A26C62000F1AF8D0FCAF000FBB12F8003F1AFE4886A2BD1280A56C1B00A26C62 -000F1AF8512979CB60>I<EA0F80EA3FE0487E13FC487E6D7E8014F0806C13FE6E7E6C80 -000F14F00003806C14FE6C6C7F6D14C0010F806D14F80101806D14FF023F14C0020F806E -14F80201806E14FF033F806F14E00307806F14FC030014FF7080041F14E00407807014FC -040080716D7E051F807114F00503807114FE716CEBFF80061F14C084060314E084727E4E -B5FC60060F14C060067F14804DB5EAFE004D14F8050F5C4D14C0057F5C94B548C7FC0403 -5C4C14F0041F5C047F148093B6C8FC030314FC4B14F0031F5C4B148092B6C9FC4A14FC02 -075C4A14E0023F5C91B6CAFC4914FC01075C4914E0013F5C4991CBFC48B55A4814F8000F -5C003F14C0485C4ACCFCB512F85C14C05C49CDFC6C5A13F06C5AEA0F804B5D76E560>I< -000FBC12C0003F1BE0481BF01CF8BDFCA801FCC7000F9038C00001AE6C487213F06C48F1 -7FE06C48F13FC0C994C7FCB3B3B3B04AB712FE0207707E4A83A24A83A46E5FA26E5F0201 -4CC8FC556F7BEE60>84 D<0003B600C090B612F0000FDBE00381486F488104F882485EA4 -6C8204F05E6C4B6C5D00034BC65DD8000301FCC7000F01F0C7FC6D606F5C6D60816E4B5B -826E4B90C8FC826E4B5A826E4A5B16F06E4A5B16F86E4A5B16FC6E4A5B16FE6E4A5B16FF -6F01BF5B8194B5C9FC816081A26F5CA26F5CA26F5CA26F5CA2705BA2705BA44C7FA293B5 -7EA24B80845D845D845D845D05BF7F4B139F051F7F4B7F04FE8003FF7F04FC804A8004F8 -80834A01F080A24A6E7F5E4A6F7E5E4A6F7F4C814A8193C7804A814B8202FF8186494980 -86494980864949808649498187000FB60207B61280003F6F4915E0486F4915F0705BB718 -F8A46C1BF04C7F6C4B6D15E0000F92C76C1580556F7BEE60>88 D<0003BB12C0000F1AE0 -481AF01BF85AA61BF0A291CA001F13E04F13C0A24F138096B51200A24E5B4E5BA24E5B4E -5BA24E5B4E5B6C5A6C484C5B6C4893B5C7FCCBFC4D5B4D5BA24D5B4D5BA24D5B4D5BA24D -5B94B5C8FCA24C5B4C5BA24C5B5E604C5B5E604C5B93B5FC95C9FC4B5B5D5F4B5B5D5F4B -5B5D5F4B5B92B5FC94CAFC4A5BA24A5B4A5BA24A5B4A5BA24A5B4A5BA291B5CBFC4949EE -1FE0F23FF04949EE7FF84949EEFFFCA2495B495BA2495B495BA290B5CAFC485BA2485B48 -5BA2485B485BA2485B4890BAFCA2BCFCA76C1AF86C1AF06C1AE04E6F77EE60>90 -D<001FB712FC48824882B91280A618005F5F01FCCAFCB3B3B3B3B3B3A990B712FC838318 -80A66C17006C5E6C5E318D59FD60>I<001FB712FC48824882B91280A67E7E7EC9121FB3 -B3B3B3B3B3A9001FB8FC5A5AB9FCA66C17006C5E6C5E318D79FD60>93 -D<ED0780ED1FC0ED7FF0913801FFFC020713FF021F14C0027F14F049B612FC010715FF01 -1F16C0017F16F048B812FC4883000FEFFF80003F02F815E048DAE03F14F04B7EB6D80007 -14F802FC13014A7F6C01E0023F13F00280140F6C48C8000313E04981D81FF09238007FC0 -D80FC0EE1F800003CAEA06003D1B6FEE60>I<000FBA12FE003FF1FF80481AC0A2BC12E0 -A56C1AC0A26C1A80000FF1FE004B0D767B60>I<0207B512C091B612FC0107EDFF80011F -16E04916F84916FE90B97E4884854884854884DB00018002FCD9001F7F0503801700727F -6C496F7F846C496F7F6C49816D4881011FC98090CAFC84A594B6FC167F030FB7FC92B8FC -1407141F91B9FC1303130F5B137F90BAFC48EEE00148EDF000484AC7FC4814F048148002 -FCC8FC4813F05C48138091C9FC485AA25BA66D5EA26C6C5EA26E151F6C6D5D02F092B5FC -6C6D14036C01FF021F14FFDBE003B812E06C91BA12F06C1BF86C1BFC7E7F6D836DEEFC3F -0107EEF00F0101DCC00714F86D6CDB000114F0020F02F0D9001F13E0020049CBFC565177 -CF60>97 D<001FB512C048804880B67EA67E7E7EEA0001B3A2943807FF80057F13F80403 -B6FC040F15C0043F8193B712F803F916FE92B9FC87878787DDFC03809426C0003F7F94C7 -000F7F04FC804C02017F04E06E14804C814C6F13C08693C914E04B827413F05D7413F85D -861CFCA286A31CFEA21B7FAA1BFFA21CFCA262811CF862811CF0626F5E1CE0705D704B13 -C0627092B51280704A1400705C70020F5B04FF4A5B7190B55ADDF8075C94B75A636398C7 -FC03FB5E03F95E03F816F06D023F15C0DBF00F92C8FC91267FE00314FC91261FC00014F0 -91C8001F90C9FC57707EEE60>I<93383FFFFE0303B612F0031F15FC037F15FF4AB812C0 -020783021F83027F8391B9FC49845B4984499138F0000F4991C712034913FC4913F090B5 -12C0484A6E5B92C8FC48496F5B4A705A4849705A4AEE0F80484993C8FCA2485B5C5AA291 -CDFC5AA25BA212FFA25BAA7FA2127FA27FA27E80A26C6DEE03FC6E4C7E6C4E7E6E4C1380 -6C7F806C6D5E6C6D5E6F17006C02E092B5FC6D6D4A5B6D01FE14076F6C011F5B6DDAFC01 -B55A6D91B7FC6D600101606D606E5F021F94C7FC6E16FC020316F0020016C0031F92C8FC -030314F8DB003F1380495174CF60>I<0503B512F84D804D804D80A683838394C7123FB3 -A2923801FFF0031F13FF037F14C04AB612F0020715FC021F15FF027F16BF91BAFC5B5B5B -5B49ECC01F499038FE00034901F0130090B548143F4802808092C87E4849814849814A81 -485B4A8148845C5C4884A291CAFC5AA25BA212FFA25BAA7FA2127FA2617FA26C95B5FC80 -A26C6D5DA26C6D5D6E5D7E6E5D6C6D5D6E5D6C6D5D6C02C091B6FC6F13036D01F8130F6D -9026FF807FEDFFF06D91B912F86D1AFC6D1AFE6D17BF6D173F6D16FE023F15FC020F15F0 -0203DBC01F14FC0200DB000F14F8033F01FC6D14F0030301C090C9FC57707AEE60>I<EE -7FFC030FB512C0033F14F892B612FE02036F7E020F16E0023F16F84A8249B87E49834984 -498449DAE00F804949C7804901F8143F90B500E0020F7F0380804891C86C7F4849814A6F -7F485B4A707E48844A1880485B85484918C0A291CA7E5AA25B1BE000FF8490BBFCA91BC0 -1B801B0049CDFC127FA27FA27E80A26C7F1AFF6C6D4C13806E4C13C06C6D4C13E0A26C7F -6E5E6C6D6C5D6C6E4B13C06F5D6D01F892B512806D01FE14036DD9FFC0010F14006D02FE -90B55A6D91B75A7F6D606D60023F17C06E5F020794C7FC020116FC6E6C15F0031F158003 -0302FCC8FCDB001F13C04B5176CF60>I<F0FFFC050FEBFFC0053F14F094B67E04038104 -0F814C815E4C168093B8FC5D5D4BECC07FEFFE004B01F86D13005F4B496D5A4D6D5A4DEB -03F04B92C8FCA294CAFCAD000FBA12C0003F85488586BBFCA56C616C616C61C8003F90CA -FCB3B3B2000FB912FC003F18FF4885A2BB7EA46C61A26C96C7FC000F18FC497079EF60> -I<F20FFC922601FFE091B51280031F01FE010714C0037F9026FF801F14F04AB6D8E07F14 -F8020703F8B6FC021F92B712FC5C4A19FE49BBFC5B5B1AFC49DA807F02C013FC499026FC -000FEC007F4901F0010316F84B6DED3FF04901806D6C9038800FE092C86C91C7FC90B583 -4A8148496F7FA24A81A24885A24A81A76E5DA26C61A26E5DA26C6D4B5B6E5D6D606F5C6D -01E049B5C8FC6F5B6D01FC010F5B6D9026FF807F5B4991B65AA2495F6149178096C9FC60 -90B812F802F915E0DAF07F1480031F49CAFC030113E092CDFCA46D7EA2806D7EECFFFC6D -90B7FC19FC6DEFFFC06D18F0011F18FE49727E498590BB12F04886488648864891C80003 -8002F0DB000F14804801C016004A053F13C04890CB120F49060313E0484884497213F0A2 -49197F00FF1BF8A249193FA66D197FA26C6CF1FFF06D606C6C4E13E06D6C170F6C6D4D13 -C002F0177F6C01FE0403B512806C6D6C030F14006C02F892B55A6CDAFFE0013F5C6C92B8 -5A6D616D616D61010796C7FC010118FC6D6C17F0021F17C0020794C8FC020016F8030F15 -80DB007F01F0C9FC577A7BCF60>I<001FB512C048804880B67EA67E7E7EEA0001B3A294 -3803FFE0053F13FC4CB6FC040715C0041F15F0047F8193B77E03F98292B8FC8687A2DDFE -01809438E0003F05807F4CC76C7F5E4C8004E0825E855E93C8FCA25DA25DA45DB3B3001F -B7D88003B7FC48DCC00F168048704816C0B800F017E060A4846C04E017C06C4C6C16806C -DC800316005B6F7EEE60>I<ED01F0ED07FCED1FFF4B7FA24B7FA292B57EA56F5BA26F5B -A26F90C9FCED07FCED01F092CBFCAF0007B7FC001F824882835AA47EA27E1207C81207B3 -B3B2001FBA12C04819E04819F0BB12F8A66C19F06C19E06C19C0457072EF60>I<000FB7 -12C0003F82488283B8FCA47EA27E120FC81201B3B3B3B3AF000FBBFC003F1AC0481AE0A2 -BC12F0A46C1AE0A26C1AC0000F1A004C6F76EE60>108 D<DCFFC0EC7FE0271FFFC00701 -F0903803FFF848D9E01F01FC010F13FE48D9F07F6D013F7FB56CB6498002FB0381B67E91 -B700C38118C706EF8195B7FC6C877E6C038103C07FD8003F49C66CEC003F03F815FC4B6D -49131F4B4B804B5D4B5D71150F92C75CA24A93C7FCA34A5DA44A5DB3B3A2001FB5D8F001 -B500F890B512FC48DAF807DAFC0380486E486E4880B600FE03FF16804C5DA470816C02FC -03FE16006C4A6C4A6C5C6CDAF0014AC65C614F81CE60>I<943803FFE0001FB500C0013F -13FC486E48B6FC48DAF00715C0B6D8F81F15F0047F8193B77E03F98292B8FC866C867E6C -DCFE0180D800019238E0003F05807F4CC76C7F5E4C8004E0825E855E93C8FCA25DA25DA4 -5DB3B3001FB7D88003B7FC48DCC00F168048704816C0B800F017E060A4846C04E017C06C -4C6C16806CDC800316005B4F7ECE60>I<EEFFE0031F13FF037F14C00203B612F8020F15 -FE4A81027F16C091B87E4983010717FC49834983EE803F499026FC0007804901F0010180 -90B500C06D6C7F484A6E7F4AC8120F48496F7F4A8148496F7F48854A814A167F48854A82 -481A8091CA7EA2481AC04983A448487113E0AC6D5FA2007F1AC0A26D5FA26C1A806E5EA2 -6C6D4C1300A26E93B5FC6C6D4B5BA26C6D4B5B6E5D6C6D4B5B6E5D6C6E4A5B6C6E4A5B6D -01F049B55A03FC13076D9026FF803F5C6D91B7C7FC6D5F6D5F6D5F010017E06E5E021F93 -C8FC6E5D020315F8020015E0031F91C9FC030013E04B5176CF60>I<943807FF80001FB5 -00C0017F13F848DAE003B6FC48DAF00F15C0B6D8F83F8193B712F803F916FE92B9FC8787 -6C866C866CDCFC0380D800019226C0003F7F94C7000F7F04FC804C02017F04E06E14804C -814C6F13C08693C914E04B827413F05D7413F85D861CFCA286A31CFEA21B7FAA1BFFA21C -FCA262811CF862811CF0626F5E1CE0705D704B13C0627092B51280704A1400705C70020F -5B04FF4A5B7190B55ADDF8075C94B75A636398C7FC03FB5E03F95E03F816F0043F15C004 -0F92C8FC040314FC040014F0051F90C9FC94CBFCB3A9001FB77E48824882B87EA66C5E6C -5E6C5E57777ECE60>I<96381FFF80000FB66C49B512F0003F6F010F14FC486F013F14FF -7090B71280B7010316C0170F4D16E05F6C93B812F016F16C15F3000F03F7ECF80FC70003 -90B612809526FC000713E018F04E6D13C006806D138095C813004D153C4D92C7FC5F5F5F -5FA25F94CBFCA25EA35EA35EA45EB3AA000FB912F0003F84488485BAFCA47E616C60000F -60544F7BCE60>114 D<92267FFFF0137C021FB6EA01FE91B7EAE3FF010393B51280130F -133F90BAFC5A5A5A5A5A9238C0007F4801F8C7120702C014014890C97E4982485A49825B -A56D701300725AD87FFE705A6D93C8FC14E06C13FCECFFC06C14FF6C15FC6CEDFFF06CEE -FF806C17F06C17FC013F16FF010F17C0010317F0010083021F82020182DA000F81DB003F -1580040015C0050714E0EF007F061F13F0D80FE01607D83FF0040113F8486C826DEF7FFC -12FF193F7FA37FA26E167F80F1FFF86E5D6E5D02FC4B13F06E151FDAFFC091B512E003FC -011F14C092B8FC1A801A0061616101F317E001F01780D9E03F4BC7FC007F010F15F8263F -C00115C06CC7001F01F8C8FC465173CF60>I<ED3F80EDFFC04A7F825CB3000FBA12F800 -3F85488586BCFCA56C616C616C61C7000301F0CAFCB3B2F27F80F2FFC04F13E04F13F0A6 -61821BE06E5E824F13C0705C6E6D4A1380DDC001B5FC6FD9F80F140094B7FC6F5E6F5E6F -5E626F5E030116806F93C7FC043F14FC040F14F0040314C09326007FFCC8FC4C667BE460 ->I<001FB500C0023FB57E486E4A80486E91B67EB66C4981A66C826C836C83D80001EE00 -03B3B3A761A36161A26F5D616D4CB5FC6F5C6F6C131F6ED9F801B8FC93BA12806E1AC01D -E08080806E16FB6E16E36E6C038115C0031F4AC61580030702F86D1400DB007F018090C9 -FC5B4F7ECD60>I<000FB66C0103B612E0003F03E0010F15F8486F4915FCA2B76C4915FE -A46C4B6D15FCA26C4B6D15F8000F0380010315E0D800070180C80003EBC0006D616F5DA2 -6D96C7FC6F5DA26D606F151FA2027F5F6F153FA2023F5F6F157FA2021F5F6F15FFA2020F -5F6F5CA26E5F705BA26E5F705BA26E94C8FC705BA26E5E70131FA2037F5D70133FA2033F -5D70137FA2031F5D7013FFA2030F5D705AA26F5D1783A26F5D17C7A26F92C9FC17EFA26F -5C17FFA2705BA3705BA2705B705B705B040190CAFC574F7CCD60>I<001FB66C91B612FC -4803E0010381486F4981B71980705BA44C7F6C1C006C4B6D5D6C038001005D26007FF0CA -000790C7FC6E5F013F61A56D6C4D5AA56E173F010F61A56E177F6DDB7F805C933801FFE0 -4C7F5E84038016FF6D4A6D5CA34C7FA26D01C05F614C13FF17F717F3167F6D01E003815B -1983A216FF05E313C317E1027F95C8FC15F119E717C0A215F3023F5F9438807FF715FBA2 -92B514FF6E4A6C5BA35E84A26E5F4C7FA36E496D5B4C7F6E496D5B020001806D1380594F -7DCD60>I<0007B600C0017FB512FC001F03F090B7FC486F4816805F4803FC17C0A46C03 -F81780836C4B6C1600000703C06D14FCC7D87FFCC7000301E0C7FC6F4A5B023F4B5B6E7E -6E6D4990C8FC6E6D495A70495A806E6D495A6E6D485B6F6C485B616F6C5A6F6C485B6F01 -9F90C9FC606F13FF6F5C6F5C6F5CA2705B705B705B7090CAFCA34C7F845E4C7F93B57E4B -80844B139F4BEB0FFE4B804C6C7F4B487E033F814B486C7F4C6C7F03FF6E7E4A5B4A496D -7E727E4A49804A90C76C7F4A814A486E7F4B824A486E7F02FF6F7F495B000FB66C010F90 -B51280003F03E0013F15C0486F4915E01CF0B76C90B7FCA46C4B7F1CE06C4B6D15C0000F -0380010F1580544E7BCD60>I<001FB66C0107B612C0486F011F15F0486F4915F8B77E4E -15FCA47215F86C5D6C4B6D15F06C4B010715C0D800070180C80007EB800098C7FC6D6D5D -A26D606F151FA26D6D5E193F147F6F5E197F6E7E62021F16FF8162020F5D816E5F705BA2 -6E5F705BA26E6D92C8FC606E5E82181F037F5D82033F143F705CA2151F70495A150FA270 -495A81A26F01815BA217C16F01C35BA26F13E396C9FC17E7167FEFF7FEEE3FFFA26082A2 -6082A2705BA3705BA282605EA2605EA295CAFC5EA25F161FA25F163FA25F167F01FE5D26 -03FF8013FF487F486D485B5D4801F05C5D4B5B5DDA803F90CBFCEDFFFE14876C90B55A5E -5E6C5DA26C15806C92CCFC5D6C5C013F13F06D13C0D903FECDFC56777BCD60>I<F17FFF -061FB512804DB612C0050715E0171F177F4CB7FC5E5E4C16C04C16804C16004C02F8C7FC -4EC8FC93B512E018804DC9FC4B5BA25FB3B3A25DA2030F5B5D037F5B0203B5FC027F5C00 -0FB7FC003F5E4893CAFC5EB75A16F05E8216FC6C81826C82000F82C77E020380EC007F03 -1F7F8103037FA281B3B3A283A26F7F717E18E07013FEF0FFF87091B5FC7016807016C070 -16E08282707E171F1707050115C0DD001F1480DE007F13004B8D76FD60>123 -D<EA0F80EA3FE0EA7FF0A2EAFFF8B3B3B3B3B3B3B3A7EA7FF0A2EA3FE0EA0F800D8D57FD -60>I<380FFFC0003FEBFF804814F015FEB77E16E016F882826C816C826C82D8000181EB -0007DA007F7F151F15076F7FA281B3B3A283836F7F847013E018FC70EBFFC0F1FFFE70ED -FF807016C0827016E016008394B7FC16034C16C05E4C16804CEDFE0007C0C7FC4C01FCC8 -FC18E093B5128095C9FC4B5B5F5FB3B3A25DA24B5B151F157F0207B55A49B6FC001FB75A -485E4893CAFCB75A5E5E16E016806C4ACBFC15F06C1480000F01C0CCFC4B8D76FD60>I -E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fe cmbx12 12 29 -/Fe 29 122 df<EB1FE0EB7FF83801FFFE0007EBFF804814C04814E0A24814F0A24814F8 -A2B612FCA86C14F8A26C14F0A26C14E0A26C14C06C14800001EBFE0038007FF8EB1FE01E -1E709D3E>46 D[<EF03F0EF0FF8171F177F17FF1603160F163F4BB5FC150F92B6FC141F -013FB7FCB9FCA615F7150714E0EBC000C8FCB3B3B3B3B3A7003FBB12FEAA>79 -130 111 257 112 49 D[<93387FFFC0030FB6FC92B712F0020316FE021F707E027F17E0 -49B912F84918FE010F727E4985499026FC007F15F090B500C00107814849C700018102F8 -6E6C804801E0031F8048496F8148496F8102E015014801F88502FE6F81486D826F6F8048 -80738081B67080817380A4851D80A36C5CA26C5CA26C5C6C91C9FC6C5B6C5BC613F0D91F -801A0090CBFC61A264A24F5CA34F5C646164616496B65A99C7FC4E5C4E5C634E5C4E5C63 -4E5C4E91C8FC4E5B6295B55A4D14E04D5C4D5C4D49C9FC614D5B4D13E04D5B94B55A4C49 -CAFC4C5B4C5B4C13E04C5B4C49EDFF804C90C9FC4C5A4B13F84B494B13004B5B4B5B4B5B -4B48C9FC4B485E4B5A4A495F4A13C04A4916074A90CAFC4A5A4A48170FEC7FF04B4CB45A -91BBFC5B5B5B5B5B5B496290BCFC5A5A5A5A5A48635ABDFCA564A4>89 -130 117 257 112 I[<93380FFFFC4BB612F0030F15FF037F16E04AB812F8020717FE02 -1F717E4A18E091BA12F8499126F8007F80490280010F804901F8C70003804901E0020081 -4901806F804948C96C80804901C06F8015F090B56C846F81486E84A281488782A285A361 -A36C92C8FCA2646C5C6D5B4F5C6D5B010F13E0010301804B5CD900FEC9FC91CA5D616496 -B65AA24E92C7FC4E5C634E5C4E5C4E5C067F148095B6C8FC050714FC0407B65A0307B712 -E04B168007FCC9FC19F085F1FF801AF06F16FE92C86E7E060F14E0060314F87280726C13 -FF738073801CF073808588738088A27315801DC0A21DE0A2851DF0A3D91FC01AF8EBFFF8 -000313FE487F488048804880A24880A2B67EA21DF0A44F15E0A34B19C07E4B4B1580A26C -4A19004B5D6C91C95D4A4C5C6C5B02E04C5C6C6D4C5C6C6D4C5C6C01FF93B65A6C02E002 -035D6D01FC020F92C7FC6DD9FFF090B612FC010F91B85A6D19E00101616D6C95C8FC021F -17F8020317E0DA007F93C9FC030715F0DB001F01FCCAFC>93 132 -119 257 112 I[<F207FE507E62A2626297B5FCA261616161A261616196B6FCA2606060 -A260606060A295B7FC5F5F85EF07FE170FEF1FFCEF3FF818F0177FEFFFE04C13C018804C -13005E4C5A4C5A5F163F4C5A4C5A5F4B5B5D4B90C7FC4B5A5E151F4B5A4B5A5E4B5A5C4A -5B4A90C8FC5D140F4A5A4A5A5D4A5A14FF495B495B92C9FC5B495A495A5C495A137F495A -485B5C4890CAFC5A485A5B485A123F485A485A90BE12E0AACB000192C8FCB3A4047FBA12 -E0AA>99 131 122 258 112 I[<BE12F0F5FFC01EFEF6FFC01FF81FFF20C020F020FC20 -FFC700074AC9000F16C0E2007F810B0715F80B00810C3F800C0F6E7E0C03810C00817980 -0D1F80798079808B798079817A807A80A27A807A80A27A80A27A80A27A80A2A112808CA1 -12C0A37B14E0A3A112F08DA3A112F8A4A112FCA28DA5A112FEB3A112FCA569A2A112F8A4 -A112F0A269A112E0A3A112C09EB6FCA2A1128068A11200A2565CA2565CA2565C686B565C -686B9DB65A5592C7FC555C555C0D1F5C675514E054B65A0C075D0C1F92C8FC0C7F5C0B03 -B612F80B3F5D0A0FB712C0C25A56C9FC20F820E020800DFCCAFC1FE054CBFC1EE00BF0CC -FC>151 137 120 264 172 68 D[<BB12FEAAC700030380C7FCB3B3B3B3B3B3A9BB12FE -AA>71 137 122 264 83 73 D[<B96C063FB812FC848484A284848484A2C700077094C7 -000F01F0C7FC73070113808585A285854B8170807081A27081708170817081A270817081 -71807181838771817181718183877181728072817281A27281728172817281A272817380 -73817381858973817381738185897480748174817481A27481748174817481A275807581 -75817581878B758175817581888B7615807615C07615E08820F07615F87615FC7615FE77 -14FFA27715817715C17715E17715F18921F97715FD7792B5FC8A8AA28A8A8A8AA28A8A8B -8BA28B8B8B8B8BA28B8C8C8CA28C8C8C8CA291263FFFC087B900F0868D8DA28D8D8D8DA2 -7B90C8FC>158 137 120 264 175 78 D[<93260FFFF0ED01F00303B600C081031F03F8 -140392B81407020305E0130F020F05F8131F023F71133F91BA137F49F1C0FF499126FC00 -1F14E1010F02C0010014F34949C8000F90B5FC4901F815034901E0ED007F4B8290B54816 -0F4891CA7E484917014A8348864A8448864A845A8748865C875A87A21C7FA2B5FC6E193F -A36E191FA3806E190F80A215C0816C6E725A03FC95C8FC81EDFFC06C15F8EEFF8017FC6C -EEFFC018FE6CEFFFF019FF6C19F01AFE6CF1FFC01BF06C1AFC6C1AFF6D866D1AE0886D86 -6D860103866D866D876E86021F8602078614016E6C85031F851503DB003F841603DC001F -831701DD000F17801800070716C0F1007F1A1F080715E01A018687877514F087007F8648 -7E8787A387A36D86A31EE07FA37F1EC07F99B5FC6D1C807F636D1C00806E4E5B8002F84E -5B6E6002FF4E5B6F4D5B03E04D5B03FC94B5FC03FF04035C04F04B5C04FF033F91C7FC49 -6C02FE0103B55A496C91B85AD9F80F19F0D9F0036149C6198049013F95C8FC49010F17FC -90C7000117E048DA001F168048030103F8C9FC007CDB000391CAFC>100 -141 116 266 125 83 D[<000FC212FEA6488DA40480C703E0C7123F03F0C818010380F3 -003F4AC9190F02F81D034A894A894A8A484978138091CA86498BA2498BA2498BA2498BA4 -498B007F22C0A449207FA84848F83FE0A6CC98C7FCB3B3B3B3A4033FBD7EAA>139 -135 120 262 156 I[<BB00F84BB912E0AAC7000792CE6C0180C7FCE70FFCC8FCB3B3B3 -B3AF6E1E1F6AA3846E1E3F6AA26E1E7F7263A26F1DFF6A6F6E616A6F646F6E4F90C9FC68 -6F6E626F6E191F724F5A6F525A6F6EF001FF706E4D5B7002E04D5B706E051F5B7002FC05 -7F5B7002FF0403B5CAFC7003C0030F5B040003FC92B55A71DAFFE0013F14F0051F92B85A -0507627197CBFCDD007F18FC061F18F0060718C006004DCCFC070F16F007001680080102 -E0CDFC>155 139 120 264 172 I<93B512F8037FECFFE00207B712FE023F707E91B912 -F0010318FC4918FF49854991C715E04901F0021F80496D0207806F02018090B56F806F6F -7F4872806F6F8085888588A27380A26C5CA26D496F806D5BA26D5B010713C0010190C9FC -90CBFCA796B6FC050FB7FC0407B8FC93B9FC150F157F0203BAFC021F1681027FEDC00149 -B6EAF800010715C0494AC7FC013F14F84914C090B65A484AC8FC485C485C485C485C5D5A -5D5A92C9FCA2B6FC5CA461A36E5E7E616F5D7E6F5D6C6EDBFFBF7F6F4A013F7F6C6EDA03 -FE15F06C02FEDA0FFCEDFFF86C6E6C017F6D15FC6C9239F007FFF06C92B6487E013F17C0 -010FEF000701034C1301010004F87F021F03C0141F020392C8000314F8DA000F01E092C9 -FC665C7ADA6D>97 D[<ED1FF0017FB5FCB7FCAAEA003F1307A27FB3AF96383FFF800607 -B512FE063FECFFC04DB712F8050716FE051F707E057F17E004F1B97E04F3DA801F14FC93 -B526F800018006C06D6C7F4DC8001F804D6F14E005F015034D6F8005806F8094CA804C71 -7F4C838A4C711480A27614C0A21FE0A27614F0A31FF8A37614FCA61FFEAF1FFCA51FF864 -A21FF0A35214E0A21FC0A2521480A2704D1400A2704D5B7094B55A7160715D714B5C714B -5CDCBFF8031F5CDC1FFE4B5C4B6C6C6C91B548C7FC4B6C01E001075C7001FE017F5C4B6C -90B812E04B6C6C17804B6D4CC8FC4B010F16F84B010316E092C86C92C9FC4A031F14F090 -CB49CAFC>111 139 122 265 125 I<94B512E0041FECFF804BB712F8030F16FF033F17 -C092B97E020318F8020F844A84027F9126F0000F7F91B600806D14804902FCC75A494A17 -C04902E05C494A17E0494A5C4991C8FC495B90B55AA2485C5A5D487214C0A2484A6F1480 -7314005A4B6F5B070013F848F13FE097C8FCA3485CA5B6FCAF7EA281A37EA2817EA36C80 -F303F86CF207FC816C1A0F6F18F86C6E171FA26C6EEF3FF06D6E167F6D6E17E070EEFFC0 -6D6E5D6D02FC030713806D02FF4B13006D03C0EC3FFE010003F8ECFFFC6E9126FF800F5B -6E92B65A020F60020318806E95C7FCDA003F16FC030F16F003011680DB001F02FCC8FC04 -001480565C79DA64>I[<F5FF800803B6FC0707B7FCAAF10001F2003FA287B3AFEFFFFE04 -3FEBFFF04BB612FE030FEDFF80037F16F04AB812F8020717FE4AEFFF9F023FDAFC0014DF -4A02C0010F90B6FC49B548C712014902F86E7E494A151F4902C081494A814991C97E4B82 -498490B54883484A83A2485CA2485CA25AA2485CA25AA35D5AA5B6FCAF7EA66C80A37EA3 -6C80A27EA26C80636C6E94B6FC6C616F5E6D6D5E6D606D6D5E6D6E4B816D02E092B7FC6D -6E4A16F86D02FC0207EEFFFE6D02FF023F13BF6EDAF003B5123F021F91B612FC6E17F802 -0317E002001780031FEDFE00030715F8DB007F14C0040301F8C702F0C7FC>111 -139 121 265 125 I<4CB5FC043F14F80303B7FC030F16E0037F16F84AB812FE0207717E -4A84023FDAE00F804ADA000114F891B500F8D9003F7F01034A6E7F4902C080494A02037F -4991C88149496F804B81498690B548707F48854B845A4B824887A248737F5D5AA2884885 -A25D5AA21D80A3B6FCA292BBFCA61D000380CDFCA67EA4817EA47E817E1C7F6C6EF0FF80 -A27E6F5F6C1C006F5F6C6E4D5A7F6D6D4D5A70161F6D02E04C5A6D6E4C5A6D6E4B485A6D -02FE4B5B6DDAFFC0020F5B6D6C02F8027F90C7FC6E913AFF8007FFFE6E92B65A02076002 -0118E06E6C1780031F4CC8FC030716F8030016E0040F4AC9FCDC003F13C0595C7ADA66> -I[<F0FFFE053FEBFFC00403B612F0041F15FC047F810303B812804B17C0151F037FDAC0 -7F13E092B548C6B512F04AECF8014ADAE00314F84A14C04A028015FC4A4A5A4A5B5E5C5E -91B5FC5E497014F8A3494A6D14F07214E07313C0731380731300F103F896C8FCB3A2BA12 -C0AAD8000302F0CAFCB3B3B3AFB912F8AA>78 139 121 266 68 -I[<EC3FC0ECFFF0010313FC497F497F498049804980A290B67EA24881A86C5DA26D5CA2 -6D5C6D5C6D91C7FC6D5B6D5B010013F0EC3FC091C9FCB3ED1FF0013FB5FC007FB6FCAAEA -003F1307A27FB3B3B3ABB9FCAA>48 139 120 266 63 105 D[<ED1FF0017FB5FCB7FCAA -EA003F1307A27FB3B3B3B3B3B3A5B912C0AA>50 138 120 265 63 -108 D<DB3FE0912603FFF894380FFFE0017FB5037FD9FFC04BB6FCB74AB600F8030715E0 -060F03FE033F15F84E6F6C4A15FE067F7049B8FC4DB86C0107834D7149834DD9F00F6E49 -D9C03F80051FD900016E90277FFC000780DD3FFC6D6ED9FFF06D80DD7FF06E4A01C07FD8 -003FDBFFC0704890C78101074C6E4B8004E190C8DB87FC836DDAE3FC6FDA8FF081DCE7F8 -F09FE04DDEDFC08304EF19FF4D6F4B81DCFFC096C9FCA1804D6094C95DA24C61A34C61A4 -4C61B3B3ACB9D8E003B9D8800FB812FEAAAF5A78D9BC>I<DB3FE0913807FFF0017FB503 -7FEBFF80B70203B612F0060F15FC063F15FF4E824DB87E4D83050FD9F00F804DD9000380 -DD3FF86D804D487FD8003FDBFFC06E7F01075EDCE1FEC8806DDAE3FC81DCE7F8845F16EF -4D81EEFFC04D84A294C9FCA25EA35EA45EB3B3ACB9D8E007B9FCAA705A78D97D>I<9438 -7FFFC0040FB512FE93B712E0030716FC033FEEFF8092B912E0020318F8020F18FE4ADAF0 -01804A91C7001F8091B500FC020714E04902F00201804902C06E6C7F494A6F7F4991C96C -7F4949707F4949708049497080A290B548708048884B824888A2484A717FA24888A24888 -A24B83481D80A3481DC0A6B61BE0AE6C1DC0A56C1D806F5FA36C1D00A26C646F94B5FCA2 -6C646F5E6C646C646F5E6C646D6D4C5C6F5E6D6D4C5C6D6E4B91C7FC6D6E4B5B6D02F04A -B55A6D02FC02075C010002FF021F14E06EDAF001B65A6E91B85A020F4EC8FC020318F86E -60DA003F1780030F4CC9FC030116F0DB001F92CAFCDC007F13C0635C7ADA70>I<DB1FF0 -91381FFFC0017FB50203B512FEB7023FECFFE095B712F8050716FF051F83057F17E094B9 -12F804F38404F7DA803F14FF93B526F00003810680010081D8003F4BC86C80010703F803 -1F804D6F806D03C0814D6F8094C96C804C854C824C1A80887614C0A21FE0881FF088A21F -F8A2881FFCA57614FEB01FFC64A41FF8A2641FF0A2641FE0A25214C0A2521480A299B612 -0082704C5C704C5C7160715D714B5C714B5C71037F5C05FE92B65A716C01034AC7FC06E0 -010F5C04FB01FE90B65A04F990B812E0DCF87F1780714CC8FC050F16F8050316E0050093 -C9FC061F14F0060049CAFC96CCFCB3AAB912E0AA6F817AD97D>I<DB3FC0EB07FF017FB5 -023F13E0B791B512F8050314FE050FECFF804D15C04D15E04D15F09426FFFC3F13F804C1 -EBE07F0680B512FC04C35BD8003F9126C7FC0114FE010715F816CF6D15F0EEDFE017C0A2 -EEFF807214FC94C7FC7313F8A24C6E13F07313E0070713804C913801FE0096C8FCA35EA6 -5EB3B3A7B912F8AA4F5A7AD95C>114 D<92263FFFF0EB07C00207B66C487E023FEDF03F -49B7EAFCFF010793B5FC131F5B90B538F0003F4891C712034801F8EC007F4801E0151F4A -81484981488391C97E48835B007F187FA3193F12FF7FA280806E705A6E93C8FC14FCECFF -8015F06CECFF8016FEEEFFF06CEEFF8018F018FC6C17FF6C18C019F06C846C846C18FF6C -856D84011F847F010384010084143F020F831401DA000F82ED007F040181EE000F1701DD -003F148084007F1707486C8284847F85A26D83A36D1900A27F7F4F5A7F6D606E16FF6E5F -6E5D6E4B5B02FC150F02FF4B5B03E091B55A03FE010F5C92B8C7FC19FC01F85FD9E03F16 -E0D9C00F1680D900034BC8FC48D9007F14E0007C020701FCC9FC495C79DA58>I<ED07FC -A8150FA5151FA4153FA3157FA215FFA25CA25C5CA25C5C5C5C91B5FC5B5B130F5B90BA12 -C01207BBFCA8D8000102FCC9FCB3B3A8F107FCB0190F6D6E15F8A2191F1AF06E6D143F1A -E06E6E137F71EBFFC06E6E5A6EDAFC0F13806E91B612006E5E6E5E6E5E033F5D6F5D0303 -1580DB007F49C7FC040313E046807CFE57>I<DB0FF8F07FC0017FB50403B6FCB70307B7 -FCAAD8003FEF00010107F0003FA26D85B3B3AD63A363A398B6FCA26D6062A2626D6E5DE0 -1FEF806E173F70DBFFCF14FC6E6D4A018F91B5FC6E6E0107130F05F8EB7FFE6E91B612FC -020317F86E17E06E6C16C0031F1600030715FC030015F0040391C702FCC7FC705B78D97D ->I<007FB8020FB712E0AAC76C0280DA003F01E0C7FC6E6E030F90C8FC714B5A6E6E4B5A -6E6E4B5A6E4E5A6E6E5E715C6E6E4A5B6E6F495B6F4C90C9FC6F6E495A72495A6F6E5C6F -6E137F6F4C5A6F6E485B72485B6F6E485B6F038790CAFC70EC8FFE19DF70ECFFFC705D70 -5D705D6282705D7092CBFC7180867180718083718086864D805F874D814D8194B77E4C13 -EF4C01C7800687804C0103804C6D804C487E4C48824C486D804C486D804D6D804B814B49 -824B496D804B90C76C804B48804B486E804C84037F70804B486F804A49814A496F804A49 -844A90C96C804B708091B56C81B892B812FEAA6F597DD876>120 -D<007FB8031FB612F0AAD8000302FCCA001FEB80006D6EDD07FCC7FC1C0F826D505A836E -4F5AA26E6E4C5AA26E6E5F1CFF6E6E5F63836E4E90C8FC836E4E5AA26E6E4B5AA26E6E5E -1B1F846F4D5A846F4D5A846F4D5AA26F6E495BA26F6E92C9FC62846F4C5A846F4C5AA26F -6E495AA27002805B1A3F7002C05B1A7F19E0704B5A857002F15BA27002FB90CAFCA270EC -FFFEA3705DA2705DA2715CA2715CA2715CA3715CA27191CBFCA2715BA2715BA2715BA372 -5AA261A24E5AA2615FA24D90CCFCA24D5A137C2603FF804A5A000F13E0486D4A5A487F60 -486D143F60B56C147F4D5AA24C5B5E95CDFC4C5A4A130F6C4B5AEE7FF84A495A273FFBF0 -035B271FFEE00F5B9026FFC07F5B6C90B6CEFC6C5D6C15F86C5D6C15C0013F91CFFC010F -13FC010013C06C817CD876>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Ff cmsy10 10.95 7 -/Ff 7 107 df<003FBF12F8481EFCC012FEA46C1EFC6C1EF86F0871B08E>0 -D<EA01F8EA07FE487E4813804813C04813E0A2B512F0A66C13E0A26C13C06C13806C1300 -6C5AEA01F8141471B633>I<923807FF80037F13F80203B6FC020F15C0023F15F091B712 -FC010316FF4983498349834983498390B97E4884A24884481980A24819C0A24819E0A248 -19F0A24819F8A4BB12FCAE6C19F8A46C19F0A26C19E0A26C19C0A26C1980A26C19006C60 -A26C606D5F6D5F6D5F6D5F6D5F6D94C7FC010016FC023F15F0020F15C0020392C8FCDA00 -7F13F803071380464676D05B>15 D<F81FC08DA48D200FA28D2007A28D2003A28D20018D -8C8E217F8E213F8E7B7EA27B7E7B7E8E21037B7E8F7B7F7C7E7C7E7C7EFA0FFE7C7E7C7F -7C13E07C7FFB7FFC7DB4FC7D13C0003FC512F048A112FCC5B5FCA11480A2A114006CA112 -FC6CA112F0D6001F13C05990C7FCFB7FFCFBFFF0585B5813805890C8FC585AFA1FF8585A -585A585A575BA0C9FC575A21076A575A575AA2575A6A217F6A21FF9FCAFC6869200369A2 -200769A2200F69A2201F69A469A15E76DBB6>33 D[<953801FF80067F13C00503B5FC17 -1F057F14804CB5EAE000040749C7FC4C13F04C13C04C90C8FC4C5A4C5A4B13F05D4B5B5F -5D5FA25D94C9FCB3B3B05D5EA2157F5E15FF5E4A5B4A5B4A5B4A5B023F90CAFCECFFFE01 -035B011F13F048B55A007F1480B500FCCBFC14E014FC6CEBFF80000114E0D8001F7F0103 -13FC01007FEC3FFF020F7F6E7F6E7F6E7F6E7F82157F82153FA28281B3B3B08381A28381 -836F7F816F13FC707E707E7013C07013F07013FE0401EBFFE0706CEBFF80051F14C01703 -EF007F06011380>66 181 116 263 91 102 D[<EA7FF0B57E14F814FF6C14C0000114F0 -D8000F13FC01037F9038007FFF6E7F020F7F6E7F6E7F6E7F6E7F157F82153FA28281B3B3 -B08381A2838183816F7F6F7F83707E93381FFF80707F7013F07013FE0400EBFFE0053FEB -FF80050714C017001707053F148094B5EAE000040349C7FC4C13F04C13C04C5BDC7FFEC8 -FC4C5A5F4B5B4B5B5D5F5D5FA25D94C9FCB3B3B05D5EA2157F5E15FF4A5B4A5B4A5B4A5B -023F5B4A90CAFC903803FFFE010F5B48B512F0007F14C0B6CBFC14F81480D87FF0CCFC> -66 181 116 263 91 I[<123C127E12FFB3B3B3B3B3B3B3B3B3AF127E123C>8 -181 107 263 51 106 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fg cmti10 10.95 43 -/Fg 43 122 df<E17FFEEE7FE00807B500E0913801FFFC083F02FC020713FF97B66C021F -148007036F4A14C04FD9F0076D90397FF07FE0071FD980006D9039FFC01FF04F48C7261F -E001EB800FDF7FF891267FF0039038003FF8DFFFE002FF49147F4E49494A48EBFFFC4E4B -D9F81F5B50494B5A4E183F4E90C74801F04A13F81F7F4E4818F80CE016F0063F18FF4F6E -496E13E05401F014C0067F6F01016E1380E200FC9238007E004E48030093C7FCA2545BA2 -4D5BA266685F61A266685F61A2669DC9FC5F61A26667A25F96CAFC1E7F031FBF7E4B8AA2 -4B66A36F9BC7FC92C76C48CA01F8C9FC60A2656717FF60A265675E60A26567A25E606567 -A25E60659CCAFCA25E60A265665E95CAFCA21D7F665E5FA21DFF66A2167F5F6466A216FF -5F6466A25D5F6466A25D5F64665DA25F5290CBFCA25D5FA2525AA24B90CAFC651C7FA24B -5A651CFF5E65157F634C60A203FF61D801F84A017E5CD807FC4BB4FC486C4A486D5D486C -4B6D5B4801814A6D92CCFC484B485D6404804C5AB500834A5E020301004A133F515A4948 -484B5C01FC4992C7485A01F8496D48495B267FF00F4B010790CDFC9026C01FF002F0495A -003F4AD90FFCEB3FF89026F07FC06DB46CB45A6CB5486D90B55A6C91C76C1580000301FC -6E6C49CEFC6C49031F13F826003FC0030113C08EA584FF70>11 D<98380FFFFE50B612F0 -080F15FE087FEDFF804FB812E04F9026FE000713F0070F01E09038007FF84F90C8EA0FFC -DF3FFCED03FE4F5ADFFFE0ED0FFF4E495D4E5F4E495DA24E90C9B5FCA24E5A063F18FEA2 -4F17FC067F18F8F67FF04E48EE3FE0F61F809BC7FCA24D5BA35F61A45F61A45F61A55F96 -CCFCA3031FBB12FC4B86A25D66A28192C7D87FFCC9FC66A305FF5E4E5FA3644C6160A264 -665EA24E5D66A34C5F4E94C7FCA3644C6060A21C7F655E95C9FC1CFF65A25E4D5D65A304 -7F5E4D5FA21FFC51EC01FE1DC004FF1AFC5F5114030B8013F85DA24D18075115F01D005D -F60FE05F1E1F1FC04B715A4DF03F80A2756CEB7F00A24B7114FE4D170175EB87FC75EBFF -F84B725B94CA6C5B0A0F1380E201FEC7FC99C9FC4B5AA44B5AA35EA215FF5EEA01F8EA07 -FC486C5C486C5A4801815B5A5E1483B591CFFC14035DEBFE0701FC5B49485AD87FF05BEB -C01F003F495A9038F07FC06CB55A6C91D0FC000313FC6C5B38003FC070A584FF66>I<00 -1FB712F84816FC5AA217F8A2B8FCA217F0A217E06C16C02E0C70AC41>45 -D<191C193E197EA219FC18011803180719F8180F181F183FF07FF0EF01FF5F5F4D13E017 -3F94B5FC5E040F14C0163F4BB6FC92B7FC4A02CF13804A148F4C5A16F84A01C014009138 -03FE0091C85AA260A2177FA260A217FFA260A25EA260A25EA260A25EA260A25EA260A25E -A295C7FCA25EA25FA2167FA25FA216FFA25FA25DA25FA25DA25FA25DA25FA25DA25FA25D -A294C8FCA25DA25EA2157FA25EA215FFA25EA25CA25EA25CA2140F91B6FC007FB812FCB9 -7EA4606C02075C3F796BF85D>49 D<F00FFF95B512E0050314FC050F14FF053F8194267F -F80713E0932701FFC0007F4C48C7EA3FF8DC07F86E7E4C486E7EDC1FC06E7E4C5A4CC86C -138004FE17C04B48814B4817E04B4881030F18F05E4B4817F84B5A171892267F003C157F -4B017C16FC4B137E4A5A053E15FF4A48133F834A5AA2140F5D141F4B495C173E143F5D05 -7E5C027F027C16F892C7FC17FC4D5C4A010117F04A5C04035D4D16E016074C484A13C05F -041F4B13804CC8FC047E4B130091267E01FC4B5A91267F07F85E6EB4485C4C4A5B6E494A -5B6E90C85CDA03F84B5B91CA485B4F90C7FC4F5A4F5A4E5B4E13E04E5B061F5B4E90C8FC -F07FFC4D485A4D13E04D5B051F90C9FC4D5AEFFFF8040313E04C5B041F90CAFCEE7FFC4C -5A030313E04B13804B48CBFCED3FFCED7FF0EDFFC04A5B4A90CCFCDA07FC171E4A48173F -4A485F4A5A4A5A4ACB5A49486001031801495A4948604A1703494817074948601A0F4948 -4D5A49CBFC505A2601FEE0177F90B500F04C5A4802FF15034803F84A5BDCFF80011F90C7 -FC4804FC90B5FCD9FC0191B65A9026F0007F5E4848011F5E03075E484813016F5E49023F -5D007F6F92C8FC90C800075C705C48030014F0053F13C0007EDC03FEC9FC567D72F85D> -I[<F403F0527E1C0F1C1FA21C3FA21C7FA21CFF63A2638963A26363A263A263A298B5FC -A262621BFB1A0709F37FF20FE3A2F21FC3F23FC11B811A7F1B011AFF1AFEF101FCA2F103 -F819071AF0190F08E080F11FC0A2F13F80077F7F97C7FC61611801614E5AA24E5A180F61 -181F4F824E5AA24EC87E60601701601703604D5A170F60171F60053F84604DC9FCA205FE -8216015F4CBAFCA25EA25E5EA2DC3FC0C9123F5F047F8594CAFC16FEA24B488315035E15 -075E4B5AA24B5A153F5E157F93CBFC4B865D4A5AA24A488414075D140F141F143F147FEB -01FF496D4E7F011F6D187F90B66C0403B6FC003F03F80307B812C0486F4B17E0B7FCA220 -C05E267FFE3F496F02C31480>115 130 117 257 135 65 D<4BBB12E01EFE4BF2FFC01F -F01FFC1FFF6F8892C7001F49C8000380050701F8DB007F7F0C1F7F787F4F707F787FA24D -727F61781480A25F4F8321C0A25F61A35F96CBFCA394B595B5128060A34C4F140060545B -A24C4F5B60545B684C4F5B4E5F545B684C96B5C7FC4E4C5B535B0B0F5B4C4E13E04E4C5B -9AB5C8FC525B4C050713F84E033F13E00903B5128095B800FCC9FC4C18E0A21DFE777E93 -B5C9001F13E04D040313F8767F766CB4FC4B737F4D717F8B777F4B854D85A2777F5D4D85 -89A24B875FA35D5FA35D5F65A24B6394CBFC656792B5FC4C6067654A644C6067654A97B5 -5A4C625291C8FC644A4F5B4C4D5B525B525B4A4F5B4C4CB55A515C4A060F49C9FC093F5B -4A494BB55A0103B56C030F14E0003FBD12804899CAFC1CFC1CE01C80BC00F8CBFC6C97CC -FC7A7C75FB80>I<972607FFE0150797B500FEED0F80070FDAFFC0EC1F00077F03F05C06 -03B76C5C060F04FE5C063F70495A95B6D8801FEB800305039126F00001EBC007050F0280 -9039007FE00F4D01FCC8D81FF05B057F01F092380FF81F94B50080923803FC3F040391C9 -0001137F4C01FC71485A4C01F070B5FC043F49834C138093B5CB6C5B4B5B4B01F8844B5B -4B49725B4B5B4B5B4B90CC7E4B48635C4A5B4A49854A4963A24A5B4A5B4A9AC7FC5E91B5 -CDFC5B494963A2495BA24949635B5D5B4B635B5D90B51B07A2484A745A9BC9FC4891D2FC -A3485BA3485BA35A5CA35A5CA35A5CA55CB5FCA5F503E04A507EA21D0F66A31D1F6C651D -3F66A21D7F9BC9FC6C646E621C01525A6C641C076E626C1B0F525A6E4F5A6C641C7F6C6D -4FCAFC515A6C6D4E5A515A6C6D4E5A6D6C4E5A6D4F5A6F4D5A6D6D4C48CBFC6D6D4C5A6D -6D4C5A6D01FCEE1FF86D6DEE7FF06D6D6C913801FFC06E01E002075B6E01FC023F90CCFC -020F903AFFC007FFFC6E91B612F002015F6E6C1680031F03FCCDFC030715F0DB007F91CE -FC040713F0798465FF82>I<4BBB7E4B1AFC4BF2FF801FE01FF81FFE6F8792C7003F01FC -C8001F80050F01F0030114E0776C7F0C1F7F4F04077F8A0C007F4D737E4F717FA2797F4D -737F4F838D8B5F96CB808B8D94B5FC4E848DA25E607A7EA25E60A35E602280A25E4E96B5 -FCA35E60A222004C6260A35E95CCFC676993B5FC5F67A24B655F67A24B655F67695D4D61 -69A25D4D4F5BA2694B98B5FC4D98C7FC66685D4D4E5BA2545B5D94CC485B686692B5634C -4F5BA25490C8FC4A515A4C6265535B4A505B4C62535B535B4A5090C9FC4C4E5A535A525B -4A07075B4C4D5B525B0A7F5B4A96B5CAFC4C040313FC090F5B4A063F13E050B55A4A4903 -0F91CBFC0107B56C92B55A007FBC12F8BD12E099CCFC1BFC1BE098CDFC6C19E0817C74FB -89>I<0303BE12C04B1DE0A58192C76C49C97E050F01F8040314C0F6007F4F171F1F075F -8B4F8321805F8B61A25F210061A294B5FCA296CCFCA24C63A260A25EA24E1801E20FC05C -4C4D7E6560A24C173F536D5A4E96C7FCA24C177F9ACAFC4E5DA25E515A4E1403A24C1607 -F31FFC4E147FF207FF93B9FC64A35D64A24DC7120F4B1601746C5A4D153FA25D645FA25D -645F1F3F4B057F4B7E99C890C7FC5F674B4D5D5114014D611B7C4B94C81203674D180767 -92B5190FA294CC485AA24A641E3F4C197F674A1BFF9CC8FC4C60664A1A031D074C611D0F -4A505A1D3F5E535A4AF101FF525B4C170F1C3F4A96B55A1B034A49043F5C0107B56C030F -B6FC007FBEFCBFC9FCA265A36C647B7B74FA7B>I<4BBEFC4B1D80A35DA28192C7003F91 -C9FC050701FC16070C0014004F173F8B4D858B618B5F68611F015FA261A25FA24F60A294 -B5FCA296CBFCA25E1F034E61A25EF407C04E4B7EA24C171F536D5A4E95C8FCA24C173F65 -601C7F5E9ACAFC4E5D635E515A4E14071B0F4C167F973807FFFC95B7FCA293B9FC64A35D -95C7000F5B4D14001B7F4B173F644D151FA25D645F1B3F5D645FA24B177F99CBFC5FA25D -1B3E4D92CCFCA25DA25FA292B5FCA294D0FCA25CA25EA25CA25EA25CA25EA25CA25EA25C -A25C0103B6FC003FB812FE4883A260B9FCA26CD9FE0F5C797B75FA77>I<4BB5D8F83FB5 -FC4B91B71280A34B1800A26F5F92C7003F02E0C7FC050749C8FC61A261A35F61A35F61A3 -5F61A35F61A394B5FC96C9FCA35E60A35E60A35E60A35E60A35E60A35E60A35E60A393B5 -FC95CAFCA35D5FA35D5FA35D5FA35D5FA35D5FA35D5FA35D5FA392B5FC94CBFCA35C5EA3 -5C5EA35C5EA35C5EA25CA25C0103B512FE003FB812E04883A2B95AA36CD9FE0F5C517C76 -FB46>73 D<4BB5D8F83FB512E04B91B77E5D64A36F6092C7003F02E0C9FC050F49CAFC19 -F8A261A35F61A35F61A35F61A394B5FC96CBFCA35E60A35E60A35E60A35E60A35E60A35E -60A35E60A393B5FC95CCFCA35D5FA35D5FA35D5FA35D5FF501F8F503FC4B1AF85F1D071E -F05D4D170F1EE0A24B191F4D18C0A21D3F92B5198094CB127FA2F5FF005C4C5F651C035C -4C4D5AA21C0F4A4F5A5E1C3F525A4A19FF4C5E515B634A181F4C4C5B98B5FC4A1703080F -5C4A4992B6FC0107B56C140F007FBDC7FCBEFCA264A36C63667C74FB72>76 -D<4BB600FC94B538C3FFFE4B6F4C91B6FC4B62A285A26F706F16FE92C7001FDE00031500 -0507DF007F13F074051F13C04D99C7FC7A5A7460695F746018EF74171F173F06C7628620 -3FEF7FC306836D60A20681197F05FF80060162847516FF4C804D6F94C8FCA2735F040382 -4D628575150316074D6D60871F07040F804D6F5E8575150F161F4D6D60871F1F043F804D -705DA274163F047F834D628676147F04FF8194C86E5DA27416FF4B844C98C9FC86765B15 -034C6F5E8874150315074C715C86F58007150F4C705D1DC01E0F031F834C06E05BA27514 -1F033F19F04C705D1DF81E3F037F834C06FC5BA275147F03FF19FE93CA5E879AB5FC5C4B -7192CAFCA28814034B6288A214074B725BA3020F854B62A2021F85A2023F735B147F4A7E -010386010F01FE6290B612C0007FDBFF8082B87E661D7FA25F6C01C391CB6C5A907C75FB -87>78 D<97380FFFC04FB512FC071FECFFC096B712F0060316FC061F16FF067FD9F00180 -4DB5C7003F13E04D01F802077F050F01E06E7F053F0180020013FE4D48C96C7E932601FF -F8707F4C4982040F01C0707F4C49707F4C90CA6C7F4C4883DCFFF8854B49717F03075B4B -49727E4B5B4B747E4B90CCFC4C1B804B48854A491BC05C4A5B4A49854A491BE0A24A5B4A -1DF093CDFC4A5A5B5D5B495B20F8495BA2495B5BA2495BA290B55AA34891CE5AA2481FF0 -5C5A665C5AA220E0484963A4484998B512C0A4485214805CA2531400A34A505BB5FC6765 -A2535BA2674A626765679AB5FC67A25291C7FC525B7E525B666E6166525B6C6366525B6C -98B5C8FC6E62636C505B515B6E4E5B6C646E4E5B6C505B5190C9FC6C6D4E5A6C6D4D5B50 -13F06D6C050F5B6D6D4C5B505B6D6D4C48CAFC6D6D4B485A6D6D03075B6D01FC4B13E06D -6D033F13806D6C6C6C49B5CBFC6E01E0010713FC6E01FC017F13F0020790B712C002014C -CCFC6E6C15F8031F15C0030102FCCDFCDB001F1380758465FF8C>I<4BBA12FE4BF1FFF0 -4B1AFE787E1FE01FF86F8792C7003F01FCC86C7F050F01F003077F0B0014807813C04F04 -1F13E07813F07813F85F4F7013FCA27813FE5F61A220FF5F96CAFCA394B5FC60A34C6160 -A34C4F13FE60A220FC4C616020F8664C1BF0605413E020C04C614E19809BB51200674C60 -4E4C5B535B535B4C4E5B95CA4813805390C7FC52485A93B504075B4D041F13F099B512C0 -090F5C4B90B948C8FC1DF81DC052C9FC4B18F051CAFC05FCCEFCA25D5FA35D5FA35D5FA3 -5D5FA35D5FA392B5FC94CFFCA35C5EA35C5EA35C5EA35C5EA35C5EA25CA25C0107B512F8 -007FB87EB97EA4606CD9FC3F91CEFC787C74FB7B>I<4BBA12E04B19FF1EF01EFC1EFF1F -C06F1BF092C7001F49C7000180050701F8DA001F7F0B0313FF0B00804F707F8A787F4D72 -7F4F828C8A4D86618CA25F61A34D8696CAFC68A294B55F60A34C4F5B60A2545B5E4E6166 -684C634E5F9BB55A9DC7FC4C4E5B4E60535B535B4C4E5B4E4C13800B7F90C8FC535A4C05 -0313F84E030F5B0A3F13C051B5C9FC4C043F13FC95B812E01D800AF8CAFC93B9FC884DC8 -13FF091F7F4B717F4D03037F757F894B717F4D707EA2894B844D84A35D4D84A35D5FA264 -5D4D60A299B5FC5D94CAFCA26392B5FC4C96C9FCA2635C5EA34A604C60A2201F4AF53F80 -5EA2207F4A1E005E684A651F014A725E0103B500F8505A003FB86C8048714E5A754B5A76 -6C131FB9704A5A769038C0FF806CD9FC1F4A6F90B5C7FCCF000314FC765CE2003F13E00B -031380798075FB85>82 D<DF1FFF15384EB500F0147C060F02FC14FC063F02FFEB01F895 -B7EA80030503EEE0074DD9F003EBF00F051F902780007FF813F04D48C7380FFC1FDD7FF8 -913803FE3FDDFFE00201137F0403496EB512E04C90C97E4C5A4C48824D7013C04C5A167F -4C48824B491880A24B49824B90CAFC1E005D5E151F4C60153F1C03157F4C601C07A215FF -65A35C65A21C0F82765A99C8FC82A282836E808317F8EFFF806F14F018FF19E06F15FCF1 -FFC06F16F86F16FE747E6F836F836F17F86F83163F7082040782040183EE003F050382EF -007F0607811800190F070180737E8686868886A286A386A2EB0F80496C61133F5CA3017F -6291CBFCA2624962A3505B5A99C8FC626348191F6E601A3F63484F5A80505A6E4C5B4860 -6E606E4C90C9FC4F5A486DEE3FFC02FF4C5A01FD6D4B5A01F901E002035BD83FF001F802 -0F5B496CB4023F90CAFC496C9039F001FFFE020F90B65A48486C16F0496C5E007E010016 -80007C021F02FCCBFC48020314F00070DA003F90CCFC668473FF66>I<0107BF1280491E -C0A35BA349912680000791C7000F148003F0C702FC140003801A3F4948C84A150F4A8702 -F04B8349481D004A4D815C485F91C9FC4960000366495EA2484860A24E60485A625B001F -94B51603A24995C95B123F495DA2007F6090C919074D615A4860A25F007C775ACA4A93C8 -FCA25FA261A25FA261A25FA261A25FA261A294B5FCA296CDFCA25EA260A25EA260A25EA2 -60A25EA260A25EA260A25EA260A25EA260A293B5FCA295CEFCA25DA25FA25DA25FA25DA2 -5FA25DA25FA25DA2157F020FB67E001FBA7E4885A35AA26CDAFC0F5D727B60FA82>I<00 -03B500F0B500F892B53887FFFC4891B66C4A91B512FE4862A46C4D6E16FCC76C0280C900 -03ECFE00021F01F8CB6C13E04C061F138054C7FC4C725A664A63A24C61A24A1A1F665EA2 -91B5193F6693CCFCA2491B7F9BC8FC5DA24963655DA2491A01655DA2491A03655DA2491A -07655DA2491A0F655DA2491A1F655DA290B5193F6592CCFCA2481B7F9AC9FC5CA2486364 -5CA2481A01645CA2481A03645CA2481A07645CA2481A0F645CA2481A1F645CA21B3FB562 -91CCFC1B7F99CAFCA26349611A01631A03631A07631A0F505A007F621A3F505A98CBFC00 -3F616D4D5A4F5A6C4E5A4F5A6C6D4C5A4F5A6C6D4C5A4E48CCFC6C6D4B5A6C6DED0FFC6C -6DED3FF86D6CEDFFF06DB402035B6D01C0011F13806DD9FC01B5CDFC6D90B612FC6D5E01 -0016E0023F1580020F02FCCEFC020114F09126001FFECFFC77805CFB87>I<263FFFF0B5 -00F8933A0FFFFC7FFC4890B66C4C90B512FEB85FA46C4C7015FCD8001F02F0CA00011500 -01070280DD003F13F06D49CC6C13C07790C7FC4B626F626666535A666D1B3F6653C8FC65 -651C016F611C0365525A6D1A0F651C1F65525A1C7F9AC9FC705F64515A1B036E611B0764 -515A1B1F641B3F705F51CAFC63636E1701631A0363505A1A0F6370151F63505A1A7F6E95 -CBFC62624F5A1903621907705D4F5A191F626E163F624FCCFC61611801705C1803614E5A -6E150F61181F614E5A187F96CDFC705B604D5A17036E5D1707604D5A171F60173F04FE5B -4DCEFC5F5F6E13FF5FA25F5FA25FA25F5FA26E91CFFCA25E5EA25EA25E5EA25E157F5E93 -D0FC77805AFB87>I<EE07FC93387FFF804BB512E0030780031F9138F807E0923B3FFE07 -FC0FF0923BFFF001FE1FF84A9039C000FF3F4A496D487E020F90C7EA3FFF4A485E4A4880 -4A5A4A48804B5E5B494980495B49604990C8FCA2495A017F605C13FF4A5D4861A2485B60 -4896C7FC5C5A6061485BA2187F48605CA218FF486091C9FCA25F61485AA25F615B1BFC4D -EC01FE19C01BFCA2494B1403078013F8A2127F4D14074D15F019005F003F93B5EB0FE06D -5C001F191F4C16C04C5B6C6CDA0FEFEC3F800007ED1FCF6D91263F87FFEB7F006CEDFF07 -6C6D48486C14FE6C9026C007FC140190287FF03FF801EB83FC6DB5486CEBFFF86D02C06D -5B010791C76C5B010101FC020F13809026003FE0DA01FEC7FC4F526DCF5D>97 -D<ED1FE049B57E90B6FC5AA25EA37ED9007F5B140FA35EA25CA293C9FCA25CA25DA2147F -A25DA214FFA25DA25BA25DA25BA25DA25BA25DA25BA25DEE07FC4991383FFFC093B512F0 -030380030F804990391FFC0FFE92393FE003FF9127FEFF8001138091B5C713C04901FCEC -7FE04B15F04B143F4B15F890B55A4BEC1FFC92C8FC4A16FE5A5C5C19FF485BA25CA25AA2 -5C605AA25CA2485FA291C9FCA24894B5FC19FE5BA25F007F18FC5BA25F19F8485AA24D13 -F0A219E0495D19C0A24D1380A219005F60007F4C5AA24D5A604C5B003F5D606D4A5B001F -4B90C7FC4C5A000F5E6D4A5A00074B5A6C6C49485A6C6C4913806CD9800F90C8FC90397F -E07FFE6DB512F86D14E06D1480010349C9FC9038007FE040806CFD54>I<EF7FF80407B5 -FC043F14C093B612F0030381030F9038E01FFC033F90380003FEDB7FFCEB00FFDBFFF0EC -7F80020301C0143F4A4915C04A90C8127F4A48EC01FF4A484A13E04A485C4A485C49495C -5B49494A13C0495B5B92C81480495A017F7013004A5E01FF705A48EF03F04A92C8FC5A5C -5AA2485BA3485BA35A5CA35A91CCFCA45B12FFA45BA4127FA21903F10780F10FC0F11FE0 -003FF03FC0197F6D1880001F943801FF004E5A000F4D5A6D4C5A6CEF3FF06C6D4B5A4D48 -5A6C6D02075B6C6DDA1FFEC7FC6D6CEC7FFCD93FFC903803FFF06DB4017F13C0010790B6 -C8FC6D15FC010015E0023F91C9FC020313E043526DCF54>I<F33FC00703B512E04EB6FC -60A21CC0A38495C714801A1FA31C00A262A263A21A7FA263A21AFFA263A261A263A261A2 -63A261A263A261A263A261A298C7FCEE07FC93397FFF803F4BB512E0030702F05B031F14 -F8923A3FFE07FC7F9239FFF001FE4A9026C000FF5B4A49137F020F90C7EA3FFF4A5A4A48 -6E5B4A5A4A48805D4960494980495B5B4990C85CA2495A137F4A5F13FF4A5D5A62485B60 -5A4A94C8FC5A60A248495EA2187F5A4A5EA218FF5A91C95BA25FA248485FA25FA2495F1B -FC4D4A7EA207C05BA2494B1403631980127F4D14074D5D19005F003F93B5495A6D5C001F -191F4C5E4C5B6C6CDA0FEF4A5A0007ED1FCF6D91263F87FF49C7FC6CEDFF076C6D48486C -14FE6C9026C007FC140190287FF03FF801EB83FC6DB5486CEBFFF86D02C06D5B010791C7 -6C5B010101FC020F13809026003FE0DA01FEC8FC53806DFD5D>I<EFFFE0041F13FE93B6 -7E030381030F81033F9038C07FF0923AFFFE000FF84A01F06D7E020701C06D7E4A491301 -4A48C87E4A5AECFFF8494916804949157F495B495B19FF4990C91300495A137F49485D61 -484915036148491507484D5AF03FF048494B5A4D485A050F5B484991B5C7FC041F13FC02 -C7B65A4890B712C095C8FC17F04CC9FC4801FCCBFC91CCFCA45B12FFA45BA8127FA21906 -190FF11F80003FF03FC0F17F8019FF001F19006DEE03FE000F4D5A4E5A6C6C4C5AF07FE0 -6C4D5A6C6D02035B6E020F90C7FC6CEE3FFCD97FF0ECFFF86D6C010713E06DB490B51280 -6D90B548C8FC010315F8010015C0023F49C9FC020713C042526CCF54>I<F21FE0F2FFFC -070313FF4F1480071F14C096393FF87FE096397FE00FF0DFFFC013F84E143F4EEB807FF3 -FFFC4E130162604F4813F8181FA2063F15F019FC7413E0067F15C07413809738007E004F -90C7FC18FFA44D5BA45F61A45F61A45FA261A45F96C9FC031FB812C04B83A56F5F92C7D8 -3FFEC9FC177F60A417FF60A45E60A55E60A45E60A45E60A45E95CAFCA45E5FA4167FA25F -A416FF5FA45D5FA35DA25FA35D5FA45D5FA44B90CBFCA35E153FA35EA2157F5EA3D801F8 -495AEA07FC487E486C5C481381485DA25EB5FC4A90CCFCA201FE5B49485A13F86C48485A -9038C01FF0003F5C391FF07FC06CB55A6C91CDFC6C5B6C13F838003FE056A584FF38>I< -EF03FF051F13E094B57E040314FC040F9138FE01F84C903903FF03FC933B7FFC007F87FE -DCFFF0EB3F8F4B01C090381FDFFF0307496DB5FC4B90C714FE4B48804B5A4B48804B5A1B -FC4A49804A5B5C4A4916F8854A90C85A5C4B17F0147F4A485DA24919E05D495FA24B17C0 -5B615B4B1780A2615B4B1700A2615B4B5EA2197FA292C95BA24917FFA2625C60A2013F60 -A260A26260011F5EA24E5B010F5E606E92B5FC6D4B5C5F6D6D5B6D5D6F013F91C7FC6D6D -EB7FDF6E6C48485A913A3FFC0FFE3F6EB500FC5B020714F06EECE07F02001400DB1FF85C -92C8FC18FFA261A25FA261A25FA261A25F61EA01F8D807FC5D486C5F486C5D4895C8FC48 -4C5A177FB55E4D5A4C5B494A5B4C5B494A5B49023F90C9FC6C48ECFFFC003F02035B271F -FF801F13E06C90B65A6C4BCAFC000115F86C6C14C0010301FCCBFC507576CF54>I<EE1F -80EE3FE0EEFFF05D4B13F8A25DA417F017E017C06F13806F1300ED007C93C7FCB3A6EC1F -F0EC7FFC49B5FC4980010F8090391FF07FE090383FC03F02007F017E8013FE485A5B0003 -81485A157F485AA2485A4B5AA2485A5C007F5D13005C5E485B485DA2007C5BC75CA25C93 -C7FC5C5DA2147F5DA214FF5DA25B5D5B5DA25B5DA25B92388001F849EC03FC150017F85B -4A130717F0137F5CEE0FE013FF4A131F17C0A24AEB3F80A2EE7F00A216FE4A5B017F1301 -4B5A6E485A013F495A011FEB7FC06DB55A6D91C7FC6D5B6D13F89038003FC02E7A71F738 ->105 D<EE3FC00203B57E49B6FC5BA25FA37F90C75C151FA394CAFCA25DA25EA3157F5E -A315FF5EA35C5EA35C5EA35C5EA35C5EA35C93CBFCF103FE96381FFF804A047F13C04B4A -B512E04E14F0953807FE07027F92391FF003F84B91383FC00F95387F003F06FEEB7FFC02 -FFDA01F813FF4B49485A4D485AEF0FC0494B484813F84BEB3F00177E4D15F0495D4B4848 -6D13E04C4815C04C486D138049020F9138007E004B484891C7FC4CCAFC167E495CED81F8 -ED87F0ED8FE049EBBFC04B5A03FECBFC5D5BEDFFE016FCEEFF804915E0DAFC7F13F80307 -7F03017F01FF6D6C7E4A011F7F707F707F48814A81828448815CF207E0F20FF05A4A18E0 -A24C151F481AC04A5DA21A3F481A8091C75C1A7F1B005A4918FEA262007F6F1401496019 -03057F495A00FF614992383FF01F716C485A71B55A496F91C7FC6C486F5B6C48030013F8 -6CCAEA3FE04E8073FD54>107 D<ED01FE021FB5FC010FB6FC5BA216FEA37FD9000713FC -1400A316F8A25CA216F0A25CA216E0A25CA216C0A25CA21680A25CA21600A25CA25DA214 -7FA25DA214FFA25DA25BA25DA25BA25DA25BA25DA25BA25DA25BA292C7FCA25BA25CA213 -7FA25CA213FFA25CA25AA25CA25AA25CA25AA25CA25AA25CA25AA291C8FCED07E048EC0F -F0A24914E0A2007F141F16C05BA2153F00FF15805BA2ED7F00A25D5D6C5A4A5AA26C6C48 -5AA2001F495A140F6C6C485A6CB55A6C5C6C91C7FC38007FFCEB0FF0288070FD2F>I<49 -B4922601FFC0ED07FF010701C0021F01F8037F13E04901F091B500FE0203B512F8496D01 -036E6C010F14FE496D496F498090267F87FE011F01016D90267FFC077F9026FE03FF9028 -3FF0007FF09026FFC0017FD801FC9126807FC06D6C4890C77F6E4AC79026FC03FC81D803 -F8DAC1FE021F4948147F0007DBC3F89226FE0FE08101F0DAE7F04C5ADCEFE04C5AD80FE0 -DAFFC06F48C87F4D6E01FE153F121F01C092C85C4A495F123F01804A4B49157F4C5F5C00 -7F4B5F13004C5F4849494B90C912FF48684C5EA2007C49057F5EC76793C95BA24A05FF5E -694B5FA2027F4C5F694B5F6702FF4C61A24B4D5D9EC8FC495F674B4D5EA2494D177F684B -5F0DFFEC0FC0494D4EEB1FE0A24B94C84816C068494D4C153F5614804B5E54157F49057F -4E1400A292C9496154495B4917FF575A4A5F56485A017F4C637814074A4D4E5A6A01FF4C -1A1F784A5A4A4D6F02FFC7FCF883FE78EBFFFC4A4D705B6D486F497013E06D486F90CA00 -0F5B6DCA007CDD03FEC8FC8B5271CF95>I<49B4923803FF80010701C0023F13F84901F0 -91B512FE496D010380496D010F8190267F87FE90261FFE037F9026FE03FF90263FF0007F -00016D902680FFC06D7E01FC02C190C77FD803F8DAC3FE143FDCC7F881D807F0ECEFF0EE -FFE0D80FE04B6E7E5F121F01C092C8FC4A5B003F5D0180183F5E5C007F5D01005CA24A49 -157F4862485DA2007C4917FFC76193C9FCA24A5E635DA2027F5E635D6102FF60A24B5D63 -5B614B94C8FCA2495F625D077FEC07E0494EEB0FF0A24B03FF15E062494C151F5014C05D -4E153F494E1480A292C8EE7F004E5B5B1CFE5C50485A017F627214034A4E5A6401FF190F -724A5A4A6FEC7F80E0C1FFC7FC73B45A4A705B6D487013F06D48040713C06DCA000190C8 -FC5C5271CF66>I<EF7FF80407B5FC043F14E093B67E030315FC030F9038E03FFE033F90 -380007FFDB7FFC01017FDBFFF06D7F020301C06E7E4A49814A90C86C7E4A48824A48151F -4A48824A48150F494982495B5B494917805B92C97E495A017F19C05C01FF5F5A5C5A5C5A -A2485B61A2485BA261481A805CA261481A0091CAFCA296B5FC625B00FF6160A262495E62 -6062007F6160624E90C7FCA24E5A003F4D5A6118FF6C6C4B5B61000F4C5B6D4B5B6C4C90 -C8FC6C6D4A5AEF7FF86C6D4A5A6C6D495B6D6C01075BD93FFC011F90C9FC6DB448B45A01 -0790B512F86D15E0010092CAFC023F13FC020313804A526DCF5D>I<DB0FF8EDFFC0DB3F -FE020713F84B6C6C011F13FE92B56C017F7F4A6E90B612C0912803FC3FF00101C17F913E -07F01FF807FE003FF0020F90270FFC0FF86D7E03E0DA1FE080DA1FC06D4848130F4E4880 -DA3F8090B5C76C7E60DA7F004A16804E804A5D4A4B16C05E01015E4A4B16E0A24C90C8FC -13034A5CA2167F13074A5C636D4813FF90C8FC5FA24B5FA25FA24B5F1DC05FA24B5F1D80 -5FA24B5F1D005FA24B4D5AA294C95B624B60A24C4B5BA2037F60624C5F505B15FF5090C7 -FC6370153F4A60505A505A704A5B4A6071495B4F90C8FC71495A4A4C5ADCEFE0EB7FF893 -3AC7F801FFE09326C3FE075B4A01C1B6C9FC04C05C4C6C13F8051F13C04ADA07FECAFC94 -CCFC93CDFCA25CA25DA2147FA25DA214FFA25DA25BA25DA25BA25DA25BA2013F13F8003F -B7FC4882A294CCFCB8FCA26C010F5B5B737ECF5D>I<DC07FE140793263FFF80EB0F804B -B500E0133F03076EEB7F00031F02FC5B923A3FFE07FE019226FFF8005B4A01E090387F07 -FE4A0180EB3F8F4A90C7EA1FDF4A4815FF4A486E5B4A5A4A48804A5A4960494980495B5B -92C85C5B494881017F5E4A5F13FFA248495D62485BA2485F4A5F5AA260484994C7FCA348 -5F4A5EA348177F91C95BA318FF48485FA35F495FA35F61A3495D61127F5F5F61003F5E6D -5D94B5FC001F4B91C8FCA26C6C5C5E00074B5B6D143F6CED7FBF6C90398001FF7F6C9026 -C007FE5B90397FF03FFC6DB512F06DECE0FF010702805B0101495A9038003FF091C75A60 -A35E60A35E60A35E60A35E95C9FCA35E5FA2167F16FF03076D7E023FB712F04A82A261A3 -6E01F05C49736DCF54>I<49B4ED1FF8010701C049B57E4901F0010714E0496D4914F849 -6D013F8090267F87FE90397FF01FFE9026FE03FF9039FF8003FF48486CD981FEC7FCDC83 -FC01031380D803F8DAC7F05B0007DBCFE05B01F0DAFFC04913C061D80FE05D94C7481380 -001F5D13C04A491600003F5D0180715A4C5D4A705A007F4BEC07E0010094C8FC5E5C12FE -5EA2007C5BC7FC93CBFCA25CA25DA2147FA25DA214FFA25DA25BA25DA25BA25DA25BA25D -A25BA25DA25BA292CCFCA25BA25CA2137FA25CA213FFA25CA35C6D5A6D5A6DCDFC4A5271 -CF4D>I<EE0FFF93B512E0030314F8030F14FE033F8092267FFC031380923AFFE0007FC0 -4A0180EB1FE04A48C7EA0FF04A4814074A4815F84A48140318074A48EC1FFC027F153F4B -147F02FF15FFA2494B13F85DA219F05B6F6D13E0F07FC0F03F006F91C7FC8115FC15FF16 -F8EEFF8017F06D15FC17FF846D826E816E81846E8114076E811400033F801501ED001F16 -031600053F138083A2012081D803FC1700486C81487E487F5A485FA34D5AB5C8FCA2494B -5A5B495E6C484B5A90C9127F6D5E4D5A6C6C4A90C7FC001F4B5A01F0EC0FFC6C6C4A5AD8 -07FEECFFF02703FFE00F5B6C90B612806C6C4AC8FC011F14F8010714C09026007FFCC9FC -3E5272CF4A>I<167CED01FE4B7E4B7F5DA45D94C7FCA35D5EA3157F5EA315FF5EA35C5E -A35C5EA35C5EA3003FB812C04817E0A2B9FC18C0A26C1780C7001F90C8FC5C5DA3147F5D -A314FF5DA35B5DA35B5DA35B5DA35B5DA35B92C9FCA35B5CA3137F5CA313FF5C173FEF7F -805A4A15005F5F5A4A495AA21603485E4A13075F4C5AA24C5A4A495A7E4CC7FC16FE4B5A -6C6D485A6C4A5AED1FE090397FE07FC06DB55A6D91C8FC6D13FC010313F09038007FC033 -7470F13C>I<EC0FF0EC7FFE49B5EE01F0496EED07F8496E4B7E90270FF87FE04B7E9027 -1FC03FF0153FD93F807F90387F001F01FE187F48486E5E153F485A484818FF63485A157F -001F60496115FF48485C61007F496001005CA24A5E484B5E5A5C007C4B5CC748605EA24A -5E93C891C7FCA25C4B5D62147F5D197F02FF5F5DA219FF49605DA26049605D1C7E4E15FF -62494918FEA24E140108C013FCA31B034E15F81A80A24EEC07F07F4E140F4E15E01A006D -93B5131F6F4916C06DDB03FBEB803F6FD907F31580027FDA1FE1EC7F006E6CD97FC15C91 -281FFF03FF80EBC1FE6E903BFFFE007FFFFC6E4A6D5B020102F06D5B6E6C01C0010713C0 -DB0FFEC890C7FC585271CF62>I<DA0FF016F8DA7FFEED03FE49B54B7E496E4A1380496E -5C90270FF87FE04A13C090391FC03FF0D93F807F90387F001F13FE484880153F48488348 -488385485A037F81121F498315FF48485C731380007F5B01005CA25C484B16005A5C007C -5DC7485F5EA24A160193C85BA25C4B150362147F5D190702FF5F5DA24F5A5B5D4F5AA25B -4B4B5AA34FC7FC495B197E19FEA24E5AA2611803616D16074E5A61181F616D6D4AC8FC60 -6D16FE6F495A6E6C495A023F4A5ADA1FFEEB1FE06E6C6CB45A6E90B55A6E4AC9FC02005C -033F13F0030313804A5271CF54>I<DB0FFC4AB4FC92267FFF80010F13E04AB56C4913F8 -4A02F0017F13FE020F6E90B6FC91281FF81FFC0101031380913E3FE007FE03FC007FC091 -297F8003FF07F0133F9126FE0001D98FE0EBFFE0494892389FC001494803FF5B49486D4A -4813F049484C5A131F4A4B4913E0495A017F5E91C817C05B494C6D138000011B00494A6F -5A4EEB01F8000396C8FC5B5E00075F5BA26C485CC95CA35E60A35E95CAFCA35E5FA3167F -5FA316FF5FA21BFC4B4C7EA24D5DA24B160363D801F85DD807FC4E5A486C5B486C180F48 -62484A161F4D5DB54E5A4B167F7192C7FC494916FE4F5A49D97F7F14034901FE6D495A6C -48023F4A5A9028C003FC1FF8EB3FE0003F49486C6CEBFFC02A1FF81FF007FF0390C8FC6C -B5486CEBFFFE6C4A6C5C6C91C714F0C649023F13C0D91FF0DA07FEC9FC545276CF54> -120 D<EC1FE0ECFFFC496DEE01F001076DEE07F8496EED0FFC90271FF07FC0ED1FFED93F -C06D153FD97F007F01FE133F49187F00016F16FC4848137FA2484818FF1BF8485A15FF48 -485F1BF05CD83F805C61007F4918E001005CA24A5E484B16C05A5C007C4B5CC748188093 -C8FCA24A5E4B1700A2147F4B5D6214FF5D197F49605DA219FF49605DA26049605DA26062 -495BA26062A36062A3606D4C90C7FCA26095B5FC6D6D495BA26D15076F5B6D6D495B6E6C -137F913A3FFE03FF7F6EB5EAFEFF02074A5B6E14F0020014C092380FFE0192C75CA34D5B -A34D5B130801FF4B5B487F00076D4A90C8FC487F4D5A485F177F6048494A5A605E4A495B -91C7485B4993C9FC01F84A5AD81FC04A5A4C5A6D4A5A6C6C49485A6C6C010713806D011F -90CAFC3A03FF80FFFC6C90B55A6C6C14E06D1480010F01FCCBFC010113C04F7571CF58> -I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fh cmcsc10 10.95 2 -/Fh 2 81 df<B60003B612C092B7FCA6D800070380CCFC010002F8CDFC6E5B6E5BB3B3B3 -AC1EFCA41D011EF8A71D03A21EF0A21D07A41D0FA31D1F1EE01D3FA21D7F1DFFA2646464 -645213C01C7F51B5FC1B074A181F91B56C93B6FC01076E151FBFFCA21E80A5667C75FB7C ->76 D<BC7E1BFCF3FFC01CF81CFE767E1DE0D8000702F0C8000F14F801004ADB007F13FE -6E49040F7F6E060380090014E00A3F7F767F767F767F888A761480881FC01FE0891FF0A3 -7713F8A31FFCAA1FF8A45313F0A21FE0A29AB512C0A21F805214006466525B525B525B0A -7F5B99B55A090391C7FC090F5B097F13F8080FB55A93BA12C09AC8FC1CF81CC009FCC9FC -1B8004E0CEFCB3B3AA4A7F91B57E010714FFB912FCA615076E7C74FB87>80 -D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fi cmr10 10.95 68 -/Fi 68 123 df<942603FFF0ED7FE0057FD9FF80903807FFFC0407B600E0013F13FF041F -03F890B612C093B76C4815E003039127003FFF079038E07FF04B01F00103018F9038003F -F8031F01809027007FDFFC137F4B48C8B548EBFFFCDBFFF84A4A5A4A494A4A4813FE4A01 -C04A14C04A4917804A90C85A4A4818005D023F604A487313FC7713F84A486F49EC7FF0F6 -3FE049496FEE1FC07393C7FC735B4949167FB3A8BF12C0A7D8000301E0C9D87FFCC9FCB3 -B3B3A7496D4C7E87013F01FE030714E0B8D8801FB8FCA602C1EFF83F6F807CFF6A>11 -D<943801FFF0057F13FF0403B612C0041F15F0047F15FC4BB538003FFE030701F0EB03FF -031F018001007F4B48C8EA3FC0DB7FF86F7E4A48484B7E4A01C015FF4A494A7F4A90C85A -4A485D874A485D4A5AA24A5AA2495B735BA249496F5B735B735B083FC8FC97C9FCB3A2F2 -01FCF13FFFBCFCA7D8000301E0C8120F19031900A21A7FB3B3B3A3496D4C7EA2013F01FE -0307EBFFC0B8D8801FB712F0A602C1EFF83F5C807CFF65>I<943803FFFC057FEBFFE004 -07B6EAF81C041FEDFFFC93B8FC0303EC000F4B01F01300031F01805B4B48C75ADBFFF85C -4A5B4A13C04A5B4A90C85A4A48815D143F4A5A854A4881854949167FA3495BB3A8BCFCA7 -D8000301E0C9127FB3B3B3A7496D4C7EA2013F01FE0307EBFFC0B8D8801FB712F0A602C1 -EFF83F5C807CFF65>I[<EA01F8EA07FE381FFF804813C0A24813E0B512F0AA6C13E0AC6C -13C0AC6C1380AC6C1300AC6C5AAB6C5AAC6C5AA6120090C7FCB0EA01F8EA07FE487E4813 -804813C04813E0A2B512F0A66C13E0A26C13C06C13806C13006C5AEA01F8>20 -130 113 257 51 33 D<D803F8157FD807FEEDFFC0D81FFF02037F486D497F6E81486D49 -7F6E81B55CA26E81A46C6D6D1480A26C81A26C812607FE7C010013CFD803FCED7F8FC7ED -000FA502FC151FA24A1600A301015E4A153EA30103167E4A157C010716FC4A5D010F1501 -A249484A5AA249C8485A013E5E017E150F494B5A48484BC7FCA24848157E48485D48484A -5A48484A5A90C85B001E5E000C6F5A39377AFD5B>I[<EE01C0EE03E0160FEE1FC0EE3F80 -EE7F0016FE4B5A4B5A4B5A150F4B5A4B5A4B5AA24BC7FC4A5A14034A5A5D140F4A5AA24A -5A4A5AA24A5AA24990C8FC5B5C1307A2495AA2495AA2133F5CA2137F5C13FFA25C5AA25C -5AA34890C9FCA4485AA4121F5BA3123FA45BA2127FA85B12FFB3A8127F7FA8123FA27FA4 -121FA37F120FA46C7EA46C7FA37E80A27E80A2137F80133FA280131FA26D7EA26D7EA213 -03807F6D7FA26E7EA26E7E6E7EA26E7E1407816E7E14016E7E6F7EA26F7E6F7E6F7E1507 -6F7E6F7E6F7E167FEE3F80EE1FC0EE0FE01603EE01C0>43 182 111 -263 71 40 D[<127012F812FE127F6C7E6C7E6C7E6C7E6C7E6C7E7F6C7E6D7E6D7EA26D -7E6D7E806D7E1303806D7EA26D7F6E7EA26E7EA26E7E81140F81A26E7EA26E7EA28280A2 -828082A2157F82A2153F82A36F7EA46F7EA48281A31780A481A217C0A88117E0B3A817C0 -5DA81780A25DA41700A35D5EA44B5AA44B5AA35E157FA25E15FFA25E5C5EA25C93C7FCA2 -4A5AA24A5AA25D141F5D4A5AA24A5AA24A5A4990C8FCA2495A5C1307495A5C495A495AA2 -495A49C9FC485A5B485A485A485A485A485A48CAFC12FE12F81270>43 -182 118 263 71 I<EA03F8EA07FEEA1FFF48138014C04813E014F0B5FCA214F8A46C13 -FCA27EA27E3807FE7CEA03FCC7FCA514FCA214F8A3130114F0A3130314E0130714C0130F -A2EB1F80A2EB3F00133E137E5B485AA2485A485A485A485A90C7FC121E120C1637719333 ->44 D<B9FCAC300C7EAC3D>I<EA01F8EA07FE487E4813804813C04813E0A2B512F0A66C -13E0A26C13C06C13806C13006C5AEA01F81414719333>I[<1AF0F101F8F103FCA21907A2 -1AF8190FA21AF0191FA21AE0193FA21AC0197FA2F1FF80A21A0060A2611803A2611807A2 -61180FA24E5AA261183FA261187FA26118FFA24D90C7FCA2601703A2601707A260170FA2 -60171FA24D5AA260177FA26017FFA295C8FC5EA25F1603A24C5AA25F160FA25F161FA25F -163FA25F167FA24C5AA294C9FC5DA25E1503A25E1507A24B5AA25E151FA25E153FA25E15 -7FA25E15FFA24A90CAFCA25D1403A25D1407A25D140FA25D141FA24A5AA25D147FA25D14 -FFA292CBFC5BA25C1303A2495AA25C130FA25C131FA25C133FA2495AA25C13FFA291CCFC -5AA25B1203A25B1207A2485AA25B121FA25B123FA25B127FA25B12FFA290CDFCA2127E12 -3C>70 181 118 263 91 I<16F04B7E15031507151F153F15FF1403141F91B5FC130F00 -07B6FCB7FCA214FD14E1140113F0EAF800C7FCB3B3B3B3B3A24A7F4A7F027FEBFFE0007F -B912F0A6EDE07F3C796FF85B>49 D<92381FFF804AB512FC0207ECFF80023F15E04A15F8 -49B712FE4982010FD9C01F14C090271FFE000180D93FF86D6C7FD97FE0021F7FD9FF8002 -077F4890C86C7F496F7F48486F1480484818C04982000F7113E0484818F04982003F19F8 -49821AFCEA7FF801FE826D6C17FE80B5FC6E816E17FFA86C5B6C5BA26C5BD807FEC9FCD8 -01F818FECBFC60A21AFCA2601AF8A24E13F0A24E13E0A24E13C01A8095B5FC1A004D5B61 -4D5B4D5BA24D5B4D5B614D90C7FC4D5A4D5A604C5B4C13C04C5B4C90C8FC5F4C5A4C5A4C -5A4C5A4B13804B90C9FC4B5A5E4B5A4B5A4B5A4B5A4B48153F4A90C9FC4A5A4A48167E5D -4A5A4A5A4A5A4A5A4ACA12FE494817FCEB03F8495A4A1601495A495A49CAEA03F8017E17 -1F90BAFC5A5A5A5A1AF05A5A5ABBFCA31AE0A3487977F85B>I<923803FFF0033FEBFF80 -4AB612F0020F15FC4A15FF027F16C0494848C66C13F04901E0010F7F4990C700037FD90F -FC6E7FD91FF06E6C7ED93FC08349486F7F91C96C7F01FE84485AD9FFE06F7F487F6E836E -81487F6E83A48192C8FCA37E5C6C495F6C5B6D485DEB1FE090CA5CA24E5BA2626062A24E -5B97C7FC4E5A614D5B4D5B4D5B4D5B4D5BDD7FFEC8FC933803FFFC4BB512F092B612C04A -92C9FC8418F06E15FE92C76C6C7E051F7F050713F005017F7113FE727E727F727F86727F -86727F868486A2721480A21BC0A21BE084A31BF0A2EA01FCEA07FF487F487F487F487FA2 -B57EA21BE0A3601BC05CA26C4918804A5D4A18006C90C9FC01FC4C5BEA1FE04E5B6C6C60 -6C6C4C5B6D606C6C4C5B6C6C6C4B5B6C01E092B5C7FCD97FF84A5BD93FFE02075B90260F -FFC0011F5B6D01FE017F13E0010190B75A6D6C93C8FC021F15FC020715F0DA007F91C9FC -030313F04C7D79F85B>I<19FC8518011803A21807180FA2181F183FA2187F18FFA25F5F -A25F5FA25F5F187F177E17FE17FCEE01F8160317F0EE07E0160F17C0EE1F80163F170016 -7E16FE5E4B5A15035E4B5A150F5E4B5A153F93C7FC157E15FE5D4A5A14035D4A5A140F5D -4A5A143F92C8FC147E14FE5C495A13035C495A130F5C495A133F91C9FC137E13FE5B485A -12035B485A120F5B485A123F90CAFC127E12FEBDFCA7CB49C7FCB3A34D7F4D80051F14E0 -0303B9FCA6F0F83F507B7BFA5B>I<0170170701FCEF1F80D9FF80167F02F0ED07FF02FF -033F130003F890380FFFFE92B7FC6161616161614EC7FC606018E018804DC8FC17F86E14 -C0020701FCC9FC91CCFCB3A5923801FFE0031F13FE037FEBFFC04AB612F0020781021F90 -38007FFEDA3FF0EB0FFFDA7FC06D13C04AC700017F02FC6E7F4A6F7E02E0824A6F7E4A15 -1F8591C96C13805B1AC0017C7013E090CAFC1AF0841AF8A31AFCA2841AFEA51AFFA4EA03 -F8EA0FFE487E487F487FA2B57EA31AFEA44A5D1AFC5C6C90C9FC4918F801F85E90CA14F0 -7E6D18E0606C6C18C0606C6C18806D4C13000007606C6C167F6D4C5A6C6C4B5B6C6C4B5B -D97FC04A5B6D6C4A5BD91FF8023F90C7FC6DB4ECFFFE6DD9F00F5B010190B612F06D5E02 -3F1580020F02FCC8FC020314E09126003FFEC9FC487D77F85B>I<EF3FFC0407B512C004 -3F14F093B612FC030381030F814BD9F0077F037F90C77FDBFFFCEC3FE04A01F0EC0FF04A -01C06E7E4A4914034A48C8EA1FFC4A48157F4A4815FF4A485C02FF4B7F495B49495C495B -A24990C8FC5B5C013F705B495A725B49486F5B735A48F01F804A93C8FC5AA25A5CA25AA2 -5C5AA35A5E93387FFF800303B512F048D9800F14FC4B14FF4B819226FF800713E0DA81FE -C77FDA83F86E7EDA87F0EC1FFCB501C06E7E028F6F7EDA9F808292C86C7F02BE6F7F02FE -834A6F7FA24A707E865C737EA24A1880A21BC0A24A821BE0A56C1AF05CA87EA280A37EA2 -1BE0A27EA36C6D4C13C0A36C1A80A26C6D1800616C6180017F4D5A626D6C4B5B6D7E4E5B -6D6C5F6D6D4A5B6D4C90C7FC6D01E04A5A6D6D4A5A6E6CECFFF8DA3FFE01035B91271FFF -C01F5B6E90B61280020393C8FC020015FC033F14F0030F1480030001F8C9FC4C7D79F85B ->I<EA03F0A27F487E13FF14FC91BA12FCA35AA31BF8A21BF01BE0481AC0A21B801B00A2 -01F8CAEA01FE01C04D5A003F614917074F5A90CB485A62193F484E5A007E96C7FC614E5A -4E5A611807484D5A61181FCB485A4E5A96C8FC604D5A6017034D5A4D5AA24D5A4D5AA24D -5AA24DC9FC5E5F16035F1607160F5F161FA24C5AA2167F5F16FFA25D5FA25DA25D5FA25D -A25DA294CAFC5DA45DA392B5FCA35EA25CA55CA75CAE6E5BA26E5B6E5B6F5AED1F804E7F -76FA5B>I<EEFFF8030FEBFF80037F14F04AB612FC020715FF021F16C04AD9803F7F9127 -7FF8000313F8902601FFE001007F490180EC3FFE4948C8EA0FFF49486F7F4A6F7F494881 -49486F7F017F844A167F01FF844A163F4885191F4890CAFC86190FA25AA380A380191F6E -5F80A26C6D4C5A8002FF4C5A816C02E04B5A6F5E6C02FC5C6F4A5B6D6D6C4990C7FC04E0 -5C6D6E495A6D02FC495A70EB7FF06D6E6C485A6D03C113806D03F790C8FC6DEDFFFC6D5E -023F15E06E5D6E81020315F8020015FE6F8019C04AB77E020716F84A8291263FF87F8091 -267FE03F80902701FFC00F8149496C81902707FE00018149486D814948023F804948020F -8049486E80494814014870804849153F4890C96C1480180748487014C0484816007313E0 -003F8449838548487113F085A285485A85A31A7FA41BE0A27F127F1BC01AFF7F003F1A80 -6D5F001F1A006D5F000F616C6C4D5A6E160F6C6D4C5A6C6D5F6C6DEE7FE06D6C4C5AD93F -FE03035B6D6C4B90C7FC6D01C0EC3FFE6D01F8ECFFF801019026FF801F5B6D91B65A023F -1680020F4BC8FC020115F0DA003F1480030101F8C9FC4C7D79F85B>I<EEFFF8031F13FF -037F14E00203B612F84A15FE021F814AD9C01F7F91277FFE000713E0902601FFF001017F -49496D6C7E4901806E7E4990C86C7E49160F49486F7E4948834A6F7F13FF48496F7F5A4A -6F7F48855A4A167F4885A24885A2193F484983A31B80A2B5FCA21BC0A385A21BE0A84F13 -F07EA57E6E5EA27EA26C95B5FCA26C7F607E6C6D5DA26C6D5D017F17DF6D6CED0F9F6D6C -151F010FEE3F1F6D6C153E6D6D02FE14E06D01E0EB01FC6D6DEB07F8DA7FFEEB1FF0021F -B612C06E158002031500020002FC15C0031F01E05BDB0008C7FC93C8FCA21B80A31B0061 -A262A34F5AA2D91F805FD97FE05D496C5F487F486D4B5BA2486D4B5B626097C7FC4E5AA2 -4A4B5A4E5A6C495E4A4B5A4A4A5B6C01804A5B01FCC84890C8FC6C6CED1FFE6D6C4A5A6D -6CECFFF8D93FF801035B90271FFF801F5B6D90B612806D4BC9FC01015D6D6C14E0020F14 -80020001F8CAFC4C7D79F85B>I<EA01F8EA07FE487E4813804813C04813E0A2B512F0A6 -6C13E0A26C13C06C13806C13006C5AEA01F8C8FCB3B3A2EA01F8EA07FE487E4813804813 -C04813E0A2B512F0A66C13E0A26C13C06C13806C13006C5AEA01F8144E71CD33>I<EA01 -F8EA07FE487E4813804813C04813E0A2B512F0A66C13E0A26C13C06C13806C13006C5AEA -01F8C8FCB3B3A2EA03F8EA07FEEA1FFF48138014C05A14E0B5FC14F0A414F87EA27EA27E -EA07FEEA03FCC7FCA6130114F0A4130314E0A2130714C0A2130F1480131F14005B133E13 -7E5BA2485A485AA2485A485A485A90C7FC121E120C157171CD33>I<003FC012FE488BC2 -1280A46C20006C67D5FCB3AA003FC012FE488BC21280A46C20006C67792C76C28E>61 -D[<F13F804F7EA34F7EA34E7FA34E7FA34E7FA34E7FA34E7FA34E80A24E80A28506FF80 -A24E7E05018118FC8505038118F8850507814E7EA2050F814E7EA2051F814E7EA2053F82 -4E7EA2057F8295C77EA24D824D80A20401834D80A20403834D80A20407834D80A2040F83 -4D80A2041F834D80A2043F844D80A2047F8494C97E4C84A24C82030185A24C82030385A2 -4C824BBA7EA34B85A34B8504C0C91201A2033F864C82A2037F8693CB7EA24B864B84A202 -01874B84A20203874B84A20207874B84A2020F874B84A2021F8788143F027F88884A6C87 -01037F496D4E80013F01FF0607800003B600E0053F14FEB8047FB812E0A6020F1B83> -123 130 122 257 136 65 D<BC7E1BFCF3FFC01CF81CFE767E89D8000702F0C8000314 -F001004ADB007F7F6E49041F13FE6E06077F758075807580767F767F888A767FA2767FA2 -881F80A37614C0AA521480A31F00646664666466525B525B99B55A515C5191C7FC515B51 -13F8093F5B98B512C0080391C8FC083F13FC93B912F01C80A21CF81CFF04C0C96C13C009 -0F13F809037F090013FF767F7613E0767F767F767F767F8A7614807614C0A27713E01FF0 -A27713F8A37713FCA31FFEA58965A51FFCA2651FF8A2651FF09AB5FC1FE0645214C01F80 -64521400525B525B99B55A515C4A06075C91B56C043F5C01076E4BB6C7FCBE5A1DF81DE0 -1D800AFCC8FC1CE009FCC9FC6F7C79FB81>I<BC7E1BFCF3FF801CF01CFC1CFF1DC0D800 -0702F0C8001F14F001004A030014FC6E49041F7F6E06077F090114C0756C7F0A1F7F767F -767F0A017F767F777F777F777FA2777F777F8B89777FA2777F8C8A8CA2787FA3787FA28C -A28A8CA38C8AA38CA72180A68AA466A62100A668A36668A4686668A26668A2545BA2689B -B5FC9DC7FC535BA2535B535BA2535B535B535B535B9AB5FC5291C8FC525B525B0A1F5B52 -13E099B55A09035C4A061F49C9FC91B56C93B55A01076E031F14F0BE5A1D8052CAFC1CF0 -1CC009FCCBFC1B80797C79FB8B>68 D<BF12FCA48AA3D8000702F8C9121F01004AEE007F -6E49170F6E1901F4007F1D3F777E89898989A289A2F67F80A31E3FA31E1FA21FC0A21E0F -A4F203F0A3F607E0A49BC7FCA21A07A41A0FA21A1FA21A3F1AFF1903193F93B8FCA704E0 -C7123F190319001A3F1A1FA21A0FA21A07A40803163FA31F7EA697CAFC1FFCA41E01A31F -F81E03A41E07A2F60FF0A21E1FA21E3FA21E7FF6FFE0656565651D3F9AB5FC4A070314C0 -91B56C173F01076E040FB6FCC0FCA41F80A3707B7AFA7C>I<BF12F0A48AA3D8000702F8 -C9123F01004A16006E49171F6E19071C0188777E1D3F1D1F1D0F1D07A21D03A2777EA21D -00A41E7EA21E7FA28AA6F207E0F61F80A49BC7FCA51A0FA31A1FA21A3FA21A7FF101FF19 -07197F93B8FCA704E0C77E19071901F1007F1A3FA21A1FA21A0FA31A07AA97CBFCB3A94A -7F91B57E0107ECFF80BA12C0A61503697B7AFA77>I<B60007B500F80103B5D8FC1FB512 -E092B694B7FCA6D8000792CA001F02FCC7FC010002F8050314E06E49715C6E49715CB3B3 -AA93BCFCA704E0CBFCB3B3AF4A6D4D8091B56C4D80010702FF051F14FCB900F80103B912 -E0A60307F1FC1F7B7C7AFB88>72 D<B60083B512FE92B6FCA6D80003ED8000D9007F01FC -C7FC6E5B6E5BB3B3B3B3B3AE4A7F4A7F0103B67EB912FEA61583377C7BFB42>I<B60003 -B612C092B7FCA6D800070380CCFC010002F8CDFC6E5B6E5BB3B3B3ACF503F0A41D071EE0 -A71D0FA21EC0A21D1FA41D3FA31D7F1E801DFFA26464A26464646452130051B5FC631B0F -4A187F91B56C0303B6FC01076E157FBFFCA265A5647C7AFB72>76 -D<B700F00907B7FC7063A27063A27063A2D80007F9E00001006E097D91C7FC6E67DA3FBF -6D08F95BA3039F6DF101F1A3038F6DF103E1A203876DF107C1A303836DF10F81A203816D -F11F01A303806D193EA3706C197CA2706D18F8A3706DEF01F0A3706DEF03E0A2706DEF07 -C0A3706DEF0F80A2706DEF1F00A3706D173EA3716C5FA2716D5EA3716D4B5AA2716D4B5A -A3716D4B5AA3716D4B5AA2716D4BC7FCA3716D153EA2726C5DA3726D5CA3726D495AA272 -6D495AA3726D495AA3726D495AA2726D49C8FCA3726D133EA2736C5BA3736D5AA373EBC1 -F0A273EBE3E0A373EBF7C0A273EBFF80A37391C9FCA34A6C6F5BA24A6C705A497F010701 -FC527F011F01FF70484C7F48B600F0093F14E0B800F06E48020FB9FCA3745AA302E07148 -EFF07F987C79FBA7>I<B700E094B500E0B512E07096B6FCA28282A282C76E0501EDF000 -023FDF001F91C7FC71050713FC71050113F0775B71725A8303BF745A039F7F83158F0387 -7F831583038180841580707F8482707F8482707F848270808582717F8583717F8583717F -858371808683727F8684727F8684727F868472808784737F8785737F8785737F87857380 -8885747F8886747F8886747F88867414801DC0867513E01DF0877513F81DFC877513FE1D -FF877514BF1EFF8788A28888A28888A28888A28889A24A6C85894A7E496D85010701FC85 -011F13FF48B600F084B800E083A2891E7FA21E3F02E075C8FC7B7C7AFB88>I<BB12FEF2 -FFF01BFEF3FFC01CF81CFE88D8000702F0C8003F14C001004A0303806E49DB007F13F86E -061F7F09077F09017F7580767F767F8A88767F8AA2767FA28AA2761480A41FC0AB1F80A3 -1F0064A266A2525B666466525B666499B55A090391C7FC5113FC091F5B097F5B0803B512 -C0083F5C93B948C8FC1CF81CE099C9FC1BF050CAFC04E0CEFCB3B3AA4A7F91B57E010714 -FFB912FCA615076A7C79FB7C>80 D<922607FFC0EC01C0037F01FEEC03E00203B600C013 -07020F15F0023F03FC130F91B8131F4949C66C13804901E00103EBE03F4901800100EBF0 -7FD91FFEC8EA1FF84948923807FCFFD97FF06FB5FC4A150001FF83484982484982488491 -CAFC48488385121F4983003F84A25B007F197FA21A3FA212FF1A1FA31A0F7FA37F1A07A2 -7FA26C7F6EEF03C097C7FC806C7F14FC806C6D7E15E06C14FCEDFFC06C15FC6CEDFFE017 -FE6CEEFFE06C17FC6DEEFF806D17E06D17F86D17FE6D836D18C06D846D6C836E83020F83 -020383DA007F821507DB007F1680040716C0EE007F050715E0DD007F14F01807060114F8 -727E857313FC85857313FEA285851BFF00788512FCA286A4867EA56C1AFEA37FF23FFC7F -A26D19F81A7F7F1BF06D18FF6D19E06D4D13C06D5F6E188002E04C13006E5E02FC4C5A02 -FF4C5A01E701C0EDFFF801C101F84A5B01C001FF020F5B496C01FC017F5BD9001F90B7C7 -FC6E5E48010316F848D9007F5D030F15C04802014AC8FC0070DA000713E0508476FF65> -83 D<001FC012E0A74802C0C76C01FCC7000F14F002F8C86C49EC007F02C06F49150F4A -1B0349C9844988491D7F491D3F491D1FA2491D0FA2491D07A2007F1FF890CA1903A5007E -1E01A800FE1FFC481E00A6CB1A00B3B3B3B14E7F4E7F050FB612E0037FBA12FCA6190176 -7B7AFA83>I<B60007B500F892B500E0B512E092B695B6FCA6D8000792CA0001EDF00001 -0002F8DD001F91C7FC6E49060713FC6E49060113F0775B785AA2785AB3B3B3B3A31E7F6E -99C8FCA282A26E6366A36E6D4E5AA26E1A03706180535A6E6D180F666F6C181F6F627117 -3F6F4F5A6F6D4DC9FC6F6D5E6F6D4C5A6F6D4C5A6F6D4C5A706CEE3FF0706C6C4B5A706D -4A485A7001F802075B7001FE023F90CAFC0401903AFFE007FFFC7091B65A053F16E0050F -5E050393CBFCDD007F14FC060F14E09526007FFCCCFC7B807AFB88>I<B5D8F07FB56C90 -271FFFFC1FB500F0020FB53887FFF091B793B795B5FCA6D8001F92C9000303E0C9003FEC -FC00010302F0DC007F49CA000714C06D4A7101F8050191C7FC6D4A796C5A7649725A7872 -5A6E7363A16D5A70856E7363A270201F6E75618870203F6E7596C8FC8870686E4F6E177E -A27020FE6E4F6E5FA2701F016E4F6E5FA2836E4F6E4C5A1D9FA271043F6E16076F070F61 -A271047F6E160F6FDE7E0761A27173161F6F4E6C61A2711E3F6F05016F94C9FC527E7166 -6F050370157E527E711EFE6F0507705D527F711D016F050F705D527F846F051F704A5A52 -7FA272023F7014077094C76C5FA2724A70140F70047E6E5FA27273141F704C6E5FA2721C -3F7003017192CAFC5180726470030372137E5180721CFE700307725B5181721B0170030F -06E05B5181198070031F72485A5181A2DFC03FF0F8077192C96C5DA27348F0FC0F71027E -705DA207F0F1FE1F714A705DA207F81A3F7101F907FF90CBFC508207FD627101FF1AFE50 -82A271645083A271645083A271645083A37290CB6C5BA37248725BA37248725BA3060F98 -CCFC4F84A20607624F18007248197CB4807DFBBB>87 D<271FFFFE0FB500F8021FB53883 -FFFE91B795B5FCA6D8000193C800014BC7FCD9001F02F8DB003F14E06E02E07091C8FC6E -4A7013F86E4A705B6E6E7013C06E6E609BC9FC6F6D5F715F6F4E5A6F6D160F715F6F4E5A -6F6D163F725E6F4E5A6F6E15FF9ACAFC6F6E5C706D4A5A64706D1407706D4A5A64706D14 -1F706D4A5A64706E137F706E495A99CBFC706E5A716D485A6371EBF80707FC5B714A5A71 -EBFE1F07FF5B714A5A7114FF637192CCFC8362725B8462727F727FA2727F7280A2728087 -A24E804E80A24E804E8019EFDE3FC77F187F078380DEFF01805F4E6C804D486D7F17074E -6D7F4D486D7F171F4E6D7F4D486D7F177F4E6D804DC76C805E4D6E804C48830407824D6F -7F4C4883041F824D6F7F4C5A047F707F4D6F804CC9FC4B71804C70804B5A0307727F4C71 -7F4B5A031F727F4C717F4B5A037F727F76804B5A4A6D71800207884A85023F6D8691B56C -4D80010702FC050714FE90B76C047FECFFC0B800F0030FB812FEA602C1F3F83F7F7C7CFB -88>I[<B612E0A890C8FCB3B3B3B3B3B3B3B3B3A390B512E0A8>27 -181 108 263 51 91 D<02C01518496C153C0103167C010716FC49484A5A49484A5A49C8 -485A017E4B5AA2494B5A48484BC7FC49153E0003167E48485DA248484A5AA2495D001F15 -0390C85B481507003E5EA3007E150F007C5EA300FC151FA24893C8FCA501FFED1FE000F9 -6D4A7EB500E0ECFFFC6E81A26E81A26C6D6D1480A46C81A24A16006C816C496D5B6C816C -496E5A6C0180EC3FF06C6CC8EA0FE0393765FD5B>I[<B612E0A8C7121FB3B3B3B3B3B3B3 -B3B3A3B6FCA8>27 181 125 263 51 I<92B5FC021F14F091B612FE01036F7E010F16E0 -49D9C00713F8D97FF8C77FD9FFC0EC3FFE6E6E6C7E486D6E7F486D6E7F6E8048707F6E6E -7F85187F85A2727E6C5BA26C496F7F6C5B6D5AEB1F8090CAFCA84CB6FC93B7FC150F157F -0203B8FC021FECE01F027FEBFC0049B512E0010791C7FC4913F84913E0017F5B90B5C8FC -485B4813F85A5C485B485BA2485BA24890C9ED0FC0A3B5FC5BA260A4607F6C94B5FCA26E -5C6CDC03F79038C01F806E15E36C16076C6DDA1FC39038E03F006C6DDA3F816D5A6C01FC -DAFF01EBFFFE6C01FF902603FE005C6C6C9026E01FFC6D5B6D90B500F06D5B010F4B6D5B -0103038001071380D9007F49C7D801FCC7FC020301E091C9FC525379D05B>97 -D<EC0FE048B5FCB6FCA7C67E131F1307A27FB3AF943803FFC0053F13FC4CB67E040715E0 -041F15F893267FFC0113FE933AFFC0003FFF03E190C7000F13C0DBE3FC02037FDBE7F002 -007FDBEFE06F7EDBFFC06F7E93C96C7E874B707F4B707F5D747F4B8486888688A2881B7F -88A31D80A287A31DC0AE1D80A263A21D00A3641BFFA264A2505BA2505B6F60626F60505B -6F95C7FC6F4C5A505ADBDF804B5ADB8FC04B5ADB07F04A5B6F6C02075B9126FE01FE021F -5B6F6C6CD97FFEC8FC4A903A7FF807FFFC4A6DB612F0040F15C04A010392C9FC90C914F8 -050F90CAFC5A807CFD65>I<EE7FFF030FB512FC033FECFF804AB712E0020716F84A8202 -3FD9E0007F4A90C7EA07FFDAFFFC4A13804901F04A13C049495C495B49494A13E04990C8 -FC495A495A13FF485BA248496F13C0487113804A6F130048715A725A484992C8FCA3485B -A35AA391CCFCA2B5FCAE7E80A47E80A27E1AF06C6DEE01F8A26C6D16031AF06C7F19076C -6D17E06C180F6D6C17C06E161F6D6DED3F806D6DED7F006D6D15FE6D6D14016D01FC4A5A -6D6DEC0FF89027007FFFC0EB3FF06E9039F803FFE0020F90B612806E93C7FC020115FC6E -6C14F0030F14809226007FF8C8FC45537AD051>I<F207F096B5FC187FA7F0003F190F19 -03A285B3AFEE3FFC0307B512C0033F14F092B612FC020315FF020FD9F80713C14A903980 -007FE1DA7FFEC7EA1FF1DAFFF8EC07F94901E0EC01FD49496EB5FC4949814990C97E4948 -82494882137F49488248845C5A485BA2485BA25AA25C5AA35AA291CAFCA2B5FCAE7EA380 -A27EA37E807EA27E807E6E5E7E6C6D5E616D6C5E6D7E011F4D7F6D6C93B5FC6D6D4A14FE -6D6DDA07FB6D7E6D01F0DA0FF3ECFFC06D01FCEC3FE3DA3FFF903801FF836ED9E00F1303 -020790B512FC020115F86E6C14E0030F0200EDE000030001F002F8C8FC5A807AFD65>I< -923801FFF0031F13FF037F14E00203B612F84A15FE021F9038C07FFF91277FFE000F13C0 -DAFFF801037F4901E001007F49496E7E49496E7E4990C86C7E495A49486F7E017F701380 -495A4A6F13C05A484917E0844819F05C48831AF85A5C5AA2197F4819FC91CAFCA4BBFCA4 -1AF891CCFCA97EA280A37EA36C7FA26C19786E17FCA26C18016C6D17F8A26C6D16036C19 -F06E16076D6CEE0FE0013F18C06D6C161F6D6DED3F806D01E0ED7F006D6D15FE6D01FCEC -03FC6D01FFEC0FF86E01C0EB3FF0021F9039FC01FFE06E90B65A020393C7FC020015FC03 -3F14F0030714C09226003FFCC8FC46537BD051>I<933803FF80043F13F093B512FC0303 -80030FECFF80033F010113C092267FF80013E04B485A4AD9C00313F04A495A4A494813F8 -4A5A141F5D4A5A147F5D02FF6E13F07113E049496D13C0711380F07F0095C7FC495BB3A9 -B9FCA7D8000301E0C9FCB3B3B3A7497F81013F13FFB812F8A614C13D807BFF38>I<F20F -F8F27FFE922607FF800103B5FC037F01F8010F14800203B65B020F923AC03FF87FC0023F -923AF0FFC0FFE04A9238F9FE019126FFFE01EBFFFC499026F0003F13F0010701C0010F13 -E049496D13C04990C76C6D6C13C04A6EED7F8049486E6DEB3F0049486F6C131E01FF7190 -C7FCA248496F7EA24884A24A81A24885AA6C96C8FCA26E5DA26C60A26C6D4B5AA2017F5F -6D6C4B5A6D6C4A5B6E5C6D6D495B6D6D495B4901F0D93FFEC9FC499039FE01FFFC92B65A -D93F3F5D020F15C0D97E0392CAFCDA007F13F80307138001FE90CDFCA67FA280A28014F0 -EB7FFC91B712F0F0FFC06D17FCF1FF806D18E06D846D18FC6D846D84010785011F85017F -85D9FFFCC8001F804801E0030080480180161F4890CA00037F484817004848187F484872 -7E1A1F485A747EA2485A86A66D60007F62A26D181F6C6C4E5A001F626D187F6C6C4E5A6C -01C004035B6C6D4C5B6C01F8041F5B6C01FE047F90C7FC6D6C6C4A485A011F01F8021F13 -F801079026FF8001B512E06D91B75A010095C8FC021F16F8020316C0DA007F4AC9FC0301 -148053787BD15B>I<EC0FE048B5FCB6FCA7C67E131F1307A27FB3AF943801FFF0050F13 -FF057F14E04CB67E4C15FC040F01017F933A1FF0003FFFDC3FC0010F7F4CC78004FE80DB -E1F86E7FDBE3F082EDE7E04C8003EF83EDFF8093C8FC854B83A25DA35DA45DB3B3A7496D -4B7FA2013F01FF030FEBFFC0B8D8C03FB712F0A602E1EFF87F5C7E7BFD65>I<EB01F8EB -07FE497E497F497F497FA290B57EA66D5BA26D5B6D5B6D90C7FC6D5AEB01F890C9FCB3A5 -EC0FE048B5FC127FA7C67E130F7FA27FB3B3B3A35B81013F13FCB8FCA614C3287B7BFA32 ->I<163FEEFFC04B13E04B13F04B13F84B13FCA24B13FEA66F13FCA26F13F86F13F06F13 -E06F13C0EE3F0093C7FCB3A517FEED3FFF021FB5FCA7EC000F150181167FA2163FB3B3B3 -B3A7EA07F8487E486C15FC486C147F487FB57E17F8A2EEFFF0A217E05D028014C06C4A13 -80020014006C48495A6C48495A6C48495A6CB46CB45A6C90B55A6C5D6C6C91C7FC011F13 -F8010113C02FA089FA38>I<EC0FE048B5FCB6FCA7C67E131F1307A27FB3B1953A7FFFFC -3FF097B5FCA6060FECFE007214C07291C7FC1AF81AE06297C8FC4E5AF00FF84E5A4E5A4E -5A4E5A4D90C9FCEF03FC4D5AEF1FF04D5A4D5A4D5A4C48CAFC16031607EE1FFF4C7F5E93 -B57E03E18003E380EDEFFBDBFFF37F04E17F16C04C6C7EDBFE007F4B6D7F4B7F4B814B6D -7F83717F85717F8385727E84727F8684727F86727F84727F86737EA2737F8787496D834F -13FC013F01FE92B61280B8D8800F15FFA602C1EFFE1F587E7CFD60>I<EC0FE048B5FCB6 -FCA7C67E131F1307A27FB3B3B3B3B3AD497FA2013F13FEB81280A614C1297E7BFD32>I< -DA0FE0DAFFF8EE1FFF48B5020FD9FF804AB512F0B6023F02E0020714FC94B600F8021F14 -FF040303FE027F15C0040F01006D902701FFE01F7FDC1FF8011F6D48D900037FDC3FC06D -9026C007F86D7F4CC76C9026E00FE06D7FC603FE6E4A48147F011FD9E1F86E6D48C86C7E -0107D9E3F0DCF87E82DBE7E05F4C6E4A816D01EF05FD84DBFF80EEFFF093C95C74834B4E -83A24B60A34B95C9FCA44B5FB3B3A7496D93B54C7FA2013F01FF030702E092B512FCB8D8 -C01FB7D8F803B8FCA602E1DDFC3F178790507BCF99>I<DA0FE0903801FFF048B5020F13 -FFB6027F14E04CB67E4C15FC040F01017F933A1FF0003FFFDC3FC0010F7F4CC780C66C02 -FE80011FD9E1F86E7F0107D9E3F082EDE7E06D4A8003EF83EDFF8093C8FC854B83A25DA3 -5DA45DB3B3A7496D4B7FA2013F01FF030FEBFFC0B8D8C03FB712F0A602E1EFF87F5C507B -CF65>I<EE3FFC0307B512E0031F14F892B7FC020316C0020FD9E00713F04A90C77FDA7F -FCEC3FFEDAFFF0EC0FFF4901C002037F49496E7F4990C97F4948707E4948707E4948707E -017F844948707EA24849701380481AC04A82481AE0A248497013F0A2481AF8A3481AFC91 -CBFCA2481AFEA5B519FFAD6C1AFEA46C6D4C13FCA46C1AF8A26C6D4C13F0A26C1AE06E5E -6C1AC06E5E6C1A806C6D4C1300017F606E163F6D6C4C5A6D6C4C5A6D6D4A5B6D6D4A5B6D -01F0020F5B6D6D4A5B6D6CB4DAFFFEC7FC6ED9E0075B020F90B612F0020316C0020093C8 -FC033F14FC030714E09226003FFCC9FC50537BD05B>I<DA0FE0903801FFE048B5023F13 -FEB691B612C0040715F0041F15FC4C819326FFFC016D7E03E19026C0003F7F03E390C700 -0F7FC66CD9E7FC6E7F011FD9EFF06E7F0107D9FFE002007F04806F7E6D91C97F4B707F4B -707F884B824B707F888688A2747FA28688A3751380A57513C0AE511380A41D0098B5FCA2 -64A262646264A2505B646F5E6F4C5B646F4C90C7FC6F4C5A505A705E7002035BDBF7F04A -5BDBF3F84A5BDBF1FE023F5B9226F0FF80D9FFFEC8FC93267FF8075B70B612F0040F15C0 -040392C9FC040014F8050F90CAFC94CCFCB3A5497FA2013F13FFB812C0A614E15A737CCF -65>I<DC7FF8EC01F00307B51403033F14E04AB612F84A6F1307020F15FF023FD9F807EB -800F4AD9C00013C091B5C7383FE01F010301FCEC0FF04949EC07F84901E0913801FC3F49 -4914004949EDFE7F197F4990C9EA3FFF495A48498285485B5A4A825A4A825AA2485B85A2 -5C5AA4B5CAFCAE6C7FA57E80A27E807E616C7F616C7F616C7F6C606E5E137F6D6C5E6D6D -92B5FC6D6D5C6D6DEC03FB6D6DEC07F36D6DEC1FE36D01FEEC7FC3913B3FFF8001FF836E -9039E01FFE03020790B512FC020115F06E6C14C0030F1400030013F093C8FCB3A54F7FA2 -073F13FF95B812C0A61AE15A737ACF60>I<DA0FC0EB3FE048B5903801FFFCB6010713FF -041F14804C14E0DC7FE013F0EEFF019226C1FC0313F8EDC3F8C66C9026C7F00713FC011F -14E00107EBCFC016806D13DF160003FF6D13F85D7113F04B6D13E0F03F8095C7FC5DA45D -A55DB3B3A4497F81013F13FFB812F0A614C13E507CCF47>I<912607FFF0131C027F01FF -133E0103B6EAC07E010FEDF1FE903A3FFE003FFBD97FE0EB03FF2601FF8013004848C812 -3FD807F8151F000F160F49150748481503123F1701485A1700A312FF187E7FA27FA27F6D -163C01FF93C7FC6C13C014F014FE6CEBFFF0EDFF806C15FC6CEDFF8017F06C826C16FE6C -826C17C0013F826D820107820101826D7E020781DA003F801501DB000F14801601706C13 -C0830078160F00FC7013E083837E83A36C177FA37F19C07FA26D16FF19807F4D13007F6D -4B5A6D5E6D15076EEC1FF802E04A5AD9CFF849B45A902787FF801F1380010390B6C7FC48 -C615FC486D14F048010F14800070010101F8C8FC3B537AD048>I<EC01F8A81403A61407 -A3140FA3141FA3143FA2147F14FFA25B5B5B5B5B137F48B812FC120FB9FCA5D8000101F8 -C9FCB3B3A2F01F80B0183F6D6D1500A3606E6C147EA2023F5D816E6D485A6E14039338E0 -07F06E9038F81FE06E90B55A02005D6F91C7FC031F5B030713F89238007FE039727DEF47 ->I<DA07F0EE01FC48B5EE7FFFB6033FB5FCA7C66CEE001F011F170701071701A26D83B3 -B3A761A461A3617FA2616F5D6D187F073F7F027F167E6F037C6D7E023FDB01FC14E06E6C -DA03F8ECFFF06E6CEC07F06E01C0EB3FE06E9039FC01FFC06E90B612006E6C5C031F14F8 -030702E0EDF800DB003F90C790C8FC5C527BCF65>I<B5260FFFFE913A3FFF8FFF8091B5 -94B5FCA6D8003F02800207ECF000010F01FCC8000191C7FC6D499238007FFC6D61745A6D -616F5F7F6F5FA2027F95C8FC6F5E6E177E821AFE6E5F7014016E5FA27014036E5F701407 -6E5FA270140F6E5F70141FA26E5F70143F037F93C9FC82616F157E7113FE6F5DA2EFC001 -6F5DEFE0036F5DA2EFF0076F5DEFF80F6F5DA2EFFC1F6F5DEFFE3FA2047F91CAFC715A70 -137E18FEA2705BA2705BA3705BA2705BA3705BA2705BA371CBFC173E59507DCD60>I<2B -FFFE1FFFFC0FFFC7B5903A0FFFF8FFF090B692B692B5FCA6C66C91C7000F02800100ECFE -00011F01F8020349C8001F13F06D496E496F13C06D70496F5B7890C7FC6D057F5F741501 -6F636D053F5F741503816D716C5E616F1A07027F725D4F160F6E6C63877091B5151F6E64 -877049173F6E04F994C8FC877001035F6E04F0167E8770010717FE6EDCE07F5D8770010F -16016E4C6C6C5C181F70DA801F14036E725C063F16076F6C4A6C5D1C807049160F6F027E -6D5D1CC0DD80FE161F6F4A6D5D1CE005C1173F6F4A6D92C9FC1CF005E35F6F4A6D147E1C -F805F717FE6F4A6E6C5A17FF4EEC3FFD6FF0FFF8A26F4A6E5BA37090C86C5BA370486F5B -A370486F5BA370486F90CAFCA370486F5A7048167C7C507DCD83>I<287FFF87FFFE903A -03FFFE3FFF91B593B6FCA6D8000F02F001001580010102C0023F01F8C7FC6D4A16C06E70 -90C8FC6E5F6E6D15F86E5F705D6E6D4A5A6E6D5D6E4CC9FC705C6E6D495A6F6C5C6F4A5A -EF80076F6D485A6F6D485A616F6D485A6FEBF87F6F6D48CAFC606FEBFFFC82705B60705B -82707FA2707F707F845E4C7F854C805EDC3FCF7F05877FDC7F037F16FF4B486C7F4C6C7F -4B486D7E15074B486D7F4B486D7F4C7F4B4881037F6E7F4BC76C7F4B804A488202036F7F -4A486F7E020F82021F84027F707F02FF8401036D83011F4D7F48B692B6FCB700C00107ED -FFE0A6D9FC7FEFFE1F5B4E7ECD60>I<B5260FFFFE913A3FFF8FFF8091B594B5FCA6D800 -3F02800207ECE000010F01FCC8000191C7FC6D7113FC6D49705A6D725A6F5F636D618102 -7F95C8FC81626E177E7015FE6E5F8219016E5F7014036E5F8219076E5F70140F6E5F8219 -1F6E5F70143F037F93C9FC82616F157E7113FE6F5DEFC001A26F5DEFE0036F5DEFF007A2 -6F5DEFF80F6F5DEFFC1FA26F5DEFFE3F047F91CAFC715AA270137E18FE705BA3705BA270 -5BA3705BA2705BA3705BA271CBFCA3177E17FE5F1601A25F16035F1607A25F160FD803F8 -5DD80FFE141F487E486D5C163F486D91CCFC5E167E16FE4B5A5EEC80036C4A5A4A485A49 -131F6C48495A01F0495A000F4948CDFC3907FC07FE6CB55A6C14F06C5C013F90CEFCEB07 -F859737DCD60>I<000FBA12C01AE0A492C8003F13C002E04B1380028092B512004848C9 -FC494B5B494B5B494B5BA2494B5B4D5B494B5BA24D5B4992B5C7FCA24C5B4C5B4C5B123F -90C8485B4C5B4C5BA24C5B93B5C8FCC8485BA24B5B4B5BA24B5B4B5B4B5BA24B5B92B5C9 -FC4A5BA24A49EC03F04A5B5C5E4A5B4A4914071AE04A5B91B5C8FC495BA2495B4949150F -495BA2495B4949151F1AC0495B90B5C9123F485B197F484916FF48495D48495D60484915 -1F4849157F4849020FB5FC91B91280BBFCA47E444E7BCD51>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fj cmbx10 10.95 55 -/Fj 55 122 df<0603B5FC0503B612F0057F15FC0407B8FC043F17C093B97E030384030F -84033F9126FE001F7F92B600C001017F4A4AC86C7E020702F04AB5FC4A02C04A804A4A5C -4A49C848804A5B4C5D91B5488449605E5B5EA25B5EA2745CA2745C7491C7FCA2745B0800 -13F8F33FE098C9FCAA98381FFFF0073FB6FCBEFCAAD8000702C0C8120386B3B3B3A6007F -B700FE013FB8FCA9DAF83FEFFE0F687F7BFE74>12 D[<EF1F80EF3FC017FF5E4C138004 -0F13004C5A4C5A4C5A4C5A4B5B4B5B5D4B5B4B90C7FC4B5A157F5E4B5A5C4A5B4A5BA24A -5B5C5E5C4A90C8FC5D14FFA2495B5B5D5B5D5BA2495BA25B5DA25B5D90B5FCA24891C9FC -A35A5CA25AA25CA25AA3485BA55AA25CA35AA75CA2B5FCB3A57EA280A77EA380A27EA56C -7FA37EA280A27EA2807EA36C80A27F817FA2817FA26D7FA27F817F817F6D7FA2147F816E -7F8082806E7FA26E7F6E7F806F7E82153F6F7E6F7F6F7F816F7F6F7F707E707E707E707E -040313807013C082173FEF1F80>50 181 109 263 81 40 D[<127EB4FC13C07F6C7EEA -3FFC6C7E6C7E6C7F6C7F6C7F6C7F806D7E6D7E6D7E817F6D7F816D7F6D7FA26D7F81147F -816E7F8082A26E7F8280828082A26E7FA28280A2838183A26F7FA38381A283A281A283A3 -6F7FA583A281A31880A781A218C0B3A51880A25DA71800A35DA25FA54B5BA35FA25DA25F -A25D5FA34B5BA25F92B5FC94C7FCA25C5EA24A5BA25E5C5E5C5E4A5BA25E5C4A90C8FC5D -14FF5D495BA2495B495B5D495B5B92C9FC495A495A495A5C485B485B485B4890CAFC485A -485AEA7FF0485A5B90CBFC127E>50 181 117 263 81 I[<EE0FC0EE3FF04C7E4C7E4B7F -A24B7FA2815FA56F5B01C0180CD807F8F07F80486CF0FFC0486C4D13E0486C4D13F04801 -C06D48010F13F86E5E6E5EB500FC93B512FC6E5D6E5D9239C03FF00F6C02E04A14F803F0 -5C6C02FC91B612F06C02FE01F115E06C02FF01F315C00001DB9FE7ECFE00D8003F91B712 -F001071880010005FCC7FC021F16E002071680020003FCC8FC031F14E0030391C9FC031F -14E092B612FC0207EDFF80021F16E091B812FC0107EFFF80013F18F048B6D89FE714FE00 -0F4B6CECFFC04802FE01F115E04802FC01F015F04802F0023F14F803E080B600C06E14FC -9239007FF8034A814A816C01F0043F13F84A824A826C90C7486C010313F06C487113E06C -487113C06C48F07F80D800C0F00C0090C893C7FC4B7FA5835DA26F5BA26F5B705A705AEE -0FC0>78 81 115 263 105 I<1A1F507E507E507EB3B3B3A7001FC212FE488D482280C4 -12C0A56C22806C22006C69CD01E0CDFCB3B3B3A7745A745A74CEFC8A8B74F2A3>I<EB3F -C0EBFFF800037F4813FF4814804814C05A15E04814F0A2B612F8A315FCA415FEA27EA27E -A27E7E7E7EC613F9EB3FE1EB000315FCA4140715F8A2140FA215F0141FA2EC3FE0A2EC7F -C0A2ECFF805B15005B495A495A131F5C495AEBFFE05A485B485B91C7FC6C5A5B6C5AEA00 -E01F40729C3A>I<B912FEB337137EB146>I<EB1FC0EBFFF8000313FE487F4814804814C0 -4814E0A24814F0A3B612F8A76C14F0A36C14E0A26C14C06C14806C14006C5BC613F8EB1F -C01D1D729C3A>I[<1BF8F201FCF203FE1BFF62A262A2F21FFEA21BFC1A3FA2F27FF8A21B -F01AFFA24F13E0A21BC061A24F1380A24F1300A262191FA24F5AA262197FA24F5AA26260 -A24E5BA26260A24E90C7FCA261181FA24E5AA261187FA24E5AA24D5BA2615FA24D5BA296 -C8FC5FA24D5AA260173FA24D5AA26017FFA24C5BA2605EA24C5BA295C9FC5EA24C5AA24C -5AA25F167FA24C5AA25F5DA24B5BA25F5DA24B90CAFCA25E151FA24B5AA25E157FA24B5A -A25E5CA24A5BA25E5CA24A90CBFCA24A5AA25D143FA24A5AA25D14FFA2495BA25D5BA249 -5BA292CCFC5BA2495AA25C133FA2495AA25C13FFA2485BA2485BA25C5AA24890CDFCA25B -121FA2485AA25B127FA2485AA25BA25B127F6C5A6CCEFC>80 181 -116 263 105 I<173FEFFF804C7F16075E163F4BB5FC1507153F0203B6FC147F48B8FCB9 -FCA615DFECFC1F148048C7FCC8FCB3B3B3B3AF003FBB12E0A9EEE03F4B7771F669>49 -D<4BB5FC033F14F80203B77E021F16F0027F16FC49B97E010718E0011F844918FC498490 -B5D8F003814891C7003F15C04801FC0207814801F06E814801C014004801F06F8002FC6F -80486D6F806E81486E6E80846F1880B6816F18C0841CE085A31CF085A26C5CA26C5CA26C -91C9FC6C5B6C5B000113F038003F8090CB4814E0A496B612C0A21C80601C00606363604E -5C634E5C634E5C4E91C7FC95B55A624D5C4D5C4D14C04D5C97C8FC4D13FC4D5B4D5B94B5 -12C04C5C4C91C9FC4C13FC4C5B4C13E04C5B4C49EC3FF04C48C8FC4B5B4B49ED7FE04B5B -4B13C04B5B4B90C9FC4B5ADBFFF816FF4A4917C04A5B4A13804A90C95A4A5A4A485EEC7F -F04A48043F13804990BAFC5B5B5B5B5B491A0090BCFC5A5A5A5A5A48625ABCFCA563A454 -7776F669>I<93387FFFC0030FB6FC037F15F00203B712FE020F707E023F17E04A17F849 -B912FE49DAC00F804901FCC7814901E0023F804901806E804990C86C80D97FFC6F806E84 -90B56C8003E08348806F834883811C804880A481A25DA36C4D15005D7E5D6C626D495C6D -495F010F1380D903FEC8485C90CAFC4E5C634E5C634E91C7FC95B55A4D5C4D5C050F5C05 -3F14C0041FB65A031FB648C8FC4B15F819E096C9FCA219F019FF6F16C092C7000F14F005 -0114FC716C13FF72807214E07280728072808772801C80A27215C01CE0A21CF0851CF8EB -0F80EBFFF8487F000701FF19FC488048804880A24880A3B67EA31CF8A496B612F05D6C1B -E0A24B18C06C4A5C1C806C4A5C4AC816006C494B5C02F05D6C6D606C01FE033F5C6C6D6C -4A5C6C02F049B65A6D9026FF800F15806D91B8C7FC010F18FC0103606D18E06D6C178002 -0F04FCC8FC020116E0DA003F4AC9FC03001480567977F669>I<F2FF804F7F4F7F616161 -A2616196B5FCA260606060A260606095B6FCA25F5F5FA25F5F5F5F18F7EFFFE74C13C74C -13875E1807EE0FFEEE1FFCEE3FF8167F17F0EEFFE04B13C05D17804B13004B5A4B5A153F -5E4B5A4B5A4A5B5C5E4A90C7FC4A5A4A5AA24A5A4A5A4A5A5B5D495B4990C8FC495A131F -5C495A495A495A5A5C485B4890C9FC5A5B485A485A485A12FF90BD12F0AACB001F02E0C7 -FCB34BBA12F0A9F1F03F5C787AF769>I<943803FFF8057FEBFF800407B612F0043F15FC -93B77E0303707E030F83033F8392B6D8C01F7F4A9126FC00037F020702E013004A0280EC -3FFC4A49C8127F4A494A487E4A49140791B5484A7F494A5C495C494A4A14804991C8FC61 -495B5B5D5B90B55AA25A731400485C735B5A735B4B6F5B48060113E09638007F8097C8FC -5AA35A5D17064CB57E48030714F8041F14FF4C15C093B712F003C18203C316FE03C782B6 -27CFFE001F8004F8010780DBDFE0010180DBFFC06D804C6E7F8793C86C7F4B83854B1880 -1CC05D1CE0855D1CF0A25D1CF8A41CFC6C5CA87EA57EA36C6E18F8A37E1CF0A27E1CE06C -606F18C07E1C806D7F4F14006D6D5F6D5F6D6D5F6F92B55A6D6E495C6D02E0495C6D6E01 -0F5C6D02FE90B65A6E90B8C7FC021F17FC6E5F020317E002001780033F4BC8FC030F15F8 -030115C0DB000F01F0C9FC567977F669>54 D<48B47EA2487F8014F891B512C093BA1280 -A45AA41D00A264486364646464A2644898C7FC636363636302C0C91207D83FFCCA485B63 -494D90C8FC4F5A494D5A4F5A60007F4D5B49604E5B4E5B4E90C9FC4E5A187F48484C5A61 -4D5BCA485B4D5BA24D5B4D90CAFC5F604D5A17FF605E5E605E605E5E605EA25E6093B5FC -A25D95CBFC5DA35DA24B5BA35DA35DA35DA25FA292B5FCA55CA65CAE6E5CA26E5CA26F5B -6F5B030F90CCFCED03FC597D74FA69>I<EB1FC0EBFFF8000313FE487F4814804814C048 -14E0A24814F0A3B612F8A76C14F0A36C14E0A26C14C06C14806C14006C5BC613F8EB1FC0 -90C8FCB3A5EB1FC0EBFFF8000313FE487F4814804814C04814E0A24814F0A3B612F8A76C -14F0A36C14E0A26C14C06C14806C14006C5BC613F8EB1FC01D5172D03A>58 -D<EB1FC0EBFFF8000313FE487F4814804814C04814E0A24814F0A3B612F8A76C14F0A36C -14E0A26C14C06C14806C14006C5BC613F8EB1FC090C8FCB3A5EB3FC0EBFFF0000313FC48 -7F487F4814804814C0A24814E0A2B612F0A215F8A415FCA37EA27EA27E7E7E7EC613FBEB -3FE3EB000715F8A4140FA215F0A2141F15E0143FA215C0147F158014FF491300A2495A13 -075C130F495A495A137F495A485B485B4890C7FCA26C5A5BEA01F06C5A1E7472D03A>I< -001FC212FE488D482280C412C0A56C22806C2200000F69D7FCB3AD000FC212FE003F8D48 -2280C412C0A56C22806C22006C698A3574C7A3>61 D<F21FF0507E507E507EA24F7FA34F -80A24F80A34F80A24F80A34F80A24F80A396B67EA24E81A34E82A24E82A34E82A24E4881 -A261063F6D80A24E486C80A219F006FF6D80A24D496C80A219C04D6E81A24D496C81A219 -004D6E81A24D486D81A260053F6F80A24D486E80A26005FF6F80A24C496E80A2604C7081 -A24C496E81A295C8FC4C7081A24C486F81A25F043F7180A24C487080A25F04FF718094BB -FC4B87A34B88A24B88A34B8894CA12014B487181A24C84033F88A24B487280A24B487280 -A34A497280A24A497281A34A497281A24A90CC6C81A34A487381A291267FFF807380B800 -FE93BA12FEA902E0F4FC0F8F8079FF9E>65 D<BEFC1DFCF5FFC01EF81EFF1FC01FF01FFC -8B797EC7000F02F8C9001F810A03810A0081778077807780897780898D898D898DA38A8D -AA9BB65AA3696569659EC7FC6568535C535C535C535C9AB65A0A035D0A0F4AC8FC0A3F14 -F80903B65A94BB128054C9FC1EF09BCAFC1EF8F6FF801FE01FFC05F8C9000714FF0A0015 -C00B3F800B0F14F877807780778077818D78807880A278808DA27880A38DA28A2280AB54 -1500A4545CA3545CA2545C9BB6FC69535D650B0F5D535D0B7F92C7FC52B65A0A1F5DC15A -6820C09DC8FC1FFC1FF01FC054C9FC1EE00BF8CAFC817D79FC95>I<0703B517F84EB600 -FCED01FC063FDBFF8014030503B800F01407051F05FC140F94BA141F040307C0137F040F -07F013FF043FF1FC0193BB6C5A03039326FC001FEBFF87030F4BC814CF4B03E0033F90B5 -FC037F92C9120792B600FC1601020303F0824A03C0173F4A92CB7E4A4A844A02F8844A4A -8491B64884494B84494B854992CD7E4C86495C494A8649895E49895E90B64886A2488A5E -5A93CF127F5AA2481F3F5DA25AA24B1C1F5AA3F80FF8489CC7FCA35DA3B6FCB17EA381A3 -7EA2F807F8F80FFC7E81A27EA2816C1F1F21F87E826C1F3F826C20F0207F6D80701CE06D -1EFF705013C07F6D6E5013806D6E62701C006D6F616D6F4F5A6D6F4F5A6E6E4F5A6E6E19 -FF6E02FE4E5B6E6E06075B6E03C04D5B6E03F0053F5B020003FC4D90C7FC6FDAFF804B48 -5A031F03F0030F5B6F03FF037F13F0030304FC010FB55A030093B85A043F97C8FC040F19 -FC040319F0040019C0051F95C9FC050317F8DD003F16C006014BCAFCDE000314807E8174 -FE97>I<BD12F8F4FFF01DFF1EF01EFCF6FF801FE01FF81FFE797EC7001F02F8C8000782 -E1001F15F00A0381E2007F800B1F14FF0B07810B018177810C3F80788078808A78807880 -7881A279807980A27980A27980A27980A28E8BA28EA223808BA323C0A47915E0A723F0B1 -23E0A75515C0A42380A3551500A36A676AA2555CA2555CA2555CA2555C9CB65A669FC7FC -545C545C545C0C3F5C545C53B65A535D0B0F92C8FC0B7F5C52B65A0A1F15F00907B75AC1 -12809DC9FC1FFC1FF01F8054CAFC1EF01E800BF0CBFC0AFCCCFC8C7D78FCA0>I<C1FCA5 -8CA5C7001F02FCC9FC1C03F4007F1D0F77801D01898A8A8A8A8AA2787FA28AA28AA31F7F -A28CA2E17FE0143FA7797EA21BFFA29CC8FCA262A2626262621A7F0707B5FC94B8FCAA94 -38FC0007F1007F1A1F86868686A274EFFFC0A35513801B7FA5672100A398C9FC67A2681F -0FA31F1FA2681F3FA21F7FA21FFF6668666666661E7F9BB55A1D031D0F1D7F0A03B6FC99 -B7FCC15AA768A37A7C78FB89>I<C012F8A48BA6C7000F4AC81203E1000F801C01767E1D -1F1D07898989787E8AA28A8AA28A2080A28AA38AA320C08AF37FE0A5F77FE0A409FF92C7 -FCA462A2626262621A7F0707B5FC94B8FCAA9438FE0007F1007F1A1F86868686A286A41B -7FA998CBFCB3A8BB12FEA9EDFC07737C79FB84>I<B800FC067FB50007B512E07198B6FC -8384848484A28484C7001F6F94C7001F01C0C7FC72070790C8FC85A2858585858515FD03 -FC8170807081708186827081708170817081868371817181718187718183718171817280 -887281847281728172818872818473807381738189857381738173817381898674817481 -748174818A867481748175807515801FC0877515E07515F07515F87515FC1FFE877614FF -7615877615C77615E720F7887692B5FC888889A289898989A28989898A8AA28A8A8A8A8A -A28A8B8B8B8BA28BDA7FFF87B900C0848B8CA28C8C8C8C7A5ADAFC1F765A937D78FCA4> -78 D<96387FFFE0063FB612C00503B712FC053FEEFFC04CB912F8040718FE043FF0FFC0 -93BB12F003031AFC4BDBF00081031F92C7000F6E7E4B02F802018192B600C0DA003F14F0 -4A92C9000F804A4A7080020F02F8040114FF4A4A70814A4A71804A4A718091B648718049 -92CB6C804C84494A7280494A7280498A4C84498B494A7380A2494A738090B6894C85488C -A24892CD6C80A3484A7480A2488CA24B86482180A34821C0A44B864821E0A6B61FF0B26C -21E0A36F62A36C21C0A56C6E501580A36C2100A26F626C68A26C6F4F5CA36C6F4F5CA26C -686D6E4F5CA26D6E96B65AA26D6E4E5D6D6E4E92C7FC6D6670606D6E4E5C6D6F4D5C6D6F -4D5C6E6E4D5C6E6E94B65A6E6E4C5D6E6E4C92C8FC6E02FF040F5C6E6F4B5C020003E003 -7F14F06F02F84AB65A031F02FF020F15806F03F090B7C9FC030392B812FC03001AF0043F -19C0040F96CAFC040118F8DC003F17C005074CCBFCDD003F15C0DE007F01E0CCFC848174 -FE9D>I<BD12E0F4FF801DFCF5FF801EE01EFC1EFF8B1FE08BC7001F02F8C8000F15FC09 -00810A1F800A07810A018176817780898C898C7780A38C892180A421C0AC2180A32100A2 -6568A26865686568535C9AB65A0A035D5292C7FC0A1F5C99B65A091F5D94BB12E0679CC8 -FC1EFC1EF01E800BFCC9FC1DC00AE0CAFC05FCCFFCB3B3A8BB12C0A9EDF80F7A7D78FC8F ->I<93B516F8031F02FC4A7E92B76C1303020704F01307021F04FC130F027F04FF131F91 -B9EAC03F0103F0F07F49F0F8FF49DAC00114FD4949C7000F90B5FC4901F0140149496E7E -90B50080151F4891C91207484916014A8248854A8348854A83488586485B86A24885A21B -7FA2B5193F80A21B1F80A280A26E180F80818103F0715A6C02FC94C8FC15FF16F016FF6C -16F8EFFFC018FC6CEFFFE019FE6CF0FFC01AF06C19FC1AFF6C866C1AE0876C866D856D85 -6D856D866D866D8601008680021F8502078514016E6C84150F0300841607EE007F050317 -80EF001F060116C0F0001F19071901857414E08686D87F8084486C84A286A286A36D84A3 -1DC07FA37F1D806D60A26D1B007F6E4D5B806E4D5B806E4D5B02FE5F6E6C4C5B03E04C5B -03F893B55A03FF150304F0020F5CDCFFE090B6C7FC94B75AD9FC7F18F8D9F81F60496C60 -D9E003188049C66C4CC8FC49011F16F890C7000116E048DA001F4AC9FC007CDB007F13E0 -5B8174FE74>83 D<000FC112F8A6488CA493C7001F02FCC77E03E01A0392C8F0007F02FC -1C1F4A8802E01C034A884849767F91C91A7FA2491E3FA2491E1FA2491E0FA3491E07007F -8CA4498AA700FF2180498AA5CB97C8FCB3B3B3AE4ABD12C0A9F1F007817B78FA92>I[<B6 -12FEAB01E0C7FCB3B3B3B3B3B3B3B3AF90B512FEAB>31 181 106 -263 58 91 D[<B612FEABC7120FB3B3B3B3B3B3B3B3AFB6FCAB>31 -181 124 263 58 93 D<150C151E153FEDFFC04A7F4A7F4A7F021F13FE4A7F4A8049B612 -E0498149814981013F15FF498290B500F380000302E114F048DA807F7F489026FE001F7F -48496D7F007F01F00103EBFF80B5486D14C06C01806D6C13806C90C86C130001FC150FD8 -1FF0ED03FE6C486F5A0180ED007C6CCA12383A1E69FD69>I<0307B512C04AB612FE021F -EDFFE091B812FC010317FF4918C0011F18F04984499026FC000714FE03E001008090B56C -023F804871806F020780A2486E6E8072808487A2737FA36C4A6F7FA26C5C6D5B6D5B6D5B -6D90C9FCEB01F890CBFCA40607B6FC94B8FC163F0307B9FC157F0203BAFC141F027FEDF8 -3F49B6EAFC00010715C0011F02FCC7FC017F14E090B61280484AC8FC485C4814F0485C48 -5C5D5A92C9FC5A5CA2B55AA561A28096B6FC6C5F806C5F6F5C6C6EDA0FF7806F023F15F8 -6C02F8DAFFE7ECFFF86C6E010301C715FC6C9126FF803F018315FE6C92B612036C6CEEFC -016D4C7E010F04E07F01030480131FD9007F4AC7000714FC020F02F0DA007F13F8DA003F -90CCFC5F547AD266>97 D<ED7F8090B6FCB7FCAAC67E131F7FB3AC953807FFF095B67E05 -0F15F0053F15FE0481B87E048717E0048F17F804BF8393B5D8F0038095C76C6D7E05F802 -0F8005E06E8005806E8094C98016FC4C707F4C707F4C707F5E1E80871EC0A27514E0A31E -F0A2871EF8A51EFCAF1EF8A55114F0A31EE0A25114C0A21E80631E0082704C5B704C5BA2 -04FE93B55A704B5C7102075C05E04A5C03FD6D023F5C03F801FE91B6C7FC9228F07FFFC0 -0F14FC4B6C90B75A040F17E0DBC00317804B6C4CC8FC92C76C15F84A020F15E04A02014A -C9FC90CA001F13C0667F7AFD74>I<933807FFFE4BB612F8030F15FF037F16E04AB812F8 -020783021F17FF027F188091BA12C049ED8003499126F8000114E0010F02E016F0490280 -5B4991C7FC4B4A14F8495B90B55A5A5D485C5AA2484A6E14F0A2487114E04B6E14C07313 -8048721300735AF103F04895C8FC92CCFCA4B6FCAF7E81A37EA3817EA26C6EEE03FCF207 -FE6C801A0F6C6E17FC6F161F7E6C6EEE3FF86FEE7FF06D6E15FF6D02E04A13E06D6E5C6D -02FC4A13C06DDAFF80013F13806DDBF801B51200010092B65A6E5F021F17F002075F0201 -17806E6C4BC7FC030F15F003011580DB000701F0C8FC4F5479D25D>I<F43FC0087FB5FC -96B7FCAAF1003F1A0F86B3AC93380FFFE04BB6FC031F15E0037F15FC0203B8FC020F17C7 -4A17E7027F94B6FC49B6EAC00F4902FCC7FC4902F0143F4902C0140F494A14034949C87E -49496F7E90B5488286484A82485CA25A5D5AA2485CA25AA34891CAFCA5B6FCAF7EA56C80 -A37EA36C80A27E6F5E6C617E6F5E6C6E93B6FC6D6D15036D5F03FF4B816D6E023F15F86D -02E091B812FC010302F813036D02FF133F6D92B612EF023F178F6EEEFE0F020716F80201 -16E0DA003F15800307ECFC00DB003F018003F8C7FC667F79FD74>I<93380FFFF04BB67E -030F15F8037F15FE4AB87E020717E0021F17F8027F8391B6C66C7F010302F8010F7F4902 -E00103804902800100804991C86C7F49496F7F49498190B5486F7F4B834884484A838548 -4A83855A4B18805A851CC05AA292CAFC4885A21CE0A3B6FCA292BAFCA51CC01C8092CDFC -A57EA3817EA37EA2816CF21F80F33FC06C6EEF7FE0A26C6E17FF1CC06C6E5E6C6E4C1380 -6F5E6D6D4C13006D6E5D6D6E4B5A6D02F04B5A6D02FCEC01FF6DDAFF80010F5B6D03F890 -B55A6D6C91B712C0021F606E95C7FC020317FC020017F0031F16C003074BC8FCDB007F14 -F0040149C9FC53547AD260>I<943807FFF04CB512FE041F6E7E93B712E0030382030F82 -033F824B824AB5D8FE077F4AECF00F4A02C015804AEC001F4A5B4A494914C04A5B5E91B5 -FC495CA25E49701480A3494A6D1400725B725B725B9538007FE0070FC7FC96C8FCB1B912 -FCAAD8000702C0CAFCB3B3B3A7007FB812C0A9ECF83F4A7F79FE40>I<F303FE93B56C91 -383FFF80031F02FC91B512E04AB7D8C00314F00207DCF00F14F8021FEEFC3F027FDCFF7F -14FC49BCFC491BFE49DAF00715C34991C76CEBFE034901FC021F13FC49496E13FE49496E -13FF90B5486E028113FCA2484A6E6E13F84886F43FE0F40F80484A6E6EC7FCA34886AA6C -62A36C6E4A5CA36C626C6E4A5CA26D6D4A91C8FC6D6D4A5B6D6D4A5B6D01FF027F5B6DDA -F007B55A93B75A49604995C9FC02DF16FCD93FC716F0D97FC116C0DA801F02FCCAFC0300 -148001FF91CDFCA35A80A380808080ECFF8092B712F8F1FFF06C19FF1BE01BF86D19FE75 -7E6D86886D86886D866D866D86130F013F1B8090BDFC00031CC05A4891C9001F15E04801 -FCEE007F02F0170748491701487314F04A8487B55A87A56E606C1CE0A26E606C6D95B512 -C06E5F6C6D4D14806C6D4D14006C6D6C041F5B6C6E4C5B6C02F84BB55A6C02FF030F5C6D -02FC0103B65A011F91B912806D97C7FC010319FCD9007F18E0021F1880020105F8C8FCDA -001F1680DB003F02C0C9FC5F787AD269>I<ED7F8090B6FCB7FCAAC67E131F7FB3ACF1FF -FE060FEBFFF0063F14FC4DB7FC050716C04D82053F824D829426FFFE018004819026E000 -7F7F048301806D7FDC87FEC77EDC8FF883EE9FF0DCBFE0804D83EEFF8094C8FC4C814C84 -A25EA25EA25EA45EB3B3A7B800FE90B812FEA9DAF87FEFFC3F677E78FD74>I<147F9038 -03FFE0010F13F8497F497F497F90B67EA24881A34881A76C5DA36C5DA26D91C7FC6D5B6D -5B6D5B010313E0D9007FC8FC91C9FCB0ED7F8090B6FCB7FCAAC67E131F7FB3B3B3A4B812 -F0A9ECF07F2C7F78FE3A>I<ED7F8090B6FCB7FCAAC67E131F7FB3AD963A3FFFFE3FFC98 -B5FCA9070102C0C7FC51C8FC4F5B4F5B4F13E0073F5B4F5B96B5C9FC4E5B060713F84E5B -4E5B4E5B95B5CAFC4D5B4D5B4D5B051F13E04D5B4D5B94B5CBFC0481801687048F80049F -8004BF8093B67EA285858586A2053F80DCFC1F804C6C8004F0814C7EDC8003804C6C8086 -8372807280728087847280728072808784738073808873808573807380887380B800F001 -7FEDFFE0A902F0F0FC1F637E7AFD6E>107 D<ED7F8090B6FCB7FCAAC67E131F7FB3B3B3 -B3B3ACB812F8A9ECF07F2D7E78FD3A>I<DB7F8091263FFF8093380FFFE0017FB50203B5 -00FC93B6FCB7021F02FF030715C0067F03C0021F15F04DB700F0027F15FC05077049B77E -051F700107824D7049834D01006E49D9C03F80DDFFF0013F9128803FFC000F80048101C0 -010F9126C07FF0010380048390C7EEFFC0D8003FDA87FC6E02E190C76C80010FDA8FF8EF -E3FE6DDA9FF06EDAE7FC804DDDF7F883DCBFC0EFFFF0DCFF806094C86C4B81A17E4C614C -96C9FCA24C60A34C60A34C60B3B3A7B9013FB8D8C00FB812F0A9DAFC3F060F18C3A45279 -D1AF>I<03FFEDFFFE90B6020FEBFFF0B7023F14FC4DB7FC050716C04D82053F824D8294 -26FFFE01804C9026E0007F7F4C01806D7F4C48C77EC66CDA0FF883011F4A5A6D4A48804D -834C5A4CC8FC4C814C84A25EA25EA25EA45EB3B3A7B800FE90B812FEA9DAF87FEFFC3F67 -5278D174>I<933803FFFC93B612F0030715FE033FEDFFC092B812F0020717FE4A83023F -18C04ADA801F8049B526F8000114F84902E06D6C7F490280021F7F4949C800077F49496F -8049496F8049496F8090B5854B824887484A707FA248874B824887A2481C80A292CA7E48 -1CC0A3481CE0A5B61AF0AE6C1CE0A56C6E4C14C0A36C1C80A26C1C006F5E6C63A26C6E4C -5BA26C6E93B55A6C636F5D6D6D4B5C6D6D4B5C6D6D6C021F5C6D02E0027F91C7FC6D02F8 -49B55A6D9126FF801F5C010092B712F06E60021F188002074DC8FC020117F86E6C16E003 -0F93C9FC030015F0040301FCCAFC5C547AD269>I<DB7F80903803FFF890B6027FEBFFC0 -B70107B612F8053F15FE94B812C0048383048F17F804BF17FE93BAFCDEF0078195C78105 -F8023F80C66C03C06E80011F4B0207806D4AC86C804C814C844C6F804C824C1980871EC0 -871EE0871EF0A3871EF8A4871EFCAF5114F8A51EF063A21EE0631EC0A2511480A2511400 -827093B55A505C82704B5C04FF4B5C71021F5C714A5C05F04A5C05FE0103B6C7FC9426FF -C01F14FC95B75A04CF17E004C75F04C194C8FCDCC07F15F8050F15E005014AC9FCDD001F -13C095CCFCB3A6B812FEA9ECF87F66757AD174>I<DA01FEECFFE048B5020713FEB6021F -6D7E057F14E094B67E4C15FC4C815E4C01877F93261FFC0F148017F8EE3FE0C66C4A4848 -14C0011F15806DECFF00A26F5A5EA24C6D1480A27214005E725B4C6D5B9538007FF0F10F -8096C8FC5EA65EB3B3A2B97EA9ECF07F4A527AD156>114 D<92B500C0137C021F9138FC -01FE91B71287010716FF131F5B90B9FC48ECC0014801FCC7121F4801E0140348498091C9 -FC48177F49163F003F171F49160F127FA2180712FF7FA27F806E6F5A02F092C8FC14FEEC -FFC015FE6CECFFF8EEFFE017FC6CEEFF8018E06C17F818FE6C717E6C846C846C846C846D -83011F836D83130301001880141F020317C0EC001FDB007F15E01603EE001F050314F017 -00D87F8082486C8284846D82A2847FA26D18E0A27FA26D4C13C07F6E4B1380806E4B1300 -02F85D6EEDFFFEDAFF8001075B03F8017F5B92B75A61198001F094C7FCD9E03F15FCD980 -0F15E026FE000192C8FC007CD9001F13E0445479D253>I<ED3FF0A8157FA515FFA35CA3 -5CA35C5CA25CA25C5C91B5FC5B5B5B5B133F90B912F81207BAFCA8D8000302F0C9FCB3B3 -A3953801FF80AF4E13006D80A2606D6E5C180F6E6D495A70133F6E9138C0FFF86E91B55A -616E5E02035E6E93C7FC6E6C5C031F14F8030314E09226003FFEC8FC41757CF351>I<DB -7FC0EF3FE090B6047FB5FCB792B7FCAAC66CEF003F011F180F6D84B3B3A862A362A362A2 -6D6097B6FC616D6E5C4F816DDD0FFB14FC70DA3FF3ECFFFE6D6EECFFE36E9026FF800713 -C394B612836E1703020F16FE6E16F8020116F06E6C15C0030FECFE00DB003F01E04BC7FC -675378D174>I<B500C1B500F0913A1FFFE3FFE091B694B5FCA9D8000F02E0C9001F90C7 -FC755A6D6E4C5AA26D6E4C5AA26D6E4C5AA26D6E5F1BFFA26E6D4B5BA26E6E4A5BA26E6E -4A90C8FCA26E6E4A5AA36E6E4A5AA26E6E4A5AA26E6E4A5AA26E6E4A5AA2836F4B5BA26F -6E485BA26F6E4890C9FCA26F6E485AA26F02F05B191FA26F6E485AA26F6E485AA26F6E48 -5AA27090B55AA3705DA27092CAFCA2705CA2705CA2705CA3705CA2705CA2715BA2715BA3 -7190CBFC715A715A63527BD06E>I<B50083B527E03FFFE1B500E0903A0FFFF8FFF091B6 -92B693B5FCA9D8001F0280C700030280C80007EBC00070755B6D716E94C7FC7063886D71 -4E5A826D726D5E7092B5161F886D545A705C6D745E704A187F886E535A705C6E735E7149 -5F896E525B715B6E7492C8FC71D93FF95E896E05F05F71017F170F6E745C7149486C151F -896E4D6C5E7148183F6E745C4E496C157F05FE836F4C6C5E714818FF896F4A486D4A5B06 -8F17816F4B6D5E06DF17831EC36FDAFFF86D02C790C9FC1EE76F4B6D5D1EEF1EFF6F4B6E -5CA26F4B6E5CA36F4B6E5CA27091C86C5CA370496F5CA270496F5CA370496F91CAFCA270 -614E81A27049705AA27049705A706CCAEA0FE08C527BD097>I<267FFFE1B500F0903B07 -FFFE3FFF8091B693B6FCA9D8000102FCC8003F01E0C7FC6D6E6F90C8FC6E6D4B5A71147F -6E606E6E4A5A6E6E495B6E6E495B6E6E495B71495B6E5E6E6E92C9FC6F6D495A6F6E485A -72485A6F02C15B6F02E35B6F14F76F91B55A6F5E97CAFC6F5D705C705C8261705C708070 -807080858285864C814C814C815E4C814C814D804C48804C487E4B496C804B496C804B49 -6C804B6E800580814B497E4B486D804B486D804B486E7F4A49834A824C6E804A496E804A -496E804A90C8814A48814A486F8049486C6F80B700F8023F91B512F8A9D9FE1FF0FE1F65 -517CD06E>I<267FFFE0B500F8913A0FFFF1FFF091B694B5FCA9D8000702F0C9000FEB80 -007590C7FC6D6E4C5AA26D6E4C5AA26D6E4C5AA26E6D4C5AA26E6E4B5AA36E6E4A5BA26E -6E4A5BA26E6E4A90C8FCA26E6E4A5AA26E6E4A5AA36E6E4A5AA26F6D4A5AA26F6E495AA2 -6F6E485BA26F6E485BA36F6E4890C9FCA26F6E485AA26F6E485AA26F6E485AA2706D485A -A3704A5AA2705DA2705DA27092CAFCA2705CA3705CA2705CA2715BA2715BA2715BA3715B -A27190CBFCA24D5AA24D5AA260173FA2D801FE4B5A3807FF80001F01E04A5A487F4C5B48 -7F4C5BB57E4C90CCFCA24C5A161F4C5A4C5A4A495A6C5C4B5BDAF00F5B273FFDE03F5B26 -1FFF41B5CDFC91B55A6C15F86C5D6C5D6C15806C6C49CEFC011F13F0010390CFFC64757C -D06E>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fk cmbx12 14.4 26 -/Fk 26 122 df[<F003F84E7E4E7E183F187FEF01FF1707171F177F4CB5FC160F167F03 -07B6FC92B7FC143FBAFCA7169FEDF81F150014C0C9FCB3B3B3B3B3B3AC001FBEFCAA04E0 -C71201>96 157 109 284 134 49 D[<94387FFFE0041FB612C04BB712FC030FEEFF8003 -3F17F04AB912FE0207727E4A19E0023F19F891BB7E491AFF499126FC003F82010F028001 -03824901FCC86C15F04901F0031F814901C06F8190B5C9000381484970814A70824801F0 -718148498374814801FE7181486D6C7081814802F07081816F70815A6F7081A26F711580 -B7FC821FC087A41FE087A26C92CAFCA36C5CA26C5C6C5C6C5C6C5C6C5C6C6C90CBFCD91F -FC4E15C090CDFCA31F8063A21F0098B7FC66A2505DA2505DA266505DA2505D665092C7FC -505C65505C97B6FC654F5D4F15809AC8FC4F5C4F5C4F5C644F5C4F148096B6C9FC4E5C63 -4E14F04E5C4E5C4E91CAFC4E5B4E5B95B512F04D5C4D5C97CBFC4D5B4D5B4D13F04D5B4D -49EEFFE094B55A4C91CAFC4C13FC4C494C13C04C5B4C5B4C5B4C90CAFC4C5A4B495F4B49 -19804B5B4B13C04B495F4B90CBFC4B5A4B5A4A01F0604C1A004A49604A49604A90CB000F -B5FC4A90BCFC5C5C91BD5A5B5B5B5B5B5B496490BEFC5A5A5A5A5A5A4865A2BFFCA566A4 ->107 157 115 284 134 I[<050FB5FC4CB612FE041FEDFFE093B812FC0307EFFF80031F -18E0037F18F892BA12FE0203737E4A9126FC007F15E0021F02800107814A01F8C7000181 -4A01E06E6C8091B5C96C804901FC7080494970814901E070814B70814949864913F803FE -7081496D7E70854980706F8190B6FC827085A25A82A96C4B61A26D4A5DA26D4A61A26D5C -6D4A4B5D010391C9FC6D49629026007FF85E91CB5EA2505D66629BC7FC505C65505C97B6 -5A4F5D654F5D070F92C8FC4F14FC4F5C96B612E0060F5D051FB7C9FC043FB712FC4C16F0 -1BC050CAFCA2F2FFE01BFEF3FFC07017F093C86C14FC070714FF070115C0736C14F07480 -7414FE74807481748174818A74818A75808A751580A21FC0A27515E0A21FF0A21FF887A2 -1FFCA3EB0FFE90267FFFC01BFE90B57E000314F8488048804880A24881A24881A2B77EA2 -1FFCA41FF863A21FF05E7E4C1AE06393CA16C07E4B4D15806C5C4B1B006C4A94B65A15C0 -6C91CA485D6C01F84D5D6C01FE4D5D6E636C02C04C5D6D01F8043F5D6D01FE4C92C7FC01 -0FD9FFC04AB65A6D02FC020715F86DDAFFF0017F5D010092B912C06E62021F4FC8FC0207 -19F8020119E0DA003F95C9FC030717F8030017C0040F03FCCAFCDC001F49CBFC>111 -160 117 284 134 I[<52B47E527F527F527FA2527FA3527FA2527FA399B6FCA25181A3 -5181A25181A35181A25181A35181A25181A398B8FCA25083A35083A25083A35001BF81A2 -50013F81881BFE083F8388E07FFC82881BF808FF83884F01F083881BE04F85884F498389 -634F85894F90C7828962073F85894F4884896207FF85894E498589624E87894E49858A62 -4E878A4E90C9828A61063F878A4E48868A6106FF878A4D49878A614D898A4D49878BA24D -49878B4D90CB828BA24D48888B4DBE7EA394C0FCA24C8BA34C8BA24C8B06C0CC7EA24C49 -898C4C90CD828CA24C488A8C4C488A8CA24C488A8C4B498B8CA24B498B8C4B498B8DA24B -498B8D4B90CF828DA24B488C8D4B488C8DA24B488C4A6D88027FD9FFF88CBA00C094BDFC -AA9126C0000F0BF8C71203>184 167 119 294 203 65 D[<99263FFFFEF007C0093FB6 -00F8EF0FE0080FB86C161F97B900F0163F070F06FE16FF077F726C5C0603BB00E05C060F -08F85C067F08FE5C4DBD6C5B05070AE05B051F9426C0003F6E5B057F04E0C7000102FC90 -B5FC4CB748C9003F6D5A4C04E004076D5A040F93CB14C74C03FC063F13EF047F03E07290 -B6FC93B70080180703034BCC12014B4B854B03F0864B4B1A1F4B0380864B92CE7E92B648 -874A4B874A03F0874A4B885C4A4B884A4B884A92D07E5F91B68A494B89495D8F494B8949 -5DA17E495DA17E5B5F498E94D2FC90B78BA2485DA17E5AA25E488FA25A5EA2A17E5AA25E -5AA16C13C0A190C7FCA35AA35EA4B7FCB3A27EA482A37EA57E70F87FC0A1EBFFE07EA382 -7EA27E7067A26CA113C0A26C81A15A7F7120807F71666DA11200836D6A71676D221F6D6F -67A1123F6D6F545A6D816E575A71656E6F666E6F646E6F525B6E6F525B6E6F646E6F5290 -C7FC6E6F525A6F6E525A6F6F505B6F03E0505B6F6F505B6F03FC081F5B6F6F505B03006F -6C96B5C8FC7003E006035B041F03FC060F5B7003FF063F5B040304E04CB512E07004FE04 -0F5C706CDBFFF092B65A051FDCFFC0011F4AC9FC050794B812F8050164716C1BC0060F98 -CAFC06031AFCDE007F19E0070F1980070006FCCBFC080F17C0E0003F03FCCCFCE1003F91 -CDFC>163 170 113 294 194 67 D[<B600FC037FB512FE92BAFCAAC8001F03F0C8FCB3 -B3B3B3B3B3B3B0BD12FEAA03FCC87E>87 164 122 291 100 73 -D[<BA00E097267FFFFC91383FFFFE07F899B8FC85A28585868686A286C86C7096C7003F -02FCC7FC749826007FFEC8FC74765AA2868787878716FB04F98204F88287718183718271 -82887182718283718272818872827282847282728289728284738173818A738273828573 -8273828A738286748174828B7482748286748274828B7581758287758275828C75828775 -8276818C7682768288768276828D768288778177818E7782778289778277828E77827881 -8A788278828F78828A788278828F79817916808B7916C07916E0A112F07916F87916FC8B -7A15FE7A15FFA113BF7A16FF8C8C8CA28C8C8D8D8DA28D8D8D8DA28D8E8E8E8EA28E8E8E -8E8FA28F8F8F8FA28F8F8FA17E4B6C8B027FEBFFF8BA00FC88A17EA17EA17EA2A17EA17E -A1137FA1133FA16D5A02F8C76C795A>191 164 119 291 210 78 -D[<94261FFFF8177C0407B600E016FE047F03FE15010303B800C01403030F05F8140703 -3F05FE140F92BA6C131F020307E0133F020F07F8137F4A7313FF027F9126F8001FECFF01 -91B60080D9007F14834902FCC8000714C74902F0030091B5FC4902C0163F4991CA120749 -4983494917004949844B181F90B585484A844B8448874B844888894891CDFC894888A24A -864888A2895A89A31E7FB5FC801E3FA281A21E1F8181A2816F1A0FA28115FF6C8170735A -04F096C8FC8216FF6C16E017FEEFFFE06C17FF19F06CF0FF801AF8F2FFC06C1AFCF3FFC0 -6C1BF86C1BFE767E6C1CE06D1BF8896D1BFF6D886D1CE06D886D886D886D886E876E886E -88020788800200886F87031F871507030087163F040386EE003F05011A80EF001F060019 -C0190FDF007F17E01A07F2003F090716F01B01757E0A1F15F8888888887615FC89D83FC0 -87487E00FF8889A289A389A27FA289A220F87FA37F20F0A27FA26D5114E0A2806E1DC0A2 -6E501480806E626E1D00806E505B6F4F5B15E06F4F5B03FC96B55A6F606F6C4D5C04F04D -5C04FC051F5CDCFF804C91C7FC05F84BB55A02CFDAFF8002075C0283DBFF8090B65A0201 -93B85A496C6C1AC049011F624901074FC8FC49010119F849D9003F6049020F1880490201 -4DC9FC90C9001F16F048040093CAFC007C050114E0>118 170 113 -294 149 83 D<4CB512FE93B712FC031FEEFFC092B912F8020318FF020F19C0023F19F0 -4A19FC91BB7E4992C7003F6E7E4902C0020781496E020015F0496E033F80706F80497280 -706F8086496E6F817481A275808A878AA2876D4A85A26D5C75806D5C6D5C6D5C6D5CDA3F -FECAFCEC07F091CCFCA90703B7FC060FB8FC0507B9FC94BAFC160F93BBFC1507153F92B8 -EAC00F0207EEF000021F4BC7FC027F15F091B71280010303FCC8FC4915F0011F15C04992 -C9FC4914FC90B65A485D485D485D5E4892CAFC5A5D485CA25A5DA3B65AA463A463816C62 -A26F94B6FC6C616F5E6C6EEE07FD6C6F030F8170DB1FF9816C6FDB7FF115E06C6F912601 -FFE115FF6C03FC020701C0EEFF806CDBFF80013F4917C06DDBF003B5486C16E0011F92B6 -5A6D4E7F010306F07F010006C07F023F4D1303020704FCC8FC020004F0033F15C0030F03 -8003011580DB001F01F0CEFC7B6D79EB83>97 D[<923801FFC0013FB6FCB8FCABEA001F -13037FA27FB3B3A697380FFFF84FB612E0071F15FE96B812C0060317F0060F17FE063F71 -7E95BA7E05C319F005C7DAE00115FC05DF49C7001F8094B500F002078007800201814EC9 -6C14E006F870804E708006C070804E8295CA6C804D71804D71814D874D844D878A8D8D8A -8DA37880A28DA32280A28AA222C0A522E0B122C0A6228066A22200A369A26669A2696669 -666971637195B6FC535D7198C7FC714D5C715F724C5C724C5C724C5C04FD01F84C5C04FC -6D4BB612804C6CB44B92C8FC4C6C01C0021F5CDCE00F01F891B65A4C6C9026FF800F15F0 -4C6C91B85A0500198093C76C4DC9FC4B021F17F84B020717C04B020194CAFC4BDA003F15 -F84B030792CBFC91CB003F13C0>131 167 120 293 149 I<95387FFFFE051FB612FC4C -B812E0041F17FC047F17FF0303BA12C0030F19F0033F854B854ABB7E4A03F8C780020F03 -80021F14804A4AC84814C04A02F85D4A02E018E091B64892B6FC4992C9FC494A4B15F05B -495C495C495CA2495C90B6FC5E487315E05E487414C0A24892CA6C148075140048745B75 -5B484A050113F09838003F8099C8FC5AA4485CA6B6FCB07EA381A37EA36C80A37E82A26C -F407FC70F00FFE7EA26C6F181F1EFC6C6F183F6D6E19F81D7F6D6EF0FFF06D806D6E4D13 -E0715E6D6F4C13C06D6F4C13806D03F84C13006D6FEE7FFE6E02FFED01FF021F03C00207 -5B6E03F8023F13F06E9226FFC003B55A020193B75A6E62033F4EC7FC030F60030318F003 -0018C0041F4CC8FC040316F0DC003F1580DD007F01E0C9FC676D77EB78>I[<F7FFE00A1F -B6FC097FB7FCABF3000F1C0188A289B3B3A695B57E053F14FC0403B712C0041F16F093B8 -12FE0303EFFF80030F18E0033F18F092BA12FC4A9226FE003F13FE020703E0010390B7FC -4A92C87E4A02F8150F027F4A150391B600C081494B6F7E4992CA7E494A83494A834C8349 -4A834986494A835E90B6FC5A5E5A93CCFC5AA25A5DA25AA35AA25D5AA6B6FCB17EA57EA2 -81A27EA37EA26C80A37E827E6C63705F7F6D6E5F646D6E5F6D6E5F6D6E5F6D6E4CB7FC6D -6E4C826D6F5D6E6E031F826E02F0037F16FF6E02FC4A4848EEFFE06E02FF020F5B0203DB -F001B55A6E92B712E06E6C60031F1800030717FC030117F06F6C16C0040F4BC7FC040015 -E0050301FCC802FCC8FC>131 167 119 293 149 I<95387FFFE0053FB67E0403B712F8 -041F16FF047F17C00303B912F0030F18FC033F18FF92BB12C04ADBF80181020792268000 -1F804A02FCC7000714FC023F02F00201804A4A6E8091B600806F804992C9121F494A7080 -494A85494A708049854C7080495C4973805E90B6727F485D8A488793CB15805A885A4B1B -C0A25A7614E0A25AA25DA25A1FF0A388B6FC92BDFCA61FE01FC003FCCFFCA77EA5817EA3 -7EA2817EA27E70F11FC0F63FE06CF57FF0826C1DFF6C1EE070606D805313C06D6E606D6E -1A806D6E4E130070606D6F4D5A6D6F177F6D6F4C485A6D03F84C5B6E6E040F5B021F02FF -043F5B6E03E092B55A6E03FC02075C0201DBFFF090B6C7FC6E93B712FC033F61030F19E0 -0303198003004EC8FC041F17F8040717C0DC007F4BC9FC050715F0DD000F01FCCAFC6C6D -79EB7B>I<F603FF0C3F13C094263FFFFC4BB512F0040FB600F002078093B8021F800307 -05E0017F80031FDDF801B7FC037FEFFE034ABA00871680020719EF4A96B500C114C0023F -4AC66CEDFE034A02E0010715F891B6C815E0494A6F14804902F8031F14C0494A6F14E049 -1BF0494A6F6E6C1480494A6F14FC78140049756D5A4C6F705A90B673EB0FF09CC8FC4889 -93CAFC4889A44889AC6C65A46C65705D6C9AC9FCA26D63705D6D63A26D6E4B5C6D6E4B5C -6D636D6E4B5C6D02FE037F5C6D6E92B6CAFC6E02E001075C05FE017F5C91BB12F049621C -8049486C4DCBFC902607FC1F17F8030717E0010F010094CCFC4A010F15F0011FDA003F01 -FCCDFC94D0FCA2133FA4497EA380A28081818115F815FF6D91B812F8F3FFF8F4FFC01DFC -6D1BFF1EE06D1CF81EFE6D881FC06D898B6D896D896E886E886E894A8949BFFC01078A13 -1F017F8A90C0FC4892CA001F824802F0EF003F484A1801480280DE003F804891CD120F4A -86481C015C4876808AB55A8AA76E636C67A26E98B5FC6C676E626C6E4F5CA26C6E4F5C6C -6E4F5C6C02F8073F5C6C6E4F91C7FC6C02FF4EB55A6D02C005075C6D02F8053F5C6D02FF -4CB65A010703F0031F15C06DDBFFC00107B75A010093B948C8FC023F1BF8020F1BE00203 -1B80DA007F07FCC9FC030F19E003004ECAFC04031780DC00030380CBFC7A9D79EC86> -103 D[<EC07FCEC1FFF027F13C049B512F04980498049804980A24981A24981A290B77E -A96D5DA26D5DA26D92C8FCA26D5C6D5C6D5C6D5C6D6C13C0021F90C9FCEC07FC91CBFCB3 -A7EEFFC0011FB6FCB8FCABEA001F13037F7FB3B3B3B3A8BA1280AA9138F00003>57 -167 118 294 75 105 D[<923801FFC0013FB6FCB8FCABEA001F13037FA27FB3B3A70907 -B5398001FFE09BB6FCAAE1003F02FCC8FC0A07148054C9FC525B5213F0525B99B55A515C -5149CAFC515B091F5B515B515B98B512805091CBFC08075B505B5013F0505B97B55A4F5C -4F49CCFC4F5B4F5B073F5B4F5B96B512804E91CDFC1807604E804E8095B67E05C18117C3 -05C78105CF8194B77EA2878888A206F78106E38106C381188106008105FC6D804D6D804D -834D7F05806D8173818985738173818986748074818A867481748174818A86758075808B -87758175818B87758175818B8876808C5215F0BA6C013FB91280AA9126E000034EC7FC> -129 166 120 293 142 107 D<DCFFC092263FFFE095380FFFF8011FB60303B66C94B612 -E0B8033F03F0040F15FC97B700FC043F15FF070304FF93B812C0070F05C0020317F0073F -71020F834F714A834EB96C027F834EDA803F6E91B5D8E00F804E9026F0000F6E499026FC -0003814E018001036E4901E00100814E48C76C6F4801806E80D8000FDC3FF86E4C48C87E -01014C48724848846DDCFFC06F9126E03FF06F8005C1494F5A6E02C390C94C5ADDC7FE70 -02F1496F804E98C9FCDDCFF8F1F3FEDDDFF0DFFFFC854E62DDFFC0704B82A24E5085A295 -CA5EA24D63A24D98CAFCA34D62A54D62B3B3B3A3BA00F8013FB900FE010FBA1280AA02F8 -C74EC7003F953880000FD16B77EAE0>109 D<4BB46C92387FFFC0013FB6030FB512FEB8 -037FECFFC04FB712F0070716FC071F16FF077F834EB912E04E844E49C6814E01E0131F06 -3F90C76C80DE7FFC6E80D8001FDCFFF06E80010317C06D0381496E81058390C8FC6DDB87 -FE85DD8FF881A2DD9FF085EFBFE060DDFF8082A295CA81A25F5FA35FA35FA55FB3B3B3A3 -BA00E0017FB912F0AA9126F0000106F8C7FC846B76EA95>I<95383FFFF8050FB612E094 -B712FE040FEEFFE0043F17F84BBAFC030719C0031F19F0037F19FC92B626F8003F800203 -038001036E7E4A02FCC86C80021F02F0031F14F04A02C00307804A4A6F8091B6C96C8049 -02FC706C7F494A71804989494A7180494A7180A2494A718049894C8390B6874892CB6C80 -A2481F80A2484A7215C0A2481FE0A3481FF0A24B85481FF8A4481FFCA6B61DFEB06C1FFC -A56C1FF86F96B6FCA36C1FF0A36C1FE06F606C1FC0A26C1F80705F6C1F00A26C6F4D5CA2 -6D6E4D5C6D656D6E4D5C705F6D6E4D5C6D6E94B65A6D6E4C5D6D6F4B92C7FC6D03E0030F -5C6E6E4B5C021F02FC037F14F06EDAFF800103B65A6E03F8013F5D020192B9C8FC6E6C19 -FC6F61030F19E003031980DB007F05FCC9FC040F17E0040194CAFCDC000F15E0DD003F01 -F8CBFC776D79EB86>I<922601FFC0913807FFFC013FB692B612F0B8020F15FF077F16C0 -4EB812F8060F17FE063F717E95BA12E005C119F805C78505CFDAE0038194B548C76C6E7E -07E0020F81D8001F05806E8101034CC80001816D04F86F8106E070806D4C70804E70804D -CA7E4D71814D874D834D877781898DA27880A27880A38D8AA22280A28AA222C0A48A22E0 -B122C066A52280A2662200A3545CA3545CA2699BB6FC696569714D5DA2714D5D714D92C7 -FC7162715F724C5C724C5C7293B65A06F84B5D7203075D06FF4B92C8FC07C0023F5C05EF -01F849B65A05E79026FF801F15F005E391B85A05E01980724DC9FC061F17F8060717C006 -0194CAFCDE003F15F807071580DF003F01C0CBFC97CEFCB3B0BA12E0AA9138F000018399 -78EA95>I<DB03FF913801FFE0013FB6021F13FEB8027F6D7E4EB612E0060715F84E814E -15FF4E16804E16C095B5000714E04DEBF00F4DD9C01F14F01980D8001F4B48484814F801 -034B5A6D4C4914FC4D5A6D153F6060177F604DC7FCA24D6E14F8A27414F05F7414E07414 -C04D6E14807414009738007FFC4DED0FE098C8FCA45FA65FB3B3B0BA12FEAA9138F00001 -5E6B78EA6E>114 D<93B500F0143E033FDAFF8013FF0203B7EAF003020FEEFE0F027FEE -FFBF49BBFC13075B499138C0003F017F01F8C7120390B500C0EC007F4891C9121F02FC16 -0748498248491600485B4A83488586485BA2865AA286B5FC80A28080A202FC715A6E94C8 -FC6E7E15E015FCEDFFC06C15FF17F8EFFFE06C17FF19E06C18FCF1FF806C19E0866C19FC -6C19FF6C866C866D19F06D856D856D850103857F6D6C1980021F19C01407020019E0031F -18F01503DB001F17F8EE007F1701DD000F15FC1800193F070F14FE1903D83FC01700486C -8400FF85866D84A286A27F867F1CFCA27FA26D1AF86E5FA26E19F0806E4D13E0806E4D13 -C06E5F6E4D138003C093B512006F03035B03FC030F5BDBFF80027F5B04F8010FB55A93B8 -5A02BF60D9FE1F95C7FCD9FC075FD9F00117F8496C6C16C00180011F93C8FC90C7000115 -F0007CDA000F01FCC9FC576D77EB6A>I[<EE1FFCA8163FA6167FA416FFA45DA25DA35DA2 -5D5DA25DA25D92B5FC5C5CA25C141F5C5C91B6FC1303130F017F92B8FC0007BCFCBDFCA9 -C7001F02FCCAFCB3B3B1F37FF0B31BFF6E19E083A25013C080715C6E1980725B6E190072 -5B6E6F495A6F02F8EB7FFC6F9139FF01FFF86F92B5FC6F5F6F5F6F5F030094C7FC705D04 -1F15F804035DDC007F1480050101FCC8FC>84 153 123 279 105 -I<DCFFE0F17FF0013FB6051FB6FCB8047FB7FCABD8001FF1000F01031A016D86A26D87B3 -B3B3A49AB6FCA464A364A2648064A2646E6E5E646EF1FFBF51826E4E133F71DB07FE816E -6EDB1FFCEDFF806E6EDB7FF8EEFFF0716C903801FFF06E03F8011F13E06E92B712C0033F -18806F1800030717FC03015F6F6C16E0041F93C7FC040115FCDC000702C04CC8FC846C76 -EA95>I<267FFFE00107B56C91267FFFE0EB3FFF91B894B7FCAAC7001F92C9000103C0C7 -FC6E6FDB001F01E0C8FC6E6F606E6F4C5B5390C9FC6E6F5F6E6F4C5A6F6E4B5B6F6E4B5B -646F6E4B5B6F6F4A5B6F6F4A5B6F6F93CAFC734A5A6F4E5A6F6F5B706E495B706E495B70 -6E495B65706F485B706F4890CBFC706F5A706F485A08F15B7003FB5B7191B55A715E715E -64837193CCFC715D715D63837280728072807281A27281728172814E81604E814E81884E -826095B87E4D834D01F9814D01F0814D5B4F6C804D496C804D496C804D6E814D48834C49 -7F4C496D814E6D814C496D814C496E805E4C496E804C90C86C804C486F814D6F814B5B4B -496F814B496F814B71814B4970804B5B94CA6C804B4871804B4871814A49718102076D87 -49B66C82B800FE0307B912F8AA9026FE00079738C0001F856A7CE98E>120 -D<267FFFE0010FB56C923B3FFF8003FFC091B895B6FCAAC703F8CB6C49C7FC6E090713E0 -71725B6E515B836E5190C8FC836E515AA272173F6E64846E515A846E515A846E505B846F -4F5BA2725E6F63846F4F90C9FC846F4F5A856F4F5A856F4F5AA27315FF6F62856F4E5B85 -704D5B85704D5B85704D90CAFC8564706086704D5A86704D5A86704D5A86704C5B1AF871 -4B5BA2745A715F1AFE714B90CBFC1AFF714B5A1B9F71EDBFFC1BFF715EA3715EA2715EA2 -725DA2725DA27292CCFCA3725CA2725CA2725CA2725CA2725CA3735BA2735BA27390CDFC -A262A24F5AA24F5AA219FF62A24E5BA24E5BEB3F802601FFF04B5B000713FC486D4B90CE -FC487F486E5C6148804E5A187FB66C5D18FF614D5B5F4D5B615F6C4A4990CFFCEF7FFE4B -495A6C4B5BDB00075B6C017E011F5B02DC017F5B6CD9F803B55A6C90B7D0FC6C5E6C16F8 -6C5E6D15C0011F92D1FC010714FC010014E0DA1FFED2FC82997BE98E>I -E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fl cmr12 12 16 -/Fl 16 122 df<EA03F8EA0FFE487E4813804813C014E0B5FC14F0A214F8A414FC7EA27E -7E6C137CEA03FCC7FCA714FC14F8A41301A214F0A2130314E0A2130714C0130F1480131F -A2EB3F00133E137E5BA2485A485A1207485A5B485A48C7FC121E120C163B6F9336>44 -D[<EE1FFC0303B512E0031F14FC037F14FF4AB712C04AD9F0077F020FD9800013F84A48 -C7EA3FFCDA3FF8EC0FFEDAFFF06E6C7E49496E7F49496E7F4B804990C96C7E4948707E49 -48707EA24948707EA24948707E01FF85A24849707FA34849707FA24886A348864A82A348 -86A44886A391CB127FA24886A9B51A80B3AE6C1B00A86E94B5FC6C62A66C62A46C6D4C5B -A36C62A36C6D4C5BA36C626E5E6C62A26D6C4C90C7FCA26D6C4C5A011F606E163F010F60 -6D6C4C5A6F15FF6D6D4A5B6D6D4A5B6D6D4A5B6E6C4A90C8FCDA1FFEEC3FFC6E6C6CEBFF -F86ED9F0075B020190B612C06E6C92C9FC031F14FC030314E09226001FFCCAFC>81 -136 120 259 98 48 D[<923807FFE0037F13FF4AB612F0020F15FC023F15FF4A16C049 -B812F049D9F007804990C76C13FED90FFC020F7FD91FF0020380D93FC06E8049486E6C7F -49C96C7F4848707F49707F48488248488449707F000F83491980001F834919C0003F8490 -CB14E0855A01FC19F013FF6E82B57E801BF88085A66C5BA26C5B6C495E6C90CAFC6C4819 -F0EA00F090CBFCA24F13E0A34F13C0A396B51280A24E140062A24E5BA24E5B4E5B626062 -4E5B4E90C7FC614E5A4D5B614D5B4D5B4D5B96C8FC4D5A4D5A4D5A4D5A4C5B604C5B4C90 -C9FC4C5AEE1FF84C5A4C5A4C5A5F4B90CAFC4B5A4B5A4B5A4B5A4B5A4B5A4B4816F893CA -FC4A5A4A48EE01F04A5A4A5A4A5A4A5A4A5A4ACA12034A18E0495A495A49481707495A49 -5A4948170F017ECB13C04918FF90BBFC5A5A5A5A481A805A5ABCFCA41B00A3>77 -132 118 259 98 50 D[<F107C04F7E191FA2193F197FA219FF60A26060A260A26060A2 -6095B5FCA25FEF03F7A2EF07E7EF0FC7A2EF1F87EF3F07A2177E17FCA2EE01F8EE03F0A2 -EE07E0EE0FC0A2EE1F80EE3F00A2167E5EA24B5A5E15034B5AA24B5A4B5AA24BC7FC157E -A25D4A5AA24A5A4A5AA24A5A4A5AA24AC8FC147EA25C495AA2495A495AA2495A495AA249 -C9FC133E137E5BA2485A485AA2485A485AA2485A48CAFCA2127E5ABD12FEA7CB000F01E0 -C7FCB3A54E7FA24E7F0503B67E047FB812FCA7>87 134 123 261 -98 52 D[<B700F00A07B712C07064A27064A27064A2D8000710F8C7FC9027007F7FFF0A -7D1480023F9EC8FCA26E6C6D09F95BA26F6DF201F1A36F6DF203E1A26F6DF207C1A36F6D -F20F81A36F6DF21F01A26F6D1A3EA3706C1A7CA3706D19F8A2706DF001F0A3706DF003E0 -A3706DF007C0A2706DF00F80A3706DF01F00A3706D183EA2716C60A3716D5FA2716D4C5A -A3716D4C5AA3716D4C5AA2716D4C5AA3716D4CC7FCA3716D163EA2726C5EA3726D5DA372 -6D4A5AA2726D4A5AA3726D4A5AA3726D4A5AA2726D4AC8FCA3726D143EA2736C5CA3736D -5BA3736D485AA2736D485AA3736D485AA3736D485AA2736D48C9FCA373EBFE3EA3746C5A -A2745BA3745BA24A6C705BA24A7E4A6C705B496D537F497F011F01FF70494C8090B600E0 -0A7F14F8B800E06E90C8000FB912C0A3745AA31B7C>162 136 120 -263 179 77 D[<BC12E01BFF1CF01CFE767E1DE01DF8D800074AC8000314FED9007F01F8 -DB001F7F6E49040314C0E1007F7F6E071F7F767F0A037F767F767F777F8B777F898B777F -A28B898BA38B89A32080AB2000A36567A267A2535BA2676567535B65679AB5C7FC525B0A -075B525B0A3F13E0525B0903B55A091F49C8FC0803B512F893BA5A1DC052C9FC1CF01C80 -09E0CAFC04F0CFFCB3B3AF4A7FA24A7F0107B612C0B912FEA7>113 -136 120 263 133 80 D[<BB12F0F2FFE01BFEF3FFC01CF81CFE767ED800074AC8003F14 -E0D9007F01F8030114F86E49DB001F7F090713FF6E060180756C13E00A1F7F767F767F76 -7F767F888B777F8B898BA2777FA28BA289A28BAA67A26567A2676567A2535B679AB5FC52 -91C9FC66525B525B5213E00A3F5B525B514848CAFC09075B093F13F050B512C0083F91CB -FC93B912F81CE051CCFC871CC004F0C814F0080F13FC080113FF746C7F7513E0090F7F75 -7F757F757F757F767FA2767F8A888A888AA3888AA78AA98AA8223879147CA288A4766E14 -FC22F8884A7F776D13014A6D1DF00107B600C0711503B900FE707F77ED07E0776D14C077 -6D130F776DEB3F80779039FFC0FF000C3FEBFFFED1000F5C0C035CE4007F13E00D031380 ->134 140 120 263 144 82 D<92380FFFC04AB512FC020FECFF80023F15F091B712FC01 -03D9F8017F4990C7383FFF80D90FF8020F7FD91FE002037FD93F806E7F49C97FD9FFE06F -7E6E6F7E486D826E6F7F486D816E83727FA3727FA36C496F7FA26C5B6D5A6D5AEB0FC090 -CAFCA8183F4CB6FC163F0303B7FC153F4AB5EAFE0102071480021FEBFC00027F13E049B5 -C7FC010713FC4913F04913C0017F5B90B5C8FC4813FC485BA2485B485B5A5C485B1C1F5A -91C9FCA3485AA260A460A26D5E7E606E151E6C94263E7FFC133E6E157C6C17F86C6D0201 -6D6C137C6C6DDA03F06D13FC6C01FC91260FE01FEB81F86C6DDA3FC0ECFFF06C6D6C9038 -FF800F6D9028F007FE000714E0011F90B5486D1480010703F06D1400010103C09038007F -FCD9003F91C8EA0FE0020101F092C8FC585B78D862>97 D<93381FFF804BB512FC030FEC -FF80037F15E04AB712F84AD9F80013FE020F01C0EB07FF4A90C87FDA7FFCED3FC04A48ED -0FE049496F7E4949ED3FF84949157F49494B7E4990C85A49484B7F60495A13FF5C5A485B -A248496F5BA248715B4A6F5B48725AF11F8096C8FC485BA35AA391CDFCA2B5FCAF7EA280 -A37EA280A27EA26C6DEF07C0A36C6D170F1B806C7F6C191F6E18006C616D6C173E1A7E6D -6C5F6D6D5E6D6D15016D6D4B5A6D6D4B5A6D6D4B5A6D6DED3F806EB44BC7FC021F01C0EB -01FE6E01F0EB07FC6E01FFEB7FF8020191B512E06E6C1580030F4AC8FC030114F0DB001F -90C9FC4A5B79D857>99 D[<F33F80071FB5FC060FB6FCA7F0000719008686A286B3B293 -380FFF804BB512F0030F14FE033FECFF8092B712E002039138007FF0020F01F0EB0FFC4A -0180EB01FE4A48C8127FDAFFFCED3F9F4901F0ED0FDF49496FB5FC4949814949814990CA -FC495A86494883495A48855C5A5C5AA2485BA25AA25C5AA35AA291CBFCA3B5FCAF7EA380 -A27EA37E80A27EA26C7FA26C7F627E6C6D5F97B5FC6D7E6D6C5E011F5F6D6C4C806D6D5D -6D6DDB1FDF7F6D6DDB3F9F7F6D01F8DB7F1F13FE6E6CDA01FE91B5FC6EB4EC07F86E01C0 -EB1FF002079039FC01FFE0020190B612806E6CECFE00031F14F8030302E016809226003F -FEC701C0C7FC>96 140 122 265 108 I[<EC03F848B5FCB6FCA7C67E130F7F7FA27FB3 -B3B3B3B3B3A6497F497F011F6D7EB812F0A7>44 138 122 265 55 -108 D<DA07F0DA3FFFEFFFFC48B54AB500F00307EBFFC0B6020F02FC033F14F0053F02FF -92B612FC4D03C04915FF932701FFC03F6D0107010080932703FC00076DD90FF0011F7FDC -07F001016DD91FC001077FDC0FC06D6D49C76C7FC66C4A486E6C017E6E7F010F4AC8003F -4A806D027C9326FF01F0826D4A6F4948157F03F10687836D4A60DBF3E06FD9CF806F7E4C -95C9FC03F718DF4C17DE03FF7001FE8293C94A84A24B60A34B60A54B60B3B3AC496D4C6D -4C7F496D4C6D4C7F013FD9FFC092B60303B512FCB8D8F003B8D8C00FB8FCA798587AD7A3 ->I<DA07F0EC3FFE48B50203B512E0B6020F14FC053F14FF94B77E4CD9807F7F932703FC -000F7FDC07F001037FDC0FC06D7FC66C4A486D7F010F023EC8127F6D4A826D4A6F7EEDF1 -F07FDBF3E06F7F5E15F75E03FF707F93C9FCA25DA35DA45DB3B3AD496D4C7F496D4C7F01 -1F6D6C92B512FCB8D8F007B81280A761587AD76C>I<933807FFC0047F13FC0307B612C0 -031F15F0037F15FC913B01FFFC007FFF020701E0010F13C04A90C700017FDA3FFC913800 -7FF84A486F7EDAFFE0ED0FFE49496F7E49496F7F4990C96C7F4948707F011F854948717E -4948717EA24948717E48864A83481B804A83481BC0A2481BE04A83481BF0A3481BF8A291 -CB7E481BFCA5B51AFEAE6C1BFCA46E5F6C1BF8A36C1BF0A26E5F6C1BE0A26C1BC06E5F6C -1B806E5F6C1B006C626E173F6D6C4D5A013F616D6C4D5A6E5E6D6D4B5B6D616D01E0030F -5B6D6D4B90C7FC6D6C6CED3FFCDA3FFEEDFFF86E6C6C01035B020701E0010F13C0020101 -FC017F90C8FC6E90B65A031F15F0030715C003004AC9FC040713C0575B7BD862>I<DBFF -FC14E0021F9038FFC00191B6EAF8030107EDFC07011FEDFF0F49D98007139FD9FFF8C713 -FF4801C0141F4890C8120748488149814848814848167F183F485A181F485A180FA200FF -1707A46D1603A27FA27F7F7F6C6C6C92C7FC14E014F86CEBFF8015F86CECFFC06C15FEEE -FFE06C16FC6C16FF6C17C06C83013F16F86D826D8201038201001780021F16C0020316E0 -DA001F15F01500040714F8EE007F051F13FC17070078040113FE00F882187FF03FFF6C83 -84A2847EA2847EA36D17FEA27FA26DEE07FCA27F6DEE0FF8A26DEE1FF06DEE3FE06D167F -02C0EDFFC0D9DFE04A1380D98FF802071300D907FEEC3FFE903B01FFE003FFF8486C90B6 -5A48013F15C0486D92C7FC48010314F848D9003F90C8FC405B7AD84D>115 -D<B84AB612FCA7C66C02C0DA003F1480010F49C9000FEBFC006D49040313F06D725B1C80 -6D7290C7FCA26D616F5F147F6F5F1A016E607015036E60821A076E6070150F6E60821A1F -6E95C8FC705D6E173E821A7E6E177C7015FC037F5E8219016F5E7113036F5E8319076F5E -71130F6F5E83191F6F93C9FC715B6F153E83197E6F157C7113FC047F5C831801705C1883 -705C18C318C7705C18EF705C18FFA27091CAFCA2705BA3705BA2715AA3715AA2715AA371 -5AA260A2171F95CBFCA2173EA2177E177CA217FC5F16015FA216035FD803C01407D81FF8 -5D486C140F486C5DA2B54ACCFC5E163E167E167C16FC49495A007F4A5A49130749495AD8 -3FE0495AD81F80495A01E001FFCDFC390FFC07FE6CB55A00015C6C14E0013F1380D907FC -CEFC5E7F7CD567>121 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fm cmcsc10 17.28 2 -/Fm 2 81 df[<B596387FFFF891BCFCA9C7003F05FCD1FC020004FCD2FC033F15F06F15 -C06F5DA26F92D3FCB3B3B3B3B3AFA1EB0FF0A5A1EB1FE0A8A1133FA114C0A5A1137FA4A1 -1480A113FFA4A15AA3A15AA2A11400A15AA2A15AA2A15AA2A15AA2A1485AA2A112FF6BA2 -6B6B6B6B6B595BA0B5FC22036A221F6A9FB6FC4B1D03211F4B6F077F5D4B0A07B7FC92B7 -6C187F023F04F8053FB8FCC5B4FCA5A15BA5>164 196 113 323 -196 76 D[<C112C0F8FF8021FCF9FFC022F822FF23C023F023FE7D7EC7003F04F0CA001F -8202000480DD003F15F0033F92CC000315FC6FE2007F806F4A081F6E7E0F03816F0B0081 -7C80101F14FC7C807C801001817C817D80A1808F7D807D80A1808FA1807D1580A2A115C0 -8FA115E0A2A115F08FA2A115F8A3A115FCA17EA4A115FEACA115FCA4A1B6FCA115F8A3A1 -15F0A25915E0A2A115C0A2591580A2591500A15CA2595C595CA2595C595CA0B65A585D58 -92C7FC585C585C5814F0107F5C57B65A0F0792C8FC0F1F5C0F7F14F80E07B65A0E7F15C0 -0D1FB7C9FC95BE12FC23F0238058CAFC22F09FCBFC21F00EFCCCFC96D4FCB3B3B3B3A24B -81A24B814B8192B712F8023FEEFFE0BD12F8A991CB1207>175 196 -112 323 213 80 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fn cmr17 17.28 27 -/Fn 27 118 df<BB12FEAD470D7FC457>45 D<137F3803FFE0487F487F487F487F487FA3 -B61280A76C1400A36C5B6C5B6C5B6C5B6C5BC66CC7FC1919699848>I[<F0FFFC051FEBFF -E094B612FC040315FF041F16E0047F16F893B5D8C00F7F030301FCC713FF030F01E0021F -13C04B018002077F4B90C86C7FDB7FFC03007F4B48707E02034970B4FC4A49707F4C824A -49707F4A90CA6C7F4A48717F4A48717F4B187F02FF864949727EA24949727E49884B8449 -884B844988A24990CC6C7FA34948737FA201FF88A24A854889A34889A24A86481E80A448 -1EC0A24A86A2481EE0A6481EF0A54A86A2481EF8ACB51DFCB3B3A46C1EF8A86E62A46C1E -F0A76C1EE0A36E62A26C1EC0A46C1E80A26E97B5FCA26C1E00A46C6D4F5BA36C65A26D6C -4F5BA36D6D4E5BA26D646F606D64A26D6D4E5BA26D6D4E90C7FCA26D6D4E5A6D636F18FF -6E6C4D5B6E6C4D5B6E62705E6E6D4C5B6E6D4C5B6E6D4C90C8FC6E6D4C5A6E01FE4B485A -DB3FFF4B13F06F01C0020F5B6F01F0023F5B030301FC91B5C9FC6F9026FFC00F5B6F6C90 -B612F8041F16E004071680040003FCCAFC051F14E0050001FCCBFC>110 -195 118 317 132 48 D[<F40FC0527E1C3FA21C7FA21CFF63A26363A263A26363A26398 -B5FCA262A26262A26262A2F23FBFA2F27F3F1AFEA2F101FC19031AF8F107F0A2F10FE0F1 -1FC0A2F13F80A2F17F0019FEA24E5A4E5AA24E5AA24E5A4E5AA24E5A4EC7FCA218FEA24D -5A4D5AA24D5A170F604D5AA24D5A4DC8FCA217FE16015F4C5AA24C5A4C5AA24C5AA24C5A -4CC9FCA216FE4B5AA24B5AA24B5A4B5AA24B5A4B5AA24BCAFCA215FE4A5AA24A5A14075D -4A5AA24A5A4A5AA24ACBFC5C5C495AA2495A495AA2495AA2495A495AA249CCFC13FEA248 -5AA2485A485AA2485A485AA2485AA248CDFC12FEC2FCA8CE6C01E0C8FCB3B198B57EA250 -805080080F14FF4FB712F84DBB12F8A8>120 192 123 319 132 -52 D[<1D7F537EA3527FA3527FA2527FA3527FA3527FA3527FA3527FA399B67EA35181A2 -5181A21CF90907811CF11CF0090F816489091F811CC089093F811C8089097F811C008951 -826308016E80A2517F08038363890807836389080F83638A081F83638A083F83638A087F -8398C8FC506F80A25081070185628A070385628A070785628A070F85628B071F8562073F -717FA25082077F85A297CA7E4F86618B060187618B060387618B060787618B060F876106 -1F737FA24F84063F87A24F84067F8796CCFC8C4E88608C050189608C050389608C050789 -60050F748095BEFCA24D89A34D89A3DD7F80CD001F7F95CEFC8D4D8A5F8D04018B5F8D04 -038B5F04077680A24D87040F8B5F8E041F8B5F8E043F8B5F8E047F8B94D0FC8E4C8C5E8E -03018D5E03037880A24C8903078D5E8E030F8D5E8F031F8D5E8F033F8DA24B488AA17F15 -FF8F4A6D8D5C7D804A7F4A8F023F6D664A6D8D49B56C548001076E5480011F6E6C9AB7FC -48B700F00A0F16F0B96C081FBA1280A8>185 203 122 330 199 -65 D[<BF12F0F6FFC01FFCF7FFC020F020FE7A7E21E0D800034BCA000315F8D9001F02F8 -DD001F14FE02074A06016E7EE4003F806E4A070714F00D01806E766C13FE0E1F7F0E0780 -7A800E0014F07B7F7B7F0F0F7F7B7F7B807B807B807C7F7C7F8E7C7F7C7F7C7FA17F8E7C -80A17F8F7D7FA17F8FA17F7D7F8FA17F8FA180A27D80A27D80A2A16C7FA2A180A17EA180 -A3A16C7FA3A16C7FA3A11580A2A17EA115C0A4A16C14E0A4A115F0A4A17EA2A115F8A8A1 -15FCB3A4A115F8A7A115F0A2A15AA4A115E0A3A15AA115C0A4A11580A15AA2A11500A2A1 -5AA15CA2A1485BA3A15CA15AA15CA1B5FCA15CA2595CA2595CA25991C7FCA2595BA15B6B -595BA15B6BA15BA0B55A6A585CA190C8FC585B585B585B6A585B9FB55A575C575C0F0F91 -C9FC575B575B9EB512F0565C0E075C565C0E3F49CAFC4A9AB55A0D0714F04A6E071F5C9C -B61280021F6E060F92CBFC0103B600FE0503B612FCC212F021C056CCFC20F820C055CDFC -1FE00CF0CEFC>174 196 114 323 203 68 D[<C5FCA5A17EA3D800034BCB1201D9001F -02F8F0000102074AF1001F20016E4A747E211F6E0C078021018D8E221F8EA28E8E7C7FA2 -8E237FA3233FA2231FA17EA2230FA32307A47D7EA42301A5A17EA22300A51E3FA2A1127E -A5A1C7FCA666A666A365A265656565656552B5FC1C0F0903B6FC94BBFCA805E0C81203F3 -000F1C01767E898989898989A289A38AA68AA5A1137EA4A113FCA49BCCFCA3A1EA01F8A6 -A11203A113F0A4A11207A4A1EA0FE0A4A1121FA3A113C0A1123FA3A1127FA2A112FFA113 -80A26BA26B6BA2591300A26B6B6BA0B5FC6A6A585B221F6A9FB5FC4A1E03211F4A6E1B7F -0E07B65A021F6E1A7F0103B600FE077FB7FCC5FCA4A15AA4>159 -196 114 323 180 I[<BB12F0A8D8000104F8C7FCD9000F92C8FC6E5C6E5C6E5CA26E5C -B3B3B3B3B3B3B3B3B3A64A80A24A804A804A8049B712F8BB12F0A8>68 -196 116 323 94 73 D[<0403BB1280A893C86C4BC7FC070115E0736C5C745C869AC8FC -86B3B3B3B3B3B3B3AA133F3801FFE0487F000F13FC487FA2487F4880A2B67EA3505BA54B -6062A26C91CA5C5C4A4D5B5C6C4994B5FC02C06101C0CB5C6C6C5F646C6C5F99C9FC6C6C -4D5B6C6C616D5F00014E5B6C6C4D5B6D6C60D93FE04C5B6D6C93B55AD90FFC4B91CAFC6D -6C03075B6D6C6C4A13F86D01F0023F5B6D01FE91B512C091273FFFE0075C020F90B648CB -FC6E16F8020116E0DA003F92CCFC030714F8DB003F90CDFC>105 -201 115 323 135 I[<BB12FEA8D8000304FCD0FCD9001F92D1FC020714FC5F6E5CA26E -5CB3B3B3B3B3B3FA01F8A5FA03F0A92207A223E0A4220FA5221F23C0A4223FA3227FA3FA -FF80A269A269A269A269A26957130069A29EB5FC686868201F686855B55A1F074A1C1F1F -7F4A6E4EB6FC1E0F021F6E95B7FC0103B600FE173FC3FCA36AA5>141 -196 115 323 165 76 D[<B800F00F7FB712FCA2719EB8FCA27168A37168D80003A194C7 -FCD9001FA115E0DA07FB6DE607EF1480A2DA03F96EE50FCF91C8FCA20201A15C03F86EF7 -1F8FA3706DF73F0FA3706D1F7EA2706D1FFCA3706DF601F8A3706DF603F0A3706DF607E0 -A2706EF50FC0A3706EF51F80A3716DF53F00A2716D1D7EA3716D65A3716D525AA3716D52 -5AA2716D525AA3716E515AA3716E515AA3726D51C7FCA2726D1B7EA3726D63A3726D505A -A3726D505AA2726D505AA3726E4F5AA3726E4F5AA3736D4FC8FCA2736D197EA3736D61A3 -736D4E5AA3736D4E5AA2736D4E5AA3736E4D5AA3736E4D5AA3746D4DC9FCA2746D177EA3 -746D5FA3746D4C5AA3746D4C5AA2746D4C5AA3746E4B5AA3746E4B5AA2756D4BCAFCA375 -6D157EA3756D5DA3756D4A5AA2756D4A5AA3756D4A5AA3756E495AA3756E495AA2766D49 -CBFCA3766D137EA3766D5BA3766D485AA2766D485AA3766D485AA376EC8FC0A376ECDF80 -A27701FFCCFCA3775B4A7EA2775B4A7EA24A6C735B4A7F77494F7F027F13E091B56C5880 -010302FC725B010F02FF9FB612E090B700F00E1F15FFB900F070490407BA12FCA3775BA2 -78CAFCA21E3E>214 196 114 323 244 I[<B800E00807B912808383A28383A283C76CE3 -0007EE800002016FE0007F02F8C7FC72091F14E010071480727591C8FC100013FC03FB80 -03F96E765A7D5A03F88070785A84707F70785A857080A2708082857080A270808385717F -A27180838671808386838671808486727FA2728084877280A27280848772808587858773 -8085887380A2738085887380A2747F86887480A274808689748086898689757F87897580 -A27580878A7580A27580878A767FA2767F888B7680888B888B7680888B777FA2777F898C -7780A27780898C7780898C8A8C787F8A8D7880A278808A8D7880A278808B8D797FA27914 -808B22C07914E08B22F08B22F87914FC8C22FE7A13FFA27A148F8C23CF7A14EFA27A14FF -8CA28CA28D8DA28D8DA28DA28D8DA28D4A7E8E8E4A7E8E4A7E4A6D898E027F13E091B56C -89010302FC89010F14FF90B700F088B912F0237F233FA2231FA2230F7D5A>169 -196 114 323 199 I[<99387FFFC0093FB67E0803B712F8081F16FF97B912E0070718FC -073F9126C0007FEBFF8096B500F8C7000314E0060302C0DA007F13F8060F49C9000F13FE -063F01F004016D7E4E01C0706C7F4DB5CB001F13F0050701FC060713FC4D49727F053F01 -E006006D7E4D49737F94B5CD001F7F0403497413F84C49747F4C01F008017F4C49747F4C -49757F4C49757F93B5CF6C7F4B49767F4B49767F4B49767F4B8C4B49767F4B4976804B49 -777F92B548777FA24A91D16C7F4A49787F4A8E4C8A4A8E4A49787F4A497880A24A497880 -A291B548797F49A17E4C8B49A17E93D37E49A17EA249497A7FA249497A7FA249A17F4B8C -49A17FA290B5487A80A3484A7A80A348A1804B8DA248A180A3484A7B7FA448A180A292D5 -7EA248A11580A548A115C0A24A8EA6B5A114E0B3A36E6A6CA115C0A86CA115806F69A56C -A11500A26F69A26CA15CA36F9EB5FC6CA15CA36C6E565CA36CA15C6F68A26CA15C6F686D -A15BA26F686DA15BA26D6D5691C7FCA26D6E555BA26D6E555BA26DA15A6D6E9CB55AA26D -6E545CA26E6D545C6E6D545CA26E6D5491C8FC6E6A70666E6E535B6E6A6E6E535B719AB5 -FC6E6A6F6D525C6F6D525C6F6D5291C9FC6F6D525B6F6871646F6E515B6F6E515B6F6E98 -B55A043F6D501480706D5091CAFC7001FE080F5B706D505B706E4F5B04006E4F13E07101 -F04EB55A716D4E5C050F01FE060F49CBFC716D6C053F5B050102E094B512F07102F80403 -5C063F01FE040F1480060FD9FFC0037F49CCFC060302F80203B512F80600DAFFE090B612 -E0073F91B81280070706FCCDFC070118F0DF003F1780080304F8CEFCE0003F1580E1007F -01C0CFFC>179 206 115 328 207 I[<BF7E1EFEF6FFE01FFEF7FFC020F020FC20FFD800 -034BCA001F15C0D9001F02F8DD007F14F002074A060714FC0C00806E4A073F6D7E0D0F80 -6E0A03800D0014F87A7F0E1F7F7A7F7A807A807A807A80A27B7F7B7F8F8D8F8DA112807B -14C0A2A112E08DA2A112F08DA112F8A4A112FC8DA3A112FEAEA112FCA369A112F8A3A112 -F0A269A112E0A25714C0A2A1128069A11200696B575B6B699EB55A6B565C565C5691C7FC -565B0E3F5B565B9DB55A0D0314C00D0F5C0D3F91C8FC54B512FC0C0714F00C7F5C0B1FB6 -128094BC48C9FC20F020C055CAFC1FF054CBFC1E8005E0D2FCB3B3B3B3A54A80A24A80A2 -021F14FE0103B712F0BB12C0A8>151 196 114 323 180 I[<942607FFF8170F4CB612E0 -040F03FC5E047FEDFF804BB800F05D030717FC031F05FF5D037F18C092B526FC000F6E5C -020302C0D9007F13F84A49C800076D5B4A01F003007F4A01C0DC3FFF5B027F49040F1380 -4A48CA0003EBE0074901F8050013F04949067F5B4BF01FF84949726C5A4949F007FE4990 -CC3801FF3F49487313BF494874B5FCA24948864A8648884849865C488889485B8991CFFC -4889A24988123F8AA2007F895B8AA300FF89A48AA36D88A56D89A3807E808BA2806C7FA2 -806E99C7FC7E80806C80816C80816C8015FE6C6E7E826C15F06D14FEEEFFC06D15FC6DED -FF806D16F8F0FF806D17F86DEFFF806D18F06D18FF6E18F06E18FF6E19E0020719FC6E19 -FF6E1AC06E6C19F0031F856F19FE030385DB007F85041F19E0040185DC003F84050384DD -003F83060383DE003F83070783F1007F080782E0007F810907811B000A3F800A0F801C03 -7680767E771480897714C0897714E0898920F08A8A20F88AA28A20FC8A127C00FC89A378 -13FEA38AA37EA21F7FA47EA420FC7FA37F1FFF20F87FA27F5413F07FA26D5213E0A26D1E -C0667F6E51138080541300806E515A6E646E1B7F6E515A6E6401FD6D6101FC6D4F5B9026 -F87FF04F5B6E6C4F5B9026F01FFE4F90C7FC6E6C4F5A496C01C04E5A6E01F04D485A496C -01FC4D5B6E6CB46C040F5B496D01F0043F5B030F01FE93B55A90C76CD9FFE0020791C8FC -0301DAFFC090B512FC486E6C91B75A041F18E0480307188004004DC9FC48043F16F80503 -16C048DC003F4ACAFCDE007F13C0>119 206 115 328 147 83 D[<0007C5B51280A648 -A114C0A24CC96C02F8C812010480041F02E0ED000703FCCA6C4A160003E0201F0380714A -17074ACB1B0102F87B7E4A8E02C0220F4A8E91CC8848A114E0498F498FA249A1127FA249 -A1123FA349A1121FA349A1120F003FA114F0A349A11207A590CD1D03A548A114F8A3007E -A11301AA48A1EB00FCA6CE1E00B3B3B3B3B3B3A85180A25180A2097F14F850B612FE97B8 -12FC0507BD7EA8>174 195 120 322 192 I[<BB00C0050FB91280A8D8000304F0CD000F -EE8000D9001F4ACF03F8C7FC020702F80A3F14E0100F14806E4A7691C8FC100113FC6E5C -7C5B7D5AA27D5AA37D5AB3B3B3B3B3B3AB6E565AA283A46F1F7FA1C9FCA36F7F23FEA36F -1E017165A26F1E036B6F7F22076B6F6D1C0F6B6F1E1F72646F1E3F706D64227F706D99CA -FC6A706D505A8272505A706D505A701C0F706D505A706D63734F5A716D197F71515A716D -060390CBFC7101F84E5A716D4E5A716DF03FF8716D4E5A716C01C04C485A7201F004075B -7201FC041F5B7201FFDC7FFECCFC060302C0913803FFFC7202F8021F5B726C9026FFC003 -B512E0071F91B75A070795CDFC070117FC736C16F0081F16C008034BCEFCE0003F14F009 -0049CFFC>169 201 114 323 199 I[<000FBA00C00603B912E0A8C76C04FCCD6C04F0C7 -FC020304E0080F03FCC8FCDA007F03807415E06F92CE6C92C9FC6F4A7514FC6F4A7514F0 -6F696F7913806F9ECAFCA15A6F6E65706D65A15A706E64706E64595A706E99CBFC706E62 -73505A7066706E1A07706E505A6B716D1A1F716E4F5A6B716E4F5A716E19FFA0CCFC716E -4E5A716E18036A716E4E5A716E180F6A726D4E5A726E173F6A726E4D5A726E17FF5690CD -FC726E5F726E1603565A726E5F726E160F565A736D5F736E4B5A207F736E5E736E4BCEFC -765C7360736E4A5A736E140768736E4A5A746D141F555A746E5C746E137F555A746E91CF -FC746E5A545A7402F85B74ECFC07545A7402FE5B756D485A1E3F75ECBFC075ECFF80A275 -92D0FC755CA2755C87A27580767FA2768076808B8876807680648B5280648B5281640B9F -80E2FF0F8063526C8051486C801B0751486C80526C801B1F51486D7F526D801B7F51486D -8099C76C806250486E80516E80505A080F6F80516E80505A083F707F516F8050488408FF -8298C96C804F48850703834F487080507080190F4F48708050717F193F4F487180507180 -19FF4E90CB6C804F72804E5A060773804F72804E5A061F73804F737F4E5A067F74804F73 -804ECDFC4D75804D48748060050775804D48748060051F75804D48757F604D48758005FF -768095CF814C4888040377804D76804C5A040F77804D7680161F4C48777F047F788016FF -4B79804B79805D4B79804B8E037F7F92B5548002036E8C021F6E536E7E027F6E0B7F8101 -07B79AB712F090B800E00907EEFF80B900FC98BA12FEA8>191 196 -125 323 199 88 D<933801FFFC043FEBFFE04BB612FE030FEDFFC0033F16F092B812FC -4ADA001F13FF020701F00101804A01806D6C13E0DA1FFCC8000F7FDA7FF06F7FDAFFC003 -0113FE4990CA7F4948717F4A717F4948717F4948834948717F4A854948717F8649CB8002 -FC717F90B5FC6F717F816F717F4880A26F717FA48987A36C5CA26D5B6D5B6D5B6D90CBFC -EB01F890CDFCAA0703B6FC0603B7FC95B8FC170F94B9FC040FEDFC0F043FECFC004BB6C7 -FC030714F0033F148092B500FCC8FC020314F04A1480021F49C9FC4A13F891B55A4914C0 -495C4949CAFC495B495B495B495B90B55A485CA24891CBFC485BA2485BA248491D3FA248 -5BA3485BA4B54860A563A363A26E95B5FC7E621BF76E17036CDF07E36D147E806CF10FC3 -6EDD1F836D14FE6C6DDD3F0116FC6C6D057F6E13016C07FE17F86C6E922603FC006D1303 -6C02E04B486D90388007F06D6DDB1FF09238C00FE06D01FCDB7FC06DEBF03F6D01FF4A48 -486D90B512C06D02C0010F90C71680010302FCD9FFFC6E1500010091B6486E5C023F04E0 -020114F8020F04806E5C020103FCC9003F1380DA001F02E0DC07FCC7FC030049CEFC7881 -75FE84>97 D[<F601F8F51FFF99B6FC1B3FA8F3000F1C001D3F89A289A389B3B3B2F07F -FF050FB512F0057F14FE0403B712C0040F16F0047F16FC93B539FC007FFF030302800107 -1380030F01FCC813E04B01F0ED3FF0037F01C0ED0FF892B5C9EA03FC4A49EE01FE4A01F8 -EE007F4A49EF3F874A49EF1FC74A49EF0FE74A49EF07F74A90CB6CB5FC4A48844949845B -4949854B855B4949855D4987495B8990B5CDFCA25A5C5AA2485BA35A5C5AA35C5AA45AA3 -5CA3B5FCB27EA480A37EA47E80A27EA36C7FA36C7FA27E806C64A26D6D61A26D6D616D63 -816D98B5FC6D6D60816D626D6DF007F76D6DF00FE76E6CDE1FC77F6E6DEF3F876E6DEF7F -076E6D05FF806E6DEE03FC6E6DDC07F8806E01FEDC1FF015C06E6DDC3FE015FC6F01C0DB -FFC092B5FC031F01F0020713806F01FE91383FFE000303903AFFE003FFF8030091B65A04 -3F16C0040F93C7FC040315F8DC003F02C0EFFE00050301F8C801FCC8FC>128 -201 119 326 147 100 D<943801FFFC053FEBFFE04CB612FE0407EDFFC0043F16F093B8 -12FC4BDA801F13FF03079026FC000180031F01E0D9003F13E04B0180020F7F4B48C86C7F -4B4803017F020301F06F7F4A49707E4A49041F7F4A49844A90CA6C7F4A48717F02FF727F -5D4949717F49498549854949858849491A8049864B1AC0498692CCFC90B51BE08848491B -F0A25A4A85481DF8A2485BA27613FC5AA25CA25AA21EFEA24887A25CA391BDFCBFFCA41E -FC02E0CFFCAD7EA380A37EA56C7FA37E80A27E1E3C6C6D1B7EA26C1DFE6E1BFC7E6F1901 -6D1CF8A26D6D19036D1CF06F19076D6D1AE06D1B0F6FF11FC06D1C806D6D193F6D6DF17F -006E6C197E6E6D18FE6E6D4D5A6E6D4D5A6E6D4D5A6E6D4D5A6E6DEF3FC06E01FF4D5A6F -6D4B48C7FC6F01E04B5A030F01F8ED0FFC6F01FEED7FF00301D9FFC0903803FFE06F6C01 -FE013F1380041F90B7C8FC040716FC040116F0DC003F1580050702FCC9FCDD003F138067 -8179FE75>I[<ED07E0EC7FFF0003B6FCB7FCA8EA003F1303130080A280A380B3B3B3B3B3 -B3B3B3B3A54A7FA24A7F91B57E010FECFFC0B912FCA8>54 199 119 -326 72 108 D<DB0FC092383FFF80DA7FFF0303B512FE0007B6031FECFFC0B792B712F0 -060316FC4E16FF061FD9801F8095273FF8000114E0DE7FC0D9003F7F4D48C8000F7FDD03 -FC6F7FD8003F4B486F7F0103DB0FE08101004B486F7F6E4A48707F95CAFC6E027E717F5F -DCC1F8717F80DCC3F0717FEEC7E0A2DCCFC0834D8516DF94CBFC16FF5E777FA25EA35EA3 -5EA65EB3B3B3B04A6D4E7FA24A6D4E7F91B56C4E80010FDAFFC04CB612F8B900FC021FB9 -1280A8817E77FD93>110 D<DB0FC0913803FF80DA7FFF033F13F00007B692B512FEB702 -0380060F1580063F15E04E48C613F09538FFE0014DD9800313F84D48484813FCDD07F85B -D8003F4B5A01034B484913FE01004B5A6E5D4DC7FC6E14FE5FEEC1F86E7113FCEEC3F004 -C76F13F84D6E13F07413E0DCCFC06E13C098C7FCEEDF80A294CBFC16FFA25EA35EA35EA5 -5EA75EB3B3B3A9825C824A7F91B57E010FECFFF0BA12E0A8577E78FD66>114 -D<93263FFFE0140F030FB500FE5C92B712C0020704F05B021F04FC5B027F04FF5B49B526 -C0007F1381010701F8C7000713C14901C0020013E34948C9EA3FF7D93FF8040FB5FC4948 -82D9FFC016014849824890CB7E484884A24848844984121F86485A86127F4984A286A212 -FFA287A27FA36D85A27FA27F6C7E80806C13F06E95C7FC14FE6C6D7E15E06C14FC6CECFF -8016FC6CEDFFE06C16FF6C17F06DEEFF806D17F06D17FC6DEFFF806D18E00101846D18FC -023F83020F83020318C0020084031F83030183DB000F82DC007F81050781EF003F060315 -80DE007F14C0190F070314E085736C13F0007C8500FC070F13F886866C1BFC86861B7F1C -FE6C1A3FA31B1F7FA21B0F7FA37FA21CFC7FA27F1B1F6D1AF8A27FF33FF07FF37FE0806E -F0FFC0805013806E4D13006E5FD9FBFC4D5AD9F1FF4D5A01E06D4C5A6E6CEEFFF09026C0 -3FF003035B9026801FFC031F5B6EB46C91B5C7FCD9000301FC011F5B486D90B712F86E6C -16E048021F168048020703FCC8FC030015C048030F01F8C9FC578179FE67>I[<163FAA5E -A75EA55DA45DA35DA25DA35DA25DA25D92B5FCA25C5C5CA25C5C5C91B6FC5B1307131F01 -7F92B8FC0007BCFCBDFCA6C891CBFCB3B3B3AAF303F0B3A7F307E06F7FA4F30FC06F7FA2 -1B1F6F1880836FEF3F00836F177E836F5F7114016F6D5D6F6D4A5A706D1307706DEB1FE0 -7001F0EB7FC0709039FE01FF807090B6C7FC04015D706C14F8051F5C050314809426003F -FCC8FC>84 178 125 303 102 I<DB07E01AFCDA7FFFF10FFF0003B6067FB5FCB7051FB6 -FCA8D8003FF100070103F2007F01001B1F6E86A26E86A36E86B3B3B3AE65A565A465A365 -8065A29AB5FC7018FB6E19011DF31C036EF107E382E20FC37F6EF11F8370EF3F036E077F -806F6C17FE70DC01FC816F6DDB03F815E06F6DDB0FF015FE6F01F0DB3FE092B512806F01 -FCEDFFC06F01FF02031300030002F8EB3FFE7090B65A041F16F0040716C0040193C7FCDC -001F02F895C7FCDD007F01804BC9FC818077FD93>I E -%EndDVIPSBitmapFont -end -%%EndProlog -%%BeginSetup -%%Feature: *Resolution 1200dpi -TeXDict begin -%%PaperSize: A4 - -%%EndSetup -%%Page: 1 1 -1 0 bop 2617 1526 a Fn(Lustre)86 b(4X)g(and)f Fm(LPP)3214 -1891 y Fn(release)f(0.0)3093 2396 y Fl(P)-5 b(ascal)62 -b(Ra)-5 b(ymond)3231 2804 y(Ma)g(y)64 b(24,)h(2002)0 -3576 y Fk(Con)-7 b(ten)g(ts)0 3984 y Fj(1)168 b(t)-6 -b(yp)6 b(es)6743 b(3)273 4210 y Fi(1.1)185 b(Immediate)57 -b(t)-5 b(yp)5 b(es)151 b(.)90 b(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f -(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.) -h(.)f(.)g(.)h(.)f(.)h(.)f(.)348 b(3)273 4435 y(1.2)185 -b(T)-5 b(yp)5 b(e)61 b(declaration)g(and)f(built)h(t)-5 -b(yp)5 b(es)130 b(.)91 b(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.) -h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)348 -b(3)273 4661 y(1.3)185 b(Use)60 b(of)g(structured)g(t)-5 -b(yp)5 b(es)183 b(.)91 b(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.) -h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h -(.)f(.)348 b(4)0 5069 y Fj(2)168 b(Static)70 b(parameters)5605 -b(4)273 5295 y Fi(2.1)185 b(Declaration)61 b(of)f(template)e(no)5 -b(de)145 b(.)90 b(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f -(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)348 -b(4)273 5521 y(2.2)185 b(No)5 b(de)61 b(expression)185 -b(.)90 b(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.) -h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h -(.)f(.)348 b(5)691 5746 y(2.2.1)207 b(Prede\014ned)60 -b(op)5 b(erators)95 b(.)c(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f -(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.) -348 b(5)691 5972 y(2.2.2)207 b(T)-15 b(emplate)59 b(instanciation)h(.) -90 b(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.) -f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)348 b(5)273 -6198 y(2.3)185 b(Static)60 b(recursion)90 b(.)h(.)f(.)g(.)h(.)f(.)h(.)f -(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.) -h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)348 b(6)273 -6424 y(2.4)185 b(Static)60 b(arrra)-5 b(ys)110 b(.)90 -b(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f -(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.) -h(.)f(.)348 b(6)0 6831 y Fj(3)168 b(Name)68 b(space)h(and)g(pac)-6 -b(k)-12 b(age)4956 b(6)0 7239 y(A)115 b(Abstract)69 b(syn)-6 -b(tax)5764 b(7)3758 11695 y Fi(1)p eop -%%Page: 2 2 -2 1 bop 3758 11695 a Fi(2)p eop -%%Page: 3 3 -3 2 bop 0 797 a Fk(In)-7 b(tro)7 b(duction)0 1203 y Fi(Lustre)60 -b(4X)90 b(is)h(a)f(\(new\))g(v)-5 b(ersion)90 b(of)g(the)g(Lustre)f -(Langage)h(whic)-5 b(h)91 b(deriv)-5 b(es)90 b(form)e(the)i(Lustre)g -(v4)g(\(ak)-10 b(a)0 1429 y(Lustre/P)-5 b(ollux\).)80 -b Fh(LPP)61 b Fi(is)f(the)h(assso)5 b(ciated)59 b(to)5 -b(ol)61 b(\(lik)-5 b(e)61 b(P)-5 b(ollux)61 b(w)-5 b(as)61 -b(with)g(Lustre)f(v4\).)80 b(The)61 b(main)f(inheri-)0 -1655 y(tence)69 b(from)g(Lustre/P)-5 b(ollux)70 b(are)g(static)f(arra) --5 b(ys)70 b(and)h(static)e(recursion,)j(b)5 b(oth)70 -b(solv)-5 b(ed)70 b(b)-5 b(y)71 b(t)-5 b(yp)5 b(e)69 -b(and)i(no)5 b(de)0 1880 y(expansion.)282 2106 y(By)61 -b(the)f(w)-5 b(a)g(y)-15 b(,)60 b(Lustre)f(4X)i(is)g -Fg(not)66 b(c)-9 b(omp)g(atible)58 b Fi(with)j(Lustre/P)-5 -b(ollux)60 b(for)g(the)h(follo)-5 b(wing)61 b(reasons:)273 -2407 y Ff(\017)91 b Fi(Structured)82 b(t)-5 b(yp)5 b(es,)87 -b(with)c(named)e(\014elds,)87 b(are)c(pro)-5 b(vided,)88 -b(instead)82 b(of)g(the)h(error-prone)f(notion)h(of)455 -2633 y(heterogeneous)59 b(arra)-5 b(ys)60 b(of)g(Lustre/P)-5 -b(ollux.)273 2978 y Ff(\017)91 b Fi(En)-5 b(umerated)58 -b(t)-5 b(yp)5 b(es)60 b(are)g(pro)-5 b(vided.)273 3324 -y Ff(\017)91 b Fi(Static)59 b(parameters)e(are)j(generalized)g(to)f(t) --5 b(yp)5 b(es)59 b(and)g(no)5 b(des,)59 b(and)g(they)h(are)f(clearly)h -(separated)f(from)455 3550 y(the)69 b(dynamic)f(parameters.)106 -b(In)70 b(fact,)g(Lustre)60 b(4X)70 b(pro)-5 b(vides)70 -b(a)g(quite)f(classical)i(notion)e(of)h(program)455 3775 -y(templates.)0 4334 y Fk(1)269 b(t)-7 b(yp)7 b(es)0 4740 -y Fi(W)-15 b(e)60 b(distinguish)h Fg(typ)-9 b(e)65 b(denotations)d -Fi(\(or)e(immediate)e(t)-5 b(yp)5 b(es\))59 b(and)i Fg(typ)-9 -b(e)65 b(de\014nitions)c Fi(\(or)g(built)g(t)-5 b(yp)5 -b(es\).)0 5213 y Fe(1.1)225 b(Immediate)72 b(t)-6 b(yp)6 -b(es)0 5556 y Fi(Immediate)63 b(t)-5 b(yp)5 b(es)66 b(are)h -Fg(typ)-9 b(e)71 b(expr)-9 b(essions)67 b Fi(used)f(to)g(declare)h(the) -g(t)-5 b(yp)5 b(e)66 b(of)g(a)h(constan)-5 b(t,)67 b(a)g(v)-10 -b(ariable,)68 b(a)f(\014eld)0 5782 y(etc.)80 b(They)60 -b(are:)273 6083 y Ff(\017)91 b Fi(prede\014ned)60 b(t)-5 -b(yp)5 b(es:)455 6309 y Fd(bool)58 b Ff(j)i Fd(int)f -Ff(j)h Fd(real)273 6654 y Ff(\017)91 b Fi(iden)-5 b(ti\014ers)62 -b(of)f(declared)i(t)-5 b(yp)5 b(es)61 b(\(wic)-5 b(h)62 -b(are,)g(dep)5 b(ending)63 b(on)f(their)g(de\014nitions)g(external)g(t) --5 b(yp)5 b(es,)62 b(built)455 6880 y(t)-5 b(yp)5 b(es)59 -b(or)i(simple)f(aliases\):)455 7106 y Ff(j)g Fg(ident)273 -7451 y Ff(\017)91 b Fi(immediate)57 b(arra)-5 b(y:)455 -7677 y Ff(j)60 b Fg(typ)-9 b(e-expr)g(ession)60 b Fd(^)g -Fg(c)-9 b(onstant-expr)g(ession)0 8150 y Fe(1.2)225 b(T)-6 -b(yp)6 b(e)74 b(declaration)e(and)i(built)f(t)-6 b(yp)6 -b(es)0 8493 y Fi(A)61 b(t)-5 b(yp)5 b(e)60 b(declaration)h(is)g(of)f -(the)g(form:)472 8719 y Fd(type)94 b Fg(ident)p Fd(;)0 -8945 y Fi(in)61 b(wic)-5 b(h)61 b(case)f Fg(ident)h Fi(is)g(a)f -(abstract)g(t)-5 b(yp)5 b(e)60 b(\(or)g(external)h(t)-5 -b(yp)5 b(e\),)59 b(or:)472 9171 y Fd(type)g Fg(ident)h -Fd(=)g Fg(typ)-9 b(e-def)0 9396 y Fi(in)61 b(whic)-5 -b(h)61 b(case)f Fg(ident)h Fi(is)g(a)f(de\014ned)g(t)-5 -b(yp)5 b(e.)282 9622 y(A)77 b Fg(typ)-9 b(e-def)75 b -Fi(can)h(b)5 b(e)75 b(a)h(t)-5 b(yp)5 b(e)76 b(expression,)j(in)d(wic) --5 b(h)77 b(case)e(the)g(corresp)5 b(onding)76 b(iden)-5 -b(ti\014er)77 b(is)f(called)g(an)0 9848 y(aliased)61 -b(t)-5 b(yp)5 b(e.)282 10074 y(A)61 b Fg(typ)-9 b(e-def)60 -b Fi(can)h(also)f(b)5 b(e)61 b(a)f(built)h(t)-5 b(yp)5 -b(e)61 b(sp)5 b(eci\014cation:)273 10375 y Ff(\017)91 -b Fi(structured)59 b(t)-5 b(yp)5 b(e)60 b(with)i(named)c(\014elds:)927 -10600 y Fd(struct)f({)j Fg(ident)h Fd(:)f Fg(imm-typ)-9 -b(e)60 b Fd(;)g Ff(\001)30 b(\001)g(\001)60 b Fd(;)g -Fg(ident)g Fd(:)g Fg(imm-typ)-9 b(e)60 b Fd(})273 10946 -y Ff(\017)91 b Fi(en)-5 b(umerated)58 b(t)-5 b(yp)5 b(e:)927 -11172 y Fd(enum)58 b({)i Fg(ident)h Fd(,)f Ff(\001)30 -b(\001)g(\001)60 b Fd(,)g Fg(ident)g Fd(})3758 11695 -y Fi(3)p eop -%%Page: 4 4 -4 3 bop 0 797 a Fe(1.3)225 b(Use)75 b(of)h(structured)d(t)-6 -b(yp)6 b(es)0 1140 y Fi(The)44 b(declaration)g(of)f(a)g(structured)g(t) --5 b(yp)5 b(e)43 b(is)h(seman)-5 b(tically)43 b(equiv)-10 -b(alen)-5 b(t)44 b(\(in)f(basic)h(Lustre\))f(to)g(the)g(declaration)0 -1366 y(of)60 b(an)h(abstract)e(t)-5 b(yp)5 b(e,)60 b(a)g(collection)h -(of)f(\014eld-access)g(functions,)f(and)i(a)f(constructor)g(function.) -282 1592 y(Here)h(is)g(an)f(example)g(of)g(structured)f(t)-5 -b(yp)5 b(e)61 b(declaration:)286 1949 y Fd(type)94 b(two_adic_int)89 -b(=)94 b(struct)f({)573 2175 y(sign)g(:)i(bool;)573 2401 -y(bits)e(:)i(bool)286 2627 y(};)0 2984 y Fi(Field)61 -b(acces)f(can)g(b)5 b(e)61 b(applied)g(to)f(an)-5 b(y)61 -b(expression)f Fg(exp)g Fi(of)g(t)-5 b(yp)5 b(e)61 b -Fd(two)p 4824 2984 58 7 v 67 w(adic)p 5275 2984 V 66 -w(int)p Fi(:)472 3210 y Fg(exp)p Fd(.sign)0 3436 y Fi(is)g(an)f -(expression)h(of)f(t)-5 b(yp)5 b(e)60 b Fd(bool)p Fi(.)282 -3662 y(The)93 b(construction)e(of)h(a)g(structured)g(t)-5 -b(yp)5 b(e)92 b(v)-10 b(alue)92 b(adopt)g(the)g(\\call)h(b)-5 -b(y)92 b(name")f(st)-5 b(yle:)143 b(the)92 b(name)0 3888 -y Fd(two)p 299 3888 V 67 w(adic)p 750 3888 V 67 w(int)69 -b Fi(can)h(b)5 b(e)71 b(view)-5 b(ed)71 b(as)f(a)h(function)f(that)g -(tak)-5 b(es)70 b(t)-5 b(w)g(o)70 b(argumen)-5 b(ts,)71 -b(one)f(called)i Fd(sign)c Fi(and)j(the)0 4114 y(other)60 -b(one)h Fd(bits)p Fi(.)78 b(If)60 b Fg(exp1)g Fi(and)h -Fg(exp2)f Fi(are)g(t)-5 b(w)g(o)61 b(b)5 b(o)g(olean)61 -b(expressions,)e(then:)472 4339 y Fd(two_adic_int)89 -b({)95 b(sign)f(=)g Fg(exp1)p Fd(;)h(bits)e(=)i Fg(exp2)h -Fd(})0 4565 y Fi(is)61 b(an)f(expression)h(of)f(t)-5 -b(yp)5 b(e)60 b Fd(two)p 2227 4565 V 67 w(adic)p 2678 -4565 V 66 w(int)p Fi(.)282 4791 y(The)80 b(\014elds)f(of)g(a)h -(structured)e(t)-5 b(yp)5 b(e)79 b(v)-10 b(ariable)80 -b(can)g(b)5 b(e)79 b(de\014ned)g(separatly)-15 b(,)83 -b(using)d(sev)-5 b(eral)79 b(equations.)0 5017 y(F)-15 -b(or)70 b(instance,)i(if)e(the)g(v)-10 b(ariable)72 b -Fd(minus_one)90 b(:)95 b(two_adic_int)64 b Fi(is)70 b(declared,)j(it)e -(can)f(b)5 b(e)70 b(de\014ned)g(b)-5 b(y)70 b(t)-5 b(w)g(o)0 -5243 y(equations:)286 5600 y Fd(minus_one.bits)88 b(=)95 -b(true;)286 5826 y(minus_one.sign)88 b(=)95 b(true)e(->)i(false;)0 -6183 y Fi(is)61 b(equiv)-10 b(alen)-5 b(t)60 b(to:)286 -6541 y Fd(minus_one)91 b(=)k(two_adic_int{)88 b(bits)93 -b(=)i(true;)e(sign)g(=)i(true)e(->)i(false)e(};)282 6899 -y Fi(More)47 b(generally)-15 b(,)51 b(if)c Fg(left)g -Fi(is)h(a)g(prop)5 b(er)47 b(equation)h(left-part)e(of)h(t)-5 -b(yp)5 b(e)48 b Fd(two_adic_int)p Fi(,)43 b(and)k Fg(exp)h -Fi(is)g(a)f(prop)5 b(er)0 7124 y(expression)60 b(of)g(t)-5 -b(yp)5 b(e)60 b Fd(bool)p Fi(,)e(one)j(can)f(write)h(the)f(equation:) -472 7350 y Fg(left)p Fd(.sign)92 b(=)j Fg(exp)h Fd(;)0 -7920 y Fk(2)269 b(Static)89 b(parameters)0 8332 y Fe(2.1)225 -b(Declaration)72 b(of)j(template)e(no)6 b(de)0 8675 y -Fi(The)70 b(notion)h(of)e(static)h(parameter)e(is)i(more)f(general)h -(than)g(in)h(Lustre/P)-5 b(ollux:)99 b(it)70 b(can)g(b)5 -b(e)70 b(a)h(constan)-5 b(t,)70 b(a)0 8901 y(t)-5 b(yp)5 -b(e)60 b(or)h(a)f(ev)-5 b(en)60 b(a)h(no)5 b(de.)282 -9127 y(Static)61 b(parameters)d(are)i(clearly)i(separated)d(from)g -(dynamic)h(parameters,)e(for)i(instance:)286 9485 y Fd(node)94 -b(toto<<)573 9710 y(type)f(a;)573 9936 y(const)f(n)j(:)g(int;)573 -10162 y(node)e(t\(x:a\)returns\(y:a\))286 10388 y(>>)i(\()g(X)g(:)f -(a^n)g(\))h(returns)d(\()j(Z)g(:)g(a)f(\))0 10745 y Fi(The)60 -b(static)g(parameter)e(part)i(is)g(optionnal,)g(a)g(no)5 -b(de)60 b(with)h(static)e(parameters)f(is)i(called)h(a)f -Fg(template)j(no)-9 b(de)p Fi(,)0 10971 y(while)62 b(a)e(no)5 -b(de)61 b(without)f(is)h(called)g Fg(e\013e)-9 b(ctive)63 -b(no)-9 b(de)p Fi(.)282 11197 y(T)-15 b(emplate)59 b(no)5 -b(de)61 b(are)f(not)g(compiled:)80 b(only)61 b(e\013ectiv)-5 -b(e)60 b(no)5 b(des)60 b(can)g(b)5 b(e)61 b(compiled.)3758 -11695 y(4)p eop -%%Page: 5 5 -5 4 bop 0 797 a Fe(2.2)225 b(No)6 b(de)75 b(expression)0 -1167 y Fi(An)65 b(actual)g(no)5 b(de)64 b(denotation)h(\(a)f -Fg(no)-9 b(de)68 b(expr)-9 b(ession)64 b Fi(is)h(the)g(denotation)f(of) -g(an)h(e\013ectiv)-5 b(e)64 b(no)5 b(de)65 b(\(according)0 -1393 y(to)90 b(some)e(iden)-5 b(ti\014er)91 b(en)-5 b(vironmen)g(t\).) -167 b(It)89 b(can)h(b)5 b(e)90 b(the)g(denotation)g(of)g(a)g -(prede\014ned)g(op)5 b(erator,)96 b(or)91 b(the)0 1619 -y(instanciation)61 b(of)f(a)g(no)5 b(de)61 b(template)d(\(the)i(use)g -(of)g(a)h(non-template)d(no)5 b(de)60 b(is)h(a)g(sp)5 -b(ecial)61 b(case)f(of)g(this)g(one\).)0 2178 y Fj(2.2.1)208 -b(Prede\014ned)70 b(op)6 b(erators)0 2548 y Fi(A)58 b(correct)e(no)5 -b(de)57 b(expression)g(can)g(b)5 b(e)57 b(optained)g(from)e(an)-5 -b(y)57 b(predi\014ned)h(op)5 b(erator)57 b(b)-5 b(y)57 -b(pre\014xing)h(it)f(with)h(the)0 2774 y(k)-5 b(eyw)g(ord)77 -b Fd(operator)p Fi(.)126 b(F)-15 b(or)77 b(instance)f -Fd(operator)91 b(and)76 b Fi(if)h(a)g(no)5 b(de)77 b(expression)g -(denoting)g(the)f(o)-5 b(v)g(erloaded)0 3000 y(arithmetic)64 -b(addition.)96 b(Note)66 b(the)f(sp)5 b(ecial)66 b(case)e(of)h -Fd(operator)92 b(if)64 b Fi(whic)-5 b(h)66 b(denotes)f(the)g -Fd(if)94 b(..)190 b(then)93 b(..)0 3226 y(else)58 b Fi(op)5 -b(erator.)0 3785 y Fj(2.2.2)208 b(T)-17 b(emplate)68 -b(instanciation)0 4155 y Fi(It)60 b(is)h(optained)f(b)-5 -b(y)61 b(concatenating)e(the)i(name)d(of)i(a)h(template)e(no)5 -b(de)60 b(and)g(a)h(list)g(of)f Fg(static)66 b(ar)-9 -b(guments)p Fi(:)273 4586 y Ff(\017)91 b Fi(for)60 b(a)g -Fd(type)f Fi(static)h(parameter,)e(one)i(m)-5 b(ust)59 -b(giv)-5 b(e)61 b(a)f(correct)g(t)-5 b(yp)5 b(e)60 b(expression,)273 -5017 y Ff(\017)91 b Fi(for)60 b(a)g Fd(const)e Fi(static)i(parameter)f -(a)h(correct)g(v)-10 b(alue)61 b(expression,)273 5447 -y Ff(\017)91 b Fi(for)60 b(a)g Fd(node)f Fi(static)h(parameter)e(a)j -(correct)f Fg(no)-9 b(de)64 b(expr)-9 b(ession)p Fi(.)0 -5878 y(Unfortunatly)-15 b(,)66 b(it)g(is)g(almost)e(imp)5 -b(ossible)65 b(to)g(design)g(a)h(non)f(am)-5 b(bigous)64 -b(grammar)f(for)j(a)f(list)h(of)f(argumen)-5 b(t)0 6104 -y(whose)57 b(natures)f(are)h(so)g(di\013eren)-5 b(t.)79 -b(The)57 b(strict)g(w)-5 b(a)g(y)57 b(for)g(instanciating)g(static)g -(argumen)-5 b(t)55 b(is)i(then)g(to)f(pre\014x)0 6330 -y(eac)-5 b(h)60 b(of)g(them)f(b)-5 b(y)60 b(the)g(k)-5 -b(eyw)g(ord)61 b(denoting)g(its)f(nature.)80 b(F)-15 -b(or)60 b(instance:)0 6774 y Fd(toto<<)92 b(type)h(int;)h(const)e(5;)j -(node)e(max_int)f(>>)0 7205 y Fi(is)82 b(a)f(correct)g(no)5 -b(de)81 b(expression)g(if)g Fd(max)p 2847 7205 58 7 v -67 w(int)f Fi(denotes)g(a)h(no)5 b(de)81 b(\(or)h(ev)-5 -b(en)80 b(an)i(external)f(function\))g(whose)0 7431 y(protot)-5 -b(yp)5 b(e)60 b(is)h Fd(\(x:int\))91 b(returns)h(\(y:int\))p -Fi(.)282 7671 y(Ho)-5 b(w)g(erv)g(er,)61 b(there)f(are)h(some)d(simple) -i(cases)f(where)i(it)g(is)g(not)f(necessary)f(to)i(precise)f(the)g -(nature:)273 8101 y Ff(\017)91 b Fi(When)55 b(the)f(argumen)-5 -b(t)54 b(is)h(clearly)h(a)f(t)-5 b(yp)5 b(e)55 b(expression,)g(that)g -(meens)e(a)i(prede\014ned)g(t)-5 b(yp)5 b(e,)56 b(or)f(an)g(arra)-5 -b(y)455 8327 y(of)60 b(prede\014ned)g(t)-5 b(yp)5 b(e)60 -b(\(lik)-5 b(e)61 b Fd(bool)p Fi(,)d Fd(int^4)p Fi(,)f(or)k(ev)-5 -b(en)60 b Fd(int^n^m)p Fi(\).)273 8758 y Ff(\017)91 b -Fi(When)71 b(the)h(argumen)-5 b(t)70 b(is)i(clearly)h(a)f(constan)-5 -b(t)70 b(argumen)-5 b(t,)73 b(that)e(meens)f(a)i(simple)f(arithmetic)f -(and)455 8984 y(logic)61 b(expression)f(\(lik)-5 b(e)61 -b Fd(3)p Fi(,)f Fd(n-1)p Fi(,)e(or)j Fd(if)94 b(b)h(then)e(\(3*x+1\))f -(else)h(\(3*x\))p Fi(\).)273 9414 y Ff(\017)e Fi(When)80 -b(the)g(argumen)-5 b(t)78 b(is)j(clearly)g(a)f(no)5 b(de)80 -b(expression,)85 b(that)79 b(is,)85 b(either)c(a)f(predi\014ned)h(no)5 -b(de)80 b(\(lik)-5 b(e)455 9640 y Fd(operator)91 b(+)p -Fi(\),)59 b(or)i(an)f(iden)-5 b(ti\014er)61 b(follo)-5 -b(w)g(ed)61 b(b)-5 b(y)61 b(a)f(static)g(argumen)-5 b(t)59 -b(list)i(\(eg.)80 b Fd(foo<<)92 b(3)j(>>)p Fi(\).)273 -10071 y Ff(\017)c Fi(Moreo)-5 b(v)g(er,)56 b(the)h(nature)g(can)g(b)5 -b(e)57 b(a)-5 b(v)g(oided)57 b(if)g(the)g(argumen)-5 -b(t)55 b(is)j(a)f(single)g(iden)-5 b(ti\014er:)79 b(in)58 -b(this)f(case,)g(the)455 10297 y(compiler)i(will)k(try)d(to)h(\\solv)-5 -b(e")60 b(the)g(nature)g(within)i(its)e(en)-5 b(vironemen)g(t.)0 -10727 y(Finally)-15 b(,)61 b(the)f(no)5 b(de)61 b(expression)f(b)5 -b(elo)-5 b(w)61 b(can)f(b)5 b(e)61 b(written)g(more)e(simply:)286 -11172 y Fd(toto)94 b(<<)g(int;)f(5;)i(max_int)c(>>)3758 -11695 y Fi(5)p eop -%%Page: 6 6 -6 5 bop 0 797 a Fe(2.3)225 b(Static)73 b(recursion)0 -1140 y Fi(No)5 b(de)75 b(template)e(allo)-5 b(w)76 b(the)e(user)h(to)f -(de\014ne)h(generic)f(no)5 b(des)75 b(;)81 b(another)75 -b(imp)5 b(ortan)-5 b(t)73 b(use)h(of)h(templates)d(is)0 -1366 y(to)64 b(de\014ne)f(static)h(recursiv)-5 b(e)64 -b(no)5 b(des.)90 b(In)-5 b(tuitiv)g(elly)-15 b(,)65 b(static)f -(recursion)g(can)g(b)5 b(e)64 b(view)-5 b(ed)64 b(as)g(a)g(w)-5 -b(a)g(y)64 b(to)g(express)0 1592 y(regular)d(net)-5 b(w)g(orks)60 -b(of)g(no)5 b(des.)0 2017 y Fd(node)93 b(min\(x)g(:)i(int;)e(y)i(:)g -(min\))e(returns)f(\(mn)i(:)h(int\);)0 2243 y(let)286 -2469 y(mn)g(=)g(if)f(\(x)g(<=)h(y\))f(then)f(x)i(else)f(y;)0 -2694 y(tel)0 3146 y(node)f(min_n<<const)c(n:)95 b(int>>)0 -3372 y(\(T)f(:)h(int^n\))d(returns)g(\(mn)i(:)h(int\);)0 -3598 y(let)286 3824 y(mn)g(=)g(with)e(\(n)h(=)h(1\))g(then)e(T[0])764 -4049 y(else)g(min\(T[0],)d(min_n<<n-1>>\(T[1..n)o(-1)o(])o(\)\))o(;)0 -4275 y(tel)282 4700 y Fi(The)61 b(curren)-5 b(t)60 b(syn)-5 -b(tax)60 b(of)g Fd(with)f Fi(statemen)-5 b(t)57 b(is)k(lik)-5 -b(ely)62 b(to)e(c)-5 b(hange)60 b(so)5 b(on)60 b(!)0 -5187 y Fe(2.4)225 b(Static)73 b(arrra)-6 b(ys)0 5603 -y Fk(3)269 b(Name)90 b(space)f(and)i(pac)-7 b(k)-15 b(age)0 -6043 y Fn(JUST)86 b(IDEAS)g(-)g(NOT)g(IMPLEMENTED)282 -6494 y Fi(The)67 b(idea)f(is)h(to)e(pro)-5 b(vide)67 -b(a)f(b)5 b(etter)66 b(mo)5 b(dule)65 b(system)e(that)j(the)g(one)g(in) -g(Lustre/P)-5 b(ollux.)97 b(Note)66 b(that)g(in)0 6720 -y(Lustre/P)-5 b(ollux,)60 b(there)g(is)h(no)f(mo)5 b(dule)60 -b(system)e(at)i(all:)81 b(just)60 b(text)f(inlining)k(!)282 -6946 y(Imp)5 b(ortan)-5 b(t)59 b(p)5 b(oin)-5 b(ts)60 -b(are:)273 7321 y Ff(\017)91 b Fi(a)62 b(general)h(\\name)e(space")h -(system)e(whic)-5 b(h)63 b(a)-5 b(v)g(oids)63 b(name)e(collision.)88 -b(F)-15 b(or)63 b(instance,)f(an)h(en)-5 b(umerated)455 -7547 y(t)g(yp)5 b(e)55 b Fd(toto)e Fi(is)j(a)g(name)e(space,)i(and)f(a) -h(particular)g(v)-10 b(alue)56 b Fd(val)e Fi(form)g(this)i(t)-5 -b(yp)5 b(e)55 b(could)h(b)5 b(e)56 b(\(optionally\))455 -7773 y(writen)75 b Fd(toto::val)p Fi(.)117 b(A)75 b(pac)-5 -b(k)-10 b(age)74 b(\(ev)-5 b(en)74 b(if)h(the)f(notion)h(is)f(not)h(y) --5 b(et)74 b(really)h(clear\))g(is)g(also)f(a)h(name)455 -7999 y(space:)g(whatev)-5 b(er)51 b(is)g(denoted)g(b)-5 -b(y)51 b(an)g(iden)-5 b(ti\014er)52 b Fd(foo)e Fi(declared)i(within)g -(a)f(pac)-5 b(k)-10 b(age)51 b Fd(bar)f Fi(\(const,)h(t)-5 -b(yp)5 b(e,)455 8224 y(no)g(de)60 b(etc.\))79 b Fd(bar::foo)57 -b Fi(could)j(b)5 b(e)61 b(used)f(to)g(precisely)h(denote)f(it.)3758 -11695 y(6)p eop -%%Page: 7 7 -7 6 bop 0 797 a Fk(A)269 b(Abstract)89 b(syn)-7 b(tax)100 -2531 y Fj(P)h(ac)g(k)-12 b(age:)100 2802 y Fi(A)55 b(Lustre)f(pac)-5 -b(k)-10 b(age)54 b(is)h(a)f(sequence)g(\(seman)-5 b(tically)53 -b(a)i(set\))f(of)g(declarations)h(of)f(constan)-5 b(ts,)54 -b(t)-5 b(yp)5 b(es,)55 b(functions)100 3028 y(or)60 b(no)5 -b(des.)557 3299 y Fg(LusPack)p 557 3328 670 8 v 249 w -Ff(\000)-31 b(!)250 b(f)p Fg(OneDe)-9 b(cl)p 2110 3328 -667 8 v 99 w Ff(g)2969 3233 y Fc(\003)560 3570 y Fg(OneDe)g(cl)p -560 3599 V 247 w Ff(\000)-31 b(!)200 b Fg(ConstDe)-9 -b(cl)p 1969 3599 802 8 v 211 w Ff(j)101 b Fg(T)-14 b(yp)-9 -b(eDe)g(cl)p 3134 3635 714 8 v 210 w Ff(j)101 b Fg(F)-14 -b(uncDe)-9 b(cl)p 4211 3599 730 8 v 210 w Ff(j)100 b -Fg(No)-9 b(deDe)g(cl)p 5304 3599 738 8 v 100 4112 a Fj(Constan)j(t)69 -b(Declarations:)100 4383 y Fi(A)80 b(constan)-5 b(t)79 -b(can)g(b)5 b(e)80 b(declared)g(with)h(its)f(t)-5 b(yp)5 -b(e)79 b(and/or)h(v)-10 b(alue.)139 b(If)79 b(no)h(v)-10 -b(alue)80 b(is)g(giv)-5 b(en,)84 b(the)c(constan)-5 b(t)79 -b(is)100 4609 y(considered)64 b(as)g(imp)5 b(orted.)90 -b(Imp)5 b(orted)62 b(constan)-5 b(ts)63 b(of)g(a)i(same)d(t)-5 -b(yp)5 b(e)64 b(can)g(b)5 b(e)64 b(giv)-5 b(en)64 b(as)g(a)g(list.)92 -b(The)65 b(t)-5 b(yp)5 b(e)63 b(of)100 4835 y(de\014ned)d(constan)-5 -b(t)59 b(can)i(b)5 b(e)60 b(giv)-5 b(en)61 b(for)f(more)f(precision.) -425 5106 y Fg(ConstDe)-9 b(cl)p 425 5135 802 8 v 249 -w Ff(\000)-31 b(!)200 b Fj(const)221 b Ff(f)p Fg(OneConstDe)-9 -b(cl)p 2759 5135 1127 8 v 100 w Ff(g)4078 5040 y Fb(+)4317 -5106 y Fj(;)100 5377 y Fg(OneConstDe)g(cl)p 100 5406 -V 248 w Ff(\000)-31 b(!)250 b(f)p Fg(Idf)p 2110 5441 -219 8 v 111 w Fj(,)101 b Ff(g)2690 5311 y Fc(\003)2890 -5377 y Fg(Idf)p 2890 5441 V 111 w Fj(:)111 b Fg(T)-14 -b(yp)-9 b(e)p 3389 5441 372 8 v 1598 5648 a Ff(j)320 -b Fg(Idf)p 1969 5712 219 8 v 110 w Fj(=)111 b Fg(Exp)p -2572 5712 301 8 v 223 w Fi([)o Fj(:)h Fg(T)-14 b(yp)-9 -b(e)p 3315 5712 372 8 v 50 w Fi(])100 6190 y Fj(T)j(yp)6 -b(e)69 b(Declarations:)100 6461 y Fi(A)63 b(declared)f(t)-5 -b(yp)5 b(e)62 b(can)h(b)5 b(e)62 b(external)h(\(just)e(a)h(name\))f(or) -i(declared.)86 b(Declared)62 b(t)-5 b(yp)5 b(es)62 b(are)h(either)f -(aliases)h(on)100 6686 y(t)-5 b(yp)5 b(e)60 b(expressions,)f(or)i -(built)g(t)-5 b(yp)5 b(es)60 b(\(structured)g(or)g(en)-5 -b(umerated\).)513 6957 y Fg(T)-14 b(yp)-9 b(eDe)g(cl)p -513 7022 714 8 v 248 w Ff(\000)-31 b(!)200 b Fj(t)-6 -b(yp)6 b(e)222 b Ff(f)p Fg(OneT)-14 b(yp)-9 b(eDe)g(cl)p -2685 7022 1039 8 v 109 w Fj(;)101 b Ff(g)4085 6891 y -Fb(+)188 7228 y Fg(OneT)-14 b(yp)-9 b(eDe)g(cl)p 188 -7293 V 247 w Ff(\000)-31 b(!)250 b(f)p Fg(Idf)p 2110 -7293 219 8 v 111 w Fj(,)101 b Ff(g)2690 7162 y Fc(\003)2890 -7228 y Fg(Idf)p 2890 7293 V 212 w Ff(j)f Fg(Idf)p 3472 -7293 V 111 w Fj(=)111 b Fg(T)-14 b(yp)-9 b(e)p 4076 7293 -372 8 v 1598 7499 a Ff(j)320 b Fg(Idf)p 1969 7564 219 -8 v 110 w Fj(=)111 b Fg(T)-14 b(yp)-9 b(eBuilder)p 2572 -7564 953 8 v 274 7770 a(T)-14 b(yp)-9 b(eBuilder)p 274 -7835 V 247 w Ff(\000)-31 b(!)200 b Fj(en)-6 b(um)110 -b Fa(f)222 b Ff(f)p Fg(Idf)p 2994 7835 219 8 v 111 w -Fj(,)101 b Ff(g)3574 7704 y Fc(\003)3774 7770 y Fg(Idf)p -3774 7835 V 111 w Fa(g)1598 8041 y Ff(j)320 b Fj(struct)111 -b Fa(f)222 b Ff(f)p Fg(Fields)p 3038 8070 472 8 v 110 -w Fj(;)101 b Ff(g)3871 7975 y Fc(\003)4071 8041 y Fg(Fields)p -4071 8070 V 110 w Fa(g)755 8312 y Fg(Fields)p 755 8341 -V 248 w Ff(\000)-31 b(!)250 b(f)p Fg(Idf)p 2110 8377 -219 8 v 111 w Fj(,)101 b Ff(g)2690 8246 y Fc(\003)2890 -8312 y Fg(Idf)p 2890 8377 V 111 w Fj(:)111 b Fg(T)-14 -b(yp)-9 b(e)p 3389 8377 372 8 v 100 8854 a Fj(T)j(yp)6 -b(e)69 b(Expression:)100 9125 y Fi(Those)75 b(expressions)h(are)g(used) -f(to)h(sp)5 b(ecify)75 b(the)h(t)-5 b(yp)5 b(e)75 b(of)h(a)f(v)-10 -b(ariable,)80 b(a)c(\014eld,)k(etc.)126 b(W)-15 b(e)75 -b(also)h(talk)g(ab)5 b(out)100 9351 y Fg(imme)-9 b(diate)53 -b Fi(t)-5 b(yp)5 b(e,)55 b(to)g(outline)h(the)e(di\013erence)i(with)f -Fg(built)k(typ)-9 b(es)p Fi(.)79 b(Immediate)52 b(t)-5 -b(yp)5 b(es)54 b(are)h(prede\014ned)g(t)-5 b(yp)5 b(es,)100 -9577 y(t)-5 b(yp)5 b(e)60 b(iden)-5 b(ti\014ers)61 b(\(references)e(to) -h(declared)h(t)-5 b(yp)5 b(es\))59 b(or)i(static)f(arra)-5 -b(ys.)855 9848 y Fg(T)-14 b(yp)-9 b(e)p 855 9912 V 249 -w Ff(\000)-31 b(!)200 b Fg(Pr)-9 b(e)g(defT)-14 b(yp)-9 -b(e)p 1969 9912 870 8 v 210 w Ff(j)100 b Fg(Idf)p 3201 -9912 219 8 v 212 w Ff(j)h Fg(T)-14 b(yp)-9 b(e)p 3784 -9912 372 8 v 110 w Fj(^)111 b Fg(Exp)p 4482 9912 301 -8 v 358 10390 a(Pr)-9 b(e)g(defT)-14 b(yp)-9 b(e)p 358 -10454 870 8 v 247 w Ff(\000)-31 b(!)200 b Fj(b)6 b(o)g(ol)211 -b Ff(j)100 b Fj(in)-6 b(t)213 b Ff(j)100 b Fj(real)3758 -11695 y Fi(7)p eop -%%Page: 8 8 -8 7 bop 100 804 a Fj(F)-17 b(unction)69 b(Declarations:)100 -1075 y Fi(A)61 b(function)f(is)h(declared)f(with)h(the)f(names)f(and)i -(t)-5 b(yp)5 b(es)59 b(of)h(its)h(formal)e(parameters.)307 -1346 y Fg(F)-14 b(uncDe)-9 b(cl)p 307 1375 730 8 v 247 -w Ff(\000)-30 b(!)199 b Fj(function)111 b Fg(Idf)p 2639 -1410 219 8 v 111 w Fj(\()g Fg(V)-14 b(arDe)-9 b(clList)p -3161 1375 938 8 v 110 w Fj(\))112 b(returns)f(\()h Fg(V)-14 -b(arDe)-9 b(clList)p 5370 1375 V 110 w Fj(\))100 1888 -y Fg(V)-14 b(arDe)-9 b(clList)p 100 1917 V 248 w Ff(\000)-30 -b(!)249 b(f)p Fg(V)-14 b(arDe)-9 b(cl)p 1920 1917 633 -8 v 110 w Fj(;)101 b Ff(g)2914 1822 y Fc(\003)3114 1888 -y Fg(V)-14 b(arDe)-9 b(cl)p 3114 1917 V 404 2430 a(V)-14 -b(arDe)-9 b(cl)p 404 2459 V 248 w Ff(\000)-30 b(!)249 -b(f)p Fg(Idf)p 1920 2494 219 8 v 111 w Fj(,)101 b Ff(g)2500 -2364 y Fc(\003)2700 2430 y Fg(Idf)p 2700 2494 V 111 w -Fj(:)111 b Fg(T)-14 b(yp)-9 b(e)p 3199 2494 372 8 v 100 -3166 a Fj(No)6 b(de)68 b(Declaration:)100 3437 y Fi(A)61 -b(no)5 b(de)61 b(can)h(b)5 b(e)61 b(declared)g(with)h(a)f(complete)f -(description)h(of)g(its)g(dynamic)f(b)5 b(eha)-5 b(viour,)62 -b(or)f(b)-5 b(y)62 b(implicitely)100 3663 y(reusing)51 -b(the)g(dynamic)f(b)5 b(eha)-5 b(viour)52 b(of)f(another)g(no)5 -b(de.)77 b(A)51 b(no)5 b(de)51 b(can)g(ha)-5 b(v)g(e)51 -b(static)g(parameters)e(\(w)-5 b(e)51 b(also)h(talk)100 -3889 y(ab)5 b(out)60 b Fg(template)k(no)-9 b(de)p Fi(,)59 -b(or)i(no)g(\(in)g(whic)-5 b(h)61 b(case)f(w)-5 b(e)60 -b(also)h(talk)g(ab)5 b(out)60 b Fg(actual)k(no)-9 b(de)p -Fi(\).)894 4160 y Fg(No)g(deDe)g(cl)p 894 4189 738 8 -v 248 w Ff(\000)-31 b(!)199 b Fj(no)6 b(de)111 b Fg(Idf)p -2923 4224 219 8 v 222 w Fi([)p Fg(StaticPr)-9 b(oto)p -3415 4189 893 8 v 50 w Fi(])172 b Fg(No)-9 b(dePr)g(oto)p -4580 4189 833 8 v 110 w(No)g(deBo)g(dy)p 5523 4224 789 -8 v 2002 4431 a Ff(j)320 b Fj(no)6 b(de)111 b Fg(Idf)p -2923 4495 219 8 v 222 w Fi([)p Fg(StaticPr)-9 b(oto)p -3415 4460 893 8 v 50 w Fi(])172 b Fj(=)110 b Fg(Idf)p -4853 4495 219 8 v 222 w Fi([)p Fg(StaticA)-5 b(r)c(gList)p -5345 4495 1042 8 v 51 w Fi(])171 b Fj(;)100 4973 y Fi(Static)60 -b(parameters)e(are)j(constan)-5 b(ts)59 b(and)h(abstract)g(t)-5 -b(yp)5 b(es,)59 b(or)i(no)5 b(des.)739 5244 y Fg(StaticPr)-9 -b(oto)p 739 5273 893 8 v 250 w Ff(\000)-31 b(!)199 b -Fd(<<)171 b Ff(f)p Fg(StaticPar)-9 b(am)p 2827 5273 981 -8 v 111 w Fj(;)101 b Ff(g)4169 5178 y Fc(\003)4369 5244 -y Fg(StaticPar)-9 b(am)p 4369 5273 V 110 w Fd(>>)651 -5515 y Fg(StaticPar)g(am)p 651 5544 V 249 w Ff(\000)-31 -b(!)199 b Fj(t)-6 b(yp)6 b(e)112 b Fg(Idf)p 2888 5579 -219 8 v 212 w Ff(j)101 b Fj(const)110 b Fg(Idf)p 4059 -5579 V 111 w Fj(:)h Fg(T)-14 b(yp)-9 b(e)p 4558 5579 -372 8 v 2002 5786 a Ff(j)320 b Fj(no)6 b(de)111 b Fg(Idf)p -2923 5850 219 8 v 111 w(No)-9 b(dePr)g(oto)p 3253 5815 -833 8 v 100 6328 a Fi(A)62 b(no)5 b(de)62 b(protot)-5 -b(yp)5 b(e)61 b(de\014nes)h(the)g(formal)e(inputs/outputs)h(of)h(a)g -(no)5 b(de)62 b(\(in)g(some)e(sence)i(the)f("t)-5 b(yp)5 -b(e")62 b(of)f(the)100 6554 y(no)5 b(de\).)79 b(F)-15 -b(ormal)60 b(no)5 b(de)60 b(parameters)e(are)j(t)-5 b(yp)5 -b(ed)60 b(iden)-5 b(ti\014ers)61 b(with)g(an)g(optionnal)g(formal)e -(clo)5 b(c)-5 b(k\).)799 6825 y Fg(No)c(dePr)g(oto)p -799 6854 V 249 w Ff(\000)-31 b(!)199 b Fj(\()112 b Fg(Clo)-9 -b(cke)g(dV)-14 b(arDe)-9 b(clList)p 2566 6854 1532 8 -v 108 w Fj(\))111 b(returns)g(\()h Fg(Clo)-9 b(cke)g(dV)-14 -b(arDe)-9 b(clList)p 5369 6854 V 108 w Fj(\))100 7367 -y Fg(Clo)g(cke)g(dV)-14 b(arDe)-9 b(clList)p 100 7396 -V 246 w Ff(\000)-31 b(!)250 b(f)p Fg(Clo)-9 b(cke)g(dV)-14 -b(arDe)-9 b(cl)p 2515 7396 1228 8 v 107 w Fj(;)101 b -Ff(g)4103 7301 y Fc(\003)4303 7367 y Fg(Clo)-9 b(cke)g(dV)-14 -b(arDe)-9 b(cl)p 4303 7396 V 404 7638 a(Clo)g(cke)g(dV)-14 -b(arDe)-9 b(cl)p 404 7667 V 246 w Ff(\000)-31 b(!)199 -b Fg(V)-14 b(arDe)-9 b(cl)p 2373 7667 633 8 v 110 w Fj(when)111 -b Fg(Idf)p 3707 7702 219 8 v 212 w Ff(j)101 b Fj(\()111 -b Fg(V)-14 b(arDe)-9 b(clList)p 4482 7667 938 8 v 110 -w Fj(\))112 b(when)f Fg(Idf)p 6313 7702 219 8 v 100 8180 -a Fj(No)6 b(de)68 b(Bo)6 b(dy:)100 8451 y Fi(It)68 b(con)-5 -b(tains)69 b(an)g(optionnal)h(set)f(of)f(lo)5 b(cal)70 -b(v)-10 b(ariable)70 b(de\014nitions)g(and)f(a)g(sequence)f(\(seman)-5 -b(tically)68 b(a)h(set\))f(of)100 8676 y(equations.)843 -8947 y Fg(No)-9 b(deBo)g(dy)p 843 9012 789 8 v 249 w -Ff(\000)-31 b(!)250 b Fi([)o Fj(v)-12 b(ar)112 b Fg(Clo)-9 -b(cke)g(dV)-14 b(arDe)-9 b(clList)p 2872 8976 1532 8 -v 108 w Fj(;)50 b Fi(])172 b Fj(let)222 b Ff(f)p Fg(Equation)p -5394 9012 709 8 v 111 w Fj(;)101 b Ff(g)6464 8881 y Fb(+)6703 -8947 y Fj(tel)100 9218 y Fi(An)61 b(equation)f(is)h(either)g(an)f -(assertion)g(or)h(a)f("real")h(equation.)923 9489 y Fg(Equation)p -923 9554 V 249 w Ff(\000)-31 b(!)199 b Fj(assert)110 -b Fg(Exp)p 3014 9554 301 8 v 213 w Ff(j)101 b Fg(L)-9 -b(eftPart)p 3679 9554 658 8 v 111 w Fj(=)110 b Fg(Exp)p -4721 9554 301 8 v 100 9760 a Fi(A)53 b(left)g(part)g(is)h(a)f(non-empt) --5 b(y)51 b(list)i(of)g(left)g(item.)76 b(A)54 b(left)f(item)f(denotes) -g(a)h(v)-10 b(ariable)54 b("piece":)77 b(a)53 b(full)h(v)-10 -b(ariable,)100 9986 y(the)60 b(\014eld)h(of)f(a)g(structured)g(left)g -(item,)f(an)h(elemen)-5 b(t)59 b(or)i(a)f(slice)h(of)f(an)h(arra)-5 -b(y)61 b(left)f(item.)974 10257 y Fg(L)-9 b(eftPart)p -974 10322 658 8 v 249 w Ff(\000)-31 b(!)250 b Fi([)o -Fj(\()51 b Fi(])283 b Ff(f)o Fg(L)-9 b(eftItem)p 3030 -10322 668 8 v 111 w Fj(,)101 b Ff(g)4059 10191 y Fc(\003)4259 -10257 y Fg(L)-9 b(eftItem)p 4259 10322 V 222 w Fi([)o -Fj(\))51 b Fi(])964 10799 y Fg(L)-9 b(eftItem)p 964 10864 -V 249 w Ff(\000)-31 b(!)199 b Fg(Idf)p 2373 10864 219 -8 v 212 w Ff(j)101 b Fg(L)-9 b(eftItem)p 2956 10864 668 -8 v 110 w Fj(.)111 b Fg(Idf)p 3903 10864 219 8 v 212 -w Ff(j)101 b Fg(L)-9 b(eftItem)p 4486 10864 668 8 v 110 -w Fj([)112 b Fg(Exp)p 5434 10864 301 8 v 111 w Fj(])2002 -11070 y Ff(j)320 b Fg(L)-9 b(eftItem)p 2373 11134 668 -8 v 111 w Fj([)111 b Fg(Exp)p 3321 11134 301 8 v 112 -w Fj(..)g Fg(Exp)p 3960 11134 V 223 w Fi([)o Fj(step)g -Fg(Exp)p 5020 11134 V 51 w Fi(])172 b Fj(])3758 11695 -y Fi(8)p eop -%%Page: 9 9 -9 8 bop 100 1023 a Fj(Expressions:)1046 1294 y Fg(Exp)p -1046 1358 301 8 v 250 w Ff(\000)-31 b(!)199 b Fg(Pr)-9 -b(e)g(defConst)p 2088 1358 958 8 v 212 w Ff(j)100 b Fg(Idf)p -3409 1358 219 8 v 212 w Ff(j)h Fg(UnOp)p 3992 1358 470 -8 v 110 w(Exp)p 4572 1358 301 8 v 213 w Ff(j)g Fg(Exp)p -5237 1358 V 111 w(BinOp)p 5648 1358 519 8 v 111 w(Exp)p -6278 1358 301 8 v 1717 1565 a Ff(j)320 b Fj(if)111 b -Fg(Exp)p 2321 1629 V 112 w Fj(then)g Fg(Exp)p 3253 1629 -V 112 w Fj(else)g Fg(Exp)p 4109 1629 V 212 w Ff(j)101 -b Fj(with)111 b Fg(Exp)p 5290 1629 V 112 w Fj(then)h -Fg(Exp)p 6223 1629 V 111 w Fj(else)f Fg(Exp)p 7078 1629 -V 1717 1836 a Ff(j)320 b Fg(Exp)p 2088 1900 V 51 w Fi(.)p -Fg(Idf)p 2490 1900 219 8 v 212 w Ff(j)100 b Fg(Exp)p -3072 1900 301 8 v 51 w Fj([)51 b Fg(Exp)p 3532 1900 V -51 w Fj(])212 b Ff(j)101 b Fg(Exp)p 4305 1900 V 51 w -Fj([)50 b Fg(Exp)p 4764 1900 V 51 w Fj(..)h Fg(Exp)p -5282 1900 V 162 w Fi([)p Fj(step)f Fg(Exp)p 6221 1900 -V 51 w Fi(])111 b Fj(])1717 2107 y Ff(j)320 b Fg(NaryOp)p -2088 2171 626 8 v 50 w Fj(\()162 b Ff(f)p Fg(Exp)p 3098 -2171 301 8 v 51 w Fj(,)101 b Ff(g)3699 2041 y Fc(\003)3838 -2107 y Fg(Exp)p 3838 2171 V 52 w Fj(\))1717 2378 y Ff(j)320 -b Fj(\()223 b Ff(f)p Fg(Exp)p 2483 2442 V 111 w Fj(,)101 -b Ff(g)3144 2312 y Fc(\003)3344 2378 y Fg(Exp)p 3344 -2442 V 112 w Fj(\))1717 2649 y Ff(j)320 b Fg(Idf)p 2088 -2713 219 8 v 111 w Fa(f)222 b Ff(f)p Fg(Idf)p 2836 2713 -V 111 w Fi(=)60 b Fg(Exp)p 3368 2713 301 8 v 111 w Fj(;)101 -b Ff(g)4029 2583 y Fc(\003)4229 2649 y Fg(Idf)p 4229 -2713 219 8 v 111 w Fi(=)60 b Fg(Exp)p 4761 2713 301 8 -v 112 w Fa(g)1717 2920 y Ff(j)320 b Fg(No)-9 b(deExpr)g(ession)p -2088 2984 1247 8 v 111 w Fj(\()222 b Ff(f)p Fg(Exp)p -3840 2984 301 8 v 112 w Fj(,)101 b Ff(g)4502 2854 y Fc(\003)4702 -2920 y Fg(Exp)p 4702 2984 V 112 w Fj(\))100 3462 y Fi(In)-5 -b(teger)59 b(and)i(\015oating)f(p)5 b(oin)-5 b(t)61 b(notations)f(are)h -(follo)-5 b(wing)61 b(the)f(ansi-c)h(syn)-5 b(tax.)389 -3733 y Fg(Pr)c(e)g(defConst)p 389 3797 958 8 v 249 w -Ff(\000)-31 b(!)199 b Fg(Inte)-9 b(ger)p 2088 3797 552 -8 v 211 w Ff(j)101 b Fg(R)-9 b(e)g(al)p 3003 3762 338 -8 v 210 w Ff(j)100 b Fj(true)213 b Ff(j)101 b Fj(false)100 -4275 y(Op)6 b(erator)69 b(denotations:)100 4546 y Fi(The)59 -b(e\013ectiv)-5 b(e)58 b(no)5 b(de)58 b(construction)g(denotes)g(an)h -(actual)f(op)5 b(eration)59 b(wic)-5 b(h)59 b(can)g(b)5 -b(e)59 b(a)f(predi\014ned)h(op)5 b(eration,)100 4771 -y(or)60 b(a)h(user)f(de\014ned)g(op)5 b(eration,)61 b(in)g(whic)-5 -b(h)61 b(case)f(a)g(list)h(of)f(e\013ectiv)-5 b(e)60 -b(static)g(parameters)f(can)h(b)5 b(e)61 b(giv)-5 b(en.)100 -5042 y Fg(No)c(deExpr)g(ession)p 100 5107 1247 8 v 249 -w Ff(\000)-31 b(!)199 b Fj(op)6 b(erator)110 b Fg(Pr)-9 -b(e)g(defOp)p 2981 5107 730 8 v 1717 5313 a Ff(j)320 -b Fg(Idf)p 2088 5378 219 8 v 222 w Fi([)p Fg(StaticA)-5 -b(r)c(gList)p 2580 5378 1042 8 v 51 w Fi(])100 5584 y(The)60 -b(k)-5 b(eyw)g(ord)61 b Fj(if)111 b Fi(is)61 b(denoting)f(the)h -(ternary)f(op)5 b(eration)61 b Fj(if)50 b Fi(...)p Fj(then)g -Fi(...)p Fj(else)e Fi(...)616 5855 y Fg(Pr)-9 b(e)g(defOp)p -616 5920 730 8 v 248 w Ff(\000)-31 b(!)199 b Fg(Unop)p -2088 5920 424 8 v 212 w Ff(j)101 b Fg(BinOp)p 2875 5920 -519 8 v 211 w Ff(j)g Fj(if)923 6397 y Fg(Unop)p 923 6462 -424 8 v 250 w Ff(\000)-31 b(!)199 b Fj(not)212 b Ff(j)101 -b Fj(-)212 b Ff(j)100 b Fj(pre)212 b Ff(j)101 b Fj(curren)-6 -b(t)828 6939 y Fg(BinOp)p 828 7004 519 8 v 249 w Ff(\000)-31 -b(!)199 b Fd(->)161 b Ff(j)100 b Fj(when)212 b Ff(j)101 -b Fj(or)212 b Ff(j)100 b Fj(xor)212 b Ff(j)101 b Fj(and)212 -b Ff(j)100 b Fd(=>)161 b Ff(j)101 b Fj(=)211 b Ff(j)101 -b Fd(<>)160 b Ff(j)101 b Fd(<)161 b Ff(j)100 b Fd(>)1717 -7210 y Ff(j)320 b Fd(<=)161 b Ff(j)100 b Fd(>=)161 b -Ff(j)100 b Fj(+)212 b Ff(j)100 b Fj(-)212 b Ff(j)101 -b Fj(*)211 b Ff(j)101 b Fj(/)212 b Ff(j)100 b Fj(div)213 -b Ff(j)100 b Fj(mo)6 b(d)211 b Ff(j)101 b Fd(^)161 b -Ff(j)100 b Fd(|)721 7752 y Fg(NaryOp)p 721 7817 626 8 -v 249 w Ff(\000)-31 b(!)199 b Fd(#)161 b Ff(j)101 b Fj(nor)100 -8294 y(Static)70 b(argumen)-6 b(ts:)100 8565 y Fi(The)88 -b(strict)f(w)-5 b(a)g(y)88 b(is)g(to)g(sp)5 b(ecify)87 -b(the)h(nature)f(\(const,)94 b(t)-5 b(yp)5 b(e)87 b(or)h(no)5 -b(de\))87 b(of)h(a)g(e\013ectiv)-5 b(e)87 b(static;)101 -b(ho)-5 b(w)g(ev)g(er,)100 8791 y(the)79 b(nature)h(can)g(b)5 -b(e)80 b(a)-5 b(v)g(oided)80 b(when)h(the)e(parameter)g(is:)119 -b(a)80 b Fj(simple)f Fi(arithmetic)g(and)h(logic)h(expression)100 -9017 y(\(t)-5 b(ypically)66 b Fd(n-1)p Fi(\),)e(a)i(predi\014ned)g(t)-5 -b(yp)5 b(e)65 b(or)g(constan)-5 b(t)65 b(\(or)g(an)g(arra)-5 -b(y)66 b(of)14 b(\),)66 b(a)f(predi\014ned)h(op)5 b(erator,)66 -b(or)g(ev)-5 b(en)65 b(a)100 9243 y(single)51 b(iden)-5 -b(ti\014er)51 b(\(in)g(this)f(case,)i(the)e(compiler)g(will)i(try)f(to) -f(compute)e(the)i(nature)h(according)f(to)h(its)f(naming)100 -9468 y(en)-5 b(vironmen)g(t\).)305 9739 y Fg(StaticA)g(r)c(gList)p -305 9804 1042 8 v 250 w Ff(\000)-31 b(!)199 b Fd(<<)171 -b Ff(f)p Fg(StaticA)-5 b(r)c(g)p 2542 9804 737 8 v 111 -w Fj(,)101 b Ff(g)3640 9673 y Fc(\003)3840 9739 y Fg(StaticA)-5 -b(r)c(g)p 3840 9804 V 111 w Fd(>>)609 10010 y Fg(StaticA)k(r)c(g)p -609 10075 V 250 w Ff(\000)-31 b(!)199 b Fj(t)-6 b(yp)6 -b(e)112 b Fg(T)-14 b(yp)-9 b(e)p 2603 10075 372 8 v 212 -w Ff(j)100 b Fj(const)111 b Fg(Exp)p 3927 10075 301 8 -v 212 w Ff(j)101 b Fj(no)6 b(de)111 b Fg(No)-9 b(deExpr)g(ession)p -5141 10075 1247 8 v 1717 10281 a Ff(j)320 b Fg(Pr)-9 -b(e)g(defT)-14 b(yp)-9 b(e)p 2088 10346 870 8 v 160 w -Ff(f)p Fj(^)110 b Fg(Expr)-9 b(ession)p 3425 10346 852 -8 v 102 w Ff(g)4469 10215 y Fc(\003)4770 10281 y Ff(j)100 -b Fg(Pr)-9 b(e)g(defConst)p 4921 10346 958 8 v 161 w -Ff(f)p Fj(^)111 b Fg(Expr)-9 b(ession)p 6347 10346 852 -8 v 101 w Ff(g)7390 10215 y Fc(\003)1717 10552 y Ff(j)320 -b Fg(SimpleExpr)-9 b(ession)p 2088 10617 1381 8 v 211 -w Ff(j)101 b Fj(op)6 b(erator)110 b Fg(Pr)-9 b(e)g(defOp)p -4726 10617 730 8 v 210 w Ff(j)100 b Fg(idf)p 5819 10617 -205 8 v 3758 11695 a Fi(9)p eop -%%Trailer -end -userdict /end-hook known{end-hook}if -%%EOF diff --git a/doc/lpp.toc b/doc/lpp.toc deleted file mode 100644 index f375e18b..00000000 --- a/doc/lpp.toc +++ /dev/null @@ -1,13 +0,0 @@ -\contentsline {section}{\numberline {1}types}{3} -\contentsline {subsection}{\numberline {1.1}Immediate types}{3} -\contentsline {subsection}{\numberline {1.2}Type declaration and built types}{3} -\contentsline {subsection}{\numberline {1.3}Use of structured types}{4} -\contentsline {section}{\numberline {2}Static parameters}{4} -\contentsline {subsection}{\numberline {2.1}Declaration of template node}{4} -\contentsline {subsection}{\numberline {2.2}Node expression}{5} -\contentsline {subsubsection}{\numberline {2.2.1}Predefined operators}{5} -\contentsline {subsubsection}{\numberline {2.2.2}Template instanciation}{5} -\contentsline {subsection}{\numberline {2.3}Static recursion}{6} -\contentsline {subsection}{\numberline {2.4}Static arrrays}{6} -\contentsline {section}{\numberline {3}Name space and package}{6} -\contentsline {section}{\numberline {A}Abstract syntax}{7} diff --git a/doc/syntax.dvi b/doc/syntax.dvi deleted file mode 100644 index acf6757f4a4f27577ad619c783f1c98528c66232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13980 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 H6ZHFUEp!4Y diff --git a/doc/syntax.ps b/doc/syntax.ps deleted file mode 100644 index 61eabc9b..00000000 --- a/doc/syntax.ps +++ /dev/null @@ -1,1251 +0,0 @@ -%!PS-Adobe-2.0 -%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software -%%Title: syntax.dvi -%%Pages: 3 -%%PageOrder: Ascend -%%BoundingBox: 0 0 596 842 -%%EndComments -%DVIPSWebPage: (www.radicaleye.com) -%DVIPSCommandLine: dvips syntax.dvi -o syntax.ps -%DVIPSParameters: dpi=1200, compressed -%DVIPSSource: TeX output 2002.05.24:1448 -%%BeginProcSet: texc.pro -%! -/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/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/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]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ -rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp -gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B -/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ -/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ -A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy -get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} -ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp -fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 -{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add -chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ -1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} -forall N/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 -TeXDict begin 39158280 55380996 1000 1200 1200 (syntax.dvi) -@start -%DVIPSBitmapFont: Fa cmtt10 10.95 9 -/Fa 9 125 df<DB07C0EC07C0DB1FF0EC1FF04B6C4A7EA24B6C4A7EA703FF15FF4C5DA8 -4A5D4C5DA8000FBB12FE003FF2FF80481BC0A2BD12E0A56C1BC0A26C1B80000FF2FE00C7 -000F902680000F0180C7FCA84A5D93C791C8FCA94A5D4B5DA8000FBB12FE003FF2FF8048 -1BC0A2BD12E0A56C1BC0A26C1B80000FF2FE00D800019026F0000101F0C8FCA8495D4B5D -A8495D4B5DA76D496D5BA26D90C76C90C9FCD9007CEC007C536F7AEE60>35 -D<000FBA12FE003FF1FF80481AC0A2BC12E0A56C1AC0A26C1A80000FF1FE004B0D76BD60 ->45 D<ED01F0ED07F84B7E82151FA2153FA2157FA215FF5CA25C5C5C5C5C5C49B5FC1307 -133F000FB6FC123F5AA2B7FC157F14FE14F86C13F014C0383FFE00EA1FF0C8FCB3B3B3AD -0007B912E0001F18F84818FCA24818FEA46C18FCA26C18F8000718E03F716EF060>49 -D<1A3EF2FF804F13C019074F13E0193F614EB5FC60060F14C0183F4E14804DB5EAFE004D -14F8050F5C4D14C0057F5C94B548C7FC04035C4C14F0041F5C047F148093B548C8FC0303 -5C4B14F0031F5C4B148092B6C9FC4A14FC02075C021F14E04A5C91B6CAFC4914FC01075C -4914E0013F5C4991CBFC48B55A4814F8000F5C003F14C04891CCFC5CB512F85C14C014F0 -806C13FE806C14C0000F14F00003806C14FE6C6C7F6D14C0010F806D14F80101806D14FF -023F14C06E80020714F80201806E14FF033F806F14E00307806F14FC030080706D7E041F -14E00407807014FC040080716D7E051F807114F00503807114FE716CEBFF807214C0180F -060314E084727E85190F7313C01901731380F23E004B5D76E560>60 -D<000FBB12F8003F1AFE4886A2BD1280A56C1B00A26C62000F1AF8D0FCAF000FBB12F800 -3F1AFE4886A2BD1280A56C1B00A26C62000F1AF8512979CB60>I<EA0F80EA3FE0487E13 -FC487E6D7E8014F0806C13FE6E7E6C80000F14F00003806C14FE6C6C7F6D14C0010F806D -14F80101806D14FF023F14C0020F806E14F80201806E14FF033F806F14E00307806F14FC -030014FF7080041F14E00407807014FC040080716D7E051F807114F00503807114FE716C -EBFF80061F14C084060314E084727E4EB5FC60060F14C060067F14804DB5EAFE004D14F8 -050F5C4D14C0057F5C94B548C7FC04035C4C14F0041F5C047F148093B6C8FC030314FC4B -14F0031F5C4B148092B6C9FC4A14FC02075C4A14E0023F5C91B6CAFC4914FC01075C4914 -E0013F5C4991CBFC48B55A4814F8000F5C003F14C0485C4ACCFCB512F85C14C05C49CDFC -6C5A13F06C5AEA0F804B5D76E560>I<ED0780ED1FC0ED7FF0913801FFFC020713FF021F -14C0027F14F049B612FC010715FF011F16C0017F16F048B812FC4883000FEFFF80003F02 -F815E048DAE03F14F04B7EB6D8000714F802FC13014A7F6C01E0023F13F00280140F6C48 -C8000313E04981D81FF09238007FC0D80FC0EE1F800003CAEA06003D1B6FEE60>94 -D<943803FFE0001FB500C0013F13FC486E48B6FC48DAF00715C0B6D8F81F15F0047F8193 -B77E03F98292B8FC866C867E6CDCFE0180D800019238E0003F05807F4CC76C7F5E4C8004 -E0825E855E93C8FCA25DA25DA45DB3B3001FB7D88003B7FC48DCC00F168048704816C0B8 -00F017E060A4846C04E017C06C4C6C16806CDC800316005B4F7ECE60>110 -D<EA0F80EA3FE0EA7FF0A2EAFFF8B3B3B3B3B3B3B3A7EA7FF0A2EA3FE0EA0F800D8D57FD -60>124 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fb cmbsy10 10.95 2 -/Fb 2 104 df[<96380FFFE00607B512F0187F0503B6FC171F177F4CB712E00407EDE000 -4C4AC7FC4C14F04C14C04C91C8FC93B512FC4B5C604B5C605D605DA295C9FCB3B3AF5D5F -A25D4B5BA292B55A4A5C5C4A5C021F5C027F5C49B548CAFC010F5C90B612F0007F15C0B7 -CBFC15F815C015F815FF6C15C0C615F0010F14FC0101806D6C6D7E021F800207806E8080 -6E806F7FA26F7F81A28381B3B3AF84A2818481846F80846F807013FF7014C07014F07014 -FE70ECFFE00401EDFFE0706C15F0171F1703EF007F1807DE000F13E0>76 -181 114 263 105 102 D[<EA7FFFB512FEECFFE015FCEDFF8016E06C15F8C66C14FE01 -0780010081023F80020F800203806E80806F7F81838183A281B3B3AF8481A2846F80A26F -806F8084707F706D7E7014E0040714F87014FF040015F0053FECFFE0050F15F01701EF00 -3F4DB6FC170F053F15E094B6EAF000040392C7FC4C14F8041F14E04C14804C49C8FC93B5 -5A604B5C4B5CA24B5C60A25D95C9FCB3B3AF5DA25F5D5F5D92B55A5C4A5C020F5C023F5C -91B65A010792CAFC017F5C007FB612F8B712E0168003FCCBFC15E04ACCFC6C90CDFC>76 -181 114 263 105 I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fc cmr8 8 1 -/Fc 1 44 df<EF07804D7EB3B3A7007FBD12F0BE12F8A46C1CF0CAD80FC0CAFCB3B3A771 -5A5D5E78CF6E>43 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fd cmsy8 8 1 -/Fd 1 4 df<15F04A7E4A7EA2815DA7003EEE07C0007FEE0FE09026C001F8133FD8FFE0 -ED7FF001F015FF01FC1403D87FFE4A13E0D9FF81131F001F01C1491380000701F19038FF -FE000001D9F9F913F827003FFDFB13C0010FB6C7FC010314FC010014F0021F1380DA07FE -C8FC91381FFF8091B512F0010314FC010F14FF90263FFDFB13C02701FFF9F913F80007D9 -F1F813FE001F01C190383FFF80007F01816D13E0D9FE011307D8FFFC6E13F001F0140001 -E0157FD87FC0ED3FE090260003FC130F003EEE07C0C792C7FCA7815DA26E5A6E5A343977 -BD47>3 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fe cmsy10 10.95 5 -/Fe 5 107 df<003FBF12F8481EFCC012FEA46C1EFC6C1EF86F0871B08E>0 -D<F81FC08DA48D200FA28D2007A28D2003A28D20018D8C8E217F8E213F8E7B7EA27B7E7B -7E8E21037B7E8F7B7F7C7E7C7E7C7EFA0FFE7C7E7C7F7C13E07C7FFB7FFC7DB4FC7D13C0 -003FC512F048A112FCC5B5FCA11480A2A114006CA112FC6CA112F0D6001F13C05990C7FC -FB7FFCFBFFF0585B5813805890C8FC585AFA1FF8585A585A585A575BA0C9FC575A21076A -575A575AA2575A6A217F6A21FF9FCAFC6869200369A2200769A2200F69A2201F69A469A1 -5E76DBB6>33 D[<953801FF80067F13C00503B5FC171F057F14804CB5EAE000040749C7 -FC4C13F04C13C04C90C8FC4C5A4C5A4B13F05D4B5B5F5D5FA25D94C9FCB3B3B05D5EA215 -7F5E15FF5E4A5B4A5B4A5B4A5B023F90CAFCECFFFE01035B011F13F048B55A007F1480B5 -00FCCBFC14E014FC6CEBFF80000114E0D8001F7F010313FC01007FEC3FFF020F7F6E7F6E -7F6E7F6E7F82157F82153FA28281B3B3B08381A28381836F7F816F13FC707E707E7013C0 -7013F07013FE0401EBFFE0706CEBFF80051F14C01703EF007F06011380>66 -181 116 263 91 102 D[<EA7FF0B57E14F814FF6C14C0000114F0D8000F13FC01037F90 -38007FFF6E7F020F7F6E7F6E7F6E7F6E7F157F82153FA28281B3B3B08381A2838183816F -7F6F7F83707E93381FFF80707F7013F07013FE0400EBFFE0053FEBFF80050714C0170017 -07053F148094B5EAE000040349C7FC4C13F04C13C04C5BDC7FFEC8FC4C5A5F4B5B4B5B5D -5F5D5FA25D94C9FCB3B3B05D5EA2157F5E15FF4A5B4A5B4A5B4A5B023F5B4A90CAFC9038 -03FFFE010F5B48B512F0007F14C0B6CBFC14F81480D87FF0CCFC>66 -181 116 263 91 I[<123C127E12FFB3B3B3B3B3B3B3B3B3AF127E123C>8 -181 107 263 51 106 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Ff cmti10 10.95 37 -/Ff 37 122 df[<F403F0527E1C0F1C1FA21C3FA21C7FA21CFF63A2638963A26363A263 -A263A298B5FCA262621BFB1A0709F37FF20FE3A2F21FC3F23FC11B811A7F1B011AFF1AFE -F101FCA2F103F819071AF0190F08E080F11FC0A2F13F80077F7F97C7FC61611801614E5A -A24E5A180F61181F4F824E5AA24EC87E60601701601703604D5A170F60171F60053F8460 -4DC9FCA205FE8216015F4CBAFCA25EA25E5EA2DC3FC0C9123F5F047F8594CAFC16FEA24B -488315035E15075E4B5AA24B5A153F5E157F93CBFC4B865D4A5AA24A488414075D140F14 -1F143F147FEB01FF496D4E7F011F6D187F90B66C0403B6FC003F03F80307B812C0486F4B -17E0B7FCA220C05E267FFE3F496F02C31480>115 130 117 257 -135 65 D<4BBB12E01EFE4BF2FFC01FF01FFC1FFF6F8892C7001F49C8000380050701F8 -DB007F7F0C1F7F787F4F707F787FA24D727F61781480A25F4F8321C0A25F61A35F96CBFC -A394B595B5128060A34C4F140060545BA24C4F5B60545B684C4F5B4E5F545B684C96B5C7 -FC4E4C5B535B0B0F5B4C4E13E04E4C5B9AB5C8FC525B4C050713F84E033F13E00903B512 -8095B800FCC9FC4C18E0A21DFE777E93B5C9001F13E04D040313F8767F766CB4FC4B737F -4D717F8B777F4B854D85A2777F5D4D8589A24B875FA35D5FA35D5F65A24B6394CBFC6567 -92B5FC4C6067654A644C6067654A97B55A4C625291C8FC644A4F5B4C4D5B525B525B4A4F -5B4C4CB55A515C4A060F49C9FC093F5B4A494BB55A0103B56C030F14E0003FBD12804899 -CAFC1CFC1CE01C80BC00F8CBFC6C97CCFC7A7C75FB80>I<972607FFE0150797B500FEED -0F80070FDAFFC0EC1F00077F03F05C0603B76C5C060F04FE5C063F70495A95B6D8801FEB -800305039126F00001EBC007050F02809039007FE00F4D01FCC8D81FF05B057F01F09238 -0FF81F94B50080923803FC3F040391C90001137F4C01FC71485A4C01F070B5FC043F4983 -4C138093B5CB6C5B4B5B4B01F8844B5B4B49725B4B5B4B5B4B90CC7E4B48635C4A5B4A49 -854A4963A24A5B4A5B4A9AC7FC5E91B5CDFC5B494963A2495BA24949635B5D5B4B635B5D -90B51B07A2484A745A9BC9FC4891D2FCA3485BA3485BA35A5CA35A5CA35A5CA55CB5FCA5 -F503E04A507EA21D0F66A31D1F6C651D3F66A21D7F9BC9FC6C646E621C01525A6C641C07 -6E626C1B0F525A6E4F5A6C641C7F6C6D4FCAFC515A6C6D4E5A515A6C6D4E5A6D6C4E5A6D -4F5A6F4D5A6D6D4C48CBFC6D6D4C5A6D6D4C5A6D01FCEE1FF86D6DEE7FF06D6D6C913801 -FFC06E01E002075B6E01FC023F90CCFC020F903AFFC007FFFC6E91B612F002015F6E6C16 -80031F03FCCDFC030715F0DB007F91CEFC040713F0798465FF82>I<4BBB7E4B1AFC4BF2 -FF801FE01FF81FFE6F8792C7003F01FCC8001F80050F01F0030114E0776C7F0C1F7F4F04 -077F8A0C007F4D737E4F717FA2797F4D737F4F838D8B5F96CB808B8D94B5FC4E848DA25E -607A7EA25E60A35E602280A25E4E96B5FCA35E60A222004C6260A35E95CCFC676993B5FC -5F67A24B655F67A24B655F67695D4D6169A25D4D4F5BA2694B98B5FC4D98C7FC66685D4D -4E5BA2545B5D94CC485B686692B5634C4F5BA25490C8FC4A515A4C6265535B4A505B4C62 -535B535B4A5090C9FC4C4E5A535A525B4A07075B4C4D5B525B0A7F5B4A96B5CAFC4C0403 -13FC090F5B4A063F13E050B55A4A49030F91CBFC0107B56C92B55A007FBC12F8BD12E099 -CCFC1BFC1BE098CDFC6C19E0817C74FB89>I<0303BE12C04B1DE0A58192C76C49C97E05 -0F01F8040314C0F6007F4F171F1F075F8B4F8321805F8B61A25F210061A294B5FCA296CC -FCA24C63A260A25EA24E1801E20FC05C4C4D7E6560A24C173F536D5A4E96C7FCA24C177F -9ACAFC4E5DA25E515A4E1403A24C1607F31FFC4E147FF207FF93B9FC64A35D64A24DC712 -0F4B1601746C5A4D153FA25D645FA25D645F1F3F4B057F4B7E99C890C7FC5F674B4D5D51 -14014D611B7C4B94C81203674D18076792B5190FA294CC485AA24A641E3F4C197F674A1B -FF9CC8FC4C60664A1A031D074C611D0F4A505A1D3F5E535A4AF101FF525B4C170F1C3F4A -96B55A1B034A49043F5C0107B56C030FB6FC007FBEFCBFC9FCA265A36C647B7B74FA7B> -I<4BBEFC4B1D80A35DA28192C7003F91C9FC050701FC16070C0014004F173F8B4D858B61 -8B5F68611F015FA261A25FA24F60A294B5FCA296CBFCA25E1F034E61A25EF407C04E4B7E -A24C171F536D5A4E95C8FCA24C173F65601C7F5E9ACAFC4E5D635E515A4E14071B0F4C16 -7F973807FFFC95B7FCA293B9FC64A35D95C7000F5B4D14001B7F4B173F644D151FA25D64 -5F1B3F5D645FA24B177F99CBFC5FA25D1B3E4D92CCFCA25DA25FA292B5FCA294D0FCA25C -A25EA25CA25EA25CA25EA25CA25EA25CA25C0103B6FC003FB812FE4883A260B9FCA26CD9 -FE0F5C797B75FA77>I<4BB5D8F83FB5FC4B91B71280A34B1800A26F5F92C7003F02E0C7 -FC050749C8FC61A261A35F61A35F61A35F61A35F61A394B5FC96C9FCA35E60A35E60A35E -60A35E60A35E60A35E60A35E60A393B5FC95CAFCA35D5FA35D5FA35D5FA35D5FA35D5FA3 -5D5FA35D5FA392B5FC94CBFCA35C5EA35C5EA35C5EA35C5EA25CA25C0103B512FE003FB8 -12E04883A2B95AA36CD9FE0F5C517C76FB46>73 D<4BB5D8F83FB512E04B91B77E5D64A3 -6F6092C7003F02E0C9FC050F49CAFC19F8A261A35F61A35F61A35F61A394B5FC96CBFCA3 -5E60A35E60A35E60A35E60A35E60A35E60A35E60A393B5FC95CCFCA35D5FA35D5FA35D5F -A35D5FF501F8F503FC4B1AF85F1D071EF05D4D170F1EE0A24B191F4D18C0A21D3F92B519 -8094CB127FA2F5FF005C4C5F651C035C4C4D5AA21C0F4A4F5A5E1C3F525A4A19FF4C5E51 -5B634A181F4C4C5B98B5FC4A1703080F5C4A4992B6FC0107B56C140F007FBDC7FCBEFCA2 -64A36C63667C74FB72>76 D<4BB600FC94B538C3FFFE4B6F4C91B6FC4B62A285A26F706F -16FE92C7001FDE000315000507DF007F13F074051F13C04D99C7FC7A5A7460695F746018 -EF74171F173F06C76286203FEF7FC306836D60A20681197F05FF80060162847516FF4C80 -4D6F94C8FCA2735F0403824D628575150316074D6D60871F07040F804D6F5E8575150F16 -1F4D6D60871F1F043F804D705DA274163F047F834D628676147F04FF8194C86E5DA27416 -FF4B844C98C9FC86765B15034C6F5E8874150315074C715C86F58007150F4C705D1DC01E -0F031F834C06E05BA275141F033F19F04C705D1DF81E3F037F834C06FC5BA275147F03FF -19FE93CA5E879AB5FC5C4B7192CAFCA28814034B6288A214074B725BA3020F854B62A202 -1F85A2023F735B147F4A7E010386010F01FE6290B612C0007FDBFF8082B87E661D7FA25F -6C01C391CB6C5A907C75FB87>78 D<97380FFFC04FB512FC071FECFFC096B712F0060316 -FC061F16FF067FD9F001804DB5C7003F13E04D01F802077F050F01E06E7F053F01800200 -13FE4D48C96C7E932601FFF8707F4C4982040F01C0707F4C49707F4C90CA6C7F4C4883DC -FFF8854B49717F03075B4B49727E4B5B4B747E4B90CCFC4C1B804B48854A491BC05C4A5B -4A49854A491BE0A24A5B4A1DF093CDFC4A5A5B5D5B495B20F8495BA2495B5BA2495BA290 -B55AA34891CE5AA2481FF05C5A665C5AA220E0484963A4484998B512C0A4485214805CA2 -531400A34A505BB5FC6765A2535BA2674A626765679AB5FC67A25291C7FC525B7E525B66 -6E6166525B6C6366525B6C98B5C8FC6E62636C505B515B6E4E5B6C646E4E5B6C505B5190 -C9FC6C6D4E5A6C6D4D5B5013F06D6C050F5B6D6D4C5B505B6D6D4C48CAFC6D6D4B485A6D -6D03075B6D01FC4B13E06D6D033F13806D6C6C6C49B5CBFC6E01E0010713FC6E01FC017F -13F0020790B712C002014CCCFC6E6C15F8031F15C0030102FCCDFCDB001F1380758465FF -8C>I<4BBA12FE4BF1FFF04B1AFE787E1FE01FF86F8792C7003F01FCC86C7F050F01F003 -077F0B0014807813C04F041F13E07813F07813F85F4F7013FCA27813FE5F61A220FF5F96 -CAFCA394B5FC60A34C6160A34C4F13FE60A220FC4C616020F8664C1BF0605413E020C04C -614E19809BB51200674C604E4C5B535B535B4C4E5B95CA4813805390C7FC52485A93B504 -075B4D041F13F099B512C0090F5C4B90B948C8FC1DF81DC052C9FC4B18F051CAFC05FCCE -FCA25D5FA35D5FA35D5FA35D5FA35D5FA392B5FC94CFFCA35C5EA35C5EA35C5EA35C5EA3 -5C5EA25CA25C0107B512F8007FB87EB97EA4606CD9FC3F91CEFC787C74FB7B>I<4BBA12 -E04B19FF1EF01EFC1EFF1FC06F1BF092C7001F49C7000180050701F8DA001F7F0B0313FF -0B00804F707F8A787F4D727F4F828C8A4D86618CA25F61A34D8696CAFC68A294B55F60A3 -4C4F5B60A2545B5E4E6166684C634E5F9BB55A9DC7FC4C4E5B4E60535B535B4C4E5B4E4C -13800B7F90C8FC535A4C050313F84E030F5B0A3F13C051B5C9FC4C043F13FC95B812E01D -800AF8CAFC93B9FC884DC813FF091F7F4B717F4D03037F757F894B717F4D707EA2894B84 -4D84A35D4D84A35D5FA2645D4D60A299B5FC5D94CAFCA26392B5FC4C96C9FCA2635C5EA3 -4A604C60A2201F4AF53F805EA2207F4A1E005E684A651F014A725E0103B500F8505A003F -B86C8048714E5A754B5A766C131FB9704A5A769038C0FF806CD9FC1F4A6F90B5C7FCCF00 -0314FC765CE2003F13E00B031380798075FB85>82 D<DF1FFF15384EB500F0147C060F02 -FC14FC063F02FFEB01F895B7EA80030503EEE0074DD9F003EBF00F051F902780007FF813 -F04D48C7380FFC1FDD7FF8913803FE3FDDFFE00201137F0403496EB512E04C90C97E4C5A -4C48824D7013C04C5A167F4C48824B491880A24B49824B90CAFC1E005D5E151F4C60153F -1C03157F4C601C07A215FF65A35C65A21C0F82765A99C8FC82A282836E808317F8EFFF80 -6F14F018FF19E06F15FCF1FFC06F16F86F16FE747E6F836F836F17F86F83163F70820407 -82040183EE003F050382EF007F0607811800190F070180737E8686868886A286A386A2EB -0F80496C61133F5CA3017F6291CBFCA2624962A3505B5A99C8FC626348191F6E601A3F63 -484F5A80505A6E4C5B48606E606E4C90C9FC4F5A486DEE3FFC02FF4C5A01FD6D4B5A01F9 -01E002035BD83FF001F8020F5B496CB4023F90CAFC496C9039F001FFFE020F90B65A4848 -6C16F0496C5E007E01001680007C021F02FCCBFC48020314F00070DA003F90CCFC668473 -FF66>I<0107BF1280491EC0A35BA349912680000791C7000F148003F0C702FC14000380 -1A3F4948C84A150F4A8702F04B8349481D004A4D815C485F91C9FC4960000366495EA248 -4860A24E60485A625B001F94B51603A24995C95B123F495DA2007F6090C919074D615A48 -60A25F007C775ACA4A93C8FCA25FA261A25FA261A25FA261A25FA261A294B5FCA296CDFC -A25EA260A25EA260A25EA260A25EA260A25EA260A25EA260A25EA260A293B5FCA295CEFC -A25DA25FA25DA25FA25DA25FA25DA25FA25DA2157F020FB67E001FBA7E4885A35AA26CDA -FC0F5D727B60FA82>I<0003B500F0B500F892B53887FFFC4891B66C4A91B512FE4862A4 -6C4D6E16FCC76C0280C90003ECFE00021F01F8CB6C13E04C061F138054C7FC4C725A664A -63A24C61A24A1A1F665EA291B5193F6693CCFCA2491B7F9BC8FC5DA24963655DA2491A01 -655DA2491A03655DA2491A07655DA2491A0F655DA2491A1F655DA290B5193F6592CCFCA2 -481B7F9AC9FC5CA24863645CA2481A01645CA2481A03645CA2481A07645CA2481A0F645C -A2481A1F645CA21B3FB56291CCFC1B7F99CAFCA26349611A01631A03631A07631A0F505A -007F621A3F505A98CBFC003F616D4D5A4F5A6C4E5A4F5A6C6D4C5A4F5A6C6D4C5A4E48CC -FC6C6D4B5A6C6DED0FFC6C6DED3FF86D6CEDFFF06DB402035B6D01C0011F13806DD9FC01 -B5CDFC6D90B612FC6D5E010016E0023F1580020F02FCCEFC020114F09126001FFECFFC77 -805CFB87>I<263FFFF0B500F8933A0FFFFC7FFC4890B66C4C90B512FEB85FA46C4C7015 -FCD8001F02F0CA0001150001070280DD003F13F06D49CC6C13C07790C7FC4B626F626666 -535A666D1B3F6653C8FC65651C016F611C0365525A6D1A0F651C1F65525A1C7F9AC9FC70 -5F64515A1B036E611B0764515A1B1F641B3F705F51CAFC63636E1701631A0363505A1A0F -6370151F63505A1A7F6E95CBFC62624F5A1903621907705D4F5A191F626E163F624FCCFC -61611801705C1803614E5A6E150F61181F614E5A187F96CDFC705B604D5A17036E5D1707 -604D5A171F60173F04FE5B4DCEFC5F5F6E13FF5FA25F5FA25FA25F5FA26E91CFFCA25E5E -A25EA25E5EA25E157F5E93D0FC77805AFB87>I<EE07FC93387FFF804BB512E003078003 -1F9138F807E0923B3FFE07FC0FF0923BFFF001FE1FF84A9039C000FF3F4A496D487E020F -90C7EA3FFF4A485E4A48804A5A4A48804B5E5B494980495B49604990C8FCA2495A017F60 -5C13FF4A5D4861A2485B604896C7FC5C5A6061485BA2187F48605CA218FF486091C9FCA2 -5F61485AA25F615B1BFC4DEC01FE19C01BFCA2494B1403078013F8A2127F4D14074D15F0 -19005F003F93B5EB0FE06D5C001F191F4C16C04C5B6C6CDA0FEFEC3F800007ED1FCF6D91 -263F87FFEB7F006CEDFF076C6D48486C14FE6C9026C007FC140190287FF03FF801EB83FC -6DB5486CEBFFF86D02C06D5B010791C76C5B010101FC020F13809026003FE0DA01FEC7FC -4F526DCF5D>97 D<ED1FE049B57E90B6FC5AA25EA37ED9007F5B140FA35EA25CA293C9FC -A25CA25DA2147FA25DA214FFA25DA25BA25DA25BA25DA25BA25DA25BA25DEE07FC499138 -3FFFC093B512F0030380030F804990391FFC0FFE92393FE003FF9127FEFF8001138091B5 -C713C04901FCEC7FE04B15F04B143F4B15F890B55A4BEC1FFC92C8FC4A16FE5A5C5C19FF -485BA25CA25AA25C605AA25CA2485FA291C9FCA24894B5FC19FE5BA25F007F18FC5BA25F -19F8485AA24D13F0A219E0495D19C0A24D1380A219005F60007F4C5AA24D5A604C5B003F -5D606D4A5B001F4B90C7FC4C5A000F5E6D4A5A00074B5A6C6C49485A6C6C4913806CD980 -0F90C8FC90397FE07FFE6DB512F86D14E06D1480010349C9FC9038007FE040806CFD54> -I<EF7FF80407B5FC043F14C093B612F0030381030F9038E01FFC033F90380003FEDB7FFC -EB00FFDBFFF0EC7F80020301C0143F4A4915C04A90C8127F4A48EC01FF4A484A13E04A48 -5C4A485C49495C5B49494A13C0495B5B92C81480495A017F7013004A5E01FF705A48EF03 -F04A92C8FC5A5C5AA2485BA3485BA35A5CA35A91CCFCA45B12FFA45BA4127FA21903F107 -80F10FC0F11FE0003FF03FC0197F6D1880001F943801FF004E5A000F4D5A6D4C5A6CEF3F -F06C6D4B5A4D485A6C6D02075B6C6DDA1FFEC7FC6D6CEC7FFCD93FFC903803FFF06DB401 -7F13C0010790B6C8FC6D15FC010015E0023F91C9FC020313E043526DCF54>I<F33FC007 -03B512E04EB6FC60A21CC0A38495C714801A1FA31C00A262A263A21A7FA263A21AFFA263 -A261A263A261A263A261A263A261A263A261A298C7FCEE07FC93397FFF803F4BB512E003 -0702F05B031F14F8923A3FFE07FC7F9239FFF001FE4A9026C000FF5B4A49137F020F90C7 -EA3FFF4A5A4A486E5B4A5A4A48805D4960494980495B5B4990C85CA2495A137F4A5F13FF -4A5D5A62485B605A4A94C8FC5A60A248495EA2187F5A4A5EA218FF5A91C95BA25FA24848 -5FA25FA2495F1BFC4D4A7EA207C05BA2494B1403631980127F4D14074D5D19005F003F93 -B5495A6D5C001F191F4C5E4C5B6C6CDA0FEF4A5A0007ED1FCF6D91263F87FF49C7FC6CED -FF076C6D48486C14FE6C9026C007FC140190287FF03FF801EB83FC6DB5486CEBFFF86D02 -C06D5B010791C76C5B010101FC020F13809026003FE0DA01FEC8FC53806DFD5D>I<EFFF -E0041F13FE93B67E030381030F81033F9038C07FF0923AFFFE000FF84A01F06D7E020701 -C06D7E4A4913014A48C87E4A5AECFFF8494916804949157F495B495B19FF4990C9130049 -5A137F49485D61484915036148491507484D5AF03FF048494B5A4D485A050F5B484991B5 -C7FC041F13FC02C7B65A4890B712C095C8FC17F04CC9FC4801FCCBFC91CCFCA45B12FFA4 -5BA8127FA21906190FF11F80003FF03FC0F17F8019FF001F19006DEE03FE000F4D5A4E5A -6C6C4C5AF07FE06C4D5A6C6D02035B6E020F90C7FC6CEE3FFCD97FF0ECFFF86D6C010713 -E06DB490B512806D90B548C8FC010315F8010015C0023F49C9FC020713C042526CCF54> -I<F21FE0F2FFFC070313FF4F1480071F14C096393FF87FE096397FE00FF0DFFFC013F84E -143F4EEB807FF3FFFC4E130162604F4813F8181FA2063F15F019FC7413E0067F15C07413 -809738007E004F90C7FC18FFA44D5BA45F61A45F61A45FA261A45F96C9FC031FB812C04B -83A56F5F92C7D83FFEC9FC177F60A417FF60A45E60A55E60A45E60A45E60A45E95CAFCA4 -5E5FA4167FA25FA416FF5FA45D5FA35DA25FA35D5FA45D5FA44B90CBFCA35E153FA35EA2 -157F5EA3D801F8495AEA07FC487E486C5C481381485DA25EB5FC4A90CCFCA201FE5B4948 -5A13F86C48485A9038C01FF0003F5C391FF07FC06CB55A6C91CDFC6C5B6C13F838003FE0 -56A584FF38>I<EF03FF051F13E094B57E040314FC040F9138FE01F84C903903FF03FC93 -3B7FFC007F87FEDCFFF0EB3F8F4B01C090381FDFFF0307496DB5FC4B90C714FE4B48804B -5A4B48804B5A1BFC4A49804A5B5C4A4916F8854A90C85A5C4B17F0147F4A485DA24919E0 -5D495FA24B17C05B615B4B1780A2615B4B1700A2615B4B5EA2197FA292C95BA24917FFA2 -625C60A2013F60A260A26260011F5EA24E5B010F5E606E92B5FC6D4B5C5F6D6D5B6D5D6F -013F91C7FC6D6DEB7FDF6E6C48485A913A3FFC0FFE3F6EB500FC5B020714F06EECE07F02 -001400DB1FF85C92C8FC18FFA261A25FA261A25FA261A25F61EA01F8D807FC5D486C5F48 -6C5D4895C8FC484C5A177FB55E4D5A4C5B494A5B4C5B494A5B49023F90C9FC6C48ECFFFC -003F02035B271FFF801F13E06C90B65A6C4BCAFC000115F86C6C14C0010301FCCBFC5075 -76CF54>I<EE1F80EE3FE0EEFFF05D4B13F8A25DA417F017E017C06F13806F1300ED007C -93C7FCB3A6EC1FF0EC7FFC49B5FC4980010F8090391FF07FE090383FC03F02007F017E80 -13FE485A5B000381485A157F485AA2485A4B5AA2485A5C007F5D13005C5E485B485DA200 -7C5BC75CA25C93C7FC5C5DA2147F5DA214FF5DA25B5D5B5DA25B5DA25B92388001F849EC -03FC150017F85B4A130717F0137F5CEE0FE013FF4A131F17C0A24AEB3F80A2EE7F00A216 -FE4A5B017F13014B5A6E485A013F495A011FEB7FC06DB55A6D91C7FC6D5B6D13F8903800 -3FC02E7A71F738>105 D<EE3FC00203B57E49B6FC5BA25FA37F90C75C151FA394CAFCA2 -5DA25EA3157F5EA315FF5EA35C5EA35C5EA35C5EA35C5EA35C93CBFCF103FE96381FFF80 -4A047F13C04B4AB512E04E14F0953807FE07027F92391FF003F84B91383FC00F95387F00 -3F06FEEB7FFC02FFDA01F813FF4B49485A4D485AEF0FC0494B484813F84BEB3F00177E4D -15F0495D4B48486D13E04C4815C04C486D138049020F9138007E004B484891C7FC4CCAFC -167E495CED81F8ED87F0ED8FE049EBBFC04B5A03FECBFC5D5BEDFFE016FCEEFF804915E0 -DAFC7F13F803077F03017F01FF6D6C7E4A011F7F707F707F48814A81828448815CF207E0 -F20FF05A4A18E0A24C151F481AC04A5DA21A3F481A8091C75C1A7F1B005A4918FEA26200 -7F6F140149601903057F495A00FF614992383FF01F716C485A71B55A496F91C7FC6C486F -5B6C48030013F86CCAEA3FE04E8073FD54>107 D<ED01FE021FB5FC010FB6FC5BA216FE -A37FD9000713FC1400A316F8A25CA216F0A25CA216E0A25CA216C0A25CA21680A25CA216 -00A25CA25DA2147FA25DA214FFA25DA25BA25DA25BA25DA25BA25DA25BA25DA25BA292C7 -FCA25BA25CA2137FA25CA213FFA25CA25AA25CA25AA25CA25AA25CA25AA25CA25AA291C8 -FCED07E048EC0FF0A24914E0A2007F141F16C05BA2153F00FF15805BA2ED7F00A25D5D6C -5A4A5AA26C6C485AA2001F495A140F6C6C485A6CB55A6C5C6C91C7FC38007FFCEB0FF028 -8070FD2F>I<49B4922601FFC0ED07FF010701C0021F01F8037F13E04901F091B500FE02 -03B512F8496D01036E6C010F14FE496D496F498090267F87FE011F01016D90267FFC077F -9026FE03FF90283FF0007FF09026FFC0017FD801FC9126807FC06D6C4890C77F6E4AC790 -26FC03FC81D803F8DAC1FE021F4948147F0007DBC3F89226FE0FE08101F0DAE7F04C5ADC -EFE04C5AD80FE0DAFFC06F48C87F4D6E01FE153F121F01C092C85C4A495F123F01804A4B -49157F4C5F5C007F4B5F13004C5F4849494B90C912FF48684C5EA2007C49057F5EC76793 -C95BA24A05FF5E694B5FA2027F4C5F694B5F6702FF4C61A24B4D5D9EC8FC495F674B4D5E -A2494D177F684B5F0DFFEC0FC0494D4EEB1FE0A24B94C84816C068494D4C153F5614804B -5E54157F49057F4E1400A292C9496154495B4917FF575A4A5F56485A017F4C637814074A -4D4E5A6A01FF4C1A1F784A5A4A4D6F02FFC7FCF883FE78EBFFFC4A4D705B6D486F497013 -E06D486F90CA000F5B6DCA007CDD03FEC8FC8B5271CF95>I<49B4923803FF80010701C0 -023F13F84901F091B512FE496D010380496D010F8190267F87FE90261FFE037F9026FE03 -FF90263FF0007F00016D902680FFC06D7E01FC02C190C77FD803F8DAC3FE143FDCC7F881 -D807F0ECEFF0EEFFE0D80FE04B6E7E5F121F01C092C8FC4A5B003F5D0180183F5E5C007F -5D01005CA24A49157F4862485DA2007C4917FFC76193C9FCA24A5E635DA2027F5E635D61 -02FF60A24B5D635B614B94C8FCA2495F625D077FEC07E0494EEB0FF0A24B03FF15E06249 -4C151F5014C05D4E153F494E1480A292C8EE7F004E5B5B1CFE5C50485A017F627214034A -4E5A6401FF190F724A5A4A6FEC7F80E0C1FFC7FC73B45A4A705B6D487013F06D48040713 -C06DCA000190C8FC5C5271CF66>I<EF7FF80407B5FC043F14E093B67E030315FC030F90 -38E03FFE033F90380007FFDB7FFC01017FDBFFF06D7F020301C06E7E4A49814A90C86C7E -4A48824A48151F4A48824A48150F494982495B5B494917805B92C97E495A017F19C05C01 -FF5F5A5C5A5C5AA2485B61A2485BA261481A805CA261481A0091CAFCA296B5FC625B00FF -6160A262495E626062007F6160624E90C7FCA24E5A003F4D5A6118FF6C6C4B5B61000F4C -5B6D4B5B6C4C90C8FC6C6D4A5AEF7FF86C6D4A5A6C6D495B6D6C01075BD93FFC011F90C9 -FC6DB448B45A010790B512F86D15E0010092CAFC023F13FC020313804A526DCF5D>I<DB -0FF8EDFFC0DB3FFE020713F84B6C6C011F13FE92B56C017F7F4A6E90B612C0912803FC3F -F00101C17F913E07F01FF807FE003FF0020F90270FFC0FF86D7E03E0DA1FE080DA1FC06D -4848130F4E4880DA3F8090B5C76C7E60DA7F004A16804E804A5D4A4B16C05E01015E4A4B -16E0A24C90C8FC13034A5CA2167F13074A5C636D4813FF90C8FC5FA24B5FA25FA24B5F1D -C05FA24B5F1D805FA24B5F1D005FA24B4D5AA294C95B624B60A24C4B5BA2037F60624C5F -505B15FF5090C7FC6370153F4A60505A505A704A5B4A6071495B4F90C8FC71495A4A4C5A -DCEFE0EB7FF8933AC7F801FFE09326C3FE075B4A01C1B6C9FC04C05C4C6C13F8051F13C0 -4ADA07FECAFC94CCFC93CDFCA25CA25DA2147FA25DA214FFA25DA25BA25DA25BA25DA25B -A2013F13F8003FB7FC4882A294CCFCB8FCA26C010F5B5B737ECF5D>I<DC07FE14079326 -3FFF80EB0F804BB500E0133F03076EEB7F00031F02FC5B923A3FFE07FE019226FFF8005B -4A01E090387F07FE4A0180EB3F8F4A90C7EA1FDF4A4815FF4A486E5B4A5A4A48804A5A49 -60494980495B5B92C85C5B494881017F5E4A5F13FFA248495D62485BA2485F4A5F5AA260 -484994C7FCA3485F4A5EA348177F91C95BA318FF48485FA35F495FA35F61A3495D61127F -5F5F61003F5E6D5D94B5FC001F4B91C8FCA26C6C5C5E00074B5B6D143F6CED7FBF6C9039 -8001FF7F6C9026C007FE5B90397FF03FFC6DB512F06DECE0FF010702805B0101495A9038 -003FF091C75A60A35E60A35E60A35E60A35E95C9FCA35E5FA2167F16FF03076D7E023FB7 -12F04A82A261A36E01F05C49736DCF54>I<49B4ED1FF8010701C049B57E4901F0010714 -E0496D4914F8496D013F8090267F87FE90397FF01FFE9026FE03FF9039FF8003FF48486C -D981FEC7FCDC83FC01031380D803F8DAC7F05B0007DBCFE05B01F0DAFFC04913C061D80F -E05D94C7481380001F5D13C04A491600003F5D0180715A4C5D4A705A007F4BEC07E00100 -94C8FC5E5C12FE5EA2007C5BC7FC93CBFCA25CA25DA2147FA25DA214FFA25DA25BA25DA2 -5BA25DA25BA25DA25BA25DA25BA292CCFCA25BA25CA2137FA25CA213FFA25CA35C6D5A6D -5A6DCDFC4A5271CF4D>I<EE0FFF93B512E0030314F8030F14FE033F8092267FFC031380 -923AFFE0007FC04A0180EB1FE04A48C7EA0FF04A4814074A4815F84A48140318074A48EC -1FFC027F153F4B147F02FF15FFA2494B13F85DA219F05B6F6D13E0F07FC0F03F006F91C7 -FC8115FC15FF16F8EEFF8017F06D15FC17FF846D826E816E81846E8114076E811400033F -801501ED001F16031600053F138083A2012081D803FC1700486C81487E487F5A485FA34D -5AB5C8FCA2494B5A5B495E6C484B5A90C9127F6D5E4D5A6C6C4A90C7FC001F4B5A01F0EC -0FFC6C6C4A5AD807FEECFFF02703FFE00F5B6C90B612806C6C4AC8FC011F14F8010714C0 -9026007FFCC9FC3E5272CF4A>I<167CED01FE4B7E4B7F5DA45D94C7FCA35D5EA3157F5E -A315FF5EA35C5EA35C5EA35C5EA3003FB812C04817E0A2B9FC18C0A26C1780C7001F90C8 -FC5C5DA3147F5DA314FF5DA35B5DA35B5DA35B5DA35B5DA35B92C9FCA35B5CA3137F5CA3 -13FF5C173FEF7F805A4A15005F5F5A4A495AA21603485E4A13075F4C5AA24C5A4A495A7E -4CC7FC16FE4B5A6C6D485A6C4A5AED1FE090397FE07FC06DB55A6D91C8FC6D13FC010313 -F09038007FC0337470F13C>I<EC0FF0EC7FFE49B5EE01F0496EED07F8496E4B7E90270F -F87FE04B7E90271FC03FF0153FD93F807F90387F001F01FE187F48486E5E153F485A4848 -18FF63485A157F001F60496115FF48485C61007F496001005CA24A5E484B5E5A5C007C4B -5CC748605EA24A5E93C891C7FCA25C4B5D62147F5D197F02FF5F5DA219FF49605DA26049 -605D1C7E4E15FF62494918FEA24E140108C013FCA31B034E15F81A80A24EEC07F07F4E14 -0F4E15E01A006D93B5131F6F4916C06DDB03FBEB803F6FD907F31580027FDA1FE1EC7F00 -6E6CD97FC15C91281FFF03FF80EBC1FE6E903BFFFE007FFFFC6E4A6D5B020102F06D5B6E -6C01C0010713C0DB0FFEC890C7FC585271CF62>I<DB0FFC4AB4FC92267FFF80010F13E0 -4AB56C4913F84A02F0017F13FE020F6E90B6FC91281FF81FFC0101031380913E3FE007FE -03FC007FC091297F8003FF07F0133F9126FE0001D98FE0EBFFE0494892389FC001494803 -FF5B49486D4A4813F049484C5A131F4A4B4913E0495A017F5E91C817C05B494C6D138000 -011B00494A6F5A4EEB01F8000396C8FC5B5E00075F5BA26C485CC95CA35E60A35E95CAFC -A35E5FA3167F5FA316FF5FA21BFC4B4C7EA24D5DA24B160363D801F85DD807FC4E5A486C -5B486C180F4862484A161F4D5DB54E5A4B167F7192C7FC494916FE4F5A49D97F7F140349 -01FE6D495A6C48023F4A5A9028C003FC1FF8EB3FE0003F49486C6CEBFFC02A1FF81FF007 -FF0390C8FC6CB5486CEBFFFE6C4A6C5C6C91C714F0C649023F13C0D91FF0DA07FEC9FC54 -5276CF54>120 D<EC1FE0ECFFFC496DEE01F001076DEE07F8496EED0FFC90271FF07FC0 -ED1FFED93FC06D153FD97F007F01FE133F49187F00016F16FC4848137FA2484818FF1BF8 -485A15FF48485F1BF05CD83F805C61007F4918E001005CA24A5E484B16C05A5C007C4B5C -C748188093C8FCA24A5E4B1700A2147F4B5D6214FF5D197F49605DA219FF49605DA26049 -605DA26062495BA26062A36062A3606D4C90C7FCA26095B5FC6D6D495BA26D15076F5B6D -6D495B6E6C137F913A3FFE03FF7F6EB5EAFEFF02074A5B6E14F0020014C092380FFE0192 -C75CA34D5BA34D5B130801FF4B5B487F00076D4A90C8FC487F4D5A485F177F6048494A5A -605E4A495B91C7485B4993C9FC01F84A5AD81FC04A5A4C5A6D4A5A6C6C49485A6C6C0107 -13806D011F90CAFC3A03FF80FFFC6C90B55A6C6C14E06D1480010F01FCCBFC010113C04F -7571CF58>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fg cmr10 10.95 51 -/Fg 51 122 df<942603FFF0ED7FE0057FD9FF80903807FFFC0407B600E0013F13FF041F -03F890B612C093B76C4815E003039127003FFF079038E07FF04B01F00103018F9038003F -F8031F01809027007FDFFC137F4B48C8B548EBFFFCDBFFF84A4A5A4A494A4A4813FE4A01 -C04A14C04A4917804A90C85A4A4818005D023F604A487313FC7713F84A486F49EC7FF0F6 -3FE049496FEE1FC07393C7FC735B4949167FB3A8BF12C0A7D8000301E0C9D87FFCC9FCB3 -B3B3A7496D4C7E87013F01FE030714E0B8D8801FB8FCA602C1EFF83F6F807CFF6A>11 -D<943801FFF0057F13FF0403B612C0041F15F0047F15FC4BB538003FFE030701F0EB03FF -031F018001007F4B48C8EA3FC0DB7FF86F7E4A48484B7E4A01C015FF4A494A7F4A90C85A -4A485D874A485D4A5AA24A5AA2495B735BA249496F5B735B735B083FC8FC97C9FCB3A2F2 -01FCF13FFFBCFCA7D8000301E0C8120F19031900A21A7FB3B3B3A3496D4C7EA2013F01FE -0307EBFFC0B8D8801FB712F0A602C1EFF83F5C807CFF65>I<943803FFFC057FEBFFE004 -07B6EAF81C041FEDFFFC93B8FC0303EC000F4B01F01300031F01805B4B48C75ADBFFF85C -4A5B4A13C04A5B4A90C85A4A48815D143F4A5A854A4881854949167FA3495BB3A8BCFCA7 -D8000301E0C9127FB3B3B3A7496D4C7EA2013F01FE0307EBFFC0B8D8801FB712F0A602C1 -EFF83F5C807CFF65>I<D803F8157FD807FEEDFFC0D81FFF02037F486D497F6E81486D49 -7F6E81B55CA26E81A46C6D6D1480A26C81A26C812607FE7C010013CFD803FCED7F8FC7ED -000FA502FC151FA24A1600A301015E4A153EA30103167E4A157C010716FC4A5D010F1501 -A249484A5AA249C8485A013E5E017E150F494B5A48484BC7FCA24848157E48485D48484A -5A48484A5A90C85B001E5E000C6F5A39377AFD5B>34 D[<EE01C0EE03E0160FEE1FC0EE -3F80EE7F0016FE4B5A4B5A4B5A150F4B5A4B5A4B5AA24BC7FC4A5A14034A5A5D140F4A5A -A24A5A4A5AA24A5AA24990C8FC5B5C1307A2495AA2495AA2133F5CA2137F5C13FFA25C5A -A25C5AA34890C9FCA4485AA4121F5BA3123FA45BA2127FA85B12FFB3A8127F7FA8123FA2 -7FA4121FA37F120FA46C7EA46C7FA37E80A27E80A2137F80133FA280131FA26D7EA26D7E -A21303807F6D7FA26E7EA26E7E6E7EA26E7E1407816E7E14016E7E6F7EA26F7E6F7E6F7E -15076F7E6F7E6F7E167FEE3F80EE1FC0EE0FE01603EE01C0>43 182 -111 263 71 40 D[<127012F812FE127F6C7E6C7E6C7E6C7E6C7E6C7E7F6C7E6D7E6D7E -A26D7E6D7E806D7E1303806D7EA26D7F6E7EA26E7EA26E7E81140F81A26E7EA26E7EA282 -80A2828082A2157F82A2153F82A36F7EA46F7EA48281A31780A481A217C0A88117E0B3A8 -17C05DA81780A25DA41700A35D5EA44B5AA44B5AA35E157FA25E15FFA25E5C5EA25C93C7 -FCA24A5AA24A5AA25D141F5D4A5AA24A5AA24A5A4990C8FCA2495A5C1307495A5C495A49 -5AA2495A49C9FC485A5B485A485A485A485A485A48CAFC12FE12F81270>43 -182 118 263 71 I<EA03F8EA07FEEA1FFF48138014C04813E014F0B5FCA214F8A46C13 -FCA27EA27E3807FE7CEA03FCC7FCA514FCA214F8A3130114F0A3130314E0130714C0130F -A2EB1F80A2EB3F00133E137E5B485AA2485A485A485A485A90C7FC121E120C1637719333 ->44 D<B9FCAC300C7EAC3D>I<EA01F8EA07FE487E4813804813C04813E0A2B512F0A66C -13E0A26C13C06C13806C13006C5AEA01F81414719333>I[<1AF0F101F8F103FCA21907A2 -1AF8190FA21AF0191FA21AE0193FA21AC0197FA2F1FF80A21A0060A2611803A2611807A2 -61180FA24E5AA261183FA261187FA26118FFA24D90C7FCA2601703A2601707A260170FA2 -60171FA24D5AA260177FA26017FFA295C8FC5EA25F1603A24C5AA25F160FA25F161FA25F -163FA25F167FA24C5AA294C9FC5DA25E1503A25E1507A24B5AA25E151FA25E153FA25E15 -7FA25E15FFA24A90CAFCA25D1403A25D1407A25D140FA25D141FA24A5AA25D147FA25D14 -FFA292CBFC5BA25C1303A2495AA25C130FA25C131FA25C133FA2495AA25C13FFA291CCFC -5AA25B1203A25B1207A2485AA25B121FA25B123FA25B127FA25B12FFA290CDFCA2127E12 -3C>70 181 118 263 91 I<16F04B7E15031507151F153F15FF1403141F91B5FC130F00 -07B6FCB7FCA214FD14E1140113F0EAF800C7FCB3B3B3B3B3A24A7F4A7F027FEBFFE0007F -B912F0A6EDE07F3C796FF85B>49 D<92381FFF804AB512FC0207ECFF80023F15E04A15F8 -49B712FE4982010FD9C01F14C090271FFE000180D93FF86D6C7FD97FE0021F7FD9FF8002 -077F4890C86C7F496F7F48486F1480484818C04982000F7113E0484818F04982003F19F8 -49821AFCEA7FF801FE826D6C17FE80B5FC6E816E17FFA86C5B6C5BA26C5BD807FEC9FCD8 -01F818FECBFC60A21AFCA2601AF8A24E13F0A24E13E0A24E13C01A8095B5FC1A004D5B61 -4D5B4D5BA24D5B4D5B614D90C7FC4D5A4D5A604C5B4C13C04C5B4C90C8FC5F4C5A4C5A4C -5A4C5A4B13804B90C9FC4B5A5E4B5A4B5A4B5A4B5A4B48153F4A90C9FC4A5A4A48167E5D -4A5A4A5A4A5A4A5A4ACA12FE494817FCEB03F8495A4A1601495A495A49CAEA03F8017E17 -1F90BAFC5A5A5A5A1AF05A5A5ABBFCA31AE0A3487977F85B>I<923803FFF0033FEBFF80 -4AB612F0020F15FC4A15FF027F16C0494848C66C13F04901E0010F7F4990C700037FD90F -FC6E7FD91FF06E6C7ED93FC08349486F7F91C96C7F01FE84485AD9FFE06F7F487F6E836E -81487F6E83A48192C8FCA37E5C6C495F6C5B6D485DEB1FE090CA5CA24E5BA2626062A24E -5B97C7FC4E5A614D5B4D5B4D5B4D5B4D5BDD7FFEC8FC933803FFFC4BB512F092B612C04A -92C9FC8418F06E15FE92C76C6C7E051F7F050713F005017F7113FE727E727F727F86727F -86727F868486A2721480A21BC0A21BE084A31BF0A2EA01FCEA07FF487F487F487F487FA2 -B57EA21BE0A3601BC05CA26C4918804A5D4A18006C90C9FC01FC4C5BEA1FE04E5B6C6C60 -6C6C4C5B6D606C6C4C5B6C6C6C4B5B6C01E092B5C7FCD97FF84A5BD93FFE02075B90260F -FFC0011F5B6D01FE017F13E0010190B75A6D6C93C8FC021F15FC020715F0DA007F91C9FC -030313F04C7D79F85B>I<EA01F8EA07FE487E4813804813C04813E0A2B512F0A66C13E0 -A26C13C06C13806C13006C5AEA01F8C8FCB3B3A2EA01F8EA07FE487E4813804813C04813 -E0A2B512F0A66C13E0A26C13C06C13806C13006C5AEA01F8144E71CD33>58 -D<EA01F8EA07FE487E4813804813C04813E0A2B512F0A66C13E0A26C13C06C13806C1300 -6C5AEA01F8C8FCB3B3A2EA03F8EA07FEEA1FFF48138014C05A14E0B5FC14F0A414F87EA2 -7EA27EEA07FEEA03FCC7FCA6130114F0A4130314E0A2130714C0A2130F1480131F14005B -133E137E5BA2485A485AA2485A485A485A90C7FC121E120C157171CD33>I<003FC012FE -488BC21280A46C20006C67D5FCB3AA003FC012FE488BC21280A46C20006C67792C76C28E ->61 D[<F13F804F7EA34F7EA34E7FA34E7FA34E7FA34E7FA34E7FA34E80A24E80A28506 -FF80A24E7E05018118FC8505038118F8850507814E7EA2050F814E7EA2051F814E7EA205 -3F824E7EA2057F8295C77EA24D824D80A20401834D80A20403834D80A20407834D80A204 -0F834D80A2041F834D80A2043F844D80A2047F8494C97E4C84A24C82030185A24C820303 -85A24C824BBA7EA34B85A34B8504C0C91201A2033F864C82A2037F8693CB7EA24B864B84 -A20201874B84A20203874B84A20207874B84A2020F874B84A2021F8788143F027F88884A -6C8701037F496D4E80013F01FF0607800003B600E0053F14FEB8047FB812E0A6020F1B83 ->123 130 122 257 136 65 D<BC7E1BFCF3FF801CF01CFC1CFF1DC0D8000702F0C8001F -14F001004A030014FC6E49041F7F6E06077F090114C0756C7F0A1F7F767F767F0A017F76 -7F777F777F777FA2777F777F8B89777FA2777F8C8A8CA2787FA3787FA28CA28A8CA38C8A -A38CA72180A68AA466A62100A668A36668A4686668A26668A2545BA2689BB5FC9DC7FC53 -5BA2535B535BA2535B535B535B535B9AB5FC5291C8FC525B525B0A1F5B5213E099B55A09 -035C4A061F49C9FC91B56C93B55A01076E031F14F0BE5A1D8052CAFC1CF01CC009FCCBFC -1B80797C79FB8B>68 D<BF12F0A48AA3D8000702F8C9123F01004A16006E49171F6E1907 -1C0188777E1D3F1D1F1D0F1D07A21D03A2777EA21D00A41E7EA21E7FA28AA6F207E0F61F -80A49BC7FCA51A0FA31A1FA21A3FA21A7FF101FF1907197F93B8FCA704E0C77E19071901 -F1007F1A3FA21A1FA21A0FA31A07AA97CBFCB3A94A7F91B57E0107ECFF80BA12C0A61503 -697B7AFA77>70 D<B60083B512FE92B6FCA6D80003ED8000D9007F01FCC7FC6E5B6E5BB3 -B3B3B3B3AE4A7F4A7F0103B67EB912FEA61583377C7BFB42>73 D<B60003B612C092B7FC -A6D800070380CCFC010002F8CDFC6E5B6E5BB3B3B3ACF503F0A41D071EE0A71D0FA21EC0 -A21D1FA41D3FA31D7F1E801DFFA26464A26464646452130051B5FC631B0F4A187F91B56C -0303B6FC01076E157FBFFCA265A5647C7AFB72>76 D<922607FFC0EC01C0037F01FEEC03 -E00203B600C01307020F15F0023F03FC130F91B8131F4949C66C13804901E00103EBE03F -4901800100EBF07FD91FFEC8EA1FF84948923807FCFFD97FF06FB5FC4A150001FF834849 -82484982488491CAFC48488385121F4983003F84A25B007F197FA21A3FA212FF1A1FA31A -0F7FA37F1A07A27FA26C7F6EEF03C097C7FC806C7F14FC806C6D7E15E06C14FCEDFFC06C -15FC6CEDFFE017FE6CEEFFE06C17FC6DEEFF806D17E06D17F86D17FE6D836D18C06D846D -6C836E83020F83020383DA007F821507DB007F1680040716C0EE007F050715E0DD007F14 -F01807060114F8727E857313FC85857313FEA285851BFF00788512FCA286A4867EA56C1A -FEA37FF23FFC7FA26D19F81A7F7F1BF06D18FF6D19E06D4D13C06D5F6E188002E04C1300 -6E5E02FC4C5A02FF4C5A01E701C0EDFFF801C101F84A5B01C001FF020F5B496C01FC017F -5BD9001F90B7C7FC6E5E48010316F848D9007F5D030F15C04802014AC8FC0070DA000713 -E0508476FF65>83 D<001FC012E0A74802C0C76C01FCC7000F14F002F8C86C49EC007F02 -C06F49150F4A1B0349C9844988491D7F491D3F491D1FA2491D0FA2491D07A2007F1FF890 -CA1903A5007E1E01A800FE1FFC481E00A6CB1A00B3B3B3B14E7F4E7F050FB612E0037FBA -12FCA61901767B7AFA83>I<B5D8F07FB56C90271FFFFC1FB500F0020FB53887FFF091B7 -93B795B5FCA6D8001F92C9000303E0C9003FECFC00010302F0DC007F49CA000714C06D4A -7101F8050191C7FC6D4A796C5A7649725A78725A6E7363A16D5A70856E7363A270201F6E -75618870203F6E7596C8FC8870686E4F6E177EA27020FE6E4F6E5FA2701F016E4F6E5FA2 -836E4F6E4C5A1D9FA271043F6E16076F070F61A271047F6E160F6FDE7E0761A27173161F -6F4E6C61A2711E3F6F05016F94C9FC527E71666F050370157E527E711EFE6F0507705D52 -7F711D016F050F705D527F846F051F704A5A527FA272023F7014077094C76C5FA2724A70 -140F70047E6E5FA27273141F704C6E5FA2721C3F7003017192CAFC518072647003037213 -7E5180721CFE700307725B5181721B0170030F06E05B5181198070031F72485A5181A2DF -C03FF0F8077192C96C5DA27348F0FC0F71027E705DA207F0F1FE1F714A705DA207F81A3F -7101F907FF90CBFC508207FD627101FF1AFE5082A271645083A271645083A271645083A3 -7290CB6C5BA37248725BA37248725BA3060F98CCFC4F84A20607624F18007248197CB480 -7DFBBB>87 D[<B612E0A890C8FCB3B3B3B3B3B3B3B3B3A390B512E0A8>27 -181 108 263 51 91 D[<B612E0A8C7121FB3B3B3B3B3B3B3B3B3A3B6FCA8>27 -181 125 263 51 93 D<92B5FC021F14F091B612FE01036F7E010F16E049D9C00713F8D9 -7FF8C77FD9FFC0EC3FFE6E6E6C7E486D6E7F486D6E7F6E8048707F6E6E7F85187F85A272 -7E6C5BA26C496F7F6C5B6D5AEB1F8090CAFCA84CB6FC93B7FC150F157F0203B8FC021FEC -E01F027FEBFC0049B512E0010791C7FC4913F84913E0017F5B90B5C8FC485B4813F85A5C -485B485BA2485BA24890C9ED0FC0A3B5FC5BA260A4607F6C94B5FCA26E5C6CDC03F79038 -C01F806E15E36C16076C6DDA1FC39038E03F006C6DDA3F816D5A6C01FCDAFF01EBFFFE6C -01FF902603FE005C6C6C9026E01FFC6D5B6D90B500F06D5B010F4B6D5B01030380010713 -80D9007F49C7D801FCC7FC020301E091C9FC525379D05B>97 D<EC0FE048B5FCB6FCA7C6 -7E131F1307A27FB3AF943803FFC0053F13FC4CB67E040715E0041F15F893267FFC0113FE -933AFFC0003FFF03E190C7000F13C0DBE3FC02037FDBE7F002007FDBEFE06F7EDBFFC06F -7E93C96C7E874B707F4B707F5D747F4B8486888688A2881B7F88A31D80A287A31DC0AE1D -80A263A21D00A3641BFFA264A2505BA2505B6F60626F60505B6F95C7FC6F4C5A505ADBDF -804B5ADB8FC04B5ADB07F04A5B6F6C02075B9126FE01FE021F5B6F6C6CD97FFEC8FC4A90 -3A7FF807FFFC4A6DB612F0040F15C04A010392C9FC90C914F8050F90CAFC5A807CFD65> -I<EE7FFF030FB512FC033FECFF804AB712E0020716F84A82023FD9E0007F4A90C7EA07FF -DAFFFC4A13804901F04A13C049495C495B49494A13E04990C8FC495A495A13FF485BA248 -496F13C0487113804A6F130048715A725A484992C8FCA3485BA35AA391CCFCA2B5FCAE7E -80A47E80A27E1AF06C6DEE01F8A26C6D16031AF06C7F19076C6D17E06C180F6D6C17C06E -161F6D6DED3F806D6DED7F006D6D15FE6D6D14016D01FC4A5A6D6DEC0FF89027007FFFC0 -EB3FF06E9039F803FFE0020F90B612806E93C7FC020115FC6E6C14F0030F14809226007F -F8C8FC45537AD051>I<F207F096B5FC187FA7F0003F190F1903A285B3AFEE3FFC0307B5 -12C0033F14F092B612FC020315FF020FD9F80713C14A903980007FE1DA7FFEC7EA1FF1DA -FFF8EC07F94901E0EC01FD49496EB5FC4949814990C97E494882494882137F4948824884 -5C5A485BA2485BA25AA25C5AA35AA291CAFCA2B5FCAE7EA380A27EA37E807EA27E807E6E -5E7E6C6D5E616D6C5E6D7E011F4D7F6D6C93B5FC6D6D4A14FE6D6DDA07FB6D7E6D01F0DA -0FF3ECFFC06D01FCEC3FE3DA3FFF903801FF836ED9E00F1303020790B512FC020115F86E -6C14E0030F0200EDE000030001F002F8C8FC5A807AFD65>I<923801FFF0031F13FF037F -14E00203B612F84A15FE021F9038C07FFF91277FFE000F13C0DAFFF801037F4901E00100 -7F49496E7E49496E7E4990C86C7E495A49486F7E017F701380495A4A6F13C05A484917E0 -844819F05C48831AF85A5C5AA2197F4819FC91CAFCA4BBFCA41AF891CCFCA97EA280A37E -A36C7FA26C19786E17FCA26C18016C6D17F8A26C6D16036C19F06E16076D6CEE0FE0013F -18C06D6C161F6D6DED3F806D01E0ED7F006D6D15FE6D01FCEC03FC6D01FFEC0FF86E01C0 -EB3FF0021F9039FC01FFE06E90B65A020393C7FC020015FC033F14F0030714C09226003F -FCC8FC46537BD051>I<933803FF80043F13F093B512FC030380030FECFF80033F010113 -C092267FF80013E04B485A4AD9C00313F04A495A4A494813F84A5A141F5D4A5A147F5D02 -FF6E13F07113E049496D13C0711380F07F0095C7FC495BB3A9B9FCA7D8000301E0C9FCB3 -B3B3A7497F81013F13FFB812F8A614C13D807BFF38>I<F20FF8F27FFE922607FF800103 -B5FC037F01F8010F14800203B65B020F923AC03FF87FC0023F923AF0FFC0FFE04A9238F9 -FE019126FFFE01EBFFFC499026F0003F13F0010701C0010F13E049496D13C04990C76C6D -6C13C04A6EED7F8049486E6DEB3F0049486F6C131E01FF7190C7FCA248496F7EA24884A2 -4A81A24885AA6C96C8FCA26E5DA26C60A26C6D4B5AA2017F5F6D6C4B5A6D6C4A5B6E5C6D -6D495B6D6D495B4901F0D93FFEC9FC499039FE01FFFC92B65AD93F3F5D020F15C0D97E03 -92CAFCDA007F13F80307138001FE90CDFCA67FA280A28014F0EB7FFC91B712F0F0FFC06D -17FCF1FF806D18E06D846D18FC6D846D84010785011F85017F85D9FFFCC8001F804801E0 -030080480180161F4890CA00037F484817004848187F4848727E1A1F485A747EA2485A86 -A66D60007F62A26D181F6C6C4E5A001F626D187F6C6C4E5A6C01C004035B6C6D4C5B6C01 -F8041F5B6C01FE047F90C7FC6D6C6C4A485A011F01F8021F13F801079026FF8001B512E0 -6D91B75A010095C8FC021F16F8020316C0DA007F4AC9FC0301148053787BD15B>I<EC0F -E048B5FCB6FCA7C67E131F1307A27FB3AF943801FFF0050F13FF057F14E04CB67E4C15FC -040F01017F933A1FF0003FFFDC3FC0010F7F4CC78004FE80DBE1F86E7FDBE3F082EDE7E0 -4C8003EF83EDFF8093C8FC854B83A25DA35DA45DB3B3A7496D4B7FA2013F01FF030FEBFF -C0B8D8C03FB712F0A602E1EFF87F5C7E7BFD65>I<EB01F8EB07FE497E497F497F497FA2 -90B57EA66D5BA26D5B6D5B6D90C7FC6D5AEB01F890C9FCB3A5EC0FE048B5FC127FA7C67E -130F7FA27FB3B3B3A35B81013F13FCB8FCA614C3287B7BFA32>I<163FEEFFC04B13E04B -13F04B13F84B13FCA24B13FEA66F13FCA26F13F86F13F06F13E06F13C0EE3F0093C7FCB3 -A517FEED3FFF021FB5FCA7EC000F150181167FA2163FB3B3B3B3A7EA07F8487E486C15FC -486C147F487FB57E17F8A2EEFFF0A217E05D028014C06C4A1380020014006C48495A6C48 -495A6C48495A6CB46CB45A6C90B55A6C5D6C6C91C7FC011F13F8010113C02FA089FA38> -I<EC0FE048B5FCB6FCA7C67E131F1307A27FB3B1953A7FFFFC3FF097B5FCA6060FECFE00 -7214C07291C7FC1AF81AE06297C8FC4E5AF00FF84E5A4E5A4E5A4E5A4D90C9FCEF03FC4D -5AEF1FF04D5A4D5A4D5A4C48CAFC16031607EE1FFF4C7F5E93B57E03E18003E380EDEFFB -DBFFF37F04E17F16C04C6C7EDBFE007F4B6D7F4B7F4B814B6D7F83717F85717F8385727E -84727F8684727F86727F84727F86737EA2737F8787496D834F13FC013F01FE92B61280B8 -D8800F15FFA602C1EFFE1F587E7CFD60>I<EC0FE048B5FCB6FCA7C67E131F1307A27FB3 -B3B3B3B3AD497FA2013F13FEB81280A614C1297E7BFD32>I<DA0FE0DAFFF8EE1FFF48B5 -020FD9FF804AB512F0B6023F02E0020714FC94B600F8021F14FF040303FE027F15C0040F -01006D902701FFE01F7FDC1FF8011F6D48D900037FDC3FC06D9026C007F86D7F4CC76C90 -26E00FE06D7FC603FE6E4A48147F011FD9E1F86E6D48C86C7E0107D9E3F0DCF87E82DBE7 -E05F4C6E4A816D01EF05FD84DBFF80EEFFF093C95C74834B4E83A24B60A34B95C9FCA44B -5FB3B3A7496D93B54C7FA2013F01FF030702E092B512FCB8D8C01FB7D8F803B8FCA602E1 -DDFC3F178790507BCF99>I<DA0FE0903801FFF048B5020F13FFB6027F14E04CB67E4C15 -FC040F01017F933A1FF0003FFFDC3FC0010F7F4CC780C66C02FE80011FD9E1F86E7F0107 -D9E3F082EDE7E06D4A8003EF83EDFF8093C8FC854B83A25DA35DA45DB3B3A7496D4B7FA2 -013F01FF030FEBFFC0B8D8C03FB712F0A602E1EFF87F5C507BCF65>I<EE3FFC0307B512 -E0031F14F892B7FC020316C0020FD9E00713F04A90C77FDA7FFCEC3FFEDAFFF0EC0FFF49 -01C002037F49496E7F4990C97F4948707E4948707E4948707E017F844948707EA2484970 -1380481AC04A82481AE0A248497013F0A2481AF8A3481AFC91CBFCA2481AFEA5B519FFAD -6C1AFEA46C6D4C13FCA46C1AF8A26C6D4C13F0A26C1AE06E5E6C1AC06E5E6C1A806C6D4C -1300017F606E163F6D6C4C5A6D6C4C5A6D6D4A5B6D6D4A5B6D01F0020F5B6D6D4A5B6D6C -B4DAFFFEC7FC6ED9E0075B020F90B612F0020316C0020093C8FC033F14FC030714E09226 -003FFCC9FC50537BD05B>I<DA0FE0903801FFE048B5023F13FEB691B612C0040715F004 -1F15FC4C819326FFFC016D7E03E19026C0003F7F03E390C7000F7FC66CD9E7FC6E7F011F -D9EFF06E7F0107D9FFE002007F04806F7E6D91C97F4B707F4B707F884B824B707F888688 -A2747FA28688A3751380A57513C0AE511380A41D0098B5FCA264A262646264A2505B646F -5E6F4C5B646F4C90C7FC6F4C5A505A705E7002035BDBF7F04A5BDBF3F84A5BDBF1FE023F -5B9226F0FF80D9FFFEC8FC93267FF8075B70B612F0040F15C0040392C9FC040014F8050F -90CAFC94CCFCB3A5497FA2013F13FFB812C0A614E15A737CCF65>I<DC7FF8EC01F00307 -B51403033F14E04AB612F84A6F1307020F15FF023FD9F807EB800F4AD9C00013C091B5C7 -383FE01F010301FCEC0FF04949EC07F84901E0913801FC3F494914004949EDFE7F197F49 -90C9EA3FFF495A48498285485B5A4A825A4A825AA2485B85A25C5AA4B5CAFCAE6C7FA57E -80A27E807E616C7F616C7F616C7F6C606E5E137F6D6C5E6D6D92B5FC6D6D5C6D6DEC03FB -6D6DEC07F36D6DEC1FE36D01FEEC7FC3913B3FFF8001FF836E9039E01FFE03020790B512 -FC020115F06E6C14C0030F1400030013F093C8FCB3A54F7FA2073F13FF95B812C0A61AE1 -5A737ACF60>I<DA0FC0EB3FE048B5903801FFFCB6010713FF041F14804C14E0DC7FE013 -F0EEFF019226C1FC0313F8EDC3F8C66C9026C7F00713FC011F14E00107EBCFC016806D13 -DF160003FF6D13F85D7113F04B6D13E0F03F8095C7FC5DA45DA55DB3B3A4497F81013F13 -FFB812F0A614C13E507CCF47>I<912607FFF0131C027F01FF133E0103B6EAC07E010FED -F1FE903A3FFE003FFBD97FE0EB03FF2601FF8013004848C8123FD807F8151F000F160F49 -150748481503123F1701485A1700A312FF187E7FA27FA27F6D163C01FF93C7FC6C13C014 -F014FE6CEBFFF0EDFF806C15FC6CEDFF8017F06C826C16FE6C826C17C0013F826D820107 -820101826D7E020781DA003F801501DB000F14801601706C13C0830078160F00FC7013E0 -83837E83A36C177FA37F19C07FA26D16FF19807F4D13007F6D4B5A6D5E6D15076EEC1FF8 -02E04A5AD9CFF849B45A902787FF801F1380010390B6C7FC48C615FC486D14F048010F14 -800070010101F8C8FC3B537AD048>I<EC01F8A81403A61407A3140FA3141FA3143FA214 -7F14FFA25B5B5B5B5B137F48B812FC120FB9FCA5D8000101F8C9FCB3B3A2F01F80B0183F -6D6D1500A3606E6C147EA2023F5D816E6D485A6E14039338E007F06E9038F81FE06E90B5 -5A02005D6F91C7FC031F5B030713F89238007FE039727DEF47>I<DA07F0EE01FC48B5EE -7FFFB6033FB5FCA7C66CEE001F011F170701071701A26D83B3B3A761A461A3617FA2616F -5D6D187F073F7F027F167E6F037C6D7E023FDB01FC14E06E6CDA03F8ECFFF06E6CEC07F0 -6E01C0EB3FE06E9039FC01FFC06E90B612006E6C5C031F14F8030702E0EDF800DB003F90 -C790C8FC5C527BCF65>I<B5260FFFFE913A3FFF8FFF8091B594B5FCA6D8003F02800207 -ECF000010F01FCC8000191C7FC6D499238007FFC6D61745A6D616F5F7F6F5FA2027F95C8 -FC6F5E6E177E821AFE6E5F7014016E5FA27014036E5F7014076E5FA270140F6E5F70141F -A26E5F70143F037F93C9FC82616F157E7113FE6F5DA2EFC0016F5DEFE0036F5DA2EFF007 -6F5DEFF80F6F5DA2EFFC1F6F5DEFFE3FA2047F91CAFC715A70137E18FEA2705BA2705BA3 -705BA2705BA3705BA2705BA371CBFC173E59507DCD60>I<2BFFFE1FFFFC0FFFC7B5903A -0FFFF8FFF090B692B692B5FCA6C66C91C7000F02800100ECFE00011F01F8020349C8001F -13F06D496E496F13C06D70496F5B7890C7FC6D057F5F7415016F636D053F5F741503816D -716C5E616F1A07027F725D4F160F6E6C63877091B5151F6E64877049173F6E04F994C8FC -877001035F6E04F0167E8770010717FE6EDCE07F5D8770010F16016E4C6C6C5C181F70DA -801F14036E725C063F16076F6C4A6C5D1C807049160F6F027E6D5D1CC0DD80FE161F6F4A -6D5D1CE005C1173F6F4A6D92C9FC1CF005E35F6F4A6D147E1CF805F717FE6F4A6E6C5A17 -FF4EEC3FFD6FF0FFF8A26F4A6E5BA37090C86C5BA370486F5BA370486F5BA370486F90CA -FCA370486F5A7048167C7C507DCD83>I<287FFF87FFFE903A03FFFE3FFF91B593B6FCA6 -D8000F02F001001580010102C0023F01F8C7FC6D4A16C06E7090C8FC6E5F6E6D15F86E5F -705D6E6D4A5A6E6D5D6E4CC9FC705C6E6D495A6F6C5C6F4A5AEF80076F6D485A6F6D485A -616F6D485A6FEBF87F6F6D48CAFC606FEBFFFC82705B60705B82707FA2707F707F845E4C -7F854C805EDC3FCF7F05877FDC7F037F16FF4B486C7F4C6C7F4B486D7E15074B486D7F4B -486D7F4C7F4B4881037F6E7F4BC76C7F4B804A488202036F7F4A486F7E020F82021F8402 -7F707F02FF8401036D83011F4D7F48B692B6FCB700C00107EDFFE0A6D9FC7FEFFE1F5B4E -7ECD60>I<B5260FFFFE913A3FFF8FFF8091B594B5FCA6D8003F02800207ECE000010F01 -FCC8000191C7FC6D7113FC6D49705A6D725A6F5F636D6181027F95C8FC81626E177E7015 -FE6E5F8219016E5F7014036E5F8219076E5F70140F6E5F82191F6E5F70143F037F93C9FC -82616F157E7113FE6F5DEFC001A26F5DEFE0036F5DEFF007A26F5DEFF80F6F5DEFFC1FA2 -6F5DEFFE3F047F91CAFC715AA270137E18FE705BA3705BA2705BA3705BA2705BA3705BA2 -71CBFCA3177E17FE5F1601A25F16035F1607A25F160FD803F85DD80FFE141F487E486D5C -163F486D91CCFC5E167E16FE4B5A5EEC80036C4A5A4A485A49131F6C48495A01F0495A00 -0F4948CDFC3907FC07FE6CB55A6C14F06C5C013F90CEFCEB07F859737DCD60>I -E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fh cmbx10 10.95 47 -/Fh 47 122 df[<EF1F80EF3FC017FF5E4C1380040F13004C5A4C5A4C5A4C5A4B5B4B5B -5D4B5B4B90C7FC4B5A157F5E4B5A5C4A5B4A5BA24A5B5C5E5C4A90C8FC5D14FFA2495B5B -5D5B5D5BA2495BA25B5DA25B5D90B5FCA24891C9FCA35A5CA25AA25CA25AA3485BA55AA2 -5CA35AA75CA2B5FCB3A57EA280A77EA380A27EA56C7FA37EA280A27EA2807EA36C80A27F -817FA2817FA26D7FA27F817F817F6D7FA2147F816E7F8082806E7FA26E7F6E7F806F7E82 -153F6F7E6F7F6F7F816F7F6F7F707E707E707E707E040313807013C082173FEF1F80>50 -181 109 263 81 40 D[<127EB4FC13C07F6C7EEA3FFC6C7E6C7E6C7F6C7F6C7F6C7F80 -6D7E6D7E6D7E817F6D7F816D7F6D7FA26D7F81147F816E7F8082A26E7F8280828082A26E -7FA28280A2838183A26F7FA38381A283A281A283A36F7FA583A281A31880A781A218C0B3 -A51880A25DA71800A35DA25FA54B5BA35FA25DA25FA25D5FA34B5BA25F92B5FC94C7FCA2 -5C5EA24A5BA25E5C5E5C5E4A5BA25E5C4A90C8FC5D14FF5D495BA2495B495B5D495B5B92 -C9FC495A495A495A5C485B485B485B4890CAFC485A485AEA7FF0485A5B90CBFC127E>50 -181 117 263 81 I[<EE0FC0EE3FF04C7E4C7E4B7FA24B7FA2815FA56F5B01C0180CD807 -F8F07F80486CF0FFC0486C4D13E0486C4D13F04801C06D48010F13F86E5E6E5EB500FC93 -B512FC6E5D6E5D9239C03FF00F6C02E04A14F803F05C6C02FC91B612F06C02FE01F115E0 -6C02FF01F315C00001DB9FE7ECFE00D8003F91B712F001071880010005FCC7FC021F16E0 -02071680020003FCC8FC031F14E0030391C9FC031F14E092B612FC0207EDFF80021F16E0 -91B812FC0107EFFF80013F18F048B6D89FE714FE000F4B6CECFFC04802FE01F115E04802 -FC01F015F04802F0023F14F803E080B600C06E14FC9239007FF8034A814A816C01F0043F -13F84A824A826C90C7486C010313F06C487113E06C487113C06C48F07F80D800C0F00C00 -90C893C7FC4B7FA5835DA26F5BA26F5B705A705AEE0FC0>78 81 -115 263 105 I<1A1F507E507E507EB3B3B3A7001FC212FE488D482280C412C0A56C2280 -6C22006C69CD01E0CDFCB3B3B3A7745A745A74CEFC8A8B74F2A3>I<EB3FC0EBFFF80003 -7F4813FF4814804814C05A15E04814F0A2B612F8A315FCA415FEA27EA27EA27E7E7E7EC6 -13F9EB3FE1EB000315FCA4140715F8A2140FA215F0141FA2EC3FE0A2EC7FC0A2ECFF805B -15005B495A495A131F5C495AEBFFE05A485B485B91C7FC6C5A5B6C5AEA00E01F40729C3A ->I<B912FEB337137EB146>I<EB1FC0EBFFF8000313FE487F4814804814C04814E0A24814 -F0A3B612F8A76C14F0A36C14E0A26C14C06C14806C14006C5BC613F8EB1FC01D1D729C3A ->I[<1BF8F201FCF203FE1BFF62A262A2F21FFEA21BFC1A3FA2F27FF8A21BF01AFFA24F13 -E0A21BC061A24F1380A24F1300A262191FA24F5AA262197FA24F5AA26260A24E5BA26260 -A24E90C7FCA261181FA24E5AA261187FA24E5AA24D5BA2615FA24D5BA296C8FC5FA24D5A -A260173FA24D5AA26017FFA24C5BA2605EA24C5BA295C9FC5EA24C5AA24C5AA25F167FA2 -4C5AA25F5DA24B5BA25F5DA24B90CAFCA25E151FA24B5AA25E157FA24B5AA25E5CA24A5B -A25E5CA24A90CBFCA24A5AA25D143FA24A5AA25D14FFA2495BA25D5BA2495BA292CCFC5B -A2495AA25C133FA2495AA25C13FFA2485BA2485BA25C5AA24890CDFCA25B121FA2485AA2 -5B127FA2485AA25BA25B127F6C5A6CCEFC>80 181 116 263 105 -I<EB1FC0EBFFF8000313FE487F4814804814C04814E0A24814F0A3B612F8A76C14F0A36C -14E0A26C14C06C14806C14006C5BC613F8EB1FC090C8FCB3A5EB1FC0EBFFF8000313FE48 -7F4814804814C04814E0A24814F0A3B612F8A76C14F0A36C14E0A26C14C06C14806C1400 -6C5BC613F8EB1FC01D5172D03A>58 D<EB1FC0EBFFF8000313FE487F4814804814C04814 -E0A24814F0A3B612F8A76C14F0A36C14E0A26C14C06C14806C14006C5BC613F8EB1FC090 -C8FCB3A5EB3FC0EBFFF0000313FC487F487F4814804814C0A24814E0A2B612F0A215F8A4 -15FCA37EA27EA27E7E7E7EC613FBEB3FE3EB000715F8A4140FA215F0A2141F15E0143FA2 -15C0147F158014FF491300A2495A13075C130F495A495A137F495A485B485B4890C7FCA2 -6C5A5BEA01F06C5A1E7472D03A>I<001FC212FE488D482280C412C0A56C22806C220000 -0F69D7FCB3AD000FC212FE003F8D482280C412C0A56C22806C22006C698A3574C7A3>61 -D<BEFC1DFCF5FFC01EF81EFF1FC01FF01FFC8B797EC7000F02F8C9001F810A03810A0081 -778077807780897780898D898D898DA38A8DAA9BB65AA3696569659EC7FC6568535C535C -535C535C9AB65A0A035D0A0F4AC8FC0A3F14F80903B65A94BB128054C9FC1EF09BCAFC1E -F8F6FF801FE01FFC05F8C9000714FF0A0015C00B3F800B0F14F877807780778077818D78 -807880A278808DA27880A38DA28A2280AB541500A4545CA3545CA2545C9BB6FC69535D65 -0B0F5D535D0B7F92C7FC52B65A0A1F5DC15A6820C09DC8FC1FFC1FF01FC054C9FC1EE00B -F8CAFC817D79FC95>66 D<0703B517F84EB600FCED01FC063FDBFF8014030503B800F014 -07051F05FC140F94BA141F040307C0137F040F07F013FF043FF1FC0193BB6C5A03039326 -FC001FEBFF87030F4BC814CF4B03E0033F90B5FC037F92C9120792B600FC1601020303F0 -824A03C0173F4A92CB7E4A4A844A02F8844A4A8491B64884494B84494B854992CD7E4C86 -495C494A8649895E49895E90B64886A2488A5E5A93CF127F5AA2481F3F5DA25AA24B1C1F -5AA3F80FF8489CC7FCA35DA3B6FCB17EA381A37EA2F807F8F80FFC7E81A27EA2816C1F1F -21F87E826C1F3F826C20F0207F6D80701CE06D1EFF705013C07F6D6E5013806D6E62701C -006D6F616D6F4F5A6D6F4F5A6E6E4F5A6E6E19FF6E02FE4E5B6E6E06075B6E03C04D5B6E -03F0053F5B020003FC4D90C7FC6FDAFF804B485A031F03F0030F5B6F03FF037F13F00303 -04FC010FB55A030093B85A043F97C8FC040F19FC040319F0040019C0051F95C9FC050317 -F8DD003F16C006014BCAFCDE000314807E8174FE97>I<BD12F8F4FFF01DFF1EF01EFCF6 -FF801FE01FF81FFE797EC7001F02F8C8000782E1001F15F00A0381E2007F800B1F14FF0B -07810B018177810C3F80788078808A788078807881A279807980A27980A27980A27980A2 -8E8BA28EA223808BA323C0A47915E0A723F0B123E0A75515C0A42380A3551500A36A676A -A2555CA2555CA2555CA2555C9CB65A669FC7FC545C545C545C0C3F5C545C53B65A535D0B -0F92C8FC0B7F5C52B65A0A1F15F00907B75AC112809DC9FC1FFC1FF01F8054CAFC1EF01E -800BF0CBFC0AFCCCFC8C7D78FCA0>I<C1FCA58CA5C7001F02FCC9FC1C03F4007F1D0F77 -801D01898A8A8A8A8AA2787FA28AA28AA31F7FA28CA2E17FE0143FA7797EA21BFFA29CC8 -FCA262A2626262621A7F0707B5FC94B8FCAA9438FC0007F1007F1A1F86868686A274EFFF -C0A35513801B7FA5672100A398C9FC67A2681F0FA31F1FA2681F3FA21F7FA21FFF666866 -6666661E7F9BB55A1D031D0F1D7F0A03B6FC99B7FCC15AA768A37A7C78FB89>I<C012F8 -A48BA6C7000F4AC81203E1000F801C01767E1D1F1D07898989787E8AA28A8AA28A2080A2 -8AA38AA320C08AF37FE0A5F77FE0A409FF92C7FCA462A2626262621A7F0707B5FC94B8FC -AA9438FE0007F1007F1A1F86868686A286A41B7FA998CBFCB3A8BB12FEA9EDFC07737C79 -FB84>I<B800FC067FB50007B512E07198B6FC8384848484A28484C7001F6F94C7001F01 -C0C7FC72070790C8FC85A2858585858515FD03FC81708070817081868270817081708170 -818683718171817181877181837181718172808872818472817281728188728184738073 -81738189857381738173817381898674817481748174818A867481748175807515801FC0 -877515E07515F07515F87515FC1FFE877614FF7615877615C77615E720F7887692B5FC88 -8889A289898989A28989898A8AA28A8A8A8A8AA28A8B8B8B8BA28BDA7FFF87B900C0848B -8CA28C8C8C8C7A5ADAFC1F765A937D78FCA4>78 D<96387FFFE0063FB612C00503B712FC -053FEEFFC04CB912F8040718FE043FF0FFC093BB12F003031AFC4BDBF00081031F92C700 -0F6E7E4B02F802018192B600C0DA003F14F04A92C9000F804A4A7080020F02F8040114FF -4A4A70814A4A71804A4A718091B64871804992CB6C804C84494A7280494A7280498A4C84 -498B494A7380A2494A738090B6894C85488CA24892CD6C80A3484A7480A2488CA24B8648 -2180A34821C0A44B864821E0A6B61FF0B26C21E0A36F62A36C21C0A56C6E501580A36C21 -00A26F626C68A26C6F4F5CA36C6F4F5CA26C686D6E4F5CA26D6E96B65AA26D6E4E5D6D6E -4E92C7FC6D6670606D6E4E5C6D6F4D5C6D6F4D5C6E6E4D5C6E6E94B65A6E6E4C5D6E6E4C -92C8FC6E02FF040F5C6E6F4B5C020003E0037F14F06F02F84AB65A031F02FF020F15806F -03F090B7C9FC030392B812FC03001AF0043F19C0040F96CAFC040118F8DC003F17C00507 -4CCBFCDD003F15C0DE007F01E0CCFC848174FE9D>I<BD12E0F4FF801DFCF5FF801EE01E -FC1EFF8B1FE08BC7001F02F8C8000F15FC0900810A1F800A07810A018176817780898C89 -8C7780A38C892180A421C0AC2180A32100A26568A26865686568535C9AB65A0A035D5292 -C7FC0A1F5C99B65A091F5D94BB12E0679CC8FC1EFC1EF01E800BFCC9FC1DC00AE0CAFC05 -FCCFFCB3B3A8BB12C0A9EDF80F7A7D78FC8F>I<93B516F8031F02FC4A7E92B76C130302 -0704F01307021F04FC130F027F04FF131F91B9EAC03F0103F0F07F49F0F8FF49DAC00114 -FD4949C7000F90B5FC4901F0140149496E7E90B50080151F4891C91207484916014A8248 -854A8348854A83488586485B86A24885A21B7FA2B5193F80A21B1F80A280A26E180F8081 -8103F0715A6C02FC94C8FC15FF16F016FF6C16F8EFFFC018FC6CEFFFE019FE6CF0FFC01A -F06C19FC1AFF6C866C1AE0876C866D856D856D856D866D866D8601008680021F85020785 -14016E6C84150F0300841607EE007F05031780EF001F060116C0F0001F19071901857414 -E08686D87F8084486C84A286A286A36D84A31DC07FA37F1D806D60A26D1B007F6E4D5B80 -6E4D5B806E4D5B02FE5F6E6C4C5B03E04C5B03F893B55A03FF150304F0020F5CDCFFE090 -B6C7FC94B75AD9FC7F18F8D9F81F60496C60D9E003188049C66C4CC8FC49011F16F890C7 -000116E048DA001F4AC9FC007CDB007F13E05B8174FE74>83 D<000FC112F8A6488CA493 -C7001F02FCC77E03E01A0392C8F0007F02FC1C1F4A8802E01C034A884849767F91C91A7F -A2491E3FA2491E1FA2491E0FA3491E07007F8CA4498AA700FF2180498AA5CB97C8FCB3B3 -B3AE4ABD12C0A9F1F007817B78FA92>I[<B612FEAB01E0C7FCB3B3B3B3B3B3B3B3AF90B5 -12FEAB>31 181 106 263 58 91 D[<B612FEABC7120FB3B3B3B3B3B3B3B3AFB6FCAB> -31 181 124 263 58 93 D<150C151E153FEDFFC04A7F4A7F4A7F021F13FE4A7F4A8049 -B612E0498149814981013F15FF498290B500F380000302E114F048DA807F7F489026FE00 -1F7F48496D7F007F01F00103EBFF80B5486D14C06C01806D6C13806C90C86C130001FC15 -0FD81FF0ED03FE6C486F5A0180ED007C6CCA12383A1E69FD69>I<0307B512C04AB612FE -021FEDFFE091B812FC010317FF4918C0011F18F04984499026FC000714FE03E001008090 -B56C023F804871806F020780A2486E6E8072808487A2737FA36C4A6F7FA26C5C6D5B6D5B -6D5B6D90C9FCEB01F890CBFCA40607B6FC94B8FC163F0307B9FC157F0203BAFC141F027F -EDF83F49B6EAFC00010715C0011F02FCC7FC017F14E090B61280484AC8FC485C4814F048 -5C485C5D5A92C9FC5A5CA2B55AA561A28096B6FC6C5F806C5F6F5C6C6EDA0FF7806F023F -15F86C02F8DAFFE7ECFFF86C6E010301C715FC6C9126FF803F018315FE6C92B612036C6C -EEFC016D4C7E010F04E07F01030480131FD9007F4AC7000714FC020F02F0DA007F13F8DA -003F90CCFC5F547AD266>97 D<ED7F8090B6FCB7FCAAC67E131F7FB3AC953807FFF095B6 -7E050F15F0053F15FE0481B87E048717E0048F17F804BF8393B5D8F0038095C76C6D7E05 -F8020F8005E06E8005806E8094C98016FC4C707F4C707F4C707F5E1E80871EC0A27514E0 -A31EF0A2871EF8A51EFCAF1EF8A55114F0A31EE0A25114C0A21E80631E0082704C5B704C -5BA204FE93B55A704B5C7102075C05E04A5C03FD6D023F5C03F801FE91B6C7FC9228F07F -FFC00F14FC4B6C90B75A040F17E0DBC00317804B6C4CC8FC92C76C15F84A020F15E04A02 -014AC9FC90CA001F13C0667F7AFD74>I<933807FFFE4BB612F8030F15FF037F16E04AB8 -12F8020783021F17FF027F188091BA12C049ED8003499126F8000114E0010F02E016F049 -02805B4991C7FC4B4A14F8495B90B55A5A5D485C5AA2484A6E14F0A2487114E04B6E14C0 -73138048721300735AF103F04895C8FC92CCFCA4B6FCAF7E81A37EA3817EA26C6EEE03FC -F207FE6C801A0F6C6E17FC6F161F7E6C6EEE3FF86FEE7FF06D6E15FF6D02E04A13E06D6E -5C6D02FC4A13C06DDAFF80013F13806DDBF801B51200010092B65A6E5F021F17F002075F -020117806E6C4BC7FC030F15F003011580DB000701F0C8FC4F5479D25D>I<F43FC0087F -B5FC96B7FCAAF1003F1A0F86B3AC93380FFFE04BB6FC031F15E0037F15FC0203B8FC020F -17C74A17E7027F94B6FC49B6EAC00F4902FCC7FC4902F0143F4902C0140F494A14034949 -C87E49496F7E90B5488286484A82485CA25A5D5AA2485CA25AA34891CAFCA5B6FCAF7EA5 -6C80A37EA36C80A27E6F5E6C617E6F5E6C6E93B6FC6D6D15036D5F03FF4B816D6E023F15 -F86D02E091B812FC010302F813036D02FF133F6D92B612EF023F178F6EEEFE0F020716F8 -020116E0DA003F15800307ECFC00DB003F018003F8C7FC667F79FD74>I<93380FFFF04B -B67E030F15F8037F15FE4AB87E020717E0021F17F8027F8391B6C66C7F010302F8010F7F -4902E00103804902800100804991C86C7F49496F7F49498190B5486F7F4B834884484A83 -85484A83855A4B18805A851CC05AA292CAFC4885A21CE0A3B6FCA292BAFCA51CC01C8092 -CDFCA57EA3817EA37EA2816CF21F80F33FC06C6EEF7FE0A26C6E17FF1CC06C6E5E6C6E4C -13806F5E6D6D4C13006D6E5D6D6E4B5A6D02F04B5A6D02FCEC01FF6DDAFF80010F5B6D03 -F890B55A6D6C91B712C0021F606E95C7FC020317FC020017F0031F16C003074BC8FCDB00 -7F14F0040149C9FC53547AD260>I<943807FFF04CB512FE041F6E7E93B712E003038203 -0F82033F824B824AB5D8FE077F4AECF00F4A02C015804AEC001F4A5B4A494914C04A5B5E -91B5FC495CA25E49701480A3494A6D1400725B725B725B9538007FE0070FC7FC96C8FCB1 -B912FCAAD8000702C0CAFCB3B3B3A7007FB812C0A9ECF83F4A7F79FE40>I<F303FE93B5 -6C91383FFF80031F02FC91B512E04AB7D8C00314F00207DCF00F14F8021FEEFC3F027FDC -FF7F14FC49BCFC491BFE49DAF00715C34991C76CEBFE034901FC021F13FC49496E13FE49 -496E13FF90B5486E028113FCA2484A6E6E13F84886F43FE0F40F80484A6E6EC7FCA34886 -AA6C62A36C6E4A5CA36C626C6E4A5CA26D6D4A91C8FC6D6D4A5B6D6D4A5B6D01FF027F5B -6DDAF007B55A93B75A49604995C9FC02DF16FCD93FC716F0D97FC116C0DA801F02FCCAFC -0300148001FF91CDFCA35A80A380808080ECFF8092B712F8F1FFF06C19FF1BE01BF86D19 -FE757E6D86886D86886D866D866D86130F013F1B8090BDFC00031CC05A4891C9001F15E0 -4801FCEE007F02F0170748491701487314F04A8487B55A87A56E606C1CE0A26E606C6D95 -B512C06E5F6C6D4D14806C6D4D14006C6D6C041F5B6C6E4C5B6C02F84BB55A6C02FF030F -5C6D02FC0103B65A011F91B912806D97C7FC010319FCD9007F18E0021F1880020105F8C8 -FCDA001F1680DB003F02C0C9FC5F787AD269>I<ED7F8090B6FCB7FCAAC67E131F7FB3AC -F1FFFE060FEBFFF0063F14FC4DB7FC050716C04D82053F824D829426FFFE018004819026 -E0007F7F048301806D7FDC87FEC77EDC8FF883EE9FF0DCBFE0804D83EEFF8094C8FC4C81 -4C84A25EA25EA25EA45EB3B3A7B800FE90B812FEA9DAF87FEFFC3F677E78FD74>I<147F -903803FFE0010F13F8497F497F497F90B67EA24881A34881A76C5DA36C5DA26D91C7FC6D -5B6D5B6D5B010313E0D9007FC8FC91C9FCB0ED7F8090B6FCB7FCAAC67E131F7FB3B3B3A4 -B812F0A9ECF07F2C7F78FE3A>I<ED7F8090B6FCB7FCAAC67E131F7FB3AD963A3FFFFE3F -FC98B5FCA9070102C0C7FC51C8FC4F5B4F5B4F13E0073F5B4F5B96B5C9FC4E5B060713F8 -4E5B4E5B4E5B95B5CAFC4D5B4D5B4D5B051F13E04D5B4D5B94B5CBFC0481801687048F80 -049F8004BF8093B67EA285858586A2053F80DCFC1F804C6C8004F0814C7EDC8003804C6C -80868372807280728087847280728072808784738073808873808573807380887380B800 -F0017FEDFFE0A902F0F0FC1F637E7AFD6E>107 D<ED7F8090B6FCB7FCAAC67E131F7FB3 -B3B3B3B3ACB812F8A9ECF07F2D7E78FD3A>I<DB7F8091263FFF8093380FFFE0017FB502 -03B500FC93B6FCB7021F02FF030715C0067F03C0021F15F04DB700F0027F15FC05077049 -B77E051F700107824D7049834D01006E49D9C03F80DDFFF0013F9128803FFC000F800481 -01C0010F9126C07FF0010380048390C7EEFFC0D8003FDA87FC6E02E190C76C80010FDA8F -F8EFE3FE6DDA9FF06EDAE7FC804DDDF7F883DCBFC0EFFFF0DCFF806094C86C4B81A17E4C -614C96C9FCA24C60A34C60A34C60B3B3A7B9013FB8D8C00FB812F0A9DAFC3F060F18C3A4 -5279D1AF>I<03FFEDFFFE90B6020FEBFFF0B7023F14FC4DB7FC050716C04D82053F824D -829426FFFE01804C9026E0007F7F4C01806D7F4C48C77EC66CDA0FF883011F4A5A6D4A48 -804D834C5A4CC8FC4C814C84A25EA25EA25EA45EB3B3A7B800FE90B812FEA9DAF87FEFFC -3F675278D174>I<933803FFFC93B612F0030715FE033FEDFFC092B812F0020717FE4A83 -023F18C04ADA801F8049B526F8000114F84902E06D6C7F490280021F7F4949C800077F49 -496F8049496F8049496F8090B5854B824887484A707FA248874B824887A2481C80A292CA -7E481CC0A3481CE0A5B61AF0AE6C1CE0A56C6E4C14C0A36C1C80A26C1C006F5E6C63A26C -6E4C5BA26C6E93B55A6C636F5D6D6D4B5C6D6D4B5C6D6D6C021F5C6D02E0027F91C7FC6D -02F849B55A6D9126FF801F5C010092B712F06E60021F188002074DC8FC020117F86E6C16 -E0030F93C9FC030015F0040301FCCAFC5C547AD269>I<DB7F80903803FFF890B6027FEB -FFC0B70107B612F8053F15FE94B812C0048383048F17F804BF17FE93BAFCDEF0078195C7 -8105F8023F80C66C03C06E80011F4B0207806D4AC86C804C814C844C6F804C824C198087 -1EC0871EE0871EF0A3871EF8A4871EFCAF5114F8A51EF063A21EE0631EC0A2511480A251 -1400827093B55A505C82704B5C04FF4B5C71021F5C714A5C05F04A5C05FE0103B6C7FC94 -26FFC01F14FC95B75A04CF17E004C75F04C194C8FCDCC07F15F8050F15E005014AC9FCDD -001F13C095CCFCB3A6B812FEA9ECF87F66757AD174>I<DA01FEECFFE048B5020713FEB6 -021F6D7E057F14E094B67E4C15FC4C815E4C01877F93261FFC0F148017F8EE3FE0C66C4A -484814C0011F15806DECFF00A26F5A5EA24C6D1480A27214005E725B4C6D5B9538007FF0 -F10F8096C8FC5EA65EB3B3A2B97EA9ECF07F4A527AD156>114 D<92B500C0137C021F91 -38FC01FE91B71287010716FF131F5B90B9FC48ECC0014801FCC7121F4801E01403484980 -91C9FC48177F49163F003F171F49160F127FA2180712FF7FA27F806E6F5A02F092C8FC14 -FEECFFC015FE6CECFFF8EEFFE017FC6CEEFF8018E06C17F818FE6C717E6C846C846C846C -846D83011F836D83130301001880141F020317C0EC001FDB007F15E01603EE001F050314 -F01700D87F8082486C8284846D82A2847FA26D18E0A27FA26D4C13C07F6E4B1380806E4B -130002F85D6EEDFFFEDAFF8001075B03F8017F5B92B75A61198001F094C7FCD9E03F15FC -D9800F15E026FE000192C8FC007CD9001F13E0445479D253>I<ED3FF0A8157FA515FFA3 -5CA35CA35C5CA25CA25C5C91B5FC5B5B5B5B133F90B912F81207BAFCA8D8000302F0C9FC -B3B3A3953801FF80AF4E13006D80A2606D6E5C180F6E6D495A70133F6E9138C0FFF86E91 -B55A616E5E02035E6E93C7FC6E6C5C031F14F8030314E09226003FFEC8FC41757CF351> -I<DB7FC0EF3FE090B6047FB5FCB792B7FCAAC66CEF003F011F180F6D84B3B3A862A362A3 -62A26D6097B6FC616D6E5C4F816DDD0FFB14FC70DA3FF3ECFFFE6D6EECFFE36E9026FF80 -0713C394B612836E1703020F16FE6E16F8020116F06E6C15C0030FECFE00DB003F01E04B -C7FC675378D174>I<B500C1B500F0913A1FFFE3FFE091B694B5FCA9D8000F02E0C9001F -90C7FC755A6D6E4C5AA26D6E4C5AA26D6E4C5AA26D6E5F1BFFA26E6D4B5BA26E6E4A5BA2 -6E6E4A90C8FCA26E6E4A5AA36E6E4A5AA26E6E4A5AA26E6E4A5AA26E6E4A5AA2836F4B5B -A26F6E485BA26F6E4890C9FCA26F6E485AA26F02F05B191FA26F6E485AA26F6E485AA26F -6E485AA27090B55AA3705DA27092CAFCA2705CA2705CA2705CA3705CA2705CA2715BA271 -5BA37190CBFC715A715A63527BD06E>I<B50083B527E03FFFE1B500E0903A0FFFF8FFF0 -91B692B693B5FCA9D8001F0280C700030280C80007EBC00070755B6D716E94C7FC706388 -6D714E5A826D726D5E7092B5161F886D545A705C6D745E704A187F886E535A705C6E735E -71495F896E525B715B6E7492C8FC71D93FF95E896E05F05F71017F170F6E745C7149486C -151F896E4D6C5E7148183F6E745C4E496C157F05FE836F4C6C5E714818FF896F4A486D4A -5B068F17816F4B6D5E06DF17831EC36FDAFFF86D02C790C9FC1EE76F4B6D5D1EEF1EFF6F -4B6E5CA26F4B6E5CA36F4B6E5CA27091C86C5CA370496F5CA270496F5CA370496F91CAFC -A270614E81A27049705AA27049705A706CCAEA0FE08C527BD097>I<267FFFE1B500F090 -3B07FFFE3FFF8091B693B6FCA9D8000102FCC8003F01E0C7FC6D6E6F90C8FC6E6D4B5A71 -147F6E606E6E4A5A6E6E495B6E6E495B6E6E495B71495B6E5E6E6E92C9FC6F6D495A6F6E -485A72485A6F02C15B6F02E35B6F14F76F91B55A6F5E97CAFC6F5D705C705C8261705C70 -8070807080858285864C814C814C815E4C814C814D804C48804C487E4B496C804B496C80 -4B496C804B6E800580814B497E4B486D804B486D804B486E7F4A49834A824C6E804A496E -804A496E804A90C8814A48814A486F8049486C6F80B700F8023F91B512F8A9D9FE1FF0FE -1F65517CD06E>I<267FFFE0B500F8913A0FFFF1FFF091B694B5FCA9D8000702F0C9000F -EB80007590C7FC6D6E4C5AA26D6E4C5AA26D6E4C5AA26E6D4C5AA26E6E4B5AA36E6E4A5B -A26E6E4A5BA26E6E4A90C8FCA26E6E4A5AA26E6E4A5AA36E6E4A5AA26F6D4A5AA26F6E49 -5AA26F6E485BA26F6E485BA36F6E4890C9FCA26F6E485AA26F6E485AA26F6E485AA2706D -485AA3704A5AA2705DA2705DA27092CAFCA2705CA3705CA2705CA2715BA2715BA2715BA3 -715BA27190CBFCA24D5AA24D5AA260173FA2D801FE4B5A3807FF80001F01E04A5A487F4C -5B487F4C5BB57E4C90CCFCA24C5A161F4C5A4C5A4A495A6C5C4B5BDAF00F5B273FFDE03F -5B261FFF41B5CDFC91B55A6C15F86C5D6C5D6C15806C6C49CEFC011F13F0010390CFFC64 -757CD06E>I E -%EndDVIPSBitmapFont -end -%%EndProlog -%%BeginSetup -%%Feature: *Resolution 1200dpi -TeXDict begin -%%PaperSize: A4 - -%%EndSetup -%%Page: 1 1 -1 0 bop 100 1023 a Fh(P)-6 b(ac)g(k)-12 b(age:)100 1294 -y Fg(A)55 b(Lustre)f(pac)-5 b(k)-10 b(age)54 b(is)h(a)f(sequence)g -(\(seman)-5 b(tically)53 b(a)i(set\))f(of)g(declarations)h(of)f -(constan)-5 b(ts,)54 b(t)-5 b(yp)5 b(es,)55 b(functions)100 -1520 y(or)60 b(no)5 b(des.)557 1791 y Ff(LusPack)p 557 -1820 670 8 v 249 w Fe(\000)-31 b(!)250 b(f)p Ff(OneDe)-9 -b(cl)p 2110 1820 667 8 v 99 w Fe(g)2969 1725 y Fd(\003)560 -2062 y Ff(OneDe)g(cl)p 560 2091 V 247 w Fe(\000)-31 b(!)200 -b Ff(ConstDe)-9 b(cl)p 1969 2091 802 8 v 211 w Fe(j)101 -b Ff(T)-14 b(yp)-9 b(eDe)g(cl)p 3134 2126 714 8 v 210 -w Fe(j)101 b Ff(F)-14 b(uncDe)-9 b(cl)p 4211 2091 730 -8 v 210 w Fe(j)100 b Ff(No)-9 b(deDe)g(cl)p 5304 2091 -738 8 v 100 2604 a Fh(Constan)j(t)69 b(Declarations:)100 -2875 y Fg(A)80 b(constan)-5 b(t)79 b(can)g(b)5 b(e)80 -b(declared)g(with)h(its)f(t)-5 b(yp)5 b(e)79 b(and/or)h(v)-10 -b(alue.)139 b(If)79 b(no)h(v)-10 b(alue)80 b(is)g(giv)-5 -b(en,)84 b(the)c(constan)-5 b(t)79 b(is)100 3100 y(considered)64 -b(as)g(imp)5 b(orted.)90 b(Imp)5 b(orted)62 b(constan)-5 -b(ts)63 b(of)g(a)i(same)d(t)-5 b(yp)5 b(e)64 b(can)g(b)5 -b(e)64 b(giv)-5 b(en)64 b(as)g(a)g(list.)92 b(The)65 -b(t)-5 b(yp)5 b(e)63 b(of)100 3326 y(de\014ned)d(constan)-5 -b(t)59 b(can)i(b)5 b(e)60 b(giv)-5 b(en)61 b(for)f(more)f(precision.) -425 3597 y Ff(ConstDe)-9 b(cl)p 425 3626 802 8 v 249 -w Fe(\000)-31 b(!)200 b Fh(const)221 b Fe(f)p Ff(OneConstDe)-9 -b(cl)p 2759 3626 1127 8 v 100 w Fe(g)4078 3531 y Fc(+)4317 -3597 y Fh(;)100 3868 y Ff(OneConstDe)g(cl)p 100 3897 -V 248 w Fe(\000)-31 b(!)250 b(f)p Ff(Idf)p 2110 3933 -219 8 v 111 w Fh(,)101 b Fe(g)2690 3802 y Fd(\003)2890 -3868 y Ff(Idf)p 2890 3933 V 111 w Fh(:)111 b Ff(T)-14 -b(yp)-9 b(e)p 3389 3933 372 8 v 1598 4139 a Fe(j)320 -b Ff(Idf)p 1969 4204 219 8 v 110 w Fh(=)111 b Ff(Exp)p -2572 4204 301 8 v 223 w Fg([)o Fh(:)h Ff(T)-14 b(yp)-9 -b(e)p 3315 4204 372 8 v 50 w Fg(])100 4681 y Fh(T)j(yp)6 -b(e)69 b(Declarations:)100 4952 y Fg(A)63 b(declared)f(t)-5 -b(yp)5 b(e)62 b(can)h(b)5 b(e)62 b(external)h(\(just)e(a)h(name\))f(or) -i(declared.)86 b(Declared)62 b(t)-5 b(yp)5 b(es)62 b(are)h(either)f -(aliases)h(on)100 5178 y(t)-5 b(yp)5 b(e)60 b(expressions,)f(or)i -(built)g(t)-5 b(yp)5 b(es)60 b(\(structured)g(or)g(en)-5 -b(umerated\).)513 5449 y Ff(T)-14 b(yp)-9 b(eDe)g(cl)p -513 5513 714 8 v 248 w Fe(\000)-31 b(!)200 b Fh(t)-6 -b(yp)6 b(e)222 b Fe(f)p Ff(OneT)-14 b(yp)-9 b(eDe)g(cl)p -2685 5513 1039 8 v 109 w Fh(;)101 b Fe(g)4085 5383 y -Fc(+)188 5720 y Ff(OneT)-14 b(yp)-9 b(eDe)g(cl)p 188 -5784 V 247 w Fe(\000)-31 b(!)250 b(f)p Ff(Idf)p 2110 -5784 219 8 v 111 w Fh(,)101 b Fe(g)2690 5654 y Fd(\003)2890 -5720 y Ff(Idf)p 2890 5784 V 212 w Fe(j)f Ff(Idf)p 3472 -5784 V 111 w Fh(=)111 b Ff(T)-14 b(yp)-9 b(e)p 4076 5784 -372 8 v 1598 5991 a Fe(j)320 b Ff(Idf)p 1969 6055 219 -8 v 110 w Fh(=)111 b Ff(T)-14 b(yp)-9 b(eBuilder)p 2572 -6055 953 8 v 274 6262 a(T)-14 b(yp)-9 b(eBuilder)p 274 -6326 V 247 w Fe(\000)-31 b(!)200 b Fh(en)-6 b(um)110 -b Fb(f)222 b Fe(f)p Ff(Idf)p 2994 6326 219 8 v 111 w -Fh(,)101 b Fe(g)3574 6196 y Fd(\003)3774 6262 y Ff(Idf)p -3774 6326 V 111 w Fb(g)1598 6533 y Fe(j)320 b Fh(struct)111 -b Fb(f)222 b Fe(f)p Ff(Fields)p 3038 6562 472 8 v 110 -w Fh(;)101 b Fe(g)3871 6467 y Fd(\003)4071 6533 y Ff(Fields)p -4071 6562 V 110 w Fb(g)755 6804 y Ff(Fields)p 755 6833 -V 248 w Fe(\000)-31 b(!)250 b(f)p Ff(Idf)p 2110 6868 -219 8 v 111 w Fh(,)101 b Fe(g)2690 6738 y Fd(\003)2890 -6804 y Ff(Idf)p 2890 6868 V 111 w Fh(:)111 b Ff(T)-14 -b(yp)-9 b(e)p 3389 6868 372 8 v 100 7346 a Fh(T)j(yp)6 -b(e)69 b(Expression:)100 7617 y Fg(Those)75 b(expressions)h(are)g(used) -f(to)h(sp)5 b(ecify)75 b(the)h(t)-5 b(yp)5 b(e)75 b(of)h(a)f(v)-10 -b(ariable,)80 b(a)c(\014eld,)k(etc.)126 b(W)-15 b(e)75 -b(also)h(talk)g(ab)5 b(out)100 7843 y Ff(imme)-9 b(diate)53 -b Fg(t)-5 b(yp)5 b(e,)55 b(to)g(outline)h(the)e(di\013erence)i(with)f -Ff(built)k(typ)-9 b(es)p Fg(.)79 b(Immediate)52 b(t)-5 -b(yp)5 b(es)54 b(are)h(prede\014ned)g(t)-5 b(yp)5 b(es,)100 -8068 y(t)-5 b(yp)5 b(e)60 b(iden)-5 b(ti\014ers)61 b(\(references)e(to) -h(declared)h(t)-5 b(yp)5 b(es\))59 b(or)i(static)f(arra)-5 -b(ys.)855 8339 y Ff(T)-14 b(yp)-9 b(e)p 855 8404 V 249 -w Fe(\000)-31 b(!)200 b Ff(Pr)-9 b(e)g(defT)-14 b(yp)-9 -b(e)p 1969 8404 870 8 v 210 w Fe(j)100 b Ff(Idf)p 3201 -8404 219 8 v 212 w Fe(j)h Ff(T)-14 b(yp)-9 b(e)p 3784 -8404 372 8 v 110 w Fh(^)111 b Ff(Exp)p 4482 8404 301 -8 v 358 8881 a(Pr)-9 b(e)g(defT)-14 b(yp)-9 b(e)p 358 -8946 870 8 v 247 w Fe(\000)-31 b(!)200 b Fh(b)6 b(o)g(ol)211 -b Fe(j)100 b Fh(in)-6 b(t)213 b Fe(j)100 b Fh(real)3758 -11695 y Fg(1)p eop -%%Page: 2 2 -2 1 bop 100 804 a Fh(F)-17 b(unction)69 b(Declarations:)100 -1075 y Fg(A)61 b(function)f(is)h(declared)f(with)h(the)f(names)f(and)i -(t)-5 b(yp)5 b(es)59 b(of)h(its)h(formal)e(parameters.)307 -1346 y Ff(F)-14 b(uncDe)-9 b(cl)p 307 1375 730 8 v 247 -w Fe(\000)-30 b(!)199 b Fh(function)111 b Ff(Idf)p 2639 -1410 219 8 v 111 w Fh(\()g Ff(V)-14 b(arDe)-9 b(clList)p -3161 1375 938 8 v 110 w Fh(\))112 b(returns)f(\()h Ff(V)-14 -b(arDe)-9 b(clList)p 5370 1375 V 110 w Fh(\))100 1888 -y Ff(V)-14 b(arDe)-9 b(clList)p 100 1917 V 248 w Fe(\000)-30 -b(!)249 b(f)p Ff(V)-14 b(arDe)-9 b(cl)p 1920 1917 633 -8 v 110 w Fh(;)101 b Fe(g)2914 1822 y Fd(\003)3114 1888 -y Ff(V)-14 b(arDe)-9 b(cl)p 3114 1917 V 404 2430 a(V)-14 -b(arDe)-9 b(cl)p 404 2459 V 248 w Fe(\000)-30 b(!)249 -b(f)p Ff(Idf)p 1920 2494 219 8 v 111 w Fh(,)101 b Fe(g)2500 -2364 y Fd(\003)2700 2430 y Ff(Idf)p 2700 2494 V 111 w -Fh(:)111 b Ff(T)-14 b(yp)-9 b(e)p 3199 2494 372 8 v 100 -3166 a Fh(No)6 b(de)68 b(Declaration:)100 3437 y Fg(A)61 -b(no)5 b(de)61 b(can)h(b)5 b(e)61 b(declared)g(with)h(a)f(complete)f -(description)h(of)g(its)g(dynamic)f(b)5 b(eha)-5 b(viour,)62 -b(or)f(b)-5 b(y)62 b(implicitely)100 3663 y(reusing)51 -b(the)g(dynamic)f(b)5 b(eha)-5 b(viour)52 b(of)f(another)g(no)5 -b(de.)77 b(A)51 b(no)5 b(de)51 b(can)g(ha)-5 b(v)g(e)51 -b(static)g(parameters)e(\(w)-5 b(e)51 b(also)h(talk)100 -3889 y(ab)5 b(out)60 b Ff(template)k(no)-9 b(de)p Fg(,)59 -b(or)i(no)g(\(in)g(whic)-5 b(h)61 b(case)f(w)-5 b(e)60 -b(also)h(talk)g(ab)5 b(out)60 b Ff(actual)k(no)-9 b(de)p -Fg(\).)894 4160 y Ff(No)g(deDe)g(cl)p 894 4189 738 8 -v 248 w Fe(\000)-31 b(!)199 b Fh(no)6 b(de)111 b Ff(Idf)p -2923 4224 219 8 v 222 w Fg([)p Ff(StaticPr)-9 b(oto)p -3415 4189 893 8 v 50 w Fg(])172 b Ff(No)-9 b(dePr)g(oto)p -4580 4189 833 8 v 110 w(No)g(deBo)g(dy)p 5523 4224 789 -8 v 2002 4431 a Fe(j)320 b Fh(no)6 b(de)111 b Ff(Idf)p -2923 4495 219 8 v 222 w Fg([)p Ff(StaticPr)-9 b(oto)p -3415 4460 893 8 v 50 w Fg(])172 b Fh(=)110 b Ff(Idf)p -4853 4495 219 8 v 222 w Fg([)p Ff(StaticA)-5 b(r)c(gList)p -5345 4495 1042 8 v 51 w Fg(])171 b Fh(;)100 4973 y Fg(Static)60 -b(parameters)e(are)j(constan)-5 b(ts)59 b(and)h(abstract)g(t)-5 -b(yp)5 b(es,)59 b(or)i(no)5 b(des.)739 5244 y Ff(StaticPr)-9 -b(oto)p 739 5273 893 8 v 250 w Fe(\000)-31 b(!)199 b -Fa(<<)171 b Fe(f)p Ff(StaticPar)-9 b(am)p 2827 5273 981 -8 v 111 w Fh(;)101 b Fe(g)4169 5178 y Fd(\003)4369 5244 -y Ff(StaticPar)-9 b(am)p 4369 5273 V 110 w Fa(>>)651 -5515 y Ff(StaticPar)g(am)p 651 5544 V 249 w Fe(\000)-31 -b(!)199 b Fh(t)-6 b(yp)6 b(e)112 b Ff(Idf)p 2888 5579 -219 8 v 212 w Fe(j)101 b Fh(const)110 b Ff(Idf)p 4059 -5579 V 111 w Fh(:)h Ff(T)-14 b(yp)-9 b(e)p 4558 5579 -372 8 v 2002 5786 a Fe(j)320 b Fh(no)6 b(de)111 b Ff(Idf)p -2923 5850 219 8 v 111 w(No)-9 b(dePr)g(oto)p 3253 5815 -833 8 v 100 6328 a Fg(A)62 b(no)5 b(de)62 b(protot)-5 -b(yp)5 b(e)61 b(de\014nes)h(the)g(formal)e(inputs/outputs)h(of)h(a)g -(no)5 b(de)62 b(\(in)g(some)e(sence)i(the)f("t)-5 b(yp)5 -b(e")62 b(of)f(the)100 6554 y(no)5 b(de\).)79 b(F)-15 -b(ormal)60 b(no)5 b(de)60 b(parameters)e(are)j(t)-5 b(yp)5 -b(ed)60 b(iden)-5 b(ti\014ers)61 b(with)g(an)g(optionnal)g(formal)e -(clo)5 b(c)-5 b(k\).)799 6825 y Ff(No)c(dePr)g(oto)p -799 6854 V 249 w Fe(\000)-31 b(!)199 b Fh(\()112 b Ff(Clo)-9 -b(cke)g(dV)-14 b(arDe)-9 b(clList)p 2566 6854 1532 8 -v 108 w Fh(\))111 b(returns)g(\()h Ff(Clo)-9 b(cke)g(dV)-14 -b(arDe)-9 b(clList)p 5369 6854 V 108 w Fh(\))100 7367 -y Ff(Clo)g(cke)g(dV)-14 b(arDe)-9 b(clList)p 100 7396 -V 246 w Fe(\000)-31 b(!)250 b(f)p Ff(Clo)-9 b(cke)g(dV)-14 -b(arDe)-9 b(cl)p 2515 7396 1228 8 v 107 w Fh(;)101 b -Fe(g)4103 7301 y Fd(\003)4303 7367 y Ff(Clo)-9 b(cke)g(dV)-14 -b(arDe)-9 b(cl)p 4303 7396 V 404 7638 a(Clo)g(cke)g(dV)-14 -b(arDe)-9 b(cl)p 404 7667 V 246 w Fe(\000)-31 b(!)199 -b Ff(V)-14 b(arDe)-9 b(cl)p 2373 7667 633 8 v 110 w Fh(when)111 -b Ff(Idf)p 3707 7702 219 8 v 212 w Fe(j)101 b Fh(\()111 -b Ff(V)-14 b(arDe)-9 b(clList)p 4482 7667 938 8 v 110 -w Fh(\))112 b(when)f Ff(Idf)p 6313 7702 219 8 v 100 8180 -a Fh(No)6 b(de)68 b(Bo)6 b(dy:)100 8451 y Fg(It)68 b(con)-5 -b(tains)69 b(an)g(optionnal)h(set)f(of)f(lo)5 b(cal)70 -b(v)-10 b(ariable)70 b(de\014nitions)g(and)f(a)g(sequence)f(\(seman)-5 -b(tically)68 b(a)h(set\))f(of)100 8676 y(equations.)843 -8947 y Ff(No)-9 b(deBo)g(dy)p 843 9012 789 8 v 249 w -Fe(\000)-31 b(!)250 b Fg([)o Fh(v)-12 b(ar)112 b Ff(Clo)-9 -b(cke)g(dV)-14 b(arDe)-9 b(clList)p 2872 8976 1532 8 -v 108 w Fh(;)50 b Fg(])172 b Fh(let)222 b Fe(f)p Ff(Equation)p -5394 9012 709 8 v 111 w Fh(;)101 b Fe(g)6464 8881 y Fc(+)6703 -8947 y Fh(tel)100 9218 y Fg(An)61 b(equation)f(is)h(either)g(an)f -(assertion)g(or)h(a)f("real")h(equation.)923 9489 y Ff(Equation)p -923 9554 V 249 w Fe(\000)-31 b(!)199 b Fh(assert)110 -b Ff(Exp)p 3014 9554 301 8 v 213 w Fe(j)101 b Ff(L)-9 -b(eftPart)p 3679 9554 658 8 v 111 w Fh(=)110 b Ff(Exp)p -4721 9554 301 8 v 100 9760 a Fg(A)53 b(left)g(part)g(is)h(a)f(non-empt) --5 b(y)51 b(list)i(of)g(left)g(item.)76 b(A)54 b(left)f(item)f(denotes) -g(a)h(v)-10 b(ariable)54 b("piece":)77 b(a)53 b(full)h(v)-10 -b(ariable,)100 9986 y(the)60 b(\014eld)h(of)f(a)g(structured)g(left)g -(item,)f(an)h(elemen)-5 b(t)59 b(or)i(a)f(slice)h(of)f(an)h(arra)-5 -b(y)61 b(left)f(item.)974 10257 y Ff(L)-9 b(eftPart)p -974 10322 658 8 v 249 w Fe(\000)-31 b(!)250 b Fg([)o -Fh(\()51 b Fg(])283 b Fe(f)o Ff(L)-9 b(eftItem)p 3030 -10322 668 8 v 111 w Fh(,)101 b Fe(g)4059 10191 y Fd(\003)4259 -10257 y Ff(L)-9 b(eftItem)p 4259 10322 V 222 w Fg([)o -Fh(\))51 b Fg(])964 10799 y Ff(L)-9 b(eftItem)p 964 10864 -V 249 w Fe(\000)-31 b(!)199 b Ff(Idf)p 2373 10864 219 -8 v 212 w Fe(j)101 b Ff(L)-9 b(eftItem)p 2956 10864 668 -8 v 110 w Fh(.)111 b Ff(Idf)p 3903 10864 219 8 v 212 -w Fe(j)101 b Ff(L)-9 b(eftItem)p 4486 10864 668 8 v 110 -w Fh([)112 b Ff(Exp)p 5434 10864 301 8 v 111 w Fh(])2002 -11070 y Fe(j)320 b Ff(L)-9 b(eftItem)p 2373 11134 668 -8 v 111 w Fh([)111 b Ff(Exp)p 3321 11134 301 8 v 112 -w Fh(..)g Ff(Exp)p 3960 11134 V 223 w Fg([)o Fh(step)g -Ff(Exp)p 5020 11134 V 51 w Fg(])172 b Fh(])3758 11695 -y Fg(2)p eop -%%Page: 3 3 -3 2 bop 100 1023 a Fh(Expressions:)1046 1294 y Ff(Exp)p -1046 1358 301 8 v 250 w Fe(\000)-31 b(!)199 b Ff(Pr)-9 -b(e)g(defConst)p 2088 1358 958 8 v 212 w Fe(j)100 b Ff(Idf)p -3409 1358 219 8 v 212 w Fe(j)h Ff(UnOp)p 3992 1358 470 -8 v 110 w(Exp)p 4572 1358 301 8 v 213 w Fe(j)g Ff(Exp)p -5237 1358 V 111 w(BinOp)p 5648 1358 519 8 v 111 w(Exp)p -6278 1358 301 8 v 1717 1565 a Fe(j)320 b Fh(if)111 b -Ff(Exp)p 2321 1629 V 112 w Fh(then)g Ff(Exp)p 3253 1629 -V 112 w Fh(else)g Ff(Exp)p 4109 1629 V 212 w Fe(j)101 -b Fh(with)111 b Ff(Exp)p 5290 1629 V 112 w Fh(then)h -Ff(Exp)p 6223 1629 V 111 w Fh(else)f Ff(Exp)p 7078 1629 -V 1717 1836 a Fe(j)320 b Ff(Exp)p 2088 1900 V 51 w Fg(.)p -Ff(Idf)p 2490 1900 219 8 v 212 w Fe(j)100 b Ff(Exp)p -3072 1900 301 8 v 51 w Fh([)51 b Ff(Exp)p 3532 1900 V -51 w Fh(])212 b Fe(j)101 b Ff(Exp)p 4305 1900 V 51 w -Fh([)50 b Ff(Exp)p 4764 1900 V 51 w Fh(..)h Ff(Exp)p -5282 1900 V 162 w Fg([)p Fh(step)f Ff(Exp)p 6221 1900 -V 51 w Fg(])111 b Fh(])1717 2107 y Fe(j)320 b Ff(NaryOp)p -2088 2171 626 8 v 50 w Fh(\()162 b Fe(f)p Ff(Exp)p 3098 -2171 301 8 v 51 w Fh(,)101 b Fe(g)3699 2041 y Fd(\003)3838 -2107 y Ff(Exp)p 3838 2171 V 52 w Fh(\))1717 2378 y Fe(j)320 -b Fh(\()223 b Fe(f)p Ff(Exp)p 2483 2442 V 111 w Fh(,)101 -b Fe(g)3144 2312 y Fd(\003)3344 2378 y Ff(Exp)p 3344 -2442 V 112 w Fh(\))1717 2649 y Fe(j)320 b Ff(Idf)p 2088 -2713 219 8 v 111 w Fb(f)222 b Fe(f)p Ff(Idf)p 2836 2713 -V 111 w Fg(=)60 b Ff(Exp)p 3368 2713 301 8 v 111 w Fh(;)101 -b Fe(g)4029 2583 y Fd(\003)4229 2649 y Ff(Idf)p 4229 -2713 219 8 v 111 w Fg(=)60 b Ff(Exp)p 4761 2713 301 8 -v 112 w Fb(g)1717 2920 y Fe(j)320 b Ff(No)-9 b(deExpr)g(ession)p -2088 2984 1247 8 v 111 w Fh(\()222 b Fe(f)p Ff(Exp)p -3840 2984 301 8 v 112 w Fh(,)101 b Fe(g)4502 2854 y Fd(\003)4702 -2920 y Ff(Exp)p 4702 2984 V 112 w Fh(\))100 3462 y Fg(In)-5 -b(teger)59 b(and)i(\015oating)f(p)5 b(oin)-5 b(t)61 b(notations)f(are)h -(follo)-5 b(wing)61 b(the)f(ansi-c)h(syn)-5 b(tax.)389 -3733 y Ff(Pr)c(e)g(defConst)p 389 3797 958 8 v 249 w -Fe(\000)-31 b(!)199 b Ff(Inte)-9 b(ger)p 2088 3797 552 -8 v 211 w Fe(j)101 b Ff(R)-9 b(e)g(al)p 3003 3762 338 -8 v 210 w Fe(j)100 b Fh(true)213 b Fe(j)101 b Fh(false)100 -4275 y(Op)6 b(erator)69 b(denotations:)100 4546 y Fg(The)59 -b(e\013ectiv)-5 b(e)58 b(no)5 b(de)58 b(construction)g(denotes)g(an)h -(actual)f(op)5 b(eration)59 b(wic)-5 b(h)59 b(can)g(b)5 -b(e)59 b(a)f(predi\014ned)h(op)5 b(eration,)100 4771 -y(or)60 b(a)h(user)f(de\014ned)g(op)5 b(eration,)61 b(in)g(whic)-5 -b(h)61 b(case)f(a)g(list)h(of)f(e\013ectiv)-5 b(e)60 -b(static)g(parameters)f(can)h(b)5 b(e)61 b(giv)-5 b(en.)100 -5042 y Ff(No)c(deExpr)g(ession)p 100 5107 1247 8 v 249 -w Fe(\000)-31 b(!)199 b Fh(op)6 b(erator)110 b Ff(Pr)-9 -b(e)g(defOp)p 2981 5107 730 8 v 1717 5313 a Fe(j)320 -b Ff(Idf)p 2088 5378 219 8 v 222 w Fg([)p Ff(StaticA)-5 -b(r)c(gList)p 2580 5378 1042 8 v 51 w Fg(])100 5584 y(The)60 -b(k)-5 b(eyw)g(ord)61 b Fh(if)111 b Fg(is)61 b(denoting)f(the)h -(ternary)f(op)5 b(eration)61 b Fh(if)50 b Fg(...)p Fh(then)g -Fg(...)p Fh(else)e Fg(...)616 5855 y Ff(Pr)-9 b(e)g(defOp)p -616 5920 730 8 v 248 w Fe(\000)-31 b(!)199 b Ff(Unop)p -2088 5920 424 8 v 212 w Fe(j)101 b Ff(BinOp)p 2875 5920 -519 8 v 211 w Fe(j)g Fh(if)923 6397 y Ff(Unop)p 923 6462 -424 8 v 250 w Fe(\000)-31 b(!)199 b Fh(not)212 b Fe(j)101 -b Fh(-)212 b Fe(j)100 b Fh(pre)212 b Fe(j)101 b Fh(curren)-6 -b(t)828 6939 y Ff(BinOp)p 828 7004 519 8 v 249 w Fe(\000)-31 -b(!)199 b Fa(->)161 b Fe(j)100 b Fh(when)212 b Fe(j)101 -b Fh(or)212 b Fe(j)100 b Fh(xor)212 b Fe(j)101 b Fh(and)212 -b Fe(j)100 b Fa(=>)161 b Fe(j)101 b Fh(=)211 b Fe(j)101 -b Fa(<>)160 b Fe(j)101 b Fa(<)161 b Fe(j)100 b Fa(>)1717 -7210 y Fe(j)320 b Fa(<=)161 b Fe(j)100 b Fa(>=)161 b -Fe(j)100 b Fh(+)212 b Fe(j)100 b Fh(-)212 b Fe(j)101 -b Fh(*)211 b Fe(j)101 b Fh(/)212 b Fe(j)100 b Fh(div)213 -b Fe(j)100 b Fh(mo)6 b(d)211 b Fe(j)101 b Fa(^)161 b -Fe(j)100 b Fa(|)721 7752 y Ff(NaryOp)p 721 7817 626 8 -v 249 w Fe(\000)-31 b(!)199 b Fa(#)161 b Fe(j)101 b Fh(nor)100 -8294 y(Static)70 b(argumen)-6 b(ts:)100 8565 y Fg(The)88 -b(strict)f(w)-5 b(a)g(y)88 b(is)g(to)g(sp)5 b(ecify)87 -b(the)h(nature)f(\(const,)94 b(t)-5 b(yp)5 b(e)87 b(or)h(no)5 -b(de\))87 b(of)h(a)g(e\013ectiv)-5 b(e)87 b(static;)101 -b(ho)-5 b(w)g(ev)g(er,)100 8791 y(the)79 b(nature)h(can)g(b)5 -b(e)80 b(a)-5 b(v)g(oided)80 b(when)h(the)e(parameter)g(is:)119 -b(a)80 b Fh(simple)f Fg(arithmetic)g(and)h(logic)h(expression)100 -9017 y(\(t)-5 b(ypically)66 b Fa(n-1)p Fg(\),)e(a)i(predi\014ned)g(t)-5 -b(yp)5 b(e)65 b(or)g(constan)-5 b(t)65 b(\(or)g(an)g(arra)-5 -b(y)66 b(of)14 b(\),)66 b(a)f(predi\014ned)h(op)5 b(erator,)66 -b(or)g(ev)-5 b(en)65 b(a)100 9243 y(single)51 b(iden)-5 -b(ti\014er)51 b(\(in)g(this)f(case,)i(the)e(compiler)g(will)i(try)f(to) -f(compute)e(the)i(nature)h(according)f(to)h(its)f(naming)100 -9468 y(en)-5 b(vironmen)g(t\).)305 9739 y Ff(StaticA)g(r)c(gList)p -305 9804 1042 8 v 250 w Fe(\000)-31 b(!)199 b Fa(<<)171 -b Fe(f)p Ff(StaticA)-5 b(r)c(g)p 2542 9804 737 8 v 111 -w Fh(,)101 b Fe(g)3640 9673 y Fd(\003)3840 9739 y Ff(StaticA)-5 -b(r)c(g)p 3840 9804 V 111 w Fa(>>)609 10010 y Ff(StaticA)k(r)c(g)p -609 10075 V 250 w Fe(\000)-31 b(!)199 b Fh(t)-6 b(yp)6 -b(e)112 b Ff(T)-14 b(yp)-9 b(e)p 2603 10075 372 8 v 212 -w Fe(j)100 b Fh(const)111 b Ff(Exp)p 3927 10075 301 8 -v 212 w Fe(j)101 b Fh(no)6 b(de)111 b Ff(No)-9 b(deExpr)g(ession)p -5141 10075 1247 8 v 1717 10281 a Fe(j)320 b Ff(Pr)-9 -b(e)g(defT)-14 b(yp)-9 b(e)p 2088 10346 870 8 v 160 w -Fe(f)p Fh(^)110 b Ff(Expr)-9 b(ession)p 3425 10346 852 -8 v 102 w Fe(g)4469 10215 y Fd(\003)4770 10281 y Fe(j)100 -b Ff(Pr)-9 b(e)g(defConst)p 4921 10346 958 8 v 161 w -Fe(f)p Fh(^)111 b Ff(Expr)-9 b(ession)p 6347 10346 852 -8 v 101 w Fe(g)7390 10215 y Fd(\003)1717 10552 y Fe(j)320 -b Ff(SimpleExpr)-9 b(ession)p 2088 10617 1381 8 v 211 -w Fe(j)101 b Fh(op)6 b(erator)110 b Ff(Pr)-9 b(e)g(defOp)p -4726 10617 730 8 v 210 w Fe(j)100 b Ff(idf)p 5819 10617 -205 8 v 3758 11695 a Fg(3)p eop -%%Trailer -end -userdict /end-hook known{end-hook}if -%%EOF diff --git a/lv6-ref-man/Makefile b/lv6-ref-man/Makefile index cbe6abaa..fd2fc3af 100644 --- a/lv6-ref-man/Makefile +++ b/lv6-ref-man/Makefile @@ -30,6 +30,7 @@ FIGS=\ # targets: lus 2 latex LUS2TEX= \ + $(OBJPDF)/is_stable.lus.tex \ $(OBJPDF)/struct.lus.tex \ $(OBJPDF)/consensus2.lus.tex \ $(OBJPDF)/count.lus.tex \ @@ -42,6 +43,7 @@ LUS2TEX= \ $(OBJPDF)/SWITCH1.lus.tex \ $(OBJPDF)/FALLING_EDGE.lus.tex \ $(OBJPDF)/sincos.lus.tex \ + $(OBJPDF)/sincos-bad.lus.tex \ $(OBJPDF)/integrator.lus.tex \ $(OBJPDF)/type_decl.lus.tex \ $(OBJPDF)/merge.lus.tex \ @@ -77,7 +79,7 @@ h:$(SRCS) #------------------------------ #------------------------------ -$(MAIN).pdf : $(PARSER) $(SRCS) $(LUS2TEX) $(SUMMARY) $(FIGS) +$(MAIN).pdf : $(PARSER) $(SRCS) $(LUS2TEX) $(SUMMARY) $(FIGS) $(OBJPDF)/version.tex (cd objpdf; pdflatex ../$(MAIN).tex) mv objpdf/$(MAIN).pdf . @@ -90,6 +92,16 @@ $(OBJPDF)/%.tex : $(FIGDIR)/%.fig cd $(OBJPDF); epstopdf $*.ps cd $(OBJPDF); fig2dev -Lpstex_t -p $*.pdf $*.fig > $*.tex +$(OBJPDF)/version.tex: ../$(OBJDIR)/lus2lic Makefile + rm -f lv6-ref-man/version.tex ; \ + date +VERSION_DATE=%d-%m-%y > lv6-ref-man/version.tex ; \ + echo "\\\newcommand{\\\version}{`../$(OBJDIR)/lus2lic --version | cut -d " " -f1`}" > $(OBJPDF)/version.tex ; \ + echo "\\\newcommand{\\\sha}{$(SHA)}" >> $(OBJPDF)/version.tex ; \ + echo "\\\newcommand{\\\versiondate}{`date +%d-%m-%y`}" >> $(OBJPDF)/version.tex ;\ + + + + clean: rm -f $(OBJPDF)/* @@ -112,12 +124,19 @@ re: # direct inclusion of lustre non-reg files into the manual #LUSTRE_DIR=$(HOME)//lus2lic/src/test/should_work -LUSTRE_DIR=../src/test/should_work +LUSTRE_DIR=../test/should_work +LUSTRE_DIR_bad=../test/should_fail #LUS2TEX=$(HOME)/TeXinputs/lus2tex # Generic rule for .lus.tex targets # - All lus files must be in some subdir of LUSTRE_DIR -$(OBJPDF)/%.lus.tex : $(LUSTRE_DIR)/*/%.lus +$(OBJPDF)/%-bad.lus.tex : $(LUSTRE_DIR_bad)/*/%.lus + utils/lus2tex $< > $@ + +$(OBJPDF)/%.lus.tex : $(LUSTRE_DIR)/%.lus + utils/lus2tex $< > $@ + +$(OBJPDF)/%-broken.lus.tex : $(LUSTRE_DIR)/broken/%.lus utils/lus2tex $< > $@ lus2tex: $(EXEMPLES) diff --git a/lv6-ref-man/lv6-ref-man.tex b/lv6-ref-man/lv6-ref-man.tex index 8907142c..0e2f5ab4 100644 --- a/lv6-ref-man/lv6-ref-man.tex +++ b/lv6-ref-man/lv6-ref-man.tex @@ -1,11 +1,13 @@ \input{preambule} +\input{version} \title{The Lustre V6 Reference Manual (draft)} \author{ } -\date{Initial version: \today \\ -Last update: \today} +\date{ +Software Version:\version + (\versiondate) } \begin{document} @@ -455,6 +457,9 @@ One can try to connect two such integrators in loop to compute the functions $\sin(\omega t)$ and $\cos(\omega t)$ in a simple-minded way: +\begin{example}[The buggy sincos node] +\input{sincos-bad.lus} +\end{example} Called on this program, the compiler would complain that there is a {\em @@ -1112,7 +1117,7 @@ functions, and a constructor function. \begin{alltt} \kwd{type} complex = \{ re : real ; im : real \}; -\kwd{const} j = \{ re = -sqrt(3)/2; im = sqrt(3)/2 \}; \comment{-- a complex constant} +\kwd{const} j = \{ re = -sqrt(3)/2; im = sqrt(3)/2 \}; \coment{-- a complex constant} \kwd{node} get_im(c:complex) \kwd{returns} (x:real) ; \kwd{let} @@ -1859,11 +1864,13 @@ y & 1 & 2 & 1 & 1 & 3 & 2\\ \cleardoublepage -\section{A complete example} +\section{A complete example (finish me)} \label{exemples} +\begin{example}[Detecting the stability of a flow] +\input{is_stable.lus} +\end{example} -\todo add a complete Lustre V6 commented exemple.... diff --git a/lv6-ref-man/utils/lus2tex b/lv6-ref-man/utils/lus2tex index 7117cf6c..86848014 100755 --- a/lv6-ref-man/utils/lus2tex +++ b/lv6-ref-man/utils/lus2tex @@ -16,14 +16,14 @@ FILE=$1 " -sed -e 's/type /\\kwd{type} /g' $FILE \ - | sed -e 's/ {/ \\{/g' \ - | sed -e 's/ }/ \\}/g' \ +cat $FILE \ + | sed -e 's/{/\\{/g' \ + | sed -e 's/}/\\}/g' \ | sed -e 's/^}/\\}/g' \ | sed -e 's/^\(.*\) -- del//g' \ | sed -e 's/----\(.*\)$//g' \ | sed -e 's/---/\\pause/g' \ - | sed -e 's/--\(.*\)$/\\comment{--\1}/g' \ + | sed -e 's/--\(.*\)$/\\coment{--\1}/g' \ | sed -e 's/const/\\kwd{const}/' \ | sed -e 's/function/\\kwd{function}/' \ | sed -e 's/node/\\kwd{node}/' \ @@ -54,7 +54,9 @@ sed -e 's/type /\\kwd{type} /g' $FILE \ | sed -e 's/ and / \\kwdd{and} /g' \ | sed -e 's/ not / \\kwdd{not} /g' \ | sed -e 's/ false / \\kwdd{false} /g'\ - | sed -e 's/\t/ /g' + | sed -e 's/\t/ /g'\ + | sed -e 's/type /\\kwd{type} /g' + echo "\end{alltt} diff --git a/src/ast2lic.ml b/src/ast2lic.ml index 70b37db5..09161380 100644 --- a/src/ast2lic.ml +++ b/src/ast2lic.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 29/01/2013 (at 14:16) by Erwan Jahier> *) +(* Time-stamp: <modified the 31/01/2013 (at 09:41) by Erwan Jahier> *) open Lxm @@ -168,124 +168,124 @@ let get_abstract_static_params (* exported *) let rec of_node - (id_solver : Lic.id_solver) (ne: AstCore.node_exp srcflagged) : Lic.node_exp = - - Verbose.exe ~flag:dbg (fun () -> - Printf.fprintf stderr "\n\n#DBG: ENTERING Ast2lic.of_node \'"; - AstV6Dump.print_node_exp stderr ne.it; - Printf.fprintf stderr "'\n\n"; - - ); - let lxm = ne.src in - let (idref, static_args) = ne.it in - (* pas tres beau : on corrige le idref des predefs ... *) - let idref = match (idref.id_pack, idref.id_id) with - | (None, "map") - | (None, "red") - | (None, "fill") - | (None, "fillred") - | (None, "boolred") - | (None, "condact") -> {idref with id_pack = Some "Lustre"} - | _ -> idref - in - (* BUG des param statique node avec le meme nom - qu'un node template global : - pis-aller : si static_args = [], - on a peut-etre affaire à un static param node, donc - on appelle directement id_solver.id2node et c'est lui - qui plantera si ce n'est pas le cas et qu'il fallait - des static_args... - si static_args <> [], de toute maniere ca ne peut PAS - etre un static param node - *) - - (* NOUVELLE VERSION ÉPURÉE : - ON ne fait AUCUNE vérif de cohérence de types pour les param statiques, - on ne vérifie QUE la nature (pour pouvoir résoudre les args qui sont des idents - A FAIRE + TARD ? !! - *) - let static_args_eff = match static_args with - | [] -> [] - | _ -> + (id_solver : Lic.id_solver) (ne: AstCore.node_exp srcflagged) : Lic.node_exp = + + Verbose.exe ~flag:dbg (fun () -> + Printf.fprintf stderr "\n\n#DBG: ENTERING Ast2lic.of_node \'"; + AstV6Dump.print_node_exp stderr ne.it; + Printf.fprintf stderr "'\n\n"; + + ); + let lxm = ne.src in + let (idref, static_args) = ne.it in + (* pas tres beau : on corrige le idref des predefs ... *) + let idref = match (idref.id_pack, idref.id_id) with + | (None, "map") + | (None, "red") + | (None, "fill") + | (None, "fillred") + | (None, "boolred") + | (None, "condact") -> {idref with id_pack = Some "Lustre"} + | _ -> idref + in + (* BUG des param statique node avec le meme nom + qu'un node template global : + pis-aller : si static_args = [], + on a peut-etre affaire à un static param node, donc + on appelle directement id_solver.id2node et c'est lui + qui plantera si ce n'est pas le cas et qu'il fallait + des static_args... + si static_args <> [], de toute maniere ca ne peut PAS + etre un static param node + *) + + (* NOUVELLE VERSION ÉPURÉE : + ON ne fait AUCUNE vérif de cohérence de types pour les param statiques, + on ne vérifie QUE la nature (pour pouvoir résoudre les args qui sont des idents + A FAIRE + TARD ? !! + *) + let static_args_eff = match static_args with + | [] -> [] + | _ -> (* on en proffite pour corriger le idref en y rajoutant l'eventuel pack *) let static_params = get_abstract_static_params id_solver.global_symbols lxm idref in let sp_l = List.length static_params and sa_l = List.length static_args in - if (sp_l <> sa_l) then - let msg = "Bad number of (static) arguments: " ^ - (string_of_int sp_l) ^ " expected, and " ^ - (string_of_int sa_l) ^ " provided." - in - raise (Compile_error(lxm, msg)) - else - List.map2 (check_static_arg id_solver) - static_params - static_args - in - let res = id_solver.id2node idref static_args_eff lxm in - Verbose.exe ~flag:dbg (fun () -> - Printf.fprintf stderr "\n#DBG: LEAVING Ast2lic.of_node \'"; - AstV6Dump.print_node_exp stderr ne.it; - Printf.fprintf stderr "'\n"; - Printf.fprintf stderr " RESULT:\n%s\n" (Lic.string_of_node_exp res); - ); - res + if (sp_l <> sa_l) then + let msg = "Bad number of (static) arguments: " ^ + (string_of_int sp_l) ^ " expected, and " ^ + (string_of_int sa_l) ^ " provided." + in + raise (Compile_error(lxm, msg)) + else + List.map2 (check_static_arg id_solver) + static_params + static_args + in + let res = id_solver.id2node idref static_args_eff lxm in + Verbose.exe ~flag:dbg (fun () -> + Printf.fprintf stderr "\n#DBG: LEAVING Ast2lic.of_node \'"; + AstV6Dump.print_node_exp stderr ne.it; + Printf.fprintf stderr "'\n"; + Printf.fprintf stderr " RESULT:\n%s\n" (Lic.string_of_node_exp res); + ); + res and check_static_arg - (node_id_solver: Lic.id_solver) - (asp: abstract_static_param) - (sa: AstCore.static_arg srcflagged) -: Lic.static_arg = -( - (* 1ere passe : - on utilise expected juste pour résoudre la nature, - on "compile" les args - *) - let nature_error nat = + (node_id_solver: Lic.id_solver) + (asp: abstract_static_param) + (sa: AstCore.static_arg srcflagged) + : Lic.static_arg = + ( + (* 1ere passe : + on utilise expected juste pour résoudre la nature, + on "compile" les args + *) + let nature_error nat = let msg = Printf.sprintf "Bad static argument nature, a %s was expected" nat in raise (Compile_error(sa.src, msg)) - in - let res = match (sa.it, asp) with - (* ident vs type *) - | (StaticArgIdent idref, ASP_type id) -> - let teff = node_id_solver.id2type idref sa.src in - TypeStaticArgLic (id, teff) - (* type_exp vs type *) - | (StaticArgType te, ASP_type id) -> - let teff = of_type node_id_solver te in - TypeStaticArgLic (id, teff) - (* ident vs const *) - | (StaticArgIdent idref, ASP_const id) -> - let ceff = node_id_solver.id2const idref sa.src in - ConstStaticArgLic (id, ceff) - (* val_exp vs const *) - | (StaticArgConst ce, ASP_const id) -> ( - let ceff = EvalConst.f node_id_solver ce in - match ceff with - | [ceff] -> ConstStaticArgLic (id,ceff) - | _ -> ConstStaticArgLic (id,Tuple_const_eff ceff) - ) - (* id vs node *) - | (StaticArgIdent idref, ASP_node id) -> - let sargs = [] in - let neff = node_id_solver.id2node idref sargs sa.src in - NodeStaticArgLic (id, neff.node_key_eff) - (* node exp vs node *) - | (StaticArgNode (CALL_n ne), ASP_node id) -> - let neff = of_node node_id_solver ne in - NodeStaticArgLic (id, neff.node_key_eff) - (* node exp vs node *) - | (StaticArgNode (Predef_n (op,sargs)), ASP_node id) -> - (* ICI : campagne de suppression de Lic.PREDEF_CALL: pas de macros ! *) - assert (sargs = []); - let opeff = LicEvalType.make_node_exp_eff node_id_solver None op.it sa.src [] in - NodeStaticArgLic (id, opeff.node_key_eff) - | (_, ASP_type _) -> nature_error "type" - | (_, ASP_const _) -> nature_error "constant" - | (_, ASP_node _) -> nature_error "node" - in res -) - + in + let res = match (sa.it, asp) with + (* ident vs type *) + | (StaticArgIdent idref, ASP_type id) -> + let teff = node_id_solver.id2type idref sa.src in + TypeStaticArgLic (id, teff) + (* type_exp vs type *) + | (StaticArgType te, ASP_type id) -> + let teff = of_type node_id_solver te in + TypeStaticArgLic (id, teff) + (* ident vs const *) + | (StaticArgIdent idref, ASP_const id) -> + let ceff = node_id_solver.id2const idref sa.src in + ConstStaticArgLic (id, ceff) + (* val_exp vs const *) + | (StaticArgConst ce, ASP_const id) -> ( + let ceff = EvalConst.f node_id_solver ce in + match ceff with + | [ceff] -> ConstStaticArgLic (id,ceff) + | _ -> ConstStaticArgLic (id,Tuple_const_eff ceff) + ) + (* id vs node *) + | (StaticArgIdent idref, ASP_node id) -> + let sargs = [] in + let neff = node_id_solver.id2node idref sargs sa.src in + NodeStaticArgLic (id, neff.node_key_eff) + (* node exp vs node *) + | (StaticArgNode (CALL_n ne), ASP_node id) -> + let neff = of_node node_id_solver ne in + NodeStaticArgLic (id, neff.node_key_eff) + (* node exp vs node *) + | (StaticArgNode (Predef_n (op,sargs)), ASP_node id) -> + (* ICI : campagne de suppression de Lic.PREDEF_CALL: pas de macros ! *) + assert (sargs = []); + let opeff = LicEvalType.make_node_exp_eff node_id_solver None op.it sa.src [] in + NodeStaticArgLic (id, opeff.node_key_eff) + | (_, ASP_type _) -> nature_error "type" + | (_, ASP_const _) -> nature_error "constant" + | (_, ASP_node _) -> nature_error "node" + in res + ) + (******************************************************************************) (* exported *) @@ -295,214 +295,229 @@ and (of_eq: Lic.id_solver -> AstCore.eq_info srcflagged -> Lic.eq_info srcflagge let lpl_eff = List.map (translate_left_part id_solver) lpl and clk_subst,ve_eff = translate_val_exp id_solver UnifyClock.empty_subst ve in - type_check_equation id_solver eq_info.src lpl_eff ve_eff; - clock_check_equation id_solver eq_info.src clk_subst lpl_eff ve_eff; - flagit (lpl_eff, ve_eff) eq_info.src + type_check_equation id_solver eq_info.src lpl_eff ve_eff; + clock_check_equation id_solver eq_info.src clk_subst lpl_eff ve_eff; + flagit (lpl_eff, ve_eff) eq_info.src and (translate_left_part : id_solver -> AstCore.left_part -> Lic.left) = fun id_solver lp_top -> match lp_top with | LeftVar id -> - let vi_eff = - id_solver.id2var (Ident.idref_of_string (Ident.to_string id.it)) id.src - in - LeftVarLic (vi_eff, id.src) - + let vi_eff = + id_solver.id2var (Ident.idref_of_string (Ident.to_string id.it)) id.src + in + LeftVarLic (vi_eff, id.src) + | LeftField (lp, id) -> ( - let lp_eff = translate_left_part id_solver lp in - let teff = Lic.type_of_left lp_eff in - (* check that [lp_eff] is a struct that have a field named [id] *) - match teff with - | Struct_type_eff(_, fl) -> ( - try let (teff_field,_) = List.assoc id.it fl in - LeftFieldLic(lp_eff, id.it, teff_field) - with Not_found -> - raise (Compile_error(id.src, "bad field name in structure")) - ) - | _ -> raise (Compile_error(id.src, "a structure was expected")) - ) + let lp_eff = translate_left_part id_solver lp in + let teff = Lic.type_of_left lp_eff in + (* check that [lp_eff] is a struct that have a field named [id] *) + match teff with + | Struct_type_eff(_, fl) -> ( + try let (teff_field,_) = List.assoc id.it fl in + LeftFieldLic(lp_eff, id.it, teff_field) + with Not_found -> + raise (Compile_error(id.src, "bad field name in structure")) + ) + | _ -> raise (Compile_error(id.src, "a structure was expected")) + ) | LeftArray (lp, vef) -> ( - let lp_eff = translate_left_part id_solver lp in - let teff = Lic.type_of_left lp_eff in - let lxm = vef.src in - match teff with - | Abstract_type_eff(_,Array_type_eff(teff_elt, size)) - | Array_type_eff(teff_elt, size) -> - let index = EvalConst.eval_array_index id_solver vef.it lxm in - LeftArrayLic(lp_eff, index, teff_elt) - - | _ -> raise (Compile_error(vef.src, "an array was expected")) - ) + let lp_eff = translate_left_part id_solver lp in + let teff = Lic.type_of_left lp_eff in + let lxm = vef.src in + match teff with + | Abstract_type_eff(_,Array_type_eff(teff_elt, size)) + | Array_type_eff(teff_elt, size) -> + let index = EvalConst.eval_array_index id_solver vef.it lxm in + LeftArrayLic(lp_eff, index, teff_elt) + + | _ -> raise (Compile_error(vef.src, "an array was expected")) + ) | LeftSlice (lp, sif) -> ( - let lp_eff = translate_left_part id_solver lp in - let teff = Lic.type_of_left lp_eff in - match teff with - | Abstract_type_eff(_,Array_type_eff(teff_elt, size)) - | Array_type_eff(teff_elt, size) -> - let sieff = translate_slice_info id_solver sif.it sif.src in - let size_slice = sieff.se_width in - let teff_slice = Array_type_eff(teff_elt, size_slice) in - LeftSliceLic(lp_eff, sieff, teff_slice) - | _ -> raise (Compile_error(sif.src, "an array was expected")) - ) - - -and (translate_val_exp : Lic.id_solver -> UnifyClock.subst -> - AstCore.val_exp -> UnifyClock.subst * Lic.val_exp) = + let lp_eff = translate_left_part id_solver lp in + let teff = Lic.type_of_left lp_eff in + match teff with + | Abstract_type_eff(_,Array_type_eff(teff_elt, size)) + | Array_type_eff(teff_elt, size) -> + let sieff = translate_slice_info id_solver sif.it sif.src in + let size_slice = sieff.se_width in + let teff_slice = Array_type_eff(teff_elt, size_slice) in + LeftSliceLic(lp_eff, sieff, teff_slice) + | _ -> raise (Compile_error(sif.src, "an array was expected")) + ) + + +and (translate_val_exp : Lic.id_solver -> UnifyClock.subst -> AstCore.val_exp + -> UnifyClock.subst * Lic.val_exp) = fun id_solver s ve -> let s, vef_core, lxm = match ve with - | CallByName(by_name_op, field_list) -> - let s,fl = List.fold_left - (fun (s,fl) f -> - let s,f = translate_field id_solver s f in - s,f::fl + | MERGE_n(ve, cl) -> + let lxm_ve = ve.src in + let s, ve = translate_val_exp id_solver s ve.it in + let s, cl = + List.fold_left + (fun (s,cl) (id,ve) -> + let s, ve = translate_val_exp id_solver s ve in + let long = Ident.long_of_idref id.it in + s,(flagit long id.src, ve)::cl ) - (s,[]) - field_list - in - let fl = List.rev fl in - s, - (CallByNameLic( - flagit (translate_by_name_op id_solver by_name_op) by_name_op.src, fl)), - by_name_op.src - + (s, []) + cl + in + s, Lic.Merge(flagit ve lxm_ve, List.rev cl), lxm_ve + | CallByName(by_name_op, field_list) -> + let s,fl = List.fold_left + (fun (s,fl) f -> + let s,f = translate_field id_solver s f in + s,f::fl + ) + (s,[]) + field_list + in + let fl = List.rev fl in + let s, by_name_op = translate_by_name_op id_solver by_name_op s in + s, + (CallByNameLic(by_name_op, fl)), by_name_op.src + | CallByPos(by_pos_op, Oper vel) -> - let s, vel_eff = - List.fold_left - (fun (s,vel) ve -> - let s, ve = translate_val_exp id_solver s ve in - s,ve::vel - ) - (s,[]) vel - in - let vel_eff = List.rev vel_eff in - let lxm = by_pos_op.src in - let by_pos_op = by_pos_op.it in - let mk_by_pos_op by_pos_op_eff = - CallByPosLic(flagit by_pos_op_eff lxm, OperLic vel_eff) - in - let s, vef_core = - match by_pos_op with - (* put that in another module ? yes, see above.*) - | Predef_n(op, sargs) -> ( - (* 12/07 SOLUTION INTERMEDIAIRE - - les macros predefs ne sont plus traitées ici - on les transforme en CALL standard - N.B. on garde pour l'instant la notion de - PREDEF_CALL pour les op simple, mais à terme - ça devrait disparaitre aussi ... + let s, vel_eff = + List.fold_left + (fun (s,vel) ve -> + let s, ve = translate_val_exp id_solver s ve in + s,ve::vel + ) + (s,[]) vel + in + let vel_eff = List.rev vel_eff in + let lxm = by_pos_op.src in + let by_pos_op = by_pos_op.it in + let mk_by_pos_op by_pos_op_eff = + CallByPosLic(flagit by_pos_op_eff lxm, OperLic vel_eff) + in + let s, vef_core = + match by_pos_op with + (* put that in another module ? yes, see above.*) + | Predef_n(op, sargs) -> ( + (* 12/07 SOLUTION INTERMEDIAIRE + - les macros predefs ne sont plus traitées ici + on les transforme en CALL standard + N.B. on garde pour l'instant la notion de + PREDEF_CALL pour les op simple, mais à terme + ça devrait disparaitre aussi ... + *) + match sargs with + | [] -> s, mk_by_pos_op(PREDEF_CALL (op.it,[])) + | _ -> + (* on re-construit une AstCore.node_exp srcflagged + parce que c'est ca qu'attend of_node ... *) - match sargs with - | [] -> s, mk_by_pos_op(PREDEF_CALL (op.it,[])) - | _ -> - (* on re-construit une AstCore.node_exp srcflagged - parce que c'est ca qu'attend of_node ... - *) - let node_exp_f = flagit (AstPredef.op_to_idref op.it, sargs) op.src in - let neff = of_node id_solver node_exp_f in - let ceff = Lic.CALL (flagit neff.node_key_eff node_exp_f.src) in - Verbose.exe ~flag:dbg (fun () -> - Printf.fprintf stderr "#DBG: Ast2lic.translate_val_exp CALL '%!"; - AstV6Dump.print_node_exp stderr node_exp_f.it; - Printf.fprintf stderr " gives type: %s\n%!" - (Lic.string_of_type_profile (profile_of_node_exp neff)) - ) ; - (s, mk_by_pos_op ceff) - ) - | CALL_n node_exp_f -> + let node_exp_f = flagit (AstPredef.op_to_idref op.it, sargs) op.src in let neff = of_node id_solver node_exp_f in let ceff = Lic.CALL (flagit neff.node_key_eff node_exp_f.src) in Verbose.exe ~flag:dbg (fun () -> - Printf.fprintf stderr "#DBG: Ast2lic.translate_val_exp CALL_n "; - AstV6Dump.print_node_exp stderr node_exp_f.it; - Printf.fprintf stderr " gives type: %s\n%!" - (Lic.string_of_type_profile (profile_of_node_exp neff)) + Printf.fprintf stderr "#DBG: Ast2lic.translate_val_exp CALL '%!"; + AstV6Dump.print_node_exp stderr node_exp_f.it; + Printf.fprintf stderr " gives type: %s\n%!" + (Lic.string_of_type_profile (profile_of_node_exp neff)) ) ; (s, mk_by_pos_op ceff) - | IDENT_n idref -> ( - try - let var = id_solver.id2var idref lxm in - s, mk_by_pos_op(Lic.VAR_REF var.var_name_eff) - with _ -> - let s, const = UnifyClock.const_to_val_eff lxm false s - (id_solver.id2const idref lxm) - in - s, const.ve_core - ) - | CURRENT_n -> s, mk_by_pos_op Lic.CURRENT - | PRE_n -> s, mk_by_pos_op Lic.PRE - - | ARROW_n -> s, mk_by_pos_op Lic.ARROW - | FBY_n -> s, mk_by_pos_op Lic.FBY - | CONCAT_n -> s, mk_by_pos_op Lic.CONCAT - | TUPLE_n -> s, mk_by_pos_op Lic.TUPLE - | ARRAY_n -> - s, CallByPosLic(flagit (Lic.ARRAY vel_eff) lxm, OperLic []) - - | WITH_n(c,e1,e2) -> - let c_eff = EvalConst.f id_solver c in - if c_eff = [ Bool_const_eff true ] then - let s, ve1 = translate_val_exp id_solver s e1 in - s, mk_by_pos_op (Lic.WITH (ve1)) - else - let s, ve2 = translate_val_exp id_solver s e2 in - s, mk_by_pos_op (Lic.WITH (ve2)) - | STRUCT_ACCESS_n fid -> - s, mk_by_pos_op (Lic.STRUCT_ACCESS (fid)) - - | WHEN_n Base -> s, mk_by_pos_op (Lic.WHEN Base) - | WHEN_n (NamedClock { it = (cc,cv) ; src = lxm }) -> - let cc = add_pack_name id_solver lxm cc in - s, - mk_by_pos_op (Lic.WHEN (NamedClock { it = (cc,cv) ; src = lxm })) - - | ARRAY_ACCES_n ve_index -> - s, mk_by_pos_op ( - Lic.ARRAY_ACCES( - EvalConst.eval_array_index id_solver ve_index lxm)) - - | ARRAY_SLICE_n si -> - s, mk_by_pos_op - (Lic.ARRAY_SLICE( - EvalConst.eval_array_slice id_solver si lxm)) - - | HAT_n -> ( - match vel with - | [exp; ve_size] -> - let size_const_eff = EvalConst.f id_solver ve_size - and s, exp_eff = translate_val_exp id_solver s exp in - (match size_const_eff with - | [Int_const_eff size] -> - s, mk_by_pos_op (Lic.HAT(size, exp_eff)) - | _ -> assert false) - | _ -> assert false - ) - - | MERGE_n(id, idl) -> s, mk_by_pos_op (Lic.MERGE(id, idl)) - in - s, vef_core, lxm + ) + | CALL_n node_exp_f -> + let neff = of_node id_solver node_exp_f in + let ceff = Lic.CALL (flagit neff.node_key_eff node_exp_f.src) in + Verbose.exe ~flag:dbg (fun () -> + Printf.fprintf stderr "#DBG: Ast2lic.translate_val_exp CALL_n "; + AstV6Dump.print_node_exp stderr node_exp_f.it; + Printf.fprintf stderr " gives type: %s\n%!" + (Lic.string_of_type_profile (profile_of_node_exp neff)) + ) ; + (s, mk_by_pos_op ceff) + | IDENT_n idref -> ( + try + let var = id_solver.id2var idref lxm in + s, mk_by_pos_op(Lic.VAR_REF var.var_name_eff) + with _ -> + let s, const = UnifyClock.const_to_val_eff lxm false s + (id_solver.id2const idref lxm) + in + s, const.ve_core + ) + | CURRENT_n -> s, mk_by_pos_op Lic.CURRENT + | PRE_n -> s, mk_by_pos_op Lic.PRE + + | ARROW_n -> s, mk_by_pos_op Lic.ARROW + | FBY_n -> s, mk_by_pos_op Lic.FBY + | CONCAT_n -> s, mk_by_pos_op Lic.CONCAT + | TUPLE_n -> s, mk_by_pos_op Lic.TUPLE + | ARRAY_n -> + s, CallByPosLic(flagit (Lic.ARRAY vel_eff) lxm, OperLic []) + + | WITH_n(c,e1,e2) -> + let c_eff = EvalConst.f id_solver c in + if c_eff = [ Bool_const_eff true ] then + let s, ve1 = translate_val_exp id_solver s e1 in + s, mk_by_pos_op (Lic.WITH (ve1)) + else + let s, ve2 = translate_val_exp id_solver s e2 in + s, mk_by_pos_op (Lic.WITH (ve2)) + | STRUCT_ACCESS_n fid -> + s, mk_by_pos_op (Lic.STRUCT_ACCESS (fid)) + + | WHEN_n Base -> s, mk_by_pos_op (Lic.WHEN Base) + | WHEN_n (NamedClock { it = (cc,cv) ; src = lxm }) -> + let cc = add_pack_name id_solver lxm cc in + s, + mk_by_pos_op (Lic.WHEN (NamedClock { it = (cc,cv) ; src = lxm })) + + | ARRAY_ACCES_n ve_index -> + s, mk_by_pos_op ( + Lic.ARRAY_ACCES( + EvalConst.eval_array_index id_solver ve_index lxm)) + + | ARRAY_SLICE_n si -> + s, mk_by_pos_op + (Lic.ARRAY_SLICE( + EvalConst.eval_array_slice id_solver si lxm)) + + | HAT_n -> ( + match vel with + | [exp; ve_size] -> + let size_const_eff = EvalConst.f id_solver ve_size + and s, exp_eff = translate_val_exp id_solver s exp in + (match size_const_eff with + | [Int_const_eff size] -> + s, mk_by_pos_op (Lic.HAT(size, exp_eff)) + | _ -> assert false) + | _ -> assert false + ) + + in + s, vef_core, lxm in let vef, tl = EvalType.f id_solver { ve_core=vef_core; ve_typ=[]; ve_clk = [] } in let vef, _, s = EvalClock.f lxm id_solver s vef [] in - s, vef + s, vef -and translate_by_name_op id_solver op = - match op.it with - | STRUCT_anonymous_n -> STRUCT_anonymous - | STRUCT_n idref -> +and translate_by_name_op id_solver op s = + let s, nop = + match op.it with + | STRUCT_anonymous_n -> s,STRUCT_anonymous + | STRUCT_n idref -> match Ident.pack_of_idref idref with | None -> - (* If no pack name is provided, we lookup it in the symbol table *) - let id = Ident.of_idref idref in - let pn = AstTabSymbol.find_pack_of_type id_solver.global_symbols id op.src in - STRUCT (pn, idref) - | Some pn -> STRUCT (pn, idref) + (* If no pack name is provided, we lookup it in the symbol table *) + let id = Ident.of_idref idref in + let pn = AstTabSymbol.find_pack_of_type id_solver.global_symbols id op.src in + s, STRUCT (pn, idref) + | Some pn -> s,STRUCT (pn, idref) + in + s, flagit nop op.src and translate_field id_solver s (id, ve) = let s, ve = translate_val_exp id_solver s ve in - s, (id, ve) + s, (id, ve) (* XXX autre nom, autre module ? node_of_static_arg : appelé QUAND ON SAIT qu'un sarg doit etre un NODE @@ -516,10 +531,10 @@ and const_of_static_arg id_solver const_or_const_ident lxm = match const_or_const_ident with | StaticArgConst(c) -> ( match EvalConst.f id_solver c with - | [x] -> x - | xl -> - (* EvalConst.f ne fabrique PAS de tuple, on le fait ici *) - Tuple_const_eff xl + | [x] -> x + | xl -> + (* EvalConst.f ne fabrique PAS de tuple, on le fait ici *) + Tuple_const_eff xl ) | StaticArgIdent(id) -> id_solver.id2const id lxm | StaticArgType _ @@ -530,12 +545,12 @@ and const_of_static_arg id_solver const_or_const_ident lxm = and node_of_static_arg id_solver node_or_node_ident lxm = match node_or_node_ident with | StaticArgIdent(id) -> - let sargs = [] in (* it is an alias: no static arg *) - id_solver.id2node id sargs lxm + let sargs = [] in (* it is an alias: no static arg *) + id_solver.id2node id sargs lxm | StaticArgNode(CALL_n ne) -> of_node id_solver ne | StaticArgNode(Predef_n (op,[])) -> - LicEvalType.make_node_exp_eff id_solver None op.it lxm [] + LicEvalType.make_node_exp_eff id_solver None op.it lxm [] | StaticArgNode(Predef_n (op,_)) -> assert false | StaticArgNode(_) -> assert false @@ -544,7 +559,7 @@ and node_of_static_arg id_solver node_or_node_ident lxm = | StaticArgConst _ -> raise (Compile_error(lxm, "a node was expected")) and (translate_slice_info : Lic.id_solver -> AstCore.slice_info -> - Lxm.t -> Lic.slice_info) = + Lxm.t -> Lic.slice_info) = fun id_solver si lxm -> EvalConst.eval_array_slice id_solver si lxm diff --git a/src/astCore.ml b/src/astCore.ml index ed1758fa..ba0fefab 100644 --- a/src/astCore.ml +++ b/src/astCore.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 21/12/2012 (at 10:06) by Erwan Jahier> *) +(* Time-stamp: <modified the 30/01/2013 (at 17:43) by Erwan Jahier> *) (** (Raw) Abstract syntax tree of source Lustre Core programs. *) @@ -108,8 +108,8 @@ and by_pos_op = | ARRAY_ACCES_n of val_exp | ARRAY_SLICE_n of slice_info - | MERGE_n of (Ident.t * (Ident.t list)) - +(* | MERGE_n of (Ident.t * ((Ident.t srcflagged * val_exp) list)) *) + (************************************************) (* Info associées aux expressions *) @@ -126,9 +126,10 @@ and by_pos_op = and val_exp = | CallByPos of (by_pos_op srcflagged * operands) | CallByName of (by_name_op srcflagged * (Ident.t srcflagged * val_exp) list) + | MERGE_n of val_exp srcflagged * (Ident.idref srcflagged * val_exp) list and operands = Oper of val_exp list -(* XXX virer cet Oper ? *) +(* Virer cet Oper ? Non, sinon ca boucle... *) and by_name_op = | STRUCT_n of Ident.idref diff --git a/src/astRecognizePredef.ml b/src/astRecognizePredef.ml index 11035d54..a9d64294 100644 --- a/src/astRecognizePredef.ml +++ b/src/astRecognizePredef.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 13/12/2012 (at 11:32) by Erwan Jahier> *) +(* Time-stamp: <modified the 30/01/2013 (at 17:51) by Erwan Jahier> *) let (get_predef : Ident.idref -> AstPredef.op option) = @@ -111,9 +111,13 @@ and r_slice_info si = { and r_val_exp = function | CallByPos (by_pos_op, Oper vel) -> - CallByPos(flag2 r_by_pos_op by_pos_op, Oper (List.map r_val_exp vel)) + CallByPos(flag2 r_by_pos_op by_pos_op, Oper (List.map r_val_exp vel)) | CallByName(by_name_op, args) -> - CallByName(by_name_op, List.map (fun (id, ve) -> id, r_val_exp ve) args) + CallByName(by_name_op, List.map (fun (id, ve) -> id, r_val_exp ve) args) + | MERGE_n (ec,cl) -> + let ec = flagit (r_val_exp ec.it) ec.src in + let cl = List.map (fun (id,ve) -> (id, r_val_exp ve)) cl in + MERGE_n (ec,cl) and r_item_info_flg_list = function | None -> None diff --git a/src/astV6Dump.ml b/src/astV6Dump.ml index 456fbe00..bcac4623 100644 --- a/src/astV6Dump.ml +++ b/src/astV6Dump.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 13/12/2012 (at 11:32) by Erwan Jahier> *) +(* Time-stamp: <modified the 30/01/2013 (at 17:46) by Erwan Jahier> *) open Lxm @@ -13,28 +13,28 @@ open Format let rec (op2string : AstCore.by_pos_op -> string) = fun op -> - match op with + match op with (* unaires *) - | Predef_n(op,sargs) -> (AstPredef.op2string op.it) ^ - (if sargs = [] then "" else - "<<" ^ (String.concat ", " (List.map static_arg_to_string sargs)) ^ ">>") - | (CALL_n ne) -> string_of_node_exp ne.it - | (PRE_n ) -> "pre" - | (CURRENT_n) -> "current" - (* binaires *) - | (ARROW_n ) -> "->" - | (WHEN_n _ce) -> "when" - | (HAT_n ) -> "^" - | (CONCAT_n ) -> "|" - | (IDENT_n idref) -> Ident.string_of_idref idref - | (FBY_n ) -> "fby" - | (WITH_n(_,_,_)) -> "with" - | (TUPLE_n ) -> assert false - | (ARRAY_n ) -> assert false - | (ARRAY_ACCES_n _ ) -> assert false - | (ARRAY_SLICE_n sl) -> assert false - | (STRUCT_ACCESS_n fld) -> assert false - | (MERGE_n _) -> assert false + | Predef_n(op,sargs) -> (AstPredef.op2string op.it) ^ + (if sargs = [] then "" else + "<<" ^ (String.concat ", " (List.map static_arg_to_string sargs)) ^ ">>") + | (CALL_n ne) -> string_of_node_exp ne.it + | (PRE_n ) -> "pre" + | (CURRENT_n) -> "current" + (* binaires *) + | (ARROW_n ) -> "->" + | (WHEN_n _ce) -> "when" + | (HAT_n ) -> "^" + | (CONCAT_n ) -> "|" + | (IDENT_n idref) -> Ident.string_of_idref idref + | (FBY_n ) -> "fby" + | (WITH_n(_,_,_)) -> "with" + | (TUPLE_n ) -> assert false + | (ARRAY_n ) -> assert false + | (ARRAY_ACCES_n _ ) -> assert false + | (ARRAY_SLICE_n sl) -> assert false + | (STRUCT_ACCESS_n fld) -> assert false +(* | (MERGE_n _) -> assert false *) (***********************************************************************************) @@ -43,10 +43,10 @@ and packbody (os: Format.formatter) (pkg: AstV6.packbody) = let dump_def (d: item_ident) = try ( (match d with - | ConstItem id -> dump_const os (Hashtbl.find pkg.pk_const_table id) - | TypeItem id -> dump_type os (Hashtbl.find pkg.pk_type_table id) - | NodeItem (id,sparams) -> - let {src = lxm ; it = ninfo } = Hashtbl.find pkg.pk_node_table id in + | ConstItem id -> dump_const os (Hashtbl.find pkg.pk_const_table id) + | TypeItem id -> dump_type os (Hashtbl.find pkg.pk_type_table id) + | NodeItem (id,sparams) -> + let {src = lxm ; it = ninfo } = Hashtbl.find pkg.pk_node_table id in dump_node os {src = lxm ; it = ninfo }; fprintf os " <<@\n" ; fprintf os "@[<b 3>@ %a@]@\n" dump_static_param_list sparams; @@ -56,80 +56,80 @@ and packbody (os: Format.formatter) (pkg: AstV6.packbody) = ) with Not_found -> print_string ("*** unable to find a definition for " ^ - (match d with - ConstItem id - | TypeItem id - | NodeItem (id,_) -> Ident.to_string id - ) - ); + (match d with + ConstItem id + | TypeItem id + | NodeItem (id,_) -> Ident.to_string id + ) + ); flush stdout; assert false in - (* Format.fprintf os "@?@[<b 0>" ; *) - List.iter dump_def pkg.pk_def_list ; - (* Format.fprintf os "@]@." *) + (* Format.fprintf os "@?@[<b 0>" ; *) + List.iter dump_def pkg.pk_def_list ; +(* Format.fprintf os "@]@." *) (*******************************) (* dump d'une def de constante *) (*******************************) and dump_const (os: Format.formatter) (x: const_info srcflagged) = ( let lxm = x.src and info = x.it in - fprintf os "-- %s@\n" (Lxm.details lxm) ; - fprintf os "const %s " (Lxm.str lxm) ; - dump_const_def os info ; - fprintf os " ;@\n" ; + fprintf os "-- %s@\n" (Lxm.details lxm) ; + fprintf os "const %s " (Lxm.str lxm) ; + dump_const_def os info ; + fprintf os " ;@\n" ; ) and dump_const_def (os: Format.formatter) (info: const_info) = ( match info with | ExternalConst (id, ty,None) -> fprintf os ": %a " dump_type_exp ty | ExternalConst (id, ty, Some v) -> - fprintf os ": %a = %a" dump_type_exp ty dump_val_exp v + fprintf os ": %a = %a" dump_type_exp ty dump_val_exp v | DefinedConst (id, None, exp) -> fprintf os "= %a " dump_val_exp exp | DefinedConst (id, Some ty, exp) -> - fprintf os ": %a = %a " dump_type_exp ty dump_val_exp exp + fprintf os ": %a = %a " dump_type_exp ty dump_val_exp exp | EnumConst (id, ty) -> fprintf os "XXX printme!" ) - (**************************) - (* dump d'une def de type *) - (**************************) +(**************************) +(* dump d'une def de type *) +(**************************) and dump_type (os: Format.formatter) (x: type_info srcflagged) = ( let lxm = x.src and info = x.it in let id = Lxm.str lxm in - fprintf os "-- %s@\n" (Lxm.details lxm) ; - fprintf os "type %s " id ; - dump_type_def os info ; - fprintf os " ;@\n" ; + fprintf os "-- %s@\n" (Lxm.details lxm) ; + fprintf os "type %s " id ; + dump_type_def os info ; + fprintf os " ;@\n" ; ) and dump_type_def (os: Format.formatter) (info: type_info ) = ( match info with | ExternalType id -> () | AliasedType (id, te) -> fprintf os "= %a" dump_type_exp te | EnumType (id, clist) -> - (* fprintf os "= enum {@[<b 3>@,%a@,@]}" dump_id_list clist *) - fprintf os "= enum { %a}" dump_id_list clist - + (* fprintf os "= enum {@[<b 3>@,%a@,@]}" dump_id_list clist *) + fprintf os "= enum { %a}" dump_id_list clist + | StructType {st_name = id; st_flist = fl; st_ftable = ft} -> - let filst = List.map (function id -> (Hashtbl.find ft id).it) fl in - fprintf os "= struct {@\n@[<b 3> %a@]@\n}" - dump_field_list filst + let filst = List.map (function id -> (Hashtbl.find ft id).it) fl in + fprintf os "= struct {@\n@[<b 3> %a@]@\n}" + dump_field_list filst | ArrayType (id, texp, vexp) -> - fprintf os " = %a" dump_type_exp texp; - fprintf os "^%a" dump_val_exp vexp; - + fprintf os " = %a" dump_type_exp texp; + fprintf os "^%a" dump_val_exp vexp; + ) - (****************************) - (* dump d'une liste de noms *) - (****************************) +(****************************) +(* dump d'une liste de noms *) +(****************************) and dump_id_list (os : formatter) (idlst : Ident.t srcflagged list) = ( match idlst with [] -> () | h::[] -> ( fprintf os "%s" (Ident.to_string h.it)) | h::t -> ( fprintf os "%s, %a" (Ident.to_string h.it) dump_id_list t) ) - (*****************************) - (* dump d'une liste de field *) - (*****************************) +(*****************************) +(* dump d'une liste de field *) +(*****************************) and dump_field_list (os: Format.formatter) (filst: field_info list) = ( match filst with [] -> () @@ -139,20 +139,20 @@ and dump_field_list (os: Format.formatter) (filst: field_info list) = ( and dump_field (os: Format.formatter) (finfo: field_info) = ( match finfo with {fd_name=id; fd_type=ty; fd_value=None} -> ( - fprintf os "%s : %a" (Ident.to_string id) dump_type_exp ty + fprintf os "%s : %a" (Ident.to_string id) dump_type_exp ty ) | - {fd_name=id; fd_type=ty; fd_value=Some ex} -> ( - fprintf os "%s : %a = %a" (Ident.to_string id) - dump_type_exp ty dump_val_exp ex - ) + {fd_name=id; fd_type=ty; fd_value=Some ex} -> ( + fprintf os "%s : %a = %a" (Ident.to_string id) + dump_type_exp ty dump_val_exp ex + ) ) and dump_param_list (os: Format.formatter) - (plst: (Ident.t option * type_exp) list) = + (plst: (Ident.t option * type_exp) list) = ( match plst with - [] -> () + [] -> () | h::[] -> ( fprintf os "%a" dump_param h ) | h::t -> ( fprintf os "%a; %a" dump_param h dump_param_list t) ) @@ -161,97 +161,97 @@ and dump_param (os: Format.formatter) (p: (Ident.t option * type_exp)) = ( (None, ty) -> (fprintf os "%a" dump_type_exp ty) | (Some id, ty) -> (fprintf os "%s : %a" (Ident.to_string id) dump_type_exp ty) ) - (**************************) - (* dump d'une eq. de node *) - (**************************) +(**************************) +(* dump d'une eq. de node *) +(**************************) and dump_item_info_list (os: Format.formatter) - (lst: item_info srcflagged list) = + (lst: item_info srcflagged list) = ( match lst with - [] -> () + [] -> () | h::[] -> dump_item_info os h | h::t -> fprintf os "%a;@\n%a" dump_item_info h dump_item_info_list t ) and dump_item_info (os: Format.formatter) - (ie: item_info srcflagged) = ( - match ie.it with - | ConstInfo ci -> dump_const os (Lxm.flagit ci ie.src) - | TypeInfo ti -> dump_type os (Lxm.flagit ti ie.src) - | NodeInfo ni -> dump_node os (Lxm.flagit ni ie.src) - ) + (ie: item_info srcflagged) = ( + match ie.it with + | ConstInfo ci -> dump_const os (Lxm.flagit ci ie.src) + | TypeInfo ti -> dump_type os (Lxm.flagit ti ie.src) + | NodeInfo ni -> dump_node os (Lxm.flagit ni ie.src) +) and dump_static_param_list (os: Format.formatter) - (lst: static_param srcflagged list) = + (lst: static_param srcflagged list) = ( match lst with - [] -> () + [] -> () | h::[] -> dump_static_param os h | h::t -> fprintf os "%a;@\n%a" dump_static_param h dump_static_param_list t ) and dump_static_param (os: Format.formatter) - (sp: static_param srcflagged) = + (sp: static_param srcflagged) = ( match sp.it with | StaticParamType id -> fprintf os "type %s" (Ident.to_string id) | StaticParamConst (id, exp) -> fprintf os "const %s : %a" - (Ident.to_string id) dump_type_exp exp + (Ident.to_string id) dump_type_exp exp | StaticParamNode (id, ins, outs, has_mem) -> ( - fprintf os "%s %s(@,%a@,)returns(@,%a@,)" - (if has_mem then "node" else "function") - (Ident.to_string id) - dump_line_var_decl_list ins dump_line_var_decl_list outs - ) + fprintf os "%s %s(@,%a@,)returns(@,%a@,)" + (if has_mem then "node" else "function") + (Ident.to_string id) + dump_line_var_decl_list ins dump_line_var_decl_list outs + ) ) - (**************************) - (* dump d'une def de node *) - (**************************) +(**************************) +(* dump d'une def de node *) +(**************************) and dump_node (os: Format.formatter) (x: node_info srcflagged) = ( let lxm = x.src and ninfo = x.it in - fprintf os "-- %s" (Lxm.details lxm) ; - fprintf os " (node definition)@\n" ; - fprintf os "node %s" (Ident.to_string ninfo.name); - fprintf os " <<@\n" ; - fprintf os "@[<b 3>@ %a@]@\n" dump_static_param_list ninfo.static_params; - fprintf os ">>\n"; - (match ninfo.vars with - | None -> () - | Some { - inlist = inlist; - outlist = outlist; - loclist = loclist_opt; - vartable = vartab; - } -> - let get_info (id: Ident.t) = (Hashtbl.find vartab id).it in - let inlst = List.map get_info inlist in - let outlst = List.map get_info outlist in - fprintf os "(@\n" ; - fprintf os "@[<b 3>@ %a@]@\n" dump_var_decl_list inlst ; - fprintf os ") returns (@\n" ; - fprintf os "@[<b 3>@ %a@]@\n" dump_var_decl_list outlst ; - fprintf os ");@\n" ; - match loclist_opt with - | None -> () - | Some loclist -> - let loclst = List.map get_info loclist in + fprintf os "-- %s" (Lxm.details lxm) ; + fprintf os " (node definition)@\n" ; + fprintf os "node %s" (Ident.to_string ninfo.name); + fprintf os " <<@\n" ; + fprintf os "@[<b 3>@ %a@]@\n" dump_static_param_list ninfo.static_params; + fprintf os ">>\n"; + (match ninfo.vars with + | None -> () + | Some { + inlist = inlist; + outlist = outlist; + loclist = loclist_opt; + vartable = vartab; + } -> + let get_info (id: Ident.t) = (Hashtbl.find vartab id).it in + let inlst = List.map get_info inlist in + let outlst = List.map get_info outlist in + fprintf os "(@\n" ; + fprintf os "@[<b 3>@ %a@]@\n" dump_var_decl_list inlst ; + fprintf os ") returns (@\n" ; + fprintf os "@[<b 3>@ %a@]@\n" dump_var_decl_list outlst ; + fprintf os ");@\n" ; + match loclist_opt with + | None -> () + | Some loclist -> + let loclst = List.map get_info loclist in fprintf os "var@\n"; fprintf os "@[<b 3> %a;@]@\n" dump_var_decl_list loclst; - ); - - (match ninfo.def with - | Extern -> fprintf os "extern" - | Abstract -> fprintf os "abstract" - | Body body -> dump_node_body os body - | Alias {it = nexp; src = lxm} -> assert false -(* fprintf os " = @,%a;@\n" dump_by_pos_exp nexp *) + ); + + (match ninfo.def with + | Extern -> fprintf os "extern" + | Abstract -> fprintf os "abstract" + | Body body -> dump_node_body os body + | Alias {it = nexp; src = lxm} -> assert false + (* fprintf os " = @,%a;@\n" dump_by_pos_exp nexp *) - ); - if ninfo.has_mem then () else (); - if ninfo.is_safe then () else (); + ); + if ninfo.has_mem then () else (); + if ninfo.is_safe then () else (); ) @@ -263,14 +263,14 @@ and dump_node_body (os: Format.formatter) (nbody: node_body) = ( dump_eq_list os nbody.eqs ; fprintf os "@]@\ntel" ; ) - (* déclarations sur plusieurs lignes, indentées ... *) +(* déclarations sur plusieurs lignes, indentées ... *) and dump_var_decl_list (os: Format.formatter) (lst: var_info list) = ( match lst with [] -> () | h::[] -> ( fprintf os "%a" dump_var_decl h ) | h::t -> ( fprintf os "%a;@\n%a" dump_var_decl h dump_var_decl_list t ) ) - (* déclarations sur une ligne AVEC SOURCE ... *) +(* déclarations sur une ligne AVEC SOURCE ... *) and dump_line_var_decl_list (os: Format.formatter) (lst: var_info srcflagged list) = ( match lst with [] -> () @@ -281,21 +281,21 @@ and dump_var_decl (os: Format.formatter) (vinfo: var_info ) = ( fprintf os "%s : %a" (Ident.to_string vinfo.var_name) dump_type_exp vinfo.var_type ; ( match vinfo.var_clock with - Base -> () + Base -> () | NamedClock({it=cc,id;src=lxm}) -> - let cc_str = Ident.string_of_idref cc in - let id_str = Ident.to_string id in - let clk_str = - if cc_str = "True" then id_str - else if cc_str = "False" then ("not " ^ id_str) - else (cc_str ^ "(" ^ id_str ^ ")") - in - (fprintf os " when %s" ) clk_str + let cc_str = Ident.string_of_idref cc in + let id_str = Ident.to_string id in + let clk_str = + if cc_str = "True" then id_str + else if cc_str = "False" then ("not " ^ id_str) + else (cc_str ^ "(" ^ id_str ^ ")") + in + (fprintf os " when %s" ) clk_str ) ) - (**************************) - (* dump d'un type immédiat*) - (**************************) +(**************************) +(* dump d'un type immédiat*) +(**************************) and dump_type_exp (os: Format.formatter) (x: type_exp) = ( match x.it with Bool_type_exp -> fprintf os "bool" @@ -303,64 +303,62 @@ and dump_type_exp (os: Format.formatter) (x: type_exp) = ( | Real_type_exp -> fprintf os "real" | Named_type_exp id -> fprintf os "%s" (Ident.string_of_idref id) | Array_type_exp (te, sz) -> ( - dump_type_exp os te ; - fprintf os "^" ; - dump_val_exp os sz - ) + dump_type_exp os te ; + fprintf os "^" ; + dump_val_exp os sz + ) ) - (**************************) - (* dump des assertions *) - (**************************) +(**************************) +(* dump des assertions *) +(**************************) and dump_assert_list (os: Format.formatter) (af: (val_exp srcflagged) list) = ( match af with [] -> () | a :: reste -> ( - Format.fprintf os "@\nassert %a;" dump_val_exp a.it ; - Format.fprintf os "%a" dump_assert_list reste - ) + Format.fprintf os "@\nassert %a;" dump_val_exp a.it ; + Format.fprintf os "%a" dump_assert_list reste + ) ) - (**************************) - (* dump des equations *) - (**************************) +(**************************) +(* dump des equations *) +(**************************) and dump_eq_list (os: Format.formatter) (eqfs: (eq_info srcflagged) list) = ( match eqfs with [] -> () | {it=(lflst,exp); src=lxm} :: reste -> ( - Format.fprintf os "@\n%a = %a;%a" - dump_left_part_list lflst - dump_val_exp exp - dump_eq_list reste - ) + Format.fprintf os "@\n%a = %a;%a" + dump_left_part_list lflst + dump_val_exp exp + dump_eq_list reste + ) ) and dump_left_part_list (os: Format.formatter) (lfts: left_part list) = ( match lfts with - l::[] -> dump_left_part os l + l::[] -> dump_left_part os l | l::reste -> fprintf os "%a,@,%a" dump_left_part l dump_left_part_list reste | _ -> assert false - + ) and dump_left_part (os: Format.formatter) (lft: left_part) = ( match lft with - LeftVar idflg -> fprintf os "%s" (Ident.to_string idflg.it) + LeftVar idflg -> fprintf os "%s" (Ident.to_string idflg.it) | LeftField (l, idflg) -> fprintf os "%a.%s" dump_left_part l (Ident.to_string idflg.it) | LeftArray (l, expflg) -> - fprintf os "%a[@,%a@,]" dump_left_part l dump_val_exp expflg.it + fprintf os "%a[@,%a@,]" dump_left_part l dump_val_exp expflg.it | LeftSlice (l, slcflg) -> - fprintf os "%a[@,%a@,]" dump_left_part l dump_slice_info slcflg.it + fprintf os "%a[@,%a@,]" dump_left_part l dump_slice_info slcflg.it ) - (**************************) - (* dump d'une expression *) - (**************************) +(**************************) +(* dump d'une expression *) +(**************************) and dump_val_exp (os: Format.formatter) (x: val_exp) = ( match x with - CallByPos ( {it=oper; src=lxm} , pars ) -> ( - dump_by_pos_exp os oper pars - ) | - CallByName ( {it=oper; src=lxm}, nm_pars ) -> ( - dump_by_name_exp os oper nm_pars - ) + | CallByPos ( {it=oper; src=lxm} , pars ) -> dump_by_pos_exp os oper pars + | CallByName ({it=oper; src=lxm},nm_pars) -> dump_by_name_exp os oper nm_pars + | MERGE_n (ve, _) -> (* finish me *) + fprintf os "merge %a (...) " dump_val_exp ve.it ) and dump_val_exp_list (os : formatter) (xl: val_exp list) = ( match xl with @@ -368,9 +366,9 @@ and dump_val_exp_list (os : formatter) (xl: val_exp list) = ( | h::[] -> ( fprintf os "%a" dump_val_exp h ) | h::t -> ( fprintf os "%a,@,%a" dump_val_exp h dump_val_exp_list t) ) - (****************************) - (* Appels "par position" *) - (****************************) +(****************************) +(* Appels "par position" *) +(****************************) and dump_by_pos_exp (os: Format.formatter) (oper: by_pos_op) (pars: operands) = ( match (oper, pars) with @@ -382,64 +380,64 @@ and dump_by_pos_exp (os: Format.formatter) (oper: by_pos_op) (pars: operands) = | (WHEN_n _, Oper [p0;p1]) -> dump_binary_exp os "when" p0 p1 | (Predef_n (x,_), _) -> ( - match (x.it, pars) with - | (TRUE_n, Oper []) -> dump_leaf_exp os "true" - | (FALSE_n, Oper []) -> dump_leaf_exp os "false" - | (ICONST_n s, Oper []) -> dump_leaf_exp os (Ident.to_string s) - | (RCONST_n s, Oper []) -> dump_leaf_exp os (Ident.to_string s) - (* unaires *) - | (NOT_n, Oper [p0]) -> dump_unary_exp os "not" p0 - | (UMINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 - | (RUMINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 - | (IUMINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 - | (REAL2INT_n, Oper [p0]) -> dump_unary_exp os "int" p0 - | (INT2REAL_n, Oper [p0]) -> dump_unary_exp os "real" p0 - (* binaires *) - | (AND_n, Oper [p0;p1]) -> dump_binary_exp os "and" p0 p1 - | (OR_n, Oper [p0;p1]) -> dump_binary_exp os "or" p0 p1 - | (XOR_n, Oper [p0;p1]) -> dump_binary_exp os "xor" p0 p1 - | (IMPL_n, Oper [p0;p1]) -> dump_binary_exp os "=>" p0 p1 - | (EQ_n, Oper [p0;p1]) -> dump_binary_exp os "=" p0 p1 - | (NEQ_n, Oper [p0;p1]) -> dump_binary_exp os "<>" p0 p1 - | (LT_n, Oper [p0;p1]) -> dump_binary_exp os "<" p0 p1 - | (LTE_n, Oper [p0;p1]) -> dump_binary_exp os "<=" p0 p1 - | (GT_n, Oper [p0;p1]) -> dump_binary_exp os ">" p0 p1 - | (GTE_n, Oper [p0;p1]) -> dump_binary_exp os ">=" p0 p1 - | (DIV_n, Oper [p0;p1]) -> dump_binary_exp os "div" p0 p1 - | (MOD_n, Oper [p0;p1]) -> dump_binary_exp os "mod" p0 p1 - | (MINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 - | (RMINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 - | (IMINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 - | (PLUS_n, Oper [p0;p1]) -> dump_binary_exp os "+" p0 p1 - | (RPLUS_n, Oper [p0;p1]) -> dump_binary_exp os "+" p0 p1 - | (IPLUS_n, Oper [p0;p1]) -> dump_binary_exp os "+" p0 p1 - | (SLASH_n, Oper [p0;p1]) -> dump_binary_exp os "/" p0 p1 - | (RSLASH_n, Oper [p0;p1]) -> dump_binary_exp os "/" p0 p1 - | (ISLASH_n, Oper [p0;p1]) -> dump_binary_exp os "/" p0 p1 - | (TIMES_n, Oper [p0;p1]) -> dump_binary_exp os "*" p0 p1 - | (RTIMES_n, Oper [p0;p1]) -> dump_binary_exp os "*" p0 p1 - | (ITIMES_n, Oper [p0;p1]) -> dump_binary_exp os "*" p0 p1 - | (IF_n, Oper [p0;p1;p2]) -> dump_ternary_exp os "if" "then" "else" p0 p1 p2 - | (NOR_n, Oper pl) -> dump_nary_exp os "nor" pl - | (DIESE_n, Oper pl) -> dump_nary_exp os "#" pl - | (_,_) -> assert false + match (x.it, pars) with + | (TRUE_n, Oper []) -> dump_leaf_exp os "true" + | (FALSE_n, Oper []) -> dump_leaf_exp os "false" + | (ICONST_n s, Oper []) -> dump_leaf_exp os (Ident.to_string s) + | (RCONST_n s, Oper []) -> dump_leaf_exp os (Ident.to_string s) + (* unaires *) + | (NOT_n, Oper [p0]) -> dump_unary_exp os "not" p0 + | (UMINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 + | (RUMINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 + | (IUMINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 + | (REAL2INT_n, Oper [p0]) -> dump_unary_exp os "int" p0 + | (INT2REAL_n, Oper [p0]) -> dump_unary_exp os "real" p0 + (* binaires *) + | (AND_n, Oper [p0;p1]) -> dump_binary_exp os "and" p0 p1 + | (OR_n, Oper [p0;p1]) -> dump_binary_exp os "or" p0 p1 + | (XOR_n, Oper [p0;p1]) -> dump_binary_exp os "xor" p0 p1 + | (IMPL_n, Oper [p0;p1]) -> dump_binary_exp os "=>" p0 p1 + | (EQ_n, Oper [p0;p1]) -> dump_binary_exp os "=" p0 p1 + | (NEQ_n, Oper [p0;p1]) -> dump_binary_exp os "<>" p0 p1 + | (LT_n, Oper [p0;p1]) -> dump_binary_exp os "<" p0 p1 + | (LTE_n, Oper [p0;p1]) -> dump_binary_exp os "<=" p0 p1 + | (GT_n, Oper [p0;p1]) -> dump_binary_exp os ">" p0 p1 + | (GTE_n, Oper [p0;p1]) -> dump_binary_exp os ">=" p0 p1 + | (DIV_n, Oper [p0;p1]) -> dump_binary_exp os "div" p0 p1 + | (MOD_n, Oper [p0;p1]) -> dump_binary_exp os "mod" p0 p1 + | (MINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 + | (RMINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 + | (IMINUS_n, Oper [p0]) -> dump_unary_exp os "-" p0 + | (PLUS_n, Oper [p0;p1]) -> dump_binary_exp os "+" p0 p1 + | (RPLUS_n, Oper [p0;p1]) -> dump_binary_exp os "+" p0 p1 + | (IPLUS_n, Oper [p0;p1]) -> dump_binary_exp os "+" p0 p1 + | (SLASH_n, Oper [p0;p1]) -> dump_binary_exp os "/" p0 p1 + | (RSLASH_n, Oper [p0;p1]) -> dump_binary_exp os "/" p0 p1 + | (ISLASH_n, Oper [p0;p1]) -> dump_binary_exp os "/" p0 p1 + | (TIMES_n, Oper [p0;p1]) -> dump_binary_exp os "*" p0 p1 + | (RTIMES_n, Oper [p0;p1]) -> dump_binary_exp os "*" p0 p1 + | (ITIMES_n, Oper [p0;p1]) -> dump_binary_exp os "*" p0 p1 + | (IF_n, Oper [p0;p1;p2]) -> dump_ternary_exp os "if" "then" "else" p0 p1 p2 + | (NOR_n, Oper pl) -> dump_nary_exp os "nor" pl + | (DIESE_n, Oper pl) -> dump_nary_exp os "#" pl + | (_,_) -> assert false ) | (HAT_n, Oper [p0;p1]) -> dump_binary_exp os "^" p0 p1 | (CONCAT_n, Oper [p0;p1]) -> dump_binary_exp os "|" p0 p1 | (WITH_n(_), Oper [p0;p1;p2]) -> dump_ternary_exp os "with" "then" "else" p0 p1 p2 | (TUPLE_n, Oper pl) -> dump_nary_exp os "" pl | (CALL_n s, Oper pl) -> fprintf os "%a(@,%a@,)" - dump_node_exp s.it dump_val_exp_list pl + dump_node_exp s.it dump_val_exp_list pl | (ARRAY_n, Oper pl) -> fprintf os "[@,%a@,]" dump_val_exp_list pl | (ARRAY_ACCES_n ix, Oper [p0]) -> fprintf os "%a[@,%a@,]" - dump_val_exp p0 dump_val_exp ix + dump_val_exp p0 dump_val_exp ix | (ARRAY_SLICE_n sl, Oper [p0]) -> fprintf os "%a[@,%a@,]" - dump_val_exp p0 dump_slice_info sl + dump_val_exp p0 dump_slice_info sl | (STRUCT_ACCESS_n fld, Oper [p0]) -> fprintf os "%a.%s" - dump_val_exp p0 (Ident.to_string fld) + dump_val_exp p0 (Ident.to_string fld) -(* | (ITERATOR_n _, _) -> assert false *) - | (MERGE_n _,_) -> assert false + (* | (ITERATOR_n _, _) -> assert false *) + (* | (MERGE_n _,_) -> assert false *) | (FBY_n, _) -> assert false @@ -458,49 +456,49 @@ and dump_by_pos_exp (os: Format.formatter) (oper: by_pos_op) (pars: operands) = | (IDENT_n _, _) -> assert false ) - (* les procs standard pour les operateurs predefs *) +(* les procs standard pour les operateurs predefs *) and dump_leaf_exp (os : Format.formatter) (s : string) = ( fprintf os "%s" s ) and dump_unary_exp (os : Format.formatter) - (s : string) - (op0: val_exp) + (s : string) + (op0: val_exp) = ( - fprintf os "(@,%s %a@,)" s dump_val_exp op0 - ) + fprintf os "(@,%s %a@,)" s dump_val_exp op0 +) and dump_binary_exp (os : Format.formatter) - (s : string) - (op0: val_exp) - (op1: val_exp) + (s : string) + (op0: val_exp) + (op1: val_exp) = ( - fprintf os "(@,%a %s %a@,)" dump_val_exp op0 s dump_val_exp op1 - ) + fprintf os "(@,%a %s %a@,)" dump_val_exp op0 s dump_val_exp op1 +) and dump_ternary_exp (os : Format.formatter) - (s : string) - (t : string) - (e : string) - (op0: val_exp) - (op1: val_exp) - (op2: val_exp) + (s : string) + (t : string) + (e : string) + (op0: val_exp) + (op1: val_exp) + (op2: val_exp) = ( - fprintf os "(@,%s %a %s %a %s %a@,)" - s dump_val_exp op0 t dump_val_exp op1 e dump_val_exp op2 - ) + fprintf os "(@,%s %a %s %a %s %a@,)" + s dump_val_exp op0 t dump_val_exp op1 e dump_val_exp op2 +) and dump_nary_exp (os : Format.formatter) - (s: string) - (ops: val_exp list) + (s: string) + (ops: val_exp list) = ( - fprintf os "%s(@,%a@,)" s dump_val_exp_list ops - ) + fprintf os "%s(@,%a@,)" s dump_val_exp_list ops +) and string_of_node_exp (id, sal) = (Ident.string_of_idref id) ^ - (if sal = [] then "" else - "<<" ^ (String.concat ", " (List.map static_arg_to_string sal)) ^ ">>") + (if sal = [] then "" else + "<<" ^ (String.concat ", " (List.map static_arg_to_string sal)) ^ ">>") and static_arg_to_string arg = match arg.it with @@ -510,86 +508,86 @@ and static_arg_to_string arg = | StaticArgNode op -> "node "^(op2string op) and dump_node_exp os ne = - fprintf os "%s" (string_of_node_exp ne) + fprintf os "%s" (string_of_node_exp ne) and dump_static_sarg_list (os : Format.formatter) - (lst: (static_arg srcflagged) list) + (lst: (static_arg srcflagged) list) = ( - match lst with - | [] -> () - | [sa] -> fprintf os "%a" dump_static_sarg sa.it - | sa::reste -> - fprintf os "%a, @,%a" dump_static_sarg sa.it dump_static_sarg_list reste - ) + match lst with + | [] -> () + | [sa] -> fprintf os "%a" dump_static_sarg sa.it + | sa::reste -> + fprintf os "%a, @,%a" dump_static_sarg sa.it dump_static_sarg_list reste +) and dump_static_sarg (os : Format.formatter) - (sa: static_arg) + (sa: static_arg) = - match sa with - | StaticArgIdent id -> fprintf os "%s" (Ident.string_of_idref id) - | StaticArgConst ve -> fprintf os "const %a" dump_val_exp ve - | StaticArgType te -> fprintf os "type %a" dump_type_exp te - | StaticArgNode op -> fprintf os "node %s" (op2string op) + match sa with + | StaticArgIdent id -> fprintf os "%s" (Ident.string_of_idref id) + | StaticArgConst ve -> fprintf os "const %a" dump_val_exp ve + | StaticArgType te -> fprintf os "type %a" dump_type_exp te + | StaticArgNode op -> fprintf os "node %s" (op2string op) and dump_static_arg_list (os : Format.formatter) - (lst: (Ident.t * static_arg srcflagged) list) + (lst: (Ident.t * static_arg srcflagged) list) = ( - match lst with - | [] -> () - | [sa] -> fprintf os "%a" dump_static_arg sa - | sa::reste -> - fprintf os "%a, @,%a" dump_static_arg sa dump_static_arg_list reste - ) + match lst with + | [] -> () + | [sa] -> fprintf os "%a" dump_static_arg sa + | sa::reste -> + fprintf os "%a, @,%a" dump_static_arg sa dump_static_arg_list reste +) and dump_static_arg (os : Format.formatter) - ((id,sa): Ident.t * static_arg srcflagged) + ((id,sa): Ident.t * static_arg srcflagged) = - fprintf os "%s = " (Ident.to_string id); - match sa.it with - | StaticArgIdent id -> fprintf os "%s" (Ident.string_of_idref id) - | StaticArgConst ve -> fprintf os "const %a" dump_val_exp ve - | StaticArgType te -> fprintf os "type %a" dump_type_exp te - | StaticArgNode op -> fprintf os "node %s" (op2string op) + fprintf os "%s = " (Ident.to_string id); + match sa.it with + | StaticArgIdent id -> fprintf os "%s" (Ident.string_of_idref id) + | StaticArgConst ve -> fprintf os "const %a" dump_val_exp ve + | StaticArgType te -> fprintf os "type %a" dump_type_exp te + | StaticArgNode op -> fprintf os "node %s" (op2string op) (* | StaticArgFunc ne -> fprintf os "function %a" dump_node_exp ne *) - + and dump_slice_info (os : Format.formatter) - (sl: slice_info) + (sl: slice_info) = ( - fprintf os "%a@, .. @,%a" dump_val_exp sl.si_first dump_val_exp sl.si_last ; - match sl.si_step with - Some e -> fprintf os "@, step %a" dump_val_exp e - | None -> () - ) - (****************************) - (* Appels "par noms" *) - (****************************) + fprintf os "%a@, .. @,%a" dump_val_exp sl.si_first dump_val_exp sl.si_last ; + match sl.si_step with + Some e -> fprintf os "@, step %a" dump_val_exp e + | None -> () +) +(****************************) +(* Appels "par noms" *) +(****************************) and dump_by_name_exp (os: Format.formatter) - (oper: by_name_op) - (pars: (Ident.t srcflagged * val_exp) list) = + (oper: by_name_op) + (pars: (Ident.t srcflagged * val_exp) list) = ( match (oper, pars) with | (STRUCT_n id, pl) -> ( - fprintf os "%s{@,%a@,}" - (Ident.string_of_idref id) - dump_named_pars pl - ) + fprintf os "%s{@,%a@,}" + (Ident.string_of_idref id) + dump_named_pars pl + ) | (STRUCT_anonymous_n, pl) -> ( - fprintf os "{@,%a@,}" dump_named_pars pl - ) + fprintf os "{@,%a@,}" dump_named_pars pl + ) ) and dump_named_pars (os: Format.formatter) - (pars: (Ident.t srcflagged * val_exp) list) = + (pars: (Ident.t srcflagged * val_exp) list) = ( match pars with - [] -> () - |(v,e)::[] -> fprintf os "%s = %a" (Ident.to_string v.it) dump_val_exp e - |(v,e)::l -> - fprintf os "%s = %a;@,%a" (Ident.to_string v.it) dump_val_exp e - dump_named_pars l + [] -> () + |(v,e)::[] -> fprintf os "%s = %a" (Ident.to_string v.it) dump_val_exp e + |(v,e)::l -> + fprintf os "%s = %a;@,%a" (Ident.to_string v.it) dump_val_exp e + dump_named_pars l ) diff --git a/src/evalClock.ml b/src/evalClock.ml index f6755949..4afe893f 100644 --- a/src/evalClock.ml +++ b/src/evalClock.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 18/01/2013 (at 08:32) by Erwan Jahier> *) +(* Time-stamp: <modified the 31/01/2013 (at 17:50) by Erwan Jahier> *) open AstPredef @@ -175,11 +175,9 @@ let (get_clock_profile : Lic.node_exp -> clock_profile) = let ci2str = LicDump.string_of_clock2 - (******************************************************************************) (** Now we can go on and define [f]. *) - let rec (f : Lxm.t -> Lic.id_solver -> subst -> Lic.val_exp -> Lic.clock list -> Lic.val_exp * Lic.id_clock list * subst) = fun lxm id_solver s ve exp_clks -> @@ -200,19 +198,29 @@ let rec (f : Lxm.t -> Lic.id_solver -> subst -> Lic.val_exp -> Lic.clock list -> "Clocking the expression '" ^ (LicDump.string_of_val_exp_eff ve) ^"': "^ (LicDump.string_of_clock2 (List.hd clks)) ^"\n"); ve, inf_clks, s - - and f_aux id_solver s ve = let (cel, s), lxm = - match ve.ve_core with + match ve.ve_core with | CallByPosLic ({it=posop; src=lxm}, OperLic args) -> - eval_by_pos_clock id_solver posop lxm args s, lxm - - | CallByNameLic ({it=nmop; src=lxm}, nmargs ) -> + eval_by_pos_clock id_solver posop lxm args s, lxm + | CallByNameLic ({it=nmop; src=lxm}, nmargs ) -> ( try eval_by_name_clock id_solver nmop lxm nmargs s, lxm with EvalConst_error msg -> raise (Compile_error(lxm, "\n*** can't eval constant: "^msg)) + ) + | Merge(ce, cl) -> + let _ve,cel,s = f ce.src id_solver s ce.it [] in + let ce_id, (merge_clk:Lic.clock) = match cel with [c] -> c | _ -> assert false in + let check_case s (id,ve) = + (* Check that ve is on id(ce) on merge_clk *) + let id_clk : Ident.clk = (Ident.idref_of_long id.it, ce_id) in + let exp_clk = [On(id_clk, merge_clk)] in + let _ve,cel,s = f id.src id_solver s ve exp_clk in + s + in + let s = List.fold_left check_case s cl in + (cel,s), ce.src in let new_clk = snd (List.split cel) in let s, ve = @@ -261,15 +269,14 @@ and (eval_by_pos_clock : Lic.id_solver -> Lic.by_pos_op -> Lxm.t -> Lic.val_exp c_clk, On((cc,c), c_clk) in let aux_when exp_clk s = - (* - In order to clock check an expression such as + (* + In order to clock check an expression such as - exp when C(c) - - (1) we first need to check that the clock of c (c_clk) - is a sub-clock of the clock of exp (exp_clk). - (2) - *) + exp when C(c) + + we first need to check that the clock of c (c_clk) + is a sub-clock of the clock of exp (exp_clk). + *) match is_a_sub_clock lxm s exp_clk (fst exp_clk,c_clk) with | None -> @@ -291,16 +298,16 @@ and (eval_by_pos_clock : Lic.id_solver -> Lic.by_pos_op -> Lxm.t -> Lic.val_exp id_when_exp_clk, s in (match f_list id_solver s args with - (* XXX ce cas ne sert à rien !!! - le traitement du cas ou la liste ne contient qu'un element - n'a aucun raison d'etre particulier, si ??? - *) + (* XXX ce cas ne sert à rien !!! + le traitement du cas ou la liste ne contient qu'un element + n'a aucun raison d'etre particulier, si ??? + *) | _args,[[exp_clk]], s -> let (exp_clk,s) = aux_when exp_clk s in ([exp_clk], s) | _args, [exp_clk_list], s -> - (* when on tuples *) + (* when on tuples *) let exp_clk_list, s = List.fold_left (fun (acc,s) exp_clk -> @@ -315,7 +322,6 @@ and (eval_by_pos_clock : Lic.id_solver -> Lic.by_pos_op -> Lxm.t -> Lic.val_exp ) ) - | Lic.MERGE _,args -> assert false (* TODO *) (* f_aux id_solver (List.hd args) *) | Lic.HAT(i,ve),args -> @@ -338,16 +344,16 @@ and (eval_by_pos_clock : Lic.id_solver -> Lic.by_pos_op -> Lxm.t -> Lic.val_exp let node_exp_eff = UglyStuff.node_exp_of_node_key id_solver node_key lxm in let (cil_arg, cil_res) = get_clock_profile node_exp_eff in let s, rel_base = UnifyClock.new_clock_var s in - (* the value of the base clock of a node is actually relative - to the context into which the node is called. - - Hence we create a fresh var clock, that will be instanciated - by the caller. - *) + (* the value of the base clock of a node is actually relative + to the context into which the node is called. + + Hence we create a fresh var clock, that will be instanciated + by the caller. + *) let (replace_base : Lic.clock -> Lic.id_clock -> Lic.id_clock) = fun rel_base (id,ci) -> - (* [replace_base rel_base ci ] replaces in [ci] any occurences of the - base clock by [rel_base] *) + (* [replace_base rel_base ci ] replaces in [ci] any occurences of the + base clock by [rel_base] *) let rec aux ci = match ci with | BaseLic -> rel_base @@ -422,7 +428,7 @@ and (eval_by_name_clock : Lic.id_solver -> Lic.by_name_op -> Lxm.t -> | Lic.STRUCT _ -> let apply_subst s (id,clk) = id, UnifyClock.apply_subst s clk in let args = List.map (fun (id,ve) -> ve) namargs in - (* XXX The 3 following lines duplicates the code of TUPLE_eff and co *) + (* XXX The 3 following lines duplicates the code of TUPLE_eff and co *) let args, clk_args, s = f_list id_solver s args in let flat_clk_args = List.flatten clk_args in (* => mono-clock! *) let _,flat_clk_args = List.split flat_clk_args in diff --git a/src/evalClock.mli b/src/evalClock.mli index 642ba003..7e3984d8 100644 --- a/src/evalClock.mli +++ b/src/evalClock.mli @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 13/12/2012 (at 11:49) by Erwan Jahier> *) +(* Time-stamp: <modified the 30/01/2013 (at 16:25) by Erwan Jahier> *) (** Static evaluation of clocks. *) @@ -8,6 +8,8 @@ open UnifyClock it checks that the argument and the parameter clocks are compatible), and returns a clock profile that contains all the necessary information so that the caller can perform additional clock checks. + + nb : if [cl] is empty, no check is done (should be an option type) *) val f : Lxm.t -> Lic.id_solver -> subst -> Lic.val_exp -> Lic.clock list -> Lic.val_exp * Lic.id_clock list * subst diff --git a/src/evalConst.ml b/src/evalConst.ml index 62ae4f25..8048239c 100644 --- a/src/evalConst.ml +++ b/src/evalConst.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 29/01/2013 (at 15:03) by Erwan Jahier> *) +(* Time-stamp: <modified the 30/01/2013 (at 18:09) by Erwan Jahier> *) open Printf @@ -172,11 +172,11 @@ let rec f (env : Lic.id_solver) (vexp : val_exp) = ( - (*----------------------------------- - fonction récursive principale - -> capte les nv - -> récupère les EvalConst_error - -----------------------------------*) + (*----------------------------------- + fonction récursive principale + -> capte les nv + -> récupère les EvalConst_error + -----------------------------------*) let rec rec_eval_const (vexp : AstCore.val_exp) = ( match vexp with | AstCore.CallByPos ({it=posop; src=lxm}, Oper args) -> ( @@ -192,24 +192,28 @@ let rec f with EvalConst_error msg -> raise (Compile_error(lxm, "\n*** can't eval constant: "^msg)) ) + | MERGE_n (_,_) -> + finish_me "merge"; + assert false + ) - (*----------------------------------- - fonction récursive secondaire - eval. exp classique (by pos) - N.B. On distingue les opérations - classiques (avec extention tableau - implicie) des autres. Ici, on traite - toutes les opérations non classiques. - -----------------------------------*) + (*----------------------------------- + fonction récursive secondaire + eval. exp classique (by pos) + N.B. On distingue les opérations + classiques (avec extention tableau + implicie) des autres. Ici, on traite + toutes les opérations non classiques. + -----------------------------------*) and eval_by_pos_const (posop : by_pos_op) (* l'operateur *) (lxm : Lxm.t) (* source de l'opérateur *) (args : val_exp list) (* arguments *) = ( match (posop) with - (* capte les idents de constantes *) + (* capte les idents de constantes *) IDENT_n id -> ( - (* 2007-07 on interdit les externes *) + (* 2007-07 on interdit les externes *) match (env.id2const id lxm) with | Abstract_const_eff(_,_, const_eff, true) -> [const_eff] | Abstract_const_eff(_,_,_,false) -> @@ -220,16 +224,16 @@ let rec f sprintf "\n*** cannot access this extern constant value")) | x -> [ x ] ) - (* opérateur lazzy *) + (* opérateur lazzy *) | WITH_n(a0,a1,a2) -> ( match (rec_eval_const a0) with [ Bool_const_eff true] -> rec_eval_const a1 | [ Bool_const_eff false] -> rec_eval_const a2 | x -> type_error_const x "bool" ) - (* mettre à plat la liste des args *) + (* mettre à plat la liste des args *) | TUPLE_n -> ( List.flatten (List.map rec_eval_const args)) - (* les tableaux de tuples sont interdits *) + (* les tableaux de tuples sont interdits *) | HAT_n -> ( match args with | [cexp; szexp] -> ( @@ -297,7 +301,7 @@ let rec f | [Array_const_eff (l, t)] -> (l, t) | x -> type_error_const x "some array" in - (* évalue la slice *) + (* évalue la slice *) try let sliceff = eval_array_slice env sl lxm in make_slice_const elts typelts sliceff @@ -321,7 +325,6 @@ let rec f ) | CALL_n _ -> not_evaluable_construct "node call" - | MERGE_n _ -> not_evaluable_construct "merge" | WHEN_n _ -> not_evaluable_construct "when" | FBY_n -> not_evaluable_construct "fby" | ARROW_n -> not_evaluable_construct "->" @@ -334,17 +337,17 @@ let rec f let effargs = (List.map rec_eval_const args) in LicEvalConst.f env op.it lxm [] effargs else - (* Well, it migth be possible after all... TODO *) + (* Well, it migth be possible after all... TODO *) not_evaluable_construct (op2string op.it) ) (* FIN DE : eval_by_pos_const *) - (*-------------------------------------*) - (* Fonction récursive secondaire *) - (*-------------------------------------*) - (* -> Eval. d'une expression spéciale *) - (* "par nom" *) - (*-------------------------------------*) + (*-------------------------------------*) + (* Fonction récursive secondaire *) + (*-------------------------------------*) + (* -> Eval. d'une expression spéciale *) + (* "par nom" *) + (*-------------------------------------*) and eval_by_name_const (namop : by_name_op) (* l'operateur *) (lxm : Lxm.t) (* source de l'opérateur *) @@ -381,14 +384,14 @@ let rec f )) in List.iter treat_one_arg namargs ; - (* pour l'instant, on ne traite que les constructions de struct *) + (* pour l'instant, on ne traite que les constructions de struct *) let teff = env.id2type opid lxm in [make_struct_const teff arg_tab] ) ) (* FIN DE : eval_by_name_const *) - (*-------------------------------------*) - (* Corps de la fonction principale *) - (*-------------------------------------*) + (*-------------------------------------*) + (* Corps de la fonction principale *) + (*-------------------------------------*) in rec_eval_const vexp ) (* fin de f *) @@ -508,17 +511,17 @@ and eval_array_slice (env : Lic.id_solver) (sl : slice_info) (lxm : Lxm.t) = let msg = sprintf "bad array slice [%d..%d] step %d" first_ix last_ix step in raise (EvalArray_error msg) else - (* index relatif du dernier *) + (* index relatif du dernier *) let last_rel = abs (last_ix-first_ix) in let abs_step = abs step in - (* le dernier est-il pris dans la tranche ? *) + (* le dernier est-il pris dans la tranche ? *) if ((last_rel mod abs_step) <> 0) then warning lxm (sprintf "last index out of slice [%d..%d step %d]" first_ix last_ix step); let width = 1 + last_rel/abs_step in - (* on force le dernier a être dans la tranche *) + (* on force le dernier a être dans la tranche *) let real_last_ix = first_ix + (width-1) * step in - (* (first_ix,last_ix,step,width) *) + (* (first_ix,last_ix,step,width) *) { se_first = first_ix; se_last = real_last_ix; diff --git a/src/evalType.ml b/src/evalType.ml index 5c014ec0..8c4751b7 100644 --- a/src/evalType.ml +++ b/src/evalType.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 29/01/2013 (at 15:07) by Erwan Jahier> *) +(** Time-stamp: <modified the 31/01/2013 (at 09:39) by Erwan Jahier> *) open AstPredef @@ -50,13 +50,19 @@ let rec (f : Lic.id_solver -> Lic.val_exp -> Lic.val_exp * Lic.type_ list) = in ve, tl ) - | CallByNameLic ({it=nmop; src=lxm}, nmargs ) -> + | CallByNameLic ({it=nmop; src=lxm}, nmargs ) -> ( let nmargs, tl = try eval_by_name_type id_solver nmop lxm nmargs with EvalConst_error msg -> raise (Compile_error(lxm, "\n*** can't eval constant: "^msg)) in CallByNameLic ({it=nmop; src=lxm}, nmargs ), tl + ) + | Merge ({it=clk ; src=lxm}, nmargs ) -> ( + try eval_merge id_solver clk lxm nmargs + with EvalConst_error msg -> + raise (Compile_error(lxm, "\n*** can't eval constant: "^msg)) + ) in { ve_core = ve_core; ve_typ = tl ; ve_clk = ve.ve_clk }, tl @@ -74,13 +80,13 @@ and eval_by_pos_type match posop with | PREDEF_CALL (op,sargs) -> ( let args, targs = List.split (List.map (f id_solver) args) in - (* ICI pas de matches possible ? *) + (* ICI pas de matches possible ? *) let tve = LicEvalType.f id_solver op lxm sargs targs in None, args, tve ) | Lic.CALL nkf -> let node_key = nkf.it in - (* let node_exp_eff = id_solver.id2node node_key lxm in *) + (* let node_exp_eff = id_solver.id2node node_key lxm in *) let node_exp_eff = UglyStuff.node_exp_of_node_key id_solver node_key lxm in let (lti, lto) = Lic.profile_of_node_exp node_exp_eff in let args, t_argsl = List.split (List.map (f id_solver) args) in @@ -89,7 +95,7 @@ and eval_by_pos_type let _ = if llti <> lt_args then raise_arity_error "" lt_args llti in - (* lti = expecteds, t_args = given *) + (* lti = expecteds, t_args = given *) let tmatches = try UnifyType.is_matched lti t_args with UnifyType.Match_failed msg -> ( let msg' = Printf.sprintf @@ -211,7 +217,7 @@ and eval_by_pos_type Some(Lic.HAT(size,ceff)), [], tl | Lic.ARRAY(args) -> - (* check that args are of the same type *) + (* check that args are of the same type *) let args, targs = List.split (List.map (f id_solver) args) in let teff_elt = List.fold_left @@ -267,22 +273,18 @@ and eval_by_pos_type | [teff] -> None, args, teff | _ -> raise_arity_error "" (List.length targs) 1 ) - | Lic.MERGE _ -> finish_me "merge"; assert false (** Juste pour les structures ... *) -and eval_by_name_type - (id_solver: Lic.id_solver) - (namop: Lic.by_name_op) - (lxm: Lxm.t) - (namargs: (Ident.t Lxm.srcflagged * Lic.val_exp) list ) -(* renvoie la lsite de modif de champs compilée + le type du résultat *) +and eval_by_name_type (id_solver: Lic.id_solver) (namop: Lic.by_name_op) (lxm: Lxm.t) + (namargs: (Ident.t Lxm.srcflagged * Lic.val_exp) list ) + (* renvoie la liste de modif de champs compilée + le type du résultat *) : (Ident.t Lxm.srcflagged * Lic.val_exp) list * Lic.type_ list - = match namop with - - | Lic.STRUCT_anonymous -> + = + match namop with + | Lic.STRUCT_anonymous -> (* ??? comment faire ici pour recuperer son type ??? il faut que je recherche à l'aide des noms de champs le type structure qui va bien ! @@ -291,27 +293,67 @@ and eval_by_name_type - rajouter dans la table a sa creation une entree dont le nom est composé du nom des champs ? *) - finish_me "anonymous struct not yet supported"; - assert false - - | Lic.STRUCT (pn,opid) -> - let struct_type = id_solver.id2type opid lxm in - match struct_type with - | Struct_type_eff(sn, fl) -> - let do_field_assign (fn, fv) = + finish_me "anonymous struct not yet supported"; + assert false + + | Lic.STRUCT (pn,opid) -> + let struct_type = id_solver.id2type opid lxm in + match struct_type with + | Struct_type_eff(sn, fl) -> + let do_field_assign (fn, fv) = (* traitement d'un ''field_name = field_value'' *) - let (ft,fopt) = try - List.assoc fn.it fl - with Not_found -> - let msg = "type error: bad field"^(Ident.to_string fn.it) in - raise (Compile_error(lxm, msg)) - in + let (ft,fopt) = + try List.assoc fn.it fl + with Not_found -> + let msg = "type error: bad field"^(Ident.to_string fn.it) in + raise (Compile_error(lxm, msg)) + in (* let's check the type of fv *) - let fv, fv_type = f id_solver fv in - if fv_type = [ft] then (fn,fv) - else raise_type_error fv_type [ft] - ("while checking struct field "^(Lxm.details fn.src)) + let fv, fv_type = f id_solver fv in + if fv_type = [ft] then (fn,fv) + else raise_type_error fv_type [ft] + ("while checking struct field "^(Lxm.details fn.src)) + in + let namargs = List.map do_field_assign namargs + in (namargs, [struct_type]) + | _ -> raise (Compile_error(lxm, "type error: a structure is expected")) + +and (eval_merge : Lic.id_solver -> Lic.val_exp -> Lxm.t -> + (Ident.long Lxm.srcflagged * Lic.val_exp) list -> Lic.val_exp_core * Lic.type_ list) = + fun id_solver clk lxm nargs -> + let clk, tclk = f id_solver clk in + let nargs,tl_opt = + List.fold_left + (fun (acc,tl_opt) (id,ve) -> + (* check that id is of type tclk *) + let id_type = + let c = id_solver.id2const (Ident.idref_of_long id.it) id.src in + type_of_const c + in + if [id_type] <> tclk then ( + let msg = "type error in a merge branch: " ^ + (Lic.string_of_type (List.hd tclk)) ^ " was expected, but " ^ + (Lic.string_of_type id_type) ^ " was provided. " in - let namargs = List.map do_field_assign namargs - in (namargs, [struct_type]) - | _ -> raise (Compile_error(lxm, "type error: a structure is expected")) + raise (Compile_error(lxm, "type error: "^msg)) + ); + let ve,tl = f id_solver ve in + let tl_opt = + match tl_opt with + | None -> Some tl + | Some tl' -> + if tl = tl' then tl_opt else + let tl2str tl = String.concat "*" (List.map Lic.string_of_type tl) in + let msg = "types differ in merge branches: " ^ + (tl2str tl) ^ " <> " ^ (tl2str tl') + in + raise (Compile_error(lxm, "type error: "^msg)) + in + (id,ve)::acc, tl_opt + ) + ([],None) + nargs + in + let tl = match tl_opt with Some tl -> tl | None -> assert false in + Merge({it=clk; src=lxm}, nargs), tl + diff --git a/src/evalType.mli b/src/evalType.mli index e65be8c2..f5bd8e36 100644 --- a/src/evalType.mli +++ b/src/evalType.mli @@ -1,9 +1,9 @@ -(* Time-stamp: <modified the 13/12/2012 (at 11:49) by Erwan Jahier> *) +(* Time-stamp: <modified the 30/01/2013 (at 11:10) by Erwan Jahier> *) (** Static evaluation of types. *) (** Evaluates the type of an expression, and return a val_exp with - its "typ" field updated (and ditto for the type of its sub expr). + its "type_" field updated (and ditto for the type of its sub expr). Modif 12/07 : - Travaille au niveau Lic. donc on vire Lic.id_solver qui diff --git a/src/l2lCheckLoops.ml b/src/l2lCheckLoops.ml index c8698c7c..8867e468 100644 --- a/src/l2lCheckLoops.ml +++ b/src/l2lCheckLoops.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 23/01/2013 (at 17:29) by Erwan Jahier> *) +(* Time-stamp: <modified the 31/01/2013 (at 09:37) by Erwan Jahier> *) open Lxm open Errors @@ -24,6 +24,9 @@ and | CallByPosLic (by_pos_op, OperLic vel) -> let s = vars_of_by_pos_op s by_pos_op.it in List.fold_left vars_of_exp s vel + | Merge(ce, l) -> + let s = vars_of_exp s ce.it in + List.fold_left (fun s (_,ve) -> vars_of_exp s ce.it) s l | CallByNameLic(_, _) -> s and vars_of_by_pos_op s = function @@ -32,7 +35,6 @@ and | WITH ve | HAT(_,ve) -> vars_of_exp s ve | ARRAY(vel) -> List.fold_left vars_of_exp s vel - | MERGE(id,idl) -> List.fold_left (fun s id -> IdSet.add id s) s (id::idl) | ARRAY_SLICE _ | ARRAY_ACCES _ | ARROW | FBY | CURRENT | WHEN _ | STRUCT_ACCESS _ | TUPLE | CONCAT | CONST_REF _ | CALL _ -> s diff --git a/src/l2lExpandArrays.ml b/src/l2lExpandArrays.ml index 5d612b99..8839ada6 100644 --- a/src/l2lExpandArrays.ml +++ b/src/l2lExpandArrays.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 29/01/2013 (at 10:58) by Erwan Jahier> *) +(** Time-stamp: <modified the 31/01/2013 (at 09:53) by Erwan Jahier> *) (* Replace structures and arrays by as many variables as necessary. Since structures can be recursive, it migth be a lot of new variables... @@ -250,6 +250,7 @@ and (var_trees_of_val_exp : in let loop = var_trees_of_val_exp lctx acc in match ve.ve_core with + | Merge(ce,cl) -> assert false | CallByPosLic (by_pos_op, OperLic vel) -> ( let lxm = by_pos_op.src in let by_pos_op = by_pos_op.it in @@ -325,7 +326,7 @@ and (var_trees_of_val_exp : raise (Errors.Compile_error(lxm, msg)) ) | WITH(_) | HAT(_) | CONCAT | ARRAY(_) - | PREDEF_CALL _ | CALL _ | MERGE _ + | PREDEF_CALL _ | CALL _ | PRE | ARROW | FBY | CURRENT | WHEN _ | TUPLE -> ( (* Create a new loc var to alias such expressions *) let acc, nloc = make_new_loc lctx lxm acc ve in @@ -435,6 +436,12 @@ and expand_val_exp_list lctx acc vel = and (expand_val_exp: local_ctx -> acc -> val_exp -> val_exp * acc) = fun lctx acc ve -> match ve.ve_core with + | Merge(ce,cl) -> + let left,vel = List.split cl in + let vel,acc = expand_val_exp_list lctx acc vel in + let cl = List.combine left vel in + let newve = { ve with ve_core = Merge(ce,cl) } in + newve, acc | CallByPosLic (by_pos_op, OperLic vel) -> let lxm = by_pos_op.src in let by_pos_op = by_pos_op.it in @@ -454,7 +461,7 @@ and (expand_val_exp: local_ctx -> acc -> val_exp -> val_exp * acc) = let vel,acc = expand_val_exp_list lctx acc vel in TUPLE, acc, vel - | CONCAT | PREDEF_CALL _ | CALL _ | MERGE _ + | CONCAT | PREDEF_CALL _ | CALL _ | PRE | ARROW | FBY | CURRENT | WHEN _ | TUPLE -> let vel,acc = expand_val_exp_list lctx acc vel in @@ -478,7 +485,7 @@ and (expand_val_exp: local_ctx -> acc -> val_exp -> val_exp * acc) = (* EvalClock.copy newve ve *) (* ); *) newve, acc - + | CallByNameLic(by_name_op, fl_val) -> (* we want to print fields in the order of the type. Moreover, we have to deal with default value. diff --git a/src/l2lExpandNodes.ml b/src/l2lExpandNodes.ml index 83ca5f7a..ab2ae431 100644 --- a/src/l2lExpandNodes.ml +++ b/src/l2lExpandNodes.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 18/01/2013 (at 15:36) by Erwan JAHIER> *) +(* Time-stamp: <modified the 31/01/2013 (at 09:39) by Erwan Jahier> *) open Lxm @@ -93,7 +93,7 @@ and (subst_in_val_exp : subst -> val_exp -> val_exp) = let cv = var.var_name_eff in WHEN(AstCore.NamedClock {src=lxm;it=(cc,cv)}) | PREDEF_CALL _| CALL _ | PRE | ARROW | FBY | CURRENT | TUPLE - | CONCAT | STRUCT_ACCESS _ | ARRAY_ACCES _ | ARRAY_SLICE _ | MERGE _ + | CONCAT | STRUCT_ACCESS _ | ARRAY_ACCES _ | ARRAY_SLICE _ (* | CONST _ *) -> by_pos_op in @@ -102,6 +102,9 @@ and (subst_in_val_exp : subst -> val_exp -> val_exp) = | CallByNameLic(by_name_op, fl) -> let fl = List.map (fun (id,ve) -> (id, subst_in_val_exp s ve)) fl in CallByNameLic(by_name_op, fl) + | Merge(ce,cl) -> + let cl = List.map (fun (id,ve) -> (id, subst_in_val_exp s ve)) cl in + Merge(flagit (subst_in_val_exp s ce.it) ce.src,cl) } in newve @@ -234,9 +237,9 @@ and (expand_eq_aux: local_ctx -> Lic.eq_info -> acc option)= Some acc ) | CallByPosLic (_, _) + | Merge (_, _) | CallByNameLic (_, _) -> None - and (expand_assert : local_ctx -> acc -> val_exp srcflagged -> acc) = fun lctx (a_acc,e_acc,v_acc) ve -> let lxm = ve.src in diff --git a/src/l2lRmPoly.ml b/src/l2lRmPoly.ml index 159e0ec4..0a25fddb 100644 --- a/src/l2lRmPoly.ml +++ b/src/l2lRmPoly.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 18/01/2013 (at 18:20) by Erwan JAHIER> *) +(* Time-stamp: <modified the 31/01/2013 (at 09:38) by Erwan Jahier> *) (* Source 2 source transformation : @@ -124,6 +124,9 @@ let rec doit (inprg : LicPrg.t) : LicPrg.t = | CallByNameLic (namop, idops) -> let idops' = List.map (fun (id, ve) -> (id, (do_exp m) ve)) idops in CallByNameLic (namop, idops') + | Merge (ce,cl) -> + let cl = List.map (fun (id, ve) -> (id, (do_exp m) ve)) cl in + Merge (flagit (do_exp m ce.it) ce.src, cl) in { e with ve_core = core'; ve_typ = typ' } (* TRAITEMENT DES PARAMS STATIQUES *) diff --git a/src/l2lSplit.ml b/src/l2lSplit.ml index 14bebe5c..188a81e7 100644 --- a/src/l2lSplit.ml +++ b/src/l2lSplit.ml @@ -178,6 +178,7 @@ and (split_val_exp : bool -> bool -> LicPrg.id_generator -> Lic.val_exp -> is no "when"... *) match ve.ve_core with + | Merge(ce,cl) -> ve, ([],[]) (* Should we deal with complex flow in merge ? *) | CallByPosLic({it=Lic.VAR_REF _}, _) -> ve, ([],[]) | CallByPosLic({it=Lic.CONST_REF _}, _) -> ve, ([],[]) | CallByPosLic({src=lxm;it=Lic.PREDEF_CALL(AstPredef.TRUE_n,_)}, _) diff --git a/src/lexer.mll b/src/lexer.mll index f0753587..fbeb0db2 100644 --- a/src/lexer.mll +++ b/src/lexer.mll @@ -66,6 +66,7 @@ Hashtbl.add keywords "is" (function x -> TK_IS x) ;; Hashtbl.add keywords "body" (function x -> TK_BODY x) ;; Hashtbl.add keywords "end" (function x -> TK_END x) ;; Hashtbl.add keywords "include" (function x -> TK_INCLUDE x) ;; +Hashtbl.add keywords "merge" (function x -> TK_MERGE x) ;; let is_a_keyword ( s: string ) = ( try diff --git a/src/lic.ml b/src/lic.ml index e1f4b46e..fd7457e8 100644 --- a/src/lic.ml +++ b/src/lic.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 29/01/2013 (at 15:05) by Erwan Jahier> *) +(* Time-stamp: <modified the 31/01/2013 (at 10:14) by Erwan Jahier> *) (** Define the Data Structure representing Compiled programs. *) @@ -187,9 +187,10 @@ and val_exp = pour typer l'appel de l'opérateur ? *) and val_exp_core = - | CallByPosLic of (by_pos_op srcflagged * operands) + | CallByPosLic of (by_pos_op srcflagged * operands) | CallByNameLic of (by_name_op srcflagged * (Ident.t srcflagged * val_exp) list) + | Merge of val_exp srcflagged * (Ident.long srcflagged * val_exp) list and operands = OperLic of val_exp list @@ -223,7 +224,6 @@ and by_pos_op = | ARRAY_ACCES of int | ARRAY_SLICE of slice_info - | MERGE of (Ident.t * (Ident.t list)) (*--------------------------------------------------------------------- diff --git a/src/licDump.ml b/src/licDump.ml index c82bdd34..50908c20 100644 --- a/src/licDump.ml +++ b/src/licDump.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 29/01/2013 (at 15:59) by Erwan Jahier> *) +(* Time-stamp: <modified the 31/01/2013 (at 10:27) by Erwan Jahier> *) open Errors open Printf @@ -264,7 +264,6 @@ and (string_of_by_pos_op_eff: Lic.by_pos_op srcflagged -> Lic.val_exp list -> st fun posop vel -> let tuple vel = (String.concat ", " (List.map string_of_val_exp_eff vel)) in let tuple_par vel = "(" ^ (tuple vel) ^ ")" in - let tuple_underscore vel = String.concat "_" (List.map string_of_val_exp_eff vel) in let tuple_square vel = "[" ^ (String.concat ", " (List.map string_of_val_exp_eff vel)) ^ "]" in @@ -396,8 +395,6 @@ and (string_of_by_pos_op_eff: Lic.by_pos_op srcflagged -> Lic.val_exp list -> st (string_of_val_exp_eff ve1) ^ (string_of_slice_info_eff si_eff) | ARRAY_SLICE(_), _ -> assert false (* todo *) - | MERGE _, _ -> assert false (* todo *) - (* | ITERATOR _, _ -> assert false (* todo *) *) (* Cannot happen *) | ARROW, _ -> assert false @@ -439,17 +436,26 @@ and string_of_val_exp_eff_core ve_core = (* ICI : on pourrait afficher en commentaire l'éventuel type_matches ? *) (string_of_by_pos_op_eff by_pos_op_eff vel) + | Merge (ve, cl) -> ( + "merge " ^ (string_of_val_exp_eff ve.it) ^ " " ^ + (String.concat " " + (List.map + (fun (id,ve) -> "| "^(dump_long id.it) ^ " => " ^ (string_of_val_exp_eff ve)^" ") + cl + ) + ) + ) | CallByNameLic(by_name_op_eff, fl) -> (match by_name_op_eff.it with | STRUCT (pn,idref) -> ( match Ident.pack_of_idref idref with - | Some pn -> - Ident.string_of_idref idref + | Some pn -> Ident.string_of_idref idref | None -> let idref = Ident.make_idref pn (Ident.of_idref idref) in Ident.string_of_idref idref ) - | STRUCT_anonymous -> "") ^ + | STRUCT_anonymous -> "" + ) ^ ( "{" ^ (String.concat ";" (List.map (fun (id,veff) -> @@ -458,7 +464,7 @@ and string_of_val_exp_eff_core ve_core = (if is_a_tuple veff then ("("^ str^")") else str) ) fl)) ^ - "}" + "}") and wrap_long_line str = @@ -620,11 +626,11 @@ and (string_of_ident_clk : Ident.clk -> string) = | "True" -> (Ident.to_string v) | "False" -> "not " ^ (Ident.to_string v) | _ -> - if !Global.lv4 then - raise (Errors.Global_error - ("*** Cannot generate V4 style Lustre for programs with enumerated "^ - "clocks (yet), sorry.")) - else +(* if !Global.lv4 then *) +(* raise (Errors.Global_error *) +(* ("*** Cannot generate V4 style Lustre for programs with enumerated "^ *) +(* "clocks (yet), sorry.")) *) +(* else *) Ident.string_of_clk clk in clk_exp_str diff --git a/src/licEvalType.ml b/src/licEvalType.ml index 962277f9..62936a90 100644 --- a/src/licEvalType.ml +++ b/src/licEvalType.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 20/12/2012 (at 10:59) by Erwan Jahier> *) +(* Time-stamp: <modified the 30/01/2013 (at 13:49) by Erwan Jahier> *) open AstPredef open Lxm @@ -25,21 +25,22 @@ let (type_error : Lic.type_ list -> string -> 'a) = else (" whereas\n*** type '" ^expect^"' was expected"))))) let raise_type_error - (prov: Lic.type_ list) - (expec: Lic.type_ list) - (msg: string) -= raise (EvalType_error( - let pr = Lic.string_of_type_list prov in - let ex = Lic.string_of_type_list expec in - ( - "\n*** type '" ^ pr ^ "' was provided" ^ ( - if ex = "" then "" - else (" whereas\n*** type '" ^ex^"' was expected") - ) ^ ( - if msg = "" then "" else ("\n*** " ^ msg) + (prov: Lic.type_ list) + (expec: Lic.type_ list) + (msg: string) + = raise (EvalType_error( + let pr = Lic.string_of_type_list prov in + let ex = Lic.string_of_type_list expec in + ( + "\n*** type '" ^ pr ^ "' was provided" ^ ( + if ex = "" then "" + else (" whereas\n*** type '" ^ex^"' was expected") + ) ^ ( + if msg = "" then "" else ("\n*** " ^ msg) + ) ) - ) -)) + ) + ) let raise_arity_error (msg:string) (get:int) (expect:int) = raise (EvalType_error( @@ -85,24 +86,24 @@ let (type_to_array_type: Lic.var_info list -> int -> (Ident.t * Lic.type_) list) (* Extract the node and the constant from a list of static args *) let get_node_and_int_const - (lxm: Lxm.t) - (sargs: Lic.static_arg list) -: (Lic.node_key * int) = - - match sargs with - | [ NodeStaticArgLic (_,nk); ConstStaticArgLic carg ] -> ( + (lxm: Lxm.t) + (sargs: Lic.static_arg list) + : (Lic.node_key * int) = + + match sargs with + | [ NodeStaticArgLic (_,nk); ConstStaticArgLic carg ] -> ( let c = match carg with - | (_, Int_const_eff c) -> c - | (_, Abstract_const_eff(_,_,Int_const_eff c, true)) -> c - | (_, zcl) -> - let msg = "immediate integer expected, but get \"" + | (_, Int_const_eff c) -> c + | (_, Abstract_const_eff(_,_,Int_const_eff c, true)) -> c + | (_, zcl) -> + let msg = "immediate integer expected, but get \"" ^ (LicDump.string_of_const_eff zcl) ^ "\"\n" - in raise (Compile_error(lxm, msg)) + in raise (Compile_error(lxm, msg)) in (nk, c) - ) - | _ -> + ) + | _ -> let msg = "*** an integer and a node are expected.\n" in raise (Compile_error(lxm, msg)) @@ -114,45 +115,45 @@ let get_id_type vi = vi.var_name_eff, vi.var_type_eff let condact_profile - (id_solver: Lic.id_solver) - (lxm: Lxm.t) - (sargs: Lic.static_arg list) -: Lic.node_profile = -try -(*-------------------------------------------------------------------- -CONDACT ----------------------------------------------------------------------- - Given : - - A node n of type: a_1 * ... * a_n -> b_1 * ... * b_k - - A (tuple) const: b_1 * ... * b_k -Gen a node of type : bool * a_1 * ... * a_n -> b_1 * ... * b_k ----------------------------------------------------------------------*) - let nk, dflt = + (id_solver: Lic.id_solver) + (lxm: Lxm.t) + (sargs: Lic.static_arg list) + : Lic.node_profile = + try + (*-------------------------------------------------------------------- + CONDACT + ---------------------------------------------------------------------- + Given : + - A node n of type: a_1 * ... * a_n -> b_1 * ... * b_k + - A (tuple) const: b_1 * ... * b_k + Gen a node of type : bool * a_1 * ... * a_n -> b_1 * ... * b_k + ---------------------------------------------------------------------*) + let nk, dflt = match sargs with - | [NodeStaticArgLic(_,nk) ; ConstStaticArgLic(_,dflt)] -> nk, dflt - | _ -> assert false - in + | [NodeStaticArgLic(_,nk) ; ConstStaticArgLic(_,dflt)] -> nk, dflt + | _ -> assert false + in (* recherche le profil de nk ... *) - let ne = UglyStuff.node_exp_of_node_key id_solver nk lxm in - let inlist = ne.inlist_eff in - let outlist = ne.outlist_eff in + let ne = UglyStuff.node_exp_of_node_key id_solver nk lxm in + let inlist = ne.inlist_eff in + let outlist = ne.outlist_eff in (* dflt_types doit êre compatiple avec outlist *) - let dflt_types = types_of_const dflt in - let dl = List.length dflt_types in - let ol = List.length outlist in - Verbose.printf ~level:3 " condact_profile: dflt=%s\n" (string_of_const_eff dflt); - let _ = if (dl <> ol) then - raise_arity_error " in condact default arg" dl ol in - let out_types = List.map (fun x -> x.var_type_eff) outlist in - - let _ = if dflt_types <> out_types then - raise_type_error dflt_types out_types "in condact default arg" - in + let dflt_types = types_of_const dflt in + let dl = List.length dflt_types in + let ol = List.length outlist in + Verbose.printf ~level:3 " condact_profile: dflt=%s\n" (string_of_const_eff dflt); + let _ = if (dl <> ol) then + raise_arity_error " in condact default arg" dl ol in + let out_types = List.map (fun x -> x.var_type_eff) outlist in + + let _ = if dflt_types <> out_types then + raise_type_error dflt_types out_types "in condact default arg" + in (* ok pour les args statiques, le profil dynamique est : *) - (("_", Bool_type_eff)::(List.map get_id_type inlist), List.map get_id_type outlist) -with -| EvalType_error msg -> raise (Compile_error(lxm, "type error: "^msg)) + (("_", Bool_type_eff)::(List.map get_id_type inlist), List.map get_id_type outlist) + with + | EvalType_error msg -> raise (Compile_error(lxm, "type error: "^msg)) let map_profile @@ -391,54 +392,54 @@ let make_simple_node_exp_eff (* exported *) let f - (id_solver: Lic.id_solver) - (op: op) - (lxm: Lxm.t) - (sargs: Lic.static_arg list) -: typer = fun ll -> + (id_solver: Lic.id_solver) + (op: op) + (lxm: Lxm.t) + (sargs: Lic.static_arg list) + : typer = fun ll -> match op with | IF_n -> ( (* VERRUE 1 *) (* j'arrive pas a traiter le if de facon generique (pour l'instant...) a cause du fait que le if peut renvoyer un tuple. *) - match ll with - | [[Bool_type_eff]; t; e] -> - if t = e then t else - (type_error (List.flatten [[Bool_type_eff]; t; e]) "bool*any*any") - | x -> (raise_arity_error "" (List.length x) 3) - ) + match ll with + | [[Bool_type_eff]; t; e] -> + if t = e then t else + (type_error (List.flatten [[Bool_type_eff]; t; e]) "bool*any*any") + | x -> (raise_arity_error "" (List.length x) 3) + ) | (NOR_n | DIESE_n) -> (* VERRUE 2 : cf XXX above: therefore i define an ad-hoc check for them. *) - let check_nary_iter acc ceff = - match ceff with (Bool_type_eff) -> - acc | _ -> (type_error [ceff] "bool") - in - List.fold_left check_nary_iter () (List.flatten ll); - [Bool_type_eff] + let check_nary_iter acc ceff = + match ceff with (Bool_type_eff) -> + acc | _ -> (type_error [ceff] "bool") + in + List.fold_left check_nary_iter () (List.flatten ll); + [Bool_type_eff] | _ -> (* general case *) - let node_eff = make_node_exp_eff id_solver (Some false) op lxm sargs in - let lti = List.map (fun v -> v.var_type_eff) node_eff.inlist_eff - and lto = List.map (fun v -> v.var_type_eff) node_eff.outlist_eff in - let l = List.flatten ll in - if (List.length l <> List.length lti) then - raise_arity_error "" (List.length l) (List.length lti) - else if (l = []) then + let node_eff = make_node_exp_eff id_solver (Some false) op lxm sargs in + let lti = List.map (fun v -> v.var_type_eff) node_eff.inlist_eff + and lto = List.map (fun v -> v.var_type_eff) node_eff.outlist_eff in + let l = List.flatten ll in + if (List.length l <> List.length lti) then + raise_arity_error "" (List.length l) (List.length lti) + else if (l = []) then (* useless to call UnifyType.f ! *) - lto - else - match UnifyType.f lti l with - | Equal -> lto - | Unif (TypeVar Any) -> - raise_type_error l lti - "could not instanciate polymorphic type" - | Unif (TypeVar AnyNum) -> - raise_type_error l lti - "could not instanciate overloaded type" - | Unif t -> - List.map (subst_type t) lto - - | Ko(str) -> - raise_type_error l lti str + lto + else + match UnifyType.f lti l with + | Equal -> lto + | Unif (TypeVar Any) -> + raise_type_error l lti + "could not instanciate polymorphic type" + | Unif (TypeVar AnyNum) -> + raise_type_error l lti + "could not instanciate overloaded type" + | Unif t -> + List.map (subst_type t) lto + + | Ko(str) -> + raise_type_error l lti str diff --git a/src/licTab.ml b/src/licTab.ml index a1f6511e..56690ff2 100644 --- a/src/licTab.ml +++ b/src/licTab.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 23/01/2013 (at 10:14) by Erwan Jahier> *) +(* Time-stamp: <modified the 31/01/2013 (at 09:40) by Erwan Jahier> *) open Lxm @@ -557,13 +557,6 @@ and (type_check_do: t -> Ident.long -> Lxm.t -> AstTabSymbol.t -> bool -> let eff_fields = List.map make_field sti.st_flist in Struct_type_eff (n, eff_fields) ) - in - let is_struct_or_array = match type_eff with - | Array_type_eff(_) - | Struct_type_eff(_) -> true - | TypeVar _ | Bool_type_eff | Int_type_eff | Real_type_eff - | External_type_eff(_) | Abstract_type_eff(_) | Enum_type_eff(_) - -> false in type_eff ) @@ -1076,7 +1069,7 @@ and (node_check_interface_do: t -> Lic.node_key -> Lxm.t -> Ast2lic.of_node node_id_solver node_alias | CALL_n(node_alias) -> Ast2lic.of_node node_id_solver node_alias - | (MERGE_n _|ARRAY_SLICE_n _|ARRAY_ACCES_n _|STRUCT_ACCESS_n _ + | (ARRAY_SLICE_n _|ARRAY_ACCES_n _|STRUCT_ACCESS_n _ |IDENT_n _|ARRAY_n|HAT_n|CONCAT_n|WITH_n(_)|TUPLE_n|WHEN_n _ |CURRENT_n|FBY_n|ARROW_n|PRE_n) -> diff --git a/src/lxm.ml b/src/lxm.ml index ea97f138..03e4d940 100644 --- a/src/lxm.ml +++ b/src/lxm.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 11/01/2013 (at 16:51) by Erwan Jahier> *) +(* Time-stamp: <modified the 29/01/2013 (at 17:37) by Erwan Jahier> *) (** Common to lus2lic and lic2loc *) @@ -19,7 +19,7 @@ type t = { _line : int ; _cstart : int ; _cend : int; - _pragma : pragma list + _pragma : pragma list } let str x = (x._str) diff --git a/src/mainArgs.ml b/src/mainArgs.ml index 8ed16933..578404a1 100644 --- a/src/mainArgs.ml +++ b/src/mainArgs.ml @@ -182,7 +182,7 @@ let mkoptab (opt:t) : unit = ( mkopt opt ["-version"; "--version"] - (Arg.Unit(function _ -> Printf.fprintf stderr "%s\n" Version.str; exit 0)) + (Arg.Unit(function _ -> Printf.fprintf stdout "%s\n" Version.str; exit 0)) ["Print the current version and exit"] ; (* verbose *) diff --git a/src/parser.mly b/src/parser.mly index c4404947..dfd0bc56 100644 --- a/src/parser.mly +++ b/src/parser.mly @@ -822,8 +822,24 @@ Expression: /* Parenthesis or tuple */ | TK_OPEN_PAR ExpressionList TK_CLOSE_PAR { if (List.length $2 = 1) then (List.hd $2) else naryexp $1 TUPLE_n (List.rev $2) } + /* merge */ + | TK_MERGE Expression MergeCaseList + { make_merge_op $1 $2 $3 } ; +MergeCaseList: + MergeCase + { [$1] } + | MergeCaseList MergeCase + { $2::$1 } + ; + +MergeCase: + TK_BAR IdentRef TK_ARROW Expression + { ($2,$4) } + | TK_BAR IdentRef TK_IMPL Expression + { ($2,$4) } + ; ClockExpr: Ident TK_OPEN_PAR Ident TK_CLOSE_PAR @@ -935,6 +951,7 @@ StaticArg: | IDENT_n idref -> {src=op.src ; it = StaticArgIdent idref } | _ -> {src=op.src ; it= StaticArgConst $1} ) + | MERGE_n _ | CallByName _ -> print_string "*** unexpected static argument\n"; assert false @@ -990,6 +1007,7 @@ ByNameStaticArg: | IDENT_n idref -> {src=op.src ; it = StaticArgIdent idref } | _ -> {src=op.src ; it= StaticArgConst $3} ) + | MERGE_n _ | CallByName _ -> print_string "*** unexpected static argument\n"; assert false @@ -1052,9 +1070,9 @@ SimpleTuple: | [x] -> x | l -> naryexp $1 TUPLE_n (List.rev l) ) } - + ; SimpleExpList: SimpleExp - { [$1] } + { [$1] } | SimpleExpList TK_COMA SimpleExp { $3::$1 } ; diff --git a/src/parserUtils.ml b/src/parserUtils.ml index 10ddda43..633ba005 100644 --- a/src/parserUtils.ml +++ b/src/parserUtils.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 21/12/2012 (at 10:29) by Erwan Jahier> *) +(* Time-stamp: <modified the 30/01/2013 (at 18:05) by Erwan Jahier> *) (** *) @@ -119,6 +119,14 @@ let flat_twice_flagged_list (**********************************************************************************) (** Utilitaries to build [val_exp] *) +(* let make_merge_op lxm (v:val_exp) (l:(Lxm.t * val_exp) list) = *) +(* let l = List.map (fun (lxm,ve) -> { it=Lxm.str lxm ; src = lxm },ve) l in *) +(* CallByPos( { src = lxm ; it = MERGE_n (v,l) }, Oper [] ) *) + +let make_merge_op lxm (enum_clk:val_exp) (l:(Ident.idref srcflagged * val_exp) list) = + let l = List.map (fun (idref,ve) -> idref,ve) l in + let enum_clk = { src = lxm ; it = enum_clk } in + MERGE_n(enum_clk,l) let make_predef_posop lxm op = let op = flagit op lxm in diff --git a/src/unifyClock.ml b/src/unifyClock.ml index efd15ef5..d6784f87 100644 --- a/src/unifyClock.ml +++ b/src/unifyClock.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 29/01/2013 (at 16:24) by Erwan Jahier> *) +(* Time-stamp: <modified the 31/01/2013 (at 09:38) by Erwan Jahier> *) open LicDump @@ -201,6 +201,11 @@ let rec (apply_subst_val_exp : subst -> Lic.val_exp -> Lic.val_exp) = (fun (fn,ve) -> (fn, apply_subst_val_exp s ve)) fl in CallByNameLic(by_name_op, fl) + | Merge(ce,cl) -> + let cl = List.map + (fun (fn,ve) -> (fn, apply_subst_val_exp s ve)) cl + in + Merge(flagit (apply_subst_val_exp s ce.it) ce.src, cl) in let new_clk = List.map (apply_subst s) ve.ve_clk in let ve = { ve with ve_core = ve_core ; ve_clk = new_clk } in diff --git a/test/lus2lic.log.ref b/test/lus2lic.log.ref index 1127a670..737c551d 100644 --- a/test/lus2lic.log.ref +++ b/test/lus2lic.log.ref @@ -1,4 +1,4 @@ -Test Run By jahier on Tue Jan 29 16:19:02 2013 +Test Run By jahier on Thu Jan 31 17:42:30 2013 Native configuration is i686-pc-linux-gnu === lus2lic tests === @@ -391,6 +391,12 @@ spawn ./lus2lic -ec -o /tmp/X1.ec should_work/X1.lus PASS: ./lus2lic {-ec -o /tmp/X1.ec should_work/X1.lus} spawn ./ec2c -o /tmp/X1.c /tmp/X1.ec PASS: ./ec2c {-o /tmp/X1.c /tmp/X1.ec} +spawn ./lus2lic -o /tmp/is_stable.lic should_work/is_stable.lus +PASS: ./lus2lic {-o /tmp/is_stable.lic should_work/is_stable.lus} +spawn ./lus2lic -ec -o /tmp/is_stable.ec should_work/is_stable.lus +PASS: ./lus2lic {-ec -o /tmp/is_stable.ec should_work/is_stable.lus} +spawn ./ec2c -o /tmp/is_stable.c /tmp/is_stable.ec +PASS: ./ec2c {-o /tmp/is_stable.c /tmp/is_stable.ec} spawn ./lus2lic -o /tmp/test_clash.lic should_work/test_clash.lus PASS: ./lus2lic {-o /tmp/test_clash.lic should_work/test_clash.lus} spawn ./lus2lic -ec -o /tmp/test_clash.ec should_work/test_clash.lus @@ -535,6 +541,12 @@ spawn ./lus2lic -ec -o /tmp/packs.ec should_work/packs.lus PASS: ./lus2lic {-ec -o /tmp/packs.ec should_work/packs.lus} spawn ./ec2c -o /tmp/packs.c /tmp/packs.ec PASS: ./ec2c {-o /tmp/packs.c /tmp/packs.ec} +spawn ./lus2lic -o /tmp/sincos.lic should_work/sincos.lus +PASS: ./lus2lic {-o /tmp/sincos.lic should_work/sincos.lus} +spawn ./lus2lic -ec -o /tmp/sincos.ec should_work/sincos.lus +PASS: ./lus2lic {-ec -o /tmp/sincos.ec should_work/sincos.lus} +spawn ./ec2c -o /tmp/sincos.c /tmp/sincos.ec +PASS: ./ec2c {-o /tmp/sincos.c /tmp/sincos.ec} spawn ./lus2lic -o /tmp/newpacks.lic should_work/newpacks.lus PASS: ./lus2lic {-o /tmp/newpacks.lic should_work/newpacks.lus} spawn ./lus2lic -ec -o /tmp/newpacks.ec should_work/newpacks.lus @@ -1309,12 +1321,6 @@ spawn ./lus2lic -ec -o /tmp/shiftFill_ludic.ec should_work/shiftFill_ludic.lus PASS: ./lus2lic {-ec -o /tmp/shiftFill_ludic.ec should_work/shiftFill_ludic.lus} spawn ./ec2c -o /tmp/shiftFill_ludic.c /tmp/shiftFill_ludic.ec PASS: ./ec2c {-o /tmp/shiftFill_ludic.c /tmp/shiftFill_ludic.ec} -spawn ./lus2lic -o /tmp/parametric_node2.lic should_work/parametric_node2.lus -PASS: ./lus2lic {-o /tmp/parametric_node2.lic should_work/parametric_node2.lus} -spawn ./lus2lic -ec -o /tmp/parametric_node2.ec should_work/parametric_node2.lus -PASS: ./lus2lic {-ec -o /tmp/parametric_node2.ec should_work/parametric_node2.lus} -spawn ./ec2c -o /tmp/parametric_node2.c /tmp/parametric_node2.ec -PASS: ./ec2c {-o /tmp/parametric_node2.c /tmp/parametric_node2.ec} spawn ./lus2lic -o /tmp/after.lic should_work/after.lus PASS: ./lus2lic {-o /tmp/after.lic should_work/after.lus} spawn ./lus2lic -ec -o /tmp/after.ec should_work/after.lus @@ -1417,6 +1423,14 @@ spawn ./lus2lic -ec -o /tmp/clock1_2ms.ec should_work/clock1_2ms.lus PASS: ./lus2lic {-ec -o /tmp/clock1_2ms.ec should_work/clock1_2ms.lus} spawn ./ec2c -o /tmp/clock1_2ms.c /tmp/clock1_2ms.ec PASS: ./ec2c {-o /tmp/clock1_2ms.c /tmp/clock1_2ms.ec} +spawn ./lus2lic -o /tmp/merge.lic should_work/merge.lus +PASS: ./lus2lic {-o /tmp/merge.lic should_work/merge.lus} +spawn ./lus2lic -ec -o /tmp/merge.ec should_work/merge.lus +PASS: ./lus2lic {-ec -o /tmp/merge.ec should_work/merge.lus} +spawn ./ec2c -o /tmp/merge.c /tmp/merge.ec +syntax error - at line 13 +syntax errors... +FAIL: Try ec2c on the result: ./ec2c {-o /tmp/merge.c /tmp/merge.ec} spawn ./lus2lic -o /tmp/decl.lic should_work/decl.lus PASS: ./lus2lic {-o /tmp/decl.lic should_work/decl.lus} spawn ./lus2lic -ec -o /tmp/decl.ec should_work/decl.lus @@ -1485,6 +1499,11 @@ spawn ./lus2lic -o /tmp/parametric_node.lic should_fail/type/parametric_node.lus *** can't eval type: bad array size, int expected but get real XFAIL: Test bad programs (type): lus2lic {-o /tmp/parametric_node.lic should_fail/type/parametric_node.lus} +spawn ./lus2lic -o /tmp/merge_bad_enum.lic should_fail/type/merge_bad_enum.lus +*** Error in file "/home/jahier/lus2lic/test/should_fail/type/merge_bad_enum.lus", line 8, col 9 to 13, token 'merge': +*** type error: type error in a merge branch: merge_bad_enum::trival was expected, but merge_bad_enum::okko was provided. + +XFAIL: Test bad programs (type): lus2lic {-o /tmp/merge_bad_enum.lic should_fail/type/merge_bad_enum.lus} spawn ./lus2lic -o /tmp/condact2.lic should_fail/type/condact2.lus *** Error in file "/home/jahier/lus2lic/test/should_fail/type/condact2.lus", line 5, col 6 to 12, token 'condact': *** type error: @@ -1492,6 +1511,11 @@ spawn ./lus2lic -o /tmp/condact2.lic should_fail/type/condact2.lus *** bool can't be matched by int XFAIL: Test bad programs (type): lus2lic {-o /tmp/condact2.lic should_fail/type/condact2.lus} +spawn ./lus2lic -o /tmp/merge_bad_type.lic should_fail/type/merge_bad_type.lus +*** Error in file "/home/jahier/lus2lic/test/should_fail/type/merge_bad_type.lus", line 8, col 9 to 13, token 'merge': +*** type error: types differ in merge branches: real <> int + +XFAIL: Test bad programs (type): lus2lic {-o /tmp/merge_bad_type.lic should_fail/type/merge_bad_type.lus} spawn ./lus2lic -o /tmp/packages.lic should_fail/type/packages.lus *** Error in file "/home/jahier/lus2lic/test/should_fail/type/packages.lus", line 31, col 10 to 15, token 'preced': *** provided node for inter::preced is not compatible with its implementation: @@ -1514,11 +1538,22 @@ spawn ./lus2lic -o /tmp/Gyro-2.lic should_fail/type/Gyro-2.lus *** syntax error XFAIL: Test bad programs (type): lus2lic {-o /tmp/Gyro-2.lic should_fail/type/Gyro-2.lus} +spawn ./lus2lic -o /tmp/merge_bad_clk.lic should_fail/type/merge_bad_clk.lus +*** Error in file "/home/jahier/lus2lic/test/should_fail/type/merge_bad_clk.lus", line 9, col 11 to 14, token 'Pile': +*** +*** clock error: The two following clocks are not unifiable: +*** on merge_bad_clk::Pile(clk) on base +*** on merge_bad_clk::Face(clk) on base + + +XFAIL: Test bad programs (type): lus2lic {-o /tmp/merge_bad_clk.lic should_fail/type/merge_bad_clk.lus} spawn ./lus2lic -o /tmp/parametric_node4.lic should_fail/type/parametric_node4.lus *** Error in file "/home/jahier/lus2lic/test/should_fail/type/parametric_node4.lus", line 4, col 17 to 17, token 'n': *** can't eval type: bad array size, int expected but get real XFAIL: Test bad programs (type): lus2lic {-o /tmp/parametric_node4.lic should_fail/type/parametric_node4.lus} +spawn ./lus2lic -o /tmp/merge_not_exhaustive.lic should_fail/type/merge_not_exhaustive.lus +XPASS: Test bad programs (type): lus2lic {-o /tmp/merge_not_exhaustive.lic should_fail/type/merge_not_exhaustive.lus} spawn ./lus2lic -o /tmp/const2.lic should_fail/type/const2.lus *** Error in file "/home/jahier/lus2lic/test/should_fail/type/const2.lus", line 16, col 12 to 13, token '<>': *** type error: @@ -1539,6 +1574,11 @@ spawn ./lus2lic -o /tmp/ts02.lic should_fail/type/ts02.lus XFAIL: Test bad programs (type): lus2lic {-o /tmp/ts02.lic should_fail/type/ts02.lus} spawn ./lus2lic -o /tmp/parametric_node2.lic should_fail/type/parametric_node2.lus XPASS: Test bad programs (type): lus2lic {-o /tmp/parametric_node2.lic should_fail/type/parametric_node2.lus} +spawn ./lus2lic -o /tmp/merge.lic should_fail/type/merge.lus +*** Error in file "/home/jahier/lus2lic/test/should_fail/type/merge.lus", line 8, col 14 to 14, token ':': +*** syntax error + +XFAIL: Test bad programs (type): lus2lic {-o /tmp/merge.lic should_fail/type/merge.lus} spawn ./lus2lic -o /tmp/when_enum.lic should_fail/clock/when_enum.lus *** Error in file "/home/jahier/lus2lic/test/should_fail/clock/when_enum.lus", line 10, col 12 to 15, token 'toto': *** @@ -1668,7 +1708,7 @@ spawn ./lus2lic -o /tmp/m.lic should_fail/semantics/m.lus *** syntax error XFAIL: Test bad programs (semantics): lus2lic {-o /tmp/m.lic should_fail/semantics/m.lus} -testcase ./lus2lic.tests/non-reg.exp completed in 53 seconds +testcase ./lus2lic.tests/non-reg.exp completed in 54 seconds Running ./lus2lic.tests/progression.exp ... spawn ./lus2lic -o /tmp/when_enum.out should_work/broken/when_enum.lus *** Error in file "/home/jahier/lus2lic/test/should_work/broken/when_enum.lus", line 10, col 12 to 15, token 'toto': @@ -1680,7 +1720,13 @@ spawn ./lus2lic -o /tmp/when_enum.out should_work/broken/when_enum.lus FAIL: without any option: ./lus2lic { -o /tmp/when_enum.out should_work/broken/when_enum.lus} spawn ./lus2lic -ec -o /tmp/when_enum.ec should_work/broken/when_enum.lus -Error. *** Cannot generate V4 style Lustre for programs with enumerated clocks (yet), sorry. +*** Error in file "/home/jahier/lus2lic/test/should_work/broken/when_enum.lus", line 10, col 12 to 15, token 'toto': +*** +*** clock error: The two following clocks are not unifiable: +*** on A(a) on base +*** on clk on base + + FAIL: Generate ec code : ./lus2lic {-ec -o /tmp/when_enum.ec should_work/broken/when_enum.lus} spawn ./lus2lic -o /tmp/when_not.out should_work/broken/when_not.lus *** Error in file "/home/jahier/lus2lic/test/should_work/broken/when_not.lus", line 7, col 12 to 17, token 'clock4': @@ -1707,8 +1753,7 @@ PASS: ./lus2lic {-ec -o /tmp/packages.ec should_work/broken/packages.lus} spawn ./lus2lic -o /tmp/when_node.out should_work/broken/when_node.lus PASS: ./lus2lic { -o /tmp/when_node.out should_work/broken/when_node.lus} spawn ./lus2lic -ec -o /tmp/when_node.ec should_work/broken/when_node.lus -Error. *** Cannot generate V4 style Lustre for programs with enumerated clocks (yet), sorry. -FAIL: Generate ec code : ./lus2lic {-ec -o /tmp/when_node.ec should_work/broken/when_node.lus} +PASS: ./lus2lic {-ec -o /tmp/when_node.ec should_work/broken/when_node.lus} spawn ./lus2lic -o /tmp/testSystem.out should_work/broken/testSystem.lus *** Error in file "/home/jahier/lus2lic/test/should_work/broken/testSystem.lus", line 3, col 6 to 9, token 'capt': *** unknown package @@ -1737,16 +1782,6 @@ spawn ./lus2lic -ec -o /tmp/car-orig.ec should_work/broken/car-orig.lus *** bool and int are not unifiable FAIL: Generate ec code : ./lus2lic {-ec -o /tmp/car-orig.ec should_work/broken/car-orig.lus} -spawn ./lus2lic -o /tmp/merge.out should_work/broken/merge.lus -*** Error in file "/home/jahier/lus2lic/test/should_work/broken/merge.lus", line 7, col 15 to 17, token 'clk': -*** syntax error - -FAIL: without any option: ./lus2lic { -o /tmp/merge.out should_work/broken/merge.lus} -spawn ./lus2lic -ec -o /tmp/merge.ec should_work/broken/merge.lus -*** Error in file "/home/jahier/lus2lic/test/should_work/broken/merge.lus", line 7, col 15 to 17, token 'clk': -*** syntax error - -FAIL: Generate ec code : ./lus2lic {-ec -o /tmp/merge.ec should_work/broken/merge.lus} spawn ./lus2lic -o /tmp/bad_call03.lic should_fail/type/broken/bad_call03.lus XPASS: Test bad programs (type): lus2lic {-o /tmp/bad_call03.lic should_fail/type/broken/bad_call03.lus} spawn ./lus2lic -o /tmp/ts03.lic should_fail/type/broken/ts03.lus @@ -1770,9 +1805,9 @@ testcase ./lus2lic.tests/progression.exp completed in 0 seconds === lus2lic Summary === -# of expected passes 728 -# of unexpected failures 11 -# of unexpected successes 10 -# of expected failures 32 +# of expected passes 734 +# of unexpected failures 9 +# of unexpected successes 11 +# of expected failures 36 # of unresolved testcases 2 -runtest completed at Tue Jan 29 16:19:55 2013 +runtest completed at Thu Jan 31 17:43:24 2013 diff --git a/test/lus2lic.sum b/test/lus2lic.sum index b19cf262..f3f1c95c 100644 --- a/test/lus2lic.sum +++ b/test/lus2lic.sum @@ -1,4 +1,4 @@ -Test Run By jahier on Tue Jan 29 16:19:02 2013 +Test Run By jahier on Thu Jan 31 17:42:30 2013 Native configuration is i686-pc-linux-gnu === lus2lic tests === @@ -198,6 +198,9 @@ PASS: ./ec2c {-o /tmp/mm22.c /tmp/mm22.ec} PASS: ./lus2lic {-o /tmp/X1.lic should_work/X1.lus} PASS: ./lus2lic {-ec -o /tmp/X1.ec should_work/X1.lus} PASS: ./ec2c {-o /tmp/X1.c /tmp/X1.ec} +PASS: ./lus2lic {-o /tmp/is_stable.lic should_work/is_stable.lus} +PASS: ./lus2lic {-ec -o /tmp/is_stable.ec should_work/is_stable.lus} +PASS: ./ec2c {-o /tmp/is_stable.c /tmp/is_stable.ec} PASS: ./lus2lic {-o /tmp/test_clash.lic should_work/test_clash.lus} PASS: ./lus2lic {-ec -o /tmp/test_clash.ec should_work/test_clash.lus} PASS: ./ec2c {-o /tmp/test_clash.c /tmp/test_clash.ec} @@ -270,6 +273,9 @@ PASS: ./ec2c {-o /tmp/trivial.c /tmp/trivial.ec} PASS: ./lus2lic {-o /tmp/packs.lic should_work/packs.lus} PASS: ./lus2lic {-ec -o /tmp/packs.ec should_work/packs.lus} PASS: ./ec2c {-o /tmp/packs.c /tmp/packs.ec} +PASS: ./lus2lic {-o /tmp/sincos.lic should_work/sincos.lus} +PASS: ./lus2lic {-ec -o /tmp/sincos.ec should_work/sincos.lus} +PASS: ./ec2c {-o /tmp/sincos.c /tmp/sincos.ec} PASS: ./lus2lic {-o /tmp/newpacks.lic should_work/newpacks.lus} PASS: ./lus2lic {-ec -o /tmp/newpacks.ec should_work/newpacks.lus} PASS: ./ec2c {-o /tmp/newpacks.c /tmp/newpacks.ec} @@ -657,9 +663,6 @@ PASS: ./ec2c {-o /tmp/cond01.c /tmp/cond01.ec} PASS: ./lus2lic {-o /tmp/shiftFill_ludic.lic should_work/shiftFill_ludic.lus} PASS: ./lus2lic {-ec -o /tmp/shiftFill_ludic.ec should_work/shiftFill_ludic.lus} PASS: ./ec2c {-o /tmp/shiftFill_ludic.c /tmp/shiftFill_ludic.ec} -PASS: ./lus2lic {-o /tmp/parametric_node2.lic should_work/parametric_node2.lus} -PASS: ./lus2lic {-ec -o /tmp/parametric_node2.ec should_work/parametric_node2.lus} -PASS: ./ec2c {-o /tmp/parametric_node2.c /tmp/parametric_node2.ec} PASS: ./lus2lic {-o /tmp/after.lic should_work/after.lus} PASS: ./lus2lic {-ec -o /tmp/after.ec should_work/after.lus} PASS: ./ec2c {-o /tmp/after.c /tmp/after.ec} @@ -711,6 +714,9 @@ PASS: ./ec2c {-o /tmp/SWITCH1.c /tmp/SWITCH1.ec} PASS: ./lus2lic {-o /tmp/clock1_2ms.lic should_work/clock1_2ms.lus} PASS: ./lus2lic {-ec -o /tmp/clock1_2ms.ec should_work/clock1_2ms.lus} PASS: ./ec2c {-o /tmp/clock1_2ms.c /tmp/clock1_2ms.ec} +PASS: ./lus2lic {-o /tmp/merge.lic should_work/merge.lus} +PASS: ./lus2lic {-ec -o /tmp/merge.ec should_work/merge.lus} +FAIL: Try ec2c on the result: ./ec2c {-o /tmp/merge.c /tmp/merge.ec} PASS: ./lus2lic {-o /tmp/decl.lic should_work/decl.lus} PASS: ./lus2lic {-ec -o /tmp/decl.ec should_work/decl.lus} PASS: ./ec2c {-o /tmp/decl.c /tmp/decl.ec} @@ -739,15 +745,20 @@ XFAIL: Test bad programs (syntax): lus2lic {-o /tmp/old_style_and_pack.lic shoul XFAIL: Test bad programs (syntax): lus2lic {-o /tmp/record.lic should_fail/syntax/record.lus} XFAIL: Test bad programs (type): lus2lic {-o /tmp/parametric_node3.lic should_fail/type/parametric_node3.lus} XFAIL: Test bad programs (type): lus2lic {-o /tmp/parametric_node.lic should_fail/type/parametric_node.lus} +XFAIL: Test bad programs (type): lus2lic {-o /tmp/merge_bad_enum.lic should_fail/type/merge_bad_enum.lus} XFAIL: Test bad programs (type): lus2lic {-o /tmp/condact2.lic should_fail/type/condact2.lus} +XFAIL: Test bad programs (type): lus2lic {-o /tmp/merge_bad_type.lic should_fail/type/merge_bad_type.lus} XFAIL: Test bad programs (type): lus2lic {-o /tmp/packages.lic should_fail/type/packages.lus} XFAIL: Test bad programs (type): lus2lic {-o /tmp/packages2.lic should_fail/type/packages2.lus} XFAIL: Test bad programs (type): lus2lic {-o /tmp/Gyro.lic should_fail/type/Gyro.lus} XFAIL: Test bad programs (type): lus2lic {-o /tmp/Gyro-2.lic should_fail/type/Gyro-2.lus} +XFAIL: Test bad programs (type): lus2lic {-o /tmp/merge_bad_clk.lic should_fail/type/merge_bad_clk.lus} XFAIL: Test bad programs (type): lus2lic {-o /tmp/parametric_node4.lic should_fail/type/parametric_node4.lus} +XPASS: Test bad programs (type): lus2lic {-o /tmp/merge_not_exhaustive.lic should_fail/type/merge_not_exhaustive.lus} XFAIL: Test bad programs (type): lus2lic {-o /tmp/const2.lic should_fail/type/const2.lus} XFAIL: Test bad programs (type): lus2lic {-o /tmp/ts02.lic should_fail/type/ts02.lus} XPASS: Test bad programs (type): lus2lic {-o /tmp/parametric_node2.lic should_fail/type/parametric_node2.lus} +XFAIL: Test bad programs (type): lus2lic {-o /tmp/merge.lic should_fail/type/merge.lus} XFAIL: Test bad programs (clock): lus2lic {-o /tmp/when_enum.lic should_fail/clock/when_enum.lus} XFAIL: Test bad programs (clock): lus2lic {-o /tmp/bad_call02.lic should_fail/clock/bad_call02.lus} XFAIL: Test bad programs (clock): lus2lic {-o /tmp/inonout.lic should_fail/clock/inonout.lus} @@ -777,13 +788,11 @@ FAIL: Generate ec code : ./lus2lic {-ec -o /tmp/when_not.ec should_work/broken PASS: ./lus2lic { -o /tmp/packages.out should_work/broken/packages.lus} PASS: ./lus2lic {-ec -o /tmp/packages.ec should_work/broken/packages.lus} PASS: ./lus2lic { -o /tmp/when_node.out should_work/broken/when_node.lus} -FAIL: Generate ec code : ./lus2lic {-ec -o /tmp/when_node.ec should_work/broken/when_node.lus} +PASS: ./lus2lic {-ec -o /tmp/when_node.ec should_work/broken/when_node.lus} FAIL: without any option: ./lus2lic { -o /tmp/testSystem.out should_work/broken/testSystem.lus} FAIL: Generate ec code : ./lus2lic {-ec -o /tmp/testSystem.ec should_work/broken/testSystem.lus} FAIL: without any option: ./lus2lic { -o /tmp/car-orig.out should_work/broken/car-orig.lus} FAIL: Generate ec code : ./lus2lic {-ec -o /tmp/car-orig.ec should_work/broken/car-orig.lus} -FAIL: without any option: ./lus2lic { -o /tmp/merge.out should_work/broken/merge.lus} -FAIL: Generate ec code : ./lus2lic {-ec -o /tmp/merge.ec should_work/broken/merge.lus} XPASS: Test bad programs (type): lus2lic {-o /tmp/bad_call03.lic should_fail/type/broken/bad_call03.lus} XFAIL: Test bad programs (type): lus2lic {-o /tmp/ts03.lic should_fail/type/broken/ts03.lus} XPASS: Test bad programs (semantics): lus2lic {-o /tmp/piege.lic should_fail/semantics/broken/piege.lus} @@ -795,8 +804,8 @@ XPASS: Test bad programs (semantics): lus2lic {-o /tmp/bug.lic should_fail/seman === lus2lic Summary === -# of expected passes 728 -# of unexpected failures 11 -# of unexpected successes 10 -# of expected failures 32 +# of expected passes 734 +# of unexpected failures 9 +# of unexpected successes 11 +# of expected failures 36 # of unresolved testcases 2 diff --git a/test/should_fail/type/merge_bad_clk.lus b/test/should_fail/type/merge_bad_clk.lus new file mode 100644 index 00000000..68a53dfa --- /dev/null +++ b/test/should_fail/type/merge_bad_clk.lus @@ -0,0 +1,12 @@ +type trival = enum { Pile, Face, Tranche }; --- +node merge_node(clk: trival; --- + i1 : int when Pile(clk) ; + i2 : int when Face(clk); + i3 : int when Tranche(clk)) +returns (y: int); --- +let + y = merge clk + | Pile -> i2 -- bad clock !! + | Face -> i1 -- bad clock !! + | Tranche -> i3; +tel \ No newline at end of file diff --git a/test/should_fail/type/merge_bad_enum.lus b/test/should_fail/type/merge_bad_enum.lus new file mode 100644 index 00000000..2914b40a --- /dev/null +++ b/test/should_fail/type/merge_bad_enum.lus @@ -0,0 +1,12 @@ +type trival = enum { Pile, Face, Tranche }; --- +type okko = enum { Ok,ko }; --- +node merge_node(clk: trival; --- + i1 : int when Pile(clk) ; i2 : int when Face(clk); + i3: int when Tranche(clk)) +returns (y: int); --- +let + y = merge clk + | Pile -> i1 + | Ok -> i2 + | Tranche -> i3; +tel \ No newline at end of file diff --git a/test/should_fail/type/merge_bad_type.lus b/test/should_fail/type/merge_bad_type.lus new file mode 100644 index 00000000..df742239 --- /dev/null +++ b/test/should_fail/type/merge_bad_type.lus @@ -0,0 +1,12 @@ +type trival = enum { Pile, Face, Tranche }; --- +node merge_node(clk: trival; --- + i1 : int when Pile(clk) ; + i2 : real when Face(clk); + i3 : int when Tranche(clk)) +returns (y: int); --- +let + y = merge clk + | Pile -> i1 + | Face -> i2 + | Tranche -> i3; +tel \ No newline at end of file diff --git a/test/should_work/broken/merge.lus b/test/should_fail/type/merge_not_exhaustive.lus similarity index 54% rename from test/should_work/broken/merge.lus rename to test/should_fail/type/merge_not_exhaustive.lus index ffe738b7..631aad46 100644 --- a/test/should_work/broken/merge.lus +++ b/test/should_fail/type/merge_not_exhaustive.lus @@ -1,11 +1,12 @@ type trival = enum { Pile, Face, Tranche }; --- node merge_node(clk: trival; --- - i1 : int when Pile(clk) ; i2 : int when Face(clk); + i1 : int when Pile(clk) ; i2 : int when Face(clk); i3: int when Tranche(clk)) returns (y: int); --- let y = merge clk - (Pile: i1) - (Face: i2) - (Tranche: i3); + +-- | Pile -> i1 + | Face -> i2 + | Tranche -> i3; tel \ No newline at end of file diff --git a/test/should_work/is_stable.lus b/test/should_work/is_stable.lus new file mode 100644 index 00000000..fb2b77e9 --- /dev/null +++ b/test/should_work/is_stable.lus @@ -0,0 +1,91 @@ + +const cycle_time = 1.0; +const epsilon = 0.0001; + +node vrai_depuis_n_secondes(n: real; signal: bool) returns (res: bool) +var + tempo : real; +let + tempo = n -> if not signal then n else max<<real>>(0.0, pre tempo - cycle_time); + res = (tempo = 0.0); +tel + +node vrai_depuis_n_secondes_bis(n, t : real; signal: bool) returns (res: bool) +var + tempo : real; + pt : real; -- un registre pour memoriser l'horodate de l'instant precedent +let + pt = 0.0 -> pre t; + tempo = n -> if not signal then n else max<<real>> (0.0, pre tempo - (t-pt)); + res = (tempo = 0.0); +tel + +-- assign the jth element of an array to a value +type update_acc = { + i: int; + j: int; + v: real +}; + +node update_cell_do<<const d: int>>(acc: update_acc; cell: real) +returns (nacc: update_acc; ncell: real); +let + ncell = if acc.i = acc.j then acc.v else cell; + nacc = update_acc { i = acc.i+1; j = acc.j ; v = acc.v }; -- arg... +tel + +node assign<<const d: int>>(v: real; j: int; t: real^d) returns (nt: real^d) +var + dummy: update_acc; +let + dummy, nt=fillred<<update_cell_do<<d>>; d>>( update_acc { i = 0 ; j = j ; v = v }, t); +tel + +---------------------------------------------------------------------------- +-- Compute the average of the elements of an array + +node average<<const d : int>>(t: real^d) returns (res: real) +let + res =red<<+; d>>(0.0, t) / int2real(d); +tel + +------------------------------------------------------------------------------ +-- Compute the range of an array of reals +type range = { min: real; max: real }; +node get_range_cell<<const d : int>>(acc : range; cell: real) returns (res : range); +let + res = range { + min = if cell<acc.min then cell else acc.min; + max = if cell>acc.max then cell else acc.max; + }; +tel +node get_range<<const d : int>>(t: real^d) returns (res : real); +var + t_range: range; +let + t_range = red<<get_range_cell; d>>(range{ min=t[0] ; max=t[0] }, t); + res = t_range.max - t_range.min; +tel + +node is_d_stable<<const d: int; const eps: real>>(v: real) +returns (res:bool); +var + v_mem: real^d; -- circular array + cpt: int; +let + cpt = 0 -> (pre cpt + 1); + v_mem = 0.0^d -> assign<<d>>(v, cpt mod d, pre v_mem); + res = cpt>=d-1 and (get_range<<d>>(v_mem) < eps); +tel + +node max<<type t>>(a,b:t) returns(res:t) +let + res = if a<b then b else a; +tel +node min<<type t>>(a,b:t) returns(res:t) +let + res = if a>b then b else a; +tel + +node maxr=max<<real>>; +node minr=min<<real>>; \ No newline at end of file diff --git a/test/should_work/merge.lus b/test/should_work/merge.lus new file mode 100644 index 00000000..0cf0136c --- /dev/null +++ b/test/should_work/merge.lus @@ -0,0 +1,12 @@ +type trival = enum { Pile, Face, Tranche }; --- +node merge_node(clk: trival; --- + i1 : int when Pile(clk) ; + i2 : int when Face(clk); + i3 : int when Tranche(clk)) +returns (y: int); --- +let + y = merge clk + | Pile => (0->i1) + | Face => i2 + | Tranche => i3; +tel \ No newline at end of file diff --git a/test/should_work/parametric_node2.lus b/test/should_work/parametric_node2.lus deleted file mode 100644 index 41846b3d..00000000 --- a/test/should_work/parametric_node2.lus +++ /dev/null @@ -1,13 +0,0 @@ - - -node toto_n<<node f(a, b: int) returns (x: real); const n : int>>(a: int) --- ^^^^^^^^ should be an int -returns (x: int^n); -var v : int; -let - v = f(a, 1); - x = v ^ n; -tel - -node toto_3 = toto_n<<Lustre::iplus, 3>>; - diff --git a/test/should_work/sincos.lus b/test/should_work/sincos.lus new file mode 100644 index 00000000..44558b37 --- /dev/null +++ b/test/should_work/sincos.lus @@ -0,0 +1,14 @@ +-- +node sincos(omega:real) returns (sin, cos: real); +var pcos,psin: real; +let + pcos = 1.0 fby pre cos; + psin = 0.0 fby pre sin; + sin = omega * integrator(pcos,0.1,0.0); + cos = omega * integrator(-psin,0.1,1.0); +tel +node integrator(F,STEP,init: real) returns (Y: real); +let + Y = init -> pre(Y) + ((F + pre(F))*STEP)/2.0; +tel -- del + diff --git a/todo.org b/todo.org index 1feb3c8c..ecc1c393 100644 --- a/todo.org +++ b/todo.org @@ -124,7 +124,6 @@ file:src/unifyClock.ml::271 On pourrait utiliser file:src/misc.ml pour prendre finement en compte les struct et les arrays. -** TODO Merge is not working ** TODO Rajouter le with à la caml pour les structures - State "TODO" from "" [2012-10-26 Fri 14:59] diff --git a/todo.org_archive b/todo.org_archive index 094f1551..bfb08031 100644 --- a/todo.org_archive +++ b/todo.org_archive @@ -327,6 +327,19 @@ FAIL: without any option: ./lus2lic { -o /tmp/multipar.out should_work/broken File "objlinux/l2lExpandMetaOp.ml", line 310, column 4 when compiling lustre program should_work/broken/cond01.lus +* TODO Merge is not working + :PROPERTIES: + :ARCHIVE_TIME: 2013-01-31 Thu 17:52 + :ARCHIVE_FILE: ~/lus2lic/todo.org + :ARCHIVE_OLPATH: Languages issues + :ARCHIVE_CATEGORY: lv6 + :ARCHIVE_TODO: TODO + :END: + +./lus2lic should_work/broken/merge.lus +file:test/should_work/broken/merge.lus::7 + + -- GitLab