hevea-2.30/0000755004317100512160000000000013136046105012553 5ustar marangetcristalhevea-2.30/cut.mli0000644004317100512160000000237412017660721014062 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* "$Id: cut.mli,v 1.4 2006-11-10 08:28:46 maranget Exp $" *) type toc_style = Normal | Both | Special exception Error of string module type Config = sig val verbose : int val name_in : string val name_out : string val toc_style : toc_style val cross_links : bool val small_length : int end module Make (Config:Config) : sig val dir : string option val base : string val real_name : string -> string val check_changed : string -> string val start_phase : unit -> unit val do_lex : Lexing.lexbuf -> bool end hevea-2.30/length.mll0000644004317100512160000000460412403604646014554 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: length.mll,v 1.16 2012-06-05 14:55:39 maranget Exp $ *) (***********************************************************************) { open Lexing exception Cannot ;; let font = 10 ;; let font_float = float font ;; type t = Char of int | Pixel of int | Percent of int | No of string | Default let pretty = function | Char x -> string_of_int x^" chars" | Pixel x -> string_of_int x^" pxls" | Percent x -> string_of_int x^"%" | Default -> "default" | No s -> "*"^s^"*" let is_zero = function | Char 0|Pixel 0|Percent 0 -> true | _ -> false let pixel_to_char x = (100 * x + 50)/(100 * font) and char_to_pixel x = font * x let mk_char x = Char (truncate (0.5 +. x)) let mk_pixel x = Pixel (truncate (0.5 +. x)) and mk_percent x = Percent (truncate x) ;; let convert unit x = match unit with | "ex"|"em" -> mk_char x | "pt" -> mk_pixel x | "in" -> mk_char ((x *. 72.27) /. font_float) | "cm" -> mk_char ((x *. 28.47) /. font_float) | "mm" -> mk_char ((x *. 2.847) /. font_float) | "pc" -> mk_char ((x *. 12.0) /. font_float) | "@percent" -> mk_percent (100.0 *. x) | _ -> No unit ;; } rule main_rule = parse '-' {let x,unit = positif lexbuf in convert unit (0.0 -. x)} | "" {let x,unit = positif lexbuf in convert unit x} and positif = parse | ['0'-'9']*'.'?['0'-'9']+ {let lxm = lexeme lexbuf in float_of_string lxm,unit lexbuf} | "@percent" {1.0, "@percent"} | "" {raise Cannot} and unit = parse | [' ''\n''\t''\r']+ {unit lexbuf} | [^' ''\n''\t''\r']* {lexeme lexbuf} { open Lexing let main lexbuf = try main_rule lexbuf with | Cannot -> let sbuf = lexbuf.lex_buffer in No (Bytes.sub_string sbuf 0 lexbuf.lex_buffer_len) } hevea-2.30/tabular.mll0000644004317100512160000001535112403604646014726 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: tabular.mll,v 1.33 2012-06-05 14:55:39 maranget Exp $ *) { open Misc open Lexing open Table open Lexstate open Subst exception Error of string ;; type align = {hor : string ; mutable vert : string ; wrap : bool ; mutable pre : string ; mutable post : string ; width : Length.t} let make_hor = function 'c' -> "center" | 'l' -> "left" | 'r' -> "right" | 'p'|'m'|'b' -> "left" | _ -> raise (Misc.Fatal "make_hor") and make_vert = function | 'c'|'l'|'r' -> "" | 'p' -> "top" | 'm' -> "middle" | 'b' -> "bottom" | _ -> raise (Misc.Fatal "make_vert") type format = Align of align | Inside of string | Border of string ;; (* Patch vertical alignment (for HTML) *) let check_vert f = try for i = 0 to Array.length f-1 do match f.(i) with | Align {vert=s} when s <> "" -> raise Exit | _ -> () done ; f with Exit -> begin for i = 0 to Array.length f-1 do match f.(i) with | Align ({vert=""} as f) -> f.vert <- "top" | _ -> () done ; f end (* Compute missing length (for text) *) and check_length f = for i = 0 to Array.length f - 1 do match f.(i) with | Align ({wrap=true ; width=Length.No _} as r) -> f.(i) <- Align {r with width = Length.Percent (truncate (100.0 /. float (Array.length f)))} | _ -> () done let border = ref false let out_table = Table.create (Inside "") let pretty_format = function | Align {vert = v ; hor = h ; pre = pre ; post = post ; wrap = b ; width = w} -> "[>{"^pre^"}"^ ", h="^h^", v="^v^ ", <{"^post^"}"^(if b then ", wrap" else "")^ ", w="^Length.pretty w^"]" | Inside s -> "@{"^s^"}" | Border s -> s let pretty_formats f = Array.iter (fun f -> prerr_string (pretty_format f) ; prerr_string "; ") f (* For some reason pre/post-ludes are executed right to left *) let concat_pre_post x y = match x, y with | "", _ -> y | _, "" -> x | _,_ -> y ^ "{}" ^ x } rule tfone = parse | [' ''\t''\n''\r'] {tfone lexbuf} | '>' {let pre = subst_arg lexbuf in tfone lexbuf ; try apply out_table (function | Align a -> a.pre <- concat_pre_post pre a.pre ; | _ -> raise (Error "Bad syntax in array argument (>)")) with Table.Empty -> raise (Error "Bad syntax in array argument (>)")} | "" {tfmiddle lexbuf} and tfmiddle = parse | [' ''\t''\n''\r'] {tfmiddle lexbuf} | ['c''l''r'] {let f = Lexing.lexeme_char lexbuf 0 in let post = tfpostlude lexbuf in emit out_table (Align {hor = make_hor f ; vert = make_vert f ; wrap = false ; pre = "" ; post = post ; width = Length.Default})} | ['p''m''b'] {let f = Lexing.lexeme_char lexbuf 0 in let width = subst_arg lexbuf in let my_width = Length.main (MyLexing.from_string width) in let post = tfpostlude lexbuf in emit out_table (Align {hor = make_hor f ; vert = make_vert f ; wrap = true ; pre = "" ; post = post ; width = my_width})} | '#' ['1'-'9'] {let lxm = lexeme lexbuf in let i = Char.code (lxm.[1]) - Char.code '1' in Lexstate.scan_arg (scan_this_arg_list tfmiddle) i} | '%' [^'\n']* '\n' {tfmiddle lexbuf} | [^'|' '@' '<' '>' '!' '#'] {let lxm = lexeme lexbuf in let name = column_to_command lxm in let pat,body = Latexmacros.find name in let args = Lexstate.make_stack name pat lexbuf in let cur_subst = get_subst () in Lexstate.scan_body (function | Lexstate.Subst body -> scan_this_list_may_cont lexformat lexbuf cur_subst (string_to_arg body) ; | _ -> assert false) body args ; let post = tfpostlude lexbuf in if post <> "" then try Table.apply out_table (function | Align f -> f.post <- post | _ -> Misc.warning ("``<'' after ``@'' in tabular arg scanning")) with | Table.Empty -> raise (Error ("``<'' cannot start tabular arg"))} | eof {()} | "" {let rest = Bytes.sub_string lexbuf.lex_buffer lexbuf.lex_curr_pos (lexbuf.lex_buffer_len - lexbuf.lex_curr_pos) in raise (Error ("Syntax of array format near: "^rest))} and tfpostlude = parse | [' ''\t''\n''\r'] {tfpostlude lexbuf} | '<' {let one = subst_arg lexbuf in let rest = tfpostlude lexbuf in let r = concat_pre_post one rest in r} | eof {if MyStack.empty stack_lexbuf then "" else let lexbuf = previous_lexbuf () in tfpostlude lexbuf} | "" {""} and lexformat = parse | [' ''\t''\n''\r'] {lexformat lexbuf} | '*' {let ntimes = save_arg lexbuf in let what = save_arg lexbuf in let rec do_rec = function 0 -> lexformat lexbuf | i -> scan_this_arg lexformat what ; do_rec (i-1) in do_rec (Get.get_int_string ntimes)} | '|' {border := true ; emit out_table (Border "|") ; lexformat lexbuf} | '@'|'!' {let lxm = Lexing.lexeme_char lexbuf 0 in let inside = subst_arg lexbuf in if lxm = '!' || inside <> "" then emit out_table (Inside inside) ; lexformat lexbuf} | '#' ['1'-'9'] {let lxm = lexeme lexbuf in let i = Char.code (lxm.[1]) - Char.code '1' in Lexstate.scan_arg (scan_this_arg_list lexformat) i ; lexformat lexbuf} | eof {if MyStack.empty stack_lexbuf then () else let lexbuf = previous_lexbuf () in lexformat lexbuf} | "" {tfone lexbuf ; lexformat lexbuf} { open Parse_opts let main {arg=s ; subst=env} = if !verbose > 1 then prerr_endline ("Table format: "^s); let lexbuf = if String.length s > 0 && s.[0] = '\\' then match Latexmacros.find s with | _, Lexstate.Subst s -> MyLexing.from_list s | _,_ -> MyLexing.from_string s else MyLexing.from_string s in start_normal env ; lexformat lexbuf ; end_normal () ; let r = check_vert (trim out_table) in begin match !destination with | (Text | Info) -> check_length r | Html -> () end ; if !verbose > 1 then begin prerr_string "Format parsed: " ; pretty_formats r ; prerr_endline "" end ; r } hevea-2.30/doOut.mli0000644004317100512160000000320012017660721014346 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) val verbose : int ref module type Config = sig val small_length : int end module type S = sig type t val create_buff : unit -> t val create_chan : out_channel -> t val create_null : unit -> t val is_null : t -> bool val is_empty : t -> bool val reset : t -> unit val put : t -> string -> unit val blit : t -> Lexing.lexbuf -> unit val put_char : t -> char -> unit val flush : t -> unit val get_pos : t -> int val erase_start : int -> t -> unit val iter : (char -> unit) -> t -> unit val iter_next : (char -> (unit -> int) -> unit) -> t -> unit val to_string : t -> string val to_list : t -> string list val to_chan : out_channel -> t -> unit val copy : t -> t -> unit val copy_fun : (string -> string) -> t -> t -> unit val copy_no_tag : t -> t -> unit val close : t -> unit val debug : out_channel -> t -> unit val unskip : t -> unit end module Make(C:Config) : S hevea-2.30/tagout.mll0000644004317100512160000000271212323450432014565 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* Erase tags (for title in hacha) *) { exception Error let buff = Buffer.create 32 } let blank = [' ''\t''\n''\r'] let tag = ['a'-'z''A'-'Z''0'-'9']+ let class_name = ['a'-'z''A'-'Z''0'-'9''-']+ let attr_name = ['a'-'z''A'-'Z''-''0'-'9']+ rule tagout = parse | ('<' | "' { () } | blank+ | attr_name ( blank* "=" blank* ('\'' ([^'\'']*) '\'' | '"' ([^'"']*) '"' | '#'?['a'-'z''A'-'Z''0'-'9''-''+''_'':''.']+))? (* '"' *) { skiptag lexbuf } | "" { raise Error } { let tagout s = Buffer.reset buff ; tagout (MyLexing.from_string s) } hevea-2.30/lstlang1.sty0000644004317100512160000025731011524022160015043 0ustar marangetcristal%% %% This is file `lstlang1.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% lstdrvrs.dtx (with options: `lang1') %% %% The listings package is copyright 1996--2004 Carsten Heinz, and %% continued maintenance on the package is copyright 2006--2007 Brooks Moses. %% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/ %% 2007 any individual author listed in this file. %% %% This file is distributed under the terms of the LaTeX Project Public %% License from CTAN archives in directory macros/latex/base/lppl.txt. %% Either version 1.3 or, at your option, any later version. %% %% This file is completely free and comes without any warranty. %% %% Send comments and ideas on the package, error reports and additional %% programming languages to Brooks Moses at . %% \ProvidesFile{lstlang1.sty} [2004/09/05 1.3 listings language file] %% %% ACSL definition (c) 2000 by Andreas Matthias %% \lst@definelanguage{ACSL}[90]{Fortran}% {morekeywords={algorithm,cinterval,constant,derivative,discrete,% dynamic,errtag,initial,interval,maxterval,minterval,% merror,xerror,nsteps,procedural,save,schedule,sort,% table,terminal,termt,variable},% sensitive=false,% morecomment=[l]!% }[keywords, comments]% %% %% Ada 95 definition (c) Torsten Neuer %% %% Ada 2005 definition (c) 2006 Santiago Urue\~{n}a Pascual %% %% \lst@definelanguage[2005]{Ada}[95]{Ada}% {morekeywords={interface,overriding,synchronized}}% \lst@definelanguage[95]{Ada}[83]{Ada}% {morekeywords={abstract,aliased,protected,requeue,tagged,until}}% \lst@definelanguage[83]{Ada}% {morekeywords={abort,abs,accept,access,all,and,array,at,begin,body,% case,constant,declare,delay,delta,digits,do,else,elsif,end,entry,% exception,exit,for,function,generic,goto,if,in,is,limited,loop,% mod,new,not,null,of,or,others,out,package,pragma,private,% procedure,raise,range,record,rem,renames,return,reverse,select,% separate,subtype,task,terminate,then,type,use,when,while,with,% xor},% sensitive=f,% morecomment=[l]--,% morestring=[m]",% percent not defined as stringizer so far morestring=[m]'% }[keywords,comments,strings]% %% %% awk definitions (c) Christoph Giess %% \lst@definelanguage[gnu]{Awk}[POSIX]{Awk}% {morekeywords={and,asort,bindtextdomain,compl,dcgettext,gensub,% lshift,mktime,or,rshift,strftime,strtonum,systime,xor,extension}% }% \lst@definelanguage[POSIX]{Awk}% {keywords={BEGIN,END,close,getline,next,nextfile,print,printf,% system,fflush,atan2,cos,exp,int,log,rand,sin,sqrt,srand,gsub,% index,length,match,split,sprintf,strtonum,sub,substr,tolower,% toupper,if,while,do,for,break,continue,delete,exit,function,% return},% sensitive,% morecomment=[l]\#,% morecomment=[l]//,% morecomment=[s]{/*}{*/},% morestring=[b]"% }[keywords,comments,strings]% %% %% Visual Basic definition (c) 2002 Robert Frank %% \lst@definelanguage[Visual]{Basic} {morekeywords={Abs,Array,Asc,AscB,AscW,Atn,Avg,CBool,CByte,CCur,% CDate,CDbl,Cdec,Choose,Chr,ChrB,ChrW,CInt,CLng,Command,Cos,% Count,CreateObject,CSng,CStr,CurDir,CVar,CVDate,CVErr,Date,% DateAdd,DateDiff,DatePart,DateSerial,DateValue,Day,DDB,Dir,% DoEvents,Environ,EOF,Error,Exp,FileAttr,FileDateTime,FileLen,% Fix,Format,FreeFile,FV,GetAllStrings,GetAttr,% GetAutoServerSettings,GetObject,GetSetting,Hex,Hour,IIf,% IMEStatus,Input,InputB,InputBox,InStr,InstB,Int,Integer,IPmt,% IsArray,IsDate,IsEmpty,IsError,IsMissing,IsNull,IsNumeric,% IsObject,LBound,LCase,Left,LeftB,Len,LenB,LoadPicture,Loc,LOF,% Log,Ltrim,Max,Mid,MidB,Min,Minute,MIRR,Month,MsgBox,Now,NPer,% NPV,Oct,Partition,Pmt,PPmt,PV,QBColor,Rate,RGB,Right,RightB,Rnd,% Rtrim,Second,Seek,Sgn,Shell,Sin,SLN,Space,Spc,Sqr,StDev,StDevP,% Str,StrComp,StrConv,String,Switch,Sum,SYD,Tab,Tan,Time,Timer,% TimeSerial,TimeValue,Trim,TypeName,UBound,Ucase,Val,Var,VarP,% VarType,Weekday,Year},% functions morekeywords=[2]{Accept,Activate,Add,AddCustom,AddFile,AddFromFile,% AddFromTemplate,AddItem,AddNew,AddToAddInToolbar,% AddToolboxProgID,Append,AppendChunk,Arrange,Assert,AsyncRead,% BatchUpdate,BeginTrans,Bind,Cancel,CancelAsyncRead,CancelBatch,% CancelUpdate,CanPropertyChange,CaptureImage,CellText,CellValue,% Circle,Clear,ClearFields,ClearSel,ClearSelCols,Clone,Close,Cls,% ColContaining,ColumnSize,CommitTrans,CompactDatabase,Compose,% Connect,Copy,CopyQueryDef,CreateDatabase,CreateDragImage,% CreateEmbed,CreateField,CreateGroup,CreateIndex,CreateLink,% CreatePreparedStatement,CreatePropery,CreateQuery,% CreateQueryDef,CreateRelation,CreateTableDef,CreateUser,% CreateWorkspace,Customize,Delete,DeleteColumnLabels,% DeleteColumns,DeleteRowLabels,DeleteRows,DoVerb,Drag,Draw,Edit,% EditCopy,EditPaste,EndDoc,EnsureVisible,EstablishConnection,% Execute,ExtractIcon,Fetch,FetchVerbs,Files,FillCache,Find,% FindFirst,FindItem,FindLast,FindNext,FindPrevious,Forward,% GetBookmark,GetChunk,GetClipString,GetData,GetFirstVisible,% GetFormat,GetHeader,GetLineFromChar,GetNumTicks,GetRows,% GetSelectedPart,GetText,GetVisibleCount,GoBack,GoForward,Hide,% HitTest,HoldFields,Idle,InitializeLabels,InsertColumnLabels,% InsertColumns,InsertObjDlg,InsertRowLabels,InsertRows,Item,% KillDoc,Layout,Line,LinkExecute,LinkPoke,LinkRequest,LinkSend,% Listen,LoadFile,LoadResData,LoadResPicture,LoadResString,% LogEvent,MakeCompileFile,MakeReplica,MoreResults,Move,MoveData,% MoveFirst,MoveLast,MoveNext,MovePrevious,NavigateTo,NewPage,% NewPassword,NextRecordset,OLEDrag,OnAddinsUpdate,OnConnection,% OnDisconnection,OnStartupComplete,Open,OpenConnection,% OpenDatabase,OpenQueryDef,OpenRecordset,OpenResultset,OpenURL,% Overlay,PaintPicture,Paste,PastSpecialDlg,PeekData,Play,Point,% PopulatePartial,PopupMenu,Print,PrintForm,PropertyChanged,Pset,% Quit,Raise,RandomDataFill,RandomFillColumns,RandomFillRows,% rdoCreateEnvironment,rdoRegisterDataSource,ReadFromFile,% ReadProperty,Rebind,ReFill,Refresh,RefreshLink,RegisterDatabase,% Reload,Remove,RemoveAddInFromToolbar,RemoveItem,Render,% RepairDatabase,Reply,ReplyAll,Requery,ResetCustom,% ResetCustomLabel,ResolveName,RestoreToolbar,Resync,Rollback,% RollbackTrans,RowBookmark,RowContaining,RowTop,Save,SaveAs,% SaveFile,SaveToFile,SaveToolbar,SaveToOle1File,Scale,ScaleX,% ScaleY,Scroll,Select,SelectAll,SelectPart,SelPrint,Send,% SendData,Set,SetAutoServerSettings,SetData,SetFocus,SetOption,% SetSize,SetText,SetViewport,Show,ShowColor,ShowFont,ShowHelp,% ShowOpen,ShowPrinter,ShowSave,ShowWhatsThis,SignOff,SignOn,Size,% Span,SplitContaining,StartLabelEdit,StartLogging,Stop,% Synchronize,TextHeight,TextWidth,ToDefaults,TwipsToChartPart,% TypeByChartType,Update,UpdateControls,UpdateRecord,UpdateRow,% Upto,WhatsThisMode,WriteProperty,ZOrder},% methods morekeywords=[3]{AccessKeyPress,AfterAddFile,AfterChangeFileName,% AfterCloseFile,AfterColEdit,AfterColUpdate,AfterDelete,% AfterInsert,AfterLabelEdit,AfterRemoveFile,AfterUpdate,% AfterWriteFile,AmbienChanged,ApplyChanges,Associate,% AsyncReadComplete,AxisActivated,AxisLabelActivated,% AxisLabelSelected,AxisLabelUpdated,AxisSelected,% AxisTitleActivated,AxisTitleSelected,AxisTitleUpdated,% AxisUpdated,BeforeClick,BeforeColEdit,BeforeColUpdate,% BeforeConnect,BeforeDelete,BeforeInsert,BeforeLabelEdit,% BeforeLoadFile,BeforeUpdate,ButtonClick,ButtonCompleted,% ButtonGotFocus,ButtonLostFocus,Change,ChartActivated,% ChartSelected,ChartUpdated,Click,ColEdit,Collapse,ColResize,% ColumnClick,Compare,ConfigChageCancelled,ConfigChanged,% ConnectionRequest,DataArrival,DataChanged,DataUpdated,DblClick,% Deactivate,DeviceArrival,DeviceOtherEvent,DeviceQueryRemove,% DeviceQueryRemoveFailed,DeviceRemoveComplete,DeviceRemovePending,% DevModeChange,Disconnect,DisplayChanged,Dissociate,% DoGetNewFileName,Done,DonePainting,DownClick,DragDrop,DragOver,% DropDown,EditProperty,EnterCell,EnterFocus,Event,ExitFocus,% Expand,FootnoteActivated,FootnoteSelected,FootnoteUpdated,% GotFocus,HeadClick,InfoMessage,Initialize,IniProperties,% ItemActivated,ItemAdded,ItemCheck,ItemClick,ItemReloaded,% ItemRemoved,ItemRenamed,ItemSeletected,KeyDown,KeyPress,KeyUp,% LeaveCell,LegendActivated,LegendSelected,LegendUpdated,% LinkClose,LinkError,LinkNotify,LinkOpen,Load,LostFocus,% MouseDown,MouseMove,MouseUp,NodeClick,ObjectMove,% OLECompleteDrag,OLEDragDrop,OLEDragOver,OLEGiveFeedback,% OLESetData,OLEStartDrag,OnAddNew,OnComm,Paint,PanelClick,% PanelDblClick,PathChange,PatternChange,PlotActivated,% PlotSelected,PlotUpdated,PointActivated,PointLabelActivated,% PointLabelSelected,PointLabelUpdated,PointSelected,% PointUpdated,PowerQuerySuspend,PowerResume,PowerStatusChanged,% PowerSuspend,QueryChangeConfig,QueryComplete,QueryCompleted,% QueryTimeout,QueryUnload,ReadProperties,Reposition,% RequestChangeFileName,RequestWriteFile,Resize,ResultsChanged,% RowColChange,RowCurrencyChange,RowResize,RowStatusChanged,% SelChange,SelectionChanged,SendComplete,SendProgress,% SeriesActivated,SeriesSelected,SeriesUpdated,SettingChanged,% SplitChange,StateChanged,StatusUpdate,SysColorsChanged,% Terminate,TimeChanged,TitleActivated,TitleSelected,% TitleActivated,UnboundAddData,UnboundDeleteRow,% UnboundGetRelativeBookmark,UnboundReadData,UnboundWriteData,% Unload,UpClick,Updated,Validate,ValidationError,WillAssociate,% WillChangeData,WillDissociate,WillExecute,WillUpdateRows,% WithEvents,WriteProperties},% VB-events morekeywords=[4]{AppActivate,Base,Beep,Call,Case,ChDir,ChDrive,% Const,Declare,DefBool,DefByte,DefCur,DefDate,DefDbl,DefDec,% DefInt,DefLng,DefObj,DefSng,DefStr,Deftype,DefVar,DeleteSetting,% Dim,Do,Else,ElseIf,End,Enum,Erase,Event,Exit,Explicit,FileCopy,% For,ForEach,Friend,Function,Get,GoSub,GoTo,If,Implements,Kill,% Let,LineInput,Lock,Lset,MkDir,Name,Next,OnError,On,Option,% Private,Property,Public,Put,RaiseEvent,Randomize,ReDim,Rem,% Reset,Resume,Return,RmDir,Rset,SavePicture,SaveSetting,% SendKeys,SetAttr,Static,Sub,Then,Type,Unlock,Wend,While,Width,% With,Write},% statements sensitive=false,% keywordcomment=rem,% MoreSelectCharTable=\def\lst@BeginKC@{% chmod \lst@ResetToken \lst@BeginComment\lst@GPmode{{\lst@commentstyle}% \lst@Lmodetrue\lst@modetrue}\@empty},% morecomment=[l]{'},% morecomment=[s]{/*}{*/},% morestring=[b]",% }[keywords,comments,strings,keywordcomments] \lst@definelanguage[ANSI]{C++}[ISO]{C++}{}% \lst@definelanguage[GNU]{C++}[ISO]{C++}% {morekeywords={__attribute__,__extension__,__restrict,__restrict__,% typeof,__typeof__},% }% \lst@definelanguage[Visual]{C++}[ISO]{C++}% {morekeywords={__asm,__based,__cdecl,__declspec,dllexport,% dllimport,__except,__fastcall,__finally,__inline,__int8,__int16,% __int32,__int64,naked,__stdcall,thread,__try,__leave},% }% \lst@definelanguage[ISO]{C++}[ANSI]{C}% {morekeywords={and,and_eq,asm,bad_cast,bad_typeid,bitand,bitor,bool,% catch,class,compl,const_cast,delete,dynamic_cast,explicit,export,% false,friend,inline,mutable,namespace,new,not,not_eq,operator,or,% or_eq,private,protected,public,reinterpret_cast,static_cast,% template,this,throw,true,try,typeid,type_info,typename,using,% virtual,wchar_t,xor,xor_eq},% }% %% %% Objective-C definition (c) 1997 Detlev Droege %% \lst@definelanguage[Objective]{C}[ANSI]{C} {morekeywords={bycopy,id,in,inout,oneway,out,self,super,% @class,@defs,@encode,@end,@implementation,@interface,@private,% @protected,@protocol,@public,@selector},% moredirectives={import}% }% %% %% Handel-C definition, refer http://www.celoxica.com %% \lst@definelanguage[Handel]{C}[ANSI]{C} {morekeywords={assert,chan,chanin,chanout,clock,delay,expr,external,% external_divide,family,ifselect,in,inline,interface,internal,% internal_divid,intwidth,let,macro,mpram,par,part,prialt,proc,ram,% releasesema,reset,rom,select,sema,set,seq,shared,signal,try,% reset,trysema,typeof,undefined,width,with,wom},% }% \lst@definelanguage[ANSI]{C}% {morekeywords={auto,break,case,char,const,continue,default,do,double,% else,enum,extern,float,for,goto,if,int,long,register,return,% short,signed,sizeof,static,struct,switch,typedef,union,unsigned,% void,volatile,while},% sensitive,% morecomment=[s]{/*}{*/},% morecomment=[l]//,% nonstandard morestring=[b]",% morestring=[b]',% moredelim=*[directive]\#,% moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,% include,pragma,undef,warning}% }[keywords,comments,strings,directives]% %% %% C-Sharp definition (c) 2002 Martin Brodbeck %% \lst@definelanguage[Sharp]{C}% {morekeywords={abstract,base,bool,break,byte,case,catch,char,checked,% class,const,continue,decimal,default,delegate,do,double,else,% enum,event,explicit,extern,false,finally,fixed,float,for,foreach,% goto,if,implicit,in,int,interface,internal,is,lock,long,% namespace,new,null,object,operator,out,override,params,private,% protected,public,readonly,ref,return,sbyte,sealed,short,sizeof,% static,string,struct,switch,this,throw,true,try,typeof,uint,% ulong,unchecked,unsafe,ushort,using,virtual,void,while,% as,volatile,stackalloc},% Kai K\"ohne sensitive,% morecomment=[s]{/*}{*/},% morecomment=[l]//,% morestring=[b]" }[keywords,comments,strings]% %% %% csh definition (c) 1998 Kai Below %% \lst@definelanguage{csh} {morekeywords={alias,awk,cat,echo,else,end,endif,endsw,exec,exit,% foreach,glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,% set,setenv,shift,source,switch,then,time,while,umask,unalias,% unset,wait,while,@,env,argv,child,home,ignoreeof,noclobber,% noglob,nomatch,path,prompt,shell,status,verbose,print,printf,% sqrt,BEGIN,END},% morecomment=[l]\#,% morestring=[d]"% }[keywords,comments,strings]% %% %% bash,sh definition (c) 2003 Riccardo Murri %% \lst@definelanguage{bash}[]{sh}% {morekeywords={alias,bg,bind,builtin,command,compgen,complete,% declare,disown,enable,fc,fg,history,jobs,et,local,logout,printf,% pushd,popd,select,set,suspend,shopt,source,times,type,typeset,% ulimit,unalias,wait},% }% \lst@definelanguage{sh}% {morekeywords={awk,break,case,cat,cd,continue,do,done,echo,else,% env,eval,exec,expr,exit,export,false,fi,for,function,getopts,% hash,history,if,kill,nice,nohup,ps,pwd,read,readonly,return,% sed,shift,test,then,times,trap,true,umask,unset,until,while},% morecomment=[l]\#,% morestring=[d]"% }[keywords,comments,strings]% \lst@definelanguage[90]{Fortran}[95]{Fortran}{} \lst@definelanguage[95]{Fortran}[77]{Fortran}% {deletekeywords=SAVE,% morekeywords={ACTION,ADVANCE,ALLOCATE,ALLOCATABLE,ASSIGNMENT,CASE,% CONTAINS,CYCLE,DEALLOCATE,DEFAULT,DELIM,EXIT,INCLUDE,IN,NONE,IN,% OUT,INTENT,INTERFACE,IOLENGTH,KIND,LEN,MODULE,NAME,NAMELIST,NMT,% NULLIFY,ONLY,OPERATOR,OPTIONAL,OUT,PAD,POINTER,POSITION,PRIVATE,% PUBLIC,READWRITE,RECURSIVE,RESULT,SELECT,SEQUENCE,SIZE,STAT,% TARGET,USE,WHERE,WHILE,BLOCKDATA,DOUBLEPRECISION,% ENDBLOCKDATA,ENDFILE,ENDFUNCTION,ENDINTERFACE,% ENDMODULE,ENDPROGRAM,ENDSELECT,ENDSUBROUTINE,ENDTYPE,ENDWHERE,% INOUT,SELECTCASE},% deletecomment=[f],% no fixed comment line: 1998 Magne Rudshaug morecomment=[l]!% }% \lst@definelanguage[77]{Fortran}% {morekeywords={ACCESS,ASSIGN,BACKSPACE,BLANK,BLOCK,CALL,CHARACTER,% CLOSE,COMMON,COMPLEX,CONTINUE,DATA,DIMENSION,DIRECT,DO,DOUBLE,% ELSE,ELSEIF,END,ENDIF,ENDDO,ENTRY,EOF,EQUIVALENCE,ERR,EXIST,EXTERNAL,% FILE,FMT,FORM,FORMAT,FORMATTED,FUNCTION,GO,TO,GOTO,IF,IMPLICIT,% INQUIRE,INTEGER,INTRINSIC,IOSTAT,LOGICAL,NAMED,NEXTREC,NUMBER,% OPEN,OPENED,PARAMETER,PAUSE,PRECISION,PRINT,PROGRAM,READ,REAL,% REC,RECL,RETURN,REWIND,SEQUENTIAL,STATUS,STOP,SUBROUTINE,THEN,% TYPE,UNFORMATTED,UNIT,WRITE,SAVE},% sensitive=f,%% not Fortran-77 standard, but allowed in Fortran-95 %% morecomment=[f]*,% morecomment=[f]C,% morecomment=[f]c,% morestring=[d]",%% not Fortran-77 standard, but allowed in Fortran-95 %% morestring=[d]'% }[keywords,comments,strings]% \lst@definelanguage{HTML}% {morekeywords={A,ABBR,ACRONYM,ADDRESS,APPLET,AREA,B,BASE,BASEFONT,% BDO,BIG,BLOCKQUOTE,BODY,BR,BUTTON,CAPTION,CENTER,CITE,CODE,COL,% COLGROUP,DD,DEL,DFN,DIR,DIV,DL,DOCTYPE,DT,EM,FIELDSET,FONT,FORM,% FRAME,FRAMESET,HEAD,HR,H1,H2,H3,H4,H5,H6,HTML,I,IFRAME,IMG,INPUT,% INS,ISINDEX,KBD,LABEL,LEGEND,LH,LI,LINK,LISTING,MAP,META,MENU,% NOFRAMES,NOSCRIPT,OBJECT,OPTGROUP,OPTION,P,PARAM,PLAINTEXT,PRE,% OL,Q,S,SAMP,SCRIPT,SELECT,SMALL,SPAN,STRIKE,STRING,STRONG,STYLE,% SUB,SUP,TABLE,TBODY,TD,TEXTAREA,TFOOT,TH,THEAD,TITLE,TR,TT,U,UL,% VAR,XMP,% accesskey,action,align,alink,alt,archive,axis,background,bgcolor,% border,cellpadding,cellspacing,charset,checked,cite,class,classid,% code,codebase,codetype,color,cols,colspan,content,coords,data,% datetime,defer,disabled,dir,event,error,for,frameborder,headers,% height,href,hreflang,hspace,http-equiv,id,ismap,label,lang,link,% longdesc,marginwidth,marginheight,maxlength,media,method,multiple,% name,nohref,noresize,noshade,nowrap,onblur,onchange,onclick,% ondblclick,onfocus,onkeydown,onkeypress,onkeyup,onload,onmousedown,% profile,readonly,onmousemove,onmouseout,onmouseover,onmouseup,% onselect,onunload,rel,rev,rows,rowspan,scheme,scope,scrolling,% selected,shape,size,src,standby,style,tabindex,text,title,type,% units,usemap,valign,value,valuetype,vlink,vspace,width,xmlns},% tag=**[s]<>,% sensitive=f,% morestring=[d]",% ??? doubled MoreSelectCharTable=% \lst@CArgX--\relax\lst@DefDelimB{}{}% {\ifnum\lst@mode=\lst@tagmode\else \expandafter\@gobblethree \fi}% \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}% \lst@CArgX--\relax\lst@DefDelimE{}{}{}% \lst@EndComment\lst@commentmode }[keywords,comments,strings,html]% %% %% AspectJ definition (c) Robert Wenner %% \lst@definelanguage[AspectJ]{Java}[]{Java}% {morekeywords={% adviceexecution,after,args,around,aspect,aspectOf,before,% call,cflow,cflowbelow,% execution,get,handler,if,initialization,issingleton,pointcut,% percflow,percflowbelow,perthis,pertarget,preinitialization,% privileged,proceed,returning,set,staticinitialization,strictfp,% target,this,thisEnclosingJoinPoint,thisJoinPoint,throwing,% within,withincode},% MoreSelectCharTable=% \lst@DefSaveDef{`.}\lst@umdot{\lst@umdot\global\let\lst@derefop\@empty}% \ifx\lst@derefinstalled\@empty\else \global\let\lst@derefinstalled\@empty \lst@AddToHook{Output}% {\lst@ifkeywords \ifx\lst@derefop\@empty \global\let\lst@derefop\relax \ifx\lst@thestyle\lst@gkeywords@sty \ifx\lst@currstyle\relax \let\lst@thestyle\lst@identifierstyle \else \let\lst@thestyle\lst@currstyle \fi \fi \fi \fi} \lst@AddToHook{BOL}{\global\let\lst@derefop\relax}% \lst@AddTo\lst@ProcessSpace{\global\let\lst@derefop\relax}% \fi }% \lst@definelanguage{Java}% {morekeywords={abstract,boolean,break,byte,case,catch,char,class,% const,continue,default,do,double,else,extends,false,final,% finally,float,for,goto,if,implements,import,instanceof,int,% interface,label,long,native,new,null,package,private,protected,% public,return,short,static,super,switch,synchronized,this,throw,% throws,transient,true,try,void,volatile,while},% sensitive,% morecomment=[l]//,% morecomment=[s]{/*}{*/},% morestring=[b]",% morestring=[b]',% }[keywords,comments,strings]% %% %% ByteCodeJava definition (c) 2004 Martine Gautier %% \lst@definelanguage{JVMIS}% {morekeywords={aaload,astore,aconst_null,aload,aload_0,aload_1,% aload_2,aload_3,anewarray,areturn,arraylength,astore,astore_0,% astore_1,astore_2,astore_3,athrow,baload,bastore,bipush,caload,% castore,checkcast,d2f,d2i,d2l,dadd,daload,dastore,dcmpg,dcmpl,% dconst_0,dconst_1,ddiv,dload,dload_0,dload_1,dload_2,dload_3,% dmul,dneg,drem,dreturn,dstore,dstore_0,dstore_1,dstore_2,% dstore_3,dsub,dup,dup_x1,dup_x2,dup2,dup2_x1,dup2_x2,f2d,% f2i,f2l,fadd,faload,fastore,fcmpg,fcmpl,fconst_0,fconst_1,% fconst_2,fdiv,fload,fload_0,fload_1,fload_2,fload_3,fmul,% fneg,frem,freturn,fstore,fstore_0,fstore_1,fstore_2,fstore_3,% fsub,getfield,getstatic,goto,goto_w,i2b,i2c,i2d,i2f,i2l,i2s,% iadd,iaload,iand,iastore,iconst_0,iconst_1,iconst_2,iconst_3,% iconst_4,iconst_5,idiv,if_acmpeq,if_acmpne,if_icmpeq,if_icmpne,% if_icmplt,if_cmpge,if_cmpgt,if_cmple,ifeq,ifne,iflt,ifge,ifgt,% ifle,ifnonnull,ifnull,iinc,iload,iload_0,iload_1,iload_2,% iload_3,imul,ineg,instanceof,invokeinterface,invokespecial,% invokestatic,invokevirtual,ior,irem,ireturn,ishl,ishr,istore,% istore_0,istore_1,istore_2,istore_3,isub,iushr,ixor,jsr,jsr_w,% l2d,l2f,l2i,ladd,laload,land,lastore,lcmp,lconst_0,lconst_1,% ldc,ldc_w,ldc2_w,ldiv,lload,lload_0,lload_1,lload_2,lload_3,% lmul,lneg,lookupswitch,lor,lrem,lreturn,lshl,lshr,lstore,% lstore_0,lstore_1,lstore_2,lstore_3,lsub,lushr,lxor,% monitorenter,monitorexit,multianewarray,new,newarray,nop,pop,% pop2,putfield,putstatic,ret,return,saload,sastore,sipush,swap,% tableswitch,wide,limit,locals,stack},% }[keywords]% \lst@definelanguage{Matlab}% {morekeywords={gt,lt,gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,% all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,% auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,% betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,% cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,% clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,% comet,comet3,compan,compass,computer,cond,condest,conj,contour,% contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,% cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,% csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,% dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,% ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,% del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,% dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,% end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,% engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,% engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,error,% errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,% feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,% fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,% flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,% fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,% gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,% getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,% gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,% hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,% imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,% invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,% isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,% legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,% loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,% matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,% matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,% matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,% meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,% mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,% mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,% min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,% mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,% mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,% mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,% mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,% mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,% mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,% mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,% mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,% nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,% pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,% pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,% pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,% quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,% rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,% return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,% round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,% semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,% spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,% sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,% sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,% str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,% subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,% symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,% toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,% uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,% viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,% whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,% wk1write,xlabel,xor,ylabel,zeros,zlabel,zoom},% sensitive,% morecomment=[l]\%,% morestring=[m]'% }[keywords,comments,strings]% \lst@definelanguage[5.2]{Mathematica}[3.0]{Mathematica}%% {morekeywords={Above,AbsoluteOptions,AbsoluteTiming,AccountingForm,% AccuracyGoal,Active,ActiveItem,AddOnHelpPath,% AdjustmentBox,AdjustmentBoxOptions,After,AiryAiPrime,% AlgebraicRulesData,Algebraics,Alias,AlignmentMarker,% AllowInlineCells,AllowScriptLevelChange,Analytic,AnimationCycleOffset,% AnimationCycleRepetitions,AnimationDirection,AnimationDisplayTime,ApartSquareFree,% AppellF1,ArgumentCountQ,ArrayDepth,ArrayPlot,% ArrayQ,ArrayRules,AspectRatioFixed,Assuming,% Assumptions,AutoDelete,AutoEvaluateEvents,AutoGeneratedPackage,% AutoIndent,AutoIndentSpacings,AutoItalicWords,AutoloadPath,% AutoOpenNotebooks,AutoOpenPalettes,AutoScroll,AutoSpacing,% AutoStyleOptions,Axis,BackgroundTasksSettings,Backsubstitution,% Backward,Baseline,Before,BeginDialogPacket,% BeginFrontEndInteractionPacket,Below,BezoutMatrix,BinaryFormat,% BinaryGet,BinaryRead,BinaryReadList,BinaryWrite,% BitAnd,BitNot,BitOr,BitXor,% Black,BlankForm,Blue,Boole,% Booleans,Bottom,Bounds,Box,% BoxBaselineShift,BoxData,BoxDimensions,BoxFormFormatTypes,% BoxFrame,BoxMargins,BoxRegion,Brown,% Buchberger,Button,ButtonBox,ButtonBoxOptions,% ButtonCell,ButtonContents,ButtonData,ButtonEvaluator,% ButtonExpandable,ButtonFrame,ButtonFunction,ButtonMargins,% ButtonMinHeight,ButtonNote,ButtonNotebook,ButtonSource,% ButtonStyle,ButtonStyleMenuListing,ByteOrdering,CallPacket,% CarmichaelLambda,Cell,CellAutoOverwrite,CellBaseline,% CellBoundingBox,CellBracketOptions,CellContents,CellDingbat,% CellEditDuplicate,CellElementsBoundingBox,CellElementSpacings,CellEvaluationDuplicate,% CellFrame,CellFrameColor,CellFrameLabelMargins,CellFrameLabels,% CellFrameMargins,CellGroup,CellGroupData,CellGrouping,% CellGroupingRules,CellHorizontalScrolling,CellLabel,CellLabelAutoDelete,% CellLabelMargins,CellLabelPositioning,CellMargins,CellObject,% CellOpen,CellPasswords,CellPrint,CellSize,% CellStyle,CellTags,CellularAutomaton,Center,% CharacterEncoding,CharacterEncodingsPath,CharacteristicPolynomial,CharacterRange,% CheckAll,CholeskyDecomposition,Clip,ClipboardNotebook,% Closed,ClosingAutoSave,CoefficientArrays,CoefficientDomain,% CofactorExpansion,ColonForm,ColorFunctionScaling,ColorRules,% ColorSelectorSettings,Column,ColumnAlignments,ColumnLines,% ColumnsEqual,ColumnSpacings,ColumnWidths,CommonDefaultFormatTypes,% CompileOptimizations,CompletionsListPacket,Complexes,ComplexityFunction,% Compose,ComposeSeries,ConfigurationPath,ConjugateTranspose,% Connect,ConsoleMessage,ConsoleMessagePacket,ConsolePrint,% ContentsBoundingBox,ContextToFileName,ContinuedFraction,ConversionOptions,% ConversionRules,ConvertToBitmapPacket,ConvertToPostScript,ConvertToPostScriptPacket,% Copyable,CoshIntegral,CounterAssignments,CounterBox,% CounterBoxOptions,CounterEvaluator,CounterFunction,CounterIncrements,% CounterStyle,CounterStyleMenuListing,CreatePalettePacket,Cross,% CurrentlySpeakingPacket,Cyan,CylindricalDecomposition,DampingFactor,% DataRange,Debug,DebugTag,Decimal,% DedekindEta,DefaultDuplicateCellStyle,DefaultFontProperties,DefaultFormatType,% DefaultFormatTypeForStyle,DefaultInlineFormatType,DefaultInputFormatType, DefaultNaturalLanguage,% DefaultNewCellStyle,DefaultNewInlineCellStyle,DefaultNotebook,DefaultOutputFormatType,% DefaultStyleDefinitions,DefaultTextFormatType,DefaultTextInlineFormatType,DefaultValues,% DefineExternal,DegreeLexicographic,DegreeReverseLexicographic,Deletable,% DeleteContents,DeletionWarning,DelimiterFlashTime,DelimiterMatching,% Delimiters,DependentVariables,DiacriticalPositioning,DialogLevel,% DifferenceOrder,DigitCharacter,DigitCount,DiracDelta,% Direction,DirectoryName,DisableConsolePrintPacket,DiscreteDelta,% DisplayAnimation,DisplayEndPacket,DisplayFlushImagePacket,DisplayForm,% DisplayPacket,DisplayRules,DisplaySetSizePacket,DisplayString,% DivisionFreeRowReduction,DOSTextFormat,DoubleExponential,DoublyInfinite,% Down,DragAndDrop,DrawHighlighted,DualLinearProgramming,% DumpGet,DumpSave,Edit,Editable,% EditButtonSettings,EditCellTagsSettings,EditDefinition,EditIn,% Element,EliminationOrder,EllipticExpPrime,EllipticNomeQ,% EllipticReducedHalfPeriods,EllipticThetaPrime,Empty,EnableConsolePrintPacket,% Encoding,EndAdd,EndDialogPacket,EndFrontEndInteractionPacket,% EndOfLine,EndOfString,Enter,EnterExpressionPacket,% EnterTextPacket,EqualColumns,EqualRows,EquatedTo,% Erfi,ErrorBox,ErrorBoxOptions,ErrorNorm,% ErrorPacket,ErrorsDialogSettings,Evaluatable,EvaluatePacket,% EvaluationCell,EvaluationCompletionAction,EvaluationMonitor,EvaluationNotebook,% Evaluator,EvaluatorNames,EventEvaluator,ExactNumberQ,% ExactRootIsolation,Except,ExcludedForms,Exists,% ExitDialog,ExponentPosition,ExponentStep,Export,% ExportAutoReplacements,ExportPacket,ExportString,ExpressionPacket,% ExpToTrig,Extension,ExternalCall,ExternalDataCharacterEncoding,% Extract,Fail,FEDisableConsolePrintPacket,FEEnableConsolePrintPacket,% Fibonacci,File,FileFormat,FileInformation,% FileName,FileNameDialogSettings,FindFit,FindInstance,% FindMaximum,FindSettings,FitAll,FlushPrintOutputPacket,% Font,FontColor,FontFamily,FontName,% FontPostScriptName,FontProperties,FontReencoding,FontSize,% FontSlant,FontSubstitutions,FontTracking,FontVariations,% FontWeight,ForAll,FormatRules,FormatTypeAutoConvert,% FormatValues,FormBox,FormBoxOptions,Forward,% ForwardBackward,FourierCosTransform,FourierParameters,FourierSinTransform,% FourierTransform,FractionalPart,FractionBox,FractionBoxOptions,% FractionLine,FrameBox,FrameBoxOptions,FresnelC,% FresnelS,FromContinuedFraction,FromDigits,FrontEndExecute,% FrontEndObject,FrontEndStackSize,FrontEndToken,FrontEndTokenExecute,% FrontEndVersion,Full,FullAxes,FullSimplify,% FunctionExpand,FunctionInterpolation,GaussKronrod,GaussPoints,% GenerateBitmapCaches,GenerateConditions,GeneratedCell,GeneratedParameters,% Generic,GetBoundingBoxSizePacket,GetContext,GetFileName,% GetFrontEndOptionsDataPacket,GetLinebreakInformationPacket,% GetMenusPacket,GetPageBreakInformationPacket,% Glaisher,GlobalPreferences,GlobalSession,Gradient,% GraphicsData,GraphicsGrouping,Gray,Green,% Grid,GridBaseline,GridBox,GridBoxOptions,% GridCreationSettings,GridDefaultElement,GridFrame,GridFrameMargins,% GroupPageBreakWithin,HarmonicNumber,Hash,HashTable,% HeadCompose,HelpBrowserLookup,HelpBrowserNotebook,HelpBrowserSettings,% HessenbergDecomposition,Hessian,HoldAllComplete,HoldComplete,% HoldPattern,Horizontal,HorizontalForm,HorizontalScrollPosition,% HTMLSave,Hypergeometric0F1Regularized,Hypergeometric1F1Regularized,% Hypergeometric2F1Regularized,% HypergeometricPFQ,HypergeometricPFQRegularized,HyperlinkCreationSettings,Hyphenation,% HyphenationOptions,IgnoreCase,ImageCache,ImageCacheValid,% ImageMargins,ImageOffset,ImageRangeCache,ImageRegion,% ImageResolution,ImageRotated,ImageSize,Import,% ImportAutoReplacements,ImportString,IncludeFileExtension,IncludeSingularTerm,% IndentingNewlineSpacings,IndentMaxFraction,IndexCreationOptions,Inequality,% InexactNumberQ,InexactNumbers,Inherited,InitializationCell,% InitializationCellEvaluation,InitializationCellWarning,% InlineCounterAssignments,InlineCounterIncrements,% InlineRules,InputAliases,InputAutoFormat,InputAutoReplacements,% InputGrouping,InputNamePacket,InputNotebook,InputPacket,% InputSettings,InputStringPacket,InputToBoxFormPacket,InputToInputForm,% InputToStandardForm,InsertionPointObject,IntegerExponent,IntegerPart,% Integers,Interactive,Interlaced,InterpolationOrder,% InterpolationPoints,InterpolationPrecision,InterpretationBox,% InterpretationBoxOptions,% InterpretTemplate,InterruptSettings,Interval,IntervalIntersection,% IntervalMemberQ,IntervalUnion,InverseBetaRegularized,InverseEllipticNomeQ,% InverseErf,InverseErfc,InverseFourierCosTransform, InverseFourierSinTransform,% InverseFourierTransform,InverseGammaRegularized,InverseJacobiCD,% InverseJacobiCN,% InverseJacobiCS,InverseJacobiDC,InverseJacobiDN,InverseJacobiDS,% InverseJacobiNC,InverseJacobiND,InverseJacobiNS,InverseJacobiSC,% InverseJacobiSD,InverseLaplaceTransform,InverseWeierstrassP,InverseZTransform,% Jacobian,JacobiCD,JacobiCN,JacobiCS,% JacobiDC,JacobiDN,JacobiDS,JacobiNC,% JacobiND,JacobiNS,JacobiSC,JacobiSD,% JordanDecomposition,K,Khinchin,KleinInvariantJ,% KroneckerDelta,Language,LanguageCategory,LaplaceTransform,% Larger,Launch,LayoutInformation,Left,% LetterCharacter,Lexicographic,LicenseID,LimitsPositioning,% LimitsPositioningTokens,LinearSolveFunction,LinebreakAdjustments,LineBreakWithin,% LineForm,LineIndent,LineSpacing,LineWrapParts,% LinkActivate,LinkClose,LinkConnect,LinkConnectedQ,% LinkCreate,LinkError,LinkFlush,LinkHost,% LinkInterrupt,LinkLaunch,LinkMode,LinkObject,% LinkOpen,LinkOptions,LinkPatterns,LinkProtocol,% LinkRead,LinkReadHeld,LinkReadyQ,Links,% LinkWrite,LinkWriteHeld,ListConvolve,ListCorrelate,% Listen,ListInterpolation,ListQ,LiteralSearch,% LongestMatch,LongForm,Loopback,LUBackSubstitution,% LUDecomposition,MachineID,MachineName,MachinePrecision,% MacintoshSystemPageSetup,Magenta,Magnification,MakeBoxes,% MakeExpression,MakeRules,Manual,MatchLocalNameQ,% MathematicaNotation,MathieuC,MathieuCharacteristicA,MathieuCharacteristicB,% MathieuCharacteristicExponent,MathieuCPrime,MathieuS,MathieuSPrime,% MathMLForm,MathMLText,MatrixRank,Maximize,% MaxIterations,MaxPlotPoints,MaxPoints,MaxRecursion,% MaxStepFraction,MaxSteps,MaxStepSize,Mean,% Median,MeijerG,MenuPacket,MessageOptions,% MessagePacket,MessagesNotebook,MetaCharacters,Method,% MethodOptions,Minimize,MinRecursion,MinSize,% Mode,ModularLambda,MonomialOrder,MonteCarlo,% Most,MousePointerNote,MultiDimensional,MultilaunchWarning,% MultilineFunction,MultiplicativeOrder,Multiplicity,Nand,% NeedCurrentFrontEndPackagePacket,NeedCurrentFrontEndSymbolsPacket,% NestedScriptRules,NestWhile,% NestWhileList,NevilleThetaC,NevilleThetaD,NevilleThetaN,% NevilleThetaS,Newton,Next,NHoldAll,% NHoldFirst,NHoldRest,NMaximize,NMinimize,% NonAssociative,NonPositive,Nor,Norm,% NormalGrouping,NormalSelection,NormFunction,Notebook,% NotebookApply,NotebookAutoSave,NotebookClose,NotebookConvert,% NotebookConvertSettings,NotebookCreate,NotebookCreateReturnObject,NotebookDefault,% NotebookDelete,NotebookDirectory,NotebookFind,NotebookFindReturnObject,% NotebookGet,NotebookGetLayoutInformationPacket,NotebookGetMisspellingsPacket,% NotebookInformation,% NotebookLocate,NotebookObject,NotebookOpen,NotebookOpenReturnObject,% NotebookPath,NotebookPrint,NotebookPut,NotebookPutReturnObject,% NotebookRead,NotebookResetGeneratedCells,Notebooks,NotebookSave,% NotebookSaveAs,NotebookSelection,NotebookSetupLayoutInformationPacket,% NotebooksMenu,% NotebookWrite,NotElement,NProductExtraFactors,NProductFactors,% NRoots,NSumExtraTerms,NSumTerms,NumberMarks,% NumberMultiplier,NumberString,NumericFunction,NumericQ,% NValues,Offset,OLEData,OneStepRowReduction,% Open,OpenFunctionInspectorPacket,OpenSpecialOptions,OptimizationLevel,% OptionInspectorSettings,OptionQ,OptionsPacket,OptionValueBox,% OptionValueBoxOptions,Orange,Ordering,Oscillatory,% OutputAutoOverwrite,OutputFormData,OutputGrouping,OutputMathEditExpression,% OutputNamePacket,OutputToOutputForm,OutputToStandardForm,Over,% Overflow,Overlaps,Overscript,OverscriptBox,% OverscriptBoxOptions,OwnValues,PadLeft,PadRight,% PageBreakAbove,PageBreakBelow,PageBreakWithin,PageFooterLines,% PageFooters,PageHeaderLines,PageHeaders,PalettePath,% PaperWidth,ParagraphIndent,ParagraphSpacing,ParameterVariables,% ParentConnect,ParentForm,Parenthesize,PasteBoxFormInlineCells,% Path,PatternTest,PeriodicInterpolation,Pick,% Piecewise,PiecewiseExpand,Pink,Pivoting,% PixelConstrained,Placeholder,Plain,Plot3Matrix,% PointForm,PolynomialForm,PolynomialReduce,Polynomials,% PowerModList,Precedence,PreferencesPath,PreserveStyleSheet,% Previous,PrimaryPlaceholder,Primes,PrincipalValue,% PrintAction,PrintingCopies,PrintingOptions,PrintingPageRange,% PrintingStartingPageNumber,PrintingStyleEnvironment,PrintPrecision,% PrivateCellOptions,% PrivateEvaluationOptions,PrivateFontOptions,PrivateNotebookOptions,PrivatePaths,% ProductLog,PromptForm,Purple,Quantile,% QuasiMonteCarlo,QuasiNewton,RadicalBox,RadicalBoxOptions,% RandomSeed,RationalFunctions,Rationals,RawData,% RawMedium,RealBlockForm,Reals,Reap,% Red,Refine,Refresh,RegularExpression,% Reinstall,Release,Removed,RenderingOptions,% RepeatedString,ReplaceList,Rescale,ResetMenusPacket,% Resolve,ResumePacket,ReturnExpressionPacket,ReturnInputFormPacket,% ReturnPacket,ReturnTextPacket,Right,Root,% RootReduce,RootSum,Row,RowAlignments,% RowBox,RowLines,RowMinHeight,RowsEqual,% RowSpacings,RSolve,RuleCondition,RuleForm,% RulerUnits,Saveable,SaveAutoDelete,ScreenRectangle,% ScreenStyleEnvironment,ScriptBaselineShifts,ScriptLevel,ScriptMinSize,% ScriptRules,ScriptSizeMultipliers,ScrollingOptions,ScrollPosition,% Second,SectionGrouping,Selectable,SelectedNotebook,% Selection,SelectionAnimate,SelectionCell,SelectionCellCreateCell,% SelectionCellDefaultStyle,SelectionCellParentStyle,SelectionCreateCell,% SelectionDuplicateCell,% SelectionEvaluate,SelectionEvaluateCreateCell,SelectionMove,SelectionSetStyle,% SelectionStrategy,SendFontInformationToKernel,SequenceHold,SequenceLimit,% SeriesCoefficient,SetBoxFormNamesPacket,SetEvaluationNotebook,% SetFileLoadingContext,% SetNotebookStatusLine,SetOptionsPacket,SetSelectedNotebook,% SetSpeechParametersPacket,% SetValue,ShortestMatch,ShowAutoStyles,ShowCellBracket,% ShowCellLabel,ShowCellTags,ShowClosedCellArea,ShowContents,% ShowCursorTracker,ShowGroupOpenCloseIcon,ShowPageBreaks,ShowSelection,% ShowShortBoxForm,ShowSpecialCharacters,ShowStringCharacters,% ShrinkWrapBoundingBox,% SingleLetterItalics,SingularityDepth,SingularValueDecomposition,% SingularValueList,% SinhIntegral,Smaller,Socket,SolveDelayed,% SoundAndGraphics,Sow,Space,SpaceForm,% SpanAdjustments,SpanCharacterRounding,SpanLineThickness,SpanMaxSize,% SpanMinSize,SpanningCharacters,SpanSymmetric,Sparse,% SparseArray,SpeakTextPacket,SpellingDictionaries,SpellingDictionariesPath,% SpellingOptions,SpellingSuggestionsPacket,Spherical,Split,% SqrtBox,SqrtBoxOptions,StandardDeviation,StandardForm,% StartingStepSize,StartOfLine,StartOfString,StartupSound,% StepMonitor,StieltjesGamma,StoppingTest,StringCases,% StringCount,StringExpression,StringFreeQ,StringQ,% StringReplaceList,StringReplacePart,StringSplit,StripBoxes,% StripWrapperBoxes,StructuredSelection,StruveH,StruveL,% StyleBox,StyleBoxAutoDelete,StyleBoxOptions,StyleData,% StyleDefinitions,StyleForm,StyleMenuListing,StyleNameDialogSettings,% StylePrint,StyleSheetPath,Subresultants,SubscriptBox,% SubscriptBoxOptions,Subsets,Subsuperscript,SubsuperscriptBox,% SubsuperscriptBoxOptions,SubtractFrom,SubValues,SugarCube,% SuperscriptBox,SuperscriptBoxOptions,SuspendPacket,SylvesterMatrix,% SymbolName,Syntax,SyntaxForm,SyntaxPacket,% SystemException,SystemHelpPath,SystemStub,Tab,% TabFilling,TabSpacings,TagBox,TagBoxOptions,% TaggingRules,TagStyle,TargetFunctions,TemporaryVariable,% TensorQ,TeXSave,TextAlignment,TextBoundingBox,% TextData,TextJustification,TextLine,TextPacket,% TextParagraph,TextRendering,TextStyle,ThisLink,% TimeConstraint,TimeVariable,TitleGrouping,ToBoxes,% ToColor,ToFileName,Toggle,ToggleFalse,% Tolerance,TooBig,Top,ToRadicals,% Total,Tr,TraceAction,TraceInternal,% TraceLevel,TraditionalForm,TraditionalFunctionNotation,TraditionalNotation,% TraditionalOrder,TransformationFunctions,TransparentColor,Trapezoidal,% TrigExpand,TrigFactor,TrigFactorList,TrigReduce,% TrigToExp,Tuples,UnAlias,Underflow,% Underoverscript,UnderoverscriptBox,UnderoverscriptBoxOptions,Underscript,% UnderscriptBox,UnderscriptBoxOptions,UndocumentedTestFEParserPacket,% UndocumentedTestGetSelectionPacket,% UnitStep,Up,URL,Using,% V2Get,Value,ValueBox,ValueBoxOptions,% ValueForm,Variance,Verbatim,Verbose,% VerboseConvertToPostScriptPacket,VerifyConvergence,VerifySolutions,Version,% VersionNumber,Vertical,VerticalForm,ViewPointSelectorSettings,% Visible,VisibleCell,WeierstrassHalfPeriods,WeierstrassInvariants,% WeierstrassSigma,WeierstrassZeta,White,Whitespace,% WhitespaceCharacter,WindowClickSelect,WindowElements,WindowFloating,% WindowFrame,WindowFrameElements,WindowMargins,WindowMovable,% WindowSize,WindowTitle,WindowToolbars,WindowWidth,% WordBoundary,WordCharacter,WynnDegree,XMLElement},% morendkeywords={$,$AddOnsDirectory,$AnimationDisplayFunction,% $AnimationFunction,% $Assumptions,$BaseDirectory,$BoxForms,$ByteOrdering,% $CharacterEncoding,$ConditionHold,$CurrentLink,$DefaultPath,% $ExportEncodings,$ExportFormats,$FormatType,$FrontEnd,% $HistoryLength,$HomeDirectory,$ImportEncodings,$ImportFormats,% $InitialDirectory,$InstallationDate,$InstallationDirectory,% $InterfaceEnvironment,% $LaunchDirectory,$LicenseExpirationDate,$LicenseID,$LicenseProcesses,% $LicenseServer,$MachineDomain,$MaxExtraPrecision,$MaxLicenseProcesses,% $MaxNumber,$MaxPiecewiseCases,$MaxPrecision,$MaxRootDegree,% $MinNumber,$MinPrecision,$NetworkLicense,$NumberMarks,% $Off,$OutputForms,$ParentLink,$ParentProcessID,% $PasswordFile,$PathnameSeparator,$PreferencesDirectory,$PrintForms,% $PrintLiteral,$ProcessID,$ProcessorType,$ProductInformation,% $ProgramName,$PSDirectDisplay,$RandomState,$RasterFunction,% $RootDirectory,$SetParentLink,$SoundDisplay,$SuppressInputFormHeads,% $SystemCharacterEncoding,$SystemID,$TemporaryPrefix,$TextStyle,% $TopDirectory,$TraceOff,$TraceOn,$TracePattern,% $TracePostAction,$TracePreAction,$UserAddOnsDirectory,$UserBaseDirectory,% $UserName,Constant,Flat,HoldAll,% HoldAllComplete,HoldFirst,HoldRest,Listable,% Locked,NHoldAll,NHoldFirst,NHoldRest,% NumericFunction,OneIdentity,Orderless,Protected,% ReadProtected,SequenceHold},% }% %% %% Mathematica definitions (c) 1999 Michael Wiese %% \lst@definelanguage[3.0]{Mathematica}[1.0]{Mathematica}% {morekeywords={Abort,AbortProtect,AbsoluteDashing,AbsolutePointSize,% AbsoluteThickness,AbsoluteTime,AccountingFormAiry,AiPrime,AiryBi,% AiryBiPrime,Alternatives,AnchoredSearch,AxesEdge,AxesOrigin,% AxesStyle,Background,BetaRegularized,BoxStyle,C,CheckAbort,% Circle,ClebschGordan,CMYKColor,ColorFunction,ColorOutput,Compile,% Compiled,CompiledFunction,ComplexExpand,ComposeList,Composition,% ConstrainedMax,ConstrainedMin,Contexts,ContextToFilename,% ContourLines,Contours,ContourShading,ContourSmoothing,% ContourStyle,CopyDirectory,CopyFile,CosIntegral,CreateDirectory,% Cuboid,Date,DeclarePackage,DefaultColor,DefaultFont,Delete,% DeleteCases,DeleteDirectory,DeleteFile,Dialog,DialogIndent,% DialogProlog,DialogSymbols,DigitQ,Directory,DirectoryStack,Disk,% Dispatch,DownValues,DSolve,Encode,Epilog,Erfc,Evaluate,% ExponentFunction,FaceGrids,FileByteCount,FileDate,FileNames,% FileType,Find,FindList,FixedPointList,FlattenAt,Fold,FoldList,% Frame,FrameLabel,FrameStyle,FrameTicks,FromCharacterCode,% FromDate,FullGraphics,FullOptions,GammaRegularized,% GaussianIntegers,GraphicsArray,GraphicsSpacing,GridLines,% GroebnerBasis,Heads,HeldPart,HomeDirectory,Hue,IgnoreCases,% InputStream,Install,InString,IntegerDigits,InterpolatingFunction,% InterpolatingPolynomial,Interpolation,Interrupt,InverseFunction,% InverseFunctions,JacobiZeta,LetterQ,LinearProgramming,ListPlay,% LogGamma,LowerCaseQ,MachineNumberQ,MantissaExponent,MapIndexed,% MapThread,MatchLocalNames,MatrixExp,MatrixPower,MeshRange,% MeshStyle,MessageList,Module,NDSolve,NSolve,NullRecords,% NullWords,NumberFormat,NumberPadding,NumberSigns,OutputStream,% PaddedForm,ParentDirectory,Pause,Play,PlayRange,PlotRegion,% PolygonIntersections,PolynomialGCD,PolynomialLCM,PolynomialMod,% PostScript,PowerExpand,PrecisionGoal,PrimePi,Prolog,% QRDecomposition,Raster,RasterArray,RealDigits,Record,RecordLists,% RecordSeparators,ReleaseHold,RenameDirectory,RenameFile,% ReplaceHeldPart,ReplacePart,ResetDirectory,Residue,% RiemannSiegelTheta,RiemannSiegelZ,RotateLabel,SameTest,% SampleDepth,SampledSoundFunction,SampledSoundList,SampleRate,% SchurDecomposition,SessionTime,SetAccuracy,SetDirectory,% SetFileDate,SetPrecision,SetStreamPosition,Shallow,SignPadding,% SinIntegral,SixJSymbol,Skip,Sound,SpellingCorrection,% SphericalRegion,Stack,StackBegin,StackComplete,StackInhibit,% StreamPosition,Streams,StringByteCount,StringConversion,% StringDrop,StringInsert,StringPosition,StringReplace,% StringReverse,StringTake,StringToStream,SurfaceColor,% SyntaxLength,SyntaxQ,TableAlignments,TableDepth,% TableDirections,TableHeadings,TableSpacing,ThreeJSymbol,TimeUsed,% TimeZone,ToCharacterCode,ToDate,ToHeldExpression,TokenWords,% ToLowerCase,ToUpperCase,Trace,TraceAbove,TraceBackward,% TraceDepth,TraceDialog,TraceForward,TraceOff,TraceOn,% TraceOriginal,TracePrint,TraceScan,Trig,Unevaluated,Uninstall,% UnsameQ,UpperCaseQ,UpValues,ViewCenter,ViewVertical,With,Word,% WordSearch,WordSeparators},% morendkeywords={Stub,Temporary,$Aborted,$BatchInput,$BatchOutput,% $CreationDate,$DefaultFont,$DumpDates,$DumpSupported,$Failed,% $Input,$Inspector,$IterationLimit,$Language,$Letters,$Linked,% $LinkSupported,$MachineEpsilon,$MachineID,$MachineName,% $MachinePrecision,$MachineType,$MaxMachineNumber,$MessageList,% $MessagePrePrint,$MinMachineNumber,$ModuleNumber,$NewMessage,% $NewSymbol,$Notebooks,$OperatingSystem,$Packages,$PipeSupported,% $PreRead,$ReleaseNumber,$SessionID,$SoundDisplayFunction,% $StringConversion,$StringOrder,$SyntaxHandler,$TimeUnit,% $VersionNumber}% }% \lst@definelanguage[1.0]{Mathematica}% {morekeywords={Abs,Accuracy,AccurayGoal,AddTo,AiryAi,AlgebraicRules,% AmbientLight,And,Apart,Append,AppendTo,Apply,ArcCos,ArcCosh,% ArcCot,ArcCoth,ArcCsc,ArcCsch,ArcSec,ArcSech,ArcSin,ArcSinh,% ArcTan,ArcTanh,Arg,ArithmeticGeometricMean,Array,AspectRatio,% AtomQ,Attributes,Axes,AxesLabel,BaseForm,Begin,BeginPackage,% BernoulliB,BesselI,BesselJ,BesselK,BesselY,Beta,Binomial,Blank,% BlankNullSequence,BlankSequence,Block,Boxed,BoxRatios,Break,Byte,% ByteCount,Cancel,Cases,Catch,Ceiling,CForm,Character,Characters,% ChebyshevT,ChebyshevU,Check,Chop,Clear,ClearAll,ClearAttributes,% ClipFill,Close,Coefficient,CoefficientList,Collect,ColumnForm,% Complement,Complex,CompoundExpression,Condition,Conjugate,% Constants,Context,Continuation,Continue,ContourGraphics,% ContourPlot,Cos,Cosh,Cot,Coth,Count,Csc,Csch,Cubics,Cyclotomic,% D,Dashing,Decompose,Decrement,Default,Definition,Denominator,% DensityGraphics,DensityPlot,Depth,Derivative,Det,DiagonalMatrix,% DigitBlock,Dimensions,DirectedInfinity,Display,DisplayFunction,% Distribute,Divide,DivideBy,Divisors,DivisorSigma,Do,Dot,Drop,Dt,% Dump,EdgeForm,Eigensystem,Eigenvalues,Eigenvectors,Eliminate,% EllipticE,EllipticExp,EllipticF,EllipticK,EllipticLog,EllipticPi,% EllipticTheta,End,EndPackage,EngineeringForm,Environment,Equal,% Erf,EulerE,EulerPhi,EvenQ,Exit,Exp,Expand,ExpandAll,% ExpandDenominator,ExpandNumerator,ExpIntegralE,ExpIntegralEi,% Exponent,Expression,ExtendedGCD,FaceForm,Factor,FactorComplete,% Factorial,Factorial2,FactorInteger,FactorList,FactorSquareFree,% FactorSquareFreeList,FactorTerms,FactorTermsList,FindMinimum,% FindRoot,First,Fit,FixedPoint,Flatten,Floor,FontForm,For,Format,% FormatType,FortranForm,Fourier,FreeQ,FullDefinition,FullForm,% Function,Gamma,GCD,GegenbauerC,General,Get,Goto,Graphics,% Graphics3D,GrayLevel,Greater,GreaterEqual,Head,HermiteH,% HiddenSurface,Hold,HoldForm,Hypergeometric0F1,Hypergeometric1F1,% Hypergeometric2F1,HypergeometricU,Identity,IdentityMatrix,If,Im,% Implies,In,Increment,Indent,Infix,Information,Inner,Input,% InputForm,InputString,Insert,Integer,IntegerQ,Integrate,% Intersection,Inverse,InverseFourier,InverseJacobiSN,% InverseSeries,JacobiAmplitude,JacobiP,JacobiSN,JacobiSymbol,Join,% Label,LaguerreL,Last,LatticeReduce,LCM,LeafCount,LegendreP,% LegendreQ,LegendreType,Length,LerchPhi,Less,LessEqual,Level,% Lighting,LightSources,Limit,Line,LinearSolve,LineBreak,List,% ListContourPlot,ListDensityPlot,ListPlot,ListPlot3D,Literal,Log,% LogicalExpand,LogIntegral,MainSolve,Map,MapAll,MapAt,MatchQ,% MatrixForm,MatrixQ,Max,MaxBend,MaxMemoryUsed,MemberQ,% MemoryConstrained,MemoryInUse,Mesh,Message,MessageName,Messages,% Min,Minors,Minus,Mod,Modulus,MoebiusMu,Multinomial,N,NameQ,Names,% NBernoulliB,Needs,Negative,Nest,NestList,NIntegrate,% NonCommutativeMultiply,NonConstants,NonNegative,Normal,Not,% NProduct,NSum,NullSpace,Number,NumberForm,NumberPoint,NumberQ,% NumberSeparator,Numerator,O,OddQ,Off,On,OpenAppend,OpenRead,% OpenTemporary,OpenWrite,Operate,Optional,Options,Or,Order,% OrderedQ,Out,Outer,OutputForm,PageHeight,PageWidth,% ParametricPlot,ParametricPlot3D,Part,Partition,PartitionsP,% PartitionsQ,Pattern,Permutations,Plot,Plot3D,PlotDivision,% PlotJoined,PlotLabel,PlotPoints,PlotRange,PlotStyle,Pochhammer,% Plus,Point,PointSize,PolyGamma,Polygon,PolyLog,PolynomialQ,% PolynomialQuotient,PolynomialRemainder,Position,Positive,Postfix,% Power,PowerMod,PrecedenceForm,Precision,PreDecrement,Prefix,% PreIncrement,Prepend,PrependTo,Prime,PrimeQ,Print,PrintForm,% Product,Protect,PseudoInverse,Put,PutAppend,Quartics,Quit,% Quotient,Random,Range,Rational,Rationalize,Raw,Re,Read,ReadList,% Real,Rectangle,Reduce,Remove,RenderAll,Repeated,RepeatedNull,% Replace,ReplaceAll,ReplaceRepeated,Rest,Resultant,Return,Reverse,% RGBColor,Roots,RotateLeft,RotateRight,Round,RowReduce,Rule,% RuleDelayed,Run,RunThrough,SameQ,Save,Scaled,Scan,ScientificForm,% Sec,Sech,SeedRandom,Select,Sequence,SequenceForm,Series,% SeriesData,Set,SetAttributes,SetDelayed,SetOptions,Shading,Share,% Short,Show,Sign,Signature,Simplify,Sin,SingularValues,Sinh,% Skeleton,Slot,SlotSequence,Solve,SolveAlways,Sort,% SphericalHarmonicY,Splice,Sqrt,StirlingS1,StirlingS2,String,% StringBreak,StringForm,StringJoin,StringLength,StringMatchQ,% StringSkeleton,Subscript,Subscripted,Subtract,SubtractForm,Sum,% Superscript,SurfaceGraphics,Switch,Symbol,Table,TableForm,TagSet,% TagSetDelayed,TagUnset,Take,Tan,Tanh,ToString,TensorRank,TeXForm,% Text,TextForm,Thickness,Thread,Through,Throw,Ticks,% TimeConstrained,Times,TimesBy,Timing,ToExpression,Together,% ToRules,ToString,TotalHeight,TotalWidth,Transpose,TreeForm,TrueQ,% Unequal,Union,Unique,Unprotect,Unset,Update,UpSet,UpSetDelayed,% ValueQ,Variables,VectorQ,ViewPoint,WeierstrassP,% WeierstrassPPrime,Which,While,WorkingPrecision,Write,WriteString,% Xor,ZeroTest,Zeta},% morendkeywords={All,Automatic,Catalan,ComplexInfinity,Constant,% Degree,E,EndOfFile,EulerGamma,False,Flat,GoldenRatio,HoldAll,% HoldFirst,HoldRest,I,Indeterminate,Infinity,Listable,Locked,% Modular,None,Null,OneIdentity,Orderless,Pi,Protected,% ReadProtected,True,$CommandLine,$Context,$ContextPath,$Display,% $DisplayFunction,$Echo,$Epilog,$IgnoreEOF,$Line,$Messages,% $Output,$Path,$Post,$Pre,$PrePrint,$RecursionLimit,$System,% $Urgent,$Version},% sensitive,% morecomment=[s]{(*}{*)},% morestring=[d]"% }[keywords,comments,strings]% %% %% Octave definition (c) 2001,2002 Ulrich G. Wortmann %% \lst@definelanguage{Octave}% {morekeywords={gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,% all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,% auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,% betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,% cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,% clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,% comet,comet3,compan,compass,computer,cond,condest,conj,contour,% contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,% cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,% csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,% dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,% ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,% del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,% dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,% end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,% engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,% engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,% errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,% feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,% fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,% flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,% fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,% gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,% getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,% gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,% hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,% imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,% invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,% isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,% legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,% loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,% matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,% matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,% matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,% meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,% mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,% mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,% min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,% mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,% mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,% mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,% mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,% mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,% mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,% mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,% mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,% nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,% pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,% pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,% pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,% quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,% rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,% return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,% round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,% semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,% spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,% sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,% sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,% str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,% subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,% symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,% toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,% uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,% viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,% whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,% stderr,stdout,plot,set,endif,wk1write,xlabel,xor,ylabel,zeros,% zlabel,zoom,endwhile,endfunction,printf,case,switch,otherwise,% system,lsode,endfor,error,ones,oneplot,__gnuplot_set__,do,until},% sensitive=t,% morecomment=[l]\#,% morecomment=[l]\#\#,% morecomment=[l]\%,% morestring=[m]',% morestring=[m]"% }[keywords,comments,strings]% \lst@definelanguage[XSC]{Pascal}[Standard]{Pascal} {deletekeywords={alfa,byte,pack,unpack},% 1998 Andreas Stephan morekeywords={dynamic,external,forward,global,module,nil,operator,% priority,sum,type,use,dispose,mark,page,release,cimatrix,% cinterval,civector,cmatrix,complex,cvector,dotprecision,imatrix,% interval,ivector,rmatrix,rvector,string,im,inf,re,sup,chr,comp,% eof,eoln,expo,image,ival,lb,lbound,length,loc,mant,maxlength,odd,% ord,pos,pred,round,rval,sign,substring,succ,trunc,ub,ubound}% }% \lst@definelanguage[Borland6]{Pascal}[Standard]{Pascal} {morekeywords={asm,constructor,destructor,implementation,inline,% interface,nil,object,shl,shr,string,unit,uses,xor},% morendkeywords={Abs,Addr,ArcTan,Chr,Concat,Copy,Cos,CSeg,DiskFree,% DiskSize,DosExitCode,DosVersion,DSeg,EnvCount,EnvStr,Eof,Eoln,% Exp,FExpand,FilePos,FileSize,Frac,FSearch,GetBkColor,GetColor,% GetDefaultPalette,GetDriverName,GetEnv,GetGraphMode,GetMaxMode,% GetMaxX,GetMaxY,GetModeName,GetPaletteSize,GetPixel,GetX,GetY,% GraphErrorMsg,GraphResult,Hi,ImageSize,InstallUserDriver,% InstallUserFont,Int,IOResult,KeyPressed,Length,Lo,MaxAvail,% MemAvail,MsDos,Odd,Ofs,Ord,OvrGetBuf,OvrGetRetry,ParamCount,% ParamStr,Pi,Pos,Pred,Ptr,Random,ReadKey,Round,SeekEof,SeekEoln,% Seg,SetAspectRatio,Sin,SizeOf,Sound,SPtr,Sqr,Sqrt,SSeg,Succ,% Swap,TextHeight,TextWidth,Trunc,TypeOf,UpCase,WhereX,WhereY,% Append,Arc,Assign,AssignCrt,Bar,Bar3D,BlockRead,BlockWrite,ChDir,% Circle,ClearDevice,ClearViewPort,Close,CloseGraph,ClrEol,ClrScr,% Dec,Delay,Delete,DelLine,DetectGraph,Dispose,DrawPoly,Ellipse,% Erase,Exec,Exit,FillChar,FillEllipse,FillPoly,FindFirst,FindNext,% FloodFill,Flush,FreeMem,FSplit,GetArcCoords,GetAspectRatio,% GetDate,GetDefaultPalette,GetDir,GetCBreak,GetFAttr,% GetFillSettings,GetFTime,GetImage,GetIntVec,GetLineSettings,% GetMem,GetPalette,GetTextSettings,GetTime,GetVerify,% GetViewSettings,GoToXY,Halt,HighVideo,Inc,InitGraph,Insert,% InsLine,Intr,Keep,Line,LineRel,LineTo,LowVideo,Mark,MkDir,Move,% MoveRel,MoveTo,MsDos,New,NormVideo,NoSound,OutText,OutTextXY,% OvrClearBuf,OvrInit,OvrInitEMS,OvrSetBuf,PackTime,PieSlice,% PutImage,PutPixel,Randomize,Rectangle,Release,Rename,% RestoreCrtMode,RmDir,RunError,Sector,Seek,SetActivePage,% SetAllPalette,SetBkColor,SetCBreak,SetColor,SetDate,SetFAttr,% SetFillPattern,SetFillStyle,SetFTime,SetGraphBufSize,% SetGraphMode,SetIntVec,SetLineStyle,SetPalette,SetRGBPalette,% SetTextBuf,SetTextJustify,SetTextStyle,SetTime,SetUserCharSize,% SetVerify,SetViewPort,SetVisualPage,SetWriteMode,Sound,Str,% SwapVectors,TextBackground,TextColor,TextMode,Truncate,% UnpackTime,Val,Window}% }% \lst@definelanguage[Standard]{Pascal}% {morekeywords={alfa,and,array,begin,boolean,byte,case,char,const,div,% do,downto,else,end,false,file,for,function,get,goto,if,in,% integer,label,maxint,mod,new,not,of,or,pack,packed,page,program,% put,procedure,read,readln,real,record,repeat,reset,rewrite,set,% text,then,to,true,type,unpack,until,var,while,with,write,% writeln},% sensitive=f,% morecomment=[s]{(*}{*)},% morecomment=[s]{\{}{\}},% morestring=[d]'% }[keywords,comments,strings]% \lst@definelanguage{Perl}% {morekeywords={abs,accept,alarm,atan2,bind,binmode,bless,caller,% chdir,chmod,chomp,chop,chown,chr,chroot,close,closedir,connect,% continue,cos,crypt,dbmclose,dbmopen,defined,delete,die,do,dump,% each,else,elsif,endgrent,endhostent,endnetent,endprotoent,% endpwent,endservent,eof,eval,exec,exists,exit,exp,fcntl,fileno,% flock,for,foreach,fork,format,formline,getc,getgrent,getgrgid,% getgrnam,gethostbyaddr,gethostbyname,gethostent,getlogin,% getnetbyaddr,getnetbyname,getnetent,getpeername,getpgrp,% getppid,getpriority,getprotobyname,getprotobynumber,getprotoent,% getpwent,getpwnam,getpwuid,getservbyname,getservbyport,% getservent,getsockname,getsockopt,glob,gmtime,goto,grep,hex,if,% import,index,int,ioctl,join,keys,kill,last,lc,lcfirst,length,% link,listen,local,localtime,log,lstat,m,map,mkdir,msgctl,msgget,% msgrcv,msgsnd,my,next,no,oct,open,opendir,ord,pack,package,pipe,% pop,pos,print,printf,prototype,push,q,qq,quotemeta,qw,qx,rand,% read,readdir,readlink,recv,redo,ref,rename,require,reset,return,% reverse,rewinddir,rindex,rmdir,s,scalar,seek,seekdir,select,% semctl,semget,semop,send,setgrent,sethostent,setnetent,setpgrp,% setpriority,setprotoent,setpwent,setservent,setsockopt,shift,% shmctl,shmget,shmread,shmwrite,shutdown,sin,sleep,socket,% socketpair,sort,splice,split,sprintf,sqrt,srand,stat,study,sub,% substr,symlink,syscall,sysopen,sysread,system,syswrite,tell,% telldir,tie,tied,time,times,tr,truncate,uc,ucfirst,umask,undef,% unless,unlink,unpack,unshift,untie,until,use,utime,values,vec,% wait,waitpid,wantarray,warn,while,write,y},% sensitive,% morecomment=[l]\#,% morestring=[b]",% morestring=[b]',% MoreSelectCharTable=% \lst@ReplaceInput{\$\#}{\lst@ProcessOther\$\lst@ProcessOther\#}% }[keywords,comments,strings]% %% %% POV definition (c) 1999 Berthold H\"ollmann %% \lst@definelanguage{POV}% {morekeywords={abs,absorption,acos,acosh,adaptive,adc_bailout,agate,% agate_turb,all,alpha,ambient,ambient_light,angle,aperture,append,% arc_angle,area_light,array,asc,asin,asinh,assumed_gamma,atan,% atan2,atanh,average,background,bezier_spline,bicubic_patch,% black_hole,blob,blue,blur_samples,bounded_by,box,boxed,bozo,% break,brick,brick_size,brightness,brilliance,bumps,bump_map,% bump_size,camera,case,caustics,ceil,checker,chr,clipped_by,clock,% clock_delta,color,color_map,colour,colour_map,component,% composite,concat,cone,confidence,conic_sweep,control0,control1,% cos,cosh,count,crackle,crand,cube,cubic,cubic_spline,cubic_wave,% cylinder,cylindrical,debug,declare,default,defined,degrees,% density,density_file,density_map,dents,difference,diffuse,% dimensions,dimension_size,direction,disc,distance,% distance_maximum,div,eccentricity,else,emission,end,error,% error_bound,exp,extinction,fade_distance,fade_power,falloff,% falloff_angle,false,fclose,file_exists,filter,finish,fisheye,% flatness,flip,floor,focal_point,fog,fog_alt,fog_offset,fog_type,% fopen,frequency,gif,global_settings,gradient,granite,% gray_threshold,green,height_field,hexagon,hf_gray_16,hierarchy,% hollow,hypercomplex,if,ifdef,iff,ifndef,image_map,include,int,% interior,interpolate,intersection,intervals,inverse,ior,irid,% irid_wavelength,jitter,julia_fractal,lambda,lathe,leopard,% light_source,linear_spline,linear_sweep,local,location,log,% looks_like,look_at,low_error_factor,macro,mandel,map_type,marble,% material,material_map,matrix,max,max_intersections,max_iteration,% max_trace_level,media,media_attenuation,media_interaction,merge,% mesh,metallic,min,minimum_reuse,mod,mortar,nearest_count,no,% normal,normal_map,no_shadow,number_of_waves,object,octaves,off,% offset,omega,omnimax,on,once,onion,open,orthographic,panoramic,% perspective,pgm,phase,phong,phong_size,pi,pigment,pigment_map,% planar,plane,png,point_at,poly,polygon,poly_wave,pot,pow,ppm,% precision,prism,pwr,quadratic_spline,quadric,quartic,quaternion,% quick_color,quick_colour,quilted,radial,radians,radiosity,radius,% rainbow,ramp_wave,rand,range,ratio,read,reciprocal,% recursion_limit,red,reflection,reflection_exponent,refraction,% render,repeat,rgb,rgbf,rgbft,rgbt,right,ripples,rotate,roughness,% samples,scale,scallop_wave,scattering,seed,shadowless,sin,% sine_wave,sinh,sky,sky_sphere,slice,slope_map,smooth,% smooth_triangle,sor,specular,sphere,spherical,spiral1,spiral2,% spotlight,spotted,sqr,sqrt,statistics,str,strcmp,strength,strlen,% strlwr,strupr,sturm,substr,superellipsoid,switch,sys,t,tan,tanh,% text,texture,texture_map,tga,thickness,threshold,tightness,tile2,% tiles,torus,track,transform,translate,transmit,triangle,% triangle_wave,true,ttf,turbulence,turb_depth,type,u,% ultra_wide_angle,undef,union,up,use_color,use_colour,use_index,% u_steps,v,val,variance,vaxis_rotate,vcross,vdot,version,vlength,% vnormalize,vrotate,v_steps,warning,warp,water_level,waves,while,% width,wood,wrinkles,write,x,y,yes,z},% moredirectives={break,case,debug,declare,default,else,end,fclose,% fopen,local,macro,read,render,statistics,switch,undef,version,% warning,write},% moredelim=*[directive]\#,% sensitive,% morecomment=[l]//,% morecomment=[s]{/*}{*/},% morestring=[d]",% }[keywords,directives,comments,strings]% %% %% Python definition (c) 1998 Michael Weber %% \lst@definelanguage{Python}% {morekeywords={access,and,break,class,continue,def,del,elif,else,% except,exec,finally,for,from,global,if,import,in,is,lambda,not,% or,pass,print,raise,return,try,while},% sensitive=true,% morecomment=[l]\#,% morestring=[b]',% morestring=[b]",% morecomment=[s]{'''}{'''},% used for documentation text morecomment=[s]{"""}{"""}% added by Philipp Matthias Hahn }% %% %% Scilab definition (c) 2002,2003 Jean-Philippe Grivet %% \lst@definelanguage{Scilab}% {morekeywords={abcd,abinv,abort,abs,acoshm,acosh,acosm,acos,addcolor,% addf,addinter,addmenu,add_edge,add_node,adj2sp,adj_lists,aff2ab,% amell,analpf,analyze,ans,apropos,arc_graph,arc_number,argn,arhnk,% arl2,arma2p,armac,armax1,armax,arma,arsimul,artest,articul,ascii,% asinhm,asinh,asinm,asin,atanhm,atanh,atanm,atan,augment,auread,% auwrite,balanc,balreal,bandwr,basename,bdiag,besseli,besselj,% besselk,bessely,best_match,bezout,bifish,bilin,binomial,black,% bloc2exp,bloc2ss,bode,bool2s,boolean,boucle,break,bstap,buttmag,% bvode,cainv,calerf,calfrq,call,canon,casc,case,ccontrg,cdfbet,% cdfbin,cdfchi,cdfchn,cdffnc,cdff,cdfgam,cdfnbn,cdfnor,cdfpoi,% cdft,ceil,center,cepstrum,chaintest,chain_struct,champ1,champ,% chart,chdir,cheb1mag,cheb2mag,check_graph,check_io,chepol,chfact,% chol,chsolve,circuit,classmarkov,clean,clearfun,clearglobal,% clear,close,cls2dls,cmb_lin,cmndred,cmoment,code2str,coeff,coffg,% coff,colcompr,colcomp,colinout,colormap,colregul,companion,comp,% cond,conj,connex,contour2di,contour2d,contourf,contour,% contract_edge,contrss,contr,cont_frm,cont_mat,convex_hull,convol,% convstr,con_nodes,copfac,copy,correl,corr,coshm,cosh,cosm,cos,% cotg,cothm,coth,covar,csim,cspect,ctr_gram,cumprod,cumsum,% curblock,cycle_basis,czt,c_link,dasrt,dassl,datafit,date,dbphi,% dcf,ddp,debug,dec2hex,deff,definedfields,degree,delbpt,% delete_arcs,delete_nodes,delete,delip,delmenu,demos,denom,% derivative,derivat,des2ss,des2tf,determ,detr,det,dft,dhinf,% dhnorm,diag,diary,diff,diophant,dirname,dispbpt,dispfiles,disp,% dlgamma,double,dragrect,drawaxis,drawlater,drawnow,draw,driver,% dscr,dsearch,dsimul,dtsi,dt_ility,duplicate,edge_number,% edit_curv,edit_graph_menus,edit_graph,edit,eigenmarkov,ell1mag,% elseif,else,emptystr,endfunction,end,eqfir,eqiir,equil1,equil,% ereduc,erfcx,erfc,erf,errbar,errcatch,errclear,error,eval3dp,% eval3d,eval,evans,evstr,excel2sci,execstr,exec,exists,exit,expm,% exp,external,eye,fac3d,factors,faurre,fchamp,fcontour2d,fcontour,% fec,feedback,feval,ffilt,fftshift,fft,fgrayplot,figure,fileinfo,% file,filter,findm,findobj,findx0BD,find_freq,find_path,find,% findABCD,findAC,findBD,findBDK,findR,fit_dat,fix,floor,flts,foo,% formatman,format,fort,for,fourplan,fplot2d,fplot3d1,fplot3d,% fprintf,fprintfMat,frep2tf,freq,freson,frexp,frfit,frmag,fscanf,% fscanfMat,fsfirlin,fsolve,fspecg,fstabst,fstair,ftest,ftuneq,% fullrfk,fullrf,full,fun2string,funcprot,functions,function,% funptr,fusee,gainplot,gamitg,gammaln,gamma,gcare,gcd,gcf,% genfac3d,genlib,genmarkov,gen_net,geom3d,geomean,getblocklabel,% getcolor,getcurblock,getcwd,getdate,getd,getenv,getfield,getfont,% getf,getio,getlinestyle,getmark,getpid,getscicosvars,getsymbol,% getvalue,getversion,get_function_path,get,gfare,gfrancis,girth,% givens,glever,glist,global,glue,gpeche,graduate,grand,% graphics_entities,graph_2_mat,graph_center,graph_complement,% graph_diameter,graph_power,graph_simp,graph_sum,graph_union,% graph-list,graycolormap,grayplot,graypolarplot,grep,group,% gr_menu,gschur,gsort,gspec,gstacksize,gtild,g_margin,h2norm,halt,% hamilton,hankelsv,hank,harmean,havewindow,help,hermit,hess,% hex2dec,hilb,hinf,hist3d,histplot,horner,host,hotcolormap,% householder,hrmt,htrianr,hypermat,h_cl,h_inf_st,h_inf,h_norm,% iconvert,icon_edit,ieee,if,iirgroup,iirlp,iir,ilib_build,% ilib_compile,ilib_for_link,ilib_gen_gateway,ilib_gen_loader,% ilib_gen_Make,imag,impl,imrep2ss,imult,im_inv,inistate,input,% int16,int2d,int32,int3d,int8,intc,intdec,integrate,interpln,% interp,intersci,intersect,intg,intl,intppty,intsplin,inttrap,% inttype,int,invr,invsyslin,inv_coeff,inv,iqr,isdef,isdir,isequal,% iserror,isglobal,isinf,isnan,isoview,isreal,is_connex,jmat,% justify,kalm,karmarkar,kernel,keyboard,knapsack,kpure,krac2,% kroneck,kron,lasterror,lattn,lattp,lcf,lcmdiag,lcm,ldivf,ldiv,% leastsq,legends,length,leqr,levin,lev,lex_sort,lft,lgfft,library,% lib,lin2mu,lincos,lindquist,lines,line_graph,linfn,linf,link,% linmeq,linpro,linsolve,linspace,lin,listfiles,list,lmisolver,% lmitool,loadmatfile,loadplots,loadwave,load_graph,load,locate,% log10,log1p,log2,logm,logspace,log,lotest,lqe,lqg2stan,lqg_ltr,% lqg,lqr,lsq,lsslist,lstcat,lstsize,ltitr,ludel,lufact,luget,% lusolve,lu,lyap,macglov,macr2lst,macrovar,macro,mad,make_graph,% make_index,manedit,man,mapsound,markp2ss,matfile2sci,matrix,% mat_2_graph,maxi,max_cap_path,max_clique,max_flow,max,mclearerr,% mclose,meanf,mean,median,meof,mese,mesh2d,mfft,mfile2sci,mgeti,% mgetl,mgetstr,mget,milk_drop,mine,mini,minreal,minss,% min_lcost_cflow,min_lcost_flow1,min_lcost_flow2,min_qcost_flow,% min_weight_tree,min,mlist,mode,modulo,moment,mopen,move,% mps2linpro,mputl,mputstr,mput,mrfit,msd,mseek,mtell,mtlb_load,% mtlb_mode,mtlb_save,mtlb_sparse,mu2lin,mulf,mvvacov,m_circle,% names,nand2mean,nanmax,nanmeanf,nanmean,nanmedian,nanmin,% nanstdev,nansum,narsimul,ndims,nearfloat,nehari,neighbors,% netclose,netwindows,netwindow,newest,newfun,nextpow2,nf3d,nfreq,% nlev,nnz,nodes_2_path,nodes_degrees,node_number,noisegen,norm,% null,numdiff,numer,nyquist,obscont1,obscont,observer,obsvss,% obsv_mat,obs_gram,odedc,odedi,odeoptions,ode_discrete,ode_root,% ode,oldload,oldsave,ones,optim,orth,param3d1,param3d,% paramfplot2d,parrot,part,pathconvert,path_2_nodes,pause,pbig,% pdiv,pen2ea,pencan,penlaur,perctl,perfect_match,pertrans,pfss,% phasemag,phc,pinv,pipe_network,playsnd,plot2d1,plot2d2,plot2d3,% plot2d4,plot2d,plot3d1,plot3d2,plot3d3,plot3d,plotframe,% plotprofile,plot_graph,plot,plzr,pmodulo,pol2des,pol2str,pol2tex,% polarplot,polar,polfact,poly,portr3d,portrait,power,ppol,prbs_a,% predecessors,predef,printf,printing,print,prod,profile,projsl,% projspec,proj,psmall,pspect,pvm_addhosts,pvm_barrier,pvm_bcast,% pvm_bufinfo,pvm_config,pvm_delhosts,pvm_error,pvm_exit,% pvm_f772sci,pvm_getinst,pvm_gettid,pvm_get_timer,pvm_gsize,% pvm_halt,pvm_joingroup,pvm_kill,pvm_lvgroup,pvm_mytid,pvm_parent,% pvm_probe,pvm_recv,pvm_reduce,pvm_sci2f77,pvm_send,pvm_set_timer,% pvm_spawn_independent,pvm_spawn,pvm_start,pvm_tasks,% pvm_tidtohost,pvm,pwd,p_margin,qassign,qr,quapro,quart,quaskro,% quit,randpencil,rand,range,rankqr,rank,rat,rcond,rdivf,read4b,% readb,readc_,readmps,read,real,recur,reglin,regress,remezb,remez,% repfreq,replot,residu,resume,return,riccati,riccsl,ricc,ric_desc,% rlist,roots,rotate,round,routh_t,rowcompr,rowcomp,rowinout,% rowregul,rowshuff,rpem,rref,rtitr,rubberbox,salesman,savewave,% save_graph,save,scaling,scanf,schur,sci2exp,sci2for,sci2map,% sciargs,scicosim,scicos,scifunc_block,sd2sci,secto3d,select,% semidef,sensi,setbpt,seteventhandler,setfield,setmenu,% setscicosvars,set,sfact,sgrid,shortest_path,showprofile,% show_arcs,show_graph,show_nodes,sident,signm,sign,simp_mode,simp,% sincd,sinc,sinc,sinhm,sinh,sinm,sin,size,sm2des,sm2ss,smooth,% solve,sorder,sort,sound,sp2adj,spaninter,spanplus,spantwo,sparse,% spchol,spcompack,specfact,spec,speye,spget,splin,split_edge,% spones,sprand,sprintf,spzeros,sqroot,sqrtm,sqrt,squarewave,% square,srfaur,srkf,ss2des,ss2ss,ss2tf,sscanf,sskf,ssprint,ssrand,% stabil,stacksize,standard_define,standard_draw,standard_input,% standard_origin,standard_output,startup,stdevf,stdev,steadycos,% str2code,strange,strcat,strindex,strings,string,stripblanks,% strong_connex,strong_con_nodes,strsubst,st_deviation,st_ility,% subf,subgraph,subplot,successors,sum,supernode,sva,svd,svplot,% sylm,sylv,sysconv,sysdiag,sysfact,syslin,syssize,systems,system,% systmat,tabul,tangent,tanhm,tanh,tanm,tan,tdinit,testmatrix,% texprint,tf2des,tf2ss,then,thrownan,timer,time_id,titlepage,% tk_getdir,tk_getfile,tlist,toeplitz,tokenpos,tokens,trace,% translatepaths,trans_closure,trans,trfmod,trianfml,tril,trimmean,% trisolve,triu,trzeros,typename,typeof,type,uicontrol,uimenu,% uint16,uint32,uint8,ui_observer,ulink,unglue,union,unique,unix_g,% unix_s,unix_w,unix_x,unix,unobs,unsetmenu,user,varargin,% varargout,variancef,variance,varn,warning,wavread,wavwrite,% wcenter,wfir,what,whereami,whereis,where,while,whos,who_user,who,% wiener,wigner,window,winsid,with_gtk,with_pvm,with_texmacs,% with_tk,writb,write4b,write,xarcs,xarc,xarrows,xaxis,xbasc,% xbasimp,xbasr,xchange,xclear,xclea,xclick,xclip,xdel,xend,xfarcs,% xfarc,xfpolys,xfpoly,xfrect,xgetech,xgetfile,xgetmouse,xget,% xgraduate,xgrid,xinfo,xinit,xlfont,xload,xname,xnumb,xpause,% xpolys,xpoly,xrects,xrect,xrpoly,xs2fig,xs2gif,xs2ppm,xs2ps,% xsave,xsegs,select,xsetech,xsetm,xset,xstringb,xstringl,xstring,% xtape,xtitle,x_choices,x_choose,x_dialog,x_matrix,x_mdialog,% x_message_modeless,x_message,yulewalk,zeropen,zeros,zgrid,zpbutt,% zpch1,zpch2,zpell,mfprintf,mfscanf,mprintf,mscanf,msprintf,% msscanf,mucomp,% ABSBLK_f,AFFICH_f,ANDLOG_f,ANIMXY_f,BIGSOM_f,CLINDUMMY_f,CLKIN_f,% CLKINV_f,CLKOUT_f,CLKOUTV_f,CLKSOM_f,CLKSOMV_f,CLKSPLIT_f,% CLOCK_f,CLR_f,CLSS_f,CONST_f,COSBLK_f,CURV_f,DELAY_f,DELAYV_f,% DEMUX_f,DLR_f,DLRADAPT_f,DLSS_f,EVENTSCOPE_f,EVTDLY_f,EVTGEN_f,% EXPBLK_f,G_make,GAIN_f,GAINBLK_f,GENERAL_f,GENERIC_f,GENSIN_f,% GENSQR_f,HALT_f,IFTHEL_f,IN_f,INTEGRAL_f,INTRP2BLK_f,INTRPLBLK_f,% INVBLK_f,LOGBLK_f,LOOKUP_f,Matplot1,Matplot,MAX_f,MCLOCK_f,% MFCLCK_f,MIN_f,MUX_f,NDcost,NEGTOPOS_f,OUT_f,POSTONEG_f,POWBLK_f,% PROD_f,QUANT_f,RAND_f,READC_f,REGISTER_f,RELAY_f,RFILE_f,% ScilabEval,Sfgrayplot,Sgrayplot,SAMPLEHOLD_f,SAT_f,SAWTOOTH_f,% SCOPE_f,SCOPXY_f,SELECT_f,SINBLK_f,SOM_f,SPLIT_f,STOP_f,SUPER_f,% TANBLK_f,TCLSS_f,TEXT_f,TIME_f,TK_EvalFile,TK_EvalStr,TK_GetVar,% TK_SetVar,TRASH_f,WFILE_f,WRITEC_f,ZCROSS_f,% \%asn,\%helps,\%k,\%sn},% alsoletter=\%,% chmod sensitive,% morecomment=[l]//,% morestring=[b]",% morestring=[m]'% }[keywords,comments,strings]% %% %% SQL definition (c) 1998 Christian Haul %% (c) 2002 Neil Conway %% (c) 2002 Robert Frank %% (c) 2003 Dirk Jesko %% \lst@definelanguage{SQL}% {morekeywords={ABSOLUTE,ACTION,ADD,ALLOCATE,ALTER,ARE,AS,ASSERTION,% AT,BETWEEN,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,% CATALOG,CHAR_LENGTH,CHARACTER_LENGTH,CLUSTER,COALESCE,% COLLATE,COLLATION,COLUMN,CONNECT,CONNECTION,CONSTRAINT,% CONSTRAINTS,CONVERT,CORRESPONDING,CREATE,CROSS,CURRENT_DATE,% CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,DAY,DEALLOCATE,% DEC,DEFERRABLE,DEFERED,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,% DISCONNECT,DOMAIN,DROP,ELSE,END,EXEC,EXCEPT,EXCEPTION,EXECUTE,% EXTERNAL,EXTRACT,FALSE,FIRST,FOREIGN,FROM,FULL,GET,GLOBAL,% GRAPHIC,HAVING,HOUR,IDENTITY,IMMEDIATE,INDEX,INITIALLY,INNER,% INPUT,INSENSITIVE,INSERT,INTO,INTERSECT,INTERVAL,% ISOLATION,JOIN,KEY,LAST,LEADING,LEFT,LEVEL,LIMIT,LOCAL,LOWER,% MATCH,MINUTE,MONTH,NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NOT,NULL,% NULLIF,OCTET_LENGTH,ON,ONLY,ORDER,ORDERED,OUTER,OUTPUT,OVERLAPS,% PAD,PARTIAL,POSITION,PREPARE,PRESERVE,PRIMARY,PRIOR,READ,% RELATIVE,RESTRICT,REVOKE,RIGHT,ROWS,SCROLL,SECOND,SELECT,SESSION,% SESSION_USER,SIZE,SPACE,SQLSTATE,SUBSTRING,SYSTEM_USER,% TABLE,TEMPORARY,THEN,TIMEZONE_HOUR,% TIMEZONE_MINUTE,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,% TRUE,UNIQUE,UNKNOWN,UPPER,USAGE,USING,VALUE,VALUES,% VARGRAPHIC,VARYING,WHEN,WHERE,WRITE,YEAR,ZONE,% AND,ASC,avg,CHECK,COMMIT,count,DECODE,DESC,DISTINCT,GROUP,IN,% FF LIKE,NUMBER,ROLLBACK,SUBSTR,sum,VARCHAR2,% FF MIN,MAX,UNION,UPDATE,% RF ALL,ANY,CUBE,CUBE,DEFAULT,DELETE,EXISTS,GRANT,OR,RECURSIVE,% DJ ROLE,ROLLUP,SET,SOME,TRIGGER,VIEW},% DJ morendkeywords={BIT,BLOB,CHAR,CHARACTER,CLOB,DATE,DECIMAL,FLOAT,% DJ INT,INTEGER,NUMERIC,SMALLINT,TIME,TIMESTAMP,VARCHAR},% moved here sensitive=false,% DJ morecomment=[l]--,% morecomment=[s]{/*}{*/},% morestring=[d]',% morestring=[d]"% }[keywords,comments,strings]% %% %% VHDL definition (c) 1997 Kai Wollenweber %% \lst@definelanguage{VHDL}% {morekeywords={ALL,ARCHITECTURE,ABS,AND,ASSERT,ARRAY,AFTER,ALIAS,% ACCESS,ATTRIBUTE,BEGIN,BODY,BUS,BLOCK,BUFFER,CONSTANT,CASE,% COMPONENT,CONFIGURATION,DOWNTO,ELSE,ELSIF,END,ENTITY,EXIT,% FUNCTION,FOR,FILE,GENERIC,GENERATE,GUARDED,GROUP,IF,IN,INOUT,IS,% INERTIAL,IMPURE,LIBRARY,LOOP,LABEL,LITERAL,LINKAGE,MAP,MOD,NOT,% NOR,NAND,NULL,NEXT,NEW,OUT,OF,OR,OTHERS,ON,OPEN,PROCESS,PORT,% PACKAGE,PURE,PROCEDURE,POSTPONED,RANGE,REM,ROL,ROR,REPORT,RECORD,% RETURN,REGISTER,REJECT,SIGNAL,SUBTYPE,SLL,SRL,SLA,SRA,SEVERITY,% SELECT,THEN,TYPE,TRANSPORT,TO,USE,UNITS,UNTIL,VARIABLE,WHEN,WAIT,% WHILE,XOR,XNOR,% DISCONNECT,ELIF,WITH},% Arnaud Tisserand sensitive=f,% 1998 Gaurav Aggarwal morecomment=[l]--,% morestring=[d]{"}% }[keywords,comments,strings]% %% %% VHDL-AMS definition (c) Steffen Klupsch %% \lst@definelanguage[AMS]{VHDL}[]{VHDL}% {morekeywords={ACROSS,ARRAY,BREAK,DISCONNECT,NATURE,NOISE,PORT,% PROCEDURAL,QUANTITY,SHARED,SPECTRUM,SUBNATURE,TERMINAL,THROUGH,% TOLERANCE,UNAFFACTED,UNITS}} \lst@definelanguage{XSLT}[]{XML}% {morekeywords={% % main elements xsl:stylesheet,xsl:transform,% % childs of the main element xsl:apply-imports,xsl:attribute-set,xsl:decimal-format,xsl:import,% xsl:include,xsl:key,xsl:namespace-alias,xsl:output,xsl:param,% xsl:preserve-space,xsl:strip-space,xsl:template,xsl:variable,% % 21 directives xsl:apply-imports,xsl:apply-templates,xsl:attribute,% xsl:call-template,xsl:choose,xsl:comment,xsl:copy,xsl:copy-of,% xsl:element,xsl:fallback,xsl:for-each,xsl:if,xsl:message,% xsl:number,xsl:otherwise,xsl:processing-instruction,xsl:text,% xsl:value-of,xsl:variable,xsl:when,xsl:with-param},% alsodigit={-},% }% \lst@definelanguage{Ant}[]{XML}% {morekeywords={% project,target,patternset,include,exclude,excludesfile,includesfile,filterset,% filter,filtersfile,libfileset,custom,classpath,fileset,none,depend,mapper,% filename,not,date,contains,selector,depth,or,and,present,majority,size,dirset,% filelist,pathelement,path,param,filterreader,extension,filterchain,linecontainsregexp,% regexp,classconstants,headfilter,tabstospaces,striplinebreaks,tailfilter,stripjavacomments,% expandproperties,linecontains,replacetokens,token,striplinecomments,comment,prefixlines,% classfileset,rootfileset,root,description,xmlcatalog,entity,dtd,substitution,% extensionSet,propertyfile,entry,vsscheckin,sql,transaction,cvspass,csc,% dirname,wlrun,wlclasspath,p4label,replaceregexp,get,jjtree,sleep,jarlib,% dependset,targetfileset,srcfileset,srcfilelist,targetfilelist,zip,zipgroupfileset,zipfileset,% patch,jspc,webapp,style,test,arg,jvmarg,sysproperty,testlet,env,tstamp,% format,unwar,vsshistory,icontract,cvschangelog,user,p4submit,ccmcheckin,% p4change,bzip2,vssadd,javadoc,bottom,source,doctitle,header,excludepackage,bootclasspath,% doclet,taglet,packageset,sourcepath,link,footer,package,group,title,tag,% translate,signjar,vajload,vajproject,jarlib,extensionset,WsdlToDotnet,buildnumber,% jpcovmerge,tomcat,ejbjar,weblogictoplink,jboss,borland,weblogic,iplanet,jonas,% support,websphere,wasclasspath,war,manifest,attribute,section,metainf,lib,% classes,webinf,rename,sequential,serverdeploy,generic,property,move,% copydir,cccheckin,wljspc,fixcrlf,sosget,pathconvert,map,record,p4sync,exec,% p4edit,maudit,rulespath,searchpath,antlr,netrexxc,jpcovreport,reference,filters,% coveragepath,execon,targetfile,srcfile,ccmcheckout,ant,xmlvalidate,xslt,% iplanet,ccmcheckintask,gzip,native2ascii,starteam,ear,archives,input,% rmic,extdirs,compilerarg,checksum,mail,bcc,message,cc,to,from,loadfile,vsscheckout,% stylebook,soscheckin,mimemail,stlabel,gunzip,concat,cab,touch,parallel,splash,% antcall,cccheckout,typedef,p4have,xmlproperty,copy,tomcat,antstructure,ccmcreatetask,% rpm,delete,replace,replacefilter,replacetoken,replacevalue,mmetrics,waitfor,isfalse,% equals,available,filepath,os,filesmatch,istrue,isset,socket,http,uptodate,srcfiles,% untar,loadproperties,echoproperties,vajexport,stcheckout,bunzip2,copyfile,vsscreate,% ejbc,unjar,tomcat,wsdltodotnet,mkdir,condition,cvs,commandline,marker,argument,% tempfile,junitreport,report,taskdef,echo,ccupdate,java,renameext,vsslabel,basename,% javadoc2,vsscp,tar,tarfileset,tomcat,vajimport,setproxy,wlstop,p4counter,ilasm,% soscheckout,apply,ccuncheckout,jarlib,location,url,cvstagdiff,jlink,mergefiles,% addfiles,javacc,pvcs,pvcsproject,jarlib,options,depends,chmod,jar,sound,fail,% success,mparse,blgenclient,genkey,dname,javah,class,ccmreconfigure,unzip,javac,% src,p4add,soslabel,jpcoverage,triggers,method,vssget,deltree,ddcreator}, deletekeywords={default},% } \lst@definelanguage{XML}% {keywords={,CDATA,DOCTYPE,ATTLIST,termdef,ELEMENT,EMPTY,ANY,ID,% IDREF,IDREFS,ENTITY,ENTITIES,NMTOKEN,NMTOKENS,NOTATION,% INCLUDE,IGNORE,SYSTEM,PUBLIC,NDATA,PUBLIC,% PCDATA,REQUIRED,IMPLIED,FIXED,%%% preceded by # xml,xml:space,xml:lang,version,standalone,default,preserve},% alsoother=$,% alsoletter=:,% tag=**[s]<>,% morestring=[d]",% ??? doubled morestring=[d]',% ??? doubled MoreSelectCharTable=% \lst@CArgX--\relax\lst@DefDelimB{}{}% {\ifnum\lst@mode=\lst@tagmode\else \expandafter\@gobblethree \fi}% \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}% \lst@CArgX--\relax\lst@DefDelimE{}{}{}% \lst@EndComment\lst@commentmode \lst@CArgX[CDATA[\relax\lst@CDef{}% {\ifnum\lst@mode=\lst@tagmode \expandafter\lst@BeginCDATA \else \expandafter\lst@CArgEmpty \fi}% \@empty \lst@CArgX]]\relax\lst@CDef{}% {\ifnum\lst@mode=\lst@GPmode \expandafter\lst@EndComment \else \expandafter\lst@CArgEmpty \fi}% \@empty }[keywords,comments,strings,html]% \endinput %% %% End of file `lstlang1.sty'. hevea-2.30/entry.mli0000644004317100512160000000162607010411403014413 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) type key = string list * string list exception NoGood exception Fini val read_key : Lexing.lexbuf -> key * string option val read_indexentry : Lexing.lexbuf -> string * string hevea-2.30/xspace.hva0000644004317100512160000000005610563036154014543 0ustar marangetcristal\ProvidesPackage{xspace} \@primitives{xspace} hevea-2.30/package.ml0000644004317100512160000012077412444523706014523 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* en Automatique. Distributed only by permission. *) (* *) (* *) (***********************************************************************) (* $Id: package.ml,v 1.112 2012-06-18 13:14:41 suzanne Exp $ *) open Printf module type S = sig end module Make (Dest : OutManager.S) (Image : ImageManager.S) (Scan : Latexscan.S) : S = struct open Misc open Lexing open Lexstate open Latexmacros open Subst open Scan (*********************************************************) (* Accents are here, to make latexscan.mll a bit smaller *) (* Accent commands use a mapping from ascii to *) (* unicode entities with accents *) (* - When no char with accent exists (html) or can *) (* be outputed (text), command *) (* \text@accent{\cmd}{name}{arg} is scanned *) (* where \cmd is accent command name *) (* name is some internal name (eg \' -> accute) *) (* arg is the argument to \cmd *) (* See iso-sym.hva, for the definition of \text@accent *) (*********************************************************) let put_empty empty = if empty <> OutUnicode.null then Dest.put_unicode empty else raise OutUnicode.CannotTranslate exception DiacriticFailed of string * string let do_def_diacritic _verb _name f empty = (fun lexbuf -> let arg0 = save_arg lexbuf in let arg = get_prim_onarg arg0 in try match String.length arg with | 0 -> put_empty empty | 1 -> let c = arg.[0] in if c = ' ' then put_empty empty else Dest.put_unicode (f arg.[0]) | _ -> raise OutUnicode.CannotTranslate with | OutUnicode.CannotTranslate | Misc.CannotPut -> raise (DiacriticFailed (Subst.do_subst_this arg0,arg))) let def_diacritic name internal f empty = def_code name (fun lexbuf -> try do_def_diacritic true name f empty lexbuf with DiacriticFailed (p,input) -> scan_this main ("\\text@accent{"^internal^"}{"^name^"}{\\@print{"^input^"}}{"^p^"}")) ;; open OutUnicode let () = def_diacritic "\\'" "acute" OutUnicode.acute acute_alone ; def_diacritic "\\`" "grave" OutUnicode.grave grave_alone ; def_diacritic "\\^" "circumflex" OutUnicode.circumflex circum_alone ; def_diacritic "\\\"" "diaeresis" OutUnicode.diaeresis diaeresis_alone ; def_diacritic "\\c" "cedilla" OutUnicode.cedilla cedilla_alone ; def_diacritic "\\~" "tilde" OutUnicode.tilde tilde_alone ; def_diacritic "\\=" "macron" OutUnicode.macron macron_alone ; def_diacritic "\\H" "doubleacute" OutUnicode.doubleacute doubleacute_alone ; (* package fc, see later ? *) (* def_diacritic "\\G" "doublegrave" OutUnicode.doublegrave 0x2F5 ; *) def_diacritic "\\u" "breve" OutUnicode.breve breve_alone ; def_diacritic "\\." "dotabove" OutUnicode.dotabove dotabove_alone ; def_diacritic "\\d" "dotbelow" OutUnicode.dotbelow dotbelow_alone ; def_diacritic "\\b" "linebelow" OutUnicode.linebelow linebelow_alone ; def_diacritic "\\k" "ogonek" OutUnicode.ogonek ogonek_alone ; def_diacritic "\\r" "ringabove" OutUnicode.ring ring_alone ; def_diacritic "\\v" "caron" OutUnicode.caron caron_alone ; def_diacritic "\\textcircled" "circled" OutUnicode.circled circled_alone ; (* activated by amssymb *) def_diacritic "\\@doublestruck" "doublestruck" OutUnicode.doublestruck null ; () ;; (* Specialized version of \IfDisplay (plain.hva) for command names, so as to avoid inserting \fi at end of scanned text *) def_code "\\DisplayChoose" (fun lexbuf -> let cmd1 = get_csname lexbuf in let cmd2 = get_csname lexbuf in if !display then expand_command cmd1 lexbuf else expand_command cmd2 lexbuf) ;; (**************) (* Delimiters *) (**************) def_code "\\process@delim@one" (fun lexbuf -> let n = Get.get_int (save_body lexbuf) in let n = if n < 2 then 2 else n in let mid = get_csname lexbuf in for _i = 1 to n-1 do scan_this main mid ; Dest.skip_line () ; done ; scan_this main mid) ;; def_code "\\process@delim@top" (fun lexbuf -> let n = Get.get_int (save_body lexbuf) in let top = get_csname lexbuf in let mid = get_csname lexbuf in scan_this main top ; if n > 1 then begin Dest.skip_line () ; scan_this main mid ; for _i = 1 to n-2 do Dest.skip_line () ; scan_this main mid ; done end) ;; def_code "\\process@delim@dow" (fun lexbuf -> let n = Get.get_int (save_body lexbuf) in let mid = get_csname lexbuf in let dow = get_csname lexbuf in for _i = 1 to n-1 do scan_this main mid ; Dest.skip_line () ; done ; scan_this main dow) ;; def_code "\\process@delim@three" (fun lexbuf -> let n = Get.get_int (save_body lexbuf) in let top = get_csname lexbuf in let mid = get_csname lexbuf in let dow = get_csname lexbuf in scan_this main top ; scan_this main "\\@top@br" ; for _i = 1 to n-2 do scan_this main mid ; Dest.skip_line () ; done ; scan_this main dow) ;; def_code "\\process@delim@four" (fun lexbuf -> let n = Get.get_int (save_body lexbuf) in let ext = get_csname lexbuf in let top = get_csname lexbuf in let mid = get_csname lexbuf in let dow = get_csname lexbuf in scan_this main top ; Dest.skip_line () ; for _i = 1 to (n-3+1)/2 do scan_this main ext ; Dest.skip_line () ; done ; scan_this main mid ; Dest.skip_line () ; for _i = 1 to (n-3+1)/2 do scan_this main ext ; Dest.skip_line () ; done ; scan_this main dow) ;; let int_sup_sub lexbuf = let n = Get.get_int (save_body lexbuf) in if !display then begin let {limits=_limits ; sup=sup ; sub=sub} = save_sup_sub lexbuf in Dest.int_sup_sub false n (scan_this_arg main) (fun () -> ()) sup sub true end ;; def_code "\\int@sup@sub" int_sup_sub ;; (* Direct ajustement of vsize *) def_code "\\@addvsize" (fun lexbuf -> let n = Get.get_int (save_body lexbuf) in Dest.addvsize n) ;; (*****************) (* Cummunication *) (*****************) def_code "\\typeout" (fun lexbuf -> let what = Scan.get_prim_arg lexbuf in prerr_endline what ) ;; def_code "\\hva@warn" (fun lexbuf -> let what = Subst.subst_arg lexbuf in warning what ) ; def_code "\\hva@warn@prim" (fun lexbuf -> let what = get_prim_arg lexbuf in warning what ) ;; def_code "\\@lexbuf" (fun _ -> prerr_endline ("LEXBUF: "^string_of_int (MyStack.length stack_lexbuf))) ;; def_code "\\@macros" (fun lexbuf -> Latexmacros.pretty_table () ; check_alltt_skip lexbuf) ;; def_code "\\show@macro" (fun lexbuf -> let cmd = get_csname lexbuf in Latexmacros.pretty_command cmd) ;; (* Save the names of all macros defined up to now *) def_code "\\@save@macros" (fun lexbuf -> Latexmacros.set_saved_macros () ; check_alltt_skip lexbuf) ;; let def_print name s = def_code name (fun _ -> Scan.translate_put_unicode_string s) ;; def_print "\\@basein" Parse_opts.base_in ; def_print "\\jobname" Parse_opts.base_out ; def_print "\\jobname@base" (Filename.basename Parse_opts.base_out) ; def_print "\\@heveacomline" (Array.fold_right (fun arg r -> arg^" "^r) Sys.argv "") ; def_print "\\@heveaversion" Version.version ; def_print "\\@hevealibdir" Mylib.libdir ;; def_code "\\@heveaverbose" (fun lexbuf -> let lvl = Get.get_int (save_body lexbuf) in Misc.verbose := lvl ; DoOut.verbose := lvl) ;; def_code "\\typemacro" (fun lexbuf -> let name = Scan.get_csname lexbuf in let pat,body = Latexmacros.find name in Latexmacros.pretty_macro pat body) ;; def_code "\\@find@file" (fun lexbuf -> let real_name = let name = Scan.get_prim_arg lexbuf in try Myfiles.find name with Not_found -> Misc.warning ("Cannot find file: "^name) ; name in Scan.translate_put_unicode_string real_name) ;; (* Translate to URL fragment part to %encoding *) def_code "\\@tr@url" (fun lexbuf -> let x = get_prim_arg lexbuf in (* eprintf "TR URL: '%s'\n" x ; *) scan_this main "{\\@nostyle" ; Url.encode_fragment Dest.put_char Dest.put x ; scan_this main "}") ;; (*******) (* CSS *) (*******) (* External style-sheet *) def_code "\\hva@dump@css" (fun _ -> let name = match Parse_opts.base_out with | "" -> let r = "out.css" in warning ("Outputing style sheet to default file: "^r) ; r | base -> base ^ ".css" in begin try let stys = Dest.to_string (fun () -> scan_this main "\\hevea@css") in let chan = open_out name in output_string chan stys ; close_out chan with | Sys_error msg -> warning ("Trouble while outputing style sheet: "^msg) end ; scan_this main (Printf.sprintf "\\@getprintnostyle{%s}" name)) ;; (* Length for CSS *) def_code "\\css@length" (fun lexbuf -> let arg = get_prim_arg lexbuf in let len = match Get.get_length arg with | Length.Pixel n -> Printf.sprintf "%ipx" n | Length.Char n -> Printf.sprintf "%iem" n | _ -> warning "\\css@length cannot interpret this length" ; "0px" in Dest.put len) ;; (* Add elements to style attributes *) def_code "\\@addstyle" (fun lexbuf -> let add = get_prim_arg lexbuf in let attr = get_prim_arg lexbuf in let attr = Lexattr.add_style add attr in Scan.top_open_group () ; Dest.nostyle () ; Dest.put attr ; Scan.top_close_group ()) ;; (* A few subst definitions, with 2 optional arguments *) def "\\makebox" (latex_pat ["" ; ""] 3) (Subst ["\\hva@warn{makebox}\\mbox{#3}"]) ; def "\\framebox" (latex_pat ["" ; ""] 3) (Subst ["\\hva@warn{framebox}\\fbox{#3}"]) ;; (***********************) (* Special definitions *) (***********************) def_code "\\addto" (fun lexbuf -> let name = get_csname lexbuf in let body = subst_body lexbuf in Latexmacros.addto name body) ;; (*********************) (* 'Token' registers *) (*********************) def_code "\\newtokens" (fun lexbuf -> let toks = Scan.get_csname lexbuf in if Latexmacros.exists toks then Misc.warning ("\\newtokens redefines command ``"^toks^"''") ; Latexmacros.def toks zero_pat (Toks [])) ;; let get_tokens toks = match Latexmacros.find_fail toks with | _,Toks r-> r | _ -> raise Failed ;; def_code "\\resettokens" (fun lexbuf -> let toks = Scan.get_csname lexbuf in try ignore (get_tokens toks) ; Latexmacros.def toks zero_pat (Toks []) with Failed -> Misc.warning ("\\resettokens for "^toks^" failed")) ;; def_code "\\addtokens" (fun lexbuf -> let toks = Scan.get_csname lexbuf in let arg = Subst.subst_arg lexbuf in begin try let l = get_tokens toks in Latexmacros.def toks zero_pat (Toks (arg::l)) with Failed -> Misc.warning ("\\addtokens for "^toks^" failed") end) ;; def_code "\\addrevtokens" (fun lexbuf -> let toks = Scan.get_csname lexbuf in let arg = Subst.subst_arg lexbuf in begin try let l = get_tokens toks in Latexmacros.def toks zero_pat (Toks (l@[arg])) with Failed -> Misc.warning ("\\addtokens for "^toks^" failed") end) ;; def_code "\\appendtokens" (fun lexbuf -> let toks1 = Scan.get_csname lexbuf in let toks2 = Scan.get_csname lexbuf in begin try let l1 = get_tokens toks1 and l2 = get_tokens toks2 in Latexmacros.def toks1 zero_pat (Toks (l2@l1)) with Failed -> Misc.warning ("\\addtokens for "^toks1^" and "^toks2^" failed") end) ;; (* Useful ??? def_code "\\lrtokens" (fun lexbuf -> let toks = Scan.get_csname lexbuf in let out = Out.create_buff () in let kont = let once = ref false in (fun lexbuf -> if not !once then begin once := true ; begin try match Latexmacros.find_fail toks with | _,Toks l -> let arg = Out.to_string out in Latexmacros.def toks zero_pat (Toks (l@[arg])) | _ -> raise Failed with Failed -> Misc.warning ("\\lrtokens for "^toks^" failed") end end ; main lexbuf) in start_other_scan "lrtokens" (copy kont "lrtokens" out) lexbuf) ;; *) (*********************************) (* Stacks of command definitions *) (*********************************) def_code "\\hva@newstack" (fun lexbuf -> let name = get_prim_arg lexbuf in let stack = MyStack.create name in def_code ("\\@push"^name) (fun lexbuf -> let cmd = Scan.get_csname lexbuf in let def = Latexmacros.find cmd in MyStack.push stack def) ; def_code ("\\@pop"^name) (fun lexbuf -> let cmd = Scan.get_csname lexbuf in try let pat,body = MyStack.pop stack in Latexmacros.def cmd pat body with MyStack.Fatal _ -> warning (Printf.sprintf "Pop empty stack '%s'" name))) ;; let call_subst lexbuf = let csname = get_csname lexbuf in let arg = subst_arg_list lexbuf in let exec = csname::" "::arg in if !verbose > 1 then begin eprintf "\\@callsubst: %a\n%!" pretty_body exec end ; scan_this_list main exec let call_prim lexbuf = let csname = get_csname lexbuf in let arg = get_prim_arg lexbuf in let exec = csname^" "^arg in if !verbose > 1 then begin prerr_string "\\@callprim: " ; prerr_endline exec ; end ; scan_this main exec and call_subst_opt lexbuf = let csname = get_csname lexbuf in let default = subst_arg lexbuf in let arg = subst_arg lexbuf in let lb = MyLexing.from_string arg in let opt = try Save.opt lb with Save.NoOpt -> default in let rem = Save.remain lb in let exec = csname ^ "{" ^ opt ^ "}" ^ rem in if !verbose > 1 then begin prerr_string "\\@callsubstopt: " ; prerr_endline exec ; end ; scan_this main exec ;; def_code "\\@funcall" call_subst ; def_code "\\@callsubst" call_subst ; def_code "\\@callsubstopt" call_subst_opt ; def_code "\\@callprim" call_prim ; ;; def_code "\\@calloptsimple" (fun lexbuf -> let csname = get_csname lexbuf in let arg = subst_arg lexbuf in let lb = MyLexing.from_string arg in let opt = try Some (Save.opt lb) with Save.NoOpt -> None in let rem = Save.remain lb in let exec = match opt with | None -> csname ^ "{" ^ rem ^ "}" | Some opt -> csname ^ "[" ^ opt ^ "]{" ^ rem ^ "}" in if !verbose > 1 then begin prerr_string "\\@calloptsimple: " ; prerr_endline exec ; end ; scan_this main exec ) ;; (* Haux files parsing hooks before and after reading the file *) def_code "\\@hauxinit" (fun lexbuf -> Auxx.init Parse_opts.base_out ; check_alltt_skip lexbuf) ;; def_code "\\@hauxfinal" (fun lexbuf -> Auxx.final Parse_opts.base_out ; check_alltt_skip lexbuf) ;; let get_raw lexbuf = let saved = !raw_chars in raw_chars := true ; let r = get_prim_arg lexbuf in raw_chars := saved ; r ;; def_code "\\@newlabel" (fun lexbuf -> let name = get_raw lexbuf in let arg = get_raw lexbuf in Auxx.rset name arg) ;; def_code "\\@auxwrite" (fun lexbuf -> let lab = get_raw lexbuf in let theref = get_prim_arg lexbuf in Auxx.rwrite lab theref) ;; def_code "\\@@auxwrite" (fun lexbuf -> let anchor = get_raw lexbuf in let lab = get_raw lexbuf in let theref = get_prim_arg lexbuf in Auxx.rwrite2 anchor lab theref) ;; def_code "\\@auxread" (fun lexbuf -> let lab = get_raw lexbuf in scan_this main (Auxx.rget lab)) ;; def_code "\\@bibread" (fun lexbuf -> let key = get_raw lexbuf in let arg = match Auxx.bget false key with | None -> "\\@verbarg{"^key^"}" | Some s -> s in scan_this main arg) ;; def_code "\\@bibwrite" (fun lexbuf -> let pretty = match Subst.subst_arg lexbuf with | "\\theheveabib" as s -> get_prim s | s -> s in let key = get_raw lexbuf in Auxx.bwrite key pretty) ;; def_code "\\bibcite" (fun lexbuf -> let name = get_raw lexbuf in let arg = Subst.subst_arg lexbuf in Auxx.bset name arg) ;; (* Index primitives *) register_init "index" (fun () -> let put_lbl lbl = scan_this main "{\\@nostyle" ; Dest.put lbl ; scan_this main "}" in def_code "\\@indexwrite" (fun lexbuf -> let tag = get_prim_opt "default" lexbuf in let arg = Subst.subst_arg lexbuf in let theref = get_prim_arg lexbuf in let lbl = Index.treat tag arg theref in put_lbl lbl ) ; (* Special indexwrite that does not put an anchor. Instead, the anchor is given as an extra argument *) def_code "\\@@indexwrite" (fun lexbuf -> let tag = get_prim_opt "default" lexbuf in let arg = Subst.subst_arg lexbuf in let theref = get_prim_arg lexbuf in let theanchor = get_prim_arg lexbuf in Index.treat_anchor tag arg theref theanchor) ; (* Special indexwrite where the key is given as fst argument and fully processed *) def_code "\\@@@indexwrite" (fun lexbuf -> let tag = get_prim_opt "default" lexbuf in let key = get_prim_arg lexbuf in let nice = Subst.subst_arg lexbuf in let theref = get_prim_arg lexbuf in let arg = key ^ "@" ^ nice in let lbl = Index.treat tag arg theref in put_lbl lbl) ; def_code "\\@printindex" (fun lexbuf -> let tag = get_prim_opt "default" lexbuf in Index.print (scan_this main) tag) ; def_code "\\@indexname" (fun lexbuf -> let tag = get_prim_opt "default" lexbuf in let name = get_prim_arg lexbuf in Index.changename tag name) ; let new_index lexbuf = let _ = get_prim_opt "" lexbuf in let tag = get_prim_arg lexbuf in let sufin = get_prim_arg lexbuf in let sufout = get_prim_arg lexbuf in let name = get_prim_arg lexbuf in Index.newindex tag sufin sufout name in def_code "\\newindex" new_index ; def_code "\\renewindex" new_index) ;; (* ifthen package *) register_init "ifthen" (fun () -> def_code "\\ifthenelse" (fun lexbuf -> let cond = save_arg lexbuf in let arg_true = save_arg lexbuf in let arg_false = save_arg lexbuf in scan_this_arg main (if Get.get_bool cond then arg_true else arg_false)) ; def_code "\\whiledo" (fun lexbuf -> let test = save_arg lexbuf in let body = save_arg lexbuf in let btest = ref (Get.get_bool test) in while !btest do scan_this_arg main body ; btest := Get.get_bool test done) ; def_fun "\\newboolean" (fun s -> "\\newif\\if"^s) ; def_code "\\setboolean" (fun lexbuf -> let name = get_prim_arg lexbuf in let arg = save_arg lexbuf in let b = Get.get_bool arg in scan_this main ("\\"^name^(if b then "true" else "false"))) ; ()) ;; (* color package *) register_init "color" (fun () -> def_code "\\definecolor" (fun lexbuf -> Save.start_echo () ; let clr = get_prim_arg lexbuf in let mdl = get_prim_arg lexbuf in let value = get_prim_arg lexbuf in Image.put "\\definecolor" ; Image.put (Save.get_echo ()) ; fun_register (fun () -> Color.remove clr) ; Color.define clr mdl value ) ; def_code "\\DefineNamedColor" (fun lexbuf -> let _ = get_prim_arg lexbuf in let clr = get_prim_arg lexbuf in let mdl = get_prim_arg lexbuf in let value = get_prim_arg lexbuf in fun_register (fun () -> Color.remove clr) ; Color.define clr mdl value ; Color.define_named clr mdl value) ; let do_getcolor c lexbuf = let mdl = get_prim_opt "!*!" lexbuf in let clr = get_prim_arg lexbuf in let htmlval = match mdl with | "!*!"|"" -> Color.retrieve clr | _ -> Color.compute mdl clr in Dest.put c ; begin match htmlval with | Color.Hex x -> Dest.put_char '#' ; Dest.put x | Color.Name n -> Dest.put n end ; Dest.put c in def_code "\\@getcolor" (do_getcolor "") ; def_code "\\@getstylecolor" (do_getcolor "") ; ()) ;; register_init "colortbl" (fun () -> let color_to_string = function | Color.Hex x -> "#"^x | Color.Name n -> n in def_code "\\columncolor" (fun lexbuf -> let mdl = get_prim_opt "!*!" lexbuf in let clr = get_prim_arg lexbuf in let htmlval = match mdl with | "!*!" -> Color.retrieve clr | _ -> Color.compute mdl clr in skip_opt lexbuf ; skip_opt lexbuf ; Dest.insert_block "div" ("style=\"background-color:" ^ color_to_string htmlval ^ "\""); ); def_code "\\rowcolor" (fun lexbuf -> let mdl = get_prim_opt "!*!" lexbuf in let clr = get_prim_arg lexbuf in let htmlval = match mdl with | "!*!" -> Color.retrieve clr | _ -> Color.compute mdl clr in skip_opt lexbuf ; skip_opt lexbuf ; Dest.insert_attr "TR" ("style=\"background-color:"^color_to_string htmlval^"\""))) ;; (* xspace package *) register_init "xspace" (fun () -> def_code "\\xspace" (fun lexbuf -> try match Lexstate.full_peek_char lexbuf with | '{'|'}'|'~'|'.'|'!'|','|':'|'?'|'/'|'\''|')'|'-' | ' '|'\t'|'\n' -> () | _c -> Dest.put_char ' ' with Not_found -> warning "\\xspace could not reach next char")) ;; (* sword package *) register_init "sword" (fun () -> def_code "\\FRAME" (fun lexbuf -> let _ = lexeme lexbuf in (* discard the first 7 arguments *) let _ = save_arg lexbuf in let _ = save_arg lexbuf in let _ = save_arg lexbuf in let _ = save_arg lexbuf in let _ = save_arg lexbuf in let _ = save_arg lexbuf in let _ = save_arg lexbuf in (* keep argument 8 *) let t = Subst.subst_arg lexbuf in (* try to find rightmost material in single quotes *) let i = try String.rindex t '\'' with Not_found-> (-1) in if i>=0 then begin (* we found something, so extract the filename *) let j = String.rindex_from t (i - 1) '\'' in let s = String.sub t (j + 1) (i - j - 1) in let t = Filename.basename (s) in let s = Filename.chop_extension (t) in (* now form the macro swFRAME whose arg is just the base file name *) let cmd = "\\swFRAME{"^s^"}" in (* put it back into the input stream *) scan_this main cmd end ; if i<0 then begin (* no filename found: we use a default name and give a warning *) warning ("\\FRAME: no filename (missing snapshot?) - using\nfallback name"); let s = "FRAME-graphic-not-found" in let cmd = "\\swFRAME{"^s^"}" in scan_this main cmd end) ; def_code "\\UNICODE" (fun lexbuf -> (* input: \UNICODE{arg} where arg is a hex number, eg 0x23ab *) (* output: call to \swUNICODE{arg1}{arg2} where: *) (* arg1 = hex number w/o leading 0, eg x23ab *) (* arg2 = decimal equivalent, eg 9131 *) (* it is up to \swUNICODE (in sword.hva) to do final formatting *) let _ = lexeme lexbuf in let t = Subst.subst_arg lexbuf in let s = string_of_int (int_of_string (t)) in let tt = String.sub t (String.index t 'x') (-1+String.length t) in let cmd = "\\swUNICODE{" ^tt^"}{"^s^"}" in scan_this main cmd) ) ;; (* Some strange arg scanning, needed for \DeclareGraphicsRule *) register_init "graphics" (fun () -> def_code "\\@verbimagearg" (fun lexbuf -> let {arg=arg} = save_arg lexbuf in Image.put_char '{' ; Image.put arg ; Image.put_char '}')) ;; (* url package *) let verb_arg lexbuf = let {arg=url} = save_verbatim lexbuf in Scan.translate_put_unicode_string url ;; def_code "\\@verbarg" verb_arg ; ;; register_init "url" (fun () -> def_code "\\@Url" verb_arg ; def_code "\\Url" (fun lexbuf -> Save.start_echo () ; let _ = save_verbatim lexbuf in let arg = Save.get_echo () in scan_this main ("\\UrlFont\\UrlLeft\\@Url"^arg^"\\UrlRight\\endgroup")) ; let do_urldef lexbuf = Save.start_echo () ; let name = Scan.get_csname lexbuf in let url_macro = Scan.get_csname lexbuf in let true_args = Save.get_echo () in Save.start_echo () ; let _ = save_verbatim lexbuf in let arg = Save.get_echo () in let what = get_this_main (url_macro^arg) in if Scan.echo_toimage () then begin Image.put "\\urldef" ; Image.put true_args ; Image.put arg end ; Latexmacros.def name zero_pat (CamlCode (fun _ -> Dest.put what)) in def_code "\\urldef" do_urldef ; ()) ;; (* hyperref (not implemented in fact) *) register_init "hyperref" (fun () -> let get_url lexbuf = if Lexstate.top_level () then begin Save.start_echo () ; ignore (save_arg lexbuf) ; Save.get_echo () end else subst_arg lexbuf in def_code "\\href" (fun lexbuf -> let url = get_url lexbuf in let {arg=arg ; subst=subst} = save_arg lexbuf in scan_this_arg main (mkarg ("\\ahref{\\@hr@expand{"^url^"}}{"^arg^"}") subst)) ; def_code "\\hyperimage" (fun lexbuf -> let url = get_url lexbuf in let _ = save_arg lexbuf in scan_this main ("\\imgsrc{\\@hr@expand{"^url^"}}")) ; def_code "\\@hyperref" (fun lexbuf -> let url = get_url lexbuf in let category = get_prim_arg lexbuf in let name = get_prim_arg lexbuf in let {arg=text ; subst=subst} = save_arg lexbuf in scan_this_arg main (mkarg ("\\ahref{\\@hr@expand{"^url^ "\\#"^category^"."^name^"}}{"^text^"}") subst))) ;; (* (extended) keyval package *) let keyval_name f k = "\\KV@"^f^"@"^k let keyval_extra f k = keyval_name f k^"@extra" let do_definekey lexbuf = let argdef = save_opts ["1" ; ""] lexbuf in let family = get_prim_arg lexbuf in let key = get_prim_arg lexbuf in let opt = save_opts [""] lexbuf in let body = subst_body lexbuf in begin match argdef with | {arg=No _}:: _ -> begin match opt with | [{arg=No _}] -> Latexmacros.def (keyval_name family key) one_pat (Subst body) | [{arg=Yes opt ; subst=subst}] -> Latexmacros.def (keyval_name family key) one_pat (Subst body) ; Latexmacros.def (keyval_name family key^"@default") zero_pat (Subst [(keyval_name family key^"{"^do_subst_this_list (mkarg opt subst))^"}"]) | _ -> assert false end | [{arg=Yes nargs ; subst=subst} ; opt] -> let nargs = Get.get_int (mkarg nargs subst) in let extra = keyval_extra key family in Latexmacros.def (keyval_name family key) one_pat (Subst ["\\@funcall{"^extra^"}{#1}"]) ; begin match opt with | {arg=No _} -> Latexmacros.def extra (latex_pat [] nargs) (Subst body) | {arg=Yes opt ; subst=o_subst} -> Latexmacros.def extra (latex_pat [do_subst_this_list (mkarg opt o_subst)] nargs) (Subst body) end | _ -> assert false end ;; let do_setkey lexbuf = let family = get_prim_arg lexbuf in let arg = subst_arg lexbuf^",," in if !verbose > 1 then Printf.eprintf "SETKEY, family='%s', arg='%s'\n" family arg ; let abuff = MyLexing.from_string arg in let rec do_rec () = let {arg=x} = save_arg_with_delim "," abuff in if x <> "" then begin let xbuff = MyLexing.from_string (x^"==") in check_alltt_skip xbuff ; let {arg=key} = save_arg_with_delim "=" xbuff in let {arg=value} = save_arg_with_delim "=" xbuff in if !verbose > 1 then Printf.eprintf "Found KEY, key='%s', value='%s'\n" key value ; if key <> "" then begin let csname = keyval_name family key in if Latexmacros.exists csname then begin if value <> "" then scan_this main (csname^"{"^value^"}") else let defname = csname^"@default" in if Latexmacros.exists defname then scan_this main defname else warning ("keyval, no default value for key: '"^key^"'") end else warning ("keyval, unknown key: '"^key^"'") end ; do_rec () end in do_rec () ;; register_init "keyval" (fun () -> def_code "\\define@key" do_definekey ; def_code "\\@setkeys" do_setkey ) ;; register_init "xypic" (fun () -> def_code "\\@xyarg" (fun lexbuf -> Save.start_echo () ; let _ = Lexstate.save_xy_arg lexbuf in let r = Save.get_echo () in Image.put r ) ) ;; register_init "natbib" (fun () -> def_code "\\NAT@write" (fun lexbuf -> let key = get_raw lexbuf in let num = get_prim_arg lexbuf in let auth = subst_arg lexbuf in let year = subst_arg lexbuf in let long = subst_arg lexbuf in Auxx.bwrite key (Printf.sprintf "{%s}{%s}{{%s}}{{%s}}" num year auth long)) ; def_code "\\NAT@bibread" (fun lexbuf -> let key = get_raw lexbuf in let arg = match Auxx.bget false key with | None -> "{}{??}{}{}" | Some s -> s in scan_this main ("\\NAT@args" ^ arg)) ; ()) ;; let gput lexbuf c = Save.gobble_one_char lexbuf ; Dest.put_char c and gput_unicode lexbuf u = Save.gobble_one_char lexbuf ; Dest.put_unicode u ;; let gscan lexbuf cmd = Save.gobble_one_char lexbuf ; Scan.expand_command_no_skip cmd lexbuf ;; register_init "german" (fun () -> def_code "\\@german@dquote" (fun lexbuf -> if effective !alltt || is_plain '"' then (* '"' *) Dest.put_char '"' (* '"' *) else try let c = Save.peek_next_char lexbuf in match c with | 'a' | 'A' | 'e' | 'E' | 'i' | 'I' | 'o' | 'O' | 'u'| 'U' -> begin try gput_unicode lexbuf (OutUnicode.diaeresis c) with OutUnicode.CannotTranslate -> assert false end | 's'|'z' -> gput_unicode lexbuf eszett | 'c'|'f'|'l'|'m'|'p'|'r'|'t' as c -> gput lexbuf c (* for "ck and "ff etc. *) | 'S' -> Save.gobble_one_char lexbuf ; Dest.put "SS" | 'Z' -> Save.gobble_one_char lexbuf ; Dest.put "SZ" | '|' | '-'| '"' -> Save.gobble_one_char lexbuf | '~'|'=' -> gput lexbuf '-' | '`' -> gscan lexbuf "\\glqq" | '\'' -> gscan lexbuf "\\grqq" | '<' -> gscan lexbuf "\\flqq" | '>' -> gscan lexbuf "\\frqq" | _ -> Dest.put_char '"' with | Not_found -> Dest.put_char '"')) ;; (***************) (* Translators *) (***************) def_code "\\@set@translators" (fun lexbuf -> let name = get_prim_arg lexbuf in OutUnicode.set_translators name) ;; def_code "\\@set@out@translator" (fun lexbuf -> let name = get_prim_arg lexbuf in OutUnicode.set_output_translator name) ;; def_code "\\@set@in@translator" (fun lexbuf -> let name = get_prim_arg lexbuf in OutUnicode.set_input_translator name) ;; (********************************) (* Counters, change reset lists *) (********************************) def_code "\\@addtoreset" (fun lexbuf -> let name = get_prim_arg lexbuf in let within = get_prim_arg lexbuf in Counter.addtoreset name within) ;; register_init "chngcntr" (fun () -> def_code "\\@removefromreset" (fun lexbuf -> let name = get_prim_arg lexbuf in let within = get_prim_arg lexbuf in Counter.removefromreset name within) ; ()) ;; (**********) (* Import *) (**********) register_init "import" (fun () -> def_code "\\@imp@set" (fun lexbuf -> let imp = get_prim_arg lexbuf in Myfiles.set_import imp) ; ()) ;; (************) (* Cleveref *) (************) let cr_fmt_one kind label = let com = sprintf "\\@cr@fmt@one{%s}{%s}" kind label in scan_this main com and cr_fmt_two kind l1 l2 = let com = sprintf "\\@cr@fmt@two{%s}{%s}{%s}" kind l1 l2 in scan_this main com and cr_fmt_many kind lbl1 lbl2 rem = let fmt_lbl lbl = sprintf "\\@cr@apply@fmt{%s}" lbl in let buff = Buffer.create 16 in Buffer.add_string buff "{" ; let name = sprintf "\\@cr@secname@plural{%s}{%s}" kind lbl1 in Buffer.add_string buff name ; Buffer.add_string buff " " ; Buffer.add_string buff (fmt_lbl lbl1) ; Buffer.add_string buff "\\crefmiddleconjunction" ; Buffer.add_string buff (fmt_lbl lbl2) ; let rec do_rec = function | [] -> () | [lbl] -> Buffer.add_string buff "\\creflastconjunction" ; Buffer.add_string buff (fmt_lbl lbl) | lbl::rem -> Buffer.add_string buff "\\crefmiddleconjunction" ; Buffer.add_string buff (fmt_lbl lbl) ; do_rec rem in do_rec rem ; Buffer.add_string buff "}" ; scan_this main (Buffer.contents buff) ;; let cr_split arg = let len = String.length arg in let extract k1 k2 = let len = k2-k1 in if len <= 0 then None else Some (String.sub arg k1 len) in let rec do_rec start k = if k < len then match arg.[k] with | ',' -> begin let fst,rem = do_rec (k+1) (k+1) in match extract start k with | None -> [],fst::rem | Some x -> (x::fst),rem end | _ -> do_rec start (k+1) else match extract start k with | None -> [],[] | Some x -> [x],[] in let fst,rem = do_rec 0 0 in let r = match fst with | [] -> rem | _ -> fst::rem in List.concat r ;; let cr_fmt kind lbls = match lbls with | [] -> () | [lbl] -> cr_fmt_one kind lbl | [lbl1;lbl2] -> cr_fmt_two kind lbl1 lbl2 | lbl1::lbl2::rem -> cr_fmt_many kind lbl1 lbl2 rem ;; let cr_add_info mk_info lbls = List.map (fun lbl -> let tymacro = sprintf "\\%s" (mk_info lbl) in let tycsname = sprintf "\\csname %s\\endcsname" (mk_info lbl) in let ty = if Latexmacros.exists tymacro then let ty = get_prim tycsname in (* eprintf "Info: %s -> %s\n" lbl ty ; *) Some ty else None in lbl,ty) lbls let cr_add_types = cr_add_info (sprintf "@cf@%s@type") let cr_add_orders = cr_add_info (sprintf "%s@label@order") let rec cr_group_types k = function | [] -> k | (lbl,t1)::rem -> let t1s = List.fold_right (fun (y,t2) k -> if t1 = t2 then (y::k) else k) rem [lbl] in let rem = List.fold_right (fun (_,t2 as c) k -> if t1 = t2 then k else (c::k)) rem [] in t1s::cr_group_types k rem let protect_int_of_string o = match o with | Some o -> begin try int_of_string o with _ -> -1 end | None -> -1 let cr_sort_labels lbls = let xs = cr_add_types lbls in let lbls = cr_group_types [] xs in let ys = List.map cr_add_orders lbls in let ys = List.map (List.map (fun (lbl,o) -> lbl,protect_int_of_string o)) ys in let ys = List.map (List.sort (fun (_,o1) (_,o2) -> Pervasives.compare o1 o2)) ys in let lbls = List.map (List.map fst) ys in lbls ;; let cr_fmt_groups kind = function | [] -> () | [lbls] -> cr_fmt kind lbls | [lbls1;lbls2] -> cr_fmt kind lbls1 ; scan_this main "\\crefpairgroupconjunction" ; cr_fmt "cref" lbls2 | lbls1::(_::_ as rem) -> cr_fmt kind lbls1 ; let rec do_rec = function | [] -> () | [lbls] -> scan_this main "\\creflastgroupconjunction" ; cr_fmt "cref" lbls | lbls::rem -> scan_this main "\\crefmiddlegroupconjunction" ; cr_fmt "cref" lbls ; do_rec rem in do_rec rem ;; register_init "cleveref" (fun () -> (* Sort labels *) def_code "\\@cr@sort@labels" (fun lexbuf -> let kind = get_prim_arg lexbuf in let label = get_prim_arg lexbuf in let lbls = cr_split label in let lbls = cr_sort_labels lbls in cr_fmt_groups kind lbls) ; (* This special \def macro does not expand body *) def_code "\\@cr@def" (fun lexbuf -> let name = get_csname lexbuf in let nargs = save_arg lexbuf in let nargs = Get.get_int_string nargs in let {arg=body} = save_body lexbuf in Latexmacros.def name (latex_pat [] nargs) (Subst body)) ; def_code "\\@cr@def@withother" (fun lexbuf -> let oname = get_csname lexbuf in let ocom = get_csname lexbuf in let name = get_csname lexbuf in let nargs = save_arg lexbuf in let nargs = Get.get_int_string nargs in let {arg=body} = save_body lexbuf in (* eprintf "oname=%s, ocom=%s\n" oname ocom ; *) Latexmacros.def name (latex_pat [] nargs) (Subst body) ; if not (Latexmacros.exists oname) then begin Latexmacros.def oname (latex_pat [] nargs) (Subst (ocom::" "::body)) ; end) ; ()) ;; (*************************************) (* Extra font changes, from abisheck *) (*************************************) let get_elements str = let len = String.length str in let rec all_elements l = match l with 0 -> [] | n -> (all_elements (n-1))@[(String.sub str (n-1) 1)] in all_elements len ;; let str_cat x y = x^y ;; def_code "\\@mathbb" (fun lexbuf -> let arg1 = save_arg lexbuf in let str = arg1.arg in (*let dummy = print_string str in*) let str_list = get_elements str in (*let h = List.hd str_list in let dummy = print_string h in*) let format x = Scan.get_this_main ("\\"^"one@mathbb{"^x^"}") in let formatted_list = List.map format str_list in let formatted_text = List.fold_left str_cat "" formatted_list in (*print_string ("<<"^formatted_text^">>\n") ;*) Dest.put formatted_text ) ;; def_code "\\@mathfrak" (fun lexbuf -> let str = subst_arg lexbuf in let str_list = get_elements str in let format x = Scan.get_this_main ("\\"^"one@mathfrak{"^x^"}") in let formatted_list = List.map format str_list in let formatted_text = List.fold_left str_cat "" formatted_list in Dest.put formatted_text ) ;; def_code "\\@mathsf" (fun lexbuf -> let str = subst_arg lexbuf in let str_list = get_elements str in let format x = Scan.get_this_main ("\\"^"one@mathsf{"^x^"}") in let formatted_list = List.map format str_list in let formatted_text = List.fold_left str_cat "" formatted_list in Dest.put formatted_text ) ;; def_code "\\@mathbf" (fun lexbuf -> let str = subst_arg lexbuf in (*let str_list = get_elements str in let format x = Scan.get_this_main ("\\"^"one@mathbf{"^x^"}") in let formatted_list = List.map format str_list in let formatted_text = List.fold_left str_cat "" formatted_list in*) Dest.put (""^str^"") ) ;; def_code "\\@mathrm" (fun lexbuf -> let arg1 = save_arg lexbuf in let str = arg1.arg in (*let str_list = get_elements str in let format x = Scan.get_this_main ("\\"^"one@mathbf{"^x^"}") in let formatted_list = List.map format str_list in let formatted_text = List.fold_left str_cat "" formatted_list in*) Dest.put (str) ) ;; def_code "\\@mathcal" (fun lexbuf -> let arg1 = save_arg lexbuf in let str = arg1.arg in let str_list = get_elements str in let format x = Scan.get_this_main ("\\"^"one@mathcal{"^x^"}") in let formatted_list = List.map format str_list in let formatted_text = List.fold_left str_cat "" formatted_list in Dest.put formatted_text ) ;; def_code "\\@mathtt" (fun lexbuf -> let arg1 = save_arg lexbuf in let str = arg1.arg in let str_list = get_elements str in let format x = Scan.get_this_main ("\\"^"one@mathtt{"^x^"}") in let formatted_list = List.map format str_list in let formatted_text = List.fold_left str_cat "" formatted_list in Dest.put formatted_text ) ;; end hevea-2.30/mathop.hva0000644004317100512160000000000010401356637014537 0ustar marangetcristalhevea-2.30/mylib.ml0000644004317100512160000000152212017660721014224 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) let static_libdir = "LIBDIR" ;; let libdir = try Sys.getenv "HEVEADIR" with Not_found -> static_libdir ;; hevea-2.30/saver.mll0000644004317100512160000000751612312060105014401 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) { open Lexing open SaveUtils module type Config = sig type t val of_string : string -> t val of_out : Out.t -> t end module type S = sig type out val opt : Lexing.lexbuf -> out val arg : Lexing.lexbuf -> out val arg2 : Lexing.lexbuf -> out end module Make(C:Config) = struct type out = C.t } let command_name = '\\' (( ['@''A'-'Z' 'a'-'z']+ '*'?) | [^ 'A'-'Z' 'a'-'z'] | "\\*") let space = [' ''\t''\r'] rule opt = parse | space* '\n'? space* '[' {put_echo (lexeme lexbuf) ; opt2 lexbuf} | '%' { skip_comment lexbuf ; opt lexbuf } | eof {raise Eof} | "" {raise NoOpt} and opt2 = parse | '{' {incr brace_nesting; put_both_char '{' ; opt2 lexbuf} | '}' { decr brace_nesting; if !brace_nesting >= 0 then begin put_both_char '}' ; opt2 lexbuf end else begin error "Bad brace nesting in optional argument" end} | ']' {if !brace_nesting > 0 then begin put_both_char ']' ; opt2 lexbuf end else begin put_echo_char ']' ; C.of_out arg_buff end} | '%' { skip_comment lexbuf ; opt2 lexbuf } | command_name as lxm {put_both lxm ; opt2 lexbuf } | _ as lxm {put_both_char lxm ; opt2 lexbuf } and skip_comment = parse | eof {()} | '\n' space* {()} | _ {skip_comment lexbuf} and arg = parse space+ | '\n'+ {put_echo (lexeme lexbuf) ; arg lexbuf} | '{' {incr brace_nesting; put_echo_char '{' ; arg2 lexbuf} | '%' {skip_comment lexbuf ; arg lexbuf} | "\\box" '\\' (['A'-'Z' 'a'-'z']+ '*'? | [^ 'A'-'Z' 'a'-'z']) {let lxm = lexeme lexbuf in put_echo lxm ; C.of_string lxm} | command_name {blit_both lexbuf ; skip_blanks lexbuf} | '#' ['1'-'9'] {let lxm = lexeme lexbuf in put_echo lxm ; C.of_string lxm} | [^ '}'] {let c = lexeme_char lexbuf 0 in put_both_char c ; C.of_out arg_buff} | eof {raise Eof} | "" {error "Argument expected"} and skip_blanks = parse | space* '\n' as lxm {seen_par := false ; put_echo lxm ; more_skip lexbuf} | space* as lxm {put_echo lxm ; C.of_out arg_buff} and more_skip = parse (space* '\n' space*)+ as lxm {seen_par := true ; put_echo lxm ; more_skip lexbuf} | space* as lxm { put_echo lxm ; C.of_out arg_buff} and arg2 = parse '{' {incr brace_nesting; put_both_char '{' ; arg2 lexbuf} | '}' {decr brace_nesting; if !brace_nesting > 0 then begin put_both_char '}' ; arg2 lexbuf end else begin put_echo_char '}' ; C.of_out arg_buff end} | '%' {skip_comment lexbuf ; arg2 lexbuf} | command_name | [^'\\''{''}''%']+ {blit_both lexbuf ; arg2 lexbuf } | _ {let c = lexeme_char lexbuf 0 in put_both_char c ; arg2 lexbuf} | eof {error "End of file in argument"} { end module String = Make (struct type t = string let of_string x = x let of_out = Out.to_string end) module List = Make (struct type t = string list let of_string x = [x] let of_out = Out.to_list end) } hevea-2.30/cutOut.mli0000644004317100512160000000233112202203731014531 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet MOSCOVA, INRIA Rocquencourt *) (* *) (* Copyright 2006 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) module type Config = sig val small_length : int end module Make(C:Config) : sig type t val get_name : t -> string val create_buff : string -> t val create_null : unit -> t val create_chan : string -> t val close : t -> unit val put : t -> string -> unit val put_char : t -> char -> unit val is_empty : t -> bool val to_string : t -> string val to_chan : out_channel -> t -> unit val copy : t -> t -> unit val flush : t -> unit val debug : out_channel -> t -> unit end hevea-2.30/verbatim.hva0000644004317100512160000000030507113527407015071 0ustar marangetcristal\@primitives{verbatim} \newcommand{\verbatiminput}[1] {\@scaninput{\begin{verbatim} }{#1}{\end{verbatim}}} \newcommand{\verbatiminput*}[1] {\@scaninput{\begin{verbatim*} }{#1}{\end{verbatim*}}}hevea-2.30/czech.hva0000644004317100512160000000274010334123204014343 0ustar marangetcristal%%%% Hevea support for babel option 'czech'. %%%% Note : Support for %%%% a) date %%%% b) usual shorthands (\' \` \^ etc.) %%%% c) names of various part descriptors (contentsname etc.) \newcommand{\czech@babel}{ \renewcommand{\czech@month} {\ifthenelse{\value{month}=1 }{Leden} {\ifthenelse{\value{month}=2 }{\'Unor} {\ifthenelse{\value{month}=3 }{Brezen} {\ifthenelse{\value{month}=4 }{Duben} {\ifthenelse{\value{month}=5 }{Kveten} {\ifthenelse{\value{month}=6 }{Cerven} {\ifthenelse{\value{month}=7 }{Cervenec} {\ifthenelse{\value{month}=8 }{Srpen} {\ifthenelse{\value{month}=9 }{Z\'ar\'i} {\ifthenelse{\value{month}=10}{R\'ijen} {\ifthenelse{\value{month}=11}{Listopad} {\ifthenelse{\value{month}=12}{Pronisec}{} }}}}}}}}}}}}% \renewcommand\today{\theday.~\czech@month~\theyear}% \renewcommand\prefacename{Predmluva}% \renewcommand\refname{Reference}% \renewcommand\abstractname{Abstrakt}% \renewcommand\bibname{Literatura}% \renewcommand\chaptername{Kapitola}% \renewcommand\appendixname{Dodatek}% \renewcommand\contentsname{Obsah}% \renewcommand\listfigurename{Seznam Obr\'azku}% \renewcommand\listtablename{Seznam Tabulek}% \renewcommand\indexname{Index}% \renewcommand\figurename{Obrazek}% \renewcommand\tablename{Tabluka}% \renewcommand\partname{C\'ast}% \renewcommand\enclname{Pr\'iloha}% \renewcommand\ccname{cc}% \renewcommand\headtoname{Komu}% \renewcommand\pagename{Strana}% \renewcommand\headpagename{Strana}% \renewcommand\seename{viz}% \renewcommand\alsoseename{viz t\'ez}% } hevea-2.30/count.ml0000644004317100512160000000214312017660721014240 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* Map extension for counting occurrences *) module type S = sig type key type count val empty : count val incr : key -> count -> count val fold : (key -> int -> 'b -> 'b) -> count -> 'b -> 'b end module Make(K:Map.OrderedType) = struct include Map.Make(K) type count = int t let incr k m = let v = try find k m with Not_found -> 0 in add k (v+1) m end hevea-2.30/zyva.ml0000644004317100512160000000214110565402214014074 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: zyva.ml,v 1.4 2007-02-16 19:22:52 maranget Exp $ *) (***********************************************************************) module type S = functor (Dest : OutManager.S) -> functor (Image : ImageManager.S) -> functor (Scan : Latexscan.S) -> sig end module Make (Dest: OutManager.S) (Image : ImageManager.S) (Scan : Latexscan.S) (ToMake : S) = struct module Rien = ToMake (Dest) (Image) (Scan) end hevea-2.30/makeidx.hva0000644004317100512160000000124412454751421014704 0ustar marangetcristal\@primitives{index} \newsavebox{\@indexbox} %%%% index citations that point to index commands \newcommand{\@index@loc}[1] {\if@refs% \sbox{\@indexbox}{\@indexwrite[default]{#1}{\@indexlabel}}%force evaluation \@locname{\usebox{\@indexbox}}{}% \fi} %%%% index citations that point to section titles. \newcommand{\@index@sec}[1] {\if@refs% \@@indexwrite[default]{#1}{\@currentlabel}{\@fmt@sec}%force evaluation \fi} \newif\ifindexsec\indexsecfalse \newcommand{\index}[1]{\ifindexsec\@index@sec{#1}\else\@index@loc{#1}} \newcommand{\printindex}{\@printindex[default]} \newcommand{\makeindex}{\newindex{default}{idx}{ind}{\indexname}} \newcommand{\see}[2]{\seename\ \textit{#1}} hevea-2.30/CHANGES0000644004317100512160000010053013136045361013550 0ustar marangetcristalversion 2.30 * Better error message when several \documentclass are present. version 2.29+5 version 2.29+4 version 2.29+3 version 2.29+2 * mathjax 'automatic' support version 2.29+1 * mathjax support version 2.29 * Correct bug around double quotes. Notice that the "plain" status of double quotes is no expansion, by contrast with all other special characters. version 2.28 * lstlisting: find files lstlang?.sty in path (as latex does). version 2.27 * info: Add initial capitals for some words (workaround against (reported) info reader v 6.0 bug version 2.26 * add a warning in case of missing \end{document} * cleveref.hva patch (removes extra white space), credit: Tim Bourke. version 2.25 * Oups !! Forgot to add svg.hva, corrected. version 2.24 * Add svg.hva style file, to produce svg images. * More robust build. version 2.23 * include examples source in the distribution, as advertisedd on web page. version 2.22 * Attempt umplementation of \specialcomment (comment package). * \indexname now used in packages makeidx and multind as the default index name (Was 'Index') version 2.21 * Preliminary support for the portuguese language (credit Carlos Camarao) version 2.20 * Correct 2.09 correction, the test for the status of char '"' was negated... (PR #004) version 2.19 * Add a command \@htmlargs for re-defining the opening tag attributes. version 2.18 * PREFIX?=/usr/local in Makefile, to allow overriding by environment variable. * Adapt to ocaml 4.02, use 'Bytes' module + backward compatibility hack. * Some patches by Damien: typos + illegal format strings. version 2.17 * Adapt to ocaml 4.02 (suppress a few 'Deprecated' warnings) version 2.16 * Patchy: change fnsymbol from '%' to '$' version 2.15 * Correct definition of \@addstyle as '%' can now occur in attr -> inline definition of \@printnostyle * Correct bug : define \% as \char037 not as \@print{\char045} ! version 2.14 * Rationalize buffer usage and suppress private buff module. version 2.13 * More effort to skip comments in arguments. version 2.12 * esponja: allow ':' in attribute names. version 2.11 * hacha: allow ':' in attribute names. version 2.10 * Bug in \@makesection (latexcommon.hva). \end@sec@step was absent from the definition of stared sectionning comamnd. As a result the first label in section was used as the id of the section. * typo-bug in text/hevea.hva version 2.09 * Corrected a very unfortunate bug in german babel: \@german@dquote has to consider the case when '"' is not active.. version 2.08 * Added \fcolorbox version 2.07 * bug in hacha -tocbis/-tocter when no cut induced by section. * Do not change (\cutname) the name of toplevel file. version 2.06 * Two bugs reported by Michael Ernst fixed * - Some spaces dissapeared in toc's FIX -> add braces around macro expansion in subst_expn - Spurious '_' outside of math mode warnings when \label{..._...} occurs in section titles FIX -> add \@getprint around \sec@id@attr in \@doaddtoc [latexcommon.hva] and \cuthere [html/hevea.hva]. version 2.05 - Promote to official release version 2.04+dev2 - Correct esponja bug for windows : in windows you cannot remove a file when it is still open ! version 2.04+dev1 - patch by C Deleuze for a few fixes in info mode. version 2.04 - added \addto command to augment macros - partial implementation of cleveref - implemented hyperef \autoref - added hidden labeltype package to specify label types in .haux files - implemented global options version 2.03+dev - Change in \label management: if \label{lbl} occurs in the argument of a sectionning command (a.k.a section title), then the tag lbl will be used as the id of the enclosing element in html output. A specific warning is introduced to flag multiple occurences of \label in section titles. version 2.03 - Correct \addcontentsline so as to avoid any style, in .haux and make \@addcontentsline armoured (useless?) version 2.02 - Correct ocaml minimal version number in README version 2.01 - In delimited argument parsing, skip several comments (only one was allowed before). - Added undersection package, for underlined section headers. version 2.00 - HTML 5.0 output. version 1.99 - Last released version that outputs html 4.0 - Simplified html.mli, text.mli and info.mli by including outManager signature - Corrected installer bug (lstlang?.sty not installed !!) - Buffers with underlying rope structure (use our own) version 1.10+17 - Testing svn based release script version 1.10+16 - bug in amsmath.hva (missing \fi, suggestion by Toomas Rosin) version 1.10+15 - corrected file handle leak (in @iffileexists get.mll) - Added optional argunment to \newindex (makeidx package) version 1.10+14 - Silly bug in natbib-common.hva : forgot one argument to \NAT@bibitem in the no-optional argument case. version 1.10+13 - added greek option to babel - changes of imagen 1. Adopt pngalpha device for ghostscript 2. Use convert in place of pbmplus version 1.10+11 - correct (?) handling of DESTDIR - hacha recognises 'style' parameters, so as not to be fooled by missing chapters in article mode. version 1.10+10 - ftp links -> htp links in documentation - tried awful ack to echo %HEVEA in image files, does not work revert. - added option -dAutoRotate=/None in gs invokation by imagen. (suggestion of Sebastien Flicker) - amsmaths.hva: corrected bug in split environemnt. - \refstepcounter in \bititem -> set \theref, allow a hack [\ref{...}] \sim \cite{...} (Some do that). version 1.10+9 - listings: invisible delimiters [and no invisible comments] - \stepcounter -> \refstepcounter, for slide counter in seminar.hva - suppressed -gloss and -bib options that performed nothing. - execute \textnormal starting math mode. version 1.10+8 - different url parsing for hyperref. Looks more compatible. version 1.10+7 version 1.10+6 - added hanging and booktabs package (all definitions are no-ops) version 1.10+5 - \newline definition as \\ is a bad idea in tables -> \@br version 1.10+4 - remove explicit vertical VALIGN=top for @{...} in arrays (html.ml). - esponja was 'optimizing' t1t2 into t1t2. Correction: treat SUP and SUB as A. (htmlparse.ml) version 1.10+3 - very unfortunate typo: d\e'cembre -> d\'ecembre (french-common.hva) version 1.10+2 - added import package (no starred variants yet) - listings: range{begin,env}{prefix,suffix} keys. Result may be non-compliant, moire testing needed. - \Let -> \@Let (plain.hva), [clash with user definition was likely]. version 1.10+1 - Allow \par in footnotetext (latexcommon.hva) version 1.10 - corrected hacha that generated non-compliant HTML lists ! version 1.09+12 - added cutflow* environment. - correct packages.hva Now package state is pushed/restored by RequirePackage [needed for proper saving of package options] version 1.09+11 - natbib being added nightmare. Should release soon. version 1.09+10 - restored extra argument to \text@accent, silly ? - added a bit of documentation on math accents version 1.09+8 - labels for indexes restricted to sectionning labels. (credit to Yevgeniy Makarov) version 1.09+7 - Some changes for active characters -, ', and ` * -- not merged in entity if TT is on. * ' -> simple right quote, ` simple left quote version 1.09+6 - test new technique for release [shell] - skip_blanks in save.mll -> also eat spaces after \n (-> \urldef more compatible ??) - \usepackage{hevea} -> execute \usepackage{comment} for LaTeX compatibility - Change \warning into \hva@warning - New \AtEndOfFile command, rediscovered Latexmacros.replace at the occasion! version 1.09+5 - Include documentation for Thai. - A few typos in doc. - A few correction in french.hva -> \@print@u + \og\fg. - '\r' '\n' is scanned while looking for \par - Add empty group after title in section (for \xspace ! -> no space) - Introduced \RequirePackage version 1.09+4 - thai support - add vertical magins to styles .part and .title - listings, added inputencoding key. - Corrected footnotes flushing (to follow documentation) and made documentation more precise. - listings, *keywords* keys with correct interface (already here for *emph*). version 1.09+3 - UTF-8 support, hard to test. - abstract type for unicode + many less files for input encodings - Added input encodings koi8-r et cp1251 (Russian) version 1.09+2 - Correct some bugs for output to dir (imagen on absolute path). - And above all document that. - Produce doc in subdirectory doc/doc. - Document -toc{is,ter} options for hacha. version 1.09+1 - Simplified error messages for accents, too many problems in displaying argument. - hevea/hacha/imagen accept dir/file as input or output with sensible (?) behavior version 1.09 - Release at last. version 1.08+23 - more things in winfonts + doc + some tuning by IE viewing. - primitives \push@styles,\pop@styles to save,restore styles accross blocks (mathpartir) version 1.08+22 - make byte-test in examples -> specific tests - footnote to extra file, change behavior document. - special footnote flusing for \maketitle - Bug, hacha (close_chapter, cut.mll) must not close chapter page when it equals toc page. - Factor out code for mathdisplay (latexscan.mll) + new internal commands \displaymath \enddisplaymath -> display math without latex env (useful for mathpartir.) - Esponja removes unreferenced style classes. - Backtracking info printed directly in do_expand_command (latescan.mll) version 1.08+21 - Corrected bars for math accents: WIDTH= -> STYLE="width:.. and added some tests in examples/sym.tex - Notice : horiz bars in table -> is the most simple and works for both moz and IE. - Suppress vertical-align in dcells ! Vertical alignment is controlled by TR. (used by \@open{DISPLAY}{VALIGN="top"} in html/mathpartir) - Big trouble with styled displays (IE) finally solved by width:auto; in styles dcell and display. version 1.08+20 - added winfonts.hva, to replace a few entities by ascii art - initial value of 'true' for extendedchars (listings) - adopt most recent mac encoding 0xDB -> euro sign - added three window codepages and applemac in inputenc, useful ? version 1.08+19 - added sym.tex in examples. - suppress -symbols option ! - Back to ALIGN attributes in display cells, corresponding CSS declaration (text-align) does not apply to TABLE alignement, which breaks proper alignement of displays eg in numerator/denominator of \frac. - New behavior for \title, \title after \begin{document} should work with documentation. - Suppress DIV CLASS="center" around displays, include margin-left:auto; margin-right-auto in display class There is one complication : top level displays now have to be kept (cf open_maths in htmlMaths.ml). Beside an enclosing group is needed (for limiting the scope of font changes in $$... $$). version 1.08+18 - Clarify and document footnote flushing. - \vdash and \dashv unicode entities were swapped (iso-symb.hva) version 1.08+17 - Styles defined by \newstyle can go into external file, by \externalcsstrue - Added \marginpar version 1.08+16 - Flush footnotes at end of 'minipage' environments - \@seename -> \seename in index.hva/makeidx.hva version 1.08+15 - eat space before scanning \verb, \lstlisting argument (Save.save_verbatim) - hacha: bug in toplevel toc for -tocter mode those where closed too often. Finally working ? - hacha/footnotes: added \@footnoteflush in \cutend -> footnotes text in the same file as marks most of the time - added stacks for redefining/restoring commands (\hva@newstack) - include imagen options as comment in image file -> force production of images when options change. Then, Misc also has a checkpointed state, so as to avoid double inclusion of options with -fix. version 1.08+14 - added xspace.hva version 1.08+13 - added bibhva executable, so as to call bibtex on .haux files yielding .hbbl files - managed for .haux files to be bibtex processable - \textsubscript does not exist! - \textsubscript forgotten. - Small bug in 'mid' counts in \process@delim@top - styled theorem-like envs - \setkeys => \@seytkeys in mathpartir (avoid echo in image file) - Be more tolerant with lists without \item (warning) + avoid producing such in multicolumn indexes. - added ifpdf package - Style all list environments (+ thefootnotes, the bibliography) - Corrected bug in table of Contents: Section whose level is < to tocdepth should go into toc, regardless of secnumdepth - Suppressed first line, if empty, in verbatim (and verbatim*). - New placement of hacha anchors (inside section headers, through command \@secanchor) - Suppressed some spurious newlines in html output (mostly in HEAD) - ? is no more special (equivalent to @) in indexes " becomes more general (quote everything) - option -dv - chngcntr package. - Use P elements for paragraphs, numerous changes, \n\n lines found while parsing arguments pending, useful ? version 1.08+12 - Big trouble : forgot mapings in distribution ! version 1.08+11 - Important change in managing inputencodings/charsets, so as they can be different. Documentation done. Basically: for all chars in input 1. Translate to unicode 2. From one unicode char a- Output as a char if possible in doc charset b- Otherwise, output numerical reference. - Changed \limits/\nolimits scanning, so as to find last ! - latin encoding support, through the inputenc package and checked numerical entities (\@print@u) Defaut charset is now US-ASCII. - Added eurosym package - Added textcomp package - compatibility deepcut/thebibliography, \sectionning command \@bbliosection must appear in outer scope. - deepcut: also cut footnotes. - chapterbib : sectionbib -> entry in toc. version 1.08+10 - deepcut patched - supertable completed. - longtable package, a nightmare - forget option argument in \caption, fixed - publicize the generic url hevea.inria.fr - a few changes in graphics/graphicx to allow loading both (and \@imagecommand in html/hevea.hva uses \def) - show/noshow option for package figcut. version 1.08+9 - figcut and deepcut packages. - \lstavoidpre command in listings -> allow copy/paste in listings. version 1.08+8 - \settoplinks command for changing hacha links aspect. - Basic chapterbib (works for included files only, no top level bibliography). version 1.08+7 - change caption (in figure, tables) formatting -> new command \hva@caption that can be redefined for customisation. - correct (once again) eol marker in listings (line skip was missing for firstline=n, n > 1) - new option -pdf for imagen. version 1.08+6 - ignore keys fraction and myfraction in mathpartir (warning) - trick to allow nested \underline\overline in displays. version 1.08+5 - Bug in new integerface, canniot use \unset to deactivate a stringizer.., use \lst@inactivate in place. Very inneficient. - new interfaces for commemts and strings, still need to activate various styles in strings, Note the new mecanism for strings,generalize to other delims ? (to implement delete) - new -t option for imagen (doc pending) -> dvips - Got rid of spurious line skip at start of lstlisting env. version 1.08+4 - added delim, moredelim, deletedelim, should now implement new interface for comments and strinsg, and normalize style command names... Semantics of 'delete' key is somehow radical... version 1.08+3 - esponja -> keep color inside A elts - made \today proper (lot of space were introduced). - -w Z warning -> quite a lot of corrections. - Huge bug (all ' -> - in text mode). - breaklines in listings -> warning - Previous fix introduced a bug in balanced/nested comments: replace scan of \endgroup by call to end_comment. - Listing bugs, style command can be arguments to commentstyle and stringstyle version 1.08+2 - <<-o - >> redirects html output to stdout. - added tabsize, showtabs and tab keys in listings, approximate rendering. - added default values for keywords - changed keywords management * keywords are installed while defining languages (and not in hook AfterSetLanguage) * all keywords are erased in PreSetlanguage - added classes in keywords - debugged showlines in listings, at end ? version 1.08+1 - key frame (and a few others, related to frames) in listings - \title, \author and \date now work after \begin{document} - Small bug listings, an additional line was appended at the end of listings when showlines=true version 1.08 - Serious german babel, with active '"' version 1.08 -Release : two major changes * Replace symbol font by entities * Introduction of style sheets. version 1.07+2 - added some entities for textquoteleft etc. + package ragged2e + bug in german.hva - bug in text generation (safe_make_string in Text.put_line) - output named html colors when appropriate. - added \ifwhitepre to identify space-white=pre, this flags alters Html.put_nbsp behavoir. Should also apply to \@br. - worked on manual (style sheets) - Added interpretation of - -- --- `` and '' in main latexscan.mll version 1.07+1 - Add lineranges in listings + cleaning showlines - Start using style-sheets - Integrate mathpartir - Small listings bugs (space forgotten in \lstinline"A A"). - Erase bussproof and proof, concentrate on Didier's mathparir - Change title/maketitle management -> typeset after document is opened in image file (allow \includegrahics in \title!) - Two listings bugs [backslash newline in strings & argument parsing for lstinline]. - Get rid of cpp in Makefile (use sed instead, hope this will work for everybody!) - added all *.hva in libs.defs - added html/style-sheets.hva in libs.def - caption/label keys in the listing package. - change '-o path' behavior for hacha, all generated files go into directory 'dirname path' - \@addimagenopt + looking for imagen in libdir (documentation pending) - supertabular package. - change rawhtml -> output in html mode only + new raw and rawtext envs - Additional entities for big delimiters. version 1.07 - Release, to follow ocaml evolution. version 1.06+1 - Added \lstnewenvironment in package listings - Pb pour les delims de hauteur 1 : -> rescanner le delimiteur ! Pas le tps. - Bug in text manager : incorrect behavior \centering-like declarations. Solution make the align flags systematically stacked - Add a command-line flag to hacha -nolinks -> suppress Previous/Up/Next links - Small hacha bug : replicate \htmlfoot argument in index.html file even when hevea generated footer is absent. - New \@charset command and xxcharset.exe script, to control output document character set. - firstnumber=auto|last|nnn in listings.hva - started adding an example for listings (exlst.tex) - proper (?) implementation of emph classes in listings (some debug print left) - key label in listings + ignore empty fst argument of env listing + patch on initial line numbers - An attempt to follow << listings >> pace of developement all '*label*' keys are now '*numbers*' keys, snif. - Added bgcolor definition in hevea.sty, not very good - Spaces are irrelevant everywhere in array/tabular format - A new warning for \right and \left in non-display mode. - Special parsing (\@verbimagearg) for ``\DeclareGraphicsRule'' last argument. - Allow multiples > and < in package array. - Better error message for undefined defaults in keyval. - Do not check comments before Save.arg_verbatim. - Added a new primitive \@styleattr - Almost complete multibib package. - Small bit of xypic (-> all \xymatrix are images). version 1.06 version 1.06-7 - \ifmagen indroduced, \imagentrue at beginning of .image.tex, \imagenfalse in hevea.sty, if \ifimagen undefined. - Bug -> stopimage in lstinline. - Throw away index when some key field is empty (i.e. mimic makeindex) - Introduced \htmprefix - Bug in ``\@displayint'' (introduced by the new ``\@getprint'') - compatibility with ocaml 3.03 (do not close a file twice) - Table of contents a` la LaTeX. - new ``-hrf'' option for hacha - PNG managment in hevea/imagen - Added a ``-quant'' option to imagen - Changed ``\@getprint'' to interpret characters Cleaned a few bad usages of ``\@getprint'' - Added ``\hyperref'' with optional argument. - Added underscore package - Bug htmlfoot, MUST appear last in hevea output - small stuff in listings (showlines and continued line numbering) version 1.06-6 - Added esponja - Better error diagnostic for bad usage of \begin{document}... \end{document} - Added a \tocnomber command to include section numbers in table of contents - Better amstmath package version 1.06-5 - \index allowed in section titles (@norefs extension) - Big dynamic scoping bug in packages.hva - Two easy misfeature disappear . trailing -exec prog brougth back one step . blanks allowed in array formats - Option -version - Bug in image.ml, finalize -> active := false, to make module restartable - Bug moreverb, protect get_line by save_lexstate/restore_lexstate. - Bug paragraphe (remettre Save.seen_par a` false dans make_stack). - Bug \iftest -> modifs locales (par fun_register) - Bug argument csname de \newcommand dans toimage -> save_arg - Licence du manuel. - Bug par, Dest.par None doit e^tre un nop (cf. appel dans expand_command, avec name = \par). - insertion d'un @verbarg pour les clefs de labels et de citations - Hot oubliait les notes de bas de page. - Simplification Misc.copy_hashtbl, ne marche plus pour les liaisans multiples. - small simplification fancyvrb - \sbox lrbox finally ok ? - New \@getprintnostyle primitive - Leading spaces in \usepackage{pkg1, pgk2} - New optimized mode for styles. - Plein de bugs corrige's (arguments a` , notamment), listings et fancyverb version 1.06-4 version 1.06-3 - Bug hacha, all output now goes into current directory - Paragraphs not ok, quick fix (in \\begin and \\end) - All document was typeset inside a Latexmacros group ! -> change \document \enddocument commands - Corrected a bugs in argument parsing/scanning (save_sup/sub and arg scanning with ``may_cont'' - alltt flags ignored when the alltt package is not loaded - A little more for fancyvrb version 1.06-2 - Started implementing the fancyvrb package version 1.06-1 - A la TeX \mathop - patched bugs in info genearation - alltt implementation revised. Efficency concern - listings package implementation - \def and \let now have TeX semantics *IMPORTANT* - \toplinks, for prev,up, next links on the root file. - Bug for paragraphs inside \@stopoutput.. \@restoreoutput. - Bug CamlCode in get.mll lexer. Correction is patchy. version 1.05 version 1.05-7 - More customability for arrays and paragraphs - PDF manual - ``Environments'' toimage and verbimage do not define scope in latex anymore. - Some patches in array formats. - New ``cutflow'' feature in hacha. - Bad interaction beeteen new indexenv code and multiple indexes : code for indexenv is now re-entrant. - Index on two columns by default. - Bug footnotes at document end in info mode version 1.05-6 - Bad index entries are better treated - nasty regression bug in \bibitem, example in suite.tex - \label and \ref allowed in section headers (by a new @norefs environment) - \@try{txt1}{txt2} as exception handler -> Generalized checkpoints and hot starts. - New primitive \@getprint : get_prim_arg + \@notags + Dest.put, for HTML attributes - Bug exception NoGood (entry.mll and index.tex) - Two bugs: \tabbing closed a group at startup and Sys.rename failure when target exists on windows. - keyval package. - Bug range references in indexes (``|('' .. ``|)'' now ignored) - xxdate.exe script and \today in latexcommon.hva. - -exec prog option for generating .hva files on the fly - New license (QPL). - color (I mean no color!) for text - documentation for new hyperlinks macros and url package - bug argument de \cite - \imageflush is now a hva macro that calls \imgsrc. (internal is \@imageflush) - Bug in htmlMath : # now is a complex character. - new index scheme a` la latex, with external files - aux files read by \document - added de \@stopoutput \@restartoutput - bug \@stopimage \@stopimage .. \@restartimage \@restartimage -> a new stack for active in Image. - hevea.sty based uppon ``comment.sty'' - Bug at the end of image scanner (top_close_block was done after stop_other_scan...) - new hevea.sty as a package. - half implemented ``hyperref'' package needs doc - implemented the ``url'' package needs documentation (-> compat.hva) - new management of pending mods in html.ml, cancellation is done on a per-color basis -> more or less efficient ? - Added many colors (hsv, named color models) - new panic mode, (old mode sometimes made hevea loop for ever) - new fancyarticle.hva style for the manual - introduced \@hr ->
- started length management - all primitives should get their argument by get_prim_arg -> primitive argument are substituted/processed (except \@print of course) - new management of bindings, lexbuf is associated with a current environment. - new primitive \execafter -> graphics package implementation. version 1.05-5 - Beta version anounced on user mailing list. version 1.05-4 - Bug basein, file extension is stripped only if it is ``.tex'' - Bug verbatiminput (end of file now raises Misc.EndInput). version 1.05-3 - Allow a few catcode changes on active characters - l,c,r cells get top-aligned when there are other cells with vertical alignement specified (such as p). - new ``Stack'' module. - ``-tocbis'' option for hacha - Introduced \texlet \texdef and better documentation for TeX macros. - Computation of cross-referencing information using .haux files - Delimited arguments version 1.05-2 - synchro videoc version 1.05-1 - Small bug in optional arg parsing ('\n' before arg) - Warning for \def with delimiting characters - Small table of contents at file start (hacha modification). - Support for the \FRAME macro from Scientific Word. - For paragraph breaks -> empty lines may contain spaces. - Added a -entities switch -> math symbols as HTML 4.0 entities and unicode character references (yet uncomplete) - Refine the -pedantic option wrt to 4.0 transitional version 1.04 - Experimental mathml mode, for equations. - Choose html 4.0 transitional as default output language - html.ml split into html.ml, htmlCommon.ml and htmlMath.ml. - Better list-making environment and better documentation for them. - Suppressed ``Videoc'' when in text mode. - Added \csname ... \endcsname, environement names such as ``list1'' are supported - Symbols defined as .hva source files. - All internal macros can now be redefined. - Simplified internal macro values (-> 2 constructor only, and CamlCode arg is lexbuf -> unit) - Added an index in the manual (only extensions on LaTeX are indexed). - Added a secnumdepth counter and make high order defitions for sectional units. - Better paragraph managment across \label and \index. - info and text output, important changes in library organization. - mutind.hva compatibility file (added a \indexname internal command). - Better looking indexes, index tags get expanded. - New behavior for ``_'' and ``^'' outside math mode: they are echoed and a warning is issued - Simplified ``space after macro'' managment. - Mathematical accents added, rendering is far from perfect. - \\ in display mode does not emit
anymore - Small ams compatibility mode : displayed equations (ams.hva) and \numberwithin (modified Counter.ml for that). - Silly bug : opened files where never closed. - Better error message for missing \makeindex. - Eat \\ optional argument after \hline. - Bug in book.hva : \section* down to \susubsection* should ``\cuthere'' version 1.03 - \htmlfoot and \htmlhead commands. - Independant lexers for getting booleans and integers (module Get) - Optimized the regexps for headers in hacha. - A new ``image'' file is generated only when its content changed w.r.t. hevea previous run - macros ``centering'', ``raggedleft'' and ``raggedright'' - integrate the ``snippet'' plugin (by Christian.Queinnec@lip6.fr) - change computation of values (integer and boolean) - optimization of size changes, in term of the generated HTML size - commands \ifthenelse and \equal from the ifthenelse package - compatibility with the ``array'' package - html.sty changed into hevea.sty - Better error messages by better exception handling (thanks to Pierre.Weis@inria.fr) - Hevea style files now have extension ``.hva'' - Make main scanner a functor (add outManager.mli). This is a first step toward having several output languages. - Added the -extra and -mag options to imagen - Started a FAQ - Cleaned up somehow the output of iso-latin1 special symbols by putting all their definitions in hevea.sty. - Added a -noiso switch to output HTML entities such as é in place of iso-latin1 characters such as ``é''. - Better macro for \simeq (-> defined in hevea.sty) - Bug in displays : spurious were introduced by get_block and by "FORGET". - More precise error message in case of unbalanced environments : the opening line of the pending environment is shown. - Experimental seminar mode - Substitute \input argument - \longrightarrow et \leftrightarrow were forgotten. - Bugs in altt (%, &). version 1.02 - imagen is less nfs intensive (pipes, temporary files in /usr/tmp) and characters are anti-aliased. - Color in the ``color'' package style. - new verbimage and verblatex that implement the old behavior of latexonly and toimage. - new toimage and latexonlu environments that can appear inside others environments dynamically. - macros arguments are now substituted inside ``toimage'' environments - Small cosmetic changes in paragraph breaks inside nested lists. - Corrected bug in the interaction of \left... \right and \over - added \includonly - added \@bodyargs \@htmlargs macros to parametrize the and tags. - implemented \renewenvironment. - correctly implemented call-by-name. - the tabbing environment now works as specified. - small bug corrected: spaces after \begin{verbatim} were eaten. - _\cmd and ^\cmd are now recognized - \hspace and \vspace now interpret simple length arguments. (added a length.mll file) - Corrected a bug on the scope of definitions, when a definition fails. - Added support for verbatiminput, on an idea by Philippe Queinnec (Philippe.Queinnec@enseeiht.fr) - Changed module Aux into Auxx, to ease Philip A. Viton (pviton@magnus.acs.ohio-state.edu) Windows port. Version 1.01 Bug fixes. - Corrected a bug with \frac and \over: text before them appeared above fraction. - Corrected a HACHA bug: a spurious was introduced before footer. - Corrected a few bugs in documentation (htmlraw -> rawhtml). Version 1.0 Initial release. hevea-2.30/lexattr.mli0000644004317100512160000000167212017660721014752 0ustar marangetcristal(************************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, Thibault Suzanne, projet MOSCOVA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (************************************************************************) (* add_style "name:val" attributes return the attributes with the "name" style having the value "val". The "style=" attribute is added if needed *) val add_style : string -> string -> string hevea-2.30/index.hva0000644004317100512160000000102510610637202014356 0ustar marangetcristal\@primitives{index} \newsavebox{\@indexbox} \newcommand{\index}[2][default] {\if@refs% \sbox{\@indexbox}{\@indexwrite[#1]{#2}{\@indexlabel}}% side effect \@locname{\usebox{\@indexbox}}{}% \fi} \newcommand{\index*}[2][default] {\if@refs\sbox{\@indexbox}{\@indexwrite[#1]{#2}{\@indexlabel}}% side effect \@locname{\usebox{\@indexbox}}{#2}\fi} \newcommand{\printindex}[1][default]{\@printindex[#1]} \newcommand{\makeindex}{\newindex{default}{idx}{ind}{Index}} \newcommand{\see}[2]{\seename\ \textit{#1}} \newcommand{\@vwritefile}[2]{} hevea-2.30/htmlparse.ml0000644004317100512160000001001212323450432015075 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: htmlparse.ml,v 1.11 2008-01-22 18:08:37 maranget Exp $ *) (***********************************************************************) open Lexeme open Tree exception Error of string module Make(C:DoOut.Config) = struct let error msg _lb = raise (Error msg) ;; module Out = DoOut.Make(C) module Lex = Htmllex.Make(C) let buff = ref None let next_token lexbuf = match !buff with | Some tok -> buff := None ; tok | None -> Lex.next_token lexbuf and put_back lexbuf tok = match !buff with | None -> buff := Some tok | _ -> error "Put back" lexbuf let txt_buff = Out.create_buff () let rec to_close tag lb = match next_token lb with | Close (t,_) as tok when t=tag -> tok | Open (t,_,txt) when t=tag -> Out.put txt_buff txt ; Out.put txt_buff (Htmllex.to_string (to_close tag lb)) ; to_close tag lb | Eof -> error ("Eof in to_close") lb | tok -> Out.put txt_buff (Htmllex.to_string tok); to_close tag lb let rec tree cls lexbuf = match next_token lexbuf with | (Eof|Close (_,_)) as tok-> put_back lexbuf tok ; None | Open (STYLE,_,txt) -> let otxt = txt and ctxt = Htmllex.to_string (to_close STYLE lexbuf) in let txt = Out.to_string txt_buff in let txt = match cls with | None -> txt | Some cls -> let css = Lex.styles (MyLexing.from_string txt) in let buff = Out.create_buff () in Out.put_char buff '\n' ; List.iter (fun cl -> match cl with | Css.Other txt -> Out.put buff txt ; Out.put_char buff '\n' | Css.Class (name, addname, txt) -> if Emisc.Strings.mem name cls then begin Out.put_char buff '.' ; Out.put buff name ; begin match addname with | None -> () | Some n -> Out.put_char buff ' ' ; Out.put buff n end ; Out.put buff txt ; Out.put_char buff '\n' end) css ; Out.to_string buff in Some (Text (otxt^txt^ctxt)) | Open (SCRIPT,_,txt) -> Out.put txt_buff txt ; Out.put txt_buff (Htmllex.to_string (to_close SCRIPT lexbuf)) ; Some (Text (Out.to_string txt_buff)) | Open (tag,attrs,txt) -> let fils = trees cls lexbuf in begin match next_token lexbuf with | Close (ctag,ctxt) when tag=ctag -> Some (match tag with | A|SUP|SUB -> ONode (txt,ctxt,fils) | _ -> Node ({tag=tag ; attrs=attrs ; txt=txt ; ctxt=ctxt},fils)) | tok -> error (Htmllex.to_string tok ^ " closes "^txt) lexbuf end | Lexeme.Text txt -> Some (Text txt) | Lexeme.Blanks txt -> Some (Blanks txt) and trees cls lexbuf = match tree cls lexbuf with | None -> [] | Some t -> t::trees cls lexbuf let rec do_main cls lexbuf = match tree cls lexbuf with | None -> begin match next_token lexbuf with | Eof -> [] | tok -> error ("Unexpected " ^ Htmllex.to_string tok) lexbuf end | Some (Text _ as last) -> [last] | Some t -> t :: do_main cls lexbuf let ptop () = Lex.ptop () let reset () = Lex.reset() ; Out.reset txt_buff let main cls lexbuf = try do_main cls lexbuf with | e -> reset () ; raise e let classes = Lex.classes end hevea-2.30/hrlang.hva0000644004317100512160000001464612111172515014536 0ustar marangetcristal%%Taken from hyperref source %% This is file `hyperref.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% hyperref.dtx (with options: `package') %% %% File: hyperref.dtx Copyright 1995-2001 Sebastian Rahtz, %% with portions written by David Carlisle and Heiko Oberdiek, %% 2001-2009 Heiko Oberdiek. %% %% This file is part of the `Hyperref Bundle'. %% ------------------------------------------- %% %% It may be distributed under the conditions of the LaTeX Project Public %% License, either version 1.2 of this license or (at your option) any %% later version. The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.2 or later is part of all distributions of LaTeX %% version 1999/12/01 or later. %% \def\HyLang@afrikaans{% \def\equationautorefname{Vergelyking}% \def\footnoteautorefname{Voetnota}% \def\itemautorefname{Item}% \def\figureautorefname{Figuur}% \def\tableautorefname{Tabel}% \def\partautorefname{Deel}% \def\appendixautorefname{Bylae}% \def\chapterautorefname{Hoofstuk}% \def\sectionautorefname{Afdeling}% \def\subsectionautorefname{Subafdeling}% \def\subsubsectionautorefname{Subsubafdeling}% \def\paragraphautorefname{Paragraaf}% \def\subparagraphautorefname{Subparagraaf}% \def\FancyVerbLineautorefname{Lyn}% \def\theoremautorefname{Teorema}% \def\pageautorefname{Bladsy}% } \def\HyLang@english{% \def\equationautorefname{Equation}% \def\footnoteautorefname{footnote}% \def\itemautorefname{item}% \def\figureautorefname{Figure}% \def\tableautorefname{Table}% \def\partautorefname{Part}% \def\appendixautorefname{Appendix}% \def\chapterautorefname{chapter}% \def\sectionautorefname{section}% \def\subsectionautorefname{subsection}% \def\subsubsectionautorefname{subsubsection}% \def\paragraphautorefname{paragraph}% \def\subparagraphautorefname{subparagraph}% \def\FancyVerbLineautorefname{line}% \def\theoremautorefname{Theorem}% \def\pageautorefname{page}% } \def\HyLang@french{% \def\equationautorefname{\'Equation}% \def\footnoteautorefname{note}% \def\itemautorefname{item}% \def\figureautorefname{Figure}% \def\tableautorefname{Tableau}% \def\partautorefname{Partie}% \def\appendixautorefname{Appendice}% \def\chapterautorefname{chapitre}% \def\sectionautorefname{section}% \def\subsectionautorefname{sous-section}% \def\subsubsectionautorefname{sous-sous-section}% \def\paragraphautorefname{paragraphe}% \def\subparagraphautorefname{sous-paragraphe}% \def\FancyVerbLineautorefname{ligne}% \def\theoremautorefname{Th\'eor\`eme}% \def\pageautorefname{page}% } \def\HyLang@german{% \def\equationautorefname{Gleichung}% \def\footnoteautorefname{Fu\ss note}% \def\itemautorefname{Punkt}% \def\figureautorefname{Abbildung}% \def\tableautorefname{Tabelle}% \def\partautorefname{Teil}% \def\appendixautorefname{Anhang}% \def\chapterautorefname{Kapitel}% \def\sectionautorefname{Abschnitt}% \def\subsectionautorefname{Unterabschnitt}% \def\subsubsectionautorefname{Unterunterabschnitt}% \def\paragraphautorefname{Absatz}% \def\subparagraphautorefname{Unterabsatz}% \def\FancyVerbLineautorefname{Zeile}% \def\theoremautorefname{Theorem}% \def\pageautorefname{Seite}% } \def\HyLang@italian{% \def\equationautorefname{Equazione}% \def\footnoteautorefname{nota}% \def\itemautorefname{punto}% \def\figureautorefname{Figura}% \def\tableautorefname{Tabella}% \def\partautorefname{Parte}% \def\appendixautorefname{Appendice}% \def\chapterautorefname{Capitolo}% \def\sectionautorefname{sezione}% \def\subsectionautorefname{sottosezione}% \def\subsubsectionautorefname{sottosottosezione}% \def\paragraphautorefname{paragrafo}% \def\subparagraphautorefname{sottoparagrafo}% \def\FancyVerbLineautorefname{linea}% \def\theoremautorefname{Teorema}% \def\pageautorefname{Pag.\@}% } \def\HyLang@magyar{% \def\equationautorefname{Egyenlet}% \def\footnoteautorefname{l\'abjegyzet}% \def\itemautorefname{Elem}% \def\figureautorefname{\'Abra}% \def\tableautorefname{T\'abl\'azat}% \def\partautorefname{R\'esz}% \def\appendixautorefname{F\"uggel\'ek}% \def\chapterautorefname{fejezet}% \def\sectionautorefname{szakasz}% \def\subsectionautorefname{alszakasz}% \def\subsubsectionautorefname{alalszakasz}% \def\paragraphautorefname{bekezd\'es}% \def\subparagraphautorefname{albekezd\'es}% \def\FancyVerbLineautorefname{sor}% \def\theoremautorefname{T\'etel}% \def\pageautorefname{oldal}% } \def\HyLang@portuges{% \def\equationautorefname{Equa\c c\~ao}% \def\footnoteautorefname{Nota de rodap\'e}% \def\itemautorefname{Item}% \def\figureautorefname{Figura}% \def\tableautorefname{Tabela}% \def\partautorefname{Parte}% \def\appendixautorefname{Ap\^endice}% \def\chapterautorefname{Cap\'itulo}% \def\sectionautorefname{Se\c c\~ao}% \def\subsectionautorefname{Subse\c c\~ao}% \def\subsubsectionautorefname{Subsubse\c c\~ao}% \def\paragraphautorefname{par\'agrafo}% \def\subparagraphautorefname{subpar\'agrafo}% \def\FancyVerbLineautorefname{linha}% \def\theoremautorefname{Teorema}% \def\pageautorefname{P\'agina}% } \def\HyLang@spanish{% \def\equationautorefname{Ecuaci\'on}% \def\footnoteautorefname{Nota a pie de p\'agina}% \def\itemautorefname{Elemento}% \def\figureautorefname{Figura}% \def\tableautorefname{Tabla}% \def\partautorefname{Parte}% \def\appendixautorefname{Ap\'endice}% \def\chapterautorefname{Cap\'itulo}% \def\sectionautorefname{Secci\'on}% \def\subsectionautorefname{Subsecci\'on}% \def\subsubsectionautorefname{Subsubsecci\'on}% \def\paragraphautorefname{P\'arrafo}% \def\subparagraphautorefname{Subp\'arrafo}% \def\FancyVerbLineautorefname{L\'inea}% \def\theoremautorefname{Teorema}% \def\pageautorefname{P\'agina}% } \def\HyLang@vietnamese{% \def\equationautorefname{Ph\uhorn{}\ohorn{}ng tr\`inh}% \def\footnoteautorefname{Ch\'u th\'ich}% \def\itemautorefname{m\d{u}c}% \def\figureautorefname{H\`inh}% \def\tableautorefname{B\h{a}ng}% \def\partautorefname{Ph\`\acircumflex{}n}% \def\appendixautorefname{Ph\d{u} l\d{u}c}% \def\chapterautorefname{ch\uhorn{}\ohorn{}ng}% \def\sectionautorefname{m\d{u}c}% \def\subsectionautorefname{m\d{u}c}% \def\subsubsectionautorefname{m\d{u}c}% \def\paragraphautorefname{\dj{}o\d{a}n}% \def\subparagraphautorefname{\dj{}o\d{a}n}% \def\FancyVerbLineautorefname{d\`ong}% \def\theoremautorefname{\DJ{}\d{i}nh l\'y}% \def\pageautorefname{Trang}% } hevea-2.30/emisc.mli0000644004317100512160000000213312017660721014360 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: emisc.mli,v 1.2 2006-10-09 08:25:16 maranget Exp $ *) (***********************************************************************) val verbose : int ref val basefont : int ref val reset : unit -> unit val dump_class : out_channel -> string -> string -> unit module Strings : Set.S with type elt = string module StringMap : Map.S with type key = string module StringCount : Count.S with type key = string exception LexError of string hevea-2.30/multind.hva0000644004317100512160000000037512454751421014742 0ustar marangetcristal\usepackage{index} \renewcommand{\makeindex}[1]{\newindex{#1}{#1}{#1.hind}{\indexname}} \let\oldprintindex=\printindex \renewcommand{\printindex}[2]{\@indexname[#1]{#2}\oldprintindex[#1]} \let\oldindex=\index \renewcommand{\index}[2]{\oldindex[#1]{#2}} hevea-2.30/lstlang2.hva0000644004317100512160000000002512640460115014776 0ustar marangetcristal\input{lstlang2.sty} hevea-2.30/compat.hva0000644004317100512160000000026607042125057014545 0ustar marangetcristal\@stopoutput\@stopimage% Avoid echo to image file \let\@url\ahref% \def\url#1#2{\@url{#1}{#2}}% \def\oneurl#1{\ahrefurl{\texttt{#1}}} \let\footurl\url \@restartimage\@restartoutput% hevea-2.30/natbib-common.hva0000644004317100512160000002703712017660721016014 0ustar marangetcristal\RequirePackage{keyval} %% Options \DeclareOption{numbers} {\NAT@numbers\NAT@square\NAT@comma\NAT@nobibstyle} \DeclareOption{super} {\NAT@super\def\NAT@open{}\def\NAT@close{}\NAT@nobibstyle} \DeclareOption{authoryear} {\NAT@authoryear\NAT@round\NAT@semicolon\NAT@bibstyle} \DeclareOption{round}{\NAT@round\NAT@nobibstyle} \DeclareOption{square}{\NAT@square\NAT@nobibstyle} \DeclareOption{angle}{\NAT@angle\NAT@nobibstyle} \DeclareOption{curly}{\NAT@curly\NAT@nobibstyle} \DeclareOption{comma}{\NAT@comma\NAT@nobibstyle} \DeclareOption{semicolon}{\NAT@semicolon\NAT@nobibstyle} \DeclareOption{colon}{\NAT@semicolon\NAT@nobibstyle} \DeclareOption{nobibstyle}{\NAT@nobibstyle} \DeclareOption{bibstyle}{\NAT@bibstyle} \DeclareOption{openbib}{}%undocumented, what does it do ? \DeclareOption{sectionbib}{}%useless, chapterbib does the job %%%Not implemented, ignore silently \DeclareOption{sort}{} \DeclareOption{compress}{} \DeclareOption{sort&compress}{} %% \@primitives{natbib} \newcommand{\NAT@warn}[1]{\hva@warn{natbib in hevea: #1}} \newif\ifNAT@super \newcommand{\NAT@bibstyle}{\let\bibstyle\@citestyle} \newcommand{\NAT@nobibstyle}{\let\bibstyle\@gobble} % Automatic bibstyle (excerpt from natbib.sty) % Define citation punctuation for some author-year styles % One may add and delete at this point % Or put additions into local configuration file natbib.cfg \newcommand\bibstyle@chicago{\bibpunct{(}{)}{;}{a}{,}{,}} \newcommand\bibstyle@named{\bibpunct{[}{]}{;}{a}{,}{,}} \newcommand\bibstyle@agu{\bibpunct{[}{]}{;}{a}{,}{,~}}%Amer. Geophys. Union \newcommand\bibstyle@copernicus{\bibpunct{(}{)}{;}{a}{,}{,}}%Copernicus Publications \let\bibstyle@egu=\bibstyle@copernicus \let\bibstyle@egs=\bibstyle@copernicus \newcommand\bibstyle@agsm{\bibpunct{(}{)}{,}{a}{}{,}\gdef\harvardand{\&}} \newcommand\bibstyle@kluwer{\bibpunct{(}{)}{,}{a}{}{,}\gdef\harvardand{\&}} \newcommand\bibstyle@dcu{\bibpunct{(}{)}{;}{a}{;}{,}\gdef\harvardand{and}} \newcommand\bibstyle@aa{\bibpunct{(}{)}{;}{a}{}{,}} %Astronomy & Astrophysics \newcommand\bibstyle@pass{\bibpunct{(}{)}{;}{a}{,}{,}}%Planet. & Space Sci \newcommand\bibstyle@anngeo{\bibpunct{(}{)}{;}{a}{,}{,}}%Annales Geophysicae \newcommand\bibstyle@nlinproc{\bibpunct{(}{)}{;}{a}{,}{,}}%Nonlin.Proc.Geophys. % Define citation punctuation for some numerical styles \newcommand\bibstyle@cospar{\bibpunct{/}{/}{,}{n}{}{}% \gdef\bibnumfmt##1{##1.}} \newcommand\bibstyle@esa{\bibpunct{(Ref.~}{)}{,}{n}{}{}% \gdef\bibnumfmt##1{##1.\hspace{1em}}} \newcommand\bibstyle@nature{\bibpunct{}{}{,}{s}{}{\textsuperscript{,}}% \gdef\bibnumfmt##1{##1.}} % The standard LaTeX styles \newcommand\bibstyle@plain{\bibpunct{[}{]}{,}{n}{}{,}} \let\bibstyle@alpha=\bibstyle@plain \let\bibstyle@abbrv=\bibstyle@plain \let\bibstyle@unsrt=\bibstyle@plain % The author-year modifications of the standard styles \newcommand\bibstyle@plainnat{\bibpunct{[}{]}{,}{a}{,}{,}} \let\bibstyle@abbrvnat=\bibstyle@plainnat \let\bibstyle@unsrtnat=\bibstyle@plainnat %%%Bibstyle definition \renewcommand\bibstyle[1]{\@ifundefined{bibstyle@#1}{\relax} {\csname bibstyle@#1\endcsname}} \AtBeginDocument{\global\let\bibstyle=\@gobble} \let\@citestyle\bibstyle \newcommand\citestyle[1]{\@citestyle{#1}\let\bibstyle\@gobble} %%%%%%%%%%%% Citation formating, two macros per style % #1 -> num, #2 author (short or long), #3 year. \newcommand{\NAT@extra}[1] {\def\@tmp{#1}\ifx\@tmp\@empty\relax\else\NAT@post{} #1\fi} \newcommand{\NAT@authoryear@p}[5]{#2\@aysep@cite{} #3\NAT@extra{#4}} \newcommand{\NAT@authoryear@t}[5]{#2 \NAT@open{}#3\NAT@extra{#4}\NAT@close} \newcommand{\NAT@numbers@p}[5]{#1\NAT@extra{#4}} \newcommand{\NAT@numbers@t}[5]{#2 \NAT@open{}#1\NAT@close\NAT@extra{#4}} \newcommand{\NAT@super@p}[5]{#1\NAT@extra{#4}} \newcommand{\NAT@super@t}[5] {#2\ensuremath{^{\mbox{\NAT@yopen{}#1\NAT@yclose}}}\NAT@extra{#4}} %%\citenum,\citeauthor.. \newcommand{\NAT@authoryear@n}[5]{#1} \newcommand{\NAT@numbers@n}[5]{#1} \newcommand{\NAT@super@n}[5]{#1} \newcommand{\NAT@authoryear@a}[5]{#2} \newcommand{\NAT@numbers@a}[5]{#2} \newcommand{\NAT@super@a}[5]{#2} \newcommand{\NAT@authoryear@y}[5]{#3} \newcommand{\NAT@numbers@y}[5]{#3} \newcommand{\NAT@super@y}[5]{#3} %%\citealias \newcommand{\NAT@authoryear@b}[5]{\NAT@getalias{#5}\NAT@extra{#4}} \newcommand{\NAT@numbers@b}[5]{\NAT@getalias{#5}\NAT@extra{#4}} \newcommand{\NAT@super@b}[5]{\NAT@getalias{#5}\NAT@extra{#4}} %%Citation formatting hook \newcommand{\@NAT@format@cite}{\csname NAT@\NAT@style{}@\NAT@pt\endcsname} \newcommand{\NAT@format@cite}[3] {\@callsubst\NAT@args#1% \@NAT@format@cite {\NAT@num} {\NAT@choose@author{\NAT@auth}{\NAT@long}} {\NAT@year}{#2}{#3}} \newcommand{\NAT@args}[4] {\def\NAT@num{#1}\def\NAT@year{#2}\def\NAT@auth{#3}% \ifthenelse{\equal{#4}{}}{\let\NAT@long\NAT@auth}{\def\NAT@long{#4}}} %%% \newcommand{\bibnumfmt}[1]{[#1]} \newcommand{\NAT@format@item}[4] {\ifx#3\@empty#2\else \NAT@item@hook{\NAT@authoryear@t{#2}{#3}{#4}{}}{\bibnumfmt{#2}}\fi} \def\NAT@check#1(#2)#3(@){#2#3}% \def\NAT@bibitem#1(#2)#3(@)#4(@)#5(@){% \NAT@write{{#4}}{#5}{#1}{#2}{#3}% \item[#4]} \newif\ifNAT@forced\NAT@forcedfalse \newcommand{\NAT@force@numbers} {\ifNAT@forced\else\NAT@forcedtrue\@auxdowrite{\string\NAT@numbers{} }\fi} \renewcommand{\bibitem}[2][!*!] {\stepcounter{heveabib}\ifthenelse{\equal{#1}{!*!}} {\@callsubst{\NAT@bibitem}{()(@)#2(@)\theheveabib(@)}} {\ifthenelse {\equal{\@callsubst{\NAT@check}{#1()(@)}}{}} {\NAT@force@numbers\@callsubst{\NAT@bibitem}{()(@)#2(@)#1(@)}} {\@callsubst{\NAT@bibitem}{#1(@)#2(@)\theheveabib(@)}}}} %%%% Default config used for tags in the bibliography itself \newcommand{\NAT@fst}[2]{#1} \newcommand{\NAT@snd}[2]{#2} \let\NAT@choose@author\NAT@fst \let\NAT@item@hook\NAT@fst %% Those can be configured \def\NAT@open{(} \def\NAT@close{)} \def\NAT@sep{,} \def\NAT@post{,} \def\NAT@aysep{,} %shorcuts \newcommand{\NAT@square}{\def\NAT@open{[}\def\NAT@close{]}} \newcommand{\NAT@round}{\def\NAT@open{(}\def\NAT@close{)}} \newcommand{\NAT@curly}{\def\NAT@open{\{}\def\NAT@close{\}}} \newcommand{\NAT@angle}{\def\NAT@open{<}\def\NAT@close{>}} \newcommand{\NAT@comma}{\def\NAT@sep{,}} \newcommand{\NAT@semicolon}{\def\NAT@sep{;}} %%% \let\@aysep@cite\relax \let\NAT@yopen\NAT@open \let\NAT@yclose\NAT@close \let\NAT@finalhook\relax \newcommand{\NAT@neutral} {\let\NAT@open@super\relax \let\NAT@close@super\relax\let\@cite@pre\NAT@addsp \NAT@superfalse} \newcommand{\NAT@addsp}[1]{#1~} \newcommand{\NAT@id}[1]{#1} \NAT@neutral \let\NAT@finalhook\relax %%%% Hack \cite in fact has two optional arguments %%%% and may hooks that are parametrize below \let\hva@cite\cite \newcommand{\NAT@IN}[5] {\ifNAT@super \def\@open@cite@one{}% \def\@open@cite@two{\NAT@open@super{}#1}% \else \def\@open@cite@one{#1}% \let\@open@cite@two\relax \fi \def\@close@cite{\NAT@OUT{#2}}% \let\@sep@cite\NAT@sep% \let\@post@cite\NAT@post% \let\@aysep@cite#3\let\NAT@yopen#4\let\NAT@yclose#5} \newcommand{\NAT@OUT}[1]{#1\NAT@close@super\endgroup{}\NAT@finalhook} \newcommand{\citep} {\begingroup\def\NAT@pt{p}% \NAT@IN{\NAT@open}{\NAT@close}{\NAT@aysep}{\relax}{\relax}\hva@cite} \newcommand{\citep*} {\begingroup% \let\NAT@choose@author\NAT@snd% \let\NAT@finalhook\endgroup% \citep} \newcommand{\citealp} {\begingroup\def\NAT@pt{p}% \NAT@IN{\relax}{\relax}{\NAT@aysep}{\relax}{\relax}\hva@cite} \newcommand{\citealp*} {\begingroup% \let\NAT@choose@author\NAT@snd% \let\NAT@finalhook\endgroup% \citealp} \newcommand{\citet} {\begingroup\def\NAT@pt{t}\NAT@neutral\def\@sep@cite@space{ }% \NAT@IN{\relax}{\relax}{\relax}{\NAT@open}{\NAT@close}% \hva@cite} \newcommand{\citet*} {\begingroup% \let\NAT@choose@author\NAT@snd% \let\NAT@finalhook\endgroup% \citet} \newcommand{\citealt} {\begingroup\def\NAT@pt{t}\NAT@neutral\def\@sep@cite@space{ }% \NAT@IN{\relax}{\relax}{\relax}{\relax}{\relax}% \hva@cite} \newcommand{\citealt*} {\begingroup% \let\NAT@choose@author\NAT@snd% \let\NAT@finalhook\endgroup% \citealt} \newcommand{\citenum} {\begingroup\def\NAT@pt{n}\NAT@neutral\def\@sep@cite@space{}% \NAT@IN{\relax}{\relax}{\relax}{\relax}{\relax}% \hva@cite} \newcommand{\citeauthor} {\begingroup\def\NAT@pt{a}\NAT@neutral\def\@sep@cite@space{ }% \NAT@IN{\relax}{\relax}{\relax}{\relax}{\relax}% \hva@cite} \newcommand{\citeauthor*} {\begingroup% \let\NAT@choose@author\NAT@snd% \let\NAT@finalhook\endgroup% \citeauthor} \let\citefullauthor\citeauthor* \newcommand{\citeyear} {\begingroup\def\NAT@pt{y}\NAT@neutral\def\@sep@cite@space{ }% \NAT@IN{\relax}{\relax}{\relax}{\relax}{\relax}% \hva@cite} \newcommand{\citeyearpar} {\begingroup\def\NAT@pt{y}\NAT@neutral\def\@sep@cite@space{ }% \NAT@IN{\NAT@open}{\NAT@close}{\relax}{\relax}{\relax}% \hva@cite} \newcommand{\citetext}[1]{\NAT@open{}#1\NAT@close} \renewcommand{\cite}{\NAT@ifay{\citet}{\citep}} %% Aliases, the explicit \bibtaghook is for chapterbib compatibility \newcommand{\defcitealias}[2] {\def\csname NAT@alias@\bibtaghook{#1}\endcsname{#2}} \newcommand{\NAT@getalias}[1] {\@ifundefined{NAT@alias@#1} {\NAT@warn{undefined alias '#1'}} {\csname NAT@alias@#1\endcsname}} \newcommand{\citetalias} {\begingroup% \def\NAT@pt{b}\NAT@neutral\def\@sep@cite@space{ }% \NAT@IN{\relax}{\relax}{\relax}{\relax}{\relax}% \hva@cite} \newcommand{\citepalias} {\begingroup% \def\NAT@pt{b}\NAT@neutral\def\@sep@cite@space{ }% \NAT@IN{\NAT@open}{\NAT@close}{\relax}{\relax}{\relax}% \hva@cite} %%%%%%%%%%%% %% Index %% %%%%%%%%%%%% \newif\ifciteindex\citeindexfalse \newcommand{\citeindextype}{default} \newcommand{\NAT@idxtxt} {\NAT@auth\NAT@aysep{} \NAT@open{}\NAT@year\NAT@close} \newcommand{\NATfmtindex}[1] {\NAT@bibread{#1}\NAT@format@item{#1}{\NAT@num}{\NAT@auth}{\NAT@year}} \newcommand{\NAT@idxkey}[1] {\NAT@bibread{#1}% \ifx\NAT@num\@empty#1\else\@pad{0}{3}{\NAT@num}CITE\fi} \newcommand{\NAT@index}[1] {\@@@indexwrite[\citeindextype]{\NAT@idxkey{#1}}{\NATfmtindex{#1}}{\@indexlabel}} %%%%%%%%%%%% %% Modes %% %%%%%%%%%%%% %%%Author / year, default style in some sense \newcommand{\NAT@authoryear} {\def\NAT@style{authoryear}\NAT@superfalse% \let\NAT@ifay\NAT@fst% \def\@sep@cite@space{ }\let\NAT@item@hook\NAT@fst\NAT@neutral} %%%Numbers \newcommand{\NAT@numbers} {\def\NAT@style{numbers}\NAT@superfalse\let\NAT@ifay\NAT@snd% \let\@sep@cite@space\@empty\let\NAT@item@hook\NAT@snd\NAT@neutral} %%%Super is harder \newif\ifNAT@closed \newcommand{\@NAT@os}{\@style{SUP}} \newcommand{\@NAT@cs}{} \newcommand{\NAT@super}{ \def\NAT@style{super}\NAT@supertrue\let\NAT@ifay\NAT@snd% \let\NAT@item@hook\NAT@snd% \let\@sep@cite@space\@empty% \let\NAT@open@super\@NAT@os\let\NAT@close@super\@NAT@cs\let\@cite@pre\NAT@id} %% \bibpunct command, arg #8 ignored \newcommand{\bibpunct}[7][, ] {\def\NAT@post{#1}% \def\NAT@open{#2}\def\NAT@close{#3}\def\NAT@sep{#4}% \ifthenelse{\equal{#5}{n}}{\NAT@numbers} {\ifthenelse{\equal{#5}{s}}{\NAT@super} {\NAT@authoryear}} \def\NAT@aysep{#6}% \let\bibstyle\@gobble} %% Keyval interface \newcommand{\setcitestyle}[1]{\@setkeys{NAT}{#1}\let\bibstyle\@gobble} %simple keys \define@key{NAT}{numbers}[]{\NAT@numbers} \define@key{NAT}{authoryear}[]{\NAT@authoryear} \define@key{NAT}{super}[]{\NAT@super} \define@key{NAT}{round}[]{\NAT@round} \define@key{NAT}{square}[]{\NAT@square} \define@key{NAT}{curly}[]{\NAT@curly} \define@key{NAT}{angle}[]{\NAT@angle} \define@key{NAT}{comma}[]{\NAT@comma} \define@key{NAT}{semicolon}[]{\NAT@semicolon} \define@key{NAT}{colon}[]{\NAT@semicolon} %keys with argument \define@key{NAT}{open}{\def\NAT@open{#1}} \define@key{NAT}{close}{\def\NAT@close{#1}} %%% Need that because natbib styles put strange things in .bbl files \providecommand{\penalty}[1]{} %%% \NAT@authoryear%default \ProcessOptions*% hevea-2.30/url.mll0000644004317100512160000000547312017660721014077 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* en Automatique. Distributed only by permission. *) (* *) (* *) (***********************************************************************) (* URL encoding and decoding, As the issue is still pending, apply to fragment only! *) { open Printf type url = { scheme : string option ; authority : string option ; path : string ; query : string option ; fragment : string option ; } exception Error } let hex = ['0'-'9''A'-'F''a'-'f'] rule break = parse | ([^':''/''?''#']+ as scheme ':') ? ("//" ([^'/''?''#']* as authority)) ? ([^'?''#']* as path) ('?' [^'#']* as query)? ('#' (_* as fragment))? { {scheme; authority; path; query; fragment;} } | "" { raise Error } and do_decode putc = parse | '%' (hex as a) (hex as b) { let n = try int_of_string (sprintf "0x%c%c" a b) with _ -> assert false in putc (Char.chr n) ; do_decode putc lexbuf } | _ as c { putc c ; do_decode putc lexbuf } | eof { () } { (* See http://www.lunatech-research.com/archives/2009/02/03/what-every-web-developer-must-know-about-url-encoding/#Thereservedcharactersarenotwhatyouthinktheyare *) let do_encode_fragment putc put c = match c with | 'a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_' | '~' | '.' -> putc c | _ -> put (sprintf "%%%02X" (Char.code c)) let do_encode putc put specific u = let len = String.length u in for k =0 to len-1 do let c = String.unsafe_get u k in specific putc put c done let apply putc put f u = begin match u.scheme with | None -> () | Some s -> f s ; putc ':' end ; begin match u.authority with | None -> () | Some s -> put "//" ; f s end ; f u.path ; begin match u.query with | None -> () | Some s -> putc '?' ; f s end ; begin match u.fragment with | None -> () | Some s -> putc '#' ; f s end ; () let _encode putc put u = let u = break (MyLexing.from_string u) in apply putc put (do_encode putc put do_encode_fragment) u let _decode putc put u = let u = break (MyLexing.from_string u) in let do_decode s = do_decode putc (MyLexing.from_string s) in apply putc put do_decode u let encode_fragment putc put u = do_encode putc put do_encode_fragment u let decode_fragment putc _put u = do_decode putc (MyLexing.from_string u) } hevea-2.30/import.hva0000644004317100512160000000123610723547637014606 0ustar marangetcristal\ProvidesPackage{import} \@primitives{import} \newcommand{\@imp@dir}{} \hva@newstack{@imp} \newcommand{\@imp@import}[3] {% \@imp@set{#2}% \@push@imp{\@imp@dir}% \renewcommand{\@imp@dir}{#2}% #1{#3}% \@pop@imp{\@imp@dir}% \@imp@set{\@imp@dir}% } \newcommand{\import}[2]{\@imp@import{\input}{#1}{#2}} \newcommand{\includefrom}[2]{\@imp@import{\include}{#1}{#2}} %%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\@imp@sub}[3] {% \@push@imp{\@imp@dir}% \prim@def\@imp@dir{\@imp@dir{}#2}% \@imp@set{\@imp@dir}% #1{#3}% \@pop@imp{\@imp@dir}% \@imp@set{\@imp@dir}% } \newcommand{\subimport}[2]{\@imp@sub{\input}{#1}{#2}} \newcommand{\subincludefrom}[2]{\@imp@sub{\include}{#1}{#2}} %%%% hevea-2.30/outUnicode.mli0000644004317100512160000000555410574257751015423 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet MOSCOVA, INRIA Rocquencourt *) (* *) (* Copyright 2006 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) type unichar val show : unichar -> string (* Parse unicode chars given the HTML way *) val parse : string -> unichar (* Set translators from table in subdir 'mappings' *) val set_output_translator : string -> unit val set_input_translator : string -> unit val set_translators : string -> unit (* Translate for output *) exception CannotTranslate val translate_in : char -> (unit -> int) -> unichar val translate_out : unichar -> (char -> unit) -> unit (* Diacritical marks *) val grave : char -> unichar val acute : char -> unichar val circumflex : char -> unichar val tilde : char -> unichar val diaeresis : char -> unichar val ring : char -> unichar val cedilla : char -> unichar val stroke : char -> unichar val macron : char -> unichar val caron : char -> unichar val doubleacute : char -> unichar val doublegrave : char -> unichar val breve : char -> unichar val dotabove : char -> unichar val dotbelow : char -> unichar val linebelow : char -> unichar val ringabove : char -> unichar val ogonek : char -> unichar val circled : char -> unichar val doublestruck : char -> unichar (* Default rendering *) val def_default : unichar -> string -> unit val get_default : unichar -> string (* may raise Not_found *) (* Output unicode char as html *) val html_put : (string -> unit) -> (char -> unit) -> unichar -> unit (* A few constants *) val null : unichar val space : unichar val nbsp : unichar val acute_alone : unichar val grave_alone : unichar val circum_alone : unichar val diaeresis_alone : unichar val cedilla_alone : unichar val tilde_alone : unichar val macron_alone : unichar val doubleacute_alone : unichar val breve_alone : unichar val dotabove_alone : unichar val dotbelow_alone : unichar val linebelow_alone : unichar val ogonek_alone : unichar val ring_alone : unichar val caron_alone : unichar val circled_alone : unichar val eszett : unichar val iques : unichar val iexcl : unichar val minus : unichar val endash : unichar val emdash : unichar val ldquot : unichar val rdquot : unichar val lsquot : unichar val rsquot : unichar val prime : unichar val dprime : unichar val tprime : unichar val rprime : unichar val rdprime : unichar val rtprime : unichar hevea-2.30/tabular.mli0000644004317100512160000000227307303451221014712 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: tabular.mli,v 1.11 2001-05-25 12:37:29 maranget Exp $ *) (***********************************************************************) exception Error of string type align = {hor : string ; mutable vert : string ; wrap : bool ; mutable pre : string ; mutable post : string ; width : Length.t} type format = Align of align | Inside of string | Border of string val border : bool ref val pretty_format : format -> string val pretty_formats : format array -> unit val main : string Lexstate.arg -> format array hevea-2.30/colscan.mli0000644004317100512160000000172607303451221014704 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: colscan.mli,v 1.5 2001-05-25 12:37:20 maranget Exp $ *) (***********************************************************************) exception Error of string val one : Lexing.lexbuf -> float val three : Lexing.lexbuf -> float * float * float val four : Lexing.lexbuf -> float * float * float * float hevea-2.30/videoc.mll0000644004317100512160000003447312401623123014540 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* Christian Queinnec, Universite Paris IV *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* The plugin for HeVeA that implements the VideoC style. *) { open Printf module type T = sig end;; module Make (Dest : OutManager.S) (Image : ImageManager.S) (Scan : Latexscan.S) = struct open Misc open Lexing open Lexstate open Latexmacros open Subst open Scan let _header = "$Id: videoc.mll,v 1.32 2012-06-05 14:55:39 maranget Exp $" (* So I can synchronize my changes from Luc's ones *) let _qnc_header = "30 oct 2000" exception EndSnippet ;; exception EndTeXInclusion ;; (* Re-link with these variables inserted in latexscan. *) let withinSnippet = ref false;; let withinTeXInclusion = ref false;; let endSnippetRead = ref false;; (* Snippet global defaults *) let snippetLanguage = ref "";; let enableLispComment = ref false;; let enableSchemeCharacters = ref false;; (* Snippet Environment: run a series of hooks provided they exist as user macros. *) let runHook prefix parsing name = let run name = begin if !verbose > 2 then prerr_endline ("Trying to run hook " ^ name); if Latexmacros.exists name then begin Lexstate.scan_this parsing name; () end end in let rec iterate name suffix = run name; if suffix <> "" then iterate (name ^ (String.make 1 (String.get suffix 0))) (String.sub suffix 1 ((String.length suffix) - 1)) in iterate (prefix ^ name ^ "Hook") !snippetLanguage;; let snippetRunHook parsing name = runHook "\\snippet" parsing name;; let snipRunHook parsing name = runHook "\\snip" parsing name;; (* Hack for mutual recursion between modules: *) (* Convert a reference to a hint such as "3" "annote.ann" "premier indice" into "3_annote_ann". This is needed for the annote tool. *) let compute_hint_id number filename _notename = let result = number ^ "_" ^ filename in (*DEPRECATED let rec convert i = begin if i begin counter := !counter + 1; !counter end;; } let command_name = '\\' ((['@''A'-'Z' 'a'-'z']+ '*'?) | [^ 'A'-'Z' 'a'-'z'] | "\\*") rule snippetenv = parse | eof { () } | command_name {let csname = lexeme lexbuf in let pat,body = Latexmacros.find csname in begin match pat with | [],[] -> let args = make_stack csname pat lexbuf in let cur_subst = get_subst () in let exec = function | Subst body -> if !verbose > 2 then eprintf "user macro in snippet: [%a]\n" pretty_body body ; Lexstate.scan_this_list_may_cont Scan.main lexbuf cur_subst (string_to_arg body) | Toks l -> List.iter (fun s -> scan_this Scan.main s) (List.rev l) | CamlCode f -> f lexbuf in scan_body exec body args | _ -> raise (Misc.ScanError ("Command with arguments inside snippet")) end ; snippetenv lexbuf} | '\n' {Dest.put_tag "
"; Dest.put_char '\n'; snippetRunHook Scan.main "AfterLine"; snippetRunHook Scan.main "BeforeLine"; snippetenv lexbuf} | ' '|'\t' {Dest.put_nbsp (); snippetenv lexbuf} | ';' + {Dest.put (lexeme lexbuf); Dest.put_char ' '; if !enableLispComment then begin if !verbose > 1 then prerr_endline "Within snippet: Lisp comment entered"; Lexstate.withinLispComment := true; Scan.top_open_block "SPAN" ("class=\"" ^ !snippetLanguage ^ "Comment\""); snippetRunHook Scan.main "BeforeComment"; try Scan.main lexbuf with (* until a \n is read *) | exc -> begin snippetRunHook Scan.main "AfterComment"; Scan.top_close_block "SPAN"; Lexstate.withinLispComment := false; (* re-raise every exception but EndOfLispComment *) try raise exc with | Misc.EndOfLispComment nlnum -> begin let addon = (if !endSnippetRead then "\\endsnippet" else "") in if !verbose > 1 then Printf.fprintf stderr "%d NL after LispComment %s\n" nlnum ((if !endSnippetRead then "and " else "")^addon); let _ = Lexstate.scan_this snippetenv ((String.make (1+nlnum) '\n')^addon) in () end; end; end; snippetenv lexbuf} | '#' {Dest.put_char '#'; if !enableSchemeCharacters then begin if !verbose > 1 then prerr_endline "Within snippet: scheme characters enabled"; schemecharacterenv lexbuf end; snippetenv lexbuf} | _ as lxm {Scan.translate_put_unicode lxm (fun () -> read_lexbuf lexbuf) ; snippetenv lexbuf} and read_lexbuf = parse | _ as lxm { Char.code lxm } | eof { -1 } (* Scheme characters are written as #\A or #\Newspace *) and schemecharacterenv = parse | command_name {let csname = lexeme lexbuf in Dest.put csname} | "" { () } (* Swallow characters until the end of the line. *) and skip_blanks_till_eol_included = parse | ' ' + {skip_blanks_till_eol_included lexbuf} | '\n' { () } | "" { () } (* Parse a succession of things separated by commas. *) and comma_separated_values = parse | [ ^ ',' ] * ',' {let lxm = lexeme lexbuf in let s = String.sub lxm 0 (String.length lxm - 1) in if !verbose > 2 then prerr_endline ("CSV" ^ s); s :: comma_separated_values lexbuf} | eof { [] } (* Trailer: Register local macros as global. *) { let caml_print s = CamlCode (fun _ -> Dest.put s) let snippet_def name d = Latexmacros.def name zero_pat (CamlCode d) let rec do_endsnippet _ = if !Lexstate.withinLispComment then begin endSnippetRead := true; raise (Misc.EndOfLispComment 0) end; if !Scan.cur_env = "snippet" then raise EndSnippet else raise (Misc.ScanError ("\\endsnippet without opening \\snippet")) and do_texinclusion lexbuf = Scan.top_open_block "SPAN" ("class=\"" ^ !snippetLanguage ^ "Inclusion\""); snippetRunHook Scan.main "BeforeTeX"; withinTeXInclusion := true; begin (* Until a \] is read *) try Scan.main lexbuf with | exc -> begin snippetRunHook Scan.main "AfterTeX"; Scan.top_close_block "SPAN"; snippetRunHook Scan.main "Restart"; (* Re-raise every thing but EndTeXInclusion *) try raise exc with | EndTeXInclusion -> () end; end ; and do_texexclusion _ = if !withinSnippet then begin if !verbose > 2 then prerr_endline "\\] caught within TeX escape"; withinTeXInclusion := false; raise EndTeXInclusion end else raise (Misc.ScanError ("\\] without opening \\[ in snippet")) and do_backslash_newline _ = Dest.put "\\\n"; Lexstate.scan_this snippetenv "\n" and do_four_backslashes _ = Dest.put "\\" (* HACK: Define a macro with a body that is obtained via substitution. This is a kind of restricted \edef as in TeX. Syntax: \@EDEF\macroName{#2#1..} *) and do_edef _lxm lexbuf = let name = Scan.get_csname lexbuf in let body = subst_arg lexbuf in if Scan.echo_toimage () then Image.put ("\\def"^name^"{"^body^"}\n") ; Latexmacros.def name zero_pat (caml_print body); () (* Syntax: \@MULEDEF{\macroName,\macroName,...}{#1#3...} This is an awful hack extending the \@EDEF command. It locally rebinds the (comma-separated) \macronames to the corresponding (comma-separated) expansion of second argument. All \macronames should be a zero-ary macro. *) and do_muledef lxm lexbuf = let names = subst_arg lexbuf in let bodies = subst_arg lexbuf in let rec bind lasti lastj = try let i = String.index_from names lasti ',' in try let j = String.index_from bodies lastj ',' in let name = String.sub names lasti (i - lasti) in let body = String.sub bodies lastj (j - lastj) in if !verbose > 2 then prerr_endline (lxm ^ name ^ ";" ^ body); Latexmacros.def name zero_pat (caml_print body); bind (i+1) (j+1) with Not_found -> failwith "Missing bodies for \\@MULEDEF" with Not_found -> let name = String.sub names lasti (String.length names - lasti) in let body = String.sub bodies lastj (String.length bodies - lastj) in if !verbose > 2 then prerr_endline (lxm ^ name ^ ";" ^ body); Latexmacros.def name zero_pat (caml_print body) ; in bind 0 0; () (* The command that starts the \snippet inner environment: *) and do_snippet lexbuf = if !withinSnippet then raise (Misc.ScanError "No snippet within snippet.") else begin (* Obtain the current TeX value of \snippetDefaultLanguage *) let snippetDefaultLanguage = "\\snippetDefaultLanguage" in let language = get_prim_opt snippetDefaultLanguage lexbuf in let language = if language = "" then snippetDefaultLanguage else language in skip_blanks_till_eol_included lexbuf; Dest.put "
\n"; Scan.top_open_block "DIV" ("class=\"div" ^ language ^ "\""); Dest.put "\n"; Scan.new_env "snippet"; (* Define commands local to \snippet *) snippet_def "\\endsnippet" do_endsnippet; snippet_def "\\[" do_texinclusion ; snippet_def "\\]" do_texexclusion ; snippet_def "\\\\" do_four_backslashes ; snippet_def "\\\n" do_backslash_newline ; snippetLanguage := language; enableLispComment := false; enableSchemeCharacters := false; withinSnippet := true; snippetRunHook Scan.main "Before"; try snippetenv lexbuf with exc -> begin snippetRunHook Scan.main "AfterLine"; snippetRunHook Scan.main "After"; withinSnippet := false; Scan.close_env "snippet"; Scan.top_close_block "DIV"; (* Re-raise all exceptions but EndSnippet *) try raise exc with EndSnippet -> () end; end and do_enable_backslashed_chars lexbuf = let def_echo s = snippet_def s (fun _ -> Dest.put s) in let chars = subst_arg lexbuf in begin if !verbose > 2 then prerr_endline ("\\enableBackslashedChar "^chars); for i=0 to (String.length chars - 1) do let charcommandname = "\\" ^ (String.sub chars i 1) in def_echo charcommandname; done; end; () and do_enableLispComment _lexbuf = enableLispComment := true; () and do_disableLispComment _lexbuf = enableLispComment := false; () and do_enableSchemeCharacters _lexbuf = enableSchemeCharacters := true; () and do_disableSchemeCharacters _lexbuf = enableSchemeCharacters := false; () and do_snippet_run_hook lexbuf = let name = subst_arg lexbuf in begin snippetRunHook Scan.main name; () end and do_snip_run_hook lexbuf = let name = subst_arg lexbuf in begin snipRunHook Scan.main name; () end (* These macros are defined in Caml since they are not nullary macros. They require some arguments but they cannot get them in the snippet environment. So I code them by hand. *) and do_vicanchor lexbuf = begin let {arg=style} = Lexstate.save_opt "" lexbuf in let {arg=nfn} = Lexstate.save_opt "0,filename,notename" lexbuf in let fields = comma_separated_values (MyLexing.from_list (nfn @ [","])) in match fields with | [number;filename;notename] -> begin let uniqueNumber = (* Would be better: truncate(Unix.gettimeofday()) *) increment_internal_counter() and hintId = compute_hint_id number filename notename in let style = String.concat "" style and nfn = String.concat "" nfn in Dest.put_tag (""); () end | _ -> failwith "Missing comma-separated arguments" end and do_vicendanchor lexbuf = begin let {arg=nfn} = Lexstate.save_opt "0,filename,notename" lexbuf in let nfn = String.concat "" nfn in if !verbose > 2 then prerr_endline ("\\vicendanchor"^nfn); let fields = comma_separated_values (MyLexing.from_string (nfn ^ ",")) in match fields with | [_number;_filename;_notename] -> begin Dest.put_tag (""); () end | _ -> failwith "Missing comma-separated arguments" end and do_vicindex lexbuf = begin let _nfn = Lexstate.save_opt "0,filename,notename" lexbuf in Dest.put_char ' '; () end ;; (* This is the initialization function of the plugin: *) let init = function () -> begin (* Register global TeX macros: *) def_code "\\snippet" do_snippet; def_name_code "\\@EDEF" do_edef; def_name_code "\\@MULEDEF" do_muledef; def_code "\\ViCEndAnchor" do_vicendanchor; def_code "\\ViCAnchor" do_vicanchor; def_code "\\ViCIndex" do_vicindex; def_code "\\enableLispComment" do_enableLispComment; def_code "\\disableLispComment" do_disableLispComment; def_code "\\enableSchemeCharacters" do_enableSchemeCharacters; def_code "\\disableSchemeCharacters" do_disableSchemeCharacters; def_code "\\enableBackslashedChars" do_enable_backslashed_chars; def_code "\\snippetRunHook" do_snippet_run_hook; def_code "\\snipRunHook" do_snip_run_hook; () end;; register_init "videoc" init ;; end} hevea-2.30/iso-text.hva0000644004317100512160000000105110507223111015015 0ustar marangetcristal\newcommand{\DeclareSymbol}[3][\@empty] {\newcommand{#2}{\@print@u{#3}}% \ifx#1\@empty\else\@def@u@default{#3}{#1}\fi} %This symbol does not appear in latin encoding -> direct text definition \newcommand{\DeclareSymbolHtml}[3][\@empty] {\ifx#1\@empty\else\newcommand{#2}{#1}\fi} \newcommand{\MakeBigSymbolHtml}[3][]{} \newcommand{\MakeBigSymbol}[5][] {\newcommand{#2}{\mathop{\ifdisplay#5\else#4\fi}#1}} \let\NewcommandHtml\NoCommand \let\NewcommandText\newcommand \let\RenewcommandHtml\NoCommand \let\RenewcommandText\renewcommand \input{iso-symb.hva} hevea-2.30/tagout.mli0000644004317100512160000000147212017660721014570 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* Erase tags (for title in hacha) *) exception Error val tagout : string -> string hevea-2.30/bookcommon.hva0000644004317100512160000000360610507223111015414 0ustar marangetcristal\setcounter {secnumdepth}{2} \newcounter {part} \newcounter {chapter} \newcounter {section}[chapter] \newcounter {subsection}[section] \newcounter {subsubsection}[subsection] \newcounter {paragraph}[subsubsection] \newcounter {subparagraph}[paragraph] \newcounter {footnote}[chapter] \newcounter {titlenote} \setenvclass{part}{part} \setenvclass{chapter}{chapter} \setenvclass{section}{section} \setenvclass{subsection}{subsection} \setenvclass{subsubsection}{subsubsection} \setenvclass{paragraph}{paragraph} \setenvclass{subparagraph}{subparagraph} \newcounter {anchornote} \renewcommand \theanchornote{{\@nostyle\arabic{chapter}.\arabic{anchornote}}} \renewcommand \thepart {\Roman{part}} \renewcommand \thesection {\thechapter.\arabic{section}} \renewcommand\thesubsection {\thesection.\arabic{subsection}} \renewcommand\thesubsubsection{\thesubsection.\arabic{subsubsection}} \renewcommand\theparagraph {\thesubsubsection.\arabic{paragraph}} \renewcommand\thesubparagraph {\theparagraph.\arabic{subparagraph}} \flushdef{chapter} \newcommand{\partname}{Part} \renewcommand{\chaptername}{Chapter} \newcommand{\appendixname}{Appendix} %%%%%%%%%%% Initial cutting \newcommand{\cuttingunit}{chapter} %%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\appendix}{% \renewcommand{\chaptername}{\appendixname}% \setcounter{chapter}{0}% \renewcommand{\thechapter}{\Alph{chapter}}} \newcounter{equation}[chapter] \renewcommand{\theequation}{\thechapter.\arabic{equation}} \newcounter{figure}[chapter] \renewcommand{\thefigure}{\thechapter.\arabic{figure}} \newcounter{table}[chapter] \renewcommand{\thetable}{\thechapter.\arabic{table}} \newcommand\abstractname{Abstract} \newenvironment{abstract}{\begin{quote}{\bf \abstractname: }}{\end{quote}} \newcommand{\@indexsection}[1]{\chapter*{#1}} \newcommand{\@bibliosection}[1]{\chapter*{#1}} \newcommand{\@tocsection}[1]{\chapter*{#1}} \newcommand{\@base}{book} \setcounter{tocdepth}{2} hevea-2.30/german-common.hva0000644004317100512160000000455210334123204016011 0ustar marangetcristal%%%% Hevea support for babel option 'german'. %%%% Support for %%%% a) date %%%% b) usual shorthands (\' \` \^ etc.) %%%% c) names of various part descriptors (contentsname etc.) %%%% d) \dq %%%% e) Different quotations marks (\glqq etc.) \@primitives{german} \newcommand{\common@common@german@babel}{ \renewcommand\prefacename{Vorwort}% \renewcommand\refname{Literatur}% \renewcommand\abstractname{Zusammenfassung}% \renewcommand\bibname{Literaturverzeichnis}% \renewcommand\chaptername{Kapitel}% \renewcommand\appendixname{Anhang}% \renewcommand\contentsname{Inhaltsverzeichnis}% \renewcommand\listfigurename{Abbildungsverzeichnis}% \renewcommand\listtablename{Tabellenverzeichnis}% \renewcommand\indexname{Index}% \renewcommand\figurename{Abbildung}% \renewcommand\tablename{Tabelle}% \renewcommand\partname{Teil}% \renewcommand\enclname{Anlage(n)}% \renewcommand\ccname{Verteiler}% \renewcommand\headtoname{An}% \renewcommand\pagename{Seite}% \renewcommand\headpagename{Siete}% \renewcommand\seename{siehe}% \renewcommand\alsoseename{siehe auch}% \renewcommand\dq{\@print{"}}% \catcode`\"=13\let\@hevea@dquote\@german@dquote% } \newcommand{\common@german@babel}{% \common@common@german@babel% \def\german@month {\ifthenelse{\value{month}=1}{Januar} {\ifthenelse{\value{month}=2}{Februar} {\ifthenelse{\value{month}=3}{M\"arz} {\ifthenelse{\value{month}=4}{April} {\ifthenelse{\value{month}=5}{Mai} {\ifthenelse{\value{month}=6}{Juni} {\ifthenelse{\value{month}=7}{Juli} {\ifthenelse{\value{month}=8}{August} {\ifthenelse{\value{month}=9}{September} {\ifthenelse{\value{month}=10}{Oktober} {\ifthenelse{\value{month}=11}{November} {\ifthenelse{\value{month}=12}{Dezember}{} }}}}}}}}}}}}% \renewcommand\today{\theday.~\german@month~\theyear}} %%% \newcommand{\common@austrian@babel}{% \def\austrian@month {\ifthenelse{\value{month}=1 }{J\"anner} {\ifthenelse{\value{month}=2 }{Februar} {\ifthenelse{\value{month}=3 }{M\"arz} {\ifthenelse{\value{month}=4 }{April} {\ifthenelse{\value{month}=5 }{Mai} {\ifthenelse{\value{month}=6 }{Juni} {\ifthenelse{\value{month}=7 }{Juli} {\ifthenelse{\value{month}=8 }{August} {\ifthenelse{\value{month}=9 }{September} {\ifthenelse{\value{month}=10}{Oktober} {\ifthenelse{\value{month}=11}{November} {\ifthenelse{\value{month}=12}{Dezember}{} }}}}}}}}}}}}% \renewcommand\today{\theday.~\austrian@month~\theyear}} hevea-2.30/util.ml0000644004317100512160000000404611763416753014104 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: util.ml,v 1.6 2012-06-05 14:55:39 maranget Exp $c *) (***********************************************************************) open Tree let rec do_cost ks ((k1,k2) as c) = function | Text _ | Blanks _ -> c | ONode (_,_,ts) -> let c1,c2 = c in do_costs ks (1+c1,c2) ts | Node (s,ts) -> let l1, l2 = ks s in do_costs ks (l1+k1, l2+k2) ts and do_costs ks k ts = List.fold_left (do_cost ks) k ts let cost ks t = do_cost ks (0,0) t and costs ks ts = do_costs ks (0,0) ts let cost_compare (tags1,fonts1) (tags2, fonts2) = if tags1 < tags2 then -1 else if tags1 > tags2 then 1 else if fonts1 < fonts2 then -1 else if fonts1 > fonts2 then 1 else 0 let there s l = List.exists (fun os -> Htmltext.same_style s os) l let inter s1 s2 = List.fold_left (fun r s -> if there s s2 then s::r else r) [] s1 let sub s1 s2 = List.fold_left (fun r s -> if there s s2 then r else s::r) [] s1 let union s1 s2 = List.fold_left (fun r s -> if there s r then r else s::r) s1 s2 let neutral s = List.partition Htmltext.blanksNeutral s let rec is_blank = function | Text _ -> false | Blanks _ -> true | Node (_,ts) | ONode (_,_,ts) -> is_blanks ts and is_blanks = function | [] -> true | t::ts -> is_blank t && is_blanks ts let nodes ss ts = match ss with | [] -> ts | _ -> [Node (ss,ts)] and node ss ts = Node (ss,ts) hevea-2.30/mappings/0000755004317100512160000000000013136046054014374 5ustar marangetcristalhevea-2.30/mappings/ISO-8859-8.map0000644004317100512160000000545410412520074016306 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA2 0x00A2 0xA3 0x00A3 0xA4 0x00A4 0xA5 0x00A5 0xA6 0x00A6 0xA7 0x00A7 0xA8 0x00A8 0xA9 0x00A9 0xAA 0x00D7 0xAB 0x00AB 0xAC 0x00AC 0xAD 0x00AD 0xAE 0x00AE 0xAF 0x00AF 0xB0 0x00B0 0xB1 0x00B1 0xB2 0x00B2 0xB3 0x00B3 0xB4 0x00B4 0xB5 0x00B5 0xB6 0x00B6 0xB7 0x00B7 0xB8 0x00B8 0xB9 0x00B9 0xBA 0x00F7 0xBB 0x00BB 0xBC 0x00BC 0xBD 0x00BD 0xBE 0x00BE 0xDF 0x2017 0xE0 0x05D0 0xE1 0x05D1 0xE2 0x05D2 0xE3 0x05D3 0xE4 0x05D4 0xE5 0x05D5 0xE6 0x05D6 0xE7 0x05D7 0xE8 0x05D8 0xE9 0x05D9 0xEA 0x05DA 0xEB 0x05DB 0xEC 0x05DC 0xED 0x05DD 0xEE 0x05DE 0xEF 0x05DF 0xF0 0x05E0 0xF1 0x05E1 0xF2 0x05E2 0xF3 0x05E3 0xF4 0x05E4 0xF5 0x05E5 0xF6 0x05E6 0xF7 0x05E7 0xF8 0x05E8 0xF9 0x05E9 0xFA 0x05EA 0xFD 0x200E 0xFE 0x200F hevea-2.30/mappings/ISO-8859-7.map0000644004317100512160000000633110412520074016300 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x2018 0xA2 0x2019 0xA3 0x00A3 0xA4 0x20AC 0xA5 0x20AF 0xA6 0x00A6 0xA7 0x00A7 0xA8 0x00A8 0xA9 0x00A9 0xAA 0x037A 0xAB 0x00AB 0xAC 0x00AC 0xAD 0x00AD 0xAF 0x2015 0xB0 0x00B0 0xB1 0x00B1 0xB2 0x00B2 0xB3 0x00B3 0xB4 0x0384 0xB5 0x0385 0xB6 0x0386 0xB7 0x00B7 0xB8 0x0388 0xB9 0x0389 0xBA 0x038A 0xBB 0x00BB 0xBC 0x038C 0xBD 0x00BD 0xBE 0x038E 0xBF 0x038F 0xC0 0x0390 0xC1 0x0391 0xC2 0x0392 0xC3 0x0393 0xC4 0x0394 0xC5 0x0395 0xC6 0x0396 0xC7 0x0397 0xC8 0x0398 0xC9 0x0399 0xCA 0x039A 0xCB 0x039B 0xCC 0x039C 0xCD 0x039D 0xCE 0x039E 0xCF 0x039F 0xD0 0x03A0 0xD1 0x03A1 0xD3 0x03A3 0xD4 0x03A4 0xD5 0x03A5 0xD6 0x03A6 0xD7 0x03A7 0xD8 0x03A8 0xD9 0x03A9 0xDA 0x03AA 0xDB 0x03AB 0xDC 0x03AC 0xDD 0x03AD 0xDE 0x03AE 0xDF 0x03AF 0xE0 0x03B0 0xE1 0x03B1 0xE2 0x03B2 0xE3 0x03B3 0xE4 0x03B4 0xE5 0x03B5 0xE6 0x03B6 0xE7 0x03B7 0xE8 0x03B8 0xE9 0x03B9 0xEA 0x03BA 0xEB 0x03BB 0xEC 0x03BC 0xED 0x03BD 0xEE 0x03BE 0xEF 0x03BF 0xF0 0x03C0 0xF1 0x03C1 0xF2 0x03C2 0xF3 0x03C3 0xF4 0x03C4 0xF5 0x03C5 0xF6 0x03C6 0xF7 0x03C7 0xF8 0x03C8 0xF9 0x03C9 0xFA 0x03CA 0xFB 0x03CB 0xFC 0x03CC 0xFD 0x03CD 0xFE 0x03CE hevea-2.30/mappings/KOI8-R.map0000644004317100512160000000600010544514432016000 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x2500 0x81 0x2502 0x82 0x250C 0x83 0x2510 0x84 0x2514 0x85 0x2518 0x86 0x251C 0x87 0x2524 0x88 0x252C 0x89 0x2534 0x8A 0x253C 0x8B 0x2580 0x8C 0x2584 0x8D 0x2588 0x8E 0x258C 0x8F 0x2590 0x90 0x2591 0x91 0x2592 0x92 0x2593 0x93 0x2320 0x94 0x25A0 0x95 0x2219 0x96 0x221A 0x97 0x2248 0x98 0x2264 0x99 0x2265 0x9A 0x00A0 0x9B 0x2321 0x9C 0x00B0 0x9D 0x00B2 0x9E 0x00B7 0x9F 0x00F7 0xA0 0x2550 0xA1 0x2551 0xA2 0x2552 0xA3 0x0451 0xA4 0x2553 0xA5 0x2554 0xA6 0x2555 0xA7 0x2556 0xA8 0x2557 0xA9 0x2558 0xAA 0x2559 0xAB 0x255A 0xAC 0x255B 0xAD 0x255C 0xAE 0x255D 0xAF 0x255E 0xB0 0x255F 0xB1 0x2560 0xB2 0x2561 0xB3 0x0401 0xB4 0x2562 0xB5 0x2563 0xB6 0x2564 0xB7 0x2565 0xB8 0x2566 0xB9 0x2567 0xBA 0x2568 0xBB 0x2569 0xBC 0x256A 0xBD 0x256B 0xBE 0x256C 0xBF 0x00A9 0xC0 0x044E 0xC1 0x0430 0xC2 0x0431 0xC3 0x0446 0xC4 0x0434 0xC5 0x0435 0xC6 0x0444 0xC7 0x0433 0xC8 0x0445 0xC9 0x0438 0xCA 0x0439 0xCB 0x043A 0xCC 0x043B 0xCD 0x043C 0xCE 0x043D 0xCF 0x043E 0xD0 0x043F 0xD1 0x044F 0xD2 0x0440 0xD3 0x0441 0xD4 0x0442 0xD5 0x0443 0xD6 0x0436 0xD7 0x0432 0xD8 0x044C 0xD9 0x044B 0xDA 0x0437 0xDB 0x0448 0xDC 0x044D 0xDD 0x0449 0xDE 0x0447 0xDF 0x044A 0xE0 0x042E 0xE1 0x0410 0xE2 0x0411 0xE3 0x0426 0xE4 0x0414 0xE5 0x0415 0xE6 0x0424 0xE7 0x0413 0xE8 0x0425 0xE9 0x0418 0xEA 0x0419 0xEB 0x041A 0xEC 0x041B 0xED 0x041C 0xEE 0x041D 0xEF 0x041E 0xF0 0x041F 0xF1 0x042F 0xF2 0x0420 0xF3 0x0421 0xF4 0x0422 0xF5 0x0423 0xF6 0x0416 0xF7 0x0412 0xF8 0x042C 0xF9 0x042B 0xFA 0x0417 0xFB 0x0428 0xFC 0x042D 0xFD 0x0429 0xFE 0x0427 0xFF 0x042A hevea-2.30/mappings/ISO-8859-5.map0000644004317100512160000000640010412520074016273 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x0401 0xA2 0x0402 0xA3 0x0403 0xA4 0x0404 0xA5 0x0405 0xA6 0x0406 0xA7 0x0407 0xA8 0x0408 0xA9 0x0409 0xAA 0x040A 0xAB 0x040B 0xAC 0x040C 0xAD 0x00AD 0xAE 0x040E 0xAF 0x040F 0xB0 0x0410 0xB1 0x0411 0xB2 0x0412 0xB3 0x0413 0xB4 0x0414 0xB5 0x0415 0xB6 0x0416 0xB7 0x0417 0xB8 0x0418 0xB9 0x0419 0xBA 0x041A 0xBB 0x041B 0xBC 0x041C 0xBD 0x041D 0xBE 0x041E 0xBF 0x041F 0xC0 0x0420 0xC1 0x0421 0xC2 0x0422 0xC3 0x0423 0xC4 0x0424 0xC5 0x0425 0xC6 0x0426 0xC7 0x0427 0xC8 0x0428 0xC9 0x0429 0xCA 0x042A 0xCB 0x042B 0xCC 0x042C 0xCD 0x042D 0xCE 0x042E 0xCF 0x042F 0xD0 0x0430 0xD1 0x0431 0xD2 0x0432 0xD3 0x0433 0xD4 0x0434 0xD5 0x0435 0xD6 0x0436 0xD7 0x0437 0xD8 0x0438 0xD9 0x0439 0xDA 0x043A 0xDB 0x043B 0xDC 0x043C 0xDD 0x043D 0xDE 0x043E 0xDF 0x043F 0xE0 0x0440 0xE1 0x0441 0xE2 0x0442 0xE3 0x0443 0xE4 0x0444 0xE5 0x0445 0xE6 0x0446 0xE7 0x0447 0xE8 0x0448 0xE9 0x0449 0xEA 0x044A 0xEB 0x044B 0xEC 0x044C 0xED 0x044D 0xEE 0x044E 0xEF 0x044F 0xF0 0x2116 0xF1 0x0451 0xF2 0x0452 0xF3 0x0453 0xF4 0x0454 0xF5 0x0455 0xF6 0x0456 0xF7 0x0457 0xF8 0x0458 0xF9 0x0459 0xFA 0x045A 0xFB 0x045B 0xFC 0x045C 0xFD 0x00A7 0xFE 0x045E 0xFF 0x045F hevea-2.30/mappings/ISO-8859-1.map0000644004317100512160000000600010507243763016277 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x00A1 0xA2 0x00A2 0xA3 0x00A3 0xA4 0x00A4 0xA5 0x00A5 0xA6 0x00A6 0xA7 0x00A7 0xA8 0x00A8 0xA9 0x00A9 0xAA 0x00AA 0xAB 0x00AB 0xAC 0x00AC 0xAD 0x00AD 0xAE 0x00AE 0xAF 0x00AF 0xB0 0x00B0 0xB1 0x00B1 0xB2 0x00B2 0xB3 0x00B3 0xB4 0x00B4 0xB5 0x00B5 0xB6 0x00B6 0xB7 0x00B7 0xB8 0x00B8 0xB9 0x00B9 0xBA 0x00BA 0xBB 0x00BB 0xBC 0x00BC 0xBD 0x00BD 0xBE 0x00BE 0xBF 0x00BF 0xC0 0x00C0 0xC1 0x00C1 0xC2 0x00C2 0xC3 0x00C3 0xC4 0x00C4 0xC5 0x00C5 0xC6 0x00C6 0xC7 0x00C7 0xC8 0x00C8 0xC9 0x00C9 0xCA 0x00CA 0xCB 0x00CB 0xCC 0x00CC 0xCD 0x00CD 0xCE 0x00CE 0xCF 0x00CF 0xD0 0x00D0 0xD1 0x00D1 0xD2 0x00D2 0xD3 0x00D3 0xD4 0x00D4 0xD5 0x00D5 0xD6 0x00D6 0xD7 0x00D7 0xD8 0x00D8 0xD9 0x00D9 0xDA 0x00DA 0xDB 0x00DB 0xDC 0x00DC 0xDD 0x00DD 0xDE 0x00DE 0xDF 0x00DF 0xE0 0x00E0 0xE1 0x00E1 0xE2 0x00E2 0xE3 0x00E3 0xE4 0x00E4 0xE5 0x00E5 0xE6 0x00E6 0xE7 0x00E7 0xE8 0x00E8 0xE9 0x00E9 0xEA 0x00EA 0xEB 0x00EB 0xEC 0x00EC 0xED 0x00ED 0xEE 0x00EE 0xEF 0x00EF 0xF0 0x00F0 0xF1 0x00F1 0xF2 0x00F2 0xF3 0x00F3 0xF4 0x00F4 0xF5 0x00F5 0xF6 0x00F6 0xF7 0x00F7 0xF8 0x00F8 0xF9 0x00F9 0xFA 0x00FA 0xFB 0x00FB 0xFC 0x00FC 0xFD 0x00FD 0xFE 0x00FE 0xFF 0x00FF hevea-2.30/mappings/ISO-8859-13.map0000644004317100512160000000640010412520074016352 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x201D 0xA2 0x00A2 0xA3 0x00A3 0xA4 0x00A4 0xA5 0x201E 0xA6 0x00A6 0xA7 0x00A7 0xA8 0x00D8 0xA9 0x00A9 0xAA 0x0156 0xAB 0x00AB 0xAC 0x00AC 0xAD 0x00AD 0xAE 0x00AE 0xAF 0x00C6 0xB0 0x00B0 0xB1 0x00B1 0xB2 0x00B2 0xB3 0x00B3 0xB4 0x201C 0xB5 0x00B5 0xB6 0x00B6 0xB7 0x00B7 0xB8 0x00F8 0xB9 0x00B9 0xBA 0x0157 0xBB 0x00BB 0xBC 0x00BC 0xBD 0x00BD 0xBE 0x00BE 0xBF 0x00E6 0xC0 0x0104 0xC1 0x012E 0xC2 0x0100 0xC3 0x0106 0xC4 0x00C4 0xC5 0x00C5 0xC6 0x0118 0xC7 0x0112 0xC8 0x010C 0xC9 0x00C9 0xCA 0x0179 0xCB 0x0116 0xCC 0x0122 0xCD 0x0136 0xCE 0x012A 0xCF 0x013B 0xD0 0x0160 0xD1 0x0143 0xD2 0x0145 0xD3 0x00D3 0xD4 0x014C 0xD5 0x00D5 0xD6 0x00D6 0xD7 0x00D7 0xD8 0x0172 0xD9 0x0141 0xDA 0x015A 0xDB 0x016A 0xDC 0x00DC 0xDD 0x017B 0xDE 0x017D 0xDF 0x00DF 0xE0 0x0105 0xE1 0x012F 0xE2 0x0101 0xE3 0x0107 0xE4 0x00E4 0xE5 0x00E5 0xE6 0x0119 0xE7 0x0113 0xE8 0x010D 0xE9 0x00E9 0xEA 0x017A 0xEB 0x0117 0xEC 0x0123 0xED 0x0137 0xEE 0x012B 0xEF 0x013C 0xF0 0x0161 0xF1 0x0144 0xF2 0x0146 0xF3 0x00F3 0xF4 0x014D 0xF5 0x00F5 0xF6 0x00F6 0xF7 0x00F7 0xF8 0x0173 0xF9 0x0142 0xFA 0x015B 0xFB 0x016B 0xFC 0x00FC 0xFD 0x017C 0xFE 0x017E 0xFF 0x2019 hevea-2.30/mappings/ISO-8859-15.map0000644004317100512160000000640010412520074016354 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x00A1 0xA2 0x00A2 0xA3 0x00A3 0xA4 0x20AC 0xA5 0x00A5 0xA6 0x0160 0xA7 0x00A7 0xA8 0x0161 0xA9 0x00A9 0xAA 0x00AA 0xAB 0x00AB 0xAC 0x00AC 0xAD 0x00AD 0xAE 0x00AE 0xAF 0x00AF 0xB0 0x00B0 0xB1 0x00B1 0xB2 0x00B2 0xB3 0x00B3 0xB4 0x017D 0xB5 0x00B5 0xB6 0x00B6 0xB7 0x00B7 0xB8 0x017E 0xB9 0x00B9 0xBA 0x00BA 0xBB 0x00BB 0xBC 0x0152 0xBD 0x0153 0xBE 0x0178 0xBF 0x00BF 0xC0 0x00C0 0xC1 0x00C1 0xC2 0x00C2 0xC3 0x00C3 0xC4 0x00C4 0xC5 0x00C5 0xC6 0x00C6 0xC7 0x00C7 0xC8 0x00C8 0xC9 0x00C9 0xCA 0x00CA 0xCB 0x00CB 0xCC 0x00CC 0xCD 0x00CD 0xCE 0x00CE 0xCF 0x00CF 0xD0 0x00D0 0xD1 0x00D1 0xD2 0x00D2 0xD3 0x00D3 0xD4 0x00D4 0xD5 0x00D5 0xD6 0x00D6 0xD7 0x00D7 0xD8 0x00D8 0xD9 0x00D9 0xDA 0x00DA 0xDB 0x00DB 0xDC 0x00DC 0xDD 0x00DD 0xDE 0x00DE 0xDF 0x00DF 0xE0 0x00E0 0xE1 0x00E1 0xE2 0x00E2 0xE3 0x00E3 0xE4 0x00E4 0xE5 0x00E5 0xE6 0x00E6 0xE7 0x00E7 0xE8 0x00E8 0xE9 0x00E9 0xEA 0x00EA 0xEB 0x00EB 0xEC 0x00EC 0xED 0x00ED 0xEE 0x00EE 0xEF 0x00EF 0xF0 0x00F0 0xF1 0x00F1 0xF2 0x00F2 0xF3 0x00F3 0xF4 0x00F4 0xF5 0x00F5 0xF6 0x00F6 0xF7 0x00F7 0xF8 0x00F8 0xF9 0x00F9 0xFA 0x00FA 0xFB 0x00FB 0xFC 0x00FC 0xFD 0x00FD 0xFE 0x00FE 0xFF 0x00FF hevea-2.30/mappings/ISO-8859-9.map0000644004317100512160000000640010412520074016277 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x00A1 0xA2 0x00A2 0xA3 0x00A3 0xA4 0x00A4 0xA5 0x00A5 0xA6 0x00A6 0xA7 0x00A7 0xA8 0x00A8 0xA9 0x00A9 0xAA 0x00AA 0xAB 0x00AB 0xAC 0x00AC 0xAD 0x00AD 0xAE 0x00AE 0xAF 0x00AF 0xB0 0x00B0 0xB1 0x00B1 0xB2 0x00B2 0xB3 0x00B3 0xB4 0x00B4 0xB5 0x00B5 0xB6 0x00B6 0xB7 0x00B7 0xB8 0x00B8 0xB9 0x00B9 0xBA 0x00BA 0xBB 0x00BB 0xBC 0x00BC 0xBD 0x00BD 0xBE 0x00BE 0xBF 0x00BF 0xC0 0x00C0 0xC1 0x00C1 0xC2 0x00C2 0xC3 0x00C3 0xC4 0x00C4 0xC5 0x00C5 0xC6 0x00C6 0xC7 0x00C7 0xC8 0x00C8 0xC9 0x00C9 0xCA 0x00CA 0xCB 0x00CB 0xCC 0x00CC 0xCD 0x00CD 0xCE 0x00CE 0xCF 0x00CF 0xD0 0x011E 0xD1 0x00D1 0xD2 0x00D2 0xD3 0x00D3 0xD4 0x00D4 0xD5 0x00D5 0xD6 0x00D6 0xD7 0x00D7 0xD8 0x00D8 0xD9 0x00D9 0xDA 0x00DA 0xDB 0x00DB 0xDC 0x00DC 0xDD 0x0130 0xDE 0x015E 0xDF 0x00DF 0xE0 0x00E0 0xE1 0x00E1 0xE2 0x00E2 0xE3 0x00E3 0xE4 0x00E4 0xE5 0x00E5 0xE6 0x00E6 0xE7 0x00E7 0xE8 0x00E8 0xE9 0x00E9 0xEA 0x00EA 0xEB 0x00EB 0xEC 0x00EC 0xED 0x00ED 0xEE 0x00EE 0xEF 0x00EF 0xF0 0x011F 0xF1 0x00F1 0xF2 0x00F2 0xF3 0x00F3 0xF4 0x00F4 0xF5 0x00F5 0xF6 0x00F6 0xF7 0x00F7 0xF8 0x00F8 0xF9 0x00F9 0xFA 0x00FA 0xFB 0x00FB 0xFC 0x00FC 0xFD 0x0131 0xFE 0x015F 0xFF 0x00FF hevea-2.30/mappings/ISO-8859-2.map0000644004317100512160000000640010412520074016270 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x0104 0xA2 0x02D8 0xA3 0x0141 0xA4 0x00A4 0xA5 0x013D 0xA6 0x015A 0xA7 0x00A7 0xA8 0x00A8 0xA9 0x0160 0xAA 0x015E 0xAB 0x0164 0xAC 0x0179 0xAD 0x00AD 0xAE 0x017D 0xAF 0x017B 0xB0 0x00B0 0xB1 0x0105 0xB2 0x02DB 0xB3 0x0142 0xB4 0x00B4 0xB5 0x013E 0xB6 0x015B 0xB7 0x02C7 0xB8 0x00B8 0xB9 0x0161 0xBA 0x015F 0xBB 0x0165 0xBC 0x017A 0xBD 0x02DD 0xBE 0x017E 0xBF 0x017C 0xC0 0x0154 0xC1 0x00C1 0xC2 0x00C2 0xC3 0x0102 0xC4 0x00C4 0xC5 0x0139 0xC6 0x0106 0xC7 0x00C7 0xC8 0x010C 0xC9 0x00C9 0xCA 0x0118 0xCB 0x00CB 0xCC 0x011A 0xCD 0x00CD 0xCE 0x00CE 0xCF 0x010E 0xD0 0x0110 0xD1 0x0143 0xD2 0x0147 0xD3 0x00D3 0xD4 0x00D4 0xD5 0x0150 0xD6 0x00D6 0xD7 0x00D7 0xD8 0x0158 0xD9 0x016E 0xDA 0x00DA 0xDB 0x0170 0xDC 0x00DC 0xDD 0x00DD 0xDE 0x0162 0xDF 0x00DF 0xE0 0x0155 0xE1 0x00E1 0xE2 0x00E2 0xE3 0x0103 0xE4 0x00E4 0xE5 0x013A 0xE6 0x0107 0xE7 0x00E7 0xE8 0x010D 0xE9 0x00E9 0xEA 0x0119 0xEB 0x00EB 0xEC 0x011B 0xED 0x00ED 0xEE 0x00EE 0xEF 0x010F 0xF0 0x0111 0xF1 0x0144 0xF2 0x0148 0xF3 0x00F3 0xF4 0x00F4 0xF5 0x0151 0xF6 0x00F6 0xF7 0x00F7 0xF8 0x0159 0xF9 0x016F 0xFA 0x00FA 0xFB 0x0171 0xFC 0x00FC 0xFD 0x00FD 0xFE 0x0163 0xFF 0x02D9 hevea-2.30/mappings/US-ASCII.map0000644004317100512160000000320010412520074016234 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F hevea-2.30/mappings/ISO-8859-14.map0000644004317100512160000000640010412520074016353 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x1E02 0xA2 0x1E03 0xA3 0x00A3 0xA4 0x010A 0xA5 0x010B 0xA6 0x1E0A 0xA7 0x00A7 0xA8 0x1E80 0xA9 0x00A9 0xAA 0x1E82 0xAB 0x1E0B 0xAC 0x1EF2 0xAD 0x00AD 0xAE 0x00AE 0xAF 0x0178 0xB0 0x1E1E 0xB1 0x1E1F 0xB2 0x0120 0xB3 0x0121 0xB4 0x1E40 0xB5 0x1E41 0xB6 0x00B6 0xB7 0x1E56 0xB8 0x1E81 0xB9 0x1E57 0xBA 0x1E83 0xBB 0x1E60 0xBC 0x1EF3 0xBD 0x1E84 0xBE 0x1E85 0xBF 0x1E61 0xC0 0x00C0 0xC1 0x00C1 0xC2 0x00C2 0xC3 0x00C3 0xC4 0x00C4 0xC5 0x00C5 0xC6 0x00C6 0xC7 0x00C7 0xC8 0x00C8 0xC9 0x00C9 0xCA 0x00CA 0xCB 0x00CB 0xCC 0x00CC 0xCD 0x00CD 0xCE 0x00CE 0xCF 0x00CF 0xD0 0x0174 0xD1 0x00D1 0xD2 0x00D2 0xD3 0x00D3 0xD4 0x00D4 0xD5 0x00D5 0xD6 0x00D6 0xD7 0x1E6A 0xD8 0x00D8 0xD9 0x00D9 0xDA 0x00DA 0xDB 0x00DB 0xDC 0x00DC 0xDD 0x00DD 0xDE 0x0176 0xDF 0x00DF 0xE0 0x00E0 0xE1 0x00E1 0xE2 0x00E2 0xE3 0x00E3 0xE4 0x00E4 0xE5 0x00E5 0xE6 0x00E6 0xE7 0x00E7 0xE8 0x00E8 0xE9 0x00E9 0xEA 0x00EA 0xEB 0x00EB 0xEC 0x00EC 0xED 0x00ED 0xEE 0x00EE 0xEF 0x00EF 0xF0 0x0175 0xF1 0x00F1 0xF2 0x00F2 0xF3 0x00F3 0xF4 0x00F4 0xF5 0x00F5 0xF6 0x00F6 0xF7 0x1E6B 0xF8 0x00F8 0xF9 0x00F9 0xFA 0x00FA 0xFB 0x00FB 0xFC 0x00FC 0xFD 0x00FD 0xFE 0x0177 0xFF 0x00FF hevea-2.30/mappings/ISO-8859-4.map0000644004317100512160000000640010412520074016272 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x0104 0xA2 0x0138 0xA3 0x0156 0xA4 0x00A4 0xA5 0x0128 0xA6 0x013B 0xA7 0x00A7 0xA8 0x00A8 0xA9 0x0160 0xAA 0x0112 0xAB 0x0122 0xAC 0x0166 0xAD 0x00AD 0xAE 0x017D 0xAF 0x00AF 0xB0 0x00B0 0xB1 0x0105 0xB2 0x02DB 0xB3 0x0157 0xB4 0x00B4 0xB5 0x0129 0xB6 0x013C 0xB7 0x02C7 0xB8 0x00B8 0xB9 0x0161 0xBA 0x0113 0xBB 0x0123 0xBC 0x0167 0xBD 0x014A 0xBE 0x017E 0xBF 0x014B 0xC0 0x0100 0xC1 0x00C1 0xC2 0x00C2 0xC3 0x00C3 0xC4 0x00C4 0xC5 0x00C5 0xC6 0x00C6 0xC7 0x012E 0xC8 0x010C 0xC9 0x00C9 0xCA 0x0118 0xCB 0x00CB 0xCC 0x0116 0xCD 0x00CD 0xCE 0x00CE 0xCF 0x012A 0xD0 0x0110 0xD1 0x0145 0xD2 0x014C 0xD3 0x0136 0xD4 0x00D4 0xD5 0x00D5 0xD6 0x00D6 0xD7 0x00D7 0xD8 0x00D8 0xD9 0x0172 0xDA 0x00DA 0xDB 0x00DB 0xDC 0x00DC 0xDD 0x0168 0xDE 0x016A 0xDF 0x00DF 0xE0 0x0101 0xE1 0x00E1 0xE2 0x00E2 0xE3 0x00E3 0xE4 0x00E4 0xE5 0x00E5 0xE6 0x00E6 0xE7 0x012F 0xE8 0x010D 0xE9 0x00E9 0xEA 0x0119 0xEB 0x00EB 0xEC 0x0117 0xED 0x00ED 0xEE 0x00EE 0xEF 0x012B 0xF0 0x0111 0xF1 0x0146 0xF2 0x014D 0xF3 0x0137 0xF4 0x00F4 0xF5 0x00F5 0xF6 0x00F6 0xF7 0x00F7 0xF8 0x00F8 0xF9 0x0173 0xFA 0x00FA 0xFB 0x00FB 0xFC 0x00FC 0xFD 0x0169 0xFE 0x016B 0xFF 0x02D9 hevea-2.30/mappings/windows-1252.map0000644004317100512160000000570410547475266017200 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x20AC 0x82 0x201A 0x83 0x0192 0x84 0x201E 0x85 0x2026 0x86 0x2020 0x87 0x2021 0x88 0x02C6 0x89 0x2030 0x8A 0x0160 0x8B 0x2039 0x8C 0x0152 0x8E 0x017D 0x91 0x2018 0x92 0x2019 0x93 0x201C 0x94 0x201D 0x95 0x2022 0x96 0x2013 0x97 0x2014 0x98 0x02DC 0x99 0x2122 0x9A 0x0161 0x9B 0x203A 0x9C 0x0153 0x9E 0x017E 0x9F 0x0178 0xA0 0x00A0 0xA1 0x00A1 0xA2 0x00A2 0xA3 0x00A3 0xA4 0x00A4 0xA5 0x00A5 0xA6 0x00A6 0xA7 0x00A7 0xA8 0x00A8 0xA9 0x00A9 0xAA 0x00AA 0xAB 0x00AB 0xAC 0x00AC 0xAD 0x00AD 0xAE 0x00AE 0xAF 0x00AF 0xB0 0x00B0 0xB1 0x00B1 0xB2 0x00B2 0xB3 0x00B3 0xB4 0x00B4 0xB5 0x00B5 0xB6 0x00B6 0xB7 0x00B7 0xB8 0x00B8 0xB9 0x00B9 0xBA 0x00BA 0xBB 0x00BB 0xBC 0x00BC 0xBD 0x00BD 0xBE 0x00BE 0xBF 0x00BF 0xC0 0x00C0 0xC1 0x00C1 0xC2 0x00C2 0xC3 0x00C3 0xC4 0x00C4 0xC5 0x00C5 0xC6 0x00C6 0xC7 0x00C7 0xC8 0x00C8 0xC9 0x00C9 0xCA 0x00CA 0xCB 0x00CB 0xCC 0x00CC 0xCD 0x00CD 0xCE 0x00CE 0xCF 0x00CF 0xD0 0x00D0 0xD1 0x00D1 0xD2 0x00D2 0xD3 0x00D3 0xD4 0x00D4 0xD5 0x00D5 0xD6 0x00D6 0xD7 0x00D7 0xD8 0x00D8 0xD9 0x00D9 0xDA 0x00DA 0xDB 0x00DB 0xDC 0x00DC 0xDD 0x00DD 0xDE 0x00DE 0xDF 0x00DF 0xE0 0x00E0 0xE1 0x00E1 0xE2 0x00E2 0xE3 0x00E3 0xE4 0x00E4 0xE5 0x00E5 0xE6 0x00E6 0xE7 0x00E7 0xE8 0x00E8 0xE9 0x00E9 0xEA 0x00EA 0xEB 0x00EB 0xEC 0x00EC 0xED 0x00ED 0xEE 0x00EE 0xEF 0x00EF 0xF0 0x00F0 0xF1 0x00F1 0xF2 0x00F2 0xF3 0x00F3 0xF4 0x00F4 0xF5 0x00F5 0xF6 0x00F6 0xF7 0x00F7 0xF8 0x00F8 0xF9 0x00F9 0xFA 0x00FA 0xFB 0x00FB 0xFC 0x00FC 0xFD 0x00FD 0xFE 0x00FE 0xFF 0x00FF hevea-2.30/mappings/windows-1250.map0000644004317100512160000000570410547475266017176 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x20AC 0x82 0x201A 0x84 0x201E 0x85 0x2026 0x86 0x2020 0x87 0x2021 0x89 0x2030 0x8A 0x0160 0x8B 0x2039 0x8C 0x015A 0x8D 0x0164 0x8E 0x017D 0x8F 0x0179 0x91 0x2018 0x92 0x2019 0x93 0x201C 0x94 0x201D 0x95 0x2022 0x96 0x2013 0x97 0x2014 0x99 0x2122 0x9A 0x0161 0x9B 0x203A 0x9C 0x015B 0x9D 0x0165 0x9E 0x017E 0x9F 0x017A 0xA0 0x00A0 0xA1 0x02C7 0xA2 0x02D8 0xA3 0x0141 0xA4 0x00A4 0xA5 0x0104 0xA6 0x00A6 0xA7 0x00A7 0xA8 0x00A8 0xA9 0x00A9 0xAA 0x015E 0xAB 0x00AB 0xAC 0x00AC 0xAD 0x00AD 0xAE 0x00AE 0xAF 0x017B 0xB0 0x00B0 0xB1 0x00B1 0xB2 0x02DB 0xB3 0x0142 0xB4 0x00B4 0xB5 0x00B5 0xB6 0x00B6 0xB7 0x00B7 0xB8 0x00B8 0xB9 0x0105 0xBA 0x015F 0xBB 0x00BB 0xBC 0x013D 0xBD 0x02DD 0xBE 0x013E 0xBF 0x017C 0xC0 0x0154 0xC1 0x00C1 0xC2 0x00C2 0xC3 0x0102 0xC4 0x00C4 0xC5 0x0139 0xC6 0x0106 0xC7 0x00C7 0xC8 0x010C 0xC9 0x00C9 0xCA 0x0118 0xCB 0x00CB 0xCC 0x011A 0xCD 0x00CD 0xCE 0x00CE 0xCF 0x010E 0xD0 0x0110 0xD1 0x0143 0xD2 0x0147 0xD3 0x00D3 0xD4 0x00D4 0xD5 0x0150 0xD6 0x00D6 0xD7 0x00D7 0xD8 0x0158 0xD9 0x016E 0xDA 0x00DA 0xDB 0x0170 0xDC 0x00DC 0xDD 0x00DD 0xDE 0x0162 0xDF 0x00DF 0xE0 0x0155 0xE1 0x00E1 0xE2 0x00E2 0xE3 0x0103 0xE4 0x00E4 0xE5 0x013A 0xE6 0x0107 0xE7 0x00E7 0xE8 0x010D 0xE9 0x00E9 0xEA 0x0119 0xEB 0x00EB 0xEC 0x011B 0xED 0x00ED 0xEE 0x00EE 0xEF 0x010F 0xF0 0x0111 0xF1 0x0144 0xF2 0x0148 0xF3 0x00F3 0xF4 0x00F4 0xF5 0x0151 0xF6 0x00F6 0xF7 0x00F7 0xF8 0x0159 0xF9 0x016F 0xFA 0x00FA 0xFB 0x0171 0xFC 0x00FC 0xFD 0x00FD 0xFE 0x0163 0xFF 0x02D9 hevea-2.30/mappings/ISO-8859-10.map0000644004317100512160000000640010412520074016347 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x0104 0xA2 0x0112 0xA3 0x0122 0xA4 0x012A 0xA5 0x0128 0xA6 0x0136 0xA7 0x00A7 0xA8 0x013B 0xA9 0x0110 0xAA 0x0160 0xAB 0x0166 0xAC 0x017D 0xAD 0x00AD 0xAE 0x016A 0xAF 0x014A 0xB0 0x00B0 0xB1 0x0105 0xB2 0x0113 0xB3 0x0123 0xB4 0x012B 0xB5 0x0129 0xB6 0x0137 0xB7 0x00B7 0xB8 0x013C 0xB9 0x0111 0xBA 0x0161 0xBB 0x0167 0xBC 0x017E 0xBD 0x2015 0xBE 0x016B 0xBF 0x014B 0xC0 0x0100 0xC1 0x00C1 0xC2 0x00C2 0xC3 0x00C3 0xC4 0x00C4 0xC5 0x00C5 0xC6 0x00C6 0xC7 0x012E 0xC8 0x010C 0xC9 0x00C9 0xCA 0x0118 0xCB 0x00CB 0xCC 0x0116 0xCD 0x00CD 0xCE 0x00CE 0xCF 0x00CF 0xD0 0x00D0 0xD1 0x0145 0xD2 0x014C 0xD3 0x00D3 0xD4 0x00D4 0xD5 0x00D5 0xD6 0x00D6 0xD7 0x0168 0xD8 0x00D8 0xD9 0x0172 0xDA 0x00DA 0xDB 0x00DB 0xDC 0x00DC 0xDD 0x00DD 0xDE 0x00DE 0xDF 0x00DF 0xE0 0x0101 0xE1 0x00E1 0xE2 0x00E2 0xE3 0x00E3 0xE4 0x00E4 0xE5 0x00E5 0xE6 0x00E6 0xE7 0x012F 0xE8 0x010D 0xE9 0x00E9 0xEA 0x0119 0xEB 0x00EB 0xEC 0x0117 0xED 0x00ED 0xEE 0x00EE 0xEF 0x00EF 0xF0 0x00F0 0xF1 0x0146 0xF2 0x014D 0xF3 0x00F3 0xF4 0x00F4 0xF5 0x00F5 0xF6 0x00F6 0xF7 0x0169 0xF8 0x00F8 0xF9 0x0173 0xFA 0x00FA 0xFB 0x00FB 0xFC 0x00FC 0xFD 0x00FD 0xFE 0x00FE 0xFF 0x0138 hevea-2.30/mappings/windows-1251.map0000644004317100512160000000576410547475266017205 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0402 0x81 0x0403 0x82 0x201A 0x83 0x0453 0x84 0x201E 0x85 0x2026 0x86 0x2020 0x87 0x2021 0x88 0x20AC 0x89 0x2030 0x8A 0x0409 0x8B 0x2039 0x8C 0x040A 0x8D 0x040C 0x8E 0x040B 0x8F 0x040F 0x90 0x0452 0x91 0x2018 0x92 0x2019 0x93 0x201C 0x94 0x201D 0x95 0x2022 0x96 0x2013 0x97 0x2014 0x99 0x2122 0x9A 0x0459 0x9B 0x203A 0x9C 0x045A 0x9D 0x045C 0x9E 0x045B 0x9F 0x045F 0xA0 0x00A0 0xA1 0x040E 0xA2 0x045E 0xA3 0x0408 0xA4 0x00A4 0xA5 0x0490 0xA6 0x00A6 0xA7 0x00A7 0xA8 0x0401 0xA9 0x00A9 0xAA 0x0404 0xAB 0x00AB 0xAC 0x00AC 0xAD 0x00AD 0xAE 0x00AE 0xAF 0x0407 0xB0 0x00B0 0xB1 0x00B1 0xB2 0x0406 0xB3 0x0456 0xB4 0x0491 0xB5 0x00B5 0xB6 0x00B6 0xB7 0x00B7 0xB8 0x0451 0xB9 0x2116 0xBA 0x0454 0xBB 0x00BB 0xBC 0x0458 0xBD 0x0405 0xBE 0x0455 0xBF 0x0457 0xC0 0x0410 0xC1 0x0411 0xC2 0x0412 0xC3 0x0413 0xC4 0x0414 0xC5 0x0415 0xC6 0x0416 0xC7 0x0417 0xC8 0x0418 0xC9 0x0419 0xCA 0x041A 0xCB 0x041B 0xCC 0x041C 0xCD 0x041D 0xCE 0x041E 0xCF 0x041F 0xD0 0x0420 0xD1 0x0421 0xD2 0x0422 0xD3 0x0423 0xD4 0x0424 0xD5 0x0425 0xD6 0x0426 0xD7 0x0427 0xD8 0x0428 0xD9 0x0429 0xDA 0x042A 0xDB 0x042B 0xDC 0x042C 0xDD 0x042D 0xDE 0x042E 0xDF 0x042F 0xE0 0x0430 0xE1 0x0431 0xE2 0x0432 0xE3 0x0433 0xE4 0x0434 0xE5 0x0435 0xE6 0x0436 0xE7 0x0437 0xE8 0x0438 0xE9 0x0439 0xEA 0x043A 0xEB 0x043B 0xEC 0x043C 0xED 0x043D 0xEE 0x043E 0xEF 0x043F 0xF0 0x0440 0xF1 0x0441 0xF2 0x0442 0xF3 0x0443 0xF4 0x0444 0xF5 0x0445 0xF6 0x0446 0xF7 0x0447 0xF8 0x0448 0xF9 0x0449 0xFA 0x044A 0xFB 0x044B 0xFC 0x044C 0xFD 0x044D 0xFE 0x044E 0xFF 0x044F hevea-2.30/mappings/windows-1257.map0000644004317100512160000000556010547475266017205 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x20AC 0x82 0x201A 0x84 0x201E 0x85 0x2026 0x86 0x2020 0x87 0x2021 0x89 0x2030 0x8B 0x2039 0x8D 0x00A8 0x8E 0x02C7 0x8F 0x00B8 0x91 0x2018 0x92 0x2019 0x93 0x201C 0x94 0x201D 0x95 0x2022 0x96 0x2013 0x97 0x2014 0x99 0x2122 0x9B 0x203A 0x9D 0x00AF 0x9E 0x02DB 0xA0 0x00A0 0xA2 0x00A2 0xA3 0x00A3 0xA4 0x00A4 0xA6 0x00A6 0xA7 0x00A7 0xA8 0x00D8 0xA9 0x00A9 0xAA 0x0156 0xAB 0x00AB 0xAC 0x00AC 0xAD 0x00AD 0xAE 0x00AE 0xAF 0x00C6 0xB0 0x00B0 0xB1 0x00B1 0xB2 0x00B2 0xB3 0x00B3 0xB4 0x00B4 0xB5 0x00B5 0xB6 0x00B6 0xB7 0x00B7 0xB8 0x00F8 0xB9 0x00B9 0xBA 0x0157 0xBB 0x00BB 0xBC 0x00BC 0xBD 0x00BD 0xBE 0x00BE 0xBF 0x00E6 0xC0 0x0104 0xC1 0x012E 0xC2 0x0100 0xC3 0x0106 0xC4 0x00C4 0xC5 0x00C5 0xC6 0x0118 0xC7 0x0112 0xC8 0x010C 0xC9 0x00C9 0xCA 0x0179 0xCB 0x0116 0xCC 0x0122 0xCD 0x0136 0xCE 0x012A 0xCF 0x013B 0xD0 0x0160 0xD1 0x0143 0xD2 0x0145 0xD3 0x00D3 0xD4 0x014C 0xD5 0x00D5 0xD6 0x00D6 0xD7 0x00D7 0xD8 0x0172 0xD9 0x0141 0xDA 0x015A 0xDB 0x016A 0xDC 0x00DC 0xDD 0x017B 0xDE 0x017D 0xDF 0x00DF 0xE0 0x0105 0xE1 0x012F 0xE2 0x0101 0xE3 0x0107 0xE4 0x00E4 0xE5 0x00E5 0xE6 0x0119 0xE7 0x0113 0xE8 0x010D 0xE9 0x00E9 0xEA 0x017A 0xEB 0x0117 0xEC 0x0123 0xED 0x0137 0xEE 0x012B 0xEF 0x013C 0xF0 0x0161 0xF1 0x0144 0xF2 0x0146 0xF3 0x00F3 0xF4 0x014D 0xF5 0x00F5 0xF6 0x00F6 0xF7 0x00F7 0xF8 0x0173 0xF9 0x0142 0xFA 0x015B 0xFB 0x016B 0xFC 0x00FC 0xFD 0x017C 0xFE 0x017E 0xFF 0x02D9 hevea-2.30/mappings/macintosh.map0000644004317100512160000000600010507255512017054 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x00C4 0x81 0x00C5 0x82 0x00C7 0x83 0x00C9 0x84 0x00D1 0x85 0x00D6 0x86 0x00DC 0x87 0x00E1 0x88 0x00E0 0x89 0x00E2 0x8A 0x00E4 0x8B 0x00E3 0x8C 0x00E5 0x8D 0x00E7 0x8E 0x00E9 0x8F 0x00E8 0x90 0x00EA 0x91 0x00EB 0x92 0x00ED 0x93 0x00EC 0x94 0x00EE 0x95 0x00EF 0x96 0x00F1 0x97 0x00F3 0x98 0x00F2 0x99 0x00F4 0x9A 0x00F6 0x9B 0x00F5 0x9C 0x00FA 0x9D 0x00F9 0x9E 0x00FB 0x9F 0x00FC 0xA0 0x2020 0xA1 0x00B0 0xA2 0x00A2 0xA3 0x00A3 0xA4 0x00A7 0xA5 0x2022 0xA6 0x00B6 0xA7 0x00DF 0xA8 0x00AE 0xA9 0x00A9 0xAA 0x2122 0xAB 0x00B4 0xAC 0x00A8 0xAD 0x2260 0xAE 0x00C6 0xAF 0x00D8 0xB0 0x221E 0xB1 0x00B1 0xB2 0x2264 0xB3 0x2265 0xB4 0x00A5 0xB5 0x00B5 0xB6 0x2202 0xB7 0x2211 0xB8 0x220F 0xB9 0x03C0 0xBA 0x222B 0xBB 0x00AA 0xBC 0x00BA 0xBD 0x2126 0xBE 0x00E6 0xBF 0x00F8 0xC0 0x00BF 0xC1 0x00A1 0xC2 0x00AC 0xC3 0x221A 0xC4 0x0192 0xC5 0x2248 0xC6 0x2206 0xC7 0x00AB 0xC8 0x00BB 0xC9 0x2026 0xCA 0x00A0 0xCB 0x00C0 0xCC 0x00C3 0xCD 0x00D5 0xCE 0x0152 0xCF 0x0153 0xD0 0x2013 0xD1 0x2014 0xD2 0x201C 0xD3 0x201D 0xD4 0x2018 0xD5 0x2019 0xD6 0x00F7 0xD7 0x25CA 0xD8 0x00FF 0xD9 0x0178 0xDA 0x2044 0xDB 0x20AC 0xDC 0x2039 0xDD 0x203A 0xDE 0xFB01 0xDF 0xFB02 0xE0 0x2021 0xE1 0x00B7 0xE2 0x201A 0xE3 0x201E 0xE4 0x2030 0xE5 0x00C2 0xE6 0x00CA 0xE7 0x00C1 0xE8 0x00CB 0xE9 0x00C8 0xEA 0x00CD 0xEB 0x00CE 0xEC 0x00CF 0xED 0x00CC 0xEE 0x00D3 0xEF 0x00D4 0xF0 0x0000 0xF1 0x00D2 0xF2 0x00DA 0xF3 0x00DB 0xF4 0x00D9 0xF5 0x0131 0xF6 0x02C6 0xF7 0x02DC 0xF8 0x00AF 0xF9 0x02D8 0xFA 0x02D9 0xFB 0x02DA 0xFC 0x00B8 0xFD 0x02DD 0xFE 0x02DB 0xFF 0x02C7 hevea-2.30/mappings/ISO-8859-11.map0000644004317100512160000000623010412520074016351 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x0E01 0xA2 0x0E02 0xA3 0x0E03 0xA4 0x0E04 0xA5 0x0E05 0xA6 0x0E06 0xA7 0x0E07 0xA8 0x0E08 0xA9 0x0E09 0xAA 0x0E0A 0xAB 0x0E0B 0xAC 0x0E0C 0xAD 0x0E0D 0xAE 0x0E0E 0xAF 0x0E0F 0xB0 0x0E10 0xB1 0x0E11 0xB2 0x0E12 0xB3 0x0E13 0xB4 0x0E14 0xB5 0x0E15 0xB6 0x0E16 0xB7 0x0E17 0xB8 0x0E18 0xB9 0x0E19 0xBA 0x0E1A 0xBB 0x0E1B 0xBC 0x0E1C 0xBD 0x0E1D 0xBE 0x0E1E 0xBF 0x0E1F 0xC0 0x0E20 0xC1 0x0E21 0xC2 0x0E22 0xC3 0x0E23 0xC4 0x0E24 0xC5 0x0E25 0xC6 0x0E26 0xC7 0x0E27 0xC8 0x0E28 0xC9 0x0E29 0xCA 0x0E2A 0xCB 0x0E2B 0xCC 0x0E2C 0xCD 0x0E2D 0xCE 0x0E2E 0xCF 0x0E2F 0xD0 0x0E30 0xD1 0x0E31 0xD2 0x0E32 0xD3 0x0E33 0xD4 0x0E34 0xD5 0x0E35 0xD6 0x0E36 0xD7 0x0E37 0xD8 0x0E38 0xD9 0x0E39 0xDA 0x0E3A 0xDF 0x0E3F 0xE0 0x0E40 0xE1 0x0E41 0xE2 0x0E42 0xE3 0x0E43 0xE4 0x0E44 0xE5 0x0E45 0xE6 0x0E46 0xE7 0x0E47 0xE8 0x0E48 0xE9 0x0E49 0xEA 0x0E4A 0xEB 0x0E4B 0xEC 0x0E4C 0xED 0x0E4D 0xEE 0x0E4E 0xEF 0x0E4F 0xF0 0x0E50 0xF1 0x0E51 0xF2 0x0E52 0xF3 0x0E53 0xF4 0x0E54 0xF5 0x0E55 0xF6 0x0E56 0xF7 0x0E57 0xF8 0x0E58 0xF9 0x0E59 0xFA 0x0E5A 0xFB 0x0E5B hevea-2.30/mappings/ISO-8859-6.map0000644004317100512160000000526710412520074016306 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA4 0x00A4 0xAC 0x060C 0xAD 0x00AD 0xBB 0x061B 0xBF 0x061F 0xC1 0x0621 0xC2 0x0622 0xC3 0x0623 0xC4 0x0624 0xC5 0x0625 0xC6 0x0626 0xC7 0x0627 0xC8 0x0628 0xC9 0x0629 0xCA 0x062A 0xCB 0x062B 0xCC 0x062C 0xCD 0x062D 0xCE 0x062E 0xCF 0x062F 0xD0 0x0630 0xD1 0x0631 0xD2 0x0632 0xD3 0x0633 0xD4 0x0634 0xD5 0x0635 0xD6 0x0636 0xD7 0x0637 0xD8 0x0638 0xD9 0x0639 0xDA 0x063A 0xE0 0x0640 0xE1 0x0641 0xE2 0x0642 0xE3 0x0643 0xE4 0x0644 0xE5 0x0645 0xE6 0x0646 0xE7 0x0647 0xE8 0x0648 0xE9 0x0649 0xEA 0x064A 0xEB 0x064B 0xEC 0x064C 0xED 0x064D 0xEE 0x064E 0xEF 0x064F 0xF0 0x0650 0xF1 0x0651 0xF2 0x0652 hevea-2.30/mappings/ISO-8859-3.map0000644004317100512160000000624510412520074016300 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x0126 0xA2 0x02D8 0xA3 0x00A3 0xA4 0x00A4 0xA6 0x0124 0xA7 0x00A7 0xA8 0x00A8 0xA9 0x0130 0xAA 0x015E 0xAB 0x011E 0xAC 0x0134 0xAD 0x00AD 0xAF 0x017B 0xB0 0x00B0 0xB1 0x0127 0xB2 0x00B2 0xB3 0x00B3 0xB4 0x00B4 0xB5 0x00B5 0xB6 0x0125 0xB7 0x00B7 0xB8 0x00B8 0xB9 0x0131 0xBA 0x015F 0xBB 0x011F 0xBC 0x0135 0xBD 0x00BD 0xBF 0x017C 0xC0 0x00C0 0xC1 0x00C1 0xC2 0x00C2 0xC4 0x00C4 0xC5 0x010A 0xC6 0x0108 0xC7 0x00C7 0xC8 0x00C8 0xC9 0x00C9 0xCA 0x00CA 0xCB 0x00CB 0xCC 0x00CC 0xCD 0x00CD 0xCE 0x00CE 0xCF 0x00CF 0xD1 0x00D1 0xD2 0x00D2 0xD3 0x00D3 0xD4 0x00D4 0xD5 0x0120 0xD6 0x00D6 0xD7 0x00D7 0xD8 0x011C 0xD9 0x00D9 0xDA 0x00DA 0xDB 0x00DB 0xDC 0x00DC 0xDD 0x016C 0xDE 0x015C 0xDF 0x00DF 0xE0 0x00E0 0xE1 0x00E1 0xE2 0x00E2 0xE4 0x00E4 0xE5 0x010B 0xE6 0x0109 0xE7 0x00E7 0xE8 0x00E8 0xE9 0x00E9 0xEA 0x00EA 0xEB 0x00EB 0xEC 0x00EC 0xED 0x00ED 0xEE 0x00EE 0xEF 0x00EF 0xF1 0x00F1 0xF2 0x00F2 0xF3 0x00F3 0xF4 0x00F4 0xF5 0x0121 0xF6 0x00F6 0xF7 0x00F7 0xF8 0x011D 0xF9 0x00F9 0xFA 0x00FA 0xFB 0x00FB 0xFC 0x00FC 0xFD 0x016D 0xFE 0x015D 0xFF 0x02D9 hevea-2.30/mappings/ISO-8859-16.map0000644004317100512160000000640010412520074016355 0ustar marangetcristal0x00 0x0000 0x01 0x0001 0x02 0x0002 0x03 0x0003 0x04 0x0004 0x05 0x0005 0x06 0x0006 0x07 0x0007 0x08 0x0008 0x09 0x0009 0x0A 0x000A 0x0B 0x000B 0x0C 0x000C 0x0D 0x000D 0x0E 0x000E 0x0F 0x000F 0x10 0x0010 0x11 0x0011 0x12 0x0012 0x13 0x0013 0x14 0x0014 0x15 0x0015 0x16 0x0016 0x17 0x0017 0x18 0x0018 0x19 0x0019 0x1A 0x001A 0x1B 0x001B 0x1C 0x001C 0x1D 0x001D 0x1E 0x001E 0x1F 0x001F 0x20 0x0020 0x21 0x0021 0x22 0x0022 0x23 0x0023 0x24 0x0024 0x25 0x0025 0x26 0x0026 0x27 0x0027 0x28 0x0028 0x29 0x0029 0x2A 0x002A 0x2B 0x002B 0x2C 0x002C 0x2D 0x002D 0x2E 0x002E 0x2F 0x002F 0x30 0x0030 0x31 0x0031 0x32 0x0032 0x33 0x0033 0x34 0x0034 0x35 0x0035 0x36 0x0036 0x37 0x0037 0x38 0x0038 0x39 0x0039 0x3A 0x003A 0x3B 0x003B 0x3C 0x003C 0x3D 0x003D 0x3E 0x003E 0x3F 0x003F 0x40 0x0040 0x41 0x0041 0x42 0x0042 0x43 0x0043 0x44 0x0044 0x45 0x0045 0x46 0x0046 0x47 0x0047 0x48 0x0048 0x49 0x0049 0x4A 0x004A 0x4B 0x004B 0x4C 0x004C 0x4D 0x004D 0x4E 0x004E 0x4F 0x004F 0x50 0x0050 0x51 0x0051 0x52 0x0052 0x53 0x0053 0x54 0x0054 0x55 0x0055 0x56 0x0056 0x57 0x0057 0x58 0x0058 0x59 0x0059 0x5A 0x005A 0x5B 0x005B 0x5C 0x005C 0x5D 0x005D 0x5E 0x005E 0x5F 0x005F 0x60 0x0060 0x61 0x0061 0x62 0x0062 0x63 0x0063 0x64 0x0064 0x65 0x0065 0x66 0x0066 0x67 0x0067 0x68 0x0068 0x69 0x0069 0x6A 0x006A 0x6B 0x006B 0x6C 0x006C 0x6D 0x006D 0x6E 0x006E 0x6F 0x006F 0x70 0x0070 0x71 0x0071 0x72 0x0072 0x73 0x0073 0x74 0x0074 0x75 0x0075 0x76 0x0076 0x77 0x0077 0x78 0x0078 0x79 0x0079 0x7A 0x007A 0x7B 0x007B 0x7C 0x007C 0x7D 0x007D 0x7E 0x007E 0x7F 0x007F 0x80 0x0080 0x81 0x0081 0x82 0x0082 0x83 0x0083 0x84 0x0084 0x85 0x0085 0x86 0x0086 0x87 0x0087 0x88 0x0088 0x89 0x0089 0x8A 0x008A 0x8B 0x008B 0x8C 0x008C 0x8D 0x008D 0x8E 0x008E 0x8F 0x008F 0x90 0x0090 0x91 0x0091 0x92 0x0092 0x93 0x0093 0x94 0x0094 0x95 0x0095 0x96 0x0096 0x97 0x0097 0x98 0x0098 0x99 0x0099 0x9A 0x009A 0x9B 0x009B 0x9C 0x009C 0x9D 0x009D 0x9E 0x009E 0x9F 0x009F 0xA0 0x00A0 0xA1 0x0104 0xA2 0x0105 0xA3 0x0141 0xA4 0x20AC 0xA5 0x201E 0xA6 0x0160 0xA7 0x00A7 0xA8 0x0161 0xA9 0x00A9 0xAA 0x0218 0xAB 0x00AB 0xAC 0x0179 0xAD 0x00AD 0xAE 0x017A 0xAF 0x017B 0xB0 0x00B0 0xB1 0x00B1 0xB2 0x010C 0xB3 0x0142 0xB4 0x017D 0xB5 0x201D 0xB6 0x00B6 0xB7 0x00B7 0xB8 0x017E 0xB9 0x010D 0xBA 0x0219 0xBB 0x00BB 0xBC 0x0152 0xBD 0x0153 0xBE 0x0178 0xBF 0x017C 0xC0 0x00C0 0xC1 0x00C1 0xC2 0x00C2 0xC3 0x0102 0xC4 0x00C4 0xC5 0x0106 0xC6 0x00C6 0xC7 0x00C7 0xC8 0x00C8 0xC9 0x00C9 0xCA 0x00CA 0xCB 0x00CB 0xCC 0x00CC 0xCD 0x00CD 0xCE 0x00CE 0xCF 0x00CF 0xD0 0x0110 0xD1 0x0143 0xD2 0x00D2 0xD3 0x00D3 0xD4 0x00D4 0xD5 0x0150 0xD6 0x00D6 0xD7 0x015A 0xD8 0x0170 0xD9 0x00D9 0xDA 0x00DA 0xDB 0x00DB 0xDC 0x00DC 0xDD 0x0118 0xDE 0x021A 0xDF 0x00DF 0xE0 0x00E0 0xE1 0x00E1 0xE2 0x00E2 0xE3 0x0103 0xE4 0x00E4 0xE5 0x0107 0xE6 0x00E6 0xE7 0x00E7 0xE8 0x00E8 0xE9 0x00E9 0xEA 0x00EA 0xEB 0x00EB 0xEC 0x00EC 0xED 0x00ED 0xEE 0x00EE 0xEF 0x00EF 0xF0 0x0111 0xF1 0x0144 0xF2 0x00F2 0xF3 0x00F3 0xF4 0x00F4 0xF5 0x0151 0xF6 0x00F6 0xF7 0x015B 0xF8 0x0171 0xF9 0x00F9 0xFA 0x00FA 0xFB 0x00FB 0xFC 0x00FC 0xFD 0x0119 0xFE 0x021B 0xFF 0x00FF hevea-2.30/epsfig.hva0000644004317100512160000000014610563036154014535 0ustar marangetcristal\ProvidesPackage{epsfig} \newcommand{\epsfig}[1]{\begin{toimage}\epsfig{#1}\end{toimage}\imageflush} hevea-2.30/noimage.ml0000644004317100512160000000163512017660721014534 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) let start () = () and stop () = () and restart () = () ;; let put _ = () and put_char _ = () ;; let dump _ image lexbuf = image lexbuf let page () = () ;; let finalize _ = false ;; hevea-2.30/mylib.mli0000644004317100512160000000142507303420320014366 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) val static_libdir : string val libdir : string hevea-2.30/lexeme.mli0000644004317100512160000000273112017660721014543 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: lexeme.mli,v 1.6 2005-06-24 08:32:21 maranget Exp $ *) (***********************************************************************) type tag = | TT |I |B |BIG |SMALL | STRIKE | S |U |FONT | EM |STRONG |DFN |CODE |SAMP | KBD |VAR |CITE |ABBR |ACRONYM | Q |SUB |SUP | A | SCRIPT | SPAN | STYLE (* style for fonts by span tags *) type fontstyle = | Ffamily | Fstyle | Fvariant | Fweight | Fsize | Fcolor | Fbgcolor type atag = | SIZE of string | COLOR of string | FACE of string | CLASS of string | ASTYLE of fontstyle * string | OTHER type attr = atag * string type attrs = attr list type token = | Open of tag * attrs * string | Close of tag * string | Text of string | Blanks of string | Eof type style = {tag : tag ; attrs : attrs ; txt : string ; ctxt : string} hevea-2.30/ultra.ml0000644004317100512160000003342012401623123014231 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: ultra.ml,v 1.14 2012-06-05 14:55:39 maranget Exp $ *) (***********************************************************************) open Printf open Tree open Htmltext open Util let same_prop f s = try let p = Htmltext.get_prop f.nat in List.exists (fun s -> p s.nat) s with | NoProp -> false let rec part_factor some blanks i s keep leave = function | [] -> keep,leave | ((f,_) as x)::rem when there f s || same_prop f s || (blanks && Htmltext.blanksNeutral f)-> part_factor some blanks i s (x::keep) leave rem | (f,j)::rem -> part_factor some blanks i s keep (some f j (i-1) leave) rem let there_factor s fs = List.exists (fun (f,_) -> same_style s f) fs let rec start_factor i fs start = function | [] -> start | s::rem when there_factor s fs -> start_factor i fs start rem | s::rem -> start_factor i fs ((s,i)::start) rem let extend_factors some blanks i s r fs = let keep,leave = part_factor some blanks i s [] r fs in start_factor i fs keep s,leave let rec part_factor_neutral some i keep leave = function | [] -> keep,leave | ((f,_) as x)::rem when Htmltext.blanksNeutral f -> part_factor_neutral some i (x::keep) leave rem | (f,j)::rem -> part_factor_neutral some i keep (some f j (i-1) leave) rem let extend_factors_neutral some i r fs = part_factor_neutral some i [] r fs let finish_factors some i r fs = part_factor some false i [] [] r fs let pfactor chan fs = List.iter (fun ((i,j),f) -> Printf.fprintf chan " %d,%d:%s" i j f.txt) fs ; output_char chan '\n' let covers (i1:int) (j1:int) i2 j2 = (i1 <= i2 && j2 < j1) || (i1 < i2 && j2 <= j1) let rec all_blanks ts i j = if i <= j then is_blank ts.(i) && all_blanks ts (i+1) j else true let rec get_same ts i j f = function | [] -> ((i,j),f) | ((ii,jj),_)::_ when covers i j ii jj && all_blanks ts i (ii-1) && all_blanks ts (jj+1) j -> ((ii,jj),f) | _::rem -> get_same ts i j f rem let get_sames ts fs = let rec do_rec r = function | [] -> r | (((i,j),f) as x)::rem -> do_rec (if blanksNeutral f then get_same ts i j f fs::r else x::r) rem in do_rec [] fs let group_font ts fs = let fonts,no_fonts = List.partition (fun (_,f) -> is_font f.nat) fs in get_sames ts fonts@no_fonts let group_span ts fs = let span,no_span = List.partition (fun (_,f) -> is_span f.nat) fs in get_sames ts span@no_span let conflict_low i1 j1 i2 j2 = i1 < i2 && i2 <= j1 && j1 < j2 let correct_cfl_low ts i1 j1 i2 j2 = if conflict_low i1 j1 i2 j2 && all_blanks ts i1 (i2-1) then i1 else i2 and correct_cfl_high ts i1 j1 i2 j2 = if conflict_low i1 j1 i2 j2 && all_blanks ts (j1+1) j2 then j2 else j1 let rec mk_cover_one ts i j f = function | [] -> (i,j),f | ((ii,jj),_)::rem -> mk_cover_one ts (correct_cfl_low ts ii jj i j) (correct_cfl_high ts i j ii jj) f rem let rec mk_cover ts fs = function | [] -> [] | ((i,j),f)::rem -> mk_cover_one ts i j f fs :: mk_cover ts fs rem let extend_neutrals ts fs = let neutral,not_neutral = List.partition (fun (_,f) -> blanksNeutral f) fs in mk_cover ts fs neutral @ not_neutral let factorize low high ts = if low >= high then [] else let limit_blanks_right i = let rec do_rec i = if i <= low then low else begin if is_blank ts.(i) then do_rec (i-1) else i end in do_rec i in let correct_prop f i j env = try let _ = Htmltext.get_prop f.nat in let rec find_same k = match ts.(k) with | Node (s,_) when there f s -> k | _ -> find_same (k-1) in let j = find_same j in if j=i || (blanksNeutral f && all_blanks ts i (j-1)) then env else ((i,j),f)::env with | NoProp -> ((i,j),f)::env in let some f i j env = if not (Htmltext.blanksNeutral f) then begin if j-i > 0 then correct_prop f i j env else env end else begin let r = ref 0 in for k = i to j do if not (is_blank ts.(k)) then incr r done ; if !r > 1 then correct_prop f i (limit_blanks_right j) env else env end in let rec do_rec i r fs = if i <= high then begin let fs,r = match ts.(i) with | Node (s,ts) -> extend_factors some (is_blanks ts) i s r fs | t -> if is_blank t then extend_factors_neutral some i r fs else finish_factors some i r fs in do_rec (i+1) r fs end else let _,r = finish_factors some i r fs in r in let r = do_rec low [] [] in let r = group_font ts r in let r = group_span ts r in let r = extend_neutrals ts r in if r <> [] && !Emisc.verbose > 1 then begin Printf.fprintf stderr "Factors in %d %d\n" low high ; for i=low to high do Pp.tree stderr ts.(i) done ; prerr_endline "\n*********" ; pfactor stderr r end ; r let same ((i1,j1),_) ((i2,j2),_) = i1=i2 && j1=j2 let covers_cost ((((i1:int),(j1:int)),_),_) (((i2,j2),_),_) = covers i1 j1 i2 j2 let biggest fs = let rec through r = function | [] -> r | x::rem -> if List.exists (fun y -> covers_cost y x) rem then through r rem else through (x::r) rem in through [] (through [] fs) let conflicts ((i1,j1),_) ((i2,j2),_) = (i1 < i2 && i2 <= j1 && j1 < j2) || (i2 < i1 && i1 <= j2 && j2 < j1) let num_conflicts f fs = List.fold_left (fun r g -> if conflicts f g then 1+r else r) 0 fs let put_conflicts fs = List.fold_left (fun r g -> (g,num_conflicts g fs)::r) [] fs let rec add f = function | [] -> let i,f = f in [i,[f]] | x::rem as r -> if same f x then let _,f = f and i,r = x in (i,(f::r))::rem else if conflicts f x then r else x::add f rem let get_them fs = List.fold_left (fun r (f,_) -> add f r) [] fs let pfactorc chan fs = List.iter (fun (((i,j),f),c) -> Printf.fprintf chan " %d,%d:%s(%d)" i j f.txt c) fs ; output_char chan '\n' let slen f = (if is_font f.nat then 5 else 0) + String.length f.txt + String.length f.ctxt let order_factors (((_i1,_j1),f1),(c1:int)) (((_i2,_j2),f2),c2) = match compare c1 c2 with | 0 -> compare (slen f2) (slen f1) (* NB comparison reversed *) | r -> r let select_factors fs = let fs1 = put_conflicts fs in let fs2 = biggest fs1 in let fs3 = List.sort order_factors fs2 in if !Emisc.verbose > 1 then begin prerr_string "fs1:" ; pfactorc stderr fs1 ; prerr_string "fs2:" ; pfactorc stderr fs2 ; prerr_string "fs3:" ; pfactorc stderr fs3 end ; List.sort (fun ((_,j1),_) ((i2,_),_) -> Pervasives.compare (j1:int) i2) (get_them fs3) let some_font s = List.exists (fun s -> is_font s.nat) s let rec font_tree = function | Node (s,ts) -> some_font s || font_trees ts | Blanks _ -> true | _ -> false and font_trees ts = List.for_all font_tree ts let other_props s = let rec other r = function | [] -> r | s::rem when is_font s.nat -> other (List.fold_left (fun r p -> if p s.nat then r else p::r) [] r) rem | _::rem -> other r rem in other font_props s let rec all_props r ts = match r with | [] -> [] | _ -> match ts with | [] -> r | Node (s,_)::rem when some_font s -> all_props (List.filter (fun p -> List.exists (fun s -> is_font s.nat && p s.nat) s) r) rem | Node (_,ts)::rem -> all_props (all_props r ts) rem | Blanks _::rem -> all_props (List.filter neutral_prop r) rem | _ -> assert false let extract_props ps s = List.partition (fun s -> is_font s.nat && List.exists (fun p -> p s.nat) ps) s let clean t k = match t with | Node ([],ts) -> ts@k | _ -> t::k let rec neutrals started r = function | [] -> r | Blanks _::rem -> neutrals started r rem | Node (s, _)::rem -> if started then neutrals true (inter r (List.filter blanksNeutral s)) rem else neutrals true (List.filter blanksNeutral s) rem | _ -> [] let rec remove_list fs ts = match ts with | [] -> [] | Node (gs,args)::rem -> begin match sub gs fs with | [] -> args @ remove_list fs rem | ks -> Node (ks,args) :: remove_list fs rem end | t::rem -> t::remove_list fs rem let lift_neutral fs ts k = match neutrals false [] ts with | [] -> Node (fs,ts)::k | lift -> Node (lift@fs, remove_list lift ts)::k let check_node fs ts k = match ts with | Node (si,args)::rem when some_font fs && font_trees ts -> begin match all_props (other_props fs) ts with | [] -> lift_neutral fs ts k | ps -> let lift,keep = extract_props ps si in lift_neutral (lift@fs) (clean (Node (keep,args)) rem) k end | _ -> lift_neutral fs ts k let rec as_list i j ts k = if i > j then k else (clean ts.(i)) (as_list (i+1) j ts k) let remove s = function | Node (os,ts) -> node (sub os s) ts | t -> t and is_text_blank = function | Text _ | Blanks _ -> true | _ -> false and is_node = function | Node (_::_,_) -> true | _ -> false let rec cut_begin p ts l i = if i >= l then l,[] else if p ts.(i) then let j,l = cut_begin p ts l (i+1) in j,ts.(i)::l else i,[] let cut_end p ts l = let rec do_rec r i = if i < 0 then i,r else if p ts.(i) then do_rec (ts.(i)::r) (i-1) else i,r in do_rec [] (l-1) let is_other s = match s.nat with | Other -> true | _ -> false let rec deeper i j ts k = let rec again r i = if i > j then r else match ts.(i) with | Node ([],args) -> let b1 = List.exists is_node args in again (b1 || r) (i+1) | Node (s,args) when List.exists is_other s -> let r = again r (i+1) in if not r then ts.(i) <- Node (s,opt true (Array.of_list args) []) ; r | _ -> again r (i+1) in if again false i then begin let ts = as_list i j ts [] in let rs = opt true (Array.of_list ts) k in rs end else as_list i j ts k and trees i j ts k = if i > j then k else match factorize i j ts with | [] -> deeper i j ts k | fs -> let rec zyva cur fs k = match fs with | [] -> deeper cur j ts k | ((ii,jj),gs)::rem -> for k=ii to jj do ts.(k) <- remove gs ts.(k) done ; deeper cur (ii-1) ts (check_node gs (trees ii jj ts []) (zyva (jj+1) rem k)) in let fs = select_factors fs in if !Emisc.verbose > 1 then begin prerr_endline "selected" ; List.iter (fun ((i,j),fs) -> Printf.fprintf stderr " %d,%d:" i j ; List.iter (fun f -> output_string stderr (" "^f.txt)) fs) fs ; prerr_endline "" end ; zyva i fs k and opt_onodes ts i = match ts.(i) with | ONode (o,c,args) -> begin match opt false (Array.of_list args) [] with | [Node (s,args)] when false -> let s1, s2 = partition_color s in ts.(i) <- begin match s1, s2 with | [],[] -> assert false | [],s -> ONode (o,c,[Node (s, args)]) | s,[] -> Node (s,[ONode (o,c,args)]) | _,_ -> Node (s1, [ONode (o,c,[Node (s2, args)])]) end | t -> ts.(i) <- ONode (o,c,t) end | _ -> () and opt top ts k = let l = Array.length ts in for i = 0 to l-1 do opt_onodes ts i done ; let p = is_text_blank in let start,pre = cut_begin p ts l 0 in if start >= l then pre@k else let fin,post = cut_end p ts l in if top then pre@trees start fin ts (post@k) else extend_blanks pre (trees start fin ts []) post k and extend_blanks pre ts post k = match ts with | [Node (s,args)] when pre <> [] && post <> [] && List.exists blanksNeutral s && is_blanks pre && is_blanks post -> let neutral,not_neutral = List.partition blanksNeutral s in [Node (neutral, (match not_neutral with | [] -> pre@args@post@k | _ -> pre@Node (not_neutral,args)::post@k))] | _ -> pre@ts@post@k let main chan ts = if !Emisc.verbose > 2 then begin eprintf "**Ultra input **\n" ; Pp.ptrees stderr ts ; eprintf "** Ultra end**\n%!" ; () end ; let ci = costs Htmllex.cost ts in let rs = opt true (Array.of_list (Explode.trees ts)) [] in let cf = costs Htmltext.cost rs in if compare ci cf < 0 then begin if !Emisc.verbose > 1 then begin prerr_endline "*********** Pessimization ***********" ; Pp.ptrees stderr ts ; prerr_endline "*********** Into ***********" ; Pp.trees stderr rs end ; Pp.ptrees chan ts end else begin if !Emisc.verbose > 2 then begin eprintf "** Ultra output **\n" ; Pp.trees stderr rs ; eprintf "** Ultra end**\n%!" ; () end ; Pp.trees chan rs end hevea-2.30/out.mli0000644004317100512160000000136512017660721014075 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Tibault Suzanne, Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) include DoOut.S hevea-2.30/element.ml0000644004317100512160000000203512017660721014541 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* For text-level elements *) type text = Style of string | Font of int | Color of string | StyleAttr of string * string let pretty_text = function Style s -> "Style: "^s | Font i -> "Font size: "^string_of_int i | Color s -> "Font color: "^s | StyleAttr (t,a) -> "Style with attributes: "^t^" ["^a^"]" ;; hevea-2.30/css.mli0000644004317100512160000000156712017660721014062 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: css.mli,v 1.1 2005-06-24 08:32:21 maranget Exp $ *) (***********************************************************************) type id = | Class of string * string option * string | Other of string hevea-2.30/ifthen.hva0000644004317100512160000000036110417501234014526 0ustar marangetcristal\ififthen\endinput\fi \@stopimage \@primitives{ifthen} \newcommand{\@iffileexists}[3]{\ifthenelse{\@fileexists{#1}}{#2}{#3}} \newcommand{\@ifundefined}[3] {\ifthenelse{\@commandexists\csname #1\endcsname}{#3}{#2}} \ifthentrue \@restartimage hevea-2.30/url.hva0000644004317100512160000000044307114732007014060 0ustar marangetcristal\@primitives{url}% \def\@urlttstyle{\def\UrlFont{\ttfamily}}% \def\@urlsfstyle{\def\UrlFont{\sffamily}}% \def\@urlrmstyle{\def\UrlFont{\rmfamily}}% \def\urlstyle#1{\csname @url#1style\endcsname}% \urlstyle{tt}% \def\url{\begingroup\urlstyle{tt}\Url}% \let\UrlLeft\relax\let\UrlRight\relax% hevea-2.30/simpleRope.mli0000644004317100512160000000316512403604646015410 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Tibault Suzanne, Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* Simple rope data structure *) module type Config = sig val small_length : int end module Make(C:Config) : sig type t (* Basics *) val length : t -> int val of_string : string -> t val singleton : char -> t val empty : t (* Usual strings *) val append : t -> t -> t val append_string : t -> string -> t val append_char : t -> char -> t val sub : t -> int -> int -> t val get : t -> int -> char val iter : (char -> unit) -> t -> unit (* Translations *) val output : out_channel -> t -> unit val debug : out_channel -> t -> unit val blit : t -> Bytes.t -> int -> unit val to_string : t -> string val to_list : t -> string list val to_list_append : t -> string list -> string list (* Index function *) val index : t -> char -> int val rindex : t -> char -> int (* Hevea specific: erase suffix that validates predicate *) val erase : t -> (char -> bool) -> t end hevea-2.30/check.sh0000644004317100512160000000064610662510525014175 0ustar marangetcristal#! /bin/sh -e . config.sh TMP1=/tmp/check.1.$$ TMP2=/tmp/check.2.$$ TMP3=/tmp/check.3.$$ check () { DIR=$1 shift ( cd $DIR ; ls *.hva > $TMP1 ) echo > $TMP2 for i in $* do echo $i >> $TMP2 done sort $TMP1 > $TMP3 && mv $TMP3 $TMP1 sort $TMP2 > $TMP3 && mv $TMP3 $TMP2 diff $TMP1 $TMP2 /bin/rm -f $TMP1 $TMP2 $TMP3 } check . $ALLLIB check html $HTMLLIB check text $TEXTLIB check info $INFOLIB hevea-2.30/.depend0000644004317100512160000002762110565402214014023 0ustar marangetcristalesp.cmi: ./emisc.cmi explode.cmi: ./tree.cmi ./lexeme.cmi ./htmltext.cmi get.cmi: ./lexstate.cmi ./length.cmi htmllex.cmi: ./lexeme.cmi ./emisc.cmi ./css.cmi html.cmi: ./tabular.cmi ./outUnicode.cmi ./out.cmi ./lexstate.cmi \ ./length.cmi ./element.cmi htmlparse.cmi: ./tree.cmi ./lexeme.cmi ./emisc.cmi htmltext.cmi: ./lexeme.cmi info.cmi: ./tabular.cmi ./outUnicode.cmi ./out.cmi ./lexstate.cmi \ ./length.cmi ./element.cmi latexmacros.cmi: ./lexstate.cmi latexscan.cmi: ./outManager.cmi ./lexstate.cmi ./imageManager.cmi lexstate.cmi: ./myStack.cmi ./misc.cmi outManager.cmi: ./tabular.cmi ./outUnicode.cmi ./out.cmi ./lexstate.cmi \ ./length.cmi ./element.cmi package.cmi: ./outManager.cmi ./latexscan.cmi ./imageManager.cmi pp.cmi: ./tree.cmi ./lexeme.cmi ./htmltext.cmi ./css.cmi save.cmi: ./misc.cmi subst.cmi: ./lexstate.cmi tabular.cmi: ./lexstate.cmi ./length.cmi text.cmi: ./tabular.cmi ./outUnicode.cmi ./out.cmi ./lexstate.cmi \ ./length.cmi ./element.cmi ultra.cmi: ./tree.cmi ./lexeme.cmi util.cmi: ./tree.cmi ./htmltext.cmi verb.cmi: ./outManager.cmi ./latexscan.cmi ./imageManager.cmi videoc.cmi: ./outManager.cmi ./latexscan.cmi ./imageManager.cmi zyva.cmi: ./outManager.cmi ./latexscan.cmi ./imageManager.cmi auxx.cmo: ./parse_opts.cmi ./mysys.cmi ./misc.cmi auxx.cmi auxx.cmx: ./parse_opts.cmx ./mysys.cmx ./misc.cmx auxx.cmi buff.cmo: buff.cmi buff.cmx: buff.cmi color.cmo: ./misc.cmi ./colscan.cmi color.cmi color.cmx: ./misc.cmx ./colscan.cmx color.cmi colscan.cmo: ./out.cmi colscan.cmi colscan.cmx: ./out.cmx colscan.cmi counter.cmo: ./misc.cmi ./latexmacros.cmi counter.cmi counter.cmx: ./misc.cmx ./latexmacros.cmx counter.cmi cross.cmo: ./location.cmi cross.cmi cross.cmx: ./location.cmx cross.cmi cut.cmo: ./thread.cmi ./section.cmi ./save.cmi ./myStack.cmi ./misc.cmi \ ./cutOut.cmi ./cross.cmi cut.cmi cut.cmx: ./thread.cmx ./section.cmx ./save.cmx ./myStack.cmx ./misc.cmx \ ./cutOut.cmx ./cross.cmx cut.cmi cutOut.cmo: ./out.cmi cutOut.cmi cutOut.cmx: ./out.cmx cutOut.cmi element.cmo: element.cmi element.cmx: element.cmi emisc.cmo: emisc.cmi emisc.cmx: emisc.cmi entry.cmo: ./save.cmi ./out.cmi entry.cmi entry.cmx: ./save.cmx ./out.cmx entry.cmi esp.cmo: ./ultra.cmi ./pp.cmi ./mysys.cmi ./location.cmi ./htmlparse.cmi \ ./htmllex.cmi ./explode.cmi ./emisc.cmi esp.cmi esp.cmx: ./ultra.cmx ./pp.cmx ./mysys.cmx ./location.cmx ./htmlparse.cmx \ ./htmllex.cmx ./explode.cmx ./emisc.cmx esp.cmi esponja.cmo: ./mysys.cmi ./esp.cmi ./emisc.cmi esponja.cmx: ./mysys.cmx ./esp.cmx ./emisc.cmx explode.cmo: ./util.cmi ./tree.cmi ./lexeme.cmi ./htmltext.cmi explode.cmi explode.cmx: ./util.cmx ./tree.cmi ./lexeme.cmi ./htmltext.cmx explode.cmi foot.cmo: ./section.cmi ./parse_opts.cmi ./myStack.cmi ./misc.cmi foot.cmi foot.cmx: ./section.cmx ./parse_opts.cmx ./myStack.cmx ./misc.cmx foot.cmi get.cmo: ./parse_opts.cmi ./myfiles.cmi ./myStack.cmi ./misc.cmi \ ./lexstate.cmi ./length.cmi ./latexmacros.cmi ./counter.cmi get.cmi get.cmx: ./parse_opts.cmx ./myfiles.cmx ./myStack.cmx ./misc.cmx \ ./lexstate.cmx ./length.cmx ./latexmacros.cmx ./counter.cmx get.cmi hacha.cmo: ./version.cmi ./mysys.cmi ./mylib.cmi ./misc.cmi ./location.cmi \ ./cut.cmi ./cross.cmi hacha.cmx: ./version.cmx ./mysys.cmx ./mylib.cmx ./misc.cmx ./location.cmx \ ./cut.cmx ./cross.cmx hevea.cmo: ./zyva.cmi ./videoc.cmi ./verb.cmi ./text.cmi ./tabular.cmi \ ./save.cmi ./parse_opts.cmi ./package.cmi ./noimage.cmi ./mysys.cmi \ ./mylib.cmi ./myfiles.cmi ./myStack.cmi ./misc.cmi ./location.cmi \ ./lexstate.cmi ./latexscan.cmi ./infoRef.cmo ./info.cmi ./index.cmi \ ./image.cmi ./html.cmi ./hot.cmi ./get.cmi ./esp.cmi ./emisc.cmi \ ./colscan.cmi ./auxx.cmi hevea.cmx: ./zyva.cmx ./videoc.cmx ./verb.cmx ./text.cmx ./tabular.cmx \ ./save.cmx ./parse_opts.cmx ./package.cmx ./noimage.cmx ./mysys.cmx \ ./mylib.cmx ./myfiles.cmx ./myStack.cmx ./misc.cmx ./location.cmx \ ./lexstate.cmx ./latexscan.cmx ./infoRef.cmx ./info.cmx ./index.cmx \ ./image.cmx ./html.cmx ./hot.cmx ./get.cmx ./esp.cmx ./emisc.cmx \ ./colscan.cmx ./auxx.cmx hot.cmo: ./parse_opts.cmi ./misc.cmi ./lexstate.cmi ./latexmacros.cmi \ ./infoRef.cmo ./foot.cmi ./counter.cmi ./color.cmi hot.cmi hot.cmx: ./parse_opts.cmx ./misc.cmx ./lexstate.cmx ./latexmacros.cmx \ ./infoRef.cmx ./foot.cmx ./counter.cmx ./color.cmx hot.cmi htmlCommon.cmo: ./parse_opts.cmi ./out.cmi ./myStack.cmi ./misc.cmi \ ./length.cmi ./latexmacros.cmi ./element.cmi htmlCommon.cmx: ./parse_opts.cmx ./out.cmx ./myStack.cmx ./misc.cmx \ ./length.cmx ./latexmacros.cmx ./element.cmx htmllex.cmo: ./myStack.cmi ./location.cmi ./lexeme.cmi ./emisc.cmi ./css.cmi \ ./buff.cmi htmllex.cmi htmllex.cmx: ./myStack.cmx ./location.cmx ./lexeme.cmi ./emisc.cmx ./css.cmi \ ./buff.cmx htmllex.cmi htmlMath.cmo: ./parse_opts.cmi ./out.cmi ./myStack.cmi ./misc.cmi \ ./lexstate.cmi ./htmlCommon.cmo ./element.cmi htmlMath.cmx: ./parse_opts.cmx ./out.cmx ./myStack.cmx ./misc.cmx \ ./lexstate.cmx ./htmlCommon.cmx ./element.cmx html.cmo: ./tabular.cmi ./parse_opts.cmi ./outUnicode.cmi ./out.cmi \ ./myStack.cmi ./misc.cmi ./mathML.cmo ./lexstate.cmi ./length.cmi \ ./latexmacros.cmi ./htmlMath.cmo ./htmlCommon.cmo html.cmi html.cmx: ./tabular.cmx ./parse_opts.cmx ./outUnicode.cmx ./out.cmx \ ./myStack.cmx ./misc.cmx ./mathML.cmx ./lexstate.cmx ./length.cmx \ ./latexmacros.cmx ./htmlMath.cmx ./htmlCommon.cmx html.cmi htmlparse.cmo: ./tree.cmi ./lexeme.cmi ./htmllex.cmi ./emisc.cmi ./css.cmi \ ./buff.cmi htmlparse.cmi htmlparse.cmx: ./tree.cmi ./lexeme.cmi ./htmllex.cmx ./emisc.cmx ./css.cmi \ ./buff.cmx htmlparse.cmi htmltext.cmo: ./lexeme.cmi ./emisc.cmi htmltext.cmi htmltext.cmx: ./lexeme.cmi ./emisc.cmx htmltext.cmi image.cmo: ./parse_opts.cmi ./out.cmi ./mysys.cmi ./myfiles.cmi ./myStack.cmi \ ./misc.cmi ./location.cmi image.cmi image.cmx: ./parse_opts.cmx ./out.cmx ./mysys.cmx ./myfiles.cmx ./myStack.cmx \ ./misc.cmx ./location.cmx image.cmi index.cmo: ./table.cmi ./parse_opts.cmi ./out.cmi ./mysys.cmi ./misc.cmi \ ./entry.cmi index.cmi index.cmx: ./table.cmx ./parse_opts.cmx ./out.cmx ./mysys.cmx ./misc.cmx \ ./entry.cmx index.cmi info.cmo: ./text.cmi ./parse_opts.cmi ./mysys.cmi ./misc.cmi ./infoRef.cmo \ info.cmi info.cmx: ./text.cmx ./parse_opts.cmx ./mysys.cmx ./misc.cmx ./infoRef.cmx \ info.cmi infoRef.cmo: ./text.cmi ./parse_opts.cmi ./out.cmi ./mysys.cmi ./misc.cmi infoRef.cmx: ./text.cmx ./parse_opts.cmx ./out.cmx ./mysys.cmx ./misc.cmx latexmacros.cmo: ./parse_opts.cmi ./myStack.cmi ./misc.cmi ./lexstate.cmi \ latexmacros.cmi latexmacros.cmx: ./parse_opts.cmx ./myStack.cmx ./misc.cmx ./lexstate.cmx \ latexmacros.cmi latexscan.cmo: ./tabular.cmi ./subst.cmi ./save.cmi ./parse_opts.cmi \ ./outUnicode.cmi ./outManager.cmi ./out.cmi ./mysys.cmi ./mylib.cmi \ ./myfiles.cmi ./myStack.cmi ./misc.cmi ./location.cmi ./lexstate.cmi \ ./length.cmi ./latexmacros.cmi ./imageManager.cmi ./hot.cmi ./get.cmi \ ./foot.cmi ./element.cmi ./counter.cmi ./auxx.cmi latexscan.cmi latexscan.cmx: ./tabular.cmx ./subst.cmx ./save.cmx ./parse_opts.cmx \ ./outUnicode.cmx ./outManager.cmi ./out.cmx ./mysys.cmx ./mylib.cmx \ ./myfiles.cmx ./myStack.cmx ./misc.cmx ./location.cmx ./lexstate.cmx \ ./length.cmx ./latexmacros.cmx ./imageManager.cmi ./hot.cmx ./get.cmx \ ./foot.cmx ./element.cmx ./counter.cmx ./auxx.cmx latexscan.cmi length.cmo: length.cmi length.cmx: length.cmi lexstate.cmo: ./save.cmi ./parse_opts.cmi ./myfiles.cmi ./myStack.cmi \ ./misc.cmi ./location.cmi lexstate.cmi lexstate.cmx: ./save.cmx ./parse_opts.cmx ./myfiles.cmx ./myStack.cmx \ ./misc.cmx ./location.cmx lexstate.cmi location.cmo: ./myStack.cmi location.cmi location.cmx: ./myStack.cmx location.cmi mathML.cmo: ./parse_opts.cmi ./out.cmi ./myStack.cmi ./misc.cmi \ ./lexstate.cmi ./latexmacros.cmi ./htmlCommon.cmo ./element.cmi mathML.cmx: ./parse_opts.cmx ./out.cmx ./myStack.cmx ./misc.cmx \ ./lexstate.cmx ./latexmacros.cmx ./htmlCommon.cmx ./element.cmx misc.cmo: ./location.cmi misc.cmi misc.cmx: ./location.cmx misc.cmi myfiles.cmo: ./parse_opts.cmi ./mylib.cmi ./misc.cmi myfiles.cmi myfiles.cmx: ./parse_opts.cmx ./mylib.cmx ./misc.cmx myfiles.cmi mylib.cmo: mylib.cmi mylib.cmx: mylib.cmi myStack.cmo: myStack.cmi myStack.cmx: myStack.cmi mysys.cmo: mysys.cmi mysys.cmx: mysys.cmi noimage.cmo: noimage.cmi noimage.cmx: noimage.cmi out.cmo: ./misc.cmi out.cmi out.cmx: ./misc.cmx out.cmi outUnicode.cmo: ./parse_opts.cmi ./myfiles.cmi ./misc.cmi outUnicode.cmi outUnicode.cmx: ./parse_opts.cmx ./myfiles.cmx ./misc.cmx outUnicode.cmi package.cmo: ./version.cmi ./subst.cmi ./save.cmi ./parse_opts.cmi \ ./outUnicode.cmi ./outManager.cmi ./mylib.cmi ./myStack.cmi ./misc.cmi \ ./lexstate.cmi ./latexscan.cmi ./latexmacros.cmi ./index.cmi \ ./imageManager.cmi ./get.cmi ./counter.cmi ./color.cmi ./auxx.cmi \ package.cmi package.cmx: ./version.cmx ./subst.cmx ./save.cmx ./parse_opts.cmx \ ./outUnicode.cmx ./outManager.cmi ./mylib.cmx ./myStack.cmx ./misc.cmx \ ./lexstate.cmx ./latexscan.cmx ./latexmacros.cmx ./index.cmx \ ./imageManager.cmi ./get.cmx ./counter.cmx ./color.cmx ./auxx.cmx \ package.cmi parse_opts.cmo: ./version.cmi ./mylib.cmi ./misc.cmi ./location.cmi \ parse_opts.cmi parse_opts.cmx: ./version.cmx ./mylib.cmx ./misc.cmx ./location.cmx \ parse_opts.cmi pp.cmo: ./tree.cmi ./lexeme.cmi ./htmltext.cmi ./css.cmi pp.cmi pp.cmx: ./tree.cmi ./lexeme.cmi ./htmltext.cmx ./css.cmi pp.cmi save.cmo: ./out.cmi ./misc.cmi save.cmi save.cmx: ./out.cmx ./misc.cmx save.cmi section.cmo: ./misc.cmi section.cmi section.cmx: ./misc.cmx section.cmi subst.cmo: ./save.cmi ./out.cmi ./misc.cmi ./lexstate.cmi subst.cmi subst.cmx: ./save.cmx ./out.cmx ./misc.cmx ./lexstate.cmx subst.cmi table.cmo: table.cmi table.cmx: table.cmi tabular.cmo: ./table.cmi ./subst.cmi ./parse_opts.cmi ./myStack.cmi \ ./misc.cmi ./lexstate.cmi ./length.cmi ./latexmacros.cmi ./get.cmi \ tabular.cmi tabular.cmx: ./table.cmx ./subst.cmx ./parse_opts.cmx ./myStack.cmx \ ./misc.cmx ./lexstate.cmx ./length.cmx ./latexmacros.cmx ./get.cmx \ tabular.cmi text.cmo: ./tabular.cmi ./table.cmi ./parse_opts.cmi ./outUnicode.cmi \ ./out.cmi ./myStack.cmi ./misc.cmi ./lexstate.cmi ./length.cmi \ ./latexmacros.cmi ./element.cmi text.cmi text.cmx: ./tabular.cmx ./table.cmx ./parse_opts.cmx ./outUnicode.cmx \ ./out.cmx ./myStack.cmx ./misc.cmx ./lexstate.cmx ./length.cmx \ ./latexmacros.cmx ./element.cmx text.cmi thread.cmo: thread.cmi thread.cmx: thread.cmi ultra.cmo: ./util.cmi ./tree.cmi ./pp.cmi ./htmltext.cmi ./htmllex.cmi \ ./explode.cmi ./emisc.cmi ultra.cmi ultra.cmx: ./util.cmx ./tree.cmi ./pp.cmx ./htmltext.cmx ./htmllex.cmx \ ./explode.cmx ./emisc.cmx ultra.cmi util.cmo: ./tree.cmi ./htmltext.cmi util.cmi util.cmx: ./tree.cmi ./htmltext.cmx util.cmi verb.cmo: ./subst.cmi ./save.cmi ./parse_opts.cmi ./outManager.cmi ./out.cmi \ ./myfiles.cmi ./myStack.cmi ./misc.cmi ./location.cmi ./lexstate.cmi \ ./latexscan.cmi ./latexmacros.cmi ./imageManager.cmi ./get.cmi \ ./counter.cmi verb.cmi verb.cmx: ./subst.cmx ./save.cmx ./parse_opts.cmx ./outManager.cmi ./out.cmx \ ./myfiles.cmx ./myStack.cmx ./misc.cmx ./location.cmx ./lexstate.cmx \ ./latexscan.cmx ./latexmacros.cmx ./imageManager.cmi ./get.cmx \ ./counter.cmx verb.cmi version.cmo: version.cmi version.cmx: version.cmi videoc.cmo: ./subst.cmi ./parse_opts.cmi ./outManager.cmi ./myfiles.cmi \ ./misc.cmi ./lexstate.cmi ./latexscan.cmi ./latexmacros.cmi \ ./imageManager.cmi videoc.cmi videoc.cmx: ./subst.cmx ./parse_opts.cmx ./outManager.cmi ./myfiles.cmx \ ./misc.cmx ./lexstate.cmx ./latexscan.cmx ./latexmacros.cmx \ ./imageManager.cmi videoc.cmi zyva.cmo: ./outManager.cmi ./latexscan.cmi ./imageManager.cmi zyva.cmi zyva.cmx: ./outManager.cmi ./latexscan.cmx ./imageManager.cmi zyva.cmi hevea-2.30/colscan.mll0000644004317100512160000000265011763416753014724 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: colscan.mll,v 1.7 2012-06-05 14:55:39 maranget Exp $ *) (***********************************************************************) { open Lexing exception Error of string ;; } rule one = parse | ' '+ {one lexbuf} | ('0'|'1')?'.'?['0'-'9']* {let lxm = lexeme lexbuf in try float_of_string lxm with _ -> assert false} | "" {raise (Error "Syntax error in color argument")} and other = parse ' '* ',' {one lexbuf} | "" {raise (Error "Syntax error in color argument")} and three = parse "" {let fst = one lexbuf in let snd = other lexbuf in let thrd = other lexbuf in fst,snd,thrd} and four = parse "" {let fst = one lexbuf in let snd = other lexbuf in let thrd = other lexbuf in let fourth = other lexbuf in fst,snd,thrd,fourth} hevea-2.30/ultra.mli0000644004317100512160000000155210512403554014410 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: ultra.mli,v 1.5 2006-10-09 08:25:16 maranget Exp $ *) (***********************************************************************) val main : out_channel -> Lexeme.style Tree.t list -> unit hevea-2.30/myStack.mli0000644004317100512160000000273010562663770014710 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: myStack.mli,v 1.2 2007-02-08 18:12:08 maranget Exp $ *) (***********************************************************************) exception Fatal of string type 'a t val create : string -> 'a t val create_init : string -> 'a -> 'a t val reset : 'a t -> unit val name : 'a t -> string val push : 'a t -> 'a -> unit val pop : 'a t -> 'a val top : 'a t -> 'a val top2 : 'a t -> 'a val pretty : ('a -> string) -> 'a t -> unit val length : 'a t -> int val empty : 'a t -> bool val rev : 'a t -> unit val map : 'a t -> ('a -> 'a) -> unit type 'a saved val empty_saved : 'a saved val save : 'a t -> 'a saved val restore : 'a t -> 'a saved -> unit val finalize : 'a t -> ('a -> bool) -> ('a -> unit) -> unit (* finalize now p f apply f to now elements until now is empty or p is true for one element *) hevea-2.30/saver.mli0000644004317100512160000000055612017660721014407 0ustar marangetcristalmodule type Config = sig type t val of_string : string -> t val of_out : Out.t -> t end module type S = sig type out val opt : Lexing.lexbuf -> out val arg : Lexing.lexbuf -> out val arg2 : Lexing.lexbuf -> out end module Make(C:Config) : S with type out = C.t module String : S with type out = string module List : S with type out = string list hevea-2.30/element.mli0000644004317100512160000000155407477123142014724 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) type text = | Style of string | Font of int | Color of string | StyleAttr of string * string val pretty_text : text -> string hevea-2.30/counter.mli0000644004317100512160000000210010423155262014727 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) type saved val checkpoint : unit -> saved val hot_start : saved -> unit val value_counter : string -> int val def_counter: string -> string -> unit val set_counter: string -> int -> unit val add_counter:string -> int -> unit val step_counter: string -> unit val addtoreset: string -> string -> unit val removefromreset: string -> string -> unit hevea-2.30/install.sh0000755004317100512160000000154713104607625014574 0ustar marangetcristal#! /bin/sh -e . ./config.sh cpv () { echo "$1 -> $2" cp $1 ${DESTDIR}$2 } mkdirv () { mkdir -p ${DESTDIR}$1 } install () { SRC=$1 shift DEST=$1 shift mkdirv $DEST for f in $* do cpv $SRC/$f $DEST done } installbin () { mkdirv $BINDIR EXT=$1 shift for f in $* do cpv $f.$EXT $BINDIR/$f done } case $1 in byte|opt) TARGET=$1 ;; *) echo "Usage: install.sh (byte|opt)" 1>&2 exit 2 ;; esac install . $LIBDIR imagen xxcharset.exe xxdate.exe contents_motif.gif next_motif.gif previous_motif.gif $ALLLIB install . $LATEXLIBDIR hevea.sty mathjax.sty install html $LIBDIR/html $HTMLLIB install text $LIBDIR/text $TEXTLIB install info $LIBDIR/info $INFOLIB MAPPINGS=`( cd ./mappings && echo *.map )` install mappings $LIBDIR/mappings $MAPPINGS installbin $TARGET hevea hacha esponja bibhva cpv imagen $BINDIR hevea-2.30/latexscan.mli0000644004317100512160000000466312345363435015262 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Lexstate module type S = sig (* external entry points *) val no_prelude : unit -> unit val translate_put_unicode : char -> (unit -> int) -> unit val translate_put_unicode_string : string -> unit val main : Lexing.lexbuf -> unit val expand_command : string -> Lexing.lexbuf -> unit val expand_command_no_skip : string -> Lexing.lexbuf -> unit val print_env_pos : unit -> unit (* additional resources needed for extension modules. *) val cur_env : string ref val new_env : string -> unit val close_env : string -> unit val echo_toimage : unit -> bool val echo_global_toimage : unit -> bool val fun_register : (unit -> unit) -> unit val newif_ref : string -> bool ref -> unit val top_open_block : string -> string -> unit val top_close_block : string -> unit val top_open_group : unit -> unit val top_close_group : unit -> unit val check_alltt_skip : Lexing.lexbuf -> unit val skip_pop : Lexing.lexbuf -> unit (* 'def' functions for initialisation only *) val def_code : string -> (Lexing.lexbuf -> unit) -> unit val def_name_code : string -> (string -> Lexing.lexbuf -> unit) -> unit val def_fun : string -> (string -> string) -> unit (* various calls of main scanner, should tidy that a bit *) val get_this_main : string -> string val get_this_arg_mbox : string arg -> string val get_prim_onarg : string Lexstate.arg -> string val check_this_main : string -> bool val get_prim : string -> string val get_prim_arg : Lexing.lexbuf -> string val get_prim_opt : string -> Lexing.lexbuf -> string val get_csname : Lexing.lexbuf -> string end module Make (Dest : OutManager.S) (Image : ImageManager.S) : S hevea-2.30/ocb.sh0000755004317100512160000000114213106613665013663 0ustar marangetcristal#!/bin/sh -e CHECK=yes export CHECK . ./config.sh OCBOCAMLFLAGS='' for i in $OCAMLFLAGS do OCBOCAMLFLAGS="$OCBOCAMLFLAGS -cflag $i" done ocb() { ocamlbuild $OCBFLAGS $OCBOCAMLFLAGS $* } toopt () { for f in $* do mv $f `basename $f .native`.opt done } rule() { case $1 in clean) ocb -clean ;; byte) ocb $PGM ;; opt) ocb $PGMNATIVE && toopt $PGMNATIVE ;; both) ocb $PGM $PGMNATIVE && toopt $PGMNATIVE ;; *) echo "Unknown action $1";; esac; } if [ $# -eq 0 ] then rule opt else for i do rule $i done fi hevea-2.30/inputenc.hva0000644004317100512160000000502711670416714015114 0ustar marangetcristal%% Inputencodings are simple minded, and also impacts on the output %% document charset %% - The 'input' translator is changed to accept chars on 8-bits %% and to translate them to the appropriate unicode chars. %% - Numerical entities given by \@print@u{NUM} are translated %% to chars when possible (through 'output' translator) %% output translator and document charset must of course agree, %% - \usepackage[enc]{inputenc} affects both input and %% output translators and doc charset. %% - Later, one can desynchronize the translators %% For instance, to interpret input as latin1 and to output %% ascii only, one should perform: %% \usepackage[latin1]{inputenc} %% \@def@charset{US-ASCII} %% %% Or, to change input translator alone : \inputencoding{enc} \ProvidesPackage{inputenc} \def\ic@mk@map#1{ic@#1@map} \def\def@ic@map#1#2{\def\csname\ic@mk@map{#1}\endcsname{#2}} %%%Direct setting of inputencoding \newcommand{\ic@restore} {\@set@in@translator {mappings/\csname\ic@mk@map{\inputencodingname}\endcsname.map}}% %% \newcommand{\inputencoding}[1] {\@ifundefined{\ic@mk@map{#1}} {\hva@warn{Unknown input encoding: '#1'}} {\def\inputencodingname{#1}% \@set@in@translator{mappings/\csname\ic@mk@map{#1}\endcsname.map}% \@funregister{\ic@restore}}} %%%Setting inputencoding as package option also sets output encoding \newcommand{\ic@set}[1] {\def\inputencodingname{#1}% \def\@charset{\csname\ic@mk@map{#1}\endcsname}% \@set@translators{mappings/\csname\ic@mk@map{#1}\endcsname.map}} \newcommand{\ic@set@bis}[1] {\def\inputencodingname{#1}% \@set@in@translator{mappings/\csname\ic@mk@map{#1}\endcsname.map}} \newcommand{\ic@option}[2] {\def@ic@map{#1}{#2}% \DeclareOption{#1}{\ic@set{#1}}}% \newcommand{\ic@option@bis}[2] {\def@ic@map{#1}{#2}% \DeclareOption{#1}{\ic@set@bis{#1}}}% %%% \ic@option{ascii}{US-ASCII}% %%% \ic@option{latin1}{ISO-8859-1}% \ic@option{latin2}{ISO-8859-2}% \ic@option{latin3}{ISO-8859-3}% \ic@option{latin4}{ISO-8859-4}% \ic@option{latin5}{ISO-8859-9}% \ic@option{latin6}{ISO-8859-10}% \ic@option{latin7}{ISO-8859-13}% \ic@option{latin8}{ISO-8859-14}% \ic@option{latin9}{ISO-8859-15}% \ic@option{latin10}{ISO-8859-16}% \ic@option{tis-620}{ISO-8859-11}% \ic@option@bis{thai}{ISO-8859-11}% %%% \ic@option{cp1250}{windows-1250}% \ic@option{cp1251}{windows-1251}% \ic@option{cp1252}{windows-1252}% \ic@option{cp1257}{windows-1257}% \ic@option{ansinew}{windows-1252}% %%% \ic@option{applemac}{macintosh}% %%% \ic@option{koi8-r}{KOI8-R}% \ic@option{utf8}{UTF-8}% \ic@option{utf8x}{UTF-8}% %%% \ProcessOptions*% hevea-2.30/htmlparse.mli0000644004317100512160000000205512323450432015256 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: htmlparse.mli,v 1.5 2006-10-09 08:25:16 maranget Exp $ *) (***********************************************************************) exception Error of string module Make(C:DoOut.Config) : sig val ptop : unit -> unit val reset : unit -> unit val main : Emisc.Strings.t option -> Lexing.lexbuf -> Lexeme.style Tree.t list val classes : Lexing.lexbuf -> Emisc.Strings.t end hevea-2.30/packages.hva0000644004317100512160000000461512113070517015035 0ustar marangetcristal\newcommand{\@usepackage}[1] {%\hva@warn{\@usepackage '#1'}% \def\pkg@arg{{\@nostyle\@callprim{\@eatspaces}{#1,}}}% \ifthenelse{\equal{\pkg@arg}{hevea}}{\@usepackage{comment}} {\ifu\csname\pkg@arg{}@loaded\endcsname \@iffileexists{\pkg@arg.hva} {\def\csname\pkg@arg{}@loaded\endcsname{foo}% %Warning: loading \pkg@arg.hva may redefine \pgk@arg!!!! \input{\pkg@arg.hva}} {}% \fi}} \newsavebox{\@pkg@opts} \newcommand{\usepackage}[2][!*!] {%\hva@warn{\usepackage '#1' '#2'} \ifthenelse{\equal{#1}{!*!}} {\sbox{\@pkg@opts}{}\begin{toimage}\usepackage{#2}\end{toimage}} {\sbox{\@pkg@opts}{#1}\begin{toimage}\usepackage[#1]{#2}\end{toimage}}% \@stopoutput\@stopimage% \@funcall{\@iter}{\@usepackage,{#2}}% \@restartimage\@restartoutput} \hva@newstack{@pkg}\let\@pkg@me\relax \hva@newstack{@pkg@opts} \newcommand{\@pkg@pushs} {%\typeout{Saving: '\@pkg@opts' '\@pkg@me'} \@push@pkg{\@pkg@me}\@push@pkg@opts{\@pkg@opts}} \newcommand{\@pkg@pops} {\@pop@pkg@opts{\@pkg@opts}\@pop@pkg{\@pkg@me}% %\typeout{Restoring: '\@pkg@opts' '\@pkg@me'} } \newcommand{\ProvidesPackage}[1] {\def{\@pkg@me}{\@getprint{#1}}\AtEndOfFile{\@EndPackage}} \newcommand{\@EndPackage}{} \newcommand{\EndPackage}{\hva@warn{END}} \newcommand{\@pkg@opt@name}[1]{@pkg\@pkg@me{}@#1} \newcommand{\DeclareOption}[2] {\newcommand{\csname\@pkg@opt@name{#1}\endcsname}{#2}} \newcommand{\@process@option}[1]% {\def\pkg@opt{{\@nostyle\@callprim{\@eatspaces}{#1,}}}% \ifu\csname\@pkg@opt@name{\pkg@opt}\endcsname \hva@warn{Ignoring option: '#1'}\else \csname\@pkg@opt@name{\pkg@opt}\endcsname\fi}% %%Do not warn \newcommand{\@@process@option}[1]% {\def\pkg@opt{{\@nostyle\@callprim{\@eatspaces}{#1,}}}% \ifu\csname\@pkg@opt@name{\pkg@opt}\endcsname\else \csname\@pkg@opt@name{\pkg@opt}\endcsname\fi}% \newcommand{\ProcessOptions*} {\@callprim{\@iter} {\string\@@process@option,{\char123\usebox{\@document@opts}\char125}}% \@callprim{\@iter} {\string\@process@option,{\char123\usebox{\@pkg@opts}\char125}}} \newcommand{\ExecuteOptions}[1] {\@callprim{\@iter}{\string\@process@option,{\{#1\}}}} %%%% Packages in packages \newcommand{\@GoobleOpt}[1][]{}% \newcommand{\RequirePackage}[2][!*!] {\@pkg@pushs\usepackage[#1]{#2}\execafter\@GoobleOpt\@pkg@pops}% %%%%No op ProvidesFile \newcommand{\@eatopt}[1][]{} \newcommand{\ProvidesFile}[1]{\@eatopt} %%%%Misc \newcommand{\PackageInfo}[2]{\hva@warn{Package #1 info: #2}} hevea-2.30/latexmacros.ml0000644004317100512160000002044312113376362015437 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Printf open Misc open Lexstate exception Failed module OString = struct type t = string let compare = Pervasives.compare end module Strings = Set.Make (OString) (* Data structures for TeX macro model *) let local_table = Hashtbl.create 97 and global_table = Hashtbl.create 97 and prim_table = Hashtbl.create 5 and known_macros = ref Strings.empty let purge = ref Strings.empty and purge_stack = MyStack.create "purge" and group_level = ref 0 (* Hot start *) type ctable = (string, pat * action) Hashtbl.t type ptable = (string, (unit -> unit)) Hashtbl.t type saved = int * Strings.t * Strings.t MyStack.saved * ptable * ctable * ctable * Strings.t let pretty_macro n acs = pretty_pat n ; prerr_string " -> " ; pretty_action acs let hidden_pretty_table cmdtable = let t = Hashtbl.create 97 and count = ref 0 in let incr k = incr count ; let r = try Hashtbl.find t k with | Not_found -> let r = ref 0 in Hashtbl.add t k r ; r in incr r in Hashtbl.iter (fun k (n,acc) -> Printf.fprintf stderr "%s -> " k ; pretty_macro n acc ; prerr_endline "" ; incr k) cmdtable ; Printf.fprintf stderr "Table size: %d\n" !count ; Hashtbl.iter (fun k r -> if !r > 1 then Printf.fprintf stderr "%s: %d\n" k !r) t ; flush stderr let pretty_table () = Printf.fprintf stderr "Macro tables, level=%d\n" !group_level ; prerr_endline "Global table" ; hidden_pretty_table global_table ; prerr_endline "Local table" ; hidden_pretty_table local_table let checkpoint () = !group_level, !purge, MyStack.save purge_stack, Hashtbl.copy prim_table, Hashtbl.copy global_table, Hashtbl.copy local_table, !known_macros and hot_start (level_checked, purge_checked, purge_stack_checked, prim_checked, global_checked, local_checked, known_checked) = group_level := level_checked ; purge := purge_checked ; MyStack.restore purge_stack purge_stack_checked ; Misc.copy_hashtbl prim_checked prim_table ; Misc.copy_hashtbl global_checked global_table ; Misc.copy_hashtbl local_checked local_table ; known_macros := known_checked (* Controlling scope *) let open_group () = incr group_level ; MyStack.push purge_stack !purge ; purge := Strings.empty and close_group () = if !group_level > 0 then (* Undo bindings created at the closed level *) Strings.iter (fun name -> Hashtbl.remove local_table name) !purge ; decr group_level ; purge := MyStack.pop purge_stack let get_level () = !group_level (* Remove one local definition in advance ... *) let pre_purge name purge = if Strings.mem name purge then begin Hashtbl.remove local_table name ; Strings.remove name purge end else purge (* Definitions *) let hidden_global_def name x = if !group_level > 0 && Hashtbl.mem local_table name then begin (* global definition of a localy defined macro, undo all local bindings *) purge := pre_purge name !purge ; MyStack.map purge_stack (fun purge -> pre_purge name purge) end ; Hashtbl.replace global_table name x let hidden_local_def name x = if !group_level > 0 then begin (* indeed local *) if Strings.mem name !purge then (* redefinition *) Hashtbl.remove local_table name else (* creation (at the current level) *) purge := Strings.add name !purge ; Hashtbl.add local_table name x end else begin (* same as global *) Hashtbl.replace global_table name x end let hidden_find name = if !group_level > 0 then begin try Hashtbl.find local_table name with | Not_found -> Hashtbl.find global_table name end else Hashtbl.find global_table name let set_saved_macros () = known_macros := Hashtbl.fold (fun name _ -> Strings.add name) global_table Strings.empty let get_saved_macro name = Strings.mem name !known_macros (* Primitives *) let register_init name f = if !verbose > 1 then prerr_endline ("Registering primitives for package: "^name); try let _ = Hashtbl.find prim_table name in fatal ("Attempt to initlialize primitives for package "^name^" twice") with | Not_found -> Hashtbl.add prim_table name f and exec_init name = if !verbose > 1 then prerr_endline ("Initializing primitives for package: "^name) ; try let f = Hashtbl.find prim_table name in Hashtbl.remove prim_table name ; (* accidental double is possible... *) try f () with Failed -> Misc.warning ("Bad trip while initializing primitives for package: "^name) with Not_found -> Misc.warning ("Cannot find primitives for package: "^name) ;; (* Interface *) let exists name = try let _ = hidden_find name in true with | Not_found -> false let find name = try hidden_find name with | Not_found -> warning ("Command not found: "^name) ; ([],[]),Subst [] and find_fail name = try hidden_find name with | Not_found -> raise Failed let pretty_command name = let n,acc = find name in eprintf "%s: " name ; pretty_macro n acc ; prerr_endline "" let def name pat action = if !verbose > 1 then begin Printf.fprintf stderr "def %s = " name; pretty_macro pat action ; prerr_endline "" end ; hidden_local_def name (pat,action) and global_def name pat action = if !verbose > 1 then begin Printf.fprintf stderr "global def %s = " name; pretty_macro pat action ; prerr_endline "" end ; hidden_global_def name (pat,action) and global_undef name = Hashtbl.remove global_table name ; Hashtbl.remove local_table name ;; let def_init name f = if exists name then begin fatal ("Command: "^name^" defined at initialisation") end ; def name zero_pat (CamlCode f) (* let pretty_arg = function | None -> prerr_string "" | Some (n,acc) -> pretty_macro n acc let pretty_replace s name old new_def = Printf.fprintf stderr "%s: %s\n\told=" s name ; pretty_arg old ; Printf.fprintf stderr "\n\tnew=" ; pretty_arg new_def ; prerr_endline "" *) let replace name new_def = let old_def = try Some (hidden_find name) with | Not_found -> None in (* pretty_replace "replace" name old_def new_def ; Printf.fprintf stderr "level=%d\n" !group_level ; *) begin match new_def with | Some d -> hidden_local_def name d | None -> match old_def with | None -> () | Some _ -> (* what will happen if binding was global ??? *) if !group_level > 0 then purge := pre_purge name !purge else Hashtbl.remove global_table name end ; old_def (* addto *) let addto name body = let old = try Some (hidden_find name) with Not_found -> None in match old with | Some (pat,Subst obody) -> hidden_local_def name (pat,Subst (obody@("%\n"::body))) | Some (_,_) -> warning "\\addto on non-subst macro" | None -> hidden_local_def name (zero_pat,Subst body) (* macro static properties *) let invisible = function "\\nofiles" | "\\pagebreak" | "\\nopagebreak" | "\\linebreak" | "\\nolinebreak" | "\\label" | "\\index" | "\\vspace" | "\\glossary" | "\\marginpar" | "\\figure" | "\\table" | "\\nostyle" | "\\rm" | "\\tt" | "\\bf" | "\\em" | "\\it" | "\\sl" | "\\tiny" | "\\footnotesize" | "\\scriptsize" | "\\small" | "\\normalsize" | "\\large" | "\\Large" | "\\LARGE" | "\\huge" | "\\Huge" | "\\purple" | "\\silver" | "\\gray" | "\\white" | "\\maroon" | "\\red" | "\\fuchsia" | "\\green" | "\\lime" | "\\olive" | "\\yellow" | "\\navy" | "\\blue" | "\\teal" | "\\aqua" | "\\else" | "\\fi" | "\\char" -> true | name -> (String.length name >= 3 && String.sub name 0 3 = "\\if") ;; hevea-2.30/emisc.ml0000644004317100512160000000210712017660721014210 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: emisc.ml,v 1.3 2006-10-09 08:25:16 maranget Exp $ *) (***********************************************************************) open Printf let verbose = ref 0 let basefont = ref 3 let reset () = basefont := 3 let dump_class chan cl st = fprintf chan ".%s{%s}\n" cl st module Strings = Set.Make(String) module StringMap = Map.Make(String) module StringCount = Count.Make(String) exception LexError of string hevea-2.30/zyva.mli0000644004317100512160000000217110565402214014250 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2007 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: zyva.mli,v 1.1 2007-02-16 19:22:52 maranget Exp $ *) (***********************************************************************) module type S = functor (Dest : OutManager.S) -> functor (Image : ImageManager.S) -> functor (Scan : Latexscan.S) -> sig end module Make : functor (Dest : OutManager.S) -> functor (Image : ImageManager.S) -> functor (Scan : Latexscan.S) -> functor (ToMake : S) -> sig module Rien : sig end end hevea-2.30/count.mli0000644004317100512160000000176512017660721014422 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* Map extension for counting occurrences *) module type S = sig type key type count val empty : count val incr : key -> count -> count val fold : (key -> int -> 'b -> 'b) -> count -> 'b -> 'b end module Make (Ord : Map.OrderedType) : S with type key = Ord.t hevea-2.30/version.mli0000644004317100512160000000137307017033006014744 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) val version : string hevea-2.30/labeltype.hva0000644004317100512160000000140412113376362015240 0ustar marangetcristal\ProvidesPackage{labeltype} %%%internal package for getting section type info for labels %%Redefinitions of \refstepcounter and \label to catch label types %%NB: label type is counter name \def\currentlabeltype{none} \let\@rt@oldrefstepcounter\refstepcounter \renewcommand{\refstepcounter}[1] {\def\currentlabeltype{#1}\@rt@oldrefstepcounter{#1}} \let\@rt@old@label\label \renewcommand{\label}[2][] {\@rt@old@label[#1]{#2}% \@auxdowrite{\@print{\@deflabeltype}\{#2\}\{\currentlabeltype\}\@print{ }}} %%Hum also redefines \enumerate... \let\@rt@oldenumerate\enumerate \renewcommand{\enumerate}{\def\currentlabeltype{item}\@rt@oldenumerate} %NB:It is up to client packages to % (1) redefine/extend \@deflabeltype % (2) define \@lt@item@type \newcommand{\@deflabeltype}[2]{} hevea-2.30/save.mli0000644004317100512160000000457012017660721014225 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) val peek_next_char : Lexing.lexbuf -> char val if_next_char : char -> Lexing.lexbuf -> bool val if_next_string : string -> Lexing.lexbuf -> bool exception Error of string exception Delim of string val empty_buffs : unit -> unit val set_verbose : bool -> int -> unit val seen_par : bool ref val gobble_one_char : Lexing.lexbuf -> unit exception Eof exception LimitEof of Misc.limits option exception NoOpt val get_echo : unit -> string val start_echo : unit -> unit val opt : Lexing.lexbuf -> string val opt_list : Lexing.lexbuf -> string list val arg : Lexing.lexbuf -> string val arg_list : Lexing.lexbuf -> string list val arg_verbatim : Lexing.lexbuf -> string (* val arg_verbatim2 : char -> Lexing.lexbuf -> string *) val csname : (string -> string) -> (string -> string) -> Lexing.lexbuf -> string val incsname : Lexing.lexbuf -> string val cite_arg : Lexing.lexbuf -> string list val rest : Lexing.lexbuf -> string val num_arg : Lexing.lexbuf -> (string -> int) -> int val skip_equal : Lexing.lexbuf -> unit val check_equal : Lexing.lexbuf -> bool val filename : Lexing.lexbuf -> string val remain : Lexing.lexbuf -> string (* Superscript and subscripts *) val get_limits : Misc.limits option -> Lexing.lexbuf -> Misc.limits option val get_sup : Lexing.lexbuf -> string option val get_sub : Lexing.lexbuf -> string option val defargs : Lexing.lexbuf -> string list val get_defargs : Lexing.lexbuf -> string val tagout : Lexing.lexbuf -> string val checklimits : Lexing.lexbuf -> bool val skip_delim : string -> Lexing.lexbuf -> unit val with_delim : string -> Lexing.lexbuf -> string val skip_blanks_init : Lexing.lexbuf -> unit val xy_arg : Lexing.lexbuf -> string hevea-2.30/thai.hva0000644004317100512160000000003310552666614014210 0ustar marangetcristal\usepackage[thai]{inputenc}hevea-2.30/myfiles.ml0000644004317100512160000001066212017660721014565 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Misc exception Error of string ;; exception Except ;; let etable = Hashtbl.create 17 ;; List.iter (fun name -> Hashtbl.add etable name ()) !Parse_opts.except ;; let is_except name = try Hashtbl.find etable name ; true with Not_found -> false ;; let tex_path = "." :: !Parse_opts.path @ Mylib.libdir:: List.map (fun dir -> Filename.concat Mylib.libdir dir) (match !Parse_opts.destination with | Parse_opts.Html -> ["html"] | Parse_opts.Text -> ["text"] | Parse_opts.Info -> ["info" ; "text"]) ;; let import = ref "" ;; let set_import dir = import := dir let try_import f = match !import with "" -> () | dir -> f dir exception Found of (string * in_channel) ;; let do_open_tex filename = let try_open dir = try let full_name = Filename.concat dir filename in if !verbose > 1 then prerr_endline ("Trying: "^full_name) ; let r = open_in full_name in if !verbose > 1 then prerr_endline ("Opening: "^full_name) ; raise (Found (full_name,r)) with Sys_error s -> if !verbose > 1 then prerr_endline ("Failed: "^s) in try List.iter try_open tex_path ; try_import try_open ; raise (Error ("Cannot open file: "^filename)) with Found r -> r ;; let open_tex filename = if !verbose > 1 then prerr_endline ("Searching file: "^filename) ; if is_except filename then raise Except ; if Filename.is_implicit filename then if Filename.check_suffix filename ".tex" || Filename.check_suffix filename ".hva" then do_open_tex filename else try let name = filename^".tex" in if is_except name then raise Except ; do_open_tex name with Error _ -> do_open_tex filename else try if Filename.check_suffix filename ".tex" then filename,open_in filename else try (filename^".tex"),open_in (filename^".tex") with Sys_error _ -> filename,open_in filename with Sys_error _ -> raise (Error ("Cannot open: "^filename)) exception FoundBis of string let do_find name = let try_find dir = let full_name = Filename.concat dir name in if Sys.file_exists full_name then raise (FoundBis full_name) in try List.iter try_find tex_path ; try_import try_find ; raise Not_found with FoundBis r -> r ;; let find_one name = if Sys.file_exists name then name else raise Not_found let find name = if Filename.is_implicit name then if Filename.check_suffix name ".tex" || Filename.check_suffix name ".hva" then do_find name else try let name = name^".tex" in do_find name with Not_found -> do_find name else if Filename.check_suffix name ".tex" then find_one name else try find_one (name^".tex") with | Not_found -> find_one name exception Return of bool let diff_chan chan1 chan2 = try while true do let c1 = try input_char chan1 with End_of_file -> begin try let _ = input_char chan2 in raise (Return true) with End_of_file -> raise (Return false) end in let c2 = try input_char chan2 with End_of_file -> raise (Return true) in if c1 <> c2 then raise (Return true) done ; assert false with Return r -> r let changed tmp_name name = try let true_chan = open_in name in let tmp_chan = try open_in tmp_name with Sys_error _ -> begin close_in true_chan ; raise (Misc.Fatal ("Cannot reopen temporary image file: "^tmp_name)) end in let r = diff_chan true_chan tmp_chan in close_in true_chan ; close_in tmp_chan ; r with Sys_error _ -> true hevea-2.30/color.ml0000644004317100512160000001062212017660721014227 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) type t = Name of string | Hex of string let default_color = Name "black" ;; let table = (Hashtbl.create 17 : (string, t) Hashtbl.t) ;; type saved = (string, t) Hashtbl.t let checkpoint () = let ctable = Hashtbl.create 17 in Misc.copy_hashtbl table ctable ; ctable and hot_start ctable = Misc.copy_hashtbl ctable table let to_hex x = Printf.sprintf "%02X" (truncate (255.0 *. x)) ;; let cmyk_to_rgb c m y k = 1.0 -. min 1.0 (c *. (1.0 -. k) +. k), 1.0 -. min 1.0 (m *. (1.0 -. k) +. k), 1.0 -. min 1.0 (y *. (1.0 -. k) +. k) ;; let hls_to_rgb h l s = let rgb q1 q2 hue = let hue = if hue > 360.0 then hue -. 360.0 else if hue < 0.0 then hue +. 360.0 else hue in if hue < 60.0 then q1 +. (q2 -. q1) /. 60.0 else if hue < 180.0 then q2 else if hue < 240.0 then q1 +. (q2 -. q1) *. (240.0 -. hue) /. 60.0 else q1 in let p2 = if l <= 0.5 then l *. (1.0 +. s) else l +. s -. (l *. s) in let p1 = 2.0 *. l -. p2 in if s = 0.0 then l,l,l else rgb p1 p2 (h +. 100.0), rgb p1 p2 h, rgb p1 p2 (h -. 120.0) ;; let hsv_to_rgb h s v = if s = 0.0 then v,v,v else let h = h /. 60.0 in let i = truncate h in let f = h -. float i in let p = v *. (1.0 -. s) in let q = v *. (1.0 -. (s *. f)) in let t = v *. (1.0 -. (s *. (1.0 -. f))) in match i with | 0 -> v,t,p | 1 -> q,v,p | 2 -> p,v,t | 3 -> p,q,v | 4 -> t,p,v | 5 -> v,p,q | _ -> Misc.fatal ("Bad HSV color specification") ;; exception Failed ;; let names = Hashtbl.create 17 let _ = List.iter (fun (xx,name) -> Hashtbl.add names xx name) [ "000000", "black" ; "C0C0C0", "silver" ; "808080", "gray" ; "FFFFFF", "white" ; "800000", "maroon" ; "FF0000", "red" ; "800080", "purple" ; "FF00FF", "fuchsia" ; "008000", "green" ; "00FF00", "lime" ; "808000", "olive" ; "FFFF00", "yellow" ; "000080", "navy" ; "0000FF", "blue" ; "008080", "teal" ; "00FFFF", "aqua" ; ] let do_compute mdl value = match mdl with | "named" -> begin try Hashtbl.find table ("named@"^value) with | Not_found -> begin Misc.warning ("Unkown name in the named color model: "^value) ; raise Failed end end | _ -> let res = match mdl with | "gray" -> let x = Colscan.one (MyLexing.from_string value) in let xx = to_hex x in xx^xx^xx | "rgb" -> let r,g,b = Colscan.three(MyLexing.from_string value) in to_hex r^to_hex g^to_hex b | "cmyk" -> let c,m,y,k = Colscan.four (MyLexing.from_string value) in let r,g,b = cmyk_to_rgb c m y k in to_hex r^to_hex g^to_hex b | "hsv" -> let h,s,v = Colscan.three (MyLexing.from_string value) in let r,g,b = hsv_to_rgb h s v in to_hex r^to_hex g^to_hex b | "hls" -> let h,l,s = Colscan.three (MyLexing.from_string value) in let r,g,b = hls_to_rgb h l s in to_hex r^to_hex g^to_hex b | _ -> Misc.warning ("Color.compute, unknown color model: "^mdl); raise Failed in try Name (Hashtbl.find names res) with Not_found -> Hex res let compute mdl value = try do_compute mdl value with Failed -> default_color let define clr mdl value = try Hashtbl.add table clr (do_compute mdl value) with Failed -> () ;; let retrieve clr = try Hashtbl.find table clr with Not_found -> Misc.warning ("Color.retrieve, unknown color: "^clr); default_color ;; let define_named name mdl value = define ("named@"^name) mdl value ;; let remove clr = Hashtbl.remove table clr hevea-2.30/crlang.hva0000644004317100512160000042127512112707235014535 0ustar marangetcristal\DeclareOption{english}{% \AtBeginDocument{% \def\crefrangeconjunction@preamble{ to\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ and\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ and\nobreakspace}% \def\crefpairgroupconjunction@preamble{ and\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{, and\nobreakspace}% % \Crefname@preamble{equation}{Equation}{Equations}% \Crefname@preamble{figure}{Figure}{Figures}% \Crefname@preamble{table}{Table}{Tables}% \Crefname@preamble{page}{Page}{Pages}% \Crefname@preamble{part}{Part}{Parts}% \Crefname@preamble{chapter}{Chapter}{Chapters}% \Crefname@preamble{section}{Section}{Sections}% \Crefname@preamble{appendix}{Appendix}{Appendices}% \Crefname@preamble{enumi}{Item}{Items}% \Crefname@preamble{footnote}{Footnote}{Footnotes}% \Crefname@preamble{theorem}{Theorem}{Theorems}% \Crefname@preamble{lemma}{Lemma}{Lemmas}% \Crefname@preamble{corollary}{Corollary}{Corollaries}% \Crefname@preamble{proposition}{Proposition}{Propositions}% \Crefname@preamble{definition}{Definition}{Definitions}% \Crefname@preamble{result}{Result}{Results}% \Crefname@preamble{example}{Example}{Examples}% \Crefname@preamble{remark}{Remark}{Remarks}% \Crefname@preamble{note}{Note}{Notes}% \Crefname@preamble{algorithm}{Algorithm}{Algorithms}% \Crefname@preamble{listing}{Listing}{Listings}% \Crefname@preamble{line}{Line}{Lines}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname@preamble{equation}{Eq.}{Eqs.}% \crefname@preamble{figure}{Fig.}{Figs.}% \else% \crefname@preamble{equation}{Equation}{Equations}% \crefname@preamble{figure}{Figure}{Figures}% \fi% \crefname@preamble{page}{Page}{Pages}% \crefname@preamble{table}{Table}{Tables}% \crefname@preamble{part}{Part}{Parts}% \crefname@preamble{chapter}{Chapter}{Chapters}% \crefname@preamble{section}{Section}{Sections}% \crefname@preamble{appendix}{Appendix}{Appendices}% \crefname@preamble{enumi}{Item}{Items}% \crefname@preamble{footnote}{Footnote}{Footnotes}% \crefname@preamble{theorem}{Theorem}{Theorems}% \crefname@preamble{lemma}{Lemma}{Lemmas}% \crefname@preamble{corollary}{Corollary}{Corollaries}% \crefname@preamble{proposition}{Proposition}{Propositions}% \crefname@preamble{definition}{Definition}{Definitions}% \crefname@preamble{result}{Result}{Results}% \crefname@preamble{example}{Example}{Examples}% \crefname@preamble{remark}{Remark}{Remarks}% \crefname@preamble{note}{Note}{Notes}% \crefname@preamble{algorithm}{Algorithm}{Algorithms}% \crefname@preamble{listing}{Listing}{Listings}% \crefname@preamble{line}{Line}{Lines}% % \else% capitalise unset \if@cref@abbrev% \crefname@preamble{equation}{eq.}{eqs.}% \crefname@preamble{figure}{fig.}{figs.}% \else% \crefname@preamble{equation}{equation}{equations}% \crefname@preamble{figure}{figure}{figures}% \fi% \crefname@preamble{page}{page}{pages}% \crefname@preamble{table}{table}{tables}% \crefname@preamble{part}{part}{parts}% \crefname@preamble{chapter}{chapter}{chapters}% \crefname@preamble{section}{section}{sections}% \crefname@preamble{appendix}{appendix}{appendices}% \crefname@preamble{enumi}{item}{items}% \crefname@preamble{footnote}{footnote}{footnotes}% \crefname@preamble{theorem}{theorem}{theorems}% \crefname@preamble{lemma}{lemma}{lemmas}% \crefname@preamble{corollary}{corollary}{corollaries}% \crefname@preamble{proposition}{proposition}{propositions}% \crefname@preamble{definition}{definition}{definitions}% \crefname@preamble{result}{result}{results}% \crefname@preamble{example}{example}{examples}% \crefname@preamble{remark}{remark}{remarks}% \crefname@preamble{note}{note}{notes}% \crefname@preamble{algorithm}{algorithm}{algorithms}% \crefname@preamble{listing}{listing}{listings}% \crefname@preamble{line}{line}{lines}% \fi% \def\cref@language{english}% }}% end \AtBeginDocument and \DeclareOption \cref@addlanguagedefs{english}{% \PackageInfo{cleveref}{loaded `english' language definitions} \renewcommand{\crefrangeconjunction}{ to\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ and\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ and\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ and\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{, and\nobreakspace}% % \Crefname{equation}{Equation}{Equations}% \Crefname{figure}{Figure}{Figures}% \Crefname{subfigure}{Figure}{Figures}% \Crefname{table}{Table}{Tables}% \Crefname{subtable}{Table}{Tables}% \Crefname{page}{Page}{Pages}% \Crefname{part}{Part}{Parts}% \Crefname{chapter}{Chapter}{Chapters}% \Crefname{section}{Section}{Sections}% \Crefname{subsection}{Section}{Sections}% \Crefname{subsubsection}{Section}{Sections}% \Crefname{appendix}{Appendix}{Appendices}% \Crefname{subappendix}{Appendix}{Appendices}% \Crefname{subsubappendix}{Appendix}{Appendices}% \Crefname{subsubsubappendix}{Appendix}{Appendices}% \Crefname{enumi}{Item}{Items}% \Crefname{enumii}{Item}{Items}% \Crefname{enumiii}{Item}{Items}% \Crefname{enumiv}{Item}{Items}% \Crefname{enumv}{Item}{Items}% \Crefname{footnote}{Footnote}{Footnotes}% \Crefname{theorem}{Theorem}{Theorems}% \Crefname{lemma}{Lemma}{Lemmas}% \Crefname{corollary}{Corollary}{Corollaries}% \Crefname{proposition}{Proposition}{Propositions}% \Crefname{definition}{Definition}{Definitions}% \Crefname{result}{Result}{Results}% \Crefname{example}{Example}{Examples}% \Crefname{remark}{Remark}{Remarks}% \Crefname{note}{Note}{Notes}% \Crefname{algorithm}{Algorithm}{Algorithms}% \Crefname{listing}{Listing}{Listings}% \Crefname{line}{Line}{Lines}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname{equation}{Eq.}{Eqs.}% \crefname{figure}{Fig.}{Figs.}% \crefname{subfigure}{Fig.}{Figs.}% \else% \crefname{equation}{Equation}{Equations}% \crefname{figure}{Figure}{Figures}% \crefname{subfigure}{Figure}{Figures}% \fi% \crefname{page}{Page}{Pages}% \crefname{table}{Table}{Tables}% \crefname{subtable}{Table}{Tables}% \crefname{part}{Part}{Parts}% \crefname{chapter}{Chapter}{Chapters}% \crefname{section}{Section}{Sections}% \crefname{subsection}{Section}{Sections}% \crefname{subsubsection}{Section}{Sections}% \crefname{appendix}{Appendix}{Appendices}% \crefname{subappendix}{Appendix}{Appendices}% \crefname{subsubappendix}{Appendix}{Appendices}% \crefname{subsubsubappendix}{Appendix}{Appendices}% \crefname{enumi}{Item}{Items}% \crefname{enumii}{Item}{Items}% \crefname{enumiii}{Item}{Items}% \crefname{enumiv}{Item}{Items}% \crefname{enumv}{Item}{Items}% \crefname{footnote}{Footnote}{Footnotes}% \crefname{theorem}{Theorem}{Theorems}% \crefname{lemma}{Lemma}{Lemmas}% \crefname{corollary}{Corollary}{Corollaries}% \crefname{proposition}{Proposition}{Propositions}% \crefname{definition}{Definition}{Definitions}% \crefname{result}{Result}{Results}% \crefname{example}{Example}{Examples}% \crefname{remark}{Remark}{Remarks}% \crefname{note}{Note}{Notes}% \crefname{algorithm}{Algorithm}{Algorithms}% \crefname{listing}{Listing}{Listings}% \crefname{line}{Line}{Lines}% % \else% capitalise unset \if@cref@abbrev% \crefname{equation}{eq.}{eqs.}% \crefname{figure}{fig.}{figs.}% \crefname{subfigure}{fig.}{figs.}% \else% \crefname{equation}{equation}{equations}% \crefname{figure}{figure}{figures}% \crefname{subfigure}{figure}{figures}% \fi% \crefname{table}{table}{tables}% \crefname{subtable}{table}{tables}% \crefname{page}{page}{pages}% \crefname{part}{part}{parts}% \crefname{chapter}{chapter}{chapters}% \crefname{section}{section}{sections}% \crefname{subsection}{section}{sections}% \crefname{subsubsection}{section}{sections}% \crefname{appendix}{appendix}{appendices}% \crefname{subappendix}{appendix}{appendices}% \crefname{subsubappendix}{appendix}{appendices}% \crefname{subsubsubappendix}{appendix}{appendices}% \crefname{enumi}{item}{items}% \crefname{enumii}{item}{items}% \crefname{enumiii}{item}{items}% \crefname{enumiv}{item}{items}% \crefname{enumv}{item}{items}% \crefname{footnote}{footnote}{footnotes}% \crefname{theorem}{theorem}{theorems}% \crefname{lemma}{lemma}{lemmas}% \crefname{corollary}{corollary}{corollaries}% \crefname{proposition}{proposition}{propositions}% \crefname{definition}{definition}{definitions}% \crefname{result}{result}{results}% \crefname{example}{example}{examples}% \crefname{remark}{remark}{remarks}% \crefname{note}{note}{notes}% \crefname{algorithm}{algorithm}{algorithms}% \crefname{listing}{listing}{listings}% \crefname{line}{line}{lines}% \fi}% end \cref@addlangagedefs \DeclareOption{german}{% \AtBeginDocument{% \def\crefrangeconjunction@preamble{ bis\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ und\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ und\nobreakspace}% \def\crefpairgroupconjunction@preamble{ und\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ und\nobreakspace}% % \Crefname@preamble{equation}{Gleichung}{Gleichungen}% \Crefname@preamble{figure}{Abbildung}{Abbildungen}% \Crefname@preamble{table}{Tabelle}{Tabellen}% \Crefname@preamble{page}{Seite}{Seiten}% \Crefname@preamble{part}{Teil}{Teile}% \Crefname@preamble{chapter}{Kapitel}{Kapitel}% \Crefname@preamble{section}{Abschnitt}{Abschnitte}% \Crefname@preamble{appendix}{Anhang}{Anh\"ange}% \Crefname@preamble{enumi}{Punkt}{Punkte}% \Crefname@preamble{footnote}{Fu\ss note}{Fu\ss noten}% \Crefname@preamble{theorem}{Theorem}{Theoreme}% \Crefname@preamble{lemma}{Lemma}{Lemmata}% \Crefname@preamble{corollary}{Korollar}{Korollare}% \Crefname@preamble{proposition}{Satz}{S\"atze}% \Crefname@preamble{definition}{Definition}{Definitionen}% \Crefname@preamble{result}{Ergebnis}{Ergebnisse}% \Crefname@preamble{example}{Beispiel}{Beispiele}% \Crefname@preamble{remark}{Bemerkung}{Bemerkungen}% \Crefname@preamble{note}{Anmerkung}{Anmerkungen}% \Crefname@preamble{algorithm}{Algorithmus}{Algorithmen}% \Crefname@preamble{listing}{Listing}{Listings}% \Crefname@preamble{line}{Zeile}{Zeilen}% % \crefname@preamble{equation}{Gleichung}{Gleichungen}% \crefname@preamble{figure}{Abbildung}{Abbildungen}% \crefname@preamble{table}{Tabelle}{Tabellen}% \crefname@preamble{page}{Seite}{Seiten}% \crefname@preamble{part}{Teil}{Teile}% \crefname@preamble{chapter}{Kapitel}{Kapitel}% \crefname@preamble{section}{Abschnitt}{Abschnitte}% \crefname@preamble{appendix}{Anhang}{Anh\"ange}% \crefname@preamble{enumi}{Punkt}{Punkte}% \crefname@preamble{footnote}{Fu\ss note}{Fu\ss noten}% \crefname@preamble{theorem}{Theorem}{Theoreme}% \crefname@preamble{lemma}{Lemma}{Lemmata}% \crefname@preamble{corollary}{Korollar}{Korollare}% \crefname@preamble{proposition}{Satz}{S\"atze}% \crefname@preamble{definition}{Definition}{Definitionen}% \crefname@preamble{result}{Ergebnis}{Ergebnisse}% \crefname@preamble{example}{Beispiel}{Beispiele}% \crefname@preamble{remark}{Bemerkung}{Bemerkungen}% \crefname@preamble{note}{Anmerkung}{Anmerkungen}% \crefname@preamble{algorithm}{Algorithmus}{Algorithmen}% \crefname@preamble{listing}{Listing}{Listings}% \crefname@preamble{line}{Zeile}{Zeilen}% \def\cref@language{german}% }}% end \AtBeginDocument and \DeclareOption \cref@addlanguagedefs{german}{% \PackageInfo{cleveref}{loaded `german language definitions} \renewcommand{\crefrangeconjunction}{ bis\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ und\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ und\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ und\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ und\nobreakspace}% % \Crefname{equation}{Gleichung}{Gleichungen}% \Crefname{figure}{Abbildung}{Abbildungen}% \Crefname{subfigure}{Abbildung}{Abbildungen}% \Crefname{table}{Tabelle}{Tabellen}% \Crefname{subtable}{Tabelle}{Tabellen}% \Crefname{page}{Seite}{Seiten}% \Crefname{part}{Teil}{Teile}% \Crefname{chapter}{Kapitel}{Kapitel}% \Crefname{section}{Abschnitt}{Abschnitte}% \Crefname{subsection}{Abschnitt}{Abschnitte}% \Crefname{subsubsection}{Abschnitt}{Abschnitte}% \Crefname{appendix}{Anhang}{Anh\"ange}% \Crefname{subappendix}{Anhang}{Anh\"ange}% \Crefname{subsubappendix}{Anhang}{Anh\"ange}% \Crefname{subsubsubappendix}{Anhang}{Anh\"ange}% \Crefname{enumi}{Punkt}{Punkte}% \Crefname{enumii}{Punkt}{Punkte}% \Crefname{enumiii}{Punkt}{Punkte}% \Crefname{enumiv}{Punkt}{Punkte}% \Crefname{enumv}{Punkt}{Punkte}% \Crefname{footnote}{Fu\ss note}{Fu\ss noten}% \Crefname{theorem}{Theorem}{Theoreme}% \Crefname{lemma}{Lemma}{Lemmata}% \Crefname{corollary}{Korollar}{Korollare}% \Crefname{proposition}{Satz}{S\"atze}% \Crefname{definition}{Definition}{Definitionen}% \Crefname{result}{Ergebnis}{Ergebnisse}% \Crefname{example}{Beispiel}{Beispiele}% \Crefname{remark}{Bemerkung}{Bemerkungen}% \Crefname{note}{Anmerkung}{Anmerkungen}% \Crefname{algorithm}{Algorithmus}{Algorithmen}% \Crefname{listing}{Listing}{Listings}% \Crefname{line}{Zeile}{Zeilen}% % \crefname{equation}{Gleichung}{Gleichungen}% \crefname{figure}{Abbildung}{Abbildungen}% \crefname{subfigure}{Abbildung}{Abbildungen}% \crefname{table}{Tabelle}{Tabellen}% \crefname{subtable}{Tabelle}{Tabellen}% \crefname{page}{Seite}{Seiten}% \crefname{part}{Teil}{Teile}% \crefname{chapter}{Kapitel}{Kapitel}% \crefname{section}{Abschnitt}{Abschnitte}% \crefname{subsection}{Abschnitt}{Abschnitte}% \crefname{subsubsection}{Abschnitt}{Abschnitte}% \crefname{appendix}{Anhang}{Anh\"ange}% \crefname{subappendix}{Anhang}{Anh\"ange}% \crefname{subsubappendix}{Anhang}{Anh\"ange}% \crefname{subsubsubappendix}{Anhang}{Anh\"ange}% \crefname{enumi}{Punkt}{Punkte}% \crefname{enumii}{Punkt}{Punkte}% \crefname{enumiii}{Punkt}{Punkte}% \crefname{enumiv}{Punkt}{Punkte}% \crefname{enumv}{Punkt}{Punkte}% \crefname{footnote}{Fu\ss note}{Fu\ss noten}% \crefname{theorem}{Theorem}{Theoreme}% \crefname{lemma}{Lemma}{Lemmata}% \crefname{corollary}{Korollar}{Korollare}% \crefname{proposition}{Satz}{S\"atze}% \crefname{definition}{Definition}{Definitionen}% \crefname{result}{Ergebnis}{Ergebnisse}% \crefname{example}{Beispiel}{Beispiele}% \crefname{remark}{Bemerkung}{Bemerkungen}% \crefname{note}{Anmerkung}{Anmerkungen}% \crefname{algorithm}{Algorithmus}{Algorithmen}% \crefname{listing}{Listing}{Listings}% \crefname{line}{Zeile}{Zeilen}}% end \cref@addlangagedefs \DeclareOption{ngerman}{% \ExecuteOptions{german} \def\cref@language{ngerman}} \cref@addlanguagedefs{ngerman}{% \PackageInfo{cleveref}{loaded `ngerman' language definitions} \renewcommand{\crefrangeconjunction}{ bis\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ und\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ und\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ und\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ und\nobreakspace}% % \Crefname{equation}{Gleichung}{Gleichungen}% \Crefname{figure}{Abbildung}{Abbildungen}% \Crefname{subfigure}{Abbildung}{Abbildungen}% \Crefname{table}{Tabelle}{Tabellen}% \Crefname{subtable}{Tabelle}{Tabellen}% \Crefname{page}{Seite}{Seiten}% \Crefname{part}{Teil}{Teile}% \Crefname{chapter}{Kapitel}{Kapitel}% \Crefname{section}{Abschnitt}{Abschnitte}% \Crefname{subsection}{Abschnitt}{Abschnitte}% \Crefname{subsubsection}{Abschnitt}{Abschnitte}% \Crefname{appendix}{Anhang}{Anh\"ange}% \Crefname{subappendix}{Anhang}{Anh\"ange}% \Crefname{subsubappendix}{Anhang}{Anh\"ange}% \Crefname{subsubsubappendix}{Anhang}{Anh\"ange}% \Crefname{enumi}{Punkt}{Punkte}% \Crefname{enumii}{Punkt}{Punkte}% \Crefname{enumiii}{Punkt}{Punkte}% \Crefname{enumiv}{Punkt}{Punkte}% \Crefname{enumv}{Punkt}{Punkte}% \Crefname{footnote}{Fu\ss note}{Fu\ss noten}% \Crefname{theorem}{Theorem}{Theoreme}% \Crefname{lemma}{Lemma}{Lemmata}% \Crefname{corollary}{Korollar}{Korollare}% \Crefname{proposition}{Satz}{S\"atze}% \Crefname{definition}{Definition}{Definitionen}% \Crefname{result}{Ergebnis}{Ergebnisse}% \Crefname{example}{Beispiel}{Beispiele}% \Crefname{remark}{Bemerkung}{Bemerkungen}% \Crefname{note}{Anmerkung}{Anmerkungen}% \Crefname{algorithm}{Algorithmus}{Algorithmen}% \Crefname{listing}{Listing}{Listings}% \Crefname{line}{Zeile}{Zeilen}% % \crefname{equation}{Gleichung}{Gleichungen}% \crefname{figure}{Abbildung}{Abbildungen}% \crefname{subfigure}{Abbildung}{Abbildungen}% \crefname{table}{Tabelle}{Tabellen}% \crefname{subtable}{Tabelle}{Tabellen}% \crefname{page}{Seite}{Seiten}% \crefname{part}{Teil}{Teile}% \crefname{chapter}{Kapitel}{Kapitel}% \crefname{section}{Abschnitt}{Abschnitte}% \crefname{subsection}{Abschnitt}{Abschnitte}% \crefname{subsubsection}{Abschnitt}{Abschnitte}% \crefname{appendix}{Anhang}{Anh\"ange}% \crefname{subappendix}{Anhang}{Anh\"ange}% \crefname{subsubappendix}{Anhang}{Anh\"ange}% \crefname{subsubsubappendix}{Anhang}{Anh\"ange}% \crefname{enumi}{Punkt}{Punkte}% \crefname{enumii}{Punkt}{Punkte}% \crefname{enumiii}{Punkt}{Punkte}% \crefname{enumiv}{Punkt}{Punkte}% \crefname{enumv}{Punkt}{Punkte}% \crefname{footnote}{Fu\ss note}{Fu\ss noten}% \crefname{theorem}{Theorem}{Theoreme}% \crefname{lemma}{Lemma}{Lemmata}% \crefname{corollary}{Korollar}{Korollare}% \crefname{proposition}{Satz}{S\"atze}% \crefname{definition}{Definition}{Definitionen}% \crefname{result}{Ergebnis}{Ergebnisse}% \crefname{example}{Beispiel}{Beispiele}% \crefname{remark}{Bemerkung}{Bemerkungen}% \crefname{note}{Anmerkung}{Anmerkungen}% \crefname{algorithm}{Algorithmus}{Algorithmen}% \crefname{listing}{Listing}{Listings}% \crefname{line}{Zeile}{Zeilen}}% end \cref@addlangagedefs \DeclareOption{dutch}{% \AtBeginDocument{% \def\crefrangeconjunction@preamble{ tot\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ en\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ en\nobreakspace}% \def\crefpairgroupconjunction@preamble{ en\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ en\nobreakspace}% % \Crefname@preamble{equation}{Vergel\ij{}king}{Vergel\ij{}kingen}% \Crefname@preamble{figure}{Figuur}{Figuren}% \Crefname@preamble{table}{Tabel}{Tabellen}% \Crefname@preamble{page}{Pagina}{Pagina's}% \Crefname@preamble{part}{Deel}{Delen}% \Crefname@preamble{chapter}{Hoofdstuk}{Hoofdstuken}% \Crefname@preamble{section}{Paragraaf}{Paragrafen}% \Crefname@preamble{appendix}{Appendix}{Appendices}% \Crefname@preamble{enumi}{Punt}{Punten}% \Crefname@preamble{footnote}{Voetnote}{Voetnoten}% \Crefname@preamble{lemma}{Lemma}{Lemma's}% \Crefname@preamble{corollary}{Corollarium}{Corollaria}% \Crefname@preamble{proposition}{Bewering}{Beweringen}% \Crefname@preamble{definition}{Definitie}{Definities}% \Crefname@preamble{result}{Resultaat}{Resultaten}% \Crefname@preamble{example}{Voorbeeld}{Voorbeelden}% \Crefname@preamble{remark}{Opmerking}{Opmerkingen}% \Crefname@preamble{note}{Aantekening}{Aantekeningen}% \Crefname@preamble{algorithm}{Algoritme}{Algoritmen}% \Crefname@preamble{listing}{Listing}{Listings}% \Crefname@preamble{line}{Lijn}{Lijnen}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname@preamble{equation}{Verg.}{Verg's.}% \crefname@preamble{figure}{Fig.}{Fig's.}% \else% \crefname@preamble{equation}{Vergel\ij{}king}{Vergel\ij{}kingen}% \crefname@preamble{figure}{Figuur}{Figuren}% \fi% \crefname@preamble{page}{Pagina}{Pagina's}% \crefname@preamble{table}{Tabel}{Tabellen}% \crefname@preamble{part}{Deel}{Delen}% \crefname@preamble{chapter}{Hoofdstuk}{Hoofdstukken}% \crefname@preamble{section}{Paragraaf}{Paragrafen}% \crefname@preamble{appendix}{Appendix}{Appendices}% \crefname@preamble{enumi}{Punt}{Punten}% \crefname@preamble{footnote}{Voetnote}{Voetnoten}% \crefname@preamble{theorem}{Theorema}{Theorema's}% \crefname@preamble{lemma}{Lemma}{Lemma's}% \crefname@preamble{corollary}{Corollarium}{Corollaria}% \crefname@preamble{proposition}{Bewering}{Beweringen}% \crefname@preamble{definition}{Definitie}{Definities}% \crefname@preamble{result}{Resultaat}{Resultaten}% \crefname@preamble{example}{Voorbeeld}{Voorbeelden}% \crefname@preamble{remark}{Opmerking}{Opmerkingen}% \crefname@preamble{note}{Aantekening}{Aantekeningen}% \crefname@preamble{algorithm}{Algoritme}{Algoritmen}% \crefname@preamble{listing}{Listing}{Listings}% \crefname@preamble{line}{Lijn}{Lijnen}% % \else% capitalise unset \if@cref@abbrev% \crefname@preamble{equation}{verg.}{verg's.}% \crefname@preamble{figure}{fig.}{fig's.}% \else% \crefname@preamble{equation}{vergel\ij{}king}{vergel\ij{}kingen}% \crefname@preamble{figure}{figuur}{figuren}% \fi% \crefname@preamble{page}{pagina}{pagina's}% \crefname@preamble{table}{tabel}{tabellen}% \crefname@preamble{part}{deel}{delen}% \crefname@preamble{chapter}{hoofdstuk}{hoofdstukken}% \crefname@preamble{section}{paragraaf}{paragrafen}% \crefname@preamble{appendix}{appendix}{appendices}% \crefname@preamble{enumi}{punt}{punten}% \crefname@preamble{footnote}{voetnote}{voetnoten}% \crefname@preamble{theorem}{theorema}{theorema's}% \crefname@preamble{lemma}{lemma}{lemma's}% \crefname@preamble{corollary}{corollarium}{corollaria}% \crefname@preamble{proposition}{bewering}{beweringen}% \crefname@preamble{definition}{definitie}{definities}% \crefname@preamble{result}{resultaat}{resultaten}% \crefname@preamble{example}{voorbeeld}{voorbeelden}% \crefname@preamble{remark}{opmerking}{opmerkingen}% \crefname@preamble{note}{aantekening}{aantekeningen}% \crefname@preamble{algorithm}{algoritme}{algoritmen}% \crefname@preamble{listing}{listing}{listings}% \crefname@preamble{line}{lijn}{lijnen}% \fi% \def\cref@language{dutch}% }}% end \DeclareOption and \AtBeginDocument \cref@addlanguagedefs{dutch}{% \PackageInfo{cleveref}{loaded `dutch' language definitions} \renewcommand{\crefrangeconjunction}{ tot\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ en\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ en\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ en\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ en\nobreakspace}% % \Crefname{equation}{Vergel\ij{}king}{Vergel\ij{}kingen}% \Crefname{figure}{Figuur}{Figuren}% \Crefname{subfigure}{Figuur}{Figuren}% \Crefname{table}{Tabel}{Tabellen}% \Crefname{subtable}{Tabel}{Tabellen}% \Crefname{page}{Pagina}{Pagina's}% \Crefname{part}{Deel}{Delen}% \Crefname{chapter}{Hoofdstuk}{Hoofdstuken}% \Crefname{section}{Paragraaf}{Paragrafen}% \Crefname{subsection}{Paragraaf}{Paragrafen}% \Crefname{subsubsection}{Paragraaf}{Paragrafen}% \Crefname{appendix}{Appendix}{Appendices}% \Crefname{subappendix}{Appendix}{Appendices}% \Crefname{subsubappendix}{Appendix}{Appendices}% \Crefname{subsubsubappendix}{Appendix}{Appendices}% \Crefname{enumi}{Punt}{Punten}% \Crefname{enumii}{Punt}{Punten}% \Crefname{enumiii}{Punt}{Punten}% \Crefname{enumiv}{Punt}{Punten}% \Crefname{enumv}{Punt}{Punten}% \Crefname{footnote}{Voetnote}{Voetnoten}% \Crefname{theorem}{Theorema}{Theorema's}% \Crefname{lemma}{Lemma}{Lemma's}% \Crefname{corollary}{Corollarium}{Corollaria}% \Crefname{proposition}{Bewering}{Beweringen}% \Crefname{definition}{Definitie}{Definities}% \Crefname{result}{Resultaat}{Resultaten}% \Crefname{example}{Voorbeeld}{Voorbeelden}% \Crefname{remark}{Opmerking}{Opmerkingen}% \Crefname{note}{Aantekening}{Aantekeningen}% \Crefname{algorithm}{Algoritme}{Algoritmen}% \Crefname{listing}{Listing}{Listings}% \Crefname{line}{Lijn}{Lijnen}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname{equation}{Verg.}{Verg's.}% \crefname{figure}{Fig.}{Fig's.}% \crefname{subfigure}{Fig.}{Fig's.}% \else% \crefname{equation}{Vergel\ij{}king}{Vergel\ij{}kingen}% \crefname{figure}{Figuur}{Figuren}% \crefname{subfigure}{Figuur}{Figuren}% \fi% \crefname{table}{Tabel}{Tabellen}% \crefname{subtable}{Tabel}{Tabellen}% \crefname{page}{Pagina}{Pagina's}% \crefname{part}{Deel}{Delen}% \crefname{chapter}{Hoofdstuk}{Hoofdstukken}% \crefname{section}{Paragraaf}{Paragrafen}% \crefname{appendix}{Appendix}{Appendices}% \crefname{enumi}{Punt}{Punten}% \crefname{footnote}{Voetnote}{Voetnoten}% \crefname{theorem}{Theorema}{Theorema's}% \crefname{lemma}{Lemma}{Lemma's}% \crefname{corollary}{Corollarium}{Corollaria}% \crefname{proposition}{Bewering}{Beweringen}% \crefname{definition}{Definitie}{Definities}% \crefname{result}{Resultaat}{Resultaten}% \crefname{example}{Voorbeeld}{Voorbeelden}% \crefname{remark}{Opmerking}{Opmerkingen}% \crefname{note}{Aantekening}{Aantekeningen}% \crefname{algorithm}{Algoritme}{Algoritmen}% \crefname{listing}{Listing}{Listings}% \crefname{line}{Lijn}{Lijnen}% % \else% capitalise unset \if@cref@abbrev% \crefname{equation}{verg.}{verg's.}% \crefname{figure}{fig.}{fig's.}% \crefname{subfigure}{fig.}{fig's.}% \else% \crefname{equation}{vergel\ij{}king}{vergel\ij{}kingen}% \crefname{figure}{figuur}{figuren}% \crefname{subfigure}{figuur}{figuren}% \fi% \crefname{table}{tabel}{tabellen}% \crefname{subtable}{tabel}{tabellen}% \crefname{page}{pagina}{pagina's}% \crefname{part}{deel}{delen}% \crefname{chapter}{hoofdstuk}{hoofdstukken}% \crefname{section}{paragraaf}{paragrafen}% \crefname{appendix}{appendix}{appendices}% \crefname{enumi}{punt}{punten}% \crefname{footnote}{voetnote}{voetnoten}% \crefname{theorem}{theorema}{theorema's}% \crefname{lemma}{lemma}{lemma's}% \crefname{corollary}{corollarium}{corollaria}% \crefname{proposition}{bewering}{beweringen}% \crefname{definition}{definitie}{definities}% \crefname{result}{resultaat}{resultaten}% \crefname{example}{voorbeeld}{voorbeelden}% \crefname{remark}{opmerking}{opmerkingen}% \crefname{note}{aantekening}{aantekeningen}% \crefname{algorithm}{algoritme}{algoritmen}% \crefname{listing}{listing}{listings}% \crefname{line}{lijn}{lijnen}% \fi}% end \cref@addlanguagedefs \DeclareOption{french}{% \AtBeginDocument{% \def\crefrangeconjunction@preamble{ \`a\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ et\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ et\nobreakspace}% \def\crefpairgroupconjunction@preamble{ et\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{, et\nobreakspace}% % \Crefname@preamble{equation}{{\'E}quation}{{\'E}quations}% \Crefname@preamble{figure}{Figure}{Figures}% \Crefname@preamble{table}{Tableau}{Tableaux}% \Crefname@preamble{page}{Page}{Pages}% \Crefname@preamble{part}{Partie}{Parties}% \Crefname@preamble{chapter}{Chapitre}{Chapitres}% \Crefname@preamble{section}{Section}{Sections}% \Crefname@preamble{appendix}{Annexe}{Annexes}% \Crefname@preamble{enumi}{Point}{Points}% \Crefname@preamble{footnote}{Note}{Notes}% \Crefname@preamble{theorem}{Th\'eor\`eme}{Th\'eor\`emes}% \Crefname@preamble{lemma}{Lemme}{Lemmes}% \Crefname@preamble{corollary}{Corollaire}{Corollaires}% \Crefname@preamble{proposition}{Proposition}{Propositions}% \Crefname@preamble{definition}{D\'efinition}{D\'efinitions}% \Crefname@preamble{result}{R\'esultat}{R\'esultats}% \Crefname@preamble{example}{Exemple}{Exemples}% \Crefname@preamble{remark}{Remarque}{Remarques}% \Crefname@preamble{algorithm}{Algorithme}{Algorithmes}% \Crefname@preamble{listing}{Liste}{Listes}% \Crefname@preamble{line}{Ligne}{Lignes}% % \if@cref@capitalise% capitalise set \crefname@preamble{equation}{{\'E}quation}{{\'E}quations}% \crefname@preamble{figure}{Figure}{Figures}% \crefname@preamble{table}{Tableau}{Tableaux}% \crefname@preamble{page}{Page}{Pages}% \crefname@preamble{part}{Partie}{Parties}% \crefname@preamble{chapter}{Chapitre}{Chapitres}% \crefname@preamble{section}{Section}{Sections}% \crefname@preamble{appendix}{Annexe}{Annexes}% \crefname@preamble{enumi}{Point}{Points}% \crefname@preamble{footnote}{Note}{Notes}% \crefname@preamble{theorem}{Th\'eor\`eme}{Th\'eor\`emes}% \crefname@preamble{lemma}{Lemme}{Lemmes}% \crefname@preamble{corollary}{Corollaire}{Corollaires}% \crefname@preamble{proposition}{Proposition}{Propositions}% \crefname@preamble{definition}{D\'efinition}{D\'efinitions}% \crefname@preamble{result}{R\'esultat}{R\'esultats}% \crefname@preamble{example}{Exemple}{Exemples}% \crefname@preamble{remark}{Remarque}{Remarques}% \crefname@preamble{note}{Commentaire}{Commentaires}% \crefname@preamble{algorithm}{Algorithme}{Algorithmes}% \crefname@preamble{listing}{Liste}{Listes}% \crefname@preamble{line}{Ligne}{Lignes}% % \else% capitalise unset \crefname@preamble{equation}{{\'e}quation}{{\'e}quations}% \crefname@preamble{figure}{figure}{figures}% \crefname@preamble{table}{tableau}{tableaux}% \crefname@preamble{page}{page}{pages}% \crefname@preamble{part}{partie}{parties}% \crefname@preamble{chapter}{chapitre}{chapitres}% \crefname@preamble{section}{section}{sections}% \crefname@preamble{appendix}{annexe}{annexes}% \crefname@preamble{enumi}{point}{points}% \crefname@preamble{footnote}{note}{notes}% \crefname@preamble{theorem}{th\'eor\`eme}{th\'eor\`emes}% \crefname@preamble{lemma}{lemme}{lemmes}% \crefname@preamble{corollary}{corollaire}{corollaires}% \crefname@preamble{proposition}{proposition}{propositions}% \crefname@preamble{definition}{d\'efinition}{d\'efinitions}% \crefname@preamble{result}{r\'esultat}{r\'esultats}% \crefname@preamble{example}{exemple}{exemples}% \crefname@preamble{remark}{remarque}{remarques}% \crefname@preamble{note}{commentaire}{commentaires}% \crefname@preamble{algorithm}{algorithme}{algorithmes}% \crefname@preamble{listing}{liste}{listes}% \crefname@preamble{line}{ligne}{lignes}% \fi% \def\cref@language{french}% }}% end \DeclareOption and \AtBeginDocument \cref@addlanguagedefs{french}{% \PackageInfo{cleveref}{loaded `french' language definitions} \renewcommand{\crefrangeconjunction}{ \`a\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ et\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ et\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ et\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ et\nobreakspace}% % \Crefname{equation}{{\'E}quation}{{\'E}quations}% \Crefname{figure}{Figure}{Figures}% \Crefname{subfigure}{Figure}{Figures}% \Crefname{table}{Tableau}{Tableaux}% \Crefname{subtable}{Tableau}{Tableaux}% \Crefname{page}{Page}{Pages}% \Crefname{part}{Partie}{Parties}% \Crefname{chapter}{Chapitre}{Chapitres}% \Crefname{section}{Section}{Sections}% \Crefname{subsection}{Section}{Sections}% \Crefname{subsubsection}{Section}{Sections}% \Crefname{appendix}{Annexe}{Annexes}% \Crefname{subappendix}{Annexe}{Annexes}% \Crefname{subsubappendix}{Annexe}{Annexes}% \Crefname{subsubsubappendix}{Annexe}{Annexes}% \Crefname{enumi}{Point}{Points}% \Crefname{enumii}{Point}{Points}% \Crefname{enumiii}{Point}{Points}% \Crefname{enumiv}{Point}{Points}% \Crefname{enumv}{Point}{Points}% \Crefname{footnote}{Note}{Notes}% \Crefname{theorem}{Th\'eor\`eme}{Th\'eor\`emes}% \Crefname{lemma}{Lemme}{Lemmes}% \Crefname{corollary}{Corollaire}{Corollaires}% \Crefname{proposition}{Proposition}{Propositions}% \Crefname{definition}{D\'efinition}{D\'efinitions}% \Crefname{result}{R\'esultat}{R\'esultats}% \Crefname{example}{Exemple}{Exemples}% \Crefname{remark}{Remarque}{Remarques}% \Crefname{note}{Commentaire}{Commentaires}% \Crefname{algorithm}{Algorithme}{Algorithmes}% \Crefname{listing}{Liste}{Listes}% \Crefname{line}{Ligne}{Lignes}% % \if@cref@capitalise% capitalise set \crefname{equation}{{\'E}quation}{{\'E}quations}% \crefname{figure}{Figure}{Figures}% \crefname{subfigure}{Figure}{Figures}% \crefname{table}{Tableau}{Tableaux}% \crefname{subtable}{Tableau}{Tableaux}% \crefname{page}{Page}{Pages}% \crefname{part}{Partie}{Parties}% \crefname{chapter}{Chapitre}{Chapitres}% \crefname{section}{Section}{Sections}% \crefname{subsection}{Section}{Sections}% \crefname{subsubsection}{Section}{Sections}% \crefname{appendix}{Annexe}{Annexes}% \crefname{subappendix}{Annexe}{Annexes}% \crefname{subsubappendix}{Annexe}{Annexes}% \crefname{subsubsubappendix}{Annexe}{Annexes}% \crefname{enumi}{Point}{Points}% \crefname{enumii}{Point}{Points}% \crefname{enumiii}{Point}{Points}% \crefname{enumiv}{Point}{Points}% \crefname{enumv}{Point}{Points}% \crefname{footnote}{Note}{Notes}% \crefname{theorem}{Th\'eor\`eme}{Th\'eor\`emes}% \crefname{lemma}{Lemme}{Lemmes}% \crefname{corollary}{Corollaire}{Corollaires}% \crefname{proposition}{Proposition}{Propositions}% \crefname{definition}{D\'efinition}{D\'efinitions}% \crefname{result}{R\'esultat}{R\'esultats}% \crefname{example}{Exemple}{Exemples}% \crefname{remark}{Remarque}{Remarques}% \crefname{note}{Commentaire}{Commentaires}% \crefname{algorithm}{Algorithme}{Algorithmes}% \crefname{listing}{Liste}{Listes}% \crefname{line}{Ligne}{Lignes}% % \else% capitalise unset \crefname{equation}{{\'e}quation}{{\'e}quations}% \crefname{figure}{figure}{figures}% \crefname{subfigure}{figure}{figures}% \crefname{table}{tableau}{tableaux}% \crefname{subtable}{tableau}{tableaux}% \crefname{page}{page}{pages}% \crefname{part}{partie}{parties}% \crefname{chapter}{chapitre}{chapitres}% \crefname{section}{section}{sections}% \crefname{subsection}{section}{sections}% \crefname{subsubsection}{section}{sections}% \crefname{appendix}{annexe}{annexes}% \crefname{subappendix}{annexe}{annexes}% \crefname{subsubappendix}{annexe}{annexes}% \crefname{subsubsubappendix}{annexe}{annexes}% \crefname{enumi}{point}{points}% \crefname{enumii}{point}{points}% \crefname{enumiii}{point}{points}% \crefname{enumiv}{point}{points}% \crefname{enumv}{point}{points}% \crefname{footnote}{note}{notes}% \crefname{theorem}{th\'eor\`eme}{th\'eor\`emes}% \crefname{lemma}{lemme}{lemmes}% \crefname{corollary}{corollaire}{corollaires}% \crefname{proposition}{proposition}{propositions}% \crefname{definition}{d\'efinition}{d\'efinitions}% \crefname{result}{r\'esultat}{r\'esultats}% \crefname{example}{exemple}{exemples}% \crefname{remark}{remarque}{remarques}% \crefname{note}{commentaire}{commentaires}% \crefname{algorithm}{algorithme}{algorithmes}% \crefname{listing}{liste}{listes}% \crefname{line}{ligne}{lignes}% \fi}% end \cref@loadlanguagedefs \DeclareOption{spanish}{% \AtBeginDocument{% \def\crefrangeconjunction@preamble{ a\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ y\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ y\nobreakspace}% \def\crefpairgroupconjunction@preamble{ y\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ y\nobreakspace}% % \Crefname@preamble{equation}{Ecuaci\'on}{Ecuaciones}% \Crefname@preamble{figure}{Figura}{Figuras}% \Crefname@preamble{table}{Cuadro}{Cuadros}% \Crefname@preamble{page}{P\'agina}{P\'aginas}% \Crefname@preamble{part}{Parte}{Partes}% \Crefname@preamble{chapter}{Cap\'itulo}{Cap\'itulos}% \Crefname@preamble{section}{Apartado}{Apartados}% \Crefname@preamble{appendix}{Ap\'endice}{Ap\'endices}% \Crefname@preamble{enumi}{Punto}{Puntos}% \Crefname@preamble{footnote}{Nota}{Notas}% \Crefname@preamble{theorem}{Teorema}{Teoremas}% \Crefname@preamble{lemma}{Lema}{Lemas}% \Crefname@preamble{corollary}{Corolario}{Corolarios}% \Crefname@preamble{proposition}{Proposici\'on}{Proposiciones}% \Crefname@preamble{definition}{Definici\'on}{Definiciones}% \Crefname@preamble{result}{Resultado}{Resultados}% \Crefname@preamble{example}{Ejemplo}{Ejemplos}% \Crefname@preamble{remark}{Observaci\'on}{Observaciones}% \Crefname@preamble{note}{Nota}{Notas}% \Crefname@preamble{algorithm}{Algoritmo}{Algoritmos}% \Crefname@preamble{listing}{Listado}{Listados}% \Crefname@preamble{line}{L\'inea}{L\'ineas}% % \if@cref@capitalise% capitalise set \crefname@preamble{equation}{Ecuaci\'on}{Ecuaciones}% \crefname@preamble{figure}{Figura}{Figuras}% \crefname@preamble{table}{Cuadro}{Cuadros}% \crefname@preamble{page}{P\'agina}{P\'aginas}% \crefname@preamble{part}{Parte}{Partes}% \crefname@preamble{chapter}{Cap\'itulo}{Cap\'itulos}% \crefname@preamble{section}{Apartado}{Apartados}% \crefname@preamble{appendix}{Ap\'endice}{Ap\'endices}% \crefname@preamble{enumi}{Punto}{Puntos}% \crefname@preamble{footnote}{Nota}{Notas}% \crefname@preamble{theorem}{Teorema}{Teoremas}% \crefname@preamble{lemma}{Lema}{Lemas}% \crefname@preamble{corollary}{Corolario}{Corolarios}% \crefname@preamble{proposition}{Proposici\'on}{Proposiciones}% \crefname@preamble{definition}{Definici\'on}{Definiciones}% \crefname@preamble{result}{Resultado}{Resultados}% \crefname@preamble{example}{Ejemplo}{Ejemplos}% \crefname@preamble{remark}{Observaci\'on}{Observaciones}% \crefname@preamble{note}{Nota}{Notas}% \crefname@preamble{algorithm}{Algoritmo}{Algoritmos}% \crefname@preamble{listing}{Listado}{Listados}% \crefname@preamble{line}{L\'inea}{L\'ineas}% % \else% capitalise unset \crefname@preamble{equation}{ecuaci\'on}{ecuaciones}% \crefname@preamble{figure}{figura}{figuras}% \crefname@preamble{table}{cuadro}{cuadros}% \crefname@preamble{page}{p\'agina}{p\'aginas}% \crefname@preamble{part}{parte}{partes}% \crefname@preamble{chapter}{cap\'itulo}{cap\'itulos}% \crefname@preamble{section}{apartado}{apartados}% \crefname@preamble{appendix}{ap\'endice}{ap\'endices}% \crefname@preamble{enumi}{punto}{puntos}% \crefname@preamble{footnote}{nota}{notas}% \crefname@preamble{theorem}{teorema}{teoremas}% \crefname@preamble{lemma}{lema}{lemas}% \crefname@preamble{corollary}{corolario}{corolarios}% \crefname@preamble{proposition}{proposici\'on}{proposiciones}% \crefname@preamble{definition}{definici\'on}{definiciones}% \crefname@preamble{result}{resultado}{resultados}% \crefname@preamble{example}{ejemplo}{ejemplos}% \crefname@preamble{remark}{observaci\'on}{observaciones}% \crefname@preamble{note}{nota}{notas}% \crefname@preamble{algorithm}{algoritmo}{algoritmos}% \crefname@preamble{listing}{listado}{listados}% \crefname@preamble{line}{l\'inea}{l\'ineas}% \fi% \def\cref@language{spanish}% }}% end \DeclareOption and \AtBeginDocument \cref@addlanguagedefs{spanish}{% \PackageInfo{cleveref}{loaded `spanish' language definitions} \renewcommand{\crefrangeconjunction}{ a\nobreakspace}% \renewcommand{\crefrangepreconjunction}{}% \renewcommand{\crefrangepostconjunction}{}% \renewcommand{\crefpairconjunction}{ y\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ y\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ y\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ y\nobreakspace}% % \Crefname{equation}{Ecuaci\'on}{Ecuaciones}% \Crefname{figure}{Figura}{Figuras}% \Crefname{subfigure}{Figura}{Figuras}% \Crefname{table}{Cuadro}{Cuadros}% \Crefname{subtable}{Cuadro}{Cuadros}% \Crefname{page}{P\'agina}{P\'aginas}% \Crefname{part}{Parte}{Partes}% \Crefname{chapter}{Cap\'itulo}{Cap\'itulos}% \Crefname{section}{Apartado}{Apartados}% \Crefname{subsection}{Apartado}{Apartados}% \Crefname{subsubsection}{Apartado}{Apartados}% \Crefname{appendix}{Ap\'endice}{Ap\'endices}% \Crefname{subappendix}{Ap\'endice}{Ap\'endices}% \Crefname{subsubappendix}{Ap\'endice}{Ap\'endices}% \Crefname{subsubsubappendix}{Ap\'endice}{Ap\'endices}% \Crefname{enumi}{Punto}{Puntos}% \Crefname{enumii}{Punto}{Puntos}% \Crefname{enumiii}{Punto}{Puntos}% \Crefname{enumiv}{Punto}{Puntos}% \Crefname{enumv}{Punto}{Puntos}% \Crefname{footnote}{Nota}{Notas}% \Crefname{theorem}{Teorema}{Teoremas}% \Crefname{lemma}{Lema}{Lemas}% \Crefname{corollary}{Corolario}{Corolarios}% \Crefname{proposition}{Proposici\'on}{Proposiciones}% \Crefname{definition}{Definici\'on}{Definiciones}% \Crefname{result}{Resultado}{Resultados}% \Crefname{example}{Ejemplo}{Ejemplos}% \Crefname{remark}{Observaci\'on}{Observaci\'on}% \Crefname{note}{Nota}{Notas}% \Crefname{algorithm}{Algoritmo}{Algoritmos}% \Crefname{listing}{Listado}{Listados}% \Crefname{line}{L\'inea}{L\'ineas}% % \if@cref@capitalise% capitalise set \crefname{equation}{Ecuaci\'on}{Ecuaciones}% \crefname{figure}{Figura}{Figuras}% \crefname{subfigure}{Figura}{Figuras}% \crefname{table}{Cuadro}{Cuadros}% \crefname{subtable}{Cuadro}{Cuadros}% \crefname{page}{P\'agina}{P\'aginas}% \crefname{part}{Parte}{Partes}% \crefname{chapter}{Cap\'itulo}{Cap\'itulos}% \crefname{section}{Apartado}{Apartados}% \crefname{subsection}{Apartado}{Apartados}% \crefname{subsubsection}{Apartado}{Apartados}% \crefname{appendix}{Ap\'endice}{Ap\'endices}% \crefname{subappendix}{Ap\'endice}{Ap\'endices}% \crefname{subsubappendix}{Ap\'endice}{Ap\'endices}% \crefname{subsubsubappendix}{Ap\'endice}{Ap\'endices}% \crefname{enumi}{Punto}{Puntos}% \crefname{enumii}{Punto}{Puntos}% \crefname{enumiii}{Punto}{Puntos}% \crefname{enumiv}{Punto}{Puntos}% \crefname{enumv}{Punto}{Puntos}% \crefname{footnote}{Nota}{Notas}% \crefname{theorem}{Teorema}{Teoremas}% \crefname{lemma}{Lema}{Lemas}% \crefname{corollary}{Corolario}{Corolarios}% \crefname{proposition}{Proposici\'on}{Proposiciones}% \crefname{definition}{Definici\'on}{Definiciones}% \crefname{result}{Resultado}{Resultados}% \crefname{example}{Ejemplo}{Ejemplos}% \crefname{remark}{Observaci\'on}{Observaci\'ones}% \crefname{note}{Nota}{Notas}% \crefname{algorithm}{Algoritmo}{Algoritmos}% \crefname{listing}{Listado}{Listados}% \crefname{line}{L\'inea}{L\'ineas}% % \else% capitalise unset \crefname{equation}{ecuaci\'on}{ecuaciones}% \crefname{figure}{figura}{figuras}% \crefname{subfigure}{figura}{figuras}% \crefname{table}{cuadro}{cuadros}% \crefname{subtable}{cuadro}{cuadros}% \crefname{page}{p\'agina}{p\'aginas}% \crefname{part}{parte}{partes}% \crefname{chapter}{cap\'itulo}{cap\'itulos}% \crefname{section}{apartado}{apartados}% \crefname{subsection}{apartado}{apartados}% \crefname{subsubsection}{apartado}{apartados}% \crefname{appendix}{ap\'endice}{ap\'endices}% \crefname{subappendix}{ap\'endice}{ap\'endices}% \crefname{subsubappendix}{ap\'endice}{ap\'endices}% \crefname{subsubsubappendix}{ap\'endice}{ap\'endices}% \crefname{enumi}{punto}{puntos}% \crefname{enumii}{punto}{puntos}% \crefname{enumiii}{punto}{puntos}% \crefname{enumiv}{punto}{puntos}% \crefname{enumv}{punto}{puntos}% \crefname{footnote}{nota}{notas}% \crefname{theorem}{teorema}{teoremas}% \crefname{lemma}{lema}{lemas}% \crefname{corollary}{corolario}{corolarios}% \crefname{proposition}{proposici\'on}{proposiciones}% \crefname{definition}{definici\'on}{definiciones}% \crefname{result}{resultado}{resultados}% \crefname{example}{ejemplo}{ejemplos}% \crefname{remark}{observaci\'on}{observaci\'ones}% \crefname{note}{nota}{notas}% \crefname{algorithm}{algoritmo}{algoritmos}% \crefname{listing}{listado}{listados}% \crefname{line}{l\'inea}{l\'ineas}% \fi}% end \cref@loadlanguagedefs \DeclareOption{italian}{% \AtBeginDocument{% \def\crefrangeconjunction@preamble{ a\nobreakspace}% \def\crefrangepreconjunction@preamble{da\nobreakspace}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ e\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ e\nobreakspace}% \def\crefpairgroupconjunction@preamble{ e\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ e\nobreakspace}% % \Crefname@preamble{equation}{Equazione}{Equazioni}% \Crefname@preamble{figure}{Figura}{Figure}% \Crefname@preamble{table}{Tabella}{Tabelle}% \Crefname@preamble{page}{Pagina}{Pagine}% \Crefname@preamble{part}{Parte}{Parti}% \Crefname@preamble{chapter}{Capitolo}{Capitoli}% \Crefname@preamble{section}{Sezione}{Sezioni}% \Crefname@preamble{appendix}{Appendice}{Appendici}% \Crefname@preamble{enumi}{Voce}{Voci}% \Crefname@preamble{footnote}{Nota}{Note}% \Crefname@preamble{theorem}{Teorema}{Teoremi}% \Crefname@preamble{lemma}{Lemma}{Lemmi}% \Crefname@preamble{corollary}{Corollario}{Corollari}% \Crefname@preamble{proposition}{Proposizione}{Proposizioni}% \Crefname@preamble{definition}{Definizioni}{Definizioni}% \Crefname@preamble{result}{Risultato}{Risultati}% \Crefname@preamble{example}{esempio}{esempi}% \Crefname@preamble{remark}{Osservazione}{Osservazioni}% \Crefname@preamble{note}{Nota}{Note}% \Crefname@preamble{algorithm}{Algoritmo}{Algoritmi}% \Crefname@preamble{listing}{Elenco}{Elenchi}% \Crefname@preamble{line}{Linea}{Linee}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname@preamble{equation}{Eq.}{Eq.}% \crefname@preamble{figure}{Fig.}{Fig.}% \else% \crefname@preamble{equation}{Equazione}{Equazioni}% \crefname@preamble{figure}{Figura}{Figure}% \fi% \crefname@preamble{table}{Tabella}{Tabelle}% \crefname@preamble{page}{Pagina}{Pagine}% \crefname@preamble{part}{Parte}{Parti}% \crefname@preamble{chapter}{Capitolo}{Capitoli}% \crefname@preamble{section}{Sezione}{Sezioni}% \crefname@preamble{appendix}{Appendice}{Appendici}% \crefname@preamble{enumi}{Voce}{Voci}% \crefname@preamble{footnote}{Nota}{Note}% \crefname@preamble{theorem}{Teorema}{Teoremi}% \crefname@preamble{lemma}{Lemma}{Lemmi}% \crefname@preamble{corollary}{Corollario}{Corollari}% \crefname@preamble{proposition}{Proposizione}{Proposizioni}% \crefname@preamble{definition}{Definizione}{Definizioni}% \crefname@preamble{result}{Risultato}{Risultati}% \crefname@preamble{example}{Esempio}{Esempi}% \crefname@preamble{remark}{Osservazione}{Osservazioni}% \crefname@preamble{note}{Nota}{Note}% \crefname@preamble{algorithm}{Algoritmo}{Algoritmi}% \crefname@preamble{listing}{Elenco}{Elenchi}% \crefname@preamble{line}{Linea}{Linee}% % \else% capitalise unset \if@cref@abbrev% \crefname@preamble{equation}{eq.}{eq.}% \crefname@preamble{figure}{fig.}{fig.}% \else% \crefname@preamble{equation}{equazione}{equazioni}% \crefname@preamble{figure}{figura}{figure}% \fi% \crefname@preamble{table}{tabella}{tabelle}% \crefname@preamble{page}{pagina}{pagine}% \crefname@preamble{part}{parte}{parti}% \crefname@preamble{chapter}{capitolo}{capitoli}% \crefname@preamble{section}{sezione}{sezioni}% \crefname@preamble{appendix}{appendice}{appendici}% \crefname@preamble{enumi}{voce}{voci}% \crefname@preamble{footnote}{nota}{note}% \crefname@preamble{theorem}{teorema}{teoremi}% \crefname@preamble{lemma}{lemma}{lemmi}% \crefname@preamble{corollary}{corollario}{corollari}% \crefname@preamble{proposition}{proposizione}{proposizioni}% \crefname@preamble{definition}{definizione}{definizioni}% \crefname@preamble{result}{risultato}{risultati}% \crefname@preamble{example}{esempio}{esempi}% \crefname@preamble{remark}{osservazione}{osservazioni}% \crefname@preamble{note}{nota}{note}% \crefname@preamble{algorithm}{algoritmo}{algoritmi}% \crefname@preamble{listing}{elenco}{elenchi}% \crefname@preamble{line}{linea}{linee}% \fi% \def\cref@language{italian}% }}% end \DeclareOption and \AtBeginDocument \cref@addlanguagedefs{italian}{% \PackageInfo{cleveref}{loaded `italian' language definitions} \renewcommand{\crefrangeconjunction}{ a\nobreakspace}% \renewcommand\crefrangepreconjunction{da\nobreakspace}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ e\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ e\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ e\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ e\nobreakspace}% % \Crefname{equation}{Equazione}{Equazioni}% \Crefname{figure}{Figura}{Figure}% \Crefname{subfigure}{Figura}{Figure}% \Crefname{table}{Tabella}{Tabelle}% \Crefname{subtable}{Tabella}{Tabelle}% \Crefname{page}{Pagina}{Pagine}% \Crefname{part}{Parte}{Parti}% \Crefname{chapter}{Capitolo}{Capitoli}% \Crefname{section}{Sezione}{Sezioni}% \Crefname{subsection}{Sezione}{Sezioni}% \Crefname{subsubsection}{Sezione}{Sezioni}% \Crefname{appendix}{Appendice}{Appendici}% \Crefname{subappendix}{Appendice}{Appendici}% \Crefname{subsubappendix}{Appendice}{Appendici}% \Crefname{subsubsubappendix}{Appendice}{Appendici}% \Crefname{enumi}{Voce}{Voci}% \Crefname{enumii}{Voce}{Voci}% \Crefname{enumiii}{Voce}{Voci}% \Crefname{enumiv}{Voce}{Voci}% \Crefname{enumv}{Voce}{Voci}% \Crefname{footnote}{Nota}{Note}% \Crefname{theorem}{Teorema}{Teoremi}% \Crefname{lemma}{Lemma}{Lemmi}% \Crefname{corollary}{Corollario}{Corollari}% \Crefname{proposition}{Proposizione}{Proposizioni}% \Crefname{definition}{Definizione}{Definizione}% \Crefname{result}{Risultato}{Risultati}% \Crefname{example}{esempio}{esempi}% \Crefname{remark}{Osservazione}{Osservazioni}% \Crefname{note}{Nota}{Note}% \Crefname{algorithm}{Algoritmo}{Algoritmi}% \Crefname{listing}{Elenco}{Elenchi}% \Crefname{line}{Linea}{Linee}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% \crefname{equation}{Eq.}{Eq.}% \crefname{figure}{Fig.}{Fig.}% \crefname{subfigure}{Fig.}{Fig.}% \else% \crefname{equation}{Equazione}{Equazioni}% \crefname{figure}{Figura}{Figure}% \crefname{figure}{Figura}{Figure}% \fi% \crefname{table}{Tabella}{Tabelle}% \crefname{page}{Pagina}{Pagine}% \crefname{subtable}{Tabella}{Tabelle}% \crefname{part}{Parte}{Parti}% \crefname{chapter}{Capitolo}{Capitoli}% \crefname{section}{Sezione}{Sezioni}% \crefname{subsection}{Sezione}{Sezioni}% \crefname{subsubsection}{Sezione}{Sezioni}% \crefname{appendix}{Appendice}{Appendici}% \crefname{subappendix}{Appendice}{Appendici}% \crefname{subsubappendix}{Appendice}{Appendici}% \crefname{subsubsubappendix}{Appendice}{Appendici}% \crefname{enumi}{Voce}{Voci}% \crefname{enumii}{Voce}{Voci}% \crefname{enumiii}{Voce}{Voci}% \crefname{enumiv}{Voce}{Voci}% \crefname{enumv}{Voce}{Voci}% \crefname{footnote}{Nota}{Note}% \crefname{theorem}{Teorema}{Teoremi}% \crefname{lemma}{Lemma}{Lemmi}% \crefname{corollary}{Corollario}{Corollari}% \crefname{proposition}{Proposizione}{Proposizioni}% \crefname{definition}{Definizione}{Definizione}% \crefname{result}{Risultato}{Risultati}% \crefname{example}{Esempio}{Esempi}% \crefname{remark}{Osservazione}{Osservazioni}% \crefname{note}{Nota}{Note}% \crefname{algorithm}{Algoritmo}{Algoritmi}% \crefname{listing}{Elenco}{Elenchi}% \crefname{line}{Linea}{Linee}% % \else% capitalise unset \if@cref@abbrev% \crefname{equation}{eq.}{eq.}% \crefname{figure}{fig.}{fig.}% \crefname{subfigure}{fig.}{fig.}% \else% \crefname{equation}{equazione}{equazioni}% \crefname{figure}{figura}{figure}% \crefname{figure}{figura}{figure}% \fi% \crefname{table}{tabella}{tabelle}% \crefname{page}{pagina}{pagine}% \crefname{subtable}{tabella}{tabelle}% \crefname{part}{parte}{parti}% \crefname{chapter}{capitolo}{capitoli}% \crefname{section}{sezione}{sezioni}% \crefname{subsection}{sezione}{sezioni}% \crefname{subsubsection}{sezione}{sezioni}% \crefname{appendix}{appendice}{appendici}% \crefname{subappendix}{appendice}{appendici}% \crefname{subsubappendix}{appendice}{appendici}% \crefname{subsubsubappendix}{appendice}{appendici}% \crefname{enumi}{voce}{voci}% \crefname{enumii}{voce}{voci}% \crefname{enumiii}{voce}{voci}% \crefname{enumiv}{voce}{voci}% \crefname{enumv}{voce}{voci}% \crefname{footnote}{nota}{note}% \crefname{theorem}{teorema}{teoremi}% \crefname{lemma}{lemma}{lemmi}% \crefname{corollary}{corollario}{corollari}% \crefname{proposition}{proposizione}{proposizioni}% \crefname{definition}{definizione}{definizione}% \crefname{result}{risultato}{risultati}% \crefname{example}{esempio}{esempi}% \crefname{remark}{osservazione}{osservazioni}% \crefname{note}{nota}{note}% \crefname{algorithm}{algoritmo}{algoritmi}% \crefname{listing}{elenco}{elenchi}% \crefname{line}{linea}{linee}% \fi}% end \cref@loadlanguagedefs \DeclareOption{russian}{% \AtBeginDocument{% \def\crefrangeconjunction@preamble{--}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ \cyri\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ \cyri\nobreakspace}% \def\crefpairgroupconjunction@preamble{ \cyri\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble% {, \cyra\ \cyrt\cyra\cyrk\cyrzh\cyre\nobreakspace}% % \Crefname@preamble{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \Crefname@preamble{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \Crefname@preamble{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname@preamble{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyrery}% \Crefname@preamble{section}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \Crefname@preamble{appendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \Crefname@preamble{footnote}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}% \Crefname@preamble{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \Crefname@preamble{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyrery}% \Crefname@preamble{corollary}% {\CYRV\cyrery\cyrv\cyro\cyrd}% {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}% \Crefname@preamble{proposition}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \Crefname@preamble{definition}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \Crefname@preamble{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \Crefname@preamble{example}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \Crefname@preamble{remark}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \Crefname@preamble{note}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \Crefname@preamble{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \Crefname@preamble{listing}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \Crefname@preamble{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \Crefname@preamble{page}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyrery}% \Crefname@preamble{part}% {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}% {\CYRCH\cyra\cyrs\cyrt\cyri}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% abbrev set \crefname@preamble{equation}% {\CYRF-\cyrl.}% {\CYRF-\cyrl.}% \crefname@preamble{figure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname@preamble{enumi}% {\CYRP.}% {\CYRP.\cyrp.}% \else% \crefname@preamble{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \crefname@preamble{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname@preamble{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \fi% \crefname@preamble{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyrery}% \crefname@preamble{section}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname@preamble{appendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname@preamble{footnote}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}% \crefname@preamble{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \crefname@preamble{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyrery}% \crefname@preamble{corollary}% {\CYRV\cyrery\cyrv\cyro\cyrd}% {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}% \crefname@preamble{proposition}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \crefname@preamble{definition}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \crefname@preamble{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \crefname@preamble{example}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \crefname@preamble{remark}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \crefname@preamble{note}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \crefname@preamble{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \crefname@preamble{listing}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname@preamble{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \crefname@preamble{page}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyrery}% \crefname@preamble{part}% {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}% {\CYRCH\cyra\cyrs\cyrt\cyri}% % \else% capitalise unset \if@cref@abbrev% abbrev set \crefname@preamble{equation}% {\cyrf-\cyrl.}% {\cyrf-\cyrl.}% \crefname@preamble{figure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname@preamble{table}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname@preamble{enumi}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname@preamble{chapter}% {\cyrg\cyrl\cyra\cyrv.}% {\cyrg\cyrl\cyra\cyrv.}% \crefname@preamble{section}% {\cyrr\cyra\cyrz\cyrd.}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}% \crefname@preamble{appendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% \crefname@preamble{footnote}% {\cyrs\cyrn\cyro\cyrs\cyrk.}% {\cyrs\cyrn\cyro\cyrs\cyrk.}% \crefname@preamble{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% \crefname@preamble{lemma}% {\cyrl\cyre\cyrm\cyrm.}% {\cyrl\cyre\cyrm\cyrm.}% \crefname@preamble{corollary}% {\cyrv\cyrery\cyrv\cyro\cyrd}% {\cyrv\cyrery\cyrv\cyro\cyrd.}% \crefname@preamble{proposition}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}% \crefname@preamble{definition}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}% \crefname@preamble{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% \crefname@preamble{example}% {\cyrp\cyrr\cyri\cyrm.}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr.}% \crefname@preamble{remark}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}% \crefname@preamble{note}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}% \crefname@preamble{algorithm}% {\cyra\cyrl\cyrg.}% {\cyra\cyrl\cyrg.}% \crefname@preamble{listing}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn.}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg.}% \crefname@preamble{line}% {\cyrs\cyrt\cyrr\cyrk.}% {\cyrs\cyrt\cyrr\cyrk.}% \else% abbrev unset \crefname@preamble{equation}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \crefname@preamble{figure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname@preamble{table}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname@preamble{enumi}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname@preamble{chapter}% {\cyrg\cyrl\cyra\cyrv\cyra}% {\cyrg\cyrl\cyra\cyrv\cyrery}% \crefname@preamble{section}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname@preamble{appendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname@preamble{footnote}% {\cyrs\cyrn\cyro\cyrs\cyrk\cyra}% {\cyrs\cyrn\cyro\cyrs\cyrk\cyri}% \crefname@preamble{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \crefname@preamble{lemma}% {\cyrl\cyre\cyrm\cyrm\cyra}% {\cyrl\cyre\cyrm\cyrm\cyrery}% \crefname@preamble{corollary}% {\cyrv\cyrery\cyrv\cyro\cyrd}% {\cyrv\cyrery\cyrv\cyro\cyrd\cyrery}% \crefname@preamble{proposition}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \crefname@preamble{definition}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \crefname@preamble{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \crefname@preamble{example}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \crefname@preamble{remark}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \crefname@preamble{note}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \crefname@preamble{algorithm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \crefname@preamble{listing}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname@preamble{line}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyra}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyri}% \fi% \crefname@preamble{page}% {\cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}% {\cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra\cyrh}% \crefname@preamble{part}% {\cyrch\cyra\cyrs\cyrt\cyrsftsn}% {\cyrch\cyra\cyrs\cyrt\cyri}% \fi% \def\cref@language{russian}% }}% end \DeclareOption and \AtBeginDocument \cref@addlanguagedefs{russian}{% \PackageInfo{cleveref}{loaded `russian' language definitions} \renewcommand{\crefrangeconjunction}{--}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ \cyri\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ \cyri\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ \cyri\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}% {, \cyra\ \cyrt\cyra\cyrk\cyrzh\cyre\nobreakspace}% % \Crefname{page}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyrery}% \Crefname{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \Crefname{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname{subfigure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \Crefname{subtable}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \Crefname{part}% {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}% {\CYRCH\cyra\cyrs\cyrt\cyri}% \Crefname{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyrery}% \Crefname{section}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \Crefname{subsection}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \Crefname{subsubsection}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \Crefname{appendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \Crefname{subappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya} \Crefname{subsubappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya} \Crefname{subsubsubappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya} \Crefname{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname{enumii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname{enumiii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname{enumiv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname{enumv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \Crefname{footnote}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}% \Crefname{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \Crefname{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyrery}% \Crefname{corollary}% {\CYRV\cyrery\cyrv\cyro\cyrd}% {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}% \Crefname{proposition}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \Crefname{definition}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \Crefname{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \Crefname{example}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \Crefname{remark}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \Crefname{note}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \Crefname{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \Crefname{listing}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \Crefname{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% abbrev set \crefname{equation}% {\CYRF-\cyrl.}% {\CYRF-\cyrl.}% \crefname{figure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname{subfigure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname{table}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname{subtable}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname{enumi}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumii}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumiii}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumiv}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumv}% {\CYRP.}% {\CYRP.\cyrp.}% \else% abbrev unset \crefname{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \crefname{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{subfigure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname{subtable}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumiii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumiv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyrery}% \fi% \crefname{page}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}% {\CYRS\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyrery}% \crefname{part}% {\CYRCH\cyra\cyrs\cyrt\cyrsftsn}% {\CYRCH\cyra\cyrs\cyrt\cyri}% \crefname{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyrery}% \crefname{section}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{subsection}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{subsubsection}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl}% {\CYRR\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{appendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subsubappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subsubsubappendix}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{footnote}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRS\cyrn\cyro\cyrs\cyrk\cyri}% \crefname{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \crefname{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyrery}% \crefname{corollary}% {\CYRV\cyrery\cyrv\cyro\cyrd}% {\CYRV\cyrery\cyrv\cyro\cyrd\cyrery}% \crefname{proposition}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\CYRU\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \crefname{definition}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\CYRO\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \crefname{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \crefname{example}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \crefname{remark}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\CYRP\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \crefname{note}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \crefname{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \crefname{listing}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% % \else% capitalise unset \if@cref@abbrev% abbrev set \crefname{equation}% {\cyrf-\cyrl.}% {\cyrf-\cyrl.}% \crefname{chapter}% {\cyrg\cyrl\cyra\cyrv.}% {\cyrg\cyrl\cyra\cyrv.}% \crefname{section}% {\cyrr\cyra\cyrz\cyrd.}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}% \crefname{subsection}% {\cyrr\cyra\cyrz\cyrd.}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}% \crefname{subsubsection}% {\cyrr\cyra\cyrz\cyrd.}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl.}% \crefname{appendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% \crefname{subappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% \crefname{subsubappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% \crefname{subsubsubappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh.}% \crefname{enumi}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumii}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumiii}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumiv}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumv}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{footnote}% {\cyrs\cyrn\cyro\cyrs\cyrk.}% {\cyrs\cyrn\cyro\cyrs\cyrk.}% \crefname{figure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname{subfigure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname{table}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname{subtable}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% \crefname{lemma}% {\cyrl\cyre\cyrm\cyrm.}% {\cyrl\cyre\cyrm\cyrm.}% \crefname{corollary}% {\cyrv\cyrery\cyrv\cyro\cyrd}% {\cyrv\cyrery\cyrv\cyro\cyrd.}% \crefname{proposition}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd.}% \crefname{definition}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn.}% \crefname{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% \crefname{example}% {\cyrp\cyrr\cyri\cyrm.}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr.}% \crefname{remark}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch.}% \crefname{note}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk.}% \crefname{algorithm}% {\cyra\cyrl\cyrg.}% {\cyra\cyrl\cyrg.}% \crefname{listing}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn.}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg.}% \crefname{line}% {\cyrs\cyrt\cyrr\cyrk.}% {\cyrs\cyrt\cyrr\cyrk.}% \else% abbrev unset \crefname{equation}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyrery}% \crefname{figure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{subfigure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{table}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname{subtable}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyra}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrery}% \crefname{enumi}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumii}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumiii}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumiv}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{enumv}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyrery}% \crefname{chapter}% {\cyrg\cyrl\cyra\cyrv\cyra}% {\cyrg\cyrl\cyra\cyrv\cyrery}% \crefname{section}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{subsection}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{subsubsection}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl}% {\cyrr\cyra\cyrz\cyrd\cyre\cyrl\cyrery}% \crefname{appendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subsubappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{subsubsubappendix}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrl\cyro\cyrzh\cyre\cyrn\cyri\cyrya}% \crefname{footnote}% {\cyrs\cyrn\cyro\cyrs\cyrk\cyra}% {\cyrs\cyrn\cyro\cyrs\cyrk\cyri}% \crefname{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyrery}% \crefname{lemma}% {\cyrl\cyre\cyrm\cyrm\cyra}% {\cyrl\cyre\cyrm\cyrm\cyrery}% \crefname{corollary}% {\cyrv\cyrery\cyrv\cyro\cyrd}% {\cyrv\cyrery\cyrv\cyro\cyrd\cyrery}% \crefname{proposition}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyre}% {\cyru\cyrt\cyrv\cyre\cyrr\cyrzh\cyrd\cyre\cyrn\cyri\cyrya}% \crefname{definition}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyre}% {\cyro\cyrp\cyrr\cyre\cyrd\cyre\cyrl\cyre\cyrn\cyri\cyrya}% \crefname{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyrery}% \crefname{example}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrr\cyrery}% \crefname{remark}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyre}% {\cyrp\cyrr\cyri\cyrm\cyre\cyrch\cyra\cyrn\cyri\cyrya}% \crefname{note}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk\cyra}% {\cyrz\cyra\cyrm\cyre\cyrt\cyrk\cyri}% \crefname{algorithm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyrery}% \crefname{listing}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg}% {\cyrl\cyri\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname{line}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyra}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyri}% \fi% \crefname{page}% {\cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}% {\cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra\cyrh}% \crefname{part}% {\cyrch\cyra\cyrs\cyrt\cyrsftsn}% {\cyrch\cyra\cyrs\cyrt\cyri}% \fi}% end \cref@loadlanguagedefs \DeclareOption{ukrainian}{% \AtBeginDocument{% \def\crefrangeconjunction@preamble{--}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ \cyrii\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ \cyrii\nobreakspace}% \def\crefpairgroupconjunction@preamble{ \cyrt\cyra\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble% {, \cyra\ \cyrt\cyra\cyrk\cyro\cyrzh\nobreakspace}% % \Crefname@preamble{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \Crefname@preamble{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \Crefname@preamble{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname@preamble{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyri}% \Crefname@preamble{section}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \Crefname@preamble{appendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \Crefname@preamble{footnote}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \Crefname@preamble{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}% \Crefname@preamble{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyri}% \Crefname@preamble{corollary}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \Crefname@preamble{proposition}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \Crefname@preamble{definition}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \Crefname@preamble{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \Crefname@preamble{example}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \Crefname@preamble{remark}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \Crefname@preamble{note}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \Crefname@preamble{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \Crefname@preamble{listing}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \Crefname@preamble{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \Crefname@preamble{page}% {\CYRS\cyrt\cyro\cyrr\cyri\cyrn\cyrk\cyra}% {\CYRS\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyri}% \Crefname@preamble{part}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% abbrev set \crefname@preamble{equation}% {\CYRF-\cyrl.}% {\CYRF-\cyrl.}% \crefname@preamble{figure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname@preamble{enumi}% {\CYRP.}% {\CYRP.\cyrp.}% \else% \crefname@preamble{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \crefname@preamble{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname@preamble{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname@preamble{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \fi% \crefname@preamble{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyri}% \crefname@preamble{section}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname@preamble{appendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname@preamble{footnote}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \crefname@preamble{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}% \crefname@preamble{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyri}% \crefname@preamble{corollary}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \crefname@preamble{proposition}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \crefname@preamble{definition}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \crefname@preamble{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \crefname@preamble{example}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \crefname@preamble{remark}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname@preamble{note}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname@preamble{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \crefname@preamble{listing}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname@preamble{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \crefname@preamble{page}% {\CYRS\cyrt\cyro\cyrr\cyri\cyrn\cyrk\cyra}% {\CYRS\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyri}% \crefname@preamble{part}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}% % \else% capitalise unset \if@cref@abbrev% abbrev set \crefname@preamble{equation}% {\cyrf-\cyrl.}% {\cyrf-\cyrl.}% \crefname@preamble{figure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname@preamble{table}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname@preamble{enumi}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname@preamble{chapter}% {\cyrg\cyrl\cyra\cyrv.}% {\cyrg\cyrl\cyra\cyrv.}% \crefname@preamble{section}% {\cyrr\cyro\cyrz\cyrd.}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}% \crefname@preamble{appendix}% {\cyrd\cyro\cyrd\cyra\cyrt.}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}% \crefname@preamble{footnote}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}% \crefname@preamble{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% \crefname@preamble{lemma}% {\cyrl\cyre\cyrm\cyrm.}% {\cyrl\cyre\cyrm\cyrm.}% \crefname@preamble{corollary}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv.}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyrk.}% \crefname@preamble{proposition}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}% \crefname@preamble{definition}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}% \crefname@preamble{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt.}% \crefname@preamble{example}% {\cyrp\cyrr\cyri\cyrk\cyrl.}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd.}% \crefname@preamble{remark}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}% \crefname@preamble{note}% {\cyrz\cyra\cyrm\cyrii\cyrt.}% {\cyrz\cyra\cyrm\cyrii\cyrt.}% \crefname@preamble{algorithm}% {\cyra\cyrl\cyrg.}% {\cyra\cyrl\cyrg.}% \crefname@preamble{listing}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn.}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg.}% \crefname@preamble{line}% {\cyrs\cyrt\cyrr\cyrk.}% {\cyrs\cyrt\cyrr\cyrk.}% \else% abbrev unset \crefname@preamble{equation}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \crefname@preamble{figure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname@preamble{table}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname@preamble{enumi}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname@preamble{chapter}% {\cyrg\cyrl\cyra\cyrv\cyra}% {\cyrg\cyrl\cyra\cyrv\cyri}% \crefname@preamble{section}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname@preamble{appendix}% {\cyrd\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname@preamble{footnote}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \crefname@preamble{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyri}% \crefname@preamble{lemma}% {\cyrl\cyre\cyrm\cyrm\cyra}% {\cyrl\cyre\cyrm\cyrm\cyri}% \crefname@preamble{corollary}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \crefname@preamble{proposition}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \crefname@preamble{definition}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \crefname@preamble{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \crefname@preamble{example}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \crefname@preamble{remark}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname@preamble{note}% {\cyrz\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\cyrz\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname@preamble{algorithm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \crefname@preamble{listing}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname@preamble{line}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyra}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyri}% \fi% \crefname@preamble{page}% {\cyrs\cyrt\cyro\cyrr\cyri\cyrn\cyrc\cyrii}% {\cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyra\cyrh}% \crefname@preamble{part}% {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyri}% \fi% \def\cref@language{ukrainian}% }}% end \DeclareOption and \AtBeginDocument \cref@addlanguagedefs{ukrainian}{% \PackageInfo{cleveref}{loaded `ukrainian' language definitions} \renewcommand{\crefrangeconjunction}{--}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ \cyrii\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ \cyrii\nobreakspace}% \renewcommand{\crefpairgroupconjunction}% { \cyrt\cyra\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}% {, \cyra\ \cyrt\cyra\cyrk\cyro\cyrzh\nobreakspace}% % \Crefname{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \Crefname{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname{subfigure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \Crefname{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \Crefname{subtable}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \Crefname{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname{enumii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname{enumiii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname{enumiv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname{enumv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \Crefname{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyri}% \Crefname{section}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \Crefname{subsection}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \Crefname{subsubsection}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \Crefname{appendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \Crefname{subappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \Crefname{subsubappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \Crefname{subsubsubappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \Crefname{footnote}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \Crefname{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}% \Crefname{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyri}% \Crefname{corollary}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \Crefname{proposition}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \Crefname{definition}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \Crefname{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \Crefname{example}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \Crefname{remark}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \Crefname{note}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \Crefname{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \Crefname{listing}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \Crefname{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \Crefname{page}% {\CYRS\cyrt\cyro\cyrr\cyri\cyrn\cyrk\cyra}% {\CYRS\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyri}% \Crefname{part}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}% % \if@cref@capitalise% capitalise set \if@cref@abbrev% abbrev set \crefname{equation}% {\CYRF-\cyrl.}% {\CYRF-\cyrl.}% \crefname{figure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname{subfigure}% {\CYRR\cyri\cyrs.}% {\CYRR\cyri\cyrs.}% \crefname{table}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname{subtable}% {\CYRT\cyra\cyrb\cyrl.}% {\CYRT\cyra\cyrb\cyrl.}% \crefname{enumi}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumii}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumiii}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumiv}% {\CYRP.}% {\CYRP.\cyrp.}% \crefname{enumv}% {\CYRP.}% {\CYRP.\cyrp.}% \else% abbrev unset \crefname{equation}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\CYRF\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \crefname{figure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{subfigure}% {\CYRR\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\CYRR\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{table}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname{subtable}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname{enumi}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumiii}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumiv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumv}% {\CYRP\cyru\cyrn\cyrk\cyrt}% {\CYRP\cyru\cyrn\cyrk\cyrt\cyri}% \fi% \crefname{chapter}% {\CYRG\cyrl\cyra\cyrv\cyra}% {\CYRG\cyrl\cyra\cyrv\cyri}% \crefname{section}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{subsection}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{subsubsection}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}% {\CYRR\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{appendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subsubappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subsubsubappendix}% {\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\CYRD\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{footnote}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\CYRV\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \crefname{theorem}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyri}% \crefname{lemma}% {\CYRL\cyre\cyrm\cyrm\cyra}% {\CYRL\cyre\cyrm\cyrm\cyri}% \crefname{corollary}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\CYRV\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \crefname{proposition}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\CYRT\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \crefname{definition}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\CYRV\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \crefname{result}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\CYRR\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \crefname{example}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\CYRP\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \crefname{remark}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRP\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname{note}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\CYRZ\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname{algorithm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \crefname{listing}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname{line}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyra}% {\CYRS\cyrt\cyrr\cyro\cyrk\cyri}% \crefname{page}% {\CYRS\cyrt\cyro\cyrr\cyri\cyrn\cyrk\cyra}% {\CYRS\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyri}% \crefname{part}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyri}% % \else% capitalise unset \if@cref@abbrev% abbrev set \crefname{equation}% {\cyrf-\cyrl.}% {\cyrf-\cyrl.}% \crefname{chapter}% {\cyrg\cyrl\cyra\cyrv.}% {\cyrg\cyrl\cyra\cyrv.}% \crefname{section}% {\cyrr\cyro\cyrz\cyrd.}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}% \crefname{subsection}% {\cyrr\cyro\cyrz\cyrd.}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}% \crefname{subsubsection}% {\cyrr\cyro\cyrz\cyrd.}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl.}% \crefname{appendix}% {\cyrd\cyro\cyrd\cyra\cyrt.}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}% \crefname{subappendix}% {\cyrd\cyro\cyrd\cyra\cyrt.}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}% \crefname{subsubappendix}% {\cyrd\cyro\cyrd\cyra\cyrt.}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}% \crefname{subsubsubappendix}% {\cyrd\cyro\cyrd\cyra\cyrt.}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk.}% \crefname{enumi}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumii}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumiii}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumiv}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{enumv}% {\cyrp.}% {\cyrp.\cyrp.}% \crefname{footnote}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk.}% \crefname{figure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname{subfigure}% {\cyrr\cyri\cyrs.}% {\cyrr\cyri\cyrs.}% \crefname{table}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname{subtable}% {\cyrt\cyra\cyrb\cyrl.}% {\cyrt\cyra\cyrb\cyrl.}% \crefname{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm.}% \crefname{lemma}% {\cyrl\cyre\cyrm\cyrm.}% {\cyrl\cyre\cyrm\cyrm.}% \crefname{corollary}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv.}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyrk.}% \crefname{proposition}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn.}% \crefname{definition}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn.}% \crefname{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt.}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt.}% \crefname{example}% {\cyrp\cyrr\cyri\cyrk\cyrl.}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd.}% \crefname{remark}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt.}% \crefname{note}% {\cyrz\cyra\cyrm\cyrii\cyrt.}% {\cyrz\cyra\cyrm\cyrii\cyrt.}% \crefname{algorithm}% {\cyra\cyrl\cyrg.}% {\cyra\cyrl\cyrg.}% \crefname{listing}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn.}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg.}% \crefname{line}% {\cyrs\cyrt\cyrr\cyrk.}% {\cyrs\cyrt\cyrr\cyrk.}% \else% abbrev unset \crefname{equation}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyra}% {\cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyri}% \crefname{figure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{subfigure}% {\cyrr\cyri\cyrs\cyru\cyrn\cyro\cyrk}% {\cyrr\cyri\cyrs\cyru\cyrn\cyrk\cyri}% \crefname{table}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname{subtable}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrya}% {\cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrii}% \crefname{enumi}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumii}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumiii}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumiv}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{enumv}% {\cyrp\cyru\cyrn\cyrk\cyrt}% {\cyrp\cyru\cyrn\cyrk\cyrt\cyri}% \crefname{chapter}% {\cyrg\cyrl\cyra\cyrv\cyra}% {\cyrg\cyrl\cyra\cyrv\cyri}% \crefname{section}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{subsection}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{subsubsection}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl}% {\cyrr\cyro\cyrz\cyrd\cyrii\cyrl\cyri}% \crefname{appendix}% {\cyrd\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subappendix}% {\cyrd\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subsubappendix}% {\cyrd\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{subsubsubappendix}% {\cyrd\cyro\cyrd\cyra\cyrt\cyro\cyrk}% {\cyrd\cyro\cyrd\cyra\cyrt\cyrk\cyri}% \crefname{footnote}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk\cyra}% {\cyrv\cyri\cyrn\cyro\cyrs\cyrk\cyri}% \crefname{theorem}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyra}% {\cyrt\cyre\cyro\cyrr\cyre\cyrm\cyri}% \crefname{lemma}% {\cyrl\cyre\cyrm\cyrm\cyra}% {\cyrl\cyre\cyrm\cyrm\cyri}% \crefname{corollary}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyro\cyrk}% {\cyrv\cyri\cyrs\cyrn\cyro\cyrv\cyrk\cyri}% \crefname{proposition}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% {\cyrt\cyrv\cyre\cyrr\cyrd\cyrzh\cyre\cyrn\cyrn\cyrya}% \crefname{definition}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% {\cyrv\cyri\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}% \crefname{result}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt}% {\cyrr\cyre\cyrz\cyru\cyrl\cyrsftsn\cyrt\cyra\cyrt\cyri}% \crefname{example}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd}% {\cyrp\cyrr\cyri\cyrk\cyrl\cyra\cyrd\cyri}% \crefname{remark}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyra}% {\cyrp\cyrr\cyri\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname{note}% {\cyrz\cyra\cyrm\cyrii\cyrt\cyrk\cyra}% {\cyrz\cyra\cyrm\cyrii\cyrt\cyrk\cyri}% \crefname{algorithm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}% {\cyra\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm\cyri}% \crefname{listing}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}% {\cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyri}% \crefname{line}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyra}% {\cyrs\cyrt\cyrr\cyro\cyrk\cyri}% \fi% \crefname{page}% {\cyrs\cyrt\cyro\cyrr\cyri\cyrn\cyrc\cyrii}% {\cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrk\cyra\cyrh}% \crefname{part}% {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyra}% {\cyrch\cyra\cyrs\cyrt\cyri\cyrn\cyri}% \fi}% end \cref@loadlanguagedefs \DeclareOption{norsk}{% \AtBeginDocument{% \def\crefrangeconjunction@preamble{ til\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ og\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ og\nobreakspace}% \def\crefpairgroupconjunction@preamble{ og\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ og\nobreakspace}% % \Crefname@preamble{equation}{Likning}{Likningene}% \Crefname@preamble{figure}{Figur}{Figurene}% \Crefname@preamble{table}{Tabell}{Tabellene}% \Crefname@preamble{page}{Side}{Siden}% \Crefname@preamble{part}{Del}{Delene}% \Crefname@preamble{chapter}{Kapittel}{Kapitlene}% \Crefname@preamble{section}{Avsnitt}{Avsnittene}% \Crefname@preamble{appendix}{Tillegg}{Tilleggene}% \Crefname@preamble{enumi}{Punkt}{Punktene}% \Crefname@preamble{footnote}{Fotnote}{Fotnotene}% \Crefname@preamble{theorem}{Teorem}{Teoremene}% \Crefname@preamble{lemma}{Lemma}{Lemma}% \Crefname@preamble{corollary}{Korollar}{Korollarene}% \Crefname@preamble{proposition}{P\aa stand}{P\aa standene}% \Crefname@preamble{definition}{Definisjon}{Definisjonene}% \Crefname@preamble{result}{Resultat}{Resultatene}% \Crefname@preamble{example}{Eksempel}{Eksemplene}% \Crefname@preamble{remark}{Bemerkning}{Bemerkningene}% \Crefname@preamble{note}{Note}{Notene}% \Crefname@preamble{algorithm}{Algoritme}{Algoritmene}% \Crefname@preamble{listing}{Opplisting}{Opplistingene}% \Crefname@preamble{line}{Linje}{Linjene}% % \if@cref@capitalise% \crefname@preamble{page}{Side}{Siden}% \crefname@preamble{equation}{Likning}{Likningene}% \crefname@preamble{figure}{Figur}{Figurene}% \crefname@preamble{table}{Tabell}{Tabellene}% \crefname@preamble{part}{Del}{Delene}% \crefname@preamble{chapter}{Kapittel}{Kapitlene}% \crefname@preamble{section}{Avsnitt}{Avsnittene}% \crefname@preamble{appendix}{Tillegg}{Tilleggene}% \crefname@preamble{enumi}{Punkt}{Punktene}% \crefname@preamble{footnote}{Fotnote}{Fotnotene}% \crefname@preamble{theorem}{Teorem}{Teoremene}% \crefname@preamble{lemma}{Lemma}{Lemma}% \crefname@preamble{corollary}{Korollar}{Korollarene}% \crefname@preamble{proposition}{P\aa stand}{P\aa standene}% \crefname@preamble{definition}{Definisjon}{Definisjonene}% \crefname@preamble{result}{Resultat}{Resultatene}% \crefname@preamble{example}{Eksempel}{Eksemplene}% \crefname@preamble{remark}{Bemerkning}{Bemerkningene}% \crefname@preamble{note}{Note}{Notene}% \crefname@preamble{algorithm}{Algoritme}{Algoritmene}% \crefname@preamble{listing}{Opplisting}{Opplistingene}% \crefname@preamble{line}{Linje}{Linjene}% % \else% \crefname@preamble{equation}{likning}{likningene}% \crefname@preamble{figure}{figur}{figurene}% \crefname@preamble{table}{tabell}{tabeller}% \crefname@preamble{page}{side}{siden}% \crefname@preamble{part}{del}{delene}% \crefname@preamble{chapter}{kapittel}{kapitlene}% \crefname@preamble{section}{avsnitt}{avsnittene}% \crefname@preamble{appendix}{tillegg}{tilleggene}% \crefname@preamble{enumi}{punkt}{punktene}% \crefname@preamble{footnote}{fotnote}{fotnotene}% \crefname@preamble{theorem}{teorem}{teoremene}% \crefname@preamble{lemma}{lemma}{lemma}% \crefname@preamble{corollary}{korollar}{korollarene}% \crefname@preamble{proposition}{p\aa stand}{p\aa standene}% \crefname@preamble{definition}{definisjon}{definisjonene}% \crefname@preamble{result}{resultat}{resultatene}% \crefname@preamble{example}{eksempel}{eksemplene}% \crefname@preamble{remark}{bemerkning}{bemerkningene}% \crefname@preamble{note}{note}{notene}% \crefname@preamble{algorithm}{algoritme}{algoritmene}% \crefname@preamble{listing}{opplisting}{opplistingene}% \crefname@preamble{line}{linje}{linjene}% \fi% \def\cref@language{norsk}% }}% end \DeclareOption and \AtBeginDocument \cref@addlanguagedefs{norsk}{% \PackageInfo{cleveref}{loaded `norsk' language definitions} \renewcommand{\crefrangeconjunction}{ til\nobreakspace}% \renewcommand\crefrangepreconjunction{}% \renewcommand\crefrangepostconjunction{}% \renewcommand{\crefpairconjunction}{ og\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ og\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ og\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ og\nobreakspace}% % \Crefname{equation}{Likning}{Likningene}% \Crefname{figure}{Figur}{Figurene}% \Crefname{subfigure}{Figur}{Figurene}% \Crefname{table}{Tabell}{Tabellene}% \Crefname{subtable}{Tabell}{Tabellene}% \Crefname{page}{Side}{Siden}% \Crefname{part}{Del}{Delene}% \Crefname{chapter}{Kapittel}{Kapitlene}% \Crefname{section}{Avsnitt}{Avsnittene}% \Crefname{subsection}{Avsnitt}{Avsnittene}% \Crefname{subsubsection}{Avsnitt}{Avsnittene}% \Crefname{appendix}{Tillegg}{Tilleggene}% \Crefname{subappendix}{Tillegg}{Tilleggene}% \Crefname{subsubappendix}{Tillegg}{Tilleggene}% \Crefname{subsubsubappendix}{Tillegg}{Tilleggene}% \Crefname{enumi}{Punkt}{Punktene}% \Crefname{enumii}{Punkt}{Punktene}% \Crefname{enumiii}{Punkt}{Punktene}% \Crefname{enumiv}{Punkt}{Punktene}% \Crefname{enumv}{Punkt}{Punktene}% \Crefname{footnote}{Fotnote}{Fotnotene}% \Crefname{theorem}{Teorem}{Teoremene}% \Crefname{lemma}{Lemma}{Lemma}% \Crefname{corollary}{Korollar}{Korollarene}% \Crefname{proposition}{P\aa stand}{P\aa standene}% \Crefname{definition}{Definisjon}{Definisjonene}% \Crefname{result}{Resultat}{Resultatene}% \Crefname{example}{Eksempel}{Eksemplene}% \Crefname{remark}{Bemerkning}{Bemerkningene}% \Crefname{note}{Note}{Notene}% \Crefname{algorithm}{Algoritme}{Algoritmene}% \Crefname{listing}{Opplisting}{Opplistingene}% \Crefname{line}{Linje}{Linjene}% % \if@cref@capitalise% \crefname{equation}{Likning}{Likningene}% \crefname{figure}{Figur}{Figurene}% \crefname{subfigure}{Figur}{Figurene}% \crefname{table}{Tabell}{Tabellene}% \crefname{subtable}{Tabell}{Tabellene}% \crefname{page}{Side}{Siden}% \crefname{part}{Del}{Delene}% \crefname{chapter}{Kapittel}{Kapitlene}% \crefname{section}{Avsnitt}{Avsnittene}% \crefname{subsection}{Avsnitt}{Avsnittene}% \crefname{subsubsection}{Avsnitt}{Avsnittene}% \crefname{appendix}{Tillegg}{Tilleggene}% \crefname{subappendix}{Tillegg}{Tilleggene}% \crefname{subsubappendix}{Tillegg}{Tilleggene}% \crefname{subsubsubappendix}{Tillegg}{Tilleggene}% \crefname{enumi}{Punkt}{Punktene}% \crefname{enumii}{Punkt}{Punktene}% \crefname{enumiii}{Punkt}{Punktene}% \crefname{enumiv}{Punkt}{Punktene}% \crefname{enumv}{Punkt}{Punktene}% \crefname{footnote}{Fotnote}{Fotnotene}% \crefname{theorem}{Teorem}{Teoremene}% \crefname{lemma}{Lemma}{Lemma}% \crefname{corollary}{Korollar}{Korollarene}% \crefname{proposition}{P\aa stand}{P\aa standene}% \crefname{definition}{Definisjon}{Definisjonene}% \crefname{result}{Resultat}{Resultatene}% \crefname{example}{Eksempel}{Eksemplene}% \crefname{remark}{Bemerkning}{Bemerkningene}% \crefname{note}{Note}{Notene}% \crefname{algorithm}{Algoritme}{Algoritmene}% \crefname{listing}{Opplisting}{Opplistingene}% \crefname{line}{Linje}{Linjene}% % \else% \crefname{equation}{likning}{likningene}% \crefname{figure}{figur}{figurene}% \crefname{subfigure}{figur}{figurene}% \crefname{table}{tabell}{tabellene}% \crefname{subtable}{tabell}{tabellene}% \crefname{page}{side}{siden}% \crefname{part}{del}{delene}% \crefname{chapter}{kapittel}{kapitlene}% \crefname{section}{avsnitt}{avsnittene}% \crefname{subsection}{avsnitt}{avsnittene}% \crefname{subsubsection}{avsnitt}{avsnittene}% \crefname{appendix}{tillegg}{tilleggene}% \crefname{subappendix}{tillegg}{tilleggene}% \crefname{subsubappendix}{tillegg}{tilleggene}% \crefname{subsubsubappendix}{tillegg}{tilleggene}% \crefname{enumi}{punkt}{punktene}% \crefname{enumii}{punkt}{punktene}% \crefname{enumiii}{punkt}{punktene}% \crefname{enumiv}{punkt}{punktene}% \crefname{enumv}{punkt}{punktene}% \crefname{footnote}{fotnote}{fotnotene}% \crefname{theorem}{teorem}{teoremene}% \crefname{lemma}{lemma}{lemma}% \crefname{corollary}{korollar}{korollarene}% \crefname{proposition}{p\aa stand}{p\aa standene}% \crefname{definition}{definisjon}{definisjonene}% \crefname{result}{resultat}{resultatene}% \crefname{example}{eksempel}{eksemplene}% \crefname{remark}{bemerkning}{bemerkningene}% \crefname{note}{note}{notene}% \crefname{algorithm}{algoritme}{algoritmene}% \crefname{listing}{opplisting}{opplistingene}% \crefname{line}{linje}{linjene}% \fi}% end \cref@loadlanguagedefs \DeclareOption{danish}{% \AtBeginDocument{% \def\crefrangeconjunction@preamble{ til\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ og\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ og\nobreakspace}% \def\crefpairgroupconjunction@preamble{ og\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ og\nobreakspace}% % \Crefname@preamble{equation}{Ligning}{Ligninger}% \Crefname@preamble{figure}{Figur}{Figurer}% \Crefname@preamble{table}{Tabel}{Tabeller}% \Crefname@preamble{page}{Side}{Sider}% \Crefname@preamble{part}{Del}{Dele}% \Crefname@preamble{chapter}{Kapitel}{Kapitler}% \Crefname@preamble{section}{Afsnit}{Afsnit}% \Crefname@preamble{appendix}{Appendiks}{Appendiks}% \Crefname@preamble{enumi}{Punkt}{Punkter}% \Crefname@preamble{footnote}{Fodnote}{Fodnoter}% \Crefname@preamble{theorem}{Teorem}{Teoremer}% \Crefname@preamble{lemma}{Lemma}{Lemma}% \Crefname@preamble{corollary}{F\o lgeslutning}{F\o lgeslutninger}% \Crefname@preamble{proposition}{Udsagn}{Udsagn}% \Crefname@preamble{definition}{Definition}{Definitioner}% \Crefname@preamble{result}{Resultat}{Resultater}% \Crefname@preamble{example}{Eksempel}{Eksempler}% \Crefname@preamble{remark}{Bem\ae rkning}{Bem\ae rkninger}% \Crefname@preamble{note}{Note}{Noter}% \Crefname@preamble{algorithm}{Algoritme}{Algoritmer}% \Crefname@preamble{line}{Linje}{Linjer}% % \if@cref@capitalise% \crefname@preamble{equation}{Ligning}{Ligninger}% \crefname@preamble{figure}{Figur}{Figurer}% \crefname@preamble{table}{Tabel}{Tabeller}% \crefname@preamble{page}{Side}{Sider}% \crefname@preamble{part}{Del}{Dele}% \crefname@preamble{chapter}{Kapitel}{Kapitler}% \crefname@preamble{section}{Afsnit}{Afsnit}% \crefname@preamble{appendix}{Appendiks}{Appendiks}% \crefname@preamble{enumi}{Punkt}{Punkter}% \crefname@preamble{footnote}{Fodnote}{Fodnoter}% \crefname@preamble{theorem}{Teorem}{Teoremer}% \crefname@preamble{lemma}{Lemma}{Lemma}% \crefname@preamble{corollary}{F\o lgeslutning}{F\o lgeslutninger}% \crefname@preamble{proposition}{Udsagn}{Udsagn}% \crefname@preamble{definition}{Definition}{Definitioner}% \crefname@preamble{result}{Resultat}{Resultater}% \crefname@preamble{example}{Eksempel}{Eksempler}% \crefname@preamble{remark}{Bem\ae rkning}{Bem\ae rkninger}% \crefname@preamble{note}{Note}{Noter}% \crefname@preamble{algorithm}{Algoritme}{Algoritmer}% \crefname@preamble{line}{Linje}{Linjer}% % \else% \crefname@preamble{equation}{ligning}{ligninger}% \crefname@preamble{figure}{figur}{figurer}% \crefname@preamble{table}{tabel}{tabeller}% \crefname@preamble{page}{side}{sider}% \crefname@preamble{part}{del}{dele}% \crefname@preamble{chapter}{kapitel}{kapitler}% \crefname@preamble{section}{afsnit}{afsnit}% \crefname@preamble{appendix}{appendiks}{appendiks}% \crefname@preamble{enumi}{punkt}{punkter}% \crefname@preamble{footnote}{fodnote}{fodnoter}% \crefname@preamble{theorem}{teorem}{teoremer}% \crefname@preamble{lemma}{lemma}{lemma}% \crefname@preamble{corollary}{f\o lgeslutning}{f\o lgeslutninger}% \crefname@preamble{proposition}{udsagn}{udsagn}% \crefname@preamble{definition}{definition}{definitioner}% \crefname@preamble{result}{resultat}{resultater}% \crefname@preamble{example}{eksempel}{eksempler}% \crefname@preamble{remark}{bem\ae rkning}{bem\ae rkninger}% \crefname@preamble{note}{note}{noter}% \crefname@preamble{algorithm}{algoritme}{algoritmer}% \crefname@preamble{line}{linje}{linjer}% \fi% \def\cref@language{danish}% }}% end \DeclareOption and \AtBeginDocument \cref@addlanguagedefs{danish}{% \PackageInfo{cleveref}{loaded `danish' language definitions} \renewcommand{\crefrangeconjunction@preamble}{ til\nobreakspace}% \renewcommand\crefrangepreconjunction@preamble{}% \renewcommand\crefrangepostconjunction@preamble{}% \renewcommand{\crefpairconjunction@preamble}{ og\nobreakspace}% \renewcommand{\crefmiddleconjunction@preamble}{, }% \renewcommand{\creflastconjunction@preamble}{ og\nobreakspace}% \renewcommand{\crefpairgroupconjunction@preamble}{ og\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction@preamble}{, }% \renewcommand{\creflastgroupconjunction@preamble}{ og\nobreakspace}% % \Crefname{equation}{Ligning}{Ligninger}% \Crefname{figure}{Figur}{Figurer}% \Crefname{subfigure}{Figur}{Figurer}% \Crefname{table}{Tabel}{Tabeller}% \Crefname{subtable}{Tabel}{Tabeller}% \Crefname{page}{Side}{Sider}% \Crefname{part}{Del}{Dele}% \Crefname{chapter}{Kapitel}{Kapitler}% \Crefname{section}{Afsnit}{Afsnit}% \Crefname{subsection}{Afsnit}{Afsnit}% \Crefname{subsubsection}{Afsnit}{Afsnit}% \Crefname{appendix}{Appendiks}{Appendiks}% \Crefname{subappendix}{Appendiks}{Appendiks}% \Crefname{subsubappendix}{Appendiks}{Appendiks}% \Crefname{subsubsubappendix}{Appendiks}{Appendiks}% \Crefname{enumi}{Punkt}{Punkter}% \Crefname{enumii}{Punkt}{Punkter}% \Crefname{enumiii}{Punkt}{Punkter}% \Crefname{enumiv}{Punkt}{Punkter}% \Crefname{enumv}{Punkt}{Punkter}% \Crefname{footnote}{Fodnote}{Fodnoter}% \Crefname{theorem}{Teorem}{Teoremer}% \Crefname{lemma}{Lemma}{Lemma}% \Crefname{corollary}{F\o lgeslutning}{F\o lgeslutninger}% \Crefname{proposition}{Udsagn}{Udsagn}% \Crefname{definition}{Definition}{Definitioner}% \Crefname{result}{Resultat}{Resultater}% \Crefname{example}{Eksempel}{Eksempler}% \Crefname{remark}{Bem\ae rkning}{Bem\ae rkninger}% \Crefname{note}{Note}{Noter}% \Crefname{algorithm}{Algoritme}{Algoritmer}% \Crefname{line}{Linje}{Linjer}% % \if@cref@capitalise% \crefname{equation}{Ligning}{Ligninger}% \crefname{figure}{Figur}{Figurer}% \crefname{subfigure}{Figur}{Figurer}% \crefname{table}{Tabel}{Tabeller}% \crefname{subtable}{Tabel}{Tabeller}% \crefname{page}{Side}{Sider}% \crefname{part}{Del}{Dele}% \crefname{chapter}{Kapitel}{Kapitler}% \crefname{section}{Afsnit}{Afsnit}% \crefname{subsection}{Afsnit}{Afsnit}% \crefname{subsubsection}{Afsnit}{Afsnit}% \crefname{appendix}{Appendiks}{Appendiks}% \crefname{subappendix}{Appendiks}{Appendiks}% \crefname{subsubappendix}{Appendiks}{Appendiks}% \crefname{subsubsubappendix}{Appendiks}{Appendiks}% \crefname{enumi}{Punkt}{Punkter}% \crefname{enumii}{Punkt}{Punkter}% \crefname{enumiii}{Punkt}{Punkter}% \crefname{enumiv}{Punkt}{Punkter}% \crefname{enumv}{Punkt}{Punkter}% \crefname{footnote}{Fodnote}{Fodnoter}% \crefname{theorem}{Teorem}{Teoremer}% \crefname{lemma}{Lemma}{Lemma}% \crefname{corollary}{F\o lgeslutning}{F\o lgeslutninger}% \crefname{proposition}{Udsagn}{Udsagn}% \crefname{definition}{Definition}{Definitioner}% \crefname{result}{Resultat}{Resultater}% \crefname{example}{Eksempel}{Eksempler}% \crefname{remark}{Bem\ae rkning}{Bem\ae rkninger}% \crefname{note}{Note}{Noter}% \crefname{algorithm}{Algoritme}{Algoritmer}% \crefname{line}{Linje}{Linjer}% % \else% \crefname{equation}{ligning}{ligninger}% \crefname{figure}{figur}{figurer}% \crefname{subfigure}{figur}{figurer}% \crefname{table}{tabel}{tabeller}% \crefname{subtable}{tabel}{tabeller}% \crefname{page}{side}{sider}% \crefname{part}{del}{dele}% \crefname{chapter}{kapitel}{kapitler}% \crefname{section}{afsnit}{afsnit}% \crefname{subsection}{afsnit}{afsnit}% \crefname{subsubsection}{afsnit}{afsnit}% \crefname{appendix}{appendiks}{appendiks}% \crefname{subappendix}{appendiks}{appendiks}% \crefname{subsubappendix}{appendiks}{appendiks}% \crefname{subsubsubappendix}{appendiks}{appendiks}% \crefname{enumi}{punkt}{punkter}% \crefname{enumii}{punkt}{punkter}% \crefname{enumiii}{punkt}{punkter}% \crefname{enumiv}{punkt}{punkter}% \crefname{enumv}{punkt}{punkter}% \crefname{footnote}{fodnote}{fodnoter}% \crefname{theorem}{teorem}{teoremer}% \crefname{lemma}{lemma}{lemma}% \crefname{corollary}{f\o lgeslutning}{f\o lgeslutninger}% \crefname{proposition}{udsagn}{udsagn}% \crefname{definition}{definition}{definitioner}% \crefname{result}{resultat}{resultater}% \crefname{example}{eksempel}{eksempler}% \crefname{remark}{bem\ae rkning}{bem\ae rkninger}% \crefname{note}{note}{noter}% \crefname{algorithm}{algoritme}{algoritmer}% \crefname{line}{linje}{linjer}% \fi}% end \cref@loadlanguagedefs \DeclareOption{esperanto}{% \AtBeginDocument{% \def\crefrangeconjunction@preamble{ \^gis\nobreakspace}% \def\crefrangepreconjunction@preamble{}% \def\crefrangepostconjunction@preamble{}% \def\crefpairconjunction@preamble{ kaj\nobreakspace}% \def\crefmiddleconjunction@preamble{, }% \def\creflastconjunction@preamble{ kaj\nobreakspace}% \def\crefpairgroupconjunction@preamble{ kaj\nobreakspace}% \def\crefmiddlegroupconjunction@preamble{, }% \def\creflastgroupconjunction@preamble{ kaj\nobreakspace}% \Crefname@preamble{equation}{Ekvacio}{Ekvacioj}% \Crefname@preamble{part}{Parto}{Partoj}% \Crefname@preamble{chapter}{\^Capitro}{\^Capitroj}% \Crefname@preamble{section}{Sekcio}{Sekcioj}% \Crefname@preamble{appendix}{Aldono}{Aldonoj}% \Crefname@preamble{enumi}{Punkto}{Punktoj}% \Crefname@preamble{footnote}{Piednoto}{Piednotoj}% \Crefname@preamble{figure}{Figuro}{Figuroj}% \Crefname@preamble{table}{Tabelo}{Tabeloj}% \Crefname@preamble{theorem}{Teoremo}{Teoremoj}% \Crefname@preamble{lemma}{Lemo}{Lemoj}% \Crefname@preamble{corollary}{Korolario}{Korolarioj}% \Crefname@preamble{proposition}{Propozicio}{Propozicioj}% \Crefname@preamble{definition}{Defino}{Definoj}% \Crefname@preamble{result}{Rezulto}{Rezultoj}% \Crefname@preamble{example}{Ekzemplo}{Ekzemploj}% \Crefname@preamble{remark}{Rimarko}{Rimarkoj}% \Crefname@preamble{note}{Noto}{Notoj}% \Crefname@preamble{algorithm}{Algoritmo}{Algoritmoj}% \Crefname@preamble{listing}{Listado}{Listadoj}% \Crefname@preamble{line}{Linio}{Linioj}% \if@cref@capitalise% \crefname@preamble{equation}{Ekvacio}{Ekvacioj}% \crefname@preamble{part}{Parto}{Partoj}% \crefname@preamble{chapter}{\^Capitro}{\^Capitroj}% \crefname@preamble{section}{Sekcio}{Sekcioj}% \crefname@preamble{appendix}{Aldono}{Aldonoj}% \crefname@preamble{enumi}{Punkto}{Punktoj}% \crefname@preamble{footnote}{Piednoto}{Piednotoj}% \crefname@preamble{figure}{Figuro}{Figuroj}% \crefname@preamble{table}{Tabelo}{Tabeloj}% \crefname@preamble{theorem}{Teoremo}{Teoremoj}% \crefname@preamble{lemma}{Lemo}{Lemoj}% \crefname@preamble{corollary}{Korolario}{Korolarioj}% \crefname@preamble{proposition}{Propozicio}{Propozicioj}% \crefname@preamble{definition}{Defino}{Definoj}% \crefname@preamble{result}{Rezulto}{Rezultoj}% \crefname@preamble{example}{Ekzemplo}{Ekzemploj}% \crefname@preamble{remark}{Rimarko}{Rimarkoj}% \crefname@preamble{note}{Noto}{Notoj}% \crefname@preamble{algorithm}{Algoritmo}{Algoritmoj}% \crefname@preamble{listing}{Listado}{Listadoj}% \crefname@preamble{line}{Linio}{Linioj}% \else% \crefname@preamble{equation}{ekvacio}{ekvacioj}% \crefname@preamble{part}{parto}{partoj}% \crefname@preamble{chapter}{\^capitro}{\^capitroj}% \crefname@preamble{section}{sekcio}{sekcioj}% \crefname@preamble{appendix}{aldono}{aldonoj}% \crefname@preamble{enumi}{punkto}{punktoj}% \crefname@preamble{footnote}{piednoto}{piednotoj}% \crefname@preamble{figure}{figuro}{figuroj}% \crefname@preamble{table}{tabelo}{tabeloj}% \crefname@preamble{theorem}{teoremo}{teoremoj}% \crefname@preamble{lemma}{lemo}{lemoj}% \crefname@preamble{corollary}{korolario}{korolarioj}% \crefname@preamble{proposition}{propozicio}{propozicioj}% \crefname@preamble{definition}{defino}{definoj}% \crefname@preamble{result}{rezulto}{rezultoj}% \crefname@preamble{example}{ekzemplo}{ekzemploj}% \crefname@preamble{remark}{rimarko}{rimarkoj}% \crefname@preamble{note}{noto}{notoj}% \crefname@preamble{algorithm}{algoritmo}{algoritmoj}% \crefname@preamble{listing}{listado}{listadoj}% \crefname@preamble{line}{linio}{linioj}% \fi% \def\cref@language{esperanto}% }}% end \DeclareOption and \AtBeginDocument \cref@addlanguagedefs{esperanto}{% \PackageInfo{cleveref}{loaded `esperanto' language definitions} \renewcommand{\crefrangeconjunction}{ \^gis\nobreakspace}% \renewcommand{\crefrangepreconjunction}{}% \renewcommand{\crefrangepostconjunction}{}% \renewcommand{\crefpairconjunction}{ kaj\nobreakspace}% \renewcommand{\crefmiddleconjunction}{, }% \renewcommand{\creflastconjunction}{ kaj\nobreakspace}% \renewcommand{\crefpairgroupconjunction}{ kaj\nobreakspace}% \renewcommand{\crefmiddlegroupconjunction}{, }% \renewcommand{\creflastgroupconjunction}{ kaj\nobreakspace}% \Crefname{equation}{Ekvacio}{Ekvacioj}% \Crefname{part}{Parto}{Partoj}% \Crefname{chapter}{\^Capitro}{\^Capitroj}% \Crefname{section}{Sekcio}{Sekcioj}% \Crefname{appendix}{Aldono}{Aldonoj}% \Crefname{enumi}{Punkto}{Punktoj}% \Crefname{footnote}{Piednoto}{Piednotoj}% \Crefname{figure}{Figuro}{Figuroj}% \Crefname{table}{Tabelo}{Tabeloj}% \Crefname{theorem}{Teoremo}{Teoremoj}% \Crefname{lemma}{Lemo}{Lemoj}% \Crefname{corollary}{Korolario}{Korolarioj}% \Crefname{proposition}{Propozicio}{Propozicioj}% \Crefname{definition}{Defino}{Definoj}% \Crefname{result}{Rezulto}{Rezultoj}% \Crefname{example}{Ekzemplo}{Ekzemploj}% \Crefname{remark}{Rimarko}{Rimarkoj}% \Crefname{note}{Noto}{Notoj}% \Crefname{algorithm}{Algoritmo}{Algoritmoj}% \Crefname{listing}{Listado}{Listadoj}% \Crefname{line}{Linio}{Linioj}% \if@cref@capitalise% \crefname{equation}{Ekvacio}{Ekvacioj}% \crefname{part}{Parto}{Partoj}% \crefname{chapter}{\^Capitro}{\^Capitroj}% \crefname{section}{Sekcio}{Sekcioj}% \crefname{appendix}{Aldono}{Aldonoj}% \crefname{enumi}{Punkto}{Punktoj}% \crefname{footnote}{Piednoto}{Piednotoj}% \crefname{figure}{Figuro}{Figuroj}% \crefname{table}{Tabelo}{Tabeloj}% \crefname{theorem}{Teoremo}{Teoremoj}% \crefname{lemma}{Lemo}{Lemoj}% \crefname{corollary}{Korolario}{Korolarioj}% \crefname{proposition}{Propozicio}{Propozicioj}% \crefname{definition}{Defino}{Definoj}% \crefname{result}{Rezulto}{Rezultoj}% \crefname{example}{Ekzemplo}{Ekzemploj}% \crefname{remark}{Rimarko}{Rimarkoj}% \crefname{note}{Noto}{Notoj}% \crefname{algorithm}{Algoritmo}{Algoritmoj}% \crefname{listing}{Listado}{Listadoj}% \crefname{line}{Linio}{Linioj}% \else% \crefname{equation}{ekvacio}{ekvacioj}% \crefname{part}{parto}{partoj}% \crefname{chapter}{\^capitro}{\^capitroj}% \crefname{section}{sekcio}{sekcioj}% \crefname{appendix}{aldono}{aldonoj}% \crefname{enumi}{punkto}{punktoj}% \crefname{footnote}{piednoto}{piednotoj}% \crefname{figure}{figuro}{figuroj}% \crefname{table}{tabelo}{tabeloj}% \crefname{theorem}{teoremo}{teoremoj}% \crefname{lemma}{lemo}{lemoj}% \crefname{corollary}{korolario}{korolarioj}% \crefname{proposition}{propozicio}{propozicioj}% \crefname{definition}{defino}{definoj}% \crefname{result}{rezulto}{rezultoj}% \crefname{example}{ekzemplo}{ekzemploj}% \crefname{remark}{rimarko}{rimarkoj}% \crefname{note}{noto}{notoj}% \crefname{algorithm}{algoritmo}{algoritmoj}% \crefname{listing}{listado}{listadoj}% \crefname{line}{linio}{linioj}% \fi}% end \cref@loadlanguagedefs hevea-2.30/previous_motif.gif0000644004317100512160000000047506537544364016343 0ustar marangetcristalGIF89añp€ÿÿp€!þ# Imported from XPM image: prev.xpm!ù,@çÜ63333Æ# „B Ã0 AÀ0 Ã0 Ã0 À0 ƒÁ`0 ƒÁ`0 ƒA  ƒ €Á`0 ƒ`00000000000000000000000000000000000000000000  000 0000000000000000000000000000000`À€ ;hevea-2.30/text.mli0000644004317100512160000000137111774606345014262 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) include OutManager.S hevea-2.30/lstlang2.sty0000644004317100512160000023515611524022160015050 0ustar marangetcristal%% %% This is file `lstlang2.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% lstdrvrs.dtx (with options: `lang2') %% %% The listings package is copyright 1996--2004 Carsten Heinz, and %% continued maintenance on the package is copyright 2006--2007 Brooks Moses. %% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/ %% 2007 any individual author listed in this file. %% %% This file is distributed under the terms of the LaTeX Project Public %% License from CTAN archives in directory macros/latex/base/lppl.txt. %% Either version 1.3 or, at your option, any later version. %% %% This file is completely free and comes without any warranty. %% %% Send comments and ideas on the package, error reports and additional %% programming languages to Brooks Moses at . %% \ProvidesFile{lstlang2.sty} [2004/09/05 1.3 listings language file] %% %% Abap definition by Knut Lickert %% \lst@definelanguage[R/3 6.10]{ABAP}[R/3 4.6C]{ABAP}% {morekeywords={try,endtry},% }[keywords,comments,strings] \lst@definelanguage[R/3 4.6C]{ABAP}[R/3 3.1]{ABAP}% {morekeywords={method,ref,class,create,object,% methods,endmethod,private,protected,public,section,% catch,system-exceptions,endcatch,% },% moreprocnamekeys={class},% literate={->}{{$\rightarrow$}}1{=>}{{$\Rightarrow$}}1,% }[keywords,comments,strings,procnames] \lst@definelanguage[R/3 3.1]{ABAP}[R/2 5.0]{ABAP}{}% \lst@definelanguage[R/2 5.0]{ABAP}% {sensitive=f,% procnamekeys={report,program,form,function,module},% morekeywords={*,add,after,alias,analyzer,and,append,appending,area,assign,at,% authority-check,before,binary,blank,break-point,calendar,call,% case,change,changing,check,clear,cnt,co,collect,commit,common,% component,compute,condense,corresponding,cos,cp,cs,currency-conversion,% cursor,data,database,dataset,decimals,define,delete,deleting,dequeue,% describe,detail,dialog,directory,div,divide,do,documentation,% during,dynpro,else,end-of-page,end-of-selection,endat,endcase,% enddo,endfor,endform,endif,endloop,endmodule,endselect,% endwhile,enqueue,exceptions,exit,exp,export,exporting,extract,% field,fields,field-groups,field-symbols,find,for,form,format,free,% from,function,generating,get,giving,hide,id,if,import,% importing,in,incl,include,initial,initialization,input,insert,% interrupt,into,is,language,leave,leading,left-justified,like,line,lines,line-count, line-selection,list-processing,load,local,log,logfile,loop,% margin,mark,mask,memory,menue,message,mod,modify,module,move,% move-text,multiply,na,new,new-line,new-page,no-gaps,np,ns,% number,obligatory,occurs,of,on,or,others,output,parameter,% parameters,parts,perform,pf-status,places,position,process,% raise,raising,ranges,read,refresh,refresh-dynpro,reject,remote,% replace,report,reserve,reset,restart,right-justified,run,screen,scroll,search,% segments,select,select-options,selection-screen,set,shift,sin,% single,sqrt,start-of-selection,statement,structure,submit,% subtract,summary,summing,suppress,system,table,tables,task,% text,time,to,top-of-page,trace,transaction,transfer,% transfer-dynpro,translate,type,unpack,update,user-command,% using,value,when,where,while,window,with,workfile,write,},% morecomment=[l]",% morecomment=[f][commentstyle][0]*,% morestring=[d]'% }[keywords,comments,strings,procnames] \lst@definelanguage[R/2 4.3]{ABAP}[R/2 5.0]{ABAP}% {deletekeywords={function,importing,exporting,changing,exceptions,% raise,raising}% }[keywords,comments,strings] %% %% Corba IDL definition (c) 1999 Jens T. Berger Thielemann %% \lst@definelanguage[CORBA]{IDL}% {morekeywords={any,attribute,boolean,case,char,const,context,default,% double,enum,exception,fixed,float,in,inout,interface,long,module,% native,Object,octet,oneway,out,raises,readonly,sequence,short,% string,struct,switch,typedef,union,unsigned,void,wchar,wstring,% FALSE,TRUE},% sensitive,% moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,% include,pragma,undef,warning},% moredelim=*[directive]\#,% morecomment=[l]//,% morecomment=[s]{/*}{*/},% morestring=[b]"% }[keywords,comments,strings,directives]% %% %% (Objective) Caml definition (c) 1999 Patrick Cousot %% %% Objective CAML and Caml light are freely available, together with a %% reference manual, at URL ftp.inria.fr/lang/caml-light for the Unix, %% Windows and Macintosh OS operating systems. %% \lst@definelanguage[Objective]{Caml}[light]{Caml} {deletekeywords={not,prefix,value,where},% morekeywords={assert,asr,class,closed,constraint,external,false,% functor,include,inherit,land,lazy,lor,lsl,lsr,lxor,method,mod,% module,new,open,parser,private,sig,struct,true,val,virtual,when,% object,ref},% TH }% \lst@definelanguage[light]{Caml} {morekeywords={and,as,begin,do,done,downto,else,end,exception,for,% fun,function,if,in,let,match,mutable,not,of,or,prefix,rec,then,% to,try,type,value,where,while,with},% sensitive,% morecomment=[n]{(*}{*)},% morestring=[b]",% moredelim=*[directive]\#,% moredirectives={open,close,include}% }[keywords,comments,strings,directives]% \lst@definelanguage[ibm]{Cobol}[1985]{Cobol}% {morekeywords={ADDRESS,BEGINNING,COMP-3,COMP-4,COMPUTATIONAL,% COMPUTATIONAL-3,COMPUTATIONAL-4,DISPLAY-1,EGCS,EJECT,ENDING,% ENTRY,GOBACK,ID,MORE-LABELS,NULL,NULLS,PASSWORD,RECORDING,% RETURN-CODE,SERVICE,SKIP1,SKIP2,SKIP3,SORT-CONTROL,SORT-RETURN,% SUPPRESS,TITLE,WHEN-COMPILED},% }% \lst@definelanguage[1985]{Cobol}[1974]{Cobol}% {morekeywords={ALPHABET,ALPHABETIC-LOWER,ALPHABETIC-UPPER,% ALPHANUMERIC,ALPHANUMERIC-EDITED,ANY,CLASS,COMMON,CONTENT,% CONTINUE,DAY-OF-WEEK,END-ADD,END-CALL,END-COMPUTE,END-DELETE,% END-DIVIDE,END-EVALUATE,END-IF,END-MULTIPLY,END-PERFORM,END-READ,% END-RECEIVE,END-RETURN,END-REWRITE,END-SEARCH,END-START,% END-STRING,END-SUBTRACT,END-UNSTRING,END-WRITE,EVALUATE,EXTERNAL,% FALSE,GLOBAL,INITIALIZE,NUMERIC-EDITED,ORDER,OTHER,% PACKED-DECIMAL,PADDING,PURGE,REFERENCE,RELOAD,REPLACE,STANDARD-1,% STANDARD-2,TEST,THEN,TRUE},% }% \lst@definelanguage[1974]{Cobol}% {morekeywords={ACCEPT,ACCESS,ADD,ADVANCING,AFTER,ALL,ALPHABETIC,ALSO,% ALTER,ALTERNATE,AND,ARE,AREA,AREAS,ASCENDING,ASSIGN,AT,AUTHOR,% BEFORE,BINARY,BLANK,BLOCK,BOTTOM,BY,CALL,CANCEL,CD,CF,CH,% CHARACTER,CHARACTERS,CLOCK-UNITS,CLOSE,COBOL,CODE,CODE-SET,% COLLATING,COLUMN,COMMA,COMMUNICATION,COMP,COMPUTE,CONFIGURATION,% CONTAINS,CONTROL,CONTROLS,CONVERTING,COPY,CORR,CORRESPONDING,% COUNT,CURRENCY,DATA,DATE,DATE-COMPILED,DATE-WRITTEN,DAY,DE,% DEBUG-CONTENTS,DEGUB-ITEM,DEBUG-LINE,DEBUG-NAME,DEBUG-SUB1,% DEBUG-SUB2,DEBUG-SUB3,DEBUGGING,DECIMAL-POINT,DECLARATIVES,% DELETE,DELIMITED,DELIMITER,DEPENDING,DESCENDING,DESTINATION,% DETAIL,DISABLE,DISPLAY,DIVIDE,DIVISION,DOWN,DUPLICATES,DYNAMIC,% EGI,ELSE,EMI,ENABLE,END,END-OF-PAGE,ENTER,ENVIRONMENT,EOP,EQUAL,% ERROR,ESI,EVERY,EXCEPTION,EXIT,EXTEND,FD,FILE,FILE-CONTROL,% FILLER,FINAL,FIRST,FOOTING,FOR,FROM,GENERATE,GIVING,GO,GREATER,% GROUP,HEADING,HIGH-VALUE,HIGH-VALUES,I-O,I-O-CONTROL,% IDENTIFICATION,IF,IN,INDEX,INDEXED,INDICATE,INITIAL,INITIATE,% INPUT,INPUT-OUTPUT,INSPECT,INSTALLATION,INTO,INVALID,IS,JUST,% JUSTIFIED,KEY,LABEL,LAST,LEADING,LEFT,LENGTH,LESS,LIMIT,LIMITS,% LINAGE,LINAGE-COUNTER,LINE,LINE-COUNTER,LINES,LINKAGE,LOCK,% LOW-VALUE,LOW-VALUES,MEMORY,MERGE,MESSAGE,MODE,MODULES,MOVE,% MULTIPLE,MULTIPLY,NATIVE,NEGATIVE,NEXT,NO,NOT,NUMBER,NUMERIC,% OBJECT-COMPUTER,OCCURS,OF,OFF,OMITTED,ON,OPEN,OPTIONAL,OR,% ORGANIZATION,OUTPUT,OVERFLOW,PAGE,PAGE-COUNTER,PERFORM,PF,PH,PIC,% PICTURE,PLUS,POINTER,POSITION,PRINTING,POSITIVE,PRINTING,% PROCEDURE,PROCEDURES,PROCEED,PROGRAM,PROGRAM-ID,QUEUE,QUOTE,% QUOTES,RANDOM,RD,READ,RECEIVE,RECORD,RECORDING,RECORDS,REDEFINES,% REEL,REFERENCES,RELATIVE,RELEASE,REMAINDER,REMOVAL,RENAMES,% REPLACING,REPORT,REPORTING,REPORTS,RERUN,RESERVE,RESET,RETURN,% REVERSED,REWIND,REWRITE,RF,RH,RIGHT,ROUNDED,RUN,SAME,SD,SEARCH,% SECTION,SECURITY,SEGMENT,SEGMENT-LIMIT,SELECT,SEND,SENTENCE,% SEPARATE,SEQUENCE,SEQUENTIAL,SET,SIGN,SIZE,SORT,SORT-MERGE,% SOURCE,SOURCE-COMPUTER,SPACE,SPACES,SPECIAL-NAMES,STANDARD,START,% STATUS,STOP,STRING,SUB-QUEUE-1,SUB-QUEUE-2,SUB-QUEUE-3,SUBTRACT,% SUM,SYMBOLIC,SYNC,SYNCHRONIZED,TABLE,TALLYING,TAPE,TERMINAL,% TERMINATE,TEXT,THAN,THROUGH,THRU,TIME,TIMES,TO,TOP,TRAILING,TYPE,% UNIT,UNSTRING,UNTIL,UP,UPON,USAGE,USE,USING,VALUE,VALUES,VARYING,% WHEN,WITH,WORDS,WORKING-STORAGE,WRITE,ZERO,ZEROES,ZEROS},% alsodigit=-,% sensitive=f,% ??? morecomment=[f][commentstyle][6]*,% morestring=[d]"% ??? doubled }[keywords,comments,strings]% \lst@definelanguage{Delphi}% {morekeywords={and,as,asm,array,begin,case,class,const,constructor,% destructor,div,do,downto,else,end,except,exports,file,finally,% for,function,goto,if,implementation,in,inherited,inline,% initialization,interface,is,label,library,mod,nil,not,object,of,% or,packed,procedure,program,property,raise,record,repeat,set,% shl,shr,string,then,to,try,type,unit,until,uses,var,while,with,% xor,% absolute,abstract,assembler,at,cdecl,default,dynamic,export,% external,far,forward,index,name,near,nodefault,on,override,% private,protected,public,published,read,resident,storedDir,% virtual,write},% morendkeywords={Abs,AddExitProc,Addr,AllocMem,AnsiCompareStr,% AnsiCompareText,AnsiLowerCase,AnsiUpperCase,Append,AppendStr,% ArcTan,AssignCrt,Assigned,AssignFile,BlockRead,BlockWrite,Break,% ChangeFileExt,ChDir,Chr,CloseFile,ClrEol,ClrScr,Concat,Continue,% Copy,Cos,CSeg,CursorTo,Date,DateTimeToFileDate,DateTimeToStr,% DateTimeToString,DateToStr,DayOfWeek,Dec,DecodeDate,DecodeTime,% Delete,DeleteFile,DiskFree,DiskSize,Dispose,DisposeStr,% DoneWinCrt,DSeg,EncodeDate,EncodeTime,Eof,Eoln,Erase,Exclude,% Exit,Exp,ExpandFileName,ExtractFileExt,ExtractFileName,% ExtractFilePath,FileAge,FileClose,FileDateToDateTime,FileExists,% FileGetAttr,FileGetDate,FileOpen,FilePos,FileRead,FileSearch,% FileSeek,FileSetAttr,FileSetDate,FileSize,FillChar,FindClose,% FindFirst,FindNext,FloatToDecimal,FloatToStrF,FloatToStr,% FloatToText,FloatToTextFmt,Flush,FmtLoadStr,FmtStr,Format,% FormatBuf,FormatDateTime,FormatFloat,Frac,Free,FreeMem,GetDir,% GetMem,GotoXY,Halt,Hi,High,Inc,Include,InitWinCrt,Insert,Int,% IntToHex,IntToStr,IOResult,IsValidIdent,KeyPressed,Length,Ln,Lo,% LoadStr,Low,LowerCase,MaxAvail,MemAvail,MkDir,Move,New,NewStr,% Now,Odd,Ofs,Ord,ParamCount,ParamStr,Pi,Pos,Pred,Ptr,Random,% Randomize,Read,ReadBuf,ReadKey,Readln,ReAllocMem,Rename,% RenameFile,Reset,Rewrite,RmDir,Round,RunError,ScrollTo,Seek,% SeekEof,SeekEoln,Seg,SetTextBuf,Sin,SizeOf,SPtr,Sqr,Sqrt,SSeg,% Str,StrCat,StrComp,StrCopy,StrDispose,StrECopy,StrEnd,StrFmt,% StrLCat,StrIComp,StrLComp,StrLCopy,StrLen,StrLFmt,StrLIComp,% StrLower,StrMove,StrNew,StrPas,StrPCopy,StrPos,StrScan,StrRScan,% StrToDate,StrToDateTime,StrToFloat,StrToInt,StrToIntDef,% StrToTime,StrUpper,Succ,Swap,TextToFloat,Time,TimeToStr,% TrackCursor,Trunc,Truncate,TypeOf,UpCase,UpperCase,Val,WhereX,% WhereY,Write,WriteBuf,WriteChar,Writeln},% sensitive=f,% morecomment=[s]{(*}{*)},% morecomment=[s]{\{}{\}},% morecomment=[l]{//},% 2001 Christian Gudrian morestring=[d]'% }[keywords,comments,strings]% \lst@definelanguage{Eiffel}% {morekeywords={alias,all,and,as,BIT,BOOLEAN,CHARACTER,check,class,% creation,Current,debug,deferred,do,DOUBLE,else,elseif,end,% ensure,expanded,export,external,false,feature,from,frozen,if,% implies,indexing,infix,inherit,inspect,INTEGER,invariant,is,% like,local,loop,NONE,not,obsolete,old,once,or,POINTER,prefix,% REAL,redefine,rename,require,rescue,Result,retry,select,% separate,STRING,strip,then,true,undefine,unique,until,variant,% when,xor},% sensitive,% morecomment=[l]--,% morestring=[d]",% }[keywords,comments,strings]% %% %% Euphoria definition (c) 1998 Detlef Reimers %% \lst@definelanguage{Euphoria}% {morekeywords={abort,and,and_bits,append,arctan,atom,by,call,% call_proc,call_func,c_proc,c_func,clear_screen,close,% command_line,compare,constant,cos,do,date,else,elsif,end,exit,% find,floor,for,function,getc,getenv,get_key,gets,global,% get_pixel,if,include,integer,length,log,match,machine_func,% machine_proc,mem_copy,mem_set,not,not_bits,or,object,open,% or_bits,procedure,puts,position,prepend,print,printf,power,peek,% poke,pixel,poke4,peek4s,peek4u,return,rand,repeat,remainder,% routine_id,sequence,sqrt,sin,system,sprintf,then,type,to,time,% trace,tan,while,with,without,xor,xor_bits},% sensitive,% morecomment=[l]--,% morestring=[d]',% morestring=[d]"% }[keywords,comments,strings]% %% %% Guarded Command Language (GCL) definition %% (c) 2002 Mark van Eijk %% \lst@definelanguage{GCL}% {morekeywords={const,con,var,array,of,skip,if,fi,do,od,div,mod},% literate={|[}{\ensuremath{|\hskip -0.1em[}}2% {]|}{\ensuremath{]\hskip -0.1em|}}2% {[]}{\ensuremath{[\hskip -0.1em]}}2% {->}{\ensuremath{\rightarrow}~}2% {==}{\ensuremath{\equiv}~}2% {>=}{\ensuremath{\geq}~}2% {<=}{\ensuremath{\leq}~}2% {/\\}{\ensuremath{\land}~}2% {\\/}{\ensuremath{\lor}~}2% {!}{\ensuremath{\lnot}}1% {!=}{\ensuremath{\neq}~}2% {max}{\ensuremath{\uparrow}}1% {min}{\ensuremath{\downarrow}}1,% sensitive=f,% morecomment=[s]{\{}{\}},% morestring=[d]'% }[keywords,comments,strings]% %% %% gnuplot definition (c) Christoph Giess %% \lst@definelanguage{Gnuplot}% {keywords={abs,acos,acosh,arg,asin,asinh,atan,atan2,atanh,besj0,% besj1,besy0,besy1,ceil,cos,cosh,erf,erfc,exp,floor,gamma,ibeta,% inverf,igamma,imag,invnorm,int,lgamma,log,log10,norm,rand,real,% sgn,sin,sinh,sqrt,tan,tanh,column,tm_hour,tm_mday,tm_min,tm_mon,% tm_sec,tm_wday,tm_yday,tm_year,valid,cd,call,clear,exit,fit,% help,if,load,pause,plot,print,pwd,quit,replot,reread,reset,save,% set,show,shell,splot,test,update,angles,arrow,autoscale,border,% boxwidth,clabel,clip,cntrparam,contour,data,dgrid3d,dummy,% format,function,functions,grid,hidden3d,isosamples,key,keytitle,% label,logscale,mapping,offsets,output,parametric,pointsize,% polar,rrange,samples,size,style,surface,terminal,tics,time,% timefmt,title,trange,urange,variables,view,vrange,xdata,xlabel,% xmargin,xrange,xtics,mxtics,mytics,xdtics,xmtics,xzeroaxis,% ydata,ylabel,yrange,ytics,ydtics,ymtics,yzeroaxis,zdata,zero,% zeroaxis,zlabel,zrange,ztics,zdtics,zmtics,timefm,using,title,% with,index,every,thru,smooth},% sensitive,% comment=[l]\#,% morestring=[b]",% morestring=[b]',% }[keywords,comments,strings]% %% %% Haskell98 as implemented in Hugs98. See http://www.haskell.org %% All keywords from Prelude and Standard Libraries %% (c) 1999 Peter Bartke %% \lst@definelanguage{Haskell}% {otherkeywords={=>},% morekeywords={abstype,if,then,else,case,class,data,default,deriving,% hiding,if,in,infix,infixl,infixr,import,instance,let,module,% newtype,of,qualified,type,where,do,AbsoluteSeek,AppendMode,% Array,BlockBuffering,Bool,BufferMode,Char,Complex,Double,Either,% FilePath,Float,Int,Integer,IO,IOError,Ix,LineBuffering,Maybe,% Ordering,NoBuffering,ReadMode,ReadWriteMode,ReadS,RelativeSeek,% SeekFromEnd,SeekMode,ShowS,StdGen,String,Void,Bounded,Enum,Eq,% Eval,ExitCode,exitFailure,exitSuccess,Floating,Fractional,% Functor,Handle,HandlePosn,IOMode,Integral,List,Monad,MonadPlus,% MonadZero,Num,Numeric,Ord,Random,RandomGen,Ratio,Rational,Read,% Real,RealFloat,RealFrac,Show,System,Prelude,EQ,False,GT,Just,% Left,LT,Nothing,Right,WriteMode,True,abs,accum,accumArray,% accumulate,acos,acosh,all,and,any,ap,appendFile,applyM,% approxRational,array,asTypeOf,asin,asinh,assocs,atan,atan2,atanh,% bounds,bracket,bracket_,break,catch,catMaybes,ceiling,chr,cis,% compare,concat,concatMap,conjugate,const,cos,cosh,curry,cycle,% decodeFloat,delete,deleteBy,deleteFirstsBy,denominator,% digitToInt,div,divMod,drop,dropWhile,either,elem,elems,elemIndex,% elemIndices,encodeFloat,enumFrom,enumFromThen,enumFromThenTo,% enumFromTo,error,even,exitFailure,exitWith,exp,exponent,fail,% filter,filterM,find,findIndex,findIndices,flip,floatDigits,% floatRadix,floatRange,floatToDigits,floor,foldl,foldM,foldl1,% foldr,foldr1,fromDouble,fromEnum,fromInt,fromInteger,% fromIntegral,fromJust,fromMaybe,fromRat,fromRational,% fromRealFrac,fst,gcd,genericLength,genericTake,genericDrop,% genericSplitAt,genericIndex,genericReplicate,getArgs,getChar,% getContents,getEnv,getLine,getProgName,getStdGen,getStdRandom,% group,groupBy,guard,hClose,hFileSize,hFlush,hGetBuffering,% hGetChar,hGetContents,hGetLine,hGetPosn,hIsClosed,hIsEOF,hIsOpen,% hIsReadable,hIsSeekable,hIsWritable,hLookAhead,hPutChar,hPutStr,% hPutStrLn,hPrint,hReady,hSeek,hSetBuffering,hSetPosn,head,% hugsIsEOF,hugsHIsEOF,hugsIsSearchErr,hugsIsNameErr,% hugsIsWriteErr,id,ioError,imagPart,index,indices,init,inits,% inRange,insert,insertBy,interact,intersect,intersectBy,% intersperse,intToDigit,ioeGetErrorString,ioeGetFileName,% ioeGetHandle,isAlreadyExistsError,isAlreadyInUseError,isAlpha,% isAlphaNum,isAscii,isControl,isDenormalized,isDoesNotExistError,% isDigit,isEOF,isEOFError,isFullError,isHexDigit,isIEEE,% isIllegalOperation,isInfinite,isJust,isLower,isNaN,% isNegativeZero,isNothing,isOctDigit,isPermissionError,isPrefixOf,% isPrint,isSpace,isSuffixOf,isUpper,isUserError,iterate,ixmap,% join,last,lcm,length,lex,lexDigits,lexLitChar,liftM,liftM2,% liftM3,liftM4,liftM5,lines,listArray,listToMaybe,log,logBase,% lookup,magnitude,makePolar,map,mapAccumL,mapAccumR,mapAndUnzipM,% mapM,mapM_,mapMaybe,max,maxBound,maximum,maximumBy,maybe,% maybeToList,min,minBound,minimum,minimumBy,mkPolar,mkStdGen,% mplus,mod,msum,mzero,negate,next,newStdGen,not,notElem,nub,nubBy,% null,numerator,odd,openFile,or,ord,otherwise,partition,phase,pi,% polar,pred,print,product,properFraction,putChar,putStr,putStrLn,% quot,quotRem,random,randomIO,randomR,randomRIO,randomRs,randoms,% rangeSize,read,readDec,readFile,readFloat,readHex,readInt,readIO,% readList,readLitChar,readLn,readParen,readOct,readSigned,reads,% readsPrec,realPart,realToFrac,recip,rem,repeat,replicate,return,% reverse,round,scaleFloat,scanl,scanl1,scanr,scanr1,seq,sequence,% sequence_,setStdGen,show,showChar,showEFloat,showFFloat,% showFloat,showGFloat,showInt,showList,showLitChar,showParen,% showSigned,showString,shows,showsPrec,significand,signum,sin,% sinh,snd,sort,sortBy,span,split,splitAt,sqrt,stderr,stdin,stdout,% strict,subtract,succ,sum,system,tail,tails,take,takeWhile,tan,% tanh,toEnum,toInt,toInteger,toLower,toRational,toUpper,transpose,% truncate,try,uncurry,undefined,unfoldr,union,unionBy,unless,% unlines,until,unwords,unzip,unzip3,unzip4,unzip5,unzip6,unzip7,% userError,when,words,writeFile,zero,zip,zip3,zip4,zip5,zip6,zip7,% zipWith,zipWithM,zipWithM_,zipWith3,zipWith4,zipWith5,zipWith6,% zipWith7},% sensitive,% morecomment=[l]--,% morecomment=[n]{\{-}{-\}},% morestring=[b]"% }[keywords,comments,strings]% %% %% IDL definition (c) 1998 Juergen Heim %% \lst@definelanguage{IDL}% {morekeywords={and,begin,case,common,do,else,end,endcase,endelse,% endfor,endif,endrep,endwhile,eq,for,function,ge,goto,gt,if,le,lt,% mod,ne,not,of,on_ioerror,or,pro,repeat,return,then,until,while,% xor,on_error,openw,openr,openu,print,printf,printu,plot,read,% readf,readu,writeu,stop},% sensitive=f,% morecomment=[l];,% morestring=[d]'% }[keywords,comments,strings]% %% %% Inform definition (c) 2003 Jonathan Sauer %% \lst@definelanguage{inform}{% % Language keywords morekeywords={breakdo,else,false,for,has,hasnt,if,% in,indirect,jump,notin,nothing,NULL,objectloop,ofclass,% private,property,provides,return,rfalse,rtrue,self,string,% switch,to,true,until,while,with,% creature,held,multiexcept,multiheld,multiinside,noun,number,% scope,topic},% % % Inform functions morekeywords=[2]{box,child,children,font,give,inversion,metaclass,move,% new_line,parent,print,print_ret,read,remove,restore,sibling,% save,spaces,quit,style,bold,underline,reverse,roman remaining,% create,destroy,recreate,copy},% % % Inform definitions morekeywords=[3]{Attribute,Array,Class,Constant,Default,End,Endif,Extend,% Global,Ifdef,Iffalse,Ifndef,Ifnot,Iftrue,Include,Object,% Property,Verb,Release,Serial,Statusline},% % % Library attributes morekeywords=[4]{absent,animate,clothing,concealed,container,door,edible,% enterable,female,general,light,lockable locked,male,moved,% neuter,on,open,openable,pluralname,proper,scenery,scored,% static,supporter,switchable,talkable,transparent,visited,% workflag,worn},% % % Libary properties morekeywords=[5]{n_to,s_to,e_to,w_to,ne_to,nw_to,se_to,sw_to,in_to,% out_to,u_to,d_to,add_to_scope,after,article,articles,before,% cant_go,capacity,daemon,describe,description,door_dir,door_to,% each_turn,found_in,grammar,initial,inside_description,invent,% life,list_together,name number,orders,parse_name,plural,% react_after,react_before,short_name,short_name_indef,time_left,% time_out,when_closed,when_open,when_on,when_off,% with_key}, % % Library routines morekeywords=[6]{Achieved,AfterRoutines,AllowPushDir,Banner,ChangePlayer,% CommonAncestor,DictionaryLookup,GetGNAOfObject,HasLightSource,% IndirectlyContains,IsSeeThrough,Locale,LoopOverScope,LTI_Insert,% MoveFloatingObjects,NextWord,NextWordStopped,NounDomain,% ObjectIsUntouchable OffersLight,ParseToken,PlaceInScope,PlayerTo,% PronounNotice,PronounValue,ScopeWithin,SetPronoun,SetTime,% StartDaemon,StartTimer,StopDaemon,StopTimer,TestScope,TryNumber,% UnsignedCompare,WordAddress,WordInProperty,WordLength,% WriteListFrom,YesOrNo},% % % Library,entry points morekeywords=[7]{AfterLife,AfterPrompt,Amusing,BeforeParsing,ChooseObjects,% DarkToDark,DeathMessage,GamePostRoutine GamePreRoutine,% Initialise,InScope,LookRoutine,NewRoom,ParseNoun,ParseNumber,% ParserError,PrintRank,PrintTaskName,PrintVerb,TimePasses,% UnknownVerb},% % % Library constants morekeywords=[8]{NEWLINE_BIT,INDENT_BIT,FULLINV_BIT,ENGLISH_BIT,RECURSE_BIT,% ALWAYS_BIT,TERSE_BIT,PARTINV_BIT,DEFART_BIT,WORKFLAG_BIT,% ISARE_BIT,CONCEAL_BIT},% % % Library,meta actions morekeywords=[9]{Pronouns,Quit,Restart,Restore,Save,Verify,ScriptOn,ScriptOff,% NotifyOn,NotifyOff,Places,Objects,Score,FullScore,Version,LMode1,% LMode2,Lmode3},% % % Library,main actions morekeywords=[10]{Close,Disrobe,Drop,Eat,Empty,EmptyT,Enter,Examine,Exit,GetOff,% Give,Go,GoIn,Insert,Inv,InvTall,InvWide,Lock,Look,Open,PutOn,Remove,% Search,Show,SwitchOff,SwitchOn,Take,Transfer,Unlock VagueGo,% Wear},% % % Library,stub actions morekeywords=[11]{Answer,Ask,AskFor,Attack,Blow,Burn,Buy,Climb,Consult,Cut,Dig,% Drink,Fill,Jump,JumpOver,Kiss,Listen,LookUnder,Mild,No,Pray,Pull,% Push,PushDir,Rub,Set,SetTo,Sing,Sleep,Smell,,Sleep,Smell,Sorry,% Squeeze,Strong,Swim,Swing,Taste,Tell,Think,ThrowAt,Tie,Touch,Turn,% Wait,Wake,WakeOther,Wave,WaveHands,Yes},% % otherkeywords={->,-->},% sensitive=false,% morestring=[d]{"},% morecomment=[l]{!}% }[keywords,comments,strings]% \lst@definelanguage{Lisp}% {morekeywords={abort,abs,acons,acos,acosh,adjoin,alphanumericp,alter,% append,apply,apropos,aref,arrayp,ash,asin,asinh,assoc,atan,atanh,% atom,bit,boole,boundp,break,butlast,byte,catenate,ceiling,cerror,% char,character,characterp,choose,chunk,cis,close,clrhash,coerce,% collect,commonp,compile,complement,complex,complexp,concatenate,% conjugate,cons,consp,constantp,continue,cos,cosh,cotruncate,% count,delete,denominator,describe,directory,disassemble,% documentation,dpb,dribble,ed,eighth,elt,enclose,endp,eq,eql,% equal,equalp,error,eval,evalhook,evenp,every,exp,expand,export,% expt,fboundp,fceiling,fdefinition,ffloor,fifth,fill,find,first,% float,floatp,floor,fmakunbound,format,fourth,fround,ftruncate,% funcall,functionp,gatherer,gcd,generator,gensym,gentemp,get,getf,% gethash,identity,imagpart,import,inspect,integerp,intern,% intersection,tively,isqrt,keywordp,last,latch,lcm,ldb,ldiff,% length,list,listen,listp,load,log,logand,logbitp,logcount,logeqv,% logior,lognand,lognor,lognot,logtest,logxor,macroexpand,% makunbound,map,mapc,mapcan,mapcar,mapcon,maphash,mapl,maplist,% mask,max,member,merge,min,mingle,minusp,mismatch,mod,namestring,% nbutlast,nconc,nintersection,ninth,not,notany,notevery,nreconc,% nreverse,nsublis,nsubst,nth,nthcdr,null,numberp,numerator,nunion,% oddp,open,packagep,pairlis,pathname,pathnamep,phase,plusp,% position,positions,pprint,previous,princ,print,proclaim,provide,% random,rassoc,rational,rationalize,rationalp,read,readtablep,% realp,realpart,reduce,rem,remhash,remove,remprop,replace,require,% rest,revappend,reverse,room,round,rplaca,rplacd,sbit,scan,schar,% search,second,series,set,seventh,shadow,signal,signum,sin,sinh,% sixth,sleep,some,sort,split,sqrt,streamp,string,stringp,sublis,% subseq,subseries,subsetp,subst,substitute,subtypep,svref,sxhash,% symbolp,tailp,tan,tanh,tenth,terpri,third,truename,truncate,% typep,unexport,unintern,union,until,values,vector,vectorp,warn,% write,zerop,and,assert,case,ccase,cond,ctypecase,decf,declaim,% defclass,defconstant,defgeneric,defmacro,defmethod,defpackage,% defparameter,defsetf,defstruct,deftype,defun,defvar,do,dolist,% dotimes,ecase,encapsulated,etypecase,flet,formatter,gathering,% incf,iterate,labels,let,locally,loop,macrolet,mapping,or,pop,% producing,prog,psetf,psetq,push,pushnew,remf,return,rotatef,% setf,shiftf,step,time,trace,typecase,unless,untrace,when},% sensitive,% ??? alsodigit=-,% morecomment=[l];,% morecomment=[s]{\#|}{|\#},% 1997 Aslak Raanes morestring=[b]"% }[keywords,comments,strings]% %% %% AutoLISP/VisualLISP - Stefan Lagotzki, info@lagotzki.de %% \lst@definelanguage[Auto]{Lisp}% {morekeywords={abs,acad_colordlg,acad_helpdlg,acad_strlsort,% action_tile,add_list,alert,alloc,and,angle,angtof,angtos,append,% apply,arx,arxload,arxunload,ascii,assoc,atan,atof,atoi,atom,% atoms-family,autoarxload,autoload,Boole,boundp,caddr,cadr,car,% cdr,chr,client_data_tile,close,command,cond,cons,cos,cvunit,% defun,defun-q,defun-q-list-ref,defun-q-list-set,dictadd,dictnext,% dictremove,dictrename,dictsearch,dimx_tile,dimy_tile,distance,% distof,done_dialog,end_image,end_list,entdel,entget,entlast,% entmake,entmakex,entmod,entnext,entsel,entupd,eq,equal,*error*,% eval,exit,exp,expand,expt,fill_image,findfile,fix,float,foreach,% function,gc,gcd,get_attr,get_tile,getangle,getcfg,getcname,% getcorner,getdist,getenv,getfiled,getint,getkword,getorient,% getpoint,getreal,getstring,getvar,graphscr,grclear,grdraw,grread,% grtext,grvecs,handent,help,if,initdia,initget,inters,itoa,lambda,% last,layoutlist,length,list,listp,load,load_dialog,log,logand,% logior,lsh,mapcar,max,mem,member,menucmd,menugroup,min,minusp,% mode_tile,namedobjdict,nentsel,nentselp,new_dialog,not,nth,% null,numberp,open,or,osnap,polar,prin1,princ,print,progn,prompt,% quit,quote,read,read-char,read-line,redraw,regapp,rem,repeat,% reverse,rtos,set,set_tile,setcfg,setenv,setfunhelp,setq,% setvar,setview,sin,slide_image,snvalid,sqrt,ssadd,ssdel,ssget,% ssgetfirst,sslength,ssmemb,ssname,ssnamex,sssetfirst,startapp,% start_dialog,start_image,start_list,strcase,strcat,strlen,subst,% substr,tablet,tblnext,tblobjname,tblsearch,term_dialog,terpri,% textbox,textpage,textscr,trace,trans,type,unload_dialog,untrace,% vector_image,ver,vl-acad-defun,vl-acad-undefun,vl-arx-import,% vl-bb-ref,vl-bb-set,vl-catch-all-apply,% vl-catch-all-error-message,vl-catch-all-error-p,vl-cmdf,vl-consp,% vl-directory-files,vl-doc-export,vl-doc-import,vl-doc-ref,% vl-doc-set,vl-every,vl-exit-with-error,vl-exit-with-value,% vl-file-copy,vl-file-delete,vl-file-directory-p,vl-file-rename,% vl-file-size,vl-file-systime,vl-filename-base,% vl-filename-directory,vl-filename-extension,vl-filename-mktemp,% vl-get-resource,vl-list*,vl-list->string,% vl-list-exported-functions,vl-list-length,vl-list-loaded-vlx,% vl-load-all,vl-load-com,vl-load-reactors,vl-member-if,% vl-member-if-not,vl-position,vl-prin1-to-string,% vl-princ-to-string,vl-propagate,vl-registry-delete,% vl-registry-descendents,vl-registry-read,vl-registry-write,% vl-remove,vl-remove-if,vl-remove-if-not,vl-some,vl-sort,% vl-sort-i,vl-string->list,vl-string-elt,vl-string-left-trim,% vl-string-mismatch,vl-string-position,vl-string-right-trim,% vl-string-search,vl-string-subst,vl-string-translate,% vl-string-trim,vl-symbol-name,vl-symbol-value,vl-symbolp,% vl-unload-vlx,vl-vbaload,vl-vbarun,vl-vlx-loaded-p,vlax-3D-point,% vlax-add-cmd,vlax-create-object,vlax-curve-getArea,% vlax-curve-getDistAtParam,vlax-curve-getDistAtPoint,% vlax-curve-getEndParam,vlax-curve-getEndPoint,% vlax-curve-getParamAtDist,vlax-curve-getParamAtPoint,% vlax-curve-getPointAtDist,vlax-curve-getPointAtParam,% vlax-curve-getStartParam,vlax-curve-getStartPoint,% vlax-curve-isClosed,vlax-curve-isPeriodic,vlax-curve-isPlanar,% vlax-curve-getClosestPointTo,% vlax-curve-getClosestPointToProjection,vlax-curve-getFirstDeriv,% vlax-curve-getSecondDeriv,vlax-dump-object,% vlax-ename->vla-object,vlax-erased-p,vlax-for,% vlax-get-acad-object,vlax-get-object,vlax-get-or-create-object,% vlax-get-property,vlax-import-type-library,vlax-invoke-method,% vlax-ldata-delete,vlax-ldata-get,vlax-ldata-list,vlax-ldata-put,% vlax-ldata-test,vlax-make-safearray,vlax-make-variant,% vlax-map-collection,vlax-method-applicable-p,% vlax-object-released-p,vlax-product-key,% vlax-property-available-p,vlax-put-property,vlax-read-enabled-p,% vlax-release-object,vlax-remove-cmd,vlax-safearray-fill,% vlax-safearray-get-dim,vlax-safearray-get-element,% vlax-safearray-get-l-bound,vlax-safearray-get-u-bound,% vlax-safearray-put-element,vlax-safearray-type,% vlax-safearray->list,vlax-tmatrix,vlax-typeinfo-available-p,% vlax-variant-change-type,vlax-variant-type,vlax-variant-value,% vlax-vla-object->ename,vlax-write-enabled-p,vlisp-compile,% vlr-acdb-reactor,vlr-add,vlr-added-p,vlr-beep-reaction,% vlr-command-reactor,vlr-current-reaction-name,vlr-data,% vlr-data-set,vlr-deepclone-reactor,vlr-docmanager-reactor,% vlr-dwg-reactor,vlr-dxf-reactor,vlr-editor-reactor,% vlr-insert-reactor,vlr-linker-reactor,vlr-lisp-reactor,% vlr-miscellaneous-reactor,vlr-mouse-reactor,vlr-notification,% vlr-object-reactor,vlr-owner-add,vlr-owner-remove,vlr-owners,% vlr-pers,vlr-pers-list,vlr-pers-p,vlr-pers-release,% vlr-reaction-names,vlr-reaction-set,vlr-reactions,vlr-reactors,% vlr-remove,vlr-remove-all,vlr-set-notification,% vlr-sysvar-reactor,vlr-toolbar-reactor,vlr-trace-reaction,% vlr-type,vlr-types,vlr-undo-reactor,vlr-wblock-reactor,% vlr-window-reactor,vlr-xref-reactor,vports,wcmatch,while,% write-char,write-line,xdroom,xdsize,zerop},% alsodigit=->,% otherkeywords={1+,1-},% sensitive=false,% morecomment=[l];,% morecomment=[l];;,% morestring=[b]"% }[keywords,comments,strings]% %% %% Make definitions (c) 2000 Rolf Niepraschk %% \lst@definelanguage[gnu]{make}% {morekeywords={SHELL,MAKE,MAKEFLAGS,$@,$\%,$<,$?,$^,$+,$*,% @,^,<,\%,+,?,*,% Markus Pahlow export,unexport,include,override,define,ifdef,ifneq,ifeq,else,% endif,vpath,subst,patsubst,strip,findstring,filter,filter-out,% sort,dir,notdir,suffix,basename,addsuffix,addprefix,join,word,% words,firstword,wildcard,shell,origin,foreach,% @D,@F,*D,*F,\%D,\%F,,-->,--->,:-,==,=>,<=,<=>},% morekeywords={module,include_module,import_module,interface,% end_module,implementation,mode,is,failure,semidet,nondet,det,% multi,erroneous,inst,in,out,di,uo,ui,type,typeclass,instance,% where,with_type,pred,func,lambda,impure,semipure,if,then,else,% some,all,not,true,fail,pragma,memo,no_inline,inline,loop_check,% minimal_model,fact_table,type_spec,terminates,does_not_terminate,% check_termination,promise_only_solution,unsafe_promise_unique,% source_file,obsolete,import,export,c_header_code,c_code,% foreign_code,foreign_proc,may_call_mercury,will_not_call_mercury,% thread_safe,not_thread_safe},% sensitive=t,% morecomment=[l]\%,% morecomment=[s]{/*}{*/},% morestring=[bd]",% morestring=[bd]'% }[keywords,comments,strings]% %% %% Miranda definition (c) 1998 Peter Bartke %% %% Miranda: pure lazy functional language with polymorphic type system, %% garbage collection and functions as first class citizens %% \lst@definelanguage{Miranda}% {morekeywords={abstype,div,if,mod,otherwise,readvals,show,type,where,% with,bool,char,num,sys_message,False,True,Appendfile,Closefile,% Exit,Stderr,Stdout,System,Tofile,\%include,\%export,\%free,% \%insert,abs,and,arctan,cjustify,code,concat,const,converse,cos,% decode,digit,drop,dropwhile,entier,error,exp,filemode,filter,% foldl,foldl1,foldr,foldr1,force,fst,getenv,hd,hugenum,id,index,% init,integer,iterate,last,lay,layn,letter,limit,lines,ljustify,% log,log10,map,map2,max,max2,member,merge,min,min2,mkset,neg,% numval,or,pi,postfix,product,read,rep,repeat,reverse,rjustify,% scan,seq,showfloat,shownum,showscaled,sin,snd,sort,spaces,sqrt,% subtract,sum,system,take,takewhile,tinynum,tl,transpose,undef,% until,zip2,zip3,zip4,zip5,zip6,zip},% sensitive,% morecomment=[l]||,% morestring=[b]"% }[keywords,comments,strings]% %% %% ML definition (c) 1999 Torben Hoffmann %% \lst@definelanguage{ML}% {morekeywords={abstype,and,andalso,as,case,do,datatype,else,end,% eqtype,exception,fn,fun,functor,handle,if,in,include,infix,% infixr,let,local,nonfix,of,op,open,orelse,raise,rec,sharing,sig,% signature,struct,structure,then,type,val,with,withtype,while},% sensitive,% morecomment=[n]{(*}{*)},% morestring=[d]"% }[keywords,comments,strings]% %% %% Oz definition (c) Andres Becerra Sandoval %% \lst@definelanguage{Oz}% {morekeywords={andthen,at,attr,case,catch,choice,class,% cond,declare,define,dis,div,else,elsecase,% elseif,end,export,fail,false,feat,finally,% from,fun,functor,if,import,in,local,% lock,meth,mod,not,of,or,orelse,% prepare,proc,prop,raise,require,self,skip,% then,thread,true,try,unit},% sensitive=true,% morecomment=[l]{\%},% morecomment=[s]{/*}{*/},% morestring=[b]",% morestring=[d]'% }[keywords,comments,strings]% %% %% PHP definition by Luca Balzerani %% \lst@definelanguage{PHP}% {morekeywords={% %--- core language ,::,break,case,continue,default,do,else,% elseif,for,foreach,if,include,require,phpinfo,% switch,while,false,FALSE,true,TRUE,% %--- apache functions apache_lookup_uri,apache_note,ascii2ebcdic,ebcdic2ascii,% virtual,apache_child_terminate,apache_setenv,% %--- array functions array,array_change_key_case,array_chunk,array_count_values,% array_filter,array_flip,array_fill,array_intersect,% array_keys,array_map,array_merge,array_merge_recursive,% array_pad,array_pop,array_push,array_rand,array_reverse,% array_shift,array_slice,array_splice,array_sum,array_unique,% array_values,array_walk,arsort,asort,compact,count,current,each,% extract,in_array,array_search,key,krsort,ksort,list,natsort,% next,pos,prev,range,reset,rsort,shuffle,sizeof,sort,uasort,% usort,% %--- aspell functions aspell_new,aspell_check,aspell_check_raw,aspell_suggest,% %--- bc functions bcadd,bccomp,bcdiv,bcmod,bcmul,bcpow,bcscale,bcsqrt,bcsub,% %--- bzip2 functions bzclose,bzcompress,bzdecompress,bzerrno,bzerror,bzerrstr,% bzopen,bzread,bzwrite,% %--- calendar functions JDToGregorian,GregorianToJD,JDToJulian,JulianToJD,JDToJewish,% JDToFrench,FrenchToJD,JDMonthName,JDDayOfWeek,easter_date,% unixtojd,jdtounix,cal_days_in_month,cal_to_jd,cal_from_jd,% %--- ccvs functions ccvs_init,ccvs_done,ccvs_new,ccvs_add,ccvs_delete,ccvs_auth,% ccvs_reverse,ccvs_sale,ccvs_void,ccvs_status,ccvs_count,% ccvs_report,ccvs_command,ccvs_textvalue,% %--- classobj functions call_user_method,call_user_method_array,class_exists,get_class,% get_class_vars,get_declared_classes,get_object_vars,% is_a,is_subclass_of,method_exists,% %--- com functions COM,VARIANT,com_load,com_invoke,com_propget,com_get,com_propput,% com_set,com_addref,com_release,com_isenum,com_load_typelib,% %--- cpdf functions cpdf_add_annotation,cpdf_add_outline,cpdf_arc,cpdf_begin_text,% cpdf_clip,cpdf_close,cpdf_closepath,cpdf_closepath_fill_stroke,% cpdf_continue_text,cpdf_curveto,cpdf_end_text,cpdf_fill,% cpdf_finalize,cpdf_finalize_page,% cpdf_import_jpeg,cpdf_lineto,cpdf_moveto,cpdf_newpath,cpdf_open,% cpdf_page_init,cpdf_place_inline_image,cpdf_rect,cpdf_restore,% cpdf_rmoveto,cpdf_rotate,cpdf_rotate_text,cpdf_save,% cpdf_scale,cpdf_set_char_spacing,cpdf_set_creator,% cpdf_set_font,cpdf_set_horiz_scaling,cpdf_set_keywords,% cpdf_set_page_animation,cpdf_set_subject,cpdf_set_text_matrix,% cpdf_set_text_rendering,cpdf_set_text_rise,cpdf_set_title,% cpdf_setdash,cpdf_setflat,cpdf_setgray,cpdf_setgray_fill,% cpdf_setlinecap,cpdf_setlinejoin,cpdf_setlinewidth,% cpdf_setrgbcolor,cpdf_setrgbcolor_fill,cpdf_setrgbcolor_stroke,% cpdf_show_xy,cpdf_stringwidth,cpdf_set_font_directories,% cpdf_set_viewer_preferences,cpdf_stroke,cpdf_text,% cpdf_set_action_url,% %--- crack functions crack_opendict,crack_closedict,crack_check,crack_getlastmessage,% %--- ctype functions ctype_alnum,ctype_alpha,ctype_cntrl,ctype_digit,ctype_lower,% ctype_print,ctype_punct,ctype_space,ctype_upper,ctype_xdigit,% %--- curl functions curl_init,curl_setopt,curl_exec,curl_close,curl_version,% curl_error,curl_getinfo,% %--- cybercash functions cybercash_encr,cybercash_decr,cybercash_base64_encode,% %--- cybermut functions cybermut_creerformulairecm,cybermut_testmac,% %--- cyrus functions cyrus_connect,cyrus_authenticate,cyrus_bind,cyrus_unbind,% cyrus_close,% %--- datetime functions checkdate,date,getdate,gettimeofday,gmdate,gmmktime,gmstrftime,% microtime,mktime,strftime,time,strtotime,% %--- dbase functions dbase_create,dbase_open,dbase_close,dbase_pack,dbase_add_record,% dbase_delete_record,dbase_get_record,% dbase_numfields,dbase_numrecords,% %--- dba functions dba_close,dba_delete,dba_exists,dba_fetch,dba_firstkey,% dba_nextkey,dba_popen,dba_open,dba_optimize,dba_replace,% %--- dbm functions dbmopen,dbmclose,dbmexists,dbmfetch,dbminsert,dbmreplace,% dbmfirstkey,dbmnextkey,dblist,% %--- dbx functions dbx_close,dbx_connect,dbx_error,dbx_query,dbx_sort,dbx_compare,% %--- dio functions dio_open,dio_read,dio_write,dio_truncate,dio_stat,dio_seek,% dio_close,% %--- dir functions chroot,chdir,dir,closedir,getcwd,opendir,readdir,rewinddir,% %--- dotnet functions dotnet_load,% %--- errorfunc functions error_log,error_reporting,restore_error_handler,% trigger_error,user_error,% %--- exec functions escapeshellarg,escapeshellcmd,exec,passthru,system,shell_exec,% %--- fbsql functions fbsql_affected_rows,fbsql_autocommit,fbsql_change_user,% fbsql_commit,fbsql_connect,fbsql_create_db,fbsql_create_blob,% fbsql_database_password,fbsql_data_seek,fbsql_db_query,% fbsql_drop_db,fbsql_errno,fbsql_error,fbsql_fetch_array,% fbsql_fetch_field,fbsql_fetch_lengths,fbsql_fetch_object,% fbsql_field_flags,fbsql_field_name,fbsql_field_len,% fbsql_field_table,fbsql_field_type,fbsql_free_result,% fbsql_list_dbs,fbsql_list_fields,fbsql_list_tables,% fbsql_num_fields,fbsql_num_rows,fbsql_pconnect,fbsql_query,% fbsql_read_clob,fbsql_result,fbsql_rollback,fbsql_set_lob_mode,% fbsql_start_db,fbsql_stop_db,fbsql_tablename,fbsql_warnings,% fbsql_get_autostart_info,fbsql_hostname,fbsql_password,% fbsql_username,% %--- fdf functions fdf_open,fdf_close,fdf_create,fdf_save,fdf_get_value,% fdf_next_field_name,fdf_set_ap,fdf_set_status,fdf_get_status,% fdf_get_file,fdf_set_flags,fdf_set_opt,% fdf_set_javascript_action,fdf_set_encoding,fdf_add_template,% %--- filepro functions filepro,filepro_fieldname,filepro_fieldtype,filepro_fieldwidth,% filepro_fieldcount,filepro_rowcount,% %--- filesystem functions basename,chgrp,chmod,chown,clearstatcache,copy,delete,dirname,% diskfreespace,disk_total_space,fclose,feof,fflush,fgetc,fgetcsv,% fgetss,file_get_contents,file,file_exists,fileatime,filectime,% fileinode,filemtime,fileowner,fileperms,filesize,filetype,flock,% fopen,fpassthru,fputs,fread,fscanf,fseek,fstat,ftell,ftruncate,% set_file_buffer,is_dir,is_executable,is_file,is_link,% is_writable,is_writeable,is_uploaded_file,link,linkinfo,mkdir,% parse_ini_file,pathinfo,pclose,popen,readfile,readlink,rename,% rmdir,stat,lstat,realpath,symlink,tempnam,tmpfile,touch,umask,% %--- fribidi functions fribidi_log2vis,% %--- ftp functions ftp_connect,ftp_login,ftp_pwd,ftp_cdup,ftp_chdir,ftp_mkdir,% ftp_nlist,ftp_rawlist,ftp_systype,ftp_pasv,ftp_get,ftp_fget,% ftp_fput,ftp_size,ftp_mdtm,ftp_rename,ftp_delete,ftp_site,% ftp_quit,ftp_exec,ftp_set_option,ftp_get_option,% %--- funchand functions call_user_func_array,call_user_func,create_function,% func_get_args,func_num_args,function_exists,% register_shutdown_function,register_tick_function,% %--- gettext functions bindtextdomain,bind_textdomain_codeset,dcgettext,dcngettext,% dngettext,gettext,ngettext,textdomain,% %--- gmp functions gmp_init,gmp_intval,gmp_strval,gmp_add,gmp_sub,gmp_mul,% gmp_div_r,gmp_div_qr,gmp_div,gmp_mod,gmp_divexact,gmp_cmp,% gmp_com,gmp_abs,gmp_sign,gmp_fact,gmp_sqrt,gmp_sqrtrm,% gmp_pow,gmp_powm,gmp_prob_prime,gmp_gcd,gmp_gcdext,gmp_invert,% gmp_jacobi,gmp_random,gmp_and,gmp_or,gmp_xor,gmp_setbit,% gmp_scan0,gmp_scan1,gmp_popcount,gmp_hamdist,% %--- http functions header,headers_sent,setcookie,% %--- hw functions hw_Array2Objrec,hw_Children,hw_ChildrenObj,hw_Close,hw_Connect,% hw_Deleteobject,hw_DocByAnchor,hw_DocByAnchorObj,% hw_Document_BodyTag,hw_Document_Content,hw_Document_SetContent,% hw_ErrorMsg,hw_EditText,hw_Error,hw_Free_Document,hw_GetParents,% hw_GetChildColl,hw_GetChildCollObj,hw_GetRemote,% hw_GetSrcByDestObj,hw_GetObject,hw_GetAndLock,hw_GetText,% hw_GetObjectByQueryObj,hw_GetObjectByQueryColl,% hw_GetChildDocColl,hw_GetChildDocCollObj,hw_GetAnchors,% hw_Mv,hw_Identify,hw_InCollections,hw_Info,hw_InsColl,hw_InsDoc,% hw_InsertObject,hw_mapid,hw_Modifyobject,hw_New_Document,% hw_Output_Document,hw_pConnect,hw_PipeDocument,hw_Root,% hw_Who,hw_getusername,hw_stat,hw_setlinkroot,hw_connection_info,% hw_insertanchors,hw_getrellink,hw_changeobject,% %--- ibase functions ibase_connect,ibase_pconnect,ibase_close,ibase_query,% ibase_fetch_row,ibase_fetch_object,ibase_field_info,% ibase_free_result,ibase_prepare,ibase_execute,ibase_trans,% ibase_rollback,ibase_timefmt,ibase_num_fields,ibase_blob_add,% ibase_blob_close,ibase_blob_create,ibase_blob_echo,% ibase_blob_import,ibase_blob_info,ibase_blob_open,% %--- icap functions icap_open,icap_close,icap_fetch_event,icap_list_events,% icap_delete_event,icap_snooze,icap_list_alarms,% icap_rename_calendar,icap_delete_calendar,icap_reopen,% %--- iconv functions iconv,iconv_get_encoding,iconv_set_encoding,ob_iconv_handler,% %--- ifx functions ifx_connect,ifx_pconnect,ifx_close,ifx_query,ifx_prepare,ifx_do,% ifx_errormsg,ifx_affected_rows,ifx_getsqlca,ifx_fetch_row,% ifx_fieldtypes,ifx_fieldproperties,ifx_num_fields,ifx_num_rows,% ifx_create_char,ifx_free_char,ifx_update_char,ifx_get_char,% ifx_copy_blob,ifx_free_blob,ifx_get_blob,ifx_update_blob,% ifx_textasvarchar,ifx_byteasvarchar,ifx_nullformat,% ifxus_free_slob,ifxus_close_slob,ifxus_open_slob,% ifxus_seek_slob,ifxus_read_slob,ifxus_write_slob,% %--- iisfunc functions iis_get_server_by_path,iis_get_server_by_comment,iis_add_server,% iis_set_dir_security,iis_get_dir_security,iis_set_server_rights,% iis_set_script_map,iis_get_script_map,iis_set_app_settings,% iis_stop_server,iis_stop_service,iis_start_service,% %--- image functions exif_imagetype,exif_read_data,exif_thumbnail,getimagesize,% imagealphablending,imagearc,imagefilledarc,imageellipse,% imagechar,imagecharup,imagecolorallocate,imagecolordeallocate,% imagecolorclosest,imagecolorclosestalpha,imagecolorclosestthwb,% imagecolorexactalpha,imagecolorresolve,imagecolorresolvealpha,% imagecolorset,imagecolorsforindex,imagecolorstotal,% imagecopy,imagecopymerge,imagecopymergegray,imagecopyresized,% imagecreate,imagecreatetruecolor,imagetruecolortopalette,% imagecreatefromgd2,imagecreatefromgd2part,imagecreatefromgif,% imagecreatefrompng,imagecreatefromwbmp,imagecreatefromstring,% imagecreatefromxpm,imagedashedline,imagedestroy,imagefill,% imagefilledrectangle,imagefilltoborder,imagefontheight,% imagegd,imagegd2,imagegif,imagepng,imagejpeg,imagewbmp,% imageline,imageloadfont,imagepalettecopy,imagepolygon,% imagepsencodefont,imagepsfreefont,imagepsloadfont,% imagepsslantfont,imagepstext,imagerectangle,imagesetpixel,% imagesetstyle,imagesettile,imagesetthickness,imagestring,% imagesx,imagesy,imagettfbbox,imageftbbox,imagettftext,% imagetypes,jpeg2wbmp,png2wbmp,iptcembed,read_exif_data,% %--- imap functions imap_8bit,imap_alerts,imap_append,imap_base64,imap_binary,% imap_bodystruct,imap_check,imap_clearflag_full,imap_close,% imap_delete,imap_deletemailbox,imap_errors,imap_expunge,% imap_fetchbody,imap_fetchheader,imap_fetchstructure,% imap_getmailboxes,imap_getsubscribed,imap_header,% imap_headers,imap_last_error,imap_listmailbox,% imap_mail,imap_mail_compose,imap_mail_copy,imap_mail_move,% imap_mime_header_decode,imap_msgno,imap_num_msg,imap_num_recent,% imap_ping,imap_popen,imap_qprint,imap_renamemailbox,imap_reopen,% imap_rfc822_parse_headers,imap_rfc822_write_address,% imap_search,imap_setacl,imap_set_quota,imap_setflag_full,% imap_status,imap_subscribe,imap_uid,imap_undelete,% imap_utf7_decode,imap_utf7_encode,imap_utf8,imap_thread,% %--- info functions assert,assert_options,extension_loaded,dl,getenv,get_cfg_var,% get_defined_constants,get_extension_funcs,getmygid,% get_loaded_extensions,get_magic_quotes_gpc,% getlastmod,getmyinode,getmypid,getmyuid,get_required_files,% ini_alter,ini_get,ini_get_all,ini_restore,ini_set,phpcredits,% phpversion,php_logo_guid,php_sapi_name,php_uname,putenv,% set_time_limit,version_compare,zend_logo_guid,zend_version,% %--- ircg functions ircg_pconnect,ircg_fetch_error_msg,ircg_set_current,ircg_join,% ircg_msg,ircg_notice,ircg_nick,ircg_topic,ircg_channel_mode,% ircg_whois,ircg_kick,ircg_ignore_add,ircg_ignore_del,% ircg_is_conn_alive,ircg_lookup_format_messages,% ircg_set_on_die,ircg_set_file,ircg_get_username,% ircg_nickname_unescape,% %--- java functions java_last_exception_clear,java_last_exception_get,% %--- ldap functions ldap_add,ldap_bind,ldap_close,ldap_compare,ldap_connect,% ldap_delete,ldap_dn2ufn,ldap_err2str,ldap_errno,ldap_error,% ldap_first_attribute,ldap_first_entry,ldap_free_result,% ldap_get_dn,ldap_get_entries,ldap_get_option,ldap_get_values,% ldap_list,ldap_modify,ldap_mod_add,ldap_mod_del,% ldap_next_attribute,ldap_next_entry,ldap_read,ldap_rename,% ldap_set_option,ldap_unbind,ldap_8859_to_t61,% ldap_next_reference,ldap_parse_reference,ldap_parse_result,% ldap_sort,ldap_start_tls,ldap_t61_to_8859,% %--- mail functions mail,ezmlm_hash,% %--- math functions abs,acos,acosh,asin,asinh,atan,atanh,atan2,base_convert,bindec,% cos,cosh,decbin,dechex,decoct,deg2rad,exp,expm1,floor,% hexdec,hypot,is_finite,is_infinite,is_nan,lcg_value,log,log10,% max,min,mt_rand,mt_srand,mt_getrandmax,number_format,octdec,pi,% rad2deg,rand,round,sin,sinh,sqrt,srand,tan,tanh,% %--- mbstring functions mb_language,mb_parse_str,mb_internal_encoding,mb_http_input,% mb_detect_order,mb_substitute_character,mb_output_handler,% mb_strlen,mb_strpos,mb_strrpos,mb_substr,mb_strcut,mb_strwidth,% mb_convert_encoding,mb_detect_encoding,mb_convert_kana,% mb_decode_mimeheader,mb_convert_variables,% mb_decode_numericentity,mb_send_mail,mb_get_info,% mb_ereg,mb_eregi,mb_ereg_replace,mb_eregi_replace,mb_split,% mb_ereg_search,mb_ereg_search_pos,mb_ereg_search_regs,% mb_ereg_search_getregs,mb_ereg_search_getpos,% %--- mcal functions mcal_open,mcal_popen,mcal_reopen,mcal_close,% mcal_rename_calendar,mcal_delete_calendar,mcal_fetch_event,% mcal_append_event,mcal_store_event,mcal_delete_event,% mcal_list_alarms,mcal_event_init,mcal_event_set_category,% mcal_event_set_description,mcal_event_set_start,% mcal_event_set_alarm,mcal_event_set_class,mcal_is_leap_year,% mcal_date_valid,mcal_time_valid,mcal_day_of_week,% mcal_date_compare,mcal_next_recurrence,% mcal_event_set_recur_daily,mcal_event_set_recur_weekly,% mcal_event_set_recur_monthly_wday,mcal_event_set_recur_yearly,% mcal_event_add_attribute,mcal_expunge,mcal_week_of_year,% %--- mcrypt functions mcrypt_get_cipher_name,mcrypt_get_block_size,% mcrypt_create_iv,mcrypt_cbc,mcrypt_cfb,mcrypt_ecb,mcrypt_ofb,% mcrypt_list_modes,mcrypt_get_iv_size,mcrypt_encrypt,% mcrypt_module_open,mcrypt_module_close,mcrypt_generic_deinit,% mcrypt_generic,mdecrypt_generic,mcrypt_generic_end,% mcrypt_enc_is_block_algorithm_mode,% mcrypt_enc_is_block_mode,mcrypt_enc_get_block_size,% mcrypt_enc_get_supported_key_sizes,mcrypt_enc_get_iv_size,% mcrypt_enc_get_modes_name,mcrypt_module_self_test,% mcrypt_module_is_block_algorithm,mcrypt_module_is_block_mode,% mcrypt_module_get_algo_key_size,% %--- mhash functions mhash_get_hash_name,mhash_get_block_size,mhash_count,mhash,% %--- misc functions connection_aborted,connection_status,connection_timeout,% define,defined,die,eval,exit,get_browser,highlight_file,% ignore_user_abort,iptcparse,leak,pack,show_source,sleep,uniqid,% usleep,% %--- mnogosearch functions udm_add_search_limit,udm_alloc_agent,udm_api_version,% udm_cat_list,udm_clear_search_limits,udm_errno,udm_error,% udm_free_agent,udm_free_ispell_data,udm_free_res,% udm_get_res_field,udm_get_res_param,udm_load_ispell_data,% udm_check_charset,udm_check_stored,udm_close_stored,udm_crc32,% %--- msession functions msession_connect,msession_disconnect,msession_count,% msession_destroy,msession_lock,msession_unlock,msession_set,% msession_uniq,msession_randstr,msession_find,msession_list,% msession_set_array,msession_listvar,msession_timeout,% msession_getdata,msession_setdata,msession_plugin,% %--- msql functions msql,msql_affected_rows,msql_close,msql_connect,msql_create_db,% msql_data_seek,msql_dbname,msql_drop_db,msql_dropdb,msql_error,% msql_fetch_field,msql_fetch_object,msql_fetch_row,% msql_field_seek,msql_fieldtable,msql_fieldtype,msql_fieldflags,% msql_free_result,msql_freeresult,msql_list_fields,% msql_list_dbs,msql_listdbs,msql_list_tables,msql_listtables,% msql_num_rows,msql_numfields,msql_numrows,msql_pconnect,% msql_regcase,msql_result,msql_select_db,msql_selectdb,% %--- mssql functions mssql_close,mssql_connect,mssql_data_seek,mssql_fetch_array,% mssql_fetch_object,mssql_fetch_row,mssql_field_length,% mssql_field_seek,mssql_field_type,mssql_free_result,% mssql_min_error_severity,mssql_min_message_severity,% mssql_num_fields,mssql_num_rows,mssql_pconnect,mssql_query,% mssql_select_db,mssql_bind,mssql_execute,mssql_fetch_assoc,% mssql_guid_string,mssql_init,mssql_rows_affected,% %--- muscat functions muscat_setup,muscat_setup_net,muscat_give,muscat_get,% %--- mysql functions mysql_affected_rows,mysql_change_user,mysql_character_set_name,% mysql_connect,mysql_create_db,mysql_data_seek,mysql_db_name,% mysql_drop_db,mysql_errno,mysql_error,mysql_escape_string,% mysql_fetch_assoc,mysql_fetch_field,mysql_fetch_lengths,% mysql_fetch_row,mysql_field_flags,mysql_field_name,% mysql_field_seek,mysql_field_table,mysql_field_type,% mysql_info,mysql_insert_id,mysql_list_dbs,mysql_list_fields,% mysql_list_tables,mysql_num_fields,mysql_num_rows,% mysql_ping,mysql_query,mysql_unbuffered_query,% mysql_result,mysql_select_db,mysql_tablename,mysql_thread_id,% mysql_get_host_info,mysql_get_proto_info,mysql_get_server_info,% %--- network functions checkdnsrr,closelog,debugger_off,debugger_on,% fsockopen,gethostbyaddr,gethostbyname,gethostbynamel,getmxrr,% getprotobynumber,getservbyname,getservbyport,ip2long,long2ip,% pfsockopen,socket_get_status,socket_set_blocking,% syslog,% %--- nis functions yp_get_default_domain,yp_order,yp_master,yp_match,yp_first,% yp_errno,yp_err_string,yp_all,yp_cat,% %--- oci8 functions OCIDefineByName,OCIBindByName,OCILogon,OCIPLogon,OCINLogon,% OCIExecute,OCICommit,OCIRollback,OCINewDescriptor,OCIRowCount,% OCIResult,OCIFetch,OCIFetchInto,OCIFetchStatement,% OCIColumnName,OCIColumnSize,OCIColumnType,OCIServerVersion,% OCINewCursor,OCIFreeStatement,OCIFreeCursor,OCIFreeDesc,% OCIError,OCIInternalDebug,OCICancel,OCISetPrefetch,% OCISaveLobFile,OCISaveLob,OCILoadLob,OCIColumnScale,% OCIColumnTypeRaw,OCINewCollection,OCIFreeCollection,% OCICollAppend,OCICollAssignElem,OCICollGetElem,OCICollMax,% OCICollTrim,% %--- oracle functions Ora_Bind,Ora_Close,Ora_ColumnName,Ora_ColumnSize,Ora_ColumnType,% Ora_CommitOff,Ora_CommitOn,Ora_Do,Ora_Error,Ora_ErrorCode,% Ora_Fetch,Ora_Fetch_Into,Ora_GetColumn,Ora_Logoff,Ora_Logon,% Ora_Numcols,Ora_Numrows,Ora_Open,Ora_Parse,Ora_Rollback,% %--- outcontrol functions flush,ob_start,ob_get_contents,ob_get_length,ob_get_level,% ob_flush,ob_clean,ob_end_flush,ob_end_clean,ob_implicit_flush,% %--- ovrimos functions ovrimos_connect,ovrimos_close,ovrimos_longreadlen,% ovrimos_execute,ovrimos_cursor,ovrimos_exec,ovrimos_fetch_into,% ovrimos_result,ovrimos_result_all,ovrimos_num_rows,% ovrimos_field_name,ovrimos_field_type,ovrimos_field_len,% ovrimos_free_result,ovrimos_commit,ovrimos_rollback,% %--- pcntl functions pcntl_fork,pcntl_signal,pcntl_waitpid,pcntl_wexitstatus,% pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,% pcntl_exec,% %--- pcre functions preg_match,preg_match_all,preg_replace,preg_replace_callback,% preg_quote,preg_grep,Pattern Modifiers,Pattern Syntax,% %--- pdf functions pdf_add_annotation,pdf_add_bookmark,pdf_add_launchlink,% pdf_add_note,pdf_add_outline,pdf_add_pdflink,pdf_add_thumbnail,% pdf_arc,pdf_arcn,pdf_attach_file,pdf_begin_page,% pdf_begin_template,pdf_circle,pdf_clip,pdf_close,pdf_closepath,% pdf_closepath_stroke,pdf_close_image,pdf_close_pdi,% pdf_concat,pdf_continue_text,pdf_curveto,pdf_delete,% pdf_endpath,pdf_end_pattern,pdf_end_template,pdf_fill,% pdf_findfont,pdf_get_buffer,pdf_get_font,pdf_get_fontname,% pdf_get_image_height,pdf_get_image_width,pdf_get_parameter,% pdf_get_pdi_value,pdf_get_majorversion,pdf_get_minorversion,% pdf_initgraphics,pdf_lineto,pdf_makespotcolor,pdf_moveto,% pdf_open,pdf_open_CCITT,pdf_open_file,pdf_open_gif,% pdf_open_image_file,pdf_open_jpeg,pdf_open_memory_image,% pdf_open_pdi_page,pdf_open_png,pdf_open_tiff,pdf_place_image,% pdf_rect,pdf_restore,pdf_rotate,pdf_save,pdf_scale,pdf_setcolor,% pdf_setflat,pdf_setfont,pdf_setgray,pdf_setgray_fill,% pdf_setlinecap,pdf_setlinejoin,pdf_setlinewidth,pdf_setmatrix,% pdf_setpolydash,pdf_setrgbcolor,pdf_setrgbcolor_fill,% pdf_set_border_color,pdf_set_border_dash,pdf_set_border_style,% pdf_set_duration,pdf_set_font,pdf_set_horiz_scaling,% pdf_set_info_author,pdf_set_info_creator,pdf_set_info_keywords,% pdf_set_info_title,pdf_set_leading,pdf_set_parameter,% pdf_set_text_rendering,pdf_set_text_rise,pdf_set_text_matrix,% pdf_set_word_spacing,pdf_show,pdf_show_boxed,pdf_show_xy,% pdf_stringwidth,pdf_stroke,pdf_translate,% %--- pfpro functions pfpro_init,pfpro_cleanup,pfpro_process,pfpro_process_raw,% %--- pgsql functions pg_close,pg_affected_rows,pg_connect,pg_dbname,pg_end_copy,% pg_query,pg_fetch_array,pg_fetch_object,pg_fetch_row,% pg_field_name,pg_field_num,pg_field_prtlen,pg_field_size,% pg_free_result,pg_last_oid,pg_host,pg_last_notice,pg_lo_close,% pg_lo_export,pg_lo_import,pg_lo_open,pg_lo_read,pg_lo_seek,% pg_lo_read_all,pg_lo_unlink,pg_lo_write,pg_num_fields,% pg_options,pg_pconnect,pg_port,pg_put_line,pg_fetch_result,% pg_client_encoding,pg_trace,pg_tty,pg_untrace,pg_get_result,% pg_send_query,pg_cancel_query,pg_connection_busy,% pg_connection_status,pg_copy_from,pg_copy_to,pg_escape_bytea,% pg_result_error,% %--- posix functions posix_kill,posix_getpid,posix_getppid,posix_getuid,% posix_getgid,posix_getegid,posix_setuid,posix_seteuid,% posix_setegid,posix_getgroups,posix_getlogin,posix_getpgrp,% posix_setpgid,posix_getpgid,posix_getsid,posix_uname,% posix_ctermid,posix_ttyname,posix_isatty,posix_getcwd,% posix_getgrnam,posix_getgrgid,posix_getpwnam,posix_getpwuid,% %--- printer functions printer_open,printer_abort,printer_close,printer_write,% printer_set_option,printer_get_option,printer_create_dc,% printer_start_doc,printer_end_doc,printer_start_page,% printer_create_pen,printer_delete_pen,printer_select_pen,% printer_delete_brush,printer_select_brush,printer_create_font,% printer_select_font,printer_logical_fontheight,% printer_draw_rectangle,printer_draw_elipse,printer_draw_text,% printer_draw_chord,printer_draw_pie,printer_draw_bmp,% %--- pspell functions pspell_add_to_personal,pspell_add_to_session,pspell_check,% pspell_config_create,pspell_config_ignore,pspell_config_mode,% pspell_config_repl,pspell_config_runtogether,% pspell_new,pspell_new_config,pspell_new_personal,% pspell_store_replacement,pspell_suggest,% %--- qtdom functions qdom_tree,qdom_error,% %--- readline functions readline,readline_add_history,readline_clear_history,% readline_info,readline_list_history,readline_read_history,% %--- recode functions recode_string,recode,recode_file,% %--- regex functions ereg,ereg_replace,eregi,eregi_replace,split,spliti,sql_regcase,% %--- sem functions sem_get,sem_acquire,sem_release,sem_remove,shm_attach,% shm_remove,shm_put_var,shm_get_var,shm_remove_var,ftok,% %--- sesam functions sesam_connect,sesam_disconnect,sesam_settransaction,% sesam_rollback,sesam_execimm,sesam_query,sesam_num_fields,% sesam_diagnostic,sesam_fetch_result,sesam_affected_rows,% sesam_field_array,sesam_fetch_row,sesam_fetch_array,% sesam_free_result,% %--- session functions session_start,session_destroy,session_name,session_module_name,% session_id,session_register,session_unregister,session_unset,% session_get_cookie_params,session_set_cookie_params,% session_encode,session_set_save_handler,session_cache_limiter,% session_write_close,% %--- shmop functions shmop_open,shmop_read,shmop_write,shmop_size,shmop_delete,% %--- snmp functions snmpget,snmpset,snmpwalk,snmpwalkoid,snmp_get_quick_print,% snmprealwalk,% %--- strings functions addcslashes,addslashes,bin2hex,chop,chr,chunk_split,% count_chars,crc32,crypt,echo,explode,get_html_translation_table,% hebrev,hebrevc,htmlentities,htmlspecialchars,implode,join,% localeconv,ltrim,md5,md5_file,metaphone,nl_langinfo,nl2br,ord,% print,printf,quoted_printable_decode,quotemeta,str_rot13,rtrim,% setlocale,similar_text,soundex,sprintf,strncasecmp,strcasecmp,% strcmp,strcoll,strcspn,strip_tags,stripcslashes,stripslashes,% strlen,strnatcmp,strnatcasecmp,strncmp,str_pad,strpos,strrchr,% strrev,strrpos,strspn,strstr,strtok,strtolower,strtoupper,% strtr,substr,substr_count,substr_replace,trim,ucfirst,ucwords,% vsprintf,wordwrap,% %--- swf functions swf_openfile,swf_closefile,swf_labelframe,swf_showframe,% swf_getframe,swf_mulcolor,swf_addcolor,swf_placeobject,% swf_removeobject,swf_nextid,swf_startdoaction,% swf_actiongeturl,swf_actionnextframe,swf_actionprevframe,% swf_actionstop,swf_actiontogglequality,swf_actionwaitforframe,% swf_actiongotolabel,swf_enddoaction,swf_defineline,% swf_definepoly,swf_startshape,swf_shapelinesolid,% swf_shapefillsolid,swf_shapefillbitmapclip,% swf_shapemoveto,swf_shapelineto,swf_shapecurveto,% swf_shapearc,swf_endshape,swf_definefont,swf_setfont,% swf_fontslant,swf_fonttracking,swf_getfontinfo,swf_definetext,% swf_definebitmap,swf_getbitmapinfo,swf_startsymbol,% swf_startbutton,swf_addbuttonrecord,swf_oncondition,% swf_viewport,swf_ortho,swf_ortho2,swf_perspective,swf_polarview,% swf_pushmatrix,swf_popmatrix,swf_scale,swf_translate,swf_rotate,% %--- sybase functions sybase_affected_rows,sybase_close,sybase_connect,% sybase_fetch_array,sybase_fetch_field,sybase_fetch_object,% sybase_field_seek,sybase_free_result,sybase_get_last_message,% sybase_min_error_severity,sybase_min_message_severity,% sybase_num_fields,sybase_num_rows,sybase_pconnect,sybase_query,% sybase_select_db,% %--- uodbc functions odbc_autocommit,odbc_binmode,odbc_close,odbc_close_all,% odbc_connect,odbc_cursor,odbc_do,odbc_error,odbc_errormsg,% odbc_execute,odbc_fetch_into,odbc_fetch_row,odbc_fetch_array,% odbc_fetch_object,odbc_field_name,odbc_field_num,% odbc_field_len,odbc_field_precision,odbc_field_scale,% odbc_longreadlen,odbc_num_fields,odbc_pconnect,odbc_prepare,% odbc_result,odbc_result_all,odbc_rollback,odbc_setoption,% odbc_tableprivileges,odbc_columns,odbc_columnprivileges,% odbc_primarykeys,odbc_foreignkeys,odbc_procedures,% odbc_specialcolumns,odbc_statistics,% %--- url functions base64_decode,base64_encode,parse_url,rawurldecode,rawurlencode,% urlencode,% %--- var functions doubleval,empty,floatval,gettype,get_defined_vars,% import_request_variables,intval,is_array,is_bool,is_double,% is_int,is_integer,is_long,is_null,is_numeric,is_object,is_real,% is_scalar,is_string,isset,print_r,serialize,settype,strval,% unset,var_dump,var_export,is_callable,% %--- vpopmail functions vpopmail_add_domain,vpopmail_del_domain,% vpopmail_add_domain_ex,vpopmail_del_domain_ex,% vpopmail_add_user,vpopmail_del_user,vpopmail_passwd,% vpopmail_auth_user,vpopmail_alias_add,vpopmail_alias_del,% vpopmail_alias_get,vpopmail_alias_get_all,vpopmail_error,% %--- w32api functions w32api_set_call_method,w32api_register_function,% w32api_deftype,w32api_init_dtype,% %--- wddx functions wddx_serialize_value,wddx_serialize_vars,wddx_packet_start,% wddx_add_vars,wddx_deserialize,% %--- xml functions xml_parser_create,xml_set_object,xml_set_element_handler,% xml_set_processing_instruction_handler,xml_set_default_handler,% xml_set_notation_decl_handler,% xml_parse,xml_get_error_code,xml_error_string,% xml_get_current_column_number,xml_get_current_byte_index,% xml_parser_free,xml_parser_set_option,xml_parser_get_option,% utf8_encode,xml_parser_create_ns,% xml_set_start_namespace_decl_handler,% %--- xslt functions xslt_set_log,xslt_create,xslt_errno,xslt_error,xslt_free,% xslt_set_sax_handler,xslt_set_scheme_handler,% xslt_set_base,xslt_set_encoding,xslt_set_sax_handlers,% %--- yaz functions yaz_addinfo,yaz_close,yaz_connect,yaz_errno,yaz_error,yaz_hits,% yaz_database,yaz_range,yaz_record,yaz_search,yaz_present,% yaz_scan,yaz_scan_result,yaz_ccl_conf,yaz_ccl_parse,% yaz_wait,yaz_sort,% %--- zip functions zip_close,zip_entry_close,zip_entry_compressedsize,% zip_entry_filesize,zip_entry_name,zip_entry_open,zip_entry_read,% zip_read,% %--- zlib functions gzclose,gzeof,gzfile,gzgetc,gzgets,gzgetss,gzopen,gzpassthru,% gzread,gzrewind,gzseek,gztell,gzwrite,readgzfile,gzcompress,% gzdeflate,gzinflate,gzencode,},% sensitive,% morecomment=[l]\#,% morecomment=[l]//,% morecomment=[s]{/*}{*/},% morestring=[b]",% morestring=[b]'% }[keywords,comments,strings]% %% %% Prolog definition (c) 1997 Dominique de Waleffe %% \lst@definelanguage{Prolog}% {morekeywords={op,mod,abort,ancestors,arg,ascii,ask,assert,asserta,% assertz,atom,atomic,char,clause,close,concat,consult,ed,ef,em,% eof,fail,file,findall,write,functor,getc,integer,is,length,% listing,load,name,nl,nonvar,not,numbervars,op,or,pp,prin,print,% private,prompt,putc,ratom,read,read_from_this_file,rename,repeat,% retract,retractall,save,see,seeing,seen,sh,skip,statistics,% subgoal_of,system,tab,tell,telling,time,told,trace,true,unload,% untrace,var,write},% sensitive=f,% morecomment=[l]\%,% morecomment=[s]{/*}{*/},% morestring=[bd]",% morestring=[bd]'% }[keywords,comments,strings]% %% %% classic rexx listings definition %% by Patrick TJ McPhee %% \lst@definelanguage{Rexx} {morekeywords={address,arg,call,do,drop,else,end,exit,if,iterate,% interpret,leave,nop,numeric,options,otherwise,parse,% procedure,pull,push,queue,return,say,signal,then,to,% trace,when},% sensitive=false,% morecomment=[n]{/*}{*/},% morestring=[d]{'},% morestring=[d]{"},% }[keywords,comments,strings]% \lst@definelanguage{Ruby}% {morekeywords={__FILE__,__LINE__,BEGIN,END,alias,and,begin,break,% case,class,def,defined?,do,else,elsif,end,ensure,false,for,% if,in,module,next,nil,not,or,redo,rescue,retry,return,self,% super,then,true,undef,unless,until,when,while,yield},% sensitive=true,% morecomment=[l]\#,% morecomment=[l]\#\#,% morecomment=[s]{=BEGIN}{=END},% morestring=[b]',% morestring=[b]",% morestring=[s]{\%q/}{/},% morestring=[s]{\%q!}{!},% morestring=[s]{\%q\{}{\}},% morestring=[s]{\%q(}{)},% morestring=[s]{\%q[}{]},% morestring=[s]{\%q-}{-},% morestring=[s]{\%Q/}{/},% morestring=[s]{\%Q!}{!},% morestring=[s]{\%Q\{}{\}},% morestring=[s]{\%Q(}{)},% morestring=[s]{\%Q[}{]},% morestring=[s]{\%Q-}{-}% }[keywords,comments,strings]% %% %% SHELXL definition (c) 1999 Aidan Philip Heerdegen %% \lst@definelanguage{SHELXL}% {morekeywords={TITL,CELL,ZERR,LATT,SYMM,SFAC,DISP,UNIT,LAUE,% REM,MORE,TIME,END,HKLF,OMIT,SHEL,BASF,TWIN,EXTI,SWAT,% MERG,SPEC,RESI,MOVE,ANIS,AFIX,HFIX,FRAG,FEND,EXYZ,EADP,% EQIV,OMIT,CONN,PART,BIND,FREE,DFIX,BUMP,SAME,SADI,CHIV,% FLAT,DELU,SIMU,DEFS,ISOR,SUMP,L.S.,CGLS,SLIM,BLOC,DAMP,% WGHT,FVAR,BOND,CONF,MPLA,RTAB,LIST,ACTA,SIZE,TEMP,WPDB,% FMAP,GRID,PLAN,MOLE},% sensitive=false,% alsoother=_,% Makes the syntax highlighting ignore the underscores morecomment=[l]{! },% }% %% %% Tcl/Tk definition (c) Gerd Neugebauer %% \lst@definelanguage[tk]{tcl}[]{tcl}% {morekeywords={activate,add,separator,radiobutton,checkbutton,% command,cascade,all,bell,bind,bindtags,button,canvas,canvasx,% canvasy,cascade,cget,checkbutton,config,configu,configur,% configure,clipboard,create,arc,bitmap,image,line,oval,polygon,% rectangle,text,textwindow,curselection,delete,destroy,end,entry,% entrycget,event,focus,font,actual,families,measure,metrics,names,% frame,get,grab,current,release,status,grid,columnconfigure,% rowconfigure,image,image,create,bitmap,photo,delete,height,types,% widt,names,index,insert,invoke,itemconfigure,label,listbox,lower,% menu,menubutton,message,move,option,add,clear,get,readfile,pack,% photo,place,radiobutton,raise,scale,scroll,scrollbar,search,see,% selection,send,stdin,stdout,stderr,tag,bind,text,tk,tkerror,% tkwait,window,variable,visibility,toplevel,unknown,update,winfo,% class,exists,ismapped,parent,reqwidth,reqheight,rootx,rooty,% width,height,wm,aspect,client,command,deiconify,focusmodel,frame,% geometry,group,iconbitmap,iconify,iconmask,iconname,iconposition,% iconwindow,maxsize,minsize,overrideredirect,positionfrom,% protocol,sizefrom,state,title,transient,withdraw,xview,yview,% yposition,% -accelerator,-activebackground,-activeborderwidth,% -activeforeground,-after,-anchor,-arrow,-arrowshape,-aspect,% -async,-background,-before,-bg,-bigincrement,-bitmap,-bordermode,% -borderwidth,-button,-capstyle,-channel,-class,-closeenough,% -colormap,-column,-columnspan,-command,-confine,-container,% -count,-cursor,-data,-default,-detail,-digits,-direction,% -displayof,-disableforeground,-elementborderwidth,-expand,% -exportselection,-extend,-family,-fg,-file,-fill,-focus,-font,% -fontmap,-foreground,-format,-from,-gamma,-global,-height,% -highlightbackground,-highlightcolor,-highlightthickness,-icon,% -image,-in,-insertbackground,-insertborderwidth,-insertofftime,% -insertontime,-imsertwidth,-ipadx,-ipady,-joinstyle,-jump,% -justify,-keycode,-keysym,-label,-lastfor,-length,-maskdata,% -maskfile,-menu,-message,-mode,-offvalue,-onvalue,-orient,% -outlien,-outlinestipple,-overstrike,-override,-padx,-pady,% -pageanchor,-pageheight,-pagewidth,-pagey,-pagey,-palette,% -parent,-place,-postcommand,-relheight,-relief,-relwidth,-relx,% -rely,-repeatdelay,-repeatinterval,-resolution,-root,-rootx,% -rooty,-rotate,-row,-rowspan,-screen,-selectcolor,-selectimage,% -sendevent,-serial,-setgrid,-showvalue,-shrink,-side,-size,% -slant,-sliderlength,-sliderrelief,-smooth,-splinesteps,-state,% -sticky,-stipple,-style,-subsample,-subwindow,-tags,-takefocus,% -tearoff,-tearoffcommand,-text,-textvariable,-tickinterval,-time,% -title,-to,-troughcolor,-type,-underline,-use,-value,-variable,% -visual,-width,-wrap,-wraplength,-x,-xscrollcommand,-y,% -bgstipple,-fgstipple,-lmargin1,-lmargin2,-rmargin,-spacing1,% -spacing2,-spacing3,-tabs,-yscrollcommand,-zoom,% activate,add,addtag,bbox,cget,clone,configure,coords,% curselection,debug,delete,delta,deselect,dlineinfo,dtag,dump,% entrycget,entryconfigure,find,flash,fraction,get,gettags,handle,% icursor,identify,index,insert,invoke,itemcget,itemconfigure,mark,% moveto,own,post,postcascade,postscript,put,redither,ranges,% scale,select,show,tag,type,unpost,xscrollcommand,xview,% yscrollcommand,yview,yposition}% }% \lst@definelanguage[]{tcl}% {alsoletter={.:,*=&-},% morekeywords={after,append,array,names,exists,anymore,donesearch,% get,nextelement,set,size,startsearch,auto_mkindex,binary,break,% case,catch,cd,clock,close,concat,console,continue,default,else,% elseif,eof,error,eval,exec,-keepnewline,exit,expr,fblocked,% fconfigure,fcopy,file,atime,dirname,executable,exists,extension,% isdirectory,isfile,join,lstat,mtime,owned,readable,readlink,% rootname,size,stat,tail,type,writable,-permissions,-group,-owner,% -archive,-hidden,-readonly,-system,-creator,-type,-force,% fileevent,flush,for,foreach,format,gets,glob,global,history,if,% incr,info,argsbody,cmdcount,commands,complete,default,exists,% globals,level,library,locals,patchlevel,procs,script,tclversion,% vars,interp,join,lappend,lindex,linsert,list,llength,lrange,% lreplace,lsearch,-exact,-regexp,-glob,lsort,-ascii,-integer,% -real,-dictionary,-increasing,-decreasing,-index,-command,load,% namespace,open,package,forget,ifneeded,provide,require,unknown,% vcompare,versions,vsatisfies,pid,proc,puts,-nonewline,pwd,read,% regexp,-indices,regsub,-all,-nocaserename,return,scan,seek,set,% socket,source,split,string,compare,first,index,last,length,match,% range,tolower,toupper,trim,trimleft,trimright,subst,switch,tell,% time,trace,variable,vdelete,vinfo,unknown,unset,uplevel,upvar,% vwait,while,acos,asin,atan,atan2,ceil,cos,cosh,exp,floor,fmod,% hypot,log,log10,pow,sin,sinh,sqrt,tan,tanh,abs,double,int,round% },% morestring=[d]",% morecomment=[f]\#,% morecomment=[l]{;\#},% morecomment=[l]{[\#},% morecomment=[l]{\{\#}% }[keywords,comments,strings]% %% %% VBScript definition (c) 2000 Sonja Weidmann %% \lst@definelanguage{VBScript}% {morekeywords={Call,Case,Const,Dim,Do,Each,Else,End,Erase,Error,Exit,% Explicit,For,Function,If,Loop,Next,On,Option,Private,Public,% Randomize,ReDim,Rem,Select,Set,Sub,Then,Wend,While,Abs,Array,Asc,% Atn,CBool,CByte,CCur,CDate,CDbl,Chr,CInt,CLng,Cos,CreateObject,% CSng,CStr,Date,DateAdd,DateDiff,DatePart,DateSerial,DateValue,% Day,Exp,Filter,Fix,FormatCurrency,FormatDateTime,FormatNumber,% FormatPercent,GetObject,Hex,Hour,InputBox,InStr,InStrRev,Int,% IsArray,IsDate,IsEmpty,IsNull,IsNumeric,IsObject,Join,LBound,% LCase,Left,Len,LoadPicture,Log,LTrim,Mid,Minute,Month,MonthName,% MsgBox,Now,Oct,Replace,RGB,Right,Rnd,Round,RTrim,ScriptEngine,% ScriptEngineBuildVersion,ScriptEngineMajorVersion,% ScriptEngineMinorVersion,Second,Sgn,Sin,Space,Split,Sqr,StrComp,% StrReverse,String,Tan,Time,TimeSerial,TimeValue,Trim,TypeName,% UBound,UCase,VarType,Weekday,WeekdayName,Year, And,Eqv,Imp,Is,% Mod,Not,Or,Xor,Add,BuildPath,Clear,Close,Copy,CopyFile,% CopyFolder,CreateFolder,CreateTextFile,Delete,DeleteFile,% DeleteFolder,Dictionary,Drive,DriveExists,Drives,Err,Exists,File,% FileExists,FileSystemObject,Files,Folder,FolderExists,Folders,% GetAbsolutePathName,GetBaseName,GetDrive,GetDriveName,% GetExtensionName,GetFile,GetFileName,GetFolder,% GetParentFolderName,GetSpecialFolder,GetTempName,Items,Keys,Move,% MoveFile,MoveFolder,OpenAsTextStream,OpenTextFile,Raise,Read,% ReadAll,ReadLine,Remove,RemoveAll,Skip,SkipLine,TextStream,Write,% WriteBlankLines,WriteLine,Alias,Archive,CDROM,Compressed,% Directory,Fixed,ForAppending,ForReading,ForWriting,Hidden,Normal,% RAMDisk,ReadOnly,Remote,Removable,System,SystemFolder,% TemporaryFolder,TristateFalse,TristateTrue,TristateUseDefault,% Unknown,Volume,WindowsFolder,vbAbortRetryIgnore,% vbApplicationModal,vbArray,vbBinaryCompare,vbBlack,vbBlue,% vbBoolean,vbByte,vbCr,vbCrLf,vbCritical,vbCurrency,vbCyan,% vbDataObject,vbDate,vbDecimal,vbDefaultButton1,vbDefaultButton2,% vbDefaultButton3,vbDefaultButton4,vbDouble,vbEmpty,vbError,% vbExclamation,vbFirstFourDays,vbFirstFullWeek,vbFirstJan1,% vbFormFeed,vbFriday,vbGeneralDate,vbGreen,vbInformation,% vbInteger,vbLf,vbLong,vbLongDate,vbLongTime,vbMagenta,vbMonday,% vbNewLine,vbNull,vbNullChar,vbNullString,vbOKC,ancel,vbOKOnly,% vbObject,vbObjectError,vbQuestion,vbRed,vbRetryCancel,vbSaturday,% vbShortDate,vbShortTime,vbSingle,vbString,vbSunday,vbSystemModal,% vbTab,vbTextCompare,vbThursday,vbTuesday,vbUseSystem,% vbUseSystemDayOfWeek,vbVariant,vbVerticalTab,vbWednesday,vbWhite,% vbYellow,vbYesNo,vbYesNoCancel},% sensitive=f,% morecomment=[l]',% morestring=[d]"% }[keywords,comments,strings]% %% %% VRML definition (c) 2001 Oliver Baum %% \lst@definelanguage[97]{VRML} {morekeywords={DEF,EXTERNPROTO,FALSE,IS,NULL,PROTO,ROUTE,TO,TRUE,USE,% eventIn,eventOut,exposedField,field,Introduction,Anchor,% Appearance,AudioClip,Background,Billboard,Box,Collision,Color,% ColorInterpolator,Cone,Coordinate,CoordinateInterpolator,% Cylinder,CylinderSensor,DirectionalLight,ElevationGrid,Extrusion,% Fog,FontStyle,Group,ImageTexture,IndexedFaceSet,IndexedLineSet,% Inline,LOD,Material,MovieTexture,NavigationInfo,Normal,% NormalInterpolator,OrientationInterpolator,PixelTexture,% PlaneSensor,PointLight,PointSet,PositionInterpolator,% ProximitySensor,ScalarInterpolator,Script,Shape,Sound,Sphere,% SphereSensor,SpotLight,Switch,Text,TextureCoordinate,% TextureTransform,TimeSensor,TouchSensor,Transform,Viewpoint,% VisibilitySensor,WorldInfo},% morecomment=[l]\#,% bug: starts comment in the first column morestring=[b]"% }[keywords,comments,strings] \endinput %% %% End of file `lstlang2.sty'. hevea-2.30/esp.ml0000644004317100512160000001616612403276303013707 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Printf open Mysys exception Failed module type Config = sig val pess : bool val move : bool val small_length : int end module Make(C:Config) = struct let input_protect f name = try let chan = open_in name in try let r = f chan in begin try close_in chan with _ -> () end ; r with e -> begin try close_in chan with _ -> () end ; raise e with | Sys_error _msg as e -> raise e let output_protect f name = try let chan = open_out name in try let r = f chan in begin try close_out chan with _ -> () end ; r with e -> begin try close_out chan with _ -> () end ; raise e with | Sys_error _msg as e -> raise e let lex_this vdef f name = try input_protect (fun input -> let lexbuf = Lexing.from_channel input in Location.set name lexbuf ; Emisc.reset () ; let r = f lexbuf in Location.restore () ; r) name with | Emisc.LexError s -> if !Emisc.verbose > 0 then output_char stderr '\n' ; Location.print_fullpos () ; Printf.fprintf stderr "Lexer error: %s\n" s ; Location.restore () ; vdef | Sys_error _ as e -> raise e | e -> Location.restore () ; raise e let lex_this_out vdef f name_in name_out = try input_protect (fun input -> let lexbuf = Lexing.from_channel input in Location.set name_in lexbuf ; Emisc.reset () ; output_protect (fun out -> let r = f out lexbuf in Location.restore () ; r) name_out) name_in with | Emisc.LexError s -> if !Emisc.verbose > 0 then output_char stderr '\n' ; Location.print_fullpos () ; Printf.fprintf stderr "Lexer error: %s\n" s ; Location.restore () ; vdef | Sys_error _ as e -> raise e | e -> Location.restore () ; raise e module Parse = Htmlparse.Make(C) let process cls in_name input output = let rec do_rec lexbuf = match Parse.main cls lexbuf with | [] -> () | ts -> if C.pess then Pp.trees output (Explode.trees ts) else Ultra.main output ts ; do_rec lexbuf in try let lexbuf = Lexing.from_channel input in Location.set in_name lexbuf ; Emisc.reset () ; do_rec lexbuf ; Location.restore () ; true with | Emisc.LexError s -> if !Emisc.verbose > 0 then output_char stderr '\n' ; Location.print_fullpos () ; Printf.fprintf stderr "Lexer error: %s\n" s ; Location.restore () ; false | Htmlparse.Error s -> if !Emisc.verbose > 0 then output_char stderr '\n' ; Location.print_fullpos () ; Printf.fprintf stderr "Parser error: %s\n" s ; Parse.ptop () ; Parse.reset () ; Location.restore () ; false | e -> Location.restore () ; raise e let classes in_name input = try let lexbuf = Lexing.from_channel input in Location.set in_name lexbuf ; Emisc.reset () ; let cls = Parse.classes lexbuf in Location.restore () ; Some cls with | Emisc.LexError s -> if !Emisc.verbose > 0 then output_char stderr '\n' ; Location.print_fullpos () ; Printf.fprintf stderr "Lexer error: %s\n" s ; Location.restore () ; None | e -> Location.restore () ; raise e let chop_extension name = try Filename.chop_extension name with Invalid_argument _ -> name let do_mk_out name ext = Filename.concat (Filename.dirname name) (chop_extension (Filename.basename name) ^ ext) let mk_out in_name = do_mk_out in_name ".tmp" and mk_esp in_name = do_mk_out in_name ".esp" let read_size name = input_protect in_channel_length name (* Move output file to final destination if optimiser yields some gain *) let check_output ok in_name out_name = let final_name = if ok then begin let size_in = read_size in_name and size_out = read_size out_name in let final_name = if size_in > size_out then begin let dst = if C.move then in_name else mk_esp in_name in rename out_name dst ; dst end else begin remove out_name ; in_name end in if !Emisc.verbose > 0 then begin eprintf "Optimized %s: %d -> %d, %.2f%%\n" final_name size_in size_out ((float (size_in-size_out) *. 100.0) /. float size_in) end ; final_name end else begin remove out_name ; in_name end in final_name let phase1 in_name = let out_name = mk_out in_name in begin try let input = open_in in_name in let cls = if C.pess then None else try classes in_name input with e -> close_in input ; raise e in close_in input ; let input = open_in in_name in let out = try open_out out_name with Sys_error _ as e -> close_in input ; raise e in let ok = try process cls in_name input out with e -> close_in input ; close_out out ; raise e in close_in input ; close_out out ; check_output ok in_name out_name with | Sys_error msg -> Printf.fprintf stderr "File error: %s\n" msg ; in_name | e -> remove out_name ; raise e end let phase2 name = try let open Emisc in let sts = lex_this StringCount.empty Lexstyle.get name in let m,_ = StringCount.fold (fun st nocc (m,n as p) -> let withclass = 8 + String.length st + nocc * 4 and noclass = nocc * String.length st in if withclass < noclass then let cl = sprintf "c%03i" n in StringMap.add st cl m,n+1 else p) sts (StringMap.empty,0) in if !Emisc.verbose > 1 then begin eprintf "New classes:\n" ; StringMap.iter (fun st cl -> Emisc.dump_class stderr cl st) m ; () end ; let out_name = mk_out name in let ok = lex_this_out false (fun out lexbuf -> Lexstyle.set m out lexbuf) name out_name in check_output ok name out_name with | Sys_error msg -> Printf.fprintf stderr "File error: %s\n" msg ; name let file name = if !Emisc.verbose > 0 then begin Printf.fprintf stderr "Optimizing file: %s...\n%!" name end ; let name = phase1 name in if not C.pess then ignore (phase2 name) end hevea-2.30/verb.mli0000644004317100512160000000170207303451221014212 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: verb.mli,v 1.9 2001-05-25 12:37:32 maranget Exp $ *) (***********************************************************************) exception VError of string module type S = sig end module Make (Dest : OutManager.S) (Image : ImageManager.S) (Scan : Latexscan.S) : S hevea-2.30/thread.mli0000644004317100512160000000173010367352272014536 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) val setup : string -> string -> unit val setprev : string -> string -> unit val setnext : string -> string -> unit val setprevnext : string -> string -> unit val next : string -> string val prev : string -> string val up : string -> string hevea-2.30/hacha.ml0000644004317100512160000000772512017660721014167 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Printf exception Error of string ;; let filename = ref None let outname = ref "index.html" let log = ref false let toc_style = ref Cut.Normal let cross_links = ref true let verbose = ref 0 let small_length = ref 1024 let main () = let spec = [("-o", Arg.String (fun s -> outname := s), "filename, make hacha output go into file 'filename' (defaults to index.html)"); ("-tocbis", Arg.Unit (fun () -> toc_style := Cut.Both), ", Duplicate table of contents at the begining of files"); ("-tocter", Arg.Unit (fun () -> toc_style := Cut.Special), ", Insert most of table of contents at the beginning of files"); ("-nolinks", Arg.Unit (fun () -> cross_links := false), ", Suppress the prevous/up/next links in generated pages"); ("-hrf", Arg.Unit (fun () -> log := true), ", output a log file showing the association from local anchors to files"); ("-rsz", Arg.Int (fun i -> small_length := i), (sprintf "size of leaves in rope implementation (default %i)" !small_length)); ("-version", Arg.Unit (fun () -> print_endline ("hacha "^Version.version) ; print_endline ("library directory: "^Mylib.static_libdir) ; exit 0), "show hacha version and library directory") ; ("-v", Arg.Unit (fun () -> incr verbose), ", verbose flag") ] and usage = "Usage: hacha [options] htmlfile" in Arg.parse spec (fun s -> filename := Some s) usage ; let filename = match !filename with | None -> raise (Error "No argument given") | Some f -> f in let chan = try open_in filename with Sys_error s -> raise (Error ("File error: "^s)) in let module Config = struct let verbose = !verbose let name_in = filename let name_out = !outname let toc_style = !toc_style let cross_links = !cross_links let small_length = !small_length end in let module C = Cut.Make(Config) in let buf = Lexing.from_channel chan in Location.set filename buf ; C.start_phase () ; ignore (C.do_lex buf) ; close_in chan ; Location.restore () ; let chan = try open_in filename with Sys_error s -> raise (Error ("File error: "^s)) in let buf = Lexing.from_channel chan in Location.set filename buf ; C.start_phase () ; let some_links = C.do_lex buf in close_in chan ; if !log then Cross.dump (C.real_name (C.base^".hrf")) C.check_changed ; if some_links then begin Mysys.copy_from_lib_to_dir Mylib.libdir C.dir "previous_motif.gif" ; Mysys.copy_from_lib_to_dir Mylib.libdir C.dir "next_motif.gif" ; Mysys.copy_from_lib_to_dir Mylib.libdir C.dir "contents_motif.gif" end ;; let _ = try main () ; with | Error s -> prerr_endline s ; prerr_endline "Adios" ; exit 2 | Cut.Error s -> Location.print_pos () ; prerr_endline ("Error while reading HTML: "^s) ; prerr_endline "Adios" ; exit 2 | Misc.Fatal s -> Location.print_pos () ; prerr_endline ("Fatal error: "^s^" (please report to Luc.Maranget@inria.fr)") ; prerr_endline "Adios" ; exit 2 (* | x -> Location.print_pos () ; prerr_endline ("Fatal error: spurious exception "^Printexc.to_string x^ " (please report to Luc.Maranget@inria.fr") ; prerr_endline "Adios" ; exit 2 *) ;; exit 0;; hevea-2.30/pub0000644004317100512160000000011606776427531013304 0ustar marangetcristalcomp.lang.ml comp.text.tex fr.comp.text.tex inria.general caml-list@inria.fr hevea-2.30/pub.fra0000644004317100512160000000222410516142271014033 0ustar marangetcristalJ'ai la joie d'anoncer la nouvelle release d'HEVEA. HEVEA, version 1.09 un traducteur rapide de LaTeX vers HTML. HEVEA traduit un sous-ensemble quasi complet de LaTeX2e vers HTML 4.0 transitionel. Plus d'information en QUOI DE NEUF ? Par rapport à la version précédente, il y a, entre autres - De nouveaux packages ifpdf, chngcntr, inputenc (encodage latins 8bits) eurosym (hevea passe à l'euro avec un petit retard), textcomp, longtable, supertabular. - Plus de liberté (au fait hevea est du logiciel libre) Un truc bizarre a disparu. On peut maintenant mettre \title{...} après \bgin{document} si on a envie. - Plus de propreté Le HTML généré est je crois, plus propre, emploi massif des feuilles de styles, paragraphes rendus par l'élément P. ATTENTION Pour compiler hevea 1.09, il faut ocaml (au moins) 3.07. Une version Windows compilée est disponible, merci Ph. Viton. Les packagers Linux ne tarderont pas à adopter la nouvelle version. hevea-2.30/explode.ml0000644004317100512160000000335512017660721014556 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: explode.ml,v 1.7 2012-06-05 14:55:39 maranget Exp $ *) (***********************************************************************) open Htmltext open Tree let of_styles env r = match env with | [] -> r | _ -> Node (env,[r]) let rec tree env t k = match t with | Text s -> of_styles env (Text s)::k | Blanks s -> of_styles (List.filter (fun s -> not (Htmltext.blanksNeutral s)) env) (Blanks s):: k | Node (s,ts) -> begin try let new_env = Htmltext.add_style s env in List.fold_right (tree new_env) ts k with | Split (s,env) -> let ts = List.fold_right (tree []) ts [] in let now = if Util.is_blanks ts then (List.filter (fun s -> not (Htmltext.blanksNeutral s)) env) else env in match ts with | [] -> k | _ -> of_styles now (Node ([s],ts))::k end | ONode (so,sc,ts) -> of_styles env (ONode (so,sc, List.fold_right (tree []) ts []))::k let trees ts = List.fold_right (tree []) ts [] hevea-2.30/cross.mli0000644004317100512160000000226410367352272014423 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* To store an association anchor -> filename *) val add : string -> string -> unit (* To retrieve associations, the filename retrieved can be changed at the very last moment by the change function given as argument *) (* fullname change file name: format reference from file 'file' to 'name' *) val fullname : (string -> string) -> string -> string -> string (* Dump the whole cross-reference table *) val dump : string -> (string -> string) -> unit hevea-2.30/cross.ml0000644004317100512160000000431512323450432014240 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) let verbose = ref 0 ;; let table = Hashtbl.create 37 ;; let add name file = if !verbose > 0 then prerr_endline ("Register "^name^" in "^file) ; try let _ = Hashtbl.find table name in Location.print_pos () ; prerr_endline ("Warning, multiple definitions for anchor: "^name) ; with | Not_found -> Hashtbl.add table name file ;; let decode_fragment frag = let buff = Buffer.create 32 in Url.decode_fragment (Buffer.add_char buff) (Buffer.add_string buff) frag ; Buffer.contents buff let fullname change myfilename name = if !verbose > 1 then Printf.eprintf "FULL: filename=%s, name=%s ->" myfilename name ; let r = try let filename = Hashtbl.find table (decode_fragment name) in let newname = if myfilename = filename then "#"^name else change filename^"#"^name in if !verbose > 1 then prerr_endline ("From "^name^" to "^newname) ; newname with Not_found -> begin Location.print_pos () ; prerr_endline ("Warning, cannot find anchor: "^name) ; raise Not_found end in if !verbose > 1 then Printf.eprintf " %s\n" r ; r ;; let dump outname change = try let chan = open_out outname in try Hashtbl.iter (fun k x -> Printf.fprintf chan "%s\t%s\n" k (change x)) table ; close_out chan with | e -> close_out chan ; raise e with | Sys_error msg -> prerr_endline ("Error while dumping "^outname^": "^msg) hevea-2.30/program.hva0000644004317100512160000000002507156457563014742 0ustar marangetcristal\@primitives{program}hevea-2.30/util.mli0000644004317100512160000000277507304505330014246 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: util.mli,v 1.5 2001-05-28 17:28:56 maranget Exp $ *) (***********************************************************************) val cost : ('a -> int * int) -> 'a Tree.t -> int * int val costs : ('a -> int * int) -> 'a Tree.t list -> int * int val cost_compare : int * int -> int * int -> int val there : Htmltext.t_style -> Htmltext.style -> bool val inter : Htmltext.style -> Htmltext.style -> Htmltext.style val union : Htmltext.style -> Htmltext.style -> Htmltext.style val sub : Htmltext.style -> Htmltext.style -> Htmltext.style val neutral : Htmltext.style -> Htmltext.style * Htmltext.style val is_blank : 'a Tree.t -> bool val is_blanks : 'a Tree.t list -> bool val nodes : Htmltext.style -> Htmltext.style Tree.t list -> Htmltext.style Tree.t list val node : Htmltext.style -> Htmltext.style Tree.t list -> Htmltext.style Tree.t hevea-2.30/outManager.mli0000644004317100512160000000765512017700472015376 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Lexstate module type S = sig exception Error of string val set_out : Out.t -> unit val stop : unit -> unit val restart : unit -> unit val is_empty : unit -> bool val get_fontsize : unit -> int val nostyle : unit -> unit val clearstyle : unit -> unit val open_mod : Element.text -> unit val erase_mods : Element.text list -> unit val has_mod : Element.text -> bool val forget_par : unit -> int option val close_par : unit -> bool val open_par : unit -> unit val par : int option -> unit val open_block : string -> string -> unit val close_block : string -> unit val force_block : string -> string -> unit val close_flow : string -> unit val insert_block : string -> string -> unit val insert_attr : string -> string -> unit val open_maths : bool -> unit val close_maths : bool -> unit val open_display_varg : string -> unit val open_display : unit -> unit val close_display : unit -> unit val item_display : unit -> unit val force_item_display : unit -> unit val erase_display : unit -> unit val standard_sup_sub : (string arg -> unit) -> (unit -> unit) -> string arg -> string arg -> bool -> unit val limit_sup_sub : (string arg -> unit) -> (unit -> unit) -> string arg -> string arg -> bool -> unit val int_sup_sub : bool -> int -> (string arg -> unit) -> (unit -> unit) -> string arg -> string arg -> bool -> unit val addvsize : int -> unit val over : Lexing.lexbuf -> unit val left : string -> (int -> unit) -> (int -> unit) -> unit val right : string -> (int -> unit) -> int val set_dcount : string -> unit val item : string-> unit val nitem : string-> unit val ditem : (string -> unit) -> string -> string -> string -> unit val erase_block : string -> unit val open_group : string -> unit val open_aftergroup : (string -> string) -> unit val close_group : unit -> unit val put : string -> unit val put_char : char -> unit val put_unicode : OutUnicode.unichar -> unit val flush_out : unit -> unit val skip_line : unit -> unit val loc_name : string -> unit val open_chan : out_channel -> unit val close_chan : unit -> unit val to_string : (unit -> unit) -> string val to_style : (unit -> unit) -> Element.text list val get_current_output : unit -> string val finalize : bool -> unit val horizontal_line : string -> Length.t -> Length.t -> unit val put_separator : unit -> unit val unskip : unit -> unit val put_tag : string -> unit val put_nbsp : unit -> unit val put_open_group : unit -> unit val put_close_group : unit -> unit val put_in_math : string -> unit val open_table : bool -> string -> unit val new_row : unit -> unit val open_cell : Tabular.format -> int -> int -> bool -> unit val erase_cell : unit -> unit val close_cell : string -> unit val do_close_cell : unit -> unit val open_cell_group : unit -> unit val close_cell_group : unit -> unit val erase_cell_group : unit -> unit val close_row : unit -> unit val erase_row : unit -> unit val close_table : unit -> unit val make_border : string -> unit val make_inside : string -> bool -> unit val make_hline : int -> bool -> unit val infomenu : string -> unit val infonode : string -> string -> string -> unit val infoextranode : string -> string -> string -> unit val image : string -> string -> unit type saved val check : unit -> saved val hot : saved -> unit end hevea-2.30/check402.ml0000644004317100512160000000016612403604660014415 0ustar marangetcristallet () = if compare Sys.ocaml_version "4.02.0" >= 0 then Printf.printf "ok\n" else Printf.printf "no\n" hevea-2.30/babel.hva0000644004317100512160000001623312454712706014336 0ustar marangetcristal\ProvidesPackage{babel} %%%% %%%% A simple command that takes language (say l) and %%%% a) checks for existence and includes l.hva %%%% b) calls the command \l@babel (in l.hva) %%%% c) sets current language to l % \newcommand{\InitiateOption}[1]{% \@ifundefined{bbl@#1@loaded} {\let\csname bbl@#1@loaded\endcsname\relax% \@iffileexists{#1.hva} {\input{#1.hva}\def\bbl@main@language{#1}} {\hva@warn{Hevea babel '#1' not found, loading 'english' instead}% \input{english.hva}\def\bbl@main@language{english}}} {}} % %%%% Processing information for each optional argument % \DeclareOption{english}{\InitiateOption{english}}% \DeclareOption{USenglish}{\InitiateOption{english}}% \DeclareOption{french}{\InitiateOption{french}}% \DeclareOption{frenchb}{\InitiateOption{french}}% \DeclareOption{francais}{\InitiateOption{french}}% \DeclareOption{german}{\InitiateOption{german}}% \DeclareOption{greek}{\InitiateOption{greek}}% \DeclareOption{ngerman}{\InitiateOption{german}}% \DeclareOption{austrian}{\InitiateOption{austrian}}% \DeclareOption{czech}{\InitiateOption{czech}}% \DeclareOption{american}{\InitiateOption{english}} \DeclareOption{croatian}{\InitiateOption{croatian}}% \DeclareOption{catalan}{\InitiateOption{catalan}}% \DeclareOption{brazil}{\InitiateOption{brazil}}% \DeclareOption{danish}{\InitiateOption{danish}}% \DeclareOption{dutch}{\InitiateOption{dutch}}% \DeclareOption{esperanto}{\InitiateOption{esperanto}}% \DeclareOption{finnish}{\InitiateOption{finnish}}% \DeclareOption{galician}{\InitiateOption{galician}}% \DeclareOption{italian}{\InitiateOption{italian}}% \DeclareOption{magyar}{\InitiateOption{magyar}}% \DeclareOption{norsk}{\InitiateOption{norsk}}% \DeclareOption{nynorsk}{\InitiateOption{nynorsk}}% \DeclareOption{polish}{\InitiateOption{polish}}% \DeclareOption{portuguese}{\InitiateOption{portuguese}}% \DeclareOption{romanian}{\InitiateOption{romanian}}% \DeclareOption{russian}{\InitiateOption{russian}}% \DeclareOption{slovak}{\InitiateOption{slovak}}% \DeclareOption{slovene}{\InitiateOption{slovene}}% \DeclareOption{spanish}{\InitiateOption{spanish}}% \DeclareOption{swedish}{\InitiateOption{swedish}}% \DeclareOption{turkish}{\InitiateOption{turkish}}% % %%%% Processing babel options postponed for later % %\ProcessOptions* % %%%% One variable for each supported language, to keep track of and to %%%% change the current language. Might as well have used english itself %%%% instead of \english@language!!! % \newcommand\english@language{english}% \newcommand\french@language{french}% \newcommand\german@language{german}% \newcommand\ngerman@language{ngerman}% \newcommand\greek@language{greek}% \newcommand\american@language{american}% \newcommand\austrian@language{austrian}% \newcommand\brazil@language{brazil}% \newcommand\catalan@language{catalan}% \newcommand\croatian@language{croatian}% \newcommand\czech@language{czech}% \newcommand\danish@language{danish}% \newcommand\dutch@language{dutch}% \newcommand\esperanto@language{esperanto}% \newcommand\finnish@language{finnish}% \newcommand\galician@language{galician}% \newcommand\italian@language{italian}% \newcommand\magyar@language{magyar}% \newcommand\norsk@language{norsk}% \newcommand\nynorsk@language{nynorsk}% \newcommand\polish@language{polish}% \newcommand\portuguese@language{portuguese}% \newcommand\romanian@language{romanian}% \newcommand\russian@language{russian}% \newcommand\slovak@language{slovak}% \newcommand\slovene@language{slovene}% \newcommand\spanish@language{spanish}% \newcommand\swedish@language{swedish}% \newcommand\turkish@language{turkish}% % %%%% Initializing \current@language before loading babel language packages. % \let\current@language\english@language % %%%% Support for the 'babel' command to select languages. % %Save definition of double quote (altered by german) \let\@hevea@saved@dquote\@hevea@dquote \newcommand{\selectlanguage}[1]{% \let\@hevea@dquote\@hevea@saved@dquote%Restore inocuous definition \ifthenelse{\equal{#1}{german}} {% \let\current@language\german@language \german@babel } {% \ifthenelse{\equal{#1}{greek}} {% \let\current@language\greek@language \greek@babel } {% \ifthenelse{\equal{#1}{ngerman}} {% \let\current@language\ngerman@language \german@babel } {% \ifthenelse{\equal{#1}{english}} {% \let\current@language\english@language \english@babel } {% \ifthenelse{\equal{#1}{french}} {% \let\current@language\french@language \french@babel } {% \ifthenelse{\equal{#1}{american}} {% \let\current@language\american@language \american@babel } {% \ifthenelse{\equal{#1}{austrian}} {% \let\current@language\austrian@language \austrian@babel } {% \ifthenelse{\equal{#1}{brazil}} {% \let\current@language\brazil@language \brazil@babel } {% \ifthenelse{\equal{#1}{catalan}} {% \let\current@language\catalan@language \catalan@babel } {% \ifthenelse{\equal{#1}{croatian}} {% \let\current@language\croatian@language \croatian@babel } {% \ifthenelse{\equal{#1}{czech}} {% \let\current@language\czech@language \czech@babel } {% \ifthenelse{\equal{#1}{danish}} {% \let\current@language\danish@language \danish@babel } {% \ifthenelse{\equal{#1}{dutch}} {% \let\current@language\dutch@language \dutch@babel } {% \ifthenelse{\equal{#1}{esperanto}} {% \let\current@language\esperanto@language \esperanto@babel } {% \ifthenelse{\equal{#1}{finnish}} {% \let\current@language\finnish@language \finnish@babel } {% \ifthenelse{\equal{#1}{galician}} {% \let\current@language\galician@language \galician@babel } {% \ifthenelse{\equal{#1}{italian}} {% \let\current@language\italian@language \italian@babel } {% \ifthenelse{\equal{#1}{magyar}} {% \let\current@language\magyar@language \magyar@babel } {% \ifthenelse{\equal{#1}{norsk}} {% \let\current@language\norsk@language \norsk@babel } {% \ifthenelse{\equal{#1}{nynorsk}} {% \let\current@language\nynorsk@language \nynorsk@babel } {% \ifthenelse{\equal{#1}{polish}} {% \let\current@languagepolish\@language \polish@babel } {% \ifthenelse{\equal{#1}{portuguese}} {% \let\current@language\portuguese@language \portuguese@babel } {% \ifthenelse{\equal{#1}{romanian}} {% \let\current@language\romanian@language \romanian@babel } {% \ifthenelse{\equal{#1}{russian}} {% \let\current@language\russian@language \russian@babel } {% \ifthenelse{\equal{#1}{slovak}} {% \let\current@language\slovak@language \slovak@babel } {% \ifthenelse{\equal{#1}{slovene}} {% \let\current@language\slovene@language \slovene@babel } {% \ifthenelse{\equal{#1}{spanish}} {% \let\current@language\spanish@language \spanish@babel } {% \ifthenelse{\equal{#1}{swedish}} {% \let\current@language\swedish@language \swedish@babel } {% \ifthenelse{\equal{#1}{turkish}} {% \let\current@language\turkish@language \turkish@babel } {% }}}}}}}}}}}}}}}}}}}}}}}}}}}}}% }% % %%%% Support for the 'babel' command for querying the current language. % \newcommand{\iflanguage}[3]{% \ifthenelse{\equal{#1}{\current@language}}{#2}{#3}% }% % %%%% Processing the optional arguments of the '\usepackage{babel}' command %%%% For each option (language l), checks for l.hva and 'includes' it. % \ProcessOptions*% \selectlanguage{\bbl@main@language} hevea-2.30/thread.ml0000644004317100512160000000242612017660721014363 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) let uptable = Hashtbl.create 17 and nexttable = Hashtbl.create 17 and prevtable = Hashtbl.create 17 ;; let setup file upname = Hashtbl.add uptable file upname and setprev file prevname = Hashtbl.add prevtable file prevname let setnext file nextname = Hashtbl.add nexttable file nextname ;; let setprevnext prev now = if prev <> "" then begin Hashtbl.add nexttable prev now ; Hashtbl.add prevtable now prev end ;; let next name = Hashtbl.find nexttable name and up name = Hashtbl.find uptable name and prev name = Hashtbl.find prevtable name ;; hevea-2.30/lstlang3.hva0000644004317100512160000000002512640460115014777 0ustar marangetcristal\input{lstlang3.sty} hevea-2.30/ifpdf.hva0000644004317100512160000000010510500032547014334 0ustar marangetcristal\newif\ifpdf\pdftrue \AtBeginDocument{\ifpdf\@addimagenopt{-pdf}\fi} hevea-2.30/infoRef.mll0000644004317100512160000002560012640242117014654 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) { open Lexing open Misc let compat_mem tbl key = try let _ = Hashtbl.find tbl key in true with Not_found -> false ;; exception Error of string type node_t = { mutable name : string; mutable comment : string; mutable previous : node_t option; mutable next : node_t option; mutable up : node_t option; mutable pos : int; } ;; type menu_t = { mutable num : int; mutable nom : string; mutable nod : node_t option; mutable nodes : node_t list; } ;; let menu_list = ref [];; let nodes = Hashtbl.create 17;; let delayed = ref [];; let current_node = ref None;; let menu_num = ref 0 ;; let counter = ref 0 and pos_file = ref 0 ;; let abs_pos () = !counter + !pos_file ;; let cur_file = ref (Parse_opts.name_out) ;; let file_number = ref 1 ;; type label_t = { mutable lab_name : string; mutable noeud : node_t option; };; let labels_list = ref [];; let files = ref [];; let top_node = ref false;; let hot_start () = menu_list := []; Hashtbl.clear nodes ; current_node := None ; menu_num := 0 ; counter := 0 ; pos_file := 0 ; cur_file := Parse_opts.name_out ; files := [] ; top_node := false ; file_number := 1 ; labels_list := [] ;; let infomenu arg = menu_num:=!menu_num+1; menu_list := { num = !menu_num; nom = arg; nod = !current_node; nodes = []; } ::!menu_list; Text.open_block "INFOLINE" ""; Text.put ("\\@menu"^string_of_int !menu_num^"\n"); Text.close_block "INFOLINE" ;; let rec cherche_menu m = function | [] -> raise (Error ("Menu ``"^m^"'' not found")) | menu::r -> if menu.nom = m then menu else cherche_menu m r ;; let rec cherche_menu_par_num n = function | [] -> raise (Error ("Menu not found")) | menu::r -> if menu.num = n then menu else cherche_menu_par_num n r ;; let ajoute_node_dans_menu n m = try let menu = cherche_menu m !menu_list in menu.nodes <- n :: menu.nodes; menu.nod with _ -> None ;; let verifie name = Misc.string_map (fun c -> match c with | '\t' | ',' | '\n' -> ' ' | '.' -> '-' | _ -> c) name ;; (* References *) let rec cherche_label s = function | [] -> raise Not_found | l::r -> if l.lab_name=s then l.noeud else cherche_label s r ;; let rec change_label s = function | [] -> Misc.warning ("Cannot change label: ``"^s^"''") | l::r -> if l.lab_name = s then l.noeud <- !current_node else change_label s r let loc_name s1 = (* pose un label *) let _ = try let _ = cherche_label s1 !labels_list in Misc.warning ("Multiple use of label: "^s1) with Not_found -> () in let l = { lab_name = s1; noeud = !current_node ; } in labels_list := l:: !labels_list; Text.open_block "INFO" "" ; Text.put "\\@name{" ; Text.put s1 ; Text.put "}" ; Text.close_block "INFO" ; if !verbose > 1 then prerr_endline ("InfoRef.loc_name, label="^s1); ;; (* Sortie du fichier final *) let out_cur = ref (Out.create_null ()) ;; let set_out chan = if !verbose >3 then prerr_endline "Set_out"; out_cur := chan ;; let set_out_file s = if !verbose >3 then prerr_endline ("Set_out_file :"^s); cur_file := s ;; let put s = if !verbose >3 then prerr_endline ("put :"^s); counter:=!counter + String.length s; Out.put !out_cur s ;; let put_char c = if !verbose >3 then prerr_endline ("put_char :"^String.make 1 c); counter:=!counter +1; Out.put_char !out_cur c ;; let put_credits () = put "\n\n-------------------------------------\nThis file has been translated from LaTeX by HeVeA.\n\n"; and put_header () = put "This file has been translated from LaTeX by HeVeA.\n" ;; let next_file () = Out.close !out_cur ; file_number := !file_number +1; cur_file := Parse_opts.name_out ^ "-" ^ string_of_int !file_number ; if !verbose > 0 then prerr_endline ("Change file to "^ !cur_file) ; set_out (Out.create_chan (open_out !cur_file)) ; files := (!cur_file,abs_pos ()) :: !files ; pos_file := abs_pos () ; put_header () ; counter := 0 ;; let noeud_name n = n.name ;; let affiche_menu num = let menu = cherche_menu_par_num num !menu_list in if menu.nodes <> [] then begin put "* Menu:\n\n"; let rec affiche_items = function | [] -> () | n::reste -> put ("* "^noeud_name n^"::\t"^n.comment^"\n"); affiche_items reste; in affiche_items (List.rev menu.nodes); if !verbose >1 then prerr_endline ("Menu :"^menu.nom); end ;; let put_node n = put ("Node: "^noeud_name n^""^string_of_int n.pos^"\n") ;; let do_affiche_tag_table s = put ("\n\nTag Table:\n"^(if s<> "" then s^"\n" else "")) ; Hashtbl.iter (fun _ n -> match n.name with | "Top" -> put_node n | _ -> ()) nodes ; Hashtbl.iter (fun _ n -> match n.name with | "Top" -> ()| _ -> put_node n) nodes; put "\nEnd Tag Table\n"; ;; let affiche_tag_table ()= match !files with | [_] -> do_affiche_tag_table "" | _ -> let rec do_indirect = function | [] -> () | (f,p)::reste -> put (f^": "^string_of_int p^"\n"); do_indirect reste in Out.close !out_cur ; set_out (Out.create_chan (open_out Parse_opts.name_out)) ; put_header () ; put "\nIndirect:\n"; do_indirect (List.rev !files); do_affiche_tag_table "(Indirect)" ;; let affiche_node nom = if !top_node then begin put_credits () ; top_node := false end ; let noeud = try Hashtbl.find nodes nom with Not_found -> raise (Error ("Node not found :"^nom)) in if not Parse_opts.filter && !counter > 50000 then begin next_file () end; noeud.pos <- abs_pos (); put "\n"; put ("File: "^Parse_opts.base_out^", Node: "^noeud_name noeud); (match noeud.next with | None -> () | Some n -> put (",\tNext: "^noeud_name n)); (match noeud.previous with | None -> () | Some n -> put (",\tPrev: "^noeud_name n)); (match noeud.up with | None -> if noeud.name = "Top" then begin put ",\tUp: (dir)" ; top_node := true end else put ",\tUp: Top" | Some n -> put (",\tUp: "^noeud_name n)); put_char '\n'; if !verbose >1 then prerr_endline ("Node : "^noeud_name noeud); ;; let affiche_ref key = try let l = cherche_label key !labels_list in match l with | None -> () | Some node -> put ("*Note "^noeud_name node^"::") with | Not_found -> () (* A warning has already been given *) ;; let footNote_label = ref "" ;; } rule main = parse | "\\@menu" { let num = numero lexbuf in affiche_menu num; main lexbuf} | "\\@node" { let nom = finitLigne lexbuf in affiche_node nom; main lexbuf} | "\\@reference{" { let key = arg lexbuf in affiche_ref key; main lexbuf} | "\\@name{" {let _ = arg lexbuf in main lexbuf} | eof {affiche_tag_table ()} | _ {let lxm = lexeme_char lexbuf 0 in put_char lxm; main lexbuf} and numero = parse ['0'-'9']+ {let lxm = lexeme lexbuf in int_of_string lxm} | _ {raise (Error "Syntax error in info temp file")} and finitLigne = parse [^'\n']+'\n' {let lxm = lexeme lexbuf in String.sub lxm 0 ((String.length lxm) -1)} | _ {raise ( Error "Syntax error in info temp file: no node name.")} and arg = parse [^'}']+'}' {let lxm= lexeme lexbuf in String.sub lxm 0 ((String.length lxm) -1)} | _ {raise (Error "Syntax error in info temporary file: invalid reference.")} and labels = parse | "\\@name{" {let key = arg lexbuf in key::labels lexbuf} | _ {labels lexbuf} | eof {[]} { let do_infonode opt num arg = let n = { name = verifie num; comment = arg; previous = None; next = None; up = None; pos = 0; } in if compat_mem nodes n.name then raise (Error ("Duplicate node name: "^n.name)); n.up <- (match opt with "" -> None | m -> ajoute_node_dans_menu n m); Hashtbl.add nodes n.name n; Text.open_block "INFOLINE" ""; Text.put ("\\@node"^n.name^"\n"); Text.close_block "INFOLINE"; current_node := Some n; if !verbose>1 then prerr_endline ("Node added :"^n.name^", "^n.comment) let infoextranode num nom text = delayed := (num,nom,text) :: !delayed and flushextranodes () = let rec flush_rec = function | [] -> () | (num,nom,text) :: rest -> do_infonode "" num nom ; Text.open_block "INFO" "" ; Text.put text ; Text.close_block "INFO" ; let labs = labels (MyLexing.from_string text) in List.iter (fun lab -> change_label lab !labels_list) labs ; flush_rec rest in flush_rec !delayed ; delayed := [] ;; let infonode opt num arg = flushextranodes () ; do_infonode opt num arg (* finalisation des liens entre les noeuds *) let rec do_finalize_nodes suivant = function | [] -> () | n::reste -> if !verbose>2 then prerr_endline ("node :"^n.name); n.next <- suivant; (match suivant with | None -> () | Some suiv -> suiv.previous <- Some n ); do_finalize_nodes (Some n) reste ;; let rec do_finalize_menus = function | [] -> () | m::reste -> if m.nodes <> [] then begin do_finalize_nodes None m.nodes; (match m.nod with None -> () | Some n -> if n.name = "Top" then let first_node = List.hd (List.rev m.nodes) in n.next <- Some first_node; first_node.previous <- Some n; (* On descend dans l'arborescence des menus *) let last_node = List.hd m.nodes in match last_node.next with | None -> () | Some suiv -> suiv.previous <- Some n; (* On remonte les menus au meme niveau *) ); do_finalize_menus reste; end ;; let finalize_nodes () = if !verbose>2 then prerr_endline "finalizing nodes"; flushextranodes () ; do_finalize_menus (List.rev !menu_list); if !verbose>2 then prerr_endline "finalizing done."; ;; let dump buff = let name,out_chan = match Parse_opts.name_out with | ""|"-" -> "", Out.create_chan stdout | s -> let name = s^"-1" in name, Out.create_chan (open_out name) in if !verbose > 0 then prerr_endline ("Final dump in "^name) ; set_out out_chan ; set_out_file name ; put_header () ; files := [name,abs_pos ()] ; main buff ; Out.close !out_cur ; if !file_number = 1 then Mysys.rename !cur_file Parse_opts.name_out } hevea-2.30/cleveref.hva0000644004317100512160000001455312571010021015044 0ustar marangetcristal\ProvidesPackage{cleveref} \RequirePackage{labeltype} \@primitives{cleveref} %%alias mechanism \newcommand{\crefalias}[2]{\def\csname @cr@#1@alias\endcsname{#2}} \newcommand{\@cr@alias}[1] {\ifu\csname @cr@#1@alias\endcsname{}#1\else\csname @cr@#1@alias\endcsname\fi} \crefalias{item}{enumi} %%extend \@deflabeltype from labeltype \let\@cr@old@deflabeltype\@deflabeltype \renewcommand{\@deflabeltype}[2] {\@cr@old@deflabeltype{#1}{#2}% \prim@def\csname @cf@#1@type\endcsname{\@cr@alias{#2}}} %%Use alias mechanism for appendix %%rely on \@base being either article or book \newcommand{\@cr@article@appendix}{% \@auxdowrite{\@print{\crefalias}\{section\}\{appendix\}\newline}% \@auxdowrite{\@print{\crefalias}\{subsection\}\{subappendix\}\newline}% \@auxdowrite{\@print{\crefalias}\{subsubsection\}\{subsubappendix\}\newline}% } \newcommand{\@cr@book@appendix}{% \@auxdowrite{\@print{\crefalias}\{chapter\}\{appendix\}\newline}% \@auxdowrite{\@print{\crefalias}\{section\}\{subappendix\}\newline}% \@auxdowrite{\@print{\crefalias}\{subsection\}\{subsubappendix\}\newline}% } \let\@cr@old@appendix\appendix \renewcommand{\appendix} {\@cr@old@appendix% \csname @cr@\@base{}@appendix\endcsname} %%Some internal conditions, with defaults \newif\if@cref@capitalise\@cref@capitalisefalse \newif\if@cref@abbrev\@cref@abbrevtrue \newif\if@cref@nameinlink\@cref@nameinlinkfalse \DeclareOption{nameinlink}{\@cref@nameinlinktrue} \DeclareOption{capitalise}{\@cref@capitalisetrue} \DeclareOption{capitalize}{\@cref@capitalisetrue} %Ignore multi-language hooks support \newcommand{\cref@addlanguagedefs}[2] {\def\csname cref@language@#1@defs\endcsname{#2}} %Define internal names %#1 cref/Cref #2 type #3 name #4 plural #5 extension (ignored) %%% section names from type \newcommand{\@@crefname}[5] {%\hva@warn{@@crefname '#1' '#2' #3' '#4' '#5'}% \def\csname #1@#2@name\endcsname{#3}% \def\csname #1@#2@name@plural\endcsname{#4}} \newcommand{\@@crefname@nondef}[5] {%\hva@warn{@@crefname@nondef '#1' '#2' #3' '#4' '#5'}% \ifu\csname #1@#2@name\endcsname\def\csname #1@#2@name\endcsname{#3}\else %\hva@warn{NO DEF for '#1' '#2'} \fi% \ifu\csname #1@#2@name@plural\endcsname\def\csname #1@#2@name@plural\endcsname{#4}\fi} %%Define others \def\@cr@cref@other{Cref} \def\@cr@Cref@other{cref} \newcommand{\@cr@other}[1]{\csname @cr@#1@other\endcsname} \let\@cr@cref@othercom\MakeUppercase \def\@cr@Cref@othercom{\if@cref@capitalise\let\@next\relax\else\let\@next\MakeLowercase\fi\@next} \newcommand{\@@crefname@other}[5]{ \@@crefname@nondef {\csname @cr@#1@other\endcsname} {#2} {\csname @cr@#1@othercom\endcsname #3} {\csname @cr@#1@othercom\endcsname #4} {#5}} \newcommand{\@crefname}[5]{% \@@crefname{#1}{#2}{#3}{#4}{#5}% \@@crefname@other{#1}{#2}{#3}{#4}{#5}} \newcommand{\crefname}[3]{\@crefname{cref}{#1}{#2}{#3}{}} \newcommand{\Crefname}[3]{\@crefname{Cref}{#1}{#2}{#3}{}} \newcommand{\crefname@preamble}[3]{\@crefname{cref}{#1}{#2}{#3}{@preamble}} \newcommand{\Crefname@preamble}[3]{\@crefname{Cref}{#1}{#2}{#3}{@preamble}} %For some reason all this must be defined... \iftrue \newcommand{\crefrangeconjunction}{ to\nobreakspace}% \newcommand\crefrangepreconjunction{}% \newcommand\crefrangepostconjunction{}% \newcommand{\crefpairconjunction}{ and\nobreakspace}% \newcommand{\crefmiddleconjunction}{, }% \newcommand{\creflastconjunction}{ and\nobreakspace}% \newcommand{\crefpairgroupconjunction}{ and\nobreakspace}% \newcommand{\crefmiddlegroupconjunction}{, }% \newcommand{\creflastgroupconjunction}{, and\nobreakspace}% \fi \input{crlang.hva} %%% \newcommand{\@@cr@secname}[2] {%\hva@warn@prim{SEC: '#1' '#2'}% %\typeout{TYPE: '#2'}% \ifu#2 ??\else\ifu\csname #1@#2@name\endcsname \hva@warn@prim{No name for type #2}??\else \csname #1@#2@name\endcsname\fi\fi} %% \newcommand{\@@cr@secname@plural}[2] {%\hva@warn{SEC: '#1' '#2'}% %\typeout{TYPE: '#2'}% \ifu#2 ??\else\ifu\csname #1@#2@name@plural\endcsname \hva@warn@prim{No name for type #2}??\else \csname #1@#2@name@plural\endcsname\fi\fi} \newcommand{\@cr@secname}[2]{\@@cr@secname{#1}{\csname @cf@#2@type\endcsname}} \newcommand{\@cr@secname@plural}[2]{\@@cr@secname@plural{#1}{\csname @cf@#2@type\endcsname}} \newcommand{\namecref}[1]{\@cr@secname{cref}{#1}} \newcommand{\nameCref}[1]{\@cr@secname{Cref}{#1}} \newcommand{\namecrefs}[1]{\@cr@secname@plural{cref}{#1}} \newcommand{\nameCrefs}[1]{\@cr@secname@plural{Cref}{#1}} \newcommand{\@cr@fmt}[3]{#2#1#3} \newcommand{\@cr@apply@fmt}[1] {\@cr@fmt{\@auxread{#1}}{\@openlocref{#1}}{\@closelocref}} \newcommand{\crefdefaultlabelformat}{\@cr@def{\@cr@fmt}{3}} \newcommand{\@@cr@fmt}[5] {\if@cref@nameinlink \@cr@fmt{\@@cr@secname{#1}{#2}~#3}{#4}{#5}% \else\@@cr@secname{#1}{#2}~\@cr@fmt{#3}{#4}{#5}\fi} \newcommand{\@cr@def@fmt}[2] {\@cr@def@withother {\csname @\@cr@other{#1}@#2@fmt\endcsname} {\csname @cr@#1@othercom\endcsname} {\csname @#1@#2@fmt\endcsname}{3}} \newcommand{\crefformat}[1]{\@cr@def@fmt{cref}{#1}} \newcommand{\Crefformat}[1]{\@cr@def@fmt{Cref}{#1}} \newcommand{\@cr@find@fmt}[2]{% \ifu#2\def\@next{\@@cr@fmt{#1}{#2}}\else \ifu\csname @#1@#2@fmt\endcsname\def\@next{\@@cr@fmt{#1}{#2}}\else \let\@next\csname @#1@#2@fmt\endcsname\fi\fi\@next} \newcommand{\@cr@fmt@one}[2] {\@cr@find@fmt {#1}{\csname @cf@#2@type\endcsname} {\@auxread{#2}}{\@openlocref{#2}}{\@closelocref}} \newcommand{\@cr@fmt@two}[3] {\@cr@secname@plural{#1}{#2}~\@cr@apply@fmt{#2}\crefpairconjunction\@cr@apply@fmt{#3}} \newcommand{\@cr@ref}[2]{\@cr@sort@labels{#1}{#2}} %%% \newcommand{\cref}[1]{\@cr@ref{cref}{#1}} \newcommand{\Cref}[1]{\@cr@ref{Cref}{#1}} %%%%%%%Ranges, much easier no customisation (yet ?) \newcommand{\@cr@range}[3] {\@cr@secname@plural{#1}{#2}~\crefrangepreconjunction\@cr@apply@fmt{#2}\crefrangeconjunction\@cr@apply@fmt{#3}\crefrangepostconjunction} \newcommand{\crefrange}[2]{\@cr@range{cref}{#1}{#2}} \newcommand{\Crefrange}[2]{\@cr@range{Cref}{#1}{#2}} %%%%%%% %%We redefine \AtBeginDocument so as to collect lask invokation %%That way, last language def is executed now %%and preamble \crefname will override it \let\@cr@AtBeginDocument\AtBeginDocument \newtokens{\@cr@at} \renewcommand{\AtBeginDocument}[1]{\addtokens{\@cr@at}{#1}} \ExecuteOptions{english} \ProcessOptions*% \let\AtBeginDocument\@cr@AtBeginDocument \undef\@cr@AtBeginDocument %%%execute option, code, notice that we do execute all of it \@cr@at\csname cref@language@\cref@language{}@defs\endcsname \undef\@cr@at %%%The only problem is the non automatic definition of Capitalized %%%counterparts for \crfename hevea-2.30/myLexing.mli0000644004317100512160000000155312017660721015061 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* Additions to the standard Lexing module *) val from_string : string -> Lexing.lexbuf val from_list : string list -> Lexing.lexbuf hevea-2.30/expandlib.sh0000755004317100512160000000010310610713116015047 0ustar marangetcristal#! /bin/sh . `dirname $0`/config.sh sed -e "s,LIBDIR,$LIBDIR,g" $1 hevea-2.30/parse_opts.ml0000644004317100512160000001354512017660721015277 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Printf open Misc type input = File of string | Prog of string let files = ref [] ;; let add_input s = files := File s :: !files and add_program s = files := Prog s :: !files ;; (* use this to create your warnings if you wish to *) let frenchwarning = ref false ;; type destination = Html | Text | Info ;; let mathml = ref false ;; (*to activate advanced entities*) let moreentities = ref false ;; (* NO NEED AFTER BABEL SUPPORT *) (*let language = ref English*) type symbol_mode = SText | Symbol | Entity let symbol_mode = ref Entity and pedantic = ref false and destination = ref Html and fixpoint = ref false and optimize = ref false let width = ref 72 let except = ref [] let path = ref [] let outname = ref "" let small_length = ref 1024 let check_displayverb n = if n > 1 then displayverb := true let _ = Arg.parse [ ("-version", Arg.Unit (fun () -> print_endline ("hevea "^Version.version) ; print_endline ("library directory: "^Mylib.static_libdir) ; exit 0), "show hevea version and library directory") ; ("-v", Arg.Unit (fun () -> readverb := !readverb + 1 ; check_displayverb !readverb), "verbose flag, can be repeated to increase verbosity") ; ("-dv", Arg.Unit (fun () -> displayverb := true), "add borders to some block-level elements, so as to show hevea output structure") ; ("-s", Arg.Unit (fun () -> silent := true), "suppress warnings") ; ("-I", Arg.String (fun s -> path := s :: !path), "dir, add directory 'dir' to search path") ; ("-e", Arg.String (fun s -> except := s :: !except), "filename, prevent file 'filename' from being read") ; ("-fix", Arg.Unit (fun () -> fixpoint := true), "iterate Hevea until fixpoint") ; ("-O", Arg.Unit (fun () -> optimize := true), "call esponja to optimize HTML output") ; ("-exec", Arg.String add_program, "prog , execute external program 'prog', then read its result") ; ("-francais",Arg.Unit (fun () -> frenchwarning := true), "French mode (deprecated)") ; ("-moreentities", Arg.Unit (fun () -> moreentities := true), "Enable the output of some rare entities.") ; ("-entities", Arg.Unit (fun () -> symbol_mode := Entity), "Render symbols by using entities, this is the default") ; ("-textsymbols", Arg.Unit (fun () -> symbol_mode := SText), "Render symbols by english text") ; ("-noiso",Arg.Unit (fun () -> Misc.warning "-noiso is deprecated, by default hevea output is ascii"), "deprecated, does nothing") ; ("-pedantic",Arg.Unit (fun () -> pedantic := true), "be pedantic in interpreting HTML 4.0 transitional definition") ; ("-mathml",Arg.Unit (fun() -> mathml := true), "produces MathML output for equations, very experimental"); ("-text",Arg.Unit (fun () -> symbol_mode := SText ; destination := Text), "output plain text"); ("-info",Arg.Unit (fun () -> symbol_mode := SText ; destination := Info), "output info file(s)"); ("-w", Arg.String (fun s -> width := int_of_string s), "width, set the output width for text or info output"); ("-rsz", Arg.Int (fun i -> small_length := i), (sprintf "size of leaves in rope implementation (default %i)" !small_length)); ("-o", Arg.String (fun s -> outname := s), "filename, make hevea output go into file 'filename'") ] (add_input) ("hevea "^Version.version) ;; let warning s = if not !silent || !verbose > 0 then begin Location.print_pos () ; prerr_string "Warning: " ; prerr_endline s end ;; (* For correcting strange user (-exec prog en dernier) *) let rec ffirst = function | [] -> None,[] | Prog _ as arg::rem -> let file, rest = ffirst rem in file, arg::rest | File _ as arg::rem -> Some arg,rem ;; files := match ffirst !files with | None,rem -> rem | Some arg,rem -> arg::rem let base_in,name_in,styles = match !files with | File x :: rest -> if Filename.check_suffix x ".hva" then "","", !files else let base_file = Filename.basename x in begin try let base = if Filename.check_suffix base_file ".tex" then Filename.chop_extension base_file else base_file in base,x,rest with Invalid_argument _ -> base_file, x,rest end | []|Prog _::_ -> "","",!files let filter = match base_in with "" -> true | _ -> false ;; if filter then begin if !fixpoint then Misc.warning ("No fixpoint in filter mode"); fixpoint := false end ;; let base_out = match !outname with | "" -> begin match base_in with | "" -> "" | _ -> Filename.basename base_in end | name -> let suff = match !destination with | Html -> ".html" | Text -> ".txt" | Info -> ".info" in if Filename.check_suffix name suff then Filename.chop_suffix name suff else try Filename.chop_extension name with Invalid_argument _ -> name let name_out = match !outname with | "" -> begin match base_in with | "" -> "" | x -> begin match !destination with | Html ->x^".html" | Text ->x^".txt" | Info ->x^".info" end end | x -> x let _ = if !frenchwarning then begin warning "-francais option is deprecated, use babel instead" end hevea-2.30/subst.mli0000644004317100512160000000251612017660721014425 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: subst.mli,v 1.8 2007-06-06 18:24:19 maranget Exp $ *) (***********************************************************************) open Lexstate val do_subst_this : string arg -> string val do_subst_this_list : string list arg -> string val subst_list : string list arg -> string list val subst_this : string -> string val subst_arg : Lexing.lexbuf -> string val subst_expn_arg : Lexing.lexbuf -> string val subst_opt : string -> Lexing.lexbuf -> string list val subst_body : Lexing.lexbuf -> string list val subst_expn_body : Lexing.lexbuf -> string list val subst_arg_list : Lexing.lexbuf -> string list val uppercase : string -> string val lowercase : string -> string hevea-2.30/location.mli0000644004317100512160000000210113104361327015061 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) type saved val check : unit -> saved val hot : saved -> unit val get : unit -> string val set : string -> Lexing.lexbuf -> unit val restore : unit -> unit type t val get_pos : unit -> t val get_lineno : unit -> int val print_pos : unit -> unit val print_fullpos : unit -> unit val print_this_pos : t -> unit val print_this_fullpos : t -> unit hevea-2.30/hot.ml0000644004317100512160000000264010461730545013707 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: hot.ml,v 1.6 2006-07-26 18:16:05 maranget Exp $ *) (***********************************************************************) type saved = Misc.saved * Lexstate.saved * Latexmacros.saved * Counter.saved * Color.saved * Foot.saved let checkpoint () = Misc.checkpoint (), Lexstate.checkpoint (), Latexmacros.checkpoint (), Counter.checkpoint (), Color.checkpoint (), Foot.checkpoint () and start (misc, lexstate, latexmacros, counter, color, foot) = Misc.hot_start misc ; Lexstate.hot_start lexstate ; Latexmacros.hot_start latexmacros ; Counter.hot_start counter ; Color.hot_start color ; Foot.hot_start foot ; begin match !Parse_opts.destination with | Parse_opts.Info -> InfoRef.hot_start () | _ -> () end hevea-2.30/iso-symb.hva0000644004317100512160000007004212330272101015010 0ustar marangetcristal%% Escapable special characters \def\%{\char37} \def\${\@print{$}}%$ \def\#{\@print{#}} \def\&{\@print{&}} \def\_{\@print{_}} \def\{{\char123} \def\}{\char125} \def\nobreakspace{~} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Table 2: Predefined text-mode commands% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\textasciicircum}{\@print{^}} \newcommand{\textasciitilde}{\@print{~}} \DeclareSymbolHtml[*]{\textasteriskcentered}{X2217} \newcommand{\textbackslash}{\char92} \newcommand{\textbar}{|} \let\textbraceleft\{ \let\textbraceright\} \DeclareSymbol[*]{\textbullet}{X2022} \DeclareSymbol[(c)]{\textcopyright}{XA9} \DeclareSymbolHtml{\textdagger}{8224} \DeclareSymbolHtml{\textdaggerdbl}{8225} \let\textdollar\$ \DeclareSymbol[...]{\textellipsis}{X2026} \DeclareSymbolHtml[\@print{--}]{\textemdash}{X2014} \DeclareSymbolHtml[\@print{-}]{\textendash}{X2013} \DeclareSymbol{\textexclamdown}{XA1} \newcommand{\textgreater}{\@print{>}} \newcommand{\textless}{\@print{<}} \DeclareSymbol[\textsup{a}]{\textordfeminine}{XAA} \DeclareSymbol[\textsup{o}]{\textordmasculine}{XBA} \DeclareSymbol{\textparagraph}{XB6} \DeclareSymbol{\textperiodcentered}{XB7} \DeclareSymbol{\textquestiondown}{XBF} \DeclareSymbolHtml[\@print{"}]{\textquotedblleft}{X201C} \DeclareSymbolHtml[\@print{"}]{\textquotedblright}{X201D} \DeclareSymbolHtml[\@print{'}]{\textquoteleft}{X2018} \DeclareSymbolHtml[\@print{'}]{\textquoteright}{X2019} \DeclareSymbol[(R)]{\textregistered}{XAE} \DeclareSymbol{\textsection}{XA7} \DeclareSymbol[pounds]{\textsterling}{XA3} \DeclareSymbolHtml[(TM)]{\texttrademark}{X2122} \newcommand{\textunderscore}{\@print{_}} \DeclareSymbolHtml[\@print{_}]{\textvisiblespace}{X2423} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Table 3: Commands defined both for math and text% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \DeclareSymbol{\P}{XB6} \DeclareSymbol{\S}{XA7} \DeclareSymbol[(c)]{\copyright}{XA9} \DeclareSymbolHtml{\dag}{8224} \DeclareSymbolHtml{\ddag}{8225} \DeclareSymbolHtml[...]{\dots}{X2026} \DeclareSymbol[pounds]{\pounds}{XA3} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Table 5: Non-ascii letters % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%Those belong to latin9 \DeclareSymbol[oe]{\oe}{X153} \DeclareSymbol[OE]{\OE}{X152} %%And those to latin1 \DeclareSymbol[ae]{\ae}{XE6} \DeclareSymbol[AE]{\AE}{XC6} \DeclareSymbol[aa]{\aa}{XE5} \DeclareSymbol[AA]{\AA}{XC5} \DeclareSymbol[o]{\o}{XF8} \DeclareSymbol[O]{\O}{XD8} \DeclareSymbol[ss]{\ss}{XDF} \newcommand{\SS}{SS} \DeclareSymbol[DH]{\DH}{XD0} \DeclareSymbol[dh]{\dh}{XF0} \DeclareSymbol[DJ]{\DJ}{X110} \DeclareSymbol[dj]{\dj}{X111} \DeclareSymbol[TH]{\TH}{XDE} \DeclareSymbol[th]{\th}{XFE} \DeclareSymbol[ENG]{\NG}{X14A} \DeclareSymbol[eng]{\ng}{X14B} \DeclareSymbol[L]{\L}{X141} \DeclareSymbol[l]{\l}{X142} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Punctuation Marks Not Found in OT1 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \DeclareSymbol[<<]{\guillemotleft}{XAB} \DeclareSymbol[>>]{\guillemotright}{XBB} \DeclareSymbolHtml[<]{\guilsinglleft}{X2039} \DeclareSymbolHtml[>]{\guilsinglright}{X203A} \DeclareSymbolHtml[,,]{\quotedblbase}{X201E} \DeclareSymbolHtml[,]{\quotesinglbase}{X201A} \newcommand{\textquotedbl}{\@print{"}}%" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Table 38: Maths-Mode Versions of Text Symbols % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \let\mathdollar\$ \DeclareSymbolHtml[...]{\mathellipsis}{X2026} \DeclareSymbol{\mathparagraph}{XB6} \DeclareSymbol{\mathsection}{XA7} \DeclareSymbol[pounds]{\mathsterling}{XA3} \let\mathunderscore\_ %%%%%%%%%%%%%%%%%%%%%%%%%%% %Table 39 Binary Operators% %%%%%%%%%%%%%%%%%%%%%%%%%%% \DeclareSymbolHtml[\mbox{|\_|}]{\amalg}{X2A3F} \DeclareSymbolHtml[*]{\ast}{X2217} \DeclareSymbolHtml[O]{\bigcirc}{X25EF} \DeclareSymbolHtml{\bigtriangledown}{X25BD} \DeclareSymbolHtml{\bigtriangleup}{X25B3} \DeclareSymbolHtml[*]{\bullet}{X2022} \DeclareSymbolHtml{\@cap}{X2229} \DeclareSymbolHtml[\mbox{---\@br| |\@br| |}]{\@display@cap}{X22C2} \newcommand{\cap}{\ifdisplay\@display@cap\else\@cap\fi} \DeclareSymbol{\cdot}{XB7} \DeclareSymbolHtml{\circ}{X2218} \DeclareSymbolHtml{\@cup}{X222A} \DeclareSymbolHtml[\mbox{| |\@br| |\@br---}]{\@display@cup}{X22C3} \newcommand{\cup}{\ifdisplay\@display@cup\else\@cup\fi} \@Let{\dagger}{\dag} \@Let{\ddagger}{\ddag} \DeclareSymbolHtml{\diamond}{X22C4} \DeclareSymbol[/]{\div}{XF7} \DeclareSymbolHtml[-/+]{\mp}{X2213} \DeclareSymbolHtml[(\cdot)]{\odot}{X2299} \DeclareSymbolHtml[(-)]{\ominus}{X2296} \DeclareSymbolHtml[(+)]{\oplus}{X2295} \DeclareSymbolHtml[(\char92)]{\oslash}{X2298} \DeclareSymbolHtml[(\times)]{\otimes}{X2297} \DeclareSymbol[+/-]{\pm}{XB1} \DeclareSymbolHtml[\backslash]{\setminus}{X2216} \DeclareSymbolHtml{\sqcap}{X2293} \DeclareSymbolHtml[\mbox{|\_|}]{\sqcup}{X2294} \DeclareSymbolHtml[*]{\star}{X22C6} \DeclareSymbol[X]{\times}{XD7} \DeclareSymbolHtml[<|]{\triangleleft}{X25C1} \DeclareSymbolHtml[|>]{\triangleright}{X25B7} \DeclareSymbolHtml[\mbox{|\pm|}]{\uplus}{X228E} \DeclareSymbolHtml[\mbox{OR}]{\vee}{X2228} \DeclareSymbolHtml[\mbox{AND}]{\wedge}{X2227} \DeclareSymbolHtml{\wr}{X2240} %%Miscellaneous LaTeX2e Math Symbols \DeclareSymbolHtml[\mbox{aleph}]{\aleph}{X2135} \DeclareSymbolHtml{\angle}{X2220} \newcommand{\backslash}{\char92} \DeclareSymbolHtml{\clubsuit}{X2663} \DeclareSymbolHtml{\diamondsuit}{X2666} \DeclareSymbolHtml[\O]{\emptyset}{X2205} \DeclareSymbolHtml{\flat}{X266D} \DeclareSymbolHtml{\heartsuit}{X2665} \DeclareSymbolHtml[\mbox{oo}]{\infty}{X221E} \DeclareSymbolHtml[\mbox{nabla}]{\nabla}{X2207} \DeclareSymbolHtml{\natural}{X266E} \DeclareSymbol[\mbox{NOT}]{\neg}{XAC} \DeclareSymbol[\@print{'}]{\prime}{X2032} \DeclareSymbolHtml[\@print{#}]{\sharp}{X266F} \DeclareSymbolHtml{\spadesuit}{X2660} \DeclareSymbolHtml{\surd}{X221A} \DeclareSymbolHtml{\triangle}{X25B3} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Table 47 Variable-sized math operator % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \MakeBigSymbol{\bigcap}{\@cap}{\@cap}{\@display@cap} \MakeBigSymbol{\bigcup}{\@cup}{\@cap}{\@display@cup} \MakeBigSymbol{\bigodot}{\odot}{\odot}{\odot} \newcommand{\@textdisplayuplus}{\mbox{|~~~|\@br|~+~|\@br-----}} \MakeBigSymbol{\biguplus}{\uplus}{\uplus}{\@textdisplayuplus} \MakeBigSymbol{\bigoplus}{\oplus}{\oplus}{\oplus} \MakeBigSymbol{\bigotimes}{\otimes}{\otimes}{\otimes} %\MakeBigSymbol{\bigsqcap}{\@sqcap}{\@sqcap}{\@display@sqcap} \newcommand{\@textdisplaysqcup}{|~~|\@br|~~\@br----} \MakeBigSymbol{\bigsqcup}{\sqcup}{\sqcup}{\@textdisplaysqcup} \newcommand{\@textdisplayvee}{\mbox{\char92{}~~/\@br~\char92/~}} \MakeBigSymbol{\bigvee}{\vee}{\vee}{\@textdisplayvee} \newcommand{\@textdisplaywedge}{\mbox{~/\char92~\@br/~~\char92}} \MakeBigSymbol{\bigwedge}{\wedge}{\wedge}{\@textdisplaywedge} \DeclareSymbolHtml[coprod]{\@coprod}{X2210} \newcommand{\@textdisplaycoprod}{\mbox{---\@br| |\@br| |}} \MakeBigSymbol{\coprod}{\@coprod}{\@coprod}{\@textdisplaycoprod} \DeclareSymbolHtml[prod]{\@prod}{X220F} \newcommand{\@textdisplayprod}{\mbox{| |\@br| |\@br---}} \MakeBigSymbol{\prod}{\@prod}{\@prod}{\@textdisplayprod} \DeclareSymbolHtml[sum]{\@sum}{X2211} \newcommand{\@textdisplaysum}{\mbox{--\@br\char92\@br/\@br--}} \MakeBigSymbol{\sum}{\@sum}{\@sum}{\@textdisplaysum} \DeclareSymbolHtml[\mbox{integral}]{\@int}{X222B} \newcommand{\@textdisplayint}{\mbox{/\@br|\@br|\@br/}} \MakeBigSymbol[\intlimits]{\int}{\@int}{\@int}{\@textdisplayint} \DeclareSymbolHtml[\mbox{oint}]{\@oint}{X222E} \newcommand{\@textdisplayoint}{\mbox{/\@br|\@br{}o\@br|\@br/}} \MakeBigSymbol[\intlimits]{\oint}{\@oint}{\@oint}{\@textdisplayoint} %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Table 54: Binary relations % %%%%%%%%%%%%%%%%%%%%%%%%%%%%% \DeclareSymbolHtml[\mbox{approx}]{\approx}{X2248} \DeclareSymbolHtml[\mbox{asymp}]{\asymp}{X224D} \DeclareSymbolHtml[\mbox{bowtie}]{\bowtie}{X22C8} \DeclareSymbolHtml[\mbox{cong}]{\cong}{X2245} \DeclareSymbolHtml[\@print{|-}]{\vdash}{X22A2} \DeclareSymbolHtml[\@print{-|}]{\dashv}{X22A3} \DeclareSymbolHtml[\stackrel{\cdot}{=}]{\doteq}{X2250} \DeclareSymbolHtml[\mbox{equiv}]{\equiv}{X2261} \DeclareSymbolHtml[\mbox{frown}]{\frown}{X2040} \DeclareSymbolHtml[\mbox{|}]{\mid}{X2223} \DeclareSymbolHtml[\mbox{|=}]{\models}{X22A8} \DeclareSymbolHtml[\mbox{||}]{\parallel}{X2225} \DeclareSymbolHtml[\mbox{\@print{_|_}}]{\perp}{X22A5} \DeclareSymbolHtml[\mbox{prec}]{\prec}{X227A} \DeclareSymbolHtml[\mbox{preceq}]{\preceq}{X227C} \DeclareSymbolHtml[\mbox{oc}]{\propto}{X221D} \DeclareSymbolHtml[\@print{~}]{\sim}{X223C} \DeclareSymbolHtml[\textunderline{\sim}]{\simeq}{X2243} \DeclareSymbolHtml[\mbox{smile}]{\smile}{X203F} \DeclareSymbolHtml[\mbox{succ}]{\succ}{X227B} \DeclareSymbolHtml[\mbox{succeq}]{\succeq}{X227D} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Table 65: Subset and Superset Relations % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\@textdisplaysubset}{\mbox{-\@br|\@br-}} \newcommand{\@textdisplaysupset}{\mbox{-\@br~|\@br-}} \newcommand{\@textdisplaysubseteq}{\mbox{-\@br|\@br=}} \newcommand{\@textdisplaysupseteq}{\mbox{-\@br~|\@br=}} \DeclareSymbolHtml[\IfDisplay{\@textdisplysubset}{\mbox{subset}}] {\subset}{X2282} \DeclareSymbolHtml[\IfDisplay{\@textdisplaysubseteq}{\mbox{subseteq}}] {\subseteq}{X2286} \DeclareSymbolHtml[\IfDisplay{\@textdisplaysupset}{\mbox{supset}}] {\supset}{X2283} \DeclareSymbolHtml[\IfDisplay{\@textdisplaysupseteq}{\mbox{supseteq}}] {\supseteq}{X2287} \DeclareSymbolHtml[\IfDisplay{\@textdisplaysubseteq}{\mbox{sqsubseteq}}] {\sqsubseteq}{X2291} \DeclareSymbolHtml[\IfDisplay{\@textdisplaysupseteq}{\mbox{sqsupseteq}}] {\sqsupseteq}{X2292} %%%%%%%%%%%%%%%%%%%%%%%%%% % Table 71: Inequalities % %%%%%%%%%%%%%%%%%%%%%%%%%% \DeclareSymbolHtml[<=]{\leq}{X2264} \DeclareSymbolHtml[<<]{\ll}{X226A} \DeclareSymbolHtml[>=]{\geq}{X2265} \DeclareSymbolHtml[>>]{\gg}{X226B} \DeclareSymbolHtml[\mbox{neq}]{\neq}{X2260} %%%%%%%%%%%%%%%%%%%% % Table 79: Arrows % %%%%%%%%%%%%%%%%%%%% \DeclareSymbolHtml{\Downarrow}{X21D3} \DeclareSymbolHtml{\downarrow}{X2193} \DeclareSymbolHtml{\hookleftarrow}{X21A9} \DeclareSymbolHtml{\hookrightarrow}{X21AA} \DeclareSymbolHtml[\mbox{<-}]{\leftarrow}{X2190} \DeclareSymbolHtml[\mbox{<=}]{\Leftarrow}{X21D0} \DeclareSymbolHtml[\mbox{<=>}]{\Leftrightarrow}{X21D4} \DeclareSymbolHtml[\mbox{<->}]{\leftrightarrow}{X2194} \DeclareSymbolHtml[\mbox{|->>}]{\mapsto}{X21A6} \DeclareSymbolHtml[\mbox{-}]{\relbar}{X23AF} %EM DASH (better than arrow extension X23AF) \DeclareSymbolHtml[\@print{-}]{\@arrowextension}{X2014} %nothing satisfactory \newcommand{\Relbar}{=} \newcommand{\@Arrowextension}{=} \newcommand{\longleftarrow}{\leftarrow\@arrowextension} \newcommand{\Longleftarrow}{\Leftarrow\@Arrowextension} \newcommand{\longleftrightarrow}{\leftarrow\rightarrow} \newcommand{\Longleftrightarrow}{\Leftarrow\Rightarrow} \newcommand{\longmapsto}{\vdash\rightarrow} \newcommand{\Longrightarrow}{\@Arrowextension\Rightarrow} \newcommand{\longrightarrow}{\@arrowextension\rightarrow} \DeclareSymbolHtml{\nearrow}{X2197} \DeclareSymbolHtml{\nwarrow}{X2196} \DeclareSymbolHtml[\mbox{=>}]{\Rightarrow}{X21D2} \DeclareSymbolHtml[\mbox{->}]{\rightarrow}{X2192} \DeclareSymbolHtml{\searrow}{X2198} \DeclareSymbolHtml{\swarrow}{X2199} \DeclareSymbolHtml{\uparrow}{X2191} \DeclareSymbolHtml{\Uparrow}{X21D1} \DeclareSymbolHtml{\updownarrow}{X2195} \DeclareSymbolHtml{\@textUpdownarrow}{X21D5} \iffalse \NewcommandHtml{\@displayUpdownarrow} {\@open{TABLE}{style="border-spacing:0" class="cellpadding0"}\@open{TR}{}\@open{TD}{}% \Uparrow\@force{TD}\@force{TR}\@open{TR}{}\@open{TD}{}% \Downarrow\@force{TD}\@force{TR}\@force{TABLE}} \fi \NewcommandHtml{\@displayUpdownarrow} {\@itemdisplay\Uparrow\@br\Downarrow\@itemdisplay\int@sup@sub{2}} \NewcommandHtml{\Updownarrow}{\DisplayChoose{\@displayUpdownarrow}{\@textUpdownarrow}} %%%%%%%%%%%%%%%%%%%%% %Table 80: Harpoons % %%%%%%%%%%%%%%%%%%%%% \DeclareSymbolHtml{\leftharpoondown}{X21BD} \DeclareSymbolHtml{\leftharpoonup}{X21BC} \DeclareSymbolHtml{\rightharpoondown}{X21C1} \DeclareSymbolHtml{\rightharpoonup}{X21C0} \DeclareSymbolHtml{\rightleftharpoons}{X21CC} %%%%%%%%%%%%%%%%%%%%%%%%%%% % Table 98: Greek Letters % %%%%%%%%%%%%%%%%%%%%%%%%%%% \DeclareSymbolHtml[alpha]{\alpha}{X03B1} \DeclareSymbolHtml[beta]{\beta}{X03B2} \DeclareSymbolHtml[gamma]{\gamma}{X03B3} \DeclareSymbolHtml[delta]{\delta}{X03B4} \DeclareSymbolHtml[epsilon]{\epsilon}{X454} \DeclareSymbolHtml[varepsilon]{\varepsilon}{X03B5} \DeclareSymbolHtml[zeta]{\zeta}{X03B6} \DeclareSymbolHtml[eta]{\eta}{X03B7} \DeclareSymbolHtml[theta]{\theta}{X03B8} \DeclareSymbolHtml[vartheta]{\vartheta}{X3D1} \DeclareSymbolHtml[iota]{\iota}{X3B9} \DeclareSymbolHtml[kappa]{\kappa}{X3BA} \DeclareSymbolHtml[lambda]{\lambda}{X3BB} \DeclareSymbol[mu]{\mu}{XB5} \DeclareSymbolHtml[nu]{\nu}{X3BD} \DeclareSymbolHtml[xi]{\xi}{X3BE} \DeclareSymbolHtml[pi]{\pi}{X3C0} \DeclareSymbolHtml[varpi]{\varpi}{X3D6} \DeclareSymbolHtml[rho]{\rho}{X3C1} \DeclareSymbolHtml[varrho]{\varrho}{X3F1} \DeclareSymbolHtml[sigma]{\sigma}{X3C3} \DeclareSymbolHtml[varsigma]{\varsigma}{X3C2} \DeclareSymbolHtml[tau]{\tau}{X3C4} \DeclareSymbolHtml[upsilon]{\upsilon}{X3C5} \DeclareSymbolHtml[phi]{\phi}{X3C6} \DeclareSymbolHtml[varphi]{\varphi}{X3D5} \DeclareSymbolHtml[chi]{\chi}{X3C7} \DeclareSymbolHtml[psi]{\psi}{X3C8} \DeclareSymbolHtml[omega]{\omega}{X3C9} % Capital Greek Letters \DeclareSymbolHtml[Gamma]{\Gamma}{X393} \DeclareSymbolHtml[Delta]{\Delta}{X394} \DeclareSymbolHtml[Theta]{\Theta}{X398} \DeclareSymbolHtml[Lambda]{\Lambda}{X39B} \DeclareSymbolHtml[Xi]{\Xi}{X39E} \DeclareSymbolHtml[Pi]{\Pi}{X3A0} \DeclareSymbolHtml[Sigma]{\Sigma}{X3A3} \DeclareSymbolHtml[Upsilon]{\Upsilon}{X3A5} \DeclareSymbolHtml[Phi]{\Phi}{X3A6} \DeclareSymbolHtml[Psi]{\Psi}{X3A8} \DeclareSymbolHtml[Omega]{\Omega}{X3A9} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Table 104: Letter-like symbols % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \DeclareSymbolHtml[\mbox{\@print{_|_}}]{\bot}{X22A5} \DeclareSymbolHtml[\mbox{ell}]{\ell}{X2113} \DeclareSymbolHtml[\mbox{exists}]{\exists}{X2203} \DeclareSymbolHtml[\mbox{forall}]{\forall}{X2200} \DeclareSymbolHtml[\mbox{h}]{\hbar}{X210F} \DeclareSymbolHtml[\mbox{Im}]{\Im}{X2111} \DeclareSymbolHtml[\mbox{in}]{\in}{X2208} \DeclareSymbolHtml[\mbox{contains}]{\ni}{X220B} \DeclareSymbolHtml{\partial}{X2202} \DeclareSymbolHtml[\mbox{Re}]{\Re}{X211C} \DeclareSymbolHtml{\top}{X22A4} \DeclareSymbolHtml{\wp}{X2118} \newcommand{\i}{i}%To have \^{\i} work. (No accent as fct of U-chars yet) \let\imath\i %\DeclareSymbolHtml[i]{\imath}{X131} \newcommand{\j}{j} %\DeclareSymbolHtml[j]{\jmath}{X237} \let\jmath\j %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Table 122: Math-mode Accents % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \let\acute\' \let\bar\= \let\breve\u \let\check\v \let\dot\. \let\grave\` \let\hat\^ \let\mathring\r \let\tilde\~ \newcommand{\@@vec}[1]{{#1}^{\rightarrow}} \newcommand{\@vec}[1]{\mathop{#1}\limits^{\rightarrow}\nolimits} \newcommand{\vec}{\DisplayChoose\@vec\@@vec} %%%%%%%%%%%%%%%%%%% % Table 138: Dots % %%%%%%%%%%%%%%%%%%% \DeclareSymbolHtml[...]{\ldots}{X2026} \newcommand{\text@vdots} {\ifdisplay\mbox{\cdot\\\cdot\\\cdot}\else:\fi} \DeclareSymbolHtml[\text@vdots]{\vdots}{X22EE} \DeclareSymbolHtml[\cdot\cdot\cdot]{\cdots}{X22EF} \newcommand{\text@ddots}{\ifdisplay\mbox{\cdot~~\\~\cdot~\\~~\cdot}\else% \hva@warn{\ddots in text}\mbox{ddots}\fi} \DeclareSymbolHtml[\text@ddots]{\ddots}{X22F1} \let\cdotp\cdot \newcommand{\ldotp}{.} \DeclareSymbolHtml[:]{\colon}{X2236} %%% So called log-like functions \newcommand{\@defl}[2]{\newcommand{#1}{\mathop{\mbox{#2}}}} \newcommand{\@defnl}[2]{\newcommand{#1}{\mathop{\mbox{#2}}\nolimits}} \@defnl\arccos{arccos} \@defnl\arcsin{arcsin} \@defnl\arctan{arctan} \@defnl\arg{arg} \@defnl\cos{cos} \@defnl\cosh{cosh} \@defnl\cot{cot} \@defnl\coth{coth} \@defnl\csc{csc} \@defnl\deg{deg} \@defl\det{det} \@defnl\dim{dim} \@defnl\exp{exp} \@defl\gcd{gcd} \@defnl\hom{hom} \@defl\inf{inf} \@defnl\ker{ker} \@defnl\lg{lg} \@defl\lim{lim} \@defl\liminf{liminf} \@defl\limsup{limsup} \@defnl\ln{ln} \@defnl\log{log} \@defl\max{max} \@defl\min{min} \@defl\Pr{Pr} \@defnl\sec{sec} \@defnl\sin{sin} \@defnl\sinh{sinh} \@defl\sup{sup} \@defnl\tan{tan} \@defnl\tanh{tanh} \@defnl\bmod{mod} %%%%%%%%%%%%%% \def\pmod#1{\mbox{(mod }#1{\@anti{\@style{I}} )}} \def\tth{\textnormal{||-}} \def\frac#1#2{{#1\over #2}} \newcommand{\limits}{} \newcommand{\nolimits}{} %%%TeX definitions \let\le\leq \let\ge\geq %%%%%%%%%%%%%%%%%% %%Defaut accents%% %%%%%%%%%%%%%%%%%% %\@default is the default typesetting cmd, when %translation to unicode fails. %eg by \newcommand{\acute@default}[1]{#1'}, you get postfix accute accents. \ifhtml \newcommand{\macron@default}[1]{\textoverline{#1}} \newcommand{\linebelow@default}[1]{\textunderline{#1}} \fi \newcommand{\text@accent}[4] {\@ifundefined{#1@default} {\hva@warn{Application of '#2' on '#4' failed}#3} {\csname#1@default\endcsname{#3}}} %%%%%%%%%%%%%%%%%%%%%%%%%% % Delimiters (Table 113) % %%%%%%%%%%%%%%%%%%%%%%%%%% \let\@top@br\@br \newcommand{\delim@name}[1]{\string{#1@delimname}} \newcommand{\process@delim}[2] {\@ifundefined{\delim@name{#1}} {\process@delim@one{#2}{#1}} {\csname\delim@name{#1}\endcsname{#2}}} \newcommand{\csname\delim@name{.}\endcsname}[1]{} %%Simple replication \newcommand{\mid@vert@txt}{\@print@u{X7C}} \DeclareSymbolHtml[\mid@vert@txt]{\mid@vert}{X23AA}%curly bracket extension \newcommand{\mid@Vert}{\mid@vert\mid@vert} %\DeclareSymbolHtml[\mid@Vert@txt]{\mid@Vert}{X2225} \newcommand{\vert}{|} \newcommand{\|}{||} \DeclareSymbolHtml[||]{\Vert}{X2225} \newcommand{\csname\delim@name{\vert}\endcsname}[1] {\process@delim@one{#1}{\mid@vert}} \newcommand{\csname\delim@name{\Vert}\endcsname}[1] {\process@delim@one{#1}{\mid@Vert}} \newcommand{\csname\delim@name{|}\endcsname}[1] {\process@delim@one{#1}{\mid@vert}} \newcommand{\csname\delim@name{\|}\endcsname}[1] {\process@delim@one{#1}{\mid@Vert}} %%Left parenthesis \newcommand{\@nbsp}{\@print@u{XA0}} \newcommand{\top@parleft@txt}{\@print@u{X2F}\@nbsp} \newcommand{\mid@parleft@txt}{\@print@u{X7C}\@nbsp} \newcommand{\dow@parleft@txt}{\@print@u{X5C}\@nbsp} \DeclareSymbolHtml[\top@parleft@txt]{\top@parleft}{X239B} \DeclareSymbolHtml[\mid@parleft@txt]{\mid@parleft}{X239C} \DeclareSymbolHtml[\dow@parleft@txt]{\dow@parleft}{X239D} \newcommand{\csname\delim@name(\endcsname}[1] {\process@delim@three{#1}{\top@parleft}{\mid@parleft}{\dow@parleft}} %%Right parenthesis \newcommand{\top@parright@txt}{\@nbsp\@print@u{X5C}} \newcommand{\mid@parright@txt}{\@nbsp\@print@u{X7C}} \newcommand{\dow@parright@txt}{\@nbsp\@print@u{X2F}} \DeclareSymbolHtml[\top@parright@txt]{\top@parright}{X239E} \DeclareSymbolHtml[\mid@parright@txt]{\mid@parright}{X239F} \DeclareSymbolHtml[\dow@parright@txt]{\dow@parright}{X23A0} \newcommand{\csname\delim@name)\endcsname}[1] {\process@delim@three{#1}{\top@parright}{\mid@parright}{\dow@parright}} %%Left square bracket \newcommand{\top@sqbraleft@txt}{--} \newcommand{\mid@sqbraleft@txt}{\@print@u{X7C}\@nbsp} \newcommand{\dow@sqbraleft@txt}{--} \DeclareSymbolHtml[\top@sqbraleft@txt]{\top@sqbraleft}{X23A1} \DeclareSymbolHtml[\mid@sqbraleft@txt]{\mid@sqbraleft}{X23A2} \DeclareSymbolHtml[\dow@sqbraleft@txt]{\dow@sqbraleft}{X23A3} \newcommand{\csname\delim@name{[}\endcsname}[1] {\process@delim@three{#1}{\top@sqbraleft}{\mid@sqbraleft}{\dow@sqbraleft}} %%Right square bracket \newcommand{\top@sqbraright@txt}{--} \newcommand{\mid@sqbraright@txt}{\@nbsp\@print@u{X7C}} \newcommand{\dow@sqbraright@txt}{--} \DeclareSymbolHtml[\top@sqbraright@txt]{\top@sqbraright}{X23A4} \DeclareSymbolHtml[\mid@sqbraright@txt]{\mid@sqbraright}{X23A5} \DeclareSymbolHtml[\dow@sqbraright@txt]{\dow@sqbraright}{X23A6} \newcommand{\csname\delim@name{]}\endcsname}[1] {\process@delim@three{#1}{\top@sqbraright}{\mid@sqbraright}{\dow@sqbraright}} %%Left ceil \DeclareSymbolHtml[\mbox{lceil}]{\lceil}{X2308} \newcommand{\csname\delim@name{\lceil}\endcsname}[1] {\process@delim@top{#1}{\top@sqbraleft}{\mid@sqbraleft}} %%Left floor \DeclareSymbolHtml[\mbox{lfloor}]{\lfloor}{X230A} \newcommand{\csname\delim@name{\lfloor}\endcsname}[1] {\process@delim@dow{#1}{\mid@sqbraleft}{\dow@sqbraleft}} %%Right ceil \DeclareSymbolHtml[\mbox{rceil}]{\rceil}{X2309} \newcommand{\csname\delim@name{\rceil}\endcsname}[1] {\process@delim@top{#1}{\top@sqbraright}{\mid@sqbraright}} %%Right floor \DeclareSymbolHtml[\mbox{rfloor}]{\rfloor}{X230B} \newcommand{\csname\delim@name{\rfloor}\endcsname}[1] {\process@delim@dow{#1}{\mid@sqbraright}{\dow@sqbraright}} %%Left curly bracket \newcommand{\curlybra@ext@txt}{\@print@u{X7C}} \newcommand{\leftcurlybra@ext@txt}{\@nbsp\@print@u{X7C}\@nbsp} \newcommand{\leftcurlybra@top@txt}{\@nbsp\@print@u{X2F}\@nbsp} \newcommand{\leftcurlybra@mid@txt}{<\@nbsp} \newcommand{\leftcurlybra@dow@txt}{\@nbsp\@print@u{X5C}\@nbsp} \DeclareSymbolHtml[\curlybra@ext@txt]{\curlybra@ext}{X23AA} \DeclareSymbolHtml[\leftcurlybra@ext@txt]{\leftcurlybra@ext}{X23AA} \DeclareSymbolHtml[\leftcurlybra@top@txt]{\leftcurlybra@top}{X23A7} \DeclareSymbolHtml[\leftcurlybra@mid@txt]{\leftcurlybra@mid}{X23A8} \DeclareSymbolHtml[\leftcurlybra@dow@txt]{\leftcurlybra@dow}{X23A9} \newcommand{\csname\delim@name{\{}\endcsname}[1] {\process@delim@four{#1} {\leftcurlybra@ext}{\leftcurlybra@top}{\leftcurlybra@mid}{\leftcurlybra@dow}} %%Right curly bracket \newcommand{\rightcurlybra@ext@txt}{\@nbsp\@print@u{X7C}} \newcommand{\rightcurlybra@top@txt}{\@nbsp\@print@u{X5C}} \newcommand{\rightcurlybra@mid@txt}{\@nbsp>} \newcommand{\rightcurlybra@dow@txt}{\@nbsp\@print@u{X2F}} \DeclareSymbolHtml[\rightcurlybra@ext@txt]{\rightcurlybra@ext}{X23AA} \DeclareSymbolHtml[\rightcurlybra@top@txt]{\rightcurlybra@top}{X23AB} \DeclareSymbolHtml[\rightcurlybra@mid@txt]{\rightcurlybra@mid}{X23AC} \DeclareSymbolHtml[\rightcurlybra@dow@txt]{\rightcurlybra@dow}{X23AD} \newcommand{\csname\delim@name{\}}\endcsname}[1] {\process@delim@four{#1} {\rightcurlybra@ext}{\rightcurlybra@top} {\rightcurlybra@mid}{\rightcurlybra@dow}} %%Arrows \DeclareSymbolHtml[|]{\arr@mid}{X23AA}%curly bracket extension \newcommand{\csname\delim@name{\uparrow}\endcsname}[1] {\process@delim@top{#1}{\uparrow}{\arr@mid}} \newcommand{\csname\delim@name{\downarrow}\endcsname}[1] {\process@delim@dow{#1}{\arr@mid}{\downarrow}} \newcommand{\csname\delim@name{\updownarrow}\endcsname}[1] {\process@delim@three{#1}{\uparrow}{\arr@mid}{\downarrow}} %%Arrows \DeclareSymbolHtml[||]{\Arr@mid}{X2225} \newcommand{\csname\delim@name{\Uparrow}\endcsname}[1] {\process@delim@top{#1}{\Uparrow}{\Arr@mid}} \newcommand{\csname\delim@name{\Downarrow}\endcsname}[1] {\process@delim@dow{#1}{\Arr@mid}{\Downarrow}} \newcommand{\csname\delim@name{\Updownarrow}\endcsname}[1] {\process@delim@three{#1}{\Uparrow}{\Arr@mid}{\Downarrow}} %%Those get replicated in \left\right \DeclareSymbolHtml[\mbox{}]{\rangle}{X27E9} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Large Delimiters (Table 113) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \DeclareSymbolHtml{\lmoustache}{X23B0}%does noyt really exist in latex... \newcommand{\lmous@top@txt}{\@print@u{X2F}\@nbsp} \newcommand{\lmous@mid@txt}{\@print@u{X7C}\@nbsp} \newcommand{\lmous@dow@txt}{\@print@u{X2F}\@nbsp} \DeclareSymbolHtml[\lmous@top@txt]{\lmous@top}{X23A7} \DeclareSymbolHtml[\lmous@mid@txt]{\lmous@mid}{X23AA} \DeclareSymbolHtml[\lmous@dow@txt]{\lmous@dow}{X23AD} \newcommand{\csname\delim@name{\lmoustache}\endcsname}[1] {\process@delim@three{#1} {\lmous@top}{\lmous@mid}{\lmous@dow}} \DeclareSymbolHtml{\rmoustache}{X23B1}%does noyt really exist in latex... \newcommand{\rmous@top@txt}{\@nbsp\@print@u{X5C}} \newcommand{\rmous@mid@txt}{\@nbsp\@print@u{X7C}} \newcommand{\rmous@dow@txt}{\@nbsp\@print@u{X5C}} \DeclareSymbolHtml[\rmous@top@txt]{\rmous@top}{X23AB} \DeclareSymbolHtml[\rmous@mid@txt]{\rmous@mid}{X23AA} \DeclareSymbolHtml[\rmous@dow@txt]{\rmous@dow}{X23A9} \newcommand{\csname\delim@name{\rmoustache}\endcsname}[1] {\process@delim@three{#1} {\rmous@top}{\rmous@mid}{\rmous@dow}} \newcommand{\lgroup}{(} \newcommand{\csname\delim@name\lgroup\endcsname}[1] {\process@delim@three{#1}{\top@parleft}{\mid@parleft}{\dow@parleft}} \newcommand{\rgroup}{)} \newcommand{\csname\delim@name\rgroup\endcsname}[1] {\process@delim@three{#1}{\top@parright}{\mid@parright}{\dow@parright}} \newcommand{\arrowvert}{|} \@Let\Arrowvert\Vert \newcommand{\bracevert}{\textbf{|}} \newcommand{\csname\delim@name{\arrowvert}\endcsname}[1] {\process@delim@one{#1}{\mid@vert}} \newcommand{\csname\delim@name{\Arrowvert}\endcsname}[1] {\process@delim@one{#1}{\mid@Vert}} \newcommand{\csname\delim@name{\bracevert}\endcsname}[1] {\process@delim@one{#1}{\textbf{\mid@vert}}} %%%%%%%%%%%%%%%%%%%%% % Explicit \big etc.% %%%%%%%%%%%%%%%%%%%%% \NewcommandHtml{\@big}[1] {\@itemdisplay\process@delim{#1}{2}\@itemdisplay\int@sup@sub{2}} \NewcommandHtml{\@@big}[1]{\hva@warn{\big in text mode}#1} \NewcommandHtml{\big}{\DisplayChoose\@big\@@big} \NewcommandHtml{\@Big}[1] {\@itemdisplay\process@delim{#1}{3}\@itemdisplay\int@sup@sub{3}} \NewcommandHtml{\@@Big}[1]{\hva@warn{\Big in text mode}#1} \NewcommandHtml{\Big}{\DisplayChoose\@Big\@@Big} \NewcommandHtml{\@bigg}[1] {\@itemdisplay\process@delim{#1}{4}\@itemdisplay\int@sup@sub{4}} \NewcommandHtml{\@@bigg}[1]{\hva@warn{\bigg in text mode}#1} \NewcommandHtml{\bigg}{\DisplayChoose\@bigg\@@bigg} \NewcommandHtml{\@Bigg}[1] {\@itemdisplay\process@delim{#1}{5}\@itemdisplay\int@sup@sub{5}} \NewcommandHtml{\@@Bigg}[1]{\hva@warn{\Bigg in text mode}#1} \NewcommandHtml{\Bigg}{\DisplayChoose\@Bigg\@@Bigg} \@Let\bigl\big\@Let\bigm\big\@Let\bigr\big \@Let\Bigl\Big\@Let\Bigm\Big\@Let\Bigr\Big \@Let\biggl\bigg\@Let\biggm\bigg\@Let\biggr\bigg \@Let\Biggl\Bigg\@Let\Biggm\Bigg\@Let\Biggr\Bigg %%%%%%%%%%%%%%% % Square root % %%%%%%%%%%%%%%% \newcounter{@c} \NewcommandHtml{\@surd}[2] {\ifthenelse{#1 < 5}{{\Large#2}} {\setcounter{@c}{(#1-5)*2}% \@open{TABLE}{style="border-spacing:0" class="cellpadding0"}% \@open{TR}{}\@open{TD}{ALIGN="right"}% \@open{DIV}{CLASS="vbar" STYLE="height:\arabic{@c}em;"}\@force{DIV}% \@close{TD}\@close{TR}% \@open{TR}{}\@open{TD}{}% {\Huge#2}% \@close{TD}\@close{TR}\@close{TABLE}}} \NewcommandHtml{\csname\delim@name{\surd}\endcsname}[1]{\@surd{#1}{\surd}} \DeclareSymbolHtml{\surd@four}{X221C} \NewcommandHtml{\csname\delim@name{\surd@four}\endcsname}[1] {\@surd{#1}{\surd@four}} \DeclareSymbolHtml{\surd@three}{X221B} \NewcommandHtml{\csname\delim@name{\surd@three}\endcsname}[1] {\@surd{#1}{\surd@three}} \NewcommandHtml{\@sqrt}[2][2] {\ifthenelse{\equal{#1}{2}}{\left\surd\overline{#2}\right.}{% \ifthenelse{\equal{#1}{3}}{\left\surd@three\overline{#2}\right.}{% \ifthenelse{\equal{#1}{4}}{\left\surd@four\overline{#2}\right.}{% {\left(#2\right)^{\frac{1}{#1}}}}}}} \NewcommandHtml{\@@sqrt}[2][2] {\ifthenelse{\equal{#1}{2}}{\surd\overlinedbox{#2}}{% \ifthenelse{\equal{#1}{3}}{\surd@three\overlinedbox{#2}}{% \ifthenelse{\equal{#1}{4}}{\surd@four\overlinedbox{#2}}{% {(#2)^{\frac{1}{#1}}}}}}} \NewcommandHtml{\sqrt}{\DisplayChoose\@sqrt\@@sqrt} \NewcommandText{\sqrt}[2][2]{\left(#2\right)^{1/#1}} %%%%%%%%%%%%%%%%%%%%% % Negated relations % %%%%%%%%%%%%%%%%%%%%% % Table 8, p. 436 in TeX book \newcommand{\not@name}[1]{\string{#1@not}} \newcommand{\DeclareNot}[3][\@empty] {\ifu\csname\not@name{#2}\endcsname \DeclareSymbolHtml[\mbox{\neg(#2)}]{\csname\not@name{#2}\endcsname}{#3}\fi} \newcommand{\not}[1] {\@ifundefined{\not@name{#1}} {\hva@warn{Cannot apply '\not' to '#1'}\neg{}#1}% {\csname\not@name{#1}\endcsname}} %% \DeclareSymbolHtml[\mbox{notin}]{\notin}{X2209} \DeclareNot[\mbox{notin}]{\in}{X2209} %% \DeclareNot{<}{X226E} \DeclareNot{>}{X226F} \DeclareNot{=}{X2260} \DeclareNot{\leq}{X2270} \DeclareNot{\geq}{X2271} \DeclareNot{\equiv}{X2262} \DeclareNot{\prec}{X2280} \DeclareNot{\succ}{X2281} \DeclareNot{\sim}{X2241} \DeclareNot{\preceq}{X22E0} \DeclareNot{\succeq}{X22E1} \DeclareNot{\simeq}{X2244} \DeclareNot{\subset}{X2284} \DeclareNot{\supset}{X2285} \DeclareNot{\approx}{X2249} \DeclareNot{\subseteq}{X2288} \DeclareNot{\supseteq}{X2289} \DeclareNot{\cong}{X2247} \DeclareNot{\sqsubseteq}{X22E2} \DeclareNot{\sqsupseteq}{X22E3} \DeclareNot{\asymp}{X226D} \DeclareNot{\ni}{X220C} \DeclareNot{\vdash}{X22AC} \DeclareNot{\Leftarrow}{X21CD} \DeclareNot{\leftarrow}{X219A} \DeclareNot{\Leftrightarrow}{X21CE} \DeclareNot{\leftrightarrow}{X21AE} \DeclareNot{\rightarrow}{X219B} \DeclareNot{\Rightarrow}{X21CF} \DeclareNot{\exists}{X2204} \DeclareNot{\mid}{X2224} \DeclareNot{\parallel}{X2226} \DeclareNot{\models}{X22AD} %%%%%%%%%%%%%%%%%% % TeX synomyms % %%%%%%%%%%%%%%%%%% \@Let\le\leq \@Let\ge\geq \@Let\ne\neq \@Let\to\rightarrow \@Let\land\wedge \newcommand{\iff}{\;\Longleftrightarrow\;} \@Let\gets\leftarrow \@Let\lor\vee \@Let\owns\ni \@Let\lnot\neg %%%%%%%%%%%%%%%%%%%% %Needed internally % %%%%%%%%%%%%%%%%%%%% hevea-2.30/html.ml0000644004317100512160000004347612017700472014070 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* Output function for a strange html model : - Text elements can occur anywhere and are given as in latex - A new grouping construct is given (open_group () ; close_group ()) *) open Misc open HtmlCommon open Printf exception Error of string let addvsize x = flags.vsize <- flags.vsize + x (* Calls to other modules that are in the interface *) let over, erase_display, _begin_item_display, _end_item_display, force_item_display, item_display, do_close_display, do_open_display_varg, do_open_display, do_close_maths, do_open_maths, put_in_math, math_put, math_put_char, left, right = if !Parse_opts.mathml then begin MathML.over, MathML.erase_display, MathML.begin_item_display, MathML.end_item_display, MathML.force_item_display, MathML.item_display, MathML.close_display, MathML.open_display_varg, MathML.open_display, MathML.close_maths, MathML.open_maths, MathML.put_in_math, MathML.put, MathML.put_char, MathML.left, MathML.right end else begin HtmlMath.over, HtmlMath.erase_display, HtmlMath.begin_item_display, HtmlMath.end_item_display, HtmlMath.force_item_display, HtmlMath.item_display, (fun () -> HtmlMath.close_display false), (HtmlMath.open_display_varg false), (fun () -> HtmlMath.open_display false), HtmlMath.close_maths, HtmlMath.open_maths, HtmlMath.put_in_math, HtmlMath.put, HtmlMath.put_char, HtmlMath.left, HtmlMath.right end let int_sup_sub, limit_sup_sub, standard_sup_sub = if !Parse_opts.mathml then MathML.int_sup_sub, MathML.limit_sup_sub, MathML.standard_sup_sub else HtmlMath.int_sup_sub, HtmlMath.limit_sup_sub, HtmlMath.standard_sup_sub let set_out out = !cur_out.out <- out and stop () = MyStack.push stacks.s_active !cur_out.out ; !cur_out.out <- Out.create_null () and restart () = !cur_out.out <- MyStack.pop stacks.s_active (* acces to flags *) let is_empty () = flags.empty let put s = if flags.in_math then math_put s else HtmlCommon.put s let put_char c = if flags.in_math then math_put_char c else HtmlCommon.put_char c let put_unicode i = OutUnicode.html_put put put_char i let loc_name _ = () (* freeze everyting and change output file *) let open_chan chan = open_group "" ; !cur_out.out <- Out.create_chan chan let close_chan () = Out.close !cur_out.out ; !cur_out.out <- Out.create_buff () ; close_group () let to_style f = let old_flags = copy_flags flags in open_block INTERN "" ; (* clearstyle () ; *) f () ; let r = to_pending !cur_out.pending !cur_out.active in erase_block INTERN ; set_flags flags old_flags ; r let get_current_output () = Out.to_string !cur_out.out let finalize check = if check then begin check_stacks () end else begin (* Flush output in case of fatal error *) let rec close_rec () = if not (MyStack.empty out_stack) then begin match MyStack.pop out_stack with | Freeze _ -> close_rec () | Normal (_,_,pout) -> Out.copy !cur_out.out pout.out ; cur_out := pout ; close_rec () end in close_rec () end ; Out.close !cur_out.out ; !cur_out.out <- Out.create_null () let put_separator () = put "\n" let unskip () = Out.unskip !cur_out.out; if flags.blank then flags.empty <- true let put_tag tag = put tag let put_nbsp () = if !Lexstate.whitepre || (flags.in_math && !Parse_opts.mathml) then begin put_char ' ' end else put_unicode OutUnicode.nbsp let put_open_group () = put_char '{' let put_close_group () = put_char '}' let infomenu _ = () and infonode _opt _num _arg = () and infoextranode _num _arg _text = () let image arg n = if flags.in_pre && !Parse_opts.pedantic then begin warning "Image tag inside preformatted block, ignored" end else begin put " "" then begin put arg; put_char ' ' end ; put "src=\"" ; put n ; if !Parse_opts.pedantic then begin put "\" alt=\"" ; put n end ; put "\">" end type saved = HtmlCommon.saved let check = HtmlCommon.check and hot = HtmlCommon.hot let forget_par () = None let rec do_open_par () = match pblock () with | GROUP -> let pending = to_pending !cur_out.pending !cur_out.active in let a,b,_ = top_out out_stack in ignore (close_block_loc check_empty GROUP) ; do_open_par () ; open_block a b ; !cur_out.pending <- pending | P -> Misc.warning "Opening P twice" (* An error in fact ! *) | s -> if !verbose > 2 then Printf.eprintf "Opening par below: '%s'\n" (string_of_block s) ; open_block P "" let open_par () = do_open_par () let rec do_close_par () = match pblock () with | GROUP -> let pending = to_pending !cur_out.pending !cur_out.active in let a,b,_ = top_out out_stack in ignore (close_block_loc check_empty GROUP) ; let r = do_close_par () in open_block a b ; !cur_out.pending <- pending ; r | P -> ignore (close_flow_loc check_blank P) ; true | _ -> false let close_par () = do_close_par () (* Find P, maybe above groups *) let rec find_prev_par () = match pblock () with | P -> true | GROUP -> let x = pop_out out_stack in let r = find_prev_par () in push_out out_stack x ; r | _ -> false let rec do_close_prev_par () = match pblock () with | P -> ignore (close_flow_loc check_blank P) | GROUP -> let pending = to_pending !cur_out.pending !cur_out.active in let b,a,_ = top_out out_stack in ignore (close_block_loc check_empty GROUP) ; do_close_prev_par () ; open_block b a ; !cur_out.pending <- pending | _ -> assert false let close_prev_par () = do_close_prev_par () ; flags.saw_par <- true let rec do_par () = match pblock () with | P -> ignore (close_flow_loc check_blank P) ; open_block P "" | GROUP -> let pending = to_pending !cur_out.pending !cur_out.active in let b,a,_ = top_out out_stack in ignore (close_block_loc check_empty GROUP) ; do_par () ; open_block b a ; !cur_out.pending <- pending | s -> if !verbose > 2 then Printf.eprintf "Opening par below: '%s'\n" (string_of_block s) ; open_block P "" let par _ = do_par () (* Interface open block: manage par above *) let open_block_loc = open_block (* save a reference to basic open_block *) let open_block_with_par ss s a = if transmit_par s && find_prev_par () then begin if !verbose > 2 then begin Printf.eprintf "OPEN: %s, closing par\n" ss ; Printf.eprintf "BEFORE: " ; pretty_stack out_stack end ; close_prev_par () ; if !verbose > 2 then begin Printf.eprintf "AFTER: " ; pretty_stack out_stack end end ; open_block_loc s a let open_block ss a = open_block_with_par ss (find_block ss) a let open_display () = if find_prev_par () then begin close_prev_par () end ; do_open_display () and open_display_varg a = if find_prev_par () then begin close_prev_par () end ; do_open_display_varg a and close_display () = do_close_display () ; if flags.saw_par then begin flags.saw_par <- false ; open_par () end let open_maths display = if display && find_prev_par () then begin close_prev_par () end ; do_open_maths display and close_maths display = do_close_maths display ; if flags.saw_par then begin flags.saw_par <- false ; open_par () end let wrap_close close_block s = let s = find_block s in begin match s with GROUP -> () | _ -> ignore (close_par ()) end ; begin match s with | UL|OL -> if flags.nitems > 0 then close_block LI else warning "List with no item" | DL -> if flags.nitems > 0 then close_block DD else warning "List with no item" | _ -> () end ; close_block s ; if flags.saw_par then begin flags.saw_par <- false ; if !verbose > 2 then begin Misc.warning "RE-OPEN PAR:" ; Printf.eprintf "BEFORE: " ; pretty_stack out_stack end ; open_par () ; if !verbose > 2 then begin Printf.eprintf "AFTER: " ; pretty_stack out_stack end end let force_block_with_par s content = ignore (close_par ()) ; force_block s content and close_block_with_par s = ignore (close_par ()) ; close_block s and erase_block_with_par s = ignore (close_par ()) ; erase_block s and force_block s content = wrap_close (fun s -> force_block s content) s and close_block s = wrap_close close_block s and erase_block s = wrap_close erase_block s and close_flow s = prerr_endline ("FLOW: "^s) ; wrap_close close_flow s let skip_line = skip_line and flush_out = flush_out and close_group = close_group and open_aftergroup = open_aftergroup and open_group = open_group and insert_block s attr = if find_prev_par () then warning "Ignoring \\centering or \\ragged..." else insert_block (find_block s) attr and insert_attr s = insert_attr (find_block s) and erase_mods = erase_mods and open_mod = open_mod and has_mod = has_mod and clearstyle = clearstyle and nostyle = nostyle and get_fontsize = get_fontsize and to_string = to_string (****************************************) (* Table stuff, must take P into acount *) (****************************************) let open_table border htmlargs = let _,arg_b, arg = if flags.in_math && !Parse_opts.mathml then "mtable","frame = \"solid\"","" else "table","border=1",htmlargs in (* open_block will close P (and record that) if appropriate *) if border then open_block_with_par "table" TABLE (arg_b^" "^arg) else open_block_with_par "table" TABLE arg let new_row () = if flags.in_math && !Parse_opts.mathml then open_block_loc (OTHER "mtr") "" else open_block_loc TR "" let attribut name = function | "" -> "" | s -> " "^name^"="^s and as_colspan = function | 1 -> "" | n -> " colspan="^string_of_int n and as_colspan_mathml = function | 1 -> "" | n -> " columnspan= \""^string_of_int n^"\"" and style param value = if value = "" then "" else sprintf "%s:%s;" param value let as_align f span border = match f with Tabular.Align {Tabular.vert=v ; Tabular.hor=h ; Tabular.wrap=w ; Tabular.width=_} -> sprintf "style=\"%s%s%s%s\" %s" (style "vertical-align" v) (style "text-align" h) (if border then "border:solid 1px;" else "") (if w then "" else "white-space:nowrap") (as_colspan span) | _ -> raise (Misc.Fatal ("as_align")) let as_align_mathml f span = match f with Tabular.Align {Tabular.vert=v ; Tabular.hor=h } -> attribut "rowalign" ("\""^v^"\"")^ attribut "columnalign" ("\""^h^"\"")^ as_colspan_mathml span | _ -> raise (Misc.Fatal ("as_align_mathml")) let open_direct_cell attrs span = if flags.in_math && !Parse_opts.mathml then begin open_block_loc (OTHER "mtd") (attrs^as_colspan_mathml span); do_open_display () end else open_block_loc TD (attrs^as_colspan span) let open_cell format span _ border = if flags.in_math && !Parse_opts.mathml then begin open_block_loc (OTHER "mtd") (as_align_mathml format span); do_open_display () end else open_block_loc TD (as_align format span border) (* By contrast closing/erasing TD, may in some occasions implies closing some internal P => use wrapped close functions *) let erase_cell () = if flags.in_math && !Parse_opts.mathml then begin erase_display (); erase_block_with_par (OTHER "mtd") end else erase_block_with_par TD and close_cell content = if flags.in_math && !Parse_opts.mathml then begin do_close_display (); force_block_with_par (OTHER "mtd") "" end else force_block_with_par TD content and do_close_cell () = if flags.in_math && !Parse_opts.mathml then begin do_close_display (); close_block_with_par (OTHER "mtd") end else close_block_with_par TD and open_cell_group () = open_group "" and close_cell_group () = close_group () and erase_cell_group () = erase_group () let erase_row () = if flags.in_math && !Parse_opts.mathml then HtmlCommon.erase_block (OTHER "mtr") else HtmlCommon.erase_block TR and close_row () = if flags.in_math && !Parse_opts.mathml then HtmlCommon.close_block (OTHER "mtr") else HtmlCommon.close_block TR let close_table () = begin if flags.in_math && !Parse_opts.mathml then HtmlCommon.close_block (OTHER "mtable") else HtmlCommon.close_block TABLE end ; if flags.saw_par then begin flags.saw_par <- false ; open_par () end let make_border _ = () let inside_format = Tabular.Align {Tabular.hor="center" ; Tabular.vert = "" ; Tabular.wrap = false ; Tabular.pre = "" ; Tabular.post = "" ; Tabular.width = Length.Default} and hline_format = Tabular.Align {Tabular.hor="center" ; Tabular.vert = "top" ; Tabular.wrap = false ; Tabular.pre = "" ; Tabular.post = "" ; Tabular.width = Length.Default} let make_inside s multi = if not (multi) then begin if pblock ()=TD || pblock() = (OTHER "mtd") then begin close_cell " "; open_cell inside_format 1 0 false; put s; end else begin open_cell inside_format 1 0 false; put s; close_cell " " end; end let make_hline w noborder = if noborder then begin new_row (); if not (flags.in_math && !Parse_opts.mathml) then begin open_direct_cell "class=\"hbar\"" w ; close_cell "" end else begin open_cell hline_format w 0 false; close_mods () ; put ""; force_item_display (); close_cell "" end; close_row (); end (* HR is not correct inside P *) let horizontal_line attr width height = if find_prev_par () then begin close_prev_par () end ; horizontal_line attr width height ; if flags.saw_par then begin flags.saw_par <- false ; open_par () end (* Lists also have to take P into account *) let rec do_li s = match pblock () with | P -> let pend = to_pending !cur_out.pending !cur_out.active in ignore (close_flow_loc check_blank P) ; do_li s ; !cur_out.pending <- pend | LI -> ignore (close_flow_loc no_check LI) ; open_block_loc LI s | GROUP -> let pend = to_pending !cur_out.pending !cur_out.active in let a,b,_ = top_out out_stack in ignore (close_block_loc check_empty GROUP) ; do_li s ; open_block_loc a b ; !cur_out.pending <- pend | _ -> assert false let item s = if !verbose > 2 then begin prerr_string "=> item: stack=" ; pretty_stack out_stack end ; if flags.nitems > 0 then begin do_li s end else begin let saved = let pending = to_pending !cur_out.pending !cur_out.active in do_close_mods () ; ignore (close_par ()) ; (* in case some par opened before first \item *) let r = Out.to_string !cur_out.out in !cur_out.pending <- pending ; r in open_block_loc LI s ; do_put saved end ; if !verbose > 2 then begin prerr_string "<= item: stack=" ; pretty_stack out_stack end ; flags.nitems <- flags.nitems+1 let nitem = item and set_dcount s = flags.dcount <- s (*********************************************) (* s1 and s2 below are attributes to DR/DD *) (*********************************************) let emit_dt_dd scan true_scan arg s1 s2 = open_block_loc DT s1 ; if flags.dcount <> "" then scan ("\\refstepcounter{"^ flags.dcount^"}") ; true_scan ("\\makelabel{"^arg^"}") ; ignore (close_block_loc no_check DT) ; open_block_loc DD s2 let rec do_dt_dd scan true_scan arg s1 s2 = match pblock () with | P -> let pend = to_pending !cur_out.pending !cur_out.active in ignore (close_flow_loc check_blank P) ; do_dt_dd scan true_scan arg s1 s2 ; !cur_out.pending <- pend | DD -> ignore (close_flow_loc no_check DD) ; emit_dt_dd scan true_scan arg s1 s2 | GROUP -> let pend = to_pending !cur_out.pending !cur_out.active in let a,b,_ = top_out out_stack in ignore (close_block_loc check_empty GROUP) ; do_dt_dd scan true_scan arg s1 s2 ; open_block_loc a b ; !cur_out.pending <- pend | _ -> assert false let ditem scan arg s1 s2 = if !verbose > 2 then begin Printf.eprintf "=> DITEM: «%s» «%s» «%s»\n" arg s1 s2 ; prerr_string "ditem: stack=" ; pretty_stack out_stack end ; let true_scan = if flags.nitems = 0 then begin let pending = to_pending !cur_out.pending !cur_out.active in do_close_mods () ; ignore (close_par ()) ; (* in case some par opened before first \item *) let saved = Out.to_string !cur_out.out in !cur_out.pending <- pending ; (fun arg -> do_put saved ; scan arg) end else scan in begin if flags.nitems > 0 then do_dt_dd scan true_scan arg s1 s2 else emit_dt_dd scan true_scan arg s1 s2 end ; flags.nitems <- flags.nitems+1 ; if !verbose > 2 then begin Printf.eprintf "<= DITEM: «%s» «%s» «%s»\n" arg s1 s2 ; prerr_string "ditem: stack=" ; pretty_stack out_stack end ; hevea-2.30/multibib.hva0000644004317100512160000000111610563036154015065 0ustar marangetcristal\newcommand{\@readmultbib}[1] {\@stopoutput\@stopimage% \ifthenelse{\@fileexists{#1.aux} \and \not \boolean{fixpoint}} {\@try{\@readaux{#1}}{\hva@warn{Failure while reading #1.aux, multibib not available}}} {}% \@restartoutput\@restartimage} \newcommand{\newcites}[2]{% \let{\csname cite#1\endcsname}\cite% \let{\csname nocite#1\endcsname}\nocite% \let{\csname bibliographystyle#1\endcsname}\bibliographystyle% \def\csname refname#1\endcsname{#2}% \def\csname bibliography#1\endcsname##1{{\def\refname{\csname refname#1\endcsname}\input{#1.bbl}}}% \AtBeginDocument{\@readmultbib{#1}}% }hevea-2.30/outUnicode.ml0000644004317100512160000004463512401623123015232 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet MOSCOVA, INRIA Rocquencourt *) (* *) (* Copyright 2006 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) type unichar = int (* 31 bits, well *) let show x = Printf.sprintf "U+%04X" x exception Failed of string let bad_char c = raise (Failed (Printf.sprintf "Bad character in unicode entity: %c" c)) let rec parse10 len str i r = if i < len then let c = match str.[i] with | '0' -> 0 | '1' -> 1 | '2' -> 2 | '3' -> 3 | '4' -> 4 | '5' -> 5 | '6' -> 6 | '7' -> 7 | '8' -> 8 | '9' -> 9 | c -> bad_char c in parse10 len str (i+1) (10*r+c) else r let rec parse16 len str i r = if i < len then let c = match str.[i] with | '0' -> 0 | '1' -> 1 | '2' -> 2 | '3' -> 3 | '4' -> 4 | '5' -> 5 | '6' -> 6 | '7' -> 7 | '8' -> 8 | '9' -> 9 | 'a'|'A' -> 10 | 'b'|'B' -> 11 | 'c'|'C' -> 12 | 'd'|'D' -> 13 | 'e'|'E' -> 14 | 'f'|'F' -> 15 | c -> bad_char c in parse16 len str (i+1) (16*r+c) else r let do_parse str = let len = String.length str in if len = 0 then begin raise (Failed "Cannot parse unicode entity: empty") end else match str.[0] with | 'X'|'x' -> parse16 len str 1 0 | '0'..'9' -> parse10 len str 0 0 | c -> bad_char c let parse str = try do_parse str with Failed msg -> Misc.warning msg ; 0 exception CannotTranslate let translate_ascii_out i put = if i < 128 then put (Char.unsafe_chr i) else raise CannotTranslate and translate_ascii_in c _ = let i = Char.code c in if i < 128 then i else raise CannotTranslate let translate_latin1_out i put = if i < 256 then put (Char.unsafe_chr i) else raise CannotTranslate and translate_latin1_in c _ = Char.code c let cannot () = raise CannotTranslate let translate_utf8_in c next = match c with | '\000'..'\127' -> Char.code c | '\128'..'\223' -> let n1 = Char.code c in let n2 = next () in if n2 < 128 || n2 > 191 then cannot () ; let p = ((n1 land 0b11111) lsl 6) lor (n2 land 0b111111) in if p < 128 then cannot () ; p | '\224'..'\239' -> let n1 = Char.code c in let n2 = next () in let n3 = next () in if n2 < 128 || n2 > 191 then cannot(); if n3 < 128 || n3 > 191 then cannot(); let p = ((n1 land 0b1111) lsl 12) lor ((n2 land 0b111111) lsl 6) lor (n3 land 0b111111) in if p < 0x800 then cannot(); if (p >= 0xd800 && p < 0xe000) then (* Surrogate pairs are not supported in UTF-8 *) cannot(); if (p >= 0xfffe && p <= 0xffff) then cannot(); p | '\240'..'\247' -> let n1 = Char.code c in let n2 = next () in let n3 = next () in let n4 = next () in if n2 < 128 || n2 > 191 then cannot(); if n3 < 128 || n3 > 191 then cannot(); if n4 < 128 || n4 > 191 then cannot(); let p = ((n1 land 0b111) lsl 18) lor ((n2 land 0b111111) lsl 12) lor ((n3 land 0b111111) lsl 6) lor (n4 land 0b111111) in if p < 0x10000 then cannot (); if p >= 0x110000 then cannot(); (* These code points are not supported. *) p | _ -> cannot () and translate_utf8_out p put = if p <= 127 then put (Char.unsafe_chr p) else if p <= 0x7ff then begin put (Char.unsafe_chr (0xc0 lor (p lsr 6))) ; put (Char.unsafe_chr (0x80 lor (p land 0x3f))) end else if p <= 0xffff then begin put (Char.unsafe_chr (0xe0 lor (p lsr 12))); put (Char.unsafe_chr (0x80 lor ((p lsr 6) land 0x3f))); put (Char.unsafe_chr (0x80 lor (p land 0x3f))) end else begin (* No such characters are defined... *) put (Char.chr (0xf0 lor (p lsr 18))); put (Char.chr (0x80 lor ((p lsr 12) land 0x3f))) ; put (Char.chr (0x80 lor ((p lsr 6) land 0x3f))) ; put (Char.chr (0x80 lor (p land 0x3f))) ; end let translate_out_fun = ref translate_ascii_out and translate_in_fun = ref translate_ascii_in let make_out_translator ps = let t = Hashtbl.create 101 in List.iter (fun (iso, uni) -> Hashtbl.add t uni (Char.chr iso)) ps ; (fun i put -> try put (Hashtbl.find t i) with Not_found -> raise CannotTranslate) and make_in_translator ps = let t = Array.make 256 0 in List.iter (fun (iso, uni) -> t.(iso) <- uni) ps ; (fun c _ -> t.(Char.code c)) let read_mapping name chan = let t = ref [] and scanbuf = Scanf.Scanning.from_channel chan in try while true do Scanf.bscanf scanbuf " %i %i" (fun iso uni -> t := (iso,uni) :: !t) ; done ; !t with | End_of_file -> !t | Sys_error msg -> Misc.warning (Printf.sprintf "Error '%s' while loading mapping: %s\n" msg name) ; raise (Misc.Fatal "Mapping") let open_mapping name = try let real_name = Myfiles.find name in open_in real_name with | Not_found -> Misc.warning (Printf.sprintf "Cannot find mapping: %s\n" name) ; raise (Misc.Fatal "Mapping") | Sys_error msg -> Misc.warning (Printf.sprintf "Error '%s' while opening mapping: %s\n" msg name) ; raise (Misc.Fatal "Mapping") and close_mapping chan = try close_in chan with _ -> () let set_output_translator name = let key = Filename.basename name in match key with | "ISO-8859-1.map" -> translate_out_fun := translate_latin1_out | "US-ASCII.map" -> translate_out_fun := translate_ascii_out | "UTF-8.map" -> translate_out_fun := translate_utf8_out | _ -> let chan = open_mapping name in let ps = read_mapping name chan in close_mapping chan ; translate_out_fun := make_out_translator ps and set_input_translator name = let key = Filename.basename name in match key with | "ISO-8859-1.map" -> translate_in_fun := translate_latin1_in | "US-ASCII.map" -> translate_in_fun := translate_ascii_in | "UTF-8.map" -> translate_in_fun := translate_utf8_in | _ -> let chan = open_mapping name in let ps = read_mapping name chan in close_mapping chan ; translate_in_fun := make_in_translator ps and set_translators name = let key = Filename.basename name in match key with | "ISO-8859-1.map" -> translate_out_fun := translate_latin1_out ; translate_in_fun := translate_latin1_in | "US-ASCII.map" -> translate_out_fun := translate_ascii_out ; translate_in_fun := translate_ascii_in | "UTF-8.map" -> translate_out_fun := translate_utf8_out ; translate_in_fun := translate_utf8_in | _ -> let chan = open_mapping name in let ps = read_mapping name chan in close_mapping chan ; translate_out_fun := make_out_translator ps ; translate_in_fun := make_in_translator ps let translate_out i = !translate_out_fun i and translate_in c (next:unit -> int) = !translate_in_fun c next (* Diacritical marks *) (* Tables from ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859 Mapping from NAME LIST of the www.unicode.org site. Got functions by: egrep 'WITH GRAVE$' NamesList.txt | grep LATIN | awk -f a.awk Where a.awk is /SMALL/ { printf ("| '%s' -> 0x%s\n", tolower($5), $1) } /CAPITAL/ { printf ("| '%s' -> 0x%s\n", $5, $1) } *) let grave = function | 'A' -> 0x00C0 | 'E' -> 0x00C8 | 'I' -> 0x00CC | 'O' -> 0x00D2 | 'U' -> 0x00D9 | 'a' -> 0x00E0 | 'e' -> 0x00E8 | 'i' -> 0x00EC | 'o' -> 0x00F2 | 'u' -> 0x00F9 | 'N' -> 0x01F8 | 'n' -> 0x01F9 | 'W' -> 0x1E80 | 'w' -> 0x1E81 | 'Y' -> 0x1EF2 | 'y' -> 0x1EF3 | _ -> raise CannotTranslate and acute = function | 'A' -> 0x00C1 | 'E' -> 0x00C9 | 'I' -> 0x00CD | 'O' -> 0x00D3 | 'U' -> 0x00DA | 'Y' -> 0x00DD | 'a' -> 0x00E1 | 'e' -> 0x00E9 | 'i' -> 0x00ED | 'o' -> 0x00F3 | 'u' -> 0x00FA | 'y' -> 0x00FD | 'C' -> 0x0106 | 'c' -> 0x0107 | 'L' -> 0x0139 | 'l' -> 0x013A | 'N' -> 0x0143 | 'n' -> 0x0144 | 'R' -> 0x0154 | 'r' -> 0x0155 | 'S' -> 0x015A | 's' -> 0x015B | 'Z' -> 0x0179 | 'z' -> 0x017A | 'G' -> 0x01F4 | 'g' -> 0x01F5 | 'K' -> 0x1E30 | 'k' -> 0x1E31 | 'M' -> 0x1E3E | 'm' -> 0x1E3F | 'P' -> 0x1E54 | 'p' -> 0x1E55 | 'W' -> 0x1E82 | 'w' -> 0x1E83 | _ -> raise CannotTranslate and circumflex = function | 'A' -> 0x00C2 | 'E' -> 0x00CA | 'I' -> 0x00CE | 'O' -> 0x00D4 | 'U' -> 0x00DB | 'a' -> 0x00E2 | 'e' -> 0x00EA | 'i' -> 0x00EE | 'o' -> 0x00F4 | 'u' -> 0x00FB | 'C' -> 0x0108 | 'c' -> 0x0109 | 'G' -> 0x011C | 'g' -> 0x011D | 'H' -> 0x0124 | 'h' -> 0x0125 | 'J' -> 0x0134 | 'j' -> 0x0135 | 'S' -> 0x015C | 's' -> 0x015D | 'W' -> 0x0174 | 'w' -> 0x0175 | 'Y' -> 0x0176 | 'y' -> 0x0177 | 'Z' -> 0x1E90 | 'z' -> 0x1E91 | _ -> raise CannotTranslate and tilde = function | 'A' -> 0x00C3 | 'N' -> 0x00D1 | 'O' -> 0x00D5 | 'a' -> 0x00E3 | 'n' -> 0x00F1 | 'o' -> 0x00F5 | 'I' -> 0x0128 | 'i' -> 0x0129 | 'U' -> 0x0168 | 'u' -> 0x0169 | 'V' -> 0x1E7C | 'v' -> 0x1E7D | 'E' -> 0x1EBC | 'e' -> 0x1EBD | 'Y' -> 0x1EF8 | 'y' -> 0x1EF9 | _ -> raise CannotTranslate and diaeresis = function | 'A' -> 0x00C4 | 'E' -> 0x00CB | 'I' -> 0x00CF | 'O' -> 0x00D6 | 'U' -> 0x00DC | 'a' -> 0x00E4 | 'e' -> 0x00EB | 'i' -> 0x00EF | 'o' -> 0x00F6 | 'u' -> 0x00FC | 'y' -> 0x00FF | 'Y' -> 0x0178 | 'H' -> 0x1E26 | 'h' -> 0x1E27 | 'W' -> 0x1E84 | 'w' -> 0x1E85 | 'X' -> 0x1E8C | 'x' -> 0x1E8D | 't' -> 0x1E97 | _ -> raise CannotTranslate and ring = function | 'A' -> 0x00C5 | 'a' -> 0x00E5 | 'U' -> 0x016E | 'u' -> 0x016F | 'w' -> 0x1E98 | 'y' -> 0x1E99 | _ -> raise CannotTranslate and cedilla = function | 'C' -> 0x00C7 | 'c' -> 0x00E7 | 'G' -> 0x0122 | 'g' -> 0x0123 | 'K' -> 0x0136 | 'k' -> 0x0137 | 'L' -> 0x013B | 'l' -> 0x013C | 'N' -> 0x0145 | 'n' -> 0x0146 | 'R' -> 0x0156 | 'r' -> 0x0157 | 'S' -> 0x015E | 's' -> 0x015F | 'T' -> 0x0162 | 't' -> 0x0163 | 'E' -> 0x0228 | 'e' -> 0x0229 | 'D' -> 0x1E10 | 'd' -> 0x1E11 | 'H' -> 0x1E28 | 'h' -> 0x1E29 | _ -> raise CannotTranslate and stroke = function | 'O' -> 0x00D8 | 'o' -> 0x00F8 | 'D' -> 0x0110 | 'd' -> 0x0111 | 'H' -> 0x0126 | 'h' -> 0x0127 | 'L' -> 0x0141 | 'l' -> 0x0142 | 'T' -> 0x0166 | 't' -> 0x0167 | 'b' -> 0x0180 | 'I' -> 0x0197 | 'Z' -> 0x01B5 | 'z' -> 0x01B6 | 'G' -> 0x01E4 | 'g' -> 0x01E5 | 'A' -> 0x023A | 'C' -> 0x023B | 'c' -> 0x023C | 'i' -> 0x0268 | 'p' -> 0x1D7D | _ -> raise CannotTranslate and macron = function | 'A' -> 0x0100 | 'a' -> 0x0101 | 'E' -> 0x0112 | 'e' -> 0x0113 | 'I' -> 0x012A | 'i' -> 0x012B | 'O' -> 0x014C | 'o' -> 0x014D | 'U' -> 0x016A | 'u' -> 0x016B (* Aie | 'AE' -> 0x01E2 | 'ae' -> 0x01E3 *) | 'Y' -> 0x0232 | 'y' -> 0x0233 | 'G' -> 0x1E20 | 'g' -> 0x1E21 | _ -> raise CannotTranslate and caron = function | 'C' -> 0x010C | 'c' -> 0x010D | 'D' -> 0x010E | 'd' -> 0x010F | 'E' -> 0x011A | 'e' -> 0x011B | 'L' -> 0x013D | 'l' -> 0x013E | 'N' -> 0x0147 | 'n' -> 0x0148 | 'R' -> 0x0158 | 'r' -> 0x0159 | 'S' -> 0x0160 | 's' -> 0x0161 | 'T' -> 0x0164 | 't' -> 0x0165 | 'Z' -> 0x017D | 'z' -> 0x017E (* | 'DZ' -> 0x01C4 | 'dz' -> 0x01C6 *) | 'A' -> 0x01CD | 'a' -> 0x01CE | 'I' -> 0x01CF | 'i' -> 0x01D0 | 'O' -> 0x01D1 | 'o' -> 0x01D2 | 'U' -> 0x01D3 | 'u' -> 0x01D4 | 'G' -> 0x01E6 | 'g' -> 0x01E7 | 'K' -> 0x01E8 | 'k' -> 0x01E9 (*Aie | 'EZH' -> 0x01EE | 'ezh' -> 0x01EF *) | 'j' -> 0x01F0 | 'H' -> 0x021E | 'h' -> 0x021F | _ -> raise CannotTranslate and doubleacute = function | 'O' -> 0x0150 | 'o' -> 0x0151 | 'U' -> 0x0170 | 'u' -> 0x0171 | _ -> raise CannotTranslate and doublegrave = function | 'A' -> 0x0200 | 'a' -> 0x0201 | 'E' -> 0x0204 | 'e' -> 0x0205 | 'I' -> 0x0208 | 'i' -> 0x0209 | 'O' -> 0x020C | 'o' -> 0x020D | 'R' -> 0x0210 | 'r' -> 0x0211 | 'U' -> 0x0214 | 'u' -> 0x0215 | _ -> raise CannotTranslate and breve = function | 'A' -> 0x0102 | 'a' -> 0x0103 | 'E' -> 0x0114 | 'e' -> 0x0115 | 'G' -> 0x011E | 'g' -> 0x011F | 'I' -> 0x012C | 'i' -> 0x012D | 'O' -> 0x014E | 'o' -> 0x014F | 'U' -> 0x016C | 'u' -> 0x016D | 'H' -> 0x1E2A | 'h' -> 0x1E2B | _ -> raise CannotTranslate and dotabove = function | 'C' -> 0x010A | 'c' -> 0x010B | 'E' -> 0x0116 | 'e' -> 0x0117 | 'G' -> 0x0120 | 'g' -> 0x0121 | 'I' -> 0x0130 | 'i' -> 0x69 | 'Z' -> 0x017B | 'z' -> 0x017C | 'A' -> 0x0226 | 'a' -> 0x0227 | 'O' -> 0x022E | 'o' -> 0x022F | 'B' -> 0x1E02 | 'b' -> 0x1E03 | 'D' -> 0x1E0A | 'd' -> 0x1E0B | 'F' -> 0x1E1E | 'f' -> 0x1E1F | 'H' -> 0x1E22 | 'h' -> 0x1E23 | 'M' -> 0x1E40 | 'm' -> 0x1E41 | 'N' -> 0x1E44 | 'n' -> 0x1E45 | 'P' -> 0x1E56 | 'p' -> 0x1E57 | 'R' -> 0x1E58 | 'r' -> 0x1E59 | 'S' -> 0x1E60 | 's' -> 0x1E61 | 'T' -> 0x1E6A | 't' -> 0x1E6B | 'W' -> 0x1E86 | 'w' -> 0x1E87 | 'X' -> 0x1E8A | 'x' -> 0x1E8B | 'Y' -> 0x1E8E | 'y' -> 0x1E8F | _ -> raise CannotTranslate and dotbelow = function | 'B' -> 0x1E04 | 'b' -> 0x1E05 | 'D' -> 0x1E0C | 'd' -> 0x1E0D | 'H' -> 0x1E24 | 'h' -> 0x1E25 | 'K' -> 0x1E32 | 'k' -> 0x1E33 | 'L' -> 0x1E36 | 'l' -> 0x1E37 | 'M' -> 0x1E42 | 'm' -> 0x1E43 | 'N' -> 0x1E46 | 'n' -> 0x1E47 | 'R' -> 0x1E5A | 'r' -> 0x1E5B | 'S' -> 0x1E62 | 's' -> 0x1E63 | 'T' -> 0x1E6C | 't' -> 0x1E6D | 'V' -> 0x1E7E | 'v' -> 0x1E7F | 'W' -> 0x1E88 | 'w' -> 0x1E89 | 'Z' -> 0x1E92 | 'z' -> 0x1E93 | 'A' -> 0x1EA0 | 'a' -> 0x1EA1 | 'E' -> 0x1EB8 | 'e' -> 0x1EB9 | 'I' -> 0x1ECA | 'i' -> 0x1ECB | 'O' -> 0x1ECC | 'o' -> 0x1ECD | 'U' -> 0x1EE4 | 'u' -> 0x1EE5 | 'Y' -> 0x1EF4 | 'y' -> 0x1EF5 | _ -> raise CannotTranslate and linebelow = function | 'B' -> 0x1E06 | 'b' -> 0x1E07 | 'D' -> 0x1E0E | 'd' -> 0x1E0F | 'K' -> 0x1E34 | 'k' -> 0x1E35 | 'L' -> 0x1E3A | 'l' -> 0x1E3B | 'N' -> 0x1E48 | 'n' -> 0x1E49 | 'R' -> 0x1E5E | 'r' -> 0x1E5F | 'T' -> 0x1E6E | 't' -> 0x1E6F | 'Z' -> 0x1E94 | 'z' -> 0x1E95 | 'h' -> 0x1E96 | _ -> raise CannotTranslate and ringabove = function | 'A' -> 0x00C5 | 'a' -> 0x00E5 | 'U' -> 0x016E | 'u' -> 0x016F | 'w' -> 0x1E98 | 'y' -> 0x1E99 | _ -> raise CannotTranslate and ogonek = function | 'A' -> 0x0104 | 'a' -> 0x0105 | 'E' -> 0x0118 | 'e' -> 0x0119 | 'I' -> 0x012E | 'i' -> 0x012F | 'U' -> 0x0172 | 'u' -> 0x0173 | 'O' -> 0x01EA | 'o' -> 0x01EB | _ -> raise CannotTranslate and circled = function | 'A' -> 0x24B6 | 'B' -> 0x24B7 | 'C' -> 0x24B8 | 'D' -> 0x24B9 | 'E' -> 0x24BA | 'F' -> 0x24BB | 'G' -> 0x24BC | 'H' -> 0x24BD | 'I' -> 0x24BE | 'J' -> 0x24BF | 'K' -> 0x24C0 | 'L' -> 0x24C1 | 'M' -> 0x24C2 | 'N' -> 0x24C3 | 'O' -> 0x24C4 | 'P' -> 0x24C5 | 'Q' -> 0x24C6 | 'R' -> 0x24C7 | 'S' -> 0x24C8 | 'T' -> 0x24C9 | 'U' -> 0x24CA | 'V' -> 0x24CB | 'W' -> 0x24CC | 'X' -> 0x24CD | 'Y' -> 0x24CE | 'Z' -> 0x24CF | 'a' -> 0x24D0 | 'b' -> 0x24D1 | 'c' -> 0x24D2 | 'd' -> 0x24D3 | 'e' -> 0x24D4 | 'f' -> 0x24D5 | 'g' -> 0x24D6 | 'h' -> 0x24D7 | 'i' -> 0x24D8 | 'j' -> 0x24D9 | 'k' -> 0x24DA | 'l' -> 0x24DB | 'm' -> 0x24DC | 'n' -> 0x24DD | 'o' -> 0x24DE | 'p' -> 0x24DF | 'q' -> 0x24E0 | 'r' -> 0x24E1 | 's' -> 0x24E2 | 't' -> 0x24E3 | 'u' -> 0x24E4 | 'v' -> 0x24E5 | 'w' -> 0x24E6 | 'x' -> 0x24E7 | 'y' -> 0x24E8 | 'z' -> 0x24E9 | _ -> raise CannotTranslate and doublestruck = function | 'C' -> 0x2102 | 'H' -> 0x210D | 'N' -> 0x2115 | 'P' -> 0x2119 | 'Q' -> 0x211A | 'R' -> 0x211D | 'Z' -> 0x2124 | 'D' -> 0x2145 | 'd' -> 0x2146 | 'e' -> 0x2147 | 'i' -> 0x2148 | 'j' -> 0x2149 | c -> if !Parse_opts.moreentities then begin match c with | 'A' -> 0x1D538 | 'B' -> 0x1D539 | 'E' -> 0x1D53C | 'F' -> 0x1D53D | 'G' -> 0x1D53E | 'I' -> 0x1D540 | 'J' -> 0x1D541 | 'K' -> 0x1D542 | 'L' -> 0x1D543 | 'M' -> 0x1D544 | 'O' -> 0x1D546 | 'S' -> 0x1D54A | 'T' -> 0x1D54B | 'U' -> 0x1D54C | 'V' -> 0x1D54D | 'W' -> 0x1D54E | 'X' -> 0x1D54F | 'Y' -> 0x1D550 | 'a' -> 0x1D552 | 'b' -> 0x1D553 | 'c' -> 0x1D554 | 'f' -> 0x1D557 | 'g' -> 0x1D558 | 'h' -> 0x1D559 | 'k' -> 0x1D55C | 'l' -> 0x1D55D | 'm' -> 0x1D55E | 'n' -> 0x1D55F | 'o' -> 0x1D560 | 'p' -> 0x1D561 | 'q' -> 0x1D562 | 'r' -> 0x1D563 | 's' -> 0x1D564 | 't' -> 0x1D565 | 'u' -> 0x1D566 | 'v' -> 0x1D567 | 'w' -> 0x1D568 | 'x' -> 0x1D569 | 'y' -> 0x1D56A | 'z' -> 0x1D56B | '0' -> 0x1D7D8 | '1' -> 0x1D7D9 | '2' -> 0x1D7DA | '3' -> 0x1D7DB | '4' -> 0x1D7DC | '5' -> 0x1D7DD | '6' -> 0x1D7DE | '7' -> 0x1D7DF | '8' -> 0x1D7E0 | '9' -> 0x1D7E1 | _ -> raise CannotTranslate end else raise CannotTranslate (* Text rendering *) let def_t = Hashtbl.create 101 let def_default i default = Hashtbl.replace def_t i default and get_default i = Hashtbl.find def_t i let html_put put put_char i = match i with | 0x3C -> put "<" | 0x3E -> put ">" | 0x26 -> put "&" | _ -> try (translate_out i put_char) with CannotTranslate -> put (Printf.sprintf "&#X%X;" i) (* Constants *) let null = 0x00 and space = 0X20 and nbsp = 0XA0 and acute_alone = 0xB4 and grave_alone = 0X60 and circum_alone = 0X5E and diaeresis_alone = 0xA8 and cedilla_alone = 0xB8 and tilde_alone = 0x7E and macron_alone = 0xAF and doubleacute_alone = 0x2DD and breve_alone = 0x2D8 and dotabove_alone = 0x2D9 and dotbelow_alone = 0x2D4 and linebelow_alone = 0x5F and ogonek_alone = 0x2DB and ring_alone = 0x2DA and caron_alone = 0x2C7 and circled_alone = 0x25EF and eszett = 0xDF and iques = 0xBF and iexcl = 0xA10 and minus = 0x2212 and endash = 0x2013 and emdash = 0x2014 and ldquot = 0x201C and rdquot = 0x201D and lsquot = 0x2018 and rsquot = 0x2019 and prime = 0x2032 and dprime = 0x2033 and tprime = 0x2034 and rprime = 0x2035 and rdprime = 0x2036 and rtprime = 0x2037 hevea-2.30/lexstyle.mli0000644004317100512160000000161412017660721015134 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* Extract/abstract style attributes *) val get : Lexing.lexbuf -> Emisc.StringCount.count val set : string Emisc.StringMap.t -> out_channel -> Lexing.lexbuf -> bool hevea-2.30/english.hva0000644004317100512160000000165510334123204014704 0ustar marangetcristal %%%% Hevea support for babel option 'english'. %%%% Resets %%%% a) date format %%%% b) names of various part descriptors (contentsname etc.) \newcommand{\english@babel}{ \let\english@day\default@day% \let\english@month\default@month% \@ifundefined{theyear}{}{\def\today{\english@day\english@month,~\theyear}}% \def\prefacename{Preface}% \def\refname{References}% \def\abstractname{Abstract}% \def\bibname{Bibliography}% \def\chaptername{Chapter}% \def\appendixname{Appendix}% \def\contentsname{Contents}% \def\listfigurename{List of Figures}% \def\listtablename{List of Tables}% \def\indexname{Index}% \def\figurename{Figure}% \def\tablename{Table}% \def\partname{Part}% \def\enclname{encl}% \def\ccname{cc}% \def\headtoname{To}% \def\pagename{Page}% \def\headpagename{Page}% \def\seename{see}% \def\alsoseename{see also}% \def\footertext{This document was translated from \LaTeX{} by \footahref{\heveaurl/index.html}{\hevea}.}% } hevea-2.30/latexcommon.hva0000644004317100512160000006265612632016744015626 0ustar marangetcristal\newif\ifhevea\heveatrue \let\ifimage\iffalse \newenvironment{htmlonly}{}{} \newcommand{\home}[1]{\~{}#1} %%%%%%%%%%%%%%%% Maths environments and TeXisms \newcommand{\@dot}{.} \newcommand{\textright}[1]{\def\@tmp{#1}\ifx\@tmp\@dot\else#1\fi} \newcommand{\textleft}[1]{\def\@tmp{#1}\ifx\@tmp\@dot\else#1\fi} \def\mathord#1{#1} \def\mathrel#1{#1} \def\mathbin#1{#1} \def\mathopen#1{#1} \def\mathclose#1{#1} \def\mathchardef#1#2{} \newenvironment{math}{$}{$} \newcommand{\(}{$}\newcommand{\)}{$} \newcommand{\[}{$$\@skip@blanks}\newcommand{\]}{$$} \newcommand{\sp}[1]{^{#1}}\newcommand{\sb}[1]{_{#1}} \newcommand{\ensuremath}[1]{\ifmmode#1\else\(#1\)\fi} \newcommand{\@edm@act}{} \newenvironment{ensuredisplaymath} {\ifdisplay\ifmmode\def\@edm@act{NO}\else\let\@edm@act\relax\fi\else\let\@edm@act\relax\fi% \ifx\@edm@act\relax$$\fi} {\ifx\@edm@act\relax$$\fi} \newcommand{\to}{\rightarrow} %%% \newcommand{\\*}{\\} %%% Arrays \let\arraystretch\@empty \newenvironment{array} {\let\\=\@HEVEA@bsbs\let\@hevea@amper=\@HEVEA@amper\@array} {\end@array} \newenvironment{tabular} {\let\\=\@HEVEA@bsbs\let\@hevea@amper=\@HEVEA@amper\@tabular} {\end@tabular} \newenvironment{tabular*} {\let\\=\@HEVEA@bsbs\let\@hevea@amper=\@HEVEA@amper\@tabular*} {\end@tabular*} %%%%% Arrays with attribute argument \newenvironment{Array} {\let\\=\@HEVEA@bsbs\let\@hevea@amper=\@HEVEA@amper\@Array} {\end@Array} \newenvironment{Tabular} {\let\\=\@HEVEA@bsbs\let\@hevea@amper=\@HEVEA@amper\@Tabular} {\end@Tabular} \newenvironment{Tabular*} {\let\\=\@HEVEA@bsbs\let\@hevea@amper=\@HEVEA@amper\@Tabular*} {\end@Tabular*} %%% Equations \def\@changelabel {\let\@oldlabel\label% \renewcommand{\label}[1]{\@oldlabel[~]{##1}}} \newcommand{\eqno}[1]{\qquad#1} \newenvironment{equation}{\[\@changelabel\refstepcounter{equation}}{\eqno{(\theequation)}\]} \newenvironment{eqnarray*}{$$\begin{array}{rcl}}{\end{array}$$} \gdef\@yes@number{\eqno{(\theequation)}} \gdef\@no@number{\addtocounter{equation}{-1}} \newcommand{\@nonumber}{\global\let\@number\@no@number} \newcommand{\@yesnumber}{\global\let\@number\@yes@number} \let\nonumber\@nonumber \newcounter{@eqna@col} \newcommand{\lefteqn}[1]{\begin{ensuredisplaymath}\raggedright#1\end{ensuredisplaymath}} \let\@HEVEA@lefteqn\lefteqn \newenvironment{eqnarray} {\@ifundefined{@eqna@inside}{\def\@eqna@inside{}}{\hva@warn{Nested eqnarray}}% \[\@changelabel\def\@currentlabel{\theequation}% \setcounter{@eqna@col}{0}\@yesnumber\stepcounter{equation} \let\@PBS=\@HEVEA@bsbs \let\@PAM=\@HEVEA@amper \renewcommand{\lefteqn}[1]{\let\lefteqn\@HEVEA@lefteqn\multicolumn{3-\value{@eqna@col}}{l}{\ifthenelse{\value{@eqna@col}=0}{\qquad}{}##1}\setcounter{@eqna@col}{2}} \newcommand{\@eqna@complete} {\whiledo{\value{@eqna@col}<2}{&}} \renewcommand{\@hevea@amper} {\ifthenelse{\value{@eqna@col}<2} {\stepcounter{@eqna@col}\@PAM} {\hva@warn{Extra column in eqnarray}}} \renewcommand{\\}[1][]{\@eqna@complete\@PAM\@number\setcounter{@eqna@col}{0}\@yesnumber\stepcounter{equation}\@PBS} \@array{rclr}} {\\{}\addtocounter{equation}{-1}\end@array\]} \def\mathrm#1{{\rm#1}} \def\mathtt#1{{\tt#1}} \def\mathit#1{{\it#1}} \def\mathbf#1{{\bf#1}} \def\mathcal#1{{\cal#1}} \def\mathsf#1{{\sf#1}} \def\scriptstyle{\ifmathml{\scriptsize}\else\scriptsize\fi} \def\scriptscriptstyle{\ifmathml{\scriptsize\@incsize{-1}}\else\scriptsize\@incsize{-1}\fi} \def\textstyle{\ifmathml\@style{mtext}\fi} \def\textsuperscript#1{\ensuremath{^{\mbox{#1}}}} %\def\textsubscript#1{\ensuremath{_{\mbox{#1}}}}%existe pas! %%%%% Figures and tables \setenvclass{figure}{figure} %%General \caption command: #1 -> env name, #2 -> \caption arg \newcommand{\hva@caption}[2] {\refstepcounter{#1}\begin{hva@capted}\csname #1name\endcsname{} \csname the#1\endcsname: #2\end{hva@capted}} \newcommand{\@figrule}{\begin{center}\@hr{.8\linewidth}{2pt}\end{center}} \newenvironment{figure}[1][] {\@forcecommand{\caption}[2][]{\hva@caption{figure}{##2}}% \@open@quote{\envclass@attr{figure}}\@figrule} {\@figrule\@close@quote} \newenvironment{figure*}[1][]{\begin{figure}[#1]}{\end{figure}} \setenvclass{table}{table} \newenvironment{table}[1][] {\@forcecommand{\caption}[2][]{\hva@caption{table}{##2}}% \@open@quote{\envclass@attr{table}}\@figrule% }{\@figrule\@close@quote} \newenvironment{table*}[1][]{\begin{table}[#1]}{\end{table}} \@forcecommand{\suppressfloats}[1][]{} \newcounter{topnumber} \newcounter{bottomnumber} \newcounter{totalnumber} \newcounter{dbltopnumber} %% Page Styles \def\pagestyle#1{} \def\thispagestyle#1{} %%% No table of figures/tables \def\listoffigures{} \def\listoftables{} \newcommand{\contentsline}[3]{} \newcommand{\numberline}[2]{} \newcommand{\addtocontents}[2]{} \newcommand{\markright}[1]{} \newcommand{\markboth}[2]{} \newcommand{\pagenumbering}[1]{} \newcommand{\twocolumn}[1][]{} \newcommand{\onecolumn}{} %%% Stackrel et compagine \newcommand{\stackrel}[2]{\mathop{#2}\limits^{\scriptsize{}#1}\nolimits} \def\space@varray{1} \newenvironment{@varray} {\prim@def{\@table@attributes}{style="border:0;border-spacing:\space@varray{};border-collapse:separate" class="cellpadding0"}\def\space@varray{0}% \begin{array}{c}} {\end{array}} %%% OLD DEFINITIONS : rediscovered, only \textoverline redefined in hevea.hva %%% \newcommand{\textoverline}[1]{\hva@warn{overline ignored in text mode}#1} \def\overline#1{\ifdisplay \begin{@varray}\hline #1\end{@varray}\else\textoverline{#1}\fi} \newcommand{\textunderline}[1]{{\@style{U}#1}} \def\underline#1{\ifdisplay \begin{@varray}#1\\\hline\end{@varray}\else\textunderline{#1}\fi} %%%Miscleanous, title stuff %\input{common-math.hva} \newcommand{\thanks}[1]{\footnote{#1}} \newenvironment{titlepage}{}{} \newcommand{\and}{\quad} \newcommand{\title}[1]{\gdef{\@title}{#1}\global\let\@@title\relax} \newcommand{\@titlebis}[1] {\ifu\@@title\gdef{\@title}{#1}\title@tohaux{#1}\fi} \newcommand{\@titleaux}[1]{\gdef{\@title}{#1}} \newcommand{\author}[1]{\gdef{\@author}{#1}\global\let\author\@gooble} \newcommand{\date}[1]{\gdef{\@date}{#1}\global\let\date\@gooble} %% Lists \setenvclass{li-itemize}{li-itemize} \newstyle{.li-itemize}{margin:1ex 0ex;} \newcommand{\item}[1][]{\hva@warn{\item outside a list-making environment}} \newcommand{\@itemitemize}[1][!*!] {\@itemize@li{\envclass@attr{li-itemize}}\ifthenelse{\equal{#1}{!*!}}{}{\hva@warn{Optional argument to \item in itemize environment}{#1}}} \setenvclass{li-enumerate}{li-enumerate} \newstyle{.li-enumerate}{margin:1ex 0ex;} \newcommand{\@itemenumerate}[1][!*!] {\let\@currentlabel\csname the\@enumcitem\endcsname% \stepcounter{\@itemcount}\@enumerate@linum{\envclass@attr{li-enumerate}}\ifthenelse{\equal{#1}{!*!}}{}{\hva@warn{Ignored optional argument to \item in enumerate environment}}} %environement itemize \setenvclass{itemize}{itemize} \newenvironment{itemize} {\@open{ul}{\envclass@attr{itemize}}\let\item\@itemitemize} {\@close{ul}} \newcounter{enumcount} \newcommand{\@enumstyle} {\ifthenelse{\value{enumcount}=1}{type=1}{}% \ifthenelse{\value{enumcount}=2}{type=a}{}% \ifthenelse{\value{enumcount}=3}{type=i}{}% \ifthenelse{\value{enumcount}=4}{type=A}{}} \newcommand{\@enumcitem} {\ifthenelse{\value{enumcount}=1}{itemi}{}% \ifthenelse{\value{enumcount}=2}{itemii}{}% \ifthenelse{\value{enumcount}=3}{itemiii}{}% \ifthenelse{\value{enumcount}=4}{itemiiii}{}% \ifthenelse{\value{enumcount}>4}{itemv}{}} \newcounter{itemi} \newcounter{itemii} \renewcommand{\theitemii}{\theitemi(\alph{itemii})} \newcounter{itemiii} \renewcommand{\theitemiii}{\theitemii\roman{itemiii}} \newcounter{itemiiii} \renewcommand{\theitemiiii}{\theitemiii(\Alph{itemiiii})} \newcounter{itemv} \renewcommand{\theitemv}{\theitemiiii} \newcommand{\itemi}{itemi} \newcommand{\itemii}{itemii} \newcommand{\itemiii}{itemiii} \newcommand{\itemiiii}{itemiiii} \newcommand{\itemv}{itemv} %environment enumerate \setenvclass{enumerate}{enumerate} \newenvironment{enumerate} {\stepcounter{enumcount}% \@open{OL}{\envclass@attr[ ]{enumerate}\@enumstyle}% \let\item\@itemenumerate% \let\@itemcount\csname\@enumcitem\endcsname% \setcounter{\@itemcount}{0}} {\@close{OL}\addtocounter{enumcount}{-1}} % %% Modified to support styles e.g. %%
, %%
%% ONLY CHANGES : 1) class=list added to \@open{DL} argument %% 2) \@dt replaced by \@list@dtdd %% Remove these to get original behaviour % \newcommand{\setlistclass}[1] {\setenvclass{list}{\getenvclass{#1}}% \setenvclass{dt-list}{\getenvclass{dt-#1}}% \setenvclass{dd-list}{\getenvclass{dd-#1}}} \setenvclass{list}{list} \setenvclass{dt-list}{dt-list} \setenvclass{dd-list}{dd-list} \newenvironment{list}[2] {\@open{dl}{\envclass@attr{list}} \renewcommand{\item}[1][#1]{\@dtdd{##1}{\envclass@attr{dt-list}}{\envclass@attr{dd-list}}}% \@forcecommand{\makelabel}[1]{##1}% #2%exec }{\@close{dl}} \setenvclass{description}{description} \setenvclass{dt-description}{dt-description} \setenvclass{dd-description}{dd-description} \newstyle{.dd-description}{margin:0ex 0ex 1ex 4ex;} \newstyle{.dt-description}{margin:0ex;} \newenvironment{@list@description}[2] {\@open{dl}{\envclass@attr{description}}% \renewcommand{\item}[1][#1]{\@dtdd{##1}{\envclass@attr{dt-description}}{\envclass@attr{dd-description}}}% \@forcecommand{\makelabel}[1]{##1}% #2%exec }{\@close{dl}} \newenvironment{description}{\begin{@list@description}{}{\renewcommand{\makelabel}[1]{\textbf{##1}}}}{\end{@list@description}} \setenvclass{trivlist}{trivlist} \setenvclass{dt-trivlist}{dt-trivlist} \setenvclass{dd-trivlist}{dd-trivlist} \newenvironment{trivlist} {\setlistclass{trivlist}\begin{list}{}{}}{\end{list}} %% Input... \newcommand{\listfiles}{} %% Line breaking \newcommand{\linebreak}[1][4]{\ifthenelse{#1=4}{\vspace{1em}}{}} \newcommand{\nolinebreak}[1][4]{} \newcommand{\sloppy}{} \newcommand{\fussy}{} \newenvironment{sloppypar}{}{} \newcommand{\goodbreak}{} %%%%%%%%%%%% Ignore hyphenation \newcommand{\-}{} \newcommand{\hyphenation}[1]{} %% Page Breaking \newcommand{\pagebreak}[1][]{} \newcommand{\nopagebreak}[1][]{} \newcommand{\enlargethispage}[1]{} \newcommand{\enlargethispage*}[1]{} \newcommand{\newpage}{} \newcommand{\clearpage}{} \newcommand{\cleardoublepage}{} %%Lengths are ignored \newcommand{\newlength}[1] {\if@toplevel\begin{toimage}\newlength{#1}\end{toimage}\fi} \newcommand{\setlength}[2] {\if@toplevel\begin{toimage}\setlength{#1}{#2}\end{toimage}\fi} \newcommand{\addtolength}[2] {\if@toplevel\begin{toimage}\addtolength{#1}{#2}\end{toimage}\fi} \newcommand{\settowidth}[2]{} \newcommand{\settodepth}[2]{} \newcommand{\settoheight}[2]{} \newcommand{\fill}{} \newcommand{\stretch}[1]{} %%%%%%%%%%%%%%%% \def\makeatletter{} \def\makeatother{} %%%%%%%%%%%% Ignore head and foot specifications \def\cfoot{} \def\chead{} \newcommand{\rfoot}[2][]{} \newcommand{\lfoot}[2][]{} \newcommand{\rhead}[2][]{} \newcommand{\lhead}[2][]{} \newcommand{\chaptermark}[1]{} \newcommand{\sectionmark}[1]{} \newcommand{\oddsidemargin}{} \newcommand{\evensidemargin}{} %%%%%%%% various commands \def\protect{} \def\fancyplain#1#2{} \def\newblock{} \def\nobreak{} \def\newdimen#1{} \newenvironment{samepage}{}{} \def\raggedbottom{} \def\emergencystretch#1{} %%%%%%%%%%%% A few texisms \newcommand{\long}{} \newcommand{\newline}{\@br} \newcommand{\expandafter}{} %% Arrays and tabular \newcommand{\extracolsep}[1]{} \newcommand{\cline}[1]{\hva@warn{\cline changed into \hline}\hline} \newcommand{\cases}[1]{\left\{\begin{array}{l>{$}l<{$}}#1\end{array}\right.} \newcommand{\endcases}{} %%% tabularx \newenvironment{tabularx}[2]{\begin{tabular}{#2}}{\end{tabular}} \newcolumntype{X}{p{}} %%% AtEof \newcommand{\AtEndOfFile}[1]{\addtokens{\@ateof}{#1}} %%% To save global options \newsavebox{\@document@opts} %%% AtBeginDocument and AtEndDocument \newtokens{\@atbegindocument} \newcommand{\AtBeginDocument}[1]{\addtokens{\@atbegindocument}{#1}} \AtBeginDocument{\@begin@document} \AtBeginDocument {\@set@ttmode%set the value of tt_mode in Lexscan now that \tt is defined. \begin{toimage} \pagestyle{empty} \thispagestyle{empty} \begin{document} \end{toimage}} \newtokens{\@atenddocument} \newcommand{\AtEndDocument}[1]{\addtokens{\@atenddocument}{#1}} \def\@final@footer{% \iffooter\ifhtml \@print{} \fi\@footer\fi} \AtEndDocument {\@imagenopt% \begin{toimage} \end{document} \end{toimage}} \def\@end@document@seen{NO}% \AtEndDocument{\gdef\@end@document@seen{OK}} %%% Boxes \newcommand{\textfbox}[1]{\hva@warn{\fbox in text}\mbox{#1}} \def\fbox#1{% \ifdisplay\begin{tabular}{|c|}\hline#1\end{array}\else \textfbox{#1}\fi} \newcommand{\hbox}[1]{\hva@warn{\hbox}\mbox{#1}} \newcommand{\displaystyle}{\ifdisplay\else\hva@warn{\displaystyle ignored}\fi} %%% Paragraphs \let\par\@empty \AtBeginDocument{\let\par\hva@par} %%% References \newcommand{\@currentlabel}{} %%% Index references \newcommand{\hva@idx@counter}[1]{\def\csname #1@idx@counter\endcsname{}} \hva@idx@counter{part}% \hva@idx@counter{chapter}% \hva@idx@counter{section}% \hva@idx@counter{subsection}% \hva@idx@counter{subsubsection}% \hva@idx@counter{paragraph}% \hva@idx@counter{subparagraph}% \newcommand{\@indexlabel}{} \newcommand{\refstepcounter}[1] {\let\@currentlabel\csname the#1\endcsname% \ifu\csname #1@idx@counter\endcsname\else% \let\@indexlabel\csname the#1\endcsname\fi% \stepcounter{#1}} %%% Aux files \newcommand{\@fst}[2]{#1} \newcounter{labelorder} \newcommand{\newlabel}[2] {\stepcounter{labelorder}% \prim@def\csname #1@label@order\endcsname{\thelabelorder}% \@newlabel{#1}{\@funcall{\@fst}{#2}}} %Also define section id to change \newcommand{\new@anchor@label}[3] {\def\csname #1@named@sec\endcsname{#2}% \newlabel{#2}{#3}} \newcommand{\@writefile}[2]{} \newcommand{\@setckpt}[2]{} \newcommand{\std@label}[2][]{\@locname{#2}{#1}\@auxwrite{#2}{\@currentlabel}} \newcommand{\insec@label}[2][] {\ifu\csname\@the@sec{}@label@seen\endcsname \def\csname\@the@sec{}@label@seen\endcsname{#2}% \def\csname\@the@sec{}@named@sec\endcsname{#2}% #1\@@auxwrite{\@the@sec}{#2}{\@currentlabel}\else \def\@tmp{#2}% \ifx\@tmp\csname\@the@sec{}@label@seen\endcsname\else \std@label[#1]{#2}\fi\fi} \newcommand{\label}[2][] {\ife\@the@sec\std@label[#1]{#2}\else\insec@label[#1]{#2}\fi} %%No label translation any longer \newcommand{\@check@anchor@label}[1]{#1} \newcommand{\ref}[1]{\@locref{\@check@anchor@label{#1}}{\@auxread{#1}}} \newcommand{\pageref}[1]{\@locref{#1}{??}} \let\@input\input%appears inside aux files \newcommand{\@readhaux}[1] {\@hauxinit% \@iffileexists{#1.haux} {\@try{\input{#1.haux}}{\hva@warn{Failure while reading .haux}}} {}% \@hauxfinal} \newcommand{\@readaux}[1]{\input{#1.aux}} \newcommand{\@readauxorhaux}[2] {\@stopoutput\@stopimage% \ifthenelse{\@fileexists{#1.aux} \and \not \boolean{fixpoint}} {\@try {\@readaux{#1}} {\hva@warn{Failure while reading .aux, reading .haux}\@readhaux{#2}}} {\@readhaux{#2}}% \@restartoutput\@restartimage} \AtBeginDocument {\@sawdocumenttrue\@save@macros\@readauxorhaux{\@basein}{\jobname}} %%%%%%%%%%% Bibliography \newcommand{\bibdata}[1]{} \newcommand{\bibliography}[1] {\@auxdowrite{\@print{\bibdata}\{\@getprint{#1}\} }% \@iffileexists{\jobname.hbbl} {\input{\jobname.hbbl}} {\@iffileexists{\jobname.bbl} {\input{\jobname.bbl}} {}}} \newcommand{\bibstyle}[1]{} \newcommand{\@bibliographystyle}[1] {\@auxdowrite{\@print{\bibstyle}\{\@getprint{#1}\} }} \newcommand{\bibliographystyle}[1] {\AtBeginDocument{\@bibliographystyle{#1}}} \AtBeginDocument{\let\bibliographystyle\@bibliographystyle} \newcommand{\citation}[1]{} \newcommand{\nocite}[1] {\@auxdowrite{\@print{\citation}\{\@getprint{#1}\} }} \setenvclass{thebibliography}{thebibliography} \setenvclass{dt-thebibliography}{dt-thebibliography} \setenvclass{dd-thebibliography}{dd-thebibliography} \newcommand{\refname}{References} \newenvironment{thebibliography}[1] {\@end{thebibliography}%Execute sectionning command in outer scope \@bibliosection{\refname}% \@begin{thebibliography}% \setlistclass{thebibliography}% \begin{list}{\stepcounter{heveabib}\theheveabib}{\let\makelabel\@biblabel}} {\end{list}} \newcounter{heveabib}\newcommand{\bibtaghook}[1]{#1}% \newcommand{\bibitem}[2][!*!] {\ifthenelse{\equal{#1}{!*!}} {\refstepcounter{heveabib}\@bibwrite{\theheveabib}{\bibtaghook{#2}}} {\@bibwrite{#1}{\bibtaghook{#2}}}\item[#2]} \newcommand{\@open@cite@one}{[} \newcommand{\@open@cite@two}{} \newcommand{\@cite@pre}[1]{} \newcommand{\@close@cite}{]} \newcommand{\@sep@cite}{,} \newcommand{\@sep@cite@space}{ } \newcommand{\@post@cite}{,} \newcommand{\@bib@post}[1]{\ifthenelse{\equal{#1}{}}{}{\@post@cite{} #1}} %%%%%%%%%%% Footnotes \newcommand{\@footnotelevel}{document}% \newcommand{\flushdef}[1]{\def\@footnotelevel{#1}} \let\footnoteflush\@footnoteflush \def\footnote@c{footnote}%indirection to footnote counter \newcommand{\footnotesep}[1]{} \newcounter{savenote}\newcounter{onemark} \newcommand{\@fnmarktext}[1]{% \setcounter{savenote}{\value{footnote}}% \setcounter{footnote}{#1}% \thefootnote% \setcounter{footnote}{\value{savenote}}} \newcommand{\@fnmarknote}[1]{% \setcounter{savenote}{\value{footnote}}% \setcounter{footnote}{#1}% \@notenotestyle{\thefootnote}% \setcounter{footnote}{\value{savenote}}} %%%%%%%%%%%%%%%%%% \newcommand{\footnotemark}[1][!*!]{% \ifthenelse{\equal{#1}{!*!}}% {\stepcounter{\footnote@c}\@stepanchor{\value{\footnote@c}}\setcounter{onemark}{\value{\footnote@c}}}% {\setcounter{onemark}{#1}}% \ifu\csname text@seen@\@anchorval{\value{onemark}}\endcsname% \global\let\csname text@seen@\@anchorval{\value{onemark}}\endcsname\relax %\typeout{Defined text@seen@\@anchorval{\value{onemark}}}% \@notetextstyle{\@noteref{note}{text} {\@anchorval{\value{onemark}}} {\@fnmarktext{\value{onemark}}}}\else \@notetextstyle{\@notepointer{note} {\@anchorval{\value{onemark}}} {\@fnmarktext{\value{onemark}}}}\fi } %Text of footnote. \newcommand{\footnotetext}[2][\value{\footnote@c}] {\@footnotetext{#1}{\@open@footnotetext{}#2\@close@footnotetext}} \newcommand{\footnote}[2][!*!]{% \ifthenelse{\equal{#1}{!*!}} {\footnotemark\footnotetext{#2}} {\footnotemark[#1]\footnotetext[#1]{#2}}} %%% For defining Sectioning commands \newif\if@refs\@refstrue \newenvironment{@norefs} {\@refsfalse% \renewcommand{\@openlocref}[1]{}\renewcommand{\@closelocref}{}% \renewcommand{\@aelement}[3][]{##3}\renewcommand{\label}[2][]{}\renewcommand{\ref}[1]{\@auxread{##1}}\renewcommand{\footnote}[1]{}} {} \newcounter{secnumdepth}\setcounter{secnumdepth}{3}% \newcounter{tocdepth}\setcounter{tocdepth}{2}% \newcommand{\@altdepth}[3]{\ifthenelse{\value{secnumdepth} > #1}{#2}{#3}} \newcommand{\@checkdepth}[2]{\@altdepth{#1}{#2}{}} \newcommand{\@alttocdepth}[3]{\ifthenelse{\value{tocdepth} > #1}{#2}{#3}}% \newcommand{\@checktocdepth}[2]{\@alttocdepth{#1}{#2}{}}% %% Putting (or not putting) section numbers in table of content \newcommand{\@addsecnumber@yes}[3]{\@checkdepth{#1}{#2\quad}#3} \newcommand{\@addsecnumber@no}[3]{#3} \newcommand{\tocnumber}{\let\@addsecnumber\@addsecnumber@yes} \newcommand{\notocnumber}{\let\@addsecnumber\@addsecnumber@no} \notocnumber \newcounter{tocanchor} %\newcommand{\@doaddtoc}[3] %{%\stepcounter{tocanchor}% %\@auxdowrite{\@print{\@@addtocsec{htoc}}\{\@fmt@sec\}\{#1\}\{\@checkdepth{#1}{\@print{\@print}\{#2\}\@print{\quad{}}}\begin{@norefs}\@subst@expn{#3}\end{@norefs}\}\@print{ %}}} \newcommand{\@doaddtoc}[3] {%\stepcounter{tocanchor}% \@auxdowrite{\@print{\@@addtocsec{htoc}}\{\@getprintnostyle{\@sec@id@attr}\}\{#1\}\{\@checkdepth{#1}{\@print{\@print}\{#2\}\@print{\quad{}}}\begin{@norefs}\@subst@expn{#3}\end{@norefs}\}\@print{ }}} %%section identifiers \newcounter{@sec} \newcommand{\@fmt@sec}{sec\arabic{@sec}} \newcommand{\@step@sec} {\stepcounter{@sec}% \ifu\csname\@fmt@sec{}@named@sec\endcsname\def\@sec@id@attr{\@fmt@sec}\else \def\@sec@id@attr{\csname\@fmt@sec{}@named@sec\endcsname}\fi \let\@the@sec\@fmt@sec \def\@secid{\@getprint{id="\@sec@id@attr" }\let\@secid\relax}} \let\@secid\relax \newcommand{\end@step@sec}{\let\@the@sec\relax} \let\@the@sec\relax %% \newcommand{\@makesection}[7]{% \newcommand{\csname @#3@level\endcsname}{#2}% \newcommand{#1}[2][]{% \@secbegin\@step@sec\@checkdepth{#2}{\refstepcounter{#3}}% \ifoptarg\@checktocdepth{#2}{\@doaddtoc{#2}{#5}{##1}}% \cuthere{#3}{\@addsecnumber{#2}{#5}{##1}}\else \@checktocdepth{#2}{\@doaddtoc{#2}{#5}{##2{}}} \cuthere{#3}{\@addsecnumber{#2}{#5}{\begin{@norefs}##2{}\end{@norefs}}}\fi #4\@secanchor% \@altdepth{#2}{#5#6}{}% %{\@alttocdepth{#2}{\@locname{htoc\thetocanchor}{#5}#6}{#5#6}} %{\@checktocdepth{#2}{\@locname{htoc\thetocanchor}{}}}% ##2{}#7\end@step@sec\@secend}% \newcommand{#1*}[1]{% \@secbegin\@step@sec\cuthere{#3}{##1}% #4\@secanchor{}##1{}#7\end@step@sec\@secend}}% %%%%%%%%%%%%%% % Images % %%%%%%%%%%%%%% \newcounter{image} \newcommand{\heveaimageext}{.png} \newcommand{\heveaimagedir}{} \renewcommand{\theimage}{\@arabic{image}} \newcommand{\imageflush}[1][] {\@imageflush\stepcounter{image}% \imgsrc[#1]{\ife\heveaimagedir\else\heveaimagedir/\fi\jobname@base\theimage\heveaimageext}} %%%%%%%%%% Compatibility with old hevea \url \AtBeginDocument{\@ifundefined{url}{\input{compat.hva}}{}} %%%%%%%%% Time stuff %Change footnote counter when formatting title/autor/date \newcommand{\@fmt@title}[1] {{\def\footnote@c{titlenote}\let\thefootnote\thetitlenote#1}} \AtBeginDocument {\@ifundefined{theyear} {\renewcommand{\today}{\hva@warn{\today needs '-exec xxdate.exe' option}}} {\renewcommand{\theHour}{\@twoarabic{Hour}} \renewcommand{\thehour}{\@twoarabic{hour}} \renewcommand{\theminute}{\@twoarabic{minute}} \renewcommand{\thesecond}{\@twoarabic{second}}}% %Format date after \today is defined \ifu\@title\fi\let\title\@titlebis} %%End AtBeginDocument %%%%%%%% Day and month formats \def\default@day {\ifthenelse{\value{day}=1}{\theday\textsuperscript{st}} {\ifthenelse{\value{day}=21}{\theday\textsuperscript{st}} {\ifthenelse{\value{day}=31}{\theday\textsuperscript{st}} {\ifthenelse{\value{day}=2}{\theday\textsuperscript{nd}} {\ifthenelse{\value{day}=22}{\theday\textsuperscript{nd}} {\ifthenelse{\value{day}=3}{\theday\textsuperscript{rd}} {\ifthenelse{\value{day}=23}{\theday\textsuperscript{rd}} {\theday\textsuperscript{th}}}}}}}}}% \def\default@month {\ifthenelse{\value{month}=1}{January} {\ifthenelse{\value{month}=2}{February} {\ifthenelse{\value{month}=3}{March} {\ifthenelse{\value{month}=4}{April} {\ifthenelse{\value{month}=5}{May} {\ifthenelse{\value{month}=6}{June} {\ifthenelse{\value{month}=7}{July} {\ifthenelse{\value{month}=8}{August} {\ifthenelse{\value{month}=9}{September} {\ifthenelse{\value{month}=10}{October} {\ifthenelse{\value{month}=11}{November} {\ifthenelse{\value{month}=12}{December}{} }}}}}}}}}}}}% %%%%%%%% Default today slightly differs from english babel today \newcommand\today{\default@month~\theday, \theyear} %%%%%%%%%%%%%% Defined counter printing functions \newcommand{\@arabic}[1]{\@pad{0}{3}{\arabic{#1}}} \newcommand{\@twoarabic}[1]{\@pad{0}{2}{\arabic{#1}}} %%%%%%%%%%%%%%% Une horreur qui peut etre utile \newcommand{\newverbenv}[1] {\@stopimage% \let{\csname #1\endcsname}\verbatim \let{\csname end#1\endcsname}\endverbatim \@restartimage} \newcommand{\@noiso}[1]{\ifiso\isofalse#1\isotrue\else#1\fi} \newcommand{\@rawchars}[1]{\ifraw#1\else\rawtrue#1\rawfalse\fi} %%%%%%%%%%%%%%%%% Ignoring arguments \newcommand{\@skipopt}[1][!*!]{} \newcommand{\@skiparg}[1]{} %%%%Utility \newcommand{\@opencell}[3]{\@open{table}{#1}\@open{tr}{#2}\@open{td}{#3}} \newcommand{\@closecell}{\@force{td}\@close{tr}\@close{table}} %%%%%%%%%%%%%%%%% Length as percent \def\linewidth{@percent} \def\textwidth{@percent} \def\hsize{@percent} \def\baselineskip{1ex} %%%%%%%%%%%%%%%%% Toc \newstyle{.toc}{list-style:none;} \setenvclass{toc}{toc} \setenvclass{li-toc}{li-toc} \newenvironment{tocenv} {\setenvclass{itemize}{\getenvclass{toc}}% \setenvclass{li-itemize}{\getenvclass{li-toc}}% \begin{itemize}} {\end{itemize}} \newcommand{\tocitem}[1][] {\ifoptarg\item[#1]\else\item\fi} %%%%%%%%tocname changed to contentsname (standard) \newcommand{\contentsname}{Contents} \newcommand{\@readtoc}[2] {\@tocsection{#2} \@iffileexists{\jobname.#1}{\input{\jobname.#1}}{}} \newcommand{\tableofcontents}{\@readtoc{htoc}{\contentsname}} \newcommand{\addcontentsline}[3] {\@auxdowrite{{\@nostyle\@print{\@addcontentsline}{\{h#1\}\{\csname @#2@level\endcsname\}}\{\@subst{#3}\}\@print{ }}}} %%%%%%%%% Minipage %Manage footnotes in minipage, as latex does % 1. Use counter mpfootnote % 2. Flush notes at end \newcounter{mpfootnote} \renewcommand{\thempfootnote}{\alph{mpfootnote}} \newenvironment{minipage}[2][] {\hva@warn{minipage, output may be poor}% \renewcommand{\@footnotelevel}{document}\@footnotesub% \setcounter{mpfootnote}{0}% \def\footnote@c{mpfootnote}% \@minipage\@start@text} {\@end@text\@footnoteflush@sticky{document}\@endfootnotesub\end@minipage} %%%%% Extension des environnments hevea en lecture de fichier \newcommand{\rawhtmlinput}[1] {\@scaninput{\begin{rawhtml}}{#1}{\end{rawhtml}}} \newcommand{\rawtextinput}[1] {\@scaninput{\begin{rawtext}}{#1}{\end{rawtext}}} \newcommand{\rawinput}[1] {\@scaninput{\begin{raw}}{#1}{\end{raw}}} %%%Default definitions that can be redefined by babel \newcommand\prefacename{Preface} \newcommand\bibname{Bibliography} \newcommand\chaptername{Chapter} \newcommand\listfigurename{List of Figures} \newcommand\listtablename{List of Tables} \newcommand\indexname{Index} \newcommand\figurename{Figure} \newcommand\tablename{Table} \newcommand\enclname{encl} \newcommand\ccname{cc} \newcommand\headtoname{To} \newcommand\pagename{Page} \newcommand\headpagename{Page} \newcommand\seename{see} \newcommand\alsoseename{see also} \newcommand\dq{No-dq} %%% Footer \newif\iffooter\footertrue \def\heveaurl{http://hevea.inria.fr} \newcommand{\footertext} {This document was translated from \LaTeX{} by \footahref{\heveaurl/index.html}{\hevea}.} \newcommand{\@footer} {\rule{}{}\begin{quote}\em\footertext\end{quote}} %%%%% Compat %\let\@hva@newstack\hva@newstack hevea-2.30/mysys.mli0000644004317100512160000000175210116062252014443 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) exception Error of string val put_from_file : string -> (string -> unit) -> unit val copy_from_lib : string -> string -> unit val copy_from_lib_to_dir : string -> string option -> string -> unit val rename : string -> string -> unit val remove : string -> unit hevea-2.30/keyval.hva0000644004317100512160000000021110634524554014551 0ustar marangetcristal\ProvidesPackage{keyval} \@primitives{keyval} \newcommand{\setkeys}[2] {\begin{toimage} \setkeys{#1}{#2} \end{toimage}\@setkeys{#1}{#2}} hevea-2.30/bytes.mlp0000644004317100512160000000023212403604646014416 0ustar marangetcristalinclude String let sub_string = sub let of_string = copy let blit_string = blit let unsafe_to_string s = s let to_string = copy let cat b1 b2 = b1 ^ b2 hevea-2.30/lexstate.ml0000644004317100512160000005144713107043103014742 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Printf open Misc open Lexing open MyStack (* Commands nature *) type action = | Subst of string list | Toks of string list | CamlCode of (Lexing.lexbuf -> unit) let body_to_string = String.concat "" let pretty_body chan = List.iter(fprintf chan "%s") let pretty_action acs = match acs with | Subst s -> eprintf "{%a}" (fun chan -> List.iter (fprintf chan "\"%s\" ")) s | Toks l -> List.iter (fun s -> Printf.fprintf stderr "{%s}, " s) l | CamlCode _ -> prerr_string "*code*" let rec is_empty_list = function | [] -> true | x::xs -> String.length x = 0 && is_empty_list xs type pat = string list * string list let pretty_pat (_,args) = List.iter (fun s -> prerr_string s ; prerr_char ',') args let is_subst body = match body with | CamlCode _ -> false | _ -> true let latex_pat opts n = let n_opts = List.length opts in let rec do_rec r i = if i <= n_opts then r else do_rec (("#"^string_of_int i)::r) (i-1) in opts,do_rec [] n let zero_pat = latex_pat [] 0 and one_pat = latex_pat [] 1 (* Environments *) type subst = Top | Env of string list arg array and 'a arg = {arg : 'a ; subst : subst } let mkarg arg subst = {arg=arg ; subst=subst } type alltt = Not | Inside | Macro let effective = function | Inside -> true | _ -> false let subst = ref Top and alltt = ref Not let stack_subst = MyStack.create "stack_subst" and stack_alltt = MyStack.create_init "stack_alltt" Not let get_subst () = !subst let top_subst = Top let pretty_subst = function | Top -> prerr_endline "Top level" | Env args -> if Array.length args <> 0 then begin prerr_endline "Env: " ; for i = 0 to Array.length args - 1 do prerr_string "\t'" ; eprintf "%a" pretty_body args.(i).arg ; prerr_endline "'" done end let rec pretty_subst_rec indent = function | Top -> prerr_string indent ; prerr_endline "Top level" | Env args -> if Array.length args <> 0 then begin prerr_string indent ; prerr_endline "Env: " ; for i = 0 to Array.length args - 1 do prerr_string indent ; prerr_string (" #"^string_of_int (i+1)^" ``"); pretty_body stderr args.(i).arg ; prerr_endline "''" ; pretty_subst_rec (" "^indent) args.(i).subst done end let full_pretty_subst s = pretty_subst_rec " " s exception Error of string exception SubstTop type jax = JaxOut | JaxInline | JaxDisplay (* Status flags *) let display = ref false and raw_chars = ref false and in_math = ref false and jaxauto = ref false and injaxauto = ref JaxOut and whitepre = ref false and optarg = ref false and styleloaded = ref false and activebrace = ref true and html = ref (match !Parse_opts.destination with | Parse_opts.Html -> true | Parse_opts.Info | Parse_opts.Text -> false) and text = ref (match !Parse_opts.destination with | Parse_opts.Html -> false | Parse_opts.Info | Parse_opts.Text -> true) and alltt_loaded = ref false (* Additional variables for videoc *) and withinLispComment = ref false and afterLispCommentNewlines = ref 0 (* Additional flags for transformations *) ;; type case = Upper | Lower | Neutral let case = ref Neutral ;; let string_to_arg arg = {arg=arg ; subst= !subst } (* Stacks for flags *) let stack_in_math = MyStack.create "stack_in_math" and stack_display = MyStack.create "stack_display" (* Stacks for entry stream *) let stack_lexbuf = MyStack.create "stack_lexbuf" ;; let pretty_lexbuf lb = let pos = lb.lex_curr_pos and len = Bytes.length lb.lex_buffer in prerr_endline "Buff contents:" ; let size = if !verbose > 3 then len-pos else min (len-pos) 80 in if size <> len-pos then begin prerr_string "<<" ; prerr_string (Bytes.sub_string lb.lex_buffer pos (size/2)) ; prerr_string "... (omitted) ..." ; prerr_string (Bytes.sub_string lb.lex_buffer (len-size/2-1) (size/2)) ; prerr_endline ">>" end else prerr_endline ("<<"^Bytes.sub_string lb.lex_buffer pos size^">>"); prerr_endline ("curr_pos="^string_of_int lb.lex_curr_pos); prerr_endline "End of buff" ;; (* arguments inside macros*) type closenv = string array t (* catcodes *) let plain_of_char = function | '{' -> 0 | '}' -> 1 | '$' -> 2 | '&' -> 3 | '#' -> 4 | '^' -> 5 | '_' -> 6 | '~' -> 7 | '\\' -> 8 | '%' -> 9 | '\'' -> 10 | '`' -> 11 | '-' -> 12 | '"' -> 13 (* '"' *) | c -> raise (Fatal ("Internal catcode table error: '"^String.make 1 c^"'")) and plain = Array.make 14 true let is_plain c = plain.(plain_of_char c) and set_plain c = (* if c = '_' then eprintf "set_plain %c\n" c ; *) plain.(plain_of_char c) <- true and unset_plain c = (* if c = '_' then eprintf "unset_plain %c\n" c ; *) plain.(plain_of_char c) <- false and plain_back b c = (* if c = '_' then eprintf "plain_back %c <- %b\n" c b ; *) plain.(plain_of_char c) <- b let top_level () = match !subst with Top -> true | _ -> false and is_top = function | Top -> true | _ -> false let prerr_args () = pretty_subst !subst let scan_arg lexfun i = match !subst with | Top -> raise SubstTop | Env args -> if i >= Array.length args then begin if !verbose > 1 then begin prerr_string ("Subst arg #"^string_of_int (i+1)^" -> not found") ; pretty_subst !subst end ; raise (Error "Macro argument not found") end; let arg = args.(i) in if !verbose > 1 then begin eprintf "Subst arg #%i -> %a\n" i pretty_body arg.arg end ; let r = lexfun arg in r and scan_body do_exec body args = match body with | CamlCode _|Toks _ -> do_exec body | Subst _ -> let old_subst = !subst in subst := args ; let r = do_exec body in subst := old_subst ; r (* Recoding and restoring lexbufs *) let record_lexbuf lexbuf subst = MyStack.push stack_subst subst ; MyStack.push stack_lexbuf lexbuf ; and previous_lexbuf () = let lexbuf = MyStack.pop stack_lexbuf in subst := MyStack.pop stack_subst ; lexbuf ;; (* Saving and restoring lexing status *) let stack_lexstate = MyStack.create "stack_lexstate" let top_lexstate () = MyStack.empty stack_lexstate let save_lexstate () = let old_stack = MyStack.save stack_subst in MyStack.push stack_subst !subst ; push stack_lexstate (MyStack.save stack_lexbuf, MyStack.save stack_subst) ; MyStack.restore stack_subst old_stack and restore_lexstate () = let lexbufs,substs = pop stack_lexstate in MyStack.restore stack_lexbuf lexbufs ; MyStack.restore stack_subst substs ; subst := MyStack.pop stack_subst (* Flags save and restore *) let save_flags () = push stack_display !display ; push stack_in_math !in_math and restore_flags () = in_math := pop stack_in_math ; display := pop stack_display (* Total checkpoint of lexstate *) type saved_lexstate = (Lexing.lexbuf MyStack.saved * subst MyStack.saved) MyStack.saved * bool MyStack.saved * bool MyStack.saved let check_lexstate () = save_lexstate () ; save_flags () ; let r = MyStack.save stack_lexstate, MyStack.save stack_display, MyStack.save stack_in_math in restore_lexstate () ; restore_flags () ; r and hot_lexstate (l,d,m) = MyStack.restore stack_lexstate l ; MyStack.restore stack_display d ; MyStack.restore stack_in_math m ; restore_lexstate () ; restore_flags () ;; (* Blank lexing status *) let start_lexstate () = save_lexstate () ; MyStack.restore stack_lexbuf (MyStack.empty_saved) ; MyStack.restore stack_subst (MyStack.empty_saved) let start_lexstate_subst this_subst = start_lexstate () ; subst := this_subst ;; let flushing = ref false ;; let start_normal this_subst = start_lexstate () ; save_flags () ; display := false ; in_math := false ; subst := this_subst and end_normal () = restore_flags () ; restore_lexstate () ;; let full_peek_char lexbuf = let rec full_peek lexbuf = try Save.peek_next_char lexbuf with Not_found -> if MyStack.empty stack_lexbuf then raise Not_found else full_peek (previous_lexbuf ()) in full_peek lexbuf let full_save_arg eoferror mkarg parg lexfun lexbuf = let rec save_rec lexbuf = try let arg = lexfun lexbuf in mkarg arg !subst with Save.Eof -> begin if MyStack.empty stack_lexbuf then eoferror () else begin let lexbuf = previous_lexbuf () in if !verbose > 1 then begin prerr_endline "popping stack_lexbuf in full_save_arg"; pretty_lexbuf lexbuf ; prerr_args () end; save_rec lexbuf end end in let start_pos = Location.get_pos () in try Save.seen_par := false ; save_lexstate () ; let r = save_rec lexbuf in restore_lexstate () ; if !verbose > 2 then prerr_endline ("Arg parsed: '"^parg r^"'") ; r with | (Save.Error _ | Error _) as e -> restore_lexstate () ; Save.seen_par := false ; Location.print_this_pos start_pos ; prerr_endline "Parsing of argument failed" ; raise e | e -> restore_lexstate () ; raise e ;; let full_save_arg_limits eoferror parg lexfun lexbuf = let rec save_rec opt lexbuf = try lexfun opt lexbuf with Save.LimitEof r -> begin if MyStack.empty stack_lexbuf then match r with | None -> eoferror () | _ -> r else begin let lexbuf = previous_lexbuf () in if !verbose > 1 then begin prerr_endline "popping stack_lexbuf in full_save_arg_limits"; pretty_lexbuf lexbuf ; prerr_args () end; save_rec r lexbuf end end in let start_pos = Location.get_pos () in try Save.seen_par := false ; save_lexstate () ; let r = save_rec None lexbuf in restore_lexstate () ; if !verbose > 2 then prerr_endline ("Arg parsed: '"^parg r^"'") ; r with | (Save.Error _ | Error _) as e -> restore_lexstate () ; Save.seen_par := false ; Location.print_this_pos start_pos ; prerr_endline "Parsing of argument failed" ; raise e | e -> restore_lexstate () ; raise e ;; type ok = No of string | Yes of string list ;; let parg {arg=arg} = arg and pargs {arg=args} = String.concat ", " args and parg_list {arg=xs} = body_to_string xs and pok = function | {arg=Yes s} -> String.concat "" s | {arg=No s} -> "* default arg: ["^s^"] *" let eof_arg () = Save.empty_buffs () ; raise (Error "Eof while looking for argument") let save_arg lexbuf = full_save_arg eof_arg mkarg parg Save.arg lexbuf and save_body lexbuf = full_save_arg eof_arg mkarg parg_list Save.arg_list lexbuf and save_arg_with_delim delim lexbuf = full_save_arg eof_arg mkarg parg (Save.with_delim delim) lexbuf and save_filename lexbuf = full_save_arg eof_arg mkarg parg Save.filename lexbuf and save_verbatim lexbuf = full_save_arg eof_arg mkarg parg Save.arg_verbatim lexbuf and save_xy_arg lexbuf = full_save_arg eof_arg mkarg parg Save.xy_arg lexbuf and save_cite_arg lexbuf = full_save_arg eof_arg mkarg pargs Save.cite_arg lexbuf type sup_sub = { limits : Misc.limits option ; sup : string arg ; sub : string arg ; } let plimits = function | Some Limits -> "\\limits" | Some NoLimits -> "\\nolimits" | Some IntLimits -> "\\intlimits" | None -> "*no limit info*" exception Over let eof_over () = raise Over let save_limits lexbuf = let rec do_rec res = try let r = full_save_arg_limits eof_over plimits Save.get_limits lexbuf in match r with | None -> res | Some _ -> do_rec r with | Over -> res in do_rec None let mkoptionarg opt subst = match opt with | None -> None | Some s -> Some (mkarg s subst) and poptionarg = function | None -> "*None*" | Some a -> a.arg let save_sup lexbuf = try full_save_arg eof_over mkoptionarg poptionarg Save.get_sup lexbuf with | Over -> None and save_sub lexbuf = try full_save_arg eof_over mkoptionarg poptionarg Save.get_sub lexbuf with | Over -> None let unoption = function | None -> {arg="" ; subst=top_subst } | Some a -> a let save_sup_sub lexbuf = let limits = save_limits lexbuf in match save_sup lexbuf with | None -> let sub = save_sub lexbuf in let sup = save_sup lexbuf in {limits=limits ; sup = unoption sup ; sub = unoption sub} | Some sup -> let sub = save_sub lexbuf in {limits=limits ; sup = sup ; sub = unoption sub} let protect_save_string lexfun lexbuf = full_save_arg eof_arg (fun s _ -> s) (fun s -> s) lexfun lexbuf let eof_opt default () = {arg=No default ; subst=Top } let save_arg_opt default lexbuf = let r = full_save_arg (eof_opt default) mkarg pok (fun lexbuf -> try Yes (Save.opt_list lexbuf) with | Save.NoOpt -> No default) lexbuf in match r.arg with | Yes _ -> r | No _ -> mkarg (No default) !subst ;; let from_ok okarg = match okarg.arg with | Yes s -> optarg := true ; mkarg s okarg.subst | No s -> optarg := false ; mkarg [s] okarg.subst let pretty_ok = function Yes s -> "+"^String.concat "" s^"+" | No s -> "-"^s^"-" ;; let norm_arg s = String.length s = 2 && s.[0] = '#' && ('0' <= s.[1] && s.[1] <= '9') let list_arg a = { a with arg = [a.arg] } let rec parse_args_norm pat lexbuf = match pat with | [] -> [] | s :: (ss :: _ as pat) when norm_arg s && norm_arg ss -> let arg = save_body lexbuf in let r = parse_args_norm pat lexbuf in arg :: r | s :: ss :: pat when norm_arg s && not (norm_arg ss) -> let arg = save_arg_with_delim ss lexbuf in list_arg arg :: parse_args_norm pat lexbuf | s :: pat when not (norm_arg s) -> Save.skip_delim s lexbuf ; parse_args_norm pat lexbuf | _ :: pat -> let arg = save_body lexbuf in let r = parse_args_norm pat lexbuf in arg :: r ;; let skip_csname lexbuf = let _ = Save.csname (fun x -> x) (fun x -> x) lexbuf in () let skip_opt lexbuf = let _ = save_arg_opt "" lexbuf in () and save_opt def lexbuf = from_ok (save_arg_opt def lexbuf) ;; let rec save_opts pat lexbuf = match pat with [] -> [] | def::rest -> let arg = save_arg_opt def lexbuf in let r = save_opts rest lexbuf in arg :: r ;; let parse_args (popt,pat) lexbuf = Save.seen_par := false ; let opts = save_opts popt lexbuf in begin match pat with | s :: ss :: _ when norm_arg s && not (norm_arg ss) -> Save.skip_blanks_init lexbuf | _ -> () end ; let args = parse_args_norm pat lexbuf in (opts,args) ;; let make_stack name pat lexbuf = try let (opts,args) = parse_args pat lexbuf in let args = Array.of_list (List.map from_ok opts@args) in if !verbose > 1 then begin Printf.fprintf stderr "make_stack for macro: %s " name ; pretty_pat pat ; prerr_endline ""; for i = 0 to Array.length args-1 do Printf.fprintf stderr "\t#%d = %a\n" (i+1) pretty_body args.(i).arg ; pretty_subst (args.(i).subst) done end ; Env args with Save.Delim delim -> raise (Error ("Use of "^name^ " does not match its definition (delimiter: "^delim^")")) ;; let scan_this lexfun s = start_lexstate (); if !verbose > 1 then begin Printf.fprintf stderr "scan_this : [%s]" s ; prerr_endline "" end ; let lexbuf = MyLexing.from_string s in let r = lexfun lexbuf in if !verbose > 1 then begin Printf.fprintf stderr "scan_this : over" ; prerr_endline "" end ; restore_lexstate (); r and scan_this_list lexfun xs = start_lexstate (); if !verbose > 1 then begin eprintf "scan_this_list : [%a]" pretty_body xs ; prerr_endline "" end ; let lexbuf = MyLexing.from_list xs in let r = lexfun lexbuf in if !verbose > 1 then begin Printf.fprintf stderr "scan_this_list : over" ; prerr_endline "" end ; restore_lexstate (); r and scan_this_arg lexfun {arg=s ; subst=this_subst } = start_lexstate () ; subst := this_subst ; if !verbose > 1 then begin Printf.fprintf stderr "scan_this_arg : [%s]" s ; prerr_endline "" end ; let lexbuf = MyLexing.from_string s in let r = lexfun lexbuf in if !verbose > 1 then begin Printf.fprintf stderr "scan_this_arg : over" ; prerr_endline "" end ; restore_lexstate (); r and scan_this_arg_list lexfun {arg=xs ; subst=this_subst } = start_lexstate () ; subst := this_subst ; if !verbose > 1 then begin Printf.fprintf stderr "scan_this_arg_list : [%a]\n%!" pretty_body xs end ; let lexbuf = MyLexing.from_list xs in let r = lexfun lexbuf in if !verbose > 1 then begin Printf.fprintf stderr "scan_this_arg : over\n%!" end ; restore_lexstate (); r ;; let scan_this_may_cont lexfun lexbuf cur_subst {arg=s ; subst=env } = if !verbose > 1 then begin Printf.fprintf stderr "scan_this_may_cont : [%s]" s ; prerr_endline "" ; if !verbose > 1 then begin prerr_endline "Pushing lexbuf and env" ; pretty_lexbuf lexbuf ; pretty_subst !subst end end ; save_lexstate (); record_lexbuf lexbuf cur_subst ; subst := env ; let lexer = MyLexing.from_string s in let r = lexfun lexer in restore_lexstate (); if !verbose > 1 then begin Printf.fprintf stderr "scan_this_may_cont : over" ; prerr_endline "" end ; r let scan_this_list_may_cont lexfun lexbuf cur_subst {arg=s ; subst=env } = if !verbose > 1 then begin eprintf "scan_this_list_may_cont : [%a]\n%!" pretty_body s ; if !verbose > 1 then begin prerr_endline "Pushing lexbuf and env" ; pretty_lexbuf lexbuf ; pretty_subst !subst end end ; save_lexstate (); record_lexbuf lexbuf cur_subst ; subst := env ; let lexer = MyLexing.from_list s in let r = lexfun lexer in restore_lexstate (); if !verbose > 1 then begin Printf.fprintf stderr "scan_this_list_may_cont : over" ; prerr_endline "" end ; r let real_input_file loc_verb main filename input = if !verbose > 0 then prerr_endline ("Input file: "^filename) ; let buf = Lexing.from_channel input in Location.set filename buf ; let old_verb = !verbose in verbose := loc_verb ; if !verbose > 1 then prerr_endline ("scanning: "^filename) ; start_lexstate () ; let old_lexstate = MyStack.save stack_lexstate in subst := Top ; begin try main buf with | Misc.EndInput -> MyStack.restore stack_lexstate old_lexstate | e -> MyStack.restore stack_lexstate old_lexstate ; restore_lexstate (); close_in input ; verbose := old_verb ; (* NO Location.restore () ; for proper error messages *) raise e end ; restore_lexstate (); if !verbose > 1 then prerr_endline ("scanning over: "^filename) ; close_in input ; verbose := old_verb ; Location.restore () let input_file loc_verb main filename = try let filename,input = Myfiles.open_tex filename in real_input_file loc_verb main filename input with Myfiles.Except -> begin if !verbose > 0 then prerr_endline ("Not opening file: "^filename) ; raise Myfiles.Except end | Myfiles.Error m as x -> begin Misc.warning m ; raise x end (* Hot start *) type saved = (string * bool ref) list * bool list let cell_list = ref [] let checkpoint () = !cell_list, List.map (fun (_,cell) -> !cell) !cell_list ; and hot_start (cells, values) = let rec start_rec cells values = match cells, values with | [],[] -> () | (name,cell)::rcells, value :: rvalues -> if !verbose > 1 then begin prerr_endline ("Restoring "^name^" as "^if value then "true" else "false") end ; cell := value ; start_rec rcells rvalues | _,_ -> Misc.fatal ("Trouble in Lexstate.hot_start") in start_rec cells values ; cell_list := cells let register_cell name cell = cell_list := (name,cell) :: !cell_list and unregister_cell name = let rec un_rec = function | [] -> Misc.warning ("Cannot unregister cell: "^name) ; [] | (xname,cell) :: rest -> if xname = name then rest else (xname,cell) :: un_rec rest in cell_list := un_rec !cell_list hevea-2.30/mathML.ml0000644004317100512160000003701512017660721014300 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) let header = "$Id: mathML.ml,v 1.29 2012-06-05 14:55:39 maranget Exp $" open Misc open Parse_opts open Element open HtmlCommon open MyStack (*----------*) (* DISPLAYS *) (*----------*) let begin_item_display f is_freeze = if !verbose > 2 then begin Printf.fprintf stderr "begin_item_display: ncols=%d empty=%s" flags.ncols (sbool flags.empty) ; prerr_newline () end ; open_block (OTHER "mrow") ""; open_block INTERN "" ; if is_freeze then(* push out_stack (Freeze f) ;*)freeze f; and end_item_display () = let f,is_freeze = pop_freeze () in let _ = close_flow_loc check_empty INTERN in if close_flow_loc check_empty (OTHER "mrow") then flags.ncols <- flags.ncols + 1; if !verbose > 2 then begin Printf.fprintf stderr "end_item_display: ncols=%d stck: " flags.ncols; pretty_stack out_stack end; flags.vsize,f,is_freeze and open_display () = if !verbose > 2 then begin Printf.fprintf stderr "open_display: " end ; try_open_display () ; open_block (OTHER "mrow") ""; do_put_char '\n'; open_block INTERN "" ; if !verbose > 2 then begin pretty_cur !cur_out ; prerr_endline "" end and close_display () = if !verbose > 2 then begin prerr_flags "=> close_display" end ; if not (flush_freeze ()) then begin close_flow INTERN ; let n = flags.ncols in if (n = 0 && not flags.blank) then begin if !verbose > 2 then begin prerr_string "No Display n=0" ; (Out.debug stderr !cur_out.out); prerr_endline "" end; let active = !cur_out.active and pending = !cur_out.pending in do_close_mods () ; let ps,_,ppout = pop_out out_stack in if ps <> (OTHER "mrow") then failclose "close_display" ps (OTHER "mrow") ; try_close_block (OTHER "mrow"); let old_out = !cur_out in cur_out := ppout ; do_close_mods () ; Out.copy old_out.out !cur_out.out ; flags.empty <- false ; flags.blank <- false ; !cur_out.pending <- to_pending pending active end else if (n=1 (*&& flags.blank*)) then begin if !verbose > 2 then begin prerr_string "No display n=1"; (Out.debug stderr !cur_out.out); prerr_endline "" ; end; let active = !cur_out.active and pending = !cur_out.pending in let ps,_,pout = pop_out out_stack in if ps<> (OTHER "mrow") then failclose "close_display" ps (OTHER "mrow"); try_close_block (OTHER "mrow") ; let old_out = !cur_out in cur_out := pout ; do_close_mods () ; if flags.blank then Out.copy_no_tag old_out.out !cur_out.out else Out.copy old_out.out !cur_out.out; flags.empty <- false ; flags.blank <- false ; !cur_out.pending <- to_pending pending active end else begin if !verbose > 2 then begin prerr_string ("One Display n="^string_of_int n) ; (Out.debug stderr !cur_out.out); prerr_endline "" end; flags.empty <- flags.blank ; close_flow (OTHER "mrow") ; do_put_char '\n'; end ; try_close_display () end ; if !verbose > 2 then prerr_flags ("<= close_display") ;; let open_display_varg _ = open_display () let do_item_display _force = if !verbose > 2 then begin prerr_endline ("Item Display in mathML ncols="^string_of_int flags.ncols^" table_inside="^sbool flags.table_inside) end ; let f,is_freeze = pop_freeze () in if ((*force && *)not flags.empty) || flags.table_inside then flags.ncols <- flags.ncols + 1 ; let active = !cur_out.active and pending = !cur_out.pending in close_flow INTERN ; open_block INTERN ""; !cur_out.pending <- to_pending pending active; !cur_out.active <- [] ; if is_freeze then freeze f; if !verbose > 2 then begin prerr_string ("out item_display -> ncols="^string_of_int flags.ncols^" ") ; pretty_stack out_stack end ; ;; let item_display () = do_item_display false and force_item_display () = do_item_display true ;; let erase_display () = erase_block INTERN ; erase_block (OTHER "mrow"); try_close_display () ;; let open_maths display = if !verbose > 1 then prerr_endline "=> open_maths"; push stacks.s_in_math flags.in_math; if display then do_put "
\n"; if not flags.in_math then open_block (OTHER "math") "align=\"center\"" else erase_mods [Style "mtext"]; do_put_char '\n'; flags.in_math <- true; open_display (); open_display (); ;; let close_maths _display = if !verbose >1 then prerr_endline "=> close_maths"; close_display (); close_display (); flags.in_math <- pop stacks.s_in_math ; do_put_char '\n'; if not flags.in_math then begin close_block (OTHER "math") end else open_mod (Style "mtext"); ;; let insert_vdisplay open_fun = if !verbose > 2 then begin prerr_flags "=> insert_vdisplay" ; end ; try let mods = to_pending !cur_out.pending !cur_out.active in let bs,bargs,bout = pop_out out_stack in if bs <> INTERN then failclose "insert_vdisplay" bs INTERN ; let ps,pargs,pout = pop_out out_stack in if ps <> (OTHER "mrow") then failclose "insert_vdisplay" ps (OTHER "mrow"); let new_out = create_status_from_scratch false [] in push_out out_stack (ps,pargs,new_out) ; push_out out_stack (bs,bargs,bout) ; close_display () ; cur_out := pout ; open_fun () ; do_put (Out.to_string new_out.out) ; flags.empty <- false ; flags.blank <- false ; if !verbose > 2 then begin prerr_string "insert_vdisplay -> " ; pretty_mods stderr mods ; prerr_newline () end ; if !verbose > 2 then prerr_flags "<= insert_vdisplay" ; mods with PopFreeze -> raise (UserError "wrong parenthesization"); ;; (* delaying output .... *) (* let delay f = if !verbose > 2 then prerr_flags "=> delay" ; push vsize_stack flags.vsize ; flags.vsize <- 0; push delay_stack f ; open_block "DELAY" "" ; if !verbose > 2 then prerr_flags "<= delay" ;; let flush x = if !verbose > 2 then prerr_flags ("=> flush arg is ``"^string_of_int x^"''"); try_close_block "DELAY" ; let ps,_,pout = pop_out out_stack in if ps <> "DELAY" then raise (Misc.Fatal ("html: Flush attempt on: "^ps)) ; let mods = !cur_out.active @ !cur_out.pending in do_close_mods () ; let old_out = !cur_out in cur_out := pout ; let f = pop "delay" delay_stack in f x ; Out.copy old_out.out !cur_out.out ; flags.empty <- false ; flags.blank <- false ; free old_out ; !cur_out.pending <- mods ; flags.vsize <- max (pop "vsive" vsize_stack) flags.vsize ; if !verbose > 2 then prerr_flags "<= flush" ;; *) (* put functions *) let is_digit = function '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'0'|'.'|',' -> true | _ -> false ;; let is_number s = let r = ref true in for i = 0 to String.length s -1 do r := !r && is_digit s.[i] done; !r ;; let is_op = function "+" | "-"|"/"|"*"|"%"|"<"|">"|"="|"("|")"|"{"|"}"|"["|"]"|","|";"|":"|"|"|"&"|"#"|"!"|"~"|"$" -> true | _ -> false ;; let is_letter = function | 'a'..'Z'|'A'..'Z' -> true | _ -> false let is_ident s = let r = ref true in for i = 0 to String.length s-1 do r := !r && is_letter s.[i] done ; !r let is_open_delim = function | "(" | "[" | "{" | "<" -> true | _ -> false and is_close_delim = function | ")" | "]" | "}" | ">" -> true | _ -> false ;; let open_delim () = open_display (); freeze ( fun () -> close_display (); close_display ();); and is_close () = let f, is_freeze = pop_freeze () in if is_freeze then begin freeze f; false end else true and close_delim () = let _, is_freeze = pop_freeze () in if is_freeze then begin close_display (); end else begin close_display (); open_display (); warning "Math expression improperly parenthesized"; end ;; let put s = if !verbose > 1 then Printf.eprintf "MATH PUT: «%s»\n" s ; let s_blank = let r = ref true in for i = 0 to String.length s - 1 do r := !r && is_blank (String.get s i) done ; !r in if not s_blank then begin let s_op = is_op s and s_number = is_number s in if is_open_delim s then open_delim (); let s_text = if is_close_delim s then is_close () else false in if (s_op || s_number) && !Lexstate.display then force_item_display (); do_pending () ; flags.empty <- false; flags.blank <- s_blank && flags.blank ; if s_number then begin do_put (" "^s^" \n") end else if is_ident s then begin do_put (" "^s^" \n") end else if s_text then begin do_put (""^s^"") end else if s_op then begin do_put (" "^s^" \n"); end else begin do_put s end; if is_close_delim s then close_delim () end ;; let put_char c = let c_blank = is_blank c in if c <> ' ' then begin let s = String.make 1 c in let c_op = is_op s in let c_digit = is_digit c in if is_open_delim s then open_delim (); let c_text = if is_close_delim s then is_close () else false in if (c_op || c_digit) && !Lexstate.display then force_item_display (); do_pending () ; flags.empty <- false; flags.blank <- c_blank && flags.blank ; if c_digit then begin do_put (" "^s^" \n") end else if c_text then begin do_put (""^s^"") end else if c_op then begin do_put (" "^s^" \n"); end else begin do_put_char c; end; if is_close_delim s then close_delim (); end ;; let put_in_math s = if flags.in_pre && !pedantic then put s else begin if !Lexstate.display then force_item_display (); do_pending () ; do_put " "; do_put s; do_put " \n"; flags.empty <- false; flags.blank <- false; end ;; (* Sup/Sub stuff *) let put_sup_sub display scanner (arg : string Lexstate.arg) = if display then open_display () else open_block INTERN "" ; scanner arg ; if display then close_display () else close_block INTERN ; ;; (* let insert_sub_sup tag s t = let f, is_freeze = pop_freeze () in let ps,pargs,pout = pop_out out_stack in if ps <> INTERN then failclose "sup_sub" ps INTERN ; let new_out = create_status_from_scratch false [] in push_out out_stack (ps,pargs,new_out); close_block INTERN; cur_out := pout; open_block tag ""; open_display (); let texte = Out.to_string new_out.out in do_put (if texte = "" then "" else texte); flags.empty <- false; flags.blank <- false; free new_out; close_display (); put_sub_sup s; if t<>"" then put_sub_sup t; close_block tag; open_block INTERN ""; if is_freeze then freeze f ;; *) let standard_sup_sub scanner what sup sub display = if !verbose > 1 then Printf.eprintf "STANDARD «%s, %s» display=%B\n" sup.Lexstate.arg sub.Lexstate.arg display ; let sup, _ = hidden_to_string (fun () -> put_sup_sub display scanner sup) in let sub,_ = hidden_to_string (fun () -> put_sup_sub display scanner sub) in if !verbose > 1 then Printf.eprintf "STANDARD FORMAT «%s, %s»\n" sup sub ; match sub,sup with | "","" -> what () | a,"" -> open_block (OTHER "msub") ""; if display then open_display (); what (); if flags.empty then do_put "" ; if display then close_display (); put a ; close_block (OTHER "msub") ; | "",b -> open_block (OTHER "msup") ""; if display then open_display (); what (); if flags.empty then do_put "" ; if display then close_display (); put b ; close_block (OTHER "msup") ; | a,b -> open_block (OTHER "msubsup") ""; if display then open_display (); what (); if flags.empty then do_put "" ; if display then close_display (); put a ; put "\n" ; put b ; close_block (OTHER "msubsup") ; ;; let limit_sup_sub scanner what sup sub display = if !verbose > 1 then Printf.eprintf "STANDARD «%s, %s»\n" sup.Lexstate.arg sub.Lexstate.arg ; let sup, _ = hidden_to_string (fun () -> put_sup_sub display scanner sup) in let sub, _ = hidden_to_string (fun () -> put_sup_sub display scanner sub) in match sub,sup with | "","" -> what () | a,"" -> open_block (OTHER "munder") ""; if display then open_display (); what (); if flags.empty then do_put "" ; if display then close_display (); do_put a ; close_block (OTHER "munder") ; | "",b -> open_block (OTHER "mover") ""; if display then open_display (); what (); if flags.empty then do_put "" ; if display then close_display (); do_put b ; close_block (OTHER "mover") ; | a,b -> open_block (OTHER "munderover") ""; if display then open_display (); what (); if flags.empty then do_put "" ; if display then close_display (); do_put a ; do_put "\n" ; do_put b ; close_block (OTHER "munderover") ; ;; let int_sup_sub _something _vsize scanner what sup sub display = standard_sup_sub scanner what sup sub display ;; let over _lexbuf = force_item_display (); let _mods = insert_vdisplay (fun () -> open_block (OTHER "mfrac") ""; open_display ()) in force_item_display (); flags.ncols <- flags.ncols +1; close_display () ; open_display () ; freeze (fun () -> force_item_display (); flags.ncols <- flags.ncols +1; close_display () ; close_block (OTHER "mfrac")) ;; let box_around_display _scanner _arg = ();; let over_align _align1 _align2 _display lexbuf = over lexbuf ;; let tr = function "<" -> "<" | ">" -> ">" | "\\{" -> "{" | "\\}" -> "}" | s -> s ;; let left delim _ k = force_item_display (); open_display (); if delim <>"." then put (" "^ tr delim^" "); k 0 ; force_item_display (); freeze ( fun () -> force_item_display (); close_display (); warning "Left delimitor not matched with a right one."; force_item_display (); close_display ();) ;; let right delim _ = if !Lexstate.display then force_item_display (); if delim <> "." then put (" "^tr delim^" "); if !Lexstate.display then force_item_display (); let f,is_freeze = pop_freeze () in if not is_freeze then begin warning "Right delimitor alone"; close_display (); open_display (); end else begin try let ps,parg,pout = pop_out out_stack in let pps,pparg,ppout = pop_out out_stack in if pblock() = (OTHER "mfrac") then begin warning "Right delimitor not matched with a left one."; push_out out_stack (pps,pparg,ppout); push_out out_stack (ps,parg,pout); freeze f; close_display (); open_display (); end else begin push_out out_stack (pps,pparg,ppout); push_out out_stack (ps,parg,pout); close_display (); end; with PopFreeze -> raise (UserError ("Bad placement of right delimitor")); end; 3 ;; hevea-2.30/pub.txt0000644004317100512160000000066612021655445014117 0ustar marangetcristalIt is my pleasure to announce the new, 2.00 release of HEVEA. HEVEA is a LaTeX to HTML translator. The input language is a fairly complete subset of LaTeX2e and the output language is HTML that is (hopefully) correct with respect to version 4.0 (transitional) HEVEA web page is This release is a major one as hevea output has changed from HTML 4.01 transitional to HTML version 5. --Luc hevea-2.30/deepcut.hva0000644004317100512160000000430310505741042014703 0ustar marangetcristal%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Instruct hacha to cut everywhere from part to subsection %% %% Some code contributed by Gilles Gregoire %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Inactivate cutting macros % %%%%%%%%%%%%%%%%%%%%%%%%%%%%% \let\dc@cutdef\cutdef \let\dc@cutend\cutend %%%%%%%%%%%%%%%%%%% %% cut footnotes % %%%%%%%%%%%%%%%%%%% \let\deepcut@thefootnotes\thefootnotes \let\enddeepcut@thefootnotes\endthefootnotes \renewenvironment{thefootnotes}[2][] {\begin{cutflow}{Notes}\begin{deepcut@thefootnotes}{#2}} {\end{deepcut@thefootnotes}\end{cutflow}} %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% sectionning commands %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newif\ifcutchapter\cutchapterfalse \let\dc@part\part\let\dc@part*\part* \renewcommand{\part}[2][] {\ifcutsubsection\dc@cutend\fi\cutsubsectionfalse \ifcutsection\dc@cutend\fi\cutsectionfalse \ifcutchapter\dc@cutend\fi \ife#1\dc@part{#2}\else\dc@part[#1]{#2}\fi \dc@cutdef{chapter}\cutchaptertrue} \renewcommand{\part*}[1] {\ifcutsubsection\dc@cutend\fi\cutsubsectionfalse \ifcutsection\dc@cutend\fi\cutsectionfalse \ifcutchapter\dc@cutend\fi \dc@part*{#1}% \dc@cutdef{chapter}\cutchaptertrue} %%%%%%%%%%%%%%%%%% \newif\ifcutsection\cutsectionfalse \@ifundefined{chapter}{} {\let\dc@chapter\chapter\let\dc@chapter*\chapter* \renewcommand{\chapter}[2][] {\ifcutsubsection\dc@cutend\fi\cutsubsectionfalse \ifcutsection\dc@cutend\fi \ife#1\dc@chapter{#2}\else\dc@chapter[#1]{#2}\fi \dc@cutdef{section}\cutsectiontrue} \renewcommand{\chapter*}[1] {\ifcutsubsection\dc@cutend\fi\cutsubsectionfalse \ifcutsection\dc@cutend\fi \dc@chapter*{#1}% \dc@cutdef{section}\cutsectiontrue}} %%%%%%%%%%%%%%%%%% \newif\ifcutsubsection\cutsubsectionfalse \let\dc@section\section \let\dc@section*\section* \renewcommand{\section}[2][] {\ifcutsubsection\dc@cutend\fi \ife#1\dc@section{#2}\else\dc@section[#1]{#2}\fi \dc@cutdef{subsection}\cutsubsectiontrue} \renewcommand{\section*}[1] {\ifcutsubsection\dc@cutend\fi \dc@section*{#1}% \dc@cutdef{subsection}\cutsubsectiontrue} %%%%%Check that! \AtEndDocument {\ifcutsubsection\dc@cutend\fi\ifcutsection\dc@cutend\fi\ifcutchapter\dc@cutend\fi} hevea-2.30/imagen.std0000755004317100512160000000461711330060611014532 0ustar marangetcristal#! /bin/sh LATEX=latex DVIPS=dvips GS=gs RESOLUTION=100 # resolution in dpi PNMCROP="pnmcrop -white" PNMEXTRA="" PNMMARGIN="pnmmargin -white 1" PPMQUANT="" #PPMTOEXT="pnmtopng -transparent '#ffffff'" #EXT=png PPMTOEXT="ppmtogif -transparent '#ffffff'" EXT=gif TODIR="." RM="/bin/rm -f" while true do case $1 in -todir) shift TODIR="$1" mkdir -p ${TODIR} 2> /dev/null || : ;; -gif) PPMTOEXT="ppmtogif -transparent '#ffffff'" EXT=gif ;; -png) PPMTOEXT="pnmtopng -transparent '#ffffff'" EXT=png ;; -pnm) PPMTOEXT=cat EXT=pnm ;; -quant) shift PPMQUANT="ppmquant $1 2>/dev/null |" ;; -extra) shift PNMEXTRA="$1 |" ;; -mag) shift RESOLUTION="$( expr '(' "$1" '*' 72 '+' 999 ')' '/' 1000)" ;; -res) shift RESOLUTION="$1" ;; -t) shift TPAPER="-t $1" ;; -pdflatex|-pdf) LATEX=pdflatex DVIPS=cat ;; *) break ;; esac shift done echo "RESOLUTION: $RESOLUTION" #always quantize for gifs (ppmtogif ouputs non valid files when colors >= 256) if [ "$EXT" = "gif" -a -z "$PPMQUANT" ] then PPMQUANT="ppmquant 255 2>/dev/null |" fi case $1 in '') BASE=image ;; *) BASE=$1 ;; esac NAME=${BASE}.image trap "${RM} ${NAME}.dvi ${NAME}.pdf `basename ${NAME}.log` `basename ${NAME}.aux` head.tmp body.tmp ; exit 2" 1 2 3 8 10 13 15 DVIPSOPTS="-Z $TPAPER" GSOPTS="-q -dNOPAUSE -dBATCH -DNOPROMPT -sDEVICE=ppmraw \ -r$RESOLUTION -dAutoRotatePages=/None \ -dTextAlphaBits=4 -dGraphicsAlphaBits=4" if [ "${TODIR}" = "." ] then FINAL=${BASE}%03d.${EXT} else FINAL=${TODIR}/${BASE}%03d.${EXT} fi test -f ${NAME}.tex ||\ { echo "Failure: no ${NAME}.tex file!" 2>&1 ; exit 2 ; } ${LATEX} ${NAME}.tex NAMEDIR=`dirname ${NAME}` if [ "${LATEX}" = "pdflatex" ] then if [ ${NAMEDIR} != "." ] then mv `basename ${NAME}.pdf` ${NAME}.pdf fi cat ${NAME}.pdf else if [ ${NAMEDIR} != "." ] then mv `basename ${NAME}.dvi` ${NAME}.dvi fi ${DVIPS} ${DVIPSOPTS} -o - ${NAME}.dvi fi |\ ${GS} ${GSOPTS} -sOutputFile="|\ ${PNMCROP} | ${PNMEXTRA} \ ${PNMMARGIN} | ${PPMQUANT} \ ${PPMTOEXT} 2>/dev/null > ${FINAL}" - ${RM} ${NAME}.dvi ${NAME}.pdf head.tmp body.tmp ${RM} `basename ${NAME}.log` `basename ${NAME}.aux`hevea-2.30/text.ml0000644004317100512160000014305512403604646014107 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Printf open Misc open Element open Lexstate open MyStack open Length exception Error of string;; let failclose s = raise (Misc.Close s) ;; type block = | ALIGN | HEAD | QUOTE | QUOTATION | PRE | INFO | INFOLINE | DELAY | AFTER | TEMP | UL | DL | OL | NONE | GROUP | OTHER of string let blocks = [ ALIGN,"ALIGN" ; HEAD,"HEAD" ; QUOTE,"QUOTE" ; QUOTATION,"QUOTATION" ; PRE,"PRE" ; INFO,"INFO" ; INFOLINE,"INFOLINE" ; DELAY,"DELAY" ; AFTER,"AFTER" ; TEMP,"TEMP" ; UL,"UL" ; OL,"OL" ; DL,"DL" ; NONE,"NONE" ; GROUP,"" ; ] let b2s = Hashtbl.create 17 and s2b = Hashtbl.create 17 let () = List.iter (fun (b,s) -> Hashtbl.add b2s b s ; Hashtbl.add s2b s b ; ()) blocks let tr_block s a = let s = String.uppercase s in try Hashtbl.find s2b s with Not_found -> Misc.warning (sprintf "Undefined block in text mode: '%s' [%s]" s a) ; OTHER s let pp_block b = try Hashtbl.find b2s b with Not_found -> match b with | OTHER s -> sprintf "'%s'" s | _ -> assert false (* output globals *) type status = { mutable nostyle : bool ; mutable active : text list ; mutable out : Out.t; mutable temp : bool };; type stack_item = Normal of block * string * status | Freeze of (unit -> unit) ;; exception PopFreeze ;; let push_out s (a,b,c) = push s (Normal (a,b,c)) ;; let pretty_stack s = MyStack.pretty (function | Normal (s,args,_) -> sprintf "[%s]-{%s} " (pp_block s) args | Freeze _ -> "Freeze ") s ;; let pop_out s = match pop s with Normal (a,b,c) -> a,b,c | Freeze _ -> raise PopFreeze ;; let free_list = ref [];; let out_stack = MyStack.create "out_stack";; let pblock () = if empty out_stack then NONE else match top out_stack with | Normal (s,_,_) -> s | _ -> NONE ;; let free out = out.nostyle<-false; out.active<-[]; Out.reset out.out; free_list := out :: !free_list ;; let cur_out = ref { nostyle = false; active=[]; out=Out.create_null(); temp=false };; let set_out out = !cur_out.out <- out ;; let newstatus nostyle _ a t = match !free_list with [] -> { nostyle = nostyle; active = a; out = Out.create_buff (); temp = t; } | e::reste -> free_list:=reste; e.nostyle <- nostyle; e.active <- a; e.temp <- t; assert (Out.is_empty e.out); e ;; type saved_out = status * stack_item MyStack.saved let save_out () = !cur_out, MyStack.save out_stack and restore_out (a,b) = if !cur_out != a then begin free !cur_out ; MyStack.finalize out_stack (function | Normal (_,_,out) -> out == a | _ -> false) (function | Normal (_,_,out) -> if out.temp then free out | _ -> ()) end ; cur_out := a ; MyStack.restore out_stack b type align_t = Left | Center | Right type flags_t = { mutable pending_par : int option; mutable empty : bool; (* Listes *) mutable nitems : int; mutable dt : string; mutable dcount : string; mutable last_closed : block; (* Alignement et formattage *) mutable align : align_t; mutable in_align : bool; mutable hsize : int; mutable x : int; mutable x_start : int; mutable x_end : int; mutable last_space : int; mutable first_line : int; mutable underline : string; mutable nocount : bool ; mutable in_table : bool; (* Maths *) mutable vsize : int; } ;; let flags = { pending_par = None; empty = true; nitems = 0; dt = ""; dcount = ""; last_closed = NONE; align = Left; in_align = false; hsize = !Parse_opts.width; x = 0; x_start = 0; x_end = !Parse_opts.width - 1; last_space = 0; first_line = 2; underline = ""; nocount = false ; in_table = false; vsize = 0; } ;; let copy_flags f = {f with vsize = flags.vsize} and set_flags f { pending_par = pending_par ; empty = empty ; nitems = nitems ; dt = dt ; dcount = dcount ; last_closed = last_closed ; align = align ; in_align = in_align ; hsize = hsize ; x = x ; x_start = x_start ; x_end = x_end ; last_space = last_space ; first_line = first_line ; underline = underline ; nocount = nocount ; in_table = in_table ; vsize = vsize } = f.pending_par <- pending_par ; f.empty <- empty ; f.nitems <- nitems ; f.dt <- dt ; f.dcount <- dcount ; f.last_closed <- last_closed ; f.align <- align ; f.in_align <- in_align ; f.hsize <- hsize ; f.x <- x ; f.x_start <- x_start ; f.x_end <- x_end ; f.last_space <- last_space ; f.first_line <- first_line ; f.underline <- underline ; f.nocount <- nocount ; f.in_table <- in_table ; f.vsize <- vsize type stack_t = { s_nitems : int MyStack.t ; s_dt : string MyStack.t ; s_dcount : string MyStack.t ; s_x : (int * int * int * int * int * int) MyStack.t ; s_align : align_t MyStack.t ; s_in_align : bool MyStack.t ; s_underline : string MyStack.t ; s_nocount : bool MyStack.t ; s_in_table : bool MyStack.t ; s_vsize : int MyStack.t ; s_active : Out.t MyStack.t ; s_pending_par : int option MyStack.t ; s_after : (string -> string) MyStack.t } let stacks = { s_nitems = MyStack.create "nitems" ; s_dt = MyStack.create "dt" ; s_dcount = MyStack.create "dcount" ; s_x = MyStack.create "x" ; s_align = MyStack.create "align" ; s_in_align = MyStack.create "in_align" ; s_underline = MyStack.create "underline" ; s_nocount = MyStack.create "nocount" ; s_in_table = MyStack.create "in_table" ; s_vsize = MyStack.create "vsize" ; s_active = MyStack.create "active" ; s_pending_par = MyStack.create "pending_par" ; s_after = MyStack.create "after" } type saved_stacks = { ss_nitems : int MyStack.saved ; ss_dt : string MyStack.saved ; ss_dcount : string MyStack.saved ; ss_x : (int * int * int * int * int * int) MyStack.saved ; ss_align : align_t MyStack.saved ; ss_in_align : bool MyStack.saved ; ss_underline : string MyStack.saved ; ss_nocount : bool MyStack.saved ; ss_in_table : bool MyStack.saved ; ss_vsize : int MyStack.saved ; ss_active : Out.t MyStack.saved ; ss_pending_par : int option MyStack.saved ; ss_after : (string -> string) MyStack.saved } let save_stacks () = { ss_nitems = MyStack.save stacks.s_nitems ; ss_dt = MyStack.save stacks.s_dt ; ss_dcount = MyStack.save stacks.s_dcount ; ss_x = MyStack.save stacks.s_x ; ss_align = MyStack.save stacks.s_align ; ss_in_align = MyStack.save stacks.s_in_align ; ss_underline = MyStack.save stacks.s_underline ; ss_nocount = MyStack.save stacks.s_nocount ; ss_in_table = MyStack.save stacks.s_in_table ; ss_vsize = MyStack.save stacks.s_vsize ; ss_active = MyStack.save stacks.s_active ; ss_pending_par = MyStack.save stacks.s_pending_par ; ss_after = MyStack.save stacks.s_after } and restore_stacks { ss_nitems = saved_nitems ; ss_dt = saved_dt ; ss_dcount = saved_dcount ; ss_x = saved_x ; ss_align = saved_align ; ss_in_align = saved_in_align ; ss_underline = saved_underline ; ss_nocount = saved_nocount ; ss_in_table = saved_in_table ; ss_vsize = saved_vsize ; ss_active = saved_active ; ss_pending_par = saved_pending_par ; ss_after = saved_after } = MyStack.restore stacks.s_nitems saved_nitems ; MyStack.restore stacks.s_dt saved_dt ; MyStack.restore stacks.s_dcount saved_dcount ; MyStack.restore stacks.s_x saved_x ; MyStack.restore stacks.s_align saved_align ; MyStack.restore stacks.s_in_align saved_in_align ; MyStack.restore stacks.s_underline saved_underline ; MyStack.restore stacks.s_nocount saved_nocount ; MyStack.restore stacks.s_in_table saved_in_table ; MyStack.restore stacks.s_vsize saved_vsize ; MyStack.restore stacks.s_active saved_active ; MyStack.restore stacks.s_pending_par saved_pending_par ; MyStack.restore stacks.s_after saved_after let check_stack what = if not (MyStack.empty what) && not !silent then begin prerr_endline ("Warning: stack "^MyStack.name what^" is non-empty in Html.finalize") ; end ;; let check_stacks () = match stacks with { s_nitems = nitems ; s_dt = dt ; s_dcount = dcount ; s_x = x ; s_align = align ; s_in_align = in_align ; s_underline = underline ; s_nocount = nocount ; s_in_table = in_table ; s_vsize = vsize ; s_active = active ; s_pending_par = pending_par ; s_after = after } -> check_stack nitems ; check_stack dt ; check_stack dcount ; check_stack x ; check_stack align ; check_stack in_align ; check_stack underline ; check_stack nocount ; check_stack in_table ; check_stack vsize ; check_stack active ; check_stack pending_par ; check_stack after (* Buffer for one line *) let line = Bytes.make (!Parse_opts.width +2) ' ' type saved = string * flags_t * saved_stacks * saved_out let check () = let saved_flags = copy_flags flags and saved_stacks = save_stacks () and saved_out = save_out () in Bytes.to_string line, saved_flags, saved_stacks, saved_out and hot (l,f,s,o) = String.blit l 0 line 0 (String.length l) ; set_flags flags f ; restore_stacks s ; restore_out o let stop () = MyStack.push stacks.s_active !cur_out.out ; MyStack.push stacks.s_pending_par flags.pending_par ; !cur_out.out <- Out.create_null () and restart () = !cur_out.out <- MyStack.pop stacks.s_active ; flags.pending_par <- MyStack.pop stacks.s_pending_par let do_do_put_char c = Out.put_char !cur_out.out c;; let do_do_put s = Out.put !cur_out.out s;; let do_put_line s = (* Ligne a formatter selon flags.align, avec les parametres courants.*) (* soulignage eventuel *) let taille = String.length s in let length = if s.[taille-1]='\n' then taille-1 else taille in let soul = ref false in for i = 0 to length - 1 do soul := !soul || s.[i] <> ' '; done; soul := !soul && s<>"\n" && flags.underline <> ""; let ligne = match flags.align with | Left -> s | Center -> let sp = (flags.hsize - (length -flags.x_start))/2 in String.make sp ' ' ^ s | Right -> let sp = flags.hsize - length + flags.x_start in String.make sp ' ' ^ s in if !verbose > 3 then prerr_endline ("line :"^ligne); do_do_put ligne; if !soul then begin let souligne = let l = Bytes.create taille in let len = String.length flags.underline in if len = 0 then raise (Misc.Fatal ("cannot underline with nothing:#" ^String.escaped flags.underline^"#"^ (if (flags.underline <> "") then "true" else "false" ))); for i = flags.x_start to length -1 do Bytes.set l i flags.underline.[(i-flags.x_start) mod len] done; if taille <> length then Bytes.set l length '\n'; match flags.align with | Left -> l | Center -> let sp = (flags.hsize - length)/2 +flags.x_start/2 in Bytes.cat (Bytes.make sp ' ') l | Right -> let sp = (flags.hsize - length) + flags.x_start in Bytes.cat (Bytes.make sp ' ') l in if !verbose >3 then prerr_endline ("line underlined:"^ Bytes.to_string souligne); do_do_put (Bytes.unsafe_to_string souligne); end ;; let do_flush () = if !verbose>3 && flags.x >0 then prerr_endline ("flush :#"^(Bytes.sub_string line 0 (flags.x))^"#"); if flags.x >0 then do_put_line (Bytes.sub_string line 0 flags.x) ; flags.x <- -1; ;; let do_put_char_format nbsp c = if !verbose > 3 then prerr_endline ("caracters read : '"^Char.escaped c^"', x="^string_of_int flags.x^", length ="^string_of_int (flags.hsize)); if not nbsp && c=' ' then flags.last_space <- flags.x; if flags.x =(-1) then begin (* La derniere ligne finissait un paragraphe : on indente *) (* eprintf "FIRST LINE: %i %i\n" flags.x_start flags.first_line ; *) flags.x<-flags.x_start + flags.first_line; for i = 0 to flags.x-1 do Bytes.set line i ' ' done; flags.last_space<-flags.x-1; end; Bytes.set line flags.x c; if c='\n' then begin (* Ligne prete *) if !verbose > 2 then prerr_endline("line not cut :["^Bytes.to_string line^"]"); do_put_line (Bytes.sub_string line 0 (flags.x +1)); flags.x <- -1; end else flags.x<-flags.x + 1; if flags.x>(flags.x_end +1) then begin (* depassement de ligne *) if (flags.x - flags.last_space) >= flags.hsize then begin (* On coupe brutalement le mot trop long *) if !verbose > 2 then prerr_endline ("line cut :"^ Bytes.to_string line); warning ("line too long"); Bytes.set line (flags.x-1) '\n'; (* La ligne est prete et complete*) do_put_line (Bytes.sub_string line 0 flags.x); for i = 0 to flags.x_start-1 do Bytes.set line i ' ' done; Bytes.set line flags.x_start c; flags.x<-flags.x_start + 1; flags.last_space<-flags.x_start-1; end else begin if !verbose > 2 then begin prerr_endline ("Line and the beginning of the next word :"^Bytes.to_string line); prerr_endline ("x ="^string_of_int flags.x); prerr_endline ("x_start ="^string_of_int flags.x_start); prerr_endline ("x_end ="^string_of_int flags.x_end); prerr_endline ("hsize ="^string_of_int flags.hsize); prerr_endline ("last_space ="^string_of_int flags.last_space); prerr_endline ("line size ="^string_of_int (Bytes.length line)); end; (* On repart du dernier espace *) let reste = let len = flags.x - flags.last_space -1 in if len = 0 then "" else Bytes.sub_string line (flags.last_space +1) len in (* La ligne est prete et incomplete*) Bytes.set line flags.last_space '\n'; do_put_line (Bytes.sub_string line 0 (flags.last_space+1)); for i = 0 to flags.x_start-1 do Bytes.set line i ' ' done; for i = flags.x_start to (flags.x_start+ String.length reste -1) do Bytes.set line i reste.[i-flags.x_start]; done; flags.x<- flags.x_start + (String.length reste); flags.last_space <- flags.x_start-1; end; end; ;; let direct_output () = !cur_out.temp || (Out.is_null !cur_out.out) let do_put_char c = if !verbose>3 then prerr_endline ("put_char:|"^String.escaped (String.make 1 c)^"|"); if direct_output () then do_do_put_char c else do_put_char_format false c and do_put_nbsp () = if direct_output () then do_do_put_char ' ' else do_put_char_format true ' ' ;; let finit_ligne () = if !verbose>3 then prerr_endline "ending the line."; if flags.x >0 then do_put_char '\n' ;; let do_unskip () = if !cur_out.temp || (Out.is_null !cur_out.out) then Out.unskip !cur_out.out else begin while flags.x > flags.x_start && Bytes.get line (flags.x-1) = ' ' do flags.x <- flags.x - 1 done ; flags.last_space <- flags.x ; while flags.last_space >= flags.x_start && Bytes.get line flags.last_space <> ' ' do flags.last_space <- flags.last_space - 1 done; if flags.x = flags.x_start && !cur_out.temp then Out.unskip !cur_out.out end let do_put s = if !verbose>3 then prerr_endline ("put:|"^String.escaped s^"|"); for i = 0 to String.length s - 1 do do_put_char s.[i] done ;; (* Gestion des styles : pas de style en mode texte *) let is_list = function | UL | DL | OL -> true | _ -> false ;; let get_fontsize () = 3;; let nostyle () = !cur_out.nostyle<-true ;; let clearstyle () = !cur_out.active<-[] ;; let open_mod m = if m=(Style "CODE") then begin do_put "'"; !cur_out.active <- m::!cur_out.active end; ;; let do_close_mod = function | Style "CODE" -> do_put "'"; | _ -> () ;; let close_mod () = match !cur_out.active with [] -> () | (Style "CODE" as s)::reste -> do_close_mod s; !cur_out.active <- reste | _ -> () ;; let has_mod _ = false (* No text-level elements in text *) let erase_mods _ = () ;; let close_mods () = List.iter do_close_mod !cur_out.active; !cur_out.active <- [] ;; let open_par () = () and close_par () = false let par = function (*Nombre de lignes a sauter avant le prochain put*) | Some n -> begin flags.pending_par <- (match pblock() with | QUOTE |QUOTATION -> Some (n-1) | _ -> Some n); if !verbose> 2 then eprintf "par: last_close=%s, r=%i\n" (pp_block flags.last_closed) n end | _ -> () let forget_par () = let r = flags.pending_par in flags.pending_par <- None; r ;; let flush_par n = flags.pending_par <- None; let p = n in do_put_char '\n' ; for _i=1 to p-1 do do_put_char '\n' done; if !verbose >2 then eprintf "flush_par : last_closed=%s, p=%i\n" (pp_block flags.last_closed) p ; flags.last_closed <- NONE ;; let try_flush_par () = match flags.pending_par with | Some n -> flush_par n | _ -> () ;; let do_pending () = begin match flags.pending_par with | Some n -> flush_par n | _ -> () end; flags.last_closed <- NONE ;; (* Blocs *) let try_open_block s args = (* Prepare l'environnement specifique au bloc en cours *) if !verbose > 2 then eprintf "=> try_open %s" (pp_block s) ; push stacks.s_x (flags.hsize,flags.x,flags.x_start,flags.x_end, flags.first_line,flags.last_space); push stacks.s_align flags.align; push stacks.s_in_align flags.in_align; if is_list s then begin do_put_char '\n'; push stacks.s_nitems flags.nitems; flags.nitems <- 0; flags.x_start <- flags.x_start + 3; flags.first_line <- -2 ; flags.hsize <- flags.x_end - flags.x_start+1; if not flags.in_align then begin flags.align <- Left end; if s=DL then begin push stacks.s_dt flags.dt; push stacks.s_dcount flags.dcount; flags.dt <- ""; flags.dcount <- ""; end; end else begin match s with | ALIGN -> begin finit_ligne (); flags.in_align<-true; flags.first_line <-2; match String.uppercase args with "LEFT" -> flags.align <- Left | "CENTER" -> flags.align <- Center | "RIGHT" -> flags.align <- Right | a -> raise (Misc.ScanError (sprintf "Invalid argument in ALIGN: %s" a)) end | HEAD -> begin finit_ligne (); flags.first_line <-0 ; push stacks.s_underline flags.underline; flags.underline <- args; end | QUOTE -> begin finit_ligne (); flags.in_align<-true; flags.align <- Left; flags.first_line<-0; flags.x_start<- flags.x_start + 5 * flags.hsize / 100; flags.hsize <- flags.x_end - flags.x_start+1; end | QUOTATION -> begin finit_ligne (); flags.in_align<-true; flags.align <- Left; flags.first_line<-2; flags.x_start<- flags.x_start + 5 * flags.hsize / 100; flags.hsize <- flags.x_end - flags.x_start+1; end | PRE -> flags.first_line <-0; finit_ligne (); do_put "<<"; flags.first_line <-2; | INFO -> push stacks.s_nocount flags.nocount ; flags.nocount <- true ; flags.first_line <-0 | INFOLINE -> push stacks.s_nocount flags.nocount ; flags.nocount <- true ; flags.first_line <-0 ; finit_ligne () | _ -> () end ; if !verbose > 2 then eprintf "<= try_open %s\n" (pp_block s) ;; let try_close_block s = let (h,_,xs,xe,fl,_) = pop stacks.s_x in flags.hsize<-h; flags.x_start<-xs; flags.x_end<-xe; flags.first_line <-fl; if (is_list s) then begin finit_ligne(); flags.nitems <- pop stacks.s_nitems; if s=DL then begin flags.dt <- pop stacks.s_dt; flags.dcount <- pop stacks.s_dcount end end else begin match s with | ALIGN | QUOTE | QUOTATION -> finit_ligne () | HEAD -> finit_ligne(); let u = pop stacks.s_underline in flags.underline <- u | PRE -> flags.first_line <-0; do_put ">>\n"; flags.first_line <-fl | INFO|INFOLINE -> flags.nocount <- pop stacks.s_nocount | _ -> () end ; let a = pop stacks.s_align in flags.align <- a; let ia = pop stacks.s_in_align in flags.in_align <- ia ;; let open_block s arg = let s = tr_block s arg in (* Cree et se place dans le bloc de nom s et d'arguments args *) if !verbose > 2 then eprintf "=> open_block '%s'\n" (pp_block s); push_out out_stack (s,arg,!cur_out); try_flush_par (); (* Sauvegarde de l'etat courant *) if !cur_out.temp || s=TEMP || s=AFTER then begin cur_out := newstatus !cur_out.nostyle !cur_out.active [] true; end; try_open_block s arg; if !verbose > 2 then eprintf "<= open_block '%s'" (pp_block s) ;; let do_force_block s = if !verbose > 2 then eprintf "force_block '%s'\n" (pp_block s) ; let old_out = !cur_out in try_close_block s; let ps,_,pout = pop_out out_stack in if ps <>DELAY then begin cur_out:=pout; if ps = AFTER then begin let f = pop stacks.s_after in Out.copy_fun f old_out.out !cur_out.out end else if !cur_out.temp then Out.copy old_out.out !cur_out.out; flags.last_closed<- s; if !cur_out.temp then free old_out; end else raise ( Misc.Fatal "text: unflushed DELAY") ;; let force_block s _content = do_force_block (tr_block s "") let do_close_block s = (* Fermeture du bloc : recuperation de la pile *) if !verbose > 2 then eprintf "=> close_block %s\n" (pp_block s); do_force_block s ; if !verbose > 2 then eprintf "<= close_block %s\n" (pp_block s); () let close_block s = do_close_block (tr_block s "") (* Hum, wrong *) let close_flow s = let active = !cur_out.active in close_block s ; !cur_out.active <- active ;; let insert_block _ arg = match String.uppercase arg with | "LEFT" -> flags.align <- Left | "CENTER" -> flags.align <- Center | "RIGHT" -> flags.align <- Right | _ -> raise (Misc.ScanError (sprintf "Invalid argument in ALIGN: %s" arg)) and insert_attr _ _ = () ;; (* Autres *) (* Listes *) let set_dcount s = flags.dcount <- s ;; let do_item isnum = if !verbose > 2 then begin prerr_string "do_item: stack="; pretty_stack out_stack end; if flags.nitems = 0 then begin let _ = forget_par () in () end ; try_flush_par () ; flags.nitems<-flags.nitems+1; do_put_char '\n' ; let saved = flags.first_line in flags.first_line <- 0 ; let tag = if isnum then string_of_int flags.nitems^". " else "- " in do_put tag ; flags.first_line <- saved ;; let item _ = do_item false and nitem _ = do_item true ;; let ditem scan arg _ _ = if !verbose > 2 then begin prerr_string "ditem: stack="; pretty_stack out_stack end; let true_scan = if flags.nitems = 0 then begin let _ = forget_par() in (); ( fun arg -> scan arg) end else scan in try_flush_par(); flags.nitems<-flags.nitems+1; do_put_char '\n'; if flags.dcount <> "" then scan("\\refstepcounter{"^flags.dcount^"}"); true_scan ("\\makelabel{"^arg^"}") ; do_put_char ' ' ;; let erase_block s = let s = tr_block s "" in if not !cur_out.temp then do_close_block s else begin if !verbose > 2 then begin fprintf stderr "erase_block: %s" (pp_block s); prerr_newline () end ; try_close_block s ; let ts,_,tout = pop_out out_stack in if ts <> s then failclose (sprintf "erase_block: %s closes %s" (pp_block s) (pp_block ts)); free !cur_out ; cur_out := tout end ;; let to_string f = open_block "TEMP" ""; f () ; let r = Out.to_string !cur_out.out in close_block "TEMP"; r ;; let open_group ss = open_block "" ""; open_mod (Style ss); ;; let open_aftergroup f = open_block "AFTER" "" ; push stacks.s_after f ;; let close_group () = close_mod (); close_block ""; ;; let put s = if !verbose > 3 then fprintf stderr "put: %s\n" s ; do_pending (); do_put s ;; let put_char c = if !verbose > 3 then fprintf stderr "put_char: %c\n" c ; do_pending (); do_put_char c ;; let put_unicode i = do_pending (); try OutUnicode.translate_out i do_put_char with OutUnicode.CannotTranslate -> raise Misc.CannotPut ;; let flush_out () = Out.flush !cur_out.out ;; let skip_line () = if !verbose > 2 then prerr_endline "skip_line" ; put_char '\n' ;; let loc_name _ = () ;; let open_chan chan = free !cur_out; !cur_out.out<- Out.create_chan chan ;; let close_chan () = Out.close !cur_out.out; !cur_out.out <- Out.create_buff() ;; let to_style f = !cur_out.active<-[]; open_block "TEMP" ""; f (); let r = !cur_out.active in erase_block "TEMP"; r ;; let get_current_output () = Out.to_string !cur_out.out ;; let finalize check = if check then check_stacks () ; finit_ligne () ; Out.close !cur_out.out ; !cur_out.out <- Out.create_null () ;; let unskip () = do_unskip () let put_separator () = put " " ;; let put_tag _ = () ;; let put_nbsp () = do_pending (); do_put_nbsp() ;; let put_open_group () = () ;; let put_close_group () = () ;; let put_in_math s = put s ;; (*--------------*) (*-- TABLEAUX --*) (*--------------*) type align = Top | Middle | Bottom | Base of int and wrap_t = Wtrue | Wfalse | Fill ;; type cell_t = { mutable ver : align; mutable hor : align_t; mutable h : int; mutable w : int; mutable wrap : wrap_t; mutable span : int; (* Nombre de colonnes *) mutable text : string; mutable pre : string; (* bordures *) mutable post : string; mutable pre_inside : int list; mutable post_inside : int list; } ;; type cell_set = Tabl of cell_t Table.t | Arr of cell_t array ;; type row_t = { mutable haut : int; mutable cells : cell_set; } ;; type table_t = { mutable lines : int; mutable cols : int; mutable width : int; mutable taille : int Table.t; mutable tailles : int array; mutable table : row_t Table.t; mutable line : int; mutable col : int; mutable in_cell : bool; } ;; let ptailles chan table = let t = table.tailles in fprintf chan "[" ; for i = 0 to Array.length t-1 do fprintf chan "%d; " t.(i) done ; fprintf chan "]" let ptaille chan table = let t = Table.to_array table.taille in fprintf chan "[" ; for i = 0 to Array.length t-1 do fprintf chan "%d; " t.(i) done ; fprintf chan "]" let cell = ref { ver = Middle; hor = Left; h = 0; w = 0; wrap = Wfalse; span = 1; text = ""; pre = ""; post = ""; pre_inside = []; post_inside = []; } ;; let row= ref { haut = 0; cells = Tabl (Table.create !cell) } ;; let table = ref { lines = 0; cols = 0; width = 0; taille = Table.create 0; tailles = Array.make 0 0; table = Table.create {haut = 0; cells = Arr (Array.make 0 !cell)}; line = 0; col = 0; in_cell = false; } ;; let table_stack = MyStack.create "table_stack";; let row_stack = MyStack.create "row_stack";; let cell_stack = MyStack.create "cell_stack";; let multi = ref [] and multi_stack = MyStack.create "multi_stack";; let open_table _ _ = (* creation d'une table : on prepare les donnees : creation de l'environnement qvb, empilage du precedent. *) push table_stack !table; push row_stack !row; push cell_stack !cell; push stacks.s_in_table flags.in_table; push multi_stack !multi; push stacks.s_align flags.align; if !verbose>2 then prerr_endline "=> open_table"; finit_ligne (); open_block "" ""; flags.first_line <- 0; table := { lines = 0; cols = 0; width = 0; taille = Table.create 0; tailles = Array.make 0 0; table = Table.create {haut = 0; cells = Arr (Array.make 0 !cell)}; line = -1; col = -1; in_cell = false; }; row := { haut = 0; cells = Tabl (Table.create !cell) }; cell := { ver = Middle; hor = Left; h = 0; w = 0; wrap = Wfalse; span = 1; text = ""; pre = ""; post = ""; pre_inside = []; post_inside = []; }; multi := []; flags.in_table<-true; ;; let register_taille table = let old = table.tailles and cur = Table.trim table.taille in let old_len = Array.length old and cur_len = Array.length cur in let dest = if cur_len > old_len then begin let t = Array.make cur_len 0 in Array.blit old 0 t 0 old_len ; t end else old in for i=0 to cur_len-1 do dest.(i) <- max dest.(i) cur.(i) done ; table.tailles <- dest let new_row () = if !verbose> 2 then begin eprintf "=> new_row, line =%d, tailles=%a\n" !table.line ptailles !table end ; if !table.col> !table.cols then !table.cols<- !table.col; !table.col <- -1; !table.line <- !table.line +1; Table.reset !table.taille ; let _ =match !row.cells with | Tabl t -> Table.reset t | _-> raise (Error "invalid table type in array") in !cell.pre <- ""; !cell.pre_inside <- []; !row.haut<-0; if !verbose>2 then prerr_endline ("<= new_row, line ="^string_of_int !table.line) ;; let change_format format = match format with Tabular.Align {Tabular.vert=v ; Tabular.hor=h ; Tabular.wrap=w ; Tabular.width=size} -> !cell.ver <- (match v with | "" -> Base 50 | "middle" -> Base 50 | "top" -> Top | "bottom" -> Bottom | s -> let n = try int_of_string s with (Failure _) -> raise (Misc.Fatal ("open_cell, invalid vertical format :"^v)); in if n>100 || n<0 then raise (Misc.Fatal ("open_cell, invalid vertical format :"^v)); Base n); !cell.hor <- (match h with | "" -> Left | "center" -> Center | "left" -> Left | "right" -> Right | _-> raise (Misc.Fatal ("open_cell, invalid horizontal format :"^h))); !cell.wrap <- (if w then Wtrue else Wfalse); if w then !cell.w <- (match size with | Length.Char l -> l | Length.Pixel l -> l / Length.font | Length.Percent l -> l * !Parse_opts.width / 100 | Length.Default -> !cell.wrap <- Wfalse; warning "cannot wrap column with no width"; 0 | Length.No s -> raise (Misc.Fatal ("No-length ``"^s^"'' in out-manager"))) else !cell.w <- 0; | _ -> raise (Misc.Fatal ("as_align")) ;; let open_cell format span insides _border = open_block "TEMP" ""; (* preparation du formattage : les flags de position sont sauvegardes par l'ouverture du bloc TEMP *) (* remplir les champs de formattage de cell *) !table.col <- !table.col+1; if !verbose>2 then prerr_endline ("open_cell, col="^string_of_int !table.col); change_format format; !cell.span <- span - insides; if !table.col > 0 && !cell.span=1 then begin !cell.pre <- ""; !cell.pre_inside <- []; end; !cell.post <- ""; !cell.post_inside <- []; open_block "" ""; if !cell.w > Bytes.length line then raise ( Error "Column too wide"); if (!cell.wrap=Wtrue) then begin (* preparation de l'alignement *) !cur_out.temp <- false; flags.x_start <- 0; flags.x_end <- !cell.w-1; flags.hsize <- !cell.w; flags.first_line <- 0; flags.x <- -1; flags.last_space <- -1; push stacks.s_align flags.align; push stacks.s_in_align flags.in_align; flags.in_align <- true; flags.align <- Left; end; ;; let do_close_cell _content = if !verbose>2 then prerr_endline "=> force_cell"; if (!cell.wrap=Wtrue) then begin do_flush (); flags.in_align <- pop stacks.s_in_align; flags.align <- pop stacks.s_align; end; do_force_block GROUP ; !cell.text<-Out.to_string !cur_out.out; do_close_block TEMP; if !verbose>2 then prerr_endline ("cell :#"^ !cell.text^ "#,pre :#"^ !cell.pre^ "#,post :#"^ !cell.post^ "#"); (* il faut remplir les champs w et h de cell *) if (!cell.wrap = Wfalse ) then !cell.w <- 0; !cell.h <- 1; let taille = ref 0 in for i = 0 to (String.length !cell.text) -1 do if !cell.text.[i]='\n' then begin !cell.h<- !cell.h+1; if (!cell.wrap = Wfalse) && (!taille > !cell.w) then begin !cell.w <- !taille; end; taille:=0; end else begin taille:=!taille+1; end; done; if (!cell.wrap = Wfalse) && (!taille > !cell.w) then !cell.w <- !taille; !cell.w <- !cell.w + (String.length !cell.pre) + (String.length !cell.post); if !verbose>2 then prerr_endline ("size : width="^string_of_int !cell.w^ ", height="^string_of_int !cell.h^ ", span="^string_of_int !cell.span); let _ = match !row.cells with | Tabl t -> Table.emit t { ver = !cell.ver; hor = !cell.hor; h = !cell.h; w = !cell.w; wrap = !cell.wrap; span = !cell.span; text = !cell.text; pre = !cell.pre; post = !cell.post; pre_inside = !cell.pre_inside; post_inside = !cell.post_inside; } | _ -> raise (Error "Invalid row type") in (* on a la taille de la cellule, on met sa largeur au bon endroit, si necessaire.. *) (* Multicolonne : Il faut mettre des zeros dans le tableau pour avoir la taille minimale des colonnes atomiques. Puis on range start,end dans une liste que l'on regardera a la fin pour ajuster les tailles selon la loi : la taille de la multicolonne doit etre <= la somme des tailles minimales. Sinon, il faut agrandir les colonnes atomiques pour que ca rentre. *) if !cell.span = 1 then begin Table.emit !table.taille !cell.w end else if !cell.span = 0 then begin Table.emit !table.taille 0; end else begin for _i = 1 to !cell.span do Table.emit !table.taille 0 done; multi := (!table.col,!table.col + !cell.span -1,!cell.w) :: !multi; end; !table.col <- !table.col + !cell.span -1; if !cell.h> !row.haut then !row.haut<- !cell.h; !cell.pre <- ""; !cell.pre_inside <- []; if !verbose>2 then prerr_endline "<= force_cell"; ;; let close_cell _content = do_close_cell _content let open_cell_group () = !table.in_cell <- true; and close_cell_group () = !table.in_cell <- false; and erase_cell_group () = !table.in_cell <- false; ;; let erase_cell () = if !verbose>2 then prerr_endline "erase cell"; if (!cell.wrap=Wtrue) then begin flags.in_align <- pop stacks.s_in_align; flags.align <- pop stacks.s_align; end; erase_block ""; let _ = Out.to_string !cur_out.out in erase_block "TEMP"; !table.col <- !table.col -1; !cell.pre <- ""; !cell.pre_inside <- []; ;; let erase_row () = if !verbose > 2 then prerr_endline "erase_row" ; !table.line <- !table.line -1 and close_row _ = if !verbose> 2 then eprintf "close_row tailles=%a, taille=%a\n" ptailles !table ptaille !table ; register_taille !table ; Table.emit !table.table { haut = !row.haut; cells = Arr (Table.trim (match !row.cells with | Tabl t -> t | _-> raise (Error "Invalid row type")))}; ;; let center_format = Tabular.Align {Tabular.hor="center" ; Tabular.vert = "top" ; Tabular.wrap = false ; Tabular.pre = "" ; Tabular.post = "" ; Tabular.width = Length.Default} ;; let make_border s = if !verbose> 2 then prerr_endline ("Adding border after column "^string_of_int !table.col^" :'"^s^"'"); if (!table.col = -1) || not ( !table.in_cell) then !cell.pre <- !cell.pre ^ s else !cell.post <- !cell.post ^ s ;; let make_inside s _ = if !verbose>2 then prerr_endline ("Adding inside after column "^string_of_int !table.col^" :'"^s^"'"); if (!table.col = -1) || not ( !table.in_cell) then begin let start = String.length !cell.pre in !cell.pre <- !cell.pre ^ s; for i = start to String.length !cell.pre -1 do !cell.pre_inside <- i::!cell.pre_inside; done; end else begin let start = String.length !cell.post in !cell.post <- !cell.post ^ s; for i = start to String.length !cell.post -1 do !cell.post_inside <- i::!cell.post_inside; done; end; ;; let make_hline _ _ = new_row(); open_cell center_format 0 0 false; close_mods (); !cell.w <- 0; !cell.wrap <- Fill; put_char '-'; close_cell (); close_row (); ;; let text_out j hauteur height align = match align with | Top -> (j < height) | Middle -> ((j >= (hauteur-height)/2) && (j <= ((hauteur-height)/2)+height-1)) | Bottom -> (j >= hauteur - height) | Base i -> if ( hauteur * i) >= 50 * ( 2*hauteur - height ) then (j >= hauteur - height) (* Bottom *) else if ( hauteur * i) <= height * 50 then (j < height) (* Top *) else ((100*j >= i*hauteur - 50*height) && (100*j < i*hauteur + 50*height)) (* Elsewhere *) ;; (* dis si oui ou non on affiche la ligne de cette cellule, etant donne l'alignement vertical.*) let safe_string_make n c = if n >= 0 then String.make n c else begin warning (sprintf "Text.put_line: negative line: %i '%c'\n" n c) ; "" end let put_ligne texte pos align width taille wrap= (* envoie la ligne de texte apres pos, sur out, en alignant horizontalement et en completant pour avoir la bonne taille *) let pos_suiv = try String.index_from texte pos '\n' with | Not_found -> String.length texte | Invalid_argument _ -> let l = String.length texte in assert (pos=l) ; l in let s = String.sub texte pos (pos_suiv - pos) in let t,post= if wrap=Wtrue then String.length s,0 else width,width - String.length s in let ligne = match align with | Left -> String.concat "" [s; safe_string_make (taille-t+post) ' '] | Center -> String.concat "" [safe_string_make ((taille-t)/2) ' '; s; safe_string_make (taille - t + post- (taille-t)/2) ' '] | Right -> String.concat "" [safe_string_make (taille-t) ' '; s; safe_string_make (post) ' '] in if !verbose>2 then prerr_endline ("line sent :#"^ligne^"#"); do_put ligne; pos_suiv + 1 ;; let put_border s inside j = for i = 0 to String.length s -1 do if j=0 || not (List.mem i inside) then do_put_char s.[i] else do_put_char ' '; done; ;; let somme debut fin = let r = ref 0 in for k = debut to fin do r := !r + !table.tailles.(k) done ; !r ;; let calculate_multi () = (* Finalisation des multi-colonnes : on les repasse toutes pour ajuster les tailles eventuellement *) let rec do_rec = function [] -> () | (debut,fin,taille_mini) :: reste -> begin let taille = somme debut fin in if !verbose>3 then prerr_endline ("from "^string_of_int debut^ " to "^string_of_int fin^ ", size was "^string_of_int taille^ " and should be at least "^string_of_int taille_mini); if taille < taille_mini then begin (* il faut agrandir *) if !verbose>3 then prerr_endline ("ajusting.."); for i = debut to fin do if taille = 0 then !table.tailles.(debut) <- taille_mini else let t = !table.tailles.(i) * taille_mini in !table.tailles.(i) <- (t / taille + ( if 2*(t mod taille) >= taille then 1 else 0)); done; (* Attention : on agrandit aussi les colonnes p !! *) end; do_rec reste; end in if !verbose>2 then prerr_endline "Finalizing multi-columns."; do_rec !multi; if !verbose>2 then prerr_endline "Finalized multi-columns."; ;; let close_table () = if !verbose>2 then begin prerr_endline "=> close_table"; pretty_stack out_stack end; register_taille !table ; let tab = Table.trim !table.table in (* il reste a formatter et a flusher dans la sortie principale.. *) !table.lines<-Array.length tab; if !verbose>2 then prerr_endline ("lines :"^string_of_int !table.lines); calculate_multi (); !table.width <- somme 0 (Array.length !table.tailles -1); finit_ligne(); if !table.width > flags.hsize then warning ("overfull line in array : array too wide"); for i = 0 to !table.lines - 1 do let ligne = match tab.(i).cells with | Arr a -> a | _-> raise (Error "Invalid row type:table") in (* affichage de la ligne *) (* il faut envoyer ligne apres ligne dans chaque cellule, en tenant compte de l'alignement vertical et horizontal..*) if !verbose> 2 then prerr_endline ("line "^string_of_int i^", columns:"^string_of_int (Array.length ligne)^", height:"^string_of_int tab.(i).haut); let pos = Array.make (Array.length ligne) 0 in !row.haut <-0; for j = 0 to tab.(i).haut -1 do if not ( i=0 && j=0) then do_put_char '\n'; let col = ref 0 in for k = 0 to Array.length ligne -1 do begin (* ligne j de la cellule k *) if ligne.(k).wrap = Fill then ligne.(k).span <- Array.length !table.tailles; let taille_borders = (String.length ligne.(k).pre) + (String.length ligne.(k).post) in let taille = (somme !col (!col + ligne.(k).span-1)) - taille_borders in if !verbose> 2 then prerr_endline ("cell to output:"^ ligne.(k).pre^ ligne.(k).text^ ligne.(k).post^ ", taille="^string_of_int taille); put_border ligne.(k).pre ligne.(k).pre_inside j; if (text_out j tab.(i).haut ligne.(k).h ligne.(k).ver) && (ligne.(k).wrap <> Fill )then begin pos.(k) <- put_ligne ligne.(k).text pos.(k) ligne.(k).hor (ligne.(k).w - taille_borders) taille ligne.(k).wrap end else if ligne.(k).wrap = Fill then do_put (String.make taille ligne.(k).text.[0]) else do_put (String.make taille ' '); col := !col + ligne.(k).span; put_border ligne.(k).post ligne.(k).post_inside j; end; done; if !col< Array.length !table.tailles -1 then begin let len = !table.width - (somme 0 (!col-1)) in do_put ( String.make len ' '); end; done; done; flags.align <- pop stacks.s_align; table := pop table_stack; row := pop row_stack; cell := pop cell_stack; multi := pop multi_stack; flags.in_table <- pop stacks.s_in_table; close_block ""; if not (flags.in_table) then finit_ligne (); if !verbose>2 then prerr_endline "<= close_table" ;; (* Info *) let infomenu _ = () ;; let infonode _ _ _ = () and infoextranode _ _ _ = () ;; (* Divers *) let is_empty () = flags.in_table && (Out.is_empty !cur_out.out) && (flags.x= -1);; let image arg _ = if arg <> "" then begin put arg; put_char ' ' end ;; let horizontal_line s width height = if flags.in_table then begin eprintf "HR: %s %s %s\n" s (Length.pretty width) (Length.pretty height) ; if false && not (Length.is_zero width || Length.is_zero height) then begin !cell.w <- 0; !cell.wrap <- Fill; put_char '-' end end else begin open_block "INFO" ""; finit_ligne (); let taille = match width with | Char x -> x | Pixel x -> x / Length.font | Percent x -> (flags.hsize -1) * x / 100 | Default -> flags.hsize - 1 | No s -> raise (Fatal ("No-length ``"^s^"'' in out-manager")) in let ligne = String.concat "" [(match s with | "right" -> String.make (flags.hsize - taille -1) ' ' | "center" -> String.make ((flags.hsize - taille)/2) ' ' | _ -> ""); String.make taille '-'] in put ligne; finit_ligne (); close_block "INFO"; end ;; (*------------*) (*---MATHS ---*) (*------------*) let cm_format = Tabular.Align {Tabular.hor="center" ; Tabular.vert = "middle" ; Tabular.wrap = false ; Tabular.pre = "" ; Tabular.post = "" ; Tabular.width = Length.Default} ;; let formated s = Tabular.Align { Tabular.hor= (match s with | "cm" | "cmm" | "cb" | "ct" -> "center" | "lt" | "lb" | "lm" -> "left" | _ -> "left") ; Tabular.vert = (match s with | "cm" | "lm" ->"middle" | "lt" | "ct" -> "top" | "lb" | "cb" -> "bottom" | "cmm" -> "45" | _ -> "middle") ; Tabular.wrap = false ; Tabular.pre = "" ; Tabular.post = "" ; Tabular.width = Length.Default} ;; let freeze f = push out_stack (Freeze f) ; if !verbose > 2 then begin prerr_string "freeze: stack=" ; pretty_stack out_stack end ;; let flush_freeze () = match top out_stack with Freeze f -> let _ = pop out_stack in if !verbose > 2 then begin prerr_string "flush_freeze" ; pretty_stack out_stack end ; f () ; true | _ -> false ;; let pop_freeze () = match top out_stack with Freeze f -> let _ = pop out_stack in f,true | _ -> (fun () -> ()),false ;; (* Displays *) let open_display _ = open_table (!verbose>1) ""; new_row (); if !verbose > 1 then make_border "{"; open_cell cm_format 1 0 false; open_cell_group (); ;; let open_display_varg _ = open_display "" let close_display () = if not (flush_freeze ()) then begin if !verbose > 1 then make_border "}"; close_cell_group (); close_cell (); close_row (); close_table (); end; ;; let item_display () = let f,is_freeze = pop_freeze () in if !verbose > 1 then make_border "|"; close_cell (); close_cell_group (); open_cell cm_format 1 0 false; open_cell_group (); if is_freeze then freeze f; ;; let item_display_format format = let f,is_freeze = pop_freeze () in if !verbose > 1 then make_border "|"; close_cell (); close_cell_group (); open_cell (formated format) 1 0 false; open_cell_group (); if is_freeze then freeze f; ;; let force_item_display () = item_display () ;; let erase_display () = if !verbose > 2 then prerr_endline "erase_display" ; erase_cell (); erase_cell_group (); erase_row (); close_table (); ;; let open_maths display = if !verbose >1 then prerr_endline "open_maths"; if display then begin open_block "ALIGN" "CENTER"; open_display ""; flags.first_line <- 0; open_display "" end else open_block "" ""; and close_maths display = if display then begin close_display (); close_display (); close_block "ALIGN"; end else close_block ""; if !verbose>1 then prerr_endline "close_maths"; ;; let open_vdisplay _ = open_table (!verbose>1) ""; and close_vdisplay () = close_table (); and open_vdisplay_row s = new_row (); if !verbose > 0 then make_border "["; open_cell (formated s) 1 0 false; open_cell_group (); open_display ""; and close_vdisplay_row () = close_display (); if !verbose > 0 then make_border "]"; close_cell (); close_cell_group (); close_row (); if !verbose > 0 then make_hline 0 false; ;; let insert_sup_sub () = let f,is_freeze = pop_freeze () in let ps,parg,pout = pop_out out_stack in if ps <> GROUP then failclose (sprintf "sup_sub : %s closes \"\"" (pp_block ps)); let new_out = newstatus false [] [] true in push_out out_stack (ps,parg,new_out); close_block ""; cur_out := pout; open_block "" ""; if is_freeze then freeze f; open_display ""; let s =(Out.to_string new_out.out) in do_put s; flags.empty <- (s=""); free new_out; ;; let standard_sup_sub scanner what sup sub display = if display then begin insert_sup_sub (); let f,ff = match sup.arg,sub.arg with | "","" -> "cm","cm" | "",_ -> change_format (formated "lt"); "lb","cm" | _,"" -> change_format (formated "lm"); "lt","cmm" | _,_ -> "cm","cm" in let vide= flags.empty in item_display_format f ; if sup.arg <>"" || sub.arg<>"" then begin open_vdisplay display; (*if sup<>"" || vide then*) begin open_vdisplay_row "lt"; scanner sup ; close_vdisplay_row (); end; open_vdisplay_row "lm"; what (); close_vdisplay_row (); if sub.arg <>"" || vide then begin open_vdisplay_row "lb"; scanner sub ; close_vdisplay_row (); end; close_vdisplay (); item_display (); end else what (); close_display (); change_format (formated ff); item_display (); end else begin what (); if sub.arg <> "" then begin put "_"; scanner sub; end; if sup.arg <> "" then begin put "^"; scanner sup; end; end and limit_sup_sub scanner what sup sub display = item_display (); open_vdisplay display; open_vdisplay_row "cm"; scanner sup; close_vdisplay_row (); open_vdisplay_row "cm"; what (); close_vdisplay_row (); open_vdisplay_row "cm"; scanner sub; close_vdisplay_row (); close_vdisplay (); item_display (); and int_sup_sub something _ scanner what sup sub display = if something then what (); item_display (); open_vdisplay display; open_vdisplay_row "lm"; scanner sup; close_vdisplay_row (); open_vdisplay_row "lm"; put ""; close_vdisplay_row (); open_vdisplay_row "lm"; scanner sub; close_vdisplay_row (); close_vdisplay (); item_display (); ;; let insert_vdisplay open_fun = let ps,parg,pout = pop_out out_stack in if ps <> GROUP then failclose (sprintf "insert_vdisplay : %s closes the cell." (pp_block ps)); let pps,pparg,ppout = pop_out out_stack in if pps <> TEMP then failclose (sprintf "insert_vdisplay : %s closes the cell2." (pp_block pps)); let ts,targ,tout = pop_out out_stack in if ts <> GROUP then failclose (sprintf "insert_vdisplay : %s closes the table." (pp_block ts)); let new_out = newstatus false [] [] tout.temp in push_out out_stack (ts,targ,new_out); push_out out_stack (pps,pparg,ppout); push_out out_stack (ps,parg,pout); close_display (); cur_out :=tout; open_display ""; open_fun (); let s = Out.to_string new_out.out in put s; free new_out; [] ;; let addvsize x = flags.vsize <- flags.vsize + x let over _ = let _=insert_vdisplay ( fun () -> begin open_vdisplay display; open_vdisplay_row "cm" end) in close_vdisplay_row (); make_hline 0 false ; open_vdisplay_row "cm"; freeze (fun () -> close_vdisplay_row (); close_vdisplay (); close_display ();) let translate = function "<" -> "<" | ">" -> ">" | "\\{" -> "{" | "\\}" -> "}" | s -> s ;; let left delim _ k = item_display (); open_display ""; close_cell_group (); make_border (translate delim) ; k 3 ; open_cell_group (); ;; let right delim _ = let vsize = 3 in if delim<>"." then make_border (translate delim); item_display (); close_display (); vsize ;; hevea-2.30/section.ml0000644004317100512160000000413712017660721014561 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Printf type style = Article | Book let style = ref Book let set_style sty = match String.uppercase sty with | "ARTICLE" -> style := Article | "BOOK" -> style := Book | _ -> Misc.warning (sprintf "strange style '%s'" sty) let value_article s = match s with | "DOCUMENT"|""|"NOW" -> 0 | "PART" -> 1 | "SECTION" -> 2 | "SUBSECTION" -> 3 | "SUBSUBSECTION" -> 4 | "PARAGRAPH" -> 5 | "SUBPARAGRAPH" -> 6 | _ -> Misc.warning (sprintf "argument '%s' as section level in article mode" s) ; 7 let value_book s = match s with | "DOCUMENT"|""|"NOW" -> 0 | "PART" -> 1 | "CHAPTER" ->2 | "SECTION" -> 3 | "SUBSECTION" -> 4 | "SUBSUBSECTION" -> 5 | "PARAGRAPH" -> 6 | "SUBPARAGRAPH" -> 7 | _ -> Misc.warning (Printf.sprintf "argument '%s' as section level in book mode" s) ; 8 let value s = (match !style with | Article -> value_article | Book -> value_book) (String.uppercase s) let pretty_article = function | 0 -> "document" | 1 -> "part" | 2 -> "section" | 3 -> "subsection" | 4 -> "subsubsection" | 5 -> "paragraph" | 6 -> "subparagraph" | _ -> assert false let pretty_book = function | 0 -> "document" | 1 -> "part" | 2 -> "chapter" | 3 -> "section" | 4 -> "subsection" | 5 -> "subsubsection" | 6 -> "paragraph" | 7 -> "subparagraph" | _ -> assert false let pretty x = (match !style with | Article -> pretty_article| Book -> pretty_book) x hevea-2.30/simpleRope.ml0000644004317100512160000001470612403604646015242 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Tibault Suzanne, Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Printf exception Out_of_bounds module type Config = sig val small_length : int end module Make(C:Config) = struct open C (**********) (* Basics *) (**********) type t = | Str of string | App of t * t * int (* String length *) let length = function | Str s -> String.length s | App (_,_,len) -> len let of_string s = Str s let singleton c = of_string (String.make 1 c) let empty = of_string "" (**********) (* Append *) (**********) let app r1 r2 = match r1,r2 with | Str "",t | t,Str "" -> t | Str s1, Str s2 when String.length s1 < small_length && String.length s2 < small_length -> Str (s1^s2) | App (t1,Str s1,len), Str s2 when String.length s1 < small_length && String.length s2 < small_length -> App (t1,Str (s1^s2),len+String.length s2) | Str s1,App (Str s2,t2,len) when String.length s1 < small_length && String.length s2 < small_length -> App (Str (s1^s2),t2,len+String.length s1) | _,_ -> App (r1,r2,length r1+length r2) let append r1 r2 = app r1 r2 let rec app_string r s slen = match r with | Str rs -> if String.length rs < small_length then Str (rs ^ s) else raise Exit | App (r1,r2,len) -> let r2 = app_string r2 s slen in App (r1,r2,len+slen) let append_string r s = let slen = String.length s in if slen < small_length then try app_string r s slen with Exit -> App (r,Str s,length r+slen) else App (r,Str s,length r+slen) let sc2c s len c = let b = Bytes.create (len+1) in Bytes.blit_string s 0 b 0 len ; Bytes.set b len c ; Bytes.unsafe_to_string b let rec app_char r c = match r with | Str s -> let len = String.length s in if len < small_length then begin Str (sc2c s len c) end else raise Exit | App (r1,r2,len) -> let r2 = app_char r2 c in App (r1,r2,len+1) let append_char r c = try app_char r c with Exit -> App (r,Str (String.make 1 c),length r+1) (*************) (* Substring *) (*************) (* assumption: 0 <= start < stop <= len(t) *) let rec mksub start stop t = if start = 0 && stop = length t then t else match t with | Str s -> Str (String.sub s start (stop-start)) | App (t1, t2, _) -> let n1 = length t1 in if stop <= n1 then mksub start stop t1 else if start >= n1 then mksub (start-n1) (stop-n1) t2 else app (mksub start n1 t1) (mksub 0 (stop-n1) t2) let sub t ofs len = let stop = ofs + len in if ofs < 0 || len < 0 || stop > length t then raise Out_of_bounds; if len = 0 then empty else mksub ofs stop t (***********************) (* Get a char by index *) (***********************) let rec get_rec t i = match t with | Str s -> String.unsafe_get s i | App (t1, t2, _) -> let n1 = length t1 in if i < n1 then get_rec t1 i else get_rec t2 (i - n1) let get t i = if i < 0 || i >= length t then raise Out_of_bounds; get_rec t i (***********) (* Iterate *) (***********) let iter_string f s = for k=0 to String.length s-1 do f (String.unsafe_get s k) done let rec iter_rec f = function | Str s -> iter_string f s | App (t1,t2,_) -> iter_rec f t1 ; iter_rec f t2 let iter f t = iter_rec f t (**********) (* Output *) (**********) let rec output chan = function | Str s -> output_string chan s | App (t1,t2,_) -> output chan t1 ; output chan t2 let rec debug_rec indent chan = function | Str s -> fprintf chan "%s\"%a\"\n" indent output_string s | App (t1,t2,_) -> let indent2 = indent ^ " " in fprintf chan "%s[\n" indent ; debug_rec indent2 chan t1 ; debug_rec indent2 chan t2 ; fprintf chan "%s]\n" indent ; () let debug = debug_rec "" (*************) (* To string *) (*************) let rec blit t buff pos = match t with | Str s -> Bytes.blit_string s 0 buff pos (String.length s) | App (t1,t2,_) -> blit t1 buff pos ; blit t2 buff (pos+length t1) let to_string t = match t with | Str s -> s | App (_,_,len) -> let buff = Bytes.create len in blit t buff 0 ; Bytes.unsafe_to_string buff (***********************) (* To list (of string) *) (***********************) let rec do_to_list k = function | Str s -> if String.length s > 0 then (s::k) else k | App (t1,t2,_) -> let k = do_to_list k t2 in do_to_list k t1 let to_list t = do_to_list [] t let to_list_append t k = do_to_list k t (*******************) (* Index functions *) (*******************) let rec index_from r i c = match r with | Str s -> String.index_from s i c | App (t1,t2,_) -> let n1 = length t1 in if i < n1 then try index_from t1 i c with Not_found -> index_from t2 0 c + n1 else index_from t2 (i-n1) c let index r c = try index_from r 0 c with e -> eprintf "SimpleRope.index failed c='%c'\n" c ; debug stderr r ; raise e let rec rindex_from r i c = match r with | Str s -> String.rindex_from s i c | App (t1,t2,_) -> let n1 = length t1 in if i < n1 then rindex_from t1 i c else try rindex_from t2 (i-n1) c + n1 with Not_found -> rindex_from t1 (n1-1) c let rindex r c = rindex_from r (length r-1) c (* Erase end according to predicate *) let erase t pred = let rec do_rec t = match t with | Str s -> let len = String.length s in let rec find_no k = if k <= 0 then k else let c = String.unsafe_get s (k-1) in if pred c then find_no (k-1) else k in let k_lst = find_no len in if k_lst = len then t else Str (String.sub s 0 len) | App (t1,t2,_) -> let t2 = do_rec t2 in if t2 = empty then do_rec t1 else append t1 t2 in do_rec t end hevea-2.30/portuguese.hva0000644004317100512160000000325512454712706015473 0ustar marangetcristal%%%% Hevea support for babel option 'portuguese'. %%%% Support for %%%% a) date %%%% b) names of various part descriptors (contentsname etc.) %\@primitives{portuguese}%no primitives (yet ?) \newcommand{\common@common@portuguese@babel}{ \renewcommand\prefacename{Pref\'acio}% \renewcommand\refname{Refer\^encias}% \renewcommand\abstractname{Resumo}% \renewcommand\bibname{Bibliografia}% \renewcommand\chaptername{Cap\'itulo}% \renewcommand\appendixname{Ap\^endice}% \renewcommand\contentsname{Conte\'udo}% \renewcommand\listfigurename{Lista de Figuras}% \renewcommand\listtablename{Lista de Tabelas}% \renewcommand\indexname{\'Indice}% \renewcommand\figurename{Figura}% \renewcommand\tablename{Tabela}% \renewcommand\partname{Parte}% \renewcommand\enclname{encl}% \renewcommand\ccname{cc}% \renewcommand\headtoname{An}% \renewcommand\pagename{P\'agina}% \renewcommand\headpagename{P\'agina}% \renewcommand\seename{veja}% \renewcommand\alsoseename{veja tamb\'em}% } \newcommand{\common@portuguese@babel}{% \common@common@portuguese@babel% \def\portuguese@month {\ifthenelse{\value{month}=1}{Janeiro} {\ifthenelse{\value{month}=2}{Fevereiro} {\ifthenelse{\value{month}=3}{Mar\c{c}o} {\ifthenelse{\value{month}=4}{Abril} {\ifthenelse{\value{month}=5}{Maio} {\ifthenelse{\value{month}=6}{Junho} {\ifthenelse{\value{month}=7}{Julho} {\ifthenelse{\value{month}=8}{Agosto} {\ifthenelse{\value{month}=9}{Setembro} {\ifthenelse{\value{month}=10}{Outubro} {\ifthenelse{\value{month}=11}{Novembro} {\ifthenelse{\value{month}=12}{Dezembro}{} }}}}}}}}}}}}% \renewcommand\today{\theday.~\portuguese@month~\theyear}} %%% \newcommand{\portuguese@babel}{\common@portuguese@babel} hevea-2.30/latexscan.mll0000644004317100512160000030257513107554405015264 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: latexscan.mll,v 1.324 2012-06-05 14:55:39 maranget Exp $ *) { open Printf module type S = sig (* external entry points *) val no_prelude : unit -> unit val translate_put_unicode : char -> (unit -> int) -> unit val translate_put_unicode_string : string -> unit val main : Lexing.lexbuf -> unit val expand_command : string -> Lexing.lexbuf -> unit val expand_command_no_skip : string -> Lexing.lexbuf -> unit val print_env_pos : unit -> unit (* additional resources needed for extension modules. *) val cur_env : string ref val new_env : string -> unit val close_env : string -> unit val echo_toimage : unit -> bool val echo_global_toimage : unit -> bool val fun_register : (unit -> unit) -> unit val newif_ref : string -> bool ref -> unit val top_open_block : string -> string -> unit val top_close_block : string -> unit val top_open_group : unit -> unit val top_close_group : unit -> unit val check_alltt_skip : Lexing.lexbuf -> unit val skip_pop : Lexing.lexbuf -> unit (* 'def' functions for initialisation only *) val def_code : string -> (Lexing.lexbuf -> unit) -> unit val def_name_code : string -> (string -> Lexing.lexbuf -> unit) -> unit val def_fun : string -> (string -> string) -> unit val get_this_main : string -> string val get_this_arg_mbox : string Lexstate.arg -> string val get_prim_onarg : string Lexstate.arg -> string val check_this_main : string -> bool val get_prim : string -> string val get_prim_arg : Lexing.lexbuf -> string val get_prim_opt : string -> Lexing.lexbuf -> string val get_csname : Lexing.lexbuf -> string end module Make (Dest : OutManager.S) (Image : ImageManager.S) = struct open Misc open Parse_opts open Element open Lexing open Latexmacros open Save open Tabular open Lexstate open MyStack open Subst let error_subst_top lxm = raise (Error (sprintf "macro argument '%s' at top level" lxm)) let sbool = function | false -> "false" | true -> "true" let last_letter name = let c = String.get name (String.length name-1) in ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') ;; let top_par n = if not (!display || !in_math) then Dest.par n ;; let if_level = ref 0 ;; let cur_env = ref "" and after = ref [] and stack_env = MyStack.create "stack_env" ;; let echo_toimage () = get_level () = 0 && top_level () and echo_global_toimage () = top_level () let stack_env_pretty () = MyStack.pretty (fun (x,_,_) -> x) stack_env let fun_register f = if get_level () > 0 then after := f :: !after ;; let inc_size i = let n = Dest.get_fontsize () in let new_size = if n+i <= 1 then 1 else if n+i >= 7 then 7 else n+i in Dest.open_mod (Font new_size) ;; (* Horizontal display *) let pre_format = ref None let top_open_display () = if !display then begin if !verbose > 1 then prerr_endline "open display" ; match !pre_format with | Some (Align {vert=s}) -> Dest.open_display_varg (sprintf "style=\"vertical-align:%s\"" s) | _ -> Dest.open_display () end and top_item_display () = if !display then begin Dest.item_display () end and top_force_item_display () = if !display then begin Dest.force_item_display () end ;; let top_close_display () = if !display then begin Dest.close_display () end (* Latex environment stuff *) let print_env_pos () = if MyStack.empty stack_env then begin prerr_endline "No Latex environement is pending" end else begin let _,_,pos = MyStack.pop stack_env in Location.print_this_pos pos ; prerr_endline ("Latex environment '"^ !cur_env^"' is pending") end ;; let new_env env = Latexmacros.open_group () ; push stack_env (!cur_env, !after, Location.get_pos ()) ; cur_env := env ; after := [] ; if !verbose > 1 then begin Location.print_pos () ; fprintf stderr "Begin: %s (%d)\n" env (get_level ()) end let error_env close_e open_e = raise (Misc.Close ("Latex env error: '"^close_e^"' closes '"^open_e^"'")) let close_env env = if !verbose > 1 then begin fprintf stderr "End: %s (%d)\n" env (get_level ()) end ; if env = !cur_env then begin let e,a,_ = pop stack_env in let af = !after in (* List.iter (fun f -> f ()) !after ; *) cur_env := e ; after := a ; Latexmacros.close_group () ; List.iter (fun f -> f ()) af end else error_env env !cur_env ;; type env_saved = string * (unit -> unit) list * (string * (unit -> unit) list * Location.t) MyStack.saved let env_check () = !cur_env, !after, MyStack.save stack_env and env_hot (e,a,s) = cur_env := e ; after := a ; MyStack.restore stack_env s type full_save = { hot : Hot.saved; location : Location.saved; env : env_saved ; lexstate : Lexstate.saved_lexstate ; dest : Dest.saved; get : Get.saved; aux : Auxx.saved; } ;; (* Complete internal check/hot start *) let check_all () = { location = Location.check () ; env = env_check () ; hot = Hot.checkpoint () ; lexstate = Lexstate.check_lexstate () ; dest = Dest.check () ; get = Get.check () ; aux = Auxx.check () ; } and hot_all s = Location.hot s.location ; env_hot s.env ; Lexstate.hot_lexstate s.lexstate ; Dest.hot s.dest ; Get.hot s.get ; Auxx.hot s.aux ; Hot.start s.hot ; () ;; (* Top functions for blocks *) type array_type = {math : bool ; border : bool} type in_table = Table of array_type | NoTable | Tabbing ;; let cur_format = ref [||] and stack_format = MyStack.create "stack_format" and cur_col = ref 0 and stack_col = MyStack.create "stack_col" and in_table = ref NoTable and stack_table = MyStack.create_init "stack_table" NoTable and first_col = ref false and first_border = ref false and stack_first = MyStack.create "stack_first" and stack_first_b = MyStack.create "stack_first_b" and in_multi = ref false and stack_multi_flag = MyStack.create "stack_multi_flag" and stack_multi = MyStack.create "stack_multi" ;; let pretty_array_type = function | Table {math = m ; border = b} -> "Table math="^(if m then "+" else "-")^ " border="^(if b then "+" else "-") | NoTable -> "NoTable" | Tabbing -> "Tabbing" let prerr_array_state () = prerr_endline (pretty_array_type !in_table) ; prerr_string " format:"; pretty_formats !cur_format ; prerr_endline "" ; prerr_endline (" cur_col="^string_of_int !cur_col) ; prerr_endline (" first_col="^ (if !first_col then "true" else "false")) ;; let save_array_state () = push stack_format !cur_format ; push stack_col !cur_col ; push stack_table !in_table ; push stack_first !first_col; push stack_first_b !first_border; push stack_multi_flag !in_multi ; in_multi := false ; if !verbose > 1 then begin prerr_endline "Save array state:" ; prerr_array_state () end and restore_array_state () = in_table := pop stack_table ; cur_col := pop stack_col ; cur_format := pop stack_format ; first_col := pop stack_first ; first_border := pop stack_first_b; in_multi := pop stack_multi_flag ; if !verbose > 1 then begin prerr_endline "Restore array state:" ; prerr_array_state () end ;; let top_open_block block args = push stack_table !in_table ; in_table := NoTable ; begin match block with | "pre" -> push stack_display !display ; if !display then begin Dest.item_display () ; display := false end ; Dest.open_block "pre" args | "display" -> push stack_display !display ; display := true ; Dest.open_display_varg args | "table" -> save_array_state () ; in_table := NoTable ; top_force_item_display () ; Dest.open_block "table" args | "tr" -> Dest.open_block "tr" args | "td" -> Dest.open_block "td" args ; top_open_display () | _ -> if !display then begin Dest.item_display () ; Dest.open_block block args ; Dest.open_display () end else Dest.open_block block args end and top_close_block_aux close_fun block = if !verbose > 2 then prerr_endline ("Top close: "^block) ; in_table := pop stack_table ; begin match block with | "pre" -> display := pop stack_display ; close_fun block ; top_item_display () | "display" -> Dest.close_display () ; display := pop stack_display | "table" -> close_fun "table" ; top_force_item_display () ; restore_array_state () | "tr" -> close_fun "tr" | "td" -> top_close_display () ; close_fun "td" | _ -> if !display then begin Dest.close_display () ; close_fun block ; Dest.item_display () end else close_fun block end ;; let top_close_block block = top_close_block_aux Dest.close_block block and top_force_block block = top_close_block_aux (fun name -> Dest.force_block name "") block and top_close_flow block = top_close_block_aux Dest.close_flow block let top_open_group () = top_open_block "" "" ; new_env "" and top_close_group () = if !cur_env = "*mbox" then begin top_close_block "" ; in_math := pop stack_in_math ; display := pop stack_display ; if !display then Dest.item_display () ; close_env "*mbox" end else begin top_close_block "" ; close_env "" end ;; let start_mbox () = push stack_table !in_table ; in_table := NoTable ; push stack_in_math !in_math ; in_math := false ; if !display then Dest.item_display () ; push stack_display !display ; display := false ; Dest.open_block "" "" ; new_env "*mbox" ;; let get_fun_result f lexbuf = if !verbose > 1 then prerr_endline ("get_fun") ; let r = Dest.to_string (fun () -> top_open_group () ; Dest.nostyle () ; f lexbuf ; top_close_group ()) in if !verbose > 1 then begin prerr_endline ("get_fun -> '"^r^"'") end ; r let do_get_this start_lexstate restore_lexstate make_style lexfun {arg=s ; subst=subst} = start_lexstate subst; if !verbose > 1 then prerr_endline ("get_this : '"^s^"'") ; verbose := !verbose - 1; let lexer = MyLexing.from_string s in let r = Dest.to_string (fun () -> if !display then Dest.open_display () ; top_open_group () ; make_style () ; lexfun lexer ; top_close_group () ; if !display then Dest.close_display ()) in verbose := !verbose + 1 ; if !verbose > 1 then begin prerr_endline ("get_this '"^s^"' -> '"^r^"'") end ; restore_lexstate () ; r let do_get_this_list start_lexstate restore_lexstate make_style lexfun {arg=s ; subst=subst} = start_lexstate subst; if !verbose > 1 then eprintf "get_this_list get_this : '%a'\n" pretty_body s ; verbose := !verbose - 1; let lexer = MyLexing.from_list s in let r = Dest.to_string (fun () -> if !display then Dest.open_display () ; top_open_group () ; make_style () ; lexfun lexer ; top_close_group () ; if !display then Dest.close_display ()) in verbose := !verbose + 1 ; if !verbose > 1 then begin if !verbose > 1 then eprintf "get_this_list get_this : '%a' -> '%s'\n" pretty_body s r end ; restore_lexstate () ; r let get_this_arg = do_get_this start_lexstate_subst restore_lexstate (fun () -> ()) and get_this_string main s = do_get_this start_lexstate_subst restore_lexstate (fun () -> ()) main (string_to_arg s) let more_buff = Out.create_buff () ;; let default_format = Tabular.Align {hor="left" ; vert = "" ; wrap = false ; pre = "" ; post = "" ; width = Length.Default} ;; let is_table = function | Table _ -> true | _ -> false and is_noborder_table = function | Table {border = b} -> not b | _ -> false and is_border_table = function | Table {border = b} -> b | _ -> raise (Misc.Fatal "is_border_table") and is_tabbing = function | Tabbing -> true | _ -> false and math_table = function | Table {math = m} -> m | _ -> raise (Misc.Fatal "Array construct outside an array") ;; exception EndInside ;; let is_inside = function Tabular.Inside _ -> true | _ -> false let is_border = function | Tabular.Border _ -> true | _ -> false and as_wrap = function | Tabular.Align {wrap = w} -> w | _ -> false and as_pre = function | Tabular.Align {pre=s} -> s | _ -> raise (Misc.Fatal "as_pre") and as_post = function | Tabular.Align {post=s} -> s | f -> raise (Misc.Fatal ("as_post "^pretty_format f)) ;; let get_col format i = let r = if i >= Array.length format+1 then raise (Misc.ScanError ("This array/tabular column has no specification")) else if i = Array.length format then default_format else format.(i) in if !verbose > 2 then begin fprintf stderr "get_col : %d: " i ; prerr_endline (pretty_format r) ; prerr_string " <- " ; pretty_formats format ; prerr_newline () end ; r ;; (* Paragraph breaks are different in tables *) let par_val t = if is_table t then match get_col !cur_format !cur_col with | Tabular.Align {wrap=false} -> None | _ -> Some 0 else Some 1 let show_inside main format i closing = (* if !verbose > -1 then begin prerr_string ("show_inside: "^string_of_int i) end ; *) let t = ref i in begin try while true do begin match get_col format !t with Tabular.Inside s -> let saved_table = !in_table in if math_table saved_table then scan_this main "$" else scan_this main "{" ; let s = get_this_string main s in if math_table saved_table then scan_this main "$" else scan_this main "}" ; Dest.make_inside s !in_multi; | Tabular.Border s -> Dest.make_border s; if !first_border then first_border := false; | _ -> raise EndInside end ; t := !t+1 done with EndInside -> if (!t = i) && (closing || !first_border) then Dest.make_border " "; end ; (* if !verbose > -1 then prerr_endline (" -> "^string_of_int !t) ; *) !t ;; let rec eat_inside format i b insides = if i >= Array.length format then (i , b , insides) else begin let f = get_col format i in if is_inside f then eat_inside format (i+1) b (insides+1) else if is_border f then eat_inside format (i+1) (b+1) insides else i, b, insides end ;; let rec find_end n format i b insides = match n with 0 -> eat_inside format i b insides | _ -> let f = get_col format i in if is_inside f then find_end n format (i+1) b (insides +1) else if is_border f then find_end n format (i+1) (b+1) insides else find_end (n-1) format (i+1) b insides ;; let find_start i = if !first_border then 0 else i let next_no_border format n = let t = ref n in while is_border (get_col format !t) do t:= !t+1 done; !t ;; let do_open_col main format span insides = let save_table = !in_table in Dest.open_cell format span insides (is_border_table !in_table); if not (as_wrap format) && math_table !in_table then begin display := true ; Dest.open_display () end ; if math_table !in_table && not (as_wrap format) then begin scan_this main "$" end else scan_this main "{" ; pre_format := Some format ; scan_this main (as_pre format) ; pre_format := None ; in_table := save_table let open_col main = let _ = Dest.forget_par () in Dest.open_cell_group () ; cur_col := show_inside main !cur_format !cur_col false; let format = (get_col !cur_format !cur_col) in do_open_col main format 1 0 ;; let open_first_col main = first_col := true ; first_border := true; open_col main ;; let erase_col main = let old_format = get_col !cur_format !cur_col in scan_this main (as_post old_format) ; if math_table !in_table && not (as_wrap old_format) then scan_this main "$" else scan_this main "}" ; if !display then begin Dest.close_display () ; display := false end ; Dest.erase_cell () ; Dest.erase_cell_group () ;; let open_row () = cur_col := 0 ; Dest.new_row () and close_row () = Dest.close_row () ;; let do_hline main = if !verbose > 2 then begin fprintf stderr "hline: %d %d" !cur_col (Array.length !cur_format) ; prerr_newline () end ; erase_col main ; Dest.erase_row () ; Dest.make_hline (Array.length !cur_format) (is_noborder_table !in_table); open_row () ; open_first_col main ;; let do_multi n format main = if !verbose > 2 then begin prerr_string ("multicolumn: n="^string_of_int n^" format:") ; pretty_formats format ; prerr_endline "" end ; erase_col main ; let start_span = find_start !cur_col and k,b,insides = find_end n !cur_format !cur_col 0 0 in let end_span = k - b in in_multi := true; let i = show_inside main format 0 true in Dest.open_cell_group () ; do_open_col main (get_col format i) (end_span - start_span) insides ; push stack_multi (!cur_format,k) ; cur_format := format ; cur_col := i ; ;; let close_col_aux main content is_last = let old_format = get_col !cur_format !cur_col in scan_this main (as_post old_format) ; if math_table !in_table && not (as_wrap old_format) then scan_this main "$" else scan_this main "}" ; if !display then begin Dest.close_display () ; display := false end ; if is_last && Dest.is_empty () then Dest.erase_cell () else begin if !in_multi then begin let _ = show_inside main !cur_format (!cur_col+1) true in in_multi := false ; let f,n = pop stack_multi in cur_format := f ; cur_col := next_no_border f n; cur_col := show_inside main !cur_format !cur_col false; end else begin cur_col := !cur_col + 1; cur_col := show_inside main !cur_format !cur_col true; end; Dest.close_cell content; if !first_col then begin first_col := false; first_border := false; end end ; Dest.close_cell_group () ;; let close_col main content = close_col_aux main content false and close_last_col main content = close_col_aux main content true and close_last_row () = if !first_col then Dest.erase_row () else Dest.close_row () ;; (* Compute functions *) let get_style lexfun {arg=s ; subst=env} = start_normal env ; let lexer = MyLexing.from_string s in let r = Dest.to_style (fun () -> lexfun lexer) in end_normal () ; r (* Image stuff *) let stack_entry = MyStack.create "stack_entry" and stack_out = MyStack.create "stack_out" ;; let start_other_scan env lexfun lexbuf = if !verbose > 1 then begin prerr_endline ("Start other scan ("^env^")") ; stack_env_pretty () ; prerr_endline ("Current env is: '"^ !cur_env^"'") ; pretty (fun x -> x) stack_entry end; save_lexstate () ; push stack_entry env ; rev stack_entry ; lexfun lexbuf ;; let start_image_scan s image lexbuf = start_other_scan "toimage" (fun b -> Image.dump s image b) lexbuf ;; let complete_scan main lexbuf = main lexbuf ; close_env (pop stack_out) ; top_close_block "" ; if !verbose > 1 then begin prerr_endline "Complete scan" ; stack_env_pretty () ; prerr_endline ("Current env is: '"^ !cur_env^"'") end ;; let stop_other_scan comment main lexbuf = if !verbose > 1 then begin prerr_endline "Stop image: env stack is" ; stack_env_pretty () ; prerr_endline ("Current env is: '"^ !cur_env^"'") end; let _ = pop stack_entry in if not comment then close_env !cur_env ; if not (MyStack.empty stack_out) then begin complete_scan main lexbuf ; while not (MyStack.empty stack_out) do let lexbuf = previous_lexbuf () in complete_scan main lexbuf done end ; restore_lexstate () ;; let includes_table = Hashtbl.create 17 and check_includes = ref false ;; let add_includes l = check_includes := true ; List.iter (fun x -> Hashtbl.add includes_table x ()) l ;; let check_include s = not !check_includes || begin try Hashtbl.find includes_table s ; true with Not_found -> false end ;; let mk_out_file () = match Parse_opts.name_out,!Parse_opts.destination with | (""|"-"), Parse_opts.Info -> Out.create_buff () | (""|"-"), _ -> Out.create_chan stdout | x , Parse_opts.Info -> Out.create_chan (open_out (x^".tmp")) | x , _ -> Out.create_chan (open_out x) ;; let no_prelude () = if !verbose > 1 then prerr_endline "Filter mode" ; flushing := true ; let _ = Dest.forget_par () in () ; Dest.set_out (mk_out_file ()) ;; let macro_depth = ref 0 ;; let rec expand_toks main = function | [] -> () | s::rem -> expand_toks main rem ; (* eprintf "Executing tokens: '%s'\n" s ; *) scan_this main s let rec do_expand_command main skip_blanks name lexbuf = let loca = Location.get_pos () in try if !verbose > 1 then begin fprintf stderr "expand_command: '%s'\n" name end ; let cur_subst = get_subst () in let exec = if !alltt_loaded then function | Subst body -> if !verbose > 2 then begin eprintf "user macro: [%a]\n%!" Lexstate.pretty_body body end ; let old_alltt = !alltt in MyStack.push stack_alltt old_alltt ; alltt := (match old_alltt with | Not -> Not | _ -> Macro) ; (* fprintf stderr "Enter: %s, %s -> %s\n" name (debug old_alltt) (debug !alltt) ; *) scan_this_list_may_cont main lexbuf cur_subst (string_to_arg body) ; let _ = MyStack.pop stack_alltt in alltt := (match old_alltt, !alltt with | Not, Lexstate.Inside -> Inside | (Macro|Lexstate.Inside), Not -> Not | _, _ -> old_alltt) (* fprintf stderr "After: %s, %s -> %s\n" name (debug old_alltt) (debug !alltt) *) | Toks l -> expand_toks main l | CamlCode f -> f lexbuf else function | Subst body -> if !verbose > 2 then begin eprintf "user macro: [%a]\n%!" Lexstate.pretty_body body end ; scan_this_list_may_cont main lexbuf cur_subst (string_to_arg body) | Toks l -> expand_toks main l | CamlCode f -> f lexbuf in let pat,body = Latexmacros.find name in let saw_par = if (if !in_math then Latexmacros.invisible name else not (effective !alltt) && is_subst body && last_letter name) then begin if !verbose > 2 then prerr_endline ("skipping blanks ("^name^")"); skip_blanks lexbuf end else begin if !verbose > 2 then begin prerr_endline ("not skipping blanks ("^name^")") end ; false end in let args = make_stack name pat lexbuf in if !verbose > 1 then begin eprintf "Expanding macro '%s' {%i}\n" name !macro_depth ; macro_depth := !macro_depth + 1 end ; scan_body exec body args ; if !verbose > 1 then begin eprintf "Cont after macro '%s', display=%B\n" name !display ; macro_depth := !macro_depth - 1 end ; if saw_par then do_expand_command main skip_blanks "\\par" lexbuf with | Misc.EndDocument|Misc.EndInput as e -> raise e | e -> Location.print_this_pos loca ; eprintf "Giving up command: %s\n" name ; raise e ;; let count_newlines s = let l = String.length s in let rec c_rec i = if i >= l then 0 else match s.[i] with | '\n' -> 1 + c_rec (i+1) | _ -> c_rec (i+1) in c_rec 0 ;; let check_case s = match !case with | Lower -> String.lowercase s | Upper -> String.uppercase s | Neutral -> s and check_case_char c = match !case with | Lower -> Char.lowercase c | Upper -> Char.uppercase c | Neutral -> c let translate_put_unicode c next = if !raw_chars then Dest.put_char c else begin let uni = try OutUnicode.translate_in c next with OutUnicode.CannotTranslate -> raise (Misc.ScanError (if Latexmacros.exists "\\inputencodingname" then sprintf "Encoding %s failed on '%c'" (match Latexmacros.find "\\inputencodingname" with | _,Subst s -> Lexstate.body_to_string s | _,_ -> assert false) c else sprintf "Non-ascii '%c' in input, consider using package inputenc" c)) in try Dest.put_unicode uni with Misc.CannotPut -> Misc.warning (sprintf "Cannot output unicode %s (%c)" (OutUnicode.show uni) c) ; Dest.put_char c end let rec translate_next next = match next () with | -1 -> () | c -> translate_put_unicode (Char.chr c) next ; translate_next next let translate_put_unicode_string s = let next = Misc.next_of_string s in translate_next next let top_open_maths main dodo = if !jaxauto then begin scan_this main "\\bgroup\\@nostyle" ; Dest.put (if dodo then "\\[" else "\\(") end else begin push stack_in_math !in_math ; in_math := true ; if !display then Dest.item_display () ; push stack_display !display ; if dodo then begin display := true ; Dest.open_maths dodo; end else begin Dest.open_maths dodo; top_open_display () ; end ; scan_this main "\\normalfont" end and top_close_maths dodo = if !jaxauto then begin Dest.put (if dodo then "\\]" else "\\)") ; top_close_group () end else begin in_math := pop stack_in_math ; if dodo then begin Dest.close_maths dodo end else begin top_close_display () ; Dest.close_maths dodo end ; display := pop stack_display ; if !display then begin Dest.item_display () end end ;; } let command_name = '\\' (( ['@''A'-'Z' 'a'-'z']+ '*'?) | [^ 'A'-'Z' 'a'-'z'] | "\\*") let hexa = ['0'-'9''a'-'f'] (* Horreur malheur, enfin sait-on jamais (mauvais transcodage) *) let newline = '\n' | ('\r' '\n') rule main = parse (* comments *) | '%' {do_expand_command main skip_blanks "\\@hevea@percent" lexbuf ; main lexbuf} (* Paragraphs *) | newline {do_expand_command main skip_blanks "\\@hevea@newline" lexbuf ; main lexbuf} (* subscripts and superscripts *) | '_' {do_expand_command main skip_blanks "\\@hevea@underscore" lexbuf ; main lexbuf} | '^' {do_expand_command main skip_blanks "\\@hevea@circ" lexbuf ; main lexbuf} (* Math mode *) | "$" | "$$" as lxm {let dodo = lxm = "$$" in if effective !alltt || not (is_plain '$') then begin Dest.put lxm ; main lexbuf (* vicious case '$x$$y$' *) end else if dodo && not !display && !in_math then begin scan_this main "${}$" ; main lexbuf end else begin (* General case *) let math_env = if dodo then "*display" else "*math" in if !in_math then begin top_close_maths dodo ; close_env math_env end else begin new_env math_env ; top_open_maths main dodo ; if dodo then ignore (skip_blanks lexbuf) end ; if !jaxauto then begin injaxauto := (if dodo then JaxDisplay else JaxInline) ; inmathjax dodo lexbuf end else main lexbuf end } (* Definitions of simple macros *) (* inside tables and array *) | [' ''\n']* '&' {do_expand_command main skip_blanks "\\@hevea@amper" lexbuf ; main lexbuf} (* Substitution *) | '#' ['1'-'9'] {let lxm = lexeme lexbuf in begin if effective !alltt || not (is_plain '#') then Dest.put lxm else let i = Char.code lxm.[1] - Char.code '1' in begin try scan_arg (if !alltt_loaded then (fun arg -> let old_alltt = !alltt in alltt := MyStack.pop stack_alltt ; scan_this_list_may_cont main lexbuf (get_subst ()) arg ; alltt := old_alltt ; MyStack.push stack_alltt old_alltt) else (fun arg -> scan_this_list_may_cont main lexbuf (get_subst ()) arg)) i with SubstTop -> error_subst_top lxm end end ; main lexbuf} (* Commands *) | command_name {let name = lexeme lexbuf in do_expand_command main skip_blanks name lexbuf ; begin match !injaxauto with | JaxOut -> main lexbuf | JaxInline -> inmathjax false lexbuf | JaxDisplay -> inmathjax true lexbuf end } (* Groups *) | '{' {do_expand_command main skip_blanks "\\@hevea@obrace" lexbuf ; main lexbuf} | '}' {do_expand_command main skip_blanks "\\@hevea@cbrace" lexbuf ; main lexbuf} | eof {()} | ' '+ as lxm {if effective !alltt then Dest.put lxm else begin if !display then for _i = 1 to String.length lxm do Dest.put_nbsp () done else Dest.put_char ' ' end ; main lexbuf} (* Alphabetic characters *) | ['a'-'z' 'A'-'Z']+ as lxm {let lxm = check_case lxm in if !in_math then begin scan_this main "{\\it" ; Dest.put lxm; scan_this main "}" end else Dest.put lxm ; main lexbuf} (* Numbers *) | ['0'-'9']+ {let lxm = lexeme lexbuf in Dest.put lxm; main lexbuf} (* Active characters *) | '-' {do_expand_command main skip_blanks "\\@hevea@minus" lexbuf ; main lexbuf } | '`' {do_expand_command main skip_blanks "\\@hevea@backquote" lexbuf ; main lexbuf } | ''' {do_expand_command main skip_blanks "\\@hevea@quote" lexbuf ; main lexbuf } | '~' {do_expand_command main skip_blanks "\\@hevea@tilde" lexbuf ; main lexbuf } (* Spanish stuff *) | '?' {do_expand_command main skip_blanks "\\@hevea@question" lexbuf ; main lexbuf} | '!' {do_expand_command main skip_blanks "\\@hevea@excl" lexbuf ; main lexbuf} (* German stuff *) | '"' {if is_plain '"' then Dest.put_char '"' (* '"' *) else do_expand_command main skip_blanks "\\@hevea@dquote" lexbuf ; main lexbuf} (* One character *) | "^^" (hexa as lxm1) (hexa as lxm2) {let c = Char.chr (hexa_code lxm1 lxm2) in translate_put_unicode c (fun () -> read_lexbuf lexbuf) ; main lexbuf} | _ as lxm {let lxm = check_case_char lxm in translate_put_unicode lxm (fun () -> read_lexbuf lexbuf) ; main lexbuf} and read_lexbuf = parse | eof { -1 } | "^^" (hexa as lxm1) (hexa as lxm2) { hexa_code lxm1 lxm2 } | _ as lxm { Char.code lxm } and complete_newline = parse | (' ' | newline)* as lxm { lxm } and latex2html_latexonly = parse | '%' + [ ' ' '\t' ] * "\\end{latexonly}" [ ^ '\n' ] * '\n' { () } | _ {latex2html_latexonly lexbuf} | eof {fatal "End of file in latex2html_latexonly"} and latexonly = parse '%'+ ' '* ("END"|"end") ' '+ ("LATEX"|"latex") [^'\n']* '\n' {stop_other_scan true main lexbuf} | '%'+ ' '* ("HEVEA"|"hevea") ' '* {latexonly lexbuf} | '%' {latex_comment lexbuf ; latexonly lexbuf} | "\\end" {let {arg=arg} = save_arg lexbuf in if arg = "latexonly" then begin top_close_block "" ; stop_other_scan false main lexbuf end else if arg = top stack_entry then begin let _ = pop stack_entry in push stack_out arg ; begin match Latexmacros.find (end_env arg) with _,(Subst body) -> scan_this_list_may_cont latexonly lexbuf (get_subst ()) (string_to_arg body) | _,_ -> raise (Misc.ScanError ("Bad closing macro in latexonly: '"^arg^"'")) end end else latexonly lexbuf} | command_name | _ {latexonly lexbuf} | eof {if empty stack_lexbuf then () else begin let lexbuf = previous_lexbuf () in latexonly lexbuf end} and latex_comment = parse '\n' | eof {()} | [^'\n']+ {latex_comment lexbuf} and image = parse '%'+ ' '* ("END"|"end") ' '+ ("IMAGE"|"image") [^'\n']* '\n' {stop_other_scan true main lexbuf} | '%'+ ' '* ("HEVEA"|"hevea") ' '* {image lexbuf} | '%' {let lxm = lexeme lexbuf in Image.put lxm ; image_comment lexbuf ; image lexbuf} (* Substitution in image *) | '#' ['1'-'9'] {let lxm = lexeme lexbuf in let i = Char.code (lxm.[1]) - Char.code '1' in begin try scan_arg (scan_this_arg_list image) i with SubstTop -> error_subst_top lxm end ; image lexbuf} | "\\end" {let lxm = lexeme lexbuf in Save.start_echo () ; let {arg=arg} = save_arg lexbuf in let true_arg = Save.get_echo () in if arg = "toimage" then begin top_close_block "" ; stop_other_scan false main lexbuf end else if arg = top stack_entry then begin let _ = pop stack_entry in push stack_out arg ; begin match Latexmacros.find (end_env arg) with _,(Subst body) -> scan_this_list_may_cont image lexbuf (get_subst ()) (string_to_arg body) | _,_ -> raise (Misc.ScanError ("Bad closing macro in image: '"^arg^"'")) end end else begin Image.put lxm ; Image.put true_arg ; image lexbuf end} | command_name as lxm {begin match lxm with (* Definitions of simple macros, bodies are not substituted *) | "\\def" | "\\gdef" -> Save.start_echo () ; skip_csname lexbuf ; ignore (skip_blanks lexbuf) ; let _ = Save.defargs lexbuf in Image.put lxm ; if (Lexstate.top_level()) then begin let _ = save_arg lexbuf in () end ; let saved = Save.get_echo () in Image.put saved | "\\renewcommand" | "\\newcommand" | "\\providecommand" | "\\renewcommand*" | "\\newcommand*" | "\\providecommand*" -> Save.start_echo () ; let _ = save_arg lexbuf in let _ = save_opts ["0" ; ""] lexbuf in let _ = save_arg lexbuf in Image.put lxm ; let saved = Save.get_echo () in Image.put saved | "\\newenvironment" | "\\renewenvironment" | "\\newenvironment*" | "\\renewenvironment*" -> Save.start_echo () ; let _ = save_arg lexbuf in let _ = save_opts ["0" ; ""] lexbuf in let _ = save_arg lexbuf in let _ = save_arg lexbuf in Image.put lxm ; Image.put (Save.get_echo ()) | _ -> Image.put lxm end ; image lexbuf} | _ {let s = lexeme lexbuf in Image.put s ; image lexbuf} | eof {if empty stack_lexbuf then begin if not filter && top_lexstate () then raise (Misc.ScanError ("No \\end{document} found")) end else begin let lexbuf = previous_lexbuf () in image lexbuf end} and image_comment = parse '\n' {Image.put_char '\n'} | eof {()} | [^'\n']+ {let lxm = lexeme lexbuf in Image.put lxm ; image_comment lexbuf} and mbox_arg = parse | ' '+ | '\n' {mbox_arg lexbuf} | eof {if not (empty stack_lexbuf) then begin let lexbuf = previous_lexbuf () in if !verbose > 2 then begin prerr_endline "Poping lexbuf in mbox_arg" ; pretty_lexbuf lexbuf end ; mbox_arg lexbuf end else raise (Misc.ScanError "End of file in \\mbox argument")} | '{' | ("\\bgroup" ' '* '\n'? ' '*) {start_mbox ()} | "" {raise (Misc.ScanError "Cannot find a \\mbox argument here, use braces")} and no_skip = parse | "" { false } and skip_blanks_pop = parse ' '+ {skip_blanks_pop lexbuf} | '\n' {()} | "" {()} | eof {if not (empty stack_lexbuf) then begin let lexbuf = previous_lexbuf () in if !verbose > 2 then begin prerr_endline "Poping lexbuf in skip_blanks" ; pretty_lexbuf lexbuf end ; skip_blanks_pop lexbuf end else ()} and to_newline = parse | '\n' {()} | _ {Out.put_char more_buff (Lexing.lexeme_char lexbuf 0) ; to_newline lexbuf} | eof {if not (empty stack_lexbuf) then let lexbuf = previous_lexbuf () in to_newline lexbuf} and skip_blanks = parse ' '+ {skip_blanks lexbuf} | '\n' {more_skip lexbuf} | "" { false } and more_skip = parse | ' '+ { false } | (' '* '\n')+ ' '* { true } | "" { false } and skip_spaces = parse ' ' * {()} | eof {()} and skip_false = parse | '%' {if is_plain '%' then skip_comment lexbuf ; skip_false lexbuf} | "\\ifthenelse" {skip_false lexbuf} | "\\if" ['a'-'z' 'A'-'Z''@']+ {if_level := !if_level + 1 ; skip_false lexbuf} | "\\else" ['a'-'z' 'A'-'Z''@']+ {skip_false lexbuf} | "\\else" {if !if_level = 0 then begin if skip_blanks lexbuf then do_expand_command main no_skip "\\par" lexbuf end else skip_false lexbuf} | "\\fi" ['a'-'z' 'A'-'Z']+ {skip_false lexbuf} | "\\fi" {if !if_level = 0 then begin if skip_blanks lexbuf then do_expand_command main no_skip "\\par" lexbuf end else begin if_level := !if_level -1 ; skip_false lexbuf end} | _ {skip_false lexbuf} | "" {raise (Misc.ScanError "End of entry while skipping TeX conditional macro")} and comment = parse | ['%'' ']* ("BEGIN"|"begin") ' '+ ("IMAGE"|"image") {skip_comment lexbuf ; start_image_scan "" image lexbuf ; () } (* Backward compatibility with latex2html *) | [ ' ' '\t' ] * "\\begin{latexonly}" {latex2html_latexonly lexbuf } | ['%'' ']* ("HEVEA"|"hevea") ' '* { () } | ['%'' ']* ("BEGIN"|"begin") ' '+ ("LATEX"|"latex") { skip_to_end_latex lexbuf} | "" { skip_comment lexbuf } and skip_comment = parse | [^ '\n']* {if !verbose > 1 then prerr_endline ("Comment:"^lexeme lexbuf) ; if !flushing then Dest.flush_out () } and skip_to_end_latex = parse | '%' ['%'' ']* ("END"|"end") ' '+ ("LATEX"|"latex") {skip_comment lexbuf ; skip_spaces lexbuf} | _ {skip_to_end_latex lexbuf} | eof {fatal ("End of file in %BEGIN LATEX ... %END LATEX")} and inmathjax dodo = parse | "$$"|"\\]" as lxm { if dodo then begin top_close_maths true ; close_env "*display"; injaxauto := JaxOut ; main lexbuf end else begin Dest.put lxm ; inmathjax dodo lexbuf end } | '$'|"\\)" as lxm { if not dodo then begin top_close_maths false ; close_env "*math" ; injaxauto := JaxOut ; main lexbuf end else begin Dest.put lxm ; inmathjax dodo lexbuf end } (* Substitution *) | '#' ['1'-'9'] {let lxm = lexeme lexbuf in let i = Char.code lxm.[1] - Char.code '1' in begin try scan_arg (fun arg -> scan_this_list_may_cont (inmathjax dodo) lexbuf (get_subst ()) arg) i with SubstTop -> Dest.put lxm end ; inmathjax dodo lexbuf } | _ as lxm { Dest.put_char lxm ; inmathjax dodo lexbuf } | eof { () } { let () = () ;; let check_alltt_skip lexbuf = if not (effective !alltt) then begin if skip_blanks lexbuf then do_expand_command main no_skip "\\par" lexbuf end and skip_pop lexbuf = save_lexstate () ; skip_blanks_pop lexbuf ; restore_lexstate () ;; let def_code name f = def_init name f let def_name_code name f = def_init name (f name) let expand_command name lexbuf = do_expand_command main skip_blanks name lexbuf and expand_command_no_skip name lexbuf = do_expand_command main no_skip name lexbuf ;; (* Direct display math, no env opened *) def_code "\\displaymath" (fun lexbuf -> top_open_maths main true ; skip_pop lexbuf) ; def_code "\\enddisplaymath" (fun _lexbuf -> top_close_maths true) ; () ;; def_code "\\@skip@blanks" (fun lexbuf -> skip_pop lexbuf) ;; def_code "\\@hevea@percent" (fun lexbuf -> if effective !alltt || not (is_plain '%') then begin let lxm = lexeme lexbuf in Dest.put lxm ; main lexbuf end else begin comment lexbuf ; if skip_blanks lexbuf then do_expand_command main no_skip "\\par" lexbuf end) ;; def_code "\\@hevea@newline" (fun lexbuf -> let lxm = complete_newline lexbuf in let nlnum = count_newlines lxm in if !Lexstate.withinLispComment then begin if !verbose > 2 then prerr_endline "NL caught after LispComment" ; raise (Misc.EndOfLispComment nlnum) (* QNC *) end else begin if effective !alltt then begin Dest.put_char '\n' ; Dest.put lxm end else if nlnum >= 1 then expand_command "\\par" lexbuf else Dest.put_separator () end) ;; let warn_under = ref true ;; let sub_sup lxm lexbuf = if effective !alltt || not (is_plain lxm) then Dest.put_char lxm else if not !in_math then begin if !warn_under then warning ("'"^Char.escaped lxm^"' occurring outside math mode") ; Dest.put_char lxm end else begin let sup,sub = match lxm with '^' -> let sup = save_arg lexbuf in let sub = save_sub lexbuf in sup,unoption sub | '_' -> let sub = save_arg lexbuf in let sup = save_sup lexbuf in unoption sup,sub | _ -> assert false in Dest.standard_sup_sub (scan_this_arg main) (fun () -> ()) sup sub !display end ;; def_code "\\@hevea@underscore" (fun lexbuf -> sub_sup '_' lexbuf) ; def_code "\\@hevea@circ" (fun lexbuf -> sub_sup '^' lexbuf) ;; def_code "\\mathop" (fun lexbuf -> let symbol = save_arg lexbuf in let {limits=limits ; sup=sup ; sub=sub} = save_sup_sub lexbuf in begin match limits with | (Some Limits|None) when !display -> Dest.limit_sup_sub (scan_this_arg main) (fun _ -> scan_this_arg main symbol) sup sub !display | (Some IntLimits) when !display -> Dest.int_sup_sub true 3 (scan_this_arg main) (fun () -> scan_this_arg main symbol) sup sub !display | _ -> scan_this_arg main symbol ; Dest.standard_sup_sub (scan_this_arg main) (fun _ -> ()) sup sub !display end) ; def_code "\\@mathop" (fun lexbuf -> let symbol = save_arg lexbuf in let {limits=limits ; sup=sup ; sub=sub} = save_sup_sub lexbuf in begin match limits with | (Some Limits) when !display -> Dest.limit_sup_sub (scan_this_arg main) (fun _ -> scan_this_arg main symbol) sup sub !display | (Some IntLimits|None) when !display -> Dest.int_sup_sub true 3 (scan_this_arg main) (fun () -> scan_this_arg main symbol) sup sub !display | _ -> scan_this_arg main symbol ; Dest.standard_sup_sub (scan_this_arg main) (fun _ -> ()) sup sub !display end) ;; def_code "\\@hevea@obrace" (fun _ -> if !activebrace && is_plain '{' then top_open_group () else begin Dest.put_char '{' end) ; def_code "\\bgroup" (fun lexbuf -> top_open_group () ; check_alltt_skip lexbuf) ;; def_code "\\@hevea@cbrace" (fun _ -> if !activebrace && is_plain '}' then begin top_close_group () end else begin Dest.put_char '}' end) ; def_code "\\egroup" (fun lexbuf -> top_close_group () ; check_alltt_skip lexbuf) ;; def_code "\\@hevea@tilde" (fun _lexbuf -> if effective !alltt || not (is_plain '~') then Dest.put_char '~' else Dest.put_nbsp ()) ;; def_code "\\@hevea@question" (fun lexbuf -> if if_next_char '`' lexbuf then begin gobble_one_char lexbuf ; if effective !alltt then Dest.put "?`" else Dest.put_unicode OutUnicode.iques end else Dest.put_char '?') ;; def_code "\\@hevea@excl" (fun lexbuf -> if if_next_char '`' lexbuf then begin gobble_one_char lexbuf ; if effective !alltt then Dest.put "!`" else Dest.put_unicode OutUnicode.iexcl end else Dest.put_char '!') ;; def_code "\\@hevea@dquote" (fun _lexbuf -> Dest.put_char '"') (* '"' *) ;; let get_this_main arg = get_this_string main arg let check_this_main s = if !verbose > 1 then prerr_endline ("check_this: '"^s^"'"); start_normal (get_subst ()) ; Dest.open_block "temp" ""; let r = try scan_this main s ; true with | _ -> false in Dest.erase_block "temp" ; end_normal () ; if !verbose > 1 then prerr_endline ("check_this: '"^s^"' = "^sbool r); r (* '"' *) let do_get_prim_onarg f arg = let plain_sub = is_plain '_' and plain_sup = is_plain '^' and plain_dollar = is_plain '$' and plain_amper = is_plain '&' and plain_quote = is_plain '\'' and plain_backquote = is_plain '`' and plain_minus = is_plain '-' and plain_dquote = is_plain '"' in unset_plain '_' ; unset_plain '^' ; unset_plain '$' ; unset_plain '&' ; unset_plain '\'' ; unset_plain '`' ; unset_plain '-' ; set_plain '"' ; (* For double quotes, plain is inactive... *) let old_raw = !raw_chars in let old_case = !case in case := Neutral ; raw_chars := true ; let restore () = raw_chars := old_raw ; case := old_case ; plain_back plain_sub '_' ; plain_back plain_sup '^' ; plain_back plain_dollar '$' ; plain_back plain_amper '&' ; plain_back plain_quote '\'' ; plain_back plain_backquote '`' ; plain_back plain_minus '-' ; plain_back plain_dquote '"' ; (* '"' *) in try let r = f start_normal end_normal Dest.nostyle main arg in restore () ; r with e -> restore () ; raise e let get_prim_onarg arg = do_get_prim_onarg do_get_this arg let get_prim_onarg_list arg = do_get_prim_onarg do_get_this_list arg let get_prim s = get_prim_onarg (string_to_arg s) let get_prim_arg lexbuf = let arg = save_arg lexbuf in get_prim_onarg arg and get_prim_opt def lexbuf = let arg = save_opt def lexbuf in get_prim_onarg_list arg let get_csname lexbuf = let r = protect_save_string (fun lexbuf -> Save.csname get_prim Subst.subst_this lexbuf) lexbuf in (* eprintf "GET CSNAME: '%s'\n" r ; *) r let def_fun name f = def_code name (fun lexbuf -> let arg = subst_arg lexbuf in scan_this main (f arg)) ;; (* Paragraphs *) let do_unskip () = let _ = Dest.forget_par () in Dest.unskip () ;; def_code "\\unskip" (fun lexbuf -> do_unskip () ; check_alltt_skip lexbuf) ;; def_code "\\hva@par" (fun lexbuf -> if !display || !in_math then begin warning "\\par in display or math mode" end else begin match par_val !in_table with | None -> Dest.put_char ' ' | pval -> top_par pval end ; check_alltt_skip lexbuf) ;; (********************************) (* Tokens to be executed at eof *) (********************************) (* Defined as a token register in latexcommon.hva *) let ateof = "\\@ateof" let after_input lexbuf old_toks = begin try expand_command_no_skip ateof lexbuf with e -> Misc.warning (sprintf "Exception '%s' raised by input handler" (Printexc.to_string e)) end ; ignore (Latexmacros.replace ateof old_toks) (* NB: masks Lexstate.input_file *) let input_file loc_verb main filename lexbuf = let old_toks = Latexmacros.replace ateof (Some (zero_pat, Toks [])) in begin try Lexstate.input_file loc_verb main filename ; with e -> after_input lexbuf old_toks ; raise e end ; after_input lexbuf old_toks (* Styles and packages *) let saw_doc = "\\hva@doc" let do_documentclass command lexbuf = if Latexmacros.exists saw_doc then raise (Misc.ScanError (sprintf "Multiple occurrences of %s" command)) ; Latexmacros.global_def saw_doc zero_pat (Subst []) ; Save.start_echo () ; let {arg=opt_arg} = save_opt "" lexbuf in let {arg=arg} = save_arg lexbuf in let real_args = Save.get_echo () in begin try if not !styleloaded then input_file (if !verbose > 0 then 1 else 0) main (arg^".hva") lexbuf with Myfiles.Except | Myfiles.Error _ -> raise (Misc.ScanError ("No base style")) end ; if command = "\\documentstyle" then begin List.iter (fun pack -> scan_this main ("\\usepackage{"^pack^"}")) (Save.cite_arg (MyLexing.from_list ("{"::opt_arg@["}"]))) end else if command = "\\documentclass" then begin let opts = String.concat "" opt_arg in scan_this main (sprintf "\\sbox{\\@document@opts}{%s}" opts) end ; (* Save gobal options *) Image.start () ; Image.put "\\newif\\ifimagen\\imagentrue\n" ; Image.put command ; Image.put real_args ; Image.put_char '\n' ; Dest.set_out (mk_out_file ()) ; Dest.stop () ;; def_name_code "\\documentstyle" do_documentclass ; def_name_code "\\documentclass" do_documentclass ;; let do_input lxm lexbuf = Save.start_echo () ; let arg = get_prim_arg lexbuf in let echo_arg = Save.get_echo () in if lxm <> "\\include" || check_include arg then begin try input_file !verbose main arg lexbuf with | Myfiles.Except -> Image.put lxm ; Image.put echo_arg ; Image.put "\n" | Myfiles.Error _ -> () end ;; def_code "\\input" (do_input "\\input") ; def_code "\\include" (do_input "\\include") ; ;; (* Command definitions *) let do_newcommand lxm lexbuf = Save.start_echo () ; let name = get_csname lexbuf in let nargs = save_opts ["0" ; ""] lexbuf in let body = subst_body lexbuf in let echo () = if echo_toimage () && lxm <> "\\@forcecommand" then begin Image.put lxm ; Image.put (Save.get_echo ()) ; Image.put_char '\n' end in let nargs,(def,defval) = match nargs with [a1 ; a2] -> Get.get_int (from_ok a1), (match a2 with | {arg=No s ; subst=env} -> false,mkarg [s] env | {arg=Yes s ; subst=env} -> true,mkarg s env) | _ -> assert false in let pat = latex_pat (if def then [do_subst_this_list defval] else []) nargs in match lxm with | "\\@forcecommand" -> Latexmacros.def name pat (Subst body) | "\\newcommand"|"\\newcommand*" -> echo () ; if Latexmacros.exists name then warning ("Ignoring (re-)definition of '"^name^"' by \\newcommand") else begin Latexmacros.def name pat (Subst body) end | "\\renewcommand"|"\\renewcommand*" -> if not (Latexmacros.exists name) then begin warning ("Defining '"^name^"' by \\renewcommand") end else echo () ; Latexmacros.def name pat (Subst body) | _ -> echo () ; if not (Latexmacros.exists name) then Latexmacros.def name pat (Subst body) ;; def_name_code "\\renewcommand" do_newcommand ; def_name_code "\\renewcommand*" do_newcommand ; def_name_code "\\newcommand" do_newcommand ; def_name_code "\\newcommand*" do_newcommand ; def_name_code "\\providecommand" do_newcommand ; def_name_code "\\providecommand*" do_newcommand ; def_name_code "\\@forcecommand" do_newcommand ;; def_name_code "\\newcolumntype" (fun lxm lexbuf -> Save.start_echo () ; let old_raw = !raw_chars in raw_chars := true ; let name = get_prim_arg lexbuf in raw_chars := old_raw ; let nargs = save_opt "0" lexbuf in let body = subst_body lexbuf in let rest = Save.get_echo () in if echo_toimage () then Image.put (lxm^rest^"\n") ; let col_cmd = Misc.column_to_command name in if Latexmacros.exists col_cmd then warning ("Not (re)-defining column type '"^name^"' with \\newcolumntype") else Latexmacros.def col_cmd (latex_pat [] (Get.get_int nargs)) (Subst body)) ;; let do_newenvironment lxm lexbuf = Save.start_echo () ; let name = get_prim_arg lexbuf in let nargs,optdef = match save_opts ["0" ; ""] lexbuf with | [x ; y ] -> x,y | _ -> assert false in let body1 = subst_body lexbuf in let body2 = subst_body lexbuf in if echo_toimage () then Image.put (lxm^Save.get_echo ()^"\n") ; let do_defs () = Latexmacros.def (start_env name) (latex_pat (match optdef with | {arg=No _} -> [] | {arg=Yes s ; subst=env} -> [do_subst_this_list (mkarg s env)]) (match nargs with | {arg=No _} -> 0 | {arg=Yes s ; subst=env} -> Get.get_int (mkarg s env))) (Subst body1) ; Latexmacros.def (end_env name) zero_pat (Subst body2) in if lxm = "\\newenvironment" || lxm = "\\newenvironment*" then if Latexmacros.exists (start_env name) || Latexmacros.exists (end_env name) then warning ("Not (re)-defining environment '"^name^"' with "^lxm) else do_defs () else begin if not (Latexmacros.exists (start_env name) && Latexmacros.exists (end_env name)) then warning ("Defining environment '"^name^"' with "^lxm) ; do_defs () end ;; def_name_code "\\newenvironment" do_newenvironment ; def_name_code "\\newenvironment*" do_newenvironment ; def_name_code "\\renewenvironment" do_newenvironment ; def_name_code "\\renewenvironment*" do_newenvironment ;; let do_newcounter name within = try Counter.def_counter name within ; Latexmacros.global_def ("\\the"^name) zero_pat (Subst (["\\arabic{"^name^"}"])) with | Failed -> () let do_newtheorem lxm lexbuf = Save.start_echo () ; let name = get_prim_arg lexbuf in let numbered_like = match save_opts [""] lexbuf with | [x] -> x | _ -> assert false in let caption = subst_arg lexbuf in let within = match save_opts [""] lexbuf with | [x] -> x | _ -> assert false in if echo_global_toimage () then Image.put (lxm^Save.get_echo ()^"\n") ; let cname = match numbered_like,within with {arg=No _},{arg=No _} -> do_newcounter name "" ; name | _,{arg=Yes _} -> let within = get_prim_onarg_list (from_ok within) in do_newcounter name within ; name | {arg=Yes _},_ -> get_prim_onarg_list (from_ok numbered_like) in do_expand_command main no_skip ("\\set@th") (MyLexing.from_string ("{"^name^"}")) ; Latexmacros.global_def (start_env name) zero_pat (Subst ["\\begin{th@env}{"^name^"}{"^cname^"}{"^caption^"}"]) ; Latexmacros.global_def (end_env name) zero_pat (Subst ["\\end{th@env}"]) ;; def_name_code "\\newtheorem" do_newtheorem ; def_name_code "\\renewtheorem" do_newtheorem ;; (* Command definitions, TeX style *) let do_def global lxm lexbuf = Save.start_echo () ; let name = get_csname lexbuf in Save.skip_blanks_init lexbuf ; let args_pat,body = if top_level () then let args_pat = Save.defargs lexbuf in let {arg=body} = save_body lexbuf in args_pat,body else let args_pat = Save.defargs (MyLexing.from_string (subst_this (Save.get_defargs lexbuf))) in let body = subst_body lexbuf in args_pat,body in let real_args = Save.get_echo () in if echo_toimage () || (global && echo_global_toimage ()) then begin Image.put (lxm^real_args) ; Image.put_char '\n' end ; (if global then Latexmacros.global_def else Latexmacros.def) name ([],args_pat) (Subst body) ;; def_name_code "\\def" (do_def false) ; def_name_code "\\gdef" (do_def true) ;; let caml_print s = CamlCode (fun _ -> Dest.put s) ;; def_code "\\prim@def" (fun lexbuf -> let name = get_csname lexbuf in Save.skip_blanks_init lexbuf ; let body = get_prim_arg lexbuf in def name zero_pat (caml_print body)) ;; def_code "\\undef" (fun lexbuf -> let name = get_csname lexbuf in Latexmacros.global_undef name) ;; let do_let global lxm lexbuf = Save.start_echo () ; let name = get_csname lexbuf in Save.skip_equal lexbuf ; let alt = get_csname lexbuf in let real_args = Save.get_echo () in try let nargs,body = Latexmacros.find_fail alt in (if global then global_def else def) name nargs body ; if echo_toimage () || (global && echo_global_toimage ()) then begin Image.put lxm ; Image.put real_args ; Image.put "\n" end with | Failed -> warning ("Not binding "^name^" with "^lxm^", command "^alt^" does not exist") ;; def_name_code "\\let" (do_let false) ; ;; let do_global lxm lexbuf = let next = subst_arg lexbuf in begin match next with | "\\def" -> do_def true (lxm^next) lexbuf | "\\let" -> do_let true (lxm^next) lexbuf | _ -> warning "Ignored \\global" end ;; def_name_code "\\global" do_global ;; (* TeXisms *) def_code "\\noexpand" (fun lexbuf -> let arg = subst_arg lexbuf in Dest.put arg) ;; def_code "\\execafter" (fun lexbuf -> let arg = save_arg lexbuf in let next_arg = save_arg lexbuf in let cur_subst = get_subst () in scan_this_may_cont main lexbuf cur_subst next_arg ; scan_this_may_cont main lexbuf cur_subst arg) ;; def_code "\\csname" (fun lexbuf -> ignore (skip_blanks lexbuf) ; let name = "\\"^get_prim (Save.incsname lexbuf) in check_alltt_skip lexbuf ; expand_command name lexbuf) ;; def_code "\\string" (fun lexbuf -> let arg = subst_arg lexbuf in Dest.put arg) ;; let get_num_arg lexbuf = Save.num_arg lexbuf (fun s -> Get.get_int_string (string_to_arg s)) ;; let top_plain c = if not (is_plain c) then begin set_plain c ; fun_register (fun () -> unset_plain c) end and top_unplain c = if is_plain c then begin unset_plain c ; fun_register (fun () -> set_plain c) end ;; def_code "\\catcode" (fun lexbuf -> let arg = save_arg_with_delim "=" lexbuf in let char = Char.chr (Get.get_int_string arg) in let code = get_num_arg lexbuf in begin match char,code with | ('\\',0) | ('{',1) | ('}',2) | ('$',3) | ('&' ,4) | ('#',6) | ('^',7) | ('_',8) | ('~',13) | ('%',14)|('"',12) -> top_plain char | ('{',(11|12)) | ('}',(11|12)) | ('$',(11|12)) | ('&' ,(11|12)) | ('#',(11|12)) | ('^',(11|12)) | ('_',(11|12)) | ('~',(11|12)) | ('%',(11|12)) | ('\\',(11|12))| ('"',13) -> top_unplain char | _ -> warning "This \\catcode operation is not permitted" end ; main lexbuf) ;; def_code "\\chardef" (fun lexbuf -> let csname = get_csname lexbuf in Save.skip_equal lexbuf ; let i = get_num_arg lexbuf in Latexmacros.def csname zero_pat (Subst [string_of_int i])) ;; (* Complicated use of output blocks *) let displayleft lexbuf = let dprev = !display in MyStack.push stack_display dprev ; display := true ; if not dprev then top_open_display () ; let delim = subst_arg lexbuf in let {sub=sub ; sup=sup} = save_sup_sub lexbuf in Dest.left delim (fun vsize -> scan_this main ("\\process@delim{"^delim^"}{"^string_of_int vsize^"}")) (fun vsize -> Dest.int_sup_sub false vsize (scan_this_arg main) (fun () -> ()) sup sub true) ;; let displayright lexbuf = let delim = subst_arg lexbuf in let vsize = Dest.right delim (fun vsize -> scan_this main ("\\process@delim{"^delim^"}{"^string_of_int vsize^"}")) in let {sup=sup ; sub=sub} = save_sup_sub lexbuf in let do_what = (fun () -> ()) in if vsize > 1 then Dest.int_sup_sub false vsize (scan_this_arg main) do_what sup sub !display else Dest.standard_sup_sub (scan_this_arg main) do_what sup sub !display ; let dprev = MyStack.pop stack_display in if not dprev then top_close_display () ; display := dprev ;; def_code "\\left" (fun lexbuf -> if !display then displayleft lexbuf else expand_command "\\textleft" lexbuf) ;; def_code "\\right" (fun lexbuf -> if !display then displayright lexbuf else expand_command "\\textright" lexbuf) ;; def_code "\\over" (fun lexbuf -> if !display then Dest.over lexbuf else Dest.put_char '/' ; ignore (skip_blanks lexbuf)) ;; def_code "\\MakeUppercase" (fun lexbuf -> let arg = save_arg lexbuf in let old_case = !case in case := Upper ; scan_this_arg main arg ; case := old_case) ; def_code "\\MakeLowercase" (fun lexbuf -> let arg = save_arg lexbuf in let old_case = !case in case := Lower ; scan_this_arg main arg ; case := old_case) ; def_fun "\\uppercase" Subst.uppercase ; def_fun "\\lowercase" Subst.lowercase ; ;; (* list items *) (* def_code "\\@linum" (fun _ -> Dest.nitem ()) ; def_code "\\@li" (fun _ -> Dest.item ()) ; def_code "\\@dt" (fun lexbuf -> let arg = subst_arg lexbuf in Dest.ditem (scan_this main) arg ; check_alltt_skip lexbuf) ;; *) def_code "\\@itemize@li" (fun lexbuf -> Dest.item (get_prim_arg lexbuf)) ; def_code "\\@enumerate@linum" (fun lexbuf -> Dest.nitem (get_prim_arg lexbuf)) ; def_code "\\@dtdd" (fun lexbuf -> let arg = subst_arg lexbuf in let dtclass = get_prim_arg lexbuf in let ddclass = get_prim_arg lexbuf in Dest.ditem (scan_this main) arg dtclass ddclass ; check_alltt_skip lexbuf) ;; (* Html primitives *) def_code "\\@open" (fun lexbuf -> let tag = get_prim_arg lexbuf in let arg = get_prim_arg lexbuf in (* eprintf "\\@open{%s}{%s}\n" tag arg ; *) top_open_block tag arg) ;; def_code "\\@insert" (fun lexbuf -> let tag = get_prim_arg lexbuf in let arg = get_prim_arg lexbuf in Dest.insert_block tag arg ) ;; def_code "\\@close" (fun lexbuf -> let tag = get_prim_arg lexbuf in top_close_block tag) ; def_code "\\@force" (fun lexbuf -> let tag = get_prim_arg lexbuf in top_force_block tag) ; def_code "\\@flow" (fun lexbuf -> let tag = get_prim_arg lexbuf in top_close_flow tag) ; ;; (* Paragraphs, used for closing/re-opening P elts explictely *) let out_par do_it = let have_closed = Dest.close_par () in do_it () ; if have_closed then Dest.open_par () ;; def_code "\\@close@par" (fun lexbuf -> ignore (Dest.close_par ()) ; check_alltt_skip lexbuf) ; def_code "\\@open@par" (fun lexbuf -> Dest.open_par () ; check_alltt_skip lexbuf) ; (* Some material (eg hacha directives) must appear outside P *) def_code "\\@out@par" (fun lexbuf -> let arg = save_arg lexbuf in out_par (fun () -> scan_this_arg main arg)) ; () ;; def_code "\\@print" (fun lexbuf -> let {arg=arg} = save_arg lexbuf in Dest.put arg) ;; let put_unicode_default uc = try let txt = OutUnicode.get_default uc in scan_this main txt with Not_found -> Misc.warning (sprintf "Cannot output that numerical entity: %s" (OutUnicode.show uc)) ; Dest.put_char '?' ;; let put_unicode uc = try Dest.put_unicode uc with Misc.CannotPut -> put_unicode_default uc ;; def_code "\\@print@u" (fun lexbuf -> let {arg=arg} = save_arg lexbuf in let uc = OutUnicode.parse arg in put_unicode uc) ;; def_code "\\@print@u@default" (fun lexbuf -> let {arg=arg} = save_arg lexbuf in let uc = OutUnicode.parse arg in put_unicode_default uc) ;; def_code "\\@def@u@default" (fun lexbuf -> let uc = OutUnicode.parse (subst_arg lexbuf) in let default = subst_arg lexbuf in OutUnicode.def_default uc default) ;; def_code "\\@printnostyle" (fun lexbuf -> let {arg=arg} = save_arg lexbuf in top_open_group () ; Dest.nostyle () ; Dest.put arg ; top_close_group ()) ;; def_code "\\@getprintnostyle" (fun lexbuf -> top_open_group () ; Dest.nostyle () ; let arg = get_prim_arg lexbuf in Dest.put arg ; top_close_group ()) ;; def_code "\\@getprint" (fun lexbuf -> let arg = get_prim_arg lexbuf in (* eprintf "GET PRINT: '%s'\n" arg ;*) let buff = MyLexing.from_string arg in Dest.put (Save.tagout buff)) ; ;; def_code "\\@subst" (fun lexbuf -> let arg = subst_arg lexbuf in Dest.put arg) ; def_code "\\@subst@expn" (fun lexbuf -> let arg = subst_expn_arg lexbuf in Dest.put arg) ;; (* write a string in aux file *) def_code "\\@auxdowrite" (fun lexbuf -> let what = save_arg lexbuf in let s = get_this_arg main what in Auxx.swrite s) ;; (* Idem, with no evaluation *) def_code "\\@auxdowritesubst" (fun lexbuf -> let what = subst_arg lexbuf in Auxx.swrite what) ;; (* format toc file *) def_code "\\@addtocsec" (fun lexbuf -> let suf = get_prim_arg lexbuf in let anchor = get_prim_arg lexbuf in let level = get_num_arg lexbuf in let {arg=title} = save_arg lexbuf in Auxx.addtoc suf level (sprintf "\\@locref{%s%s}{\\begin{@norefs}%s\\end{@norefs}}" suf anchor title)) ;; (* Second version with anchor disconnected from toc suffix *) def_code "\\@@addtocsec" (fun lexbuf -> let suf = get_prim_arg lexbuf in let anchor = get_prim_arg lexbuf in let level = get_num_arg lexbuf in let {arg=title} = save_arg lexbuf in Auxx.addtoc suf level (sprintf "\\@locref{%s}{\\begin{@norefs}%s\\end{@norefs}}" anchor title)) ;; def_code "\\@addcontentsline" (fun lexbuf -> let saved = check_all () in try let suf = get_prim_arg lexbuf in let level = get_num_arg lexbuf in let {arg=title} = save_arg lexbuf in Auxx.addtoc suf level title with e -> hot_all saved ; Misc.warning (sprintf "Failure of \\@addcontentsline: %s" (Printexc.to_string e))) ;; def_code "\\@notags" (fun lexbuf -> let arg = save_arg lexbuf in let arg = get_this_arg main arg in let r = let buff = MyLexing.from_string arg in Save.tagout buff in Dest.put r) ;; def_code "\\@anti" (fun lexbuf -> let arg = save_arg lexbuf in let envs = get_style (fun _lex -> Dest.clearstyle () ; main _lex) arg in if !verbose > 2 then begin prerr_string ("Anti result: ") ; List.iter (fun s -> prerr_string (Element.pretty_text s^", ")) envs ; prerr_endline "" end ; Dest.erase_mods envs) ;; let styles_stack = MyStack.create "styles" ;; def_code "\\push@styles" (fun _lexbuf -> let envs = get_style main {arg = "" ; subst=top_subst} in MyStack.push styles_stack envs) ; def_code "\\pop@styles" (fun _lexbuf -> let envs = MyStack.pop styles_stack in Dest.clearstyle () ; List.iter Dest.open_mod (List.rev envs)) ;; def_code "\\@style" (fun lexbuf -> let arg = get_prim_arg lexbuf in Dest.open_mod (Style arg) ) ;; def_code "\\@styleattr" (fun lexbuf -> let tag = get_prim_arg lexbuf in let attr = get_prim_arg lexbuf in Dest.open_mod (StyleAttr (tag, attr))) ; def_code "\\@span" (fun lexbuf -> let attr = get_prim_arg lexbuf in Dest.open_mod (StyleAttr ("span", attr))) ;; def_code "\\@fontcolor" (fun lexbuf -> let arg = get_prim_arg lexbuf in Dest.open_mod (Color arg)) ;; (* def_code "\\@styleset" (fun lexbuf -> let arg = get_prim_arg lexbuf in Dest.open_mod (...)) ;; *) def_code "\\@fontsize" (fun lexbuf -> let arg = save_body lexbuf in Dest.open_mod (Font (Get.get_int arg)) ) ;; def_code "\\@nostyle" (fun lexbuf -> Dest.nostyle () ; check_alltt_skip lexbuf) ;; def_code "\\@clearstyle" (fun lexbuf -> Dest.clearstyle () ; check_alltt_skip lexbuf) ;; def_code "\\@incsize" (fun lexbuf -> let arg = save_body lexbuf in inc_size (Get.get_int arg) ) ;; def_code "\\htmlcolor" (fun lexbuf -> let arg = get_prim_arg lexbuf in Dest.open_mod (Color ("\"#"^arg^"\"")) ) ;; def_code "\\usecounter" (fun lexbuf -> let arg = get_prim_arg lexbuf in Counter.set_counter arg 0 ; Dest.set_dcount arg) ;; def_code "\\@fromlib" (fun lexbuf -> let arg = get_prim_arg lexbuf in start_lexstate (); Mysys.put_from_file (Filename.concat Mylib.libdir arg) Dest.put; restore_lexstate ()) ;; def_code "\\@imageflush" (fun lexbuf -> Image.page () ; check_alltt_skip lexbuf) ;; def_code "\\textalltt" (fun lexbuf -> let opt = get_prim_opt "code" lexbuf in let arg = save_arg lexbuf in let old = !alltt in scan_this main "\\mbox{" ; alltt := Lexstate.Inside ; Dest.open_group opt ; scan_this_arg main arg ; Dest.close_group () ; scan_this main "}" ; alltt := old ) ;; def_code "\\@itemdisplay" (fun _lexbuf -> Dest.force_item_display ()) ;; def_code "\\@br" (fun _lexbuf -> Dest.skip_line ()) ;; (* TeX conditionals *) let testif cell lexbuf = if !cell then check_alltt_skip lexbuf else skip_false lexbuf let setif cell b lexbuf = let old = !cell in fun_register (fun () -> cell := old) ; cell := b ; check_alltt_skip lexbuf ;; let extract_if name = let l = String.length name in if l <= 3 || String.sub name 0 3 <> "\\if" then raise (Misc.ScanError ("Bad newif: "^name)) ; String.sub name 3 (l-3) ;; let def_and_register name f = def name zero_pat (CamlCode f) ;; let tbool = function | true -> "+" | false -> "-" let tverb name cell lexbuf = if !verbose > 1 then fprintf stderr "Testing %s -> %s\n" name (tbool !cell) ; testif cell lexbuf ;; let newif_ref name cell = def_and_register ("\\if"^name) (tverb name cell) ; def_and_register ("\\"^name^"true") (setif cell true) ; def_and_register ("\\"^name^"false") (setif cell false) ; register_cell name cell ; fun_register (fun () -> unregister_cell name) ;; let newif lexbuf = let arg = get_csname lexbuf in begin try let name = extract_if arg in let cell = ref false in newif_ref name cell ; with Latexmacros.Failed -> () end ;; exception FailedFirst ;; let rec norm_body k b = match b with | [] -> 0,b | x::xs -> if k >= String.length x then norm_body 0 xs else k,b let same_body = let rec do_rec k1 k2 b1 b2 = match norm_body k1 b1, norm_body k2 b2 with | (_,[]),(_,[]) -> true | ((_,[]),(_,_::_)) | ((_,_::_),(_,[])) -> false | (k1,(x1::_ as b1)),(k2,(x2::_ as b2)) -> let c1 = x1.[k1] and c2 = x2.[k2] in (* eprintf "k1=%i, c1='%c', k2=%i, c2='%c'\n" k1 c1 k2 c2 ; *) c1 = c2 && do_rec (k1+1) (k2+1) b1 b2 in do_rec 0 0 let same_expn (p1,a1) (p2,a2) = (p1 = p2) && (match a1,a2 with | Subst b1,Subst b2 -> (* eprintf "Check: [%a] [%a]\n" Lexstate.pretty_body b1 Lexstate.pretty_body b2 ; *) same_body b1 b2 | _,_ -> a1 = a2) ;; def_code "\\ifx" (fun lexbuf -> let arg1 = get_csname lexbuf in let arg2 = get_csname lexbuf in let r = try let m1 = try Latexmacros.find_fail arg1 with | Failed -> raise FailedFirst in let m2 = Latexmacros.find_fail arg2 in same_expn m1 m2 with | FailedFirst -> begin try let _ = Latexmacros.find_fail arg2 in false with Failed -> true end | Failed -> false in if !verbose > 2 then prerr_endline ("\\ifx -> "^(if r then "true" else "false")) ; if r then check_alltt_skip lexbuf else skip_false lexbuf) ;; def_code "\\ifu" (fun lexbuf -> let arg1 = get_csname lexbuf in try let _ = Latexmacros.find_fail arg1 in skip_false lexbuf with | Failed -> check_alltt_skip lexbuf) ;; def_code "\\ife" (fun lexbuf -> let arg = get_csname lexbuf in let r = get_prim arg in if r <> "" then skip_false lexbuf else check_alltt_skip lexbuf) ;; def_code "\\newif" newif ;; def_code "\\else" (fun lexbuf -> skip_false lexbuf) ;; def_code "\\fi" (fun lexbuf -> check_alltt_skip lexbuf) ;; let sawdocument = ref false ;; let entities = ref (match !symbol_mode with Entity -> true | _ -> false) ;; newif_ref "symb" (ref (match !symbol_mode with Symbol -> true | _ -> false)) ; newif_ref "entities" entities ; newif_ref "symbtext" (ref (match !symbol_mode with SText -> true | _ -> false)) ; newif_ref "raw" raw_chars ; newif_ref "silent" silent; newif_ref "math" in_math ; newif_ref "whitepre" whitepre ; newif_ref "mmode" in_math ; newif_ref "display" display ; newif_ref "verbd" displayverb ; (* NO NEED AFTER BABEL SUPPORT *) (*newif_ref "french" french ;*) newif_ref "html" html; newif_ref "text" text; newif_ref "info" text; newif_ref "mathml" Parse_opts.mathml; newif_ref "optarg" optarg; newif_ref "styleloaded" styleloaded; newif_ref "activebrace" activebrace; newif_ref "pedantic" pedantic ; newif_ref "fixpoint" fixpoint ; newif_ref "moreentities" moreentities; newif_ref "alltt@loaded" alltt_loaded ; newif_ref "filter" (ref filter) ; newif_ref "@sawdocument" sawdocument ; newif_ref "@warnunder" warn_under ; newif_ref "@dumpindex" Misc.dump_index ; def_code "\\iftrue" (testif (ref true)) ; def_code "\\iffalse" (testif (ref false)) ; ;; def_code "\\if@toplevel" (fun lexbuf -> if echo_global_toimage () then check_alltt_skip lexbuf else skip_false lexbuf) ;; (* Bibliographies *) let bib_ref s1 s2 post = Auxx.swrite ("\\citation{"^s1^"}\n") ; scan_this main ("\\@bibref{\\bibtaghook{"^s1^"}}{"^s2^"}{"^post^"}") ;; let cite_arg key = let key = get_prim ("\\bibtaghook{"^key^"}") in match Auxx.bget true key with | None -> "" | Some s -> s ;; def_code "\\cite" (fun lexbuf -> let opt1 = subst_opt "" lexbuf in let has_opt1 = !optarg in let opt2 = subst_opt "" lexbuf in let has_opt2 = !optarg in check_alltt_skip lexbuf ; let args = save_cite_arg lexbuf in let args = Subst.subst_list args in Dest.open_group "" ; scan_this main "\\@open@cite@one" ; if has_opt1 && has_opt2 then begin if not (is_empty_list opt1) then begin scan_this_list main ("\\@cite@pre{"::opt1@["}"]) end end ; scan_this main "\\@open@cite@two" ; let post = let opt = if has_opt1 && has_opt2 then Some opt2 else if has_opt1 then Some opt1 else None in match opt with | Some s -> String.concat "" s | None -> "" in let rec do_rec = function [] -> () | [x] -> bib_ref x (cite_arg x) post | x::rest -> bib_ref x (cite_arg x) "" ; scan_this main "\\@sep@cite\\@sep@cite@space" ; do_rec rest in do_rec args ; scan_this main "\\@close@cite" ; Dest.close_group ()) ;; (* Includes *) def_code "\\includeonly" (fun lexbuf -> let arg = Save.cite_arg lexbuf in add_includes arg ) ;; (* Foot notes *) def_code "\\@stepanchor" (fun lexbuf -> let mark = Get.get_int (save_body lexbuf) in Foot.step_anchor mark) ; def_code "\\@anchorval" (fun lexbuf -> let mark = Get.get_int (save_body lexbuf) in Dest.put (string_of_int (Foot.get_anchor mark))) ;; def_code "\\@footnotetext" (fun lexbuf -> start_lexstate () ; let mark = Get.get_int (save_body lexbuf) in let text = save_arg lexbuf in let text = do_get_this start_normal end_normal Dest.clearstyle main text in Foot.register mark (get_this_string main ("\\@fnmarknote{"^string_of_int mark^"}")) text ; restore_lexstate ()) ;; let foot_noteflush sticky lexbuf = let sec_here = get_prim_arg lexbuf and sec_notes = get_prim "\\@footnotelevel" in start_lexstate () ; Foot.flush sticky (scan_this main) Dest.put sec_notes sec_here ; restore_lexstate () ;; def_code "\\@footnoteflush" (foot_noteflush false) ; def_code "\\@footnoteflush@sticky" (foot_noteflush true) ;; def_code "\\@footnotesub" (fun _lexbuf -> Foot.sub_notes ()) ; def_code "\\@endfootnotesub" (fun _ -> Foot.end_notes ()) ;; (* Opening and closing environments *) def_code "\\begin" (fun lexbuf -> let env = get_prim_arg lexbuf in new_env env ; top_open_block "" "" ; let macro = start_env env in let old_envi = save stack_entry in push stack_entry env ; begin try do_expand_command main no_skip macro lexbuf with | e -> restore stack_entry old_envi ; raise e end ; restore stack_entry old_envi) ;; def_code "\\end" (fun lexbuf -> let env = get_prim_arg lexbuf in do_expand_command main no_skip (end_env env) lexbuf ; top_close_block "" ; close_env env) ;; (* To close/reopen envs from their associated commands *) def_code "\\@end" (fun lexbuf -> let env = get_prim_arg lexbuf in top_close_block "" ; close_env env) ;; def_code "\\@begin" (fun lexbuf -> let env = get_prim_arg lexbuf in new_env env ; top_open_block "" "") ;; let append_to_opt o s = match o with | "" -> s | _ -> o ^ " " ^s ;; (*****************************) (* To be called by \document *) (*****************************) def_code "\\@begin@document" (fun lexbuf -> let s = get_prim "\\heveaimagedir" in if s <> "" then begin Misc.set_image_opt (append_to_opt (Misc.get_image_opt ()) ("-todir "^s)) end ; check_alltt_skip lexbuf) ;; def_code "\\@addimagenopt" (fun lexbuf -> let opt = get_prim_arg lexbuf in Misc.set_image_opt (append_to_opt (Misc.get_image_opt ()) opt) ; check_alltt_skip lexbuf) ;; def_code "\\@getimagenopt" (fun lexbuf -> Dest.put (Misc.get_image_opt ()) ; check_alltt_skip lexbuf) ;; def_code "\\@imagenopt" (fun lexbuf -> Image.put ("%Options: "^Misc.get_image_opt ()) ; check_alltt_skip lexbuf) ;; def_code "\\@raise@enddocument" (fun _ -> if not !sawdocument then fatal ("\\end{document} with no \\begin{document}") else if not (MyStack.empty stack_env) then error_env "document" !cur_env else begin raise Misc.EndDocument end) ;; let little_more lexbuf = to_newline lexbuf ; Out.to_string more_buff ;; def_code "\\endinput" (fun lexbuf -> let reste = little_more lexbuf in scan_this main reste ; raise Misc.EndInput) ;; (* Boxes *) def_code "\\mbox" (fun lexbuf -> mbox_arg lexbuf) ;; def_code "\\newsavebox" (fun lexbuf -> let name = get_csname lexbuf in try let _ = find_fail name in warning ("Not (re-)defining '"^name^"' with \\newsavebox") with | Failed -> global_def name zero_pat (CamlCode (fun _ -> ()))) ;; def_code "\\providesavebox" (fun lexbuf -> let name = get_csname lexbuf in try let _ = find_fail name in () with | Failed -> global_def name zero_pat (CamlCode (fun _ -> ()))) ;; let get_this_arg_mbox arg = start_mbox () ; let r = get_this_arg main arg in top_close_group () ; r ;; let do_sbox global name body = if not (Latexmacros.exists name) then warning ("\\sbox on undefined bin '"^name^"'") ; let to_print = get_this_arg_mbox body in (if global then global_def else def) name zero_pat (caml_print to_print) ;; def_code "\\savebox" (fun lexbuf -> let name = get_csname lexbuf in warning "savebox"; skip_opt lexbuf ; skip_opt lexbuf ; let body = save_arg lexbuf in do_sbox false name body) ;; def_code "\\sbox" (fun lexbuf -> let name = get_csname lexbuf in let body = save_arg lexbuf in do_sbox false name body) ; def_code "\\gsbox" (fun lexbuf -> let name = get_csname lexbuf in let body = save_arg lexbuf in do_sbox true name body) ; ;; (* Notice that using a bin name as a command also works, but without erasing actives styles *) def_code "\\usebox" (fun lexbuf -> let name = get_csname lexbuf in top_open_group () ; Dest.nostyle () ; expand_command name lexbuf ; top_close_group () ; ()) ;; def_code "\\lrbox" (fun lexbuf -> close_env "lrbox" ; push stack_display !display ; display := false ; let name = get_csname lexbuf in Dest.open_aftergroup (fun s -> def name zero_pat (caml_print s) ; "") ; start_mbox ()) ;; def_code "\\endlrbox" (fun _ -> top_close_group () ; (* close mbox *) Dest.close_group () ; (* close after group *) display := pop stack_display ; new_env "lrbox") ;; (* External acess to close math mode, preserving text/display *) let start_text () = push stack_table !in_table ; in_table := NoTable ; push stack_in_math !in_math ; in_math := false and end_text () = in_math := pop stack_in_math ; in_table := pop stack_table ;; def_code "\\@start@text" (fun _ -> start_text ()) ; def_code "\\@end@text" (fun _ -> end_text ()) ;; (* chars *) def_code "\\char" (fun lexbuf -> let arg = get_num_arg lexbuf in if not !silent && (arg < 32 || (arg > 127 && arg < 161)) then begin Location.print_pos () ; prerr_endline ("Warning: \\char, check output"); end ; translate_put_unicode (Char.chr arg) (fun () -> -1) ; if not (effective !alltt) then check_alltt_skip lexbuf) ;; def_code "\\symbol" (fun lexbuf -> let arg = get_prim_arg lexbuf in scan_this main ("\\char"^arg)) ;; (* labels *) (* Counters *) let alpha_of_int i = String.make 1 (Char.chr (i-1+Char.code 'a')) and upalpha_of_int i = String.make 1 (Char.chr (i-1+Char.code 'A')) ;; let rec roman_of_int = function 0 -> "" | 1 -> "i" | 2 -> "ii" | 3 -> "iii" | 4 -> "iv" | 9 -> "ix" | i -> if i < 9 then "v"^roman_of_int (i-5) else let d = i / 10 and u = i mod 10 in String.make d 'x'^roman_of_int u ;; let uproman_of_int i = String.uppercase (roman_of_int i) ;; let fnsymbol_of_int = function 0 -> " " | 1 -> "*" | 2 -> "#" | 3 -> "$" | 4 -> "\167" | 5 -> "\182" | 6 -> "||" | 7 -> "**" | 8 -> "##" | 9 -> "$$" | i -> alpha_of_int (i-9) ;; let def_printcount name f = def_code name (fun lexbuf -> let cname = get_prim_arg lexbuf in let cval = match cname with | "inputlineno" -> Location.get_lineno () | _ -> Counter.value_counter cname in let pp = f cval in Dest.put pp) ;; def_printcount "\\arabic" string_of_int ; def_printcount "\\alph" alpha_of_int ; def_printcount "\\Alph" upalpha_of_int ; def_printcount "\\roman" roman_of_int; def_printcount "\\Roman" uproman_of_int; def_printcount "\\fnsymbol" fnsymbol_of_int ;; let pad p l s = for _i = l-String.length s downto 1 do translate_put_unicode_string p done ;; def_code "\\@pad" (fun lexbuf -> let p = get_prim_arg lexbuf in let l = Get.get_int (save_body lexbuf) in let arg = get_prim_arg lexbuf in pad p l arg ; translate_put_unicode_string arg) ;; def_code "\\newcounter" (fun lexbuf -> Save.start_echo () ; let name = get_prim_arg lexbuf in let within = get_prim_opt "" lexbuf in let real_args = Save.get_echo () in if echo_global_toimage () then begin Image.put "\\newcounter" ; Image.put real_args ; Image.put_char '\n' end ; do_newcounter name within) ;; def_code "\\addtocounter" (fun lexbuf -> Save.start_echo () ; let name = get_prim_arg lexbuf in let arg = save_body lexbuf in let real_args = Save.get_echo () in if echo_global_toimage () then begin Image.put "\\addtocounter" ; Image.put real_args ; Image.put_char '\n' end ; Counter.add_counter name (Get.get_int arg)) ;; def_code "\\setcounter" (fun lexbuf -> Save.start_echo () ; let name = get_prim_arg lexbuf in let arg = save_body lexbuf in let real_args = Save.get_echo () in if echo_global_toimage () then begin Image.put "\\setcounter" ; Image.put real_args ; Image.put_char '\n' end ; Counter.set_counter name (Get.get_int arg) ) ;; def_code "\\stepcounter" (fun lexbuf -> Save.start_echo () ; let name = get_prim_arg lexbuf in let real_args = Save.get_echo () in if echo_global_toimage () then begin Image.put "\\stepcounter" ; Image.put real_args ; Image.put_char '\n' end ; Counter.step_counter name) ;; (* spacing *) (* let stack_closed = MyStack.create "stack_closed" ;; def_code "\\@saveclosed" (fun lexbuf -> push stack_closed (Dest.get_last_closed ()) ; check_alltt_skip lexbuf) ;; def_code "\\@restoreclosed" (fun lexbuf -> Dest.set_last_closed (pop stack_closed) ; check_alltt_skip lexbuf) ;; *) exception Cannot ;; def_code "\\@getlength" (fun lexbuf -> let arg = get_prim_arg lexbuf in let pxls = match Get.get_length arg with | Length.Pixel n -> n | Length.Char n -> Length.char_to_pixel n | _ -> 0 in (* eprintf "GET LENGTH: %i\n" pxls ; *) Dest.put (string_of_int pxls)) ;; let do_space (warn:string -> unit) (doit:unit -> unit) lexbuf = let arg = subst_arg lexbuf in try let n = match Length.main (MyLexing.from_string arg) with | Length.Char n -> n | Length.Pixel n -> Length.pixel_to_char n | _ -> raise Cannot in for _i=1 to n do doit () done with Cannot -> warn arg ;; let warn_space name arg = warning (name^" with arg '"^arg^"'") ;; let warn_hspace = warn_space "\\hspace" and warn_vspace = warn_space "\\vspace" ;; def_code "\\hspace" (fun lexbuf -> do_space warn_hspace Dest.put_nbsp lexbuf) ; def_code "\\vspace" (fun lexbuf -> do_space warn_vspace Dest.skip_line lexbuf) ; def_code "\\@vdotsfill" (fun lexbuf -> do_space (fun arg -> warning ("vertical length: "^arg) ; scan_this main "\\vdots") (let fst = ref true in (fun () -> if not !fst then Dest.skip_line () else fst := false ; scan_this main "\\vdots")) lexbuf) ;; (* Explicit groups *) def_code "\\begingroup" (fun lexbuf -> new_env "command-group" ; top_open_block "" "" ; check_alltt_skip lexbuf) ;; def_code "\\endgroup" (fun lexbuf -> top_close_block "" ; close_env !cur_env ; check_alltt_skip lexbuf) ;; (* alltt *) register_init "alltt" (fun () -> def_code "\\alltt" (fun _ -> if !verbose > 1 then prerr_endline "begin alltt" ; alltt := Lexstate.Inside ; fun_register (fun () -> alltt := Not) ; Dest.close_block "" ; Dest.open_block "pre" "") ; def_code "\\endalltt" (fun _ -> if !verbose > 1 then prerr_endline "end alltt" ; Dest.close_block "pre" ; Dest.open_block "" "")) ;; (* Multicolumn *) def_code "\\multicolumn" (fun lexbuf -> if not (is_table !in_table) then raise (ScanError "\\multicolumn should occur in some array") ; let n = Get.get_int (save_body lexbuf) in let format = Tabular.main (save_arg lexbuf) in do_multi n format main) ;; def_code "\\hline" (fun lexbuf -> if not (is_table !in_table) then raise (ScanError "\\hline should occur in some array") ; do_hline main ; skip_blanks_pop lexbuf ; let _ = Dest.forget_par () in ()) ;; (* inside tabbing *) let do_tabul lexbuf = if is_tabbing !in_table then begin do_unskip () ; Dest.close_cell ""; Dest.open_cell default_format 1 0 false end ; skip_blanks_pop lexbuf ;; let tabbing_kill lexbuf = if is_tabbing !in_table then begin do_unskip () ; Dest.close_cell ""; Dest.erase_row () ; Dest.new_row () ; Dest.open_cell default_format 1 0 false end ; skip_blanks_pop lexbuf ;; let def_no_fail name f = Latexmacros.def name zero_pat (CamlCode f) ;; let def_tabbing_commands () = def_no_fail "\\=" do_tabul ; def_no_fail "\\>" do_tabul ; def_no_fail "\\kill" tabbing_kill ;; (* Tabular and arrays *) let check_width = function | Length.Char x -> "width:" ^ string_of_int (Length.char_to_pixel x) ^ "px" | Length.Pixel x -> "width:" ^ string_of_int x ^ "px" | Length.Percent x -> "width:" ^ string_of_int x^"%" | _ -> "" ;; let get_table_attributes border len = let attrs = get_prim (if border then "\\@table@attributes@border" else "\\@table@attributes") in Lexattr.add_style (check_width len) attrs let open_tabbing _lexbuf = let lexbuf = Lexstate.previous_lexbuf in let lexfun _lb = Dest.open_table false "style=\"border:0;border-spacing:0\" class=\"cellpadding0\"" ; Dest.new_row (); Dest.open_cell default_format 1 0 false in push stack_table !in_table ; in_table := Tabbing ; new_env "tabbing" ; def_tabbing_commands () ; def "\\a" zero_pat (CamlCode (fun lexbuf -> let acc = subst_arg lexbuf in let arg = subst_arg lexbuf in scan_this main ("\\"^acc^arg))) ; lexfun lexbuf ;; def_code "\\tabbing" open_tabbing ;; let close_tabbing _ = Dest.do_close_cell (); Dest.close_row (); Dest.close_table (); in_table := pop stack_table ; close_env "tabbing" ; ;; def_code "\\endtabbing" close_tabbing ;; let open_array env lexbuf = save_array_state (); Tabular.border := false ; let len = match env with | "tabular*"|"Tabular*" -> let arg = save_arg lexbuf in begin match Get.get_length (get_prim_onarg arg) with | Length.No _ -> warning ("'tabular*' with length argument: "^ do_subst_this arg) ; Length.Default | width -> width end | _ -> Length.Default in let attributes = match env with | "Tabular*" | "Array" | "Tabular" -> get_prim_opt "" lexbuf | _ -> skip_opt lexbuf ; "" in skip_opt lexbuf ; let format = save_arg lexbuf in let format = Tabular.main format in cur_format := format ; push stack_in_math !in_math ; in_table := Table {math = (match env with "array"|"Array" -> true | _ -> false) ; border = !Tabular.border} ; if !display then Dest.force_item_display () ; in_math := false ; push stack_display !display ; display := false ; begin match attributes with | "" -> if !Tabular.border then Dest.open_table true (get_table_attributes true len) else Dest.open_table false (get_table_attributes false len) | _ -> Dest.open_table !Tabular.border (Lexattr.add_style (check_width len) attributes) end ; open_row() ; open_first_col main ; skip_blanks_pop lexbuf ; ;; def_code "\\@array" (open_array "array") ; def_code "\\@tabular" (open_array "tabular") ; def_code "\\@tabular*" (open_array "tabular*") ;; def_code "\\@Array" (open_array "Array") ; def_code "\\@Tabular" (open_array "Tabular") ; def_code "\\@Tabular*" (open_array "Tabular*") ;; let close_array _ = do_unskip () ; close_last_col main "" ; close_last_row () ; Dest.close_table () ; restore_array_state () ; in_math := pop stack_in_math ; display := pop stack_display; if !display then Dest.force_item_display () ; ;; def_code "\\end@array" close_array ; def_code "\\end@tabular" close_array ; def_code "\\end@tabular*" close_array ; def_code "\\end@Array" close_array ; def_code "\\end@Tabular" close_array ; def_code "\\end@Tabular*" close_array ; ;; let do_amper lexbuf = if effective !alltt || not (is_plain '&') then begin let lxm = lexeme lexbuf in translate_put_unicode_string lxm end else if is_table !in_table then begin close_col main " "; open_col main end ; if not (effective !alltt) && is_plain '&' then skip_blanks_pop lexbuf and do_bsbs lexbuf = do_unskip () ; skip_opt lexbuf ; if is_table !in_table then begin close_col main " " ; close_row () ; open_row () ; open_first_col main end else if is_tabbing !in_table then begin Dest.close_cell ""; Dest.close_row () ; Dest.new_row () ; Dest.open_cell default_format 1 0 false end else begin if !display then (*(Dest.put_nbsp ();Dest.put_nbsp ();Dest.put_nbsp ();Dest.put_nbsp ())*) warning "\\\\ in display mode, ignored" else Dest.skip_line () end ; skip_blanks_pop lexbuf ; let _ = Dest.forget_par () in () ;; OutUnicode.def_default OutUnicode.minus "\\@print{-}" ; OutUnicode.def_default OutUnicode.endash "\\@print{--}" ; OutUnicode.def_default OutUnicode.emdash "\\@print{---}" ; () ;; let get_tt_mode () = match get_style (fun _lex -> Dest.clearstyle () ; main _lex) (string_to_arg "\\tt") with | [m] -> m | m::_ -> warning "tt_mode is a complex style" ; m | [] -> warning "tt_mode is an empty style" ; raise Exit let tt_mode = ref (Style "tt") ;; (* Will be called once command \tt is defined *) def_code "\\@set@ttmode" (fun lexbuf -> begin try tt_mode := get_tt_mode () with Exit -> () end ; check_alltt_skip lexbuf) ;; let has_tt () = Dest.has_mod !tt_mode let do_minus lexbuf = if not (effective !alltt) && is_plain '-' && not (has_tt ()) then if Save.if_next_char '-' lexbuf then begin gobble_one_char lexbuf ; if Save.if_next_char '-' lexbuf then begin gobble_one_char lexbuf ; put_unicode OutUnicode.emdash end else put_unicode OutUnicode.endash end else if !in_math && not !raw_chars then put_unicode OutUnicode.minus else Dest.put_char '-' else Dest.put_char '-' ;; OutUnicode.def_default OutUnicode.ldquot "\\@print{\"}" ; OutUnicode.def_default OutUnicode.rdquot "\\@print{\"}" ; OutUnicode.def_default OutUnicode.lsquot "\\@print{`}" ; OutUnicode.def_default OutUnicode.rsquot "\\@print{'}" ; OutUnicode.def_default OutUnicode.prime "\\@print{'}" ; OutUnicode.def_default OutUnicode.dprime "\\@print{''}" ; OutUnicode.def_default OutUnicode.tprime "\\@print{'''}" ; OutUnicode.def_default OutUnicode.rprime "\\@print{`}" ; OutUnicode.def_default OutUnicode.rdprime "\\@print{``}" ; OutUnicode.def_default OutUnicode.rtprime "\\@print{```}" ; () ;; let do_backquote lexbuf = if is_plain '`' then begin if !in_math then begin if Save.if_next_char '`' lexbuf then begin gobble_one_char lexbuf ; if Save.if_next_char '`' lexbuf then begin gobble_one_char lexbuf ; put_unicode OutUnicode.rtprime end else put_unicode OutUnicode.rdprime end else put_unicode OutUnicode.rprime end else if has_tt () then put_unicode OutUnicode.lsquot else if Save.if_next_char '`' lexbuf then begin gobble_one_char lexbuf ; put_unicode OutUnicode.ldquot end else put_unicode OutUnicode.lsquot end else Dest.put_char '`' and do_quote lexbuf = if is_plain '\'' then begin if !in_math then begin if Save.if_next_char '\'' lexbuf then begin gobble_one_char lexbuf ; if Save.if_next_char '\'' lexbuf then begin gobble_one_char lexbuf ; put_unicode OutUnicode.tprime end else put_unicode OutUnicode.dprime end else put_unicode OutUnicode.prime end else if has_tt () then put_unicode OutUnicode.rsquot else if Save.if_next_char '\'' lexbuf then begin gobble_one_char lexbuf ; put_unicode OutUnicode.rdquot end else put_unicode OutUnicode.rsquot end else Dest.put_char '\'' ;; def_code "\\@hevea@amper" do_amper ; def_code "\\\\" do_bsbs ; def_code "\\@HEVEA@amper" do_amper ; def_code "\\@HEVEA@bsbs" do_bsbs ; def_code "\\@hevea@minus" do_minus ; def_code "\\@hevea@backquote" do_backquote ; def_code "\\@hevea@quote" do_quote ; () ;; (* Other scanners *) def_code "\\latexonly" (fun lexbuf -> start_other_scan "latexonly" latexonly lexbuf) ;; def_code "\\toimage" (fun lexbuf -> start_image_scan "" image lexbuf) ;; (* Commands to control output to image file or target file *) def_code "\\@stopimage" (fun lexbuf -> Image.stop () ; check_alltt_skip lexbuf) ;; def_code "\\@restartimage" (fun lexbuf -> Image.restart () ; check_alltt_skip lexbuf) ;; def_code "\\@stopoutput" (fun lexbuf -> Dest.stop () ; check_alltt_skip lexbuf) ;; def_code "\\@restartoutput" (fun lexbuf -> Dest.restart () ; check_alltt_skip lexbuf) ;; def_code "\\@prim@toimage" (fun lexbuf -> let arg = get_prim_arg lexbuf in Image.put arg) ;; (* Info format specific *) def_code "\\@infomenu" (fun lexbuf -> let arg = get_prim_arg lexbuf in Dest.infomenu arg) ;; def_code "\\@infonode" (fun lexbuf -> let opt = get_prim_opt "" lexbuf in let num = get_prim_arg lexbuf in let nom = get_prim_arg lexbuf in Dest.infonode opt num nom) ;; def_code "\\@infoextranode" (fun lexbuf -> let num = get_prim_arg lexbuf in let nom = get_prim_arg lexbuf in let text = get_prim_arg lexbuf in Dest.infoextranode num nom text) ;; def_code "\\@infoname" (fun lexbuf -> let arg = get_prim_arg lexbuf in Dest.loc_name arg) ;; let safe_len = function | Length.No _ -> Length.Default | l -> l ;; let wrap_hr f = out_par (fun () -> top_open_group () ; Dest.nostyle () ; f () ; top_close_group ()) ;; def_code "\\@printHR" (fun lexbuf -> let arg = get_prim_arg lexbuf in let taille = safe_len (Get.get_length (get_prim_arg lexbuf)) in wrap_hr (fun () -> Dest.horizontal_line arg taille (Length.Pixel 2))) ;; def_code"\\@hr" (fun lexbuf -> let attr = get_prim_opt "" lexbuf in let width = safe_len (Get.get_length (get_prim_arg lexbuf)) in let height = safe_len (Get.get_length (get_prim_arg lexbuf)) in wrap_hr (fun () -> Dest.horizontal_line attr width height)) ;; Get.init get_prim_onarg get_fun_result new_env close_env get_csname main ;; def_code "\\@primitives" (fun lexbuf -> let pkg = get_prim_arg lexbuf in exec_init pkg) ;; (* try e1 with _ -> e2 *) def_code "\\@try" (fun lexbuf -> let saved = check_all () in let e1 = save_arg lexbuf in let e2 = save_arg lexbuf in try top_open_block "temp" "" ; scan_this_arg main e1 ; top_close_block "temp" with e -> begin hot_all saved ; Misc.print_verb 0 ("\\@try caught exception : "^Printexc.to_string e) ; scan_this_arg main e2 end) ;; def_code "\\@heveafail" (fun lexbuf -> let s = get_prim_arg lexbuf in raise (Misc.Purposly s)) ;; (* (* A la TeX ouput (more or less...) *) def_code "\\newwrite" (fun lexbuf -> let cmd = save_arg lexbuf in let file = ref stderr in def_code cmd (fun lexbuf -> let op = save_arg lexbuf in try match op with | "\\write" -> let what = subst_arg subst lexbuf in output_string !file what ; output_char !file '\n' | "\\closeout" -> close_out !file | "\\openout" -> let name = get_this_nostyle main (save_filename lexbuf) in file := open_out name | _ -> warning ("Unkown file operation: "^op) with Sys_error s -> warning ("TeX file error : "^s))) ;; let def_fileop me = def_code me (fun lexbuf -> let cmd = subst_arg lexbuf in scan_this_may_cont main lexbuf (cmd^me)) ;; def_fileop "\\write" ; def_fileop "\\openout" ; def_fileop "\\closeout" ;; *) def_code "\\@funregister" (fun lexbuf -> let later = subst_arg lexbuf in fun_register (fun () -> scan_this main later)) ;; end} hevea-2.30/image.mli0000644004317100512160000000174507021270537014353 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) val start : unit -> unit val stop : unit -> unit val restart : unit -> unit val put_char : char -> unit val put : string -> unit val dump : string -> (Lexing.lexbuf -> unit) -> Lexing.lexbuf -> unit val page : unit -> unit val finalize : bool -> bool hevea-2.30/hevea.sty0000644004317100512160000000576213104607625014423 0ustar marangetcristal% hevea : hevea.sty % This is a very basic style file for latex document to be processed % with hevea. It contains definitions of LaTeX environment which are % processed in a special way by the translator. % Mostly : % - latexonly, not processed by hevea, processed by latex. % - htmlonly , the reverse. % - rawhtml, to include raw HTML in hevea output. % - toimage, to send text to the image file. % The package also provides hevea logos, html related commands (ahref % etc.), void cutting and image commands. \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{hevea}[2002/01/11] \RequirePackage{comment} \newif\ifhevea\heveafalse \@ifundefined{ifimagen}{\newif\ifimagen\imagenfalse} \makeatletter% \newcommand{\heveasmup}[2]{% \raise #1\hbox{$\m@th$% \csname S@\f@size\endcsname \fontsize\sf@size 0% \math@fontsfalse\selectfont #2% }}% \DeclareRobustCommand{\hevea}{H\kern-.15em\heveasmup{.2ex}{E}\kern-.15emV\kern-.15em\heveasmup{.2ex}{E}\kern-.15emA}% \DeclareRobustCommand{\hacha}{H\kern-.15em\heveasmup{.2ex}{A}\kern-.15emC\kern-.1em\heveasmup{.2ex}{H}\kern-.15emA}% \DeclareRobustCommand{\html}{\protect\heveasmup{0.ex}{HTML}} %%%%%%%%% Hyperlinks hevea style \newcommand{\ahref}[2]{{#2}} \newcommand{\ahrefloc}[2]{{#2}} \newcommand{\aname}[2]{{#2}} \newcommand{\ahrefurl}[1]{\texttt{#1}} \newcommand{\footahref}[2]{#2\footnote{\texttt{#1}}} \newcommand{\mailto}[1]{\texttt{#1}} \newcommand{\imgsrc}[2][]{} \newcommand{\home}[1]{\protect\raisebox{-.75ex}{\char126}#1} \AtBeginDocument {\@ifundefined{url} {%url package is not loaded \let\url\ahref\let\oneurl\ahrefurl\let\footurl\footahref} {}} %% Void cutting instructions \newcounter{cuttingdepth} \newcommand{\tocnumber}{} \newcommand{\notocnumber}{} \newcommand{\cuttingunit}{} \newcommand{\cutdef}[2][]{} \newcommand{\cuthere}[2]{} \newcommand{\cutend}{} \newcommand{\htmlhead}[1]{} \newcommand{\htmlfoot}[1]{} \newcommand{\htmlprefix}[1]{} \newenvironment{cutflow}[1]{}{} \newcommand{\cutname}[1]{} \newcommand{\toplinks}[3]{} \newcommand{\setlinkstext}[3]{} \newcommand{\flushdef}[1]{} \newcommand{\footnoteflush}[1]{} %%%% Html only \excludecomment{rawhtml} \newcommand{\rawhtmlinput}[1]{} \excludecomment{htmlonly} %%%% Latex only \newenvironment{latexonly}{}{} \newenvironment{verblatex}{}{} %%%% Image file stuff \def\toimage{\endgroup} \def\endtoimage{\begingroup\def\@currenvir{toimage}} \def\verbimage{\endgroup} \def\endverbimage{\begingroup\def\@currenvir{verbimage}} \newcommand{\imageflush}[1][]{} %%% Bgcolor definition \newsavebox{\@bgcolorbin} \newenvironment{bgcolor}[2][] {\newcommand{\@mycolor}{#2}\begin{lrbox}{\@bgcolorbin}\vbox\bgroup} {\egroup\end{lrbox}% \begin{flushleft}% \colorbox{\@mycolor}{\usebox{\@bgcolorbin}}% \end{flushleft}} %%% Style sheets macros, defined as no-ops \newcommand{\newstyle}[2]{} \newcommand{\addstyle}[1]{} \newcommand{\setenvclass}[2]{} \newcommand{\getenvclass}[1]{} \newcommand{\loadcssfile}[1]{} \newenvironment{divstyle}[1]{}{} \newenvironment{cellstyle}[2]{}{} \newif\ifexternalcss %%% Postlude \makeatother hevea-2.30/index.mli0000644004317100512160000000200607374465040014375 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) val newindex : string -> string -> string -> string -> unit val changename : string -> string -> unit val treat: string -> string -> string -> string val treat_anchor : string -> string -> string -> string -> unit val print: (string -> unit) -> string -> unit val finalize : bool -> bool hevea-2.30/length.mli0000644004317100512160000000203111763416753014551 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: length.mli,v 1.8 2012-06-05 14:55:39 maranget Exp $ *) (***********************************************************************) type t = Char of int | Pixel of int | Percent of int | No of string | Default val pretty : t -> string val is_zero : t -> bool val font : int val pixel_to_char : int -> int val char_to_pixel : int -> int val main: Lexing.lexbuf -> t hevea-2.30/esponja.ml0000644004317100512160000000360712323450432014551 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Printf let arg = ref [] let pess = ref false let move = ref true let small_length = ref 1024 let () = Arg.parse [ ("-version", Arg.Unit (fun () -> print_endline ("esponja "^Version.version) ; print_endline ("library directory: "^Mylib.static_libdir) ; exit 0), "show version and exit") ; ("-rsz", Arg.Int (fun i -> small_length := i), (sprintf "size of leaves in rope implementation (default %i)" !small_length)) ; "-u", Arg.Set pess, "pessimize" ; "-v", Arg.Unit (fun () -> incr Emisc.verbose),"be verbose" ; "-n", Arg.Unit (fun () -> move := false ; incr Emisc.verbose), "do not change files"; ] (fun s -> arg := s :: !arg) ("Usage: esponja [option*] files\noptions are:") ;; module E = Esp.Make (struct let pess = !pess let move = !move let small_length = !small_length end) let process name = try E.file name with Esp.Failed -> () let main () = (* try *) List.iter process (List.rev !arg) ; exit 0 (* with | e -> Printf.fprintf stderr "Unexpected exception: %s\n" (Printexc.to_string e) ; exit 2 *) ;; main () ;; hevea-2.30/info.mli0000644004317100512160000000137111774606345014231 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) include OutManager.S hevea-2.30/hevea.ml0000644004317100512160000001761612632016744014216 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) let header = "$Id: hevea.ml,v 1.4 2011-12-07 13:05:57 maranget Exp $" open Misc open Parse_opts let scan_get_prim, scan_main, no_prelude, scan_print_env_pos, dest_finalize,image_finalize = match !Parse_opts.destination with | Html when name_in <> "" -> let module Scan = Latexscan.Make (Html) (Image) in let module MakeIt = Zyva.Make (Html) (Image) (Scan) in let module Rien = MakeIt (Videoc.Make) in let module RienBis = MakeIt (Package.Make) in let module RienTer = MakeIt (Verb.Make) in Scan.get_prim, Scan.main, Scan.no_prelude, Scan.print_env_pos, Html.finalize, Image.finalize | Html -> let module Scan = Latexscan.Make (Html) (Noimage) in let module Otherscan = Videoc.Make (Html) (Noimage) (Scan) in let module Verbscan = Verb.Make (Html) (Noimage) (Scan) in let module OptScan = Package.Make (Html) (Image) (Scan) in Scan.get_prim, Scan.main, Scan.no_prelude, Scan.print_env_pos, Html.finalize, Noimage.finalize | Text -> let module Scan = Latexscan.Make (Text) (Noimage) in let module Verbscan = Verb.Make (Text) (Noimage) (Scan) in let module OptScan = Package.Make (Text) (Image) (Scan) in Scan.get_prim, Scan.main, Scan.no_prelude, Scan.print_env_pos, Text.finalize,Noimage.finalize | Info -> let module Scan = Latexscan.Make (Info) (Noimage) in let module Verbscan = Verb.Make (Info) (Noimage) (Scan) in let module OptScan = Package.Make (Info) (Image) (Scan) in Scan.get_prim, Scan.main, Scan.no_prelude, Scan.print_env_pos, Info.finalize, Noimage.finalize ;; let prerr_error msg = Location.print_pos () ; if msg <> "" then prerr_endline msg ;; let prerr_bug msg = prerr_error msg ; prerr_endline " (if input is plain LaTeX, please report to Luc.Maranget@inria.fr)" and prerr_not_supported msg = prerr_error msg ; prerr_endline "You ran into hevea limitations, sorrry" ;; let finalize check = try let changed = Auxx.finalize check in let changed = Index.finalize check || changed in let image_changed = image_finalize check in dest_finalize check ; if !verbose > 0 && Parse_opts.name_out <> "" then begin prerr_endline ("Output is in file: "^Parse_opts.name_out) end ; changed,image_changed with e -> if check then raise e else begin prerr_bug ("Uncaught exception in finalize: "^Printexc.to_string e) ; prerr_endline "Adios" ; exit 2 end ;; let read_style name = let oldverb = !verbose in if !verbose > 0 then verbose := oldverb ; begin try let name,chan = Myfiles.open_tex name in if !verbose > 0 then begin prerr_endline ("read_style: "^name) end ; let buf = Lexing.from_channel chan in Location.set name buf; begin try scan_main buf with Misc.EndInput -> () end ; close_in chan ; Location.restore () with | Myfiles.Except-> () end ; verbose := oldverb ;; let read_prog prog = try let real_prog = Myfiles.find prog and name = Filename.temp_file "hevea" ".hva" in begin match Sys.command (real_prog^" >"^name) with | 0 -> read_style name | _ -> warning ("Could not exec program file: "^real_prog) end ; Mysys.remove name with | Not_found -> warning ("Could not find program file: "^prog) let read_tex name_in = Save.set_verbose !silent !verbose ; begin try match name_in with | "" -> Lexstate.real_input_file !verbose scan_main "" stdin | _ -> Lexstate.input_file !verbose scan_main name_in ; let ok = scan_get_prim "\\@end@document@seen" in begin match ok with | "OK" -> () | _ -> prerr_endline "Warning: \\end{document} is missing" end with | Misc.EndDocument -> () end let main () = verbose := !readverb ; read_style "hevea.hva" ; let rec do_rec = function [] -> () | File x::rest -> do_rec rest ; read_style x | Prog x::rest -> do_rec rest ; read_prog x in let styles = Parse_opts.styles in do_rec styles ; if Parse_opts.filter then no_prelude () ; if !Parse_opts.fixpoint then begin let image_changed = ref false in let saved = Hot.checkpoint () in let rec do_rec i = read_tex name_in ; let changed,image_changed_now = finalize true in image_changed := !image_changed || image_changed_now ; if changed then begin Hot.start saved ; Auxx.hot_start () ; Misc.message ("Run, run, again...") ; do_rec (i+1) end else begin Misc.message ("Fixpoint reached in "^string_of_int i^" step(s)") ; if !image_changed then begin Misc.message ("Now, I am running imagen for you") ; let _ = Sys.command (Filename.concat Mylib.libdir "imagen"^ " "^Misc.get_image_opt ()^" "^base_out) in () end end in do_rec 1 end else begin read_tex name_in ; let _ = finalize true in () end ; (* Optimisation *) if !optimize then begin match !destination with | Html -> if name_in <> "" then begin Emisc.verbose := !Misc.verbose ; let module E = Esp.Make (struct let pess = false let move = true let small_length = !small_length end) in begin try E.file name_out with Esp.Failed -> warning "Esponja failed, optimisation not performed" end end | Text|Info -> () end ;; let _ = begin try main () ; exit 0 with | Misc.Close s -> prerr_error ("Environment nesting error: "^s) ; scan_print_env_pos () | Html.Error s -> prerr_error ("Error while writing HTML:\n\t"^s) | Text.Error s -> prerr_error ("Error while writing Text:\n\t"^s) | Info.Error s -> prerr_error ("Error while writing Info:\n\t"^s) | InfoRef.Error s -> prerr_error ("Error while writing Info:\n\t"^s) | Misc.ScanError s -> prerr_error ("Error while reading LaTeX:\n\t"^s) | Lexstate.Error s -> prerr_error ("Error while reading LaTeX:\n\t"^s) | Verb.VError s -> prerr_error ("Error while reading verbatim LaTeX:\n\t"^s) | Colscan.Error s -> prerr_error ("Error while reading LaTeX style colors:\n\t"^s) | Save.Error s -> prerr_error ("Error while reading LaTeX macros arguments:\n\t"^s) | Tabular.Error s -> prerr_error ("Error while reading table format:\n\t"^s) | Get.Error s -> prerr_error ("Error while getting a value:\n\t"^s) | Misc.UserError s -> prerr_error ("User error:\n\t"^s) | Myfiles.Error s -> prerr_error ("File error:\n\t"^s) | Misc.NoSupport s -> prerr_not_supported s | Misc.Fatal s -> prerr_bug ("Fatal error: "^s) | MyStack.Fatal s -> prerr_bug ("Fatal stack error, "^s) (* | x -> prerr_bug ("Fatal error, spurious exception:\n\t"^Printexc.to_string x) *) end ; let _ = finalize false in if !verbose = 0 then Mysys.remove Parse_opts.name_out ; prerr_endline "Adios" ; exit 2 ;; hevea-2.30/misc.mli0000644004317100512160000000470012444523706014222 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (***************) (* Some errors *) (***************) exception Fatal of string (* A bug *) exception NoSupport of string (* A feature *) exception Purposly of string (* Explicit failure: \@heveafail command *) exception ScanError of string (* Error while reading input *) exception UserError of string (* Users should correct their code *) exception Close of string (* Specific user error: env nesting *) (*******************) (* Some non-errors *) (*******************) exception EndInput (* Stop reading that file *) exception EndDocument (* Document is over *) exception EndOfLispComment of int (* QNC *) exception CannotPut (* Cannot ouput Unicode char (text mode) *) val verbose : int ref val readverb : int ref val displayverb : bool ref val silent : bool ref val column_to_command : string -> string val warning : string -> unit val print_verb : int -> string -> unit val message : string -> unit val fatal : string -> 'a val not_supported : string -> 'a (* Copying hash tables, not very nice at present *) val copy_hashtbl : (string, 'a) Hashtbl.t -> (string, 'a) Hashtbl.t -> unit val copy_int_hashtbl : (int, 'a) Hashtbl.t -> (int, 'a) Hashtbl.t -> unit val start_env : string -> string val end_env : string -> string type limits = Limits | NoLimits | IntLimits val set_image_opt : string -> unit val get_image_opt : unit -> string val dump_index : bool ref type saved val checkpoint : unit -> saved val hot_start : saved -> unit (* Some kind of abstract buffer used by unicode in translator *) val next_of_string : string -> (unit -> int) (* two digit hexa -> int *) val hexa_code : char -> char -> int (* Some strinmh utilities (backward compatibility) *) val string_map : (char -> char) -> string -> string hevea-2.30/chapterbib.hva0000644004317100512160000000201710634250756015367 0ustar marangetcristal\let\chapterbib@include\include \newcounter{chap@included} \newcommand{\maketocbibitem}{} \newcommand{\@sectionbib@maketocbibitem}{\@auxdowrite{\@print{\@addcontentsline{htoc}}\{0\}\{\@print{\ahrefloc}\{bib:chap\thechap@included\}\{\refname{}\}\}\@print{ }}} \renewcommand{\include}[1] {\stepcounter{chap@included}% \def\chapterbib@include@name{#1}% \chapterbib@include{#1}} \renewcommand{\bibliography}[1]{\maketocbibitem\input{\chapterbib@include@name.bbl}} \let\chapterbib@thebibliography\thebibliography \renewcommand{\thebibliography}[1] {\setcounter{heveabib}{0}\chapterbib@thebibliography{#1}} \renewcommand{\bibtaghook}[1] {\@ifundefined{chapterbib@include@name}{#1}{#1@\thechap@included}} \newcommand{\sectionbib}[2] {\renewcommand{\@bibliosection}[1]{#1{\aname{bib:chap\thechap@included}{##1}}}% \let\maketocbibitem\@sectionbib@maketocbibitem} \DeclareOption{sectionbib}{\sectionbib{\section*}{section}}% \DeclareOption{draft}{}% \DeclareOption{rootbib}{}% \DeclareOption{duplicate}{}% \DeclareOption{gather}{}% \ProcessOptions* hevea-2.30/parse_opts.mli0000644004317100512160000000241412017660721015441 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) type input = File of string | Prog of string type symbol_mode = SText | Symbol | Entity val symbol_mode : symbol_mode ref type destination = Html | Text | Info val destination : destination ref val moreentities : bool ref val mathml : bool ref val pedantic : bool ref val fixpoint : bool ref val optimize : bool ref val width : int ref val except : string list ref val path : string list ref val small_length : int ref val filter : bool val styles : input list val base_in : string val name_in : string val base_out : string val name_out : string hevea-2.30/contents_motif.gif0000644004317100512160000000047406537544364016323 0ustar marangetcristalGIF89añp€ÿÿ!þ" Imported from XPM image: toc.xpm!ù,@çÜ6313Æc „BÃ0 Ã0‚ A0 Ã0 Ã0 €Á0 ƒÁ`0€@`0 ƒÁ`  ƒÁ`0€@`0 ƒÁ`0€@`0000000000 0000000000 00000000 000000 0000 000000000 00000000000 00000000000000`À€ ;hevea-2.30/lexstyle.mll0000644004317100512160000001071113107043103015123 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* Extract/abstract style attributes *) { open Printf open Emisc let error msg _lb = raise (Emisc.LexError msg) } let blank = [' ''\t''\n''\r'] let tag = ['a'-'z''A'-'Z''0'-'9']+ let class_name = ['a'-'z''A'-'Z''0'-'9''-']+ let attr_name = ['a'-'z''A'-'Z''0'-'9']['a'-'z''A'-'Z''-''0'-'9'':']* rule extract styles = parse (* TOC comments are scanned *) | "" '\n'? { } | _ {skip_comment lexbuf} | eof {error "End of file in comment" lexbuf} | "" { error "comment" lexbuf } and dump m out = parse | "' '\n'? as lxm { fprintf out "%s" lxm ; Emisc.StringMap.iter (fun st cl -> Emisc.dump_class out cl st) m ; dump m out lexbuf } | "" '\n'? as lxm { output_string out lxm } | _ as c { output_char out c ; dump_comment out lexbuf } | eof {error "End of file in comment" lexbuf} | "" { error "dump_comment" lexbuf } and dump_tag out = parse | [^'>']* '>' as lxm { output_string out lxm } | "" { error "dump_tag" lexbuf } and abstract_tag cl attrs m out = parse | '>' { let cl = match cl with | [] -> [] | _ -> [sprintf "class=\"%s\"" (String.concat " " (List.rev cl))] in let na = cl @ List.rev attrs in List.iter (fprintf out " %s") na ; output_char out '>' } | blank+ { abstract_tag cl attrs m out lexbuf } | ("style"|"STYLE") blank* "=" blank* (('\'' ([^'\'']* as v) '\'' | '"' ([^'"']* as v) '"' | ('#'?['a'-'z''A'-'Z''0'-'9''-''+''_'':''.']+ as v))) as a (* '"' *) { try let tcl = Emisc.StringMap.find v m in abstract_tag (tcl::cl) attrs m out lexbuf with Not_found -> abstract_tag cl (a::attrs) m out lexbuf } | ("class"|"CLASS") blank* "=" blank* (('\'' ([^'\'']* as v) '\'' | '"' ([^'"']* as v) '"' | ('#'?['a'-'z''A'-'Z''0'-'9''-''+''_'':''.']+ as v))) (* '"' *) { abstract_tag (v::cl) attrs m out lexbuf } | attr_name ( blank* "=" blank* ('\'' ([^'\'']*) '\'' | '"' ([^'"']*) '"' | '#'?['a'-'z''A'-'Z''0'-'9''-''+''_'':''.']+))? as a (* '"' *) { abstract_tag cl (a::attrs) m out lexbuf } | "" { error "abstract_tag" lexbuf } { let get lexbuf = extract StringCount.empty lexbuf let set m out lexbuf = dump m out lexbuf } hevea-2.30/explode.mli0000644004317100512160000000156207304505330014722 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: explode.mli,v 1.4 2001-05-28 17:28:55 maranget Exp $ *) (***********************************************************************) val trees : Lexeme.style Tree.t list -> Htmltext.style Tree.t list hevea-2.30/handle402.sh0000644004317100512160000000034013106613665014575 0ustar marangetcristalDIR=$(dirname $0) if [ ! -z "$CHECK" ] then if [ $(ocaml $DIR/check402.ml) = ok ]; then rm -f $DIR/bytes.ml $DIR/bytes.mli else cp $DIR/bytes.mlp $DIR/bytes.ml cp $DIR/bytes.mlip $DIR/bytes.mli fi fi hevea-2.30/hot.mli0000644004317100512160000000156307303451221014053 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: hot.mli,v 1.3 2001-05-25 12:37:23 maranget Exp $ *) (***********************************************************************) type saved val checkpoint : unit -> saved val start : saved -> unit hevea-2.30/text/0000755004317100512160000000000013136046052013540 5ustar marangetcristalhevea-2.30/text/natbib.hva0000644004317100512160000000040410634524554015505 0ustar marangetcristal\ProvidesPackage{natbib} \input{natbib-common.hva} \renewcommand{\@biblabel}[1] {\NAT@bibread{#1}\purple\NAT@format@item{#1}{\NAT@num}{\NAT@auth}{\NAT@year}} \renewcommand{\@bibref}[3] {{\def\@tmp{#2}\ifx\@tmp\@empty{}???\else\NAT@format@cite{#2}{#3}{#1}\fi}} hevea-2.30/text/hevea.hva0000644004317100512160000001566412243337406015350 0ustar marangetcristal%%% Une précaution. \ifhtml\hva@warn{text/hevea is for text and info mode !!!}\endinput\fi %%%% package used by all packages \input{plain.hva} \newif\ififthen\ifthenfalse \input{ifthen.hva} %% Style sheet information is ignored \newcommand{\newstyle}[2]{} \newcommand{\@getstylecolor}[1]{} \newcommand{\class@attr}[2]{} \newcommand{\setenvclass}[2]{} \newcommand{\getenvclass}[1]{} \newcommand{\envclass@attr}[2][]{} \newcommand{\loadcssfile}[1]{} %% Packages \input{packages.hva} %%%%%% Spacing \input{spaces.hva} \renewcommand{\ }{ } %% \input{latexcommon.hva} \input{iso-text.hva} %%% Special characters %%% Logos \def\TeX{\@print{TeX}} \def\LaTeX{\@print{LaTeX}} \def\LaTeXe{\@print{LaTeX2e}} \newcommand{\hevea}{\@print{HeVeA}} \newcommand{\hacha}{\@print{HaChA}} \newcommand{\html}{\@print{HTML}} %%% HTML related stuff (TEX equivalents are in the hevea.sty file) \newcommand{\@aelement}[2]{#2} \newcommand{\@footahref}[2]{#2\footnote{#1}} \newcommand{\ahref}[2]{\@footahref{#1}{#2}} \let\footahref\ahref \newcommand{\ahrefurl}[1]{\texttt{#1}} \newcommand{\mailto}[1]{{#1}} \newcommand{\imgsrc}[2][]{\hva@warn{Image in text}*#2*} \newcommand{\anchor}[1]{} %% Hyper-text references inside the document: \newcommand{\@openlocref}[1]{} \newcommand{\@closelocref}[1]{} \newcommand{\@locref}[2]{{#2}} \newcommand{\@locname}[2]{{#2}} \newcommand{\@locnameref}[3]{{#3}} %%% Two exported commands \let\ahrefloc\@locref \let\aname\@locname %%% footer and header, useful ??? \newsavebox{\@htmlhead} \newsavebox{\@htmlfoot} \newcommand{\htmlhead}[1]{\sbox{\@htmlhead}{#1}} \newcommand{\htmlfoot}[1]{\sbox{\@htmlfoot}{#1}} %%%%%%%%%%% Footnotes text dependant part \newcommand{\@open@footnotetext}{} \newcommand{\@close@footnotetext}{} \newcommand{\@noteref}[4]{#4} \newcommand{\@notepointer}[3]{#3} \newcommand{\@notetextstyle}[1]{~(#1)} \newcommand{\@notenotestyle}[1]{(#1)} \newcommand{\footnoterule}{\@hr[align=left]{.5\textwidth}{1pt}} \newenvironment{thefootnotes}[2][] {\footnoterule\begin{list}{}{\renewcommand{\makelabel}[1]{##1}}} {\end{list}} %%% Captions \newenvironment{hva@capted} {\begin{center}\begin{flushleft}} {\end{flushleft}\end{center}} %%% Neutral definitions for hacha \newcounter{cuttingdepth} \setcounter{cuttingdepth}{1} \newcommand{\cutdef}[2][]{} \newcommand{\cutend}{} \newcommand{\cuthere}[2]{\footnoteflush{#1}} \newcommand{\@secbegin}{} \newcommand{\@secend}{} \newcommand{\@secanchor}{} \newenvironment{cutflow}[1]{}{} \newcommand{\cutname}[1]{} \newcommand{\toplinks}[3]{} \newcommand{\setlinkstext}[3]{} %%%%%%%%%%%%% % Maketitle % %%%%%%%%%%%%% \newcommand{\title@tohaux}[1]{} \newcommand{\maketitle}{% \bgroup \newcommand{\checkcmd}[2] {\@ifundefined{@##1} {\hva@warn{No ##1 given}} {\usebox{\csname @##1\endcsname}##2}}% \@open{align}{center}% \@open{head}{*}% \usebox{\@title}\\% \@close{head}% \@open{head}{=}%H3 \checkcmd{author}{\par}% \checkcmd{date}{}% \@close{head}% \@close{align}% \egroup% \global\let\maketitle\relax} %%%%%%%%%%%% Bibliography \newcommand{\@bibref}[3]{#2\@bib@post{#3}} \newcommand{\@biblabel}[1]{[\@bibread{\bibtaghook{#1}}]} %%%%%%%%%%%%%%%%%%%%%%%% % Document environment % %%%%%%%%%%%%%%%%%%%%%%%% \newenvironment{document}{% \@end{document} \@restartoutput\unskip% \@atbegindocument% \cutdef[\thecuttingdepth]{\cuttingunit}% }{% \@atenddocument\@final@footer\@footnoteflush{document}\@raise@enddocument} \newenvironment{center}{\@open{align}{center}}{\@close{align}} \newenvironment{flushleft}{\@open{align}{left}}{\@close{align}} \newenvironment{flushright}{\@open{align}{right}}{\@close{align}} \newcommand{\centerline}[1]{\begin{center}#1\end{center}} \newenvironment{quote}{\@open{quote}{}}{\@close{quote}} \newenvironment{quotation}{\@open{quotation}{}}{\@close{quotation}} \newcommand{\centering}{\@insert{align}{center}} \newcommand{\raggedleft}{\@insert{align}{right}} \newcommand{\raggedright}{\@insert{align}{left}} %%%%%%%%%%% Figures %For figure & tables \newcommand{\@open@quote}[1]{\@open{quote}{}} \newcommand{\@close@quote}{\@close{quote}} \newcommand{\rule}[3][]{\@printHR{left}{100}\@print{ }}% %%%%%%%%%%%%%%%% LaTeX 2.09 style declarations \newenvironment{tt}{\@style{tt}}{} \newenvironment{bf}{\@style{b}}{} \newenvironment{em}{\@style{em}}{} \newenvironment{it}{\@style{i}}{} \newenvironment{rm}{\@anti{\sf,\tt}}{} \newenvironment{tiny}{\@fontsize{1}}{} \newenvironment{footnotesize}{\@fontsize{2}}{} \newenvironment{scriptsize}{\@fontsize{2}}{} \newenvironment{small}{\@fontsize{3}}{} \newenvironment{normalsize}{\@fontsize{3}}{} \newenvironment{large}{\@fontsize{4}}{} \newenvironment{Large}{\@fontsize{5}}{} \newenvironment{LARGE}{\@fontsize{5}}{} \newenvironment{huge}{\@fontsize{6}}{} \newenvironment{Huge}{\@fontsize{7}}{} \newenvironment{purple}{\@fontcolor{purple}}{} \newenvironment{silver}{\@fontcolor{silver}}{} \newenvironment{gray}{\@fontcolor{gray}}{} \newenvironment{white}{\@fontcolor{white}}{} \newenvironment{maroon}{\@fontcolor{maroon}}{} \newenvironment{red}{\@fontcolor{red}}{} \newenvironment{fuchsia}{\@fontcolor{fuchsia}}{} \newenvironment{green}{\@fontcolor{green}}{} \newenvironment{lime}{\@fontcolor{lime}}{} \newenvironment{olive}{\@fontcolor{olive}}{} \newenvironment{yellow}{\@fontcolor{yellow}}{} \newenvironment{navy}{\@fontcolor{navy}}{} \newenvironment{blue}{\@fontcolor{blue}}{} \newenvironment{teal}{\@fontcolor{teal}}{} \newenvironment{aqua}{\@fontcolor{aqua}}{} \def\cal{\red} \def\sf{\purple} \def\sc{\navy} \def\sl{\it\maroon} %%%% LaTeX2e verbose declarations \newenvironment{mdseries}{\@anti{\bf}}{} \newenvironment{bfseries}{\bf}{} \newenvironment{rmfamily}{\rm}{} \newenvironment{sffamily}{\@anti{\tt}\sf}{} \newenvironment{ttfamily}{\@anti{\sf}\tt}{} \newenvironment{upshape}{\@anti{\it,\sl,\sc}}{} \newenvironment{itshape}{\@anti{\sl,\sc}\it}{} \newenvironment{slshape}{\@anti{\it,\sc}\sl}{} \newenvironment{scshape}{\@anti{\it,\sl}\sc}{} \newenvironment{normalfont}{\rm\mdseries\upshape}{} %%%%%%%%%%%%%%%% \def\textrm#1{\mbox{\rmfamily#1}} \def\textup#1{\mbox{\upshape#1}} \def\textmd#1{\mbox{\mdseries#1}} \def\textnormal#1{\mbox{\normalfont#1}} \def\texttt#1{\mbox{\ttfamily#1}} \def\textit#1{\mbox{\itshape#1}} \def\textbf#1{\mbox{\bfseries#1}} \def\textsf#1{\mbox{\sffamily#1}} \def\textsl#1{\mbox{\slshape#1}} \def\textsc#1{\mbox{\scshape#1}} \newcommand{\emph}[1]{\mbox{\em#1}} %%%%%%%%% Index formating \newenvironment{indexenv}{\begin{itemize}}{\end{itemize}} \newcommand{\indexitem}{\item} \newcommand{\indexspace}{\vspace*{1em}} %%%%%%%%concrete minipage \setenvclass{minipage}{minipage} \newenvironment{@minipage}{}{} %%%%%% format theorems \let\th@font\em \newcommand{\set@th}[1] {\global\let\csname#1@font\endcsname\th@font} \newenvironment{th@env}[3] {\begin{flushleft}% \refstepcounter{#2}\textbf{#3~\csname{}the#2\endcsname}% \def\th@tmp{#1}\th@kont} {\end{flushleft}} \newcommand{\th@kont}[1][] {\ifoptarg~\textbf{(#1)}\fi\quad\csname\th@tmp{}@font\endcsname} %%%%%%%%%% No attributes for arrays and tabular \newcommand{\@table@attributes}{} \newcommand{\@table@attributes@border}{} %% Over \def\csname hevea@loaded\endcsname{} hevea-2.30/text/fancysection.hva0000644004317100512160000000002207041415265016723 0ustar marangetcristal\usepackage{color}hevea-2.30/text/article.hva0000644004317100512160000000151712017660721015671 0ustar marangetcristal\ifstyleloaded\relax \else \input{articlecommon.hva} \newcommand{\@forcenewline}{\\{}~\\{}} \@makesection {\part}{-1}{part} {\@forcenewline\@open{align}{center}\@open{head}{*}} {\partname:~\thepart}{\\} {\@close{head}\@close{align}} \@makesection {\section}{0}{section} {\@forcenewline\@open{head}{*=}} {\thesection}{\quad} {\@forcenewline\@close{head}} \@makesection {\subsection}{1}{subsection} {\@forcenewline\@open{head}{=}} {\thesubsection}{\quad} {\@close{head}} \@makesection {\subsubsection}{2}{subsubsection} {\@forcenewline\@open{head}{-}}{\thesubsubsection}{\quad}{\@close{head}} \@makesection {\paragraph}{3}{paragraph} {\@open{head}{}}{\theparagraph}{\quad}{\@close{head}} \@makesection {\subparagraph}{4}{subparagraph} {\@open{head}{}}{\thesubparagraph}{\quad}{\@close{head}} \styleloadedtrue \fi hevea-2.30/text/colortbl.hva0000644004317100512160000000015207356331741016067 0ustar marangetcristal\usepackage{color} \def\columncolor {\execafter\@skipopt\execafter\@skipopt\execafter\@skiparg\@skipopt}hevea-2.30/text/french.hva0000644004317100512160000000004610556103572015511 0ustar marangetcristal\input{\@hevealibdir/html/french.hva} hevea-2.30/text/book.hva0000644004317100512160000000170712017660721015201 0ustar marangetcristal\ifstyleloaded \else \input{bookcommon.hva} \newcommand{\@forcenewline}{\\{}~\\{}} \@makesection {\part}{-2}{part} {\@forcenewline\@open{align}{center}\@open{head}{*}} {\partname:~\thepart}{\\} {\@close{head}\@close{align}} \@makesection {\chapter}{-1}{chapter} {\@forcenewline\@open{head}{*}} {\chaptername~\thechapter}{\qquad} {\@close{head}} \@makesection {\section}{0}{section} {\@forcenewline\@open{head}{*=}} {\thesection}{\quad} {\@forcenewline\@close{head}} \@makesection {\subsection}{1}{subsection} {\@forcenewline\@open{head}{=}} {\thesubsection}{\quad} {\@close{head}} \@makesection {\subsubsection}{2}{subsubsection} {\@forcenewline\@open{head}{-}}{\thesubsubsection}{\quad}{\@close{head}} \@makesection {\paragraph}{3}{paragraph} {\@open{head}{}}{\theparagraph}{\quad}{\@close{head}} \@makesection {\subparagraph}{4}{subparagraph} {\@open{head}{}}{\thesubparagraph}{\quad}{\@close{head}} \styleloadedtrue \fi hevea-2.30/text/seminar.hva0000644004317100512160000000213406736142076015711 0ustar marangetcristal\ifstyleloaded\relax \else %%%% Landscape and portrait \iffrench \newcommand{\slidename}{Planche~:} \else \newcommand{\slidename}{Slide:} \fi \newcounter{slide} \newenvironment{slide}[1][]{% \stepcounter{slide}% \cuthere{section}{\slidename{} \theslide}% \@printHR{}{100}% \@open{ALIGN}{RIGHT}% \@open{HEAD}{*=}\slidename{} \theslide\@close{HEAD}%H2 \@close{ALIGN} \@printHR{}{100}% }{} \newenvironment{slide*}[1][]{\begin{slide}}{\end{slide}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% All seminar-specific commandes are null macros %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\landscapeonly}{} \newcommand{\portraitonly}{} \newcommand{\twoup}{} %% Margins \newif\ifcenterslides \newcommand{\raggedslides}[1][]{} %% Page breaking \newcommand{\extraslideheight}[1]{} \newcommand{\newslide}{} \newcommand{\slidefuzz}{} %% Magnification \newcommand{\slidemag}[1]{} \newcommand{\semin}{in} \newcommand{\semcm}{cm} \newcommand{\ptsize}[1]{} %% FRAMES \newcommand{\slideframe}[2][]{} \newcommand{\newslideframe}[1]{\slideframe} %%%% load the article style file \input{article.hva} \fihevea-2.30/text/austrian.hva0000644004317100512160000000016610155357666016107 0ustar marangetcristal\@ifundefined{common@austrian@babel}{\input{german-common.hva}}{} \newcommand{\austrian@babel}{\common@austrian@babel}hevea-2.30/text/color.hva0000644004317100512160000000031007043406614015354 0ustar marangetcristal\newcommand{\definecolor}[3]{} \newcommand{\DefineNamedColor}[4]{} \newcommand{\@getcolor}[2][]{} \newcommand{\color}[2][!*!]{} \newcommand{\textcolor}[3][!*!]{{#3}} \newenvironment{bgcolor}[2][]{}{} hevea-2.30/text/german.hva0000644004317100512160000000015610155357666015531 0ustar marangetcristal\@ifundefined{common@german@babel}{\input{german-common.hva}} \newcommand{\german@babel}{\common@german@babel}hevea-2.30/text/report.hva0000644004317100512160000000002006714547664015566 0ustar marangetcristal\input{book.hva}hevea-2.30/doOut.ml0000644004317100512160000002201612403604646014206 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Printf let verbose = ref 0 module type Config = sig val small_length : int end module type S = sig type t val create_buff : unit -> t val create_chan : out_channel -> t val create_null : unit -> t val is_null : t -> bool val is_empty : t -> bool val reset : t -> unit val put : t -> string -> unit val blit : t -> Lexing.lexbuf -> unit val put_char : t -> char -> unit val flush : t -> unit val get_pos : t -> int val erase_start : int -> t -> unit val iter : (char -> unit) -> t -> unit val iter_next : (char -> (unit -> int) -> unit) -> t -> unit val to_string : t -> string val to_list : t -> string list val to_chan : out_channel -> t -> unit val copy : t -> t -> unit val copy_fun : (string -> string) -> t -> t -> unit val copy_no_tag : t -> t -> unit val close : t -> unit val debug : out_channel -> t -> unit val unskip : t -> unit end module Make(C:Config) = struct module S = SimpleRope.Make(C) (***************************************************) (* Rope with a front buffer of size C.small_length *) (***************************************************) let max_sz = C.small_length type buff = { mutable b : Bytes.t ; mutable p : int ; mutable sz : int ; mutable r : S.t; } let start_sz = min 16 max_sz let alloc_buff () = { b = Bytes.create start_sz ; p = 0 ; sz=start_sz; r = S.empty ; } let dump_buff chan b = S.output chan b.r ; output chan b.b 0 b.p let reset_buff b = b.p <- 0 ; b.r <- S.empty let length_buff b = b.p + S.length b.r let to_string_buff b = let r = Bytes.create (length_buff b) in S.blit b.r r 0 ; Bytes.unsafe_blit b.b 0 r (S.length b.r) b.p ; Bytes.unsafe_to_string r let do_flush_buff b = let s = Bytes.create b.p in Bytes.unsafe_blit b.b 0 s 0 b.p ; b.r <- S.append_string b.r (Bytes.unsafe_to_string s) ; b.p <- 0 let flush_buff b = if b.p > 0 then do_flush_buff b let realloc b = let nsz = 2 * b.sz in let nbuff = Bytes.create nsz in Bytes.unsafe_blit b.b 0 nbuff 0 b.p ; b.b <- nbuff ; b.sz <- nsz let rec vput_buff b s pos len = if b.p + len < b.sz then begin Bytes.blit_string s pos b.b b.p len ; b.p <- b.p + len end else if b.sz < max_sz then begin realloc b ; vput_buff b s pos len end else if b.p = 0 then let bsz = Bytes.create b.sz in Bytes.blit_string s pos bsz 0 b.sz ; b.r <- S.append_string b.r (Bytes.unsafe_to_string bsz) ; vput_buff b s (pos+b.sz) (len-b.sz) else begin let tr = b.sz-b.p in String.unsafe_blit s pos b.b b.p tr ; b.p <- b.p+tr ; do_flush_buff b ; vput_buff b s (pos+tr) (len-tr) end let put_buff b s pos len = if !verbose > 2 then eprintf "PUT '%s'-> '%a'\n%a\n" (String.sub s pos len) dump_buff b S.debug b.r ; vput_buff b s pos len ; if !verbose > 2 then eprintf "PUT OVER '%s'-> '%a'\n%a\n" (String.sub s pos len) dump_buff b S.debug b.r ; () let put_bytes b s pos len = put_buff b (Bytes.unsafe_to_string s) pos len let put_buff_char b c = if b.p >= b.sz then begin if b.sz < max_sz then realloc b else do_flush_buff b end ; Bytes.unsafe_set b.b b.p c ; b.p <- b.p + 1 let get_buff b k = let len = S.length b.r in if k < len then S.get b.r k else Bytes.unsafe_get b.b (k-len) (* Append src at the end of dst *) let copy_buff src dst = flush_buff dst ; dst.r <- S.append dst.r src.r ; put_bytes dst src.b 0 src.p (*******************) type t = | Rope of buff | Chan of out_channel | Null let debug chan = function | Rope out -> output_char chan '*'; dump_buff chan out ; output_char chan '*'; () | Chan _ -> output_string chan "*CHAN*" | Null -> output_string chan "*NULL*" let pp_type = function | Rope _out -> "*Rope*" | Chan _ -> "*CHAN*" | Null -> "*NULL*" let create_buff () = Rope (alloc_buff ()) let create_chan chan = Chan chan let create_null () = Null let is_null = ( = ) Null and is_empty = function | Rope b -> b.p = 0 && S.length b.r = 0 | _ -> false let reset = function | Rope b -> b.p <- 0 ; b.r <- S.empty | _ -> raise (Misc.fatal "Out.reset") let get_pos = function | Rope b -> length_buff b | _ -> 0 let erase_start n = function | Rope b -> flush_buff b ; b.r <- S.sub b.r n (S.length b.r - n) | _ -> raise (Misc.fatal "Out.erase_start") let put out s = match out with | Null -> () | Chan chan -> output_string chan s | Rope b -> put_buff b s 0 (String.length s) (* To be used only in a lexer action *) let blit out lexbuf = let open Lexing in match out with | Rope b -> let len = lexbuf.lex_curr_pos - lexbuf.lex_start_pos in put_bytes b lexbuf.lex_buffer lexbuf.lex_start_pos len | Chan chan -> let len = lexbuf.lex_curr_pos - lexbuf.lex_start_pos in output chan lexbuf.lex_buffer lexbuf.lex_start_pos len | Null -> () let put_char out c = match out with | Null -> () | Chan chan -> output_char chan c | Rope b -> put_buff_char b c let flush = function | Chan chan -> flush chan | _ -> () let iter f = function | Null -> () | Chan _ -> raise (Misc.fatal "Out.iter") | Rope b -> S.iter f b.r ; let bb = b.b in for k = 0 to b.p-1 do f (Bytes.unsafe_get bb k) done ; () let iter_next f = function | Null -> () | Chan _ -> raise (Misc.fatal "Out.iter_next") | Rope b -> let rec do_rec next = let c = next () in if c <> -1 then begin f (Char.chr c) next; do_rec next end in do_rec (let k = ref 0 in fun () -> let i = !k in if i >= length_buff b then -1 else begin incr k; Char.code (get_buff b i) end) let to_string = function | Rope b -> let s = to_string_buff b in reset_buff b ; s | Null -> "" | _ -> raise (Misc.fatal "Out.to_string") let to_list = function | Rope b -> let xs = if b.p > 0 then [Bytes.sub_string b.b 0 b.p] else [] in let xs = S.to_list_append b.r xs in if !verbose > 2 then begin match xs with | []|[_] -> () | _ -> eprintf "to_list: %s\n%!" (String.concat " " (List.map (fun s -> sprintf "\"%s\"" (String.escaped s)) xs)) end ; reset_buff b ; xs | Null -> [] | _ -> raise (Misc.fatal "Out.to_list") let to_chan chan = function | Rope b -> dump_buff chan b ; reset_buff b | Null -> () | b -> raise (Misc.fatal (sprintf "Out.to_chan: %s" (pp_type b))) let hidden_copy from_rope to_buff = match to_buff with | Null -> () | Rope b -> copy_buff from_rope b | Chan chan -> dump_buff chan from_rope let copy from_buff to_buff = match from_buff with | Rope b -> hidden_copy b to_buff | _ -> raise (Misc.fatal "Out.copy") let copy_fun f from_buff to_buff = match from_buff with | Rope b -> put to_buff (f (to_string_buff b)) | _ -> raise (Misc.fatal "Out.copy_fun") let copy_no_tag from_buff to_buff = if !verbose > 2 then begin prerr_string "copy no tag from buff"; debug stderr from_buff; prerr_newline (); end; match from_buff with | Rope src -> begin flush_buff src ; try let i = S.index src.r '>' in let j = if is_empty from_buff then i + 1 else S.rindex src.r '<' in src.r <- S.sub src.r (i+1) (j-i-1) ; hidden_copy src to_buff ; if !verbose > 2 then begin prerr_string "copy no tag to_buff"; debug stderr to_buff; prerr_newline () end with Not_found -> raise (Misc.fatal "Out.copy_no_tag, no tag found") end | _ -> raise (Misc.fatal "Out.copy_no_tag") let close = function | Chan c -> close_out c | _ -> () let is_space c = match c with |' '|'\n'|'\r'|'\t' -> true | _ -> false let unskip = function | Rope b -> flush_buff b ; b.r <- S.erase b.r is_space | _ -> () end hevea-2.30/index.ml0000644004317100512160000002404612017660721014225 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) open Misc open Entry let missing_index tag = Misc.warning ("Index structure not found, missing "^ (match tag with | "default" -> "\\makeindex" | _ -> "\\newindex{"^tag^"}..")) ;; type entry_t = {key : key ; see : string option ; item : string} ;; type entry = | Good of entry_t | Bad let first_key = function | (x::_),_ -> x | _ -> raise (Misc.Fatal ("Empty key in first_key")) let pretty_key (l,p) = let rec p_rec l p = match l,p with [],[] -> "" | [x],[""]-> x | [x],[y]-> x^"@"^y | x::xs,""::ys -> x^"!"^p_rec xs ys | x::xs,y::ys -> x^"@"^y^"!"^p_rec xs ys | _,_ -> assert false in p_rec l p ;; type t_index = {mutable name : string ; mutable onebad : bool ; mutable counter : int ; sufin : string ; sufout : string ; from_file : entry array option ; from_doc : entry Table.t ; out : Out.t} let itable = Hashtbl.create 17 ;; let read_index_file name file = let lexbuf = Lexing.from_channel file in let r = Table.create Bad in let rec do_rec () = try let arg1,arg2 = read_indexentry lexbuf in let entry = try let k,see = read_key (MyLexing.from_string arg1) in Good {key=k ; see=see ; item = arg2} with Entry.NoGood -> Misc.warning ("Bad index arg syntax in file: "^name^ ", index entry is '"^arg1^"'") ; Bad in Table.emit r entry ; do_rec () with | Entry.Fini -> Table.trim r in let r = do_rec () in if !verbose > 0 then prerr_endline ("Index file: "^name^" succesfully read"); Some r let find_index tag = Hashtbl.find itable tag let changename tag name = try let idx = find_index tag in idx.name <- name with Not_found -> missing_index tag let index_lbl tag i = "hevea_"^tag^string_of_int i let index_filename suff = Parse_opts.base_out^".h"^suff let do_treat tag arg refvalue anchor = (* prerr_endline ("Index treat: "^tag^", "^arg^", "^refvalue) ; *) try if !verbose > 2 then prerr_endline ("Index.treat with arg: "^arg) ; let {from_doc = from_doc ; out = out} as idx = find_index tag in let lbl = match anchor with | Some lbl -> lbl | None -> index_lbl tag idx.counter in let refvalue = match refvalue with "" -> "??" | s -> s in let item = "\\@locref{"^lbl^"}{"^refvalue^"}" in Out.put out "\\indexentry{" ; Out.put out arg ; Out.put out "}{" ; Out.put out item ; Out.put out "}\n" ; let lexbuf = MyLexing.from_string arg in let entry = try let key,see = read_key lexbuf in Good {key = key ; see = see ; item = item} with | Entry.NoGood -> idx.onebad <- true ; Misc.warning ("Bad index syntax: '"^arg^"'") ; Bad in Table.emit from_doc entry ; idx.counter <- idx.counter + 1 ; lbl with | Not_found -> missing_index tag ; "" ;; let treat tag arg refvalue = do_treat tag arg refvalue None and treat_anchor tag arg refvalue lbl = ignore (do_treat tag arg refvalue (Some lbl)) (* Compare function for keys *) let is_alpha c = ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') let compare_char c1 c2 = if is_alpha c1 && is_alpha c2 then let r = compare (Char.uppercase c1) (Char.uppercase c2) in if r <> 0 then r else compare c1 c2 else if is_alpha c1 then 1 else if is_alpha c2 then -1 else compare c1 c2 exception Result of int let compare_string s1 s2 = let i = ref 0 and l1 = String.length s1 and l2 = String.length s2 in begin try while true do begin if !i >= l1 then if !i >= l2 then raise (Result 0) else raise (Result (-1)) else if !i >= l2 then raise (Result 1) else let c = compare_char s1.[!i] s2.[!i] in if c <> 0 then raise (Result c) end ; i := !i + 1 done ; 0 with Result x -> x end let comp (l1,p1) (l2,p2) = let rec c_rec l1 l2 p1 p2 = match l1,l2 with | [],[] -> 0 | [],_ -> -1 | _,[] -> 1 | x1::r1,x2::r2 -> let t = compare_string x1 x2 in if t<> 0 then t else begin match p1,p2 with | y1::p1, y2::p2 -> let t = compare_string y1 y2 in if t <> 0 then t else c_rec r1 r2 p1 p2 | _,_ -> assert false end in c_rec l1 l2 p1 p2 ;; module OrderedKey = struct type t = key let compare = comp end ;; module KeySet = Set.Make(OrderedKey) ;; let rec common e1 e2 = match e1,e2 with ([],_),_ -> e1,e2 | _,([],_) -> e1,e2 | ([_],_),([_],_) -> e1,e2 | (_::_,_),([_],_) -> e1,e2 | (x1::r1,_::p1),(x2::r2,_::p2) -> if x1=x2 then common (r1,p1) (r2,p2) else e1,e2 | _ -> assert false ;; let rec close_prev out = function [],_ | [_],_ -> () | _::r,_::p -> Out.put out "\\end{indexenv}\n" ; close_prev out (r,p) | _ -> assert false ;; let rec open_this out k = match k with [],_ -> () | k::r,p::rp -> Out.put out "\\indexitem " ; let tag = if p <> "" then p else k in Out.put out tag ; begin match r with [] -> () | _ -> Out.put out "\\begin{indexenv}\n" ; end ; open_this out (r,rp) | _ -> assert false ;; let start_change s1 s2 = match s1,s2 with | "",_ -> false | _,"" -> false | _,_ -> Char.uppercase s1.[0] <> Char.uppercase s2.[0] let print_entry out _ entries bk k xs = let rp,rt = common bk k in close_prev out rp ; if fst rp = [] then Out.put out "\\begin{indexenv}\n" else begin let top_prev = first_key bk and top_now = first_key k in if start_change top_prev top_now then Out.put out "\\indexspace\n" end ; open_this out rt ; let rec prints = function [] -> Out.put_char out '\n' | i::r -> Out.put out ", " ; begin match entries.(i) with | Good e -> begin match e.see with | None -> Out.put out e.item | Some see -> Out.put out ("\\"^see^"{"^e.item^"}") end ; | Bad -> () end ; prints r in prints (List.rev xs) ;; let make_index t = let table = Hashtbl.create 17 and all = ref KeySet.empty in for i = 0 to Array.length t - 1 do match t.(i) with | Good e -> all := KeySet.add e.key !all ; Hashtbl.add table e.key i | Bad -> () done ; !all,table let output_index tag entries out = if !verbose > 1 then prerr_endline ("Print index ``"^tag^"''") ; let all_keys,table = make_index entries in let prev = ref ([],[]) in KeySet.iter (fun k -> if !verbose > 2 then prerr_endline ("Print_entry: "^pretty_key k); print_entry out tag entries !prev k (Hashtbl.find_all table k) ; prev := k) all_keys ; let pk,_ = !prev in List.iter (fun _ -> Out.put out "\\end{indexenv}\n") pk let create_hind t tag sufout = let outname = index_filename sufout in try let chan = open_out outname in output_index tag t (Out.create_chan chan) ; close_out chan with | Sys_error s -> Misc.warning ("File error for "^outname^": "^s) let newindex tag sufin sufout name = (* prerr_endline ("New index: "^tag) ; *) Hashtbl.remove itable tag ; let from_file = try let filename = index_filename sufin in let file = open_in filename in read_index_file filename file with Sys_error _ -> None in begin match from_file with | None -> () | Some t -> create_hind t tag sufout end ; Hashtbl.add itable tag {name = name ; onebad = false ; counter = 0 ; sufin = sufin ; sufout = sufout ; from_file = from_file ; from_doc = Table.create Bad ; out = Out.create_buff ()} let print main tag = try let idx = find_index tag in main ("\\@indexsection{"^idx.name^"}") ; let indname = index_filename idx.sufout in begin match idx.from_file with | None -> create_hind (Table.trim idx.from_doc) tag idx.sufout | _ -> () end ; main ("\\input{"^indname^"}") with | Not_found -> missing_index tag let diff_entries e1 e2 = let l1 = Array.length e1 and l2 = Array.length e2 in if l1 <> l2 then true else let rec diff_rec i = if i >= l1 then false else e1.(i) <> e2.(i) || diff_rec (i+1) in diff_rec 0 let do_dump_index idxname idx = try let chan = open_out idxname in Out.to_chan chan idx.out ; close_out chan with | Sys_error s -> Misc.warning ("File error on "^idxname^": "^s) let finalize check = if check then begin let top_changed = ref false in Hashtbl.iter (fun _ idx -> let entries = Table.trim idx.from_doc in let changed = match idx.from_file with | Some t -> diff_entries t entries | None -> Array.length entries <> 0 in let idxname = index_filename idx.sufin in if changed || idx.onebad then begin top_changed := !top_changed || changed ; try if Array.length entries = 0 && not idx.onebad then Mysys.remove idxname else begin do_dump_index idxname idx end with | Sys_error s -> Misc.warning ("File error on "^idxname^": "^s) end else if !Misc.dump_index then begin do_dump_index idxname idx end) itable ; if !top_changed then Misc.message "HeVeA Warning: Index(es) may have changed. Rerun me to get them right." ; !top_changed end else false hevea-2.30/plain.hva0000644004317100512160000000171512017660721014365 0ustar marangetcristal%%%%%%% Internal basic commands for package b\newcommand{\relax}{} \newcommand{\@empty}{} \newcommand{\@gooble}[1]{} \let\@gobble\@gooble %%%%%% Iter #1 on #3, a #2 separated list of non-empty elements \def\@iter #1#2#3{% %\hva@warn{\@iter '#1' '#2' '#3'}% \def\@test{#3}% \ifx\@test\@empty\else \def\@@iter##1#2{% %\hva@warn{\@@iter '##1'}% \def\@test{##1}% \ifx\@test\@empty \let\@next\relax\else #1{##1}% \let\@next\@@iter\fi \@next}% \@callsubst{\@@iter}{#3#2#2}\fi} %%%%%%%%%% eat leading spaces in argument \def\@eatspaces#1,{#1}% %%%%% \newcommand{\@Let}[2]{\ifu#2\else\let#1#2\fi} \newcommand{\IfDisplay}[2]{\ifdisplay#1\else#2\fi} \newcommand{\@non@kk}[2][]{} \newcommand{\@non@k}[1][]{\@non@kk} \newcommand{\NoCommand}[1]{\@non@k} %%%shortcuts for defining/using strange csname %%% \newcommand{\@namedef}[1]{\def\csname#1\endcsname} \newcommand{\@nameuse}[1]{\csname#1\endcsname} hevea-2.30/entry.mll0000644004317100512160000000465612017660721014440 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) { let buff = Out.create_buff () ;; let put s = Out.put buff s and put_char c = Out.put_char buff c ;; type res = | Bang of string * string | Bar of string * string | Eof of string * string ;; let extend r i = match r with | Bang (p,_) -> Bang (i,p) | Bar (p,_) -> Bar (i,p) | Eof (p,_) -> Eof (i,p) ;; type key = string list * string list exception Fini exception NoGood ;; } rule entry = parse | "\\\"" {put "\\\"" ; entry lexbuf} | '"' (_ as lxm) {put_char lxm ; entry lexbuf} | '!' {Bang (Out.to_string buff,"")} | '@' {let s = Out.to_string buff in let r = entry lexbuf in extend r s} | '|' {Bar (Out.to_string buff,"")} | eof {Eof (Out.to_string buff,"")} | _ as lxm {put_char lxm ; entry lexbuf} and idx = parse | "\\indexentry" {let key = Save.arg lexbuf in let value = Save.arg lexbuf in key,value} | eof {raise Fini} | _ {idx lexbuf} { let read_key lexbuf = let bar () = match entry lexbuf with | Eof (s,_) -> begin match s with | ""|"("|")" -> None | s -> if s.[0] = '(' then Some (String.sub s 1 (String.length s - 1)) else Some s end | _ -> raise NoGood in let rec get_rec () = match entry lexbuf with Bang (i,p) -> let l,see = get_rec () in (i,p)::l,see | Bar (i,p) -> let see = bar () in [i,p],see | Eof (i,p) -> [i,p],None in let separe (l,see) = let rec sep_rec = function [] -> [],[] | (x,y)::r -> if x="" then raise NoGood ; let xs,ys = sep_rec r in x::xs,y::ys in let xs,ys = sep_rec l in ((xs,ys),see) in separe (get_rec ()) let read_indexentry lexbuf = idx lexbuf } hevea-2.30/out.ml0000644004317100512160000000156312017660721013724 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Tibault Suzanne, Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) include DoOut.Make (struct let small_length = let x = !Parse_opts.small_length in if x <= 0 then 1 else x end) hevea-2.30/esp.mli0000644004317100512160000000172612323450432014052 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: esp.mli,v 1.1 2007-02-09 14:44:50 maranget Exp $ *) (***********************************************************************) exception Failed module type Config = sig val pess : bool val move : bool val small_length : int end module Make(C:Config) : sig val file : string -> unit end hevea-2.30/listings.hva0000644004317100512160000010035012017660721015111 0ustar marangetcristal\ProvidesPackage{listings} \RequirePackage{keyval} \@primitives{listings} %%%%%%%%%%% interface keyval \def\lst@define@key#1#2{\define@key{lst}{#1}{\@funcall{#2}{##1}}} \newenvironment{lst@protect} {\@clearstyle\def\%{\@print{\%}}% \def\#{\@print{\#}}% \def\${\@print{\$}}% \def\{{\@print{\{}}% \def\}{\@print{\}}}% \def\_{\@print{\_}}% \def\&{\@print{\&}}% \def\ref{\@print{\ref}}} {} \def\lst@define@key@opt#1#2#3{\define@key{lst}{#1}[#3] {\@callopt{#2}{\begin{lst@protect}##1\end{lst@protect}}}} \def\ignore@key#1{\define@key{lst}{#1}{}} %%%%%%%%%%% % Helpers % %%%%%%%%%%% \def\lstinfo#1{\typeout{LST, #1}} \def\lst@iter#1#2{%\hva@warn{\lst@iter '#1' '#2'}% \@iter#1,{#2}} %For getting rid of two (optional) levels of braces \def\lst@eat@again#1XXX#2{\@callsubst{#2}{#1\@empty\@empty\@empty\@empty\@empty}} \def\lst@eat@key#1XXX#2{\@callsubst{\lst@eat@again}{#1XXX#2}} %%%%%%%% Interface with keyval \def\lstset#1{\@setkeys{lst}{#1}} %%%%%%%% Def if not empty \newcommand{\lst@defne}[2]{\ifx#1\@empty\def#1{#2}\fi} %%%%%%%%%%%%% % Toks regs % %%%%%%%%%%%%% \newcommand{\lst@Empty}[1]{\let#1\@empty} %%%%%%%%%%%% % Hooks % %%%%%%%%%%%% \newcommand{\lst@Hook}[1] {\newtokens{\csname lsthk@#1\endcsname}} \newcommand{\lst@ResetHook}[1] {\resettokens{\csname lsthk@#1\endcsname}} \newcommand{\lst@UseHook}[1] {\csname lsthk@#1\endcsname} \newcommand{\lst@AddToHook}[2] {\addtokens{\csname lsthk@#1\endcsname}{#2}} \newcommand{\lst@AddToHookExe}[2] {\lst@AddToHook{#1}{#2}#2} \lst@Hook{EOL}\lst@Hook{InitVarEOL} \lst@Hook{InitVarBOL}\lst@Hook{EveryLine}\lst@Hook{LastLine} \lst@Hook{PreSet} \lst@Hook{InitVar} \lst@Hook{Init} \lst@Hook{DeInit} \lst@Hook{SelectCharTable} \lst@Hook{SetLanguage} \lst@Hook{AfterSetLanguage} \lst@AddToHook{SetLanguage}{\lst@ResetHook{AfterSetLanguage}} \lst@Hook{SetStyle} \def\lststy@{\lsthk@EmptyStyle} \lst@Hook{EmptyStyle} \lst@Hook{EmptyLanguage} \lst@Hook{InlineUnsave} %%Avoid explicit TT in listings, they are useless with style sheets \lst@AddToHook{Init}{\let\tt\@empty} %%%%%%%%%%%% % Keywords % %%%%%%%%%%%% \newtokens{\lst@delete@all@kwd@class}% \def\lst@record@kwd@class#1#2{% %\hva@warn{RECORD '#1' '#2'}% \ifu\csname lst@allkwd@#1\endcsname% \addtokens{\lst@delete@all@kwd@class}{\lst@delete@kwd@class{#1}}\fi% \providecommand{\csname lst@allkwd@#1\endcsname}{}% \lst@AddTo,{\csname lst@allkwd@#1\endcsname}{\lst@normalize{#2}}} \def\lst@delete@kwd@class#1{% %\hva@warn{DELETE '#1'}% \ifu\csname lst@allkwd@#1\endcsname\else \@callprim{\lst@delete@kwds}{\{\csname lst@allkwd@#1\endcsname\}}% \lst@Empty{\csname lst@allkwd@#1\endcsname}\fi} \newcommand{\lst@allotherkeywords}{} \def\lst@record@okwds#1{\lst@AddTo,{\lst@allotherkeywords}{\lst@normalize{#1}}} \newcommand{\lst@alldirectives}{} \def\lst@record@directives#1{\lst@AddTo,{\lst@alldirectives}{\lst@normalize{#1}}} \lst@AddToHook{SetLanguage} {\lst@delete@all@kwd@class% \@callprim{\lst@delete@okwds}{\{\@rawchars{\lst@allotherkeywords}\}}% \@callprim{\lst@delete@directives}{\{\lst@alldirectives\}}} \def\lst@install@kwd#1#2{% %\hva@warn{INSTALL: #2 -> #1}% \def\csname lstk@\lst@normalize{#2}\endcsname{#1}} \def\lst@install@kwds#1#2{% % \hva@warn{RESET: «#1»}% \lst@delete@kwd@class{#1}% \lst@record@kwd@class{#1}{#2}% \lst@iter{\lst@install@kwd{\csname lst@keywordstyle#1\endcsname}}{#2}} \def\lst@more@kwds#1#2{% % \hva@warn{MORE: «#1»}% \lst@record@kwd@class{#1}{#2}% \lst@iter{\lst@install@kwd{\csname lst@keywordstyle#1\endcsname}}{#2}} \def\lst@install@directive#1#2{\def\csname lstd@\lst@normalize{#2}\endcsname{#1}} \def\lst@install@directives #1#2{% \lst@directivestrue% \lst@record@directives{#2}% \lst@iter{\lst@install@directive{#1}}{#2}} \def\lst@install@okwds #1#2{% \lst@record@okwds{#2}% \lst@iter{\lst@install@kwd{#1}}{#2}} \def\lst@delete@kwd#1{% %\hva@warn{DELETE #1}% \def\csname lstk@\@rawchars{#1}\endcsname{\lst@identifierstyle}} \def\lst@delete@directive #1{\def\csname lstd@\@rawchars{#1}\endcsname{}} \def\lst@delete@okwds#1{\lst@iter{\lst@delete@okwd}{#1}} \def\lst@delete@kwds#1{%\hva@warn{\lst@delete@kwds '#1'}% \lst@iter{\lst@delete@kwd}{#1}} \def\lst@delete@directives#1{\lst@iter{\lst@delete@directive}{#1}} \def\lst@delete@okwd #1{\def\csname lstk@\@rawchars{#1}\endcsname{}} \def\lst@delay@install#1#2{\lst@AddToHook{AfterSetLanguage} {\lst@install@kwds{#1}{#2}}} \def\lst@delay@more#1#2{\lst@AddToHook{AfterSetLanguage} {\lst@more@kwds{#1}{#2}}} \def\lst@delay@delete#1#2{\lst@AddToHook{AfterSetLanguage}{\lst@delete@kwds{#2}}} \def\lst@keywords@key#1#2\@empty{\lst@install@kwds{#1}{#2}} \def\lst@morekeywords@key#1#2\@empty{\lst@more@kwds{#1}{#2}} \def\lst@deletekeywords@key#1#2\@empty{\lst@delete@kwds{#2}} \define@key{lst}{keywords}[]{\@callsubstopt{\lst@keywords@key}{1}{#1\@empty}} \define@key{lst}{morekeywords}[] {\@callsubstopt{\lst@morekeywords@key}{1}{#1\@empty}} \define@key{lst}{deletekeywords}[] {\@callsubstopt{\lst@deletekeywords@key}{1}{#1\@empty}} %%2nd \define@key{lst}{ndkeywords}[] {\@funcall{\lst@keywords@key}{{2}#1\@empty}} \define@key{lst}{morendkeywords}[] {\@funcall{\lst@morekeywords@key}{{2}#1\@empty}} \define@key{lst}{deletendkeywords}[] {\@funcall{\lst@deletekeywords@key}{{2}#1\@empty}} %%3rd \define@key{lst}{rdkeywords}[]{\@callsubstopt{\lst@keywords@key}{3}{#1\@empty}} \define@key{lst}{morerdkeywords}[] {\@funcall{\lst@morekeywords@key}{{3}#1\@empty}} \define@key{lst}{deleterdkeywords}[] {\@funcall{\lst@deletekeywords@key}{{3}#1\@empty}} %%% Directives \def\lst@delay@dinstall#1#2{\lst@AddToHook{AfterSetLanguage}{\lst@install@directives{#1}{#2}}} \def\lst@delay@ddelete#1{\lst@AddToHook{AfterSetLanguage}{\lst@delete@directives{#1}}} \define@key{lst}{directives}{\lst@delay@dinstall\lst@directivestyle#1} \define@key{lst}{moredirectives}{\lst@delay@dinstall\lst@directivestyle#1} %%%%%%% Styles applied to keywords, strings etc %%%%%% \newcommand{\lst@keywordstyle@key}[2][1] {\def\csname lst@keywordstyle#1\endcsname##1{#2{##1}}} \def\lst@keywordstyle{\csname lst@keywordstyle1\endcsname} \define@key{lst}{keywordstyle}{\@calloptsimple{\lst@keywordstyle@key}{#1}} %\define@key{lst}{keywordstyle}{\def\lst@kwdstyle##1{#1{##1}}} \define@key{lst}{ndkeywordstyle}{\@calloptsimple{\lst@keywordstyle@key}{[2]#1}} \define@key{lst}{rdkeywordstyle}{\@calloptsimple{\lst@keywordstyle@key}{[3]#1}} \define@key{lst}{otherkeywordstyle}{\def\lst@okwdstyle##1{#1{##1}}} \define@key{lst}{directivestyle}{\def\lst@directivestyle##1{#1{##1}}} \define@key{lst}{identifierstyle}[]{\def\lst@identifierstyle##1{#1{##1}}} \define@key{lst}{basicstyle}{\def\lst@basicstyle{#1}} \define@key{lst}{commentstyle}{\def\lst@commentstyle{#1}} \define@key{lst}{stringstyle}{\def\lst@stringstyle{#1}} \lst@AddToHook{EmptyStyle}{\let\lst@stringstyle\@empty} \lst@AddToHook{EmptyStyle}{\let\lst@commentstyle\em} \lst@AddToHook{EmptyStyle}{\let\lst@identifierstyle\@empty} \lst@AddToHook{EmptyStyle}{\let\lst@basicstyle\@empty} \lst@AddToHook{EmptyStyle}{\lst@keywordstyle@key[1]{\bfseries}} \lst@AddToHook{EmptyStyle} {\lst@keywordstyle@key[2]{\csname lst@keywordstyle1\endcsname}} \lst@AddToHook{EmptyStyle} {\lst@keywordstyle@key[3]{\csname lst@keywordstyle1\endcsname}} \lst@AddToHook{EmptyStyle}{\def\lst@okwdstyle{\lst@keywordstyle}} \lst@AddToHook{EmptyStyle}{\def\lst@directivestyle{\lst@keywordstyle}} \lst@AddToHook{EmptyStyle}{\def\lst@directivestyle{\lst@keywordstyle}} %%%%%% Emph identifiers, classes seems to be implemented properly \def\lst@defall#1#2{\def\csname #1\endcsname{#2}} \def\lst@emphstyle@key#1#2\@empty{\lst@defall{lst@emphstyle#1}{#2}} \def\lst@emphstyle{\csname lst@emphstyle1\endcsname} \lst@AddToHook{EmptyStyle}{\let\csname lst@emphstyle1\endcsname\@empty} \define@key{lst}{emphstyle}{\@callsubstopt{\lst@emphstyle@key}{1}{#1\@empty}} \def\lst@record@class#1#2{% \providecommand{\csname lst@allemph@#1\endcsname}{}% \lst@AddTo,{\csname lst@allemph@#1\endcsname}{\lst@normalize{#2}}} \def\lst@delete@class#1{% \ifu\csname lst@allemph@#1\endcsname\else \@callprim{\lst@delete@kwds}{\{\csname lst@allemph@#1\endcsname\}}% \lst@Empty{\csname lst@allemph@#1\endcsname}\fi} \def\lst@moreemph@key#1#2\@empty{% \lst@record@class{#1}{#2}% \lst@iter{\lst@install@kwd{\csname lst@emphstyle#1\endcsname}}{#2}} \define@key{lst}{moreemph}{\@callsubstopt{\lst@moreemph@key}{1}{#1\@empty}} %%%Class number is not checked... \def\lst@deleteemph@key#1#2\@empty{\lst@iter{\lst@delete@kwd}{#2}} \define@key{lst}{deleteemph}{\@callsubstopt{\lst@deleteemph@key}{1}{#1\@empty}} \def\lst@emph@key#1#2\@empty{% \lst@delete@class{#1}% \lst@record@class{#1}{#2}% \lst@iter{\lst@install@kwd{\csname lst@emphstyle#1\endcsname}}{#2}} \define@key{lst}{emph}[]{\@callsubstopt\lst@emph@key{1}{#1\@empty}} %%%%%% Style definitions \define@key{lst}{style}[{}]{\lsthk@SetStyle\csname lst@sty#1\endcsname} \newcommand{\lstdefinestyle}[2] {\def\csname lst@sty#1\endcsname{\lstset{#2}}} %%%%%% Language definitions \newcommand{\lst@define@dd}[2][] {\newcommand{\csname lstdd@\MakeLowercase{#2}\endcsname}{\MakeLowercase{#1}}} \newcommand{\lst@mklang}[2][] {\ifthenelse{\equal{#1}{}} {lstlang@\MakeLowercase{#2}@\csname lstdd@\MakeLowercase{#2}\endcsname} {lstlang@\MakeLowercase{#2}@\MakeLowercase{#1}}} \newcommand{\lst@language@key}[2][] {\lst@UseHook{SetLanguage}% \csname\lst@mklang[#1]{#2}\endcsname% \lst@UseHook{AfterSetLanguage}} % \lst@UseHook{AfterSetLanguage}} \lst@define@key@opt{language}{\lst@language@key}{} \newcommand{\lst@checkdd}[2] {\@ifundefined{lstdd@\MakeLowercase{#1}}{\lst@define@dd[#2]{#1}}{}} %Awfull hack to avoid defining XML language (hevea crash) \def\lst@XML{XML} \newcommand{\lst@definelanguage@}[3] {\def\@tmp{#1}\ifx\@tmp\lst@XML\else \lst@checkdd{#1}{#2}\def\csname\lst@mklang[#2]{#1}\endcsname{\lstset{#3}}\fi} \newcommand{\lst@derivelanguage@}[5] {\lst@checkdd{#1}{#2}% \def\csname\lst@mklang[#2]{#1}\endcsname{\csname\lst@mklang[#4]{#3}\endcsname % \lst@UseHook{AfterSetLanguage}\lst@ResetHook{AfterSetLanguage}% \lstset{#5}}} \lst@define@key@opt{defaultdialect}{\lst@define@dd}{} %%%%%%% Frames \newstyle{.lstlisting}{font-family:monospace;white-space:pre;margin-right:auto;margin-left:0pt;text-align:left} \setenvclass{lstlisting}{lstlisting} \setenvclass{lstframe}{lstframe} \def\lst@bgcolor@in@temp{% \let\old@color\color% \renewcommand{\color}[2][!*!]{\@getstylecolor[##1]{##2}}% \prim@def\lst@temp@bgcolor{background-color:\lst@bgcolor;}% \let\color\old@color} \def\lst@rulecolor@in@temp{% \let\old@color\color% \renewcommand{\color}[2][!*!]{\@getstylecolor[##1]{##2}}% \prim@def\lst@temp@rulecolor{border-color:\lst@rulecolor;}% \let\color\old@color} \def\lst@border@none{border-style:none;} \def\lst@border@leftline{border-left-style:solid;} \def\lst@border@topline{border-top-style:solid;} \def\lst@border@bottomline{border-bottom-style:solid;} \def\lst@border@lines{border-style:solid none;} \def\lst@border@single{border-style:solid;} \def\lst@border@shadowbox{border-style:outset;} \def\lst@frame@in@temp{% \ifu\csname lst@border@\lst@frame\endcsname \prim@def\lst@temp@frame{\lst@see@frame{\lst@frame}}% \else \let\lst@temp@frame\csname lst@border@\lst@frame\endcsname \fi } \let\lst@whitepre\whitepretrue \lst@AddToHook{InitVar} {\ifu\lst@cell@needed \def\@@open@lstbox{\@open{DIV}{\envclass@attr{lstlisting}}}% \def\@close@lstbox{\@close{DIV}}% \else \ifu\lst@bgcolor\def\lst@temp@bgcolor{}\else\lst@bgcolor@in@temp\fi% \ifu\lst@rulecolor\def\lst@temp@rulecolor{}\else\lst@rulecolor@in@temp\fi% \ifu\lst@frame\def\lst@temp@frame{}\else\lst@frame@in@temp\fi% \def\@@open@lstbox{\@opencell{\envclass@attr[ ]{lstframe}style="padding:1ex;\lst@temp@bgcolor\lst@temp@frame\lst@temp@rulecolor"}{}{\envclass@attr{lstlisting}}}% \def\@close@lstbox{\@closecell}% \fi \def\@open@lstbox{\@@open@lstbox\lst@whitepre}} \def\colorwarning{\hva@warn{Colors in listings and 'color' package not loaded}} \define@key{lst}{backgroundcolor} {\ifu\color\colorwarning\else\def\lst@cell@needed{}\def\lst@bgcolor{#1}\fi} \define@key{lst}{frame}{\def\lst@cell@needed{}\def\lst@frame{#1}} \define@key{lst}{rulecolor} {\ifu\color\colorwarning\else\def\lst@cell@needed{}\def\lst@rulecolor{#1}\fi} \lst@iter{\ignore@key} {framexleftmargin,framexrightmargin,framextopmargin,framexbottommargin} \lst@iter{\ignore@key}{fillcolor,rulesepcolor} \lst@iter{\ignore@key}{framesep,rulesep,framerule} \lst@iter{\ignore@key}{frameround,captionpos} %%%%%%% Margins and line shape \def\lst@doindent#1{} \define@key{lst}{indent}{\def\lst@doindent{\hspace{#1}}} \define@key{lst}{xleftmargin}{\def\lst@doindent{\hspace{#1}}} \lst@iter{\ignore@key} {linewitdh,xrightmargin,resetmargin,prebreak,postbreak,% breakindent,breakautoindent} %%%%%%% Lines %%% Those two I don't care \define@key{lst}{numbersep}{} \define@key{lst}{numberblanklines}{} \newcounter{lstlabel}\newcounter{lstlastline} \lst@AddToHook{InitVar}{\let\@currentlabel\thelstlabel} \newcommand{\lst@saved@lastline} {\@ifundefined{lst@intname}{} {\@ifundefined{thelst@saved@\lst@intname} {0} {\value{lst@saved@\lst@intname}}}} \def\@lst@compute@firstline{% \@ifundefined{lst@intname}{\def\lst@firstline{1}} {\@ifundefined{thelst@saved@\lst@intname}{\def\lst@firstline{1}} {\def\lst@firstline{\csname thelst@saved@\lst@intname\endcsname+1}}}} \def\@auto{auto}\def\@last{last} \lst@AddToHook{Init} {\@ifundefined{lst@firstline} {\@lst@compute@firstline} {\ifx\lst@firstline\@auto\@lst@compute@firstline\fi \ifx\lst@firstline\@last\def\lst@firstline{\thelstlastline+1}\fi}} \define@key{lst}{name}{\def\lst@intname{#1}} \define@key{lst}{firstlabel}{\def\lst@firstline{#1}} \define@key{lst}{firstnumber}{\def\lst@firstline{#1}} \define@key{lst}{advancelabel}{\def\lst@firstline{\lst@saved@lastline+#1+1}} \lst@AddToHook{Init}{\setcounter{lstlabel}{\lst@firstline-1}} \lst@AddToHook{DeInit} {\setcounter{lstlastline}{\value{lstlabel}}% \@ifundefined{lst@intname}{} {\@ifundefined{thelst@saved@\lst@intname} {\newcounter{lst@saved@\lst@intname}% \gdef\csname thelst@saved@\lst@intname\endcsname{\arabic{lst@saved@\lst@intname}}} {}% \setcounter{lst@saved@\lst@intname}{\value{lstlabel}}}} \define@key{lst}{labelstyle}{\def\lst@labelstyle##1{{#1{##1}}}} \define@key{lst}{numberstyle}{\def\lst@labelstyle##1{{#1{##1}}}} \newcommand{\lst@labelstyle}[1]{#1} \define@key{lst}{labelstep}{\def\lst@labelstep{#1}} \define@key{lst}{stepnumber}{\def\lst@labelstep{#1}} \lst@AddToHook{InlineUnsave}{\def\lst@labelstep{1}} \lst@AddToHookExe{EmptyStyle}{\def\lst@labelstep{1}} \define@key{lst}{labelsep}{\def{\lst@labelsep}{\hspace{#1}}} \newcommand{\lst@labelsep}{\hspace{1ex}} \newcommand{\lst@pad}[1]{\@pad{\@print{ }}{4}{#1}} \newcommand{\lst@linenumber@}[1] {\lst@labelstyle{\lst@pad{#1}}\lst@labelsep} \newboolean{lst@numbers} \newcommand{\lst@linenumber} {\ifthenelse{\boolean{lst@numbers}} {\ifthenelse{\lst@labelstep=0} {} {\ifthenelse {0=\value{lstlabel}-\(\value{lstlabel}/\lst@labelstep\)*\lst@labelstep} {\lst@linenumber@{\thelstlabel}} {\lst@linenumber@{}}}} {}} \lst@AddToHook{InitVarEOL}{\stepcounter{lstlabel}} \newsavebox{\@prevlines} \newsavebox{\@curline} \ifhtml \ifu\lst@@br\def\lst@@br{ }\fi \def\lst@@@br{\global\let\lst@br\lst@@br}%To avoid output of first line skip \else \ifu\lst@@br\let\lst@@br\@br\fi \let\lst@@@br\lst@@br \fi \lst@AddToHook{Init} {\def\lst@br{}} \newcommand{\lst@forget@lastline} {\sbox{\@curline}{}\setcounter{lst@spaces}{0}\addtocounter{lstlabel}{-1}} \newcommand{\@NewLine@} {\usebox{\@prevlines}\usebox{\@curline}\lst@spaces% \sbox{\@prevlines}{}\sbox{\@curline}{}\global\let\@NewLine\lst@spaces} \lst@AddToHook{EveryLine}{\setcounter{lst@spaces}{0}% \sbox{\@prevlines}{\usebox{\@prevlines}\usebox{\@curline}}% \sbox{\@curline}{\lst@br\@rawchars{\lst@doindent}\lst@linenumber}% \global\let\@NewLine\@NewLine@} \lst@AddToHook{LastLine}{\setcounter{lst@spaces}{0}% \sbox{\@prevlines}{\usebox{\@prevlines}\usebox{\@curline}}% \iflst@showlines\usebox{\@prevlines}\fi\sbox{\@prevlines}{}\sbox{\@curline}{}% \global\let\@NewLine\@NewLine@} \lst@AddToHook{Init}{\sbox{\@prevlines}{}\sbox{\@curline}{}\global\let\@NewLine\lst@spaces} \def\lst@numbers@none{\setboolean{lst@numbers}{false}} \def\lst@numbers@left{\setboolean{lst@numbers}{true}} \let\lst@numbers@right\lst@numbers@left \def\lst@numbers#1{\csname lst@numbers@#1\endcsname} \define@key{lst}{numbers}{\lst@numbers{#1}} \lst@AddToHookExe{EmptyStyle}{\lst@numbers{none}} %%%%%% TeX escapes \define@key{lst}{texcl}[true]{\def\lst@texcl{#1}} \setboolean{lst@texcl}{false} \lst@AddToHook{Init} {\@ifundefined{lst@texcl}{} {\setboolean{lst@texcl}{\lst@boolean{\lst@texcl}}}} \lst@AddToHook{DeInit}{\setboolean{lst@texcl}{false}} \define@key{lst}{mathescape}[true]{\def\lst@mathescape{#1}} \setboolean{lst@mathescape}{false} \lst@AddToHook{Init} {\@ifundefined{lst@mathescape}{} {\setboolean{lst@mathescape}{\lst@boolean{\lst@mathescape}}}} \lst@AddToHook{DeInit}{\setboolean{lst@mathescape}{false}} \def\lst@BET{}\def\lst@EET{} \newcommand{\lst@Esc@key}[2] {\def\lst@BET{\@rawchars{#1}}\def\lst@EET{\@rawchars{#2}}} \define@key{lst}{escapeinside}{\@callsubst{\lst@Esc@key}{#1{}}} \define@key{lst}{escapechar}[{}]{\lst@Esc@key#1#1} \def\lst@escapebegin{} \define@key{lst}{escapebegin}[]{\def\lst@escapebegin{#1}} \def\lst@escapeend{} \define@key{lst}{escapeend}[]{\def\lst@escapeend{#1}} %%%%%% Ignore input \newcommand{\lst@gobble}{0} \define@key{lst}{gobble}{\def\lst@gobble{#1}} \define@key{lst}{first}{\def\lst@first{#1}} \define@key{lst}{firstline}{\def\lst@first{#1}} \define@key{lst}{last}{\def\lst@last{#1}} \define@key{lst}{lastline}{\def\lst@last{#1}} \define@key{lst}{linerange}{\def\lst@linerange{#1}} \lst@AddToHook{PreSet} {\newcommand{\lst@first}{1}\newcommand{\lst@last}{99999}% \let\lst@linerange\@empty} \lst@AddToHook{Init} {\ifx\lst@linerange\@empty \prim@def\lst@linerange{{\lst@first}-{\lst@last}}\fi} % boolean includerangemarker key \define@key{lst}{includerangemarker}[true]{\def\lst@includerangemarker{#1}} \lst@AddToHook{Init} {\@ifundefined{lst@includerangemarker} {\setboolean{lst@includerangemarker}{true}} {\setboolean{lst@includerangemarker}{\lst@boolean{\lst@includerangemarker}}}} %prefix/suffix of markers, one prefix/suffix only \newtokens{\lst@rangebeginprefix}\newtokens{\lst@rangeendprefix}% \newtokens{\lst@rangebeginsuffix}\newtokens{\lst@rangeendsuffix}% \addtokens{\lst@rangebeginprefix}{}\addtokens{\lst@rangeendprefix}{}% \addtokens{\lst@rangebeginsuffix}{}\addtokens{\lst@rangeendsuffix}{}% \define@key{lst}{rangebeginprefix}{\addtokens{\lst@rangebeginprefix}{#1}} \define@key{lst}{rangebeginsuffix}{\addtokens{\lst@rangebeginsuffix}{#1}} \define@key{lst}{rangeendprefix}{\addtokens{\lst@rangeendprefix}{#1}} \define@key{lst}{rangeendsuffix}{\addtokens{\lst@rangeendbeginsuffix}{#1}} \define@key{lst}{rangeprefix} {\addtokens{\lst@rangebeginprefix}{#1}\addtokens{\lst@rangeendprefix}{#1}} \define@key{lst}{rangesuffix} {\addtokens{\lst@rangebeginsuffix}{#1}\addtokens{\lst@rangeendsuffix}{#1}} % boolean print key \define@key{lst}{print}[true]{\def\lst@print{#1}} \lst@AddToHook{Init} {\@ifundefined{lst@print}{\setboolean{lst@print}{true}} {\setboolean{lst@print}{\lst@boolean{\lst@print}}}} % showlines \define@key{lst}{showlines}[true]{\def\lst@showlines{#1}} \lst@AddToHook{Init} {\@ifundefined{lst@showlines} {\setboolean{lst@showlines}{false}} {\setboolean{lst@showlines}{\lst@boolean{\lst@showlines}}}} %%%%%%% Strings \newcommand{\lst@inactivate}[1]{\let#1\@empty} \newcommand{\lst@activate}[1]{#1} \lst@Hook{String} \lst@AddToHook{Init}{\let\lst@do\lst@activate\lst@UseHook{String}} \lst@AddToHook{SetLanguage} {\let\lst@do\lst@inactivate\lst@UseHook{String}} %\newcommand{\lst@stringizer@key@add}[2][] % {\lst@AddToHook{String}{\lst@def@stringizer{#1}{#2}}} %\newcommand{\lst@stringizer@key}[2][] % {\lst@ResetHook{String}\lst@AddToHook{String}{\lst@def@stringizer{#1}{#2}}} %\newcommand{\lst@stringizer@key@delete}[2][]{\lst@ResetHook{String}} %\lst@define@key@opt{stringizer}{\lst@stringizer@key}{} %\lst@define@key@opt{string}{\lst@stringizer@key}{} %\lst@define@key@opt{morestring}{\lst@stringizer@key@add}{} %\lst@define@key@opt{deletestring}{\lst@stringizer@key@delete}{} %%Real keys, that take all three arguments \newcommand{\lst@DS@key}[3] {\def\csname @is@string@#3\endcsname{}}% \newcommand{\lst@SS@key}[3] {\let\lst@do\lst@inactivate\lst@UseHook{String}% \lst@MS@key{#1}{#2}{#3}}% \newcommand{\lst@MS@key}[3] {\ifu\csname @recorded@string@#3\endcsname \let\csname @recorded@string@#3\endcsname\@empty \lst@AddToHook{String} {\lst@do{\csname @is@string@#3\endcsname}}\fi \def\csname @is@string@#3\endcsname{\lst@def@stringizer{#1}{#2}{#3}}}% %%Parse the [][]{} arguments \newcommand{\lst@stringarg@one}[1][b]{\def\lst@arg@one{#1}\lst@stringarg@two} \newcommand{\lst@stringarg@two}[1][stringstyle] {\def\lst@arg@two{#1}\lst@stringarg@three} \newcommand{\lst@stringarg@three}[1] {\lst@cmd{\lst@arg@one}{\lst@arg@two}{#1}} %%%Real key handlers \newcommand{\lst@deletetring@key}{\let\lst@cmd\lst@DS@key\lst@stringarg@one} \newcommand{\lst@string@key}{\let\lst@cmd\lst@SS@key\lst@stringarg@one} \newcommand{\lst@morestring@key}{\let\lst@cmd\lst@MS@key\lst@stringarg@one} \define@key{lst}{deletestring}{\@callsubst{\lst@deletestring@key}{#1}} \define@key{lst}{stringizer}{\@callsubst{\lst@string@key}{#1}} \define@key{lst}{string}{\@callsubst{\lst@string@key}{#1}} \define@key{lst}{morestring}{\@callsubst{\lst@morestring@key}{#1}} % stringspaces \define@key{lst}{stringspaces}[true]{\def\lst@stringspaces{#1}} \define@key{lst}{showstringspaces}[false]{\def\lst@stringspaces{#1}} \setboolean{lst@stringspaces}{false} \lst@AddToHook{Init} {\@ifundefined{lst@stringspaces}{} {\setboolean{lst@stringspaces}{\lst@boolean{\lst@stringspaces}}}} \lst@AddToHook{DeInit}{\setboolean{lst@stringspaces}{false}} %%%%%% Comments % Line comments \newcommand{\lst@LC@key}[3] {\lst@lExtend\lst@DefineComments@LC {\lst@line@comment{#1}{#2}{\@rawchars{#3}}}} \define@key{lst}{commentline}{\lst@LC@key{commentstyle}{#1}} \lst@AddToHookExe{SetLanguage}{\let\lst@DefineComments@LC\@empty} \lst@AddToHook{SelectCharTable}{\lst@DefineComments@LC} % Nested comments \newcommand{\lst@NC@key}[3] {\lst@lExtend\lst@DefineComments@NC {\lst@nested@comment{#1}{\@rawchars{#2}}{\@rawchars{#3}}}} \define@key[2]{lst}{nestedcomment}{\lst@NC@key{commentstyle}{#1}{#2}} \lst@AddToHookExe{SetLanguage}{\let\lst@DefineComments@NC\@empty} \lst@AddToHook{SelectCharTable}{\lst@DefineComments@NC} % Balanced comments \newcommand{\lst@SC@key}[3] {\lst@lExtend\lst@DefineComments@SC {\lst@balanced@comment{#1}{\@rawchars{#2}}{\@rawchars{#3}}}} \define@key[2]{lst}{singlecomment}{\lst@SC@key{commentstyle}{#1}{#2}} \lst@AddToHookExe{SetLanguage}{\let\lst@DefineComments@SC\@empty} \lst@AddToHook{SelectCharTable}{\lst@DefineComments@SC} % Double comments: more or less single comment twice \newcommand{\lst@DC@key}[5] {\lst@lExtend\lst@DefineComments@DC {\lst@balanced@comment{#1}{\@rawchars{#2}}{\@rawchars{#3}}}% \lst@lExtend\lst@DefineComments@DC {\lst@balanced@comment{#1}{\@rawchars{#4}}{\@rawchars{#5}}}} \define@key[4]{lst}{doublecomment}{\lst@DC@key{commentstyle}{#1}{#2}{#3}{#4}} \lst@AddToHookExe{SetLanguage}{\let\lst@DefineComments@DC\@empty} \lst@AddToHook{SelectCharTable}{\lst@DefineComments@DC} %%%%%% New interface for comments grr... \newcommand{\lst@morecomment@d}[5][commentstyle] {\lst@DC@key{#1}{#2}{#3}{#4}{#5}} \newcommand{\lst@morecomment@s}[3][commentstyle]{\lst@SC@key{#1}{#2}{#3}} \newcommand{\lst@morecomment@is}[3][commentstyle] {\hva@warn{Invisible comments not implemented}% \lst@SC@key{#1}{#2}{#3}} \newcommand{\lst@morecomment@n}[3][commentstyle]{\lst@NC@key{#1}{#2}{#3}} %Notice the horible trick to parse morecomment=[l]\\ \def\lst@LC@parse#1#2#3\@empty{\lst@LC@key{#1}{#2}{#3}} \newcommand{\lst@morecomment@l}[1][commentstyle]{\lst@LC@parse{visible}{#1}} \newcommand{\lst@morecomment@il}[1][commentstyle] {\hva@warn{Invisible comments not implemented}% \lst@LC@parse{visible}{#1}} %%% \def\lst@deletecomment@d{\let\lst@DefineComments@DC\@empty} \def\lst@deletecomment@s{\let\lst@DefineComments@SC\@empty} \def\lst@deletecomment@n{\let\lst@DefineComments@NC\@empty} \def\lst@deletecomment@l{\let\lst@DefineComments@LC\@empty} \def\lst@deletecomment@all{% \lst@deletecomment@d\lst@deletecomment@s% \lst@deletecomment@n\lst@deletecomment@l} \def\lst@till@empty#1\@empty{} \newcommand{\lst@morecomment@key}[1][] {\ifu\csname lst@morecomment@#1\endcsname \hva@warn{Unknown comment type '#1'}% \let\lst@next\lst@till@empty\else \let\lst@next\csname lst@morecomment@#1\endcsname\fi \lst@next} \newcommand{\lst@deletecomment@key}[1][] {\ifu\csname lst@deletecomment@#1\endcsname \hva@warn{Unknown comment type '#1'}\else \csname lst@deletecomment@#1\endcsname\fi \lst@till@empty} \newcommand{\lst@comment@key}[1][] {\ifu\csname lst@morecomment@#1\endcsname \hva@warn{Unknown comment type '#1'}% \let\lst@next\lst@till@empty\else \csname lst@deletecomment@all\endcsname \let\lst@next\csname lst@morecomment@#1\endcsname\fi \lst@next} \define@key{lst}{deletecomment}{\@callsubst{\lst@deletecomment@key}{#1\@empty}} \define@key{lst}{comment}{\@callsubst{\lst@comment@key}{#1\@empty}} \define@key{lst}{morecomment}{\@callsubst{\lst@morecomment@key}{#1\@empty}} %%%%%%% General delimiters %Line delimiters \newcommand{\lst@LD@key}[3]{ \lst@lExtend\lst@Define@LD{\lst@line@delim{#1}{#2}{\@rawchars{#3}}}} \lst@AddToHookExe{SetLanguage}{\let\lst@Define@LD\@empty} \lst@AddToHook{SelectCharTable}{\lst@Define@LD} %Single delimiters \newcommand{\lst@SD@key}[4] {\lst@lExtend\lst@Define@SD {\lst@single@delim{#1}{#2}{\@rawchars{#3}}{\@rawchars{#4}}}} \lst@AddToHookExe{SetLanguage}{\let\lst@Define@SD\@empty} \lst@AddToHook{SelectCharTable}{\lst@Define@SD} %%General interface \def\lst@deletedelim@l{\let\lst@Define@LC\@empty} \def\lst@deletedelim@s{\let\lst@Define@SD\@empty} \def\lst@deletedelim@all{\lst@deletedelim@l\lst@deletedelim@s} \newcommand{\lst@deletedelim@key}[1][] {\ifu\csname lst@deletedelim@#1\endcsname \hva@warn{Unknown delimiter type '#1'}\else \csname lst@deletedelim@#1\endcsname\fi \lst@till@empty} %Trick to parse delim=[l]\\ \def\lst@LD@parse#1#2#3\@empty{\lst@LD@key{#1}{#2}{#3}} \newcommand{\lst@moredelim@l}[1][\@empty]{\lst@LD@parse{visible}{#1}} \newcommand{\lst@moredelim@il}[1][\@empty]{\lst@LD@parse{invisible}{#1}} \newcommand{\lst@moredelim@s}[3][\@empty]{\lst@SD@key{visible}{#1}{#2}{#3}} \newcommand{\lst@moredelim@is}[3][\@empty]{\lst@SD@key{invisible}{#1}{#2}{#3}} %Awfull hack to ignore moredelim=*[directive]\# present in lstlang?.sty files %In that case the argument of \lst@moredelim@key is empty %and \lst@moredelim@ is called to eat all arguments up to the final \@empty \newcommand{\lst@moredelim@}{\let\lst@next\lst@till@empty\lst@next} \newcommand{\lst@moredelim@key}[1][] {\ifu\csname lst@moredelim@#1\endcsname \hva@warn{Unknown delimiter type '#1'}% \let\lst@next\lst@till@empty\else \let\lst@next\csname lst@moredelim@#1\endcsname\fi \lst@next} \newcommand{\lst@delim@key}[1][] {\ifu\csname lst@moredelim@#1\endcsname \hva@warn{Unknown delimiter type '#1'}% \let\lst@next\lst@till@empty\else \csname lst@deletedelim@all\endcsname \let\lst@next\csname lst@moredelim@#1\endcsname\fi \lst@next} \define@key{lst}{deletedelim}{\@callsubst{\lst@deletedelim@key}{#1\@empty}} \define@key{lst}{delim}{\@callsubst{\lst@delim@key}{#1\@empty}} \define@key{lst}{moredelim}{\@callsubst{\lst@moredelim@key}{#1\@empty}} %%%%%%% Extended chars and others \def\lst@extendedchars{true} \lst@AddToHook{DeInit}{\setboolean{lst@extendedchars}{true}} \lst@AddToHookExe{SetLanguage}{\setboolean{lst@extendedchars}{true}} \lst@AddToHook{SelectCharTable} {\setboolean{lst@extendedchars}{\lst@boolean{\lst@extendedchars}}} \define@key{lst}{extendedchars}[true]{\def\lst@extendedchars{#1}} \define@key{lst}{showspaces}[true]{\def\lst@showspaces{#1}} \setboolean{lst@showspaces}{false} \lst@AddToHook{Init} {\@ifundefined{lst@showspaces}{} {\setboolean{lst@showspaces}{\lst@boolean{\lst@showspaces}}}} %Tabs... \define@key{lst}{showtabs}[true]{\def\lst@showtabs{#1}} \setboolean{lst@showtabs}{false} \lst@AddToHook{Init} {\@ifundefined{lst@showtabs}{} {\setboolean{lst@showtabs}{\lst@boolean{\lst@showtabs}}}} \lst@AddToHook{DeInit}{\setboolean{lst@showtabs}{false}} \newcommand{\lst@tabsize}{8} \define@key{lst}{tabsize}[8]{\def\lst@tabsize{#1}} \define@key{lst}{tab}{\def\lst@tab{#1}} \lst@iter{\ignore@key}{inputencoding,formfeed} %%%%%%% Alter char categories \def\lst@alsoletter{} \define@key{lst}{alsoletter}{\def\lst@alsoletter{#1}} %%%%%%% Sensitive keywords \lst@AddToHookExe{DeInit}{\setboolean{lst@sensitive}{true}} \lst@AddToHook{SetLanguage}{\setboolean{lst@sensitive}{true}} \define@key{lst}{sensitive}[true]{\setboolean{lst@sensitive}{\lst@boolean{#1}}} %%%%%%% Captions %\lst@AddToHookExe{InlineUnsave} %{\let\lst@caption\@empty% %\let\lst@title\@empty\let\lst@label\@empty} %listing counter \@ifundefined{thechapter} {\newcounter{lstlisting}} {\newcounter{lstlisting}[chapter] \renewcommand\thelstlisting {\ifthenelse{\value{chapter} > 0}{\thechapter.}{}\arabic{lstlisting}}} \lst@AddToHook{InitVar}{\ifu\lst@caption\else\refstepcounter{lstlisting}\fi} %%Keys \define@key{lst}{label}{\def\lst@label{#1}} \define@key{lst}{title}{\def\lst@title{#1}} %\lst@define@key@opt{caption}{\lst@caption@key}{} \define@key{lst}{caption}{\@calloptsimple{\lst@caption@key}{#1}} \newcommand{\lst@caption@key}[2][]{\def\lst@caption{#2}} %%% Output Caption \def\listingname{Listing} \def\@lst@caption {\ifu\lst@caption% \ifu\lst@title\else\begin{center}\lst@title\end{center}\fi\else \begin{center}\listingname~\thelstlisting: % \ifu\lst@label\else\label{\lst@label}\fi\lst@caption\end{center}\\\fi} %%%%%%% Output % Treating spaces with a counter (and not with boxes) enables % optimized style managment \newcounter{lst@spaces} \def\lst@output@space{\stepcounter{lst@spaces}} \lst@AddToHook{Init}{\setcounter{lst@spaces}{0}} \newsavebox{\normalize@box} \def\lst@normalize#1{% \sbox{\normalize@box} {\iflst@sensitive\@rawchars{#1}\else\@rawchars{\MakeLowercase{#1}}\fi}% \usebox{\normalize@box}} \def\lst@output#1#2{% \@NewLine%\lstinfo{OUT: '#1' '#2'}% {\ifu\csname lstk@\lst@normalize{#1}\endcsname \lst@identifierstyle{#2}\else \csname lstk@\lst@normalize{#1}\endcsname{#2}\fi}} \def\lst@output@other#1#2{% \@NewLine%\lstinfo{OTHER: '#1' '#2'}% \ifu\csname lstk@\lst@normalize{#1}\endcsname #2\else {\csname lstk@\lst@normalize{#1}\endcsname{#2}}\fi} \newcounter{lst@save@spaces} \def\save@spaces {\setcounter{lst@save@spaces}{\value{lst@spaces}}\setcounter{lst@spaces}{0}} \def\restore@spaces {\setcounter{lst@spaces}{\value{lst@save@spaces}}} \def\lst@output@directive#1#2{% %\lstinfo{DIRECTIVE: '#1' '#2' '\thelst@spaces'}% \save@spaces\@NewLine\restore@spaces% \ifu\csname lstd@\lst@normalize{#1}\endcsname {\lst@directivestyle{\@print{#}}}% \lst@spaces\lst@output{#1}{#2}\else {\csname lstd@\lst@normalize{#1}\endcsname{\@print{#}\lst@spaces#2}}\fi} %%%%%% Pre and post (already obsolete) \let\lst@pre\@empty \let\lst@post\@empty \define@key{lst}{pre}{\def\lst@pre{#1}} \define@key{lst}{post}{\def\lst@post{#1}} %%% inputencodings (for compatibility only ?) \def\lst@inputencoding@key#1{\inputencoding{#1}} \define@key{lst}{inputencoding}{\lst@inputencoding@key{#1}} %%%%% Column allignement None ! \lst@iter{\ignore@key} {columns,flexiblecolumns,keepspaces,basewidth,fontadjust,aboveskip,belowskip,lineskip,emptylines} %%%%%%% User interface \newcommand{\lstinputlisting}[2][] {\@scaninput{\begin{lstlisting}[#1]{} }{#2}{\end{lstlisting}}} \let\lstdefinelanguage\lst@definelanguage \newcommand{\lstloadlanguage}[1]{} %%%%%% Driver files are loaded directly! \lstset{defaultdialect=[95]Ada, defaultdialect=[68]Algol, defaultdialect=[ANSI]C, defaultdialect=[Objective]Caml, defaultdialect=[1985]Cobol, defaultdialect=[ANSI]C++, defaultdialect=[95]Fortran, defaultdialect=[3.0]Mathematica, defaultdialect=[Standard]Pascal, defaultdialect=[67]Simula, defaultdialect=[plain]TeX} \input{lstlang1.hva} \input{lstlang2.hva} \input{lstlang3.hva} %%%%%%%%%%% Inits \lst@UseHook{SetStyle}\lst@UseHook{EmptyStyle} \lst@UseHook{SetLanguage}\lst@UseHook{EmptyLanguage} \newsavebox{\lst@box} %%%%%% Alternative style, with explicit
(for copy/paste) \newcommand{\lstavoidwhitepre} {\let\lst@@br\@br% \newstyle{.mouselstlisting}{font-family:monospace;margin-right:auto;margin-left:0pt;text-align:left}% \setenvclass{lstlisting}{mouselstlisting}% \let\lst@whitepre\@empty% \renewcommand{\lst@pad}[1]{\@pad{~}{4}{##1}}} hevea-2.30/imageManager.mli0000644004317100512160000000204107021270537015634 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) module type S = sig val start : unit -> unit val stop : unit -> unit val restart : unit -> unit val put_char : char -> unit val put : string -> unit val dump : string -> (Lexing.lexbuf -> unit) -> Lexing.lexbuf -> unit val page : unit -> unit val finalize : bool -> bool end hevea-2.30/theorem.hva0000644004317100512160000000012210450755375014725 0ustar marangetcristal\newcommand{\theorembodyfont}[1]{\def\th@font{#1}} \newcommand{\theoremstyle}[1]{}hevea-2.30/htmltext.mli0000644004317100512160000000306512017660721015136 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: htmltext.mli,v 1.6 2005-11-08 14:27:20 maranget Exp $ *) (***********************************************************************) exception No type tsize = Int of int | Big | Small type nat = Style of Lexeme.tag | Size of tsize | Color of string | Face of string | Fstyle of Lexeme.fontstyle * string | Other type t_style = { nat : nat; txt : string; ctxt : string; } type style = t_style list val cost : style -> int * int exception NoProp val get_prop : nat -> (nat -> bool) val is_font : nat -> bool val is_span : nat -> bool val font_props : (nat -> bool) list val span_props : (nat -> bool) list val neutral_prop : (nat -> bool) -> bool val same_style : t_style -> t_style -> bool type env = t_style list val empty_env : env exception Split of t_style * env val add_style : Lexeme.style -> env -> env val blanksNeutral : t_style -> bool val partition_color : env -> env * env hevea-2.30/get.mll0000644004317100512160000003272312017660721014052 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) { open Printf open Misc open Lexing open Latexmacros open Lexstate open MyStack open Length (* Compute functions *) exception Error of string let sbool = function | true -> "true" | false -> "false" let get_this = ref (fun _ -> assert false) and get_fun = ref (fun _f _lexbuf -> assert false) and open_env = ref (fun _ -> ()) and close_env = ref (fun _ -> ()) and get_csname = ref (fun _ -> assert false) and main = ref (fun _ -> assert false) ;; let bool_out = ref false and int_out = ref false let int_stack = MyStack.create "int_stack" and bool_stack = MyStack.create "bool_stack" and group_stack = MyStack.create "group_stack" and just_opened = ref false type saved = bool * bool MyStack.saved * bool * int MyStack.saved * (unit -> unit) MyStack.saved * bool let check () = !bool_out, MyStack.save bool_stack, !int_out, MyStack.save int_stack, MyStack.save group_stack, !just_opened and hot (b,bs,i,is,gs,j) = bool_out := b ; MyStack.restore bool_stack bs ; int_out := i ; MyStack.restore int_stack is ; MyStack.restore group_stack gs ; just_opened := j let push_int x = if !verbose > 2 then prerr_endline ("PUSH INT: "^string_of_int x) ; just_opened := false ; push int_stack x let open_ngroups n = let rec open_ngroups_rec = function | 0 ->() | n -> push group_stack (fun () -> ()) ; open_ngroups_rec (n-1) in if !verbose > 2 then prerr_endline ("OPEN NGROUPS: "^string_of_int n) ; if n > 0 then begin just_opened := true ; open_ngroups_rec n end let close_ngroups n = let rec close_ngroups_rec = function | 0 -> () | n -> let f = pop group_stack in f() ; close_ngroups_rec (n-1) in if !verbose > 2 then prerr_endline ("CLOSE NGROUPS: "^string_of_int n); close_ngroups_rec n let open_aftergroup f s = if !verbose > 2 then prerr_endline ("OPEN AFTER: "^s) ; just_opened := true ; push group_stack f } let command_name = '\\' ((['@''A'-'Z' 'a'-'z']+ '*'?) | [^ '@' 'A'-'Z' 'a'-'z'] | "\\*") rule result = parse (* Skip comments and spaces *) | '%' [^ '\n'] * '\n' {result lexbuf} | [' ' '\n']+ {result lexbuf} (* Integers *) | ['0'-'9']+ {let lxm = Lexing.lexeme lexbuf in push_int (int_of_string lxm) ; result lexbuf} | '\'' ['0'-'7']+ {let lxm = lexeme lexbuf in push_int (int_of_string ("0o"^String.sub lxm 1 (String.length lxm-1))) ; result lexbuf} | "\"" ['0'-'9' 'a'-'f' 'A'-'F']+ {let lxm = lexeme lexbuf in push_int (int_of_string ("0x"^String.sub lxm 1 (String.length lxm-1))) ; result lexbuf} | '`' {let token = !get_csname lexbuf in after_quote (MyLexing.from_string token) ; result lexbuf} | "true" {push bool_stack true ; result lexbuf} | "false" {push bool_stack false ; result lexbuf} (* Operands *) | '+' | '-' as lxm {let unary = !just_opened in if unary then begin let f = pop group_stack in open_aftergroup (fun () -> if !verbose > 2 then begin prerr_endline ("UNARY: "^String.make 1 lxm) ; MyStack.pretty string_of_int int_stack end ; let x1 = pop int_stack in let r = match lxm with | '+' -> x1 | '-' -> 0 - x1 | _ -> assert false in push_int r ; f()) "UNARY" end else begin close_ngroups 2 ; open_aftergroup (fun () -> if !verbose > 2 then begin prerr_endline ("OPPADD: "^String.make 1 lxm) ; MyStack.pretty string_of_int int_stack end ; let x2 = pop int_stack in let x1 = pop int_stack in let r = match lxm with | '+' -> x1 + x2 | '-' -> x1 - x2 | _ -> assert false in push_int r) "ADD"; open_ngroups 1 ; end ; result lexbuf} | '/' | '*' {let lxm = lexeme_char lexbuf 0 in close_ngroups 1 ; open_aftergroup (fun () -> if !verbose > 2 then begin prerr_endline ("MULTOP"^String.make 1 lxm) ; MyStack.pretty string_of_int int_stack end ; let x2 = pop int_stack in let x1 = pop int_stack in let r = match lxm with | '*' -> x1 * x2 | '/' -> x1 / x2 | _ -> assert false in push_int r) "MULT"; result lexbuf} (* boolean openrands *) | '<' | '>' | '=' {let lxm = Lexing.lexeme_char lexbuf 0 in close_ngroups 3 ; open_aftergroup (fun () -> if !verbose > 2 then begin prerr_endline ("COMP: "^String.make 1 lxm) ; MyStack.pretty string_of_int int_stack end ; let x2 = pop int_stack in let x1 = pop int_stack in push bool_stack (match lxm with | '<' -> x1 < x2 | '>' -> x1 > x2 | '=' -> x1 = x2 | _ -> assert false) ; if !verbose > 2 then MyStack.pretty sbool bool_stack) "COMP" ; open_ngroups 2 ; result lexbuf} (* Parenthesis for integer computing *) | '('|'{' {open_ngroups 2 ; result lexbuf} | ')'|'}' {close_ngroups 2 ; result lexbuf} (* Commands *) | '#' ['1'-'9'] {let lxm = lexeme lexbuf in let i = Char.code (lxm.[1]) - Char.code '1' in scan_arg (scan_this_arg_list result) i ; result lexbuf} | command_name as lxm {let pat,body = Latexmacros.find lxm in let args = make_stack lxm pat lexbuf in scan_body (function | Subst body -> scan_this_list result body | Toks l -> List.iter (scan_this result) (List.rev l) | CamlCode f -> let rs = !get_fun f lexbuf in scan_this result rs) body args ; result lexbuf} | _ {raise (Error ("Bad character in Get.result: ``"^lexeme lexbuf^"''"))} | eof {()} and after_quote = parse | '\\' [^ 'A'-'Z' 'a'-'z'] eof {let lxm = lexeme lexbuf in push_int (Char.code lxm.[1]); result lexbuf} | _ eof {let lxm = lexeme lexbuf in push_int (Char.code lxm.[0]); result lexbuf} | "" {Misc.fatal "Cannot understand `-like numerical argument"} { let init latexget latexgetfun latexopenenv latexcloseenv latexcsname latexmain = get_this := latexget ; get_fun := latexgetfun ; open_env := latexopenenv ; close_env := latexcloseenv ; get_csname := latexcsname ; main := latexmain ;; let def_loc name f = Latexmacros.def name zero_pat (CamlCode f) ; ;; let def_commands l = List.map (fun (name,f) -> name,Latexmacros.replace name (Some (zero_pat,CamlCode f))) l let def_commands_int () = def_commands ["\\value", (fun lexbuf -> let name = !get_this (save_arg lexbuf) in push_int (Counter.value_counter name)) ; "\\@lengthtonchar", (fun lexbuf -> let length = Length.main (MyLexing.from_string (!get_this (save_arg lexbuf))) in let r = match length with | Length.Char x -> x | Length.Pixel x -> pixel_to_char x | _ -> 2 in push_int r) ; "\\pushint", (fun lexbuf -> let s = !get_this (save_arg lexbuf) in scan_this result s)] let def_commands_bool () = let old_ints = def_commands_int () in let old_commands = def_commands ["\\(", (fun _ -> open_ngroups 7) ; "\\)", (fun _ -> close_ngroups 7) ; "\\@fileexists", (fun lexbuf -> let name = !get_this (save_arg lexbuf) in push bool_stack (try let _,chan = Myfiles.open_tex name in begin try close_in chan with Sys_error _ -> () end ; true with Myfiles.Except | Myfiles.Error _ -> false)) ; "\\@commandexists", (fun lexbuf -> let name = !get_csname lexbuf in (* Printf.eprintf "EXISTS? '%s'\n" name ; *) push bool_stack (Latexmacros.exists name)) ; "\\or", (fun _ -> close_ngroups 7 ; open_aftergroup (fun () -> if !verbose > 2 then begin prerr_endline "OR" ; MyStack.pretty sbool bool_stack end ; let b1 = pop bool_stack in let b2 = pop bool_stack in push bool_stack (b1 || b2)) "OR"; open_ngroups 6) ; "\\and", (fun _ -> close_ngroups 6 ; open_aftergroup (fun () -> if !verbose > 2 then begin prerr_endline "AND" ; MyStack.pretty sbool bool_stack end ; let b1 = pop bool_stack in let b2 = pop bool_stack in push bool_stack (b1 && b2)) "AND"; open_ngroups 5) ; "\\not", (fun _ -> close_ngroups 4 ; open_aftergroup (fun () -> if !verbose > 2 then begin prerr_endline "NOT" ; MyStack.pretty sbool bool_stack end ; let b1 = pop bool_stack in push bool_stack (not b1)) "NOT"; open_ngroups 3) ; "\\boolean", (fun lexbuf -> let name = !get_this (save_arg lexbuf) in let b = try let r = !get_this (string_to_arg ("\\if"^name^" true\\else false\\fi")) in match r with | "true" -> true | "false" -> false | _ -> raise (Misc.Fatal ("boolean value: "^r)) with Latexmacros.Failed -> true in push bool_stack b) ; "\\isodd", (fun _lexbuf -> close_ngroups 3 ; open_aftergroup (fun () -> if !verbose > 2 then begin prerr_endline ("ISODD") ; MyStack.pretty string_of_int int_stack end ; let x = pop int_stack in push bool_stack (x mod 2 = 1) ; if !verbose > 2 then MyStack.pretty sbool bool_stack) "ISODD" ; open_ngroups 2) ] in let old_equal = try Some (Latexmacros.find_fail "\\equal") with Failed -> None in def_loc "\\equal" (fun lexbuf -> let arg1 = save_arg lexbuf in let arg2 = save_arg lexbuf in scan_this !main "\\begin{@norefs}" ; let again = List.map (fun (name,x) -> name,Latexmacros.replace name x) ((("\\equal",old_equal)::old_ints)@old_commands) in push bool_stack (!get_this arg1 = !get_this arg2) ; let _ = List.map (fun (name,x) -> Latexmacros.replace name x) again in scan_this !main "\\end{@norefs}") type 'a funs = { pp : out_channel -> 'a -> unit ; to_string : 'a -> string ; scan_this : (Lexing.lexbuf -> unit) -> 'a -> unit; } let string_funs = { pp = output_string ; to_string = (fun x -> x) ; scan_this = scan_this; } let list_funs = { pp = pretty_body ; to_string = String.concat ""; scan_this = scan_this_list; } let do_get_int f {arg=expr ; subst=subst} = if !verbose > 1 then eprintf "get_int : '%a'\n%!" f.pp expr ; let r = let old_int = !int_out in int_out := true ; start_normal subst ; !open_env "*int*" ; let _ = def_commands_int () in open_ngroups 2 ; begin try f.scan_this result expr with | x -> begin eprintf "Error while scanning '%a' for integer result\n%!" f.pp expr ; raise x end end ; close_ngroups 2 ; !close_env "*int*" ; end_normal () ; if MyStack.empty int_stack then raise (Error (sprintf "'%s'' has no value as an integer" (f.to_string expr))) ; let r = pop int_stack in int_out := old_int ; r in if !verbose > 1 then eprintf "get_int: '%a' -> %i\n%!" f.pp expr r ; r let get_int_string a = do_get_int string_funs a let get_int a = do_get_int list_funs a let get_bool {arg=expr ; subst=subst} = if !verbose > 1 then prerr_endline ("get_bool : "^expr) ; let old_bool = !bool_out in bool_out := true ; start_normal subst ; !open_env "*bool*" ; def_commands_bool () ; open_ngroups 7 ; begin try scan_this result expr with | x -> begin prerr_endline ("Error while scanning ``"^expr^"'' for boolean result"); raise x end end ; close_ngroups 7 ; !close_env "*bool*" ; end_normal () ; if MyStack.empty bool_stack then raise (Error ("``"^expr^"'' has no value as a boolean")); let r = pop bool_stack in if !verbose > 1 then prerr_endline ("get_bool: "^expr^" = "^sbool r); bool_out := old_bool ; r let get_length arg = if !verbose > 1 then prerr_endline ("get_length : "^arg) ; let r = Length.main (MyLexing.from_string arg) in if !verbose > 2 then begin prerr_string ("get_length : "^arg^" -> ") ; prerr_endline (Length.pretty r) end ; r } hevea-2.30/htmllex.mll0000644004317100512160000002456213107043103014740 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) { open Lexeme let to_string = function | Open (_,_,txt) | Close (_,txt) | Text txt | Blanks txt -> txt | Eof -> "Eof" let cost = function | {tag=FONT ; attrs=attrs;_} -> (1,List.length attrs) | _ -> (1,0) module Make(C:DoOut.Config) = struct open Lexing module Out = DoOut.Make(C) let txt_level = ref 0 and txt_stack = MyStack.create "htmllex" let error msg _lb = raise (Emisc.LexError msg) let init table (s,t)= Hashtbl.add table s t ;; let block = Hashtbl.create 17 ;; List.iter (init block) ["center", () ; "div", (); "blockquote", () ; "h1", () ; "h2", () ;"h3", () ;"h4", () ;"h5", () ;"h6", () ; "pre", () ; "table", () ; "tr",() ; "td", () ; "th",() ; "ol",() ; "ul",(); "p",() ; "li",() ; "dl",() ; "dt", () ; "dd",() ; ] ;; let ptop () = if not (MyStack.empty txt_stack) then begin let pos = MyStack.top txt_stack in Location.print_this_fullpos pos ; prerr_endline "This opening tag is pending" end let warnings = ref true let check_nesting _lb name = try Hashtbl.find block (String.lowercase name) ; if !txt_level <> 0 && !warnings then begin Location.print_fullpos () ; prerr_endline ("Warning, block level element: "^name^" nested inside text-level element") ; ptop () end with | Not_found -> () let text = Hashtbl.create 17 ;; List.iter (init text) ["tt",TT ; "i",I ; "b",B ; "big",BIG ; "small",SMALL ; "strike",STRIKE ; "s",S ; "u",U ; "font",FONT ; "em",EM ; "strong",STRONG ; "dfn",DFN ; "code",CODE ; "samp",SAMP ; "kbd",KBD ; "var",VAR ; "cite",CITE ; "abbr",ABBR ; "acronym",ACRONYM ; "q",Q ; "sub",SUB ; "sup",SUP ; "a", A ; "span", SPAN ; "script", SCRIPT; "style", STYLE; ] ;; let is_textlevel name = try let _ = Hashtbl.find text (String.lowercase name) in true with | Not_found -> false let is_br name = "br" = (String.lowercase name) let is_basefont name = "basefont" = (String.lowercase name) let set_basefont attrs lb = List.iter (fun (name,v,_) -> match String.lowercase name,v with | "size",Some s -> begin try Emisc.basefont := int_of_string s with | _ -> error "BASEFONT syntax" lb end | _ -> ()) attrs let get_value lb = function | Some s -> s | _ -> error "Bad attribute syntax" lb let is_size_relative v = match v with | "xx-small" | "x-small" | "small" | "medium" | "large" | "x-large" | "xx-large" -> false | _ -> true let font_value lb v = let v = get_value lb v in try let k = String.index v ':' in let tag = String.sub v 0 k and v = String.sub v (k+1) (String.length v - (k+1)) in let tag = match String.lowercase tag with | "font-family" -> Ffamily | "font-style" -> Fstyle | "font-variant" -> Fvariant | "font-weight" -> Fweight | "font-size" -> (* Catch case 'font-size:xxx%' which does not commute (with other font-size styles *) if is_size_relative v then raise Exit else Fsize | "color" -> Fcolor | "background-color" -> Fbgcolor | _ -> raise Exit in begin (* checks just one style *) try ignore (String.index v ';') ; raise Exit with | Exit -> raise Exit | _ -> () end ; tag,v with _ -> raise Exit let norm_attrs lb attrs = List.map (fun (name,value,txt) -> match String.lowercase name with | "size" -> SIZE (get_value lb value),txt | "color" -> COLOR (get_value lb value),txt | "face" -> FACE (get_value lb value),txt | "style" -> begin try let st,v = font_value lb value in ASTYLE (st,v),txt with Exit -> OTHER,txt end | _ -> OTHER, txt) attrs let ouvre lb name attrs txt = let uname = String.lowercase name in try let tag = Hashtbl.find text uname in let attrs = norm_attrs lb attrs in incr txt_level ; MyStack.push txt_stack (Location.get_pos ()) ; Open (tag,attrs,txt) with | Not_found -> assert false and ferme _lb name txt = try let tag = Hashtbl.find text (String.lowercase name) in decr txt_level ; begin if not (MyStack.empty txt_stack) then let _ = MyStack.pop txt_stack in () end ; Close (tag,txt) with | Not_found -> Text txt let buff = Out.create_buff () and abuff = Out.create_buff () let put s = Out.put buff s and putc c = Out.put_char buff c let aput s = Out.put abuff s } let blank = [' ''\t''\n''\r'] let tag = ['a'-'z''A'-'Z''0'-'9']+ let class_name = ['a'-'z''A'-'Z''0'-'9''-']+ let attr_name = ['a'-'z''A'-'Z']['a'-'z''A'-'Z''-''0'-'9'':']* rule main = parse | (blank|" "|"&XA0;")+ as lxm {Blanks lxm} | "" '\n'? {put (lexeme lexbuf)} | _ as c {putc c ; in_comment lexbuf} | eof {error "End of file in comment" lexbuf} and styles = parse | blank+ { styles lexbuf } | eof { [] } | blank* '.' ([^'{'' ''\t''\n']+ as name) blank* ((tag blank*)+ as addname)? ('{' [^'}']* '}' as cl) { Css.Class (name, addname, cl) :: styles lexbuf } | blank* ([^'{']+ '{' [^'}']* '}' as lxm) {Css.Other lxm :: styles lexbuf} (* Extract classes: values of the CLASS attribute *) and extract_classes cls = parse | "" { () } | _ { skip_comment lexbuf } | eof { error "End of file in comment" lexbuf } and skip_tag = parse | [^'>']* '>' { () } | eof { error "End of file in tag" lexbuf } and skip_value = parse | '\'' [^'\'']* '\'' | '"' [^'"']* '"' | '#'?['a'-'z''A'-'Z''0'-'9''-''+''_'':''.']+ { () } | "" { error "Attribute syntax (skip_value)" lexbuf } (* '"' *) and extract_value cls = parse | ['a'-'z''A'-'Z''0'-'9''-''+''_'':''.']+ as name { Emisc.Strings.add name cls } | '\'' { extract_values_q cls lexbuf } | '"' (* '"' *) { extract_values_qq cls lexbuf } | "" { error "Attribute syntax (extract_value)" lexbuf } and extract_values_q cls = parse | blank+ { extract_values_q cls lexbuf } | class_name as cl { extract_values_q (Emisc.Strings.add cl cls) lexbuf } | '\'' { cls } | "" { error "Class value syntax" lexbuf } and extract_values_qq cls = parse | blank+ { extract_values_qq cls lexbuf } | class_name as cl { extract_values_qq (Emisc.Strings.add cl cls) lexbuf } | '"' { cls } (* '"' *) | "" { error "Class value syntax" lexbuf } and extract_attrs cls = parse (* Blanks or attributes with no value *) | blank+|['a'-'z''A'-'Z''-''0'-'9']+ { extract_attrs cls lexbuf } (* Class attribute *) | ['c''C']['l''L']['a''A']['s''S']['s''S'] blank* '=' blank* { let cls = extract_value cls lexbuf in extract_attrs cls lexbuf } (* Other attributes with a value *) | attr_name blank* '=' blank* { skip_value lexbuf ; extract_attrs cls lexbuf } (* End of tag *) | '/'? '>' { cls } | "" { error "Attribute syntax (extract_attrs)" lexbuf } { let tok_buff = ref None ;; let txt_buff = Out.create_buff () ;; let rec read_tokens blanks lb = let t = main lb in match t with | Text txt -> Out.put txt_buff txt ; read_tokens false lb | Blanks txt -> Out.put txt_buff txt ; read_tokens blanks lb | _ -> let txt = Out.to_string txt_buff in match txt with | "" -> t | _ -> tok_buff := Some t ; if blanks then Blanks txt else Text txt let reset () = txt_level := 0 ; MyStack.reset txt_stack ; Out.reset txt_buff ; Out.reset buff ; Out.reset abuff let next_token lb = try match !tok_buff with | Some t -> tok_buff := None ; t | None -> read_tokens true lb with | e -> reset () ; raise e let classes lexbuf = let r = extract_classes Emisc.Strings.empty lexbuf in r end } hevea-2.30/htmlCommon.ml0000644004317100512160000013441512330272101015222 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1998 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* Output function for a strange html model : - Text elements can occur anywhere and are given as in latex - A new grouping construct is given (open_group () ; close_group ()) *) open Misc open Element open MyStack open Length open Printf type block = | H1 | H2 | H3 | H4 | H5 | H6 | PRE | TABLE | TR | TD | DISPLAY of bool | DFLOW | QUOTE | BLOCKQUOTE | DIV | UL | OL | DL | LI | DD | DT | GROUP | AFTER | DELAY | FORGET | INTERN | P | NADA | OTHER of string let string_of_block = function | H1 -> "h1" | H2 -> "h2" | H3 -> "h3" | H4 -> "h4" | H5 -> "h5" | H6 -> "h6" | PRE -> "pre" | TABLE -> "table" | TR -> "tr" | TD -> "td" | DISPLAY false -> "display" | DISPLAY true -> "display (center)" | DFLOW -> "dflow" | QUOTE -> "quote" | BLOCKQUOTE -> "blockquote" | DIV -> "div" | UL -> "ul" | OL -> "ol" | DL -> "dl" | GROUP -> "" | AFTER -> "after" | DELAY -> "delay" | FORGET -> "forget" | P -> "p" | NADA -> "nada" | INTERN -> "intern" | LI -> "li" | DD -> "dd" | DT -> "dt" | OTHER s -> s let block_t = Hashtbl.create 17 let no_opt = false let add b = Hashtbl.add block_t (string_of_block b) b and add_verb s b = Hashtbl.add block_t s b let () = add H1 ; add H2 ; add H3 ; add H4 ; add H5 ; add H6 ; add PRE ; add TABLE ; add TR ; add TD ; add (DISPLAY false) ; add QUOTE ; add BLOCKQUOTE ; add DIV ; add UL ; add OL ; add DL ; begin if no_opt then Hashtbl.add block_t "" INTERN else add GROUP end ; add AFTER ; add DELAY ; add FORGET ; add P ; add NADA let failclose s b1 b2= raise (Misc.Close (s^": '"^string_of_block b1^"' closes '"^ string_of_block b2^"'")) let find_block s = let s = String.lowercase s in try Hashtbl.find block_t s with | Not_found -> OTHER s let eq_tags t1 t2 = match t1, t2 with | DISPLAY _, DISPLAY _ -> true | _, _ -> t1=t2 let check_block_closed opentag closetag = if not (eq_tags opentag closetag) && not (opentag = AFTER && closetag = GROUP) then failclose "html" closetag opentag let display_arg centering _verbose = let cl = if !displayverb then "vdisplay" else "display" in let cl = if centering then cl^(if !displayverb then " vdcenter" else " dcenter") else cl in let arg = "class=\""^cl^"\"" in arg (* output globals *) type t_env = {here : bool ; env : text} type t_top = {top_pending : text list ; top_active : t_env list ;} type style_info = | Nothing of t_top | Activate of t_top | Closed of t_top * int | ActivateClosed of t_top | NotMe | Insert of bool * text list let get_top_lists = function | Nothing x -> x | Activate x -> x | _ -> raise Not_found let do_pretty_mods stderr f mods = let rec do_rec stderr = function [x] -> f stderr x | x::xs -> Printf.fprintf stderr "%a; %a" f x do_rec xs | [] -> () in Printf.fprintf stderr "[%a]" do_rec mods let tbool = function | true -> "+" | false -> "-" let pretty_mods stderr = do_pretty_mods stderr (fun stderr text -> Printf.fprintf stderr "%s" (pretty_text text)) and pretty_tmods stderr = do_pretty_mods stderr (fun stderr {here=here ; env = env} -> Printf.fprintf stderr "%s%s" (tbool here) (pretty_text env)) let pretty_top_styles stderr {top_pending = pending ; top_active = active} = Printf.fprintf stderr "{top_pending=%a, top_active=%a}" pretty_mods pending pretty_tmods active let tbool = function | true -> "+" | false -> "-" let pretty_top stderr = function | Nothing x -> Printf.fprintf stderr "Nothing %a" pretty_top_styles x | Activate x -> Printf.fprintf stderr "Activate %a" pretty_top_styles x | Closed _ -> Printf.fprintf stderr "Closed" | ActivateClosed _ -> Printf.fprintf stderr "ActivateClosed" | NotMe -> Printf.fprintf stderr "NotMe" | Insert (b,active) -> Printf.fprintf stderr "Insert %s %a" (tbool b) pretty_mods active type status = { mutable nostyle : bool ; mutable pending : text list ; mutable active : t_env list ; mutable top : style_info ; mutable out : Out.t} let as_env {env=env} = env let as_envs tenvs r = List.fold_right (fun x r -> as_env x::r) tenvs r let to_pending pending active = pending @ as_envs active [] let with_new_out out = {out with out = Out.create_buff ()} let cur_out = ref {nostyle=false ; pending = [] ; active = [] ; top = NotMe ; out = Out.create_null ()} type stack_item = Normal of block * string * status | Freeze of (unit -> unit) exception PopFreeze let push_out s (a,b,c) = push s (Normal (a,b,c)) let pretty_stack s = MyStack.pretty (function Normal (s,args,_) -> "["^string_of_block s^"]-{"^args^"}" | Freeze _ -> "Freeze") s let pop_out s = match pop s with | Normal (a,b,c) -> a,b,c | Freeze _ -> raise PopFreeze and top_out s = match top s with | Normal (a,b,c) -> a,b,c | Freeze _ -> raise PopFreeze let out_stack = MyStack.create_init "out_stack" (Normal (NADA,"",!cur_out)) type saved_out = status * stack_item MyStack.saved let save_out () = !cur_out, MyStack.save out_stack and restore_out (a,b) = if !cur_out != a then begin MyStack.finalize out_stack (function | Normal (_,_,x) -> x == a | _ -> false) (function | Normal (_,_,_out) -> () | _ -> ()) end ; cur_out := a ; MyStack.restore out_stack b let pblock () = match MyStack.top out_stack with | Normal (s,_,_) -> s | _ -> NADA and p2block () = MyStack.top2 out_stack let do_put_char c = if !verbose > 3 then prerr_endline ("put_char: |"^String.escaped (String.make 1 c)^"|"); Out.put_char !cur_out.out c and do_put s = if !verbose > 3 then prerr_endline ("put: |"^String.escaped s^"|"); Out.put !cur_out.out s ; () (* Flags section *) (* Style information for caller *) type flags_t = { mutable table_inside:bool; mutable in_math : bool; mutable ncols:int; mutable empty:bool; mutable blank:bool; mutable saw_par: bool ; mutable vsize:int; mutable nrows:int; mutable table_vsize:int; mutable nitems:int; mutable dt:string; mutable dcount:string; mutable in_pre:bool; mutable insert: (block * string) option; mutable insert_attr: (block * string) option; } let pretty_cur {pending = pending ; active = active ; top = top} = Printf.fprintf stderr "pending=%a, active=%a\n" pretty_mods pending pretty_tmods active ; Printf.fprintf stderr "top = %a" pretty_top top ; prerr_endline "" let activate_top out = match out.top with | Nothing x -> out.top <- Activate x | _ -> () and close_top n out = match out.top with | Nothing top -> out.top <- Closed (top, n+Out.get_pos out.out) | Activate top -> out.top <- ActivateClosed top | _ -> () let debug_attr stderr = function | None -> Printf.fprintf stderr "None" | Some (tag,attr) -> Printf.fprintf stderr "'%s' '%s'" (string_of_block tag) attr let debug_flags f = Printf.fprintf stderr "attr=%a\n" debug_attr f.insert_attr ; flush stderr let flags = { table_inside = false; ncols = 0; in_math = false; empty = true; blank = true; saw_par = false ; vsize = 0; nrows = 0; table_vsize = 0; nitems = 0; dt = ""; dcount = ""; in_pre = false; insert = None; insert_attr = None; } let copy_flags { table_inside = table_inside; ncols = ncols; in_math = in_math; empty = empty; blank = blank; saw_par = saw_par ; vsize = vsize; nrows = nrows; table_vsize = table_vsize; nitems = nitems; dt = dt; dcount = dcount; in_pre = in_pre; insert = insert; insert_attr = insert_attr; } = { table_inside = table_inside; ncols = ncols; in_math = in_math; empty = empty; blank = blank; saw_par = saw_par ; vsize = vsize; nrows = nrows; table_vsize = table_vsize; nitems = nitems; dt = dt; dcount = dcount; in_pre = in_pre; insert = insert; insert_attr = insert_attr; } and set_flags f { table_inside = table_inside ; ncols = ncols; in_math = in_math; empty = empty; blank = blank; saw_par = saw_par ; vsize = vsize; nrows = nrows; table_vsize = table_vsize; nitems = nitems; dt = dt; dcount = dcount; in_pre = in_pre; insert = insert; insert_attr = insert_attr; } = f.table_inside <- table_inside; f.ncols <- ncols; f.in_math <- in_math; f.empty <- empty; f.blank <- blank; f.saw_par <- saw_par ; f.vsize <- vsize; f.nrows <- nrows; f.table_vsize <- table_vsize; f.nitems <- nitems; f.dt <- dt; f.dcount <- dcount; f.in_pre <- in_pre; f.insert <- insert ; f.insert_attr <- insert_attr ; (* Independant stacks for flags *) type stack_t = { s_table_inside : bool MyStack.t ; s_saved_inside : bool MyStack.t ; s_in_math : bool MyStack.t ; s_ncols : int MyStack.t ; s_empty : bool MyStack.t ; s_blank : bool MyStack.t ; s_saw_par : bool MyStack.t ; s_vsize : int MyStack.t ; s_nrows : int MyStack.t ; s_table_vsize : int MyStack.t ; s_nitems : int MyStack.t ; s_dt : string MyStack.t ; s_dcount : string MyStack.t ; s_insert : (block * string) option MyStack.t ; s_insert_attr : (block * string) option MyStack.t ; (* Other stacks, not corresponding to flags *) s_active : Out.t MyStack.t ; s_after : (string -> string) MyStack.t } let stacks = { s_table_inside = MyStack.create "inside" ; s_saved_inside = MyStack.create "saved_inside" ; s_in_math = MyStack.create_init "in_math" false ; s_ncols = MyStack.create "ncols" ; s_empty = MyStack.create_init "empty" false; s_blank = MyStack.create_init "blank" false ; s_saw_par = MyStack.create "saw_par" ; s_vsize = MyStack.create "vsize" ; s_nrows = MyStack.create_init "nrows" 0 ; s_table_vsize = MyStack.create_init "table_vsize" 0 ; s_nitems = MyStack.create_init "nitems" 0 ; s_dt = MyStack.create_init "dt" "" ; s_dcount = MyStack.create_init "dcount" "" ; s_insert = MyStack.create_init "insert" None; s_insert_attr = MyStack.create_init "insert_attr" None; s_active = MyStack.create "Html.active" ; s_after = MyStack.create "Html.after" } type saved_stacks = { ss_table_inside : bool MyStack.saved ; ss_saved_inside : bool MyStack.saved ; ss_in_math : bool MyStack.saved ; ss_ncols : int MyStack.saved ; ss_empty : bool MyStack.saved ; ss_blank : bool MyStack.saved ; ss_saw_par : bool MyStack.saved ; ss_vsize : int MyStack.saved ; ss_nrows : int MyStack.saved ; ss_table_vsize : int MyStack.saved ; ss_nitems : int MyStack.saved ; ss_dt : string MyStack.saved ; ss_dcount : string MyStack.saved ; ss_insert : (block * string) option MyStack.saved ; ss_insert_attr : (block * string) option MyStack.saved ; (* Other stacks, not corresponding to flags *) ss_active : Out.t MyStack.saved ; ss_after : (string -> string) MyStack.saved } let save_stacks () = { ss_table_inside = MyStack.save stacks.s_table_inside ; ss_saved_inside = MyStack.save stacks.s_saved_inside ; ss_in_math = MyStack.save stacks.s_in_math ; ss_ncols = MyStack.save stacks.s_ncols ; ss_empty = MyStack.save stacks.s_empty ; ss_blank = MyStack.save stacks.s_blank ; ss_saw_par = MyStack.save stacks.s_saw_par ; ss_vsize = MyStack.save stacks.s_vsize ; ss_nrows = MyStack.save stacks.s_nrows ; ss_table_vsize = MyStack.save stacks.s_table_vsize ; ss_nitems = MyStack.save stacks.s_nitems ; ss_dt = MyStack.save stacks.s_dt ; ss_dcount = MyStack.save stacks.s_dcount ; ss_insert = MyStack.save stacks.s_insert ; ss_insert_attr = MyStack.save stacks.s_insert_attr ; ss_active = MyStack.save stacks.s_active ; ss_after = MyStack.save stacks.s_after } and restore_stacks { ss_table_inside = saved_table_inside ; ss_saved_inside = saved_saved_inside ; ss_in_math = saved_in_math ; ss_ncols = saved_ncols ; ss_empty = saved_empty ; ss_blank = saved_blank ; ss_saw_par = saved_saw_par ; ss_vsize = saved_vsize ; ss_nrows = saved_nrows ; ss_table_vsize = saved_table_vsize ; ss_nitems = saved_nitems ; ss_dt = saved_dt ; ss_dcount = saved_dcount ; ss_insert = saved_insert ; ss_insert_attr = saved_insert_attr ; ss_active = saved_active ; ss_after = saved_after } = MyStack.restore stacks.s_table_inside saved_table_inside ; MyStack.restore stacks.s_saved_inside saved_saved_inside ; MyStack.restore stacks.s_in_math saved_in_math ; MyStack.restore stacks.s_ncols saved_ncols ; MyStack.restore stacks.s_empty saved_empty ; MyStack.restore stacks.s_blank saved_blank ; MyStack.restore stacks.s_saw_par saved_saw_par ; MyStack.restore stacks.s_vsize saved_vsize ; MyStack.restore stacks.s_nrows saved_nrows ; MyStack.restore stacks.s_table_vsize saved_table_vsize ; MyStack.restore stacks.s_nitems saved_nitems ; MyStack.restore stacks.s_dt saved_dt ; MyStack.restore stacks.s_dcount saved_dcount ; MyStack.restore stacks.s_insert saved_insert ; MyStack.restore stacks.s_insert_attr saved_insert_attr ; MyStack.restore stacks.s_active saved_active ; MyStack.restore stacks.s_after saved_after let check_stack what = if not (MyStack.empty what) && not !silent then begin prerr_endline ("Warning: stack "^MyStack.name what^" is non-empty in Html.finalize") ; end let check_stacks () = match stacks with { s_table_inside = s_table_inside ; s_saved_inside = s_saved_inside ; s_in_math = s_in_math ; s_ncols = s_ncols ; s_empty = s_empty ; s_blank = s_blank ; s_saw_par = s_saw_par ; s_vsize = s_vsize ; s_nrows = s_nrows ; s_table_vsize = s_table_vsize ; s_nitems = s_nitems ; s_dt = s_dt ; s_dcount = s_dcount ; s_insert = s_insert ; s_insert_attr = s_insert_attr ; s_active = s_active ; s_after = s_after } -> check_stack s_table_inside ; check_stack s_saved_inside ; check_stack s_in_math ; check_stack s_ncols ; check_stack s_empty ; check_stack s_blank ; check_stack s_saw_par ; check_stack s_vsize ; check_stack s_nrows ; check_stack s_table_vsize ; check_stack s_nitems ; check_stack s_dt ; check_stack s_dcount ; check_stack s_insert ; check_stack s_insert_attr ; check_stack s_active ; check_stack s_after (* Full state saving *) type saved = flags_t * saved_stacks * saved_out let check () = let saved_flags = copy_flags flags and saved_stacks = save_stacks () and saved_out = save_out () in saved_flags, saved_stacks, saved_out and hot (f,s,o) = set_flags flags f ; restore_stacks s ; restore_out o let sbool = function true -> "true" | _ -> "false" let prerr_flags s = prerr_endline ("<"^string_of_int (MyStack.length stacks.s_empty)^"> "^s^ " empty="^sbool flags.empty^ " blank="^sbool flags.blank^ " table="^sbool flags.table_inside) let is_header = function | H1 | H2 | H3 | H4 | H5 | H6 -> true | _ -> false let is_list = function UL | DL | OL -> true | _ -> false let string_of_into = function | Some n -> "+"^string_of_int n | None -> "-" (* styles *) let trim_quotes s = (* used for ensuring colors are passed without "" *) let (i, l) = if s.[0] = '"' then (1, String.length s - 2) else (0, String.length s) in String.sub s i l (* '"' *) let size_html5 = function | 1 -> "xx-small" | 2 -> "small" | 3 -> "medium" | 4 -> "large" | 5 -> "x-large" | 6 -> "xx-large" | 7 -> "xx-large" | _ -> raise (Misc.fatal "size_html5") let do_close_mod = function | Style m -> if flags.in_math && !Parse_opts.mathml then if m="mtext" then do_put ("") else do_put "" else do_put ("") | StyleAttr (t,_) -> if flags.in_math && !Parse_opts.mathml then () else do_put ("") | (Color _ | Font _) -> if flags.in_math && !Parse_opts.mathml then do_put "" else do_put "" and do_open_mod e = if !verbose > 3 then prerr_endline ("do_open_mod: "^pretty_text e) ; match e with | Style m -> if flags.in_math && !Parse_opts.mathml then if m="mtext" then do_put ("<"^m^">") else do_put (" "font-weight: bold " | "i" -> "font-style: italic " | "tt" -> "font-family: monospace " | "em" -> "font-style: italic " | _ -> m)^ "\">") else do_put ("<"^m^">") | StyleAttr (t,a) -> if flags.in_math && !Parse_opts.mathml then () else do_put ("<"^t^" "^a^">") | Font i -> if flags.in_math && !Parse_opts.mathml then do_put ("") else (* Convert size from 1 to 7 in percentage, following standard *) do_put (sprintf "" (size_html5 i)) | Color s -> if flags.in_math && !Parse_opts.mathml then do_put ("") else do_put (sprintf "" (trim_quotes s)) let do_close_tmod = function | {here = true ; env = env} -> do_close_mod env | _ -> () let close_active_mods active = List.iter do_close_tmod active let do_close_mods () = close_active_mods !cur_out.active ; !cur_out.active <- [] ; !cur_out.pending <- [] let do_close_mods_pred pred same_constr = let tpred {env=env} = pred env in let rec split_again = function | [] -> [],None,[] | {here = false ; env=env} :: rest when same_constr env && not (pred env) -> [],Some env,rest | m :: rest -> let to_close,to_open,to_keep = split_again rest in match to_open with | Some _ -> m::to_close,to_open,to_keep | None -> to_close,to_open,m::to_keep in let rec split = function | [] -> [],None,[] | m :: rest -> let to_close,close,to_keep = split rest in match close with | None -> if tpred m then if m.here then [],Some m.env,to_keep else [],None,to_keep else [], None, m::to_keep | Some _ -> m::to_close,close,to_keep in let rec filter_pred = function | [] -> [] | x :: rest -> if pred x then filter_pred rest else x::filter_pred rest in let to_close,close,to_keep = split !cur_out.active in filter_pred (match close with | None -> [] | Some env -> List.iter do_close_tmod to_close ; do_close_mod env ; let (to_close_open,to_open,to_keep) = split_again to_keep in begin match to_open with | None -> !cur_out.active <- to_keep ; as_envs to_close [] | Some env -> !cur_out.active <- to_keep ; List.iter do_close_tmod to_close_open ; as_envs to_close (as_envs to_close_open [env]) end), close let close_mods () = do_close_mods () let is_style = function | Style _|StyleAttr (_,_) -> true | _ -> false and is_font = function Font _ -> true | _ -> false and is_color = function Color _ -> true | _ -> false let do_open_these_mods do_open_mod pending = let rec do_rec color size = function | [] -> [] | Color _ as e :: rest -> if color then let rest = do_rec true size rest in {here=false ; env=e}::rest else begin let rest = do_rec true size rest in do_open_mod e ; {here=true ; env=e}::rest end | Font _ as e :: rest -> if size then let rest = do_rec color true rest in {here=false ; env=e}::rest else let rest = do_rec color true rest in do_open_mod e ; {here=true ; env=e}::rest | e :: rest -> let rest = do_rec color size rest in do_open_mod e ; {here=true ; env=e} :: rest in do_rec false false pending let activate caller pending = let r = do_open_these_mods (fun _ -> ()) pending in if !verbose > 2 then begin prerr_string ("activate: ("^caller^")") ; pretty_mods stderr pending ; prerr_string " -> " ; pretty_tmods stderr r ; prerr_endline "" end ; r let get_top_active = function | Nothing {top_active = active} -> active | Activate {top_pending = pending ; top_active = active} -> activate "get_top_active" pending @ active | _ -> [] let all_to_pending out = try let top = get_top_lists out.top in to_pending out.pending out.active @ to_pending top.top_pending top.top_active with | Not_found -> to_pending out.pending out.active let all_to_active out = activate "all_to_active" (all_to_pending out) (* Clear styles *) let clearstyle () = close_active_mods !cur_out.active ; close_active_mods (get_top_active !cur_out.top) ; close_top 0 !cur_out ; !cur_out.pending <- [] ; !cur_out.active <- [] (* Avoid styles *) let nostyle () = clearstyle () ; !cur_out.nostyle <- true (* Create new statuses, with appropriate pending lists *) let create_status_from_top out = match out.top with | NotMe|Closed _|ActivateClosed _|Insert (_,_) -> {nostyle=out.nostyle ; pending = [] ; active = [] ; top = Nothing {top_pending = out.pending ; top_active = out.active} ; out = Out.create_buff ()} | Nothing {top_pending = top_pending ; top_active=top_active} -> assert (out.active=[]) ; {nostyle=out.nostyle ; pending = [] ; active = [] ; top = Nothing {top_pending = out.pending @ top_pending ; top_active = top_active} ; out = Out.create_buff ()} | Activate {top_pending = top_pending ; top_active=top_active} -> {nostyle=out.nostyle ; pending = [] ; active = [] ; top= Nothing {top_pending = out.pending ; top_active = out.active @ activate "top" top_pending @ top_active} ; out=Out.create_buff ()} let create_status_from_scratch nostyle pending = {nostyle=nostyle ; pending =pending ; active = [] ; top=NotMe ; out = Out.create_buff ()} let do_open_mods () = if !verbose > 2 then begin prerr_string "=> do_open_mods: " ; pretty_cur !cur_out end ; let now_active = do_open_these_mods do_open_mod !cur_out.pending in activate_top !cur_out ; !cur_out.active <- now_active @ !cur_out.active ; !cur_out.pending <- [] ; if !verbose > 2 then begin prerr_string "<= do_open_mods: " ; pretty_cur !cur_out end let do_pending () = do_open_mods () let one_cur_size pending active = let rec cur_size_active = function | [] -> raise Not_found | {here=true ; env=Font i}::_ -> i | _::rest -> cur_size_active rest in let rec cur_size_pending = function | [] -> cur_size_active active | Font i::_ -> i | _::rest -> cur_size_pending rest in cur_size_pending pending let cur_size out = try one_cur_size out.pending out.active with Not_found -> try let top_out = get_top_lists out.top in one_cur_size top_out.top_pending top_out.top_active with Not_found -> 3 let one_first_same x same_constr pending active = let rec same_active = function | {here=true ; env=y} :: rest -> if same_constr y then x=y else same_active rest | _::rest -> same_active rest | [] -> raise Not_found in let rec same_pending = function | [] -> same_active active | y::rest -> if same_constr y then x=y else same_pending rest in same_pending pending let first_same x same_constr out = try one_first_same x same_constr out.pending out.active with Not_found -> try let top_out = get_top_lists out.top in one_first_same x same_constr top_out.top_pending top_out.top_active with | Not_found -> false let already_here = function | Font i -> i = cur_size !cur_out | x -> first_same x (match x with Style _|StyleAttr (_,_) -> is_style | Font _ -> is_font | Color _ -> is_color) !cur_out let ok_pre x = match x with | Color _ | Font _ | Style "sub" | Style "sup" -> not !Parse_opts.pedantic | _ -> true let rec filter_pre = function [] -> [] | e::rest -> if ok_pre e then e::filter_pre rest else filter_pre rest let ok_mod e = (not flags.in_pre || ok_pre e) && (not (already_here e)) let get_fontsize () = cur_size !cur_out let rec erase_rec pred = function [] -> None | s::rest -> if pred s then Some rest else match erase_rec pred rest with | Some rest -> Some (s::rest) | None -> None let erase_mod_pred pred same_constr = if not !cur_out.nostyle then begin match erase_rec pred !cur_out.pending with | Some pending -> !cur_out.pending <- pending | None -> let re_open,closed = do_close_mods_pred pred same_constr in match closed with | Some _ -> !cur_out.pending <- !cur_out.pending @ re_open | None -> activate_top !cur_out ; try let tops = get_top_lists !cur_out.top in !cur_out.active <- !cur_out.active @ activate "erase" tops.top_pending @ tops.top_active ; close_top 0 !cur_out ; let re_open,_ = do_close_mods_pred pred same_constr in !cur_out.pending <- !cur_out.pending @ re_open with | Not_found -> () end let same_env = function | Style s1 -> (function | Style s2 -> s1 = s2 | _ -> false) | StyleAttr (t1,a1) -> (function | StyleAttr (t2,a2)-> t1 = t2 && a1=a2 | _ -> false) | Font i1 -> (function | Font i2 -> i1 = i2 | _ -> false) | Color s1 -> (function | Color s2 -> s1 = s2 | _ -> false) and same_constr = function | Color _ -> is_color | Font _ -> is_font | Style _|StyleAttr (_,_) -> is_style let erase_mods ms = let rec erase_rec = function | [] -> () | m :: ms -> erase_mod_pred (same_env m) (same_constr m) ; erase_rec ms in erase_rec ms let open_mod m = if not !cur_out.nostyle then begin if !verbose > 3 then begin prerr_endline ("=> open_mod: "^pretty_text m^" ok="^sbool (ok_mod m)) ; pretty_cur !cur_out end ; begin match m with | Style "em" -> if already_here m then erase_mods [m] else !cur_out.pending <- m :: !cur_out.pending | _ -> if ok_mod m then begin !cur_out.pending <- m :: !cur_out.pending end end ; if !verbose > 3 then begin prerr_endline ("<= open_mod: "^pretty_text m) ; pretty_cur !cur_out end ; end let rec open_mods = function m::rest -> open_mods rest ; open_mod m | [] -> () let has_mod m = already_here m (* Blocks *) let pstart = function | H1 | H2 | H3 | H4 | H5 | H6 | PRE | DIV | BLOCKQUOTE | UL | OL | DL | TABLE -> true | _ -> false let transmit_par s = match s with | GROUP|AFTER|INTERN|DFLOW|P|LI -> false | _ -> true let is_group = function | GROUP -> true | _ -> false and transmit_par_or_par = function | P -> true | s -> transmit_par s and is_pre = function | PRE -> true | _ -> false let rec do_try_open_block s = if !verbose > 2 then prerr_flags ("=> try open '"^string_of_block s^"'"); begin match s with | DISPLAY _ -> do_try_open_block TABLE ; do_try_open_block TR | _ -> push stacks.s_empty flags.empty ; push stacks.s_blank flags.blank ; push stacks.s_insert flags.insert ; push stacks.s_saw_par flags.saw_par ; flags.empty <- true ; flags.blank <- true ; flags.insert <- None ; flags.saw_par <- false ; begin match s with | PRE -> flags.in_pre <- true (* No stack, cannot nest *) | TABLE -> push stacks.s_table_vsize flags.table_vsize ; push stacks.s_vsize flags.vsize ; push stacks.s_nrows flags.nrows ; flags.table_vsize <- 0 ; flags.vsize <- 0 ; flags.nrows <- 0 | TR -> flags.vsize <- 1 | TD -> push stacks.s_vsize flags.vsize ; flags.vsize <- 1 | _ -> if is_list s then begin push stacks.s_nitems flags.nitems; flags.nitems <- 0 ; if s = DL then begin push stacks.s_dt flags.dt ; push stacks.s_dcount flags.dcount; flags.dt <- ""; flags.dcount <- "" end end end end ; if !verbose > 2 then prerr_flags ("<= try open '"^string_of_block s^"'") let try_open_block s _ = push stacks.s_insert_attr flags.insert_attr ; begin match flags.insert_attr with | Some (TR,_) when s <> TR -> () | _ -> flags.insert_attr <- None end ; do_try_open_block s let do_do_open_block s args = do_put_char '<' ; do_put (string_of_block s) ; if args <> "" then begin if args.[0] <> ' ' then do_put_char ' ' ; do_put args end ; do_put_char '>' let rec do_open_block insert s args = match s with | GROUP|DELAY|FORGET|AFTER|INTERN|DFLOW -> begin match insert with | Some (tag,iargs) -> do_do_open_block tag iargs | _ -> () end | DISPLAY centering -> do_open_block insert TABLE (display_arg centering !verbose) ; do_open_block None TR args | _ -> begin match insert with | Some (tag,iargs) -> if is_list s || s = TABLE || s = P then begin do_do_open_block tag iargs ; do_do_open_block s args end else begin do_do_open_block s args ; do_do_open_block tag iargs end | _ -> do_do_open_block s args end let rec do_try_close_block s = if !verbose > 2 then prerr_flags ("=> try close '"^string_of_block s^"'") ; begin match s with | DISPLAY _ -> do_try_close_block TR ; do_try_close_block TABLE | _ -> let ehere = flags.empty and ethere = pop stacks.s_empty in flags.empty <- (ehere && ethere) ; let bhere = flags.blank and bthere = pop stacks.s_blank in flags.blank <- (bhere && bthere) ; flags.insert <- pop stacks.s_insert ; flags.saw_par <- pop stacks.s_saw_par ; begin match s with | PRE -> flags.in_pre <- false (* PRE cannot nest *) | TABLE -> let p_vsize = pop stacks.s_vsize in flags.vsize <- max (flags.table_vsize + (flags.nrows+1)/3) p_vsize ; flags.nrows <- pop stacks.s_nrows ; flags.table_vsize <- pop stacks.s_table_vsize | TR -> if ehere then begin flags.vsize <- 0 end ; flags.table_vsize <- flags.table_vsize + flags.vsize; if not ehere then flags.nrows <- flags.nrows + 1 | TD -> let p_vsize = pop stacks.s_vsize in flags.vsize <- max p_vsize flags.vsize | _ -> if is_list s then begin flags.nitems <- pop stacks.s_nitems ; if s = DL then begin flags.dt <- pop stacks.s_dt ; flags.dcount <- pop stacks.s_dcount end end end end ; if !verbose > 2 then prerr_flags ("<= try close '"^string_of_block s^"'") let try_close_block s = begin match flags.insert_attr with | Some (tag,_) when tag = s -> flags.insert_attr <- pop stacks.s_insert_attr | _ -> match pop stacks.s_insert_attr with | None -> () | Some (_,_) as x -> flags.insert_attr <- x end ; do_try_close_block s let do_do_close_block s = do_put "' ; match s with TR -> do_put_char '\n' | _ -> () let rec do_close_block insert s = match s with | GROUP|DELAY|FORGET|AFTER|INTERN|DFLOW -> begin match insert with | Some (tag,_) -> do_do_close_block tag | _ -> () end | DISPLAY _ -> do_close_block None TR ; do_close_block insert TABLE | s -> begin match insert with | Some (tag,_) -> if is_list s || s = TABLE || s = P then begin do_do_close_block s; do_do_close_block tag end else begin do_do_close_block tag; do_do_close_block s end | _ -> do_do_close_block s end let check_empty () = flags.empty and make_empty () = flags.empty <- true ; flags.blank <- true ; flags.table_inside <- false ; !cur_out.top <- NotMe ; !cur_out.pending <- to_pending !cur_out.pending !cur_out.active ; !cur_out.active <- [] let check_blank () = flags.blank let no_check () = false let rec open_top_styles = function | NotMe|Insert (_,_) -> (* Real block, inserted block *) begin match !cur_out.top with | Nothing tops -> let mods = to_pending !cur_out.pending !cur_out.active @ to_pending tops.top_pending tops.top_active in assert (!cur_out.active=[]) ; close_active_mods tops.top_active ; !cur_out.top <- Closed (tops,Out.get_pos !cur_out.out); Some mods | Activate tops -> !cur_out.top <- ActivateClosed tops ; let mods = to_pending !cur_out.pending !cur_out.active @ to_pending tops.top_pending tops.top_active in close_active_mods !cur_out.active ; close_active_mods (activate "open_top_styles" tops.top_pending) ; close_active_mods tops.top_active ; Some mods | _ -> let mods = to_pending !cur_out.pending !cur_out.active in close_active_mods !cur_out.active ; Some mods end | Closed (_,n) -> (* Group that closed top_styles (all of them) *) let out = !cur_out in let mods = all_to_pending out in close_top n out ; Some mods | Nothing _ -> (* Group with nothing to do *) None | Activate _ -> (* Just activate styles *) do_open_mods () ; None | ActivateClosed tops -> do_open_mods () ; let r = open_top_styles (Closed (tops,Out.get_pos !cur_out.out)) in r let rec force_block s content = if !verbose > 2 then begin prerr_endline ("=> force_block: ["^string_of_block s^"]"); pretty_stack out_stack ; pretty_cur !cur_out ; Out.debug stderr !cur_out.out ; prerr_newline () end ; let pempty = top stacks.s_empty in if s = FORGET then begin make_empty () ; end else begin begin match s with | TABLE|DISPLAY _ -> flags.table_inside <- true | _ -> () end ; if flags.empty then begin flags.empty <- false; flags.blank <- false ; do_open_mods () ; do_put content end ; (* check pending display material in DFLOW More precisely * closed block s, has a table inside * previous block is DFLOW, with some pending material (pempty = false) A Freeze can be present, then the previous block is DFLOW Then, we need to flush the pending material... *) if not pempty && flags.table_inside then begin let p2 = p2block () in match p2 with | (Normal (DFLOW,_,_)) | Freeze _ -> let _,_,pout = top_out out_stack in if !verbose > 2 then begin Printf.eprintf "CLOSING: '%s': " (string_of_block s) ; Out.debug stderr pout.out ; pretty_stack out_stack ; prerr_endline "" end ; let saved_flags = copy_flags flags in try_close_block s ; let a,b,pout = pop_out out_stack in let saved_out = !cur_out in cur_out := pout ; let fo = match p2 with | Normal (_,_,_) -> force_block DFLOW "" ; None | Freeze f -> let _ = pop out_stack in force_block DFLOW "" ; Some (f) in let _,args,_ = top_out out_stack in force_block TD "" ; open_block TD args ; open_block DFLOW "" ; begin match fo with | Some f -> push out_stack (Freeze f) | None -> () end ; push_out out_stack (a,b,!cur_out) ; try_open_block s b ; cur_out := saved_out ; set_flags flags saved_flags ; flags.ncols <- flags.ncols + 1 | _ -> () end else if !verbose > 2 && not pempty && flags.table_inside then begin Printf.eprintf "NOT CLOSING: '%s': " (string_of_block s) ; pretty_stack out_stack ; let _,_,pout = top_out out_stack in Out.debug stderr pout.out ; prerr_newline () end end ; let true_s = if s = FORGET then pblock() else s in let insert = flags.insert and insert_attr = flags.insert_attr and was_top = !cur_out.top in do_close_mods () ; try_close_block true_s ; do_close_block insert true_s ; let ps,args,pout = pop_out out_stack in check_block_closed ps true_s ; let old_out = !cur_out in cur_out := pout ; if s = FORGET then () else if ps <> DELAY then begin let mods = open_top_styles was_top in do_open_block insert ps (match insert_attr with | Some (this_tag,attr) when this_tag = s -> args^" "^attr | _ -> args) ; begin match was_top with | Insert (_,mods) -> ignore (do_open_these_mods do_open_mod mods) | _ -> () end ; (* prerr_endline "****** NOW *******" ; pretty_cur !cur_out ; Out.debug stderr old_out.out ; prerr_endline "\n**********" ; *) if ps = AFTER then begin let f = pop stacks.s_after in Out.copy_fun f old_out.out !cur_out.out end else begin Out.copy old_out.out !cur_out.out end ; begin match mods with | Some mods -> !cur_out.active <- [] ; !cur_out.pending <- mods | _ -> () end end else begin (* ps = DELAY *) raise (Misc.Fatal ("html: unflushed DELAY")) end ; if !verbose > 2 then begin prerr_endline ("<= force_block: ["^string_of_block s^"]"); pretty_cur !cur_out end and close_block_loc pred s = if !verbose > 2 then prerr_string ("close_block_loc: '"^string_of_block s^"' = "); if not (pred ()) then begin if !verbose > 2 then prerr_endline "do it" ; force_block s ""; true end else begin if !verbose > 2 then prerr_endline "forget it" ; force_block FORGET ""; false end and open_block s args = if !verbose > 2 then begin prerr_endline ("=> open_block '"^string_of_block s^"'"^" arg="^args); pretty_cur !cur_out ; end ; push_out out_stack (s,args,!cur_out) ; cur_out := begin if false && is_group s then create_status_from_top !cur_out else create_status_from_scratch !cur_out.nostyle (let cur_mods = all_to_pending !cur_out in if flags.in_pre || is_pre s then filter_pre cur_mods else cur_mods) end ; try_open_block s args ; if !verbose > 2 then begin prerr_endline ("<= open_block '"^string_of_block s^"'"); pretty_cur !cur_out ; end and close_flow_loc check_empty s = if !verbose > 2 then prerr_endline ("close_flow_loc: "^string_of_block s) ; let active = !cur_out.active and pending = !cur_out.pending in if close_block_loc check_empty s then begin !cur_out.pending <- to_pending pending active ; true end else begin !cur_out.pending <- to_pending pending active ; false end let close_flow s = assert (s <> GROUP) ; if !verbose > 2 then prerr_flags ("=> close_flow '"^string_of_block s^"'"); let _ = close_flow_loc check_empty s in if !verbose > 2 then prerr_flags ("<= close_flow '"^string_of_block s^"'") let insert_block tag arg = begin match !cur_out.top with | Nothing {top_pending=pending ; top_active=active} -> !cur_out.pending <- !cur_out.pending @ to_pending pending active ; assert (!cur_out.active = []) ; !cur_out.top <- Insert (false,[]) | Activate {top_pending=pending ; top_active=active} -> let add_active = activate "insert_block" pending @ active in !cur_out.active <- !cur_out.active @ add_active ; !cur_out.top <- Insert (true,to_pending [] add_active) | Closed (_,n) -> Out.erase_start n !cur_out.out ; !cur_out.top <- Insert (false,[]) | ActivateClosed {top_active=active ; top_pending=pending}-> !cur_out.top <- Insert (false,to_pending pending active) | NotMe | Insert _ -> () end ; flags.insert <- Some (tag,arg) let insert_attr tag attr = match tag,flags.insert_attr with | TD, Some (TR,_) -> () | _, _ -> flags.insert_attr <- Some (tag,attr) let close_block s = let _ = close_block_loc check_empty s in () let erase_block s = if !verbose > 2 then begin Printf.fprintf stderr "erase_block: %s" (string_of_block s); prerr_newline () end ; try_close_block s ; let ts,_,tout = pop_out out_stack in if ts <> s then failclose "erase_block" s ts; cur_out := tout let open_group ss = let e = Style ss in if no_opt || (ss <> "" && (not flags.in_pre || (ok_pre e))) then begin open_block INTERN "" ; if ss <> "" then !cur_out.pending <- !cur_out.pending @ [e] end else open_block GROUP "" and open_aftergroup f = open_block AFTER "" ; flags.empty <- false ; push stacks.s_after f and close_group () = match pblock () with | INTERN -> close_block INTERN | DFLOW -> close_block DFLOW | AFTER -> force_block AFTER "" | _ -> close_block GROUP and erase_group () = match pblock () with | INTERN -> erase_block INTERN | DFLOW -> erase_block DFLOW | AFTER -> erase_block AFTER | _ -> erase_block GROUP (* output requests *) let is_blank = function | ' ' | '\n' -> true | _ -> false let put s = let block = pblock () in match block with | TABLE|TR -> () | _ -> let s_blank = let r = ref true in for i = 0 to String.length s - 1 do r := !r && is_blank (String.unsafe_get s i) done ; !r in do_pending () ; flags.empty <- false; flags.blank <- s_blank && flags.blank ; do_put s let put_char c = let s = pblock () in match s with | TABLE|TR -> () | _ -> let c_blank = is_blank c in do_pending () ; flags.empty <- false; flags.blank <- c_blank && flags.blank ; do_put_char c let flush_out () = Out.flush !cur_out.out let skip_line () = flags.vsize <- flags.vsize + 1 ; put "
\n" let put_length which = function | Pixel x -> put (which^string_of_int x) | Char x -> put (which^string_of_int (Length.font * x)) | Percent x -> put (which ^ string_of_int x ^ "%") | Default -> () | No s -> raise (Misc.Fatal ("No-length '"^s^"' in outManager")) let horizontal_line attr width height = open_block GROUP "" ; nostyle () ; put " () | _ -> put_char ' ' ; put attr end ; begin match width,height with | Default,Default -> put_char '>' | _,_ -> put " style=\""; put_length "width:" width; if width <> Default then put ";"; put_length "height:" height; put "\">" end ; close_block GROUP let line_in_table () = (* put "
" ; *) put "
" ; flags.vsize <- flags.vsize - 1 let freeze f = push out_stack (Freeze f) ; if !verbose > 2 then begin prerr_string "freeze: stack=" ; pretty_stack out_stack end let flush_freeze () = match top out_stack with Freeze f -> let _ = pop out_stack in if !verbose > 2 then begin prerr_string "flush_freeze" ; pretty_stack out_stack end ; f () ; true | _ -> false let pop_freeze () = match top out_stack with Freeze f -> let _ = pop out_stack in f,true | _ -> (fun () -> ()),false let try_open_display () = push stacks.s_ncols flags.ncols ; push stacks.s_table_inside flags.table_inside ; push stacks.s_saved_inside false ; flags.table_inside <- false ; flags.ncols <- 0 and try_close_display () = flags.ncols <- pop stacks.s_ncols ; flags.table_inside <- pop stacks.s_saved_inside || flags.table_inside ; flags.table_inside <- pop stacks.s_table_inside || flags.table_inside let get_block s args = if !verbose > 2 then begin prerr_flags "=> get_block"; end ; do_close_mods () ; let pempty = top stacks.s_empty and pblank = top stacks.s_blank and pinsert = top stacks.s_insert in try_close_block (pblock ()) ; flags.empty <- pempty ; flags.blank <- pblank ; flags.insert <- pinsert; do_close_block None s ; let _,_,pout = pop_out out_stack in let old_out = !cur_out in cur_out := with_new_out pout ; let mods = as_envs !cur_out.active !cur_out.pending in do_close_mods () ; do_open_block None s args ; Out.copy old_out.out !cur_out.out ; !cur_out.pending <- mods ; let r = !cur_out in cur_out := pout ; if !verbose > 2 then begin Out.debug stderr r.out ; prerr_endline ""; prerr_flags "<= get_block" end ; r let hidden_to_string f = (* prerr_string "to_string: " ; Out.debug stderr !cur_out.out ; prerr_endline "" ; *) let old_flags = copy_flags flags in open_block INTERN "" ; f () ; do_close_mods () ; let flags_now = copy_flags flags in let r = Out.to_string !cur_out.out in flags.empty <- true ; close_block INTERN ; set_flags flags old_flags ; r,flags_now let to_string f = let r,_ = hidden_to_string f in r hevea-2.30/LICENSE0000644004317100512160000007422312030055774013574 0ustar marangetcristal All source files marked "Copyright INRIA" in this distribution are distributed under the terms of the Q Public License version 1.0 (included below). Binary versions of this software include some parts of the Objective Caml runtime system, which is distributed under the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE Version 2. (included below) Sources for Objective Caml runtime system are available at http://caml.inria.fr/ocaml/distrib.html ---------------------------------------------------------------------- As a special exception to the Q Public Licence, you may develop application programs, reusable components and other software items that link with the original or modified versions of the Software and are not made available to the general public, without any of the additional requirements listed in clause 6c of the Q Public licence. THE Q PUBLIC LICENSE version 1.0 Copyright (C) 1999 Troll Tech AS, Norway. Everyone is permitted to copy and distribute this license document. The intent of this license is to establish freedom to share and change the software regulated by this license under the open source model. This license applies to any software containing a notice placed by the copyright holder saying that it may be distributed under the terms of the Q Public License version 1.0. Such software is herein referred to as the Software. This license covers modification and distribution of the Software, use of third-party application programs based on the Software, and development of free software which uses the Software. Granted Rights 1. You are granted the non-exclusive rights set forth in this license provided you agree to and comply with any and all conditions in this license. Whole or partial distribution of the Software, or software items that link with the Software, in any form signifies acceptance of this license. 2. You may copy and distribute the Software in unmodified form provided that the entire package, including - but not restricted to - copyright, trademark notices and disclaimers, as released by the initial developer of the Software, is distributed. 3. You may make modifications to the Software and distribute your modifications, in a form that is separate from the Software, such as patches. The following restrictions apply to modifications: a. Modifications must not alter or remove any copyright notices in the Software. b. When modifications to the Software are released under this license, a non-exclusive royalty-free right is granted to the initial developer of the Software to distribute your modification in future versions of the Software provided such versions remain available under these terms in addition to any other license(s) of the initial developer. 4. You may distribute machine-executable forms of the Software or machine-executable forms of modified versions of the Software, provided that you meet these restrictions: a. You must include this license document in the distribution. b. You must ensure that all recipients of the machine-executable forms are also able to receive the complete machine-readable source code to the distributed Software, including all modifications, without any charge beyond the costs of data transfer, and place prominent notices in the distribution explaining this. c. You must ensure that all modifications included in the machine-executable forms are available under the terms of this license. 5. You may use the original or modified versions of the Software to compile, link and run application programs legally developed by you or by others. 6. You may develop application programs, reusable components and other software items that link with the original or modified versions of the Software. These items, when distributed, are subject to the following requirements: a. You must ensure that all recipients of machine-executable forms of these items are also able to receive and use the complete machine-readable source code to the items without any charge beyond the costs of data transfer. b. You must explicitly license all recipients of your items to use and re-distribute original and modified versions of the items in both machine-executable and source code forms. The recipients must be able to do so without any charges whatsoever, and they must be able to re-distribute to anyone they choose. c. If the items are not available to the general public, and the initial developer of the Software requests a copy of the items, then you must supply one. Limitations of Liability In no event shall the initial developers or copyright holders be liable for any damages whatsoever, including - but not restricted to - lost revenue or profits or other direct, indirect, special, incidental or consequential damages, even if they have been advised of the possibility of such damages, except to the extent invariable law, if any, provides otherwise. No Warranty The Software and this license document are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Choice of Law This license is governed by the Laws of France. ---------------------------------------------------------------------- GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! hevea-2.30/lstlang1.hva0000644004317100512160000000002512640460115014775 0ustar marangetcristal\input{lstlang1.sty} hevea-2.30/hanging.hva0000644004317100512160000000076512017660721014701 0ustar marangetcristal\ProvidesPackage{hanging} %%Basically does nothing but eating arguments \newcommand{\hangpara}[2]{} \newcounter{@hang} \newcommand{\@hang@style}[2] {\newstyle{div.hangparas#1 P}{text-indent:-#2;padding-left:#2;}} \newenvironment{hangparas}[2] {\stepcounter{@hang}% \@auxdowrite{\string\@hang@style\{\arabic{@hang}\}\{\css@length{#1}\} }% \@open{div}{class="hangparas\arabic{@hang}"}}{\@close{div}} \newenvironment{hangpunct}{}{} \newcommand{\nhpt}{.} \let\nhlq\@hevea@backquote \let\nhrq\@hevea@quote hevea-2.30/imagen0000755004317100512160000000515212554426075013757 0ustar marangetcristal#! /bin/sh LATEX=latex DVIPS=dvips GS=gs COM=/tmp/imagen-com.$$ RESOLUTION=100 # resolution in dpi CROP="-trim +repage " EXTRA=" " MARGIN="-bordercolor none -border 2 " TOGIF="-background white -flatten -interlace Plane gif:-" TOPNG="-interlace Plane -quality 90 png:-" TOEXT=${TOPNG} EXT=png TODIR="." SVG=false RM="/bin/rm -f" while true do case $1 in -todir) shift TODIR="$1" mkdir -p ${TODIR} 2> /dev/null || : ;; -gif) TOEXT=${TOGIF} EXT=gif ;; -png) TOEXT=${TOPNG} EXT=png ;; -pnm) TOEXT="pnm:-" EXT=pnm ;; -svg) SVG=true ;; -quant) shift echo "Warning: option -quant deprecated" 1>&2 ;; -extra) shift EXTRA="$1" ;; -mag) shift RESOLUTION="$( expr '(' "$1" '*' 100 '+' 999 ')' '/' 1000)" ;; -res) shift RESOLUTION="$1" ;; -t) shift TPAPER="-t $1" ;; -pdflatex|-pdf) LATEX=pdflatex ;; -raw) EXTRA='' MARGIN='' TOEXT="pnm:-" ;; *) break ;; esac shift done echo "RESOLUTION: $RESOLUTION" case $1 in '') BASE=image ;; *) BASE=$1 ;; esac NAME=${BASE}.image trap "${RM} ${NAME}.dvi ${NAME}.pdf `basename ${NAME}.log` `basename ${NAME}.aux` head.tmp body.tmp ${COM} ; exit 2" 1 2 3 8 10 13 15 DVIPSOPTS="-Z $TPAPER" GSOPTS="-q -dNOPAUSE -dBATCH -dNOPROMPT -sDEVICE=pngalpha \ -r$RESOLUTION -dAutoRotatePages=/None \ -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dDOINTERPOLATE \ -P- -dSAFER" CONVERT="convert png:- ${CROP} ${EXTRA} ${MARGIN} ${TOEXT}" echo ${CONVERT} > ${COM} if [ "${TODIR}" = "." ] then FINAL=${BASE}%03d.${EXT} else FINAL=${TODIR}/${BASE}%03d.${EXT} fi test -f ${NAME}.tex ||\ { echo "Failure: no ${NAME}.tex file!" 2>&1 ; exit 2 ; } ${LATEX} ${NAME}.tex NAMEDIR=`dirname ${NAME}` if [ "${LATEX}" = "pdflatex" ] then if [ ${NAMEDIR} != "." ] then mv `basename ${NAME}.pdf` ${NAME}.pdf fi cat ${NAME}.pdf else if [ ${NAMEDIR} != "." ] then mv `basename ${NAME}.dvi` ${NAME}.dvi fi ${DVIPS} ${DVIPSOPTS} -o - ${NAME}.dvi fi |\ ${GS} ${GSOPTS} -sOutputFile="| sh ${COM} > ${FINAL}" - if $SVG then pdflatex ${NAME}.tex if [ ${NAMEDIR} != "." ] then mv `basename ${NAME}.pdf` ${NAME}.pdf fi pdfcrop ${NAME}.pdf ${NAME}.crop.pdf pdf2svg ${NAME}.crop.pdf "${TODIR}/${BASE}%03d.svg" all ${RM} ${NAME}.crop.pdf fi ${RM} ${COM} ${NAME}.dvi ${NAME}.pdf head.tmp body.tmp ${RM} `basename ${NAME}.log` `basename ${NAME}.aux` hevea-2.30/tree.mli0000644004317100512160000000165310207662436014231 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: tree.mli,v 1.5 2005-02-25 17:49:18 maranget Exp $ *) (***********************************************************************) type 'a t = | Text of string | Blanks of string | Node of 'a * ('a t) list | ONode of string * string * ('a t) list hevea-2.30/cutOut.ml0000644004317100512160000000317512323450432014375 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet MOSCOVA, INRIA Rocquencourt *) (* *) (* Copyright 2006 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) module type Config = sig val small_length : int end module Make(C:Config) = struct module Out = DoOut.Make(C) type t = { out : Out.t ; name : string } let get_name { name = name } = name let create name do_it = { out = do_it () ; name = name } let create_buff name = create name Out.create_buff and create_null () = create "NULL" Out.create_null and create_chan name = create name (fun () -> Out.create_chan (open_out name)) and close { out = out } = Out.close out let put { out = out } s = Out.put out s and put_char { out = out } c = Out.put_char out c and is_empty { out = out } = Out.is_empty out and to_string { out = out } = Out.to_string out and to_chan chan { out = out } = Out.to_chan chan out and copy { out = out1 } { out = out2 } = Out.copy out1 out2 and flush { out = out } = Out.flush out let debug chan { out; name; } = Printf.fprintf chan "Out=%s\n" name ; Out.debug chan out ; () end hevea-2.30/bytes.mlip0000644004317100512160000000043512403604646014574 0ustar marangetcristaltype t = string include module type of String with type t := string val sub_string : t -> int -> int -> string val of_string : string -> t val blit_string : string -> int -> t -> int -> int -> unit val unsafe_to_string : t -> string val to_string : t -> string val cat : t -> t -> t hevea-2.30/eurosym.hva0000644004317100512160000000105410563036154014762 0ustar marangetcristal\ProvidesPackage{eurosym} %%Hum I have one symbol only for euro! \def\es@euro{\@print@u{X20AC}} \newcommand{\let@euro}[1]{\let#1\es@euro} \let@euro{\officialeuro}\let@euro{\geneuro}\let@euro{\geneuroarrow}% \let@euro{\geneurowide}% \let@euro{\euro}% \newcommand{\es@left}[1]{\euro\,#1} \newcommand{\es@right}[1]{#1\,\euro} \let\EUR\es@left %%Usefull options. \DeclareOption{official}{}\DeclareOption{gen}{}\DeclareOption{genarrow}{} \DeclareOption{genwide}{} \DeclareOption{left}{\let\EUR\es@left} \DeclareOption{right}{\let\EUR\es@right} \ProcessOptions* hevea-2.30/table.ml0000644004317100512160000000312412401623123014167 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1999 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) exception Empty type 'a t = {mutable next : int ; mutable data : 'a array} let default_size = 32 ;; let create x = {next = 0 ; data = Array.make default_size x} and reset t = t.next <- 0 ;; let incr_table table new_size = let t = Array.make new_size table.data.(0) in Array.blit table.data 0 t 0 (Array.length table.data) ; table.data <- t let emit table i = let size = Array.length table.data in if table.next >= size then incr_table table (2*size); table.data.(table.next) <- i ; table.next <- table.next + 1 let apply table f = if table.next = 0 then raise Empty ; f table.data.(table.next - 1) let to_array t = Array.sub t.data 0 t.next let trim t = let r = Array.sub t.data 0 t.next in reset t ; r let remove_last table = table.next <- table.next -1; if table.next < 0 then table.next <- 0 ; ;; let get_size table = table.next ;; hevea-2.30/next_motif.gif0000644004317100512160000000047506537544364015445 0ustar marangetcristalGIF89añp€ÿÿp€!þ# Imported from XPM image: next.xpm!ù,@çÜ63333ÆB! Ã0 A0 Ã0 Ã0  0 ƒÁ`0 ƒÁ`0 ƒA @ ƒÁ`0 ƒÁ`00000000000000000000000000000000000000000000  000000 0000000000000000000000000000`À€ ;hevea-2.30/subst.mll0000644004317100512160000001155712125271032014426 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: subst.mll,v 1.20 2012-06-05 14:55:39 maranget Exp $ *) (***********************************************************************) { open Printf open Misc open Lexstate let subst_buff = Out.create_buff () ;; } let command_name = '\\' ((['@''A'-'Z' 'a'-'z']+ '*'?) | [^ 'A'-'Z' 'a'-'z'] | "\\*") rule subst expn = parse | '#' ['1'-'9'] as lxm {if is_plain '#' then begin let i = Char.code (lxm.[1]) - Char.code '1' in scan_arg (fun arg -> scan_this_arg_list (subst expn) arg) i end else Out.put subst_buff lxm ; subst expn lexbuf} | '#' '#' {if is_plain '#' then Out.put_char subst_buff '#' else Out.put subst_buff "##" ; subst expn lexbuf} | "\\#" | '\\' | [^'\\' '#']+ {Out.blit subst_buff lexbuf ; subst expn lexbuf} | "\\@print" as lxm {Save.start_echo () ; let _ = Save.arg lexbuf in let real_arg = Save.get_echo () in Out.put subst_buff lxm ; Out.put subst_buff real_arg ; subst expn lexbuf} | command_name as cmd { if expn then begin try let pat,body = Latexmacros.find_fail cmd in begin match body with | Subst _ when not (Latexmacros.get_saved_macro cmd) -> if !verbose > 2 then eprintf "EXPAND: %s\n" cmd ; let args = make_stack cmd pat lexbuf in Out.put_char subst_buff '{' ; scan_body (function | Subst body -> scan_this_list (subst expn) body | _ -> assert false) body args ; Out.put_char subst_buff '}' | _ -> Out.put subst_buff cmd end with Latexmacros.Failed -> Out.put subst_buff cmd end else begin Out.put subst_buff cmd end ; subst expn lexbuf} | eof {()} | "" {raise (Error "Empty lexeme in subst")} and do_translate = parse | "\\@print" as lxm {fun f -> Save.start_echo () ; let _ = Save.arg lexbuf in let real_arg = Save.get_echo () in Out.put subst_buff lxm ; Out.put subst_buff real_arg ; do_translate lexbuf f} | command_name {fun f -> Out.blit subst_buff lexbuf ; do_translate lexbuf f} | _ as lxm {fun f -> Out.put_char subst_buff (f lxm) ; do_translate lexbuf f} | eof {fun _ -> Out.to_string subst_buff} { let sharp_inside s = try ignore (String.index s '#') ; true with Not_found -> false let do_do_subst_this expn ({arg=arg ; subst=env} as x) = if not (is_top env) && sharp_inside arg then begin if !verbose > 1 then begin Printf.fprintf stderr "subst_this : [%s]\n" arg ; prerr_args () end ; let _ = scan_this_arg (subst expn) x in let r = Out.to_string subst_buff in if !verbose > 1 then prerr_endline ("subst_this ["^arg^"] = "^r); r end else arg let sharp_inside_list xs = List.exists sharp_inside xs let do_do_subst_this_list expn ({arg=xs ; subst=env} as x) = if not (is_top env) && sharp_inside_list xs then begin if !verbose > 1 then begin fprintf stderr "subst_this_list : [%a]\n" Lexstate.pretty_body xs ; prerr_args () end ; let _ = scan_this_arg_list (subst expn) x in let r = Out.to_list subst_buff in if !verbose > 1 then eprintf "subst_this_list [%a] = [%a]\n" Lexstate.pretty_body xs Lexstate.pretty_body r ; r end else xs let do_subst_this_list x = String.concat "" (do_do_subst_this_list false x) let do_subst_this x = do_do_subst_this false x let subst_list {arg=args ; subst=env} = List.map (fun arg -> do_subst_this {arg=arg; subst=env}) args let subst_this s = do_subst_this (mkarg s (get_subst ())) let subst_arg lexbuf = do_subst_this (save_arg lexbuf) and subst_opt def lexbuf = do_do_subst_this_list false (save_opt def lexbuf) let subst_body lexbuf = do_do_subst_this_list false (save_body lexbuf) let subst_arg_list lexbuf = do_do_subst_this_list false (save_body lexbuf) let subst_expn_arg lexbuf = do_do_subst_this true (save_arg lexbuf) let subst_expn_body lexbuf = do_do_subst_this_list true (save_body lexbuf) let translate f s = let lexbuf = MyLexing.from_string s in do_translate lexbuf f let lowercase s = translate Char.lowercase s and uppercase s = translate Char.uppercase s } hevea-2.30/videoc.mli0000644004317100512160000000210007303451221014516 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* Christian Queinnec, Universite Paris IV *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* The plugin for HeVeA that implements the VideoC style. $Id: videoc.mli,v 1.7 2001-05-25 12:37:34 maranget Exp $ *) module type T = sig end;; module Make (Dest : OutManager.S) (Image : ImageManager.S) (Scan : Latexscan.S) : T hevea-2.30/saveUtils.ml0000644004317100512160000000371413106542165015075 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 2012 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) (* Save module utilities *) let verbose = ref 0 and silent = ref false ;; let set_verbose s v = silent := s ; verbose := v ;; exception Error of string ;; exception Delim of string ;; let seen_par = ref false ;; let brace_nesting = ref 0 and arg_buff = Out.create_buff () and echo_buff = Out.create_buff () and tag_buff = Out.create_buff () ;; let echo = ref false ;; let get_echo () = echo := false ; Out.to_string echo_buff and start_echo () = echo := true ; Out.reset echo_buff ;; let empty_buffs () = brace_nesting := 0 ; Out.reset arg_buff ; echo := false ; Out.reset echo_buff ; Out.reset tag_buff ;; let error s = empty_buffs () ; raise (Error s) ;; let my_int_of_string s = try int_of_string s with Failure _ -> error ("Integer argument expected: ``"^s^"''") exception Eof ;; exception LimitEof of Misc.limits option ;; exception NoOpt ;; let put_echo s = if !echo then Out.put echo_buff s and put_echo_char c = if !echo then Out.put_char echo_buff c and blit_echo lb = if !echo then Out.blit echo_buff lb ;; let put_both s = put_echo s ; Out.put arg_buff s ;; let blit_both lexbuf = blit_echo lexbuf ; Out.blit arg_buff lexbuf let put_both_char c = put_echo_char c ; Out.put_char arg_buff c ;; hevea-2.30/verb.mll0000644004317100512160000015025313106613665014235 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: verb.mll,v 1.94 2009-09-15 15:33:13 maranget Exp $ *) (***********************************************************************) { exception VError of string module type S = sig end ;; module Make (Dest : OutManager.S) (Image : ImageManager.S) (Scan : Latexscan.S) : S = struct open Printf open Misc open Lexing open Save open Lexstate open Latexmacros open MyStack open Scan open Subst exception Eof of string exception ParseError (* For file verbatim scanning *) let input_verb = ref false ;; (* For scanning by line *) let line_buff = Out.create_buff () ;; (* Do not output an possible first empty line *) let wrap_eat_fst_nl process = let first_line = ref true in (fun () -> if not (!first_line && Out.is_empty line_buff) then process () ; first_line := false) (* For scanning the ``listings'' way *) let lst_process_error _ lxm = warning ("listings, unknown character: '"^Char.escaped lxm^"'") let lst_char_table = Array.make 256 lst_process_error ;; let lst_init_char c f = lst_char_table.(Char.code c) <- f let lst_init_chars s f = let last = String.length s - 1 in for i = 0 to last do lst_char_table.(Char.code s.[i]) <- f done let lst_init_save_char c f = let old = lst_char_table.(Char.code c) in lst_char_table.(Char.code c) <- f old let lst_init_save_chars s f = let last = String.length s - 1 in for i = 0 to last do lst_init_save_char s.[i] f done (* Parameters *) type line_limit = | LineNumber of int | Marker of string let pmark = function | LineNumber x -> string_of_int x | Marker tok -> "«"^tok^"»" let lst_gobble = ref 0 and lst_nlines = ref 0 and lst_first = ref 1 and lst_last = ref 99999 (* infinity *) and lst_linerange = ref [] and lst_print = ref true and lst_includerangemarker = ref true and lst_string_spaces = ref true and lst_texcl = ref false and lst_extended = ref false and lst_sensitive = ref true and lst_mathescape = ref false and lst_directives = ref false and lst_showlines = ref false and lst_tabsize = ref 8 and lst_col = ref 0 let lst_showspaces = ref false (* false => spaces are spaces *) and lst_showtabs = ref false and lst_save_spaces = ref false (* Output functions *) let lst_buff = Out.create_buff () let lst_last_char = ref ' ' let lst_put c = incr lst_col ; lst_last_char := c ; Out.put_char lst_buff c type lst_scan_mode = | Letter | Other | Empty | Start | Directive of bool (* bool flags some letter read *) (* let show_mode = function | Letter -> "Letter" | Other -> "Other" | Empty -> "Empty" | Start -> "Start" | Directive _ -> "Directive" *) let lst_scan_mode = ref Empty type comment_type = | Nested of int | Balanced of (char -> string -> bool) | Line type lst_top_mode = | Skip of lst_top_mode | StartNextLine of lst_top_mode * (bool ref) (* | EndNextLine of lst_top_mode *) | String of (char * (char * (Lexing.lexbuf -> char -> unit)) list) | Normal | Comment of string * comment_type | Delim of int * (char * (Lexing.lexbuf -> char -> unit)) list | Gobble of lst_top_mode * int | Escape of lst_top_mode * char * bool (* bool flags mathescape *) let is_normal = function | Normal -> true | _ -> false let is_outputing = function | Skip _ -> false | _ -> true let string_of_top_mode = function | Delim (i,_) -> sprintf "Delim: %i" i | Skip _ -> "Skip" | StartNextLine (_,_) -> "StartNextLine" (* | EndNextLine (mode) -> sprintf "EndNextLine (%s)" (string_of_top_mode mode) *) | Comment (_, Balanced _) -> "Balanced" | Comment (_, Nested n) -> "(Nested "^string_of_int n^")" | Comment (_, Line) -> "Line" | String _ -> "String" | Normal -> "Normal" | Gobble (_,_) -> "Gobble" | Escape (_,_,_) -> "Escape" let lst_top_mode = ref (Skip Normal) (* let lst_ptok s = prerr_endline (s^": "^Out.to_string lst_buff) *) (* Final ouput, with transformations *) let dest_string = Scan.translate_put_unicode_string (* Echo, with case change *) let dest_case s = Dest.put (match !case with | Upper -> String.uppercase s | Lower -> String.lowercase s | _ -> s) (* Keywords *) let def_print s = Latexmacros.def "\\@tmp@lst" zero_pat (CamlCode (fun _ -> dest_case s)) ; Latexmacros.def "\\@tmp@lst@print" zero_pat (CamlCode (fun _ -> dest_string s)) ;; let lst_output_com com = let com = com^"{\\@tmp@lst}{\\@tmp@lst@print}" in fun () -> if not (Out.is_empty lst_buff) then begin let arg = Out.to_string lst_buff in match !lst_top_mode with | Normal -> def_print arg ; scan_this Scan.main com | Skip _|StartNextLine (_,_) | Gobble (_,_) | Escape (_,_,_) -> assert false | Delim (_, _) | Comment (_,_)|String _ (* | EndNextLine _ *) -> scan_this main "\\@NewLine" ; dest_string arg end let lst_output_other = lst_output_com "\\lst@output@other" and lst_output_letter = lst_output_com "\\lst@output" and lst_output_directive = lst_output_com "\\lst@output@directive" let lst_output_token () = match !lst_scan_mode with | Letter -> lst_output_letter () | Other -> lst_output_other () | Directive _ -> lst_output_directive () | Empty|Start -> scan_this main "\\@NewLine" (*********************) (* Delay some action *) (*********************) let chars_string c s = let rec do_rec r i = if i < String.length s then if List.mem s.[i] r then do_rec r (i+1) else do_rec (s.[i]::r) (i+1) else r in do_rec [c] 0 let init_char_table_delim chars wrapper = List.map (fun c -> let old_process = lst_char_table.(Char.code c) in lst_init_save_char c wrapper ; (c,old_process)) chars let restore_char_table to_restore = let rec do_rec = function | [] -> () | (c,f)::rest -> lst_init_char c f ; do_rec rest in do_rec to_restore let do_eat_delim visi k new_mode old_process lb c s = let chars = chars_string c s in let wrapper old_process lb c = match !lst_top_mode with | Delim (n,to_restore) -> if visi then old_process lb c ; if n = 1 then begin lst_output_token () ; lst_top_mode := new_mode ; restore_char_table to_restore ; k () end else lst_top_mode := Delim (n-1,to_restore) | _ -> assert false in let to_restore = init_char_table_delim chars wrapper in lst_top_mode := Delim (1+String.length s, to_restore) ; wrapper old_process lb c let eat_delim = do_eat_delim true (* Typical overkill: processesors are restored/saved at each step *) let delay_action k rmode old_process lb c s = let chars = chars_string c s in let rec wrapper old_process lb c = match !lst_top_mode with | Delim (n,to_restore) -> restore_char_table to_restore ; lst_top_mode := !rmode ; old_process lb c ; rmode := !lst_top_mode ; ignore (init_char_table_delim chars wrapper) ; if n = 1 then begin restore_char_table to_restore ; k () end else lst_top_mode := Delim (n-1,to_restore) | _ -> assert false in let to_restore = init_char_table_delim chars wrapper in lst_top_mode := Delim (1+String.length s, to_restore) ; wrapper old_process lb c (* Process functions *) let lst_do_gobble mode n = if n > 1 then lst_top_mode := Gobble (mode,n-1) else lst_top_mode := mode let lst_do_escape mode endchar math _lb lxm = if lxm = endchar then begin scan_this main "\\begingroup\\lst@escapebegin" ; if math then scan_this main "$" ; scan_this main (Out.to_string lst_buff) ; if math then scan_this main "$" ; scan_this main "\\lst@escapeend\\endgroup" ; lst_top_mode := mode end else Out.put_char lst_buff lxm (* let debug_curline msg = eprintf "%s: %s\n" msg (Scan.get_this_main "\\usebox{\\@curline}") *) (* We put those here since newlines may terminate comments *) let begin_comment () = lst_output_token () ; scan_this Scan.main "\\begin{lrbox}{\\lst@box}" and end_comment sty () = scan_this Scan.main (Printf.sprintf "\\end{lrbox}{%s{\\lst@box}}" sty) let end_string to_restore = scan_this Scan.main "\\end{lrbox}{\\lst@stringstyle{\\lst@box}}" ; restore_char_table to_restore ; lst_showspaces := !lst_save_spaces let rec end_mode mode = match mode with | Comment (style,_) -> end_comment style () | String (_,to_restore) -> end_string to_restore | Skip m|StartNextLine (m,_) -> end_mode m | _ -> () (* Utilities *) let zyva_all xs ys zyva = List.iter (fun x -> List.iter (fun y -> zyva x y) ys) xs let gettoks cmd = match Latexmacros.find_fail cmd with | _,Toks r-> r | _ -> assert false (* Number of (printed) source blocks in a listing *) let lst_nblocks = ref 0 (* Note, at the moment lst_process_newline is the only processor that can start/stop output, 1. Process_newline is fooled by using lst_first/lst_last variables 2. This process_newlines must sometime not increase line numbers, ie, when there is in fact no eol *) let is_comment_line = function | Comment (_, Line) -> true | _ -> false let rec lst_process_newline real_eol lb c = if !verbose > 1 then fprintf stderr "lst_process_newline: mode=%s first=%i last=%i nlines=%i\n" (string_of_top_mode !lst_top_mode) !lst_first !lst_last !lst_nlines ; match !lst_top_mode with | Skip newmode -> if !lst_nlines = !lst_first - 1 then begin lst_top_mode := newmode ; lst_process_newline real_eol lb c ; if !lst_nblocks = 0 then scan_this Scan.main (if !lst_first=1 then "\\let\\lst@br\\lst@@@br" else "\\let\\lst@br\\lst@@br") end else begin if real_eol then begin incr lst_nlines ; scan_this Scan.main "\\lsthk@InitVarEOL" end end | StartNextLine (newmode,to_activate) -> lst_first := !lst_nlines+1 ; lst_top_mode := Skip newmode ; lst_process_newline real_eol lb c ; to_activate := true (* | EndNextLine (mode) -> lst_last := !lst_nlines ; lst_top_mode := mode ; lst_process_newline real_eol lb c *) | Gobble (mode,_) -> lst_top_mode := mode ; lst_process_newline real_eol lb c | Escape (_mode,cc,math) -> lst_do_escape (Comment ("\\@empty",Line)) cc math lb c ; if is_comment_line !lst_top_mode then lst_process_newline real_eol lb c | Comment (style, Line) -> lst_output_token () ; end_comment style () ; lst_top_mode := Normal ; lst_process_newline real_eol lb c | Delim (_, _) -> assert false | String _|Normal|Comment (_,(Balanced _|Nested _)) as mode -> if real_eol then scan_this Scan.main "\\lsthk@InitVarEOL\\lsthk@EOL" ; begin match !lst_scan_mode with | Empty -> lst_scan_mode := Start | Start -> () | _ -> lst_output_token () ; lst_scan_mode := Start end ; let next_line = !lst_nlines+1 in if next_line <= !lst_last then begin lst_col := 0 ; scan_this Scan.main "\\lsthk@InitVarBOL\\lsthk@EveryLine" ; if !lst_gobble > 0 then lst_top_mode := Gobble (mode,!lst_gobble) end else begin incr lst_nblocks ; lst_col := 0 ; scan_this Scan.main "\\lsthk@InitVarBOL\\lsthk@LastLine" ; set_next_linerange mode end ; if real_eol then lst_nlines := next_line (***************) (* Line ranges *) (***************) and process_EMark active rest_E old_process lb c = if !active && if_next_string rest_E lb then begin active := false ; let zyva x () = lst_last := x ; lst_process_newline false lb c in if !lst_includerangemarker then begin delay_action (zyva (!lst_nlines-1)) (ref !lst_top_mode) old_process lb c rest_E end else begin zyva (!lst_nlines-1) () ; old_process lb c end end else old_process lb c and lst_process_BMark active to_activate mark_start old_process lb c = if !active then begin match !lst_top_mode with | Skip newmode when if_next_string mark_start lb -> active := false ; lst_last := 99999 ; if !lst_includerangemarker then begin lst_first := !lst_nlines+1 ; lst_process_newline false lb c ; delay_action (fun () -> to_activate := true) (ref newmode) old_process lb c mark_start end else begin lst_top_mode := StartNextLine (newmode, to_activate) ; old_process lb c end | Escape (_, _, _)|Gobble (_, _)|Delim (_, _)| Comment (_,_)|String _| (* EndNextLine _| *) StartNextLine (_,_)|Skip _|Normal -> old_process lb c end else old_process lb c and init_marker mark_start activate_end = let head_S = mark_start.[0] and rest_S = String.sub mark_start 1 (String.length mark_start-1) in lst_init_save_char head_S (lst_process_BMark (ref true) activate_end rest_S) and set_next_linerange mode = match !lst_linerange with | [] -> lst_first := 99999 ; lst_top_mode := Skip mode | (fst, lst)::rem -> if !verbose > 1 then eprintf "SET LINERANGE: %s %s\n" (pmark fst) (pmark lst) ; lst_linerange := rem ; let activate_end = ref false in begin match lst with | LineNumber x -> lst_last := x | Marker all_E -> lst_last := 99999 ; let zyva pref suf = let all_E = pref ^ all_E ^ suf in let head_E = all_E.[0] and rest_E = String.sub all_E 1 (String.length all_E-1) in lst_init_save_char head_E (process_EMark activate_end rest_E) in zyva_all (gettoks "\\lst@rangeendprefix") (gettoks "\\lst@rangeendprefix") zyva end ; begin match fst with | LineNumber x -> if !verbose > 1 then eprintf "fst=%i, nlines=%i\n" x !lst_nlines ; lst_first := x ; if !lst_nlines+1 < x then begin lst_top_mode := Skip mode end else begin if !lst_nblocks = 0 then scan_this Scan.main "\\let\\lst@br\\lst@@@br" ; lst_top_mode := mode end | Marker tok -> let zyva pref suf = let tok = pref ^ tok ^ suf in lst_first := -1 ; lst_top_mode := Skip mode ; init_marker tok activate_end in zyva_all (gettoks "\\lst@rangebeginprefix") (gettoks "\\lst@rangebeginsuffix") zyva end let lst_process_letter lb lxm = if !verbose > 1 then fprintf stderr "lst_process_letter: %c\n" lxm ; match !lst_top_mode with | Skip _|StartNextLine (_,_) -> () | Gobble (mode,n) -> lst_do_gobble mode n | Escape (mode,c,math) -> lst_do_escape mode c math lb lxm | _ -> match !lst_scan_mode with | Letter -> lst_put lxm | Directive true -> lst_put lxm | Directive false -> lst_scan_mode := Directive true ; lst_put lxm | Empty|Start -> lst_scan_mode := Letter ; lst_put lxm | Other -> lst_output_other () ; lst_scan_mode := Letter ; lst_put lxm let lst_process_digit lb lxm = if !verbose > 1 then fprintf stderr "lst_process_digit: %c\n" lxm ; match !lst_top_mode with | Skip _|StartNextLine (_,_) -> () | Gobble (mode,n) -> lst_do_gobble mode n | Escape (mode,c,math) -> lst_do_escape mode c math lb lxm | _ -> match !lst_scan_mode with | Letter|Other -> lst_put lxm | Directive _ -> lst_output_directive () ; lst_scan_mode := Other ; lst_put lxm | Empty|Start -> lst_scan_mode := Other ; lst_put lxm let lst_process_other lb lxm = if !verbose > 1 then fprintf stderr "process_other: %c\n" lxm ; match !lst_top_mode with | Skip _|StartNextLine (_,_) -> () | Gobble (mode,n) -> lst_do_gobble mode n | Escape (mode,c,math) -> lst_do_escape mode c math lb lxm | _ -> match !lst_scan_mode with | Other -> lst_put lxm | Empty|Start -> lst_scan_mode := Other ; lst_put lxm | Directive _ -> lst_output_directive () ; lst_scan_mode := Other ; lst_put lxm | Letter -> lst_output_letter () ; lst_scan_mode := Other ; lst_put lxm (* Caml code for \stepcounter{lst@space} *) let lst_output_space () = incr lst_col ; Counter.step_counter "lst@spaces" let lst_process_space lb lxm = if !verbose > 1 then fprintf stderr "process_space: '%s'\n" (Char.escaped lxm) ; match !lst_top_mode with | Skip _ |StartNextLine (_,_)-> () | Gobble (mode,n) -> lst_do_gobble mode n | Escape (mode,c,math) -> lst_do_escape mode c math lb lxm | _ -> begin match !lst_scan_mode with | Other -> lst_output_other () ; lst_scan_mode := Empty | Letter|Directive true -> lst_output_token () ; lst_scan_mode := Empty | Empty|Directive false -> () | Start -> lst_scan_mode := Empty end ; lst_output_space () let lst_process_tab lb lxm = if !verbose > 1 then fprintf stderr "process_tab: '%s'\n" (Char.escaped lxm) ; let n = !lst_tabsize - (!lst_col mod !lst_tabsize) in if !lst_showtabs && is_normal !lst_top_mode then begin lst_output_token () ; if Latexmacros.exists "\\lst@tab" then begin for _i = 1 to n-1 do lst_process_space lb lxm done ; let save = !lst_showspaces in lst_showspaces := false ; lst_output_token () ; lst_showspaces := save ; (* Assumes that the tab equivalent is one-char wide *) incr lst_col ; scan_this main "{\\lst@tab}" end else begin for _i = 1 to n do lst_process_space lb lxm done ; let save = !lst_showspaces in lst_showspaces := true ; lst_output_token () ; lst_showspaces := save end end else begin for _i = 1 to n do lst_process_space lb lxm done end let lst_process_start_directive old_process lb lxm = match !lst_top_mode with | Normal -> begin match !lst_scan_mode with | Start -> lst_scan_mode := Directive false | _ -> old_process lb lxm end | _ -> old_process lb lxm exception EndVerb let lst_process_end endstring old_process lb lxm = if !verbose > 1 then fprintf stderr "process_end: «%c»\n" lxm ; if (not !input_verb || MyStack.empty stack_lexbuf) && if_next_string endstring lb then begin Save.skip_delim endstring lb ; raise EndVerb end else old_process lb lxm let lst_init_char_table inline = lst_init_chars "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@_$" lst_process_letter ; lst_init_chars "!\"#%&'()*+,-./:;<=>?[\\]^{}|`~" lst_process_other ; lst_init_chars "0123456789" lst_process_digit ; lst_init_char ' ' lst_process_space ; lst_init_char '\t' lst_process_tab ; if inline then lst_init_char '\n' lst_process_space else lst_init_char '\n' (lst_process_newline true) ;; (* TeX escapes *) let start_escape mode endchar math = lst_output_token () ; lst_top_mode := Escape (mode, endchar, math) let lst_process_escape math ec old_process lb lxm = if !verbose > 1 then fprintf stderr "lst_process_escape: %c\n" lxm ; match !lst_top_mode with | Skip _|StartNextLine (_,_) -> () | Gobble (mode,n) -> lst_do_gobble mode n | Escape _ -> old_process lb lxm | mode -> start_escape mode ec math (* Strings *) let lst_bs_string process_c c old_process lb lxm = if !verbose > 1 then begin eprintf "lst_bs_string: «%c»\n" lxm end ; (* Processs backslash, as usual *) old_process lb lxm ; (* Change char_tables for backshalsh and c *) let saved = Array.copy lst_char_table in let restore_lst_char_table () = Array.blit saved 0 lst_char_table 0 (Array.length saved) in lst_char_table.(Char.code lxm) <- old_process ; lst_char_table.(Char.code c) <- process_c ; (* Change all entries in char_table, -> restore table once the backslashed char is processed *) for i = 0 to Array.length lst_char_table-1 do let do_process = lst_char_table.(i) in lst_char_table.(i) <- (fun lb lxm -> do_process lb lxm ; restore_lst_char_table ()) done (* c is the character to be quoted *) let lst_init_quote old_process c s = let r = ref [] in for i = 0 to String.length s-1 do if s.[i] = 'b' then begin r := ('\\',lst_char_table.(Char.code '\\')) :: !r ; lst_init_save_char '\\' (lst_bs_string old_process c) end done ; !r let lst_process_stringizer quote old_process lb lxm = match !lst_top_mode with | Normal -> lst_output_token () ; let to_restore = lst_init_quote old_process lxm quote in lst_top_mode := String (lxm, to_restore) ; lst_save_spaces := !lst_showspaces ; lst_showspaces := !lst_string_spaces ; scan_this Scan.main "\\begin{lrbox}{\\lst@box}" ; old_process lb lxm | String (c,to_restore) when lxm = c -> old_process lb lxm ; lst_output_token () ; end_string to_restore ; lst_top_mode := Normal | _ -> old_process lb lxm (* Comment *) let lst_process_BNC visi sty _ s old_process lb c = match !lst_top_mode with | Normal when if_next_string s lb -> begin_comment () ; do_eat_delim visi (fun () -> ()) (Comment (sty,Nested 0)) old_process lb c s | Comment (sty,Nested n) when if_next_string s lb -> eat_delim (fun () -> ()) (Comment (sty,Nested (n+1))) old_process lb c s | _ -> old_process lb c and lst_process_ENC visi s old_process lb c = match !lst_top_mode with | Comment (sty,Nested 0) when if_next_string s lb -> do_eat_delim visi (end_comment sty) Normal old_process lb c s | Comment (sty,Nested n) when if_next_string s lb -> eat_delim (fun () -> ()) (Comment (sty,Nested (n-1))) old_process lb c s | _ -> old_process lb c let lst_process_BBC visi sty check s old_process lb c = match !lst_top_mode with | Normal when if_next_string s lb -> begin_comment () ; do_eat_delim visi (fun () -> ()) (Comment (sty, Balanced check)) old_process lb c s | _ -> old_process lb c and lst_process_EBC visi s old_process lb c = match !lst_top_mode with | Comment (sty,Balanced check) when check c s && if_next_string s lb -> do_eat_delim visi (end_comment sty) Normal old_process lb c s | _ -> old_process lb c let lst_process_LC visi sty s old_process lb c = match !lst_top_mode with | Normal when if_next_string s lb -> begin_comment () ; do_eat_delim visi (fun () -> ()) (if !lst_texcl then Escape (Normal,'\n', false) else Comment (sty,Line)) old_process lb c s | _ -> old_process lb c } let command_name = '\\' (( ['@''A'-'Z' 'a'-'z']+ '*'?) | [^ 'A'-'Z' 'a'-'z'] | "\\*") rule inverb verb_delim put = parse | (_ as c) {if c = verb_delim then begin Dest.close_group () ; end else begin put c (fun () -> read_lexbuf lexbuf) ; inverb verb_delim put lexbuf end} | eof {if not (empty stack_lexbuf) then let lexbuf = previous_lexbuf () in inverb verb_delim put lexbuf else raise (VError ("End of file after \\verb"))} and start_inverb put = parse | (_ as c) {inverb c put lexbuf} | eof {if not (empty stack_lexbuf) then let lexbuf = previous_lexbuf () in start_inverb put lexbuf else raise (VError ("End of file after \\verb"))} and scan_byline process finish = parse | "\\end" [' ''\t']* '{' ([^'}']+ as env) '}' as lxm { (* eprintf "by_line: lxm='%s' cur_env=%s\n" lxm !Scan.cur_env ; *) if (not !input_verb || MyStack.empty stack_lexbuf) && env = !Scan.cur_env then begin finish () ; scan_this Scan.main ("\\end"^env) ; Scan.top_close_block "" ; Scan.close_env !Scan.cur_env ; () end else begin Out.put line_buff lxm ; scan_byline process finish lexbuf end} | '\n' {process () ; scan_byline process finish lexbuf} | _ as lxm {Out.put_char line_buff lxm ; scan_byline process finish lexbuf} | eof {if not (MyStack.empty stack_lexbuf) then begin let lexbuf = previous_lexbuf () in scan_byline process finish lexbuf end else begin finish () ; raise (Eof "scan_byline") end} and scan_bycommand out is_cmd = parse | "\\end" [' ''\t']* '{' ([^'}']+ as env) '}' as lxm {if env = !Scan.cur_env then begin Latexmacros.def "\\@tmp@scanned" zero_pat (Toks [Out.to_string out]) ; lxm end else begin Out.blit out lexbuf ; scan_bycommand out is_cmd lexbuf end} | "\\verb" {Out.blit out lexbuf ; Save.start_echo () ; ignore (arg_verbatim lexbuf) ; let a = Save.get_echo () in Out.put out a ; scan_bycommand out is_cmd lexbuf} | command_name as lxm {if is_cmd lxm then begin Latexmacros.def "\\@tmp@scanned" zero_pat (Toks [Out.to_string out]) ; Scan.expand_command lxm lexbuf ; Out.reset out end else begin Out.blit out lexbuf ; end ; scan_bycommand out is_cmd lexbuf} | ('%' [^'\n']* '\n'?) | _ { Out.blit out lexbuf ; scan_bycommand out is_cmd lexbuf } | eof {if not (MyStack.empty stack_lexbuf) then begin let lexbuf = previous_lexbuf () in scan_bycommand out is_cmd lexbuf end else begin raise (Eof "scan_bycommand") end} and listings = parse | eof {if not (MyStack.empty stack_lexbuf) then begin let lexbuf = previous_lexbuf () in listings lexbuf end else begin raise (Eof "listings") end} | (_ as lxm) {lst_char_table.(Char.code lxm) lexbuf lxm ; listings lexbuf} and eat_line = parse | eof {if not (MyStack.empty stack_lexbuf) then begin let lexbuf = previous_lexbuf () in eat_line lexbuf end else begin raise (Eof "eat_line") end} | [^'\n'] {eat_line lexbuf} | '\n' {lst_process_newline true lexbuf '\n'} and get_line = parse | eof {if not (MyStack.empty stack_lexbuf) then begin let lexbuf = previous_lexbuf () in get_line lexbuf end else begin raise (Eof "get_line") end} | [^'\n'] {let lxm = lexeme_char lexbuf 0 in Out.put_char line_buff lxm ; get_line lexbuf} | '\n' {Out.to_string line_buff} and do_escape = parse | eof {()} | "\\esc" {let arg = save_arg lexbuf in scan_this main "\\mbox{" ; scan_this_arg Scan.main arg ; scan_this main "}" ; do_escape lexbuf} | _ as lxm {Scan.translate_put_unicode lxm (fun () -> read_lexbuf lexbuf) ; do_escape lexbuf} and read_lexbuf = parse | eof { -1 } | _ as c { Char.code c } and lst_linearg = parse | '-'? (['0'-'9']+ as n) {LineNumber (int_of_string n)} | '-'? ([^'-'',']+ as tok) {Marker tok} | "" {raise ParseError} and lst_parse_linerange = parse | eof {[]} | ","? {let fst = lst_linearg lexbuf in let lst = lst_linearg lexbuf in (fst,lst)::lst_parse_linerange lexbuf} { let _ = () ;; let put_char_star c next = match c with | ' '|'\t' -> Dest.put_char '_' ; | c -> Scan.translate_put_unicode c next and put_char c next = match c with | '\t' -> Dest.put_char ' ' | c -> Scan.translate_put_unicode c next ;; let open_verb put lexbuf = Dest.open_group "code" ; start_inverb put lexbuf ;; def_code "\\verb" (open_verb put_char) ; def_code "\\verb*" (open_verb put_char_star); ();; let put_line_buff_verb () = Out.iter_next put_char line_buff ; Out.reset line_buff and put_line_buff_verb_star () = Out.iter_next put_char_star line_buff ; Out.reset line_buff ;; let noeof lexer lexbuf = try lexer lexbuf with | Eof s -> raise (Misc.Close ("End of file in environment: ``"^ !Scan.cur_env^"'' ("^s^")")) | EndVerb -> () let getclass env = Scan.get_prim (Printf.sprintf "\\envclass@attr{%s}" env) let open_verbenv star = Scan.top_open_block "pre" (getclass "verbatim") ; let process = wrap_eat_fst_nl (if star then (fun () -> put_line_buff_verb_star () ; Dest.put_char '\n') else (fun () -> put_line_buff_verb () ; Dest.put_char '\n')) and finish = if star then put_line_buff_verb_star else put_line_buff_verb in process, finish and close_verbenv _ = Scan.top_close_block "pre" let put_html () = Out.iter (fun c -> Dest.put_char c) line_buff ; Out.reset line_buff ;; let put_subst () = let line = Out.to_string line_buff in (* eprintf "put_subst: '%s'\n" line ; *) Out.reset line_buff ; Dest.put (Subst.subst_this line) ; () ;; let open_forget lexbuf = let process = (fun () -> Out.reset line_buff) and finish = (fun () -> Out.reset line_buff) in noeof (scan_byline process finish) lexbuf let open_raw lexbuf = let process = (fun () -> put_html () ; Dest.put_char '\n') and finish = put_html in noeof (scan_byline process finish) lexbuf let open_subst lexbuf = let process = (fun () -> put_subst () ; Dest.put_char '\n') and finish = put_subst in noeof (scan_byline process finish) lexbuf let open_rawhtml lexbuf = match !Parse_opts.destination with | Parse_opts.Html -> open_raw lexbuf | _ -> open_forget lexbuf let open_rawtext lexbuf = match !Parse_opts.destination with | Parse_opts.Text|Parse_opts.Info -> open_raw lexbuf | _ -> open_forget lexbuf let close_nothing _ = () let open_tofile chan lexbuf = let process = (fun () -> output_string chan (Out.to_string line_buff) ; output_char chan '\n') and finish = (fun () -> output_string chan (Out.to_string line_buff) ; close_out chan) in noeof (scan_byline process finish) lexbuf (* and close_tofile _lexbuf = () *) let put_line_buff_image () = Out.iter (fun c -> Image.put_char c) line_buff ; Out.reset line_buff let open_verbimage lexbuf = let process = (fun () -> put_line_buff_image () ; Image.put_char '\n') and finish = put_line_buff_image in noeof (scan_byline process finish) lexbuf (* and close_verbimage _ = () *) ;; def_code "\\verbatim" (fun lexbuf -> let p,f = open_verbenv false in noeof (scan_byline p f) lexbuf) ; def_code "\\endverbatim" close_verbenv ; def_code "\\verbatim*" (fun lexbuf -> let p, f = open_verbenv true in noeof (scan_byline p f) lexbuf) ; def_code "\\endverbatim*" close_verbenv ; def_code "\\rawtext" open_rawtext ; def_code "\\endrawtext" close_nothing ; def_code "\\rawhtml" open_rawhtml ; def_code "\\endrawhtml" close_nothing ; def_code "\\raw" open_raw ; def_code "\\endraw" close_nothing ; def_code "\\verblatex" open_forget ; def_code "\\endverblatex" Scan.check_alltt_skip ; def_code "\\verbimage" open_verbimage ; def_code "\\endverbimage" Scan.check_alltt_skip ; () ;; let init_verbatim () = (* comment clashes with the ``comment'' package *) Latexmacros.def "\\comment" zero_pat (CamlCode open_forget) ; Latexmacros.def "\\endcomment" zero_pat (CamlCode Scan.check_alltt_skip) ; () ;; register_init "verbatim" init_verbatim ;; (* The program package for JJL que j'aime bien *) let look_escape () = let lexbuf = MyLexing.from_string (Out.to_string line_buff) in do_escape lexbuf ;; let init_program () = def_code "\\program" (fun lexbuf -> Scan.top_open_block "pre" "" ; let process = (fun () -> look_escape () ; Dest.put_char '\n') and finish = look_escape in noeof (scan_byline process finish) lexbuf) ; def_code "\\endprogram" close_verbenv ;; register_init "program" init_program ;; (* The moreverb package *) let tab_val = ref 8 let put_verb_tabs () = let char = ref 0 in Out.iter_next (fun c next -> match c with | '\t' -> let limit = !tab_val - !char mod !tab_val in for _j = 1 to limit do Dest.put_char ' ' ; incr char done ; | c -> Scan.translate_put_unicode c next ; incr char) line_buff ; Out.reset line_buff let open_verbenv_tabs () = Scan.top_open_block "pre" "" ; let process = (fun () -> put_verb_tabs () ; Dest.put_char '\n') and finish = put_verb_tabs in process, finish and close_verbenv_tabs lexbuf = Scan.top_close_block "pre" ; Scan.check_alltt_skip lexbuf ;; let line = ref 0 and interval = ref 1 ;; let output_line inter_arg star = if !line = 1 || !line mod inter_arg = 0 then scan_this Scan.main ("\\listinglabel{"^string_of_int !line^"}") else Dest.put " " ; if star then put_line_buff_verb_star () else put_verb_tabs () ; incr line let open_listing start_arg inter_arg star = Scan.top_open_block "pre" "" ; line := start_arg ; let first_line = ref true in let process = (fun () -> if !first_line then begin first_line := false ; if not (Out.is_empty line_buff) then output_line inter_arg star ; end else output_line inter_arg star ; Dest.put_char '\n') and finish = (fun () -> if not (Out.is_empty line_buff) then output_line inter_arg star) in process, finish and close_listing lexbuf = Scan.top_close_block "pre" ; Scan.check_alltt_skip lexbuf ;; register_init "moreverb" (fun () -> def_code "\\verbatimwrite" (fun lexbuf -> let name = Scan.get_prim_arg lexbuf in Scan.check_alltt_skip lexbuf ; let chan = open_out name in open_tofile chan lexbuf) ; def_code "\\endverbatimwrite" Scan.check_alltt_skip ; def_code "\\verbatimtab" (fun lexbuf -> let opt = Get.get_int (save_opt "\\verbatimtabsize" lexbuf) in tab_val := opt ; let p, f = open_verbenv_tabs () in Lexstate.save_lexstate () ; let first = get_line lexbuf in Lexstate.restore_lexstate () ; scan_this Scan.main first ; Dest.put_char '\n' ; noeof (scan_byline p f) lexbuf) ; def_code "\\endverbatimtab" close_verbenv_tabs ; (* def_code "\\verbatimtabinput" (fun lexbuf -> let opt = Get.get_int (save_opt "\\verbatimtabsize" lexbuf) in tab_val := opt ; let name = Scan.get_prim_arg lexbuf in open_verbenv_tabs () ; verb_input scan_byline name ; close_verbenv_tabs lexbuf) ; *) def_code "\\listinglabel" (fun lexbuf -> let arg = Get.get_int (save_body lexbuf) in Dest.put (sprintf "%4d " arg)) ; def_code "\\listing" (fun lexbuf -> let inter = Get.get_int (save_opt "1" lexbuf) in let start = Get.get_int (save_body lexbuf) in interval := inter ; let p, f = open_listing start inter false in noeof (scan_byline p f) lexbuf) ; def_code "\\endlisting" close_listing ; def_code "\\listingcont" (fun lexbuf -> let p, f = open_listing !line !interval false in noeof (scan_byline p f) lexbuf) ; def_code "\\endlistingcont" close_listing ; def_code "\\listing*" (fun lexbuf -> let inter = Get.get_int (save_opt "1" lexbuf) in let start = Get.get_int (save_body lexbuf) in interval := inter ; let p, f = open_listing start inter true in noeof (scan_byline p f) lexbuf) ; def_code "\\endlisting*" close_listing ; def_code "\\listingcont*" (fun lexbuf -> Scan.check_alltt_skip lexbuf ; let p, f = open_listing !line !interval false in noeof (scan_byline p f) lexbuf) ; def_code "\\endlistingcont*" close_listing ; ()) (* The comment package *) let init_comment () = def_code "\\@excludecomment" open_forget ; def_code "\\end@excludecomment" Scan.check_alltt_skip ; ;; register_init "comment" init_comment ;; (* And preview, which is identical, up to interface *) let init_preview () = def_code "\\@prw" open_forget ; def_code "\\end@prw" Scan.check_alltt_skip ; ;; register_init "preview" init_preview ;; (* The listings package *) let default_linerange = [LineNumber 1, LineNumber 99999] let parse_linerange s = let r = try lst_parse_linerange (MyLexing.from_string s) with | ParseError -> warning ("lst: invalid linerange '"^s^"'") ; default_linerange in match r with | [] -> default_linerange | _ -> r (* Caml code for \def\lst@spaces {\whiledo{\value{lst@spaces}>0}{~\addtocounter{lst@spaces}{-1}}} *) let code_spaces _lexbuf = let n = Counter.value_counter "lst@spaces" in if !lst_showspaces then for _i = n-1 downto 0 do Dest.put_char '_' done else begin for _i = n-1 downto 0 do Dest.put_nbsp () done end ; Counter.set_counter "lst@spaces" 0 ;; let check_style sty = if String.length sty > 0 && sty.[0] == '\\' then sty else "\\csname lst@"^sty^"\\endcsname" let check_visi = function | "visible" -> true | "invisible" -> false | _ -> assert false let do_code_double_delim process_B process_E lexbuf = let sty = subst_arg lexbuf in let sty = check_style sty in let lxm_B = get_prim_arg lexbuf in let lxm_E = get_prim_arg lexbuf in if lxm_B <> "" && lxm_E <> "" then begin let head_B = lxm_B.[0] and rest_B = String.sub lxm_B 1 (String.length lxm_B-1) and head_E = lxm_E.[0] and rest_E = String.sub lxm_E 1 (String.length lxm_E-1) in lst_init_save_char head_B (process_B sty (fun c s -> c = head_E && s = rest_E) rest_B) ; lst_init_save_char head_E (process_E rest_E) end let code_double_delim process_B process_E lexbuf = do_code_double_delim (process_B true) (process_E true) lexbuf let code_single_delim process_B process_E lexbuf = let visi = check_visi (get_prim_arg lexbuf) in do_code_double_delim (process_B visi) (process_E visi) lexbuf let do_code_line is_com lexbuf = let visi = check_visi (get_prim_arg lexbuf) in let visi = if is_com && not visi then begin Misc.warning "invisible commments not available" ; true end else visi in let sty = subst_arg lexbuf in let sty = check_style sty in let lxm_LC = get_prim_arg lexbuf in if lxm_LC <> "" then begin let head = lxm_LC.[0] and rest = String.sub lxm_LC 1 (String.length lxm_LC-1) in lst_init_save_char head (lst_process_LC visi sty rest) end let code_line_comment = do_code_line true and code_line_delim = do_code_line false let code_stringizer lexbuf = let mode = Scan.get_prim_arg lexbuf in let _sty = subst_arg lexbuf in let schars = Scan.get_prim_arg lexbuf in lst_init_save_chars schars (lst_process_stringizer mode) ;; let lst_finalize inline = if inline then begin lst_output_token () end else begin if is_outputing !lst_top_mode then begin scan_this main "\\lst@forget@lastline\\lsthk@LastLine" ; end end ; end_mode !lst_top_mode ;; let open_lst_inline keys = scan_this Scan.main "\\lsthk@PreSet" ; scan_this_list Scan.main ("\\lstset{"::keys@["}"]) ; (* scan_this Scan.main "\\lsthk@AfterSetLanguage" ; *) (* For inline *) scan_this Scan.main "\\lsthk@InlineUnsave" ; (* Ignoring output *) lst_gobble := Get.get_int_string (string_to_arg "\\lst@gobble") ; lst_first := Get.get_int_string (string_to_arg "\\lst@first") ; lst_last := Get.get_int_string (string_to_arg "\\lst@last") ; lst_nlines := 0 ; lst_init_char_table true ; scan_this Scan.main "\\lsthk@SelectCharTable" ; if !lst_extended then for i = 128 to 255 do lst_init_char (Char.chr i) lst_process_letter done ; scan_this Scan.main "\\lsthk@Init" ; (* Change char categories *) let alsoletter = Scan.get_prim "\\lst@alsoletter" in if alsoletter <> "" then begin lst_init_chars alsoletter lst_process_letter end ; (* Directives *) if !lst_directives then begin lst_init_save_char '#' lst_process_start_directive end ; (* Print key *) if not !lst_print then begin lst_last := -2 ; lst_first := -1 end ; (* Strings *) (* Escapes to TeX *) if !lst_mathescape then begin lst_init_save_char '$' (lst_process_escape true '$') end ; let begc = Scan.get_this_main "\\@getprintnostyle{\\lst@BET}" and endc = Scan.get_this_main "\\@getprintnostyle{\\lst@EET}" in if begc <> "" && endc <> "" then begin lst_init_save_char begc.[0] (lst_process_escape false endc.[0]) end ; scan_this Scan.main "\\lsthk@InitVar" ; lst_scan_mode := Empty ; lst_top_mode := Normal and close_lst_inline () = lst_finalize true ; while !Scan.cur_env = "command-group" do scan_this Scan.main "\\endgroup" done ; scan_this Scan.main "\\lsthk@DeInit" ;; let lst_user_name name = name^"@lst@user" let close_lst_env name = let com_name = (end_env (lst_user_name name)) in lst_finalize false ; scan_this Scan.main "\\lsthk@DeInit" ; scan_this Scan.main com_name let open_lst_env name = let com_name = (start_env (lst_user_name name)) in (fun lexbuf -> Image.stop () ; scan_this Scan.main "\\lsthk@PreSet" ; expand_command_no_skip com_name lexbuf ; (* scan_this Scan.main "\\lsthk@AfterSetLanguage" ; *) lst_init_char_table false ; scan_this Scan.main "\\lsthk@SelectCharTable" ; if !lst_extended then for i = 128 to 255 do lst_init_char (Char.chr i) lst_process_letter done ; (* Set and exploit command sequence *) scan_this Scan.main "\\lsthk@Init" ; lst_gobble := Get.get_int_string (string_to_arg "\\lst@gobble") ; let linerange = Scan.get_prim "\\lst@linerange" in lst_linerange := parse_linerange linerange ; lst_nlines := 0 ; lst_nblocks := 0 ; lst_tabsize := Get.get_int_string (string_to_arg "\\lst@tabsize") ; (* Change char categories *) let alsoletter = Scan.get_prim "\\lst@alsoletter" in if alsoletter <> "" then begin lst_init_chars alsoletter lst_process_letter end ; (* Directives *) if !lst_directives then begin lst_init_save_char '#' lst_process_start_directive end ; (* Print key *) if not !lst_print then begin lst_last := -2 ; lst_first := -1 end ; (* Escapes to TeX *) if !lst_mathescape then begin lst_init_save_char '$' (lst_process_escape true '$') end ; let begc = Scan.get_this_main "\\@getprintnostyle{\\lst@BET}" and endc = Scan.get_this_main "\\@getprintnostyle{\\lst@EET}" in if begc <> "" && endc <> "" then begin lst_init_save_char begc.[0] (lst_process_escape false endc.[0]) end ; scan_this Scan.main "\\lsthk@InitVar" ; lst_scan_mode := Empty ; set_next_linerange Normal ; scan_this Scan.main "\\lst@pre\\@lst@caption\\@open@lstbox" ; scan_this Scan.main "\\lst@basicstyle" ; (* Eat first line *) save_lexstate () ; noeof eat_line lexbuf ; restore_lexstate () ; if !Misc.verbose > 1 then eprintf "LISTINGS: first line is scanned\n" ; (* For detecting endstring, must be done after eat_line *) lst_init_save_char '\\' (lst_process_end ("end{"^name^"}")) ; noeof listings lexbuf ; if !Misc.verbose > 1 then eprintf "LISTINGS: scanning over\n" ; close_lst_env name ; scan_this Scan.main "\\@close@lstbox\\lst@post" ; Scan.top_close_block "" ; Scan.close_env !Scan.cur_env ; Image.restart () ; Scan.check_alltt_skip lexbuf) ;; let do_newenvironment lexbuf = let name = get_prim_arg lexbuf in let nargs,optdef = match save_opts ["0" ; ""] lexbuf with | [x ; y ] -> x,y | _ -> assert false in let body1 = subst_body lexbuf in let body2 = subst_body lexbuf in if Latexmacros.exists (start_env name) || Latexmacros.exists (end_env name) then warning ("Not (re)-defining environment ``"^name^"'' with \\lstnewenvironment") else begin Latexmacros.def (start_env (lst_user_name name)) (latex_pat (match optdef with | {arg=No _} -> [] | {arg=Yes s ; subst=env} -> [do_subst_this_list (mkarg s env)]) (match nargs with | {arg=No _} -> 0 | {arg=Yes s ; subst=env} -> Get.get_int (mkarg s env))) (Subst body1) ; Latexmacros.def (end_env (lst_user_name name)) zero_pat (Subst body2) ; def_code (start_env name) (open_lst_env name) end let lst_boolean lexbuf = let b = get_prim_arg lexbuf in Dest.put (match b with | "" -> "false" | s when s.[0] = 't' || s.[0] = 'T' -> "true" | _ -> "false") ;; def_code "\\@callopt" (fun lexbuf -> let csname = Scan.get_csname lexbuf in let all_arg = get_prim_arg lexbuf in let lexarg = MyLexing.from_string all_arg in let opt = Subst.subst_opt "" lexarg in let arg = Save.rest lexarg in let exec = csname::"["::opt@["]{";arg;"}"] in scan_this_list Scan.main exec) type css_border = None | Solid | Double (* let echo name n lexbuf = Printf.eprintf "Command %s\n" name ; for i = 1 to n do let arg = subst_arg lexbuf in Printf.eprintf " %i: <<%s>>\n" i arg done *) let init_listings () = Scan.newif_ref "lst@print" lst_print ; Scan.newif_ref "lst@includerangemarker" lst_includerangemarker ; Scan.newif_ref "lst@extendedchars" lst_extended ; Scan.newif_ref "lst@texcl" lst_texcl ; Scan.newif_ref "lst@sensitive" lst_sensitive ; Scan.newif_ref "lst@mathescape" lst_mathescape ; Scan.newif_ref "lst@directives" lst_directives ; Scan.newif_ref "lst@stringspaces" lst_string_spaces ; Scan.newif_ref "lst@showlines" lst_showlines ; Scan.newif_ref "lst@showspaces" lst_showspaces ; Scan.newif_ref "lst@showtabs" lst_showtabs ; def_code "\\lst@spaces" code_spaces ; def_code "\\lst@boolean" lst_boolean ; def_code "\\lst@def@stringizer" code_stringizer ; def_code "\\lst@AddTo" (fun lexbuf -> let sep = Scan.get_prim_arg lexbuf in let name = Scan.get_csname lexbuf in let old = try match Latexmacros.find_fail name with | _, Subst s -> s | _,_ -> [] with | Latexmacros.Failed -> [] in let toadd = get_prim_arg lexbuf in Latexmacros.def name zero_pat (Subst (if is_empty_list old then [toadd] else old@[sep;toadd]))) ; def_code "\\lst@lExtend" (fun lexbuf -> let name = Scan.get_csname lexbuf in try match Latexmacros.find_fail name with | _, Subst body -> let toadd = Subst.subst_arg lexbuf in Latexmacros.def name zero_pat (Subst (body @ ["%\n"^toadd])) | _, _ -> warning ("Cannot \\lst@lExtend ``"^name^"''") with | Latexmacros.Failed -> warning ("Cannot \\lst@lExtend ``"^name^"''")) ; def_code "\\lstnewenvironment" do_newenvironment ; (* Special arg parsing for lstlisting *) def_code (start_env (lst_user_name "lstlisting")) (fun lexbuf -> let keys = Subst.subst_opt "" lexbuf in let lab = if Save.if_next_char '\n' lexbuf then "" else Scan.get_prim_arg lexbuf in let lab = if lab = " " then "" else lab in if lab <> "" then def "\\lst@intname" zero_pat (CamlCode (fun _ -> Dest.put lab)) ; scan_this_list Scan.main ("\\lstset{"::keys@["}"])) ; def_code (end_env (lst_user_name "lstlisting")) (fun _ -> ()) ; def_code (start_env "lstlisting") (open_lst_env "lstlisting") ; (* Init comments from .hva *) def_code "\\lst@balanced@comment" (fun lexbuf -> code_double_delim lst_process_BBC lst_process_EBC lexbuf) ; def_code "\\lst@nested@comment" (fun lexbuf -> code_double_delim lst_process_BNC lst_process_ENC lexbuf) ; def_code "\\lst@line@comment" code_line_comment; (* Idem for delimters *) def_code "\\lst@line@delim" code_line_delim ; def_code "\\lst@single@delim" (fun lexbuf -> code_single_delim lst_process_BBC lst_process_EBC lexbuf) ; def_code "\\lstinline" (fun lexbuf -> Image.stop () ; let keys = Subst.subst_opt "" lexbuf in let {arg=arg} = save_verbatim lexbuf in Scan.new_env "*lstinline*" ; scan_this main "\\mbox{" ; open_lst_inline keys ; Dest.open_group "code" ; begin try scan_this listings arg with | Eof _ -> () end ; close_lst_inline () ; Dest.close_group () ; scan_this main "}" ; Scan.close_env "*lstinline*" ; Image.restart ()) ; def_code "\\lst@definelanguage" (fun lexbuf -> let dialect = get_prim_opt "" lexbuf in let language = get_prim_arg lexbuf in let base_dialect = get_prim_opt "!*!" lexbuf in match base_dialect with | "!*!" -> let keys = subst_arg_list lexbuf in let _ = save_opt "" lexbuf in let xs = "\\lst@definelanguage@{"::language::"}{":: dialect::"}{"::keys@["}"] in scan_this_list main xs | _ -> let base_language = get_prim_arg lexbuf in let keys = subst_arg_list lexbuf in let _ = save_opt "" lexbuf in let xs = "\\lst@derivelanguage@{":: language::"}{"::dialect::"}{":: base_language::"}{"::base_dialect::"}{":: keys@["}"] in scan_this_list main xs) ; (* Interpret 'trblTRBL' subset to yield border-style specifications in CSS2 *) let string_of_border = function | None -> "none" | Solid -> "solid" | Double -> "double" in def_code "\\lst@see@frame" (fun lexbuf -> let arg = get_prim_arg lexbuf in let bs = Array.make 4 None in for i = 0 to String.length arg-1 do match arg.[i] with | 't' -> bs.(0) <- Solid | 'T' -> bs.(0) <- Double | 'r' -> bs.(1) <- Solid | 'R' -> bs.(1) <- Double | 'b' -> bs.(2) <- Solid | 'B' -> bs.(2) <- Double | 'l' -> bs.(3) <- Solid | 'L' -> bs.(3) <- Double | _ -> () done ; let specif = match bs with | [| None ; None ; None ; None |] -> "" | [| Solid ; Solid ; Solid ; Solid |] -> "border-style:solid;" | [| Double ; Double ; Double ; Double |] -> "border-style:double;" | [| bt ; br ; bb ; bl |] when bt=bb && br=bl -> Printf.sprintf "border-style:%s %s;" (string_of_border bt) (string_of_border br) | [| bt ; br ; bb ; bl |] -> Printf.sprintf "border-style:%s %s %s %s;" (string_of_border bt) (string_of_border br) (string_of_border bb) (string_of_border bl) | _ -> assert false in Dest.put specif) ;; register_init "listings" init_listings ;; register_init "fancyvrb" (fun () -> def_code "\\@Verbatim" (fun lexbuf -> let p, f = open_verbenv false in noeof (scan_byline p f) lexbuf) ; def_code "\\@endVerbatim" close_verbenv) ;; let init_longtable () = let is_cmd cmd = Latexmacros.exists (cmd^"@lt@exists") in def_code "\\@longtable" (fun lexbuf -> let out = Out.create_buff () in let again = scan_bycommand out is_cmd lexbuf in scan_this Scan.main again) ; def_code "\\lt@exists" (fun lexbuf -> let cmd = get_csname lexbuf in Latexmacros.def (cmd^"@lt@exists") zero_pat (Subst [])) ; () ;; register_init "longtable" init_longtable ;; (* mathjax *) let init_mathjax auto = (fun () -> Lexstate.jaxauto := auto ; def_code "\\@textjax" (fun lexbuf -> let arg = subst_arg lexbuf in Dest.open_group "*mathjax*" ; Dest.clearstyle () ; Dest.put "\\(" ; Dest.put arg ; Dest.put "\\)" ; Dest.close_group ()) ; def_code "\\mathjax" (fun lexbuf -> Dest.open_group "*mathjax*" ; Dest.clearstyle () ; open_subst lexbuf) ; def_code "\\endmathjax" (fun _lexbuf -> Dest.close_group ()) ; ()) ;; register_init "mathjax@auto" (init_mathjax true); register_init "mathjax@std" (init_mathjax false) ;; def_code "\\@scaninput" (fun lexbuf -> let pre = save_arg lexbuf in let file = get_prim_arg lexbuf in let {arg=post ; subst=post_subst} = save_arg lexbuf in try let true_name,chan = Myfiles.open_tex file in if !verbose > 0 then message ("Scan input file: "^true_name) ; let filebuff = Lexing.from_channel chan in start_lexstate () ; let old_input = !input_verb in if old_input then warning "Nested \\@scaninput" ; input_verb := true ; Location.set true_name filebuff ; begin try record_lexbuf (MyLexing.from_string post) post_subst ; scan_this_may_cont Scan.main filebuff top_subst pre ; with e -> restore_lexstate () ; Location.restore () ; close_in chan ; raise e end ; restore_lexstate () ; Location.restore () ; close_in chan ; input_verb := old_input with | Myfiles.Except -> warning ("Not opening file: "^file) | Myfiles.Error s -> warning s) end } hevea-2.30/table.mli0000644004317100512160000000175707415373521014367 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet PARA, INRIA Rocquencourt *) (* *) (* Copyright 1999 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (***********************************************************************) exception Empty type 'a t val create : 'a -> 'a t val reset : 'a t -> unit val emit : 'a t -> 'a -> unit val apply : 'a t -> ('a -> unit) -> unit val trim : 'a t -> 'a array val to_array : 'a t -> 'a array val remove_last : 'a t -> unit val get_size : 'a t -> int hevea-2.30/figcut.hva0000644004317100512160000000464712017660721014552 0ustar marangetcristal%%% figcut package: figures (and tables) in their own HTML page %%%With contributions by Gilles Gregoire \newif\iffigcut@show\figcut@showtrue \DeclareOption{show}{\figcut@showtrue}%Repeat caption in main text, with link \DeclareOption{noshow}{\figcut@showfalse}%Do not \ProcessOptions* %% Some pointers to original figure env. \let\figcut@figure\figure \let\endfigcut@figure\endfigure \let\figcut@table\table \let\endfigcut@table\endtable %%Inside figure label names are recorded with a global \def \let\figcut@label\label \newcommand{\@def@figlabel}[1]{\global\def\csname #1@figlabel\endcsname{}} \newcommand{\figlabel}[1] {\@auxdowrite{\@print{\@def@figlabel}\{#1\}}% \global\def\current@figlabel{#1}% \figcut@label{#1}} %%So that we can format ref to figures differently. \let\figcut@ref\ref \let\figcut@locref\@locref \newcommand{\fig@locref}[2]{\@aelement{href="\@print{#}#1" target="_new"}{#2}} \newcommand{\figref}[1] {\let\@locref\fig@locref\figcut@ref{#1}\let\@locref\figcut@locref} \renewcommand{\ref}[1] {\@ifundefined{#1@figlabel}{\figcut@ref{#1}}{\figref{#1}}} %%My custom figure %change \hva@caption \let\figcut@caption\hva@caption \newsavebox{\figcut@caption@box} \renewcommand{\hva@caption}[2] {\global\def\figcut@caption@text{#2}% \gsbox{\figcut@caption@box} {\figcut@caption{#1}{#2}}\usebox{\figcut@caption@box}} \newcommand{\figcut@show}[1] {\@hr{.5\linewidth}{1pt}% \begin{center}% \renewcommand{\label}[1]{}\renewcommand{\aname}[2]{##2}% \fig@locref{\current@figlabel} {\csname#1name\endcsname~\csname the#1\endcsname}: \figcut@caption@text% \end{center}% \@hr{.5\linewidth}{1pt}} %change figure env \newsavebox{\figcut@figure@box} \newenvironment{figcut@myfig}[1][] {\begin{lrbox}{\figcut@figure@box}\let\label\figlabel\begin{figcut@figure}[]} {\end{figcut@figure}\end{lrbox}% \begin{cutflow}{\usebox{\figcut@caption@box}}\@out@par{\usebox{\figcut@figure@box}}\end{cutflow}% \iffigcut@show\figcut@show{figure}\fi} \let\figure\figcut@myfig \let\endfigure\endfigcut@myfig \let\figure*\figcut@myfig \let\endfigure*\endfigcut@myfig %change table env \newenvironment{figcut@mytab}[1][] {\begin{lrbox}{\figcut@figure@box}\let\label\figlabel\begin{figcut@table}[]} {\end{figcut@table}\end{lrbox}% \begin{cutflow}{\usebox{\figcut@caption@box}}\@out@par{\usebox{\figcut@figure@box}}\end{cutflow}% \iffigcut@show\figcut@show{table}\fi} \let\table\figcut@mytab \let\endtable\endfigcut@mytab \let\table*\figcut@mytab \let\endtable*\endfigcut@mytab hevea-2.30/booktabs.hva0000644004317100512160000000131510757523076015074 0ustar marangetcristal\ProvidesPackage{booktabs} %Rather awfull way to read the (...) argument arg of \cmidrule %A better solution would be for \cmidrule to follow %usual LaTeX conventions. \def\@bt@op{(} \def\@bt@cp{)} \let\@bt@cmi\@gobble \def\@eatcp#1{% \def\@arg{#1}% \ifx\@arg\@bt@cp\let\@step\@bt@cmi\else\let\@step\@eatcp\fi% \@step} %%No-ops for all commands, perhaps style-sheets permit %%acurate rendering? \newcommand{\@btabs@void}[1][]{} \let\toprule\@btabs@void \let\midrule\@btabs@void \let\bottomrule\@btabs@void \newcommand{\@cmidrule}[1] {\def\@arg{#1}\ifx\@arg\@bt@op\@eatcp\else\@bt@cmi{#1}\fi} \newcommand{\cmidrule}[1][]{\@cmidrule} \let\morecmidrules\relax \newcommand{\specialrule}[3]{} \let\addlinespace\@btabs@voidhevea-2.30/myStack.ml0000644004317100512160000000427212017651434014531 0ustar marangetcristal(***********************************************************************) (* *) (* HEVEA *) (* *) (* Luc Maranget, projet Moscova, INRIA Rocquencourt *) (* *) (* Copyright 2001 Institut National de Recherche en Informatique et *) (* Automatique. Distributed only by permission. *) (* *) (* $Id: myStack.ml,v 1.1 2007-02-08 17:48:28 maranget Exp $ *) (***********************************************************************) exception Fatal of string type 'a t = {mutable l : 'a list ; name : string ; bottom : 'a option} let create name = {l = [] ; name=name ; bottom = None} let create_init name x = {l = [] ; name=name ; bottom = Some x} let reset s = s.l <- [] let bottom msg s = match s.bottom with | None -> raise (Fatal (msg^": "^s.name)) | Some x -> x let name {name=name;_} = name and push s x = s.l <- x :: s.l and pop s = match s.l with | [] -> bottom "pop" s | x :: r -> s.l <- r ; x and top s = match s.l with | [] -> bottom "top" s | x :: _ -> x and top2 s = match s.l with | []|[_] -> bottom "top2" s | _ :: x :: _ -> x and length s = List.length s.l and empty s = match s.l with | [] -> true | _ -> false let pretty f stack = prerr_string stack.name ; prerr_string ": <<" ; let rec do_rec = function | [] -> prerr_endline ">>" | [x] -> prerr_string ("'"^f x^"'") ; prerr_endline ">>" | x :: r -> prerr_string "'" ; prerr_string (f x) ; prerr_string "'" ; do_rec r in do_rec stack.l let rev s = s.l <- List.rev s.l let map s f = s.l <- List.map f s.l type 'a saved = 'a list let empty_saved = [] and save {l=l;_} = l and restore s x = s.l <- x let finalize {l=now;_} p f = let rec f_rec = function | [] -> () | nx::n -> if p nx then () else begin f nx ; f_rec n end in f_rec now hevea-2.30/examples/0000755004317100512160000000000013136046057014377 5ustar marangetcristalhevea-2.30/examples/textcomp-ex.tex0000644004317100512160000001434610374650460017406 0ustar marangetcristal\documentclass{article} \usepackage{textcomp} \makeatletter \newcommand{\ShowTextAccentDefault}[2]{\string#1 & #1{e}\\} \newcommand{\ShowTextSymbolDefault}[2] {\texttt{\textbackslash#1} & \@ifundefined{#1}{not-supported}{\csname#1\endcsname}\\} \begin{document} \begin{tabular}{ll} \hline \multicolumn{1}{c}{\textbf{Command}} & \multicolumn{1}{c}{\textbf{Symbol}} \\ \hline \ShowTextAccentDefault{textcircled}{TS1} \ShowTextAccentDefault{capitalcedilla}{TS1} \ShowTextAccentDefault{capitalogonek}{TS1} \ShowTextAccentDefault{capitalgrave}{TS1} \ShowTextAccentDefault{capitalacute}{TS1} \ShowTextAccentDefault{capitalcircumflex}{TS1} \ShowTextAccentDefault{capitaltilde}{TS1} \ShowTextAccentDefault{capitaldieresis}{TS1} \ShowTextAccentDefault{capitalhungarumlaut}{TS1} \ShowTextAccentDefault{capitalring}{TS1} \ShowTextAccentDefault{capitalcaron}{TS1} \ShowTextAccentDefault{capitalbreve}{TS1} \ShowTextAccentDefault{capitalmacron}{TS1} \ShowTextAccentDefault{capitaldotaccent}{TS1} \ShowTextAccentDefault{t}{TS1} \ShowTextAccentDefault{capitaltie}{TS1} \ShowTextAccentDefault{newtie}{TS1} \ShowTextAccentDefault{capitalnewtie}{TS1} \hline \end{tabular} \begin{tabular}{ll} \hline \multicolumn{1}{c}{\textbf{Command}} & \multicolumn{1}{c}{\textbf{Symbol}} \\ \hline \ShowTextSymbolDefault{textcapitalcompwordmark}{TS1} \ShowTextSymbolDefault{textascendercompwordmark}{TS1} \ShowTextSymbolDefault{textquotestraightbase}{TS1} \ShowTextSymbolDefault{textquotestraightdblbase}{TS1} \ShowTextSymbolDefault{texttwelveudash}{TS1} \ShowTextSymbolDefault{textthreequartersemdash}{TS1} \ShowTextSymbolDefault{textleftarrow}{TS1} \ShowTextSymbolDefault{textrightarrow}{TS1} \ShowTextSymbolDefault{textblank}{TS1} \ShowTextSymbolDefault{textdollar}{TS1} \ShowTextSymbolDefault{textquotesingle}{TS1} \ShowTextSymbolDefault{textasteriskcentered}{TS1} \ShowTextSymbolDefault{textdblhyphen}{TS1} \ShowTextSymbolDefault{textfractionsolidus}{TS1} \ShowTextSymbolDefault{textzerooldstyle}{TS1} \ShowTextSymbolDefault{textoneoldstyle}{TS1} \ShowTextSymbolDefault{texttwooldstyle}{TS1} \ShowTextSymbolDefault{textthreeoldstyle}{TS1} \ShowTextSymbolDefault{textfouroldstyle}{TS1} \ShowTextSymbolDefault{textfiveoldstyle}{TS1} \ShowTextSymbolDefault{textsixoldstyle}{TS1} \ShowTextSymbolDefault{textsevenoldstyle}{TS1} \ShowTextSymbolDefault{texteightoldstyle}{TS1} \ShowTextSymbolDefault{textnineoldstyle}{TS1} \ShowTextSymbolDefault{textlangle}{TS1} \ShowTextSymbolDefault{textminus}{TS1} \ShowTextSymbolDefault{textrangle}{TS1} \ShowTextSymbolDefault{textmho}{TS1} \ShowTextSymbolDefault{textbigcircle}{TS1} \ShowTextSymbolDefault{textohm}{TS1} \ShowTextSymbolDefault{textlbrackdbl}{TS1} \ShowTextSymbolDefault{textrbrackdbl}{TS1} \ShowTextSymbolDefault{textuparrow}{TS1} \ShowTextSymbolDefault{textdownarrow}{TS1} \ShowTextSymbolDefault{textasciigrave}{TS1} \ShowTextSymbolDefault{textborn}{TS1} \ShowTextSymbolDefault{textdivorced}{TS1} \ShowTextSymbolDefault{textdied}{TS1} \ShowTextSymbolDefault{textleaf}{TS1} \end{tabular} \begin{tabular}{ll} \hline \multicolumn{1}{c}{\textbf{Command}} & \multicolumn{1}{c}{\textbf{Symbol}} \\ \hline \ShowTextSymbolDefault{textmarried}{TS1} \ShowTextSymbolDefault{textmusicalnote}{TS1} \ShowTextSymbolDefault{texttildelow}{TS1} \ShowTextSymbolDefault{textdblhyphenchar}{TS1} \ShowTextSymbolDefault{textasciibreve}{TS1} \ShowTextSymbolDefault{textasciicaron}{TS1} \ShowTextSymbolDefault{textgravedbl}{TS1} \ShowTextSymbolDefault{textacutedbl}{TS1} \ShowTextSymbolDefault{textdagger}{TS1} \ShowTextSymbolDefault{textdaggerdbl}{TS1} \ShowTextSymbolDefault{textbardbl}{TS1} \ShowTextSymbolDefault{textperthousand}{TS1} \ShowTextSymbolDefault{textbullet}{TS1} \ShowTextSymbolDefault{textcelsius}{TS1} \ShowTextSymbolDefault{textdollaroldstyle}{TS1} \ShowTextSymbolDefault{textcentoldstyle}{TS1} \ShowTextSymbolDefault{textflorin}{TS1} \ShowTextSymbolDefault{textcolonmonetary}{TS1} \ShowTextSymbolDefault{textwon}{TS1} \ShowTextSymbolDefault{textnaira}{TS1} \ShowTextSymbolDefault{textguarani}{TS1} \ShowTextSymbolDefault{textpeso}{TS1} \ShowTextSymbolDefault{textlira}{TS1} \ShowTextSymbolDefault{textrecipe}{TS1} \ShowTextSymbolDefault{textinterrobang}{TS1} \ShowTextSymbolDefault{textinterrobangdown}{TS1} \ShowTextSymbolDefault{textdong}{TS1} \ShowTextSymbolDefault{texttrademark}{TS1} \ShowTextSymbolDefault{textpertenthousand}{TS1} \ShowTextSymbolDefault{textpilcrow}{TS1} \ShowTextSymbolDefault{textbaht}{TS1} \ShowTextSymbolDefault{textnumero}{TS1} \ShowTextSymbolDefault{textdiscount}{TS1} \ShowTextSymbolDefault{textestimated}{TS1} \ShowTextSymbolDefault{textopenbullet}{TS1} \ShowTextSymbolDefault{textservicemark}{TS1} \ShowTextSymbolDefault{textlquill}{TS1} \ShowTextSymbolDefault{textrquill}{TS1} \end{tabular} \begin{tabular}{ll} \hline \multicolumn{1}{c}{\textbf{Command}} & \multicolumn{1}{c}{\textbf{Symbol}} \\ \hline \ShowTextSymbolDefault{textcent}{TS1} \ShowTextSymbolDefault{textsterling}{TS1} \ShowTextSymbolDefault{textcurrency}{TS1} \ShowTextSymbolDefault{textyen}{TS1} \ShowTextSymbolDefault{textbrokenbar}{TS1} \ShowTextSymbolDefault{textsection}{TS1} \ShowTextSymbolDefault{textasciidieresis}{TS1} \ShowTextSymbolDefault{textcopyright}{TS1} \ShowTextSymbolDefault{textordfeminine}{TS1} \ShowTextSymbolDefault{textcopyleft}{TS1} \ShowTextSymbolDefault{textlnot}{TS1} \ShowTextSymbolDefault{textcircledP}{TS1} \ShowTextSymbolDefault{textregistered}{TS1} \ShowTextSymbolDefault{textasciimacron}{TS1} \ShowTextSymbolDefault{textdegree}{TS1} \ShowTextSymbolDefault{textpm}{TS1} \ShowTextSymbolDefault{texttwosuperior}{TS1} \ShowTextSymbolDefault{textthreesuperior}{TS1} \ShowTextSymbolDefault{textasciiacute}{TS1} \ShowTextSymbolDefault{textmu}{TS1} \ShowTextSymbolDefault{textparagraph}{TS1} \ShowTextSymbolDefault{textperiodcentered}{TS1} \ShowTextSymbolDefault{textreferencemark}{TS1} \ShowTextSymbolDefault{textonesuperior}{TS1} \ShowTextSymbolDefault{textordmasculine}{TS1} \ShowTextSymbolDefault{textsurd}{TS1} \ShowTextSymbolDefault{textonequarter}{TS1} \ShowTextSymbolDefault{textonehalf}{TS1} \ShowTextSymbolDefault{textthreequarters}{TS1} \ShowTextSymbolDefault{texteuro}{TS1} \ShowTextSymbolDefault{texttimes}{TS1} \ShowTextSymbolDefault{textdiv}{TS1} %\UndeclareTextCommand{\textsterling}{OT1} %\UndeclareTextCommand{\textdollar} {OT1} %\UndeclareTextCommand{\textperthousand}{T1} \hline \end{tabular} \end{document} hevea-2.30/examples/boxmodel.tex0000644004317100512160000000103712021655445016732 0ustar marangetcristal%Attempt to understand some box model properties. \documentstyle{article} \newstyle{.external} {display:inline-block;text-align:center;color:red;border:1px solid;padding:2ex;} \newstyle{.internal} {color:navy;border:1px solid;margin:1ex 0ex;} \newenvironment{external} {\@open{div}{class="external"}} {\@close{div}} \begin{document} \begin{center} \begin{external} \@open{h1}{class="internal"}Title\@close{h1} \@open{h3}{class="internal"}Author\@close{h3} \@open{h3}{class="internal"}Date\@close{h3} \end{external} \end{center} \end{document} hevea-2.30/examples/suite.tex0000644004317100512160000010361612021133140016237 0ustar marangetcristal\documentclass{article} \usepackage{a4wide} \usepackage{latexsym} \usepackage[latin1]{inputenc} \usepackage{../hevea} \usepackage{url} \usepackage{makeidx} \usepackage{color,colortbl} \usepackage{ifthen,calc,array,alltt,comment} \usepackage{suite-macros} \title{Test\thanks{Une étoile} de \hevea\thanks{Autre chose}} \makeindex \begin{document} \author{} \maketitle \section{Test des polices} Test {\tt tt \it \Large tt it Large {\bf tt it Large bf } tt it Large {\rm Large rm } et encore \normalsize normalsize} \begin{center}\Large Roman \textsc{\texttt{\textrm{Roman, small caps}}} \textsf{\textit{Sans Sherif family, italic shape} Sans Sherif family} \texttt{\textsl{TT family, slanted shape}} \end{center} \subsection*{Test des tailles} \begin{center}% \newcommand{\tst}[1]{\csname #1\endcsname{}#1} \tst{tiny} \tst{footnotesize} \tst{scriptsize} \tst{small} \tst{normalsize} \tst{large} \tst{Large} \tst{huge} \tst{Huge} \tst{huge} \tst{Large} \tst{large} \tst{normalsize} \tst{small} \tst{scriptsize} \tst{footnotesize} \tst{tiny} \end{center} \begin{htmlonly} \subsection{Mélange de couleurs et de familles} {\red red \purple purple \ttfamily en rouge et tt} {\purple purple \red red \ttfamily en rouge et tt} \end{htmlonly} \begin{htmlonly} \subsection{Couleurs à la \hevea{}} {\Huge \purple purple \silver silver \gray gray \white white \maroon maroon \red red \fuchsia fuchsia \green green \lime lime \olive olive \yellow yellow \navy navy \blue blue \teal teal \aqua aqua \htmlcolor{202020}et \c{c}a, c'est presque noir~? \htmlcolor{e0e0e0}et \c{c}a, c'est presque blanc~? } \end{htmlonly} \subsection{Couleurs à la \textit{color}} \subsubsection{Couleurs par défaut} \textcolor{black}{noir}, \textcolor{white}{blanc}, \textcolor{red}{rouge}, \textcolor{green}{vert}, \textcolor{blue}{bleu}, \textcolor{cyan}{cyan}, \textcolor{yellow}{jaune}, \textcolor{magenta}{magenta}. \definecolor{medium}{gray}{0.5} \textcolor{medium}{gris moyen}. \definecolor{otheryellow}{cmyk}{0, 0, 1, 0.5} \textcolor{otheryellow}{Un autre jaune}. \begin{htmlonly} \subsubsection{Modèle HSV} \newcounter{hue} \whiledo{\value{hue}<360} {\textcolor[hsv]{\thehue,1,1}{\thehue} \addtocounter{hue}{1}} Link colors for the \textsf{fancysection} package: \begin{center} \setcounter{hue}{0} \whiledo{\value{hue}<360} {\textcolor[hsv]{\thehue,1,.4}{\underline{visited}} \textcolor[hsv]{\thehue,1,.7}{\underline{link}} \addtocounter{hue}{10}} \end{center} \subsubsection{Modèle \texttt{named}} \newcommand{\testNamed}[1]{\textcolor[named]{#1}{#1}} \testNamed{GreenYellow} \testNamed{Yellow} \testNamed{Goldenrod} \testNamed{Dandelion} \testNamed{Apricot} \testNamed{Peach} \testNamed{Melon} \testNamed{YellowOrange} \testNamed{Orange} \testNamed{BurntOrange} \testNamed{Bittersweet} \testNamed{RedOrange} \testNamed{Mahogany} \testNamed{Maroon} \testNamed{BrickRed} \testNamed{Red} \testNamed{OrangeRed} \testNamed{RubineRed} \testNamed{WildStrawberry} \testNamed{Salmon} \testNamed{CarnationPink} \testNamed{Magenta} \testNamed{VioletRed} \testNamed{Rhodamine} \testNamed{Mulberry} \testNamed{RedViolet} \testNamed{Fuchsia} \testNamed{Lavender} \testNamed{Thistle} \testNamed{Orchid} \testNamed{DarkOrchid} \testNamed{Purple} \testNamed{Plum} \testNamed{Violet} \testNamed{RoyalPurple} \testNamed{BlueViolet} \testNamed{Periwinkle} \testNamed{CadetBlue} \testNamed{CornflowerBlue} \testNamed{MidnightBlue} \testNamed{NavyBlue} \testNamed{RoyalBlue} \testNamed{Blue} \testNamed{Cerulean} \testNamed{Cyan} \testNamed{ProcessBlue} \testNamed{SkyBlue} \testNamed{Turquoise} \testNamed{TealBlue} \testNamed{Aquamarine} \testNamed{BlueGreen} \testNamed{Emerald} \testNamed{JungleGreen} \testNamed{SeaGreen} \testNamed{Green} \testNamed{ForestGreen} \testNamed{PineGreen} \testNamed{LimeGreen} \testNamed{YellowGreen} \testNamed{SpringGreen} \testNamed{OliveGreen} \testNamed{RawSienna} \testNamed{Sepia} \testNamed{Brown} \testNamed{Tan} \testNamed{Gray} \testNamed{Black} \testNamed{White} \end{htmlonly} \begin{htmlonly} \subsection{Optimizer test} \subsubsection{Testing a direct class definition} Let us consider class ``\texttt{tst}'', {\cls Sans oblique maroon, \hevea}. Below, colors and style in URL's, small ``E'' in \hevea. \begin{itemize} \item Without class: the url~\ahref{\heveaurl}{\hevea} is redirected to~\ahrefurl{\heveasecret}. \item Styled, outside: {\cls the url~\ahref{\heveaurl}{\hevea} is redirected to~\ahrefurl{\heveasecret}. } \item Style, inside: the url~\ahref{\heveaurl}{{\cls\hevea}} is redirected to~\ahrefurl{{\cls\heveasecret}}. \end{itemize} \subsubsection{Testing a direct style definition} Let us consider style ``\texttt{\@tst}'', {\sty Sans oblique maroon, \hevea}. Below, colors and style in URL's, small ``E'' in \hevea. \begin{itemize} \item Without class: the url~\ahref{\heveaurl}{\hevea} is redirected to~\ahrefurl{\heveasecret}. \item Styled, outside: {\sty the url~\ahref{\heveaurl}{\hevea} is redirected to~\ahrefurl{\heveasecret}. } \item Style, inside: the url~\ahref{\heveaurl}{{\sty\hevea}} is redirected to~\ahrefurl{{\sty\heveasecret}}. \end{itemize} \subsubsection{Color mix} \def\col@item{\color@name\textcolor{red}{red}} \newcommand{\color@mix}[1] {{#1{\col@item\color{\color@name}\col@item{\col@item\color{\color@name}\col@item}}\color@name}} \begin{itemize} \item With class: \color@mix{\clshigh} \item With style: \color@mix{\styhigh} \item With color: \color@mix{\color{\color@name}} \item With macro: \color@mix{\green} \end{itemize} One may notice that macro {\green green} and color \textcolor{green}{green}\footnote{Indeed \textcolor{green}{green} is macro {\lime{}\texttt{\backslash{}lime}}. Similarily, \textcolor{magenta}{magenta} is macro {\fuchsia{}\texttt{\backslash{}fuchsia}}, \textcolor{cyan}{cyan} is macro {\aqua{}\texttt{\backslash{}aqua}}}. are different\ldots{} And now the same in monospace font \begin{itemize}\ttfamily \item With class: \color@mix{\clshigh} \item With style: \color@mix{\styhigh} \item With color: \color@mix{\color{\color@name}} \item With macro: \color@mix{\green} \end{itemize} \end{htmlonly} \section{Paragraphs} \subsection{No par skip} coucou \begin{em}coucou\end{em} ha ?? \begin{flushleft} \quad\verb+\begin{list}{+{\it default\_label}\verb+}{+{\it decls}\verb+}+ \end{flushleft} coucou \begin{verbatim} coucou verbatim \end{verbatim} Coucou \begin{quote} Quotation coucou \end{quote} Coucou $$ \left(\begin{array}{ll} 1 & 2 \end{array}\right) \qquad \begin{array}{ll} 1 & 2 \end{array} $$ Yet another\label{nopar} After label. \subsection{Par skip} coucou \begin{em}coucou\end{em} ha ?? \begin{flushleft} \quad\verb+\begin{list}{+{\it default\_label}\verb+}{+{\it decls}\verb+}+ \end{flushleft} coucou \begin{verbatim} coucou vertabim \end{verbatim} Coucou \begin{quote} Quotation coucou \end{quote} Coucou $$ \left(\begin{array}{ll} 1 & 2 \end{array}\right) \qquad \begin{array}{ll} 1 & 2 \end{array} $$ Yet another \label{par} After label. \subsection{Paragraphes dans les listes imbriquées (du à Ph. A. Vitton)} This is a test of nested lists. \begin{itemize} \item This the first item in the top-level \item This is the second item in the top-level \begin{itemize} \item This is the first item in the second level \item This is the second item in the second level \end{itemize} \item This is the last item in the top level \end{itemize} And here is the end of the test. \subsection{Labels des \texttt{enumerate}} \begin{enumerate} \item Pour la numérotation \begin{enumerate} \item Premier. \item Second. \begin{enumerate} \item Encore un. \begin{enumerate}\label{dernierenum} \item \label{dernieritem}Et puis un autre, et là, pour \LaTeX{}, c'est le dernier. \end{enumerate} \end{enumerate} \end{enumerate} \end{enumerate} Le dernier item est~\ref{dernieritem}. Et le dernier enumerate est~\ref{dernierenum}. \section{Arguments} Le i chapô sans espaces~: ``\^\i \^{\i }\^\i\^{\i}'' Le i chapô avec espaces~: ``\^\i{} {\^{\i }} \^\i\ \^{\i}'' Les caract\`eres accentu\'es sans peine~: ``bien \'elev\'e bien \'{e}lev\'{e} tr\`es bien.'' Chaque tableau est un paragraphe {\newcommand{\test}[2]{\begin{tabular}{rcl}arg$_1$ & = & ``#1'' \\ arg$_2$ & = & ``#2''\end{tabular}} \newcommand{\aaa}{$\alpha$} \test{a}{b} \test\aaa\aaa \test\aaa{\aaa} \test\i i} \subsection{Espaces et commandes}\label{espace} \begin{itemize} \item Sans espace~: {avant\bf après}, {avant\let\decl=\bf avant\decl après}, {\newcommand{\avant}{avant}\avant après}, {\newcommand{\test}[1]{#1\bf }\test{avant}après}, {avant\ref{espace}après}, {\newcommand{\test}{\ref{espace}}avant\test après}, {avan\char116 après}. \item Avec espace~: {\let\boite=\textbf\boite{avant} après}, \mbox{avant} après, {\newcommand{\test}[1]{#1\bf}\test{avant} après}, {avant\newcommand{\apres}{après} \apres}, avant\newsavebox{\testb}\sbox{\testb}{avant} {\usebox{\testb} après}, {avant \ref{espace} après}, {\newcommand{\test}[1]{\ref{#1}}avant \test{espace} après}, {avant\label{zorglub} après}, {avan\symbol{116} après}. \end{itemize} \section{Math mode} \subsection{Italiques en mode math} Alors j'y vais~: $1 + a_{i+1} + \int^N_01/x dx + \frac{\partial x}{2}$ Et puis une petite mbox en exposant~: {\LARGE $\alpha^{\mbox{gros $\beta$}}$}. Et puis faut bien essayer les autres trucs: \begin{tabular}{ll} {\bf bold} & $\mathbf{1 + a_{i+1} + \int^N_01/x dx + \frac{\partial x}{2}}$\\ {\sf sans sherif} & $\mathsf{1 + a_{i+1} + \int^N_01/x dx + \frac{\partial x}{2}}$\\ {\it italique} & $\mathit{1 + a_{i+1} + \int^N_01/x dx + \frac{\partial x}{2}}$ \end{tabular} \noindent Bon, on a connu pire~! \subsection{Test des exposants abusifs} $1^{2^{3^{4^5}}}$ \section{Test du display} $$ 1 + {\cal A} + 1 = 3 $$ Comme au dessus mais en mode display: $$1 + a_{i+1} + \int^N_01/x dx + \frac{\partial x}{2}$$ Mauvais espacement en mode display~: $$ {C_N \over C_{N-1}} + \frac{C_{N+1}}{C_N} + \frac{C_{N-2}}{C_{N-1}} + 4 + \cdots + 5 $$ \section{Les fractions} \[ {x\over y} + f+ \frac{a}{b} + 1 \] $$ A \over B $$ \subsection{Exemples d'utilisateurs} Ce sont des mélanges de fractions et de délimiteurs. \subsection{Lévy} {\bfseries $\begin{array}{@{\hspace{0ex}}l@{\hspace{0.6ex}}l} {C_N \over {N+1}} & = {C_{N-1} \over N} + {2 \over {N+1}} = {C_2 \over 3} + \sum_{3 \leq k \leq N} {2 \over {k+1}} \\[1.7ex] &\simeq 2 \sum_{1 \leq k \leq N} {1 \over k} \simeq 2 \int_1^N {1 \over x} dx = 2 \ln N \end{array}$ } \subsection{Brisset} $$ \left\{{b\over\left({c\over{}d}\right)}\right\} $$ \subsection{Alliot} $$ k= \left( \tan {\left[ \left( \frac{n}{N+1}% \right) \frac{\pi}2 \right]}% \right)^{p} $$ \subsection{Maranget} Centrage des num\'erateurs et d\'enominateurs. $$ \sum_{t=2}^T u_{it} + \frac{1}{\frac{1}{1 + \frac{\pi}{2}}} $$ Et $$ \sum_{t=2}^T u_{it} + \frac{\frac{1}{1}}{1 + \frac{\pi}{2}} $$ Ce tableau doit \^etre centr\'e. $$ \begin{array}{cc} 1 & 2\\ 3 & 4 \end{array} $$ Ces forumules sont \texttt{rclr}. $$ \begin{array}{rclr} A_0 & = & 1 & + \frac{1}{2} + \frac{1}{3} \\ A_1 & = & 1 + \frac{1}{2} & + \frac{1}{3}\\ A_1 + \frac{A_1}{1} & \stackrel{\cdots{}A\cdots}{=} & 1 + \frac{1}{2} + \frac{1}{3} & \end{array} $$ \section{Les tableaux} \subsection{Environnement définissant un tableau} \newenvironment{tabdeux}{\begin{tabular}{cc}}{\end{tabular}} \begin{tabdeux} 1 & 2 \end{tabdeux} \subsection{Les modes dans les tableaux} \begin{tabular}{c@{foo}c} \tt tt & \it it\\ \sf sf & \sc sc\\ \end{tabular} \subsection{Tableaux d'une ligne} $$ \begin{array}{ll} 1 & 2 \end{array} $$ $$ \left(\begin{array}{c} 1 \\ \begin{array}{ll} 2 & 3 \end{array} \end{array}\right) $$ \begin{tabular}{|*{10}{c}} 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 \\ 3 & 4 & 5 & 6 & 7 & 8 & 10 & 9 & 1 & 2 \end{tabular} \subsection{Multicolonnes} \begin{tabular}{|rl} zobi & zobi \\ \multicolumn{2}{c}{coucou-coucou} \\ \multicolumn{1}{c}{zobi-1} & \multicolumn{1}{c}{zobi-2} \end{tabular} \begin{center} \newcommand{\sep}{\quad} \begin{tabular}{l|@{\sep}r@{\sep}r@{\sep}r@{\sep}r@{\sep}r} & \texttt{fib} & \texttt{afib} & \texttt{pat} & \texttt{qsort} & \texttt{count}\\ \hline \texttt{join} & 32.0 & 14.5 & 37.2 & 9.9 & 16.4 \\ \texttt{jocaml} & 5.7 & 3.5 & 5.4 & 1.4 & 4.2 \\ \texttt{Bologna} & 11.9 & 6.2 & 9.4 & 16.8 & 5.3 \\ \end{tabular} \end{center} \begin{center} \begin{tabular}{|r|rl|l|} \hline \multicolumn{1}{|c}{$n$} & \multicolumn{1}{|c}{$N$} & & \multicolumn{1}{|c|}{Exemple}\\ \hline 16 & 65 536 & $= \; 6 \times 10^4$ & Macintosh SE/30 \\ \hline 32 & 4 294 967 296 & $= \; 4 \times 10^9$ & Sun, Hp \\ \hline 64 & 18 446 744 073 709 551 616 & $ = \; 2 \times 10^{19}$ & Alpha \\ \hline \end{tabular} \end{center} \begin{tabular}{l@{\qquad}p{.3\linewidth}@{\qquad}p{.3\linewidth}} Macro & \multicolumn{1}{c}{\hevea} & \multicolumn{1}{c}{\LaTeX}\\ \hline \verb+\url{+\textit{url}\verb+}{+\textit{text}\verb+}+ & make \textit{text} an hyperlink to \textit{url} & echo \textit{text}\\ \hline \verb+\footurl{+\textit{url}\verb+}{+\textit{text}\verb+}+ & make \textit{text} an hyperlink to \textit{url} & make \textit{url} a footnote to \textit{text}, \textit{url} is shown in typewriter font\\ \hline \verb+\oneurl{+\textit{url}\verb+}+ & make \textit{url} an hyperlink to \textit{url}. & typeset \textit{url} in typewriter font\\ \hline \verb\\ \verb+\mailto{+address\verb+}+ & make \textit{address} a ``mailto'' link to \textit{address} & typeset \textit{address} in typewriter font\\ \hline \verb+\home{+\textit{text}\verb+}+ & \multicolumn{2}{p{.6\linewidth}}{produce a home-dir url both for output and links, output aspect is: ``\home{\textit{text}}''} \end{tabular} \subsection{Les attributs des tables} \begin{center} \ifhevea \renewcommand{\@table@attributes}{style="width:50\%;border:ridge 10px"}% \fi \begin{tabular}{cc} coucou & foo \\ argl & bar \end{tabular} \ifhevea\renewcommand{\@table@attributes}{style="background:gray;border-spacing:0;border:0"} \newenvironment{bg}[1] {\begin{bgcolor}[style="border-spacing:0;border:0"]{#1}} {\end{bgcolor}} \begin{tabular}{cc} \begin{bg}{red}coucou\end{bg} & \begin{bg}{white}foo\end{bg}\\ argl & \raggedleft \begin{tabular}{cc} \begin{bg}{yellow}coucou\end{bg}&\begin{bg}{green}coucou\end{bg} \end{tabular} \end{tabular} \newcommand{\pair}[2] {\@open{TR}{}% \@open{TD}{style="background-color:yellow"}#1\@close{TD}% \@open{TD}{}#2\@close{TD}\@close{TR}} \newcommand{\impair}[2] {\@open{TR}{}% \@open{TD}{}#1\@close{TD}% \@open{TD}{style="background-color:yellow"}#2\@close{TD}\@close{TR}} \newenvironment{damier} {\@open{TABLE}{style="background:lime;border-spacing:0;border:0"}} {\@close{TABLE}} \newcounter{damier} \begin{damier} \whiledo{\value{damier}<2} {\pair{coucou}{foo} \impair{foo}{coucou} \addtocounter{damier}{1}} \end{damier} \fi \end{center} \subsection{Package \texttt{colortbl}} \newcounter{damierbis} \newcolumntype{C}{>{\columncolor{cyan}}c} \newcolumntype{Y}{>{\columncolor{yellow}}c} \newenvironment{damier}[1] {\ifhevea\renewcommand{\@table@attributes}{style="border-spacing:0;border:0"}\fi \setcounter{damierbis}{#1}\begin{tabular}{YC}} {\end{tabular}} \newcommand{\pair}[2]{#1 & #2} \newcommand{\impair}[2]{\multicolumn{1}{C}{#1} & \multicolumn{1}{Y}{#2}} \begin{damier}{4} \whiledo{\value{damierbis}>0} {\pair{coucou}{foo}\\ \impair{foo}{coucou}\\ \addtocounter{damierbis}{-1}} \pair{coucou}{foo}\\ \impair{foo}{coucou} \end{damier} \subsection{Les délimiteurs} $$ \left\{\begin{array}{cc} \left(\begin{array}{c}1\end{array}\right) & \left(2\right) \end{array}\right\} $$ $$ \left|\left\{ \left( 1 \right) = \left( 1 \right) = \left( 1 \right) = \left[\begin{array}{c}1\\2\\3\end{array}\right] \right\}\right\} $$ $$\begin{array}{lll}\hline \hline \\ \left(\begin{array}{rrr}\hline 4 & 9 & 2 \\ 3 & 5 & 7 \\ 8 & 1 & 6 \\ \hline \end{array} \right) & \left(\begin{array}{rrrrr} 11 & 18 & 25 & 2 & 9 \\ 10 & 12 & 19 & 21 & 3 \\ 4 & 6 & 13 & 20 & 22 \\ 23 & 5 & 7 & 14 & 16 \\ 17 & 24 & 1 & 8 & 15 \end{array} \right) & \left(\begin{array}{rrrrrrc} 22 & 31 & 40 & 49 & 2 & 11 & 20 \\ 21 & 23 & 32 & 41 & 43 & 3 & 12 \\ 13 & 15 & 24 & 33 & 42 & 44 & 4 \\ 5 & 14 & 16 & 25 & 34 & 36 & 45 \\ 46 & 6 & 8 & 17 & 26 & 35 & 37 \\ 38 & 47 & 7 & 9 & 18 & 27 & 29 \\ 30 & 39 & 48 & 1 & 10 & 19 & \left\{\begin{array}{ll} 0 & 0 \\ 0 & 0 \end{array}\right\} \end{array}\right) \\\hline \hline \end{array} $$ \subsection{\texttt{array} et \texttt{tabular} en mode display math} $$ \left(\begin{tabular}{c} $\Gamma$\\ $\Delta$\\ \end{tabular}\right) $$ $$ \left(\begin{array}{c} \Gamma\\ \Delta \end{array}\right) $$ \subsection{Un exemple très tordu} \begin{center} \begin{tabular}{lllllllllllll} % + \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ \\ \\ \\ \\ $+$ \\ \hline \end{tabular} & % + * \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ \\ \\ \\ $*$ \\ $+$ \\ \hline \end{tabular} & % + * + \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ \\ \\ $+$ \\ $*$ \\ $+$ \\ \hline \end{tabular} & % + * + 35 \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ \\ $35$ \\ $+$ \\ $*$ \\ $+$ \\ \hline \end{tabular} & % + * 71 \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ \\ \\ 71 \\ $*$ \\ $+$ \\ \hline \end{tabular} & % + * 71 + \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ \\ $+$ \\ 71 \\ $*$ \\ $+$ \\ \hline \end{tabular} & % + * 71 + 5 \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ 5 \\ $+$ \\ 71 \\ $*$ \\ $+$ \\ \hline \end{tabular} & % + 781 \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ \\ \\ \\ 781 \\ $+$ \\ \hline \end{tabular} & % + 781 * \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ \\ \\ $*$ \\ 781 \\ $+$ \\ \hline \end{tabular} & % + 781 * + \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ \\ $+$ \\ $*$ \\ 781 \\ $+$ \\ \hline \end{tabular} & % + 781 * + 7 \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ 7 \\ $+$ \\ $*$ \\ 781 \\ $+$ \\ \hline \end{tabular} & % + 781 * 15 \begin{tabular}{|@{\enspace}c@{\enspace}|} \\ $*$ \\ 15 \\ $*$ \\ 781 \\ $+$ \\ \hline \end{tabular} & % + 781 * 15 * 9* 9 \begin{tabular}{|@{\enspace}c@{\enspace}|} 9 \\ $*$ \\ 15 \\ $*$ \\ 781 \\ $+$ \\ \hline \end{tabular} % 1996 \end{tabular} \end{center} \subsubsection{Quelques délimiteurs imbriqués} \begin{table}[h] $$ \left[\left(\begin{array}{cc} 1 & 2 \\ \alpha & a_i^k \end{array}\right) + \sum_{j=0}^{\kappa(j) < \Delta(k)} \left|\begin{array}{cc} {\cal A} & \aleph \\ \gamma & \partial x\over y \end{array}\right|\right] $$ \caption{\label{t1}Les délimiteurs dans une table (voir section~\ref{allrefs})} \end{table} \subsection{Les exposants terribles}\label{plushaut} $$ 2^{\left.\begin{array}{@{}c@{}} {\mbox{\scriptsize 2}^{\mbox{$\cdot^{\mbox{$\cdot^{\mbox{$\cdot^2$}}$}}$}} }\end{array}\right\} n} $$ \subsection{Newtheorm + cases} \newtheorem{theoreme}{Th\'eor\`eme} \newtheorem{ath}[theoreme]{Autre théorème} \newcommand{\Preuve}{\noindent{\bf Preuve} ~} \begin{theoreme}\label{un} Soit $M^p$ la puissance p-i\`eme de la matrice $M$, le co{e}fficient $M^{p}_{i,j}$ est \'egal au nombre de chemins de longueur $p$ de $G$ dont l'origine est le sommet $x_i$ et dont l'extr\'emit\'e est le sommet $x_j$. \end{theoreme} \begin{ath}[Pour voir]\label{deux} Ça devrait avoir le numéro 2. \end{ath} \Preuve On effectue une r\'ecurrence sur $p$. Pour $p=1$ le r\'esultat est imm\'ediat car un chemin de longueur $1$ est un arc du graphe. Le calcul de $M^p$, pour $p > 1$ donne: \[M^{p}_{i,j} = \sum_{k=1}^{n}M^{p-1}_{i,k} M_{k,j}\] Or tout chemin de longueur $p$ entre $x_i$ et $x_j$ se d\'ecompose en un chemin de longueur $p-1$ entre $x_i$ et un certain $x_k$ suivi d'un arc reliant $x_k$ et $x_j$. Le r\'esultat d\'ecoule alors de l' hypoth\`ese de r\'ecurrence suivant laquelle $M^{p-1}_{i,k}$ est le nombre de chemins de longueur $p-1$ joignant $x_i$ \`a $x_k$. $$L(i,j)=\cases{1 + L(i-1,j-1) &si $a_i=b_j$ \cr \max (L(i,j-1),L(i-1,j)) &sinon.} \eqno{(*)} $$ \section{Les boîtes} \newsavebox{\coucou} \begin{lrbox}{\coucou} Coucou! \end{lrbox} \usebox{\coucou} {\ttfamily $$ \usebox{\coucou} \begin{lrbox}{\coucou} \(\int^1_0 \pi dx\) \end{lrbox} \usebox{\coucou} \sbox{\coucou}{} \mbox{C'est du tt vide: ``\usebox{\coucou}''} $$} \section{Quelques références}\label{ici}\label{allrefs} Alors ici je suis en~\ref{ici}. Ensuite je serai là-bas en~\ref{labas}. Il y a déjà un petit moment j'étais plus haut avec plein de potes exposants~\ref{plushaut}. J'ai aussi écrit des théorèmes~\ref{un} et~\ref{deux}. J'ai déjà fait une table~: la table~\ref{t1}. J'en ai une autre à la fin, la table~\ref{t2}. J'essaie aussi une figure~\ref{figure} \begin{figure}[t] \begin{center}Pan dans la figure\end{center} \caption{\label{figure}Je suis une figure} \end{figure} \subsection{Poussons le vice ici\label{vice}~\ref{vice}} Cette sous-section~\ref{vice} pousse le vice jusqu'à avoir à la fois un \verb+\label+ et un \verb+\ref+ dans son titre. \section{Quelques notes de bas de page}\label{labas} Coucou\footnote{coucou} \textsl{et là ??\footnote{Une autre}}. Une note recomposée\footnotemark\footnotetext{Numéro \ifhevea{}quatre\else{}trois\fi}. \begin{table*} \begin{flushleft} Ceci est la table de la fin.\\ Bref c'est fini.\\ \end{flushleft} \caption{\label{t2}} \end{table*} \section{Encore un effort} \def\trans#1{\stackrel{#1}{\rightarrow}} $$ A_0 = \epsilon(\{e_0\}) \trans{\alpha_0} A_1 \trans{\alpha_1} \cdots \trans{\alpha_{k-1}} A_k $$ $$ e_i \in \epsilon(A) ~ \mbox{et} ~ (e_i,e_{i+1},\epsilon) \in T \Rightarrow e_{i+1} \in \epsilon(A) $$ $$ A^{3+k-1}_{j+8-i} $$ $$\tt \alpha_j $$ \begin{itemize}\label{coucou} \item Chouette r\'ef\'erence~\ref{coucou}, non ? \end{itemize} \section{Quelques listes}\label{listes} \begingroup \begin{trivlist} \item Coucou \item Zobi\label{zob:triv} \end{trivlist} \newcounter{coucou} \renewcommand{\thecoucou}{\Alph{coucou}} \begin{list}{\thecoucou}{\renewcommand{\makelabel}[1]{\underline{#1}}\usecounter{coucou}}\label{label-inside-list} \item Coucou \item Zobi\label{zob:under} \end{list} R\'ef\'erence~: \ref{label-inside-list} À comparer avec~: \begin{list}{\thecoucou}{\usecounter{coucou}}\label{zob:top} \item Coucou \item Zobi\label{zob:compare} \end{list} Avec les références \ref{zob:top}, \ref{zob:triv}, \ref{zob:under} et~\ref{zob:compare}. \newenvironment{foo}{\begin{trivlist}\it\item[coucou]}{\end{trivlist}} \begin{foo} Foo! foooooooooooooooooooo. \end{foo} \index{autre@L'index \hevea{} doit être~\ref{listes}} Et puis encore un: \newenvironment{list2}{\begin{list} {}{\setlength{\itemsep}{0em} \setlength{\labelsep}{0em} \renewcommand{\makelabel}[1]{\textbf{$\bullet$\ ##1}}}}{\end{list}} \begin{list2} \item Coucou \item Zobi \begin{list2} \item[a] Coucou \item[b] Zobi \end{list2} \end{list2} \section{Beurk} {\centering coucou} \begin{itemize} \raggedleft \item coucou \end{itemize} {\raggedright coucou} \begin{center} coucou \end{center} \begin{flushleft} coucou \end{flushleft} \begin{flushright} coucou \end{flushright} \endgroup \section{Test de l'index} \newcommand{\gros}[1]{{\Huge#1}} \index{a} \index{a} \index{aa} \index{a|gros} \index{a@$\alpha$} \index{b} \index{b!a} \index{b!a!a} \index{b!a!a} \index{b!a!a!a|gros} \index{b!a!a!a} \index{b!a!a!a!a!a!a|see{ailleurs}} \index{b!a!a!a!a!a!a|textit} \index{b!a!a!a@$\alpha_{\alpha}$} \index{b!a!a!b} \index{b!a!b} \index{b@$\beta$|see{b}} \index{foo} \index{z@\textbf{Pour z}} Dans cet index les numéros sont ceux de cette section, sauf un. \printindex \section{Macro substitution} \noindent X\enspace X\\ X\quad X\\ X\qquad X %\newcommand{\app}[2]{#1{#2}} %\app{\texttt}{coucou} \newcommand{\gensymbol}{{\rm\sl symbol}} \newcommand{\nelist}[2]{#1 {\tt #2} \ldots {\tt #2} #1} Un espace~: ``\nelist{\gensymbol}{sep}'' Tout collé~: \gensymbol {\tt sep} Les arguments substitués sont lexés sans tenir compte de la suite \newcommand{\coucoux}[2]{{#1#2}} \newcommand{\coucoubis}[2]{{#1 #2}} Ca marche~: \coucoux{\it}{zobi} Il y a un espace avant ``zobi''~: [\coucoubis{\it}{zobi}] \subsection{un} Tout pareil: \begin{quote} $1+2^n$ \(1+2^n\) \begin{math}1+2^n\end{math} \ensuremath{1+2^n} $\ensuremath{1+2^n}$ \end{quote} Tout pareil en display: \begin{quote} $$1 + \sum_{i=0}^{2^n} i^i$$ \begin{displaymath} 1 + \sum_{i=0}^{2^n} i^i \end{displaymath} \end{quote} \begin{equation} \pi \sim 3.14159\ldots\label{uneq} \end{equation} \subsection{deux} \begin{equation}\label{deuxeq} e \sim 2.71\ldots \end{equation} J'ai fait deux équations~\ref{uneq} et~\ref{deuxeq}. J'en fais encore deux ci-dessous~\ref{troiseq} et~\ref{cinqeq}: \begin{eqnarray} e & = & \sum_{n=0}^{\infty} \frac{1}{n!}\label{troiseq}\\ \nonumber\pi & \sim & 4 * \arctan(1)\label{quatreeq}\\ \log(1+\epsilon) & = & 1 + \epsilon + O(\epsilon)\label{cinqeq}\\ \nonumber\lefteqn{1 + 2 + 3 + \cdots + n}\\ & = & \frac{n*(n+1)}{2} \end{eqnarray} Les mêmes sans les numéros: \begin{eqnarray*} e & = & \sum_{n=0}^{\infty} \frac{1}{n!}\\ \pi & \sim & 4 * \arctan(1) \end{eqnarray*} \subsection{Display dans les tableaux} Ici, \verb+array+ ouvre le mode ``display maths''. Comparons, $\left[\sum_{n=0}^{\infty} \frac{1}{n!} + \frac{1}{2}\right]$ et $ \left[\begin{array}{c} \sum_{n=0}^{\infty} \frac{1}{n!} + \frac{1}{2} \end{array}\right] $ Et puis aussi la façon de procéder, c'est à dire en mode \emph{display} dès le début~: $$ \left[\begin{array}{c} \displaystyle \sum_{n=0}^{\infty} \frac{1}{n!} + \frac{1}{2} \end{array}\right] $$ \subsubsection{Ellipsis} $$ 1 + 2 + \cdots + n \quad \left\{\begin{array}{c} 1\\ \vdots \\ 2 \end{array}\right\} \quad \left|\begin{array}{ccc} 1 & & \\ & \ddots & \\ & & 2 \end{array}\right| $$ \subsubsection{Replacement symbol} $$ A \leadsto B $$ \subsubsection{Putting one thing above the other} $$ \overline{A} \stackrel{B}{\rightarrow} \underline{C} $$ Et pis en texte: $\overline{A} \stackrel{B}{\rightarrow} \underline{C}$ \subsection{Arrays} \begin{tabular}{*{3}{l}} 1 & 2 & 3\\ \\ 3 & 2 & 1 \end{tabular} \begin{tabular*}{10cm}{*3{|@{\extracolsep{\fill}}l}|} 1 & 2 & 3\\ & & \\ 3 & 2 & 1 \end{tabular*} \section{The \texttt{ifthen} Package} \subsection{Des ok partout} \newboolean{coucou}\newboolean{zob}% \ifthenelse{\boolean{coucou}}{\setboolean{zob}{false}}{\setboolean{zob}{true}}% \ifthenelse{\boolean{coucou}}{malaise}{ok} \ifthenelse{\boolean{coucou} \or \boolean{zob}}{ok}{malaise} \newcommand{\vrai}{true}% \ifthenelse{\equal{\vrai}{true} \and \not\(\equal{\vrai}{}\)}{ok}{malaise} \subsection{La totale} {\newcounter{ca}\newcounter{cb}}% \newcommand{\printgcd}[2]{% \setcounter{ca}{#1}\setcounter{cb}{#2}% Gcd(#1, #2) = \whiledo{\not\(\value{ca}= \value{cb}\)}% {\ifthenelse{\value{ca}>\value{cb}}% {\addtocounter{ca}{-\value{cb}}}% {\addtocounter{cb}{-\value{ca}}}% gcd(\arabic{ca}, \arabic{cb}) = }% \arabic{ca}.}% Test du pgcd : \printgcd{54}{30} \section{The \texttt{calc} package} Aller voir~\cite{latexbis} \section{The \texttt{comment} package} \includecomment{inclus} \begin{comment} \typeout{BUG: je ne devrais pas apparaître~!!!!} \end{comment} \begin{inclus} \begin{itemize} \item Premier item. \end{inclus} \item Deuxième item. \begin{inclus} \item Troisi\`eme item. \end{itemize} \end{inclus} \subsection{Me suis-je planté~?} \newcounter{plante} \setcounter{plante}{2} \addtocounter{plante}{1 + -\value{plante} * -2 } Ça doit faire $7$~: \theplante \setcounter{plante}{\value{plante}/2} Ça doit faire $3$~: \theplante \addtocounter{plante}{1+--1} Ça doit faire $5$~: \theplante \addtocounter{plante}{0-+-+1} Ça doit faire $6$~: \theplante \setcounter{plante}{1+---2} Ça doit faire $-1$~: \theplante \setcounter{plante}{1+-1*-2*-\value{plante}} Ça doit faire $3$~: \theplante \subsection{Pascal chez les Romains} \newcounter{res}\newcounter{x}\newcounter{y} \newcommand{\crec}[2]{% \setcounter{x}{#1}\setcounter{y}{#2}% \ifthenelse{\value{x}=0}{\addtocounter{res}{1}} {\ifthenelse{\value{x}=\value{y}}{\addtocounter{res}{1}}{\crec{#1}{#2-1}\crec{#1-1}{#2-1}}}} \newcommand{\C}[2]{\setcounter{res}{0}\crec{#1}{#2}\theres} \newcommand{\pascalrow}{% \ifthenelse{\value{j} < \value{i}} {\C{\value{j}}{\value{i}}& &\addtocounter{j}{1}\pascalrow} {\C{\value{i}}{\value{i}}}}% \newcounter{i}\newcounter{j}\newcounter{k} \newcommand{\emptycols}[1]{\setcounter{k}{#1}\ifthenelse{\value{k}=0}{}{&\emptycols{#1-1}}}% \newcommand{\pascalcols}[1]{% \setcounter{i}{0}% \whiledo{\value{i} < #1}{% \setcounter{j}{0}% \emptycols{#1-\value{i}-1}\pascalrow% \addtocounter{i}{1}% \ifthenelse{\value{i}<#1}{\\}{}}}% %BEGIN LATEX \newcommand{\PBS}[1]{\let\tmp=\\#1\let\\=\tmp} %END LATEX %HEVEA\newcommand{\PBS}[1]{#1} \newcolumntype{P}[1]{p{#1}} \newcommand{\pascal}[2]{% \setcounter{i}{2*#1-1}% \begin{tabular}{*{\value{i}}{@{}>{\PBS\centering}P{#2}}} \pascalcols{#1} \end{tabular}} \begin{tabular}{cc}\hline \pascal{8}{2ex} & \renewcommand{\theres}{\roman{res}}% \pascal{8}{4ex}\\ \hline \end{tabular} \section{The \texttt{array} package} \subsection{Trucs simples} \newcolumntype{B}[1]{>{\raggedleft}b{#1}} \noindent Aligné en bas (et à droite)~:\\ \begin{tabular}{B{.30\linewidth}|B{.30\linewidth}|B{.30\linewidth}} Ceci est un texte assez long pour faire plusieures lignes, enfin j'espère. En effet les lignes HTML sont plus longues que les lignes de \LaTeX{}, surtout avec le format de ce document de test. & Là aussi il faut bosser un peu pour avoir plus d'une ligne & Là, c'est court exprès \end{tabular} \bigskip \newcolumntype{M}[1]{>{\centering}m{#1}} \noindent Aligné au centre~:\\ \begin{tabular}{M{.30\linewidth}M{.30\linewidth}M{.30\linewidth}} Ceci est un texte assez long pour faire plusieures lignes, enfin j'espère. En effet les lignes HTML sont plus longues que les lignes de \LaTeX{}, surtout avec le format de ce document de test. & Là aussi il faut bosser un peu pour avoir plus d'une ligne & Là, c'est court exprès \end{tabular} \bigskip \noindent Aligné en haut~:\\ \begin{tabular}{p{.30\linewidth}p{.30\linewidth}p{.30\linewidth}} \raggedright Ceci est un texte assez long pour faire plusieures lignes, enfin j'espère. En effet les lignes HTML sont plus longues que les lignes de \LaTeX{}, surtout avec le format de ce document de test. & Là aussi il faut bosser un peu pour avoir plus d'une ligne & Là, c'est court exprès \end{tabular} \bigskip \noindent Mais si on mélange, alors ça n'a plus rien à voir~:\\ \begin{tabular}{b{.30\linewidth}p{.30\linewidth}b{.30\linewidth}} \raggedright Ceci est un texte assez long pour faire plusieures lignes, enfin j'espère. En effet les lignes HTML sont plus longues que les lignes de \LaTeX{}, surtout avec le format de ce document de test. & Là aussi il faut bosser un peu pour avoir plus d'une ligne & Là, c'est court exprès \end{tabular} \subsection{Horreurs diverses} $$ \begin{array}{c@{=}>{$n }c<{ n$}} \Gamma_A & Coucou \\ \hline \multicolumn{2}{>{m }b{2cm}<{ m}}{coucou}\\ \hline \Gamma_A & Coucou \\ \end{array} $$ $$ \begin{array}{c@{=}c} \Gamma_A & Coucou \\ \hline \multicolumn{2}{>{m }b{2cm}<{ m}}{coucou coucou}\\ \hline \Gamma_A & Coucou \\ \end{array} $$ \begin{tabular}{>{\bf}c|>{\it}r} Coucou & Zob\\ Foo & Foobis\\ \end{tabular} \begin{tabular}{c>{$}c<{$}} Coucou & \Gamma_A\\ Coucou & \Gamma_A \\ \end{tabular} \section{Macros \TeX} \begin{flushleft} \newcommand{\testone}[2][default]{\texttt{testone}(#1,#2)} \def\testtwo[#1]#2{\texttt{testtwo}(#1,#2)} \def\argument{argument} \noindent \testone{argument}; \\ \testone[bracketed argument]{argument}. \\ \testtwo[bracketed {\bf argument]}]{argument}. \noindent \testone{\argument}; \\ \testone [bracketed \argument] {\argument}. \\ \testtwo[bracketed \argument]{\argument}. \def\Look{\textsc{Look}} \def\x{\textsc{x}} \def\cs AB#1#2C$#3\$ {#3{ab#1}#1 c\x #2}%$ \cs AB {\Look}{}C${And \$}{look}\$ 5. \def\moi AVANT#1APRES{#1} \moi AVANTAPRAPRES \def\toi#1AAC{#1} ``\toi AAAC'' \end{flushleft}%$ \begingroup \def\ya #1{\def\yb ##1#1{\def\yc ####1##1{\def\yd ########1####1{########1 + ####1 + ##1 + #1}}}}% Ça doit faire : 4 + 3 + 2 + 1 Ça fait : \ya{1}\yb21\yc32\yd43 \endgroup \subsection{Test de \texttt{\char92csname}} Ce test réalise un tableau à affectation unique. \begin{flushleft} \def\zset#1#2{\expandafter\def\csname coucou#1\endcsname{#2}}% \def\zget#1{\csname coucou#1\endcsname}% \zset{100}{cent}% cent: \zget{100} \newcounter{foo}\zset{\thefoo}{coucou}% coucou: \zget{\thefoo} \stepcounter{foo}\zset{\thefoo}{encore}% encore: \zget{\thefoo}, coucou: \zget{0} \def\zob{zob}\def\foo{\zob}\zset{\foo}{FOO}% FOO: \zget{zob} \zset{10}{zorglub}\zset{\zget{10}}{\texttt{coucou}}% \texttt{coucou}: \zget{\zget{10}}, \texttt{coucou}: \zget{zorglub} \end{flushleft} \section{Un peu de \texttt{alltt}} \newcommand{\nth}[2]{${#1}_{#2}$} \begin{alltt} ocamlrun caml.out \nth{arg}{1} \nth{arg}{2} \ldots \nth{arg}{n} \end{alltt} \begin{alltt} ocamlc -use-runtime /home/me/ocamlunixrun -o myprog \char92 unix.cma threads.cma {\it{your .cmo and .cma files}} \end{alltt} \newcommand{\under}[1]{$_{\mbox{#1}}$} \newcommand{\rien}[1]{~#1~} \begin{alltt} Et voici notre ami le ``#1'' et notre pote le ``_''. Et voici une macro qui fait des indices A\under{1}. \end{alltt} Bon y avait un problème avec les arguments dont le caractère alltt ou pas est à considérer là où il apparaissent en tant qu'arguments. Bref ya des \verb+$$+ là dessous: \begin{alltt} \rien{\rien{\rien{$$}}} \end{alltt} %\newenvironment{vicieux}{\begin{alltt}\Large}{\end{alltt}} %\begin{vicieux}\rien{\rien{$$}}\end{vicieux} Normalement on a des tirets genre \verb+-- & --+, ici \texttt{-- \& ---}, et dessous aussi~: \begin{alltt} -- & -- \end{alltt} \section{Les notes de bas de page en folie} I hate this footnote\footnote{this is the footnote} twice\footnotemark[\value{footnote}]. \newcounter{bof}\setcounter{bof}{\value{footnote}}\addtocounter{bof}{1} It was Gnats\footnotemark\ and Gnus\footnotemark\ \addtocounter{footnote}{-1}% \footnotetext{Small insects}% \addtocounter{footnote}{1}\footnotetext{Large mammals}% as we trekked through Africa, and gnats\footnotemark[\value{bof}] and gnus\addtocounter{bof}{1}\footnotemark[\value{bof}] again and again\ldots Une dernière note de bas de page pour la route\footnote{Je suis la dernière}. \begin{thebibliography}{xxxxxxxxxx} \bibitem[\LaTeX-bis]{latexbis} M.~Gooseens, F.~Mittelbach, A.~Samarin. \newblock {\em The \LaTeX{} Companion} \newblock Addison-Websley, 1994. \bibitem{foo} Numéro un. \end{thebibliography} \end{document} hevea-2.30/examples/mathpartir-test.tex0000644004317100512160000003301310077737453020261 0ustar marangetcristal% Mathpartir --- Math Paragraph for Typesetting Inference Rules % % Copyright (C) 2001, 2002, 2003 Didier Rémy % % Author : Didier Remy % Version : 1.1.1 % Bug Reports : to author % Web Site : http://pauillac.inria.fr/~remy/latex/ % % WhizzyTeX is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2, or (at your option) % any later version. % % Mathpartir is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details % (http://pauillac.inria.fr/~remy/license/GPL). % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % File mathpartir.tex (Documentation) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \documentclass {article} \usepackage {mathpartir} \usepackage {listings} \usepackage {array} \usepackage {url} \newif \ifhevea %HEVEA \heveatrue \ifhevea \usepackage {hevea} \fi \lstset {basicstyle=\tt} \let \lst \verb \title {Remy's Mathpartir} \begin{document} \begin{abstract} This package provides macros for displaying lists of formulas that are typeset in mixed horizontal and vertical modes. The package is two-folded. The first part is an environment \verb"mathpar" that generalizes the math display mode to allow several formulas on the same line, and several lines in the same display. The arrangement of the sequence of formulas into lines is automatic depending on the line width and on a minimum inter-formula space and line width alike words in a paragraphs (in centerline mode). A typical application is displaying a set of type inference rules. The second par is a macro \lst"inferrule" to typeset inference rules themselves. Here again, both premises and conclusions are presented as list of formulas that should be displayed in almost the same way, except that the width is not fixed in advance; and the inference rule should use no more width than necessary so that other inference rules are given a chance to appear on the same line. Although \verb"mathpar" and \verb"inferrule" look similar in their specification, and are often used in combination, they are in fact completely different in their implementations. \end{abstract} \section {The mathpar environment} The mathpar environment is a ``paragraph mode for formulas''. It allows to typeset long list of formulas putting as many as possible on the same line: $$ \begin{tabular}{m{0.45\hsize}m{0.1\hsize}m{0.45\hsize}} \begin{lstlisting}{Ocaml} \begin{mathpar} A-Formula \and Longer-Formula \and And \and The-Last-One \end{mathpar} \end{lstlisting} & ~~~ & \begin{mathpar} A-Formula \and Longer-Formula \and And \and The-Last-One \end{mathpar} \end{tabular} $$ Formulas are separated by \verb"\and" (or equivalently by a blank line). To enforce a vertical break it sufficies to replace \verb"\and" by \verb"\\". The implementation of \verb"mathpar" entirely relies on the paragraph mode for text. It starts a new paragraph, and a math formula within a paragraph, after adjusting the spacing and penalties for breaks. Then, it simply binds \verb"\and" to something like \verb"\goodbreak". \section {The inferrule macro} The inferrule macro is designed to typeset inference rules. It should only\footnote {Even though the basic version may work in text mode, we discourage its use in text mode; the star-version cannot be used in text-mode} be used in math mode (or display math mode). The basic use of the rule is \begin{verbatim} \inferrule {one \\ two \\ three \\ or \\ more \\ premisses} {and \\ any \\ number \\ of \\ conclusions \\ as \\ well} \end{verbatim} This is the rendering on a large page \def \one {\inferrule {one \\ two \\ three \\ or \\ more \\ premisses} {and \\ any \\ number \\ of \\ conclusions \\ as \\ well} } $$ \ifhevea \one \else \fbox {\vbox {\advance \hsize by -2\fboxsep \advance \hsize by -2\fboxrule \linewidth\hsize $$\one$$}} \fi $$ However, the same formula on a narrower page will automatically be typsetted like that: \def \two {\inferrule {one \\\\ two \\ three \\ or \\\\ more \\ premisses} {and \\ any \\ number \\\\ of \\ conclusions \\\\ as \\ well} } $$ \ifhevea \two \else \fbox {\hsize 0.33 \hsize \vbox {$$\two$$}} \fi $$ An inference rule is mainly composed of a premisse and a conclusion. The premisse and the conclusions are both list of formulas where the elements are separated by \verb"\\". Note the dissymetry between typesetting of the premisses and of conclusions where lines closer to the center are fit first. A newline can be forced by adding an empty line \verb"\\\\" \begin{tabular}{m{0.44\hsize}m{0.1\hsize}m{0.44\hsize}} \begin{lstlisting}{Ocaml} \inferrule {aa \\\\ bb} {dd \\ ee \\ ff} \end{lstlisting} & ~~~ & $\inferrule {aa \\\\bb}{dd \\ ee \\ ff}$ \\ \end{tabular} \subsection {Single rules} Single rules are the default mode. Rules are aligned on their fraction bar, as illustrated below: $$ \inferrule {aa \\ bb}{ee} \hspace {4em} \inferrule {aa \\\\ bb \\ ee}{ee} $$ If the premise or the conclusion is empty, then the fraction bar is not typeset and the premise or the conclusion is centered: $$ \begin{tabular}{m{0.3\hsize}m{0.05\hsize}m{0.3\hsize}m{0.05\hsize}m{0.3\hsize}} \begin{lstlisting}{Ocaml} \inferrule {}{aa} + \inferrule {aa \\\\ aa}{} \end{lstlisting} & ~~~~~~~~ & $\inferrule {}{aa}$ & $+$ & $\inferrule {aa \\\\ aa}{}$ \\ \end{tabular} $$ Use use \verb"{ }" instead of \verb"{}" to get an axiom for instance: $$ \begin{tabular}{m{0.45\hsize}m{0.1\hsize}m{0.45\hsize}} \begin{lstlisting}{Ocaml} \inferrule { }{aa} + \inferrule {aa}{ } \end{lstlisting} & ~~~~~~ & $ \inferrule { }{aa} + \inferrule {aa}{ } $ \\ \end{tabular} $$ The macro \lst"\inferrule" acceps a label as optional argument, which will be typeset on the top left corner of the rule: \par \begin{tabular}{m{0.45\hsize}m{0.1\hsize}m{0.45\hsize}} \begin{lstlisting}{Ocaml} \inferrule [yop] {aa \\ bb} {cc} \end{lstlisting} & $\inferrule [Yop]{aa \\ bb}{cc}$ \\ \end{tabular} \par\noindent See section~\ref {options} for changing typesetting of labels. A label can also be placed next to the rule directly, since the rule is centered: \par \begin{tabular}{m{0.45\hsize}m{0.1\hsize}m{0.45\hsize}} \begin{lstlisting}{Ocaml} \inferrule {aa \\ bb} {cc} \quad (\textsc {Yop}) \end{lstlisting} & ~~~~~~ & $\inferrule{aa \\ bb}{cc} \quad (\textsc {Yop})$ \\ \end{tabular} \subsection {Customizing} By default, lines are centerred in inference rules. However, this can be changed by either \lst"\mprset{flushleft}" or \lst"\mprset{center}". For instance, \begin{tabular}{m{0.44\hsize}m{0.12\hsize}m{0.44\hsize}} \begin{lstlisting}{Ocaml} $$\mprset{flushleft} \inferrule {a \\ bbb \\\\ ccc \\ dddd} {e \\ ff \\ gg}$$ \end{lstlisting} & ~~~~~ & $$\mprset{flushleft} \inferrule {a \\ bbb \\\\ ccc \\ dddd}{e \\ ff \\ gg}$$ \\ \end{tabular} \noindent Note that lines are aligned independently in the premise and the conclusion, which are both themselves centered. In particular, left alignment will not affect a single-line premisse or conclusion. \subsection {Derivation trees} To help writing cascades of rules forming a derivation tree, inference rules can also be aligned on their bottom line. For this, we use the star-version: $$ \begin{tabular}{m{0.45\hsize}m{0.1\hsize}m{0.45\hsize}} \begin{lstlisting}{Ocaml} \inferrule* {\inferrule* {aa \\ bb}{cc} \\ dd} {ee} \end{lstlisting} & ~~~~~~ & $ \inferrule* {\inferrule* {aa \\ bb}{cc} \\ dd} {ee} $ \\ \end{tabular} $$ The star version can also take an optional argument, but with a different semantics. The optional argument is parsed by the \verb"keyval" package, so as to offer a set of record-like options: $$ \def \val {{\em v}} \def \arraystretch {1.4} \begin{tabular}{|>{\tt}c|p{0.7\hsize}|} \hline \bf key & \bf Effect for value {\val} \\\hline\hline before & Execute {\val} before typesetting the rule. Useful for instance to change the maximal width of the rule. \\\hline width & Set the width of the rule to {\val} \\\hline narrower & Set the width of the rule to {\val} times \verb"\hsize". \\\hline left & Put a label {\val} on the left of the rule \\\hline Left & Idem, but as if the label had zero width. \\\hline Right & As \verb"Left", but on the right of the rule. \\\hline right & As \verb"left", but on the right of the rule. \\\hline leftskip & Cheat by (skip negative space) {\val} on the left side. \\\hline rightskip & Cheat by {\val} on the right side of the rule. \\\hline vdots & Raise the rule by {\val} and insert vertical dots. \\\hline \end{tabular} $$ Here is an example of a complex derivation: $$ \inferrule* [left=Total] {\inferrule* [Left=Foo] {\inferrule* [Right=Bar, leftskip=2em,rightskip=2em,vdots=1.5em] {a \\ a \\\\ bb \\ cc \\ dd} {ee} \\ ff \\ gg} {hh} \\\\ \inferrule* [lab=XX]{uu \\ vv}{ww} } {(1)} $$ and its code \begin{lstlisting}{Ocaml} \inferrule* [left=Total] {\inferrule* [Left=Foo] {\inferrule* [Right=Bar, leftskip=2em,rightskip=2em,vdots=1.5em] {a \\ a \\\\ bb \\ cc \\ dd} {ee} \\ ff \\ gg} {hh} \\ \inferrule* [lab=XX]{uu \\ vv}{ww}} {(1)} \end{lstlisting} \def \L#1{\lower 0.4ex \hbox {#1}} \def \R#1{\raise 0.4ex \hbox {#1}} \def \hevea {H\L{E}\R{V}\L{E}A} \def \hevea {$\mbox {H}\!_{\mbox {E}}\!\mbox {V}\!_{\mbox {E}}\!\mbox {A}$} \subsection {Implementation} The main macro in the implementation of inference rules is the one that either premises and conclusions. The macros uses two box-registers one \verb"hbox" for typesetting each line and one \verb"vbox" for collecting lines. The premise appears as a list with \verb"\\" as separator. Each element is considered in turn typeset in a \verb"hbox" in display math mode. Its width is compare to the space left on the current line. If the box would not fit, the current horizontal line is transferred to the vertical box and emptied. Then, the current formula can safely be added to the horizontal line (if it does not fit, nothing can be done). When moved to the vertical list, lines are aligned on their center (as if their left-part was a left overlapped). At the end the vbox is readjusted on the right. This description works for conclusions. For premises, the elements must be processes in reverse order and the vertical list is simply built upside down. \section {Other Options} \label {options} The package also defines \verb"\infer" as a shortcut for \verb"\inferrule" but only if it is not previously defined. The package uses \verb"\TirName" and \verb"\RefTirName" to typeset labels, which can safely be redefined by the user. The former is used for defining occurrences ({\em ie.} in rule \lst"\inferrule") while the latter is used for referencing ({\em ie.} in the star-version). The vertical space in \verb"mathpar" is adjusted by \verb"\MathparLineskip". To restore the normal paragraph parameters in mathpar mode (for instance for some inner paragraph), use the command \verb"\MathparNormalpar". The environment uses \verb"\MathparBindings" to rebind \verb"\\", \verb"and", and \verb"\par". You can redefine thus command to change the default bindings or add your own. \section {Examples} See the source of this documentation ---the file \lst"mathpartir.tex"--- for full examples. \section {{\hevea} compatibility} The package also redefines \verb"\hva" to do nothing in \lst"mathpar" environment and nor in inference rules. In HeVeA, \verb"\and" will always produce a vertical break in mathpar environment; to obtain a horizontal break, use \verb"\hva \and" instead. Conversely, \verb"\\" will always produce a horizontal break in type inference rules; to obtain a vertical break, use \verb"\hva \\" instead. For instance, by default the following code, \begin{lstlisting}{Ocaml} \begin{mathpar} \inferrule* [Left=Foo] {\inferrule* [Right=Bar,width=8em, leftskip=2em,rightskip=2em,vdots=1.5em] {a \\ a \\ bb \\ cc \\ dd} {ee} \\ ff \\ gg} {hh} \and \inferrule* [lab=XX]{uu \\ vv}{ww} \end{mathpar} \end{lstlisting} which typesets in {\TeX} as follows, \begin{mathpar} \inferrule* [Left=Foo] {\inferrule* [Right=Bar,width=8em, leftskip=2em,rightskip=2em,vdots=1.5em] {a \\ a \\ bb \\ cc \\ dd} {ee} \\ ff \\ gg} {hh} \and \inferrule* [lab=XX]{uu \\ vv}{ww} \end{mathpar} would appear as follows with the compatible {\hevea} mode: \begin{mathpar} \inferrule* [left=Foo] {\inferrule* [right=Bar] {a \\ a \\ bb \\ cc \\ dd} {ee} \\ ff \\ gg} {hh} \\ \inferrule* [lab=XX]{uu \\ vv}{ww} \end{mathpar} To obtain (almost) the same rendering as in {\TeX}, it could be typed as \begin{lstlisting}[escapechar=\%]{Ocaml} \begin{mathpar} \inferrule* [Left=Foo] {\inferrule* [Right=Bar,width=8em, leftskip=2em,rightskip=2em,vdots=1.5em] {a \\ a \hva \\ bb \\ cc \\ dd} {ee} \\ ff \\ gg} {hh} \hva \and \inferrule* [lab=XX]{uu \\ vv}{ww} \end{mathpar} \end{lstlisting} Actually, it would be typeset and follows with the compatible {\hevea} mode: \begin{mathpar} \inferrule* [left=Foo] {\inferrule* [right=Bar] {a \\ a \\\\ bb \\ cc \\ dd} {ee} \\ ff \\ gg} {hh} \and \inferrule* [lab=XX]{uu \\ vv}{ww} \end{mathpar} \end{document} \end{document} % LocalWords: mathpar aa Yop bb dd ee ff cc Ocaml Foo leftskip rightskip vdots % LocalWords: gg hh uu vv ww HeVeA escapechar hevea-2.30/examples/babel.tex0000644004317100512160000000405010101327346016155 0ustar marangetcristal\documentclass{article} \usepackage[english,french,austrian,german]{babel} %\usepackage{babel} \usepackage{makeidx} \makeindex \title{Babel} \author{XYZ} %\newcommand{\DQ}[1]{\dq#1~~"#1} \begin{document} The initial language is : \iflanguage{german}{german}{bonga} \\ \today\\ \newcommand{\DQ}[1]{\dq#1~~\"#1} \maketitle \selectlanguage{french} \'a\'e\'i\'b\'o\'u\\ \`a\`e\`i\`b\`o\`u\\ \^a\^e\^i\^b\^o\^u\\ \'A\'E\'I\'B\'O\'U\\ \`A\`E\`I\`B\`O\`U\\ \^A\^E\^I\^B\^O\^U\\ This checks current language (?) : %\current@language \iflanguage{french}{french}{bonga}\\ \today\\ \tableofcontents \selectlanguage{german} This checks current language (?) : %\current@language \iflanguage{german}{german}{bonga}\\ \today\\ \begin{abstract} This is the abstract. \end{abstract} \section{Correspondences in German} \index{Correspondances in German} \DQ{s}\\ \DQ{S}\\ \DQ{a}\\ \DQ{A}\\ \DQ{e}\\ \iflanguage{german}{german}{bonga}~before entering ``table'' \begin{table} \selectlanguage{french} \caption{NOTABLE} \iflanguage{french}{french}{bonga}~declared for the ``table'' \end{table} The language now is (german? french?) : \iflanguage{german}{german}{bonga} ~when you get out outside the ``table''\\ \DQ{E}\\ \DQ{i}\\ \DQ{I}\\ \DQ{o}\\ \DQ{O}\\ \DQ{u}\\ \DQ{U} \section{Quotes} \index{Quotes} \noindent Trying out the quotation mark itself : \dq\\ \glqq Trying out quotes \grqq\\ \glq Trying out single quotes \grq\\ \flqq Trying out French quotes \frqq\\ \flq Trying out french single quotes \frq\\ %\"<\\ %\">\\ %\"`\\ %\"' \selectlanguage{english}\\ \today\\ The language is : \iflanguage{english}{english}{bonga} \section{Correspondences in French} \index{Correspondences in French} \selectlanguage{french} The language is : \iflanguage{french}{french}{bonga}\\ \today\\ \newcommand{\LS}[1]{`#1~~\`#1} \newcommand{\RS}[1]{'#1~~\'#1} \newcommand{\HAT}[1]{$\wedge$#1~~\^#1} \LS{a}\\ \RS{e}\\ \HAT{u}\\ \selectlanguage{austrian}\\ \today\\ The language is : \iflanguage{austrian}{austrian}{bonga} \appendix \section{Bonga} ahh .. this works as well !! \printindex \end{document} hevea-2.30/examples/listings.tex0000644004317100512160000000346412017660721016761 0ustar marangetcristal\documentclass{article} \usepackage{listings} \usepackage{color} \title{Listings} \author{} \newstyle{.clisting}{border-left:solid green 2px;white-space:pre;padding-left:4px;font-family:monospace} \newstyle{.camllisting}{border:double red 10px;white-space:pre;padding:4px; font-family:monospace;border-radius:300px;padding-left:60px} \begin{document} \maketitle \lstdefinestyle{colors}{keywordstyle={\bf\color{blue}}, commentstyle={\em\color{magenta}}} \lstnewenvironment{clisting} {\setenvclass{lstlisting}{clisting}\lstset{language=C, style=colors}} {} \lstnewenvironment{camllisting} {\setenvclass{lstlisting}{camllisting}\lstset{language=caml, style=colors}} {} C code, with a green left border : \begin{clisting} /* Compute, guess what! */ int fact(int n) { int r = 1 ; for ( ; n > 0 ; n--) { r *= n ; } return r ; } \end{clisting} OCaml code, with a double red round border (ugly!): \begin{camllisting} (* Hello there *) module MyList (E : sig type t end) : sig type t val nil : t val cons : E.t -> t -> t end = struct type t = E.t list let nil = [] let cons x xs = x :: xs end \end{camllisting} Listing in a listing, no style : \lstset{style=colors} \begin{lstlisting} \documentclass{article} \usepackage{listings} \usepackage{color} \title{Listings} \author{} \newstyle{.clisting}{border-left:solid green 2px;white-space:pre;padding-left:4px;font-family:monospace} \newstyle{.camllisting}{border:ridge red 10px;white-space:pre;padding:4px; font-family:monospace;border-radius:300px;padding-left:60px} \begin{document} \begin{camllisting} (* Hello there *) module MyList (E : sig type t end) : sig type t val nil : t val cons : E.t -> t -> t end = struct type t = E.t list let nil = [] let cons x xs = x :: xs end \end{camllisting} \end{lstlisting} \end{document} hevea-2.30/examples/amssymb-test.tex0000644004317100512160000001755310314537501017556 0ustar marangetcristal\documentclass{article} \usepackage{amssymb} \usepackage{amsmath} %\newcommand{\abc}[1] \newstyle{BODY}{backgroundcolor:white}% \newstyle{.title} {padding:1ex;background:\#eeddbb}% \newstyle{.titlemain} {padding:1ex;background:\#eeddbb}% \newstyle{.titlerest} {padding:1ex;background:\#eeddbb}% \newstyle{.part} {padding:1ex;background:\#eeddbb}% \newstyle{.section} {padding:.5ex;background:\#eeddbb}% \newstyle{.subsection} {padding:0.3ex;background:\#eeddbb}% \newstyle{.subsubsection} {padding:0.5ex;background:\#eeddbb}% %\setstyles{background:\#eeddbb;color:black;padding:3} \title{AMSSYMB} %{\ensuremath{#1}\begin{toimage}{\huge\ensuremath{#1}}\end{toimage}\imageflush} \begin{document} \maketitle \section{Greek and Hebrew Symbols} \begin{tabular}{lll} digamma & : & $\digamma$\\ varkappa & : & $\varkappa$\\ beth & : & $\beth$\\ daleth & : & $\daleth$\\ gimel & : & $\gimel$ \end{tabular} \section{Binary Operators} \begin{tabular}{lll} dotplus & : & $\dotplus$\\ smallsetminus & : & $\smallsetminus$\\ Cap & : & $\Cap$\\ Cup & : & $\Cup$\\ barwedge & : & $\barwedge$\\ veebar & : & $\veebar$\\ doublebarwedge & : & $\doublebarwedge$\\ boxminus & : & $\boxminus$\\ boxtimes & : & $\boxtimes$\\ boxdot & : & $\boxdot$\\ boxplus & : & $\boxplus$\\ divideontimes & : & $\divideontimes$\\ ltimes & : & $\ltimes$\\ rtimes & : & $\rtimes$\\ leftthreetimes & : & $\leftthreetimes$\\ rightthreetimes & : & $\rightthreetimes$\\ curlywedge & : & $\curlywedge$\\ curlyvee & : & $\curlyvee$\\ circleddash & : & $\circleddash$\\ circledast & : & $\circledast$\\ circledcirc & : & $\circledcirc$\\ centerdot & : & $\centerdot$\\ intercal & : & $\intercal$ \end{tabular} \section{Miscellaneous Symbols} \begin{tabular}{lll} hslash & : & $\hslash$\\ vartriangle & : & $\vartriangle$\\ triangledown & : & $\triangledown$\\ square & : & $\square$\\ lozenge & : & $\lozenge$\\ circledS & : & $\circledS$\\ measuredangle & : & $\measuredangle$\\ nexists & : & $\nexists$\\ mho & : & $\mho$\\ Finv & : & $\Finv$\\ Game & : & $\Game$\\ Bbbk & : & $\Bbbk$\\ backprime & : & $\backprime$\\ varnothing & : & $\varnothing$\\ blacktriangle & : & $\blacktriangle$\\ blacktriangledown & : & $\blacktriangledown$\\ blacksquare & : & $\blacksquare$\\ blacklozenge & : & $\blacklozenge$\\ bigstar & : & $\bigstar$\\ sphericalangle & : & $\sphericalangle$\\ complement & : & $\complement$\\ eth & : & $\eth$\\ diagup & : & $\diagup$\\ diagdown & : & $\diagdown$ \end{tabular} \section{Negated Arrows} \begin{tabular}{lll} nleftarrow & : & $\nleftarrow$\\ nrightarrow & : & $\nrightarrow$\\ nLeftarrow & : & $\nLeftarrow$\\ nRightarrow & : & $\nRightarrow$\\ nleftrightarrow & : & $\nleftrightarrow$\\ nLeftrightarrow & : & $\nLeftrightarrow$ \end{tabular} \section{Corner Delimiters} \begin{tabular}{lll} ulcorner & : & $\ulcorner$\\ urcorner & : & $\urcorner$\\ llcorner & : & $\llcorner$\\ lrcorner & : & $\lrcorner$ \end{tabular} \section{Arrows} \begin{tabular}{lll} dashrightarrow & : & $\dashrightarrow$\\ dashleftarrow & : & $\dashleftarrow$\\ leftleftarrows & : & $\leftleftarrows$\\ leftrightarrows & : & $\leftrightarrows$\\ Lleftarrow & : & $\Lleftarrow$\\ twoheadleftarrow & : & $\twoheadleftarrow$\\ leftarrowtail & : & $\leftarrowtail$\\ looparrowleft & : & $\looparrowleft$\\ leftrightharpoons & : & $\leftrightharpoons$\\ curvearrowleft & : & $\curvearrowleft$\\ circlearrowleft & : & $\circlearrowleft$\\ Lsh & : & $\Lsh$\\ upuparrows & : & $\upuparrows$\\ upharpoonleft & : & $\upharpoonleft$\\ downharpoonleft & : & $\downharpoonleft$\\ multimap & : & $\multimap$\\ leftrightsquigarrow & : & $\leftrightsquigarrow$\\ rightrightarrows & : & $\rightrightarrows$\\ rightleftarrows & : & $\rightleftarrows$\\ rightrightarrows & : & $\rightrightarrows$\\ twoheadrightarrow & : & $\twoheadrightarrow$\\ rightarrowtail & : & $\rightarrowtail$\\ looparrowright & : & $\looparrowright$\\ rightleftharpoons & : & $\rightleftharpoons$\\ curvearrowright & : & $\curvearrowright$\\ circlearrowright & : & $\circlearrowright$\\ Rsh & : & $\Rsh$\\ downdownarrows & : & $\downdownarrows$\\ upharpoonright & : & $\upharpoonright$\\ downharpoonright & : & $\downharpoonright$\\ rightsquigarrow & : & $\rightsquigarrow$ \end{tabular} \section{Binary Relational Symbols} \begin{tabular}{lll} lhd & : & $\lhd$\\ rhd & : & $\rhd$\\ unlhd & : & $\unlhd$\\ unrhd & : & $\unrhd$\\ eqsim & : & $\eqsim$\\ leqq & : & $\leqq$\\ leqslant & : & $\leqslant$\\ % eqslantless & : & $\eqslantless$\\ lesssim & : & $\lesssim$\\ lessapprox & : & $\lessapprox$\\ approxeq & : & $\approxeq$\\ lessdot & : & $\lessdot$\\ lll & : & $\lll$\\ lessgtr & : & $\lessgtr$\\ lesseqgtr & : & $\lesseqgtr$\\ lesseqqgtr & : & $\lesseqqgtr$\\ doteqdot & : & $\doteqdot$\\ risingdotseq & : & $\risingdotseq$\\ fallingdotseq & : & $\fallingdotseq$\\ backsim & : & $\backsim$\\ backsimeq & : & $\backsimeq$\\ subseteqq & : & $\subseteqq$\\ Subset & : & $\Subset$\\ preccurlyeq & : & $\preccurlyeq$\\ curlyeqprec & : & $\curlyeqprec$\\ precsim & : & $\precsim$\\ precapprox & : & $\precapprox$\\ vartriangleleft & : & $\vartriangleleft$\\ trianglelefteq & : & $\trianglelefteq$\\ vDash & : & $\vDash$\\ Vvdash & : & $\Vvdash$\\ smallsmile & : & $\smallsmile$\\ smallfrown & : & $\smallfrown$\\ bumpeq & : & $\bumpeq$\\ Bumpeq & : & $\Bumpeq$\\ geqq & : & $\geqq$\\ geqslant & : & $\geqslant$\\ eqslantgtr & : & $\eqslantgtr$\\ gtrsim & : & $\gtrsim$\\ gtrapprox & : & $\gtrapprox$\\ gtrdot & : & $\gtrdot$\\ ggg & : & $\ggg$\\ gtrless & : & $\gtrless$\\ gtreqless & : & $\gtreqless$\\ gtreqqless & : & $\gtreqqless$\\ eqcirc & : & $\eqcirc$\\ circeq & : & $\circeq$\\ triangleq & : & $\triangleq$\\ thicksim & : & $\thicksim$\\ thickapprox & : & $\thickapprox$\\ supseteqq & : & $\supseteqq$\\ Supset & : & $\Supset$\\ succcurlyeq & : & $\succcurlyeq$\\ curlyeqsucc & : & $\curlyeqsucc$\\ succsim & : & $\succsim$\\ succapprox & : & $\succapprox$\\ vartriangleright & : & $\vartriangleright$\\ trianglerighteq & : & $\trianglerighteq$\\ Vdash & : & $\Vdash$\\ shortmid & : & $\shortmid$\\ shortparallel & : & $\shortparallel$\\ between & : & $\between$\\ pitchfork & : & $\pitchfork$\\ varpropto & : & $\varpropto$\\ blacktriangleleft & : & $\blacktriangleleft$\\ therefore & : & $\therefore$\\ blacktriangleright & : & $\blacktriangleright$\\ backepsilon & : & $\backepsilon$\\ because & : & $\because$\\ \end{tabular} \section{Negated Binary Relational Symbols} \begin{tabular}{lll} nless & : & $\nless$\\ nleq & : & $\nleq$\\ nleqslant & : & $\nleqslant$\\ nleqq & : & $\nleqq$\\ lneq & : & $\lneq$\\ lneqq & : & $\lneqq$\\ lvertneqq & : & $\lvertneqq$\\ lnsim & : & $\lnsim$\\ lnapprox & : & $\lnapprox$\\ nprec & : & $\nprec$\\ npreceq & : & $\npreceq$\\ precnsim & : & $\precnsim$\\ precnapprox & : & $\precnapprox$\\ nsim & : & $\nsim$\\ nshortmid & : & $\nshortmid$\\ nmid& : & $\nmid$\\ nvdash & : & $\nvdash$\\ nvDas & : & $\nvDash$\\ ntriangleleft & : & $\ntriangleleft$\\ ntrianglelefteq & : & $\ntrianglelefteq$\\ nsubseteq & : & $\nsubseteq$\\ nsubseteqq & : & $\nsubseteqq$\\ subsetneq & : & $\subsetneq$\\ varsubsetneq & : & $\varsubsetneq$\\ subsetneqq & : & $\subsetneqq$\\ varsubsetneqq & : & $\varsubsetneqq$\\ ngtr & : & $\ngtr$\\ ngeq & : & $\ngeq$\\ ngeqslant & : & $\ngeqslant$\\ ngeqq & : & $\ngeqq$\\ gneq & : & $\gneq$\\ gneqq & : & $\gneqq$\\ gvertneqq & : & $\gvertneqq$\\ gnsim & : & $\gnsim$\\ gnapprox & : & $\gnapprox$\\ nsucc & : & $\nsucc$\\ nsucceq & : & $\nsucceq$\\ succnsim & : & $\succnsim$\\ succnapprox & : & $\succnapprox$\\ ncong & : & $\ncong$\\ nshortparallel & : & $\nshortparallel$\\ nparallel & : & $\nparallel$\\ nVDash & : & $\nVDash$\\ nVdash & : & $\nVdash$\\ ntriangleright & : & $\ntriangleright$\\ ntrianglerighteq & : & $\ntrianglerighteq$\\ nsupseteq & : & $\nsupseteq$\\ nsupseteqq & : & $\nsupseteqq$\\ supsetneq & : & $\supsetneq$\\ varsupsetneq & : & $\varsupsetneq$\\ supsetneqq & : & $\supsetneqq$\\ varsupsetneqq & : & $\varsupsetneqq$\\ \end{tabular} \end{document} hevea-2.30/examples/fancy-test.tex0000644004317100512160000002170010071257024017167 0ustar marangetcristal \documentclass {article} \input{fancysection.hva} %\colorsections{20} %\definecolor{title}{named}{Blue} \usepackage {mathpartir} \usepackage {listings} \usepackage {array} \usepackage {url} \newif \ifhevea %HEVEA \heveatrue \ifhevea \usepackage {hevea} \fi \lstset {basicstyle=\tt} \let \lst \verb \title {Didier's Mathpartir} \author{Didier Remy} %\loadcssfile{x.css} %\setLATEXstyle{title}{background:green;color:black;font:helvetica} %\setHTMLstyle{H1.part}{background:green;color:white;font:helvetica} %\setLATEXstyle{section}{background:blue;color:white} %\setLATEXstyle{subsection}{background:blue;color:white} %\setHTMLstyle{H5}{background:cyan;color:black} %\setLATEXstyle{subparagraph}{background:magenta;color:white} %\setHTMLstyle{H3}{background:blue;color:white;font:sans-serif} %\setstyles{background:blue;color:white;font:sans-serif} %\setstyles{backgound:green} \begin{document} \maketitle \part{Only One Part} \section {The inferrule macro} The inferrule macro is designed to typeset inference rules. It should only\footnote {Even though the basic version may work in text mode, we discourage its use in text mode; the star-version cannot be used in text-mode} be used in math mode (or display math mode). The basic use of the rule is \begin{verbatim} \inferrule {one \\ two \\ three \\ or \\ more \\ premisses} {and \\ any \\ number \\ of \\ conclusions \\ as \\ well} \end{verbatim} This is the rendering on a large page \def \one {\inferrule {one \\ two \\ three \\ or \\ more \\ premisses} {and \\ any \\ number \\ of \\ conclusions \\ as \\ well} } $$ \ifhevea \one \else \fbox {\vbox {\advance \hsize by -2\fboxsep \advance \hsize by -2\fboxrule \linewidth\hsize $$\one$$}} \fi $$ However, the same formula on a narrower page will automatically be typsetted like that: \def \two {\inferrule {one \\\\ two \\ three \\ or \\\\ more \\ premisses} {and \\ any \\ number \\\\ of \\ conclusions \\\\ as \\ well} } $$ \ifhevea \two \else \fbox {\hsize 0.33 \hsize \vbox {$$\two$$}} \fi $$ An inference rule is mainly composed of a premisse and a conclusion. The premisse and the conclusions are both list of formulas where the elements are separated by \verb"\\". Note the dissymetry between typesetting of the premisses and of conclusions where lines closer to the center are fit first. A newline can be forced by adding an empty line \verb"\\\\" \begin{tabular}{m{0.44\hsize}m{0.1\hsize}m{0.44\hsize}} \begin{lstlisting}{Ocaml} \inferrule {aa \\\\ bb} {dd \\ ee \\ ff} \end{lstlisting} & ~~~ & $\inferrule {aa \\\\bb}{dd \\ ee \\ ff}$ \\ \end{tabular} \subsection {Single rules} Single rules are the default mode. Rules are aligned on their fraction bar, as illustrated below: $$ \inferrule {aa \\ bb}{ee} \hspace {4em} \inferrule {aa \\\\ bb \\ ee}{ee} $$ If the premise or the conclusion is empty, then the fraction bar is not typeset and the premise or the conclusion is centered: $$ \begin{tabular}{m{0.45\hsize}m{0.1\hsize}m{0.45\hsize}} \begin{lstlisting}{Ocaml} \inferrule {}{aa} + \inferrule {aa \\\\ aa}{} \end{lstlisting} & ~~~~~~~~ & $ \inferrule {}{aa} + \inferrule {aa \\\\ aa}{} $ \\ \end{tabular} $$ \paragraph{OOOOOH} Use use \verb"{ }" instead of \verb"{}" to get an axiom for instance: $$ \begin{tabular}{m{0.45\hsize}m{0.1\hsize}m{0.45\hsize}} \begin{lstlisting}{Ocaml} \inferrule { }{aa} + \inferrule {aa}{ } \end{lstlisting} & ~~~~~~ & \mbox {$ \inferrule { }{aa} + \inferrule {aa}{ } $} \\ \end{tabular} $$ \subparagraph{OOOOHOOOH} The macro \lst"\inferrule" acceps a label as optional argument, which will be typeset on the top left corner of the rule: \par \begin{tabular}{m{0.45\hsize}m{0.1\hsize}m{0.45\hsize}} \begin{lstlisting}{Ocaml} \inferrule [yop] {aa \\ bb} {cc} \end{lstlisting} & $\inferrule [Yop]{aa \\ bb}{cc}$ \\ \end{tabular} \par\noindent See section~\ref{options} for changing typesetting of labels. A label can also be placed next to the rule directly, since the rule is centered: \par \begin{tabular}{m{0.45\hsize}m{0.1\hsize}m{0.45\hsize}} \begin{lstlisting}{Ocaml} \inferrule {aa \\ bb} {cc} \quad (\textsc {Yop}) \end{lstlisting} & ~~~~~~ & $\inferrule{aa \\ bb}{cc} \quad (\textsc {Yop})$ \\ \end{tabular} \subsection {Customizing} By default, lines are centerred in inference rules. However, this can be changed by either \lst"\mprset{flushleft}" or \lst"\mprset{center}". For instance, \begin{tabular}{m{0.44\hsize}m{0.12\hsize}m{0.44\hsize}} \begin{lstlisting}{Ocaml} $$\mprset{flushleft} \inferrule {a \\ bbb \\\\ ccc \\ dddd} {e \\ ff \\ gg}$$ \end{lstlisting} & ~~~~~ & $$\mprset{flushleft} \inferrule {a \\ bbb \\\\ ccc \\ dddd}{e \\ ff \\ gg}$$ \\ \end{tabular} \noindent Note that lines are aligned independently in the premise and the conclusion, which are both themselves centered. In particular, left alignment will not affect a single-line premisse or conclusion. \subsection {Derivation trees} To help writing cascades of rules forming a derivation tree, inference rules can also be aligned on their bottom line. For this, we use the star-version: $$ \begin{tabular}{m{0.45\hsize}m{0.1\hsize}m{0.45\hsize}} \begin{lstlisting}{Ocaml} \inferrule* {\inferrule* {aa \\ bb}{cc} \\ dd} {ee} \end{lstlisting} & ~~~~~~ & $ \inferrule* {\inferrule* {aa \\ bb}{cc} \\ dd} {ee} $ \\ \end{tabular} $$ The star version can also take an optional argument, but with a different semantics. The optional argument is parsed by the \verb"keyval" package, so as to offer a set of record-like options: $$ \def \val {{\em v}} \def \arraystretch {1.4} \begin{tabular}{|>{\tt}c|p{0.7\hsize}|} \hline \bf key & \bf Effect for value {\val} \\\hline\hline before & Execute {\val} before typesetting the rule. Useful for instance to change the maximal width of the rule. \\\hline width & Set the width of the rule to {\val} \\\hline narrower & Set the width of the rule to {\val} times \verb"\hsize". \\\hline left & Put a label {\val} on the left of the rule \\\hline Left & Idem, but as if the label had zero width. \\\hline Right & As \verb"Left", but on the right of the rule. \\\hline right & As \verb"left", but on the right of the rule. \\\hline leftskip & Cheat by (skip negative space) {\val} on the left side. \\\hline rightskip & Cheat by {\val} on the right side of the rule. \\\hline vdots & Raise the rule by {\val} and insert vertical dots. \\\hline \end{tabular} $$ Here is an example of a complex derivation: $$ \inferrule* [left=Total] {\inferrule* [Left=Foo] {\inferrule* [Right=Bar, leftskip=2em,rightskip=2em,vdots=1.5em] {a \\ a \\\\ bb \\ cc \\ dd} {ee} \\ ff \\ gg} {hh} \\ \inferrule* [lab=XX]{uu \\ vv}{ww}} {(1)} $$ and its code \begin{lstlisting}{Ocaml} \inferrule* [left=Total] {\inferrule* [Left=Foo] {\inferrule* [Right=Bar, leftskip=2em,rightskip=2em,vdots=1.5em] {a \\ a \\\\ bb \\ cc \\ dd} {ee} \\ ff \\ gg} {hh} \\ \inferrule* [lab=XX]{uu \\ vv}{ww}} {(1)} \end{lstlisting} \def \L#1{\lower 0.4ex \hbox {#1}} \def \R#1{\raise 0.4ex \hbox {#1}} \def \hevea {H\L{E}\R{V}\L{E}A} \def \hevea {$\mbox {H}\!_{\mbox {E}}\!\mbox {V}\!_{\mbox {E}}\!\mbox {A}$} \subsection {Implementation} The main macro in the implementation of inference rules is the one that either premises and conclusions. The macros uses two box-registers one \verb"hbox" for typesetting each line and one \verb"vbox" for collecting lines. The premise appears as a list with \verb"\\" as separator. Each element is considered in turn typeset in a \verb"hbox" in display math mode. Its width is compare to the space left on the current line. If the box would not fit, the current horizontal line is transferred to the vertical box and emptied. Then, the current formula can safely be added to the horizontal line (if it does not fit, nothing can be done). When moved to the vertical list, lines are aligned on their center (as if their left-part was a left overlapped). At the end the vbox is readjusted on the right. This description works for conclusions. For premises, the elements must be processes in reverse order and the vertical list is simply built upside down. \section {Other Options} \label {options} The package also defines \verb"\infer" as a shortcut for \verb"\inferrule" but only if it is not previously defined. The package uses \verb"\TirName" and \verb"\RefTirName" to typeset labels, which can safely be redefined by the user. The former is used for defining occurrences ({\em ie.} in rule \lst"\inferrule") while the latter is used for referencing ({\em ie.} in the star-version). The vertical space in \verb"mathpar" is adjusted by \verb"\MathparLineskip". To restore the normal paragraph parameters in mathpar mode (for instance for some inner paragraph), use the command \verb"\MathparNormalpar". The environment uses \verb"\MathparBindings" to rebind \verb"\\", \verb"and", and \verb"\par". You can redefine thus command to change the default bindings or add your own. \end{document} hevea-2.30/examples/trouble.tex0000644004317100512160000001745306664550201016606 0ustar marangetcristal\documentclass{article} \usepackage{alltt} \usepackage{hevea} \newcommand{\rbox}[2]{$^{\mbox{#2}}$} \newcommand{\lbox}[2]{$_{\mbox{#2}}$} \begin{latexonly} \gdef\myrule{\rule{10cm}{.05ex}} \gdef\htmlout{\begingroup\parskip=0pt\parindent=0pt\begin{quote}\myrule\par} \gdef\endhtmlout{\par\myrule\end{quote}\endgroup} \end{latexonly} \begin{htmlonly} \gdef\myrule{\@print{
}}% \gdef\htmlout{\begin{quote}\myrule} \gdef\endhtmlout{\myrule\end{quote}} \end{htmlonly} \newenvironment{latexout}{\begin{htmlout}}{\end{htmlout}} \title{How to spot and correct some trouble} \begin{document} \maketitle \section{Simple corrections} Most of the problems that occur during the translation of a given \LaTeX\ file (say \verb+trouble.tex+) can be solved at the macro-level. That is, most problems can be solved by writing a few macros. The best place for these macros is an user-style file (say \verb+trouble.sty+) given as argument to \htmlgen. \begin{verbatim} # htmlgen trouble.sty trouble.tex \end{verbatim} By doing so, the macros written specially for \htmlgen\ are not seen by \LaTeX. Even better, \verb+trouble.tex+ is not changed at all. Of course, this will be easier if the \LaTeX\ source is written in a generic style, using macros. Note that this style is recommended anyway, since it eases the changing and tuning of documents. \subsection{\htmlgen\ does not know a macro} Consider the following \LaTeX\ source excerpt: \begin{verbatim} You can \raisebox{.6ex}{\em raise} text. \end{verbatim} \LaTeX\ typesets this as follows: \begin{htmlout} \begin{htmlonly} %% BEGIN IMAGE You can \raisebox{.6ex}{\em raise} text. %% END IMAGE \imageflush \end{htmlonly} \begin{latexonly} You can \raisebox{.6ex}{\em raise} text. \end{latexonly} \end{htmlout} Since \htmlgen\ does not know about \verb+raisebox+, it uncorrectly processes this input. More precisely, it first prints a warning message: \begin{verbatim} trouble.tex:34: Unknown macro: \raisebox \end{verbatim} Then, it goes on by translating the arguments of \verb+\raisebox+ as there were normal text. As a consequence some \verb+.6ex+ is finally found in the html output: \begin{htmlout} \begin{latexonly} You can .6ex{\em raise} text. \end{latexonly} \begin{htmlonly} You can \raisebox{.6ex}{\em raise} text. \end{htmlonly} \end{htmlout} To correct this, you should provide a macro that more or less has the effect of \verb+raisebox+. It is difficult, yet impossible, to write a generic \verb+raisebox+ macro for \htmlgen. However, in this case, the effect of \verb+\raisebox+ is to raise the box {\em a little}. Thus, the first, numerical, argument to \verb+\raisebox+ can be ignored: \begin{verbatim} \newcommand{\raisebox}[2]{$^{\mbox{#2}}$} \end{verbatim} Now, tranlating the document yields: \begin{htmlout} \renewcommand{\raisebox}[2]{$^{\mbox{#2}}$}% You can \raisebox{.6ex}{\em raise} text a little. \end{htmlout} Of course this will work only when all \verb+\raisebox+ in the document raise text a little. Consider, for instance, this example, where text is both raised a lowered a little: \begin{verbatim} You can \raisebox{.6ex}{\em raise} or \raisebox{-.6ex}{\em lower} text. \end{verbatim} Which \LaTeX, renders as follows: \begin{htmlout} \begin{htmlonly} %% BEGIN IMAGE You can \raisebox{.6ex}{\em raise} or \raisebox{-.6ex}{\em lower} text. %% END IMAGE \imageflush \end{htmlonly} \begin{latexonly} You can \raisebox{.6ex}{\em raise} or \raisebox{-.6ex}{\em lower} text. \end{latexonly} \end{htmlout} Whereas, with the above definition of \verb+\raisebox+, \htmlgen\ produces: \begin{htmlout} \renewcommand{\raisebox}[2]{$^{\mbox{#2}}$}% You can \raisebox{.6ex}{\em raise} or \raisebox{-.6ex}{\em lower} text. \end{htmlout} A solution is to add a new macro definition in the \verb+trouble.sty+ file: \begin{verbatim} \newcommand{\lowerbox}[2]{$_{\mbox{#2}}$} \end{verbatim} Then, \verb+trouble.tex+ itself has to be modified a little. \begin{verbatim} You can \raisebox{.6ex}{\em raise} or \lowerbox{-.6ex}{\em lower} text. \end{verbatim} {\htmlgen} now produces a satisfying output: \begin{htmlout} \begin{latexonly}\renewcommand{\raisebox}[2]{$^{\mbox{#2}}$}% \newcommand{\lowerbox}[2]{$_{\mbox{#2}}$} You can \raisebox{.6ex}{\em raise} or \lowerbox{-.6ex}{\em lower} text. \end{latexonly} \begin{htmlonly}\newcommand{\raisebox}[2]{$^{\mbox{#2}}$}% \newcommand{\lowerbox}[2]{$_{\mbox{#2}}$} You can \raisebox{.6ex}{\em raise} or \lowerbox{-.6ex}{\em lower} text. \end{htmlonly} \end{htmlout} \subsection{\htmlgen\ uncorrectly interprets a macro} Sometimes \htmlgen\ knows about a macro, but the produced hthml is obviously wrong. This kind of errors is a little more difficult to spot than the previous one because the translator does not issue a warning. Here you have to look a the output. Consider, for instance, this definition: \begin{verbatim} \newcommand{\blob}{\rule[.2ex]{1ex}{1ex}} \blob\ Blob \blob \end{verbatim} Which \LaTeX typesets as follows: \begin{latexout} \begin{htmlonly} \begin{toimage}\newcommand{\blob}{\rule[.2ex]{1ex}{1ex}} \blob\ Blob \blob \end{toimage} \imageflush \end{htmlonly} \end{latexout} \htmlgen\ always translate \verb+\\rule+ by \verb+
+, ignoring size arguments. Hence, it here produces the following, wrong, output: \begin{htmlout}\newcommand{\blob}{\rule[.2ex]{1ex}{1ex}} \begin{htmlonly} \blob\ Blob \blob \end{htmlonly} \end{htmlout} There is not small square in the symbol font used by \htmlgen. However there are other small symbols that would perfectly do the job of \verb+\blob+, such as a small bullet (\verb+\bullet+ in \LaTeX). Thus you may choose to define \verb+\blob+ in \verb+trouble.sty+ as: \begin{verbatim} \newcommand{\blob}{\bullet} \end{verbatim} This new definition yields the following, more satisfying output: \begin{htmlout}\newcommand{\blob}{\bullet} \begin{htmlonly} \blob\ Blob \blob \end{htmlonly} \end{htmlout} \subsection{\htmlgen\ crashes with a \protect\texttt{html:} failure} Such an errors may have many causes, including a bug in \htmlgen. However, it may also steem from a wrong \LaTeX\ input. Thus this section is to be read before reporting a bug\ldots In the following source, environments are not properly balanced: \begin{verbatim} \begin{flushright} \begin{quote} This is right-flushed quoted text. \end{flushright} \end{quote} \end{verbatim} Such a source will make both {\LaTeX} and {\htmlgen} choke. Thus, when {\htmlgen} crashes, it is a good idea to check that the input is correct by running {\LaTeX} on it. Unfortunatly, {\htmlgen} may crash on input that does not affect \LaTeX. Such errors are likely to appear when processiong {\TeX}ish input, such as found in style files. Consider for instance the following ``optimized'' version of a \verb+quoteright+ environment: \begin{verbatim} \newenvironment{quotebis}{\quote\flushright}{\endquote} \begin{quotebis} This a right-flushed quotation \end{quotebis} \end{verbatim} {\LaTeX} produces the expected output: \begin{latexout} \begin{toimage} \newenvironment{quotebis}{\quote\flushright}{\endquote} \begin{quotebis} This is a right-flushed quotation \end{quotebis} \end{toimage}\imageflush[ALIGN=right]\\ \end{latexout} However, as {\htmlgen} often translates {\LaTeX} environments by html opening and closing tags and that it refuses to generate obviously non-correct html, it crashes: \begin{verbatim} trouble.tex:8: Adios Fatal error: uncaught exception Failure("hml: BLOCKQUOTE closes DIV") \end{verbatim} In this case the solution is easy: environments must be opened and closed consistently. {\LaTeX} style being recommended, one should write: \begin{verbatim} \newenvironment{quotebis} {\begin{quote}\begin{flushright}} {\end{flushright}\end{quote}} \end{verbatim} And we get: \begin{htmlout}\newenvironment{quotebis}{\begin{quote}\begin{flushright}}{\end{flushright}\end{quote}} \begin{quotebis} This is a right-flushed quotation \end{quotebis} \end{htmlout} \end{document}hevea-2.30/examples/sym-test.tex0000644004317100512160000001616110077472562016720 0ustar marangetcristal\documentclass{article} \usepackage{isolatin1} \usepackage{latexsym} \usepackage{multicol} \usepackage{array} %HEVEA\setstyles{background:\#eeddbb;color:black;padding:3} \title{Basic Math Entities} %HEVEA\newenvironment{multicols}[1]{}{} \begin{document} \maketitle \newsavebox{\foo} \newcounter{coucou} \newcommand{\test}[1]{% \begin{Huge}\begin{tabular}{|*{16}{l}} \setcounter{coucou}{#1}% \whiledo {\value{coucou}<#1+256} {\sbox{\foo}{\@nostyle\thecoucou}\@print{&#}\usebox{\foo}\@print{;}% \addtocounter{coucou}{1}% \ifthenelse{\(\value{coucou}/16\)*16=\value{coucou}}{\\}{&}} \end{tabular}\end{Huge}} \newcounter{zobi} \newcommand{\fulltest}[1]{% \setcounter{zobi}{#1}% \whiledo{\value{zobi}<#1+8}{\test{\value{zobi}*256}\stepcounter{zobi}\par}} %\fulltest{16} \section{Points de détail} \verb+\ldots+: $\ldots$ \verb+\cdots+: $\cdots$ \verb+\ddots+: $\ddots$ \verb+\vdots+: $\vdots$ \section{Lettres grecques} \begin{multicols}{4} \noindent\verb+\alpha+: $\alpha$\\ \verb+\beta+: $\beta$\\ \verb+\gamma+: $\gamma$\\ \verb+\delta+: $\delta$\\ \verb+\epsilon+: $\epsilon$\\ \verb+\varepsilon+: $\varepsilon$\\ \verb+\zeta+: $\zeta$\\ \verb+\eta+: $\eta$\\ \verb+\theta+: $\theta$\\ \verb+\vartheta+: $\vartheta$\\ \verb+\iota+: $\iota$\\ \verb+\kappa+: $\kappa$\\ \verb+\lambda+: $\lambda$\\ \verb+\mu+: $\mu$\\ \verb+\nu+: $\nu$\\ \verb+\xi+: $\xi$\\ \verb+\pi+: $\pi$\\ \verb+\varpi+: $\varpi$\\ \verb+\rho+: $\rho$\\ \verb+\varrho+: $\varrho$\\ \verb+\sigma+: $\sigma$\\ \verb+\varsigma+: $\varsigma$\\ \verb+\tau+: $\tau$\\ \verb+\upsilon+: $\upsilon$\\ \verb+\phi+: $\phi$\\ \verb+\varphi+: $\varphi$\\ \verb+\chi+: $\chi$\\ \verb+\psi+: $\psi$\\ \verb+\omega+: $\omega$\\ ~\\ \verb+\Gamma+: $\Gamma$\\ \verb+\Delta+: $\Delta$\\ \verb+\Theta+: $\Theta$\\ \verb+\Lambda+: $\Lambda$\\ \verb+\Xi+: $\Xi$\\ \verb+\Pi+: $\Pi$\\ \verb+\Sigma+: $\Sigma$\\ \verb+\Upsilon+: $\Upsilon$\\ \verb+\Phi+: $\Phi$\\ \verb+\Psi+: $\Psi$\\ \verb+\Omega+: $\Omega$\\ \end{multicols} \section{Opérateurs} \begin{multicols}{4} \verb+\pm+: $\pm$\\ \verb+\mp+: $\mp$\\ \verb+\times+: $\times$\\ \verb+\div+: $\div$\\ \verb+\ast+: $\ast$\\ \verb+\star+: $\star$\\ \verb+\circ+: $\circ$\\ \verb+\bullet+: $\bullet$\\ \verb+\cdot+: $\cdot$\\ \verb+\cap+: $\cap$\\ \verb+\cup+: $\cup$\\ \verb+\uplus+: $\uplus$\\ \verb+\sqcap+: $\sqcap$\\ \verb+\sqcup+: $\sqcup$\\ \verb+\vee+: $\vee$\\ \verb+\wedge+: $\wedge$\\ \verb+\setminus+: $\setminus$\\ \verb+\wr+: $\wr$\\ \verb+\diamond+: $\diamond$\\ \verb+\bigtriangleup+: $\bigtriangleup$\\ \verb+\bigtriangledown+: $\bigtriangledown$\\ \verb+\triangleleft+: $\triangleleft$\\ \verb+\triangleright+: $\triangleright$\\ %\verb+\lhd+: $\lhd$\\ %\verb+\rhd+: $\rhd$\\ %\verb+\unlhd+: $\unlhd$\\ %\verb+\unrhd+: $\unrhd$\\ \verb+\oplus+: $\oplus$\\ \verb+\ominus+: $\ominus$\\ \verb+\otimes+: $\otimes$\\ \verb+\oslash+: $\oslash$\\ \verb+\odot+: $\odot$\\ \verb+\bigcirc+: $\bigcirc$\\ \verb+\dagger+: $\dagger$\\ \verb+\ddagger+: $\ddagger$\\ \verb+\amalg+: $\amalg$\\ \end{multicols} \section{Relations} \begin{multicols}{4} \verb+\leq+: $\leq$\\ \verb+\prec+: $\prec$\\ \verb+\preceq+: $\preceq$\\ \verb+\ll+: $\ll$\\ \verb+\subset+: $\subset$\\ \verb+\subseteq+: $\subseteq$\\ \verb+\sqsubset+: $\sqsubset$\\ \verb+\sqsubseteq+: $\sqsubseteq$\\ \verb+\in+: $\in$\\ \verb+\vdash+: $\vdash$\\ \verb+\geq+: $\geq$\\ \verb+\succ+: $\succ$\\ \verb+\gg+: $\gg$\\ \verb+\supset+: $\supset$\\ \verb+\supseteq+: $\supseteq$\\ \verb+\sqsupset+: $\sqsupset$\\ \verb+\sqsupseteq+: $\sqsupseteq$\\ \verb+\ni+: $\ni$\\ \verb+\dashv+: $\dashv$\\ \verb+\equiv+: $\equiv$\\ \verb+\sim+: $\sim$\\ \verb+\simeq+: $\simeq$\\ \verb+\asymp+: $\asymp$\\ \verb+\approx+: $\approx$\\ \verb+\cong+: $\cong$\\ \verb+\neq+: $\neq$\\ \verb+\doteq+: $\doteq$\\ \verb+\notin+: $\notin$\\ \verb+\models+: $\models$\\ \verb+\perp+: $\perp$\\ \verb+\mid+: $\mid$\\ \verb+\parallel+: $\parallel$\\ \verb+\bowtie+: $\bowtie$\\ \verb+\Join+: $\Join$\\ \verb+\smile+: $\smile$\\ \verb+\frown+: $\frown$\\ \verb+\propto+: $\propto$\\ \end{multicols} \section{Flèches} \begin{multicols}{4} \verb+\leftarrow+: $\leftarrow$\\ \verb+\Leftarrow+: $\Leftarrow$\\ \verb+\rightarrow+: $\rightarrow$\\ \verb+\Rightarrow+: $\Rightarrow$\\ \verb+\leftrightarrow+: $\leftrightarrow$\\ \verb+\Leftrightarrow+: $\Leftrightarrow$\\ \verb+\mapsto+: $\mapsto$\\ \verb+\hookleftarrow+: $\hookleftarrow$\\ \verb+\leftharpoonup+: $\leftharpoonup$\\ \verb+\leftharpoondown+: $\leftharpoondown$\\ \verb+\rightleftharpoons+: $\rightleftharpoons$\\ \verb+\longleftarrow+: $\longleftarrow$\\ \verb+\Longleftarrow+: $\Longleftarrow$\\ \verb+\longrightarrow+: $\longrightarrow$\\ \verb+\Longrightarrow+: $\Longrightarrow$\\ \verb+\longleftrightarrow+: $\longleftrightarrow$\\ \verb+\Longleftrightarrow+: $\Longleftrightarrow$\\ \verb+\longmapsto+: $\longmapsto$\\ \verb+\hookrightarrow+: $\hookrightarrow$\\ \verb+\rightharpoonup+: $\rightharpoonup$\\ \verb+\rightharpoondown+: $\rightharpoondown$\\ \verb+\leadsto+: $\leadsto$\\ \verb+\uparrow+: $\uparrow$\\ \verb+\Uparrow+: $\Uparrow$\\ \verb+\downarrow+: $\downarrow$\\ \verb+\Downarrow+: $\Downarrow$\\ \verb+\updownarrow+: $\updownarrow$\\ \verb+\Updownarrow+: $\Updownarrow$\\ \verb+\nearrow+: $\nearrow$\\ \verb+\searrow+: $\searrow$\\ \verb+\swarrow+: $\swarrow$\\ \verb+\nwarrow+: $\nwarrow$\\ \end{multicols} \section{Bizarre} \begin{multicols}{4} \verb+\aleph+: $\aleph$\\ \verb+\hbar+: $\hbar$\\ \verb+\imath+: $\imath$\\ \verb+\jmath+: $\jmath$\\ \verb+\ell+: $\ell$\\ \verb+\wp+: $\wp$\\ \verb+\Re+: $\Re$\\ \verb+\Im+: $\Im$\\ %\verb+\mho+: $\mho$\\ \verb+\prime+: $\prime$\\ \verb+\emptyset+: $\emptyset$\\ \verb+\nabla+: $\nabla$\\ \verb+\surd+: $\surd$\\ \verb+\top+: $\top$\\ \verb+\bot+: $\bot$\\ \verb+\|+: $\|$\\ \verb+\angle+: $\angle$\\ \verb+\forall+: $\forall$\\ \verb+\exists+: $\exists$\\ \verb+\neg+: $\neg$\\ \verb+\flat+: $\flat$\\ \verb+\natural+: $\natural$\\ \verb+\sharp+: $\sharp$\\ \verb+\backslash+: $\backslash$\\ \verb+\partial+: $\partial$\\ \verb+\infty+: $\infty$\\ \verb+\langle+: $\langle$\\ \verb+\rangle+: $\rangle$\\ \verb+\lfloor+: $\lfloor$\\ \verb+\rfloor+: $\rfloor$\\ \verb+\lceil+: $\lceil$\\ \verb+\rceil+: $\rceil$\\ \verb+\triangle+: $\triangle$\\ \verb+\clubsuit+: $\clubsuit$\\ \verb+\diamondsuit+: $\diamondsuit$\\ \verb+\heartsuit+: $\heartsuit$\\ \verb+\spadesuit+: $\spadesuit$\\ \end{multicols} \section{Varible-sized symbols} \begin{multicols}{4} \noindent\verb+\sum+: $\sum$\\ \verb+\prod+: $\prod$\\ \verb+\coprod+: $\coprod$\\ \verb+\int+: $\int$\\ \verb+\oint+: $\oint$\\ \verb+\bigcap+: $\bigcap$\\ \verb+\bigcup+: $\bigcup$\\ \verb+\bigsqcup+: $\bigsqcup$\\ \verb+\bigvee+: $\bigvee$\\ \verb+\bigwedge+: $\bigwedge$\\ \verb+\bigodot+: $\bigodot$\\ \verb+\bigotimes+: $\bigotimes$\\ \verb+\bigoplus+: $\bigoplus$\\ \verb+\biguplus+: $\biguplus$\\ \end{multicols} $$ \begin{array}{>{\displaystyle}c} \verb+\sum+: \sum \verb+\prod+: \prod \verb+\coprod+: \coprod \verb+\int+: \int \verb+\oint+: \oint \verb+\bigcap+: \bigcap \verb+\bigcup+: \bigcup \\ \verb+\bigsqcup+: \bigsqcup \verb+\bigvee+: \bigvee \verb+\bigwedge+: \bigwedge \verb+\bigodot+: \bigodot \\ \verb+\bigotimes+: \bigotimes \verb+\bigoplus+: \bigoplus \verb+\biguplus+: \biguplus \end{array} $$ \end{document} hevea-2.30/examples/bib.bib0000644004317100512160000003013306551155675015623 0ustar marangetcristal# this file extracted from cf.bib, part of Didier's CVS # added entries from Cosimo and Luc @string (ic = "Information and Computation") @string (tcs = "Theoretical Computer Science") @string (inria = "Institut National de Recherche en Informatique et Automatisme") @string (rocq = "Rocquencourt") @book{Appel-compiling, author = "Andrew W. Appel", title = "Compiling with continuations", publisher = "Cambridge University Press", year = "1992"} @misc{Objective-Caml, author = "Xavier Leroy and J\'er\^ome Vouillon and Damien Doligez", title = "The {Objective} {Caml} system", year = "1996", howpublished = "Software and documentation available on the Web, {\oneurl{http://pauillac.inria.fr/ocaml/}}"} @misc{Join, author = "C\'edric Fournet and Luc Maranget", title = "The join system", year = "1997", howpublished = "Software and documentation available on the Web, {\oneurl{http://pauillac.inria.fr/join/}}"} @misc{Bologna, author = "Luca Padovani", title = "The Bologna join system", year = "1997", howpublished = "Software and documentation (in italian) available on the Web, {\oneurl{ftp://ftp.cs.unibo.it/pub/asperti/jcb01.tar.gz}}"} @misc{Jocaml, author = "Fabrice {Le Fessant}", title = "The Jocaml system prototype", year = "1998", howpublished = "Software and documentation available on the Web, {\oneurl{http://pauillac.inria.fr/jocaml/}}"} @inproceedings{join-typing-97, author = "C\'edric Fournet and Cosimo Laneve and Luc Maranget and Didier R\'emy", title = "{Implicit Typing \`a la ML for the join-calculus}", booktitle = "Proc. of the 1997 8th International Conference on Concurrency Theory", year = 1997, publisher = "Springer-Verlag"} @inproceedings{Maranget92, author = "Luc Maranget", title = "Compiling Lazy Pattern Matching", booktitle = "Proc. of the 1992 conference on Lisp and Functional Programming", year = 1992, publisher = "ACM Press"} @techreport{Maranget-Lazy-Pat-Report, author = "Luc Maranget", title = "Two Techniques for Compiling Lazy Pattern Matching", type = "Research report", number = "2385", institution = "INRIA", year = 1994} @techreport{Milner-pi-calculus, author = "Robin Milner and Joachim Parrow and David Walker", title = "A calculus of mobile processes: part 1", type = "Research Report", institution = "University of Edinburgh", number = "ECS-LFCS-89-85", year = "1989" } @article {BeBo92, author = "G{\'e}rard Berry and G{\'e}rard Boudol", title = "The chemical abstract machine", journal = tcs, year = "1992", volume = "96", pages = "217--248" } @inproceedings {DamasMilner82, author = {L. Damas and R. Milner}, title = {Principal type schemes for functional programs}, booktitle = {Proceedings on Principles of Programmining Languages}, year = {1982}, pages = {207 -- 212} } @inproceedings {FGLMR96_Calculus_mobile_agent, author = {C\'{e}dric Fournet and Georges Gonthier and Jean-Jacques L\'{e}vy and Luc Maranget and Didier R\'{e}my}, title = {A Calculus of Mobile Agents}, booktitle = {7th International Conference on Concurrency Theory (CONCUR'96) }, year = 1996, note = "LNCS 1119" } @article {FelleisenWright_Syntactic_Soundness, author = "Andrew K. Wright and Matthias Felleisen", year = "1994", journal = "Information and Computation", volume = "115", number = "1", pages = "38--94", title = "A Syntactic Approach to Type Soundness" } @techreport{Wright93, author = "Andrew K. Wright", year = "1993", month = "February", number = "93-200", institution = "Rice University", title = "Polymorphism for Imperative Languages without Imperative Types" } @inproceedings {FournetGonthier96, author = {C\'{e}dric Fournet and Georges Gonthier}, title = {The Reflexive Chemical Abstract Machine and the Join-Calculus}, booktitle = "23rd ACM Symposium on Principles of Programming Languages (POPL'96)", year = "1996" } @article {KPT96_Typed_Pattern_Calculus, author = {Delia Kesner and Laurence Puel}, title = {A Typed Pattern Calculus}, journal = ic, year = 1996, volume = 124, number = 4, pages = {32-61} } @techreport {Kobayashi96_Deadlock_Free_Typed_Process_Calculus, author = {Naoki Kobayashi}, title = {A Partially Deadlock-free Typed Process Calculus (I) -- A simple system --}, institution = {Departement of information science, Faculty of Science, University of Tokyo}, year = 1996, month = {September}, } @inproceedings {KobayashiPierceTurner96, author = "Naoki Kobayashi and Benjamin C. Pierce and David N. Turner" , title = {Linear types and pi-calculus}, booktitle = "23rd ACM Symposium on Principles of Programming Languages (POPL'96)", year = "1996" } @article {MPW92, author = {R. Milner and J. Parrow and D. Walker}, title = {A Calculus of Mobile Processes {I} and {II}}, journal = {Information and Computation}, year = {1992}, volume = {100}, pages = {1 -- 41, 42 -- 78} } @article {Mil92, author = {R. Milner}, title = {Functions as Processes}, journal = {Mathematical Structures in Computer Science}, year = {1992}, volume = {2}, pages = {119 -- 141} } @incollection {Milpol, author = {R. Milner}, title = {The polyadic $\pi$-calculus: a tutorial}, editor = {Bauer and Brawer and Schwichtenberg}, booktitle = {Logic and Algebra of Specification}, publisher = {Springer Verlag}, year = { 1993} } @article {MitchellViswamathan_SMLNJ_WeakPolymorphism, author = {John Mitchell and Ramesh Viswanathan}, title = {Standard {ML-NJ} Weak Polymorphism and Imperative Constructs}, journal = ic, year = 1996, volume = 127, number = 54, pages = {102-116} } @inproceedings {PS93, author = {B. Pierce and D. Sangiorgi}, title = {Typing and subtyping for mobile processes}, booktitle = {Logic in Computer Science}, year = {1993}, pages = {187 -- 215} } @inproceedings {PS96, author = {B. Pierce and D. Sangiorgi}, title = {Behavioural equivalence in the Polymorphic pi-calculus}, booktitle = {24th ACM Symposium on Principles of Programming Languages}, year = {1997} } @misc {Pict, author = {B. Pierce and D. Turner}, title = {{\sf Pict}: a programming language based on the pi-calculus}, note = {To appear}, year = {1995} } @article {PierceSangiorgi95, author = "Benjamin C. Pierce and Davide Sangiorgi", title = "Typing and Subtyping for Mobile Processes", journal = "Mathematical Structures in Computer Science", year = "1995", note = "To appear. A summary was presented at LICS '93", } @techreport {Remy/mleqth, author = "Didier R{\'e}my", title = "Extending {ML} Type System with a Sorted Equational Theory", institution = inria, address = rocq, type = "Research Report", number = 1766, year = 1992 } @article {Rep91, author = {J. H. Reppy}, title = {C{ML}: a higher-order concurrent language}, journal = {SIGPLAN Notices}, number = {6}, volume = {26}, pages = {294 -- 305}, year = {1991} } @techreport {Sangiorgi96_Typed_Objects_Picalc, author = {Davide Sangiorgi}, title = {An Interpretation of Typed Objects into Typed $\pi$-calculus}, institution = inria, address = {Sophia-Antipolis, France}, year = 1996, } @inproceedings {TJ92, author = {J. P. Talpin and P. Juvelot}, title = {The type and effects discipline}, booktitle = {Logic in Computer Science}, year = {1992}, pages = {162 -- 173} } @techreport {Thom93, author = {B. Thomsen}, title = {Polymorphic sorts and types for concurrent functional programs}, institution = {European Computer-Industry Research Center}, address = {Munich, Germany}, year = {1993}, number = {ECRC-93-10} } @article {Tof90, author = {M. Tofte}, year = 1990, journal = {Information and Computation}, volume = 89, number = {1}, pages = {1 -- 34}, title = {Type inference for polymorphic references} } @phdthesis {Turner95, author = "David N. Turner", title = "The $\pi$-calculus: Types, polymorphism and implementation", school = "LFCS, University of Edinburgh", year = 1995 } @unpublished {Yoshida96_Graph_types, author = {Nobuko Yoshida}, title = {Graph types for monadic mobile processes}, note = {Manuscript}, month = sep, year = 1996 } @inproceedings{Remy-Vouillon/objective-ml, author = "Didier R\'emy and Jer\^{o}me Vouillon", title = "{Objective} {ML}: A simple object-oriented extension to {ML}", booktitle = {24th ACM Symposium on Principles of Programming Languages}, year = 1997 } @inproceedings{CML, author = "John H. Reppy", title = "{Concurrent ML}: {D}esign, application and semantics", booktitle = {Programming, Concurrency, Simulation and Automated Reasoning}, year = 1992, pages = {165 -- 198}, note = "LNCS 693" } @inproceedings {Vascon93, author = {Vasco T. Vasconcelos}, title = {Predicative polymorphism in the $\pi$-calculus}, booktitle = {Proceedings of 5th Conference on Parallel Architectures and Languages (PARLE 94)}, year = 1994, note = "LNCS" } @inproceedings {Laufer-Odersky/original, author = {L\"{a}ufer, Konstantin and Odersky, Martin}, title = {An Extension of {ML} with First-Class Abstract Types}, booktitle = {Proceedings of the ACM SIGPLAN Workshop on ML and its Applications}, year = {1992} } @inproceedings {Augustsson85, author = {Lennart Augustsson}, title = "Compiling Pattern Matching", booktitle = "Proc. of the ACM Functional Programming and Computer Architecture Conference", year = {1985} } @TechReport{GCDistri, author = "Shapiro, Marc and Dickman, Peter and Plainfoss\'{e}, David", title = "{SSP} Chains: Robust, Distributed References Supporting Acyclic Garbage Collection", institution = "INRIA", year = 1992, type = "Rapport de Recherche", number = 1799, month = nov, note = "Also available as Broadcast Technical Report \#1" } hevea-2.30/examples/acc.tex0000644004317100512160000000155110513201342015633 0ustar marangetcristal\documentclass{article} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage{amssymb} \usepackage{textcomp} \renewcommand{\text@accent}[3]{} \newcommand{\zyva}[1] {\texttt{\string#1} & #1{A}#1{a} & #1{E}#1{e} & #1{I}#1{\i} & #1{O}#1{o} & #1{U}#1{u} & #1{Y}#1{y} & #1{C}#1{c} & #1{}} \begin{document} \section*{Text accent} This table shows the accented letters that \hevea{} can generate. \begin{tabular}{c@{\quad}*{8}{c}} & \textbf{Aa} & \textbf{Ee} & \textbf{I\i} & \textbf{Oo} & \textbf{Uu} & \textbf{Yy} & \textbf{Cc} & --- \\ \hline \zyva{\"}\\ \zyva{\'}\\ \zyva{\.}\\ \zyva{\=}\\ \zyva{\^}\\ \zyva{\`}\\ \zyva{\~}\\ \zyva{\b}\\ \zyva{\c}\\ \zyva{\k}\\ \zyva{\r}\\ \zyva{\u}\\ \zyva{\v}\\ \zyva{\H}\\ \zyva{\textcircled} \hline \end{tabular} \section*{A few ``blackboard'' letters} $$ \begin{array}{c} \mathbb{CNRZQ} \end{array} $$ \end{document} hevea-2.30/examples/smile.hva0000644004317100512160000000016106633550644016214 0ustar marangetcristal\newenvironment{centergpic} {\begin{toimage}} {\box\graph\end{toimage}\begin{center}\imageflush\end{center}} hevea-2.30/examples/pat.def0000644004317100512160000005274607077105370015662 0ustar marangetcristal\makeatletter \typeout{``page''} % cedric: removed for llncs %page layout %\oddsidemargin 0cm %\evensidemargin 0cm %\topmargin 10pt %\headheight 0pt %\headsep 0pt %\footheight 0pt %\footskip 24pt %\textheight 24cm %\textwidth 15.5cm %\footnotesep 1cm %\baselineskip = 24pt plus 4pt minus 3pt %\voffset=-0.5cm %\hoffset=0.5cm \makeatother \makeatletter % on active et desactive le mode frtypo par \frtypotrue et frtypofalse % quelquesoit le mode les caract\`eres : ; ? ! sont actifs. % En particulier ces caract\`eres ne peuvent plus \^etre mis dans des % \'etiquettes. \def\halfspace{\kern .166em} \def\space@pv{\ifmmode ;\else \halfspace;\fi} \def\space@dc{\ifmmode :\else \halfspace:\fi} \def\space@pi{\ifmmode ?\else \halfspace?\fi} \def\space@pe{\ifmmode !\else \halfspace!\fi} \let\nospace@pv=; \let\nospace@dc=: \let\nospace@pi=? \let\nospace@pe=! \catcode`;=\active \catcode`:=\active \catcode`?=\active \catcode`!=\active \def \frtypo {\let;=\space@pv\let:=\space@dc\let!=\space@pe\let?=\space@pi} \def \entypo {\let;=\nospace@pv\let:=\nospace@dc\let!=\nospace@pe\let?=\nospace@pi} \frtypo \def\@sanitize {\@makeother\ \@makeother\\\@makeother\$\@makeother\&% \@makeother\#\@makeother\^\@makeother\^^K\@makeother\_\@makeother\^^A% \@makeother\%\@makeother\~\@makeother\;\@makeother\?\@makeother% \:\@makeother\!} \let \oldspecials \dospecials \def \dospecials {\oldspecials \do\:\do\!\do \?\do\;} %\scrollmode \makeatletter %=========================================================================== % Personals macros (They might have strange latex side effects %----------------- \def\noparindent{\everypar={\hskip -\parindent\everypar={}}} \def \para {\medskip\noparindent} \def \pari {\medskip\noparindent} \def \parii {\smallskip\noparindent} \let\paro=\noparindent %=========================================================================== % Definitions Theorems %--------------------- \newif \iffrench \if \csname french\endcsname \relax \frenchfalse \else \frenchtrue\fi \if \csname definition\endcsname\relax \newtheorem{definition}{D\iffrench \'e\else e\fi finition}\fi \def\bdf{\begin{definition}\begin{em}} \def\edf{\ifvmode\vskip-\lastskip\nopagebreak\else \penalty 100\fi\end{em}\end{definition}} \if \csname theorem\endcsname\relax \newtheorem{theorem}{\iffrench Théorème\else Theorem\fi}\fi \def\bthm{\begin{theorem}} \def\ethm{\end{theorem}} \newtheorem{algorithm}{Algorithm\if\french e\else\fi} \def\balgo{\begin{algorithm}} \def\ealgo{\end{algorithm}} \if \csname proposition\endcsname\relax \newtheorem{proposition}{Proposition}\fi \def\bprop{\begin{proposition}} \def\eprop{\end{proposition}} \if \csname lemma\endcsname\relax \newtheorem{lemma}[proposition]{Lemm\iffrench e\else a\fi}\fi \def\blem{\begin{lemma}} \def\elem{\end{lemma}} \if \csname corollary\endcsname\relax \newtheorem{corollary}[proposition]{Corollary}\fi \def\bcor{\begin{corollary}} \def\ecor{\end{corollary}} \def\brmk{\trivlist \item[\hskip \labelsep {\bf {Note}}]} \def\ermk{\endtrivlist} \newtheorem{Note}{Note} \def\bnote{\begin{note}\begin{em}} \def\enote{\end{em}\end{note}} \if \csname example\endcsname\relax %\newtheorem{example}[remark]{Ex\iffrench a\else e\fi mple}\fi \newtheorem{example}{Ex\iffrench a\else e\fi mple}\fi \def\bxple{\trivlist \item[\hskip \labelsep {\bf {Example}}]} %{\begin{example}\begin{em}} \def\exple{\endtrivlist} %{\end{em}\end{example}} \def\@begintheorem#1#2{\it \trivlist \item[\hskip \labelsep{\bf #1\ #2}]} \def\@opargbegintheorem#1#2#3{\it \trivlist \item[\hskip \labelsep{\bf #1\ #2\ (#3)}]} \def\@endtheorem{\endtrivlist} \newcount \indemo \def \makeno #1{\global \advance \indemo by 1\global \expandafter \edef \csname demo/\the\cdemo/#1\endcsname{\the\indemo}} \def \refno #1{\if \relax\csname demo/\the\cdemo/#1\endcsname \relax \write0 {Demo counter #1 undefined}??\else \csname demo/\the\cdemo/#1\endcsname\fi} \def \labno #1{\makeno {#1}\refno {#1}} \newif \ifdemo \demotrue \newcount \cdemo \newenvironment{demo}{\bdemo}{\edemo} \def\bdemotrue{\trivlist \item[\hskip \labelsep {\underline {\iffrench Preuve\else Proof\fi}:}]\advance\cdemo by 1\indemo 0} \def\edemo{\penalty 100\hfill\rule{2mm}{2mm} \endtrivlist\@doendpe} \long \def \bdemofalse #1\edemo{\relax} \outer \def \bdemo {\ifdemo \bdemotrue \else \expandafter \bdemofalse \fi\indent} \newif \ifhint \hintfalse \newtheorem{hint}{\rm \underline {Hint}} \def\bhintiftrue{\trivlist \item[\hskip \labelsep {\underline {Hint}:}]} \def\ehint{\penalty 100\hfill\noindent\rule{2mm}{2mm}\endtrivlist} \long \def \bhintiffalse #1\ehint{\relax} \outer \def \bhint {\ifhint \bhintiftrue \else \expandafter \bhintiffalse \fi} \newif \ifexpert \expertfalse \newtheorem{expert}{Remark} \def\bexpertiftrue{\trivlist \item[\hskip \labelsep {\underline {Hint}:}]} \def\eexpert{\penalty 100\hfill\noindent\rule{2mm}{2mm}\endtrivlist} \long \def \bexpertiffalse #1\eexpert{\relax} \outer \def \bexpert {\ifexpert \bexpertiftrue \else \expandafter \bexpertiffalse \fi} \def\notitle{\hskip\hsize minus\hsize\nobreak\hbox{}} \def\notation{\paragraph*{Notation}} \def\hypothesis{\paragraph*{Assumption}} \def \caseparagraph{\@startsection {case}{6}{\z@}{1.5ex plus .3ex minus .2ex}{-1em}{\normalsize\bf}} \def \subcaseparagraph{\@startsection % {subcase}{7}{\parindent}{1.5ex plus .3ex minus .2ex}{-1em}{\normalsize\bf}} {subcase}{7}{\z@}{1.5ex plus .3ex minus .2ex}{-1em}{\normalsize\bf}} \if \csname datefrench\endcsname\relax \def \langcase {Case} \def \langsubcase {Subcase} \else \def \langcase {Cas} \def \langsubcase {Sous-cas} \fi \def\case#1{\caseparagraph*{\langcase\space #1:}} \def\othercase#1{\caseparagraph*{#1:}} \def\mathcase#1{\caseparagraph*{\langcase\space $#1$:}} \def\subcase#1{\subcaseparagraph*{\langsubcase\space #1:}} % Send a warning when running latex \def\warning#1{\immediate\write0{Warning: #1}} \newenvironment{care}{\bwarning}{\ewarning} \def\bcare{\trivlist \item[\hskip \labelsep {\bf Warning!}]} \def\ecare{\endtrivlist} \def\subst#1#2{^{#1} \!/\! _{#2}} \def \comment #1{{\em #1}} %\def \comment #1{} \makeatother \makeatletter %%% To change size in math mode \let\Ts=\textstyle \let\Ds=\displaystyle \let\Ss=\scriptstyle %%% Abrevs \let \comp \circ \let \wild \_ %%% To put text between two formulas on the same line \def\text#1{\qquad\hbox{#1}\qquad} %%% Macros for mathematics %% Special symbols \def \nat {{\mathord{I\kern -.33em N}}} \def \natb {{\mathord{I\kern -.33em\overline{N}}}} \def\Vdash {\mathrel{\hbox{\vrule\kern .1ex$\vdash$}}} \def\VVdash {\mathrel{\hbox{\vrule\kern .2ex\vrule\kern .1ex $\vdash$}}} % An open box to end demonstrations with \def\Box{\hbox {\vbox {\hrule height .033em \hbox to .5em {\vrule width .033em \hbox{\vbox to .5em{\vss}\hss} \vrule width .033em} \hrule height .033em }}} %% Balanced symbols \def\absolute#1{\mathopen\mid#1\mathclose\mid} %% Operators \def \domain {\dv} %\def \domain {\dvmathop{\sl dom\,}} \def \image {\mathop{\sl im\,}} \def \modulo {\mathbin{\rm modulo}} \def \inverse{{}^{-1}} \def \cardinal {{\sl Card\,}} %\def \restrict #1{\mathbin{\mid}_{#1}} \def \restrict {\mathbin{\hbox{$\mid$\kern-.24em\lower.09em\hbox{\rm\char'22}$\!$}}} \let \arity = \varrho %% Quantifiers \def \fall #1,{\forall #1,\;} \def \exist #1,{\exists #1,\;} \def \qt #1.{\forall\,#1.\,} \def \ex #1.{\exists\,#1.\,} %% Arrows \let\ar=\rightarrow \let\dar=\Rightarrow \def\imply{\Longrightarrow} \def \rewrite {\mathrel{-}\joinrel\leadsto} %% Equalities %\def \axiom {\mathrel {\mathop =^!}} \def \axiom {=} \def \eqdef {\mathrel {\mathop {=\joinrel=}\limits^{def}}} %% Sizes \def\({\left(} \def\){\right)} \def\Mid{\mathrel{\Big|}} %% Indices see also indices.def \def \ind #1#2{_{#1\in[1,#2]}} %% %% names \let \th \vdash \let \tth \Vdash \let \ttth \VVdash \let \thh \models \def\Cal#1{{\cal #1}} \let \eset = \emptyset %% Aligned constructions in math mode % For internal use only \def\noskip{\lineskiplimit=\the\lineskiplimit \lineskip=\the\lineskip} \def\moreskip{\lineskiplimit=0.4em\lineskip=0.4em plus 0.2em} \def\moremoreskip{\lineskiplimit=1.2em\lineskip=1.2em plus 0.2em} \def\vatrix#1{\null\,\vcenter{\normalbaselines\moreskip\m@th \let \and \cr \ialign{$\displaystyle##$\hfil &\quad$\displaystyle##$\hfil&\quad##\hfil\crcr \mathstrut\crcr\noalign{\kern-\baselineskip} #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,} % A sequence of expressions is writen on separate lines to form one expression \def \band #1{\left\{\vatrix{#1}\right.} % brace and \def \wand #1{\wedge\band{#1}} % wedge and \def \vand #1{\vee\band{#1}} % vee and \def \vor #1{\vee\left[\vatrix{#1}\right.} % vee and or \def \Wand #1{\bigwedge\band{#1}} % big wedge and \def \Vand #1{\bigvee\band{#1}} % big vee and \def \Wor #1{\bigvee\left[\vatrix{#1}\right.} % big vee and % A general usage tabulation in math mode. % Indentation is alternatively left and right, so that good place for % tabs will produce many different % \dalign { & blabla :& blabla \cr % & bla :& blablabla \cr % } % \dalign { blabla :&& blabla \cr % bla : && blablabla \cr % } % \dalign { & blabla :& blabla \cr % & bla :& blablabla \cr % } % Internal and personal use \def\Dalign#1#2{\vcenter \bgroup \let\>=\qquad \def\title##1{\crcr\noalign{\medskip}\multispan#1{\hfil\bf##1\hfil}} % \halign{$##$\hfil\qquad&&\hfil$##{}$&${}##$\hfil\qquad\cr#2\crcr} % \halign{$##$\hfil&&\qquad\hfil$##{}$&${}##$\hfil\cr#2\crcr} \halign{&${}##$\hfil&\hfil$##{}$\cr#2\crcr} \egroup} % End internal use \def\align#1{\vcenter \bgroup \let\>=\qquad \halign{#1\crcr} \egroup} %\def\aligndef#1#2{\expandafter\def\csname aligndef#1\endcsname{#2}} %\aligndef ]{\argalign} %\aligndef l{&\hfil$##{}$} %\aligndef r{&${}##$\hfil} %\aligndef c{&\hfil$##$\hfil} %\aligndef -{\qquad} %\aligndef L{&\hfil##$} %\aligndef R{&##\hfil} %\aligndef C{&\hfil##\hfil} %\def\argalign#1{\relax} %\def\prealign#1{\csname aligndef#1\endcsname\prealign} %\def\doalign#1]{\dohalign{\prealign#1]}} %\def\dohalign#1#2{\expandafter\halign{#1\cr#2\crcr}} %\def\dalign#1{\ifx#1[\doalign\else\Dalign3{#1}\fi} \def\dalign{\Dalign3} \def\Strut{\raise .4em\hbox{\strut}\raise -.4em\hbox{\strut}} \def \deftitle #1 {\def \title ##1 {\crcr\noalign{\medskip}\multispan#1{\hfil\bf##1\hfil}}} \bgroup \catcode `\^^M \active \gdef \obeycr {\catcode `\^^M\active \let ^^M\crcr} \egroup \ifx \csname linewidth\endcsname \hsize \let \realwidth \hsize \else \let \realwidth \linewidth \fi \def \oris {\crcr \mid&} \def \syntaxtable #1 {\def\is {::=&} \def \\{\cr\noalign{\medskip}}\def\cont{\cr&}\vbox \bgroup \tabskip=100pt plus 1000pt minus 1000pt \halign to \realwidth {\hfil$##{}$\tabskip=0pt& ${}##$\hfil \tabskip=100pt plus 1000pt minus 1000pt& &##\hfil \cr#1\crcr} \egroup} \def \assertions #1 {\deftitle2 \vbox \bgroup \halign {\hfil$##{}$&$##$\hfil&&\quad##\hfil\cr#1\crcr} \egroup} %%% old version \def\malign#1{\vcenter\bgroup \deftitle #1 \def \lign ##1\cr {\noalign {##1}} \def \textlign##1{\noalign {\medskip \vbox {\noindent ##1}\medskip}} \tabskip=100pt plus 1000pt minus 1000pt \halign to \realwidth {\hfil$##{}$\tabskip=0pt& ${}##$\hfil \tabskip=100pt plus 1000pt minus 1000pt& &##\hfil&$##$\hfil& \cr#1\crcr\egroup}} \newif \ifhsize \hsizefalse \newskip \nullskip \nullskip 0pt \newskip \fullskip \fullskip 100pt plus 1000pt minus 1000pt \def \maligntrue {\tabskip \fullskip \halign to \realwidth \bgroup} \def \malignfalse {\halign \bgroup} \def \malign {\vcenter \bgroup \ifhsize \expandafter \maligntrue \else \expandafter \malignfalse \fi} \def \endmalign {\crcr \egroup \egroup} \def \makeword #1#2#3{\expandafter \def \noexpand#3{#2 {#1\expandafter \let \expandafter \dummy\string #3}}} \let \vect \overrightarrow \def \uad {\hskip 0.5em} \newskip \mathandskip \newskip\mathmargin \mathmargin 0em \mathandskip 2em plus 0.5fil minus 0.5em \def \mathand {\hskip \mathandskip} \def \mathleftright {\hfill{}\hskip 0em plus -2fill\penalty 50{}\hfill} \def \mathandcr {\penalty 50\mathand} \def \mathcr {\penalty -10000\mathand} \def \mathcrleft {\hfill{}\hskip 0em plus -2fill\penalty -10000{}\hskip \mathmargin} \def \mathbreak {\penalty 50} \def \incrmargin #1{\advance\mathmargin by #1em\advance\mathmargin by #1em} \def \mathslash#1{\let \do \mathcrleft \ifx #1[\let\do\mathdoskip\fi\do#1} \def \mathdoskip#1#2]{\incrmargin {#2}\mathcrleft} % Type inference rules \let \mathmoreskip=\moremoreskip \def \nomoreskip {\let \mathmoreskip \relax} \def \bmaths {\let \and \mathandcr \hsize \realwidth \centering \vbox \bgroup \mathmoreskip \noindent $\displaystyle \let \\ \mathslash} \def \emaths {\unskip$\egroup} \def \mathflushleft {\def \emaths {\hfill$\egroup}\nomoreskip} \newenvironment {maths}{\bmaths}{\emaths} \def \maths #1{\bmaths #1\emaths} \def \whereis {\leftarrow} \def \where #1{[{\let \is \whereis #1}]} \def \dowhere #1\is#2\is{[\ifx#2\empty #1\else #2/#1\fi]} \def \where #1{\let \is \relax\dowhere #1\is\empty\is} \let \closeplus\relax \let \Empty \relax \let \is \relax \def \plus #1{\PLUS #1\is\is\END} \def \PLUS #1\is#2\is#3\END{\oplus\ifx #3\is (#1\plustoken#2)\else #1\fi} \let \plustoken \mapsto \let \diverge \uparrow \def \set #1{\{#1\}} \def \sem #1{\lbrack\!\lbrack#1\rbrack\!\rbrack} \def\mathrm #1{\mathrel {\rm #1}} \let \coerce \leq \makeatother \makeatletter %% see infer.doc for a documentation % Judgements \let\th=\vdash % naming \expandafter \ifx \csname name\endcsname\relax \def\name#1{\hbox{\sc #1}}\else \relax \fi \def \labname #1{{\rm(\name{#1})}} \let \lab = \labname \def \clab #1{\hbox {$\smash {\lab{#1}}$}} \newskip \beforelabskip \beforelabskip = 0.5em \def \eqlab {\eqno \lab} %% inside rules \def \nmir #1[#2]{\crcr \hrulefill \cr} \def \rmir #1[#2]{\crcr \hrulefill & \clab {#2} \cr} \def \lmir #1[#2]{\relax} \def \Lmir #1[#2]{\crcr \Llabo {#2}\hrulefill \cr} \def \Rmir #1[#2]{\crcr \hrulefill \Rlabo {#2}\cr} \def \imir {\crcr \hrulefill\cr} % outside rules \def \rlabo #1{\hskip \beforelabskip \clab {#1}} \def \llabo #1{\clab {#1}\hskip \beforelabskip} \def \Rlabo #1{\rlap {\rlabo {#1}}} \def \Llabo #1{\llap {\llabo {#1}}} \let \labr \rlabo \let \labl \llabo \let \labR \Rlabo \let \labL \Llabo \def \rlab #1 {\rlap {\lab {#1}}} \def \llab #1 {\llap {\lab {#1}}} % A good separator for multiple hypothesis \let \and \qquad \let \andcr \cr % Single rules \def \lessskip {\lineskiplimit=.3em\lineskip= .2em plus .1em} \makeatletter \def \mathrulename {\scriptsize \labname} \def \ignoredash #1{\let\next\ignoredash \ifx #1-\relax\else\let\next#1\fi\next} \def \mathrule {\@ifnextchar [{\mathrulelab}{\@mathrule}} \def \mathrulelab[#1]#2{\hbox {\vbox {\hbox {\mathrulename {#1}}\nointerlineskip\smallskip \hbox {$\@mathrule{#2}$}}}} \def \@mathrule #1{{\let \and \qquad \let \rlab \rl \let \llab \ll \def \mir {MiR}\def\endrule {EnDrUlE} \displaystyle \offinterlineskip \lessskip \bgroup \openrule \beginrule #1\mir \mir \endrule}} \def \beginrule #1\mir#2{#1\ifx #2\mir \let \next \finishrule \else \def \next {\middlerule\openrule \beginrule\ignoredash#2}\fi\next} \def\finishrule#1\endrule{\closerule\egroup} \def \openrule {\hbox \bgroup \vbox \bgroup \halign \bgroup \hfil $##$\hfil &\hskip \beforelabskip$##$\hfil \cr} \def \closerule {\crcr\egroup\egroup\egroup} %\def \endrule {\closerule \egroup} \def \singleRule {\crcr\noalign {\vskip -0.1em}\closerule \over} \let \middlerule \singleRule % Double and Tripple rules see infer-more.def % Logic and rewriterules \def \logicrule #1{\let \mir \Longrightarrow #1} \def \longleadsto {\mathrel{-}\joinrel\leadsto} \def \rewriterule #1{\displaystyle \offinterlineskip \lessskip \bgroup\let \mir \longleadsto \openrule#1\endrule} \def \suspend #1{\vbox to #1 {\leaders \hbox {$\cdot$}\vfill}} \if \relax \csname keywordstyle\endcsname \let \keywordstyle \tt \fi %\def \keyword #1{{\hbox {\keywordstyle #1}}} \def \keyword #1{{\keywordstyle #1}} \def \mathtoken #1{\ifmmode \mathopen{}\keyword {#1}\mathclose{}\else \keyword{#1}\fi} \def \mathpostfix #1{\mathrel{\keyword {#1}}\mathclose{}} \def \mathprefix #1{\mathopen{}\mathrel{\keyword {#1}}} \def \mathinfix #1{\mathrel{\keyword {#1}}} \def\ignorefirst #1{} \def \lwt #1{\expandafter \lowercase \expandafter \bgroup \expandafter \ignorefirst \string #1\egroup} \def \makeprefix #1#2{\expandafter\def \noexpand #1{\mathprefix {#2}}} \def \makepostfix #1#2{\expandafter\def \noexpand #1{\mathpostfix {#2}}} \def \maketoken #1#2{\expandafter\def \noexpand #1{\mathtoken {#2}}} \def \makeinfix #1#2{\expandafter\def \noexpand #1{\mathinfix {#2}}} \def \makein #1{\expandafter\def \noexpand #1##1in{\keyword {\lwt #1}\,\,##1\,\,\keyword {in}\,\,}} \let \@ \; \def \Let #1=#2in{\keyword {let}\@ {#1 = #2} \@\keyword {in}\@} \def \fun (#1){\keyword {fun}\@ #1 \rightarrow} \def \type #1=#2in{\keyword {type}\@ #1 = #2 \@\keyword {in}\@} \makeatother \let \cont \kappa \let \t \tau \let \l \ell \let \s \sigma \let \tv \alpha \let \vect \bar \def \Gen {{\rm Gen}} \def \tplus #1{\TPLUS #1\is\is\END} \def \TPLUS #1\is#2\is#3\END{\oplus\ifx #3\is (#1:#2)\else #1\fi} %%%%%%%%%%%%%%% light programs \makeatletter \def \progstyle {\tt} \newskip \programindent \programindent 4em \def \program {\par \begingroup \medskip \parindent \programindent \@tempswafalse \frenchspacing \@vobeyspaces \let \par \programpar \obeylines \progstyle \catcode``=13 \@noligs \let \do \@makeother \dospecials \catcode `\\ 0 \catcode `\{ 1 \catcode `\} 2 \prog@specials \prog@initspecials \obeyspaces} \def \programpar {\if@tempswa\hbox{}\fi\@tempswatrue\@@par} \bgroup \gdef \less@specials {\relax \catcode `| \active \catcode `< \active \catcode `> \active \catcode `- \active \catcode `\' \active } \gdef \more@specials {\relax \catcode `( \active \catcode `) \active } \gdef \prog@specials {\less@specials\more@specials} \prog@specials \gdef \prog@initspecials {\def -{\minus@program}\def '{\acurate@program}\def |{\bar@program}\def <{\less@program}\def >{\greater@program}\def ({\less@program}\def ){\greater@program}} \gdef \bar@@program {\let\do \eattoken \ifx \token >$\droite$\else ${}\mid{}$\let \do \relax\fi \do} \gdef \minus@@program {\let\do \eattoken \ifx \token >$\ar$\else -\let \do \relax\fi \do} \egroup \def \acurate@program {\futurelet \token \acurate@@program} \def \acurate@@program {\let \do \eattoken \ifx \token a$\alpha$\else \ifx \token b$\beta$\else \char `\' \let \do \relax\fi\fi \do} \def \less@program {\hbox{$<$}} \def \greater@program {\hbox{$>$}} \def \bar@program {\futurelet \token \bar@@program} \def \minus@program {\futurelet \token \minus@@program} \def \endprogram {\ifdim\lastskip >\z@ \@tempskipa\lastskip \vskip -\lastskip\fi\medskip \endgroup \@endpetrue} \def\prog {\begingroup \hbox \bgroup \catcode ``=13 \@noligs \let \do \@makeother \dospecials \progstyle \prog@specials \prog@initspecials \catcode `\\ 0 \catcode `\{ 1 \catcode `\} 2 \@prog} \def\@prog#1{\obeyspaces \frenchspacing \catcode `\ 10 \def\@tempa ##1#1{##1\egroup\endgroup}\@tempa} \makeatother %%%%%%%%%%%%%%%%%%% "quotations" \makeatletter % on active le cararectere " et on s'en sert pour le mode \prog % s'il est défini ou \verb autrement \bgroup \@makeother \" \gdef \progquote {\prog"} \catcode `\" \active \gdef "{\progquote} \egroup \def \quoteon { \let \quote@sanitize \@sanitize \def \@sanitize {\quote@sanitize \@makeother\"} \let \quote@specials \dospecials \def \dospecials {\quote@specials \do\"} \def \quoteon {\catcode `\" \active}\quoteon} \def \quoteoff {\@makeother \"} \makeatother %%%%%%%%%%%%%%%% \def \lift #1{\;{}^{#1}} \def \inu #1{\lift {i \in 1..#1}} \def \jnu #1{\lift {j \in 1..#1}} %% typo \mathchardef \le "313C \mathchardef \ge "313E \mathcode `< "4268 \mathcode `> "5269 \catcode `\| \active \let \olspecials \dospecials \def \dospecials {\olspecials \do \|} %\def \droite {\mathrel {\,\hbox {\large$\triangleright$}\,}} \def \droite {\mathrel{\tt =}} \makeatletter \def |{\baractive} \def \baractive {\futurelet\token \next@baractive} \def \eattoken #1{} \def \next@baractive{\let\do\eattoken \ifx \token>\droite\else \mid \let \do \relax \fi \do} \def \Def #1in{\mathprefix {let}#1\mathinfix{in}} \def \Let#1in{\mathprefix {let}#1\mathinfix{in}} \def \Reply#1to{\mathprefix {reply}#1\mathinfix{to}} \def \>{\droite} \def \And {\mathrel{\tt and}} \def \tuple #1{{\tt (}#1{\tt )}} \def \<#1> {\tuple {#1}} \let \bcup \cup \let \thd \th \def \fv {fv} \def \defines {::} \def \produces #1{\Ds\mathop{\Longrightarrow}^{#1}} \def \reduces {\longrightarrow} \let \red \reduces \let \redcham \mapsto \let \plus \tplus \makeatother \def \dd {{\cal D}} \def \pp {{\cal P}} \def \dv {dv} \def \redsoupe {\mathrel {\mathop {\red} \limits^s}} \let \redstruct \rightleftharpoons \let \redchaud \rightharpoonup \let \redfroid \leftharpoondown \let \cool \leftharpoondown \let \heat \rightharpoonup \def\redstep{\mathrel{\mathpalette\redstepaux{}}} \def\redstepaux#1{\vcenter{\hbox{\ooalign{\hfil \raise2pt \hbox{$\rightharpoonup$}\hfil\cr\hfil \lower2pt\hbox {$\leftharpoondown$}\hfil\crcr $\longrightarrow$}}}} \let \redsoupe \red \let \redx \red \def \Comment #1{} \let \agree \approx \quoteon \maketoken \int {int} hevea-2.30/examples/a.tex0000644004317100512160000001072512017700472015341 0ustar marangetcristal\documentclass{article} \usepackage{fullpage} \usepackage[latin1]{inputenc} \usepackage{hevea} \usepackage[french]{babel} \def\homedir{http://w3.edu.polytechnique.fr/profs/informatique/Luc.Maranget/X.97} \begin{latexonly} \gdef\url#1#2{#2} \gdef\oneurl#1{\url{#1}{{\tt #1}}} \end{latexonly} \title{TD-5, encore les pointeurs} \date{} \author{} \pagestyle{empty} \begin{document} \maketitle \thispagestyle{empty} \begin{center} Ce document est disponible à l'URL \oneurl{\homedir/TD-5/enonce.html} \end{center} \begin{center} Programmes {\em Prenom.Nom.c} à déposer par {\em ftp} sur {\tt poly} en {\tt /users/profs/maranget/TD-5}. \end{center} \section{Calculatrice HP} On se propose de réaliser une petite calculette HP. \subsection{Quatre opérations} Cette première partie s'inspire du cours. On utilisera une pile {\tt stack}, globale et codée en machine par une liste d'entiers, voici la définition de {\tt stack} et le constructeur des listes~:{\small \begin{verbatim} typedef struct cell { int val; struct cell *next; } Cell, *Stack; Stack stack = NULL; Cell *cons(int val,Cell *next) { Cell *r; r = (Cell *)malloc(sizeof(Cell)); if ( r == NULL) { fprintf(stderr,"Plus de memoire\n"); exit(-1); } r->val = val; r->next = next; return r; } \end{verbatim} } \begin{itemize} \item Écrire les fonctions de base de manipulation de la pile, affichage de la pile ({\tt afficher}), empilage ({\tt push}) et dépilage ({\tt pop}). Voici des signatures possibles~:{\small \begin{verbatim} void afficher(void) int pop(void) void push(int i) \end{verbatim} } \item Une quelconque des quatre opérations (par exemple $-$) se réalise ainsi~: dépiler le second argument (par exemple $i_2$), dépiler le premier argument, (par exemple $i_1$), effectuer l'opération (par exemple $i_1-i_2$) et empiler le résultat. La calculatrice obéira à un programme contenu dans une chaîne de caractères et affichera, à chaque étape intermédiaire, le caractère lu (utiliser \verb+printf+ avec le format \verb+"%c"+) et l'état de de la pile. Par exemple, pour le programme {\tt "12-34++"}, on aura~(la pile est affichée du sommet vers le fond)~:{\small \begin{verbatim} [] 1 : [1] 2 : [2, 1] - : [-1] 3 : [3, -1] 4 : [4, 3, -1] + : [7, -1] + : [6] \end{verbatim} } Vous aurez donc à lire la chaîne-programme caractère par caractère (rappelez vous qu'une chaîne est un tableau de caractères) et à empiler un entier ou à réaliser une opération selon ce que vous avez lu. Les quatre opérations devront bien entendu utiliser les primitives de pile, {\tt push} et {\tt pop}. Attention au sens de la soustraction et de la division. \end{itemize} \subsection{Opérations avancées sur les piles} Les vraies calculatrices HP ont des touches spéciales qui permettent des manipulations de la pile. Les opérations suivantes (qui diffèrent un peu de celles des calculatrices HP) sont à réaliser sans allouer aucune cellule de liste. \begin{itemize} \item {\em Échanger} les deux éléments du sommet de pile. Cette opération sera réalisée par le caractère {\tt 's'}. Ainsi, le programme {\tt "12s-"} donnera le résultat suivant~:{\small \begin{verbatim} [] 1 : [1] 2 : [2, 1] s : [1, 2] - : [1] \end{verbatim} } \item {\em Rotation de la pile vers le haut}~: tous les éléments montent d'un cran vers le sommet de pile, le sommet de pile se retrouve en fond de pile. Le programme {\tt "4321u"} devra produire~:{\small \begin{verbatim} [] 4 : [4] 3 : [3, 4] 2 : [2, 3, 4] 1 : [1, 2, 3, 4] u : [2, 3, 4, 1] \end{verbatim} } \item {\em Rotation de la pile vers le bas}~: c'est l'opération inverse, tous les éléments descendent d'un cran, le fond de pile se retrouve en sommet de pile. Ainsi, le programme {\tt "4321d"} s'exécute ainsi~:{\small \begin{verbatim} [] 4 : [4] 3 : [3, 4] 2 : [2, 3, 4] 1 : [1, 2, 3, 4] d : [4, 1, 2, 3] \end{verbatim} } \end{itemize} Remarquez que les rotations reviennent, pour la rotation vers le haut, à mettre la cellule de tête en queue de liste et pour la rotation vers le bas, à mettre la cellule de queue en tête de liste. Vous aurez sans doute intérêt à faire de petits dessins pour vous guider. La solution de cet exercice apparaîtra \url{hp.c}{en hp.c}. \section{S'il vous reste du temps} Réaliser une calculatrice PH, dont la structure de contrôle est une file. La file sera réalisée par une liste (voir la fin du cours). Une opération se fera en défilant les deux arguments et en enfilant le résultat. Vous pouvez aller jusqu'à donner une signification claire aux rotations et à les programmer. \end{document} hevea-2.30/examples/suite-macros.hva0000644004317100512160000000103212017660721017503 0ustar marangetcristal%%Class test \urldef{\heveaurl}{\url}{http://hevea.inria.fr/} \urldef{\heveasecret}{\url}{http://moscova.inria.fr/~maranget/hevea/} \newcommand{\@tst}{font-family:sans;font-style:oblique;color:maroon} \newstyle{.tst}{\@tst} \newcommand{\cls}{\@span{class="tst"}} \newcommand{\sty}{\@span{style="\@tst"}} %%Color test \newcommand{\color@name}{green} \newcommand{\@color}{color:\@getstylecolor{\color@name}} \newstyle{.highlight}{\@color} \newcommand{\clshigh}{\@span{class="highlight"}} \newcommand{\styhigh}{\@span{style="\@color"}} %%%% hevea-2.30/examples/HF.ps.gz0000644004317100512160000160750507041415265015674 0ustar marangetcristal‹W!8HF.psì]oãHv†¯·~…r1È.iש~Ì]f³“ Á ,¹(’Ån¶eÈžÙ™ùï9ç­CIîö´mYv˽EBI‘/‹¤zú=çT}ów?þùÛœÖCþÖ½³«?ýøçdÁ|óÍœß^äïVgÖ—ùl\_ÝžŸ]¦MºzŸoÏ>Ü^^¼ÏWgù—ty}‘oÎþå‡w×7|Ð79Ý®7ß­þó/«¿äÍÍùújåß‘M«Õ¿çŸ¿[‘;sýYV¿ÿñßþyunÇ+zçþ°Z}»Z ¿®þuýájõý&MùW–û~ýÓÕt~õþûõ/ß­,ÏÎÛuÒ¼Óû|¼øOëñ§Ë|uû7òæ;Þð§«éëKÙtSÖ~ܬ/ÖïÆGñqæ›Õ&_æË!oVëÍùûó«t±º¹M·ÙœÉ:W7é缚ò,»?_L«´ºÍ—×ëMÚüºšÎÇ[¾D^4Îbm5dV’½ù ó+¸Ýð¬n׫k}3¦« þæïoV]on?¬ÖójJ·Éœ]Ÿÿ²"Šn9FO»]§1¯æõf5òÅÈûÕÏåߘ³÷›ôëÍǯVßì%»ÈÉ/òJNoήø|7|SåÕæ*oŒ<€[þ ¸¹›Ä»ÜœÿO–æŸ_ò]]ýžŸõuºÎ›X_­è¬uçWüxÇõz3ÝüÁð£{,OòßY,¡9Æ Ý=¯w¿ûÝïø‚ÏùÑá¶÷æ¿°‹4à[ÙÏÊÞÿ-û^¦ëk¹ÜËÄ—ý‹ùßñ§Í†Ÿû|Η)÷“ÿ§ù½)×ëëÿ3h­1öHSªBU¨ }…BÎÏ2ɧ;}Q!²þa¡åŽ=qzÕKËälÄÒòLio>~‹|œ­ñž×ÃÞ]zð~‘·YŽ•õv²éÁS–Ëèh°ÖçíŸ0.–ŒoýH™W²ßOZzÄ-Ú°lä[éŸô Ή¥Ù~šdw±­¥¨ƒ€Lr‘¼‹†¿my¬²kÄî…¼&æ*A¹ÄK·81"õv†hKÎ|»ÄƒKä ³SfJ¾crr®ñߨ…§äåþÃià ¾LËóÄhÂïÀÏp$nO/€ÔvŠ;4à50ø0=ñQáhÁ£n‹Oe_q“Äm xJ¦Ä/bàÉê11 ü9 ÁW*þQA¤V¼%^*—* U¡*T…ªÐg„Ž‚ü_ᑃ!é/í±S¹èÀ¿—£þ¾? tà}zÕK[ÚèH˜ðI»Ú"·w>{ßÙ>;)N턚`Óå¨/k 2 -—6Y T$;QO Š®§ÎÉ×ÊaûD<ü‰Ð)ó»/€Ôybj]çÈ > ¼Öx‡ [çÇàRt{€TB]sã@>‚H$Òvn€<=ð¨íãQ«ïÝÊÑÝ \ü¢ž_òÞó9',´  ˜G¨l vªPªBUè3BžH;/†Ô¡9r‹Ž(T€%"äå?ö‘ŽÚ¢VMœ2=5O+áx¿$Å=ÎAì‚SËŸ®SÊáµrÕÔój— yH­Í’¶dGr2Û™¿ÕvSËh$ÅûðvÞÃŽÎ×ÒÄòÎe× *ùˆ@!Жlˆ¡ }˜<ÚØðkD +#È‹Äd”iŠ¡Ô":Ö‚õ–…£V "Ù±OÂö²ŒjJ`mBè¬W ê€ÊglJ P#öw©a<¢ècS© U¡*T…ª!6û¤Ûr˜ø=~¥Ü¢# Ö[é"µEÃ^âУó²¶SbœáÖ--zu†í©üvKo…‰ôÒ$;)•‚ÒÀÀ™Š[Ô31*0 I¬Nbk™F×8ÉDJ¼Ï›zãê(ÛÌ_´nä{˜]rƒ›ýäG?ñ} ŒG‰gIÑ–©“àš&J Ù8ó@¼Ó”¤¤‚@ÎQ«È´øFƒ€B¼‡WwI¶Và¦Í9šð€>Yƒh#0)a» Z‡¹…·5:na¤P© U¡*T…ªÐç¦''i—IÒ³ ÒÑ[td!²÷T°½E=0£€v|`ÿO'w·E/§\l«%²×1©µ iu¶'yŸHZÕ0 en[¶’%᜖dmqFGÔ’ØDŽIFiäÿ94†i¡ì­e,]L’[$’ü£0")E]]”4mfœ‚23L5b+ÉÆÅ#  ¨YHÍŠ–­…pAÑÈ•”"ƒ¬£’q4Ž  á XÈ4j‘q¶á¿†·K­‹¾RªBU¨ }F¨–ùß™UæÿrìÞÓüM?ç¨-*g)&Ü¡nd4 <̓»È4lù´ÓÔnɾnä)I’Ré1ݑȷbÙYs“²³’…Mþ)ŒRüï­ä¯Ï†Y©už&IÊfD"ç½c8ÊŒGƒº0…&…^¡[Ô’1ß`— d1h­“:| Bf·W—©¤.•:~Ù↿DԒ̧j™¥p?hÖQBˆo ²Eí|@¼£W$W© U¡*T…^TÈ/ý×øÃùj7íZt`oCz¬þB>åß(»:©›}°ÐriwÒ)_Zļ°Ý§ÝÅìŠå&µ­¤8­)BÑŽ¥ó»MÎQÙ-0"ɽH4ùà&Š$~ ¸G S\$òä ÿ’“Ì£$½!¡à?2Í!„ˆê5ËÀ!sñjD3Ba#Àe6œÜA½¡}“.‹ä»^pÂ;€# Ä-ñ9 KhBÿlPÖŠºm­Qÿjn°5 U úAŠÈI’,$¾ªPªBUèE…h¤gP»i)—„Út@¨Æ.Y¾F#J·énbÎKÖÂA¡Å%Œû5ô§|iiSËÓÛŠNŸª$E­-(q½I*øK©¿áÅEüqKʤYXeÝñ®ž(Q ‰$}{ÄN’­i$ ÅÍÔÊ4¡Ô_ú=j˜=øÌÌ‘ðÚ¬Nô.´x5%-z ~IÐk20zzs(`M §Y"Bæ‘Ôíc‹bÓ´DÔ4ñh4€¯¤˜´Hþ£y™‘xiäâqEɼª€T…ªPªB¯ äv\óÌi (´nŸ#ôØÉïÙ*ñӜ듻ÙÒÍŽ6NùÒJœKšçö¨Ù/=s–‹‰ H¥”Ѓ‰4iÛðR€õ?úã,à-R ÙI N¼£™:Þ2H²9IoÛŽ!)»Î¸Éõ®sƒ÷Ò9·Ÿ—9ô˜‡êÆÂ–’¦O/eøÃH0–à •³’y­Ý/ E“rPá¡5ýLCF¿*É×Kv졨Ö–‹w$àDa9Œ¼M²’<ß¶¹RªBU¨ ½¨æÆ.\óliiáGëPÞzrˆmiwÿé!'t³"½¢8…=Bˆì^ñ¾'?ã!yuŠƒ´øGîã©‘^ŒtyᬓH$ $ Ú­~7¡K€Œ5fï]–˜š)>H?É<Ï|ê±Ì #MœtˆÈRªÅ:]ê@Âh =ý¶60Æ ‘lî¦ñȧÎé·IÊ‘˜TÑh®SØi·xà_‘â‘Ú$9Æ£a®TÚ .ežç HU¨ U¡*ô‚BåGˆÌ`ä³Ó1MÊï“Ñ®u‡lËohø´(í„nöÁB;~¸C§~iKShp#ïHofný>žÊ_jv{ô‡$> —$¤†'T»9$k÷¨æï {M2b@Ú%]ï‚h^‘È2 I«d­€’¸GcèBï¦Û„º»:XmªBU¨ ½¤Ð¶dtgOFe ŸÙ÷·§`ƒ¾/7¹½tà{Zt¤é‹:Hþ>‹ïÔ/mHò$;­R‹v—Rµ?Ý ±é&¿÷µL=*ÛœŒTGT:“ä÷ ß1MS°ƒô~ä²ŒÎæf7G”HŽL~fbjàÇL‡Ôç¹äù ¨Ä£›CHÞßDßJÞt£5ù¥-*Gi²¿G”ÄEe«ÅŽrØ«1H±vèÏhÉ6RçHÂh ?ÀŸ‚J%´Æ­mKJ9¼£„Ž-ëXlU¨ U¡*ô’B´t\,!‚#¸HæN·•÷TÝ?^豓³Ÿí'ó„nö3„–Ë o'ÄfïøCË´ÿ¤ho«¼Ò¶[l2¶pÕ]c©ŒÌæáI×–^ýƼÝcBÑÚìZŒJ$ÄÖÈ`#¼ÚúÝBF$gw¼”*%Û§dödñ•4 ÈZŒŸ&æÒ?#ª×äk ›¡W€RþÖ.q1ˆ& T£úMÉAj Mši„%€PA¡ø3¢-€I¶µhu–×P‡©BU¨ U¡— E(9I£=ÌðÙ›v-òOît×·rOhi‡Ó¿Ù¢gN' $IÚÝîO EŸ¢;Ôé§LåOã.G·Û£Â}B%«»Þ+G-ÙGNú /A6jYSF¢m‘º?Iˆ­“qؼ҄^³‹0D팠Vû4ÑPl Š1<Ä{Ý`ü4{³aI8Íñ~•øe¯„.Ž<2Á…´:–’s•`Z£ !¿îôì]©¬·Û9˜ÚÒEA¤*T…ªPzq!ZŒŸ£%i?{z%¡ðøJ»·vi_™iÀ­Eªº×po鉈2eGÒ±£#šs­ëfƒâ~)ìwRõÆ`1hàjº;+ý°$˜¼¾&ñ› ÓÉ€¼îb295ÙÓ¬éBÈ>²€¡CsZ†¤kn@l& Ae3Ú”Ðù@ÑË À(ëG Sñ’ðjOÚU¨ U¡*ôòB»€äÑé󣄞0U¡C„HÍ¥ÉîÇæ‚íŽ'=".I±šë\`PJnb¢òÆGßaHF žáIsÖü#‰O3ÃËÏFÊé#–{8NI\'ƒ¸\‡¾ÄÈ™`>M¦YIÐÈ£Ô¬•$&XDå$®Ôçó–É ˜6‚Œ—’&––VŠ?µ½²&@äü¤wðˆfH#jˆ­ U¡*T…^Eèž¡¾:Òôj€ôèÌô·vi_§-éLíl¦ ƒŽPçZ†±˜zÝÀˆ4j—Ù­áMc°@#qcz˜@Cè— ˜@-œ¥á·ðÔ"qToÀ,a/‰©0M)…“9ÂWL’Ü£Â] ÖЄœïbO FÁ¨×¹,w(BNOŠkÔ(IE›T© U¡*T…^OèožäôÖ.í+s“lC¥ý3¿#©ÇH´ÉFÎÍ2¦ˆ$hûFªú ÂkⵚÛÿhëܤm tñn:Ít ÐÊ€–œË ›•±2#•!…Ûáð‚QI;ì–¸ÚhÔ;w’ž9HPziB*y‹›ls€´ˆü©âµÁûÙOªPªBU¨ ]ènÕ3„˜ªÐ!B’+íè4»H™±H€h`*CŠoDè4»õ½ŒFkÐï‘Õ@Zæa›®]ÂV-¨'*Œõt:Íø FyÅChé–ˆH5J@WR·–ù˜¤yÕIËÒJâÓ`Ô7¶À³Å#dI•@š•øD¶tlɯ Þ’W`«9HU¨ U¡*T…^Bè¾Z󃄘ªÐ!BZs¶usRµoÆ%ñŽzñ|çÉáF¹Úè†\¥Ûlƒ~³ÝƒJMXL¤AѤDÍ–ìÍøQßi› T$âW[’’`4-™ÕÉM%7ľq±XDÅ˜Šø,,Í6³¨T¦8"À‘Gk¼ºF%ȇïÄ1 <%̪PªBU¨ ]è€Xâ[¹´¯XˆŸã‘uÑyç(ÓèÈ%8FŽÑ(ø(ñ4Ò ã‰X³õ]ÊìáÓø-ž”ì¿x5¨sÃ6„º(½œ5Må¶×³îCÒP(‚bll5µIľ/ôCF½ž™Ôš4W*èa¯A=.´àdu_a¿·òتPªBU¨ ½¡òÑßÊ¥}µBÒs6“Ï‘²½•Ò5Ôð÷¼±øF=¯{~‹Ùbð4xæ/d·‰!dr´Kʳ Œ¼\¹Ëþ3ï—dƒE9ÔÃ†Š€†%À˜A,‹±J#C¼cã–d"É­ÞÌ@!Ÿ g9°ü¼… ¼ÍK\1,ûiÒy¤ƒ„´¯vý¬ö*T…œöã0nþàÓÛZº÷»wx·}i§*´ô§øÑ˜®/Ú"锲Ýöìø ¡[´†oYùÃk©g@j½8I#<#IÆnøSÀ("Ô&ƒ® L#¯õ’ƒ4 d”@&hÑ<Á«)¸Büžäì¶b‘@"éL³‰TˆfÚ‹‡–KâA¬‹>öè‹ÒÂwjãôÔdÀn–åZþìÄ«bý–ï¹á‰¿IÌ{}èÔòh™ÌÑÏN®¥ Æ H ¹íتPz¶‚–ÀŸP‹NAÈW@z-¡Ý f¯7›³ Ï_>m #(31¹@TXë1­T­ ÓxX1ÅtI¦äîf­‹°yH½š¡ `˯AS—fX>„õ’½$3!§I YëÙ¢ÆæfÝR’—|˜˜—†‚H0­ Ã…ô+¡»ž7IEÚ¨€4 68ÉFÝ^-ƒÊée‰·we¯ H 9;ØI‹WŸÐïÛ[¸´*T…^[h¯w iÑ)-.Ò'¿œoÿÒNQèK¡s§ç}†ÐZ$¬ÉÅ7èuqæ¥ì ½& K!™ †P 'IÖQŦLsG¬WŒM}^ d@v÷P(R¾€+m!-5›J2f~/Q¸^û°ð™ºŒìaÿdSºTòbEÎäÜ`&‹ƒ…ïf´GÎ6h"UôTìÑòV'/mvÅCª€tPÃtÚ Ø' ù.­ U¡×ª€tßô›õÛ¿´S*cðkMmrí¯¯ìArø$äÑ_3¤({õ\w5xŠ´,ElC*8¥Z¬/5mï¥g=±*b»²_(ôÜòoü5Kó#ñ’ËJ %é;JÖÆTÓƒôuCð!ý´¯6 MC¿Û:Á€[Ö7X¢w0ԮЊ~Õ7Y¢ÞП¯bû„æ}CŸœ ™e¥›”ªHVÔÁkP…ÐgÄÊšÛ%µ< úß©HïZÙ_Qà¦Ð ­cYå‘VàQ ΡÔýIœÂ$U%\i¥qÀ¢…*ðù.Féùòˆˆ8›‚ȇæ3ÍlW,yêŽ",©ÀƒÚ%›V¸µ7 ¿U«góø¦.§Š 2-N&™’9és†Zzö¸½›:±ÓÐ4ôÉé¸Ñ™zIo°Dï`È`­X¥¿mdö³¿Úûº8ŸÿÆ%:œƒxÒ óÀ†¢–~]P1†níYTä—Î3—bh⌥LÿÑý/Ei‚£¬¼"¶WXt„Ø"8ÆP4ãÃ+.qÒ„´¡˜[ø%cvhvdRsÊ/Ai.c‘¦ðìÚé+£ø¬û…B«dMq¸Ø–“3ŒZZþt Õ'CKá%Ý ":î’,ÊÒãeÒ44 MCÓÐ44 ýû†“¹–¾’‹yÔ­¿îªC„уk=U j[º‘rD« ØX”#œK!Ö Œªv(MG)‚¤±„ã’ìa8ŽêqæUU§HŠØ‰©†~¯ôØ*·1ÓpƒÓÆíiMAÖµ‡iZjzM‹.Ö”{D „îº\¼_áŠâ ô…þ*?F&‚;Yåª4¡Q¤ŸL߀~Ô¤ihš†¦¡ihú:+ (±Ø.SL6„Ëâ®áÈÂM>Zˆ-÷”žŠ˜Õ­wZâ”-M€´tå¥ÀXZH"{Е…·ˆFÏrèzKð$«J',¼ØÛ#´cVA‚xX!g”8¦xŠ,Bm¿‰—¬ÁEdhA~Õ|F†@Œ}Fô©h,'IInh¹æU”›t´äìýRì¹%DÚdš€4 MCÓÐ44 MCÿ¾¡sNH’0f©Ä6QfEX0ÕÖ+ÕX½š;ŸÉ.2=Ä‹V¢›¢bsɰvüp ˆ}aDŒMjÒ44 MCÓÐ44 ýû†š"[Ö¥ÊM šjÕ°7žÕè±GíZB®³ãÄ8f‘X"ˆ`¥(N¡ÖêB ~ä–Ľ¸5¸" ¼La·A‡D–ÍÉâK¬hÎ*g{³Þc–#dë1/¯89¨å$Žz µI–,â^´ÜM÷F$ÚLRÁùCôV˾#²¾IŽ nÄUQ®K&âÌ# .’`qYé]ãML½ÄfÒ44 MCÓÐ44 ýó†$µn™C\dJѼFAÈÕd+Y«Q¯XeþSÈ~²Šåºùƒ8ʼnÝ@IsBy@Í"Á›¹Y’›a Ÿ úü¨V,t\¶…«ÔS+â+x~kÁ?N{‚L-‘í¯m¶ë]úÓ†NÓÐ44 MCß`èÜ0îFØúfRM$vÎùÈÉSS>Qû3™½ç:ú‹†& ÝŸZ'Ü‹5ƒö¸­¾ÌŠ.o]; !ç‘ jU—£n]D á§õ°GIƒÖ¶œÌdä&¸” µ$ ¡ÍÒ„ôÐ+\ÕFøDØÄ$‚" ­áh ñ&/È®C “”<œY™hne4âÏgYJúTP•âl묊!š²ÆTc ¯Í…hêê$»¡ªR\UGxÄ ÚvYñ ’‰‘I¡– Æa>)9'iI g#™¿Hª‹éÙÐ/¦ihš†¦¡/’ha:NWö¥w)šÏ^ú›>Hçu|Â6Çs︎þª¡ H¿žÐåp ¬ )¹k‚4u Ghî:i5ME6ä%e¤g@¯a®›Ÿ“‘Ì-DžV;Á‹ ÜáÃ"ËÄp±—2>]ѧ*4ÍìgBaû”´Ñ© D–?@tIz;Ë)!uÎGC.ì’ÒèRŽFá~p â¼ä,IË® g{+N¹æÏ#@RÀ¥Ö‡¸-S!0£Ï&Ã+ (,@¼eàãXû+\+Èžä3†¾m‰¦¡ihš†~aèÕàÚ1éëì×—Hžbt6ÝÿƒOà]×Ñ_34éþt¬“UzÅžݤ¡OTDÇ¢×@†ÔÊý[K‹¶ižËû‰f4XÆÃ)ıò3´î "öPNµæúµ†dŽÐ¤bF½Yö±÷†s|°O,YÑ8‹`IÀí”è_véø…!Ȱb}½L”µ “ «,-´ ÉKœÎä‰ú2ÚÀñ_':m4g^˜ç6|&¯’üUXI)ÐÖ¡ÕŽ¸Ó3Žó†¹çGúÉ{ä44 MCÿ¦!MgØp›2ygò÷ÿû< Ï3u©÷]GÉФû“Åd/%š¯rµY†ò#«)"ÿhc@2tj=Ίn}Ù™iHhËâÈAʽßÚ†Dg ’fAFUTE9š“V<çYÊQ8€¸g‰‹äš4N "ÜhÚB–è¥Ðçf§mß:þ%ú!S‹èoh)¹9É*èá*D­%ýxY#ŸÓ‡ çz³¾$0Š«ÝVÙÒ«˜È<-jh‰¤ÄðW)÷Cør’K¸8D[Òàż =–ƒüô=rš†¦¡ÉÐG³Úyßö{ÀÝô±%:'= TÒ­àÿ×Ñ_54éî„ÔãˆþôF19¤‚¾®…ãi 8M»B)Û¢j-q#ARí˘«Vi=¶xö¤"ë‡6|ϼD¬ÄÞv*±5k IèlÞŸ-ÞÀµØ7Xçe媈´p´H…|êvì°k)2È=n§ `¤ø Ò£Ülë<Äï(œn$ðIP}RÁ6[°ð|§!¹Ø¿¯(Õ©.¤¹`Þv3òƒ·ÿ44 MCÓÐ4ôÉ©SÄ+ÊO¦·ûjÿOC‡Z–í ï9½‡§­jqvÔUè@p´ ¢ ÝZ9ɹÒÌ\þ•YNšƒYd‹±c”@Šš~*\z,Ǡצ àvæp­ÃQK,ZPz¹´PÖ†‚5¾8Ü aI@ÈÇvD[KøcÖ%q’ˆÌ不5¶qìË™%É®'v:1$±BK%¨w?¨¤?­ìŸ´ý§¡ihš†¦¡ihz8I¤$7Ë4rÿ3K¿9ÌÆ½\úŠ„ÎFÒÃ~¤Ž]ŸÚ)nr_Yüšsî$«>:zÄá®?Ô%ã û5žjù;IÑì‡ñˆLÿk¡\}0 —ÅYéàã1üÕªä¦öE¬äl'þ”‚Ž$ËÒ‚?MA¥Ò¼ 6ZVÎV\_ѾuQXÈ‘¼@)?7¬å$é• !uíÉS‰õ—–Ë\è·íq2žZ4ʳR9x9Önv‡øüN;rÿ+Á9þ²Çáù=‘éPk_k¼=öd§cò™¿ä­å@6y±NÎÁÇ_4;;O¦¡ihš†þg†X9FËÈ—§·újÿ_CÃ_ƒb.©9Cs{Â"ËH4² DŠBÉí_¹YÙ*9“›«Æh-]ƒˆµ²%t—žÛ|]„¦h·' ŸÚ›¶°Úpñènîa›±ƒÙ]÷] ¶ñ7NŸ§® ]û¨ÚÌÇôâ^?iš†¦¡ièeȰzà²6C/;ÿþ%š†¾ÁPÛŽ­•™’Ei…ß,­¨2ÿ£V¤ÊÂØJ)Í€”5÷ü0Ü«U2 qõû& KŒr,OF&š–À3žO­TÅrY¾o:«z¹SX÷b^±Pëô!÷&ãí÷vÖó3Í-$/ÅËÆBãêdîÉ4iš†¦¡ihš†~š¡£í{c„Bh`¹Ó†,øá ›ÌÊ(#“ ô ýUÅ<JrébÒ¬S%Ù7Ÿ W“™‹ðT³!ÍØþßcTb)Bù*÷é¯6¦ *“Íä— }rš€4 MCÓÐ44 MC?ͺƒ!zaMêIE«–CžU“PÇÆN#~€ ªC­ê]#9[.M—-ÌÂr;¹åÜŠù ¬Œ *u/êõ±¯6¦õ‰cêeCŸœ& MCÓÐ44 MCÓÐÏ3tPƒE VNÚ¤#B±ôSY3[mÊHB­”—›ä,ìªHî0dÑî5r?YÓZµØHÜ17-Õu OK$á‚Êèù¡{µØ‡$Þpe¿á"MCÓÐ44 MCÓÐ4ôš¡ =§…EK'¥ÌŠÿ7*#-›3¯bæÙ LDsKË!6µC7‡5(ê÷íÿÚRhݱ^ô–W ±Ó3 8_zh<¶L£”ªŸµOM¦¡ihš†¦¡ièoH.,dÄýcÓâ%÷_ã€cCSRž;¢ÁãÃ!0Ž®ëÁ5Câ:ž@HC”ñ ]Uމ¾—]ýÌwÒ‡‚k¿2ô‰iÒ44 MCÓÐ44 ý4CjO‰Î²¨)#nq¿¡qÙ*Y["EÛ,,‹½"Ñ( uÙÞcöHt $·!¶›J²c‰<Ô»G«Üo ±=(äÿ¸¡OM¦¡ihš†¦¡iè§:ȦH'R±¹¡ÈJ\´JnP+áO2ldÝÅ)!…¢|':ɨ žÑ§v×Ó˜cHbß,‘‡ÀV¹p8}ê«Ó¹ îeOÒ¤ihš†¦¡ihú_’# DFú¥ª*çAÎh•¬‰4º‚¨½M"‚„íÑÌž‹t˜•W¾#y‰¼òèœ—È Ó)Ü›í£_íX–1½ì’š€4 MCÓÐ44 MCodH>N˜ù-KÔ$wiÈe‰j‘«Jj)´-K½ñè°2d4C:µê°§Ž³Iuèý ½á"MCÓÐ44 MCÓÐÏ4t“~Ëi|Z¦±.IZ©!’’NrŸ(7ºŠ‰¡ ˆ‹;-¦BÑÑOöJÿÆV»oè iš†¦¡ihš†~’¡s2s›…ó[–È€e Aœm¤ÕÆíi‘”mdkŸ¶BóñÜÒìîɽuZ‹ÁÝO–=bwaê'oµg†Þp‘¦¡ihš†¦¡iè':˜A/öBpú÷-‘Eºuåôkâ³"«Žª¨$¹éG…h#„!QÜÃ;ÃÐGÊè¡y]×ö“·Ú3Co¸HÓÐ44 MCÓÐ4ô“ ý @j}B !ŽBëekÅ k›¬Q›<=ºÛò^Ã#dOÉ×êiŸuë]úÉ[홡7\¤ihš†¦¡ihúI†þ|ˆMö¢ýÈÞ"™e\6¥PÖ?–cÌw—yÄ®•ízo‹^kîVéèbºñ8ýä­öÌÐ.Ò44 MCÓÐ44 ýLC*I[-RFL8ž>r[X"ÒɲdòËpw¤ÀÓŒE‡DdSÐVßôd‰¾8½¡¡7\¤ihš†¦¡ihúi†þl™?ûŽÜÞV/ÛÂÙFQ®]‡èšqn’´Uãùéî¦;æöÿ~úVû•¡7\¤—çT¿.EüÉ_mš†¦¡ihš†dÓĦÿbòÈPk¶«{Z–ü‘€¤ž¡Ñ«†^œ¦¡ihš†¦¡iè­ …‹0Ú·t>ûÔô/:“'õ#©©4Œobošéýù%š†¦¡ihš†¦¡?h(,­gÛô;ºþs††ÿÅüH@âi ‘[ ý˜‹.2g‰¦¡ihš†¦¡iè’K‹”„I†£ß´Dÿ‚¡Ãÿ"' }ãMCÓÐ44 MCÓÐ3ÄÖ¶®“ý%C_šþ%CM*ü€ˆ7X¤š!¶ihš†¦¡ièoèHÆ!¶ï1$Ï$ Í$íihš†¦¡ièm躈ÿÓ†¾8ý‹†Rà& i–ùOCÓÐ44 MCÿKC-O¦õþx%úù†F0j•r©‹þÑ€4 MCÓÐ÷jgÚÑÉܼþ²¡ON?ÝÐ/dö~úW›†ÞÝ<…‡øÑµä·/‘: éÅC¢r B×ezË•ý†‹4 MCÓÐ_2ô‰³Ú}CŸœ~¢!ƒ†X3ä? ½!‘ÃvŸód—üúÉÃBƒÞu÷e½p@üŽ%úvCo¸HÓÐ44 ý5Cí¼ÖÚ<}ÉЧ¦Ÿhh¥+ƒ}žò¿Ú4ôÓ É×tŸúÀÔ ©Ó! þ™ ß.Ò44 MCÍ¡!—(½ü@jÃÏøj¿É¿ù´¡§ihº;]î‚Oãã¿a‰ÆÝÕ¿“õ†‹4 MCÓÐ_34飆^¼eÿ‰_múI†º¸áž@ø¤CÛoX¢mþTÒ[®ì7\¤ihš†þš¡bûŠ¡™¤= ýUCžŽß‚P"òû‹{œßæAjÓ'Âlo¸²ßp‘¦¡ihúK†f’öW É_]~öW›†~†!·lKÂ#½dÜå<’üÍK4éÒÒ44 MC?ÝÐ,óÿ¸!݃lO$i~âW›†~’¡Ëƒ6e¦ÑrâfÇüæ%’Ýo¥?f{Õ-¸„;µŸ~Ó"MCÓÐ44 MCÓÐ?eh¯Ûô©,æf蛦ièCþÌ.ž ®H] yßð»MCÓÐ44 MCÓÐ{úd ûÖЗ¦ièCÃ’ÚÅÎþôihš†¦¡ihzCÃ{d>ï?zׯö¯‹¿È4ø4Û¾áw›†¦¡ihš†¦¡÷0T¤ÄÕöµŽx‰¦¡'†„ Ò.ÒÝ Æå$oÆo_¤ihš†¦¡ihú· ÉUi9ÐèÓˆô–_íŸ5$TP‘~¼’2J½ÔS®Ñýi&iOCÓÐ44 MCÓЇ I¯œŒ]_ìå Ñß¹DÓÐ3CB[íuЫ6ª(Kä£1äÜX©…¯é¦=ã~·ihš†¦¡ihzCQ:¹JVpüT/×ß°DÓÐCB'‘ÉiM\´©¤2¨¬¬h7¯†‡@§™€4 MCÓÐ44 MC/2RÉ(ÕGTêïú†izÁ0ÞX£t%LZµ§¡éoЖþZ­T’›L2+š˜ªRK!@jÓEã`Ñ%¢ôEüMö¸eÿLÇ[›¯Ñögõ®¤ihš†¦¡ihúCŽ®ŠAn;$ÉÞÿðï-Ñ4ôÐ0¹hVã– ýõ„LHÚÔF¸¤ñ—8‰€I/F]2ýpTUÞ.ó“¡—š¼ì‘ãvuOžš ¹ì{‹~Ë•4 MCÓÐ44 MC_0tHDFºZÈ\óôÁš¶wüjÿ®!a½]m k¤@pM¢¿+#uÕ…`©"— ™•§á”V S¡]IJ>È;“]…ÿ,?.‘ʤûã¥+ô£ò WÒ44 MCÓÐ44 }Á>µE³‹_ ]2õòážïøÕþ]CÂigh(·ØL˜ä¬´ÊÑoe¥Ù€IìYÒFš¸ÄÁ¸•`‰ÿZm˜‚ÒBfÙå­K¤ß [Ÿ§óÖ—WY¦ÇëTÇ$÷–+iš†¦¡ihš†¾`èº6Üî½+nJžþÐMCO ¿¸Í—]rÃ;ÇÀd7›˜¼5KÒ“hDÂ¥†Jš ©e/mº0*‰V'7Y•TFzä‘°”/'SUIEæ ²J9¹¤âeXƒ&\Ê«ö™p‰cq Er\ ·$µ,ï„LoLï¦RICm”Yˆ•2aÒ¢²2*¨¨Œ¬2I'‰˜Ñ­ÑŽ'µw8i“†t»-N†@ågVÒ×Öñ44 MCÿkCz¶˜†¦¡Ÿh¨…Ø5ßQ½ô!mr[ê†gÇ\yG$\J€&#ˆ”8ÛÛ“K6yI%­i‰!l!½–Õ¯’PÉ{‰@‹-i( °gi„áŒu´”å­;(±Ž·Ó’³¼!˜Ò2Ë@c•Ünd%±Bå@&3²½[ÌDâ¸õÉô MCÓÐ4ô ɾ\åýf_mš†þeC7$´Xc HÔr’8G‰Çxk8Åpd èYÑg]é·¯ª.e+…#qd#d•"MŒšl°gÉBM@#Ç~%¿R¶É&ª8–¦]â<âoHWbJx–¸n.µH/¥42ɸÔÃUt¬$¹»¶õ¤ihš†þ´!9ôK>ØxëÞôf_mš†þ]C¢û‹Êî7:?æ±í>¥àI"´¶"W©‘þKgWTêѸVÇn¦æ]reÉ…f;r¼Ù³´®’aÉ/À%ËÍO‚¤Ð{Äy»@Ë;”XÏÛuÏRÁ¨ôxeím™n¤+9—Åp';q#õ™€7ÜlÓÐ44 ýC§ªÚo™Þè«MCÓпmHm»ÇèmâWÊN<ðÁ¿4BqÌ>Ý×$ú,n¦æKò`'þÛ&UJñK+ÄÅ-ºƒbTb¿’€Håæ’óNCe)á·v7—Àµß⚀KÜþDoÚ©¢-UUFH¿Tî ‡ %’8ß(ÿ¥µ= MCÓÐÿÍþ.CË44 MCÔеi ÑëSŸ¸r<=a÷-ñp%ï:•!ɘEÈÁ¬X‰Ó•¸ns«Ýl†À«wo"¸B¸T àBÆRiº\·j‚,ô×…æ’ŠÊ*ÎòûÂIꆻºÓ= üÞ¤ú›_\zÃí? MCÓÐ44 ý@CM§]¯X>bÈÙ´KÕS9›wþjocè/RÚ5*ÿYzIU)ŠÍ[¶)Ð:„ Öu]–Zœëj¬à]z ÎÓ°½G\2¡Éw%¶”tälïÑS—•¼ÕJ8c–´kÜJ)©®TiZ}îYˆòxt!Kyš¢Ònÿihš†¦¡iè’½Åû²\^ÃÚhÒwú: õI\ÓÃqÌsè ¤C¯R „ÇÉßKY •B–ˆÃÙƒFÂRdÕ¿ iÉ#cië°äY¼¡¸ÍTÑKÔä@M’½IÆ"WUPV)b¡$Õ’—*åRÈêÍŽudWš“j÷½éIo7ÜþÓÐ44 MCÓÐ4ÄXÔ.Iœ:âû³íô´ཿڛ7¤³}nˆýá³éj޽l.@ò= œŸLxl §<Á’K%ùX¢ 5„`×mµ¾0,¹ TjÞ%ÎZÊ6 è,5“颔 •øG!ðÆš”+ýH•TéÈÔ–t—Sê o\gOþ£ó4Z£h„ÚþÈf›†¦¡ihš†þ߆‰šMZø6¿÷3}­ཿڛú €t÷“6IC °æjJ=‘ïmQǰ³Ï’¥–B!X’Äô;É­Û‰`ýnv.áo%fŠp2YÂ%…þp^%m,áÒFƒõ¼NIF)%•¤Ê2pRæê¸î\r»òRÛ‡wóqÐíÛ7Û44 MCÓÐ4ô6Äï°K˜€ô ‰kЩ|bˆñà)KãxüÿÑç2bs›îœÕ$Ú µSî~%%oYJYZ†7Y0 K½®>¢;\¤ŸäœÓÜî„“—º4e@â’¶ÆâÒb”Y‘éÝúX.ˆ²ªUÑÑ’‘«âoöé»)L¿PxÃí? MCÓÐ44 ýëR\ïñ7îýájYE‘9f›%÷ˆ‹ â$;—üæ«^¹äV(y§¡!À¹Þœ³¤‘±´!k)šU˜Ñ8â" -£ÓI[n~Â)K*JK Ÿæ9 MCÓÐ44 ýCR*‡äl×ïÉg™ÿ÷ÏxæÛCl/ú5aýbt1o±«-©²•P â"ç'¡å‰_·u]õºøì­«JꔊÆBÀ4„–²èjKµgy¯H_â–'FÒ­O8ÇáòRˆ¢†Ð’FžwÛWå±Ù$MçH±Ú{ïÊ®o1ž×{ƒ9Ùß¹oõj¸ùáöÿÊ›§¡ihš†~¦¡!"4NºŸ64¦ëÊ.öá¡]Hý›¦ièOú©9±8müè°ËQ8W5R"Tjâ Á’Œ8·–Õ­šhŠÕ)-‡àPWYnI@˜’KâV묶ʢ¤è)#qIC˜2h«×¾,yY¤\"aÒŠ#¤÷‡]_i¨yºq¥8…ñšøÀg·ÿgß8 MCÓÐ4ôs »ÎQpóiCcº-m>ÿ'â:š†~" =œ±¤ZÐo¹ çµgKÈðÎe-.'‚¥”t×àr8ÁY¨.‡SNcH(zs3ÝÖ'ÎYeªIÆ&9H-)(Rî§² Ê+­$}~dÙ&qQð¦ %ÐDºm×Ð]` ½~t;Ì1,ÕåöÿTƒ¹¾ý?½çLCÓÐ44 ýXC£©ù“Œæï$œÇâ:š†¾>šƒ´Ï÷`ˆg3¼8±ÃÚžÞóò©'/O±ÃR(–KââmØÂ”ñJ¿ùÂu!Miè7—Åq®É,É6àSâl¥ž«ÄÞ„Jž+à”’µu‡‹KêK¦#ÏePí<5uJ{}ü¶í¯¿`{Ë=rš†¦¡ièÏú €”{¤@jzß2MCÒп HÃ4R}´œïrø’šr@s8õçjïÇ›{óSµ@Sä$¦´%ŸT¨!Mô$šüâVg¡"Àq9“ð.qIÜÊ uÍ"®d!MÉ•üXkI^¤#tÊôÃe—õ ™†¸ù–4oÿæ€jÓӊ·Ûÿ³oœ†¦¡ihúɆÎi ßb“‡Œ9ç~yš†þ¤¡¯R§q`È“¡~=ij^‡!޹µ²4½ÿ?–t@›êó´ydbdëòM ù޵䢋* áRMKT!*Ÿ¡"P –4D—$W $­eï’]ä)£)¬)0Ÿ°Þ’QôW÷x[†»©@C`ˆw·€¹îõ WîZ¹'5}|û~×™†¦¡ihú¹†Ì©üë7ä ùý¶VM@ú±†~" é׆Øê£ÜY<Ö#u |I¹ X èx—Cnb•ŒLŽ`Iæ˜aOˆ2Ä V¿.>yƒô¥H?ú”Œ Â:KÜc4—š‹)÷²8î—0Zó‡ö'†>/ɰ$dq)ͳ$èèKp9¹žºô×w¤ihš†¦¡dÈ/áYŠö÷ä Í$íŸkè_$yÏÞH힢ãU³¹ÍC²òì?êÁÃÐÒ[Æ¥.UYF¹ªJ*®¨œò’ÖX–Ôº®ÆoÞ£©îêá¿=™éд¼eW0U,YhT*´?Ñ!ÜB¥Uxç jã†Þ’vÊ`R+‹3ìaâhœÉf0³èl$`)ë¤W‚¤M+4J¯„\^)—B£ÛÜU “B>øÝIöÚ¹ë&r—*Mòô¼ºw>yÃ]{š†¦¡ihš†>ohÒ+€´çpŸPéz Ñ¥Óh«Ëú”°äcáæ'…h)®Úg”ÄEÃ%»qÂR– ýh¸„ÛL$Pò»w ¹KÂ,GéLÑh"§Ey¥]<Ú:ë¥ö Á‘ˆ8øG^†äîíHòn·¹K˜]«õ·ì‘ÓÐ44 MCÓÐ4ô†& =ø€ÓãaH]‚Òƒ5׿™ß ’»×jX£RÊ7B¥%oé“w(…+ÑYB%ãtªdÑ%C?À¤4 t×]é'™ÊIMôxÑQ;U“”SFIh lÒÐ¢Ü IÊKIî{yŠr‡¡"xo¸kOCÓÐ44 MCÓÐç ý@z–Bôí€ÔŸ73¾:ì Yq± ÷Òª.׉îÞ¤ºW¿q–R¨I eÉVYR19f™BR1,åà—òWë³7¦É%(z—rÏ\J6r¶·E'”J˧!\©¸+ }ohÒávâÁb祱À–hüß[¾mê›z›9ŽÁôÔUÛÑ-nwC!*Ç1º@°‘˜´Ò_›KÖ)¦%º¸Dä,ÑÒŠ\ïÀäYJ€þ®Hµû’’]­ìKè‡'Z¡˜IÂeTUTFV¹0ÉeÅð;9ü7²»oJâÞpמ†¦¡ihš†¦¡Ïš€ô 9ŒÃµtý‰×~%OóµøœÇûL3*¶Q7~ËL Q†ãIs»þ=N˜CîÉL¶.%‹rJkô!ù¤Õøâ#»–hÈ®º$xÛPÇyÞÊp§8F¥@¿}+Œ F"rb) ‰J£•Öü$aS dÒK‘IfB§¥ëL@š†¦¡ihš†þmCÏ;Ÿ¡¥vU—§Ç'¾ù|Òï|ëA_å·ÒõxàecÇRBO].su).ç¬Ñ#®FVV€š·rEqÖú‰{ű†€°+ñ’k-PX ÊK – Á»ššÃ Ñ9Ír•,Vé´V•Pi‘I:)—ÊÍO®Ó—ä…`’ÁèýæîhÈû»¶ì]yo• žíÚ}Ã44 MCÓпcÈÐI9ÒOij×/ÿä¯öÇ M@º HîüX\½ñ H£äí›éz‰®Ö™8ÁY[ÜžåD ä«®œr] –ÁRI­ObW¨L^ºèºÄiá$†²¬¹T0š‹IZƒ,ï¥k/%@’¡ß+«{÷€ç}+Îùô+© <4˜¦üR¥¡y¤ 0=HÓÐ44 MCÀÐÝ“ð¿ñÕ~³¡ŸHO!zHφ¿$/è ‘¢<'®>^ÏŠz‚tbíâz­Ü)Ï{A†÷‰Ê•pi%ðÙŠ/2‡´,ä-…ÕÒ— Ââ%þˆÄ¹Ý»z@íãÐ^beï…e—è'™Ò„JÖhF%¡âp+FÐA±¶wTJêe¥›—>£{Ç©¼ô&‰Ï7–»Úµ¿ÇÌ44 MCÓÐO44Šjô£>Sß4ýˆ& ݤHxÜéŒHf3û¢ÿ@ºb[{"¸Ú!uÅóÍ£Ô46 SB”µšº ùIÍ*eV,äZ×Å'oèu ¹ÞªÞã¤-=ç;pÖ7å—8 çâo K¿¤%.Ë’@LZFj©¤"hÒ½ùÉy’b—¤T='—'"•vío:D¦¡ihš†~´¡Öaê ÝþeC?žñ̇É¿0Nó69?y†·×ç‘í. ¹} üéÛ›ŽMüˆ·¿&wÓ(‡3U²F¥È[Ùrܘ–ÌšW¿êUúʉKð.q4.@? @? uÙ¥j£]‘Ãd­ôËô¦Ôe,Êã4š Ø®%°A…‰øŒv¢Ü*å=ÝHÜmm2iš†¦¡i裆ÎmÆ¿dèÓ¿lhÒ±î4„ÿD÷Ìœ½Hg@ò?èÓ€ô‚+êÑÖÓàå4Ý̺Ñï1ŸÙs• îºÜ …5½ä)}ZbŽ6ä`ƒËVGÐ$Éjò=ã22¾[@N#ß{¶õÙ]­#Pjmã8"Ç₦ LúKÃÓ› ¿Äßžp‰€L3-K&fR£rø™†¦¡ihúq†Z]Ìmãñz2ýˆ& ½ Hë[ÒõÌG>Ôˆ®À!‹åVX‹Çòû#z‰oè{W‚¥Üµ–dYsg‰IAÓ[…Á¸¸ÚuA¿8I¸TÑ^W ç¸BŽãpm@¨²•Èä|·x\éþ%šT¼^éÇi-h 赫à\Jˆ¤“Þð`›†¦¡ihúÓ†Ôý–ãÿÂWû톞sÍ ºæçúŽ€èë€ôe¹æ¿sþ;ç 5Bò—9R{ÖLß,Ñ£€Þ‹'žÍðê8 ]­ôÞg—ÕØ¿äÑeËkV)%“–¨£ 5Ä`Ö²®«ÈÎVDN ä¤ËÐô^Ÿã¦Umë„â‘óÍC"ç›U¾I ÔÆEˆ—¼6*ÓÞg–m)ôS—M.’¸ àdû!¯.ReÏ]ROKÜD_nB·"²ÿ¾9“¼áQ; MCÓÐ44 ývC>HîHö~8 Ý['ƒy£Ûí~âD&`²¾SñÅŠsÈ.Kâ'K !Ï*L„LqÉ'ïátjcA¸‡¾@+•cË`WNfB„ލ‰˜V8šZ*SÕH–"³Z2qyÈq9uÝe#íöÉ Ëé#ÓŽIoxÔNCÓÐ44 MC¿ÝФ»€t•¤}I¶?þ§)ÜGêÕÑ1eÅó~‹4ÂQL‡–5]ß›¹IK6)@ƒÉ"2çWE–ró0qc4Eq„IÑå&Çä¤1q*S@ú7«1Ù¥3…É•8*'UQQúIjU–öQöþT¥^ò²ŠîX’»£éºï¹Dî:Ùéä–zãvš†¦¡ihúí†Þ>XóþžqÂ5 ­Ûî$içÊX¾g€tƒ#ëÕ¸¿D‡x6ëã0t G·Èvï)tŠ;vÉÍO*úïêYd T]r19*•à[r¡0m«[%+ À—Té8÷›†@lŽSÀ“ÈúæÁ’•ŒMš>~´E1FB×›G@@®%2Y SùÖR-Ý•Á4àHݨ LÒ44 MCÓÐÿÚФ»€4ÉŸ)‟ñòXº®Ÿo_yÝâ–hÞ¥›•=d4€T„J±õŽƒ¸€É%û”“5êà×L$‚3^ Žêéß<5OC£T.#&¼äÑl·µÛ•\"‡Á”à”ob¥M­2”Z_8ó \9JWÒ•ßu°MCÓÐ44 MC?ÇÐ;Ò'è1 ½F ×€´£ŠØyáÌ/ç¸Ø3@zG½~5ij^‡¡Çëex”ìïäGG†âŒâDQ¶GãZ²¹žxOY Æ´—| èç –TZ“Ž6T–aˆÄqÎrÊR_ÃÕe´’“nqKW¨ð/qøÃp-ËÛš‰~G“÷;!Rb¡oÇ L2È( O°‘¾ ‚½Cܘ䥾ÀµÓÐ44 MCÓÐo74é þ‚8ÄHعŒÂý€to‰Î>­mËÈ: [Ë:H;Dþ¾‘|J¿íæ÷×4 )Cá[UUbY²yIk¬Ñ‡5ø ×²Z_}ðž )xÇN&×£ÈU2*e[é‘ë¹JmHÜ Qî´kã÷Ù]•e9oh|h|s·ÝECä!ò†Gí44 MCÓÐ4ôÛ M@zÎÌðR¼ #v(_x$siÛÍID_-cöã«ÄmíohFÞÖÖ {”κߒu¾J^p·Ý’ŠÍ‘†O5Éèâ*Ù,­dÿ’ó:ßKÉU‚¥‚r MI œ„\e4‰–ÔaXàÒ±ÊDÀdh'æ,o'=SÜÁhÒ44 MCÓÐÿÚÐs@z‘{Ä«t'Åè\1ÿ ý8n2~®‡Û.óŽnñä î±Ô¥ÁGËñž¼&™#²÷" lÓhçúõFAáˆÞRì†ÒIçQ6ÝÃaî²¢îo· €ác;d뉪)[‰Å“2½=SX׺æÕ‘æUb‘É ’•9KÞ¾»Ü>Ž+#pÉ00™2AP‰@)vß’Ö‹’r•Qš%ÐØ7¶³`¿:=Ö{‰Ü²<è™}ï¨ý‚@ø¥¡/NÓÐ44 MCÓÐCCÿK@ 1Ü@?N¾¥o¤ð)@Š›Ãîáñªÿ ©?:º¨4•BÒRÊ·¯Šp© qɦ˜LŒQ…lXÖBÖ"PÉÒPnãr¸„ünG¨´tÇk{wuohzsÇ8Õ²º9…‰Õ´QEñ”è…,ƒ b R/Mã†<¥¦GKÏæV‹‡Së¿+ï*  ÍœE¾Ó½fs;j¿ööihš†¦¡ièCÿS@:‡~ ðèû)ÑÃש-I‹“q²vú ϵµÕMŸ;Ÿgå%l©KüÉœºÄ%q¡¨œ–¶”ÒÒqɹÆÕˆuAó8ÕKâ’Û Miºgiƒ0¥ïº”2KT)ÍR‘»´ÓV@8`UR%¥ë•—Ž4þÜ3ä¸MþîQ+—‡M’žµŸ}ã44 MCÓÐ4ô²¡ÿ% ]æßÕ?¤×€é€t»á”ìl#nxæßœé^ŠQ7tALOéøÂ»†ëôåŸ#Ûý•|¬»xÍ~Gôm× @:œÙ•d÷-Å®M™‹…‚ÀÆeq•’“–•Z†7ÇáJÄ^¥”@ʤÑaÅ`ŽÜÅÒV>HgD:9ÇÚÂ];˜šÇ꘽ÖÆ³Á€G}ó742=qÉ÷Ä% X =²Ä"sÌ:%²à¢kÈk]@)*qrwåpÑÄá4áRD9+x+SM…r@€.%ö2-:Óà _DYœSR ('e–vIŸOÑ~ËóÈ44 MCÓÐ?gè®…!‡”ŸÚZ#Ò›.¸G<£[Lrýr{1žÒ½z¨;ãó?wi\ÂÛ‹qŸi\«ïÖº»YºÙkYÆãâ?´]óÌ'é¥qºæ™Ü?µ}úÚw ³¹îÓyhè‘ÁÇcÒz†O7ÿ5™Kn~‚0ÜZ]µe+•Ie“t4!µF®„ÄJ‘ˆIC–2"IDß·;Aë“Bµ´S·¨ÚF¸Ä-u¹Gœ‚O)´r8f&N^’Ð\JÊ£,.í Kr”†à’iX5ÙkçÚÛÍ>ûÐ$v³oxBš†¦¡ÿ‘¡qpÊS ìhŸ}’âÔ[{9½iyðß/–ÈÀT?«ÌªÚ{†ž’ž€ô;i€Ñø›Þ FŽÑÚ·˜ï_éÆ)õéz?jnˡ佴½ži%P²yËbKJÄ ^Ò«[µÏÞÒ{sXrð)Ù¦°Ä.†3¨TºØ’ær8Õcp…~oH[ÒˆÅ9ø–´\¥Æ‚ÐDØd/Uö §È65-¦Ë当£.饱ÖÞOå OHÓÐ4ô?1tVŸåÇvG•v˜>4tËPí¨—ÿ}j‰>öÿ +û³†îÒ9¼6žý_ÒUÞðo¤‘µ™ã[RéÏ @ºZ‚ŸH×ãrÿ pµ§1-ò¶U â%Ÿkvô­Ö˜é£ôš–Ì*ÑôD÷¦'i‡%…†ºa8Vͳ$à^*ˆÄqIœ4­SN:hO• –œJ**%#““šii)K€®7nÅ7µ³š;ÝYþêÖh¡ä­ÖYޚŖü‚¼%ÅAXÓ4¼7®ŽC=ý„•ýYC÷IÁ5:÷×HæÿHW5ò¿.i¤D…óïH¥/Ñåë?®Çùm·¦½ÃžèbçF+ÂhXN³s|N¢8.Õ•†ïèd‹Ye™"}œ£³kZãêWÅyßp4E&Vöæ~q’ƒhüÛVÕfB'Ö ¦ôG²º7 ›¸€4†þZ1D+¾½²tŒR(yºMô»Ã}å<2 MCÓÐÇ ™ÝÉSµ·ÕYãÕ(F}”ƒ$Ùí«Bv${$¿ÒÃ,ïÛ%Äešcù£YH?aeÖÐ+€T& ý@ÊW€4WïHÏ—HUŒHWêØjñd,ŒÿÅv ·ž7¤ ›ïõ}a߇˜æÒ!ÊÒaTjXs©ê’ËJßÈ¥5™˜£$ÄY‘ÂÔ:ÆY4B©(”[ —x8@“‚¦@6Ј65q(N™h2ºí¶]fXêò¬òÝ"tŠŽÛ†JìUâ†(랦¡ièbH÷âRš¤VU¯Ju?޹é†=&¿Ìj³²Wé€d¡A;Ì?]¢ËDE ?’?ÕÒ}ú«}rzCCi݃tN_½¤'üs H/Ñc@ºBûµká Ž+ð ¨W®ÖLók@zv-?žíqX—ö_¸¦Ïû’\Ïp@Ï^OßpK`ƒ³. Ї>Í~/Õ£uú«v,—»ÅˆÕùû;î8DöÊй }W•²b¢&X*DEÛêÑ7n£NfZȹ˜’ËÎ v,-±«IÙJ°DD?­ŒŽ‹~+ôó=™É±Ö·Q]¸’Ó™Œ¦I@N Ò0ýT}Sº-5>×êꎄÑ{3É_>:Ÿ^?wýzš†¦¡ï4ôåŠY"µDÉa¯Øi眴mBæ|x:xJžÊ2Ž<ÄE¶9¹ÖÓ»-ÌiÑ °Û‰çËtb¨jmoÁÛ‡ËàMçå»H#¿þjCTD÷…å#ý }zú“€Ä9Hòä/š€4iÒ ct"ÝÒá2=~É4mïRK.¾È²L yß1ªàWn‚â¼D‰ÜæªpµSs-i¬òíž¡ó͹ßÚ´ÜïŠÏ:Ò˜•hH#Ñç/¹É ýR¤¡³¨ë7¨÷' ˜RÝÇsBz|!éâã¿»žü7&­ÃÈᄺÔx¸¸Ö"h)MîäQ2=ó{”:±7–|NÙ â¥JŒ“BF<.­a5>zå=:í&ú©§‰ö1-J«-À¥&_©¬ôiK…[BêR†S,éŽK+Ú¢¤ÎA<5O’'$yêXpþû’îÊÚ½á)rúßú€´J/3‰'ÕY‡{þõÙ[kwo’#≑ˆëV‡3ª¬–è‡}M‡çi]¶VÅÖÞdp/ÄQË2Âk×1±ƒ¿V…öˆuÙ"ÜIî”ÀDP´Ò‹!Ê7ÛüËK€t?°6éoR:]è? H;ŽL@ÚÒ£uúk@ºF¤3&ÝÒõޏ'‚ïŸÏ™ß~HUîÇ×h‡²"WDÍ—\Yòšá’‹)ªàÂÂ.¦UûJ°´tHÊø‘ñív¥oHWëXð»wÜp-è0¨0±Â÷J¿yQVºÅt(Š 8‰³påµJ)NgMu÷æsü÷ÇÎlÓÐ4ô³ ÃÆöTiFŽˆû+u×K¬î(ÒÒ´ÛÌÑrèPÒ¬âè üA,K¿ÁI¨Ü`¬ÒBiu¿2¤N ãù¾Ü‚ÞšNSWN¦|ÁX?ñèHçÄ왃ô.€t† {@ôŒ.Ò¤A)õj\xòú-×\¿áÀôl‰¾Ù¬Ó_…!ï‘V¼Øø§!.vF~ªyˆÜž´ÔÔ ˦Ööÿ›¢½è² y2ú{$.¥lRN.-цu-ŒJt.,>Á·TáWâPc’qZ15ñJÖøÎH\2]å;šLG«Ä!.¹•Åq{µ¤×ÜWeEç^™ÚÈU$æ~N¿ßHîÙ¦¡iè› µJ±o0ôëÉÜÜKR‡KÆr¾ó­¡{>®VÇl“¤]2tÒM)º·a2’\¢Q‘Ã-»òl$~ê@Foj>,-µ Ë(Š€£–då¾TÀõøh?:ò>™Þpó¿ H#WÂM@z@PÑ }r£ˆ HëäÎ:ýužÖ‘®ýIW[Qœv¿öÔñYm9öø&ª~}´iµ\ï³&ÇÂÕ„K¦JtK-Ó;É£9 rÑ¿¸*ze\"Zr.:‹,%Ѧ†MœÅÑKN™8×›K㪎‚jCG©Šƒ´,WI°ÔtZÜî|¢öû†§ÈièiHCõïé«ö^_¢!to\š@¾ë%žãXbWÎ>êÅn¤•¦ñ±Wd]"kîÓ›‹tpüZà ‚¢ͱ#?"vâwkR2Èæ_¢™˜*ÀSàÝ*¸r„W[ë)n–ç²WʸUú7Éœ‰OÓþ@ªb‡ HŸ¤1óåV½›&®7ãÖZðñˆ0ÇS>í9ë¾³ù¥µ•ÃÐT; ×®ÄäðWÖJ°Ä‡Í‚0œ&XŠÅ–%ÇìòBȤ¢),œ·$ˆ• Ï®%‚%n!§!QÉî!n†’¡ðÑe¥ÿ-þ2.µ"9n»Í*ˆ”–¦¸„vrR%U ˜$={YÛ{AýŒÁÙ~$‘ÞÜu¾á)rú_Ò# ÅÒÊ×Óž/Ñ8$ÜøâÊÒæ¹)=/âe¶;qÖNko6ûÛS×HÈêNŠS‹8ž—L̵âöEIÍ€D7Sj!2œÎ¥èØeG0½BG/³ä‚,9èÆ“é€nYàf÷INôæÑ!’Yjh÷Ë}Ù~nÒ½Dì³䯒¶ï’}2žÒ'蚇Ä€èrä‹KÜ©þkàÎ¥v\ÒZ^KW.O—èæR{|îý‹ý3`zŠ#âé,ןݦã•C¢¿H·~¹UÅ ŽÚËÏvƒk²¿Aÿu»T^ºÍýËÞ¥Z ‹UÖµªrÉŠËâD,Ñ„€Ä%í£×ž[dèyG ïÖ‘S\g“­\$ñ%eoÅíP„©¨ãô¥)Lp,镆Ç`moŽÆe”•-Ç÷¸‡î¯jg¶Q §ö”¹ÏrܦþÄŠál¨m¥skäOz2 #õñ×ÏYÙ ’ͽ:÷a ĈlœÔ’¶›ûµ,E `¿,#æ¦O²D*…ÈÀˆÈÄ;™HGJ®zãŽAn‚ƒã ÝŨ W>4é½0m„Ct"œ¬¤ÀT†c@ÒÒBe¤gä!zÎ@\è+]¤Ùzãørma¾k9ß·‡îð&»Q÷xz­Î áý\wéù4é7ÒHÁÍcžw¿˜€4飀ô+Dj¯PNbÖX«©J”RÑ'.IB¥´ZÄßœ75RKÍRí%qy/“¬éÝ󽫀œ3×úòi BÑ;#×[ã÷¢=ô,UI T$PJtëZ¡U¹Á‡ÿËS¤FOÞ˲8Õ[Q™îÙßË–ŽU_=E~ÕÀ¿`H~Û[oÀoZ¢/l½Ÿ°²Y³Ñaÿ]/Ú%†%K¾“PD5ž˜ƒQ1£†žÃ[– I°Ô±~4#m4cf<¢·¶kŠøJ U"! çO%„QË&à¡bç.Âm+>¯(HˆÆ)2Æž¤Ï‘Y6¹ ¸Ÿw”fáˆÖÙËÂÝ ³hâ–¦ÔÄÄ:älËëºØ—î¥W}tFµÌ±o¨>œ€ô›éhVÿÄKK3iÒ«€tmèÛ–è» !ÀÅΖ(j)F ºáàÚ €*íó…n’ùGq8LPlšé´z–0’-[Œƒ]ì|%ê¡y9ÇtC†éºNì#‘ƒ¤¢ÐÌK‰ÝO„GCÄM„Lœ.ùN ÄYJ¥ƒ—‰^åÇ™—ˆžgÅI#‹Hæ)úd}Îõ–ŵo¿³#¸)o€Ä+àŽ‚ÁG§=µkøyÃÞgÓ¤ß HCÕÆà=Œ+ä±=Ó H¿ž|Às@zBXc÷WûÉýxÜ=¿:Hš¶·ßÌ!Qi@Q{$‡µ¬¹újK):§ì²L9­1q’÷º‰.@¬Dƒ¸ {”†H¥CëMŸ² m‰Kã|LYKÍOª ^™ÞqyÞ€‰ÏîžU0î¿G*ÆÍÍâ¸Bþ0C­_ËÃõK¿a‰Ž ÊŠ>ùó†¾m‰¾Û×:p@YUU’Of”|&`ÒJ´¶Aœ\$7¾1 )‚nªÌ‹D¬…²’äB´6)DÉ֖k´lô81ÍÐáCqe=$A=Uéøb?Q`_’â¥ñŠËQîçéa7M¯$„ßè별q˜`(¢O+\¦ê5u¯¼Žâ©ÂmL-µ¾ž¤­.Wö×3' ý.@j[+‰…Ö“ã [{rÒ¤ï¤c¦GûÑ­jô6Ñœƒ4ŠÝŽØÜŠø[;ˆÙ£tÒ-Ë»{šàcânqŽÎð.'‘—d ·´ÞÔ—, ãœ×ô)MÓ;!ç] EŸ«Kœâííj“h=PhhVrŽËã<—2=YéwÂðŠãŠNÔ ˜*_TP$mžßŒÊ=]ôÙ)ò«çØÅP+Õæ ª?ïAºA²× }Û}»¡ÃÅÙŠ ¡È-GCû5»‰˜p"ÀQŒâ¤è¢V7RÐ+í­p=>‘xg²°›‡I•ú˜WJ‡–‹NIAOð G"üá–BÌMU± ¬¦¿ÄXHDùjo9Ä>¦€ú ^„D ]}Aøµ@  r½Hȃ؋lf¨wsTF0.Ò>d{<üh^mîÒ¡cÀÓsÞéir¢‚gˆíýÉo®HÓ¤Ñùì”ùO@úßÒ¯iø–Ú¡qÞà ¤>fð›ëGšïåoÃäö28~¬à]jð$["ƒ’€|@,¦,Ù§5®!B;`õ™¬¶ÐßàWH.mI£“‹h©+é‡ó–ø6S ðRê#XOk‰x––8øVlš¶7ë8¨ XœÎ×~ÛŒbèÇv‰w‹×=;E~õû¯kóRþ¦2ÿ#¹ìá’Ÿ²²›÷ÓI¦†£„´Â¤ÁBì~áúB¦M/€'è¢Hn͹>ít€Ø—âN%âÄ!®\[$;©‰2«¥Hq™?±Póqx›îIVb§UWøŠèóÈH9úO3Ó1NF*2•x #CBÐÏÇ4¶I>G›Zžø ä,tqKètɆ )†wròMæá¯'‰ìðʵî;‚ìwéÀÛïŸ PØ\Ÿýˆ†™ûx´î飠¡ëæskôû©zžwa4¾1ÄÖFûrëe µ\joé˜í7sÍ×Ó§ =ùñèž×Ó%ú(c=¤#Û«¤õh\ññ™›îß < »Ýv‡{vóq}óÒÏûi¤¦ª)™N¤+-ZŒ%¦èèì‚^YÇ[õÖ'Á;dy+tŒcÉ%´Ø]¬’# ðà÷,ï–ºÔT—6űoÉ!Ú¦Ñ5ŽÛëFV Ó÷¢‚ w{% u"á~V-Çm»–­¥\{®Mþt.Ižý¤mzŒ`¤}¨Ó¾Í~.¸Á½÷ë•?çš= }¡«‚ …þÓžZ8 ¶Ò¯;ì¤,ݨ >8+(Q¬Š´“+º Ъ PJÃÖuäêÖ{\IEg£B³ª– ÿcÒ&™X‡ŒEE%6ĵ š®F2ñÄÝEn=4ýÐ YXðé ýWÙ8ŠN |HdZ4¡ÑnîøæÀx]J<òŒ$| ÿó•<­]£˜¸P”T8Àš<1ºÛŸeYË€B¸Sîw EN@ú~@jËÅÝ™' M@ú: Ýíþöû©äât¼³ÓyAô[žÔRJ,®È\sÊ!ûlòÂéKÉÄcH„N¬)°®’½L‚ãq'õ¥Òù‰Å*9Ç~¥¸+|'‚&‰€\ Æq“1ž„άë­Lny×ó ÛnËúæxGšßßäNh\¡.’šš·¾ ¨Sž©Ü‡:Ń–ŽD=©â‰£S™éÿaèè=ËÚÒQ€‰xãòý¼Ð’vxç㘇¸8ë‡ýG-U%0âÂ{I;p¤]8©(èI¥8¨¶à¢BºH!»H«¬¹6TBm,r* Ò*;jèõÌŽ®àçBQÁe£ã #ÆJ|Gì—58tXí•á ½NÍ[˧hI'3±¯ª¥òm —½þaì3Jü›[˱°¦Šú¶Œ>¸|£²I;$¹Ïj’QnW9‹ÎÄv¬ùÅ_k˜N@úY€Ôçù|°fҤǀt©)ñG©?´­‘v‹ÖÅ«yO v UÒ*Itÿ¼åœ]*,À•5rqõ¨’‹=ó›Õ¸Šã*r¾Yë»)|/=(Ð9Î g­]®2¢ëîán2,@g¸LÐÄ×Óo¡[R…F=3˾pgÖú¶‚Îâªß½êÞcý8AËåRpå•éMàï;Üþ_50 ýIC.ŽU,Ž‹¾ZBŽä¶h©uA=>k§z)!7À‘À„DªA ^(8B›Œ ÚŠŸ€Â2zs¥~îµ Me¬‰qš(K³)ïо/èþgÒ@!N\ÚB ^^ñ\Ä2|IÞ$Pb?-ßq°^Ýp(þ$ZþàË t\eÔµqYg%µ¾·+ƒ•PÄ·H¾]aO˜ÞZ–ÞN=F&!¤îI’ž=ÜZ“ÙýNÞ>zaë—Û£ÕÈGéêõ HßùÕk!σ7<¤'›õã€tà ¨ŸPOžfnªÃ/{ÚäåÊþ¦iÒ¤›Ë¤G0飀TN/ýq@º›í}>0Ç›ŽùÈH²{¸Í³ýC¸²¹˜ÆùˆO!œßk€_É" Ǿ%Eð“££OqaY Ù©ë"|E.‚—$ÆÒ£p-qÉt&ÍÞ~g ™XÛ{#DbU¦+°Z/¬&D*ìfâæ„J}v3ßø˜ î©ù¬ŸPñ\‡Ê¥Üz†›ŒþJ›éõ“ö×MLC¿ßÐ9M¦BG´p…E­äÖr zâ¬(ž¥åQEÚÔy² TËIj¿¯œ³¿žÑ-]ú^Ð50]Ñs@zDOé9]_VÚi=âTo«ê~]jˆr+OéÙ=½Ô–ýÓ>G78ò”~=nók>9½²D/-×sC/¢Ûë€ôaCäâ1ß×ËávC½wxz¬w2íȾ_‚ÒiÜÊÄ^ŸN1Û¦º08k)ÒÙ»¦•ËáBt×[X±YÞ,!°¶nqP`RÈñnq¬ÀÄØÔBq£ÑnÆO°NŒ€kÉ&%“9É4Fq=}©e{Ç=OCâVZâ’g)Lê¢/ÕÙÓ —#F'÷,ðñ:·û¸sö?:ªý²!¯ïªïœý—YW÷}†ä"/®ÒÍÕÁÿ³—dá´¹ žj„`PfF'4Ó,x#¬hÚÙB$Âl-¡(Pƒ;'agk#¢¸ßa& ßÍÚãfw™«ˆÔÕVÅ)ºï¨âÂÏJ ûïFŸìè‡÷fƦ^£ÿÒ\ÚêjÏHò¢/ZËqZ@N1¹ˆzЏï±<ÓÓ¬,z—ð—6*¡8ûÈ£û›DÔ­°¢8„¸{G:è/±¨RkÍÒr›˜™ÙWø“­fÙܽ¦Ëw6ÿ¤÷Ý>Ä^Y¢ HNáO’Ù†ºÿÀ$µÅÅêÑ1N– è„Ïì`ªp1Iäy‡ž¸‘ãÍqMA€Gó2µLo%ï¬À9­5ã ¹ êK–€) >ç÷9.[–3®Ü Ä4îÆ­@â_H CÌ2|¶—¬’“;è¨"šÌÕô~ ÐíRÛ:¥è;]èÎÂzr—t/xhÒ÷:‹øŒ =i9|dÑÂ#¢õ¬ë™F²4Ëy­pú8$IoHƒSp5ºPˆZe4¡sH{εïEf¢Á\§Éu÷Kom˜ø~·î$Ì–áð?qHtsHlbfÝðq<@ZŸÙI–ë >ðhí-4 ZžT Á-5|íâVð—è-¼Š$Ý¡ðáÂ÷ ‡Ùž²}ÏÞhè¾N¾FÔû%_î¤{€”O€”ïé×üéeŠ˜€4i‹è¯âA?¤sàÿ¿_嬥*ˆ”"œK3¥Àú!–èªR€Kv]è3Ø»ä¡ `8×ÛKœŒº’€)uZr  ´A¦ò±k05Pª€¥ÏÃR&%àbjËœûÅ¢zC½Åmó&ùÞZJ¥áv:7û¥·´Ÿ\¡ÔÅÛîœýû ¾Ï‚dOsfðÄ[¯pKYR-.a·ðƒ4"@Y¡r´"IÛ÷ˆØÖý:±'Y¸f2K ²0Q2ö"§={²¢d´÷±¹ 7ZªµsÔ0Åü¤;˜Õ]£Rë=ŒmØé½¢»MG†·éÊ’~¢óp}ØŠ“p´²PšŸl=«¯©LrV_†Ö&­=^k’#—Ì=¡6$t)ר7Aáîpí–âQ±›;IqÿzóO@ú ±©ßHÏ.]×WÒ¿HǧøâÿÉéHÏ€è÷Ò³Cãz<ÈMº¤¢~t°^§žÆ£ Ä{Ðt ÒùüÕ;IŽ›ªu[ðäçR“§4(‹ó1GK÷ó)˜À veu¬Û Sè’ÞU5©žëÝœKB•ž3½éDoM†Ëð-9ˆ/Y:ýËÞ¥µFÉœíÝÔ—d¿&5¥oÕoÝMOgÝ ÃÄÚ0’뛥E8@Cn'}ž(G«“Óó)&÷õü|y'Cº‡GýÞùbé­46º\gŠÿÈYÊ6 "…Üζ.]‚1 -ÛôBµ¬Õ½¦,1׸ylïÚw< (·l)C¡¿Ò’‡à$êNÍÚ=JR`l¶ÎR¡D“ŠšîÅÖ½G@#<Ö˜ ¡eR*ØÃ®à€h0 pR»'ià\ rwÅUìA’¨ac pÎÊbõKö %ÂJH%7tã`¥A[ê’ÜmUo +J±'w‡ûå¶zù¦`Ò=@j eÃð!ýoéüÙ& ½H‡žwxx°ìóa@ºÌõn5n?µï•ÓÆGzøqRÓ”*¼K+]rY‹£á³î¡¸I…<SXͪ´—8g‘Âd ˜øG™*-B+k“¡K€ê~¦dâ0U7éÝÅÄ}QB×_jwôy/j¿¹úÛ£QDÓ÷æDVt¥`µÃ24×ütŸW•ç®õ}³]¦Æü–ŽUÓÐ$ÙE±Ú ¯„·yÒ(÷O­p²b5+=¢ ʺ ø#Ø!ö"z‡ð×¶gµÅþzX$ø&÷(n#§º•¦5€*Ýõ#»p…ì¤@Ú!¨ËÌëÞݰù=[@­aRƛ߈s]gèZZàKoèjâ·ïKãá;¼] éã®§êq”1©UÐŽkºfã~ºZ"™Ý+î…[ ŠäV,«T2ö4>ƒÒÉÝ!°¾]’¸HQúÊæŸ€ôNA¶ßHÏÆõôçéò~‹lÆ‘§ÿ }˜¾®Ÿú$0‰…»¯ á̯5?¹zóÝXº‰‹sÎÁO®+.)<ÃBŠ€)T_]÷.é¢rÉ.ådÓ7A„S‚$Z²«†¢7Çã,Šãzâ’B•¥« ¬]K°uoúlÑ™)¢>Ž` Mä8Ò° 6Ç1¹°'1ñ¥%ìብWqä! úX®ì¦†¨ž^Xž8r4ÁRá˜Í®R¿JÈS¾’|%•õ#—‘iè9ƒÊ.nÔ^©`æ‡ÜkÝ#eJì~¡Dnÿâ7XB ö|SPåGƒ®8‰; {›3oU½_têK‘ªT°,±£\êž®lR–ÈyjÝá Ko+nbÒ:¨$ºE½ ¹ëC7id¹îô¸¬pUà»WwóŒäG7ÿ¤;€ÄWªÒÿŽëò¤ H¯Ò8âŽÿ~…H¤ë ÛA>1»só“1Kc¨C^€U–]¦riZÞØ¥®U•B¸”8Û;-©˜¢!TòK¬»dؽ„nqóð0é–šðR*™6ÄNL­JêB*LýâZžwÆÍùÆ !¼|Qá^ *¥ª¥ ¶kÔBqÍtE SÁuÙ÷†W¡«4Bï_Dú7pä} WY2𲲆èÚ;Û£å}ë±&‘„l[l xÔtŽ~GßGäSgdVo͇Úà$øj"<4Kß7j÷) õ‰Ò¸‡‰Çî aÆdG¾#’íÏùþ¬ß_Ú`ü˜i»(ÿ«û>šHž–¯¥2yè]tº“ F]ë["E_‘²žXÌ©·Y‘P“¬ ]í$¯œk½.µ5yƒn>OFJÀôý,£ã.á…,¤ HÏ)þïi|å H¾âö-€ÔN'ç“HûßóÑe xÓTd²EäÜþ\;‰|ow6ïÒ²)Af¥•ЧëS"ò‰t{$Ž•—"pI»ĨäKf”Å®qÎ%9×]L­JAÄEè 8+J­s\¤+‡ãø"ŒoI(£ö(õ„€dÞ%A¾qtevÜTî¶×v¥†‰s6ܤßaH.–›³ãNZÔ¦sG Î"cEH% %mP¯–¡äÈZ„Z²P‡(ö"®ð×´Üê0Â[M‰¤çK÷¡¥g-Цv/SAÎµíŽ Óù‡é'Dx ŠçÀYèÏóÏzúo݇ïïÓícž4Ø%›+u@bÁ0,+Ø®}Mß³ÒþÌHµRixµMÍ¥ž\ê¦QÕ¦  `ýÜž…{”DxOW¬üL¸dšÓèW[mTþ¢¯ôió‹ÏÑ5‰0z4n“ žd!<¤ë³o?y?N°xvá8¤÷ðŸ8]žšW9çÓ€t}å¼¹°}n®ÙϦk¼šþ ½¿¡Ò‹õú~ôt‡ü( =˜ÿ8ÖŒW¯ÿnõ%?6nÊá^=/quÂ=y‰x©–ši˜*K!`âLo™B’1щ¾†H×’Hgò–åÝFk¯‹»ԥæbj…q¿¹s\ë¶éoEaœ£«™„ÜRk´»µ¬oAOD„Bt‹šÐ5æÄ¶e­ø–ÚUfß½÷Öï…r:2‰µ½Û¥B_t×Ý;RYÍéÕ{—(·—UÏU¾n 1†º{eÚú¾ÚŒEîËìîÕ*ý@Òø´s/³§Î·…Š’û«JhZ\µ‹äú¬À%ìì3 ¸Î(\äRAÓ»g6ó£Ú]‡-ÕÊÐI®†\zêsú¨%“ð:2Uh>Ú=µHïN"wj¤c¹j õd¸æ°<à¨ÍÚBiywif¼1bwŒ wª$ð²b{«ú¢óÒ±×á=¹‡Ö Э)QŽTr€è­´×jä±k!Y ™0¹VÍ)NZb·œéÍGVl#[5Û ý[IçPXNûù9M[=Ø)— H>Hçeû6Šø‡ M@ú Ý­r{G@j•´D×Qi#X2ÁE4Ö ¢ýA}\‹Çµæq¿Šãâ®%0Ž6»ŽþF.&¾°UTÊUºúð…ÎöÜ}á[’ªô˯C Âp†ARälos꺢7èíähžãâÑ(§ùJd‡)(3]Îpü§§ç“è¬W4jx»cü·¯¾Øºýó[Áxûüˆçâ8Þ³0 U!á^$‘©…Å­ Š8¿†ÑˆCmÕk-ʤÑâ#ô¨˜ÜËî ä$Y1r‰º¢ã¤‘Š}`ÑkîŸöœŽ ênú]XÔ”t÷ÌúX{Eñ"Än ®(ËhÖw@èMÒò–Ö/8R¨¶ÝËTa7’ËãPœ4èDB`Ô”ÃÑÛ–Cn­)±y4Šð†{JÞm=‚Ƕoôó‹ïûò±çŽ›ÙÿMÕót³'M@š€ô* ].Ù·QÄ?lhÒ#@:énˆí6÷éê'NO·3`KE°8u¹Sªô¥Ô´ï-­Ir(ŽH¯y]ÅjWéÚŸŒñÝbpŸSÑo·ìá8ÝýJ¬"€\o[LÌLkÏ÷–t!´MMR ÷K™é¹Þy¸DS…º÷Ö²½5t½3z¥.Rö"8Îî.ˆ\ðwºÈð¾ÓJýGn;dÝ Z^N+8M~ŒkšCê“€ô+h»Ó_lù²k–˯¸,CÝC5¬¶–¤Më1#ÚYáPkpÏž<Ϊi!£ ¯‘DÄÄ"‚kjoVvñ,Ôœ‰^RA,â\rärïõ÷-)Û÷1"c@åõˆ]±k@PsGiš¡y– Râ0ˆ#¾x”ÁZ–žé¦D“—ݾEÙ›†»iiùå–Öþ¹Ó^èÍHr÷#$ÚÆÙ•KX[ŽprC}BäZÅÙp“mÇ\‘¢]ä‚B¾‹)¬ƒ´í{Fó µ­v”wª}›^náËýè9 ]Ѥ¿H ½HÆë€t^®o¥ˆØÐ¤Ž§ÇÚ½qF¤«ƒwR›í^†á‹ tÝ>÷õqu¾º=±!Ÿ-uÕ>¸¹.ãË.5É%.Œã`\%\2ˆˆÄ­a ŠNðu©ä ï‰ &wò(­¾%è´F(Æi§%ZÈ-K,&Pð·){Û=&W 9Ô½»ŽM—!ì½&ÆU:ð5[zôwà&í|ÕÑ{©Ðe޽(­õ.Ëé#¢qy9®7#Šñ  ]â$w)¿¤¨«÷t“×Ѽva{úögÈvcèz±Ï‚SŠ×=\ék°§‚SÀÚC8M†[ÈBãgtj-ðùÖŠµïÿ•.½Ø4­k/ð bkwY’zî "# m'¢‘{}¤q´,bô8š­{@mTxú[±çÔ.xº‹*æoy®4†èfL¤–Íí{ÓýYmt!¥®ú}¸:Á‚x4’”øi…7ÙU'-$Ä%Š—$*R3´·åÂÑMÚ˜º“Xà,íÑÝ{´ôn—{Ñãÿ– H>H¿˜ó päý M@zŽHw)žf{@:ÎrÇ ËŸêçÂH ‡wIö²8µ™ñLMŒJ¢.¥W–¼Ò%0¥…®T뺡_œ[r¼#ä)H?¥£Ç5Ñ%ä.‰žÀ´î‚M{I#y)í˜Ä^%è{ã·Äå®] B*ì‹@Ë-ßSf›2wDÕ½LÎÈÝ?Œô{@A†Â€!¹»FŽA.Gänd!]O®Ýî_“Öãéò£nBrÏé.WÝN‡¡óì*… ÁFX, §egÉ‘Ÿ ‰O¨Yçd0Ò誱¡Õ}ÜÕ[jÎÚ(umë48h÷ •æ"=”¶t@2½Œ_ŽòýHó€äÁ=#¢Høãw< §ùïDºèAØ^Íð8åfLìfšªEæRwN g¦EÒ6RÊ‘±¤ÐÑ„å#Wþâ¢ÓÒºçr{Dà\W…bd%UÙ´TZºAŒ I_,‡¤–Uœl|Á˜ßàu@z2ßàÈûú€ôì-OéÁ §×/CmW¯‹‹'ïÀ½xv%ªG@u{bkjk¶´… `jÅrº’Âkе½ÝÖªãJtùɬyJKôQ† n±»®Ákú ¿—ÄIh{wUo‘¹‚|oF&.Œ“•zD‰L©Cô½¹†š.€ðLõ‹ŠÁukÙÎMP*®DåPÐàÎq,YÉ:}%qßJàú2ºÃÓ¸â¼ÔôÀ‘— °/¦ÛÐÈ o¹+žùØP+àoI.ĺ=ƒÅ¡ Fà^ª@¦‚~´¹HœbÄV7N?,É€v!bk-»ÃË®y4]&’Û±צ.)q iëoXé) B:›dEC É™HJèMÖª@Ó1‹•H<°;îZG׈r/ß5[Õ¾ifé/gå.eÈ%r…€Ät‘Ý]A£ Q£Ù~c{óo)6/›µ°l¢çõxãÞ4§öW Qí¡\xFø®^wAmHTr{åœÙ=\#?ÊîÁAÅz-çܠРö‚¸ÖR7u€¹´b4lQÈ@bTâ.wXù¢Çl3r‘6ÞW$W6@Ò-0¼û’4‚qÓƒ4iÒ54é> ÙçÒaf RÀÒ­Ý—ÄXÔ–¬…ÔþÚ‘4­¢Ó’ÛOœ#*×Mú(—«\ ç šÝKn„ºÞô„Kq¡†Ô˜ýdb'å ÚÈå.\É‘: ¥o-¦î|r¾&‡ÏwœÌ$mu)àMá;B•I£jÎBÉwÿ„B þ¯)îp@η.r©L©Ç ²*<á ãRd¥o¸ZÌC_ ‚o¯—ùó8ϧô´òë Û‹FxRˆ“A° Ëw±ç›â #iZš:Çr pdX›É0‹,DKEZtÒÓ çräGN@vHÇæK½úQ ³$hóó¾"Ù;ÌÊNœk]QFo¿"º_Æ£¾’ëÒr¨GUþ la’ÓÐÚsÕ › @ê/)X/˜Iµ@Z÷6%Hx˜ìСgWÓNT•˜Nƒ©F¸Í÷þÍv/Ž˜ÔàI $Š[^| Q¥ç2Ã$¡Rœ›ÔzÙemzE ‹KjŽirD“V½÷³+&©œÎéòòf”Wãz?zHúØÓs÷K—¯ÿ)@:Pèú•/ÒýëÀ >zyŠ#_Ï»z}ØÐ_£ˆÿ³¡oÛüŸ6ôÑ=ùÁ=ÅG“™~H×ë50=»]ú0 ½x>:Ò“žxpâ;ÎÏÒ:õð5a#ÕjénzAß8K²ˆÆAL™Ø£ÐE( :€JjLe/“;‰W$¥®óEO§ë¹3HWtV_èw@„®ÓÊPà4=$'OšÌ*=ëÖ¡#)'Úà’&\B4Nq§,mïpÛ vÌέ¦íÝqä\¶<|Ôâyœù“n.xÝê3Ž'ï‡ùÆ\|mËÒJôLÏB ¡{ì8úñ‹¦¿FnVÑï%ÑWä”lÏuéè™Ç¡IZuHhÓ*À“qlA*Õ©4…ÉŽM­?‰=Ô˜ÎâÜgéJÓÊÞfkyY iÚ­['I¡Ëmem)´ZI…E§¸”"%+´ª,ýÞh'ä=¦mîó>¥!É­–¡tÚvŸ€4©o¿øOCÏ }Ûæÿ´¡ H$ÿgÉlfÇ HâP\ª±†Dõu­¶ÔâŠ&f p4…¼¤•Ö¨)Ȱ &‡T¦UúŒ¼ïŒ¬o̵–(›p‡ @$jÊxÌ‘9Ÿ„ŒïÄ€D¨Ä19‹¬Úåsv«Þ‚œš€¼‘IDÎßëKnBŠÙ½ÜáßEr‹ÑLW(s„ØŽ¿÷ZC\ç‚»«÷hÑÑH烙£ ¬ð"'±þ]œ™±Ðz5Ü»…<±‚¡äŠsºÜ¢ûkFvV¡×‘’ò-Ñ:ºiü´„ìÐ[¥­XS¹7L[†3šÃ6ÚaRËAòpÀ $LìiØGµÑa­Òu¥C¶þHzøD§Õ‡ž¤N9Ç3c>Ó ØžÍÖ› ŠNNr£jhtb+Œr}MÌ ‘: "•M7€Ó–!·½ïNnQ^È"xÔ¹)Æq¤Ä:I´´2Í YD‰ëÛ*‡F÷À,^êž™äOûŒåÞÏK“àì:ìO& µñíÿi蹡oÛüŸ64éõóÑÀŸßHgHR(‹ÓûIÊL-Ç]vs­ ¨ÌÈD7Ï‘V V¦ähízÂ)Vaªk!\j¹ß²ÇyÖöî ähh‡øí„’„Gîe†êQ1à${“ÊÕ.Ñè™áÉAìçÒ·ç M@š€ôW }Ûæÿ´¡ŸH€è1 }R'à8oº{º9¡=“®´Û¡Ky‰KR5 &¸—PWJœõèRäèg)‘.Ùk^–|Ò±ÆïãÒJ¨Íg9ñ7?T˜8¹…°¨ɵ¿ÝãZœ¡‹P9e|³„eâlo;â)½@|í~‰‹›îÞMþ¦y8G—>Í2€mQ´ ‹ûeÒRÑbË÷1 ô×i­ï¼<òŽ!\­¿°vô”DH†™pU…s‹ pèS]ÖôÜeU9Hl®¸RG„زZ¡ÙCl®K ÆRKÀ£ÐZŠì!¤ÒGj‘D~ü§æ!g¼X{ã´Ú“ˆdOjºÆúF:i@Ðð"±é¤Ø·¬é.Äu(n‰¾d½ÜJŒGœþo°LÃ1¥±s¤S+¸^'ºs©µÈµÐ8BnŒÙýosÇ£„okV±&4¦hk µ¶Î$´7IÙŠ$á”-a›=EE=ëj~n;‹ÿÁ€ôlL@š€ô3 }Ûæÿ´¡ŸH×ã) =+ƒ{Pb‹OÈêÉ íöÄöŒ¥îAÒiˆ‹³ïˆÈ鮾ÄѸ¦ò½çz#ß»"‘)ìèb2â6‘|Z"ñR(!…•.J•¨§mˆÂ%DâXIÀ³ÄÎN_Êý³kWü‡¶7ËU.»®w‹Ãy¨ ð_Õ•s|¿ú#È$zÇV‡Œo‰~¥ É%,œ\Ñ‚‹Óo ]ìØ{ãz•÷‚ZýHŠ“ëÂÀ#‘îDWÉÈéC{c.ÅGîïÅ™Q‹ŒÜµ5²@4-\;9!Ûs:¶J¨$Oœê‚L¤–XÅþ"Fa-+KlÒèê’Q¢fY¶Üô´ìØ¿íð Å–·p,;-{Ç!läŽLæao"Ò úC«Áµd@Ý“…<4× ¿ŸØñÈïhë;ݸ+Öiÿ7øµ0‘0Pú(úfö½Òï›=Ú‚àlk½ì;D¡ø ËY{·“®Ó$:/µ/Ó\b£+\ó¦°cÝVvIO„ZÁ¢ªa,{ô ö˜H»€^"`»AÒ «sx­²´”mL& µñíÿi蹡oÛüŸ64é@ú5"}; Ý«j;e!‰iëb”M½[í3¹NXMÃùݘ[öÌ%ž›ûÆ…j‘E†êÒ–S¶©í¤Pƒ[Yß›Dšp)¯ ýfdZKž®ýÃvË…³½=³"&·¢$ŽKÊ5aÝ%¬\[ ®Ü- —zi\“\†bSñkåKN¾殣ÈÐÀZ2–죱ܷþ¦€4iÃ)¹‚K’à|â&§ŒH\XÆ(ÄŽü¿¬ÄO…¨+gy8‘8}(Â\FcºÀ¤µqE{‚¸dJ[‚žÚ½D+}vkVéGoUhÛÒTÈ3óÑ2²ËÈŒ[ìrR¹ "¶†"Ík¤›g #Îàr]añ(ú‚þ£Ø5‡"…=)»Ž²> pDwON“rˆ£²èè³ö'3È)ôûä®´#þ&hAl’²è¬Ñõf`XÀF¯Øð¹›ÓÀ$‡Ì5Ý0iËÖCº²ùÓ®ryt2i¹ÝMNrøß<ª› ¤cDt8•J±óþ"Ù±ˆG…¦n( ’=T¢ÓJ[º(¶:Õ¬µGë©Þu%Hx@Š;_æÖ ¤ÕzMuŸÇÅ/Öa€ä»ï(áE&™Ö9ㆠzzSFÊ2õá+TÀªÒº'—Þpèi5æª;”µg’E V¢Ëà- =+¯xÀ=¿^Ì9z|®}vº¾¥‹q-À¿Œ|òÂv\>|aûèµñ÷_ü§¡ï7ô÷é0½H—7 7Çæ­¡[`úõ¸¤ëÓÉ‹CÇçÞ7øb’ÓsÜK€:èçÚs!Üp>GÏX{ê’ìªKùÞiG¶ U¦ìRLkÒ1#ËÛ¢ÕnZýjY×›å–ÜKìæðø‹H¡ãÒqÊ‘´d‘ï½ÚÚ[í–ÝKÑewôè¶'¡¬{ãÓ_ɈG•–õ":C¹lÕ=:½ØÞ(U™ð ÷†W* y»*=?^iìÞÂ(Ñ’¬éEbJðµöJs‹lóí~Çr=¦ {çU±ûŽr_ôjC@Möœ#}j¨6r°C—§.G糆‘®¸‰^41ÉìyÖHÒbb¼’3|:™£e ÔÃdØãw¤í£ˆÈR¥m¯î&ŠÝßTà2ªv ©Œ]mxÃÙƒt¾¹žìtÎ W\'w^ª½[ÉÖ+$[²UÚ³½?›…€Â+»ëàHÂ&(ùoÞÅ:U¶kgs³œ–©ßTÙMÏA‚Óå¤ Hß2MCÂФÿ ¹¯’y FºÒ§ä3?bõƒïR]ç¶èú§è2½ÅUÈÇ%A¼d L™ºŽw“§\éq+“ƒ¢·Ûz¹ìtÃYx˜t÷Hl!f%7$võ–ñ=z{é.´tDF3úz¡ñ©èÕa¡‹26Éï&d h¢#ÞÑ—T.i²»@>4ÛÆŸEz‹E°Ï¢*mÁlǤzz‡¹Bï°ê÷¬ì(vÍ£Æu­fm;Õ¨õú£fÍ ïº@ÊÈu@  E ÒÒràJu$¯Ñº;‰Z` ¬ÓÛóE±óÌð•L @¤ºO©º‡ÔÒÉãp`Ý ÇÒ4búUÝu¸´×Ntzù›9¡’j€4t—zämèNî9Ý£ûmg^¤øgäuÅlc\">.È]c”mÚ‘’6èÒÚ·õþ7šÛÚ"’Ê­—[>C¥eÏì·& }Ë4 ý CþG€t Ò'é@¤§€tdz«>ÎØ´ìþ¥„0œ…®·Í5{ºÚÄdE¬Ñ-±siƒ@¥BA§.‚¦À4Ò–#8×Âp¡—ÃñËV0%uÕ¥ÒCA#f䮌¬•‘íí»j´ÊÞ\ôuHWÆ&^‰°U4 !K4ZIH蛚ˡBbJ}fq'®–ìºsªå^·Fj¡× o] 2±lq£­7º“§µõ"¤f‘¢| H¹‰‰Vkµ­»[¶] [î¹×éÂ哺?g¢ÓÒÖy†‡ìaµñì‚ÿëî jÕpiëdD«eD—dé/èaÕˆ«´•{ù›*¹ClIìΤŠñuZÙ[ÞE”Îk©97ˆ”¶„5ÓršÜI±LRìéÚ¡ë>pá"§šiz°Õ]6kÙӷä÷¤'0éÿihÒs@êCl€çë€ôÑña@ºö"}êT{F¤ësx?×'ÿñ†= %ï¡æÝÿ"‡ìon²Ëª.¢„¢ ¹è&¿"Ó;ö»+2½Ëž¸” ·Äª”jïW†ì’Ø£qH]êWë‚ô—­_Z×=H3ô›¹T)÷Ñ—Å®Ex@ˆîѹ(›ÅjG$adÎøî$²H¨ÜfNƒ$^h^¡ÐËÐZ|Çï@{ãfr§u*‹–‹Úèݺ"y ’; ×ò.]Þ[Ãøöhø;<1z«ãaè²4e„{ã3ÍôÄú.uu¼a9µ:Þv¿‡°Öî(¤; 5âj2Ýls=mÇ.¤Ô‘΋ÎJ‡ãpä·8bÜ#¯GÒzKÞnbTêY.bCdAû¯(øgIˆ°(²‰£ÑtXêæW’kW@*]l}Ò¤wºøOCϧ Hÿ@ú"½zª=`è) ] *ñç’>ýÏ5TªÃ·$èWa‰JÚ¶±˜²ä”}–)Ñõ¬DeðtI_Ö‚â¸Å'Æ%„äÒ‚óJŒþºšÐYw¨ñ´‹ï~‰=bBÍávŸ…û§v— Ü+¹7•9>Ýâ‰]ŒA×ú·SkfQ‘F=²„œ@‚Kk¶vì ÞjUùqWy {Ytgöª¼E쨦º“ÊõÀ./ü¾ÿèAvD(ôê…ñ]Òty"»?Z{Õ~ËÁn9A-_¾±?ª}1\:P‰ÿ·wÜC€dv/»¾õ΀Ôò•ÆV–Tô¤¤½å I)LìëꘒµÛpAÏ&d¹YpkG¿Z¸£mXP³ö%Z 7 ÉIÚ7é=éɘ€ôÿ44é9 Ýý/Õë€ôä 7¯.…»o éù©öªìí:uA¥Ët¥r;+û]dÀtD2=±»ÁíGCy‰…*s¨4ˆÄyº“¯tAܺèÒBÆæWÚ|…6%ç.µ‚8/z4®Eâä®´»®÷LGÓð4åûAº°èlÀ×`MK]N’;©ç4¯&ô|p Ë£ëk¯-c'ül'™ë½3¢4¥;‡–ÞRíbˆŽE¦w ±§€ZSûI•ûaWPÅî]£\´Š5èn1ÐWp=ÃhHÂ×Í”{4Ì@yAŽÇbg™v¯†ÜqÈ"z8¶ìÎ>¶R#ß÷ªÛÍÔÙµW½ù]A@q¢ÜÞÒ ÊÔ[{Êö‘ŒæöŒ- ]ˆ–Þû,Ñs>¥æ r4®ßVœžlø «·p).½QKç4—ÅžŒÝ*Á\Á6{@mTîïåg®F ±1üxM¼€#žÅw÷ÏxÞwHò‚š³È‰žc?ˆ©ù±FKšfÛãs#–g:Ò.ÍïwÒçÞÅøËé½sŠî·Ö¶&îJ¦·Gæ@i:ö€èH¨hÜÒµ¹UŒ#DZ´Í™HÜ{mëd¡©PÉÆ€ôQ :ž½8z? H—'‚ @ºÃœ>ðOüÆö7w\Ê8û6¸ˆå‰ø{Gºòýþkö4ôN†îï—~ HW»þÇéÁ ßH/ŽÇ2±×ã ß<¤‰ë»Ã]?õê©÷! ]Ïp}×üdˆ=EéÜòäRCàb@l©õ‰3ú¹dŸ• b²1Eq wŠcçRèŠK[÷+1*¨ h\PXvÉìÈÄ£ŠîÆhQ9¾È_º2ä^&7„Ÿ.ÆëÞŽµ«Š^i®ÁLÃÅS÷ö«-ƒ8íØÔrªSOo‘3ôÍH\Š€œ¸'e¯}öqÿºÒÅŒd϶n%î­z_£bÜ^Ô5-cw•¥.ÑXìPtäÀÕ†`¤V§=ÑMÀ#×Q§¡ƒzDë½ã’ë® ëa, ȧû¾²™¶Z3:÷eøøÂøÌSÙbÛ(GÐo±› í’®©¥ö{tÙuÈ?gIQUíÔQi´¢Û ÅîLâ~¶œfÏ!Põó *„ K,…ð(J%kÃO«AL’e$å¢& ý@Z' MC/š€4é'R뺻á GõXÌ[ ³n@³8›Ö˜ •2P‰'$(Ñ_Í…qÜh·À»´«Sró“ÚŒÑS™v¯ÇE™§/­]¢§Ò)`¾:/ÝÅÓåyzå(fï‹1âei‘¸„"{Ž2BD/ 1ìÔËÑÈgÔmé®'­Fö ÊÔ·†m]ÖìHUa¾Ì›=ùjH±§FÑF>œA "q¢Cl!t@ò{Ül¸‡î ž¢ 7¸Ý{gJ Œ ÅÆ4*ÛL£fp%%PûþRÿb»@¤Ž˜ û^Þ“Ûmb$‰^û¿õ5ìCb†G)ÖµúêDµtë¿•” R µ·Fb°AC¿;öÐÇI¶HÐH"Ë{ˆ-9ÎöæHÜÒ|m®{Æ÷ÚÝ-§z:ÌÖSa†ReŸÄžô캸ÀèIß ­šÈ@‹‡]Ž Âá+:÷è ¢å ™ðÖ $ìUúüJÞå‚”2{³Ø=E]ÔúÔÌ#ïtÁËu9yDÔȇÝj«èÔ2ÊãI²³ ^óº=4G!’¢ 2 ’9ˆžî!ÏsÕá!Ø»ƒÊ÷ìo<].itC9ŠñÆWkkÆ´'w ¶µ ƒ. Iˆ04±Î„”môä~},iÑtÏ¢wqá®ÄR¢yÛRó!Ùe€ôî€Ô® 7€ôÈФÿµ¡{»Â/vÊŸH׿žÓO¤ŽJâ‘ÒÒG‡è,3éÕZèCºÛŽ%²ŠÎZÞÊݦn§Ú”¼=+y—Ä2ÑEÓÞÒļUÜÑRElNBž2’ôÞåRÛ;£ƒÜºÃ’ES/“è­F µ“F^óðÉXgNåô£B«ÉZô(Ó´Ô²jÒc÷züPq眖¢Ì΢Š,È—{nyíúFCc(wXj§÷$"Ó“<ð¨u.Ì~ tÅ„­ço±²ÂÈßz¼åÏ€äšcnë&› yâ¬ÚuCÓ*t—ÝÈï‚JCx{d‡Npļ½1Ub ¨”±Ðz.!tÕ%JãL|=bßç{GMSÀ°ÒQ¤¦Œä¦¸+~û‹Hí!¤Ö£Ìq…Vã–¥7FË»è@ên§´Ëq=~63au@*bW?ò‹äE£.Ÿ}EÍ3Ó²­(ÃÔh»ËgÇ¢Aƒpÿè.kÞ[Â܆´@5aåñÖæ5Ú`DíÑð2õ%8T¬F#>Rcϱږ^âÖÖFF…Û!%ɹêMi¦¡‰$zAÛhÀzÑÿè&c÷Và =§ˆ¤6Ú¶ÁF„"' ½5 • HÓЈ& M@ú1€´§àÐ`HaÇ vºùó€ty­¹÷†—Æc®ÉÛÈaò.3ûGý¤kö4ô Ýãäs6Û ;ä/‰ê(½~ñäX¼5ôìàýv@z`èW€t°ŸÎ®_½ášG ô"0}îçévnþ0 }ôªq…Ôƒsb/‚»žáyaÜኢ+Ÿ¨×S$`Ò¨dÅ%JŠ]˜YG€×Ë.­P`dR­ Š€â÷Biéß ã®óÍ@Ð’™¬—Ü(£¡=Ó@¥ˆžú|®¢;*ÈÖ.CíNÍ<ŽÌêC«H»EtáGs•z}®Éuùç,ìÜýG-~†Æw 5}&ÓÁ¨C Ó™ðŒK hCŒ}6×Eš §iæù£: ©^óÔkÝÄž&î{Û(»31[ص¶[¨­É|ôïå0›X-úæÜÔNõöz iÛh?Bü³$U•U ¤*r¥oÐIœ¤í& ½' ­w¯§úI×ìi蚀4é§Òý2¸K§Ý· »ÛV]e‰% Ç;–BÌPa8^â$o%Vºr"ÓÛö$¦64ò¾[|®œÚ¢À$É1Kˆî“i1ºQEW.Ø%ï¹Ëë^ê5›íØ z/5·w ±K@žÊÏv(Û©Hñ.yTw‰ ÁrÓ«ÿžõ§H£>§ÚÛl÷´ ¿›Å£Ñ.f9>ÐmGLoŠ] Lz´Ò ¾í H¶RF`AÍâ]œm‰åË—ÞF8Ñ£ŒÃ,¹ÐT‘6g"HR2KnSë!ª †4éMé0ÒÄ!o¯ô“®ÙÓÐ44iÒ$+vú8 ùIšéêŞݽKX«Tö¦ºµX‚¥˜Mªð+E%LXÄZ‰–2WÆ!×{ÈUz’D·]Vd §ìonŒÒ@aÝ3¾Øÿœ`ºRÓH‰Í] ¼ãSÚI'Ž.*£;ˆÛ3ŽCĽ>¿îð1 ÍY:¦ôø™8Á‘:Á‘ë. E¡ $¬.?×ý `²¢¿Éïx4©­·{“ŽÈ:D=±œøª×ÂiW@VÒîC:©ugÓC­!7ú+º°v«û—%ÎFŠø µ(l3­(ù—dI³ÆºdumNÙÞä=%í HøkÞ¿.í½ŸtÍž†þ ¡Ç{WÛq' ý@zšƒô~€ô@àûéÞUÇ6éÊ bÚÇs­€3 ™;€´#Rs4µò¸Ú¬P„3U–̰”r t5^DLÑGCWUf&‡^q•€)¯˜"S<9ø˜ ~Ë–÷ h*ˆR¹«  ]ærƒ¿ÚIF^$Qw‘ËûúŽg8j^"yøi@cîäô1 Zú”:EÆ߬q…g¯¯ûwÁ$NPtž"¹Ý·d/"xÇhùQYì_bøÖÖ½û›íI-•}ÝU;›à”eaMˆG. <²µ=ôŠ®\ýO{{Ž8·v}mÚœì=‚'i!8 2JI‹Søß%Ë{IÚþ î\È.ñèg]³§¡?hè•ûûÕ¤ HïHnh{"ÁûtH=nw¨ÈÓXöì¬L)içK\§rÍ9ÇTSJ>©Xb 1Q†ŒhÜFÀÄ^¦Hv]Ñ?.uj~ŽU¿‹èë’“¿ ±“êБvðƒ*ZËvž8ƒRnºÕ ˆ=“çWA´½R¿þºêÒˆ“‰“§Èz†w¬%]¥†RO½òû3mŽ&”ʼn§.§ö¹¾“U8µ–§øÞþÅé« ±$߃lv×H*]BÒ÷Þl º·úÝ ´»+,„L$v'm{’v€p$þkn:‚\$¥¤ 2IÅ•Y +lO@z@º¾þ<ºðý¹Kí4ô =ã™ Hú×ÄôÆ€t=¾n¯"ÝЯ‹§sÎŒr¸ó¸l†rôƒÛ! ç×V§zÞ!“¨©†^ÇMP"bq5—¬˜$Á’BQ\"•þ¤€žq%qk+‹]‰‰£r’yB¥ŠÇØÔÔ˜2 £éÏÍzr½(VUöªÑo{œî€ÝÓ£Gâ´ßégP˜@”Pµ7 ÔŽE Íî2@n Q-÷Iô—ÖÎz‡Ñ#F×8k8Í)$w‘Ä^àvhœ€¤‘|%Qá—»”ëVl/oIÛY w wÌ[9´f”qð eú¯ôtm.öçdm†£¤4g )ÖÖŽôHIîÏd€ôN€4L=ºðýÉKí4ô M@š€ôCÉCŸ¤‘àºõ Éíº¡îh“^jâúMÙÚÞÍÁ„O`Í%N\âö'‰ I–„LoÖ0yI1éÞ`×# §‚äA«0‹NN ä׸Ú}˜]ó[ãïè˜RûhÐÔÑé,<àö¨æ:|DvÏ jNŸÒÕ1;ƈŒJ‡pféÂ:0¸Tº‰«!N&òNU¹9ËNµ±üW<ô¥†*ç0‚ùÎBI®·6½¿mí"åMfÓ÷6¶ìSB+`Ñ£m›‰Œä`›Òž¤¥¥kiú‰ÐAZÇÔZ»Z޶5!$%· HïHÃÔã ߟ¼ÔNC?ÑФ H?ü·Òm®™=f=¥,íô³uÚ âÄá^ê'ážëÝÕø¹Œä%‡&–]’\²i‰!š¨âBÀ´Š‘ö P*ýïp3ôáe‰Ðëç4¼K­dÀÔE-‹@ƒ^žRŽ‘9=|5Cv ¥ÅN=±çDí"âN&¹á…܃f¹û¶P¨u(Í¢Ý@ow‡â=ø—=±aÆe±=ÓÙgÍH`w§`ßEQì‘AµçnérŒôÞ!Ïn{6R„29ûÔÈ—VÅ–Ø‘mÖÔæš6ö$-¸%ôf3$n@bTR…ÿj‰Ò²î&7‘FFñ]»ö .8w™>HgHºmžôa@zvÿ{!¶ý(üõ…ï']³ŸO_ù-–èŸ1t½ã>Ý!_圗éƒÊ“¤Àô€tؽÏ7€èš‡ÄËo8Þö" =yÃÇIëñÍîÝñü*òâmøW.Gçì%w{ã›ô,¡Iß-‡»©™ë£v‰J$0±ß‡KãØ¿´ä˜]Ö"å¤ h*Ò¡’ .¦‘Æ´õR¹Ô æ2üMÍÇ4üKD¢;q†ƒikÎ`HÝÏs~Uöq0Nm\Ó4 ZAžº¦ÃÛÚ=_¦Ï+» $:C™Ýz«ç«#ª8èk‡¥‘r5‚~ìSZ\»;éœ^•÷|¤ÐmM[;¡GÝuÒ6üoâ´%#úØòËF&Â$‰Š6VFª´Øšhwa\Rœy”É:Ñ-Âm̓4iÒí'|ÞУéE£?GÞÏФ Hþ õ”¦‘íJœ½ä »´ n— ]ѹBÎ'=]õ¹Ãn 1xÔ¢ j«Â‚È\¡ÑrÀGÖ· &v;ÉÝÅÔbsòôX^iµuöô `ItïéOº#Ð1øñLTs= ¨w¿GbÿÙQm\äǧõ熬‡ÜŽ„¦. ®²¸—“ØAÜeÉUç”ípjBBˆ$8ÀÆ ´%S$d!…fm€Äž$v#ŠIÒgV©eäV’“¶µ’& Ýý„Ïzuzð!?GÞÏФ Hþ ÏŽÒ¸![‰T'Q[]nRˆ{tPô®)$“–X;.U¦Só34´'t–!P½;ÊQ%wQ£ñŠ_Ç0Üþ ÆAZm¸›aûcžµÏg;@5Ç”:Iíøµ\ø­Ê-;@Õ=™id€¯M/àPa¢á¶“ÐöÈHj¹HMBòHÙ^H­•-Ë#)kHdÖŒ‘øk¡±ÐÍ#ÔÆ J6e8A[IePÑf”UzÒ?H5xs©½þJœ^½f?Îqù ¡o[¢ÚФßH^¿^Ñ ø Ýf?ð*‰=e©”8eÑ+.pa\Y²oiM†6fˆ–Ó—h“6`ò€$Í9Ñ•˜b—°lñ/ gOKcŠ]h`ŒÜG¸¢?ˆáÎ88¬ÚBoÆâ;<5—”7Ž'}B¥Óè™Jj÷$õl¥‘È}* PZö2½ÒEÁ÷æv½íg$Õ½Sƒ’±JtýHc“‘Ä f,)ÈEzú7D²$G%9dì¦Øá% nw9twDÙ}˜.O ‡ç‰aIœÜJ(µÈ\Ë*]ÇàyÅsmp3¢"±K) ½I{‰H{=ÛHØöÝ—…m‚¤h—þ H"éH €TèïÚýGêHMU;wHrEýTúͨü»ªØžÛ£{Ù8y|ökö£sè—陜޷ÒÍeä™ç_ñj‰^¿àÌEGkIe-ˆ°K:zš7gÝn]R ƒB5¹ä%Õ¬²+¶òökF?|ñ2ý&CçüKôÚôâyÌüú?¤û;Þq(ÝìÙÇ1õ<ú€ôlô󔸋AwC‡²¡Éýà>nÏßH·'ÿãÚð!âW>=>^W÷`ˆ—‰êɸ•®|E7àRC@6WÔ¹…ÜÈøvÕ–P|1´¯²î’¢“¬Oû«J2fŠ#Çè:FyA°´¢­œjåîŒj# <)Ðók§æÄ±Ý1åþ±=üv*¬V°§.1(ù^S7qz˜{â¶ŠL~ëbNC|íM~U‘ÉÚž¤6tmú~¢Ëls'ݳÜ'~z}ÜŠü0GÿƒÓÃÃ×ÿ< Ý?Á æyžßH_5ñô6ûþeèæ>ý0ôÕÿ§¤õ"a¤õ‡ÿ…$oHëYÒÒOÓ­+êÐön³,—ƒPÉ¡$®‹0œÍšöÔ$z-óŠÔR¾û5í$ßbrˆÈ@ÉYö&ÑPK¡7ÞG¹oTê]RÖ­wØõ{‹7훈d@3[ë 7AM[ËErCY[ôzÿ/’AÓ‘€”NáµÖxDCQ»B,2vEmn_ËéÚzÒ¤r:·Ÿ¯zã¢ûD?u¥Ý÷d‡öŽþ±â—ùã—¶•or÷ønn"H d *Ú•Å_%ŽšzHûŠy#@Ú =Új6ôMÓ¤ H& ý@:+È«±tmÊÔó•\ëÇ:m4bbçR€î’ÛuJ/Œk*L~ÁÖ§äþ°•U)EOQjåoM! t%·g#•®ŠÄ ¡‰¡Š´â·wV ÷×±•ž‡dáGZ …Ô*Ù"Y ’¤oÏr‘©ç M@ú—éòª×–rÚkÞ¢¥¨jh÷æómÃ$gä ö¦çӱܙöêvKîÄ21-"Ú/©^½ÕÔ•vBKKóK&ÓaF§€s çÝ©~ "9M@š€4iÒ;Ò¥°ÒõóµÆº©Ý­ù †BÒ’¦£â”Y¢$.•d»/n>¥¦êÍ’J ”r(£ùIËåöð$IèK2$™Ö¸Ío=Q›ÃlÆ+Za¹·É€¤ @ÊPÔö€$E+]Ù.½H͇ÔZެ(öŸ€ô³©\ÒíedëkŠ£Â>¯¥V~Æm\C\¶¦UTd¦ôâWhÒ&Yãžîíæ)n"«lH¼D[¿R_ %à( +uNz¤‘Þ>¥ô½KôKCÏvÔ H& ý%@z6Ë—éAÒÒ£q Hg¨‚™ºdÂ"赚“Êv¤HïH7aÈ Ñ¦M& M@š€ôÞ€ô+ÌûB'í+8¼Hl60m–ŒÄYw+²*KÜéöÂÆ2/¶Ò1¾?.ú´œi¬Ów¤r}e'Ø—o±w,óŸ€4iÒ¤/Ò1ó³îp}>qZ'T¤þ˜-ð(…ê«.ÜF—ai- š6«Tа*™$¡Ðm£ ,˜Ô¼HÄš’~÷!ezhÑväÜz$aD’6ë4ôòÞºÖÚž^tÒÕ^÷’<ù& ý\@:Ûz¶ý*ÎýÏJÉì=BH˜%s/4•|‘¢²k§ý¼H|Úö¼».¸,ìG+RÉ )?$ÖÌÕ‘…VÄàãö怔@Jô­Mñ%Ô¥2,µ—ÿø=54iÒ¤ H_$sÚ+Ç2ªáAÒ½äÍ÷>ðèJ¼²iy× Þ‘€I–èR”é }%A¥ eÎÞ^$ÎEB¯‘Õ®ÊWû$Ú›Öe×YmÖŒä\¤‘¦ÝšŽ îÌ6œIÑo®e[_¤G{ìï|þ¹м>_trÚÏžëòU\í§ÛFP„VΆVW_–¼&.#ØÊ"hQx#ò7 ð#mÀ¥!†Ý~'lŸ°µÌî¸IîëS|bÒaAyH)Õ²Òçñ»¾6Ò"ÓS\ü&YBŒ‰*ê´äµòÁ–N›ä—5cÃì½5øŠøà$ð…ˆíŠÉ®HútúŒ¡o[¢ÇÓðôµ½÷z?zjèË{ökã8”n鈾HÏÆ€ú €ô`†WÇ8Õ7÷o)4zNiýq@:´1ÿ. =¤'¯?×-þ2 }™´^¤;¤uÐ(†k¸tkð—ãyw¸Ç3C×Ω]A ÷:‰ð,¹júÂɦ°Äƒ.1• ‰5 ·—5­+jÚѾÖ÷Þl€$„Ù‚s,)9ÀF˜$áA øa/’¦U¶tHÊÙ¤.À¤¼Ù^iV;é'ÒÖÉo¥®„E5™Ø".O¤X¢ÏIêð1ÙJÛ.ƒF[&mGÕVÆ3¶rL™öâ´@¿¢r˜µÂr±¸‰ðûv6Ú†è–È€DT2}ºŒ5{´y¶‡ëïÎô8Ò=Ht¶& M@š€4é;©Ix×­ƒR(ƒ3uA£ÜJ4„HD>7€ÔÉ6]í=É ø |HK¤€Dm–\¬ -škjGR9µ' ý£€TpÆ€“´0qb´–p<–…'2R5lûb—5ï¾ëÖÚfrêvêÛdp·–ŒGžð(¤•ö:®ÅL´u´H™PjÝtwDå}U²!2η ›/[r´³‡Pˆ«R6•óùâ뀴Ý]{w§ïHÒ.ÍãP`íðlÊRÓ¤ H& M@ú$ Ùà—¯Jщ©žÚèâè^<ÅH÷â!(¨"1$q÷<¢‘š‡+èÎä<Ú³µ‚ÿ Mm$‹4mÎCâ²ÿ°’æàš‘(÷oA6ÿR«‘ HoH7—‘g_!l4Î Ú!Jâ^»,¿•‘ö–Âu*¢¸ª  ŸêJ—~ÝWvé'ò 8 8f í½ ­“Tt‡gÙÓÊ€´!IÛb 5´(}kð³ìM%+!qçÊ qͪ.ô‘M•éž\Ü?~ñÿèÔ Õj¤µ²š¢2é[L@š€4iÒ»Ò%&¤+V']»8.ÊOý‚#±dôe«h<ÒÉBMÔ]]RÛ#Q›kÙ¶®©z&’qo[ë!·Ée@ÊtõXPýléTЩÍÓ>PðψT}Bºöм#ëè-ÚZ{¶‘R—Œt{_¶¿‘ƒ‰áèìCÊ:M@úGÉÃ(ƒ ‹XX$r%dYRHKZ ;B4ïÚ³³6¶Ý4ýxMT‰«*½¡ÆŸÑÆ>Ǹ®+È$ö±ÄiˆJU•c5u­Ž«6 Á–¢ íÜU••®/ ·mæ›Þ¤hä²FÒË€t©Žùgi!tô)N@š€4iÒ¤¯Ò)A›‡Øì>;fC~G¡«‰M,/¬{ÉÿH®÷f˽èßÁäE“G¢A¹JˆÉHÚ"¡íüHq×Ó6-]{o]›ïÒ‹@ôÕcä8ŽŸÒqпvBº9E¦ý<Ûþû$ }y|ö+ÄøjãÒQÖ*§¯Ù’dbMyÍq³}7«… ‰SiJ@*ã=’×Gè”’;²‰ÞP¤ÔÌ]s,²•6Ö>M\ŠÆJðXÇ(¥( ¢¹Åé²d½ìä}|J,ý™©äZˆ§\a¡·¹hh96d)ñ~Õ·ØFÇ·ˆG©/ýW9?JÑ‚ó…§×V¼ÊepC¶q¬%\jï¯ê×Wz£®Ê+{ã\uþ:e©¥Ò­ ãµ­o’:päÒöoèz{O =[ϾâÍžýÁ=ùn©ø7ÒSC¢/Òñl¸8O>¤ûã1 }øœýÀÀçéÃW‘û|s¾ ý8@ú&C } ØGÇcC×Køt‰®¤+kE¢¶-2±4 ÷´]ª­i‹G4¯Õ«¢Á¶ÔT$¹¦M êß*1 q>Rž0I÷ÒÿÖ¡Í@S››×®FéBˆ¤D²6üHþ@:eñlh#»1a¬µÚèŒBXÅì²Åç˜sS j7ì©rnkýmÛJ=f¹…š+®¡º±$WìÛDV‚7Dº•˵ìgÿØ¿BŲðRxBµH îs.ª)ZW^ò­esºØÞ½f?¢‰_¯ðHÛRÎÏÊ:H­Hï™Á±›©üm‡oÛÈo¦ÊÌõúœL„RÁX”^rÍ9'"r®–[ÑS'ñîÜz2sp [ZN™´Ö(Ûÿph+»m¯Š'b§'¿ÉâÊ­v¹¢~¶b Œ/ûª¸sñëé£+½1PiUl’‹ÓšYïÒ7rzjðxN=qwÓbzH¿ò¡çëàþ<ܳ?¸'O@š€4iÒ#@ÚPɦrM‘)<¤–ƒ¤·fC÷y¤–´½º€ÔmÅÞ$B¤º'pÓdèÞyIž(i›€ôcéz‘·Z¶Dë@«9=»ê̓sØ@±šæ¹˜q%àÙh W× n­¦‘s;(µ@¼kÍ1ä!ÆIîH¤d³Ä×ÊŸÌiÚ4·§Ígš£ ùGn§uÒÜ27uМyQJ ‡ÏBÇÅ hsØìªúˆ»jYФY=7EW…¥kž’“÷è ˆ3/|t{5@Ê %x86ùš阣_üo?áSÓs@ºþü‡†ž¯ƒ_}À=ûƒ{ò¤ H& =$\j¥k)¾H±I¿Òew@ZáCÒôãlu R¸šÎ¶¶™IÉ8s¯Û¤íw_ÓØJô¥kf· }ƒŠÕkjWÄÊ;·øØÏµ~kBã¢Õ–°ÐL¬ÜÅyJ£ÿlϬ©…vY‰l:H^°ŒRå,o}H1é¸Zˆ,lt1¡႞:±9N‘2|_¸E!÷ˆó¹ˆ Õ‹œiÁ-B{ôYu!#•ÅѬ6»Rð\ª§¿¸ûZµ÷á Rä5Xî87„ØF7à_oųKï¢ïoÎAz´—Ý1ô|üêîìÙÜ“' M@š€4é1 )$™éÔK»ôs@ò- I ƒ­ —:"µ¶vˆG:ÅõmìI²hd!$¹•,÷l33Iû§ÒøwH­§]¾¤û»Á‹Ós@zÙг5ðèîÙÜ“' M@š€4逴-ÜÄ å—iE6/ ‡¤Pìß)v@Ò¨gã ¤Ú‰›‘”îArèÛæé¯‡œäô ýd@º¾dTv씌PK3.ŧ˜-=“jFDWf•d¦çéI+á¶ef‹VËúný×âŽLG~"@Z£‡(…#@r"Gbƒ=h݆Ó$÷ kt«Ü‰BÀG›h¯ç¸ÂMQ$¼[ {b6‰E$}¸¡71Ay ÏEKÏ„T¡Tö¬|I_wia9t÷q€½ ö,Ÿ6êG©4ÔÃY=D4t•«ûî—ùßh©! %)^ŸœžÒ =[÷?à{ö÷ä H& M@z Htò¬®(:þ¨ii²ÚH©ÒÑÀ–´7'¡‘TPúÏÛÙH­HÐŽdÒ?H­,×òŒvóô2«¹ìi¦µèÂ~Í]‘“-íl8Å¥mè¥Üˆi7Û®áçå+ûÊM[¨)³j©…PR¦liâM‰ÉbËñÎN”‘8&§PÓÆUl´„¥VGëš|8.µ£Ð1ÿÇÞ™&Hj+Aø¿NH é8Ú¸ÿ^FdŠªÞÜÝ3c{æ™ÂîéUEQ}dFF–]°HnêZªœ™&ªPzã¹âýß’¾z‚¿~@$„n³2­JËÈP ¡n3ÇY&ªs ]­òsO´õúñäì#Ã#m»Èle¯Þі蕹ì£yÏ} Bg‘½J öI®èÜ¡?µ¿˜È'øÈ þ ½œ hé\ÐQWþn”$¸F” zôÁú·Ü#I›«]…ÕuÈ·ªªÜ;Ûç¢,/*=çÏó™lºRt£ÈHGÝJ)­mã8ßwAz>B3¼‡¸Üþ ­aO1zýÇ'æï:!ÿÌÞ¿>= ôµ Ú/Ü£{ ¿a g³fQ#\ì¦öâ"{ÖÛ¿…p_‰Dö§Á>lhõÖàí¯–ê¿XÚ¿Ò|ýŸBäó~Lúû ¨|‹lWêUÆ{a¹ügA$´É9äE©\ˆäÜ‹†¬5&§-ÙI©]BíhˆD@²mª@‚ö(S¤½î‹|®"íׯ泷ñù÷žæÉÿ=Žün½<ÔS-r¹ôDïÑ&@2ð¦—Ù©ShfkGßGÓT½¦ôA){‡Dæ½Ç#§§_îmEBX†å®§^Æãê3Mñ#úu —23s…¨æG·}¿úqPº$¬³÷!,3„õÛ¿Á÷åþ¥!%L­‘s0@Eþ é,vÆq½Óõi« â"ÂJBNGëÝËà†¯ÈDÊNDTûùó9Õûé¢GHëù’Û: ¤ç(èã…j`JEaŒ¸ÍS„Q+á­Ü›¼´~üžòèèŸèÛX{¹mœz‚ª,æ "ik¦wŸàë1­Oί4¯/ÈáCÒú€>ã™7¡¨Ïöè3âzÓz½Íãôå=z™Â&cFЧAV± ªRP@J‹ R‹Ù©¡¶lÁÌ";[×Ö ,ÙF6ÄÙ¨Zó‚EÿBƒ´oH?Az^Þ¼mŸÖóô~gªÿÉgí?7Ðó5¡Yn= Âméµ-ÂËjTŽEæm H‚CòsrPŸnŠXÊq ƒå·Q¤‡„Gc ¡m‚äAþ÷%"‚´ÂûúÃÇÅh>üù8j§Ú)¶.ûQX÷ö|uã© © /¦Cøž„rJï#ʨ©%á‹\ÑÓ$4UNaŸò׌¢ÅBÀKïrj £,H$ŒÅ&ºk«ÍË w6OÙRÕÖºpïAŽ_?—1àÀ!Óýpr'sÈK‘ÿ϶@‘•f__"õñ8U< ¡N}ùÚ³$ËÉZÆf¹Ì|ûÑãèˆÏ®Ù߯‘Ü>èõãõ¹÷fÞžœÓÈM#H‡•p|©y³®}F Ÿ,œ_I±=·dÿ)¶Oã5ŸíÑ'¼ ½Þæqúò½N±á8# ÞÀMoX î23Å–ÒaBíMþ 1‚´3v´^I¶fRm¤Àr(‘6ªC‚i§öh8ò‚Mò÷¹àïý×ô’Æw–¢ï.3wHû{et”iìz›½Á£ÒB”mÊ>óÂä°¢•M˜&×Ô‘ù9_Òè_Ø"Õ÷®Ž¥Ê#%ŒR|þéËHyI :|ì½ì̆>·£"$Ôì5ŸÞöy°l:Ÿ„V<íò„vDMøÆËŒÎ12D•¢>…Ð1_äê@N;4Hì¤Ò( Ú ˜îšxkÌÈí-Êÿà0!Çv°å›`S‹òõêV¸Mžqé¨÷û¼mœPdû¡®Oïê'à«ði£´¿÷„¼úÛúìŠømùîãÍ@¿èñU Ô -U!éš…['UžÀ©­Ÿ³¤äþyPÄõ!0½ášÏÆ/[=‚ôÉÒþýúÌ÷î…´þã½x_ÄôF£ÿV{ÿCn^×*ËŒZáÉ räUð¨Å¨@¶1ÅVàƒ4i³Rÿ HªD ×@Bi¿D†p íL¯±•íÒn@úwB؆•¸GYÔ„Ò°f¯°d9²Ñ¶ÈÄbÑ—ü»—.¼A\pF33 Ö><À¯nÀ„u@[âe)ÕÕL‹ëÓ:ȪQÐËÁ|÷²WŒ/9—E à_̤+¦Ïa@ÐØzGL|lÍwá‹K+p£›É.»½ÓR²ôØ¡€†SfœUÞ‡à‘øô«$¼{E>.CNAù3ßÑòd•áŠXgÎ[Ž™C‚Z«\ámÙ4–5èÏÙ~e^eg´¾Â† ~à#Û)ûÚ"/f‡ê~úíÿÉÇ=П9Ð HߤYm8 Ž ÞÇ‘ƒýßÒ3"}EÚYÅ&—øº1‚¤€´|HmR°J¶••l@¤F%Ò³\û #’öa û¶¯a}µ}?œb{ Ñ›·ík|óò³ödû?hÚB2"²uÔ^…ŽÅ=”$0‚@¤CF& 25ø_£6¾ 8i÷¬ÏªØeþKCI¨ ±•îdŸ­ð¢|ýùÚ+HÑ„jЙDf¾ÌâIó©,®ª¨Î:\},Ìf!˜>öŽœ\¨‹ J„ì ™°Ñ}?z£ R¤¼ê²—svàíö–›±E.”R³`ƒ?‡q8dLu$ׄÃHR.ÚV áÕÚv¸böÞK¤«ÌÁ¶«>t(ûÑ`@Щ]‡óÂ@Û*#·‘ÎuÞ_~ûÁãèˆoâÇÛ¾;À7¸æÝg|ç¶ûÕ½þ…×)6­j{Äq?àŸ<ÅÖÎéƒó!i}@ŸñÌ›„Ög{ôq]}´#õÅ=zbcëªJsê ‰Az]Ŧ¤7"mE$Ý„¾l^0YUH‡D&ºi#¢äC¾ Lߤ·3÷¤ŸHHAVb!YÄ·êå ò6W™F-¯yc»Ø&«üXj°ÂÚÅ;>¯8–!÷3 y‚È4›à½ëB/C£4ï?" ß0¹OÖ±Zú`´©Èä öyu,\ð²sÐQ¶&ª Aè’píX…®BÏ Vaþà‰¶ Ë„úUN@ªg}gŸæ=›^ˆžè3_äõl=õÕÉYMÔì¤Øz%ŽÁüixԇΣµQ0×Ðבּ.uo¾Cµ9FCJ°ÕÖËô>þ„ ytô3ým¤õÕíS@úæöžñÀm?î§õ)×<ò`ïÑã»/2f?î¥ú…R OŠÜ# "e–ùîf@BvDÚ“ŽPèŸý"Ù· $€Tä‹|Ô }µWõG‹iä(Z7¶c_B¾éÿd V´©¬’‚éó¼îyIxTù?ËG$ÛBf§.­ŽÍëÑ¢·Oðø@ZY$@Úa@ DàÑCwÿúQ„jIB ²×Z{ç!µg–¬yG.ýPÇáë‘›üQḂ1¢ÜOùjßzKƸjïª!ß;×Ú×ÇKãJíÅK{$fÐü¹"ðzªˆ–å—MX?¢­ÉN|`RZ¨[iÕÓºr«²×¥Ê9€S­º–|ê§ ´ïÒ=Ð=ÐÝ€tÕ 0Ð æ„TÞªØV±1Ñ¡4©ZÅ6cH!z¤tudÛŸŽä+¥¦ˆDƒH~¾†rÒÿÑ@š'K}4/+ó!éHhÔ„²õßÁX’LªÕ÷Ýa>ŽŸ=^ÒRké¬cCm×éè.Ô®_~Ï6$ö]˜íÔHÅÛÆZ®~¢3’mP3{'gBŽ!œØ‘CoùSFg„Ëä¼:„î†é+ÁeëUv‘{ ýÕ‹œÒ^öSyü gï¡ðăÝóm©Á¡oi+#DÖ9*§€ßÚ½œ¨U² o‡IioK;z¿éè诺é¤SýÏÑÇÒ—¶Öø BR$óÓÖ$›‹é… i !vtŽ6âQazm§îè`±dr _ÉG¶ùÇéÓ©ýËO¶ÿÄ@Sm#S©ÖŠ¥ì- C­JâH@¤nF D*VìH‘&ÓX.ĨÒ.ß÷ìÎÖXþ¿Þ€ôG¤pQÎU6/© ¯ÀËPТֺÔÔ¼Ðh»oƒµŽ,SNø"é@_[u^ÂTƒÍ•[MP{H±#‹|°¿í.ìÖÆùH&vvâŒ×°—š3áˆ4rÔ8T†µØÓP·ÅgŸÇ7Ç诳ñ@z7ÏÈ9œ"[KŒïÊóŽãR kÆŸvlêõýµ·§Þ½ H/¼¢~âñûNÈ¿u þCÝ€tÒ @ÚHñ¤åGõ% ±È¿ÅªUl(óÇÿÚ¬V·‰II`I¶ÊFµPT!­Œé–÷ã¤?z °ŠFö¬!Û;ZΣÀ+É”5·1v”Ö U™N™Yª…Ùr«ã|&­Ï/i…%¢àQ–å+€ttÔ!( ± lœÙ˜Äü¤˜‰ØúÉæH²CËæ” $ÚÐwWá¾ZååE“g¿ó„_¤q]ÞþÌI ¨ªÁ@ça{D­³Ÿƒ}t ½¾OûJ5Uòcwçþ‰Â¿ï„ü›ºé?3Ð H7 !/¢Å̵°†­2Ŷæ–cöy! ¥ÙjD~½Ç*x$ˆäÐÑ£ÝbHãj4¢˜”©7Z¯¶"(ëT%u‘Æn‘öŸ>Ð8ãhc®=¨ænÝ[»—ãk£i %öeÛò)¿…Y9œaÏWêØ^G<ç+â9e¬_¤…šIð€ÔMϬ¯ÿÊôtlî:Nß—ræ’‘`Ëòºžt—O6•ëuôÂ$Û»O÷ó[ÃS2³nê âjôåÊÅ•'ë'ÀQz¢ &±[DÚä%.£pKîüŠØë ßyBÞÝýŠn@ºÉ)¶Q+kØ*®?é¤I«Ø·ª€™öÎZ¶ç’g«­cK¬hÔ)$¡üÿÖ ýé ´-ë…½R}_Km~l®[Í=ŒÌ’§‹6 ¥çžS)%y×Ôˆè+²˜×¤À*¶½”šúø !,€1ì騛¿«7!­a:|"I–«[Š—9Œ~„ˆ"Á ©ç.Œµí#wÏöç°b€„.)»0N&Z/—G¨Œ‚¼üREœÀ'ø’AÞëŽ4 ì¨àäXÆx–ÿ(ýÎòèèW tÒ H¤0ŽÖöº–ò&‚T®2ÿ•&‘ƒQ¤ä¬È?Ý´µaí+ Sji¶Â¸Q§U¤šE7 ýÁYRjÔžÌ!mY‹BuEášL¾ž›L¡ƒ ¶„î59”Úwc ÷E6o#Hâ×4H¡±CœLó½xŠÄ_R@˜a¥},,ÄCåÛ`«…· b*ãÅrÓ@Ow"`¿0,'d–›˜@@Ú¬p¿Éé¸N£Ì޵¾/‚Am´Þ©–‡Ö¼×Ö–ZÛ& Üù(y»é«ýà±ú^Ú=ÐÇÝ€tÉ ¬Èe´¤×"í×>Hˆ"-ó¥ÙÍü´á…T®†#¤Yîß ’Iê¸Ò Hì@šY:ÆÚj=#bGq?jË}Cþl/“sJ±'/ˆd2Õ”ÑÖ¬Óë@_Qéã 0¬ŒxFH¦¿HCþ¨±!±[oèFû HCHÇã)2?Kî‚@!o²ã›ÌÔ¦©ÖN,÷Ï‚H€~œûùNÃÝ_q°Ë¨ ærÈ —š»3c†ø‘ P—£Êá_JNò?¬4{]ª0Ó™)¶¾>ÐÇÀýÍ~ðqô¯ tÒ HH¡5–ùozkƒ«a;^´A‚­ YmŠúð¶Ú«*6A#z")"¡éN•‰¶¦_Ý€ôǤ‡zë¹­Ìåt¡ãTÖÖ;š­µË*ˆ Þ‰i¡ì„R>ªÌY{¤jäÏ/©Z [È_I±µq¶Lý‘ZEö¾ÐòúaæH[0\Ùö~ÀÍ‚% ‰‰5…£ƒnQ¹‰8ååú¶ã®á|'Eø+4Hy”;zÏe9pÇ»17gCuÈ™ä ®ôXwª8líeŠí6ŠüÚ@7 ý'ºé¤€”H¡lHIV6íñh5¢€£È ‘vµ:¶Íì"WV²•×"m´³6-#=è²]ÙÂÖ¿Hß}ç?œ‘_¤¿ÿdû¿H™`’ÉÝ}ÙR/gß{ïÄ,5ˆl A’–%<"#ãLužlxŒë¼ü+§Ç £†Pl¤€”^8N¾7È!p_e‚£m@ZÏçŰWƒ–e{tt@vÒ)¼„!#ª{*t»\rÊjHá}¼ûU›NÚC'ŸöžÍúñýÇ$•fQàCéd›`ÔÛEgÜ3Ñöšêî ­{ ÿê@ß^E¾ H?L_¤Oðäs£È_HŸàÉÛþq@ª×`$£·€„Úß  e±gTîdYNöÝiÉͪØà¤I)R¤…þ‰µh•l•1¤ýðl1‚‡ûWÓ%%àÑ»¤þŒpe¡âZ{²ùÜÊÖboÃÓ)ôÐBAõÚ"ÓÇËÇvBÈLÝ3ªÑ›ÝLÿžùøè]zRª³µ ½òçX¾H;É mH±ª Šn!áôpfJc«5W™ûG.eMÊ#@’Vuv‚þ—}hiï%Øþ&@:^Òk$f ‡ cA7`¼Ì '±Ÿ–Ѩױ-ÛŽ¡l¯+ÚÞñºüèñ{NÈ{ { ~Ü€tÒ{€tÈJºÈ2ÿò@Ê/©3±–-ŦI¶ãØ©B‚i¡ÒƯ¡NÊ{@ 7 ýÁµÓ÷Ñö*˜ “lÏ‚=÷ØÓ ­ð>6¸öäx´ Œ¯‰åŒy-KMýPñ²b¿ e¼¿V_¿7bMÖ3ä(]iûÆÚ!€rò‡MÉsÆéO*ÎÃØ¶Üˆ|^I–ŒsþÝbª$œ#E¤Ë3v B½{Œ~þ¡€$—Xb½fË•ÇIÀ_•ÿ—~Ñó~˜»Õù¶´ìPÎÖóØFÿ‘P|¦«/œ¿ú¥ÝÝý&Ý€tÒ{€´£²¹ÅŠ õϯIHë“Ò@òÖnD#GPo'Æ’´éÈJÿìÀ¶;‹ÿ#Ý´n7 ý©éaô½5”ôÇÚÊšÏXLãÈ ¨tt_sÞÒ RŒ!mB(’¬m €´Ÿ³_ØçïÍTò¿å^‚@Lü õÓ· ÷ˆt-ò‡¤À¤?…Çô6ªk]©±±]–r‡e*½.‹êØ` åz ½g¼sŒ~̓€ÔÛ¨[Ç^ˆA¯»ÚN`:ÇÑ9‹GF ÞàV©DÚJr8Ékhkómëë€Oìn!¼o©l~Ç ytôn@z?‚´1‚tÐIû- E³‰|RF’Ä’¨A Ö“m±2ÿÃÐHÛÖzR`-›—ïWþ<a,óÏIû¤?a Æ…,®u×÷Pó?ê€5R:?Š iù•~6ÆZ¨w’™:Hh5ò9 õšåOJÞI¤ýì<íÊziô]]eç¡4Šu¯Èúsk½ì¬` lZ[ù2k“!Ïzö÷Ÿð—’¡fý{c§ÚÀ‚¯ƒ±¢“uksêYô(XË… —!´.²øûz´2¦)‘¶¸i Š}·wdð€G ÷Z Aêæò£„õš³†R•)î0ý义3QÛ\en5¹,/ öQbÂB¡v„_PHIæñ{yÕéo:ØÉ5ÝÕ3üÔæ´úC|žÔÎIÞƒ.§n©[ugÍCÁ¢¦-8˜Ê^÷ÆŽ·?lù;NÈ{ { _9ÐÛUcRÍã«oÒw×µ>ç®Ïî3‚úêö³\óDZ¿ Ò«-°Y­,1hnÉ EpÒn&KõW‘:4ÅM}¤-F kÏÕkŠG³‚M´‹ö_cÿº/á ã¤?t a•¶t~ì4£FWXvA£q¢uÊרDbj öBtÖ*.ÕŒ’ôÁZú¸iàÑOÏŽõ¯i€„Ò‘›ÒT!E¨¡õô5zù ™âköì RKê‘NÚg£ sk—“ÀÉ=@æ H$?¡!ú­<4?¨€„5íüÀä’ÐJvË™?½nlcDš¦@ÏA½8¥±Ëümy‘?[eª64¸§*¼Ž£eyªPr^wí ÅõØJH-÷äÍ«`KQ¯š»çž6mÿ–ƒÝ•FÑðn-¹½¾¤ƒI¾cÔ.?‡;AA ¡€T;ÊàÙŒ ¶#'iÇ|Öm° Þûî–_{üžòèè× tÒ H²ír‰ ç2ú}©íMéx$¸ UÞSÎ<´™f³.lØê“ RЂ~"’J´;Kû³,=ãH۾݀ôÇÔk‡{vY!Ê0„¬H¨ƒ_èµ,¥vvªôÒ5Gà8˜Êíe©£×aMìÏ‚29V‘%öÇ8 ’šLEÙ"z»òw«k½/‚/ZØ…_oõ°óù[ñG+˜LF? l>!7ß*š»uy%«³@˜ðæ;^‚R@Zy +ž;—ÑP“‰HW;ÿ–fµçyR”³x”Äð>£>pþâüC¼‘"á¾–ålïÕ—Žª~ÞîÀÖ²°Ì?ªæI?üø='ä=Ð=Яè¤L…Cá$oàQ;½eš,:^~Ôžœ´HCŠ®‰6¤Øö€TeC›Úùˆ¶í†I›Êµ/‘6ïÐ÷xÒ:P=SÍ0³–u»WÔ²%™2š•EË{|þ HQ#6Nµtœ—©!fËhÌÔUÉI°#-â ¹c婨Ù3kšÖNÆ8 ·ËêäwP›UO5Uª×ÜÐKA=C‡[ÓÁhWÏkI}9=’M£T”{ 2Wt2rAôH€^¨‚DºL¸!’„½§¡ºtÓÿœïÔÞýŠÊš pn6Xbš“öt„ZåæfÈ™[ âD1£3^ª<¾ù¦T¨ áé$çtqò*÷Ú#µµÊ?~Ç ytô+ºé$æŽ=;=»Ž¢jû!Òî\ã´† š ©ÂIûÑfdµ6#M>ŽK¬,é¶›`ÛbI,ð‚¤þЊ¬Ù±ìj4ÍXR“·ÔË´ü¨¾?XZM7F–è¡éµM&“u=xœ¦ânù$jç¶@^R«cèmëežfêæÖÖµõ‡åËäÉ]mmíM~¬¥eÏ3©ñØzC^Nö ì–Ø:}¤c?Š/­"lšHÌ"™ÆÔñ %x¦ÀëT—'3¢á.I•÷ßq°/@*§pM)å@ÊO€äGU.½EÞ€Ùú$ ¼µ-Õ3~´‚V3ôHÕÉñ<[z}ÿ²ëÑßñÒîî~ïn@º‰Ö1h6ÒÇÖ—ZJ{AÒæ Ád$ «µ‘œ5Ù.@êÄ£APB4iʶgªM‰eÿT$5BÒ Hê@ýLH¡¤(+òAÃføCtж§ºŠ´ýS, õòž“©¹“Þnö‹=wYÉ1î åùÛ„ᔵ‡¾÷­œŒó¤IÚ~ DV6FC‡±bçð3 ÉOej{ˆžäÿ!³} |:j“'kK;Ñ¡6oŽrªÎ×`Ô[Œ+}-¼/=ò@6/¼Si÷«©Ê19ª¤±÷6Ì7åTmÔa‚£w°G¢Mk3£lp_])õè›Õî}d8õ…Çï8!ïî~å@7 Ý€$›ÇÅ}ä¾ó·r†±ÍC¤­ŽM7Ú4"Rwr[£—UCi m«&I[ŽøW›J¸7¶Dú;鳩üÏŸlÿ/]ç9Þµ\w™!'²`u+¨¸GŽ€´So4«Ø4v´™ µ2·÷‹¦Ø’°6 ±$(¾Ñ= át´1‘væR}MµÈS ›Ð[ ³d"ïé£Ql¢%·K›Õ—ú* 6µVJÇZ­•ÞP ·÷ ‹*P‘s¬©8ÁöCöÂso*ñhjïXÏÆ^)pÚöÅ·0à$vž+O²ÆK‡>ʯxר—F“=óe¾Ñ2= µ…$ëˆòü¾ʈþr¿€ÞŠr,j¦à † ÒFˆiaw”qÒ=Ð=Ðg=Èæ«·ßÿ }Â?_÷wü”k~ôO1×üÀ@åÕö^E -µŠ5ìätÈv‡ŠÖÐÈšÈM¿RCi›¬A›m«¶«…y¤R¥`È´¿ÚT°Ý÷¿Å餿k €„ÀzZ‘ÔB@BÞÔËj¼3^äM¼¦âìpI´#'” “Ì¿èv Ú@܈٠ŒQñQVhŠ‘d«¹ÁF²÷¥¯-­c‘§+ô›<óê ²A<«ùVœSè} ©Æ2ÚXÛ’»5TC/¸ M9ÐJNÎ/ÔÕK»“ºìË`zmBRg4iÚ9±™Ž´ZoUö¬Ž,˜”xÒá8Õ_ñ®Ñ>\fö(²oJÐ:Ne½{Ã.Á{|ïí]mÈ÷‚œÉ±4^Z yE½_Ù\]ä¤\¬}Ü­Aººúd þã€4´òbò+‰7ÿ‡Ò,õošbKôÐ>Cz‚¤+¢4SmÓU{¦Úfü€$Û HÒ@O€ÔO_Š0Œ$ N]¸f£û$êårÓÞ_mß]à8 3v€Èˆ5©ƒ;àc$ô¢/EÈ}U‡ïi à#¤Ó{k¥°€ êoÂÌÑ}u¯[E?ÛQ× c ³ÁÖR+í «øsÞ+B0KE½Ý*ÃD8¡¦ÕÉn!{\ HªAêæyé­q3Rl™ÝR REAõ,x2¨ü¿æ]3@êgèŠïÇSkùPв=¤!Ñ®‘cÈo0˜W3J.š½ô¬ Nvso}<ÆþÁÇo3!ïîþÖn@úÒ1FO=ºRxíò®%&¡D»rËê¤ý$oÛÛ:öe;/ûH-üŸÿQ»´Y³Ú;ÅöG ô ª`ʨ'Œwdê4¡êaæë»u7fäM‰´^j$$Üv„"‘X;õDzėzä“Íb·¼ÑÞðl ]Úð<,*8Ï4b[é)p°(‘¤î˜GŠu•† [aø$ z2c…JÉÇ|ÞsË^rõÅgê²+Ùccg¦Ö4‚4ÌG{ ª4_H΂X;ûÌÁ*â ¤Å_q°ñ`E¿œþ—,¨×w2d‡å—*Ͼ Eî9²Âo¡eøyvF´lqò~ (Oóïîî>è¤ÿ8 íBFkE@¾SÒ ›ÈÄLÉÉ[m]ó!*§EÅQB™¿7@Zå³07öd3o–Kª= ¥þê´±3[Úþ¤ž)Ÿ¾®5ÔÞj«‚̧¬ÂÞò^@º:°Yd7ÖØ©G:àƒTéQ͆6eÀÈ2o|98X岟Û9üP!Q䉿´ÊpPSǼbñG4këË(ç"OÖ{h[A›·Òš ÓQ— kÓB@QpêH*/ê°ö’Yl]t2¿™ìÌžž—ž»Ÿ¬ÂSKóNd÷„C­ ü2@¢¯;K?‹ h¯«]x¦É+Êõê8*Tƒ¥z9wÚØÑÍÞHØw$9–”$Çh³oÝ>~› ytô·tÒÂHH ]B‘1aüH«µ»‰`õ¶{5£H$:i{¦Ô^’ÅŽ¾HïÒÊÞl7 ýa=Òq®u«±-‚¹¢X zêLô‰Ê;O€´šÒ´qšiä‹jÇÚ5a5çVG‡<¾@™Àȹ„Zûξ²ˆÍ`2Ë“Rê´qvæ²ÖîúÞ}G  l¨>€A|èKCþ^ï ¤…ÛJ¯oá( X¡³:{í$`Qšº»+½¦8¤.—ƒÒçÊDâg9È‹à˜•€Ô~Å»Ælš;“€¼°ÑÅóîôÇY¼uh²äÖ¦f™ð‡Üð Oûgî[$"¥ì­¶÷æÇvªÃå>~› ytô·tÒüÈ}c>€´ ­—Ïß”hÏ»é:é¸Z¼N±MÛÈJg¤×)¶Ù¼¶ÿ}eþ7 ý]=R:×ÒK«K­0Œ”Ó&ÍØè‚)¶ HšnÓ”ÛÂB0Ùœ´1Ç Wªyo {¯A·´ ÃA_| ì{)‚.ðAbaÜÆ4¤ËœÚ»lj™Ìi¥$çÁ!O6ò£?\HE€®q/“ÌàÄR:R×d²iŽf”iã„­1­¶˜ÄW½l¥ÊÁ@êçp1øï{¦9ö‰Þ3‹Ò:º£p?b¤v•ó×—‘÷âÛ¸”]o¹±ÆO˜Jöó`£ÖŽ|B$óŽ ÝÝ}2Ð Hÿq@ rÇéåÊÛd˨“a‰õöd„¬I…ÕV;E¤ôpÒ~%Ò&é¦)¶×"íg’l7 ýI=R@‚ô¥—£P²FbHÌ>å²µa!˜iÈΉ„ðË!ÓÆ\›–d¥Úú>Ðm=Ù«¯¬D3o‚H•f‘˜»‹’§™žÍ×6dj¯$(¼éZè¥1’~My!.!r±¦.#d*¼ÃÑ(; °9r:×m§ÅwÉzòÂü¢BáÃ=ÓKFë\è„z?áýÝ! AÏç‘à êò& ¼¹ÄM@I`QIînZ”ï­céGÆ[ÐE˜QÚ‰­äàØE¨×£ :Þ€ttôÙ@7 ýÇiµamúJ™~ÙD¦'mm52L‡”œ¥$ö×eþr9®r»°…m¡QäëÍ‹àQ¥ ó¿Ò¬ö`úýÏÚy ÁÅøRXØŸéFx Ñö,òZ­Ô+…Î ’6“ðh…›wt2vŒä­ä¶2&!o ¢HP~üÙhCi9Ó·ÍôÖ…€TÇáPqÀÆöÚhÓ¼œÚ×5ëTo1gR?òfè²—µ,©ËL^èê@¢©<å×Éu–dÓˆ*3„vû€}éh_[Nù“ +"•ÃD{¤jÒ)ç—ùg¯þ^ãÇ'@ôÒûô @©vá ,L"C«Õ´È¿Z£‘)BݘA¢aQŸíÅ6¨ieq#Ma6š~5;²íÇql¶!ÉVÿž*¶þÞHÂ%#pRù·pÊ4R5ˆ!0ã Vê°•.4guLµ³£Ü¹«â €T×Ò…MÊ€O4 Ò|]rÀ ž‰‚O‚£76“e™¿n@ºIi‘;ÎT7$$ØJŽVÃvp%Û¸ðl´­Q¤‚2ÿÄ^´ûÕ“ 5mƒ ¶fˆ” Høì¸i?VnËßé¤}Òß;I–þ¢MíêÃØò«Ñ~GO1#Õ9Ïü”š³#›£²§3bÉ>l¹É™ÂêMWó_ ‰Â3@ b™42õIv¡u' ‚ÜÖqVRæL<Ù¡NÚz,gbË7fЧ4[æ/ ©˜1äi©n6‘ú½Á$s%@š1DšPrW»ìzE¶æ„ðzßšìo‡£ã169D…}r mƒÃdCø¶×µm}ºZä{]N‚!¬¹µUNÞ½®N0ŽÀΕ"Ç 8‰v¹ˆ¾-–Åô0Ød$Ë#ª–çù[XÉv&m.oTsËó`xexD­pö81ºáÑK€²yôSýnŸú{ { _;Ð H7 É ­\Âå½P{ʆÌ–¬¼ï¼í×üÈFPjf—v&%ö'vcÓE$Ý´†íÑ‘m! ý;½Øn@ú¹ÇPYLCö+W,ïòF6ª—Ñßx·zøË~Ý©2ÂTLУbžÃqŽeÆ ™ÁŒ‰(«Ìeч¸iT°ÈêF$ŸPi†¶$ La®íd„6¼@Òqj’m‘ žù9"7‚¨SxcÝ~*ki9#Ú%Sz¥šnÇÔÖv"Ëel1SnúofvŽ3Ò„Ò¸”N¹ÒÃTJ5=Øy *ÓÅS®¬’íeTƒû6j•“Eö­æ*ß«‚›4Â^ô 8JŽyƒ¶ý¡¦\›²DêÊq”¼|Ä”CuÈ"޼Y*0±ÎnÁæh© ¹’×÷Æo6!ïî~ù@7 Ý€D‰v’Ÿ$^•Ÿlž«:/L¯T³Žj—ãä¿L±™êh<Å¢U°ífµ‚FÚf„xtÒŸ8R)›Ì%„Dí¯ÙÀC¶ƒx¤Óg±L7M’³G†€H»³pNb\² H’v”k‘<ã#‚ímCCyÊ‘à#8,f/¡y×7yšs q™/cµÏ1G¼ÌÝ£`¯6抑±[ë!¼v2ŠTˆø‚G¨«ëþ28Šœó‰X’Ø7î°ö(Ñ íkkÞêÖw!…3:ÖâOÍQ‘¯’œp­Ãa´½oôi ^U&¾È(/>fÏbÒ#dzqKzsÐÁ‡€vÈPSKÂ%Ž–ÊÖ7’#/Ã)ÔT?…’—KC¬(ÍèrÜ’¶¥“]_ؘE£pÚäWÏ/œ—º*ôîþ Ý€t’\¯sµ²‚-Q¢M@2“È`Æxë«û鳯Mi©CZ˜ž iyÿsbm¿*ØèƒtáQ¹éOˆ€$o#,¯|§c&öz,‚´1ûSmʰcÇ• :,hy”ú7Rª}øOw™³‘‹þ"H´Ô ¿Ð̓šŸ—ITëcäìˆ Ë9É2[ûHŒÛ`†øákaöî´ ½ç£îm- q>¸—ÎjàH1Ÿ·ü…|}†æµjë1V)•A¡:}H§Ú4eÔË"Œ,Ó¨ç¦q.9«VÁ£"ûºëXåtÝx 6öŠÞÐü$Â%JÕ€Q î ÏFÏÆÿ€4ÏdŸõxáQZIªÚOþuVŒW™u•S>Ò`gà S_åÈÁGbó†Æ¿ò/Ò—q¯ëž+Å:÷4›%A9ÑûVpD7Öèg*º¼“ƒŠhQаýÞØ2.Óïû4ŸËHTæÿ ÄëD©›S=<úÎpÒNw…Šny¦Ù60iL:J.½.u«;CÂh*s´¥e§GÓЖ*?óøÍfö=Ð=Ð|Ü€t%¤.ˆ¤€„^l;)qQ¤åjS‹ÕO.ÒŽ7°ÞHz;«UlZÜÿ(öß.@Z‰G/©¾H¯·q½e:;9 ½™Ú¿üdûÿhàñ†YÑJ+•ýå©I­2EU½3»±(š*aà­èÑc¶ @x=R¬k_‰FÁ §S†ÀWa/À² <­õ„DæŒL$Á¨÷vîî:p@­×ú » ³¢ànçTFñY6%v#ùDõ„Ü‹„šÊ°Uš˜Ú‚æh1'¤h¤7Jšè-õ¥ïc¥H›×¹Ø'<èÂï´y89ñ*N‚£ªx…u(zßÏ@ì^±Á1"õhJ@©Þ|·þ»Ó®`ufÖéMZO[u´eO[A¤ ” ôÜhf×åB²Õ ¨)y©Ý¡ÃŒ¼ÎýiNüPÊí7›Ù÷@ÿ™>¸Kþ…€ôÝýoÒg ç‡\ó1 }Æ;×@•Hñ˸æG7ã÷|> 7?Ï/7G«˜dF‘0‡i‚+…ñ£X¶<2Â>Ú‡Š5®äZµ´.ËÁ±|Ƴ0`kÈ•]ئûQ±úµh„Ú5ÆÐ`¤‘Ž=ìûo@úó’µÜ Y*i¯S¬uß0<Ò SžÙV%ÿÈNUÊv’ÅŠÊs¬Ï2m²öŸÝÑ íŒ†eÇÖ^kÊ µõÑУ î“Usy‚jHhi^OÏtN±1Nê4v¡¦œšÑÎ`i0,š.‰‘Êvgª£×€”Ls4Lßs¨œ‡¤×åüÁ3Õzèx¢^QO­ñ%M@z R7CËrzùq“;‡5 (^‹Ý™»ké…G”i m¶?èÇ›HjR6¸t8¾œùË…Ê1} «¼‹‚špF—íDÚõ$–7Lpl4wÈ[¸#ªäj”ò4ú~ÌŠxüf3ûè?3Ð Hÿ ½Â“?†Ü£ö‚ <šœiïôü‹¦³}$ºh¿$¡¼_»°e+ñŸåýuGã*ìŒeÒñ®Hû¤ß| @ HgYò $%V\51Ô€]ûoŒÐ~<)—YmÖàËêd¶Õ£ÒQ »7]³ö ËãÒ—‚Bö^Ö¾ U–¢5¤XJOãœ&ñZUOh~eúì%%ØÎk2;˜Ö9MÔÀ’¶ i8¬³žS[, k¤ZàÎ4ŽÞF¤ dS‘v=5ͦƌúñù¡ŽMh*²Œ­uôü…}eÒ‘¶lN>YbJ›)¡&!ª¥€¤ÂõÀÊ\!­í)<Ó–‰ Že´’PµUIß "Ò  Zb]à2. äUÈm1¤PWùluh©" 8=$ñ¸éè褾Hg¯ ]Gw&؆Òz5Ñ0@³›¦ž‰PT˜TÓÞk•±£©>òWS|^ÅwFSfxqš­Sd9ØšSY„‡ìýÒÓØØ‚­`Bî(‘?ÑdmÖy ‘áÌÝF„a#»µí¥« ÑÚQ´WAž£º~”ÅäÙ϶ˆ&5UÁs¿:S€j©å¥Çy¬·sfÞ¹™AR¢Æi4 ‚ÑJ/«SÞÏ ¨&ï0ôI „”[)‚l{ó½iSÞoBÞÝýè@7 Ý€ô@’õ#ö¥îrúpÕÚéO§>Úª·U!ɬãIjœí®úµ…Ê£L­z¬%~¶Ðí[d¼ˆt ƒ£J¡‡÷šÕÞ€ô›ô¤ä†g9:š¬t|žé5ø ‚ê…´rêtffo×(Ëo”å7Èß5'3¯Õˆt” Ä`­~æIåíh£¶’™­cÕØÊ¶”CAgê5Œõ¤W?ÿy@zÃ5; } ~œk>Ý£8ç“íHÔ‡Û»€„OHˆ¡}ƒ¯MîàO6Ù­ )™‹öòTÇVÄçæÌÿ×ï!XtÈ÷`ºÍÿBíõØ©:}è #Ÿ•§¤o =þpZÿ½üÓ‡;òsYÏÓ@ ~4mM?‹ýúcøóÏÿb~ðñs€DÑŒì?tõ³[dhg,©0vtЧyK×[ÌÄ[¼n‹áQaRg Á<"Hž[kÂ'Z½êÙˆ8Ú–hYÔ8Öxd†t?káônÃ÷PGÝëEýjòò½}45ü" m&ÖÁdÞA4H þ#K± ukÀvSû¨X[kÁ¦¢G’™©¢Oo-¾zÈ—-.?$ ¾Ì·_¥¶—I˜òìSÐn•ƒ-ð–y&ŒnEØ~óö¥XYš†é6+Êó¸kyw&0wT·O³HÚuB¤-;ZmPC G –e9v«ÜÉÔnl¸’7½s,­»¶ÉïËnž?%ÑþMfö=Ð` n@ú icôÜŽŠôÚÉVµÁ4HꂤnÓ éH»Òi€¤þÙJ¤Ì$n‹ ÒnJ$ !ɦx4Ÿ¯ø ý€¤h4›Cèm³–«‡M»~ëƒ:¨˜ñüxÉ[ï,:¿Áiœ³R]^ÉØ]MõNX\¤HùÚjBàã©¥ßzÕO™æåHÙ®ÑIDžÃódÒª‡c,Õ§bEîì°'žm5RÝz‹“e}c3 YâÙÛ,œZæq@-‚ÒjͪÌhŸÖ£“8ÐêLØÂ©ë)c0Á‘¦Iûívë·Ìì /úæ½ ž`ph_¤ÇWeô!X[cCC[ùó0²k>£r/X—kö°vµó²Mð%ß{ˆ´gÅ[ž"íÍúO«K’¤]>–êGgIZ± Ãq~Ôh­Ë­®µ¶ :AŽ~pÒ÷—÷_}ü3ûè?1Ð H7 } c=Ú¨µ4¦ç ˜5líóiCº¿HþG€©@Ú Q#“k+"UÒÄ#­mûŠ“ö'ÔcF¾DïqÕ»çÎÛsDól‘´QØÀýýÆ:ôòTb>‡s¸òÁ³šÛ󞟷Ûý…åÞoqAšâ´’Ý\ îÙU¸ÀS´Ö¨ë÷&Òî¦8RÁÎÃSûáÁ£¶ÏÅ¥N£ÅU©WAƒÎ¤­ sÆj¹Zù:57ìVâ­ÙYöÚá*JÂvLG¤Ô¬z¬Ú-ŒòHš'Coܽ,q5nMvk ÇéŽÓÒWWºX#H–1ÔX¤*Y÷W¼ä¨ªñZPb!Å6#GÚ/NöTÉ·Mî&ö:ü“d–õâêš´Û/ÝAx"%èþ´{ ;º¨8ó‡š3,Dºlh‡"ÂÝ]š0õ¹l¨YËkÙjåœÖ[=ì,ðó†½M0Ø)FGŠþ8B¦ý[Ìì{ ÿÀ@7 ý€ôj{;ÐOÒw·5Hˆgøsx)ªPù«È¿<ÒË–ìšr mæ=ø±[-[º©CÄÏ BÒ­½ˆ ¥_Aú'iÆÐß+œ«,dÁúunÐPÜiˆ:¥1ÏZäÜ£ru6ÔGŸõñþ´?ß>ý¿øø™š’§ Æp¥äBÓÇÅŒ!‹åš°ø.fÏc„eÙ¦ÑI¶˜Îl0ߨjd+{]jo¥¯r„6†è8eÇ^+k¸†,õu@ Æ\k¬³È“£ÑU7€R:·&G߈¿qorBVŠ‚ö1Ð~H«#a–ÏÞ(Z€×/@š&O4bEy›‘$t¿€7 ò;Pc¹œ±RµÛu4ŸÌؽÊÓ}íôÿâãçIkÎsí›+¨k_˜`ÓÞóT³pÑ­Tí–£ÝXÔ_Ío§pA…'­‘‡Hû(‹Ì@D_:2dœ›8 ôÓZ‡RfddcOûnù»•AÕZÇ.;@UÖê…^Úå {—9W‹g M´i3X¶.Ó0 M¾1ì°ê¯iÉZ±+¦C†`Xú¥F‘r«Q+´9vÙý+"íFo¤&û‹“qëGƒ×F†ok¥ I º:9ñTU­J÷žù…‘—’Õ·FëÙ†óUÏÞNçñ=EÇÃ6Ý d?SÓʵRFz¢›ç«þ«‡|³Ý58/´*“?Êi€»…<¾í¦ý[Ìì{ ÿÀ@7 ý€ô˸æÃ^Ïlë)·ZdqÚiÙéß÷Bƒd¹’GqÕd<Òë›’Fº’¿Êý5ÕÖŸÊþåžû$µØä“ÑB[«¹Ïou‘õ°Ô¥œÈ …M%1jàà:YŸr+m©h¥~ï¥åCK$Ae4YO:6 ˜pæß»Ž|ôP¤c6HpxqBÔ‰NËèMƒIÓè„„¨’ºŒ>$Úɰ 6’XAá«&ØPæ¿æÂNf¹öÚêÙªñ\HFúÖ²Öae«ÊJÊ7€ƒ|Z‹¯Ù!D'“kVi­&(ãÁvœ¿ó¡Ze-ò§êºQ²³S\gCŽñ£i±øpR@RÔ`FNäåµ ïJ—iq¶¥åŽßRl•0½3ï*T8*m펠ªò"db”Z\>hi€3påFï«3âì“‚Ž.‡þÄxŽ˜z6-3pä̲±…Ø5ˆ)wAö~>:ϾxµX*úR÷|fï‹ ÿÖñ­åç­Aºúmºé¤ï’—[Ö³X¹ zÂ½Õ =Zuj›ÿ$o*¤—"mM±Á"´ý^Žu?©FZ®rÅ#ÆþÌ^Òˆ­Uô¤ hÝ^ºü‹UkFè  áÀ³£õo%óœ®û¶À¹4øë±¥ÆÙ£°S¢_ ˜KÖÿ¶ÊA²õ.œdºïë:òÑ£W“³Þëæ²p‹†OÌ$ÒªÌ\1Ç™ÎQ§æ…ÎC ètÅ1èƒT´M‡€d©©- §’C:×| çÞb€Äðmå©’ÀUoNÞ*¼q ûé%0ËlW…ãdíyÓ†j³Q-ÅF<ªi±mj³˜þÒ–OWÅ…é5í#{Xh¬‘ÊÌ!Ñê8Ù>$}£çD¬”&ºÉ,«£‡A“2—‹Üª$¾Þ•ž–x¾œ§‰mtµ_bB×àÊRÜÊ K zÕË;}º1’SH@¦ª¹ßúêZÿr"òTbm]rmo3ÅöК¿rúëÇo0³ïþÝ€tÒw îy¹6Y¾Ñ•R‡­˜NÓÛ®—Œ¤ÚÝëñâò¦Ìõkžº#Ð8Vn¿‹XÒÛ2ÿÇ+y>–ñí÷ÿ»é ixÝð€%Ï.˯—C¥õè¹y–.eY«Ø©·%ÙíX³ìúÞ6Yí;”Ìp(÷òê6Öi•š™[óì6±Mþhc€BPª¡+},ˆÿâud>^ŸþZ¥Oè¡gîÙÓõhµ©Ò©~y|§3o•‰.‰FÊàÞaI§‚‡V<ÕW4/Ëz|„¢ i·Òöì1h¨äÙN'GNìM(ÏqšDãÜQ™zµ)—}s¹@I»¿6sH Ö6Õ#¨ÑÙ¨U”¥0ÂÕH^üÁ68½ªÂéÙ¤Ðé „((¨ cZò«ZåŽW€´]€­cÇqeÒÓlü®³o—)$7…O7y¶zÈ&„qÈ{wšÙô^àd_¶^!úJi¦®TÞ‹©(p€6à ×ÝÉþ ã>l½,}ëIŽ ;̦Âj¾ÆCŠVxÅ,$ùx$5ob§¶ÉlE‹„Ýè°5z”÷¿ê£ ²yÇY ãO>~ƒ¥öèOè¤þ@ÒfP #õ•å }HÍH‰Ë‰ÍjuÛ˜hk‚Høk˜DzÒΆµ¤CZ?‚]db‰ÿL±ý~€ÔŸ¦îW–Œu°Üo˜áxâêˆÕYŽ`A ¡ðv(ÃÊ卿êÐ0 O%ŠoÎТ¡­É‘ÇЫƒœµÖÖWªeûÓ™üSבWŸ‹ Yë°&/ý4~¤aÆlÊæÙß5ÛwЉ×2×뙯¢5;ŽÐŽ'd¸qÕÔ} ð0pdüÈkN–E Q%²ÉÑk¥9îEaH‹zÚ ¬zF]Ói€tØoí—;1<“€”ØÓÌk)0=šÔjwb¯à¢ƒ‡pqoKkð¨4aš.uÅðß±â¥Ë :eÝU™0Æq²›²Ç9ܶXü E‚0¯ôÜ·­åVE¢æoðW€Ô˜ÜÙ’6æ.öÖjº¼~ù­µ5×BÈ¿ +~øñ,µ÷@â@7 ý©€ô-¿# ušâj7OYŒ[—…­Ê’6EÚ¯i£x¤^k=œroíªª Ra²M)°ÑÈÊx’n©[Ñ¢ÎH¿ ½¨Ÿ³Ô¹ò®r¨J?*H ý Ä´ʧêh±ú¬ߨçªôÜQÂŽl°ÌRðUOšî]V;+,¬ƒÚi•¸v"³ýw$¬ÞCÖÇÚ…`ruÙËëíiµÚ\ejùÒó§”Ìž§[/0uÕ^œÍËP,o;K¡Í"”Ë~lx.ïšÓµþc…Eí`Ä@BêÎÐìñ¬5mu+]'w¤åŠ íÌkÇ×ÃöXEÚÆþáb¨dê§!3¡nÖÙÚ½^(m2Zë}^©½¤÷/Ûó¡sîèÚ;ngÕ|lËkÊÖ‰-ÈëõÀô>i˜;Â:«–ç %§M ¯ª;@zX,È0Ô—C4ßà“D‘öÃíqt½| $si§kmà òÓß`©½úºéO¤WÛïHÔ3~ ’Üz ØL@’6ÑMW»ì´$ÚÚÌø¶ÈD[d«‘Eð¨R¶8ÒB8R’Rþ=RlošÆê{„n^²V÷µîìÆ2Xàî™Êiµœá ½³Fm66]I›aöàèlá‚Õéd'Ð!¯ù Sá~ÀˆKlëû(ö*Þé ø“ŸI±á- }´\·œÝóež -ø’&G?áJ³Ó´}¶Îlμ#ѳD½¤Ò…i6áƒ]®AGÔ«Â5›ê,úVa–Vkž|@l„­mƆjò"mÏïEn˜òËüùf_u8Í!ï@Òà’¦×fr-hL•ûËÒ<ó,@ˆÇÕMà:îN@Ðñ4=uÎ÷3´Þ´–;î7RlÑÕ=aoÕE=§Z{ì‹ß+ª´Ð:Ó³Â.0‚¤mF<oË%3@*Wo”È)‰>zY˜½ŽB@z†¶é`ú<)Ý:’ëHÒçó§¿ÁR{ô'tÒ H ­7Õp¦C[ò HI~·qå“b£=^7±öUö온lV;ãGDJ,ög/6A¨vìÔ={ óÕ>~@zóþ¤& ‰uU–­Ñ˜#2§Xtd¬O•¶ŒV=`VH.‹¿z#j+ XEF`?Ý´=+:nÑöfƒò öH׃qÝο=kÿö ÒÛ'L8B‰GÙ=lhŠfF땉ªHä0«õ STé  D´Rîv³qGÞ2dѯ>F  j¯ÈÔ$L°‹EtABD'˜®”Ñ™ªèñ¼-í5@ЛÈ.ð’f»{$oqÒiŒkwWk‘h€4¬ /24¸]F‘'#HËÁŠPF®¡¶ÚÑOBswqîK zlÓ–Q‹ð¹o2D¯ì—N”4cq¥SYTiÿJ‘9‚›À7¬°a¡I@j„Í%&¾,u/èF£Hy"<üèbe*î’¯;ÃÍæÌÝ–õxcg 7–-ìÿÑ ytôô¸éO¤çº²§•öw¤(+r±Î“›,Q¡ú'@ʯÉVÀiY§yž»äHªARHÒ-–Â~ "ŸÈWðD*–T{ôfCéw¤Ì½É¡C„êRPï³s5\©2ªv?¾óc¸I+ºdÝw8vl¬ª-)´0+ÐeüÀ¨Ž=²v…‚¦Mio^s9,žkz²ý€”Ï]Xhc© V0?U=™ÕÐcÊ`¦V-šxzÔA0‘‰Ti¾ˆúÿ‘=ü¹[€@£G¦É±‰ô=Ê&*ê€DQÅF±;UR_Utð“”É8ÔehÁ8T3îí¡’&îã~ÑÐ+@z4z= Šö©-gu˜Êy—³¦ñ½[Pi_G_œbÿð?ÑÆ5E{€"xt¡ñÄ;èÔáÊ)çñj/J^EÛzî{•çMµ  Kc+‘•ççÉ}Yjû4iS Ò, M¦BÚr•¹÷°‰ç#tÙ/R/¶ŸèwŒê`ÜqÒ=п6Ð H* =-õ¿# UÂÑÁkr{Ûêf‹4©¼¤axôðÓæZ宨€F>THKJEmG€hû)~”ùùtÒŽûþ[R5DŠCîæeuh%h_YP–·W:ûœ\pVV|[Ôˆ+”’ŸšbÛ¨ŠMæƒÌ*(¨@ÊTÖRh±™¨Éˆ¡Èjµ_kïÆ=ú× «w=C‡ƒsE©°Û‡‰F4ÝŠFò k¹ás‘•_­Ó`T>19KÝ-¦—tlÔ§­lö¶1%d=ß.+Lüî˜êЉ;SPkÛ6$€G‚#ÐqRÑÓ>:(ÊQœ3ýœR4É‘|×]ñoŽH3†ôìŠøNêÇv¦Ø‚°ÛÉ‚ÆÖ ˆ>$ÁŸg!mKëå—êa‰2GFk" ô6ž}8È­ >•z•‘5‡º (UââItl´tÂaÆ+è|&‰Óñ°>xÕ €)LÔ$Û³i¶nÔ;ø*V‡¶-çCÓ¿sBÞÝ==n@ºéo¤Ìk tÑ'¶Ð«RþºmÏxôâ6ûQÅÆõÇRm}*…Ù>Ú'%ÚÉ>B¨´ï~_vö”Ð ÕÃûàmüàç·í1¿êÓ¯=¶Âé®—øfǹžj„(GÅÙ·#š?4Ï¿Ì,XNd8Ø.7æÆÏW¢•«” €S쎚µSùˇyÈ1‚5ÍŒ™¡«ÌÙe¦À¥<:VÎs•]1Ó±yý„ûÌω´!åI2Ûdi†þ<˜z€,T¢5¶œé„äÊï@ÅÝø©U‹lDÇu4§Žœ´[ÄCûQ•dÿfÚ0îr”°ø³*K«É^ôÛÔã'Ó­ÿOµæ± ¶óèKF)[’MM‚üGš<€nî3Š™¦IŽÛ³`&ᨗ‡IœªKlk3ÅVmbé!}`¿NÎ.ó+ÖÆ&»+ÚÖ|mé½ÃK+·ÚŠü· Õˆâ‘ƒRÆ*Ô”`©•Ü£²·èÃf8JB¢ƒe³Þ““¶wªH{c#¼*»}šýÖÕhùšeŽ `íl,[+#ºZúy¤ßa©½úúŒo>ÙÜùRí÷¶!çg·˜_æš¶Wõ^?†_Ä5?È7ŸsÍcU}|õ—½å—¿¤Çw?(óÿlû^Ðk@údsŒEó%Z„ŠùûȪÖ+3HZÁíyQíiYõæÛÙr˜P[£FH®5~–4 "iù$ÑF?¢Ia_Hz‹ xÏTß¼ß$ü\Û}ô§£nÓÙ!ÚdY•;u–÷%pŒ5Þò²¸l—f•χYkûÎ…·@¤mªm†š6®Û•‹ÕÆ*Ø2Xw=蘄¥6u4yÛÑåjfóó9òþ©ÿí Òg×OP5€Ha $d W^ïô¤ž›:c!B´2†D;Q‹*õ+Θk@:Aéj˜ßÑ´j„·OÏ ‘}!×T/=°Ýº£9 ð,Œh±S«šxyp7Nà~c–CÓéÔÕK›ÕzÖ€îM²f°ýJ6÷w©å.¯ì„›vˆ£½ iêt|ù•ïÈpCø_éž=zm‚Eô<àKþsWNRئÆ䯦Vع¯ðÏ•eP j;”ý¤YBØy\Ul¸ì`k “|/ß|},ãRolf«]pêHŽ}uîÒ=Яè¤~K@Ú š$ HRY¿®éŒ>ó'¤jnjµÔ'˜–dcô Š€HÕ>óHªQ¨í ’+ñGðŠ$þ+€´ñî5jFæL¯ŽæÇó`þÞ§Äiþ‹ïlªÍ»ñƒû´­vÚC!~¤ý«Vòãnž;}F6³ÎTípI«VU&ÚV ­ô/ܸ\­&áÞ¬#GeÅ5Úžæ±tßй­#ò¦j–ÇKyïìüöé³Ç[@Òiè¸ØEU;±B-‰fT+–'_ÌrÿƒA™`²hnG#‡¬Ž5Pªäë“_W¦‰bZiÙƒÃMqSâeê8ˬ9µxÈåäÛC Ò„"³"hH‰¤¯¹(•6)Úz÷¤3OenÑ4æå9,_¥õlt³’y+ï]oç6'äÄ¡òb2Êçc´Z`^IÍ_¡¤ô,%+—-ª”rv0ÕC[ UæÇŠ55È<ÅS/ß5h$o{l¯!Öö/©™Ê)¶,";/ûmD6 ,ü2×Ña·|Ì~BÞý_tÒ H¿ ª\ÖQäNtcÛØ…eþÙêØêæ6Ó-rTmiHZhóî³›R¶ÏÔFÇ‚nlê‚d€Ô <ÚéÕà¨pÖ"Ñå”Ù9¯÷QœÜ/£Ýìq¦*]³½š(£ ­$m¶3̱±Äv¹‹«¹«ÇÏJ«>mÍ)qÖÆw¦Ü!)Ó©”½.'UæPÆŠÎmޱµçö‡¯#_ýÕ×gw=µÑx-ÔÈ-‰ëòP¤ˆh±éR,[Ö(ŽOE³¬…8¿‰¤èd¡¤JæäÎxÈp­ÞØTDM×ËÈ_ºø€ôèÏ 9¹LyKòfcYÍ";›jê4G¤uÜlV›.£¤d¾Ý»Ù<¢ˆ>… ð+M…öÜiÖ«ïÛèŽñÐyqœÙÜÇ-¼?Y9›d䥶¾Õµ4Ù[À[Õ:Q ךIkÝté¡íµôÞ¡ÕÒ„#9‹þPð0˜ l€dF‘Ï€´Ó¥Ô[/¶—±#6Ò]ž, Æ'À·Ó»ÞØrù®÷@ÿ¥¾}=úå€ôÁ蘭¤Ïùæ·¤ý$ Zð~fk1T ¡H Á’|õb{dŠu¿â¶cà‘Py”ù›zûlS«ÛàÖ¹A›´ï‡ RlBi% á¨_~…HïÒ'oÛçó 0T…E?Ø*à!ù@r×`÷·É$÷}•ULË–êÜ]ÖÃhíÕu¥Ü¨=ŠW¡¹~ÝÕ¤Â_ú]¿=™"’J~‘ó8ÊZ`RœêVbHr¯.éI±Íí$´è‚P{© È9FÒ…9ZÞ¥a°`ºþ“_{xô3õЏl"µWœ´=clJUö&GoPݽ§…€Ï£•?é<¢ãIÝeoŒ»ì'WÛ§ \<8Ä¢§ÙÂÏD[¶7¨S0ê®TßôÑV8ñ&Øn×ËX鮦ԌþiCXc!ÚèØm·]xô¨ ÓxR[mrK2ˆš0?JJeˆÔô4“3+Q6•üÕrô"³5£§Ú¥7Œ`‘H[ ½WEÎ3Ú–O‡‚tRȾ,5žI[î„!/O„'‹¸o`•[£Œ;) •î~ôqÒ H¿/ H*Îh¥” ù_%ÃDY·Î[6¯¿t€wŠF¦,Qn5'm´AÄh£—öŒ¡À…ÿ«|vʱÑ9™Õ›R"¤¯ííkž¿1YžG;¿úÃßFm‡Šüc vT[“_¤¤VW—‚ž£½-uÍ).ÐôÍ£ ¹T¬†Z%VS!)OÎÌú†•û#²¶’6ùÕÝ"ƒ\±:ë¢ã²RÖµòq øék®ë3žù`ûúéÿúdLüÙž&¢Í\§T1ÑoP·G`‰5ÇC•Ö;?f÷ì÷ý¾cP.SCŠ;­]†gPgAG‹õká}Ÿž ss`!à`מvŠê¶ÔE£²A¾ZˆgÅ_|r»¨ÀZoúíÃÞ£d®¨úÌ´ÞbCTÚ}FÜiÈAɀ܆j‚þÇ9‹äÓÛI9|-¨Õgq—A²LÁùž¦mÅYCUQ;ÜŽ`Ú&Óì|ãëÖj¬&§+¿{¦Ø¼¥äˆGû©Ë•Ó¤S‹Ufž¬bƒ{¾ÝYžbíÇX…ÅÐ^$³ñ ~~ÊÏ*œNÏ;ÅvôC7×£~ú yÒGUj¯ñ䤃€d¥þð*®°ÓFSúJ@bC kµ¾˜©Ì´CÖKnÐÛ¢Ý4ŠìO€½j׆:#ICI€%ÿP¡– J¤S %Κd‹HéÍ«{Þ¼Ù8V„|½¶ôæ?æÜdÙ2¼:¸ã&âÃ6¬µg3x+=‘v½­uôUÓ‡½(-¿{¹ýí€4Éìãp”䊗££‹{QDd¾igFQ?ÏVøu0A @YM®žüÌYëWPSgq@:€È+s¦Á²ÒG{% h¹ËMª­&²øC3o½Yö(ÁÐà¬h‘¬Î¾0tw0;<Œu²SÁ³iœš•'$˧V3M¥Ó¥=z³)"íl=’ËÖV¸)¢6 SqG³ŽÎIÉ÷q$¡›ƒñ#$(,‚”òµça8ÈÑI]YwÆÖzñ=@1-‡h‘¹Qå¬ÛÒÌi6ÞÒ4œJ¿V‹{YaÇP“·TñIÓ ! Ü.@Òhü¿HÅ[n£{9½ë£Ëïlò[KoNë6o@ºú±Ç H7 ý®€” "eÚ+›¦&»ûÝØ¤^׌Yˆfm´’ÅõtŒ¦=dy´ªµRc‚M#Hj©%þ™‰¶€V#r…îrá=ždÚ/cD¯^óP£åýRKËE Å79º÷ßFZÛ/hŸ^#íFÑvÅÉK‘ï*Êv ž¢7™”7@JŒˆ¨ð£˜ØƒŠv¦yg‰¡“¿ ë¤Ê`Š|Æe,™é!£Kr;ŸØçÙt0YÊ@YÙšc½g@z=þv@‚Ñ2‚ qx9|IˆŽRmXfîpkD®PSY¤†Äi¯Ø-Hä ¨v“ïŽ\’˜fDgz|Žu™vRGÄ› Ø$_yÎÆ ¾¡ž+=‰Šèí^Ÿl@ ˜Ž§¼)H€WÅA‰jDE# ­ãßøÔ›vQÉÜÑhqÔ“ç‚·’·2cZ_Ayê*”Hm‹#ø'ÚEÈmÈho) eƾd¿,ž´}šö·c)Ÿ£·‘g®¬µŽ[á—ŒZÀZáGoÓî´J¶pÒ¦"¹éfæ8Ù¼…+OŠ ÑÊ.×Àúuº@XµÈ)[ \Ø[ËJeÈýÄ=¸¾Žpþt«Úßj;úºé¤?䯶7Y V:+ÑJ—’R´ žwjCži½ŒŽ,¹&@tÈ-ùB@Ò¾kZÞç#¿oò/¾ûºoÃè#þ¨dKü71 ¯ä„:ù ú ¹LWöK LclÐ1!µ }(Ai˜é8Û™m ŧb¢'¢%¹UeɃÍ>‚¦vÞ×G†.6.¼Ù jÆB½ø"Å(+×Lܶ'F’è‹Ä¢!¢Qb6NÖ6ó@’Õ‰‹«Ö¢G–fC̃’"Íx  ê®¶ e©¾e@ä8W¾(dF *´ìíÜ  æÌM,°)PáâQ&~0ž®'Z¤B™aß™ý)&5»ç6¶šóêh›… ò‚Á”Eê)®î˜ñ©[z„Ù3•›Hþ )1•,’TÌ‹ᓜ0‡pªÚ¢áÈfÕüý”)6Ë5í”65Ó «5œåýÇUšv\Ž^u*™óÌÖ¤§êó½©ÏÓõçѺ–#­H 4Øi›ë«áW™™Â¬bçiá„ £´eƇ‡õõö²†M’ä.™ø‚‚9ùI(Íhì[ji¶Ó-”±ë‹îæ[/ÿû†Þ7úºJ,̧£Ü¿Ëû?øãêžÙš¹·UNÒÆâÄS® £Ê}DóÚlÎuå½ÛIû?:ÐkÜxýø2×|Â+/ä/øçû\óïãßB¾!­¢×üóu[Æ×ôðm@zu÷¦|Ÿk>è5Ï|¶}ºGߤ|ý슲¨-îΕuÒ8ûÀÅV–ãúgìVJ]mŸµŒLvÔÓiC õk‡ü_øÙ®âìceªmòWÍZfZ-ìúD¥ÕAï‰%ß“eö+*¤˜-v½}:«Ì„î¨WEÍY'ŠÏ|— {ïC^o‰_—ÄÍè©ÁÙ†odÓauG ÈÁeÜ3¦v+3MŠji± #H*]¼äóeþ³mXª–¬W ¬èj­-Qµ²-Z5ÚWìla‹µ©C² ÉÇ‚†¹#@Ÿ;Ö>äeV9¯å^‹o‡{`•ŒdÛË‚ò¢b3ÆxúãÑy\ª}¥W‡i—95ųt½ÄžµÊÞ9="æ~ÙMÆ4ÉF$ЦìQ—Âg=µ6—OÔiü@˜ÅÏ<1Ýó ¦ØRh­^S¾=U±mÎeьˣU(;<ü¾g”U‰ÿÒbï³ÑÅÙc7Yfuâ™Iª99ìOU"I¡~ªÈYakä(Ö¾È{ƒ[€nyíÄ;¢þX(ÒnTr­&R›ÝLV+0WVU#¹z ëÕBÉLˆ /¤„ñàžT{¹ñj3Ýiínï ”åCw¤¿D,0'W /çÓÑK…âe8ƒj7å$“Ñ#¯çzºé¿<Ð H7 ý¿Rz¤•1¤^sÙЪ–5E•¶f'£Ukê ^R7@ŠHpI$ÁûHPiWcÚvµª­O°t [‡Ûq¡ÒÎTÛµŒì´¯;øÝÀW¡Ñ’•–EòW(Aî¡ûްí€qß„'•ßZ˜hg¾béT´ãWZuá‚#XâÒ lv1³¢t­…³zúà ¹rb5Ò¦]…zõƒDF-8òÒɦK„L§36‚°K L;˜ÛÎàŸbm¯ôîSDB—ø*kÝêÚÚ‚lk[ÚÖÖ* 9ïça°¸×ÖB_齓|v{£×‘ädÍ=ŒMý4‹2›Í=_/ôŒìH¯ »’ꨭcivì² £k„{tY׸çq£tA—Ù-õQ•¯_ÔŽ&š€š•¯x#n ày¦®:¥ë ò¡[ÝB}xb‡¶Äã°:÷„ÝÅäßÄ}ÙML•Ø•)›Ùâiê©ÎL~z;Z놲‘Š“uÚ}¤`œ5 ¹Õ ê4ƒUÙoǶè›ïÈ(\“„ÝW9–òBþÜr9 ã(õW€q·ÒnáÛÝ‘ëà¶)\æÃ7<¤ÂâÐNw-ä U^U/;ª`Á±¤2íÙŽe"R7—Ë£ì0ÔÔÖ²Üà–ci+äâ¤]•qð×Rj Á7òvÒþÏtÒ HÿŸ€t\€„ФóÜFížv¾'…7ƒ’ˆÝ©Û]ó1«×¬Å–Re3‰ó…Ò$¯€‘öUêoÅþÇrucÃzb‡¬¢Ë4ò±YðÇ_åÿžq¢Œ˜“È1„Ö PWãžv•ƒ0\iòæV¹ìG’B oëšž:˜T‹}k©2ÐuÈžœ\E3 {¼³NkÃ:ÕÇ'“C-nâÍ<|òÓOW¡ƒÖƒXU³ãñcOT¦&ÅØNнYðl{М”O!ŸlD²1‚䡊Â#٠̪Ê" oA¡M_Ðãµ …®ršŽQ‰žÇmé²Ð!U×o’‰´ðˆø§XQ1TzØôàL™íÛË9ãJäÕª€ ÝÖTH'qŠu´¿±Å‡6mfÖá362“lfåžr>›Ì!­Û(UG64Qæ‘(Iv2@^`¸µ"8³+F!ïj“×yÔÝ—3ÂPv¬eÐ…ÀTØ`wXåÁ|ï¶«oÜÐͱæ Ó²r³Z:U=ZîóCšNÕ*Ú®„½Y®Ç졦;_Jc£†"äŠSŽVá‡uÁÝ6qúÍ"R§;ŠŒvZs©K-u•w!Y`ì`oºÓiÝLçmÍŒÓw"Yo¯ˆDë-hË[or·pB)5ºL’}àÎ?CÎ7 Šó2‘HE~é§ãG¿çâôÿüÂêün@ú @²ï<ÐÒà bž]‹³² 5Y˜V"RUÙW×Õ\L@j£7ÚùI…¤¤õXØbˆ´Y£‘•–‘´”…¶Q‘t šÍ9ÖÉ”.×evØ(‚KšHŠÐoœ‹ìbc”(ËÏ‹,\µAW]eAYôIC ³ÍÉÚ²`Xe@*˜8gç BçÚZd-YÐ"úµï±ÀG âÁófåüåJÆl—[¶Z †)Í’¯±¢jEGZ¦0äfOŸÈ®Àœv*ŠÓ@þÔ2½Ëc|¿Ê§ów&ÞzF1-¿ÛeB`:;M䮥å n>­¬r/µ®•á)yûÇÖì{ p ×0ðf ×¨óÍÜ€tÒß HWñÙKàù @  àR¸È‚§Ý2 Õf–™«±oxêúùB¤­R gYˆB@ª¦?Ò q£u&Õh @Z ’PÃÚÖôb“EwÈ]é&ÿ¯Õ×€ÚeÙ›½–††dI¾³ðw<Ò'ü<•…wߺ&A:$KioHÃ@ͼQ¿\åãF—eÈë=Qÿs©Á!pÊ>Lž¢µÞj;Í#M·,cqõ;Ñð¤P[•ÖÈ¡m\ÃV‹5­>ÒèÐ6»¶ÒîP •ô—CŒ–™ Ä23B‘{¡ÌI§c£\OEH¢0úd_ O6ÝGl©»Òû§XÇ]EÙkL¤”¡¨ƒ©È ‡w•WQ¨"^ÇÒ‡ ÜÆË=#.wÖ;.ò ò ÀUl)«[Hn3/¨“ÌŒ¡¢kÈœS$¢Á7MÈEGL­°Çda•mSmÙ/<A_¼{§ ŵ˜%ÆNípÜœÉûóuFÄKæYíˆ,ë2š\N3úÁ2\Zž*4.X; Fü´t~§\§rÎ<içKØ.IO5Gm;CDN^B»<ƽuH™¬ÝÚ¸%t5–»„êÈnÝáè=&oe–œ­×/%€,ä7ãvxZ28v^Ææ§I¾gMs‚U,l(Ÿ”sM˜HÞƒ“z¿ulõ¤Êl@s.oÍ@Ò·¨F×Ú@\ö\³ïþÁn@ºé? Hþ¤ ó*ñfúdý2hSÛX^¤Ö>BŸ`u4ƒŽÍ1oT™Z«üVdÝÚÁ8¬"Ust¾ˆ&‘ÌIEÛUiC·\Ù"}WF)D M–ÄŠ¶Š;䲌ؑü”ˆ„€ÃÊÅý-”½)6_寷UæVÐ-dk¥Á;ÈÊåGÖ€¶åÎV*™FË A·ëŒì±:¾ðýÉ„xRæz©E¶9ë$~7Òöh‰«ëŽÔÈaHtØ¿·(Ò\ð«€ò¬6êÅŠ\AWê’`V#€Ôõ>ŸA´m£áŽÐŽFVÆsNÚLï©:W+³(P¡ÂÙ;š²À.4ºS²ÑohKÓÕ.ÿƒO}Í-3Ú,À¤IY—¹ÔN­—ÖAËCYNÊ]ÎAÝTôX‹‰X´´ËpAÊ €"ºð”Ї˜i>P™&á1 <ˆÑòEEPiÑð̤3¬RåØá1(iŠ§É¿‹Ì•ÎVÄ1¯Ž‘#ÕœïŒ~LælÖóÌÛòxu Ðm–Ђé³gÑÌ£n§xÈ,ÔTV¢iäžéÐ%¿ -ožµÏ'“¢‘šH¤s9Óè5å6«HÈùªj[ß¾ïÄruæÐ^Åž/I5?³gÊv58kÌŸyUnçâ bT²2î§¿˜®tcÔ|Ý/WÓ€ãÏKåfûÜhYÜnÝ¡«“P•Û9µS„&¶I´*»9ywwê``,¤ñpË ÂËA#µº«ã"´€qž4w÷N€U$ÎkÑú¡š¶?™"¾0Ðû\ðÑc|´øÿìã Ž|ð O¸¢~hŽ>Å‘Ç0ïýÁö1Ž|‚_è«O`ÛÏs͇}sæ}ß«¾‚G‰#ߤžàÇé¾¼¤µLšŸëO¬óâ ï^üéÛí 0éÚf«¤>BC8%þ ÃÐ/™…M»Ššý“ø&CnŒR\¡«]‘«U°J´*¤]®áˆ«iCäh<ã4Ht¨L\S*3@ÀŸFé5¾‹Â&•a/D£u[ò¢ÕtºÓ_‘m°T¨Ó(–ð ;%Yèe¿£–šàQ“Áí¦}6N;,\´391`§§9°i 8ýöºyfËhUÐ röaaÍäëÕ]Q] ÇÍir·$Æ­ü•çaXå2 Òî«‹³öõQÙÁ\ OúDÊ}©ia_øJ}’|‚Ù$ž&ò©jtÊ• 'ÙøŽÊáôÿ(ßÙˆOõ&ÿ& ð[)÷ThI ¤µÑ Á?åšiö‘ݬ•_»-Sݬl‘ùÙ16Óù"…X—øÆ6ºB$€KhÛ8÷çÈ~lO§ÿ¼Š<Î×§{fêhuxöØ—èE_Ç€¡ò©m¶l»jå'×KPéIq¹MX‡r? Ùêµso²p×ýÆÍk»z›¨åfº·ÍY@ð°ÞÐà Dh×l‡ˆÎ¶Ÿ±ÄTEU—A€(n´Y›ey>•Ñ DÃTIq¢~9\%£v#1ˆw^\Í࣓÷©Îö´þÐã÷䚟ü%Ž|ò‡¿ ©eì°àÊé9ôúë¾H_üÜ€ô7R“•-Ü¥¿$Õ®>i5ýÌb—àæx}.¦Æ) Óybû²±äÿÐĵIéjŠK´áƒuíå@…®Ê9ÔçP/^ª‘RÒz®NL`©²³*X±x“>rÉÇ"ÖE¶Xzö×­útxŠúñªr—Ñõ\LeÇÊÝ2æ½l%ã7¬V*_/Žˆ¤wþ§õÆ:ìŽÿ«j»ÊÀ° [tËtIHú±Ã÷!Ú/ª2¸ëK¦RdeeüÁ.rƒ !UüìScåÎÐV#W‚%dU “-nÇܨDC'¸%W ôR[A] ª(-£ŠÝн5Y¸—Ç%Ç^¯–eqwY¬kNÊqÎ ªÊ¡)Ï â—JivU¾-ì—z°X¦iøËs©º'++Ñ+¥K‹‰³¦*V+ ‚©°ýå«CŠ,i•©'6¯ÉðäO“I0ŸÇ‰Åç{Mëi›ž*žtN, Ò£ÕíXù*LÙ/€¢t;š›÷ÑÒkȱªQàp­ÿ0ۯƣº:öJÑû]€´ V+aðçÓ¦ssnµ^l€>\‰uk£ï½²R õFÿó,Ÿû¾È5ó¨£V9ß\™ìÆÄåÙ_Ëmf´Ñxº-‚d1¤“ú$­5e9¥¥Þ®T›3JQ»“TÄÍè€&¹™Õˆ,ÇcêÚ[i«6 Ê¢r©Ùõ0Æ9­FÇÓBûÍÇoÄ5¿l 7Ÿ÷moÓZºxµG¯õ‡÷è«€ÌücîÕ§€ôüš…ŸÆ_£È÷pä?Hopä¤úR«ÀM ( i‚m£ö82Öá-°¯[á¢8êŠÝÌæ )M5R¸¾â׌ U:l7À”s—ç±IG) Mudsj™ÄS¨·éZpg+½V±ÉÍ»ãu¢æÎoÊõÆ- KÞ4·ðâ“ÙÁÓ»y=±ý©³î]BcZsöQ¯š}–_[ùÏ›“ŽŸ<©fQ¦¹’”3å1¥²¥Ô‚i¢NÓ1o—å=š¥©Ž™b{jʪ1™Ã\£ËU§¤hBm EÔ‡âˆVc%ó§ö<¨™i¡!9(:ÙÑ*ƒ*øfÑ­ƒó"òØA5]Â!ÔØNzP±z5¡¶ xæ‚ßø2W‹zUªÐõQܬ„§#öP›"¢[,Z  ^jéƒp„æsÕ¢HÇS (¤Ó›xN6äCYÞð¥&Sæ[J+‘@ØÏ]x¤ä§YÄUEü4ên;ÝmOv+bl<º]k£"Ò>÷hš.j ‹h!ŽÀ±X¿3ª†­~,²ŠM`¦O B§vE³lR “ÅJQ5ILœ …þ†˜5u†Ïè"°¡`ͱ‘H`0®Xg³`MË´Ï_=»¥#;ƒ1‡9hÕá.ÎÛùãÎtž: 5úâ<­"ƒ/ûeo”¦(æ³Ó°(<.›ÖÐÏg¿ì’~Mc§±’Ð_½‹dŽáºjÎAÌò­O„ÃóEMÛ~i”vª¨ÊáÚLé¢ALo•pà(—ÈÇ™¨'w´“Q¾j ­ò«—E‚ ÿ H—1„‰3Ò¹ëg&ø †y;ü9"$hÙ†m'“¢;£’òvæ­­òíj.œÚû0ÚåR/îúy‘‰Ju5´­ 9ñ…<éÛk÷ïÉ5¿âÁ:ïG£çϲ|ºø÷ñm@Ê×Û>åÚ_¤| n@ºé·¤`×ä€Ôêzt)šNy$Øö«n¦Û¦$d€T¬ÛÔÍèÑf›·m»l"º#5kYK‘¶•¬3 ÄH‡Z÷´™%b`~ì ¸hc¨k1qv$.isÒEo¡¦>/Íw¢¾&qøÃbJ‡µ7Öq"Xñ½Fv RÁµÆCX¹F Rd¬D}¢—K%²©ìCS¡ T×¾¢€GgŠ#o>Š®HÕl*ÑG•~…4¬4SR…øü ïlÃJæµÔ+››äbÌ£ÚÍ¡q§ùÒžjÁñBGÜÅÙ¡]-tŒö¿@Xnç\VKçÉl9»Âºs¤lÆØ^…«6,xÓ£ïö[;}.MÃg4wVƒ¤ìz1»i¼{…ÚàÀÆ#ð#€]寵Û_2íh9+ïF‚ü#ÑÉg“ÏÐOeaG5í‘s…ýVÔµS¥•/Ô`Yªìø#P¨”I« R¹´òÆrZȧ½D²¬ì S±ç®ŒÙ¸#ËT®+ؼ 5ËcPPÕ†y&-†å§ù¹ïúö_^özFêœe¥Úü™6—Cäh£øÂ™ôªÌƦLˆÇû‰,oÁ¨§5ÁGë‡ØÌ!t¢\š*:Évmí¯Y7 ½zà@4ÇÃ6¯¶Ï›g æbÐÂâÕRûÒ£S£Æ¿Hõ ýàâÒÛn@úGé°SVnRfC¦eæo®#Ï€¤Í×LT@R4šx4IkØ‚–üÓiúh+0-æ±m¥þnzüdªS´%ƒW·e.û‡Êeø±Z‘Ö¥H]oeÑdȇ£âÕO›úóZj–4ŠÌËEÜå3‘„4ÓÁ ê4¦¤wŒ%„8û}ÆKÿƒäPFÅœj6þÉb7ñšA“ïMžt–s vÇ¿òW3ž­Pi’ð «£dEܸäùPµº+ð¤†TþrdÖ,ÏjEWÞôħìC; –|>1ŠÆÑ¸«9 µ+Ö•CÉœ•âh4:é,,ìL¯ÄÙVÅLd]uŒW˜k3ÍÍ1ÁVåãÅL!Œ•˜Û†fµº1xrª—y<©8GQc滇À!<Ò»¬ßHiæJû &z¦ïNher(vt[ÆQ´ R]{h"Û·õîËNÔBüeNÍbÔ<ûjyozé‘ÖË,) ˜®Œ«%;ôžC â2[ÆÁ 4H©6¦úðñ½K²f1hÞ=Œâ¡¶›œù*}iÆK•6£ŠÁœØ×Z#M+Óp¯ËüY7iiNx¦<å#P®ÑE{•ƒœ™RëLÿy‹(-„Ͻ­¨Ë í­v£Ò¤’Îߌk~p ‡k> _÷nTÎñŒö€2 ý5Aûð²D7~ÝøA{0*fó` oãm@Á⯋fËôJlOÓ®·@—¸öbOôã˜/m¼;_ÓÃë¸×@z@¾æßæ4þòyNÓV]lãùìE¦[Ô¥vÎ YÕëë¹f{ÙŸìñ÷¹æ`ú«&9TÛ××<óâçßñwüKÞùLƒô×_¿¤×¼òMšXò¨‡ù&½Å‘OxåÞylO€ôÝí]¡ÆÎ«Þ&ËS­+Õ–ÈÝ,a^FÎY0lýÔ !†TY*SˆH‘ÚÑÝ*×LÛ>®râÒÞ­ÕÈ,ôoÔ Mû¼h7æËU …Ûõb+P¶”R4…RgÉP/JšbƒXµDƒ¯Æ.t곈ÑÉ”· ÔÊ:óÕä3šòSñ³Ùmùn ×d*¤È@B2xR,ð7™:lù™ ׳3ÍaÄ¥DÕHY5Á§áH•Q˜JË··Ås-+Íðµ”@©tå=ËYÐv'2¡U¿¥FÛ…0„#Õ ‚¨}ðÐ fvk–òAbªV'ÖÔm£Eߢƒ¼¶UÖëH<òr/rÈñ*li¸ÉúWä@ùî.T<ÊŠ=¥UYÚo@zº¼£‹Ãd«¡Ñ6Y†[ù¡ï¶ülEëè^‘R÷2Måú(t_Mc‘¿ƒLп°kRãýÁICy@÷0nü_ŸW>ý žÚµø3Ìò&]ö¤§~M ¯_…5¦¼ê#êױМ\yúu`nMd±OöÎþÒ4mŽÂ¶zz=™<œñZû^…Sn@ºéŸ¤¥ìŒ§DŠrË«n³‚m\›UôO@Ò:öôCº<´ÕòªiÛßDÌéꥹÙ*T¸Rêôjñ¥D¶¢ÑTÞhæeQ§DíHbÿÏz¬B¡1šVìt¨YÌ ZÆ.0°ÚÒ¨Ò5Ê„™¹8TËÕ»£!@½¶ýE4Ûl5»:cS¨}¹þ¡-Y´o±þž±l=Kº’+jà,¿±\ ´½@j1È·mãóãHœlÝ•ñ¶Q™>Ò¶cVÌT i™0©âèͪÉ"óˆÉÂ>—¾\wy?\Jr‹MAÌSàâÚ·çôŽá<vå»Ðøf¯”zítX ³X± ñI—«k—‹if¨ã šˆ¡×ñêŠ*[Ñ¢Í1ÍF >/l>wÌ·›¡Ò\Ïg|Ç@gßøÜxà59¼Á‘ùk“ ­}’E±Š­?;Õš™/š›¼â-É¼Ö Ç! W‚¤²Ó:߯¸R¹é¤4'îM¤ÝdxH—êN íÕ qz½T ©Hû íD¤D)¶¦ÛG‹µ¨]˜R£âH> 抴˜¶* |AŠ-_]ÕgÝ=%:\¥†1Dx”ý_ýÐî}Ð ­I<»zå•NОfI™z£Eÿ«y<Ö·-LÁ5ª™ ƒ.Þ|Šv-ªŸV‘‰štÕbQ$¼ããl'µÒÈ€A=fŒ&Üô¡1í5÷Åzs<•fÜ;Ÿ`7ÎzlO¤GiâÆD$oZ¨xÃVª~tÍÄïR<ãhs@Ûì— Å@Þr›…µm(e?Ø5dÆÕÂ5¬.Ï=¦„AÒÔmVøÐ£ë =÷×PYdg–<]R-.¦…+ÑR¸E÷bÙY*‰¹æFY*’\·Y:ÖÚ,ð• :ºñ®Ö«¯ZI£:5Ró‘*CuóÀ³^¾R=@z²#&æW=ß©F[òLÙz`JÒ3uÛh?K £XDø¤R+UåÅ:¤¼½ E.iôݵ•zŽEÖ‰"óq‚§ê¨q39kRÙd|:$ÈmÃ7¤N²›=n}\_§Öl¢&ûÍF9ZWèÍL´™9–nËfªU÷g/2Zf'× Ù¥îÿ‹€ôUÌŸ\Ž‘,úA`çÿ±{.Ë¡£=ô*¼ ommM‰äY>a“%ˆÕ2ËÉívºíR(â<«¥Ôtmžëw{Š =ƒ@S@šÌôzéýRêªù MMåU%öùWgq)òßZ,‘ØÙo“_jèõØ2?Ò4bkÞÉ;Ú ÊÿIÀ[1°½¸œròd¤·8òbû¥CÿÇ€ôϼå›W€ôÙüŸîxƒ’7µÉqÕÌLý‘nV°æ$½¤Îv"§J²åë´~×_‘Zņ-;gþ„+W•ã¨úhe˜Emh¼9þ`}?Ì£/ Ñ0PGTÊÁC7è­Ž‡¹³OÖdÛFSƒ•uc‡éÌu(½ŠvX5 „j'åÒÙÜd’¡Àb.3û[@‚DWá3f !ê­lÃ…G#;dE5Œ?rj«{MLfC é´™WTG –÷w[És2uWu”ry>[²:|Z*›é¡’hfüèQ͈#¡s@M ;LÂÓµ™&DŽbèâxTEqµëÕ’Ž)J§Êsêß!ˆ&Ám”ˆ÷¸É÷C]«,.ŒÐçÛPdÔB=êVCŽ]Ķ2J¢ñ•7&Þ-(*Ä£•ˆ|YÇ Š™Ë"k爒™Y+¯'¦û¢5I$®fí˦Òm”*ýÈ=Ý·dŽ;0…RÚ[÷½«| "é}6šÞ-#P„Y•öæ•u9YMŠv(Ù{ìe«Ð¬í<œÑ$aÏoéµ+Ÿ6g6Ó± `®l7ß‚ýjg“IËÙŒX7í¾›;"sZ ›¤Ñ·^†]†h")Ër¿v'AؤËòŸ%’y‹¦Ð2aë ž\5Wù­"#,òу&äï@FÞ±yedÀ)ȯÑ'g*“ÊSBíYýX'-Úãž&Þ_‡Sú x­ÛM/—Zü°so"—`QQRä_a“ëGÍ˯7ùÑI¹«W˜R¾)?NÂP8N«Ì¼ÀXñ H7 ýƒ€¤:9V CôºíH¸`fºTŽ«€Ô­ÙZ¡ûJ~ÎêÕµYõñh¨q$BN@">iäH.óä|Èm“«Å!KÚe®¥²˜Þñ«œÈ“~hI—íHáÌ.—lÏö$=Ž‘¡ƒyÞš“T½d•8º:$*‘‚©l@cS£aõf.ÎN Þ¤:`tÎå”+R5@ÂJê/iÏ4UblÂ]#o&ÕBcˆHvIŒ’lŒÖefñÍŽ¢Vœ_š/>íÔŽ<I•Gý 9­ÌãQCª)|’iz´[ït\‹I’ªÕ’'ëšrš“jÒÕ`º™‡¢²"OÔ3;ó·š.WÁøY'J7ì˜Êþ“O¨6ÐÕšÐ÷Yé·0¼T¬L路ƒvÀíæ0IOƒ¼#S&ÑŒï¸Þ®H¯U/LÔ#þrº\%xš¨¥¼«Ð§ Z&óa ¾r¯!"ífà¨!®æ ¦ ƃiÚQ.óà¢àRpœí£väpu©ƒ$,ý Òɲ ]Zwôý©;¥)Ðÿ,4ZGèÍÉ8Ê.÷&³Qyòüq6<ÎFŸÅâ^‹¹–>K¸ L›?kåLg~p¶@æ4¨ÔÄ¢BC§Í × mr~.uAŠ­ !÷ë齸Ì ôƒÏzÍ=Îãk9‡ð®©µÔJ@ÚH"7]@@Ö2„˜?Ë„¡ÊŠü¼ÉE±©*ÉñOp£Àòƒ†(ã°k»Æ‘泋*µÇòúLÓx ¿y ¯ÝGØIi×çY6]‰ŸÆPþ ¤P¢¼d™É ùIƒ± %’P“Óv€1Q¿]ewù™3·(€´rÙϳðÕ> ®ÿ }Â/Ë‹¦ßã›?ÂH‚–ÁûW€4#HsÍËVÕo롳bþõê¯6Ødd38ÒTš| EضVÛÕž†GO€$ µd|“kÅŽ$¼|z ËS çС²%úü"Ge œ}wöµŽ´Ù[¸­£DŸh4(‹tÐcÓ­Ò{fÐfþgu–¶RÌÙÕMòêÂ(’Jžµ,ÜT³Öy7ì]Šn.LX´Ô…\ ¥¬à,X:Sëå ‘ààŠÝŒ,º¢’{ŠÍüÉÎe®=‰Å<=³ùÎBÅѬ´S½ßNVâ·ç®Ï:wµ­\‰è&ý LýYѬƒ@Ý]‘#ù)ͨ^ÍÓaê¥V HÖ‡0KuZíЄßfٹ—5¥A'¡‰Q-r)¼ú äí÷½‹Q‰™µÓL1Ëo5+Jfwí©Æo,cÍ¡©æm ۈ»<ý& Ñ£†Í“¿NöÄ ¬üÜ”‚u9r2EÝevjN5‚ô6e_¯ºïc´„óa¾&+Ý6*bGÂ2ÿœ˜{*¦tW¾9i5÷´†dƒ]ˆäØ‚dXL ˜R#©Ìj°Ü!°ä¡œk[…¨k@\p¬[VèTq­œ»|¯È]LÍm´º}ïŠL±Eá¾Ý„7˵rq‹rOê\ÛF+õNþ©¼â¸¢¡£CMv̵ ’H‚,8@®¬“¯uQÊà àÔLÕΞ¥VçýÞÿûá„é3vØR2àé96ǺÖMŒÈëøA‹ ÄŒ V™ÎE~mgS$Ak\Ñ““ðÉN@$Ç.ð ¾dÀúÎÞ€tÒßHû+@ZhÄ·1©1Sl}æBl=+払ÐÂEÎÄØËe9#FAêT5ùnUP²êµvñ$¹Î­iÿ£b¬wåÍTAÈÀ®E‰Ü½Ea=¯# }ÜŒ䓞¸ÆŸÀÅ‹€‚·ÉB£¢¥)ã> МݬùÖÎg\@ÔªïQ5ÛÑv"ÀfåCé’tO}ÍA²r!]™)sAZ±.!Z……àÑxä=Sr­«IÝ=Ðhv|¡µ¥Ó* -EVšYnÇÁ' ˆÍó¢ú{7Çx†Á¼ –4¹Ùilçb¿[Žå miCº`Q‰ ",w¥Î1­b`˜UPd¢˜hq¶Ù~.XvϬž\œ U´&k³gÛèæä/;ã3[‚×$£6DÞV ‹?wuøUÃ]#hŒ‘†Â„ûbb"r³>J¡ÃŒ=Oþ9«^ <&&É¿Í:´mD6Z[‡Þƒ†e:]æWÑRgyŽj™ãë S %Mr×}Ô*'ygîꔄÐie-‹ã™Qé×@Õ˜™€ïW#Zí>[½c•—”`e?õFüI_¥mM’™qUtsi¥#Í7Px…d~HÓ‘3Ê¢˜FpršvëÞrÒy¾Hrá3I',ÙäëC.Q½Aj„"Ì&—+Èqiê$ð'.l¸¥LTfÒ!!$Ù’#U†™HNòÃ6h‹Ô·= ç“<ï)3pc\„ÁË=aà°Œ(lÄ7.L¯×ÝÜÅ6öÉÃÃä ‚Ë´›.ÜX¥ËÌ·Æ=Õbg¨0íá­o.¹£Á¶òv7Ô•™5ø!®Ü‰R%•zG½ênìrÒ Hÿ í •Ž¿2'qR4œ¸h7-ÏäZ~’›<¡h½L!ù¯ ʰ#B3bГò(_ˆ„ï €FWyêj¥ °ÁmUå¥Aï_±©ÙIIÃC9[‹}T)«EtõtVâŠ6 ÚâÍSªj«z<ÌQçQ ¥XZë—¬”½|(„üEÖÛ†eŸïÁ3ï\?q¯~åsWÅGQý,«v”mh_pÔ¹ôG&Û¹+‚¤°ÛTsâÅ.õAPÚ(Y0mªAÚM¨½4dã°âEòËIQ?ß/„b'樠h[å’—{:¡Gv'ÐH SEÝäWþ¿ÓrªµOùøÆW²P?ÕaVàäO7™…ÎYÑ‚RXª’}¶ÑGKçÛk¯ RATBÊ]¹Ñ‚{_ÜClÂKH5&9z‹Ü u’‚‘¼1žýó9MÝߣ›oØM²ýÂÞ ËýÀö7ô–&”<¾zgûœk¾¸}>Ð+~ùþ@ùéå¼7Àñrs¬:>ÔoBNTÆ/+›+[ þ¨ªë¯‹ ÑÛM6“j@ŸjÅû»|Þ¯†´U–”CþÏD¤,Ÿ~)^I$\EüU©ùdÄYë`µ:jµ;#D™vö‰ Œ>EõÔ(¶)(ñ^‡ÛôÏ™ß+OÁ*X¸­ N%-éÞµˆJ‹–m•“92{×è£È†±OõùÑú<¨x%O¿b7Kµâ£Ýƒ†Yô×â•åÙ˜3ëæUíê# Ñ8«›I«Õ~~j­­'[fÞp1cÈiÞs˜ Ó®9 á­Íé#öиÛç´æž=p ’õ¢eø¿ëøË›Y$ Ó«»·Â4‘ÈzšZ´[}a6ïP¡QÚœµë˜&àì?BUu·<ÛÈ€±›Üx– NÛ ’Ý«©®ž ¢ š™N>±Å2þ­–ÉÔÞ¯ã@2 Þi|ªzžY”WÌzªòȵKÎ)æYsttÁjrª”jg‹Ã0í r“õÒS‚KËr”ˆ“žƒhM4ëúÕ¥Ô§>̘/ZÖrº,¨äþ¸jï¦ÅùƤªî+%hl0Bª£íMÃ÷4j¡8"˜!§†—u ©ÁÈuIû‰¨Á2®6$5óûi@šÒâGŠ x¤­NvY³#±rÖf}Þ ŽÿzŸ¿û€Ô®W€õ[nðåÙ+TÕšbk§Æ’øIŽy9YT®?‡ù!U^ò„ƒH©/nú„ñšˆ²7$Ú òQò5WÂÅ “¾'y - ;é*pÐ3 Òήz×ïògѪæÞyF^Lq·0 ìØŒA2^ä÷`ÆÄ{QĦÔk}ÎI誄R&í,4p,,÷¤• ñ®Z;]&N¹_À•ô% e¤ú>Ý€tÒ_ÒóPŸR0‘övzÔ`²]ûf½·" |ÆUöÞÌr·BµÈZýð !¦©µ]°§1•©3RŠŒí»—ÿ£iiãvʽëFkÐ%CÁIMA‚%è;[hNϵÊóûäýŒwj«fŸ·òjSÛ¢g¹lÕàÉ6÷Ô°‚ÛÅO›ìY–xÊõ >8Õí²Ýê¿WõÚtF5þ ‡tQ¯&ΦwñLxÖ!Ä›©ä6õ#3aRœM¹†R¤w §{ÀÎlY2ß($¿6³bŠîrZZ ¼Å¶"QI-;»©$ΈõÚh{˜ k’û ‚lÂè¦p‰@Z®§óL@Jœ’-6«Œ]*U•Ë2=^匳ñÜ¢]V­LOóŸês4‚4ñll¹:2ý)²Cô³nwùáéé.÷‚ HS.ßM†6;ŸMïË2œ®æÃ .à./EV™s1 O§ž¬õ4÷²c>é å„ñ: ôP{¿[n¬€‚½3\¦|žÉ n[+K-«›6IQ×úÙ('3ÂÖM§ B›œÂ'Oše$‚j hei€«ÌŠ Jå‡éâuˆÖ*¨ÇædíîkdùÇ©*ûUÏÙÉäS@ú,·ò×àtº7»ù5@z T‹ÒB:™dkv™ÃEîàEd«[óp1¥HFG™É6T±E„ˆrä+ÏEÈ—NòÓ^G[˜‘BÖN¸J®T¶ò§ 1I¹ÅËÈÑ‘p*¥PÌÕi_?6¹tnLâ!•‡"¹{Jëòç0 Xt­gUþÑåBÈlqÆ2òë‰0’#ªÍ?ÿ€o¾ßŒknh2Òêç3 }rzo€G½\l‹Î‚^¤¨>jzˆd@¡B)—.¹ŒÈ$+c7žI•! Ô»U½…ì¼M\ùdÙ|š\5w&iá$ß)o Ÿ†b¯IÈÈM§ãÝ'ö©;™T„›<a5Ì0f¯×ßÁ ´Ôˆœ J×Z"ebõBQ„õL…5l[©¶u¼ I çÂ"MM±E¥B[ØqRºbH/yìZüÿƒ€ô™@çÕöQç³?^ؽ·=ÿÚañÈçí@BÌzå ­gçN,ƒKQ6¡MV!.בªÆV§¯R£u?U® ‚‚ê‹´ ­bSM5"y~¨´‘œœ#¸@=šIøPêP½§çSfÝ.€§•çtb¢Z[K¤:"Ñ3W·]»ÈKAc¨©25X"ôr;L#~E4u·?©œnÖʳOËÿqÚ÷´Ija ªñ„©¼ëª+Ç}[+[6iæT>53|†÷ÏF³™ÍÞSК²ù˜€tå”÷ÐNxô dß”…Ý/ŸRí4½Ú‚2˜8ê¹Wë ÷èäµ›—¤7;œÌUz·ŠÆÌ|Š4TÊh|·ñ72Ó4—òWàÓì6ö ÞŸZã%fï ¯F›îЈt²F,Ëu0°6FŸh2²ka=ä82³o›å–™—q4ƒv,$ŸM—¥ ¥x 3UÊÍWŽž³ÆÇ1P?·³YNuö‹íR8ÍšB„˜¬íóuçSo±ö-šl£ɱçn–3kEþ &¯êE®¢:N…€äÑd$j„Í ïf¦½'­pù Âe)ú°1Ç\é4L@¥>ì‹9^eæÓgiàj>HžDQÞ_djvv} nàåL9èdsZé’6Öm*aqÔã¾ù =q$Ñ1€Y¢!œÛù(¹!¢ïÚßHOˆä쓉GߤÆU ë÷6vG½cµëÅnÌ µU0©ÉÆËc^jÂðŒ#áNð`ÊmS®9éИíC,¼6¹"ðIU=¸üd¶Á4ÊO;—êa·›Ù†Éÿ ƒÏ l¡a:.»*™.HU†Æýk„?¥¼õXnv÷f¹ª—h6:ü "!WKì92i• 6;dò£1 n#3IÞ˜ÌK°À+Åp«¹›¹]‡Ú†›KGû!\ìvJ+w¢ì26"R¦IQÁÈ)ñ>µ‘ÃÐC®rý8Ü¥ž*Øb j&ì¢sJïJ~V1-¦€”ÆML´UÇ |¾IžŸ€$o}÷äb]Ä’=Õ‡p🤿Gþ4@º¸æø`{ Bû‡¿÷QŠMNR/KW±V›EŽ8[^>éÐŽ³¤î.,jæ|DmúŸD$Å¡H@:XϦ¿5©(,9‡ е4€c`Ž%²ÁUåVvÃ'œZQΨF¤•)ìÎσ““:WÍ\d;Ùq1̦ë…ád&OÑi0y•fsC.ž©zõ) ÿdvŽ\™N³«k8”rÂ…KˆÃ!?>BQ³Çä#§j§@ÎJ¦ƒ¥T†¡à.³ÛB ^WÇô#îÂFÅ%pG·,™Ç™gYhΓ‘QbJÆ:«E ªÙ…G‰ïs·®5^ºè.É&w ŽÍ]½- HÉH-:&سq‰S'³[ë ?aÑ l¦¶Ò«sÕ°“y5{D,ä»=aé1/7èLx°¸Vm£œÙíÔ…U–I+n‘O´¡Mdf‡al˜„¬ÛÛ :cW3v½màí¸!We>V;-§"“m i¥ßniGÕ÷¦p–ÌÊÙ‹–˜Üx‹Zgk6ŒæM%ïG^dºoeï¼Eíyâ™fžbû…÷(ƒ’{DãÐ5x['"«v•ÙMr¥m5Æ^ø”gÆÝÆbv…)Jø¯Ž¿ÂN¼ö٦”†;&ŒåÐÊ’‹†µpŸÅM¸"GHÙp»€ÅW§¤‹4ä®v ¬Ëª,¤Ó­_ëBOEOA 4IžU€JŒ€ôÙŠó6;ô‘ÜÙ®¢;ù5@j<>^ŽÕÊ kpv‘ð¼oò J{û rç•÷T n™„§ï«/³xdãeÇ;*ÂäSô•ÄŒ‘÷gCãî‡2\лD® 2ÇvVÍ'ã›b°Téie°>ÐT?¼˜d©Î ÌÎ0þÁ+‡RVÆBJ¬”ãsiÆhÕ™H!'yߎ†«&”dYÐ w<ª?ÊVªÂÏ]Ãh«j^H½MÈd\©Ñ×eí!yz7vrÒ HH¾H¯EÚ±"N±rÓò3¨±8Ca‘©AÚf É]è ,²&" mEìs.eK°•+º4ÛqF® öìuá©ÊÍW-TM/ºR"s K"d(mòX Ø~-ân¤L4ÁÍó™W‘HÓ—…ƒ_Í¿3üH£Õ9Æx)_HQ»U*#:ÌIpbÖŽ½ËiM8y3ˆkŸ\ÙæÅ1=©œQhÊœt;-§ÖEõS]µáÙCÍ jÉÝ —œ6wjÔ3B°pÐð Å´z ÂÚ!wÌ“;<2c‰ŠYE·_J¤iÒØŽ¡uA ÙdGnxÇwjv•/š¨"ɳîbmþ2%njÏ}€uä£)êêè|¾²c^ÈH:ž¼¾ïMpvëu±ùm|닼ùðų@ʓ瀄 jáÑqCÝ©¼õØA¶Ò?tàÖ”2Qy"óÓîMJLT.¬çü<¤ßÑ ›¢yUOÅF™øtê> =*Ú˜b;#ljÜŽü ¢Ÿ`»J’çƒSN(Oi3¹¶H¦ã#A׃kÀ¼ÁúØ3‡ f<€}¦Cy«3º­Œäɳ|Ž=«š„7Uºk$))VË;$L…ÜÖ¦]¸¥Ø=±Â€¢M‚˜ÙÐpÇwÂ+_$ãÈÂþ…õàh}cVj¥Ï~†‰¾:j¯€ôÝkn½é'I{Öï‚F'Oè8V@ä®»!ŠöÕÂ2Á“„Jü@caŒè`0µð~ Õ'SzJwŽuõfaæÆË›p/_©©ë¢gOÏ ú¹|‰6(~*î0Y\_=m2Å;ã7zC™IX»¨ô @Ò‹exŽ =6U!¼„pæôNàB±rØ…‘£Ê‹s³ü€\³!É@´8Ë>!¬¡w’7|ƒ©R0“§n@zµ}ö¯Òë2Y£Ø´P=»˜ãá,òW-ëì)ýÑ‘öiß\f“ZBSaÊ­^µl… ¸&ÿFq«^©9gwîáj!¥YŸY8߬³Øjà”ˆNƒŠ—¡ÖLåÝa-dPEû°5r”p>"ô¤²àÅ·òê±2o7Á ÐÔÛâhéš,U¯Ì]±º×Á5cÇÚ]“‰«1BáƒðÔÔâ *îaÆ!Ó[-Ø%SÅâé•ëÚA»bTóZ•®Óþ—¥A²„Þf߉¦?÷—”ŠØa£Y’§FÎ\WÏ’¬ñJ–åIµ&µìÝ _@c#µ±œî•UfI«óã¥7?LX/q沋B¸AYv¶t×n?GJ'³M^vôM7‘z£ÄR M®¨è^O7R~eö™aÞnW¨bwU ´;ÂD8žfód-ÐÚ‘7¬º™©¶f›Ó"Ü›qÕÞÑt;å…ít3ëi-ÝKŒÚl ùÌ êÕŠ/]mÐÑè`zxg:d±8 Í 9Ý‚¼7›ˆyíÆn4z$ÕNi¿º r2&¾û•ìC ¿îÑ.w+µc‡aØ“w;[Ü´(V Ô¦ $Dµ šfY¼doöGZØr»±S=¼1Á…°3Öõu]–Û‡%eƒJ¢Àe[ ¦¹ÑkºP!Ñ0¹Nq¦i%9‘zæj7(Ø,[.g[eÛ/t=µÙoâ-‡;È_‘çZæirÐ`c`g“µgÝ4öè´zV±¹¤i98©ITÏ~>Üš´[ý W=ZÓÅše$En¨Ry¿$zß´òÊ3ݶÛé;ØÂ¬^IxYRÎéËKÉqÕ³"¹`m¸ä=EcMp maJgæªò>ÑÑåt,# y»úÑH~(7Ä¢ÌøûJúD"RÉvn+a*ÇÑÙJ£Ujøw» –`ì»QÖ5øÄ…˜&ûÀ{šÄÀ‘Üà:ÎOÄ“ÞÔÊóó(ð¦ARcãÌÏâùÈé}B¯‰¥]ïëû´ñ¾K2oŒ"_SÜwü”"Þ×=¸¢¼üÚ½8€ïª›k>ã—oÒÇB¢§|ý“83cŸÂÏW6Gý‘G--"} žö9Ñ.ÅÔ®ìÁØ‘*¼™a³­£76J ÿõ3ûF/íÊ2ÿ°oò¿ú á ‘&Ï„Û`º­"‚$¿u¨¦ŽI·MpûTÅšÌÃú«ò{5%Å‚5{–ƒ—«¬jåB‘,[ 8˜sÉì¾¾°­èa¹»ÈĸÜê Éh°Ö&‘ÿ&ËÝé]Ô`¹…VÝé–ôî—1Á©Ó E½• ª^¦à¦v²Z»atsmº. a#Sm‡c²¯ñ†râí—|áé¦&OVǔ޸BðÐT8zpJLQi@}·ÈýVö¦tNf‰ã:È£ Ñ‘ ]ÆètB*,ö|+йGD:!àžT&A{í³ƒˆ ÌÐØŸ°:²dCHxß66† š”ƒ±)uéòÖ9mÍK¯MU!í8ëd,md ZÒÅ@PšFü7h?ŽY¼¯Ì:œªùnVƒ8åìô»œµ_^!±ËKÄ·R¸òtV!ií™Ç¨–ñÝyQݳ6ø-TB ³¯ŒüXÝÃSýj¬§ÂAá¼g®,kº|°©Àr  oÝ dŸNœ'in¹Op^ÊŒ;ÊzÏcØS—xRnœkõ\Ø).9.^¯âõ =wL}ß`†`2bØÊ†o6[˜à«„ÑdE*IýÄÏ•®Ð³¸IÌI@cx+‘/,¬/”ûâÀg:sf%]¾C~–ù÷®@¤Ý^-«#‚j/öQo>ëÏuAÛéÀ˜‘ëòÒNB¿dŒ¸x¢§’Þ.žÂ";¨CšÅ±Ûåe2Ô–qµ[Ÿ“Ýl‘ÂJÄ!€"¤û0™VšXµ!`³`+,—†3:QRSgÖ«g-4(*T-Þ0f»¶†>'C’àòÐÌU2ì€Íh/#”ñ"ôQiV³ßX´‡úÞƒ4–‰G[Y^CKØ£Á[SsJ¤áéŸÖÎþž9ãÕ×1¢? Ò»€¤á¡Ý1Êø iÒFú('3²Ëå;£)¶¨})h33Áf}Eœ6±nlþÊÁ… ÚñRµËH2^_’¯þ !Ä喢ɪðǼRÞ­.®> s­™þÇ›ùޜΚg”ëÞ2Ô£§ú)­¦²jjÕ¶µlBªmme1qTÇ$ž·™Ó^Y»Í6oÙ~“ŒsÛ̪À·ÝñÚ^ÍèiЧ@¥áºÚMƒÜpÕ·hGÆ›èÊ,7G/¨ÉY‚JzU‰oCµ²nÖÙ5?=2¯¾Ùñ™ú'½ž5.Ù®b—DYµ3ËevªZ¼½øÁK¬\ݜ֦©'uG§ý›)òVð†ÿ1»;UH™²ˆf½BÐ3dua¦Ñå ‰R……O²à¡¡iD)x ʰ; § âÌ— Ð*ˆvßÔ"eKÏZ˜4ž Çh›¤‡®šQKmVÛ¢ý6çú+fõ¡Mï•5æÖ,!hb:-]Áºƒ …gDrçÇͬ-0OŽŠ[x9’?ʼ!(¼5@¯ÆwŬ2­›Îǽtð)°h‘9iyæAÌÅt9‚ùé dJÕñ¾vùV…˜ÿK<9T1–b]¡“e®¡kJ=)…êÕ:à|bgÜ#Q“¢7£íœíåY§·€t^¿u  Ï¡-ÏžÈ*¬zEGæÈ΀Â`ò:Àë[]£1‘Ïíq“Œõ(àæJf°§(Ñ«DQ®‰rßeì 5¤SØ’EŸ-Q³Ðù6Çòú%½,§šV¸xkÃÖÈÛÒÂíHþ2z‹'m,l¤ŒÙgi†=Š#+Y§RS‘£¦µ(A#ó~o'c$É=ïù4ͮ؋ÛâØÄ2ð–p7L¢(Ȥœ¸Ìu"S1‘§–ãx%VÚÓÑÛ»q·å#ï¸<ÉÓÓR`c*»Tÿ®mO@……añ•šðUvaW@ò„£.ß „%>S£§AÖ[Èq0ÇûŒGoÚ~HŸqÏOÒóßp ^RÆóWWjÄïÒ þùÇéHoáˆ5¶ŽÁÌÐü%€„ÇÚ"‹¬o¾y©§t·Þó‘µÐÑð(L“HiwmO;›ÔZ%Ðn€üI¬]SšÍF¦@ÍGœÛ²¬ý«þ›Ú"dag¸œš#,a ^ðéÉðéäÿÀ§i:©F‡“YXǘW¼Ú£DZ*ó„Að`¥IN·ÔzuÉ8(£Žy›È(GcYaª3ì´²âŽ]pí:£¡ìiV Ð„—¶®67‘Õ IšõfRùPfõZ)š¹3c¹“\´öõ¹`˜nª¨…<¥•Ã…×Û`7¨‡mšˆ»œ ¦Ù“£'Ä è;º‰€O /X9yHuúÃb“¢'^ŸÕ¬à0+–áä2ˆ´ÝÁ~±ƒüÔXx·¨këÔ6µ6J'å1•ª2­x žjŽ"ìÁl©YÐ=2¶yÐ9@]8c3x—º!ȒбW»™ì.™*•]Iš9_B¬^ìY¡ŽÚY%’†MP½TèêÔÉ6gŽ)³ñ?Ry\àWÁäT%isçȌڈNÙ· {¬€´ÕÀ·›ºhÎZk”gŸT EAÂ7óÕ8M}Øc%@ZvÓvÇí©MLˆòí-Õ(þ’¯,ËÌ-¢®Ñt*2öV»R7ó?Z­³LÔð±UÐ%Ší1¼¤C±Àb]eDS¸ bTx\¹ž3¾NOWàé{üV¥„¼*hÝɬ<92;YT†6W µ‹·r·àmÆ{š%ìàY9·¹rbaÛÇ&ã ñÊŒ £,ŠR`$î\Á4Á+ôßãT«ðú€­` îŸ#ñw²Å INg)²å’g{†q³E–6Ë‹ïì<{>‰³WÖ·NƒäŒ–iðŒ÷”T™ÖhÔ]5FJE&âG‚†Š„pP÷°VÊ7·'é~ǤâÖ„ŽÁâ9mª0G¬÷0)iŽÑÐŽ»;Æ‚l!ÆVJüyb¹ Œt®„F/£aÕ“"rÏ·÷YÀ#ÖÐuʦ„‰ ­Ú•¾ú;‹Šžc"o4HŸáÈkâùà÷݇¿ðÙVŸŠïÒw·Oé¯Xæ¥þæZü3>ýâwŒ×€OEõ¯ã#¾ù`{[ÿµ¼¥½Ñ#\~œõü€tЕû“z²]k±ÔÔÆÛëñ#µ‰LE ¦Cb b"LjÎ`3Úz•ø³a­I´1hPy4GµIõÒ eÒº­»`  emr ë#ù£®}=·u Ûaµ¡ºˆ-ì\CÀeZúVœœaE8ê…¤Ôf‰ÂX§Úæú ´ÁÑNs³7Ù:»•6<Ýh»¨Ú™ÃdãÍ„ãú£Óob<¤Y´ç,+oÓdw|ŠFPeÍZèv®™Aìó)klóö•ü븄°Œ—zƒ‘Ô(F¼v3L :_m–sŒ±á„Jf [åÅWÝUלÜn~ãÏýíÊTL9~¬Á®å꟰YáÝÂåM®·VØ‹ŒŽÎ ô©°ò.!®ƒÖìƒQ™Á&d“;hÚ,ÊŒ®’u4PÁ±S…fµœÄ£BÉ×0c Ê:;²‹¹EeKÀm–ŽÛM•­­ÕN7{Þš7v°ãF½Oä„ð‰É>îQáÞLÒhV¸ðÒd~„0¼Åž™X0IŽ+–"ôM^̯҆ëìG¬l`?”œE†LkNÃ&1 )äÈRÐ_¥þ=ƒHa‹Àä$ª®[PÁW¦h¥€J5H8ñ³5­Y¨ Œ+Eî8¿9Û‘ñÄÊY­ýBƒ­½åsÙ•weJd³Î*õš2šŒ VõÔg.V)¡Y1u©W{Cb’'‡¿<£c_èŸÿÁþyë(W™¢EêjåRe&“d]g÷kùén}ƒê¥x)H™ûšHÏø“¸*k¥y}¤—wúÚlÌ÷È‘m޹ðÒA&ÖGðÀTM¢ƒNV³5V±…Y»Öµ eÖ#ŽÖI‘=6²SépƒÛ¬·QÀ%WBñóÁÛ”÷‘oØä\YÛì"u\¶Ö8M aå0â|m&>˜¡sG g&òÐkœ’ªŠeE.ýÕ}AGc¤dÍùåœ"(»,¤ÆHÞjJ'X:%659ØiP0qc«¹¹®¿¡‰Ïéõwþ@*Oƒý[€ô̯’Næ@_R‡ûwé‘þ@Ú(W,,ºÙ™{ൻ©¿úXLW½ý Q…íˆ?ÚsMgn§aI¨¤›¶èœf íj–mñKÍËgaÙå_Ïïy~u,QÖŠºœkkyˆØzLúQ aŸ>8YiåÞD*3¥•dm ¤©BpDñ’*à´[𩘥| V4âݵñ…²S¥â­¥›¦_Uý…NÝüï¼iVà„‚ŠF«ñq{—M«¨¥¦—"†žVËÚyŠ”wK`ÈŽ±çF†ÂÒ,+V¨~ÖŽå‘‚«W»Ùä2Ï›Qm ŽV”•¿à™øË¦Ê¤œvUÞ<üÆg®N3wÝQ©«!噦y*¼·?n 1‡—¬Sg¥ßøAe„ã¹xi°ØÝyU<:å q1k±PÇöPø4 L¡4Oà >vw‰øíafðƒ%f+= ›äÙü‰Ôè)ÍÞyÚ|ÃQ‡WùkÚ¾—[)Ú© «CàNûJÝ»~9l¨´îƒøºùe«pj¤Í6p)ˆrY­Œê¬º`]g ï²¥Åj×ÉkZ ûÀ޳ª‡÷Ð &AŸfæÿcïߛǕžaôž£Ïäp¨Óü‡ðPEJNòzõZß»/¶Ýý$qY–%D¡€@UÌ̃cG!ýˆ+µ¥±3Yè2qx¶ˆ9Œ?';ýµŒ•ýkV!_J¶ “Àá Qgmnú¸“) 0ôÙQµNÑôÕùJZèÉ?̰ÆEËY”ÆËç9¬e¦¬wyâƒÄ³)²R^ÙˆË=ñ›áK¼ØåÜ·TU ÷š+‡ßÄ×pWS õû]ÅèÄ‚p¿èÑÁÒ7p³® À-°‘1µ§«k¹ Rqâ 4¾)ãÄGáQQ¢öjl+ïö$ïبašú1šŽ¢bå)VˆÔi r¢‘v啿yl ñbP¨²*wÃÔ{1­æ#IƒÇº>ºLB¬²Üø±{YH ê‘Ñv;azäÍÉÒnLJ²“áe‹î#ºØÆž¬¹sWkJY¢%³îM0T¢VfÔÜ<ì‘ ÿ+Øñ¥€õõùî+>ùëûøHã϶Œyÿ5@úð˜ðÈ&º “¦’ù׈å×ðèk==cùËý?€#Ÿ÷¯œ›üÝ[ýï–Ø&@ºdJ{x¤`9ÓOÍg-R¤*¤SÒÄÇ‚H;9£YHk„KÚþOä»9$½¤íooÁnž*ÈWÏŸÒ6œ|ŸIy¹‡I<2ÅèYÃpªò@T•/Öï¢Ì9mÒP¡n'ÐÀÓ½é௬9$ÏY;Ÿº.Oê©Zh³ïÌŠÏ™‚YË2»i Ü¡öNƒ}踟F¯¬;0 KLÎÚb§èâ„1=ÆO“Š'’AX‡C.qYèŠVíÌèÉ--,ëu\Š¢¬F Ôá\ðŠeÑjݬßdr6+v.~A.ÝtÃ™Ž „ÁüˆIwO†«ì9urZÃ:þÍÒ @®{Î;Pƒ±ß #åÔÔ©ÈGdÙ BDCàœ©¡:xkS_¤Â´bâ~Kä`Ü\®·ú*.Ǧr8þX)cêV‰ æ¯ÒISð[{ïV3€7·÷HÅÏ{Ï›áWÌ2AÈžv¨I>¿bÖÀÇÈa«m3k0U/XÐH?8‚§¯ºö³j²‚9EÖ¤¦Æ›pâÄñêEÚPs GÁa¤‰~‰ã…E\a™Õg$ªYoS‘>íf·"‘ÛâYÒÎóDRûªìL™ˆ_ï2å ÒD\êí¨ÎòTÞyòŽýNÆ8'‘;V 7O‹Î äçEÄ_a7½sÁ”TÜÂ"=þ­„H;6@uÖ‚oâ-NÉéc´ Ð{Æ5«ltØ ‘ÖšU{úøL­.F$ÇQ4¤…ïƒ$+•ËÙØ†6,OßW¹üÔ$ZÓÆÉ«P×7Ôc:ñGЮµ®{š€Aï(RvQŒ˜)çSX(‘üÁºú½£óGD¿k r~2¶êš¹DÉœá7+Ãé5£œ.<€µdÁÆEûÁ ‹t:Iãm,óÝ'¥‘fÕÑI+`Kûá 5´ùƒµBb³ºþ⣮ò¶v£Ä|Uå#£”’ΖßðÍŸÒóèÿ Í¿â‹üŸ¤i(§²@’*™ßÞ‰ÿ ½ÐÇÿS€ô'ˆô¿iãÊF?¦,Ödµy[ƒ‘F³GÓ<ÏD†©=Š‹60‘3ѱÒ,´Œ©tÑn‡vø# …¶IÀNX0ÈÛ¿Ê#é÷þ(½ö|&v†›Â|`¡ªdßµm_…,à •».ÂÇ )S…R›'ø ú'/È ´÷¤ z’õ&O8ùJUä=ÕG“¬WŠ †3¹çº_kÎWã—Ö2 `™ZçyÇ´æ9 :iÓ·`°8uÚè_¬Ž_©1P5e^ëlm¯UÇerÇIÏzOcV÷l/Á#ê` ÝK*?T1a•;o°)¹WÔêi¬väLÌ…:ž ܰù»:{„7§ž®^ÉÑ@ÜtÑ2Ó›þvãè¦ÕúIfÆjN&¾½ZÅÅ£?‰ZrCtsÒ¾2›5¼Ö޽| çGðýÁ(’Ýz×2iÓ0ý§µAœ˜É'à ÐZ$­£a,‘ ¥ªA)ÖE €«ò5'ɦhãúOJñ FŽ$|2ÝY=]ÑO–× ÌÁô ¯®]ò.nîžzÜßI"Z#VɪU<·iŽØó—À ÉdW©;‘ùhCÉ8åaxIvËG.Hòc£gå™±¶‰ºbƒö¼]&ìdC!qÇê¾›š&ÏÒ3O KçyGâŽd«B¼Q3vÖ ½ J>ajCö bd'hNÀ‚AÜ6sV‘3Öä´OrQ¨J9ó+À¼L:1*ðBH¦uåsnfÙ:üdtL9ù‡kHó4RÑ5òˆ.Î7³ý&ªÒgfRc‰¨'“9e4¬Z¥5Ö6¶·F£xӾ¢øN™v¡šB§b½¯kUè¿~þ¢â‘Z4nchMè†Ù51âô‰‹F¡ÖÍÏuV ¨¥6‘$7p-TÞÞGðƒ ¢ª5ÁM‘='Ëž´Ð%·U™]¼‘>L#¯K3A6xSX밷Γ¢j$Ñ ßÇpø=ržíHå)4™Ôrc^Ü—:¯Õæøÿþ&¾Ÿé_$Ý\2‡ ÿ÷)ÿ ý/ÚüU#° ´2ÍÀÏBÙÆÐ”p†c¦’7pÄš™3àópAÃ4Iݳ3óÖŠ¹f m4ØVZ›)‘Xb Ûáö÷TÔ×Û|ù$ "ùá¨}Š¡…SÐS!Ýôy2òø“€,h òÆŠÚ6¿&˜xr,á ZäQ|KÇUKBë'Ï{³c,œ˜'¥ê2#9 ̦'¯ ëÍÃ@))­âó«Ý)Âæ=¢m)›[Jr¥0ºÅ 4òó'ëUujËÁ.Q2ùTë`õÄd`Ü0¦Ã¹àTÝ“Ê*¨’È|¢Ê(vëžiuçJ±»‘ïNKæÌcÄÔa©Át{ßQ»÷¤ÍÚXu2 V°ß¢£L0­ï²— žjæÆ.Eëábƒ{½Ík(pe@Ç™f[Y.‡Êu¸˜žÆä7»#§wÔÍüºÈ"›ÆüÒ ¡[Eð"^©”&y¶¹²IÚ8¹#û ‰*­— ÀÑÿ19–¾Qå ¤†2 ƒiÑñ`Á  €gr2ð+м'¦?Gȃ³&ªeB·D,˜[jb~Ó“ô&'!JkùÈ’jwÀ:È$“ذ@i‰Z‰UÁ¶óƒÞI¿tT¡Nl²Ð‡¬ª¹3K´h Q¿2‹C8±Qqqn>ˆäAb°=ój$TØÐ‘È%cŠê€M«ÜȘÔ1¸^ÈŒ|;h¦‘Y^¾è^=¢D~ìQ8)Úé ½³4-ýÎeAe½Ú뀘SI¨ÞÖ–¡ ] û]µ€“5ªÍ¤EZTÓòZÒ‚Üq8vˆmŒÀÖ;ÍFG€3ö\ I¾­l[˜QtAÙHÀ#¹_ä7Ob¨LvÍkX!’¹Î3Ëî…hf¦ \·Ú©©`ßÚQÊâ¯ÖÒ·RÂCKB•Û2REØÒâwï8ilÜA5fµ „é‚(tÚy–´ÀÒ©Põ&SŒü#ŠP †è˜Z &ÂPD3¬pjB xž¯ïXªÜí…´´³n¿g[ãþç­gÚÿþá†Ýý;߯Ueúῤ ?¾"®üuC_^áÛ=­¯‰Ç«~ì÷{TÖÓÿñäskGÓ?øãO\fRF]y6½B¡¼qÞ˜âŒÆÛÃÓÑûˆ6GJ”lÎl ÛjÁ? ôXO™ün±L÷¤ž>"mwE’òFþü °ôŸ$¿¾Fy“mRQ ?l}[ý¼ûêOPøH $OHá=æ×´¥†n;'x òk:†‚h<2Ùw7Âm·î»yŠÕf Š Þδó:‘O ušÌ6š“M¥Z?iÂë¶ì§íÀ{‚ïÊÂPÅúYPz‰‹ÙÚZ€@ï]XÚð™m‡ªÝåH3i.p±Øòf²‰¦Š vêª TcK2ϦA*ÞŠ‰ÎÜ_ŠM¨ÇÂP»…ÝÍ; NF;U0„¬ÊÀ©“~é D¥£•íË„h7’ 0꽈1™d–*:'’Au¦ÇUH¢ËiðR¼fË?¿j›Û1Á«ÓšKÿ5·(Õ%9ÓoOóÌAH[8miPÌný÷DT,jÑ‘“/¹´v”5¨¢¢µÐÙ¼ Â2 wòê€÷,9üÇ/¾&>oY+ ƒeÃÓ/êâQZÂ| ñ:´X­ ÞBÝ‹=wt%¢àþãð 8ÐÅ6Ô5ä˜LŸ°LgZÐÉ´kï¤gõn´B¼Ð;‰N2Ö‰0C²ó¼ªZ†`VÓ›ûrZ——a½R{´ª™§«Ê&êÁÚ4OÝJÕ\?›)¯ªNæ™~ž‹ÝPû “õ*6H8û¦X öβðøiM¥Ó‚u6žj_b\&Šƒ¶™1ë—th0B#€uzï'dîÔ^oTu+ªi-™ìèrö9ÌNÏ¥ËÉαÊÇ/®uNb LkÇÙÍ©ÒúL¸lm¹& Úø·#¥%µ‡å¯f²ÛŒKb[œ³Civ=«ñ­ó¬²Qod ¡n· .P óëÞÍs©½"¢øf5߀¥Ü* §9ùé„Û Ääß$…>ñHo¢¿çì²*6ÉO(öhœÛÚx}=>7C\ó7és“ÿ!@ZÓû/Rú@ú½Êç/ÒÏ)®¯iòy(þ+Éžå¾ÅÆg= Ž)³À†&§›JN5õ'€¤Ì‘š©m6TH—S£R'DªÆs_&<2ÕÒKƒäD/ÿÒ—— Û¯o‘ÐIfù=wYîc~tdz“e¼b;ðXó³6<™œ­¯j½MAbòÝ*y9WgÇÚâYdtÚ;íTÒ3hžÄ–jXn‚¦Ìô°øÓÌGšRQ*$98[+ ii(±ß)÷´ê9Í1Ó:¯1š¹µzOìcñäÈ»ù7¶ávkÍy!R*¾›Ý¥l‚MÕÊӪܕ•œì^Õ¤îÜ K ëT4zœ6ÔM“dc²Þ&z¡2^0Yç 7ë»ÞÎû)q@§YM„ß°fµ4®¶+}²<¯“b¹¼•U¦oØmùuèÇÇw…j ŽŽw7ƒ±›–×™"¥Áõ}c™ ­f€Oš8[íßBi46tµ )Pî¦a#¨»4yk0€Ü‰¾:;×7}UëÌœ­¼Æ±4ú$lt$Àì(§¥ÚMª§7®²‹êYy@’ä‹r_¨ùRÜ"gÁYønæ^:׳yülÆÌT«¾nÌêÝÌ˰8ÂDM[ô$½àXz¬æëí§L¤—éÂ~XM(<Ë¢Ðã™ëmK üiz6gŠa25~›ÁËNÕªÏa [v ZtY£†˜Åjíc·¿°òv4·tÒ°8û/ŒlfüêVÐy)ø# àȪNC· ¹‹u6Ì->iífÁy¶"ÍïÖ˜IËhÜ- Pù¢¦HÇ×\‘š#»Ø(ÚßyÈ©9âј áj!Y~¸Ï1» T«‡×¼N'ÒÝ¢ 4!Ò,QXÃ;_)’Ôð¶h$]fpܾÀQÀÛã[ÊôÖ‹TW!Á¦¶ø{€¤ðȳ$šlN¬ [ä5OZ?T2¼P¬¢ªR³Gt¦¿Í6åO­Ï„Q:AÿE‡ÖßÀ“UbûE½B¿H Àü =ûðu„GßÒ¯!ÒéEÖçÞ©ü²¥×æþ }= ‘>^T’J´e¢ë*íÔË‚0ß ¤¬Ê#ª“5…ö¥A\Ї4^¤¿EŒ,yäÜßEÚÿý{€´È«g~u×߆õ¼ÄGÓú:¼÷r¼œ<óä·›ü|’ïHŠ*t5Øéh úu—݈t:ØÍç „ä"nZóÀïoÁWhËk¤¨ÞÖšÇûæÇ5ì§´T)ÕQçKt!¨Š¹.ìVì嘑´˜ c5ƒQ˜d»Eàmôi>1ôº°Ìú°8¿8µlÓ×ÜæŠN/ä&²uàYΣҀªr¶¾ñ½¬ì–f .ZxU%hk@ï³éþá ’Ô‘Ç:)ZŠ *:ÍRC! „ŽŒú‡—q¥@›å:¨9Me+ÀÛáLª~P6L qQ%{ëÚ–6 PÇb¬.´¡.²P/$54ÀÆÅjÜ·±Ë>Xd/ÀÐŰÞÞÕú@M¹µƒLãPEtp¢«“³Ò·yYR¢„VÉÆ ÏipáamÕ%™#³À†¸‘€(>ðQ»z|µËbO¶æéÊ¿uPÑèE;ƒ7©;òl¡‘Ù ë¦̪ŽÑÞ'Vb £o'YVÙL Y”a8ºèœµá‘B¤È¯c­Hþâ’:P%µB`ýù¤™6¢¾y¿ô|%ƒÆ„gêÉ¡1}xÊLO6s µ]ÔÝÎü›l¡¯Íâ«}§÷ÄöÓÆ>¼ŠŽSGƒprœìΛ؂e5Oz+eÚCi)‘i‚Vr‰hdPgS}díÂ>Œ«ó„$#ÐÖÑ4©ðr§.‘_ÜMµûfTP4o€n`i¶øWk‰èæœÔÑr‰ k ­O{yÅŪú1 )¬jk¿«[®ðjyíb•7R½¯´Y HV¢ô¼*£¼š—NÛé;™I1Ì”9Þ†©ò‰ÖOu™[0¿ ÖªëYòŸ¢³´Ø ~W} µ‰˜üž‰ÿ øH?£¨¯oã}¦BŠsòÿ E}BÄŸ€ÓçÞ~lèË+üÑ€”?Þ׿³÷Þ¤…8ÿî^´0:Áìï­_Ý T|ìQ8ÛbH;“i)hÉ)S3Ø  ÑÈ5Zf/K#A9îrÞ ¼QSáY8V›¤ÏõÇÓ‰4‡sPä_Üþ-@ÚlGÂßlH ‚ŸP)¬¯ö·žðOnÑõ^/åèÈ;…‹Gd`)ù®=xº“ aoðÅ94R)y%¬(8O°ÚtDUpÚÒD\Uy_S4Ši4òžhtµãËTw³GžKÄe Ø¥‡®#ÞTñY5–Z’:Ày‚Ë›­Žýü È%œ(Ýþ¯y€RaÉD9¤‡à àžw¯Ò{Õè›…×ÿac€–þ˜d'6FœªëgmÝ'?Lþ¿Â/?c‹4!’[J£ŸRþqãó^æg€ô†H?¤oðè+@úD ëëHå ë~HoÈú×Ç4ÝþXôû-wyŽ ››u>îF.M˜t‘?é|1öàñÅNsy½æïJˆd`!â¡Öevb¦=L?&oå8¯qfXh7­Iù¨Ó즳b£,î(‚@’™HVc+ýë¾C±­ÔÆÖþI“A:O·ÅÄ¢èn¬Ö´ƒb»?8T­vŒ,Â{g{=dgÉb¼7ûÈ9&eC[‚H—¦Þª‘$õ)¹ …ö®·}Ô<¹¥ƒèUë™;½‡V껕Öv£æ "-i&Îò·7Cû†vÛ¢©Q>¶¨4ËwöeÞ3{fUÒx,ªgDì9çWg'òWóÏfÁ0}äe=·ó9;å½¹BœÚ ù3^yîÞz ÷gF«Iñ]<ä_•ˆÒ›_7ÿ}¾"‰Ÿ¡Ó‚øÜÐïßÀ,Oê¾¥o{¾ïQº¿V_HKáìõFë×wÛ_% $”×°h…-^®¢”×´gÝ[eì4Kìñ+€ô”Í a”ÈQþyj ¢ÖŸOþˆ Raiê_ßþ‹éßÞëx·ÀÏ¿¼½‹~óÞNß!Û&SéMÖéö¸5™éN9Ž»7÷ïÂüîd(xš—_ôŒ:&¢’wóãLü(ÕÁ¡âó×zëE³ÐšO9ahn± óÄšmn$ ó^ºµÅÐ2 ˲Mä…+Üaq¹*´m¦Þm–£bå{¬M. l̉ ˜ªŒþÈ;HA¡ †‰+¢°¢§õ-S÷ØÍ™ÔǦËuøÐÈTÈí4$T€N1'dkk|“Y ŒV«ì«.2i-cÛý=z¦Üüt6²îæXPÌ9JGÛL åHûÖ­þrQÖ­pRk–ÚŽwqN Ö¤ÔÉuCL~uVS8W±öD °³ßíÐnÈÎÎÿAA­ï@[™ë$¸L&»vêJ.Τ\õ³LƒB%õñ½Â$|ÐÔÉ[ª×M%I¢ã„ªJ¨&á›B ˆ}’´Ä‚#Ðf´‹¤›=NÓ¬rzî»(#÷4{ŠJL¥9Ér1ŒÉx$gþb‡™Úï&Zª.“}iFr曤œ0Ia/g(á‰ê`/¨µ‚!-¦ÚÇþPuw©¡AïÖïþ´°¡Î³Æ£Ò$'\§…ÆE+É@H? ’•Ønëç„Ñj…µ,Ù£Dßþʽ…Û¬¶¦jsêfAµ‚|4nÒúÓð x¤B"§RM¹5µ[Û¢¦‚F³¼ø#»ù&xÕ-½ÑÎSîX sÙ i›¿º¸‘8R‘6Œks*9M Íò$Kl¨-z®|v3$A2E‰~íÔ¢kg‘mΉ“"b ­`gæÞ ¶¬ôƒIÚ>²Ûó2gNÿæP€ô zß'oõÙ„iq[‡–â€_)h&ùû }B¤¯¿û}¤ßC¤¯)¤öèÁz‡r@R˲óE¿ßÂ#¤íÖ ‘&˜(2áÊ3TüQõäi,íõŠRÛ,ô”ØÚTj/€”‘-ÛzF}Âß-jdø,çJ£}Ñ¿@ÿ^ƒd¬Î[6þóý'þõÌ÷WôÀù¹¡ô±ÁÏÛC½–æÞÚóºßSVÉ/Î>Šëiáãüá³IÃòNµù‰Zuý ’£¿æ°ö¼zsØkz3&‡ú)3-¯0†V^ÃÉÌ…NGÃÉ“Ýa·5å¥eO®ÉfB!¢¤Z·\âÿt’å#^©3ò¾%rSpF#ZÄÓjÅ7ÈвÕ%íoS€‚±ß˜‚>¸C›³V¥J㩈ÊÖ‰«KJ;’ã÷{Þc O–ê{8P`£Õ¦{‘³Òf½¹Ý9Êv† ï'¾fy5èÁ<¦‚³ðÌxm¬ ÌžpÊ%{›ûx_=‰Å·’5Ì)@2“ÎÙѳ³u?M#ÉÞtƒGçÒ;G¢0¸O°Õ‚’2Tú´`yìÍ4+Õâ—†Ö­k ‰¥Ð‚G™ju~6‘o%T˜å7ÃÕ™sgASºèòê<¼yBÜ`G¢ÎwC™ÔŠsônñŠÙh²ƒ`©ñïçô€¤Þˆ;aÆÔÓmZh³F¸Ì„ÕÆNÀ¦° 5Kïh… ¦,,#pÕP:„vXUÈg:Œ\T—€hFJA¤mImÊ$…èãÇ .0±yϳ^ö ç˜Õ« "½Bj*Ÿm‘€vCÇ‚^œp‹2ô³ ÇÄ:¾]GÇtªJ@R‡€“h\áѶJn‡U;oëU¼YdãšÓB°‹f™VÓÔÃßËËá騭\áä $üÏ·?¤Ý®¿a$C2þèZÇ‚€tY´Ò ·¬‹W~dâsõó¤ãŸ¤Í¾ÿ)ý ù?¤w—þ¯ÒÇãŸéõ ?¤‰xþÇI±î ®ýS€&@Ò\œØ‡þ¨Ò•GÕGëÑEQÑ£¹þ¦Aú@R/¤´ºÚûb˜ª$þs5ÉBºËJ%Ë,à‹oÈì»o2Ñ¿góGý8›àÓ«`5Ÿ_$UX¿ýºxÑðñ§_oáõ¬øúÉÐÍO•1½Ç-ür£?ÜþòªÿhC¨Õíÿ÷pÅŒöðd>ÌŽ¹x;å¤Z£ 2°&15%kÊOñ´Äh¡J:èÕèjp³n'Ø…µ:PÀ»VÊX”Aí»¦nXplª7y΄y?%ÙD¥ëgÛ$Í´ŒX:!Uj²_G‘Ó»lr!ùýEÏ1_Wû˜dª'ŽL€‡ãzyÖ¡CJgpXnëHÊ“Ì[È®Ù4šŒË½o„HÔÞ‡y&kåòæ´9ïå˽­L—9ds©ê^™x‡Ùðèjvæ¿{rcu?mC|s‚.t¢¸ö¦Úö¢ÜžCòkÒ)…H¡“ØÀKVbÚXJ©ì·c©Ô™×à“ªåÂ7“ö“`kæq!Êö}YVRƒI“[9ˆlÙ-O¼ñ “ÁEMÀ±Ú/o˜“irÚ úv²ö´S·1på4ÌNH´ÁiÁàtêõi|‡†I;´f[—š6õI4¥Ò—iãwPiUÁƒ6L †@d yÚ#¡âAh¸ïªž[sj›tÙ'—5 ÚRƒ2ƒ€$¶³Ñ Ľ—E˜Dz§ÿãEÿ‚DF+°[à$e$À¸æ½3‹˜}!_§/ò!ÖÊXWÜ ™KÀ“Îæøj¢ôe€úæy²`ß«ªy[_‡v2ö˜xQ­Žš› “Ô¥±ÒLgKœ³lŸdôX•y¥vï‘^wÝÖ®½js¢GÒ êdòÊ%W³h€jéÊiÞö…rPf;µÀ>¸~iüÃÊ’ù,»÷寎_zÑδÊyáÊn9Š•¶ …X·û ™¼ñÒ˜–è˜4]¢ËÒMë¢îƒ$šD|¶ì}H?3UBÏ „‰"¾£¾ðãFfÍÌ„ë_×OíÙ«ôCÑï;@bã Sþˆè÷Ÿ¤//¯ ºØvY´ÈHDÿ£Nû•dr0H­ü«7ÿfÑjËI{XQ­¬ü5ZD&¨€o² mý¦™¿v¦ˆ{ÖjàîÛe‘¯9³!e™V[LÑËŠ¡„*!Sƒ £åµu½æœgx<òÃäÿ³î*|¹G ƒ³»ûö‡_ŸÚÉÎ<žßŸ/µ¾º'÷/oÿ)›ªÒ*ÊGp3S¸Êá>¶êTéÄ‹ãÂ:SV½·|7¿VØoÁTÉró*+® T”¹’7ì OËŽ–Y7Ï–G¤â=6¥z¾$ºBuÚ±ç¸o@Ó²ÛeoM&›ÉP!fä Vöù)¹ú+Æ|É$Þ¬J£…Q±ê}“?ŒJ9šÔ—­Á0[Í)'WEÉF]DèGC /0>¶t䑟t@¦ËæŒ>h«I‹>Zl¤.úlëLÀ¤QxfåLûpØ¿Ó<ó²Ž¥ŠŠ¶P‹¨è¨òƒÿ:,懂I"ám5›M¹Ð'@:>?Y·o ÒìVÇaË?HÓwñH¯ÍþOÒßA¤’ç *§Ûˆì/V©TO©ÆH÷i,mµœÂBŠ%¿Nq64¾ÀSõšu¸Í.7–ØpÍVInyQæ¶½ÂJP¢I‚PÄ‘ÙNÒ-Sm¢ðødX­F†VLþr¦mû ŽÿëÚÝ¿3}PRφÍ·>å­øN¯Ü}þã ýD›ù‡&s/\©oL49ЉÂí+K¦z#”¤p<†]>»Á)`–ÏTkuÈpÑDøì@OòõÄ¢‘HÛ“ˆô¤"•z¸¿ì[v2ލC 5èi*›•èYµqª¡T'hf³v°“]Rµ¨öJ)ë®5ñ÷—OŒvüTN5ƒôS‘³¯hCaºÖ “iÑ$g’‰‹‰w3GåòEEõ3è¢T:n]1&~ ðÀœ™xšˆ7ƒ<Î%ãì0΋¹ÁÕH«bÃ6ZtlRØYt@(uP–]\ÈT(OÁÖAËû‹dž*})Ýq6‰fVàŠõÅ«û$v4 -›!Îm_™Cè¬.–دFoÂåµè¢ó¦·;ÄjÊ/©\;*2r3Çeb©…ª>Ý4HƒýkÊa=–=ŠˆM/“WiÙ %+fŸ¤âãÓÄr™ÑnˆÔõTu¼‚µÚ‘p»°ƒmãáD³?Ô?ÕÈÌä žÙʺi–s‘¢¢¹Š»µÆ'_°n}…Io]ú €»L‰öDG‹'DZê°6v‹™Ýø»õL€tÒ5`¶ùó08^‰XW¥nmÚ-‡fã!ç}˜Ì+X6Ü b¸‹ú5,¸aÖæNƒµLt1hVÒôDª<=ÑÃåO¹@pk.E¬” ¶^êÜ!CÓ Ú™›\ÞÉê‘î‹Ôæ4i«+4‰—_E¶²V0óßyE*£«ðêpÖð6y¢o©;ŸðH/âÊn¯¤ú^ä;ßå+óHÌÉyÛÐÏéwxâxôHþ }ßÄÔ =é–üNÈþ÷"íB\£½†‰ú~Ø È!´ ÀèŒ|ÚiÝ›Éíì` yÆŠœ‹üQ)S¬›EØÑúÄovŒã§ÍäÙ‘úS¦D{n¢.€ÔÕI„±ì@B3RATT¢³@fËÔ);%3O¾ §4‹biOv¶'øVã¥e\É—R¡(0±É(è·ýVôVa¾àKpÆTÍæ² 2ïO´[°ÜÄ7O%Ï6ÿVû¯mhJ®â6ë›_¼¢¾>}~M¿@XÝ'Ú;!„&kÂÝ…“˜I“üxËçuñ치è‚Ö»ÝR]<ëuQ~ ‚•Î’/ mò<„½œDR[n2€Åo;Ñä91r†fL ¾) /Ÿ÷šœ™“C¶í9{Çò"çÀV¸ þÚötåRRm}áÌu™]Ëæ^`/D¡þÕl´æÈ|Qy¬ºRI-0Ûűyþ´2¿·8a¿Œgvp[¡xnD×ræl÷æ8› ®•oŠ,®…¯NŽð—=c®¬Óªß±ÿŽStB¦Ÿ…û™¹Ÿ“0G*¡XÖZØ‚åŸ1ÍÎDÙÉÀšC&C44¹²Ç»•w*‹ŠwhZ ˆÛò›b$µOòüII¨ëU­ÃÆüj\íIP­6Þ¤…èñãIŒu5û^¦@zë,î¦ëć ÇBÁv2³ËÝ iÛzÞ/¶ºÅe›ÔåP‚¢”Ã*˜YAQY~ÚaJÜÒéÑÐ ±¤efø¦Eãiòú¾L?“f>;6Ùu*î;+s;!ÒaÌ‘ÞOsb¯¬+ê}¾õ¦Ô¢£ %ó´Mßm«¹(x«X*8êü°»môâÐ[uC½øÐèJ‹v^c²—8»vJÀà¶e-þ›E†NöíR+R§F·ÆŒ"•è üßåìÕ$l\UpA«l2{R1Ä£˜¨¸åå•è)Øœ1ds3®{Ú׆—k|y¼­Rî&èY èþñ~™ñüLzàȯ:àßHæ$øk¹oÖŸ4ÖoÐòú›Ï =Äׯ4HÚ€¾€’/TÔ')5!Òïö+ @Zf ÷–~yg4(6FJJV'=·¡AòB§D&ké[cç©“EØ‘Â\Ï%¾7¨ä—H¤"íb¥µf,S"74"EwëL¤°vºîÖN×Ù¥n®»I¤´vMU3jJ΂QN{xtA^2ÜÈ.‚©àŽ‚ŸØ)™)2=×HHÁLèQ)ÿé”~Ư›3•×/§ü¥Dú?Há%«šÙÁK»å¾ø@…MJ6pˆ8ßÛkSø;pL ¹.—¯\QIr¥r†'ïióåwk“´å70×¼X×{di/ºU‘Û+† †{жӞC—+o—3¨šÄ\Ó–“<„+íN~<¨%ߨ%?S;˜R]«‘ÃÉlŠä䯱ÀË" öÑG·Ò-Tæ«ÒˆóÄM½Vï‘ÆEl+èb7¹Óá,¢"ZøÄM·eu+èV½Ó(x ófï„áÝÌ.ÑÍÑ_ ´›®sÝ<{—‹N›ÃõÍú…†¶Î`Éhò+­šE*ïŠgÀ…¯(Ê“€(9á¬Â S~ã4€d= |*ìLÖ{t)@¢*»/Éìíp‡‡?S³Ú×ô«¾Tinð%-•mkÁ-8µib•P«©Reu³´æÛ½ N“ßÍ›êÇ¢#H¼øÿ`+`ÿо‡o©ƒ¤=lͺû“SË.™McÛØŒzÐÐCÒÞŠ<ïZdS¤®A.Œf9œ!­Œ…i¬ ˜³Ûé…GƒÇTûp­ ó˜‡cÍ•îgöIùTìÂyƒžÜQ1¾i&ÍÝ8Ý ôL#ßÁ£ç¹÷¶ÙÜ¢œôð†Hod•ipù‘~HîÔÿ>Ò¶^å§Mè£Áöþ)õ@ú¬Ùý Qsæ(? ý ˆDC%ãû¼\R7‚{Ú ‰)'…}‚Œ—UQ1$ó¼%HúàD„GŒi}îä—Xl K¸=•ö¶¡Ä6²Å $&¹ZŸ“7€”(GI‡ NÄZæéjX/³Ê?Úip¨=ʆ)ž…­Ü‹)ÓM× ¦ :9‡ìèÅ(5<%¡‹’㎑= V9•m-Åx¤°€‡?Á‘w;Üooÿéí„©?üÖ}}àœÀ铼ã•—J Õ0E[Íéru†HÓ]7Ñ—nØȤ.¡É yš”jÞø æ*1ÈTYÙk–¢LH·<¿Ëz¿º¤:rV{åìÀÐÝybzSD æpœ—s,ø­2Rt9/©•­’Ëpô}F§Ù4•ÁšMU­NU¬'¨-+îhUÌ܂堆|e‹üòô‚ÙY«›’^½S¬B6¢Òü`ß[eÏ[‡u¥ï¶%/¬Èƒ7õÕ¨¨§÷n*T‡Ö )½TPsŠìÊ:i}˜È‚æŠT \‡§U»îÆô*xÂZééÖ§¯%¸þ˜<>EÖ>^Ô."Z p¢„é´f£óÍ ‘ŸÈ#í•(Ô³OŠbÕéãCr™Á6®jóûåÒ§qæA-R& ©fãuÐB‹o°ÉÁöNWI•Eã–“#Ge·rt‡Î8òtö_Ólþ¢Ç$a¬hD5#æÂ+êã²ø «Ua4ö>9b¼l½iZ=e3Y4¨‚rÕ%»zî] º5ô«­”êõË2Üï|d2~S•¤2íjMþ•Ëohô„³¦•Ñ[–MixËý™Ó)ÉÓ42Z²‘¤q†iUêPŒ#±ŠP»Š6OÿFDZ‹¦Iq$-pÖ¢6ëb \ogHàKÅù^œÝe©ùÖhæ²ø£ô¤)œ‹‹_Ýæ%ô•A²2œ›Xê ù^{Ò4¬|C$ïÞÛýcÝwвþÊ}îà²ÎüéÃÖ^}C]?C¶7ÞúÓž)N  ý–>KqßMβÜÐ7¤DM¦þèXÑ_yuë+%¤HÇ;²F˜¶NÚ䀜¹ÉµE3©I”·2ÜGi>Å!aЩ2 ©jéŽ9•”–"7–Û˜=¶s'½ö@Íñ;¤d¯ð¼À ÈŸfÙ4“Lu'ÅáÉÌy6ƒRúî›nh¬¤+×qV,vpn’SQÞº¶Rl2ImÁË GÞ¦,fQÏ«!øÃ!d„Myù[Yï§–ÿ_ÞþKlß>þ}CŘ!ÕÁçE–ÍBä÷ 'Å5Û‡÷æÓø6zzþͬßÕïäÞtdO†¶ž¦ÅlÔm›^Õ{I.Dïñ.»~)Ñ磓åc$·¸3+ïàiÒM=Ô¥¹.xLþ•ÓX拨"8y©çzŠˆ¿;¶†"Ä3L .žÁm™AnÁ °#}}2=†¼…nÜGߦ™¦å¶‰9hÕ éøµϵwBaHµ¤Ù‹é`Äú0ÐÜ Oe#¡f‚hNÞ å|JK•Ú B)m3œ‘Nç²zš÷Çf–ûÊÔr`þ1wN°$ÌÏplÔÀÕÓÎ:)úV-‘„Š5ê)&.IïÆaìŽÕ·féy*ÏVw-j‰UUaž:òR&R,hDëf OõÃ;ò²| ~4GÐæöË4@Þ\¡ˆJ·ñôÍ©aºfšD²1÷Bà &Úã0O8Ù#Ê×¾¤ÁtüÊñ&×VÆfÚˆ›G&beÏ¡<õ’ #ï‰U»{ìBy¡°ý †5ø¦0‹Ž<Ùέû1›ÿf3þO5ðÝ l»GdxCÛ†7~9Á² g{¶ݲ{HŠ¡Ô”|çù­þq1H$Så#UË “Ô‘ƒ::rFlI€{”ysÜ(±,éKe=ËlÁ²! ñ‡uªéG7A \ ôIS¾¶P˜5¨Ê¤`pi.‘¹‚8¿Ü?áÑ1Y¥]L£ä¾RP`ã“tñ/]ø·jÝOéoðÄxô3@ú"-€dæ›_H©ß¤I>ý %¤k,ü3ˆô e{ÇÏrmŒî%Ú«[Ê Mav1ˆ4+fZOÛœòEèVà3…Ù‘Y`Åè¦çO£Á'ÿá6ywp´­gl:´@§ìÆ] <˜k%ÉÓ­°ÆY„¨‚¢J©*Å‚´ ïÊML­“f'·ù2t“GvyÚ}ÅiíâsòM$ŠŠÖÖ‡œÐÀ§x³¿™Ç"(¬T™)Óf7°K2ûàý¡¯»㩤“ÌÄAÀÂeºr@Ê(8à „:ÿ„SþRü |ó fñìõ…ïØ…7* -¸âæ·íõ‡“ŒK/‡‡ôúÃÇàé%ÿDRÝþìóÖl3øm &Zó?Ÿë·æd=5mòÉ%UAÉ•³ãÓ‡G8£‡“|…åÁOl¯/21ànžpÁñd Då‡Víx&YsRZ=è7脊^«§¹«%6”9gï¬FÑÐzõF91¾Èjô\ìg,ü+ù™ŽßTTã"üÒX&Õ¿›©ªe†\D4¿Ó4a³ÀLÓÒ×¾:ä—WL§Øi'í¤’ò¶à”:Ì$ÕÄꜣ¯¥sSU;} ã5öY–±Î¬“1 _Ó9›N>VuK6WO7ñhŽ’É #§‚l·VF?m Ý ©]ïS‡´[XîTúT¶Íº´’9 ¤ÎÐãÁ†¸Në"bè'-‹È]Á€ú¶2K©Ûêé?9ë[Ûõêb»ù‘,ØVkù?–f·®²Ó:ÛcbÚØÕ·AR¢ýè``L¦(®2÷˜ç;@²ÐÒ}Ñ™ ‡:™‘T^â<ÜÙLXM¾½‡-î"A$°%ŠMNW¬==“ŽQi§øÐä_ëb ‹CÊ<52ûï#:CM§'‚²”CG…c× Ÿêygz°¼öDf. h¯9‚ÝȧÉÈ>Ù“ ÚÉÎîôðÈŒd”teÁºµ³–Ó ~Ž Þ eGn=É(¦E°|E/Áš÷¼UÅïÏjÝÏé÷f•ó%>þⵡÐöK€d{õ Ôý>i²ÿ ýù-ý é«*”ö[RˆßrË(N¤|›=dµ¦iãÙ‹ARÉÉm©S6¹Ø¾­"7™¢)J¦DR{NŽ‚¿æ@(ÉFŠj¸TÈÍŠ3ëW M¾IeþTÀ/9-á 'õ"ßZËü:°"¤x‡ð(hÂNÈn¸ÅÖtøG‰îÕͤ‹P‚‰švrJWžJ©æ8K¡€w²7ƒ›‡ÈÈ5Y¼eY•šò.ÓAAÍ0UdæNÀnÛÙkÿ‰R–ýãzdÞÒ‰3üƒ"&¡ó(÷y‹ëq}NY ÀO\ó–dç—`éáËF>I33=ZøÏ?ú‡·ÿˆô[v‚¢Ží‚æÛè¦ `  ŒLàª(ç_ÓŸ·k‰Õf‡âj*yw«ÇÓ¯CËÚ­©=ƒ§*v»üäÔ¸ä'p©0€:êIó'ïh ™–æÉv¯¾l‹§™q±j]±ûbö~Õ†þ8hxðfyªa5uF¢Öõý”yK .*|rDOC&¹ø¦öI€“Ú>A=h )Õ¬27Ì s<¼“{=0>è¨a5;å³6ƒMÙªO¡¨˨Ð\ødÓ~±œÍoyZü1›+þQôã­Rt™Óáæõ-­ ‡¹nÆÜ1{¶vH¨MÍÜ[x:môaÜ›ÉÐwZîí´V ̉ąŒJqpûÙŸVRUÞ&´û·–ØÄw£’) d!PaÃh)Ok§a¥¶Ã »À×Ö¢øƒCµa–x›àÐÄ>±´Ã7´3Òw£ån©ÓjúéYC,èb›Yl§É³³¹¹ƒF 3*×°Ú@4x¹çÉ U¹„A—–3Ç}¥€oé%ÐÖ|FìT&n†qÂád‹7mÛ Úq0j¶èt– <«q¡ÅNÚ@lc³]dÇ„¦røÍžÕ.=×ýòæx:ª¤‡C:^lÒs?Ìžòk1îxÁ¦Ó½@Ñ¢•´Ä¦––çú÷i{ýD*ê…>¡ÈDi’þôΪÛó' Ò'«õH_×w€ôqýI4¤)8~ Ã_ÞÖ•_'¿#¬t¿"åˆAÙ…Ô§0Y›é9øafWx´Þi/%’Ò>†rÜjæÏÆi¤È4ŠŒ|zâï§ê(ØóË6%–Ød«sDˆ:( –yr’§Qq”$s±d½,EùkôÝÑ   U,ÖåéU5DVË\ÄŸ ƒþÙÖ‚Þp#Uà7›"âÚJûúŸ¤ïé‹Vñí|Úá^*nƒJu<¹pDë¹o PQ¿HóÑÿ@z@Ыð÷¿HIöè€4!ÑŸÒ‡l<æ”!K ²Ž]ê2–l34m,p4ý­iÍY;ÿ#»~—ÎÉ’¹¬R[|ylS¦íØÇ‚XTùà‡D´V åœT\«éàªþh3Ål ¦@‘m8ÂDü–½`6hTÈ#¬Ý†x—r›¢ Òdæ=SÛò RroNânMY ííI€„êå¼qUì:+†;¹«ÄºÝ¡S ¥ãw­2!„õÒ| kð¡ôå<5%1»|~ ÉL˜õÌÈ÷!ÄÐ>!j-„$'Ì Ù!ûàˆ¦‚\ãÆåƒU¯ÙŸÌË@›ú§ §¾è¡ULrü³Lm×”_¿ECùe®ù5ŸwÚ?ñ…Ý/´X¿‚k¿¼ý{€d(ç§ ýÓœÝ÷œžaòY ™Ë6ù\ {Ú*®‡œ\„N„O™Z6y,îòSÕáb,-/6½¼ Ç7BþÎ3éàEröCù4,UEóN[qÔî. ú2¨¨Út ϶ºßMï¤Úž œvk_¢ƒôb´ÛN “3íSd?‘¶Ü]ZË0ý Â#ÐÊOüö†ÐýFÚn§™ç=ûêtù=û¥ûKÄÔV…î³×gNš* öfj[£XµÛI; ~b½næyåÕW†²’6©©l¹ê¬˜V9ý³ :f%N•ÜI*;‹’©þVP¬Ýýv Hó{¶vù¶¤Ka  ŽDRep,œ¶Á 5²sƒbšr&E£É”5˜þKG(!i1T-´ÁQÁ)ÙøExš*(;ûÀOÚ$&Ÿ¸$©ÕÑ>*Á xrTrÕmÙÿ¦,[`a±|å<@š‘5«HþÈ«å:]35Ÿ6¸Ž€tÜJÑÁ¾Ê¤°}g!PÑúÉOê6)ZçŸgÂ_¥ÒªÂPé82OCm¤d®4YFµMÂñé“í +«_Ï@å)oGþh#½¬,:h»zÈ#ºF@›ÜÅ^ÎÍÒtFREÒ€4aÐ×ûäK?Y£Ù\(±ÍS_e€Oen>E€ž¢×ƒ´Î7¸r0ç'Ò»2õ€¦¯Ï{¤í …oðhûß$Z~:+ßkCïÚ»œö }<"mÏX[ÐuÑh‡²GË=FCmÍÈS[­Íj—£4;“%šà'-l>ýõÝþ,-aö,´Yˆ­$4 ß,*Dº!ݲ+(K{²G»×­É¿Ðƒ€¨=l4üÖúÕôá“OJDQ™Re]ì"u}ˆA¶µ:ˆ3KlD V•K“CÂ†ØÆ„ºäƨºža|˜Zuož4´ò¦Íx•u•Ëögðû‹øï€”dAÕ5¢+gÙ/÷êÜ‹„ˆhÐ]À¾¡(ƒà±aŸ|¨f”ìÆîtlÌËrv ð4ðÉÎrïƒÉÊ/:?öÊž·þ²úŠx?1R³ü~üp{ßÅ—ç?ŽäûoQQ+bXUQ'ˆo²jéKeñ¹•mw4ǾåÙÁ'9ÈM)zO¿Ãc\ûMlžÞ=³›<¾ ”B¦ËÅ€–-PQ™Õ[ŠŸHE Jÿ4ønçUÚLV²ÓèU»ïv^2í"ÔÞ“~zÓP?-Ü÷5½ 5¸®ú]¢#æéæÑù„@¾ýžŠ-ùî §ü0½×"Ôc$r4Oe3ÊÛÞ`¨T{§ö™²eŸãÒ,ÆWi9H¨"û=ò’Ù;h²žŽÃ™‹¤'ìÙ„äv•¦óàjÐ ãi™w±„u‚¡A®k­L;Ã-LJ^û,f)ÆžÒ4ä7W R;M”¥¢&hÙ¬_5ð™þGŒäcÕüµëjóm@Jêz0N×cm¦Ey@VHèÏ ­EcãEÑÕã„„2ÛÆf>gw|š7‘R¡ªûHÝHÌBÁœšVD-ÑòœÚÖw.ªœ A÷Ýä×8G6|*s’“ä4€Œ7ÊK‰D€t~ÁèßÒþ*.¿Y”&MµV#Øãš¾®+àd_ÜÙººÚ@³| ?ù‘œ£ß‡û“Óù+‘ö Ùã›R½ÿ €Äç  ©¹yo‘öÃi=¬ÒÏéµßÓSa?›œ7§Ç›§¦Ê˜ýb¨ –ÑtJ‡ÈõÓhÍhÑ­Vþ/¾Gô1ÎöçÁôHOcY`)ò7Ù¡Eþ{y™‹u°£4 ´²‘‹i‹rÑ»ƒ¨A%;‡ ÷_’Z]‘&@*Ë}²%utQ‰“v³%g…4(i“[X¹žƒè šïAÃ(¯7YØï¹2³žKNgÔ×aUÂjé0SÎ}HôŸA'«×ýtã‘ûà m†b…G‚Æ®Ž†çC&§d›Ð¡—zÓ¯ ÂÒ‚LyQÐÛ¥ÕC8×FùUgCKCÇ9í™fOÏÎ*W£g¢ÁƽB>{²6ÿCæ4ïÕ sÚ%†·…ßæ§¼rë‘ö¼M¹ö?¼ý?3ýD†ù×ô[Á×ûöôô½i(•8u™OÙVöÝÑH3Èu°nº ~*V¹Ë‚loùÎzŽ["b !Š“½Ì‚ò7~¸bo[¨LG²ÐmÝ¡SßW­stç¥á8L PÅ;´ãŽ7y$ó\:ICaF†V·6„ oæa ÿ"#˜½[ÞDO¬Ø9S;ÝK`ò$’ÖÈu>“Š73ž.ÏÚÿv9k³óæƒY_“Õ“¿^-Ò}ØZüàOûZ[EcPc~²‘ @é¤ê´»nbñM®eï+;ë¸7⢶ŒÈн—¼9jbìκœf؉ AJ;‘(-RxTß½·À‘voS—ïÖ»6ÓxiШÉ)ìlSA¹WAš{%€¨“ÄãÛµÐÈüƒˆ°P‰°›Í}ÒFÙº¨°°ˆt’m¬Ë©-‡t-¹56ÆÑ› ©!¤!§í]RƈWåƒÛº’cͼÙÒ¢þ_")¼Ž¬"Ò[z3GÅCÝäW€F‘ZîH Ô)ÔF@¢œ/æ÷˜­¬XÅ'KSnE‚ë,ÚÎS>ü®kò»d'%Œ•ža“ê|JlQKl_Õt?µ#üüý*±=©ì߯‡#U¾hº]Ö—iY6ò ÷†9Vwû}¾”àýó’2Ý3ÓË$ü-QzàÑb¯ô9oµ-Èö¾H߻ܾÞ!Â:´þS_¼Ÿ> ~¿GZÜ+gûPŽîGô7£š6Œ¬¨K}=á!’Œ­×HÓ ),x䙚vñ¬Ð>8¦Ùݦ¤TtLc’eÄÍw¯Mõe'e«.UX=ÛÙ Ä2‘Ü)ÏcÏX5±³’K7ÁŽR"ré•*i©fÜY1Ò‡…7GZç^Øå˜’ìšisÄ ×íxt–تýv3¥,f4L=¢Zóho¯šú¼ð3Ô„UVÏ:K(ÃYâËà[j|ÏàzÃò.wàOO¨Aógu¸êG’ wØ µ í2Å$Ng—å€îœâ’uI Æ_íÄUž›Qp#‘Ð ®ò‘ºèJÊn#V`qA‰Ž¿ C~çh_”Š+ó]Ëü EËqüÿ ù§Óo>0ö_THOÍw6iÁ½‡›=|ÏëÊ»Ôsnz2l_oÁý∠¹% tBatG…N`R&ÛhO€Ìg8Äg™W`±ÌVh’Œrî!Á%/95O4—<ºà’Q¶2Rµ›{ææìÜmÖIq. 3] ´Ê&ßkÎ# ¹vßéˆÓ3üðçÕä^ÞœÆÕ3ðçfy.³²'BIôDU™àrS<$…0¼!sÝfñ…{‡&J ÿ·€)•Ž:íétKJ¨ØI‰äJR“Nª €å‰…',ÎdY$È ZÈQÞ”>áœëŽ‘´ Ÿt×ҌɟÕÑZ¿:§ÖÄÙÓ “•½ÀxÇYq0Ù¬™; +wê%´à“<1]‹9uuUëLGâ–X‘õ¸©#0©±I|ÎMsöÙMJ^ÍZ3k*…3›Ìh5œ“Âë¨(ŠÔ®I2Ç~62!»¶bÁw‡fšlSs¦=jfýsÉGU Afº,ÍœLRŽïU9Ö-µn›Ò#Gx”ÍðZ-5i‘´X½Ìêa¤†ì @ÊtÖÚ˜¡2£Þ·P¶0‹Qï Ê›ô|º$uDRÝÌÂü‰VÍ|VÞfÒ@€0&ÿ뤉&@:H“ý ÝìÀgXn6+ñíÅsõßÉ2mv-nx&7Uði9peg¿ÊÕwãài;XI•ã%ŸÑA3­Äs$PÖćgGI“.&e oÔÐìòï&@ê–ZKD›œ„‡Ñ,¸ý„k’!ýþ ?™Y~„Ÿ¸ÿùÙxv¸ƒ”“O1jvÈ»Ú~HŠ'ã s |—¯Þà ò+’X4Ë„yÁ£òIÕO{÷R{¿‹gX),8ì™ïM>؇%¶´Bwû]|Í i=¹É?mà}_î'[›£+Ô!?™\z½÷Åù6B‰èm·Ë_rWðƒÑ3L+2Ýh3›xJ\výcy$ksë »µžª´¼¹Z¹:ˆr.GúCDï…†ä¾Ý–çr5¥–ctojos]»³þrH~=å8Ô[2ÙSD=3g]ʨÂd) -ÆÒNkÌÓÕ}{µã=…Lt¥·š`¦9™0¥#¤vÖá= ŸíD{ J“£Ë*»Z]:˜gRª4E7-!7-Ÿ­$­PmK™éóÆÐÁ´0ê- |Ÿ:ˆFªêÆAiK{„`ÚÖxÀ®£5!ÙG]ÇØH¢O +xt°i¡Þ­ÙŸ4ÑÆ·YÕw¢Ò¾I›+£¹zU2óŠÙE6òGŠ5´ó ÷õqÏ?}7Ÿ×Їv í_þlÞçk~UÛ}Hïn¹±6¸¯×Ý5¤u!Šß$Â|õDú žlÿ]€”AJ,ù.øý-@ú²G8rí iìÓØ?v¢™C_3sÝ/æS ÇdØÕ Ê%m ªÚ&Z`éÑ)½UK¤6@ÐXK`ó–Ê•?º µMÿí®ƒåâ•ôgù£nª¬(8…GЍ¦SYI‹…¦Mw¥6Ö™¤\Á×Ìêì„O—5Ùkh]"ÖÒ½VÃiÕ$˜J‡ºi¢6Ó‚~O4å ‡å©™w7‘§‡ažâ¦ Pª-"hèm\Hõc´å»Ì¥bBgMâvÛÒ2ÒB0Sm´ÑíO°dÚŒPTɬØeŠš@XÉÞ¦‚[,» -,Dc•7Ç2EO82ua‰½ˆ8äèf"‘ x¼ðùóƒ®Z %÷§-;5Ãrpqzþl?¤Ç¼){¨nPöÛå ¢ô,ÿ³ò¯\LI¾ñ!8ù¢ßVY±Gê{"سoÊ«RMZLeýv” À5ß÷ç3”åëmþùœóÙ7•O_±Ë¯2^ž¿ü!Aï?¼ý¼¡(° ´Ó`YïQ g&ÃÍôdT!æ²¥Pœ|»‡KFº:ó“(êd¡ï€/=WdEΫAVZ5Œº¢9y.Ù2JÏ#®i¬þ}3É¥1t¨È÷'KÇšã²SiwBå•…{jf‰¶ïê¡á…§Àø&;Ѭ_*¾‚ÁføÝIˆ²QõÒECpÑ)æc0 ÑhæÅlÇK¯là9ù S–@u9"&úþqëtu²›‚9X5/XèS‚á½àX¤š]sžJÃD*ý ’U27bÃËTSÇìÃCJnuË72&Ý+ìä^ Ò¦ Šx4sãjïÞHG©T|8€ –¸`ä²°Œª-*Yg=îfÊMëÏ ‘41Çó‚Ò¦É;T±)Þf ÿ®]'åãH''ª­‹(ïÝi ›•h5üN£qo+ÕF+Ö ÍhÚÃÐÆ "¹w¸³Ùýtÿ*)úôª Å´{€ÑS`ëëO/ û€ô¼ž>áëfŽe.01Æc«4AÛ®ûéõ­bö¥ îŒü®€ôÑüP“¿êŽÜëHºú€ô¹Gl¹ÛO¹PÚ­F„D#û⎦òè ´2BÙ |P9$Mñ¼•tbQe[A$Û«÷@£ÕöïPõ)U=÷21[0ÄÙ±*ààÎ^‹¥y³L'’úª¹Í'Ÿ4,¨Ë貚ùån^áe/…Qe+·Q&Oµ$ìöÈjpÓú¼ vn\7 ­ž®ÁsÉŒ‰ŽE6Í#¿k;?I<þä\oöræ«Ý{YË{5Tœ5ô.ÃNë €¼ÌYã™ÃTEš½èdœsczí®Aá­74Sc €Mo`”nÚå$&¶äFî ™’Œ>è>¼!8‘ñH&³ ô×éM%«}Â"`°‚’ ,Jo<rª9…JÂ.ðȨqÓÁL`96ñ×ßœ³Ä 'Áb¢‚£ &N®‹}M,ËÙ묌S9Bœ#ótÄÔäìZMÌ%†wÔÊ~îÔ™á/(ÕELÍ@˜=þyÄðgOÿ5dûÊý‰A²ÇÜúᇀBåIµÙf½p\â+Û.Ñ““(ÇD¡Ub'PNù¿ÊÅï(íV½òÿA_¨H=T¥ªs`:`ÌvÙ€ä‰Ãû’ì]ÆÎv6£ Ås³&Õˆè»åi`- éílÇ›QnAðTo·xPR^g<™µ~JuN3V¡°wôƒ"Ø .j'V‰ä=¥¹o1¨Ý‚煉A Èü$QTl8˜ ¸‘(xðÔ;Îâ\`é°Ö&­·¤Ù§å ¨ŽFÇ[¼ë¹û;}…n*~º\g4Vó1N‡3øH’iOnnã$¥Îe£¹‘9JÓ¦œãQ1$Šï× YÈU Õ—u-’ ÙµGíVPô@$¦ŠLŽ 5 -ÆŸdÍvêÕ‚Ù1LÕIˆt€E3i¹ AÁ¿«¥„ƒë&L¤hYÞYÍŒÚÓ¶ÔlÑÜ(v¸ý[¿¤·Íéõ{ökÐòÝ4Ò¾>QÿHþ¢3Zu»_¤w5./W1½ï¢{B”/°…ûåV•ð1Ïø¬Õ}¤ï¼ÁÈ¥1sßoo‡‚ï”Ôw‰öC~Hã½ëŸå³7@ûzí·íÖ«4Š>žÔô=ÚLPt-ñÈàx¤i8 :ŒXŒKRõöa4Ó=ï =2íé²Ítr­Œ¹Hž×ÕÐõh›§sv¢¹4É#g¨? ã0:­–éís­š]7Ì£ª¤aPª[Em¼qÍXe³¾ Ï¬Ö)¢«qcãõÛNgp3Ñ.*ÐjîÅÔŒSÕF§9P2Ý–ˆw(@Úiì¤Ëã›röC0 j¡˜¸ïNu¥ BHÞ,h2mýFS¡ÃÚÃpvç Ø­@0†ˆQ4…KÁZx\#M5R¯„V9ˆ­dnrÌo…àÄÃw2!Ù5Æždç ü íª>ç¡>Y ‰F :t4Cß­eQ¶ÎsrðO€¤†1HÿQ‰Í?ß„K+q’s2Ûç¥hõâi2ŒÌÛ”® ÜÎOtf±…“Þn¬-Qm~ƒzZ ®L‚…Ã\2‹B‹žtú[SŠåo ¹ûÎ(=':Øp«Œ‚95½»éÞÝu„yÉ«~Wƒû·ÏƒýkŸñ¯Ñ{_÷˜ì­TFàá·Úd:XæÅl×-¦0°Y¯QJ~ò<<’wfn‰¡²¹–u[à wbc¿Ö2ݪ賯±^-?\¡UOz‡YœŒKòØ!ú†LMÓTÓä<–ËVxÕÁþhs,ßÑŽ|ßLÓö@ïÆŽÕ´Ã6®â\^ZÂI4†¢?¤;`î|‘é¸)Rz&¶)‚«õ{ÏnïG°ÒÜ‹§z²["ô6Öí¤™[ôNऱÝxÙ§n®CÄS……­ñR@iüÝþÚ+5¥¿¹äûÓúø;DÚi4¥Á”šC>U©Û:ÔNyÍÝ"k?R<‚|Õ"`ÀÀ6HrÝfÃuìjäî¹g'}0;qÕu–ƈ’TK&ÿªÄ¨8ÆŒ@¬´3+9Q§–ÕætÆŒXo[åǶ­Í)P°ú•{¡˜ýúÔ½QL] ꯤ7‡ôÉ Mc¥G‹ô }¥˜¦¿e^¢¥§ø·«é HZéÓøûëίB×—šÙù =lÕ_$£±ªcñúHï ÝÒçq{gÛcC­&® ‹lë®°ÚÑL\ô‚G¨¸ U¤]‘WÝ;%ÛçúƒóI/€ôÒzHbäÄTÏ$5`´Î1ÒJÖn–VO<õÌ%½ºægg?DÚ¬ëT ™vÚ™G6‘—z#í\Y^&‰Nk㳆€´ÞäS·±tŸ@öÝn’§ƒÏ=íg…V»âV? ánuÁa58Õ=µõ2 × gòsuö ±ìxÓ$‰ðÕ[bFP‚8J–¼4{å0z<ÐŒ…©”X¹9k é«@¨`B"9î[;è XhkY1ä„ñÔ'Mêƒ%÷H(‰lV 2Œnl;:ì³!B é í¾+$¡ lÏäýhÉpX^Œ't `TŠùÏàèûœýe~ö)V9ç*ß«)õ/~äÞÝN—;s|ª¦«Üaý/±™µäs]4Z+‚mÆñx3¼¶êè “ù…Å&0mçŒ^?âåB>D4:ÒTÜ"p*ÊÿÙ‡Èâo¾æ8y¤?£oå»ÿìöõ`õ0øI,þévõ‹ }U¡ aùyÐ ª24çØäe@Q•8L5cŽQÏ·|‚;OEŽrð€øR°ÔÍež¶ã åœ^ƒTF½,CÖ¹øBiöÊ€ý;}Ñ4Õ¥i?ƒÑ¬E[° n;ÎlOýÌ$zÐÕ€ôÓF¿îуpìmàW—CÕßT«“½[Žt@©tê-LÙÌ©;CLƒO梢é°û,¶ùG‘ô1‡U€TÖkèNÌå¸ÌohHjl³+/7íjß©}¤ºgÇUÈÁñ«Ê¨•¡¢Œc™}ù‘ ûkT·ÙMw6Ë@*h]lÞØ…È¥MµWï¶OÑ„ED5¦¯ž""eôÉiM»ëÃx+õ÷æ÷¨‘î³z6§_š˜¤6õEg^â;5Õ¡ÂUÜËSï qt=‡,§ä°]”[”>«ñ…d³ß“ã­py¥Î'M D˜D;“Œ¾}–×Ny¡FõF¦‚£Ó”{CP°ù…š‘&+ú*sÒÇfeˆHÉq#@êËœ@CXyÒ‘Atè¬ú¶ÝdÎv¦ŽiÉ­Å¿ ù5@’¡°6ø&?yÞlLF{¡u:‹}9Ùã™(ùê&µ÷þÇϳæ¼Ê·ÊøM­Ò¹Ûñd„9{"ìWHvÊDoª×yâÆ+œòØz©¼j¢Vª™1vpòcK9ù˃õ¨ÄH˜¶ J¥¡ÖÒÿôÝ}³`úIõ½„ö§›DZjfŸoì÷éGˆô ©’ì ½\6ÿ }ìQ;o9‰bå}õ*âc2;;¸™BÍBï*HŠc2H˜òÿ(Ôþ@âdëk¼WÑïäÑd3øY亮ÿdÇSî$™‰O¦YWá¼×YºUç*3¿B÷áf²9+Ù8êÄ*Džð÷*44­°šÚy²ÝÖH˜¸D8`Z.ÿï‚ÁQa“ù”Kk8šËÄβ“\¬¯‡Æžu¦ËÌ‹´Š·,í2ÜßJŸRiyúˆ´UD›·¯uÃ_nh¨Ï€šd æùõó§Ð=Ï µm÷)Ìuºw9P'¨ôéA^PÔB¥_&akvPëÃ\³8Ó;y0ѹ H‚¸¢«o¤ÏÛŽ½Ô¬ç=óÖ vM‹Ôݽ°Þ›Íú”Å]ד÷ -µ÷Oðè—Ò7€¤ç`v-r¤roŠZe=í€$MàuÂI›îF{@3§fÌ_`1Ke^}–ÛX¥:(Ì*‘¹2ÊÌ4K¡YfìaüFãòeªýÉoˆE~d-¤å™˜B¼ªÖ•çT¶’nufp¥É6*Ž;-ùfšr"Ùù[uDWï‡Ç©½ãôt¤%wHh€*iË!äfÍ…gŒÚ$4áG²—:ÉDY G*W(å|…­M•O(Èæé©‹ÂcäVäßdp¥¦ rŠx™û;»ðª÷n Á'í£ÜLZáÂz̦À×Ã>®Îºø¶—ÊüZžŸ¢õþM÷ŸÚ[Äô©Þu:¿ýJ©?åXí]Êû¢ÂZô»Óòu©ª”‹[6éã8É…èµdÎ=Ê„È:¥ `ʶvfyœðcÃ*Ít *Ý]¦*åïæâ™Ù  ©Xi¯@• S`3•M´™ÐîÚNNêàÛäõ¢N ½.æÌà ÐÂs'×Ì7¥B‡omÓèPA,,z&Ê,ÀÞt®jÙÕ#+å*~•OJFZLÇXNL%‰GÊIɺb½ ±r<ˆòäږʦ`m@‘$À~Øe5&ÖÐOx™9y°ƒ1m)ér™‰Ã`ëšGê1ü¢jº·i7Õ+´í¯nn‰}? i+-‹Ö›†á•ÿV ±xZï WýÓoGNDã“;ªZ ¸ÃÔÕybêÓµG8´ògôg9YÝi)3ø&y€èà›¶å06×`<¸wòH…¿MMcFå t„ûµƒÎHØ"0v§QòÅ8ùØž×*`“ì• ã½A¬À”ÍkU.=g&}³ëKˆikMe?I˜*é§'+îTPá&.Y7P9uûóg?ï3ŽåyåOhôyóŸ> ësþ(úýÓ*u;)*¶8¾ß´: ó4‹ÛA=Ô®±xÖ{à!Ï€Yy )—w–1kv6wŽ®•CeMѼ¿PÓÃÀ©ÙI[ÎÌ¾ŽˆªFG¢ëM‹ûN+X­Øt=+LAMŽÞC&¯~' 'ÍpÐ@ äíN½S^&™™@½vtý¡xü`˜Yc!É[M jw)=Íw—Uv¦+æ»xÓŒæx;–9_¹k6Ür‹CŠ 66ÜW ࣠ÈáQ/äa¨ÄaÓÅŸö¯3èÀ†f7h®@¤•ã¢5ƒJ®§Ena?ýõ;îS¨þ Ž£æoµ09²ŸéêŸðÈ8¬7=õÕm|‚¤k~jQ˜_+»…Ô h[kSVôðGýÚï’B¤þb¶Ý‘J³_å5H«ØMì’XLò„G306wtÎØXË×m O“ßÉçº!Ö Îl •¯~4ÈŽÙ¾îY〶9‘«žñ<ˆ5’e˜L/M;©£ádd9zP¡xiÓ Jâ‡å¥ƒëx ƒÅ_ß0Ùo‚k4;…»/kN´¼ÜtL«´Q[΂MJ|£‡æàÊÞ²5AÆÁÛQL•€RÒÁ*g¥H:ÃÒ_4èÈÇWXjƒ™äÍ7ÊÅÔô>PQËŽlÑ,«UsQ)˜2 ºÆÂn]A„íf3tôÚúæ9xŽ”ëZ; [„yxg§êžÊ›H•O^zôyÂݓֱ,/2ø`¶„èöà+ MeÕ­® ýà äÀC¶©=ùíi+ÓR‰EnÅȆz”Ó$ã­9¶òæžÖJ‘RŽcŽ'ý‡=Ó³‚}`§e JK÷¨@O¬-vÐðÝ‘‰dãg‰mš…¨mܼïf¿ë_±JE&ÝÚ†ü{;Æ`fÙñB{™¡ýÿVGÖågîBd–ÞÑs‚ÎÒ¼”~šÞçƒ]÷¦p|Âþn†œµþi MKåÝ")F¼Õ#¿² © dÃû7{¬ÒÖá¥Úó"¥·ʪ¤ýT_rb¢îˆÌ;Ÿˆ“;9ONáÄ,¨YÊsЀæT€&„Ü„’UÛ¬‘ÝÐ _Ä4Yö0˜‘k”¿ u‡K´¼jcº’UtïkjÓÉi± €´}³=«D£xM€¥Û¢aRF__'‡»«Œ\ ª‰y"NN!P—˜è£2z7z ýü9½që„-aŠ´ÿæ6ÁÈ'Tš²n>âl«?™ƒÞæëÿɲ}¥¢žWú‡ä”ÛÔ$³>±ŒÕŠ|²Õ&[ÍtÖBæ=3Q ¥ Ô-óœ Bu‚@FÀâÙ;e]ë…&3«ñ^Á’…@ +­b5ØêІ"ܦvÚ_n‰¡i Ù×¼ò¥;;ï›À¨RÔg&5y¢›Bì›øé4ÁóTA ÎG35Xƒ£Îãnµß:!ë<ÍÌBÙ¦|í¿ëfÞó)0—g¸é„mÝ}p7:¬u_]:“QQ5AF|ÉÏfšÃZ”“³¢š–Õ¶UlKœ :GÌG–€åÉ!ÏÝOOù»y(Är«—p– v¼î ÝÖŸ~|+±Ùüî&ñôx ]¦s2`Tx„â‡WûöÑÚhé+côˆ‡æo¿ËÃ\µýâ®K=¸ª»f0î]kš|êuýÕ÷SfÛß&áo‹§Ç9ê~UðÞ>œ§þ>Ÿ·cY1½J|/žŠ|ê‰í6Éíì@,†Í.[5ÓÑå­ÖÒØ°œ í¦1FÍŸ'kTH’ï¿y Ò“ ¥‹Ã¢¶wÿÚd”¾ˆ´Kó\˜WÓ!M%R"ŸL¶ýÜ,¡…ȰAªì/¬ýY&°™! Âh=Ì! ñ|YqìrÔÐ@šÆÞ蔹Φî¹4u9Ž7ùf0©€¸?ìS‘Ý%èŵÅPO$w¤Å’丣½!±Q 7¸.ÛŽhDR‚“Âç“¥¸‹(°“³T„àHYÖŒÚ{=e°”€–Hp0à3 ¡4˜#´Ž«StNÿ¡²'Wý–´€ãäl­x[4/vO×·Á±@ßh³êãr˜Ûnå>]>.$; SMÄ7sUŸÁr¡6cL>Ñ ­ø›sÚ{΀˜[“ôLþ¼M¤|„ó‡Iî—óQâÙØÒ¶âæï¬¡“.Éu§™)wæŒk*=çŽuL*PÓºJcåA#à2`­¼YtÃI§¼ zj ÁÂÿ}Þq/i8苼œ‘vz(ª¡\{“Cââ@NÂJ† nî©¡± „@/…ÆchUg‰&·r…‘Ï»¿×ØL~\CY4ήÊÐÕ"ÌøPu°,¯LJ!¶¼Ò¨)nVøÞH‹ÌÉŽØ*Ðê‚Û°áõèú¢gµéBkãòÊ#0-¿¬Õ}¢vŸ7~b³¤7ÉO¼ erT¤Í8…?odÃ_ý¢Aï{ª_ð»WÔGÓó½¹ÍöïÝÐgw0¨_ضY–,òá<ÁB«ÓÒáð› úCÐ:A%9hz€;…ä¨ÝÅä­ /®¾;­â5¹âpó½µ:ÀëkåµÜFÔ£¾‘ŒºX‡îtË yñ"ñ²8ÚÙ*€¨‘mºkÕw°S nã™ öÀRªª¾©‚ÓèéÕw§fÔ´eÔÒYg¯ýE”ƒ-äXg§óx\üˆg‹ž¦§Ô€…Îf’ ÍãiÕ™tNÇÄ«tB2 …-²GÇ6U@ 3!O,E„ŸØh¹ÙÊêH•ÚIˆÔÕS!™CZFÏì}á${kÑDѧ©‚˜4‹Nø5M>¤Ú›Ë4sºYï<,й.-ïsnà­ÒJ\²¦ƒf©@;1ûe¶÷¶i£§v:ÉEbþW‹‚ÈyI~#ð¨B +¶F³cÆ Vž2D¢ñ8ÉÑ]že |RùÑ9|ò&å=Ÿ‰ (Ô›ÿ„H‘¬ÉA,ªºÑÈw‹# á&IVÛ]º3¹uçl=±›YèüÜ7;©.‚¢h|E£Id¤ˆ»¡gl³»N¢¢°Å ú8H€§usÛÔ…µ5}ÉœéGJyÞaø¥Í„°‰Ð‚×År„g§ƒJ}'H«Gª¶ ¹¶Î•å¾OC»]㞘-Þ©O¨j€ÍÄQTÒCñXtŒ_ôÓ„%Vâšpä-?ûÚð¿”Ø>(¨÷yô<á*Å_’dŸÏ JEÍ«ÅåŸñçöúG™é·ÉÒ!l¢ïdÎÚ|¥‡§ ¼ÒÅÀ Öíª~‚1” PØA5.¥ô†“qßœ\¿ÞêûÄå ÆÖ€J+]M2vþ¬ß jaöut ÄÆõA§r pØÏ2võ":–+Q*Þ™=ú‘nãþÈŽ1€mÁ;Ôaˆ ôOf…rò±Vþ碦.ÅDΠÎÅ’U$+ó@eJ¦læ¶î§O3!­å-*êíüßñÈê»ç,H®ÍvB:04îíaAÃôAÊé»Gvaôp“? ,²Ký3“÷,õvN÷A† š•=“eêªxÒÈÒÚ \xPXÏ|ÜêK2?õa}½ú15ÖKV®EB¼¬ùô×ÏRèós³ÒßQ99o€4Ô+ê°ó0HH~ ŸûZbkÊ:‚žÛÌ(ÊK¥X«ÉgZ¬ Œ#õÀñE9N³yt$ìH]4‚-ø'cTÖIÆi‘-[«† ¡ µ4z*pmQçWÒtÙž¥6HS~|j“ãü‚E¦K¶¢¥ lDCÓå~Mšû çÚH„’YrÐ5 8ò3±él&W&ÁÊZ7+x•®$Ge‡oê®õl”Øï+«¦J5 ´"0™†ìÎy²ñš.r•Èw°•E8¨¨ŠŒ#¢¤ko l ¢8 ®Qu)3"µÁçRðyƒ÷ ‘%ûâL¥Q\“5¢üï#¸Sª€„ªE¥ :ò%sl˜«H-—”–PÇÐèï§Â¤i (+uj£2éu ñ¤îÎ,çKÝ—âÞÞVpë¡t(qzÍË_¼°yG÷êŠnêxÀ¾1HU:­äÌ|ºD“„f¤?ÎKï‰-X³¸þ¡ÌJ2NG›ø£y eî_!yÕ-(#9ê·+„[r;Ù ›d¤K”°tš\óÖ†c¶ ekª$èÑ\‰{u®iÌëRc^&uñt¸¨Ø8æ"l…ÜJí>&žˆ“MŽŽ!(GBF)ã©Ý½j´ô±ÊÕ…GÖCc/ YV…ºœu\Ëe e½hvá'Í<‡åâ4^jWkœü6’±—G>5Z¬æÝHc¤¸V–“2§A+vÂgÙ߆e]òñ)~›6ÕŽÒ6ÚÛi•¹Giª3Å-zhoROèÔ0-p¢ßùŽÔ’îf„ÏO`äÓúéAXS‡þQô{Ìôös/ÝŒèËV?üá„üéöÔîÒ!µ2ЧÈivú=…ØéAó«ÆGÒO—üå-HI{ð`4Ú6Éq’Ÿä²ãE9i6¤¹*=­x‡ŒèöÀÚ6è%ͺ8¼Çû²¶5g6Z…±…²P§ë:¤ì€ôóf<6Ä㻊ÇMøÔÈ85¶Þ'ǵt=;­‘4ìd~ ¥ŽÖu5Úw ÷§gfðÌEëçáH:¡„vß0Wm¢'ÎÒÉæðÂy³¾&ÜY¬1\3ÙY8R¼µ- ¦Î Ù¼Ï=)±Dø6© “ûNÏÆj…µÏúÒ‰ýæ>ïò¬ñbµkÏØ#x~Tʪ |³UöEf1ï¦lv£]þ “Jz·ª– }êÂ&®X Ò‘VÛbÆBWOí½)ÝôäøTˆu_OgÛ1v»¿÷þñ©<ñrOù­}JØtÀÇ_x\F">©)•#øYéS-ñ͹ñN*J …ŒÇPÞ–Ä6]ê+ ”9Ó*0Êäl˯ң۞àMÐ4‰¨/¶‘ä^‰Ylù‘}={@ì÷5šNFImD@Ë„âã²ë¦ìûh®Wv¢V£! ÃÜ.QuG³;C5ÐUy£[ë”_lŒê>Û1¢HÐ@ïDQ°”ö4iÄtÑdÒé„e=퀪ycćšO3ò¾Õ¾C6.ø‰öý¬`o#s±§[mÇ—l5Æ®'ª¡¯V$q’úH\š÷xË ‘MýTAHÛI³ûènÂHwoäòÆNb”UN'Ǥ±Œ–8ZuJ'ù!ènª‰Ç1ŽÝìx &¯: *=—Ý™õút¿œfà´þ†ß ˆL“ô™¬ÒÌZ“È™µõ=™£iœI¨ÍÒ²»ùõÍmO3ø,®-­?ع3‡­ñ%”Pðƒ-ãAþëR9”#Á”‰‡7[?Ó¦Sâz²SRÞú,Ù³ïÍű!È@å唨U­ ã1Gxú®~?8¶íös¤äÁ³ª§•<™R-]v~bQ–J‰†lbå%çýN(½Aö$ö ШRn?OLGUùeÕ\hø}¼¥óøR—&ºwÒ¯`á:D_™‰Â·ÓÏ'kM‰C]>p˜0^ÈZ–iðhÆ“•@’£k« ›õFïxHƒJ`Ð:¹ÜQ/„Vk°Nè-«1,=ÔN–¶}È¿N.Œ+ ¦qÑ ¢'"Ӆߦ»À'ªÀ:qÛeœ™íïàÁDo»ˆÇ@™É· çc£ùùXðÝà Åש™×S¾ÿÙ¼}üv¤¹©OÁ¸Â³÷3žßf‚¦ËIξLt‰4&?cnª$“«Á“Ÿ‹D£¨™ž”’ï,¤‚ô:¸—yGãr,«÷W;‰…lÒ?•6('ÀáSìÕ)~’»¥isÖ(}ÐA±SíP­Ï¶P½ãúâÚ" °†}¢‚wæµltsL¬œjŽ’E|X~™‰_Î"U: "wòD8 A“”vüÒçã6«ž¶ìgމ”†œìüºR5&ë¶þ÷bʇÎðüÍ7€¸ZœÜ ¦€˜è–Ñý¦„åŸÛ©8ÍèæçLé,íR‹±Ó ™,åú®³¿Z½è´§Ìd ­j&u…CadÝSE6ƒÏ“"¤|iÚ: /<*2³VщÈõ‡[\ NšXª«W!}§^ðö©A/%@Éú¤€b+Ì®‚±Ó Ó0CForbvyF‰³D4˜Ê^xöC®ndemºöF›ÃSÚÝ»ü’4bEË8 žŒjÕ>×ËVÇrÉŠ£žNþᲸB¿ÉMzj¦ ÑË ž®ä»œð݆2MQ|*=ù-oPò³€IY¦žO8?6¦øYóí_zNÑ­ýˆFŠ}¾þÄyOgÝo/‘Ï×Ó}¹ Û’< G€¦š¸•ù•dfáÀ/3;ŽB‡‘Oç4#7UƒÌ ÞÉhŸA·Ì>1ÔEƒ+·qõ„ÛXËLkÑûÎÈ;xßJ],ï‘(%)xû¥!“çRTË%(ƒz¦}Ñ}FzD‹¹ë„LÐŽ ÆçWABΨ&Vìä)MƳ“ڢʧéô›™ÔWíБ ZÖ­D;jYª·›,S¡¹%‚Ì ÆïÇÑèiËäÁT!'yêbð¨›"¶²íK²Y;š†ŠÐáã+‚LUü@ƒ´‘Còü Ýn ñw~4ôTA.¼½2ÚÞ…N^Õ'Ù‰Npµl­^œúM¬}1r7 yï,SVûfs6vB£h½j}¡j=P 4pü?nEk¯fö ½2ÂGbðænø‡›ûB2Eû·­Þr]¼EÀƒù³'Ë|‰Ø¬“KPülÖÌÅⳜ®ÑH°B‰NW§lö&jwä ƒh¤Ö$³©Ÿ€û¢Â8)TÚ9náI<å¢5$GcÆ£Y÷²&«^uά’e˜“/Ñ—%ñ§jþvÚaS˜Î¹u˜㥊}º‡AàìØ”xÉœ3d¾Á9—¨ÃEx¦+Ôeõ/¼Ã©3\ÞÃJŒg§âØê˜Ìâ >» ÍT²÷A>ð3#H§Ó'*~àXß™A¦¥mÕɧÖFçÃJZ·ðÀªS)^Æž¤0“ÏxùÞZ’'ÊÂ_0gðüð@¡B"{– áÒ¾œbÈŽ=1Vd4ÑÆ_§þHÑ…,Âq¨~îíô›õ´“÷oÒ¦Ÿ«¿?4èM@2Rg€oÖöÛ×™ý¹‰ïVÙ_÷k€ôÐSÊ«M½üüú+¹× Ìvôƒ:A×±à G¨©Œ«n.ëNŽB‡]TZ†/äq‡ãu®Ì–aöGÝ`É/h !Gu‘RDoÃ=…Oò/ÜWd¡â‹û"Å;|édÕÀšxãȽÉÅWÓBΖž‰À…ó#¨®ì(ä­ô{–ÂT’ÌÍT’Ž·Z„›h|£wÓ¬içÖî|Fo%EÏ‘ ýé …õtÒ~š¯^ž@n=ðx>+@‚y§'í¬¥Éݤ^'yíf@éF N^j¬–Á´äì65ÎÊ-ÕÊ·<ÕÞuÛÄj!4hÔ åNDz±Ãìyæ~5óê½X´’èT&Ív¹d-z_¼ÀÙyœ z'F*KO/ðV¸èÞO¦ÐºÈp$£@Q~˜@%¶Æ·™›FÓo¯@ÚbE¶`èg¢ )rµJ޳¾ Ír//iÊ—²MÕ&ÇyÒÙ‘NHžtkžÍ?2šEÖ 0|fYýžr)¶(‹ùrUzßüÛÆåé`¨š‚Z9¨Ëc''K[—9XJ¡;r%ä…i$*c2Š6zؘ··\§UN7oˆzæA”"×'ÌܦWS•EzG'b¨$ˆEuO‡æHÅŽ;y.mÚ;­,¢÷{%ÃvÊðlT9ŽÒoâÕÆ‚Z7=Ã余ɩðT½ˆB “KöaŽÖŽ~ÞqdDW™6›…XH–0d"-d´à•ðØÍsÙ3.V£  ”€x{P‡ #ɱÆ}Q~®ëÌËÈ>2d…m˜1¶cÝ¥ÛŠwfQ.Ám\{þRSæ<~<úÝûòãÌŽ¯5§­üÏ©y¿¼D¾ÞþÖ\3¼9­÷Jæe€_5ü!0)8 hJ²;^ŽšJž² h¨Õ5Ôë°èsøB]€®äV‘!{6"”Ojœ5UPêsÒ7CRyª¸W }£ž]:Í£Y®¼"ë–™ÊÜÍëídé ®Šw,Le½PÈÀ$ ˆR/¹`d"j§ºzp6ͪ~y„¾Ómüq"˜=ð†¨[Á[ÑŒ‰ÿ3Ûu¢‰Û-XôÚˆh¤™dT¨\ íl\m¬ÑŸTwÖHrÊ0rö+wT¯úH“pQ΋>ò&Þqxa+ùÕö¦Ø*ÑÔS+Y)w¤½Ê•âõñaR`^Qï$8|ÿÖH=æÅu}Éé%¢ˆ>©M °1}•õÔeüdìa¹OxKß «¹ÒJoÌŒÁAƒÖV’·EÿÛõHqOáü›ÍC[Ù$À¥èH+-M`4Ò{ÙÌ禵&lu¤‹6” À•ÔͲA”q½d"ŒÿkH¹2é¢Ð8ñ¤Ó0–p®–ù褔)1×gé}ËDãåTLì( ó0Ö±hn/#‚È…ÏŽ«éƒuáÐ|’ËVœE•C½ÕK™(á.èn£&»¡VW81y8ô;ªŒX³Ëf‘%’*3T€!Ï¡ÈVqpè»a‡\(Ü1Xƒ %µxòÚ¬Ú9®lôK™ÞTXÉɲ $Ñ…ú[9„ýdKU`ÀH]Ö»ž-ìÑ  k¨þ¶þ“G ²qtX%&Ów" V¡¸ãàµ<ƒÓ£Ñžß)ר­¦ªöÓåan\ñl€KÓÙ'á7zþƒÖ­·þ¡w]ÆÊÕkb¡o ç¢`OÞƒcä‰FÎî„n•Í •° Š÷J·Î‹ÌÒÎ!›y7Ë$ûä¥}:2 'Ïh€£“ é .íÚørúÕÖ·ÎöÈÃÒ´çǤ)ת¦¾ÏªÝfÚØ\”qjJ¼¦V-?— C¤²ñIÁN¹,ˆVLlv,‘*'DÊIû 0O¥ët 1§z£ÄŠ9/jØdÄßäÚd½ÏUOdæ!®ÀÂV=–üàÒ¡6±ðö vQª'çI)Ñ!³ ˜i3åÍÚýf®ñ_F¶86£ƒ~NüÓÊk Œ¬@Vžaj*€¬Êq]BQÜh>/‹'ÇK2ÐbÆkˆ2äEäÞVH9HYF$€£"_ûB¸¥i®·Bóçó÷g-’Þ¦ódø$è}Åð*dOùúóUŸµàÔw+„mýéÃ'd×ù‹@éfX¥€ñK`Ñ.@I[w'Ë¿ºŒbÓÄ£Â@µBFHÖûˆ¯]ÝÉ¿C tí1=©Ó:ýÆ÷¨4 (Ô \âfFxϲ\˜ZÖ !Èd£DâàÕuOÝÑðƒ²ÌEHpÏT`™N%0ìÒæ³kÉ›‡IŽß"ìÇãgz(~„±"åV…ëñƒ&SE06è*¾[Ê©Pˆ_;Rçjh‡¡%Ò”NU³9˜w况Ø7 ½ë‰Ï½ìÅW¨[3Ô’­òµ-ëÅÌ’“wrnªí9L‡þ„@>]§H{BÆÇa‚ʲl’ÉÝßbîNDÚÏà(óTÑ™‚Õ°¨¨bq€¨åÜKT_ØŸÍ9^=O#Rå/!& Ð’`jZö5ï ¶ÙP?Ò°®6¥…Šc9'ñ¼®& ž ÁÓWmÊ>I¯Ü„6 &Į‘±øo¸ "™u—ÑûÊ[@呚9íäÔiFÆFgôùÎ$ êºåÀ6¹¨N™á6^?l<‡ÒÍô×Wc)K]ZGhÎ ˜zÁ—–ÖY÷PÆÔj#SÑHGUöo@Y=ˆ4ĵ•ž‡U„Jéy"JjgëÞ4<™„‹@O¥„ç²Håƒt²Tø±$bÕÍ'—Eg>:/NÁ(¿¦€)B°+@’ÏkH2u‘5Ûa(Myd†îˆIhQ¬Ý•~ Ç>à—Ô ²ØÉzð'Có°XÝ”?žÏ{‡Ëië÷×,žf‹<˜ôkq2RáˆT­ï~š¨r,€÷bŠZ"m/¼>VÇÝÛ– ŠüQBèñìo„ ý ûæT"Eîù#°EÆ%ж½ë°…‹¾¦ŽHHÀ2&m¹âé!öÅòSs Í65ý¾8+èÔo©¬‰Y9#ó}e(뤤$x¼8kß:4Šöƒ'׊‘m(XâÔÉfã\9¥õfeQòé92¥ñu*l ‚3|œ?)î1Òy|7šIYÒ¿ Bù@zÕô‘øñõúÔ?8êûmÚ=M³MªÇLóëíï8­hz®_–!ý¶‡vË¥…4Á3 )¸dòòh}i”$tu­%ÏÒÁ%¼j ¢åC&«Ãg ¦¾XAòTBU*B¦ƒAvZוSlf@Êi  é¢&@:ìZ«<È;Ý´€É¢‰¼££¨L¦ÀŠ5:TGÛm Ï M±öHó¾ÒäŒ¾Š´+ÁR§çz™–ï’ÙAm2mh4ÝÖ.F1{ž –ªöÄûâãí;.½ÜÙZ£šª½½¬\Ž%*(z4\´°ÿ·ÑiH(¢ ‚l*$ ›ž4•¶ÈPà€3xüt‚7À4ú¿pŸ =)ê*,ˆ«¡óº\×ëVÕ„öŽÈûÙežkÄ™{”‰«2[°õžM„•mlÖœöHÜ…¿äˆ ¼òXª»Ã/Ki·™îy‚(¬ˆØDM#ý(!ŠhDF³ºLqj)°3óm³Ì€F¶aú#í¬ §·VÐ2[ÊÉö#‘Ì`uåbãYbÔ*౜Xˆ ãçDèÄ%Y¶É¿pýV´g,èLDh¤Èt!K½Plü‹Û"Óö)bÅŸïÛ)KÎÄ µ6.èI €q‚†”ÛAé@α󿳛®Úž «#‚ÔéÊ,•l´M»ø–š©•Š–Ø6z nÐÏ^[(\ì<ªv5M U¬KQ ƒ›«‰œ–Ûe$8šózH3¬hØJH;#ti[4—Ýlâõ¥dÔLîªØé]‘ý˜™î’èqð<Çm8.r)£»ÙvíÙ)™ú»ËÙZè ¸±D±õ›MDÉÜl2¬Ð 9"§¡.Ë€BhÒ#’ØØã—'r +Ò±ÎQž6­ýÈò,ô&aô'ø?¡þ|˜¯ë‰¦hGˆ\ Ã`u ÿ BÂÁJ¦†¾:¥‰ï¢Þ1¾prÊEƒhÂNÏ™ùñÈ“Dû ‹žc$Ž=®ˆÓÙÌ8 ¥»U.ë4––7Ñhfƒ,Ê; £)üDp¹F2º[a\^eª/Hy IJb·Ý.‘¿¹}¤/Ì})°}æ¹Ì+o†úN Óo‘Ö; fâçWÌñãcðcvñ÷=Êë'Xjâ†ô–A8‘™ÂªÞãÑò§ha#Œã4çÃá#1(Lùüvʦ:χJ‡Ët#; ANºÄeù»ie„µV9™ÎLbS{Èò‡x”²+[…oS%òRÑÆ g§~´^ÖG5£=X³O£®ÆcV‘DÖrí ú¶vT¢«“‹ñdªn2swÂì,ë)@BÑï|yVÅ΢_·Þü~ÍL—ðå¾i2ÕRûr>Ô[”!#8s."B%€&Š‚Ã`Í Åÿýœ¦ØuÉT€Äv(mQD—~#€$‡¤Jn$ ¡=›¿Ênº%HôwÔmWXÙ0‚ÉsÔMù;»²ëHÏ-Poke…™Å6¾µùë?`Ïw~¹1¶—säB”EŒX,¬$+9·Óñ÷T'i64…Ȇu°žòÌyõpH’q$qÙ,«á`WQ¨•‚Hkw ÐPÝðÉn®N8¥‘ j´’%š™}Êh†ë\(ì¶oÀP'×J-Dbн:òmÊñP'ºÓbG2MmvRsIº³b0æÊ{B(Öó°"¿9Ñ4³U.ôŠÒ´yS\}µ™ ÓMŠ:©UÆÂÖê]ç¿É=q¬KbìǸ³­ó»Ò=ᶘڋ…zT= stŠޏó(‰D Lpa+)g…6 v零0–d¶ù&+Îm°äF€ÅE<}³ÂÔÈzËÉäw*u@Ü>¾þr¬ýë[È$ܵÓû¤qÁ}ÍÁ¶Ûr]þ«ìVæÛLO;gÅ ‘Nóp²n0< G2sÏ.££Æ &á3Ö´ªÒ¼²Ð`–0L ^rU”LE",ÅZÑÈX5qŠì¹ ë®m¤ÅðârÙ8óS8ͪ}à»Êß& Ó¡säôGÒ+uµàèÑH¨zŽú»ÝåܦP/’Z€R‡­‹ {ÐGžqt°©•òÆÊ—rF¦¹"†¨4“bœ<¤FK³Õ”,›n,aXMÎüMüŠüÒ†Þ˔ֈQ–. Ø pÍ<¬À PgŽ“ÖFq}mõŽrAPƲ°¢­Ç&cÕéD­°HYQí8#‹bM—OÅéFµ˜*ÅvÓâ+¯v±ãh6d{¢DÛ@Eè‹Óˆ3W~Úåáɲ'6Sž'¥äžR‹9‘Rž±w5 ¹††^"ñ›7Á# Ÿf–éËo¦'“a÷µö³]¹A£¹dX«®My P,?læqz]¯ëYsó/€ôGþ Xz¿…lZ±öy÷A Ò髃¾œ±ùg³ð·û£Qù7yRXº´$-1YqýX£§³&×ÎÖ»d æœ5—•RYúûA늓ÝDV›@ o@UI>½ö/”Jè}ðLºLX®=«ÛEv¹XrNLdžx#Êt$3â¤T ½»M¬-ñ6[| ¦a÷SË#Dr«•ìq¥Ô°×é3Ù^êëYÌF eóÈÓ¶|Ѝ€ïvHÌGiôÂÄppŸ©ƒ{hs>+ŸðŽŽkªFoódÕJ­X6ÓAeH×Ûtzn,²mKƒD¯(ä]qžNƒSM­­]¿<ï›5"%c‘ÀÊd&¡TV‘­r5\–óMc)a:jk~3MøÅ•Wvî+½ÝÅ5meWçšß{¬} Ø6glòh±ÊÙÐî,Eá´ÊSåf«!¯ÊVì‹òÑJ‹éyéň!ÍÅ%™šMì˜$Ny“Iìè]Ž–¨:¸oÊ* j½µý¬ZÿþÉzÀå¨8U9U"WuZ¿ÚMDW¥£RîЗš%m«‡Ý>ƒU'ÔÁ¥²™µ¦ºÈ\ó©ÓUÆ|‰o®U¢õ †v;SgumAcV¨ƒj4¹XTÄ¥¨ËâR¬0`w8#ë4u·&®Ž}(«é‚ê&V-€¸t\|·†µYb«Ä8=:gh„ˆõ}jùcü‹ßµIHïe0‡ÏP‰Îî‚f4Ú#ªlü2æ…ýü.’5ªìZ l:n¤…Úiw>ÒL\ÅGAÐ'ΚŠnVÉøµiôW¤¿¨FÉB«~*§‘—yŒÛ&ˆÍMh™RñV0‘ÚŽ˜y¥…G79Næ~úP-ìÓø(|¯™joKí=ANÑsÛ­#Ô¨=ÒÈÓ`©ÅL‹.®²Ùÿ)Fñ ʳQ#;\‡…ÀAgRÏy£(ÚÝ0Ô¶üÖ,;Ð@ôš89W Jz qÈÚ¹&\• v«¨ÍÍ4‚ã:›ëÆÃ4;Ó_ÔL/3uút<ÍBHµhG\Ô;Öîë€ •,XSî$>=Ïè™8”@]'GFÞiÈ~„AƒñBw¨‘nªåÑáÁ¹æ4né¢È¾íðø‘ק˦Š eªSòVÁxú“haÒýñ&x N¦ó3zÁL˜Ü‘Ø‚ûN÷¬*‹¿Mmþ¾h&ºÐa»Öâº$?Ûð~W›Ï‹ÛÂ?j[ž¶'X%Øwõåj–ÅYXw_ì ~§?ÿÙ—ó{vñ)/*{tª’ã˵ˣ°¦( Vó‚QÖv{D/_ôOôò½ÓæXÊÛ©þÔúÊÅá–öÕÇ]¬ÿc§ ¹ ÌhEø”‰oÇ,®¶çÝÚx@Iœ'¥.ä…½A•`$)Âl÷âu„ ," f´c×ëå0­²ÒOÕ\ûJßÐû ò½&¤Úç§;ÿmaT^©‰ª¦NjÚèoç3‡{a'³¬¤«d¢T›ùxÔaAZ•¡„7§Þ”#ù6e ôêÿ2õOÍà‘:mäТ‘÷ú¬®TöH°º½+`ÂÁTÓ}¹E¤C¦t1B®Å›/’·žm¤9åÝô†JÚÚš|2GÁn‹pñ/ r?9…ªoX²ÞÎlmâæàµ=Æœ³»}§¼NR"Ê¤Ý fhñ”­„¦ e„ŸRèžvØ,4øˆvjUJO9MÅ2y  ©1y¬ªUÛÐ¥A‹çjp•° /Ò½šÙªuuËPi,}Âã-ÓG%K P ©ÇnÖ\øh¼Qe^A`I”d“õ#oxx?ŒÃHßþ(RV˜lü p\s[ä}䇼™€æŸ©+Ë>%T¦PÒø2oJ9…“§BÃÃÞšeÀ=ˆ ²«ÆÕ»)úÔx`PG,kVka™ä\ þº”¬3G©´¤L¤ˆè:ÕýoV×,¤¦‚‘R—ñº³÷ª¬¢KšžŸ³ËžÐzÇ@U'H) 5%P©rßÁAð§éF®ÓlQ£-K² —3 w3¥u‘D›S¹º ‘@„³‡† EÅ@ƒUJ:Ô&F—å¬iÞ5BûzI㊠ãŠùºÚxªP àÐÐ9g,O£ƒû(â­¹¾˜ü]½ëÆ8i•ân•ð¦=æÁlƒe´“Æ…1nƒð©/mµˆ d XäŒ^ìÔ)æÓ²c¦È —ubónc¬Ø\R=­»ˆ$äò¿³Z„µÙàç'Fg–o>ò*zUèt»…œÌZ{ù"åÕÅ6Úó•Çvšˆb³aI—¿>q®"À¬r\ÖRpäO¿7{N.“ÁQ4bï¨.Ñ*§(¶æìØ®mVÁ¤»ÚÛ¥ƒ\ôÅÓèæ@®ÄPsÆ`UÚòè%Ûß]™ÝùÞ&6H7Z´Zµl£Éün§§aŒ7£TfGýª{ˆ¾6ÎL98{£nçmX¬lÁ¬¿Á>€ÓáÈI– ªu:ÅO‡}= >m¶0œ³ÁFÀÔ40KkuçÒ gz ÞwëNÒNg¥­. M=9>£ÞŽ( OØ6ê³ùS‘ð1袺Ä/\¦r+?ýšX!è¬Q=±½Kɬ°áµ±ž©áÊü-Oê ‘kÁAql¯&D;Éô_Æ9Ȇå̂ьŒ¯²`i¦?ýÑ,øÏCä\K.ñBH4¡€;Q êî9–Éfno zÅzÁ ˱˵ Sª-å«ÝÝxóA²4­Íúý‘Vñjb‰!Ù ¨¬ž¢rŒˆ ù"8?Øè¯”“·ùqØ ìˉ\“‚/m/Ä]+ xÐWu·ÜTfW N‹ÆÔÕ_Wœýb¢»ªE< Xœ¸ŠX§˜Uõ6Ÿi ^uˇ3™tJ7g¥?=Ü'OÅÓ–)žxçÂ%‘³@$*öP•m#8ªÞa–ÛÌòth»k‡‹]ä(Õ©&Ð5?ç¡}Š ~H»C‡OTO3âÄCiÞMæ¼4!]ô‚þ'oçk/Ù¶Û¦§wžFæJ^¼Ñ[èôécño–ñõý —ûòz³}ÄOÿ*yƒœžx„RUÄã…!.WðȾaϰ Í]¶™åsO”—5y¾›ùâ™±T8+:&?*¥‚<¾EO>ðprLO9~h~lÆH´×¹l>ÝÈŽ%‡UUEæª#°.mÝQUxÓ¤˜AF²¶¼Û”PÌÌÅb÷,yU“>]æeàY)ÓmGú¡xÖaåó2¨a¡jýÓG›yvþì ~*[T]Xìõokã~°Å¿Òl£°Î8 l“Ä,!Ž%Èàè«jf/£€ÔáÈkpqH'9–ý ‘¼œÂ#&ílÜH´ØÔdÅ·º<'?’ØV—)!œ3÷—nƒð\ÓÖÕa=8l¨`XÙd d6;QoUø+›Ø‚"âie›At}<²„—êlº»¸ ´r–͵s¬?d ¼g3;±—|çÉJ_ÄU~eØW£̵¤üäLcÞlI|ðçÝêuÃ|/òåFmª.B˜Àm"š£Àž?O%z´¬¸B4µ¯:^b–ö˜ÆÜ«¢ÝÉ›BùäC"‰Ÿb!¹Ð½WgZÌlÞ»9âa +sö°rÐèÜ\ûëÔéEÅê)ðò†P*ÂÄ[ÂTi¡7ÖѰ³PóŽ¥ñ1­3 ÍvsÔ](Óo8–iñ·Ûß®!Ÿ Œ&LÇeSm|þÊÔSWøPÞ”‚ºâàù_2˜ŒÊ;è¡7pŽ&»lüâz6³Ì‰½ Þ<"¿“mœÈ¾ACÂÎÁ*¶…t«‹+Eý\6æWPÖí@H…âã°n¡LŸzµ,S-Td@Õ°oÆp½áyÏÖ…§Þ±Öm…;b'ê ðT;Í•:ƒg¬n𿙫¿ “‡}‘·ÕséøNz¢—ÕÔ˜æhòF ì7w L‡môz”cî÷´s–¢lÁÒaE¶ƒiª’.Lòˆ¤‹ÓeQj–¬ô–M¤.Ï n⑱˜B–ØL®­íÐyyÁ<Ë›H?°F#\ò¹ã¥î¤ê ’+Õk·¡WÙfýä;#•€Ún[ªV¬_ã†íÌrèsËp·ueÌÔA¤ƒ2Ì+˼›/™N̉Iè•*FÃÎIo:X?¼C¶ŠŠ²yiÓ‹üô Ýœ —¼É¤ôW†¨˜Ž=ín²Võ¦¯Ô‹Â:tCsÙ©Óz§mÒÁœ±ƒ¬½Ö»A3åK¦ßB29»À+gžÐ³eÞU\lVÓJÓ´õRè·ÆN·ò“ÍÊm»†Œ"<4¯®¤6éô3˜:(”OY©ß · ßFÁ¿H+­ “$÷ïb°Íam†Á©­VÛ $6+”Ââ&hÓ¯‡õ>fí´"šƒû@©öàŒÓ cڧÃŒ8©m}jª)b¾ t+'½Ì’…q£7úå¤=M2¹¶d¯v°>x£_“¹ÊÖò8{ ´ú‹%¸W…Wºç<è­õæR…Å3y´‰¼¨â|ÜôMnŽçÏ4×'T µKæ@‡c‘g+¿±Y«‡¨=Êi锩š%ɪ…"xxó%C±× ×ÜYE'U¦bÿ¶þ- ¨«J³ÍU4UUÙÁò{\eËÝYÖün6dì36ž¯ZÐ4?¸®Þ2U=ñÎ͸·Û™ižœ ¾<¥ƒ7-j=Ûã°\?¹QÏóþM´vºŒIJ{t†–pˆŽc .-h ¥ u¼Ûñܬ;v% ©ó²È™¤n·æ4µ¾Î¬ßËvé¼Ãíj7’ÙÓ¡áëIƒ´,>õPØdü–ê ˜sÖ†ß÷éà5.óÎ)Cv¤´$¿œŽExó>¨(ÙcMý Üzx‡4ELªíö<ÀÓoÌÿÛ›QrÎÐIçElƒõbêQeŽ»Ô‘€5o#U"`\+ž¥æ¦ã1K4À#£i‚&n¤bO<¬®¬Ÿrÿ¼;Ó@íZö`òEadeM7ñÊå/N¨=%ÖüuJÑ2þYåu³D§Ðº¥‹ÑÆ3¡v…3ëkQ TÎ@ÎCV|X*£é˜ŒÄijØÝ*0'±V!&c×ã“/>U5ž‘ízž¦EcãDâ¯kñ!ÍÖàxIŒÆÍÙŒB:ŒWG Þ;pʯ–׺iÅ¥˜±gæË $Ál@ËÁØv(¹Yb¼¹H9èµQR>L.kX4ŸÊêëðÙi²ý][b;†KÙvˆÒa¶Uo††54V$pQŸœ *)œâ*½;µðZK*$dÊÆIh`Ìæˆ*›åËLj¬ éç¦ÑmK …s!BŒÄaèš„GÓ5Dµ)æë ÒLvŽ™¥¥(¢]Œ}õ\éC;Ù²„»z³è‡og ª9tÖ܈BL£Ik0Ä7á8±ãYÑ×)prpZ+¨å²=-µ«¢9,‰9s;@× ¶>dVš ÕcS^öä^ëvU€dx‡.Ó‚í–î—¬l­•^^R•Žæp°kuXMÔ&EUT†iñ+ p Wö²yyä6¿C’ÌðÌ,¡YG&¥‚¨ŠÀô·£':g7µ§‡ÇI¹ÞA£~œïê\WLg–duÞ‚ä´Ä — [›Ä*ïãÃnk-¦8ûݹF…“žçPŽÅÕÆ¾'™ú)(‡Öê3{ÑIú„y-‰lÄ åwßdÆI”ufç4äè#䮲­ÖƒÜRa &É{¨°i ¶7Áô€µ…RNœ+£Þý †Š ˨׃±Â.ƒÑ. òJGæ²Cg ;.5’g²¹ã¥#»Œ˜ž»-l$Eæª- B¨*p©}»o‚ý5XðÅiõ¹Oˆôø¡¡ÚO¿sD1~ËÌ—)¯ßL?Îï€ésã¶ÁÇÁ೘—ÖÓ.ú†ÎMë×dˆ¯¬Ÿ£[}‡¸5ŸËâÆLªgè¹+DTóà(Çë`s^Бջ#mÎ Dps¼p7ÆU7^YÓÆv®­Ô¬v3µ«*?,oÞ±D}Ò_Í“„º°Èh˜G´.˜x4;—nºª„nSc'9!ú‘ÜÈìÃ>èÒÜabK†–A¬ c¿YÔž?ÏbÛnîI'¬+ˆ+'™¬d…YWæéΜ›Í@‘Â#ôö“`’U 65Çbga7ÃIõÑ6UIVvÓ„Û¾#ífvÃrwŽ2P¸'”1tÒí›Úä©Ë»òw´Õ"ºÔã5=Ü®S´O Rtì›dÏ2ÅÄþׂà.vXK»(³ÝD¾äz‚ω i3P¶>n]­z†¾b³z项–Fmiãs½™ jÚ*ê DZêÌçyòt“€\€G÷}Ilž’.¼ugº’O³´¥•mÝ ¶l¯¶Š,ü=F&mv2òÊñ¤E ]^ìptu¬_»Ê¨LƒÚmóÝX§êŒˆUät.†Kײ*&Š0J Ô¹ÜÈ‹v@ȇâ„L¡ÞŠ9°í»JŽÏcì²x“E}T#Ñk)—³ÿ°@ôALër0Òè¬v ÛI³‘D‹&‘£üÊ©Ç!Úf¥Fm^É‹gŒæ‘Mïw‘?ÒS¸Ñ*?+Òªl}ØpåóäSƒbÛsê¸V¡r²_]ëÖ”óÌî<£k…ÝÞjNŒB–{à0>“]LˆÅz^6)í=çµß?žU»¹ºyÜ7µúšLàOw€¿×x°bM¶}NEV«‰dµsæq  …Ö4¢nZ齚Y=‡*º¬×ccm^/9ÛÇFDÔ÷ݱé áÅ*Óâ*}_Õ ù¦±Z0¡à0ÞRE fk€lª˜êmwÊ&ã8R»®ƒ^}‡bóJ¤zp¬`Ïæ”âSÃg„| (³.–Ú64çÑÙ²vœÌ˵`g,ÌMéˆ7¨st¹ú+–ƒj¬/Ç ÅÌ´ ö »\–œG®¾]®M‚÷ç8ч´í&)q&tQ×Í¥¿BÖA&RV+ÊžæXÊb(¯Íƒš®‚ô âë>‚ãé o¡&MÌ÷R?LÈkêtq´Œ¶8Ñe4¢Ëä=×’/Ži`cðºÕ¾ 8jIq‡œztâ®DÔ`9°Qh¾ •[ë¼ø¢|Þ·øÅOáÃß!Éúïn_=:5º ×zrJa—©;4щôJ_pÓ0äíËìÔh§e8nõ¸‘nÉlÖóŽÖž™¡QæÑjø ‘±¹YÜBƒT5…k5éH²  ²ïض«˜”ƒ±Æ AXäïà¸TL*ÑH÷+d ²¶';_o¹Ö¸NFÊ[íX¾Ôzµrד±F0}òGuþäø„*¤ƒª·ÃeZnLê©=> Ò¾ì7¨IrŽ•ÎÄ¢ÜÁ¢òŒ–ZŒ¤THvnƒ5N–øæ¶›j™VäØ8wí”Ô¾…1F‰T V«›)@´T6ª! –åPÔ;¹ï—Ù½ ÜÁ >{ñŒÀmT'©ÉÅWÓEdM³™í’X"h¦Ø)®ºŸLA¥>‹šüªšÎ|Ok#¾'é´z’l­»ÌnˆNÞ”l:­K("1f.±[Ì½Ê —Í›ôÛ±Ö>kyw,ÜÈ\ºà©*«#jð/Ë—¹lÓˆ }&Çhg¶XcÙ±³f‰“@m‰XQÑýXExÈi†:>†ÓiU8)ÞÇdªS)zóÈyšëãAT“³Vç —aZ7<­Pˆ!©¨>ôÁîÑîÁÈ‹I'Þ˜è 5ˆÐ<åîÄgŽ+PÈ”`­h…e£Ljl§ºrdÛØìe¸µYg–$}eo8=ñ¬… Ñ”síDöûÒJ5VeSL©…BqKî|©‘/“lsx]=„g¦Ë<¢'ª϶}‘PÏú%¯»éå¹§Ù”ûHãÞZê—QFìbK+NÜ"Zá:*tž…ìD;~Ào¤åmÓsŸH(ýA}8ÂÔÈ‘NG¤ÁO%’Uùcô&•TÊÊ7ßM¨7“ë‘“Ä™ÞQPDóðàa*o'7¤ýN‡E"«5Õ¹kÚõÌr¥(dܽ;Yö܈æE!Ëùѽ$àœQH~l;C;`Å @ø6·}Iêy}“Ù0™Œ »ä‚×ð{w°ªâ©˜Ò‚ „ï\¨ eª ¬rì²B¬²&T"@Ê'xïÂŒª’ ¿9ÁFÖÆkUÑéÎ)zÊqµêÓu™DŽê[¡t£±ü£²5ÿcù3ø=0Ö¶Ý3gÏQ¿±HãÖôqû®ŠªÄ5O×ßôˆŠ‹UJ”Y¢—Á¦þç^Q™Lƒ,Òn>=“ÛÒÖ<ðp;t ¡ª¼MO%úíèTŠâ^Ä¿þ–ŸŽ+ë†GÐÉ’€äÌÜL/ùE±€9y2‡„v–°ØwOWNé4–*œê’1º—YÛB(zpÕÞB"é'+«ÜŠªÌWU‘}®ßUâŸfE¶ ñ;Gu²ñmg± t‹kd”ürØn‹1–>Np¤Yl|Ëv ™† ;ãż”TÛ“¬'ÿô¤+ƒ²w; çwdƒv³ZòÆñÏÊkˆiš)¤¶ð<¥©Ž¤ÓŒ–ÜÀ)UX$­ÜÏaÑ¢—²Tm%£ª@Qy‚¦a1Ìh§-ER€”>,‹ëkaÚ–W`d8×M6™§>\‰¡à =ðçéð{R»EY̸ˆf/sL"Ë™ìr®ÛTc‘YÓ¥óÎÍ?TÆë2È4f…yÖòì2ŸnŠ CMEz§"ªÛÿÔRɽ¨»F¤çê,-ÑQò"EÚèÉt1¶"ƒcªæž°e0lŽ¢—KÒŸ4HÑûp–J&Ĩ_T2'FòE>aGXôÛVj^!TjFýþÜÙ"¾³)ç²›Û†}·“ .ކ·[”¨!´?;$άϡ¸G+söž7Í>ª›©P³´+DÃÒw n ‹ôû¹Ô{'o¦«3³€™P¶Ü(z¬é¡±:r 'ÕÁ]­>é Ý(Ã)”2e*Á³†’(ÆUïJ`$¢Â€œ ŒÒºO)kݤyÔàâz ý+ÅîtdÏÆUÁOÉzõ§àh&Ý]Wg²êT&Ä0"§˜©ú•X¤KÎb¡„'¥) ‹*ßêEê©p¹p)¿€U„lÚP UB+¯²·´ñ´%Émùé9^§•3¨¹$ºmesªwÕ\ë¬õD2ˆ†E$µ aùh·@9oÊí¦žCµÌj®Yí ’ó†œ[œÛ;¿ÑõWCêÛ³æëèJF pí´¬,¿e.¦’V홌3x¡Ã›cÚãVø‹4yJÌ"nTLÝ„²ÚN±Ì¦{­wÈØ©÷Ûªæûb‰&à«ã`eîf"½êÒ;³£¬e0†ŒC •Yâ$æ²ï‚kôÜ””3h@Eæ¥pó¢ð4¾ò„OÚé½™´œ9ÅeðsœN¦hù°ÃL–§ÀAWþ`¸(e”õÜ»È6Æ!f# ­ý‰,Ÿ;3X¹-Ó³ð–e°j1%óðe–ƒÍJ4ž¦›ÍßîÉQÃ~¾Ð:o ô0}i–s©~õ¼0=@ô(¢´›/Ë0õªÉ¤Åú‹íOë·#4dBžà§JþLð “^†™–Ëä(\æu0LVޝT[ /FÇϽ¦èÉWM#nÄ¥^DÍ<ÀÔ‰S×7»ÁZÆ0ŒeÃÉ:¾[²`(«©dabØqdˆÏFǪl h…6òY¼ÂÜDP¦|šÝ¦w|u±µGsôHÆ UrK Ú‚aœad›.<‹Y7Ñ(º @‚) ôÙœP’sO«œÖ42ý¤l§çˆ‹¼6ÝXÙSÓ¦Á„°© |¸§Í R#ÔÛÉS]ö'žx"­¤éñó0'’@ŠF@ +åE*R!H2ãbæ—Ê£€¤­\E?—3ýøì¢®öÓã¥uƒY)hVäK«5O׿ÅÕeök3Í‚]Àx/÷²,ÙU5ø6G~^嬑]‡ãˆ>'Šc¸k-—ËÒ˜“ÃæÿM;ðÈsVšÔ4ǵ؅¯€ŽˆlöïTd\‹AÚ‹çÁ¿¨(»¨œh–«©ª1ZYþÍ8§%&‘}ÂøÕ<}8Ÿ*sÂÎ8Mf*ž3½…–ÎÛŠ~€SYêþHR¶t4èQ×=ˆš:ç(¦xjäT±{öB´5L,^­õ©£èwZ‡¶ÈU&—Vÿ|>å8#ñò ¸w“Ù禄u0æV1”3ÿõƒ¸Sû‘ú¢@o„rM%Ù‰®.‚•˜·é±åX»æ%u1æW Rg3ŸòXÓ¥b¶ÙWe´…Q£ éÆ+÷XÎNËÝð,ÑY:\0ö}Ó¦MSE%ê©Õ[‰R7Ò= n%[bÑòTج:hm¤TOl¬e¯¼*ÎÛ¨&)íkmáÃùV/‘jk©¶DŽ™fƒ¶K–•š¹emþ‰í8j.àeZÏDOeì„×…èÂÏ LLFu†¸ç‚*âê寮T¼p5MÒW½XËðæT¥JƒŽEyrÎ×Y%[7ª–Í ÚC O%ð ©7g2{œÛ:¯‡ÙÁ8¥ƒk‚‰scr³,±~‘ó\åKà‘i¨Dƒv \¨I>,D¼Ãf9ÐÉ9Àm\]¡oË,Æý“‹Ïý¢IÎŒãL,EÏw´îsíœB›FwLœ˜ñúÿÓˆ²Mïh[ÜvϨŠ÷æì§ N]²3#ˆ´œIíÀÊ^ü+Íò®*¡?<~O#[‹e7B ‰ QÑš"÷à™¶M‰A²¯ß‹lOpPWÎwa U²[)–zt߸i$LX›Z7÷ñjŸ’¦ ”‚ojMõÙW§¿«NÞÆ»!ùWu¼]Ë;ý n²k~]ÿ{ïšà:ŽäŒþçjÄ7¹’’ö¿„@egž<õèêžéïŽíª“/›–eIß)ÄrઠcZî°•ÊÄUdYAšÂ'Ðúý¤3QK·Åt“˼Ûz™ Šü"Â'^µÖÙàQá$D;Í 5[µÚ#=‹pÕ7uV ß ’î_ÒnôÚv6’Î)}FÓÉ@ÖhYs]ç£QD‹D00jº=€4òUA~!UÍ܃¼–êÄe™Ãœ,Q )”;ŒRò‡8ø°!65žN¶8v!nŠ,³í‚Z†¨/©‡„'Û¥)¿‘ÌÒK³a̶1+ë\Ý\juõ,Cɱ×$ S·Ýy³Es$]‚”ÚæÍÅÓz‹åª†®êƒÍÚ¶¦qV–)*• Db…ÀBÉ“uXãÂ}²½IÕªÝ:ƒ¢¹Î5W4¹l_ÝÇÞT£˜<¯»ÇcI­ÌR4ØÔ+”؈n8fÀ±!ô`Y¨âÏÐ,#@ÞâåÎ&ØŠÝ6ƒ5“&Pzãõ˜u\a ç" õ ÌÚ}eþè cQ÷œB§@z%à7lꆿ w\ò¿½ÜÄ5ÓeX‚ËÉœ¼°“¹ ¡ÌP¦]¡HRÝÓpLËIŽ fËävš6)Z’ÞiE¿âø@hbv–' űf-¤ZA®ï-‡îͦí8o¦’BÊäX©JóB42 …ySi¨8Ù£{µNŠÌUf®e¹«EÇŽ¦E|¹ý ^ÀèA¢®Zµ—D]´ŸæwìRwb„]¿ª(üe:UMý4,ªuk¡´§ø29âëCÖød¾y’S Æ•I•[uÒs²¡üÆm£^ FòÖ¸î_š|ƧL3~íús9ç¿„ãÕ¢¶og ý)M{“6ZJ±yÜ0ÓŽF¶NŽÖÓ’LµÛ\È‹ƒŒ ì#/z#-@Y­ÈgŠ6¯‡™}¾Ý¤zž+ø#I²FFº<$-öW^«ÛG˜?@é%ùm§Å|#"•Q!6ÝJq—Óxß,PO@ ’\9O¦p! Ú¼\E‚ p$iJ1øš4¦à=¬j°½lz¼+â,dÉ“±AͲf€"Ó ‘ò*ã Räÿz÷Äb]@›¬uNZI Ø9ÀêÜ5†|Êǵ •™Í]‡‘f4<ù³ýØ„¢ßA¸†8eˆÃZŸ@H”Z‚±œ"µQ'=£ ŒSIÎà s_h`ÚÁ†u‹SN¨ylçîï@å;P‚Àp¬q"èNº-hx¦¤x$ƒKŠcQ ²E i5:‡ëƒ6 JÇ+Lø§~¿Í4¿Ó`ï‹ÜLÍ“JÇ»ÅÞùã=ÂF)ªòÎiA¯ø¦ÚÓÅ]]àR¡. À) zÃEj (€*Šºkõ*r$\°£9 HQoÈ »©Òº!ÔÐÌ3Kç»i-— GYÒ°æ7o]lô“üVb{$½o¶ö´uç˜ï§šð[Ù­®(-ZP¢ºÕÃCíȳbÃö±¿9K:É- ™ŠL +@Iuqƒñ/P´àr7Eƒ%,«Rñ‹¹(‰!ªýNf,‘¶­8’VòŠ™AíІ®&fêdŽª»w Vzˆž 4=@)п9u~â…ošT‰Q§•·M¨ n®O®örÛß“m× ·5òx”Rj¹Ó8.‹¹ *%(àÕnÇàÜi<‘\бâ&èë ÑUýÉ,ý6Æ-R ž}6·Ê«´°²Îrq*cç‘L Çi†Üábѹ[§i U8$¬PFeõ•uOÄKÐ𞟕hË”$¤";DÀTŽ=×u óaÕr‰õ·'¡ÈA¥¶ïeþ¾3,O’]à¸nðŒ®·&4襂pù‚#F©vˆ’˜ºhz»5QIäŽÅ¾ƒ•ÁK¾ËÖ¬HOZKã}0ý2 ®:­rÌÐýè§{lRWŸªÎ·V˜çzèþ³v=ªGøµQ®U´¦ùQõt”1i<§'‹,qâM[óÀ"eކÅBcí}mTgÊîÆºià R!&ö5˜'4?«º\Å¢~¥Év·`TÇ ÷‰Eèiv‡ ³—Õ­ ¿­Í~¦KÍ˳;xNŠž<‚ö¬£aÀîÀ ]“d?|V9f––pܣ܉ í…YQb¢`œbå©aŠ7YËIùqd,h±ð˜æèŒì"²XôS%âm×õê\[r@….IF.ñ@7gLµf¢ ‰îFð' 9¹®†ƒmyyäÚu©Àn·‰5D*Ëxt_Y¬£Eûz¸P©šPµBŸÜBœòTã:á8ø‹J§ƒá™ÅI•LHT– éÌn¹’UÊvSÒÝÇ5„€òv§`7Ê× Ùä €²€”,ûëÒHd· 'óIF‰éÉË\ a´“韰ä¢yá ›ƒbÁ[Õæ‚±äiòïµô6¨¡òÔny¸_ ·h;0Кê«t“ 1Ùk½öAµŸ'@Kyù+¥äØ—#ìAýÜIf¥.Њü²»þ÷pSM“TÞîu·ù›„òìËBÛÂ/"í—©›·önû‡‚ª9'/¸àÀnÓY5òI‚+#19²;÷–ç`Í•¦˜ ]8åL>(eÒÚfF@?È£ð.N¹ˆL2ŽØ,õe½Ù¬g±¦¼èrÜ9V•PÍ1¤òq 6C$&ÌÞ¥7uØmáŸí1}‚9àÌýN} NŠ˜.yÄe¡/Šðb0%o¨3ø¡bÑNsÌ`*»f¬Œ¦ITà®(ç)úA°5¾ ׺U?wTD¢I8j—ù¯ö´[FŒË;QlYÔSGàÒ¸š¿öØXdÑ ù2µ.«VŽ@cÐ(o5(E± sH:™*‘Xªù»FmT’ž<æN™!'ä3Ugèøˆ[”¬+[w4ËÉÔGæf1Û±ÓÕú¢êæÉu™ü:w’‹5 ¢ø* *4–¼p‘Í1;oÇÉ@J*Q+²MW¼)Ó’•ŽÐ<ùäH„±TÁ yÞƒhjTR *¯Bd5>W~â “”ZÌÇ ]äX£S\Û}Qé]L>ì§Æ‰.šÄ½ñóÁǾ–¬…ëTßqòFö43‚îûy({´˜Ê¬;¶ Âç¡u9$ëËÖÞ›Ã׋(;Ìêâ'¸AWŸ{U2hÔAµT+eM—æ[ãQTC jãÑã,ëH“Zç5¦3Ÿ õœ@p- ëè£ÞGþ Ö „ÞHab§¥¬É1[İz¢ÜôÍÖ.¾3kœ±¦îFû÷0Þø$M *xQŠìiþ/aYÏ#Á°—/4`;c^z‡–@€¤ ÿ•À)Ó ÈÙ_tÙ‘öB¶–¼©‚FN|¬#zì…þ2`²$ç,.ëÏ‹ÅëuzÇ–¶„'<â°Ä0løg×:Û4@@©2yS-y@(m›s«xç,yFaؼ 0X¬Ь‡%6C9$1ìÔ‚O/¤_52V•TLçyÈ:÷–M—dʼ.ç}Â7z XjfD•9`xsf2F­âÃ.îr’óz£_~elò£ãwŸo2ñ±`ÌñL-Õ! A«Uå|^É„ ¤´˜r21ç‚‚ )TÇb¯—© ˜÷»w€HƒX[ö*†ÑVÀ5'û]P, ¦6@B»[õÞšköfÊ•²áªëñXÈÖ2÷¤y•|iϯuÈðôí¼L ^þP•Wú²w˜iC5C'[¥z 9`´¨~ZÖ’‡Ìüþþ")“”ëo•Èã2Òb"ñ÷6ÿbÎGïÁ#Ë|‘’úy¾l$+•ÇÇa„@6¢ÚÞ€’· d‹Þâä²Kû¶©'="ø@4‡½”"÷¼€¡›DP$4I– 蕊å=äçeÛ®0¨µ*d‚Î í´Ë™‘ò¦,/°Ìñ©¦ÃQwÞ©mB¸¸*+¤¼%X§ÕugkˆcMžG­µâ:ƒGÁ,œhì‚‚_ wvŒ(mMHU5šÏ”´ø¢š½f:"¥£j;ÓåAî "÷Îk_aO`2jHU fpîHs5Vè&kq—](‹­”“¬L“S92¤@³hò°·àA}{cï-+á”ÿI`À¤†gP´Ao·\¨½íd£óEb÷¶–ÛªxêjÐßÌ 2»ëðµ:ó«íð]–ûI×húFÓ°Ç«uSM3¬áeªR‡Ôy§ã'5ìú¯'Ý}41o„$Ëpi°ÔäÂYL QvüTeãÙá4‰çbЇv«|QÙù ˆ סÊ(1’Ž"¯*ó|ЖCl•̽>ŸÕafçãˆ^ëb#†JTµ«"K)§Ûü6·X}P~S!¥‚mYaÔ@}UüŽÈS{%üUNbó¸çÎ…qTl‰{ v‰S­Xò6çqÇ%Ny«ƒ ‹óî<%âÓbÖBmN\^={\=~hM»Dab,@bdËmsÕ2¶û³¬tô 4Zl)±´k‚Á“U 'ƒÞp8âhÒcI–S4ä’Apâ-Ôí^@š gs´DxÙOš–'ó>ù¬m§|šX[ï‘rmtºEä;ù¡g!ó=Ÿè˜›ryö uØn"»|xâ›»gÞOâ¢üÔ}Óèã*(*2R#/tÎaÁq­À¦r$ŠÝ$Ãò‰|±€ˆ "¯¸±ßI×XÂÌ…Z¥ã0ï¿ ¿fA ÅÊzšoi¥N€j®BÉ[ÓBH;F·UêÍ+¼:¢êƒ“î^ 9þ–Yÿ6QP©*éˆI^Jk”`Oª²'{:¶õ‚ȹø°Ê6·„&7F®ªŽ¦ ‰î¾Hfë&«õ*‚¨ZŽÂïÈZö¦š¶à*¦mÖ–”çVZ›žçvÊ@‚–¼<–N^ÀCb¯á JÉ‚§3E`'óòÐsYS}úغA¤æÞl¶/3)¿Èùx†d¥µj*¤òt¹4»[©Í9˜FÈ”Røu zk2”¯òyÈþ¬p= 'Y0Ýh4”ŸoÙ÷²¹>O¯*y#4’lF¦Oë}‚«ž—»y*á“ ±¦—·|¯N+‘K¨O|pd5¥s–Ô”Žes%§\døèfBgä6ÓŒüYƲ֥fìVø‰’9°:«ù[E¯»maûÔÆ€9'ÑSdÅnë£ á“ú`žæ†9h-Î.¯Eºn‹§•Ùƒv{8²ÂÀR‘,è`îö—¨„õ:øÑD®åLB…¶×²ÉËE [‚3ñs¡þ%R1Šÿ«ùy‡±˜›à/rXp•ÊŸ ôñ3P.VÍDªi¡•Zô“Mq•V¢¹çÍ$»-xRí Ýáäœ~ªX™ ìÉ%ݬsrj¾/“k_ü½v®iq;Û%¶n¿é Ú)?(Ú¬ÛŒé)d"HrîÐ|ãÄreáv‡cÛ±† y;ë馞}ÉÞ@r)N'ÏÛÉ;jàû­¨:äÊ„d üðé±×ýÉ ¥—GBo‹¯[>…*ï:ñ8|,nY†Óv+$"ˆH«¨, UPðWÁ¨§3€AÝÅGv¥Ù€¡|ì”VeØc=Ùvf;Nž)Ò¤3°ê-ú%›BÓ¼ºƒ=}Z•«Ô¢w–òŒ%"!µc€u˜ø<µ(J² £`½0À×î0†KŽõluÒN‚†c%jÐÏÝt¸ƒG¥ô7/Â…KÎì¨Ô¬ª¸òPi¹ «†-[ó »ª+ÚÑ9b~®ˆ¹Yû©}‡'+0:}X~IæœYMÔ“!®=m SR¸ê_,8€ ¶œ†Àhç f1ʱ³¶ ÷E†Õ.:ê ÓßnJ0§ŸÝP¾¹€ü%-ð¸÷PéÒi#š¦è ‰ªƒDÅ”+à¶.;•’ÔwÈìêL± œ•§ò4-L4G)ÐbQœ'{®æõ¦5høÅîÂäȠ].‹Oš–KÏB͆O¤ð¶ Ý*|î †R'LE9ójv«PˆÌ:¯µ7Í ¶›TvÄNúàB”õüIÝ6 $’a$ˆ±¼úx»a:ULãêI‹5b fa¹qRBµ8¹žl^ä#+„ASÒN²CFÀ@œÒÉ (³AøfÎQ“n¦ùQ¢'Ó§'CÏ™ˆëï[’7@45ÊÞÜ~Š·O;v kŠ\a0œÁúÒ>µa¾¢Ú ¬PYs=YO|{"YÇßkítÅ;îî4$ó»Ü1+f2r›Áezú0ØáÃSy9¼UÝ5„Ü‚…å©ì±€ûñ`™¶0ð·Ò>’i¦Þ´.>Š*d˜‚z¸¼ y¸ª¯À^Rv‘È3›)n™š¨É¤¸ §ÀJ߬ӜÙÔ×V•ø‡µNj°wg‰[ X*¬-ðsŠx §ŽLÏCÆÉR¨$E¢Oh²¥å?Xl"A…’'5ªjÎDõѤêÙç‹dTYi.Ùß’'yÚ . cž6LóÌ—&\¦¡ªE~É’—­ˆ ÛÃK­üÇ®›A’Ùз<¬¥§zD6àÆ§y+DfVE¾?Ð…‡G‘k;+¥•¶W…ž¶ç¨¤1áH ûcUª± ³1Š/`ÕÁUV¦Þ…øàØ¢+ßÀæI-â°h¸ˆžv•­°! r–H·$dˆ˜²x|2ˆ{üJ Uå¾ÀQà_øõ ‹d‘%òÀ•ì#A2Q¡¨Ö™jå)É®iP"m¹ÒÉn›“íþZB*´Ž´’›{ÚÛÚã)y¿EÝEëtOä“¶),}HÇñƒÀý‘`ù/?ë­šÚ^¯íŠUÀŸG³Ÿgž1ÒŽÏ·œNQ|?_Á8ꌅ¦ÉÅRçÀ-z‡b¤/¥•G&†Ë]¢±*ÃodÇ릉Y®ç¨Ž.ÊÍ=’õPЀG2ïŸÌ³{y“wº²Vš((PMQ3ò[3TRÛ+J¡~5­K°›3Ói"& ¦Á“J×iü`¡êùpTD;º2|EÔ*?°,2ïÖLagÆ ~iÆ×OÜ/“SJ§Ðµïù“æBÚ9uî,-÷ä«èeûÂ*dS…yRV¼ú4ƒ|ôì—j¶°Ç8•±ÔdbÄùȳõÜûýi­ƒe¾Á”RÝÙÁ2KÓVE]f{Àh~§jиêW„Bí³T…u"êÂÝÃP]f*¥~$sÌÇgÐ ábÌÒ²´ËbV4€”´Á,ë],ìvùMK&ÈæÕ© bÙ,2Km{ËúèÚHƒ|CeN_´vÊI"î°ÒÞb×c°Béî¬ëZ¢€_€š FË·Ðj€¢JÓ§¼m3@ Ã$g9Æévp „Z?ŸÅ^ØK ð(²Õ¿Å6ÁüY»ûÝñ(<†—qiˆ Ͻ XM *¥~0 bnˆÞš€,VQ”+N®›~Oè¸åõO2YuÈù-XióGfŒM€”e¶H&@'ÈWRê²æF²ÆO¤±+ŸDtÄX‡55¾ˆ½’ŽËþœ²5Z‚ë„gÐFáe.ƒî‰êû\à(ªËɃ(òi §* YX(GŠ PxDõp˜‰åâÅ”n1*ׯ~"Y¬YÛR UÍÌxrÕ¨3÷6À¹mÞ~úóÕ¿S8»pO¾JdXøF\Þ\ÈA#ÕÍ´³‡Ù³@(g®€õ Žfå×-(C9¥Ó˜¤w€4ßX§îÞl2wˆèz| 5iÝó">̘°n¹+ ‡í •‘S$v1F-š±ô+²¶°g ¼W†:±æÉ (®!jèx8Tm¥Œ6Ϋ´X­ðX×_ …JKM§³r_|úøºQN,¼¬ïÎó/JCFHi2eb®ËéÌA–ç¿Ñl¦ªY#$3×(/Y¦Êa3´>Çñ×ÊO)s(ÒQ/(mÙÛŠód­|¨¾Â1½ñêÜUzäÈwL6]7³G÷4D¸• ³âßISõ“RÍÛT.‚ØË£æ[ÈѦÈü‹¥'U5 =›S¤G5Ã=‘ýEWµÑ³2žçâøß=‘IòT ŽÙI‘`¡¿i„nÅÚzJ·~K.:”;zºÙì †)é¬%&kã;v[Òãêjó²ãqov$^&öÕyî/¥äÓ®55W`u‚MD™mÑÙ5ømh u%öø;iÀz@46…-½ÎúG"«„`¶†-<ö¹×ŸfÂôØ™ëw õ_„ z­}ÐÉUq1ÄŒ¤'ÛøIA|xÄ!®)ö“Æýo€»'”l’äãaš)¬Â0='² ÊŸ0%¼A˽²#‰.6°ž€¤+»&;+ƒ°iêORgM‚ó©Ÿs¯Ô…´ŸÊäº*“\Uø‘9%A:rÌŒó<§;#6rùiÇ<ß9>Áydoa¥‰æ½!3’gøÑ’ ÃaÇdo þç´g˜ô8W[„ ‡ÎÌâÓ<Ñ_ÊÀ·$FDo `)¸0'WÙÇ­n«,Á³©Ï͉Gm}iò;LçeI¯€ hh‚~E®­ðøÎ,”a5šS2A²ÔX޲`_³L¿¤ÌïºuŸ©§¶$O€”X„ZÆ+•ߤ_¤ßßâ/¥ öRþz øLÚwíq›;ür ½?]ÿý©“²lÃvøA©Æ’Ÿ–3;lÒ– Üñ7/9UßjŠÌšfö0µš¤O„4îÌÆÙ]ðöî$ž"íAÝC;Yª‹½}€lò·vÓø}"…(‹Ð UËQネ°/ÒyÑDcr,Èû¼YfÁª†ù@=@<Ë,©"ÕÕ v©ë¦ªó äaó€Æ˜“‹f–£é¾Pèǵ¯~¸„g>9‰s4ffç•b¶[]ˆK"kÒÞœn´Ì¯Á÷5Ï—cÃ·êŠ Ý̳ùr6µH .™¥d¿ô­t& ÑèÒâ¹ßiÁCÓwþ¨òHzW£I‡±JӮƃ˜¨:ƒ8Jög^ç›å`x nöWM½À£_œ&ûY{ýêöv7÷ô¾—] kÑS£©íÏIo&‚BÉ;Cjè×I0Õ.ª½éʹÏ3Ëe¾ëŸ‚1]6Ó7µ©—fíõñ¿ fçXº6M†q›J¢‰Ô" Ô ™P& ÆmM»¿ì=ÕdzÈV ånÇÅ·¨onP'• Ga\1¬ÇŽî˜, šQƒ¼PqLáÑÍÉÐN@ t®aú]œ†c»ÈgÁÞ³³|:¿¹F5¸r–·?Ù1ã5Žf;‰?Vå,dií ¤SÕè¨_»'}w°W€ßÌ1¿™¿ùõˆ¬pò* §^½Â jB̺{°˜Õ‡¥I$Ê»¨27û¹[o†WŠ«˜¤äŒËZFuM*#/“©ãßË m5üeMµƒ›¦~ç0­ÂOVŽÎÚôè†)0ïÍ~†<@z\šPΛ‡c¶š/k?ÐuÂ0šÿ¡úÑJ(Tð¡ƒ>˜ùs$r;~±p³¢‹íDF ñ ¢|óQä(o²âdÙâ5UýÁMæ5Ù³MÆ ‘ëùÙ£¶‘©Õ*ùEî†z-)•Ö UžrP™~ÁS¡ÐCá0Êç4ëtäá Ôv_P!ÞÊ ƒ Q8߃9s΋ 4·cѱ°&©‘4y­M>}:áÔ©6Z—Uí:¹-DÕ4F @jgv‚Ýd·1À^3òNOÌBƒ„“k‹HÊ71>§Sý‹"ÐuÌqÙÉ+$@³{¢›]ó& j(¾ÆÙ!¸·N;ÉnNÚ¿”زÍä“ìV7_¤ÈÂO$áÈcœÆmü\b{¿U&¾ìt˜Wž7Šè«µ”~7@ nyÝòqÉ¥·¿$’RåiÌGqz§¤ö«¾q/¿f(¾Þëyž¶étæB!ÿà¡:GJ!*¤Ð}Чº “¨µ¯lÖ€€?|BÅÑ¡“# ð´D:"* ŒÝ!Gõö‘"2X@ò&XL>ÀUØËo]hÑÄWZ±õ‡¢øë¢þ æZ)U⯰RG€D+ ôºÛ]@.ADvâØíwRÆÄõéð£ô¦•‚UÁ€4ÌX¦ñòË^™ c)ØDáƒðd=07ê!Av"'¯þ  —d ß»L¶^˜¤w²Šíeû@–äÀÐàR©í¿2WÁ¸Djè]·ª\°«j±&¶Â…òzs<‰{´N¶[ù’Z)«ïÓ`ÖØaázÑ™ñ ª m^"`‚Î]1WE5/vâ¦VøàÌ3 –U«àäØ ÕKÆB† ì\wCæÄ¼W÷–-{錨3­¥=wþž%·xÜ ’0M{ãìWÙZòt6¦œÉ¤`úð/ó”ÚÒéýסý~Î "õÕ‘ŠóhJ¨b>R,îQué˜t›»Ô w€êE“{ž0Ì (ks‡­”ñ4Z%(òÂc²úR :- FîŽú`-ó)T*,ø©**Yyo7æmñДã@ãTÏnÃv¹~ÅÑìÍ~ þQØ-2l™3WlÝiR‰JtŒÞÈnuL˵éÕ ¥7aûIÍ’bF³'uæ@ºlÇò}“Wï®wõþ4_çÏÜoÒoc®Ë «BªvùÙÁˆa±XX¼M¿Ö·˜|ø•1Ìùd•Ø¥›Óšø‡YŒ"÷@×xÒòGz Ý ŒÏo«’@¼xÆœ6[é$šO-’À‡ùvZÜ·Qdˆó†$½^8†š*îÑÛ1X;¥l¯—Ó³M³S2z¨&0áÑž×mš±[aÉTŸ ‚(h köò¡PÖÞÆiŸ[wÖXšÙüp3k÷ Ó%ÿç4|ø“¨Ú7€ƒ7jt”ÕúIéu±€iõñ§þM9ayÂ&»ÊžÇíd;šüùbC¥çQQéÎÆî Ô~‰çQ|<' kk©ëƒJåOž¤™§ÀnÒÄF9ܼϹæ ´ñÔÄÎ} Ó†ŒRœœYN;ïdZ‚d«2­8«]6ÕÒy6Ú \á é£1­H\»ƒw#ìÌ*믃À'1øå$@š,þ¨@çÏþœ©!¡ßEÚ¤Ä.ï„·¶ò¦C æéý@úKŸ®– U>ûü·«çaø%ÒËÎ ?0GÏ3Ý—µ¨—¿S/„¾mý—cÕ½ýa`èJÔÞÄB8¤À,ØzÇb„Ióì=’¡ Ê¥ÇM¬IÛ®À¼?*ÑtW.êÍËqy¸ÑÃök²Ìö~Êî²€›Î‚mŸÑ" ŸþÍÜš.ÝJö/V“µ(&+‘աL¿ÆéXƒt›¹ƒ'<ÊÆ^U¢So®-{jl~’ï{ˆ%ã© R5|Ð 4T—p=Œ§ºAX‚ËM{'y¬ZheH]dæ„P'ÍRv[ñÁ…Â`’žz¤`âíBù*‹XlqJÀÑY)![ìi±Þû-W""5«ƒŒâß‚…’%~EÙ…¨o1zKcXªýmR5›”¨²ö‹:]ÌIõ#ê™›q?¤Óâ4q³è6ès 5×ÉJÙñQð!h+Í×SxçÞ:Ìîìe©mOèM$CAigÐZÇrìð kÛR$5U'oÁ"»’wšpgXbHÜbs÷(Î5ñMeÐÃŒP;õ4î– :(IÓè“›F ÚZÿ¦:­½ÍƪÄ5ªvB5<.Ñ PµŸ†b úèwÏX7OÎi!{êM09W©ܸ« iî^PŠJm˘<¬´‡þóùTìT¡uP™v ù®HF¬¡úâèâ0y\V ®ŒŽÇÛD{—"AÊÇq„áä#X–#½A˜{Ü©ŠõƒNNnÉá½iÄ¢U=*À6v£Èðf›3¶Lm¯’Å%ÞVrÔÈeü«ú1EŸ˜=4ùõ"¹ ¶q%Ò£„a€U ? çmM?L¶5…e.•x à/ö¼&Yzű֮þø‡/ú8`OL €3üb|Úv³²|å}ü#ŠaÁµK=ª5¤¦e6™¶íÉ4ÝÁG«ä=Ôš{¶]ÜÓ„¿õ,E”·­ÌœüʤˢvLºv ³ž-]£ëùFQP_EÖuf'ýçv‘dd7TÄ jÊ<²Ñ_kÞžî—iáM.©Zj`}:h ·ºÈÊ2ƒgÙŇ;z©ÝÄÇ™½(a£^'°¥U£: â5Áo½!ï"õ¨[µËP4,tP·µXT×à׈XnIJEг‡0€c²óÅ^DʽnŠÅ»Ê=óqrÚÊH²ä*ÎgxxrFHÅcá'׋™%Ѓ£ð¶²]—7OíïmþjðÈæ¨_où»Ôß”Øþ-·ÿ¿$Ê ôY>¼é¢vÄÎN®%µ¹Â8íh”gø*¨¬Ë˺¯k=Rª“ru ©¶z>f©p©¨0¤·’D”3á8P'rÜÆ' <“ëÁÕpµtHOÔGÁw*(¦°7¬Uîr\ä ®ÉzN¯I`!%v¸: ¨H’ÉžãêˆyM»ÉœœŽZ#ô<€yÙ’ñNT“ôø$Òמ„M%Ço=e…#er™PÕS1Èáß@ï¥dzŒ²­Ž s¿q–B¤@@´}ÅÕN3š°ô´ü®D¢tU¶&:å—‚cD 3êa ]$"@Ú&§ J@N¹  °ä=iM “?™j½)ÌO£½–Y=o€4t±â´a•=U¡c¸u ÕÐhÛþZ¬~»&3j¢"áÔA‰JÄ@!R¶0£ƒÓØ+ –½N|™F€Ôu hÆ­±$Ú@Õ ÒìálÊr%¦pÅ‘¥lí–P±ÝžÎH”¶'õ/Gãö0 ¨xá¶À—ÄÆqROŒG*½aË“yQœÂ/.“³ëêj¾,ÜX—É4,7=ú2õ®c™&y¥ö‘,a«æPã/ìÌË @{0€“DÂî@,-¼ãi×j`2¯GY¦†¢.óxÚýÞX€(OÎÁÙ2jú!ûCs”ã“”ƒ[Ž…¾nëé¦ó•µƒê”½…²ý¶øÖ=ÿSà)N–#;˜_H#@šDS‰:ùj¡9¸–À?+ððFX'MGoTuŽ€µ˜Þi„ÉÆ³ìxR†v·ºÐ®uÎt²nú¢µ¿?&{‚0î“DÍX7’·³ë6›”ü4÷ÒbZH8Ðÿå7«4T6p¦+ˆô°³Å.d Í2#£/¥ÏòͰ‹Ã1ßaÄ›m3žMÂʹ—|,ô‘L“9ƒëâV®è´Ì_¦ ¹øËÒ°æ[1«ùdɇ“æ(JËsÑÁµF·µF7:ÄœF6‚µÛRˆîx'r¡Htªr$Œ¡‘¾ÏË çõ yò‡º[bÕæªÃšV(Bʺ& ú¤³Çô@†1ÏP98ýeyÉÐ=ÁóFÄ1M(vÜRä`·¿™ðƒ`)G–|@ªÔ[h_θCáx˜i.©FB_cŽj3¨IZO­P^döÙÎ<´/Ka;•ÑcG+Á”Çé´! ù÷ ýÙ¨· ™ïVì")–HI}糚iÑ‘©_äX|šñÅá•2 ¦v‡‹miž"²NZ( •2dý@8â€À3àY#„|0iPûP”0)ŒñI´'€§'¹Ð³|D9]¥i¡PºãÍÆËEJ?åB2µáH±åY#@ÀÕ…ÞÞ4ÎD ¨Œ»Íļ(Š¿ƒ­ý ÎÐÎáÃ7vÙþæ¹€ aÑ!aÛ€¿[9 ¢›E©è¡`‰z%õ$žTXÒ>þç'áа& Û"}-¾onä§á¯ÃZ…²VëøœËé ùæU Ä~¢ìã2U÷䄯ˆ¦éâ”å„H…º§Ñ:8.YÕ^–Êj:ò§ÄÖézÒg“ T¬ÿ®óº<¹&@ºÉß%>X±ÍñØ1jâÚñè]Â^4s“q_'Ô,“`ðÜv“s]Ö¿‰Bm÷âb¨tšR*k&.ôçÁfO§„eMyÀX'«=r}—ßG«±ÜÄX™/–XÀœª¡r,%Nø [+xc±/S@”9UDVëV)xØzüÀÕÿ´„™ÎNüúæ3^,»¥oeí{Æ*µ'N†É1—ëf1¦ÉkÞü-zHÅ2'+b&“}ÓFµȑ$ jçÿ©"Þ³:Öáñø‡/%½ä…³L›©Â`­“Ýd“:wGÃ>:HÌ%-©‘÷ÛVóD &°jfÀµƒ®‡’Bç´|NŒi2ª¶”Þ<ý tŸ\ÒÒ&&nƒš“¦b'`ogž]×s,Œº5þˆªPÔŽþ¨È·Š Eò_b!ƒgy ¡¦?øÛ“Îl‰±‰Ñ¬–PíЊ‘|y̪œ9¢BÈT)Ò£\bÑiÈE,šhxŠ#$P. M×ÅÁ1ÆŠP©ÆœÕâî²´©ƒíñB¤Bî›5YÇVÚ²°áäºßy67æ xš $£ÅK¶D:¹¡v`ŸÚÖ’Þ ìtŠc™s™4âäZÅ[GíMÍÃÔ KM\ÏÐÖ—2¹á¬t-ÍMf4¼‚x°_{[Nw8¤ÚÙ*Á ùFÐú€’{¢‚8Õ`t˜yí @º)­ªOÅœ‡éÌ„T!ùÕé } Ý/Ùµ…-‘X*¯ÑËoì®ÊÆmÃÈŽöa!#÷ÓÞ¿Xn9XLÛÜQ}Hõ9Ò2Ë™@ú³›éÏþó»ÄÝ?8gÿßÿ»~ÔÈ{u,¨V‹ÔMMÇä¾AÛÈKÎσÁ;¯gê)Š Ö}&=oM¤JŸ0xHÍ1¥n™‰’†áBŽ€Yê8ÐׇWB_ÖER†ÄJY™‹æŽ>–È2šºCŒšÑŽÔÎvþƒ}pÑÐEVðIíäåx/áFŸ£ÕÔÍ8æÎ=v/É"|Mù €Dh·¶¹“Ìïß¼ÕrϱŦ«‡ø“G§ÈÊUHÓºŽÞãÝo^²¢ºãŸSÔ¨¨hIáÁÒè'•Hž&¸À:p·:ÙùŠnï#S3ëH/uk¸k¤ý­F÷b”ãJÍp&¼-Üžª½êŽO»í!7C´o^MµÄ›âc”¨ÆœÐáÓbÍ(°AÏL‚´V9LÚEÿ(3c¼ì®ÛÉÈu{SNûÝæ¤p=è‰æ8µpvêÔù¨:â Ë4›*GØèȲ ±ÿdåF³d˜ŽBySæ"“¢#%(ñ›½ø(oúÄ }Q¤­ìxí¿5ƒØˆ |Awhôm51Ñ+ÇØ8-Ú¡„½á çR¡S;bù¨Cå„Ëë}£äM)@ÈÎÚ k¬†%ƒkCE'2 ³k=›q$|£…šùeФÏ1õ…äF§Ôeʵ—}f6íM{jÔý€Q [½:û_$¼ä3¨Ùì;Ø´gZ)m T¬%0 ±kçà‰‚—ãî†>ãc!‚X Uר^8Õzù Ö<0æ÷& †‘OwàÚ0Ïw¾º|?ämß8v¨?ªtÁ-—È·ÁQñ4úHÞkÎÃAµ "£%&YCÞa䮾8ÄIy‘ÌÓÜ’E,¡Þ¯=p ‹köÎg2EŸÆ —Ç]”Ž®u¹‹KozbÊ^ArÇ•`ÔÑŽO•ÂæÜFë72Ææ2xjãî2åàÙÇ2¤žŒ“v ªj(æëÔ½…³~1£”¶¬Þ¨Öp Ë£eÅüh^bMí®˜4y]ɤp;°¿c·sÓq± š3 à üt<É•øšx¼/ ¸3?#õÎ7r•.½uæ4DªþTÎ=|v µ'eÂÍœPZK–,2T¬íØIu‘\ØQ#˜¨;QíÑÖ"½C$ªµ„@úùöUî_^Q¿kUxÁœ ^b«·®¿×m |øöZïCžˆ¥ñ§9EhG¹>Û@•Á†ƒ&Sï@Ì¿ Ö#ÿ¾†ŸÄˆj·yÀuÜÑ ˆa•tÁ¬ô°‚uúíÑ ÀÒ‰)Ôãû|pìÒåäxCÄiœ´§Oþž€'੬—?)Ó-ºdO/§’÷‰ÏÊÃwÐçü¢ˆêf±†®d6ãÍõœüÚ)儌V44..æJ³Ò«¥êu ŽOø°¦f4Ûkt’ÔÃØ¬¬^.ù(b¡ñöæ„t˜3L3cnMSéb¥’‡µôAÞ4œ‰¦†åÒ'¬^þôêµ4wÌ`ÉM µ{ñº]÷†{6žMÞÔ¨0:“±:@š”ìØ­@ÚDX11m¥¼cû(xþIùdJ²âF[Ú€åÌ€a™€~ûTg3„Äõ¸¦–¨y$VŽ2¯6¹o”* kf®bÍ€;Z–­ÚpOKãÕ<™Aç±’wÕF%¬³‡N-ºsFF«ü¹ðZª9­FÕ-­x['0Ó¯™œJ=QÁa!?°2”~Ѐú0=TbbÏÅ?yë4³¸*ìŠýšÉjƒùUUȪÌîSeUZ¥Š\Ê«˜»óÑÙªW¾O0ŸÅ– MÛÕ¹°Óµ >¾Ýd9ïž«`/Û;6b50*`#Õe7Ú—•ÊY3XŽKd¼\+¯pé@ãÆ C¥‘¸›(=QÕ. %Ë.Z%¦M•t•ª7-±`[ޤ7îPt=â#—ÏJ)8–”nj˜O³HÔmuÆâ±tj‘… JfUÍÀâ 8D5pÐÿî¦Î?ÃS_Ó¢‘a£1HPùxáfx€Az]àïtÔ‹Ò}l‡,Ãx»Ô¾'»¢)é[»·;j¦›†šú}½C¾×µ+”Xx’½v§ØÑ§ ’ÅYÚÏÅŠ/?R=ßpò¬Ìu>­>¯þ*us;©Îì yOB],]ôÛéΪÛZÆi¥UÍ5™vè@•EN} ‹Vaê‹‹3ý…<·Î·6Ùˆ.W Yù%ädtö*%¦©„D·©N&²Mê¼-À™¾FGp”Y*¾wl+¿)O¹YbÛ±µ'R1€”Iö†HÝ:‡] ¯@úéö ™Åӿо Ã}rxûþÛ9òþ€¯ˆ+<'Ô“OÃfÂ×ßÂÓÖ÷pZûÕñ"~^Û8”þ>+$!.oa2Š/VSò]Mʬ /ÎâG¸a• Gœ ª­§åóN3Z±ƒ¥¸‘F˜\@(åÒ©—Z(TŒåà€‚ýÅ1©è èZ€œ].FÁçp%:е µ¢ùLú2»íD+ó“ZÙøäå1¦0¤¤X>°FzjVK%$R"*˜ÕA }çýæÝ‰ÂTqÊ!¶ Ž´RH2@Á$ÑYÖÃ9U-/>-:X›Hž2²ŸQ‡AQSÁ‰W¤|§åL7¾f»'ª‘nR<¸Xݼ`U>6Óõ¯±>º'”̢¦‚%-û½ÀÑ6AРɱ³F¼NFäÒ^Qe-Ú°áØL68éYuïú4ú—!:%d–-LYЫ‰Ð(jš•–´ D*1‘$(Õ'e>¡Ñ Yg–·4½õØiBú›¸+´W@[+•VÃ:›ªËÛ¸½BŸ¯d:÷{¶0ôDf;ÅYÊiö1ÅÇ—Ùxb‘ §CœÜ2p„Ž@ý9®þ±ÈG~΂B`uf×y˜ñA Ñ2("§@Ý\£” ¡ç±N"‚(:ÙX뎶ÅbëOÅ$üeÒjÀ0–"¿ Ã:Ì Z4’h€ n´„ÕhhTà OU+Æjl7ã"Ä8[Œz:N÷•5à™›ª:›—‡Rœ´ö¼ÉbuCbj’ŠÐA¤à"Ÿ8 „”¬©jÓÀF5±z´[%•ÄUcy²ò˜ºÔÞ±Jwv†aÓä-0òä QÙæÏê&ei‹‘6•¼SHVìÓ_³ˆ?fD¸ 08Ìe—ê­±;²k í=—Lé÷[R•IRÔÓù3OÆÛEÚíÎËɃb²ê¬Í ¨)6MXÕ¶UY7¸OGŒWåÝWÔ{Íî#“Ô©DšÛ(,Z“jf^O¶9™R±¼¯³4åu§³ä±–ñ×ÚÞ¼ìÒßšIÔqei«Ï²_©K¤G¯7w •6n%¤ºOtŠ-s1N.„ƒùõª(RHÏø“LNijX­Á£ƒ6‘êA*ø Úüµ`ÄW¿UHHÇ¢¤_!Ò0Òü¤Ÿná;®ùj¢ù³'Ø;ÖÑŸ¿DßÒ÷×|á™_£¾>2¹oèêK!ÏnéÍbó+]ÕPbHÎtXëx0•‹‡ÐE÷¥HËÁ°˜K>oI/—ùPîêaF[ÍÉCo»ÔÛ«¡h¢" M™$Âd ªÇþ¥çJä»{›l¼¢háu²ÑífÈÞàÁž¬ oZâr&iu‚eQÆSƒä)¯Ã€ýsË‚þN†¥uKn9‰í.T,«ƒh×ÝEº T•|3i¦—©‹:i ´çȎϲ HòUVþc×I¥(‹E:rq³oÂìý˜6€iO‹>‚Þ±ßüb -|lŽjéà²`à"3qX&bcÏX6¸’¹åÐâž”í{,fÚ4‰1-úsèU¶ fXÄAèj¸Êšb û™V3í¢±FäúÌú‰˜Ì›1YUvGNÇñV>YÔÔ4ÓUW~~Cû2ÍÌ<£Z;ºd/;s_oªÐ"6?‰N¡Ýxd’vÏêbêváKa…%kÅpóú4œ]±qÙ‚q(ÞBLˆ÷Öµ“žîíì/hÜeº†3ôäE®øIK—åä´×\ ÌÞ€jÁˆž¤b§qe¢F Nj6^r<"æeVbÉ©?Y—Æ÷LûÚ:Bí —YYtòŽþaE›X·³óª?NŠD+µHSi*[UÐj d" pjÒU, îtÆ\U«ãêçåÕ.Äd®·*mÌfTâ ;[3£r!FK‘ß\•%•ÆÛ,“ÎH£ ,»ôÆ©¬OPi1wí ÓàÁh±Óšý_2íô "•7SÜú ýtû×ì›76éûÍ{L0HòÆ8ý™˜I_û_RSóôö8ª zñyJ´Wû:Ü{ |o•Þžu‹2åI‘j'ÄBA¤­«•'ÿôÁbà òú`ÊÊL`¾RÞ 0:dMwÑ¡}Ùཔ,«Ëóêˆþ#ª•,ü t±=á:ºœ=êÊY¹TPÃømŸèuÓ*ò ödšNB§€Z]6wqý3íÑÙØ¹8¨\&àmhÒÞm*½Ì7§ÎAŸƒîØÏ04ôE ÑM[=sLìÛS˜Š$(²PV› y‹²M,HÂ3¸·º`&y“øê$#Öâ”’ÍF|Ë83'|Etú]”$©aæÒ‰Ëä¦)ØcgòMGÓ*{Å0 '²nY¦óÓmx:#+Ñ,.ÿþŒ=êš&¾b!Ι&*S@Q§©¬§Zþ‡MD„S@CSûIúã²ööÐ ÏÈŽ^0´>ìb­NLŤÚÝÚât^”…1÷Ïõ¤ÉYtÁLu›RçCœ\†Oã†Ôª3¬ùЪÖî,RP‰–ÜZÚ8ž.#VrQm•YbÆdU€| äô`X+2¡žúœ°ß &RpÌh¹“R«ÂšÝeÞQ&©Kã =<ýÆoë…OÔ]E[3ÓüÇÓ´8²yÞÔl™ÀI¬œÍO[ŽÆ¤¼EêuÑý`©Ë¸üêëê8áŸæCªþ¤ X+‘ùàü /Îþ¸§ª³ÿe€ Ï÷Ø¢jõÂd]˜ ¦´6¥¹IJ¼(ÔŽ,y±ãL"äÙýû5phôwFh~¿rËÈr¾Ã9>KÃ3ä¿—‡¬c+p±ô¦ï¤}ËÝh°¦Šx Ö²5ü«Ï©šàggÖöQÃ×®›bú ’É4Zj6ž®ÂðLÞvÀGÕí×™=¡÷ã#¨+S3ÔÆG4KmÚï€Æ PÇ£2²Hó:X@Lž’r Ð&‚®yÆf%#§ â¸@ JÏR(øsÄ``΄„BPÝF&† Ñ(ÝÛü³ mbÀIc/n…IÔ!iòªZ3ï(±ïIÓ¦¦°~ÒÏ·oU4÷€×¾B¤—¥æÏäþw­î'ßÕí™_'fx¯“…ù³—5øü®ù'ïå+DÚ%·ðØ`ɨqÎwôþ¶×Ö·†êq74s¬ ©ƒ@¥!E *b©þÉÍ#ºzGu;0&Y`Íþ»ûÙžëd´Ëšÿ2Š|Öä¦>a8-<Ëψ†ÁäÅ6\ÊÙ#½R‘¿#+6úÉA1*F^|²üwš‘ª7{ õI†ŽP”®+ÂŽÓA`•œ9¯Ú¤3{*­“J¤Ÿ bgûѵ\ .gîà¦@~Ëo¿aÍæ¢0)–†Á°V¨Á¦÷ãØ¤:øÄaé— E½“1OÒК’ò|G§<ꦻ.OÕ¬XƒÌ¢‡ß…¢_,)ê­ÏOeìš)QÈd‘]"9tû Ž†7Û4¬F% { ™i~Sm»HJ‘«׆֯ ;.”*QÛIqg³>gx8³ÂŠfÉKSë,Œ«›q{¢R÷xzºÏZøÆÎ -JŽ2s]¨û=ð”¢.Z]| |¹?(6.™Nâ6¹ºdΩT{k Îè "§Âæ _0¹\A(c®¦ïûÌtôòβ̋ÞUhW4Þœ":ûÛiÔPeÁ4F«âÂaš¨d Wa -`ÞÁv³Ÿìá ×g¤‡ÑÓØabéW³^}L–4°ïñ™r6ÓeÖ¶.ªq¢U¤HmȲ —e‘5ÛSUë ²˜`÷ãÁžªý)æä­FBƒ„¶›Ž§ öd’ÞvSÁæSO!t$óÝ?iòN” *æƒN§QZ!0KXSgPsví¼¢ÄW¨”¾@ôv>ÚEÐh )Ø=¯F[¯˜fÍÒÞÖ–ïÛ½t O&Ä+`ë;ï:„œÄx¥Æ3ÿ6oÜÙûàÛF2*wšï¨Ó×ìįP‡~B!å"²Ò¶KÍà9iËÚÙ+‰z^ qVÔ(rC©ÙõÅcfÐq©"-:5³¹Ÿ#ñXjòM¥î=ƒuòª…ÌU§£wëêîŸÛ0hÏEÀe9ØŠ‘jÄþÀ79\]CïcÊR±öƺ=ɉw±Ùß#!ƒ.Ë‘}Ü+ ¦XT^ú5]„îIŽYÚàó«¦ÄMc”<ïéñEz¤ö–Ú?é3оE4v¢Ôëv†ÝÀ­x¶Öà}öðÆ¼¸²ªÿ¡·V QbNOf-)2º”˜‚“”k-¬Üݰ{b¦ÏI>6:ý˜ÿ|±6­¹Å8TðUšjFs!€ý˜\¼pâ:¡°JEǶ?øžc9sR •ت/BwÜ£öÜQ™ÅÜ Évá`<…áÀRå2AQçÏ…©ñgæ˜iªF6¨F]Rc5NõP'+^žõHé”@ÑÄä^˜š6¦e’J Ky¦#O4éCó(¦è¾‘Á§kÍâê·0é 6owfR»šÀJY= `;}[ånK©"˜¨Í¶“1̘ê&ëŒ+Œ0Ð šêÕÌ42#qŠÝÌ}{Œ´ †&8ذtóP ¾ƒ8Íe r"t,´›_l^‡*©•KJFeAhÌ9ZµÉžÀlU øxÓoH¼7‰3®¹IР•ú€Êƃn—¬´È™€`.dΉt”’гd Ü«2XN{ËvÒÞãÌÔÍú m7KÃVZø| Û#¶ª¨p2k|ŒÆ!'÷XV*;–äÍöPÑ‹!ª—Þ„` ²{ºèvv´BZaÞ‹¦7g>Uë?…¥£Fˆ¤ý‰€Øi»-!?¤R™0è¤\)òÀCö.hß*ŸŒo9 e‘V€Mݳ†}ùëŠN¯‚_Wßoß›™ ™t ™(}(†¨¦\ÂdÅ™#ÎaHZÀ=Mñ¦ª»]û°x:I”FåΠw¿¦'K£Ê:4Uk;Øn–¾Ò·§ý{‹ö%\Ö‹¸m¹« Ë}"Û@ýóI.|Nz¸FFýä1L³Oâ«@O+$ÄÁTi2ƒšý¢´æ‚uù$âȆž"¯ÈVeq­X»ÿÁË>Joq½þü¾vÛ½2™>ÂI»"Õ ˆÒÉ FO°ÄðëýÕ×öa>=ßÒMýKuìýöî4^i(6kü‡Vÿâé­«sþ0ÃašKUÂ2¹¾ÈE¿TkÉÚ' –,º²àhÈàf¬á<'ol"…ø/1{S€¼!™<ù°!5…™Œ–ÑC%BÉ@ñ9bI; ë¶k¬ÖU ˜$}´eŽ5#;èžìL¸¡Å>Uš+ÌP× <é2ºÊÔÏ0®R²E&"ÛÞM–Ž^UUnõŠá.™…dËÌÈý*1ZŠPzÈ;‹¼£D[&wÄšóž0õƒëVíNóȹÒøõf!ž91EÖuª‰çUJ®"úhÖ‘OÓÁ¢Í5¬W±fß­ž×_·f¦O…ÓëËjª*#ßåžòbø~''¢ÌÕMΤ«þFAî²WM(Ö\[Æof`ˆSËš^§ÝðòBY¸N±å„e•\ärÒ ÷ü^<ÀM#$Þÿ®vØ·øÀ©‚òÁë¡ñ’ëLÊä’ª)áéçÝʜԢ­bÅèx^ÔÌ5Cq»˜?A3ÜùJ :¸²8M¸—¬Êˆæ¹âžz—Zj+\ë1» *wKgçW'2­í¦Z ­ŽðÕTç‰%[mÞìÔ.ux°NCèÐ3!÷Å<•*¸} C äó…×Xé&–ÕTê™HqÓf`)Ë%.î‰ð(³E¢íáÈÁGð Wt˜Ò45ë.­}Òg ¿8ÐWåù¯Q0ñø½%Á ékáÕÚÁÇžý#Àéõ2hwœ;Tã÷ƒÿ&QV ÐE8OаNBOá¸Ï uoAQC.´YS~Ø!1iá:yÊ%sfíI{±nµpGOŸÌ3^Ž‹–Ìô¥­wš–E¼ÏÎnZôf´Tz¼K4Ÿ$¡TèO€~#Ä?fâ)íì+tŽºèáÔÕ·Ðè(:“ =ñ¢‹e¿“ß÷§v8L'Õ¨8jäz¥3 ›q5´aq–?/h‹O8-`84esΉr¡/6‹–Mƒ³§QDc~‡wGÁa~’¯0”h=sêú½û¥ðF’5ÏLãšÐ¢#OѺSÆ EæÕi;ÜEî&‚ärUõŸôOeHu¨ý©úX/[°%»FkÀx¥SõÆ2DgHM##IX-´p£/Â!ÕZöoEs,)¬œÄ™z)¿„vAùB5Ý¢ó×­J΢)&Ý—.èÃxºóup!´QÒ^ºÛÄÊÏ‹Œ¤”eã$š,Gä É&†I4%8¨n¦'H¤Š¡¤ñæµÙ-å}§=[R.B îÇÖüÒT0gn“·ùœ_êqΆ´ÓüÏÇCpdÆ(Y–Ìk¾ãÎH®JJN'û“†¢ 4³â¾,ª°8M©Ñ®’EèóÍtµ²PËð Çó½^‡Âñùàöºb&m¬ùz3R^f'9å-g,%h£ó'*‡È> C.艅}Wæ)3R`/u+9d”¸ö:eÛ4LñÆA’M#ÂjCPÚÊJ¾N¸#h^RC>HǪ?rN*ÑáÔêwo<«f¬+ÉžZ×6¨YÙ¤N°Ií03îÅð¹ë‹Ô)»·ªœ*Z”ÒÌ8v»q2GÙè†eå>cžœ!ª—-÷­ÉRR"¥/ŠÃ4k/Øï´_ÿ4ÛMyk'XÁû|BexÙ2t•˜Z·-•ÃhüÝd¬ k°À­ðÑ/ m!qä±ì¿\¾Ë@½5¹¼9¾¸çrù’•âƒÌ×fG¢_ gŠe`\'î‡"šîõºí¬f¹B”Ùàî4×¼‘‹6NèqÍ3;I[É*ˆPöÜíšÖØ7wÂFx`Ò ·ÑlÆSEí¨LÒ¬žS޹Få˜×X"ÇÅÄx|Îwi`Q6Y¯ÌÃ.% hÓ­Õ&è©÷fͨ© úxò]NˆÛåÊ—eïéEªf:Ž0"ÚìT”Ê®‡¥i–JêˆyY°èiMrš˜¢ê¤F¼ÐtÅ’e3f+3áÑsÓyQU€-ú ±çB8ÝHI-7ëá¬<y“"ïnsÑäEâ)èÙGÁR ÁŒ¯™J¦5™F"IÉ”iÿ}°h†}$_$ˆOv$äëƒI zæB™WŠr\¥ÄPÙ N+ôÀÐ07vÀ÷)3¢‚”¦L{PéÍ‘%-¦Ý§i¬9%ôy5áäsÁ ' $Ѱ»ãK].šÜW‹\ºúW©(_ó®9Šy±T¸Ý%õ<á±ß2aU‡S¥Xé|¨'­Ýi’CP6-¾w5˜´zïÄ­S'tzGN: y eT%<ŠêT1²!¯›=[Ùt[òñµH*P¡h,ÁÛåd;ؽ\ì^}È/Ñöc7¼=¶Ãä WÞ«ˆ“ vk;vÄ_æÄz»§1¡‘§Ðß>äÛXšE£„Á@buÃítŒŠbÜšã=ŸÖ6FÃÂÕܰä£â[“üäÈš#FNàžöޒ˼­ ƒOØv¥c§3m $fš3 ?Ÿ8¨ù®2\aÃ\”² Ú‘â•hÔ˜£K î³(2íH}aÔH§I f(TAà_4b3j„Š#ʳ‡ùh«Ÿö†HÁòؾf±}Òg ?èg òµ¼öÎ0ý'Ò×ö»ï+5ÿKáï8Þr]~‡¨ö­þB”¥ãEG=KDÇËÜWBBVœ§fRÇ)  öd7™àNù ÌUŸ•}‘³»{¹D"8Ë{0™zÈE SµÈÌŠò´F«\ìTJy¥bc§ŸìD†ÁÊÙÓþ€äéŽUQKÍÈ–³Îž€w’”Ê,÷Ý„VÕ‘Ç ¼$óIÐ*a&u±h5epÉ\Ai}˜.óò $€²#—u=yfÍLB°e\U¡YfpÃeOÞ0-Û¨T_ð™¢/³Ç$Ï&<õ/̦ͦÙé åñNæ5éS©‘Þm MþºlܵbWÔì2œeR—" •Õƒ\™3î`‘·ù uKMAO|ɇÌ5‡/䔀x"_¦rY½´uNö¯C᫨x¡”60Ûl"øCöî“Á'­…X×¼½ØPa=ê`+EàsÑ&Rp^»tP!ÉЧï(œP±b©m™%’nzªÅJÈtz&£s“³9¿í§,SÈÖïý­T!\Ê»%Ó?ywU»ƒ±½r/ ‘å®ë#Xç\v¿yyò7ª?Ç5wŒ³,À35¶xôp…EÇÎ#¨±y¦ê¼{%(Pepd§m+8ž¤àJ¬•øo±\`­®ýPz¿,ôîËý >‘˜Ú¾Ï][èª{Ü Ò·{#W¤µºAŸŸe]tJR«ÞMB§êL ®Ö°ÕDæˆ Å/`´ëw6Ü$Uelø&G¼tö®6é$f«œÞËZG^mn{ @%h÷º…¯I/9#nw¨Ô<=æÃilÜ\[°*§ß€ÎJó‘ÆY¯ŸÖâ¬Ùí²\í–EîŒ-6Û} „©Ý¬ï)'¼ÉÇúœË0Qïת¦êêÒî/Î2ÚîgˆjÞ„ž66Q¦¡xÖª'ƒçíì åË6ì\óHÚ •°#ô ‰ÂZÿ#™Q9$ú&Y›‚¡“æH­À¢ºkÇ7}à }ú …§döûÛ –d{¬“ÿ *êwDЖùorIûúZ±ù/ò_H§×S7ò)üJâ¯òªd¯«},_Ÿº¿÷O2½‹ß¿îl_2ó¾îöxÀ^*¼¡ÀøÌ=¿Ô Í~Xhf¤úA{ ùfu-j#q8.]ñ¢/;e0³ÔL.™œÉ%ipv¡ŽHs„Îò |†Tð0 ð°ÆŠ1;ê°@`GJ¨m1ù«ˆ•,]Í-zYeFÑføÃøŸý¹7V!“U-MF]Íi)ÓaQ­qÐõ<˜zê¢)êy™U¾™‡cÛߩٺ†*¨ºh/Ui{è T má‚öNs:Dkß ƒ„í`pk¢™—9pjNÕÊwØåFæWÁKa ¹ACqR)²`ÏgÌðqñ€HÃÀð^FÅhQ &Ó7¯Ô0„Á´JKä .A2—,®O'›)¿dÄÊl•) HoX”³é_æ_èDÂRÞbkµ•\2eª=Ôh€rÁ:Ž:[õ‚I`¼u÷y ²åoÔ†Ê,Ƭv Õ0Ô´¹ª-pï–w«ýQÍjwÛ\É*yè<¿¬ó|».]¦-Ïft¨ ¸ÖÅF²u¤'KÇ­èôKÂH[ò&lzF$øè,+m… m/ÿX»?Q šY¢¾ÔZËÿ€Øî¿¶ûó{¦Û²tÉn)L o¬ã÷V‡ËafxJÀh°¾Ó31r“Bç%'#¾4,â玤|‹nŠˆ¦é·†ý¶ÂòÕb5±P†…ZöAFGkj´!9v=ïtп;>Jµ-mß^ۅƬS[>AíÚ;ꌑí/pƤ8:®›Œ0Z:odUŽætó÷l„-ü†1ÉA©"|´/ó[ô•Y‚ÖÐ϶’.B'è‘Nz"᪔é÷RÐæ?¨?º®‘o¿¨9 Ê?+‰ò@úÏ ´ÝªÿL´ó§ýíÛg Ï@ñœYßrgþÎ@~’¢ª~ *ï]%Ãß©[Œ/\9.æpíªdÄe‘‡ö« =C8ÍÍíbóÉ’5öð€O$»ã’Uò’5~t–y3˜jZé05%ͤø0¬PMu3MHäŸ =Âç5‡˜ Ö™#ó^öR RdÒ2t¡)Ò» ÐStUt2ÏFæßT¹zÕ£sm÷ hZIò5ü`>ÿ²b1¸9CYN_lᯡä ô)ïz»Á :0—“éBo@â@CGÓÐ\mÕ Ä5PHï 6ú™ ßHúñ$ÜO¹ï' þ|™dhq€ÉÇžÏÏò7g¯r2¶†Ëª¡™pÍ^ÅÈÌíÒ{|J‘å`}Žn1v£!¤ þÁ5î^æVenyÜÂjyÝt/—µÄFÂ4NНÛ07ô C¹çd‰íô32KE/¥#é#,…_ðÔ6ÿŬ…Å#a¾ ×-?€¨}'.?é ôµÞôú›·Ï@ŸþòMÝé~Dñ>Põþ€¨j{ýp9%—C’VQÿrœŽ@!ê’ÕØ8é”pÊuM°‚øp] XúÁ–ªY *|žÙUõìåhÞéiš¾¨BG –×ÅSâpçȽiPÞä»-.žÍQiµ“¹+Eê@\ÝÚ…´m7¼!ËZôG£¿ŽZ(¨’˜@3`[¾˜/éÕL®²*ËH¹FÝ7М_ô4€Z]íÎ K=ŽÅóóð^è^³@å¿»B' ’ƒ˜1I[]”ž,þd‹ýB†èd!°¥z÷C&Æ&p õAÿƒþ–™–æf%ýλGÞ£éNÐSŸ@ÅS ÚÊ“²µ˜¬µ=<2j¶%Lh´Ãínªk.Š®61¥ŽDÑ€Uܾî ®f#]Ÿ2R#†ÒÄ™jÄÓý¤ÂßO.<¿sýøåM.¾!Ó®Íiw]¶¦¼f¢'»»ÇÒ)Ë.=í*ë Û`K¦}'‹ÈW–7 F+Ѓ Dt>w§ š¥`˜š:Œ§Ï¡½©a ÆŸó€ªÎÐvðfz¼ý¼ŸÒ‰EÓÝÐÐfœ&Ò2Ì„þÇ}7°D8¦ß3Å€÷ƒ>‹W¼uᱎ¿nÆW|3MžVæ%hý”,ŽÙOFãMÆóøf@`±IŽõp9%ãňÚàRC¢¥Ú‡ÆP!AQ€ó·"Aäe'f8ªxv¹4£JÅæd/ÛMö¨ðzðJcû ÉÏ€ôè3Ðg ?¸Ye‹„ѪzÈimVŒ,4P²à½Hm¬Hƒ?·’K%îÁd­ ¡Ç)UÝŒ;(Mrµó¡ÈÕ‚LX|&NL¾AŒ Öò‰ª9PÕÔ%Òì…¢vmý 4¢ºh X*N ¼x‡È²êEú4UUv¦"¿yÍ\œÑõwÚ}±Ø¢™‡ÅÅð½›öÖ›•„UqÁÆÎçŠðW€< 4S ©³>m¸¡ÝŸá+‹"uÔ|»œoGòËc3 ÀN0$•֑؈|¬Žç>Íî¸`8k:Ñdzò •qŒU¢ÁT3"JÁZ5Q°†G}p´RÆz¼Y{jšÌv‡¾- OË|Óe.…RŽNç^Ý8·O”Æî©%µOjȳk?ZÍ[„O–r ÄñínvfxðN¦ŒŠÏïvž×߸‡ˆ ¨@µÂºRgúØc©ÄšK¶ þ 7¡ŠY¬–5Ĺz©<}™¸i¾ùCÑEÑBl•·)Æ+uCBòÑ;þ DÏþ=lIAÓµzåyZ1¨pOè  ™~†í[‘ÿ/‚£EœõHñIø Ë|—åãës8ù§ÊC¼üúà0•ÁÊ}9ÚäÛu®µâD3!Úý£µ¡6«Yk‘l²˜‚•U,¹@¿±Kí0¦§q$®ÙŸ„PÑ䘙fÀI>•#ryt±´ßyAÈòQ§-X³Øà²”u¬:p*FD£¦V&û„ûpVÌé–²1,”ö¢Úü¦ Hmžä’¢†UÎzøâc)½©©]¹›–z–™\2¿PR·©¢NH¢·»f ÙtX\‡ŠÔ·½Â4Ní¤¸²H¿$Öóú¶w¦oºåŠcPÎ:¶ãf{3'ب'`zÓÖx")üë‡u¢ìÙé«¡,Îû6°¶ïE ­hw}¥Àdª:½³ùè 6ߺ ðIN¼d¿Úe¾ÆWžš†,WÎ3Ÿò¯ìº —4~j²&z,Ýn®åΕãèÙM<¯!ž„4û& $ç=X¤,ˆÔKN¶ývËi"ºu:ÔYÏ/ ob‹»Ò½»!½M#?é3Ðg ÿÿô½ðoô.gß·WÓN|y*¼Â¾×6½{î~­MGÇ–¿w“hÙ™ÙYˆÚ]·ã÷[;`r¼(³ªFWAZx²¬4Ó‡Lø­ƒ)òhéŒsºž4[Ùóe <œºxmöŠ´ )¿¸ÐD‘ Ò€¦@y*|{iwîþ~yl¡T牞# ­ã->û á+æTu°aðbŸÚ‘=;‹€è_‹tóÔHäá OO®&ÿ„œâD¯KAL.®p´¡÷B}‹«é¯l?GèÅPFùv†Jc…P y"Åä“zÜL ù;57„sDoj¦^ͧš¬Jé¯ò&l¿ÏäP ©´žÝ#–ʺ§$T#¾Ê,6 ù¢’²ŠÞmõ¼éìÏïaeá)çi›Ub“×E½y²j^#¥(†r¦:?it›„<òë;)õ8÷EоÒ\¾ÈÆ Åâp´ÜOd;žºDEòW”“?žæ7n¦ª¿ÝãµÌ_ü2#ò­9¿ „±O28å מDzAÏôOçsWðV }•7p¶ïý©ÓMLtœ¼”ÖßNXº“kã’)®û ë’ÿo9°‚ F´†ª¹ÙàvÄé ˆá·ëC';äÙÊ ª-ÿ¸ËJÄG¢ÃúÜ"|iB—CsÔjO .o{|>j¤Sclßbj"õwþèþÑ@‘ög ÿòþ1@RÓ'Ü^Í{ʕ㭠ïJÖm·^ Uñ8¾ˆÇýn|õîéÞɧ1^²ªðƒÝš·³CzàÜ©Nؤ7i«¢hLß ` £1— /w,ˆ|(•‚ê  €L`ûÿn¿¥“ÒYa1ìØGDVJM³ó烢佧 Ñôx ªlÄÿÊ \’|§ŽR¨ìA9ÑÓ¥™~Ž ¤ÂÀS˜Ü Ñ€mz“¡ÂÔíN–Þ<vèrŠå ÈÚe|M¶´öš¤¶Ÿui˜ nºìTGó…‹¼”·À¿`þU©Ê‰Å…KÕj+ËæÆËˆ©‰¢_7𥔜|Ì0Ýž>QÍ£qúVœ'ƒMåÑŸËë¬i]•Q§%³db9ï´¨ŒaÕýØ€*”2‚Ê=ÔN:ÃÿËŽ·%p°yi s œ1ˆfæg§Ý=·LNçqã¬.KJÙååŽïìº*jòÉÍ|8UQþÊu9Í}S}¡.Â¥ÃÚÕ–…µ0Æ}¤›çæeOŠÎ6ÖÚ°éUø3 ¹{ ™Ê!íÒ_RSOHãd³lŽÚõ2î hÝ"?ÕµKl‚{kM0‹<Ñš°¹c´†XKî%Zóð[h Àu†Ú†ÛŽp;z”t«»w³\¬Áã’Ô ©|»¿"GÚGƒôÒNîô%¶âw‹>}úw„)_gõòüüë‚À;‹¢ÉOy-<·¢ÒóókèïÉU R९£þ{ù!Ÿ^Ãù7êë@“•õ­ågköv©µýÎ-˜°LAÙ{XÌ41¹òXŠ|P» ÈuQµk‡¯š6 h’³ä<ýºN(‡®åÇM¡\grðmñ‹Þ,£3ZxP¤€A(¹_r^ÈÿÛI,¤”xkƒ1’ÝS¨AòŒ!¹ϪB¤]Í䉪EÒ·›«‹¯÷W¹­}ºØþÑ@ÞLÿêW5Æÿâ}ú ôŸH’Ö¡ÔÜ ˆÄKùæ½w<ÿ&[U¼(¡o0Iku_ôö­¼ýöÎ6½Ù;{Ê»©é÷§èÓ¶3r~Ã_ûÑ!£_®c¿£{cï§×-yü­é[ÓA(UBF)ºýà ™…,òádz1G!°|õø§Ðõ'¿@5åê_œü"Ã=´iƒs‚ ‰.äApBÈËï„Àü,™·Ý§ÎÉ1bYSlÔ,U ÐjOê ƒvBHs»•!ôç‹ôT‡{Uc+$ì7Ù©JûôBŸÐM‘‰»‰œ…ŒÞÀ›1}—v—§`ÓB d,úåÜ„K뉼咽2EŸ¡Ô”Öïš3YËë¾ËyžÅ­ª©­¢[Õ†L § ^¹Ç4Sg®„T£MÃdm°R}ZŠ–Œ Hn„IÞ, 1? 'U˜gS•kÙ0ÔÖHm>æ• §™/Z黆·ó±9ˆöÉòU@bÌkót†êfq¤Ù{ìúCÑïå•Ôˆï†uûí¸e¯^aê¥BhË+„aØië̃rVü >Ê Ø5ÉsG׺׹dE@S*(˲y_ΤmÒG:ã´åÅͼD[·&°hyE(W¨tÒöŒ%¡·]'xi2Ñ 6¹hWÿ¨•o±öïÒ^Gè=>é3ÐÉ@¶ÄwæÙýÒ´¼ò³ÿ‡·è3Ðg 2Ð×Òà—‚™z³mo D~Ga_ÁŸ×ņÁ$ßÝ(ð¹­òzÔ^——Us Œ•ë Ž´ñ”I¢u! S?‘^ÅÞÀ·˜i/+H\¦ÞØÅ‰ùí~š¢CWâ Ö•Ç›÷^2ëôW·()µüL„Mš§ «Ïl@*)å-ÿ Ü7PžüaQœ^I‹"ÏâÞM©S±¤–'Í¢qDJÅL*žÒRkõõ–éG`DŸªMc¤í.Íæ>Á5~ÿ‰ZóL+uyXžláoTȧ2Œ¤5È6e¬âU ­IæjªéɨƒÞ U0Âeþ›“!2Él¶ßÁ¶;§¹ªzE5ã«”zRíyf°Y_WkÊËÙ‰§L–éÑ'üÏ5¯o=âôó‘T\ý6“ow ù­Æ,Á~Å<Ìßï“¶”àцŒ™$FŽd¡öðGoö‘€ôè¿d ›ö@Ûú/›Lýû·è3Ðg a Rÿý¸ê÷Ë@ï¸É[@Î÷TAoêôø”ÿ´¦—Ái…owÕ££·˜ý{Ðxà–YS愌 <=‚¿<Öä°Øs´‘éá”yæb /„‹ÆÄ—©]cPÛèãë]^I4jUsFï,€YÃÓ'–Æ]%ퟦ»‚§G_'lÚ}MCpI¶Ý¡þ'o2Ëÿ‘U§º †¢½ó-Àš©ºXGT‚|¼P’j9ø’UäÎ2©F¿1y7D¥y~ÝìxÖÃ$Eš= Ôê´Ì7êAkÃe¾UÉš³5ª/JËi8ÅêÞA$/$0\DZŠŸ}Š•ñ:½75;ù¦ÝT·Ø‹xË™Mz}„éß…ê§EõmOíÉû;êµêñI,~Ý5QÄÔ)8ˆC\Yþë˜^öÁ9î‘ÏœëãékÑ`€Ïl`€TŸáÔÐtÑUûb§ÅäWØ2×y ‡p;ú,ƒG> /.iwµ]<\ïÇJMÉôVþh>ý$‹^¯Q[ük$íÿì}ú ôWoè£GiÌ;d_a%P‘Z|\¿³ðü–6øzæC‡ãˆÛ;é^àCb€ ¤™ý¸í¸ªàäõ@f*QÞQQÔ£ú5S‹>©Ñ²ýë=ÁŽÊoAî~:N['g¢ÃÐU£»1gÀW1¼ÕiZðSHµÌà8:x&È·Ô®£Ë\XâSgô@ íD5~VP C/óTá¸#/ÓΤ¢pSžgþ‚òH­ù VJ>2Â'OCg½7¢ â8có€„H(ý»ËÚ°GÓò77ty:ئR ØsYŽÐl°m m1á,™¬^ÅäÊ'­æmôã).?A,M{q–¯Öé›°eSÐI Úxf*£Àʨý2d»õË|Ñùw•Wmðu<¶SŠ®v¶Œ¡1&ú…·äW\ýÏ»ÅÃ|½ßT;yð[ò€4 CjÛÒÊl€ôè¿h »úg¹`C¶qù`‚—òHŸþH.Ò—Ìž>À3ýÄ ávÂÄÅ·KÇßÛc__£ž"¿ÔØì–É vúè«GVmô—IU]ÿ¸±Ó ¬¥‡ÑzmËûÏ,üéjޝK—:+\¬fʪ&´ï­‘)­³_ƒ"ZИÑè0ßÑ.½ŸjêJ96êE<áÔOѲÙoRUtRi­¡n£Gi’’OMì3÷* ª©ä±ŠÍ…^©vŠ¥Iòo\ò[Ç ¨E+OȦÐÈtøt3eÀ`è*±8xæÉ¤™Æï/Ø{¢rx2'¹Ò1zíæ-u6‡ ‡%>Ü' pЀ]‚‚b­üz2øN€PdôL7öêÑ£“ÝB4–û¶zaj2ZöªÑX¬#: \ÞY}iZÑSÔ5Áú´û0g…ÓHª¬wgõÀòd!gû DW[eõvÓüéDÐ%ÀÓÇ%è· â»Úåªv8öÐÖS¹OæeÏzLzñT`WzAêaäÁ¡ ”œ<ôf'[cq­>ýl»4¼¸ŽPþè ¹©œQzS! ¢û¤Ï@ÿ5Q¼Êz:3.þ†“¿w‹>}úûùÇ3ó7‰#ßýj ùK~H2ú+½‡ù­.÷ëÚâ‘ÖýãÏ‹ÿÃÙ÷ 9¦-+‰#­Œkà YE>î–»Ò…½3,д:ù'hg·Ì‹Å«ÙM èå^2cv4)Ɉ®¾ƒIE­“aNcìP”À4Á™„ e? n‡Ñg‚£‚VTââ«^‚‹Aï‰Ø$¡Y1tNO)2´‚é5ƒöSøµö9-Ù‚UµÒ¨*ìêóéb¼ÍÅxäÉH’ŠL¿LÏئ3¤ÆRýöýàƒ/Z"dÚOÁ›< ˆ LXn ±Ðu¡N%Æò&¬z‰Õ«ˆÅLÔ¯z›& j¸ûÿØûçìË„êk„þ­ûÏo«tSî¼²g´ÇÏ‚dÜãœ`I3aºQRêMU{?ú4Ïo8Eõá{éC¶Âíc&‡&A”E¤.—ÿDI¶Âë›ýiußLvRCjOÆí Z£l®;ó>bª6ÕFWT@ëÍ$òR£HsÖVùÜ»þÈ$t€ôè¿h °»ô´.ì®îÿ¥-ú ôèïÞÞý™ÒëÐý^?ýñö—RüÃìß|·ÂòÖ‹xh_]zx¢Ÿ(©ßÝ6ú² ÷Ãëüþ§÷¾þ.íÈû¯ÆV Ñ’µ1 º¢Áz$ƪÇ¥žU§oìù[¡C^•8•V²MLœP5Út -\ï‘'{‘¸jO2E‘Y5bêul _ •Bà(¿‹1ñÄ«ÇF1«ð÷|8‰I6k1¹ÍƒŠê©Ë/l&f­0ªo‚!¯FvдÑ,aȬ?8cvþ DñU:* #j:™-<ô$›tª:Yl´ÁíÂÎßÓÁ wg¸)¦Š¦x×capPŸÕžß¨Ù~ ;EÙ=QKi;`± ?|'«Zgê"@Ù!hjýš÷ϼn7šùÒÁP!VGš>Àt!,›‚ìe¬ÒÉÿLçWø±è½c“'þl4¸Í?{·rª$.¤ {:_~Hýà }ú¯(8[b~½‚ú×Ùÿ#[ôè3пr{•µ~H=BâOþøö‚-þ} ñz­—ùö'x·+×ÿU þÆï8{øßÈÛ~^ð‹ß•ûÆ…·íÑûV¢ÇGV¾·2=ðÎo{Ï=²N?ø­Ëìúõúêʨ3÷¶-ºw^UÃ=ˆ>Qkø¬Ðº°_J¦â㦉Ew¿@cè|Ü _Õ ýõOÞCÞTf:>St‚¯d0Î*>ÅL¶ jŲÈùÂï/mä|íå;M%[› qñ¤à&«Ñ]á$A¦> (azj²N³5PÖ O:X¡áQÒa÷¾<ØYè¸Nuð‹è ¢ëÓîT%¶zgÒ´`ØJù­Î¼¾e©kpx@JoӴáAv‘­Ž€žÓ»ó€«<ɹü5Ô¬¹ÿ”O.á^/ê”—G®xÀÜ;´ùSŒÄ]^MÅv²´¦“ŽÙÃd—(ÛŵüÖÅöiúo(nÚÿõ ý÷ÝGçt‹>}úWŠ_¦á߸ÿQÑø[üï¶è'4ñHï•jƒ3{ ¯%lÿöÝËòéW†éí¥Ü/OÝ?ÿ1ö ו¡4÷¼ê¯7EYo–åÇ+Àæ… Ã÷ËÈwǪ×[{ßâ“ÿV `Æïç~kQ,еg:UÕÇ„ôýÊTÈzVXƒlÒðE~.Ú{¨þ£ùX2Å# cQh|RàžeZïTg-ÊÜÁy4¬ P šÏäJ¢Nþ‘‚7§|Uba]ä¶cO2#;ŽUož÷Äc˜_dɤ Ãa ÎÛ’!ÚýöÏ™0J)«æž ›™­]PYª|*Šbž r›Q'TsÍlvÒò6ÇØÜºæêg™Ì]—ê!ï½j£?m*à¦Áµ!œò¨…ÐZªÜ`™;r…è znk²,ëFtÙŸû0&é´Ð‘½_qéjç@ú ôè3Ðg ÿè@ì2Ð~RôüÍÛÕ[û¿3§â¾³!0ý!îûÃ^H.»75¢ý•Ü ‹<Ñ–*· ¤³ˆ—†ÄŠR£Š|ÁâÈNê˜ï'lË_/£Dgô ¤Î7«K_sšb~ŒÖM|Íï·»©)½»'Éæ+ŽŠÄOPfeª³B‘&UáZ‚[µ–³ôZ¢órÀfcÉOMÞFôðœÈ,€64Y2ua‰·ü¨´j[,"ñ…š‡“o€4oŠüµjZ)ØV6iÜ®]p³ûõ4ü›#Ò }ú ôè3Ðx 7väßþËÞÚÿ4¢¦üÖšá/ ôUÿ³ðKn_¼ãÕò}¡÷Þ 'sl†07æ ¢È}ú ôèn ïé)ÿò@ÿ–Ûg ¿;ÿMÅîo ôW•ðï·ðèÔÿà­©®ígðžÖ€@²j †¹]õcÉæ$†Ê›5T?mÄÆÐh˜¨4ª ÿè´Í2í‘ÛßPŸ¨ÕZ4$bš ìÛsòñA0WêÔ w²K#£x–» „Ÿ ¹-h’°×!¯LÏ£æ°ðI°!L&+¬2ë¡\I¥R'L:À A¿ ˈll™ü‘7ˆ¤LÚ0=ÒzJ‹EÈ—iä }ú ôè3Ðr s ŸÚÍþ¶è3Ðÿþ@ßù#ÿÃï_ÆSúwÈ¡Œ‰ŒßtW¯`¦÷öÅfãõ©_^<¸/Xïý©¯(Åïï?¾‡—1W±ja§1V«E;¬ ò'ùûíoD"ó­‘¢ÀKðÌt ñl)C$Ñ"x@ÖuÊ 7šèà?í-ÝžÔ)±ÐFGíêüIW"Ê„E(6†Ç4²‘ko”Øi ’B$ã‘>é3Ðg Ï@ŸþƒEêJÒÑ}úz'}þ~ßß[ôçÞ ?ßžRíï]«ÔÉaË×÷í—nE÷ƒüñíÛ–»64Ðâ*|yŠ~¡èÇ_WΈ8µ™Rö\Mmµš“_Öõ¨¦ÛÕkÐzþ¤Ñ{ƒl›¥µ!æÐZTè´Ô=ë&HJü·Ñ-+[ÔH³ûzS!]„l‡Ù4„@ú ôè3Ðg ÿð@A.ìë(/Ê?¼ý½µÿKýÛÒ÷Ûﰾ᚟ž°Ñw¨òS`Í[ä·¥ÕÛk~ogŒoŒVxüÏ[((ïŽd`œ›–gþòwÌéΗ+9*iz´ b¬lô̰a]ònî HSU˜3Ð\rºàipÂEÎȳ§m‹©Š¹V)@ú*ÒVñö½Ýµ?é3Ðg Ï@Ÿþ£Á1Úì‹þ1<ú/{kŸþmm—¨ N~*´Ñåa?_ÍÉó;¬]X{·7×Û3äw€ô½úûç‡ê/ ÒwÐ-gߌ×Ë`r¢HÙ8lÕ/¿bM§Ë½ÜeÄéBA7qˆÂÆÁÌ`@AMÇ)¿¹äw'£'õç¡€ „ÝŽ¡mU`Ò¢e¤§ávzÔæùIó‘hS¦ýJg#@J€ôè3Ðg Ï@ÿ3}DÚŸžÛïTHûö›„¥ GÞËWß~•Ó¾³I_Ü«¾¿ª’>ßÕP_·è‡íý½¼ê{‰í»À*>µãåRÏwîašU®OLtšŽâÑŽà ù¤Å'#¶sÐÜ¢ñ“~I>$„Õ   @‚ú(Àú€mÛ)HúªAZÎmùHŸ>}ú ôè3Ðg ÿvýlùÛųJóêqþý–Ø{·|F›GÙmõX¬Ù¡ý¿… 3ÍLG¨& (‘Ašlù×èZ…G02?ßšý ŠÌ4Ò›'Ò }ú ôè3Ðg Ï@ŸþWz™šwŒ°bó'™ªü…¿RH´£¹œûãbïZS§mÄôb$˜ ÀLó°ÂZd¢m{¤í‡4Ÿ8Û—Á“9”#Äö>}ú ôè3Ðg Ï@ÿÓ½J{ _Cµ»¯-x­¾B·­Â%ùZhséÍì¢í@UÒILŠÀ;Ù²Y†DköG“¿Šµ_¾H§1JHh‹©~Òg Ï@Ÿ>}ú ôèz ­“z"†•!Zöç—`/°Œ/q¨´ƒŸ´®œ°ŸdªÝÁ”•IƒñÃOGYêmèeká¤T;«]%ïÉÂG²¥a¦áÛ6RÓÙ> Òg Ï@Ÿ>}ú ôèe •iSî¾iŽÒñR™§c ÉÿÈpØö(Á:g_tѾ€B[¸]†Z,´E2Iy#M_Q»He•ÔW{¾Ûƒé4’Rø¤Ï@Ÿ>}ú ôè3Ðÿü@ÛÐ’…6÷ÔÜò“ü2 ïlâo†¢W®È³ÉÁr!µ XnKŽQnžI·Yî=ÜEñHÙÚü«(s´Ò!ਥ*¿?é3Ðg Ï@Ÿ>}ú ô??PzÒ¡%¶dÚ/Û&Má˜>„Ã'&Ç ,ò#iŒ§õHâ.ÄÚ:ùà¨4š gòì_áQ}"G ÐÖòZxÄ0”@ú ôè3Ðg Ï@Ÿ>ýϤHÈÓæòÛ@·=&¡NÊ”e|cDm³¨Z€$E¸0Á jð喇va"[ @Jß’FŒ§ƒ H¸yHþÑŒ¿'Ý%:Yfâ½û——ƒbt ´ãð’}§A*ŸÁà¯þSñaÖÞööW›¬ðPn ߪÙrFÛê÷mzžåÞž¼á¨¾R´­|=9šçç»ßçÞB:Žª§U°×| ü«OƒÿEìmw?¸ííz÷èòÇñ¡õMy9÷X¿ï§¿Ž|µdŸVøÝ˜î÷˦~}+¿ÿËöi ¯·¦¯¾·çëÛ{øgƒ»ãë‘‘ÞÌľ?É¿9¿ðý>ièoÞ¾ŸþžÆÈÛŸöÒ½¿:ó›síëáþO¢ ˆøy‹þåÛg Ï@Ÿ>ý÷™¿6è¥=A®ãˆ„@7Ø’¯reírÏA¬šÜ“üi«”ARö¨.)LRÓÈBx¤ýk(¸Ý2íÐM[RgFîF.ïÓM~Ž“÷e÷ó±fzŸò®ãrøÇ~Dš¯‚¿ÆÒA”|¿'U6$»· Ķã7Süñ6d´yTLÜ-=9w=ùg[¢më÷¹ü]:Ïgþú±½™ð==ð[2ÕC:â<|ÖáË<ùsNaøá¯ú1%÷<Ä¿ýúëÓ¿Þ~I*|H¿»½\îÿB™Û<Þe|Ü×§Çñ–ä¿òªÇ6VõZ†Žvþþ5Ã[åúu‹_￾µŸ|kú~ß+íî³{>ìôã6ýŠC½|»}Há—·ðç€éË@ÿ†Ûg Ï@Ÿ>ý÷”™c(°@®Åý@æ[ØD€¢ýK;ØäŠ‹h·’ …ímWXŠ´¹_HÑkõ·ïT¤}¢ÔƘ\ö£s~úzÜòòxa\ÓÂ+ ÉçÐâ@ŽÏO‘îŒ%Üaȉ(Ã{ùér²Í# ÷¢ã·òF€L•&ø9s*ºå·q]öSãÌ€mòî-xÏ•ÜU^^HÀðÅEÛqÅ6`“:~ç õN?ÏTVÞ˜­boÝó»=s=SÜû@Mî釕ý{–ÿBéóâW8ò}&|OÔ)†¸Þ!]â èÖyLþþÜ’eËŠ¶ÌOqÊÁÕˆ:;µ“8ö’ßÜrŽ\òqïOfÙ“’ËdÛZˆÊ ÁÒÞ {OdC9ñø#xûËíµ~}Ÿo¿¥Y¾ºÚÿÄõý•áß¶èuxÅçóÚÈó×â=Dɤh‘IïGGxCuï·ð+Âúu‹þáí3Ðg Ï@Ÿþ›Ú×Å}—‰ˆìÑð2‡ù&Pã6-vÒ^K€Äîÿ ÏcYZÃOÞ R¤d·t¶jV‘Ýþ¿Q^SI|Å®pËL6ä…!ÿ¾bO)‡¼d®-9Ëw‚—äk—ß´’K)³Ü¥å’z%ŸG^NþØÒ’žeÈ÷ðoŠ©Çþ¼Ï;ÌÔsÊ-W }tU7åç˜(-æ L†?ý4¿¿ø6ÉÆXŠ£™ Ö]äÑ`< {²i9#=»q²¬ŒU›â¿ï÷úÙd ˆ¯s¥`2÷¬í¿NZ°®šD·ZXËÆ,å·-ä!žÏ?*æC¿R*ñx'yɧð†ùpÛlØáÆ,e.“XÖR@¹u¦ eTù´CZéÜ\ñIåSî]ÿuöt~"!]òIdÒ‹Ílµ¼“ fBgJÀ²ã£q*·’ Á1/çý¶ßJ"`K_€@x~z•n{ËöN1…·§í¡B3éëýדí^yC©þø5«úI‚to°õo›iú ô÷®#¿¯oþ?reû ôè3Ðg Ó@zùtB (¼™0ûÖˆ6ûË4%ÿŽPœÀ„ËŸ z8eäDqR7ãÈW[çLפAÛHÕ"ép˜„3!þ£nÁ4iÊ|‰©t2o^2f™IoH?>z®w驤«ÔÒü3J䔫—‡Étê«<5zÎL2•4ˬ@WIw/_ñœZ‚€$ °&uq»ä­Ë.0ÊSœ‚»Î‚<¥3Ëÿò5äu¹@p$‚q@TØI'§÷\LùûsqðÀV…qœ˜Åƒ—Ç5ÅÍ„Ci .5¾ ÞÓ Ë_ò§æKÐÌq (ÆÊá–eŒ$ ‘hë8´ä$ÈÅÉÎ]‚VBªTÉëß7yZ”ßãsÞ/uÇO{ °’&c”ëÕ±¶Ø’|-òS“²÷*ÿâ#½Æ1Òh·._ëXãÃÉS¾C>k9F޾ä)¡Ýíjg[m´*úvÔ^[­²Ñò‘ ä>do‚ººl{RX‹=S “ßÀ«ë&|?Ôµô+;†9‚¸?˜ZÜ@qz¯g~•{½nÁH²ô ­ôMåž?¦ŸðWoï¼_²ªéF¿›ù˄߿né¤ ¦_Dáë!›¶û“mýëÊöè3Ðg Ï@ÿâ@ÁŠKàl m´åEd‘ýºÙ!j„H õ¶dêm¥™ªÝ '"ÿ¦FRB`WzHløÇ¤>tKY®Ò#Ý‚Wbºå»ÁY° hDê•zõí–-ŠŒ’åZŸæiAO± A5W -yªð²LA^2÷²@]òˆäå±H©2Yhʧ“MN±zÔOLŸxIžXKù$ IþŸ„#À—<õí+²ýw\²gIÈ;> ˆ¼!ÁQI"«A}òT[¸°Ã‰7‹+Íê«€¾p¾<‚Û¦“·q ‚“QÒMÑðî.¶Œýs’ŸÁ­ÆòÈ•[£äÅ«Àäݺ PØä;owüVžȘoBÆ øA’.óoEö °ÙÌ$åïçm”A\,èq\>ÇlSöäL‚ŽÙVXUîI¾úuÈÿðy8æ”G†Ùå7ò'ä¯åùðäá…ºæýܯ¹ä~Ê×Sî“/’TuTAƒÕs»]=ÊNÙ‘C>&ŸÞdÏÈ‘2gUmz«â|½dÃ’€:σ¡ñÍæ&29ÙÅ]>ÚCð¢ì–üTòögâœo¢ß)Ç^÷|RõëßÃÏ}}Å÷s9> êÆéÏ_öi ¿qû ôè3Ðg ÿætý›(Qq.1ƒÌŸjY¨H:˜& ´½ó'CÚNFH¯•‰*œá&]r’ ªºR·Î¶]x ìuKj£ù @ºäÔ H&zØGVò%§Lù  —È‹\n™–>Fïw“)3·“®Ë1­W™A£lÐ`<T'™ /¸©”SfăEE2'ž¹Ê¤83æGNÀENˆß-äfˆ”TÁ’È“géh/ã³÷.€ÒYòŠ—ü>A &{V#ÐŽ¼Õ“À¨±v(?˺€k’ºÈ‹ÎÉwÍå!Ð,œ¯zÈöDòhGݾ‹ü²0_§`…&hbñ7—“o¯rÊ›¾¦ª¹ÆºÖ½–|« Æ ‚wš|?åÿ.ßäÈWFÓ)É jN~Õ‰¢{ \å» ˜ô^ä§Ìßì;ù(/CF×g?+væ äƒ_Îõ—¼þ’AÇóÄ$Oæò´ 07îq*Ÿ%ˆëÀ@¸ÚP•²'þ ñF列§œKüƒ’*„9Ÿ&¼êßO,g´NåþA?Û–Wù7á–Œ1òoZ¤_Ïío²ñxìö?¥¡ª)µt ðfv<ð퇊ÝÿW¶Ï@Ÿ>}ú‡m­ñ~舼 såÒ¸Øö_)|>€¤Yl“†HÁ,"#£FŠÀƒ›ß5zhë}'³UûÝ7€$ó´ÎÉEfÞ G&ÂJÅÑ ŠÁ´_ `ò—ÇÔÒî~õZ, AvÜí„Ô àƒŠ\@r-š¦LÖ7­šZºåE–¼\Ê@ ƒ•+W`Hj¯RJtù "ïe 4ªä¿´•VäL†•ç“§l©luéw PSÉsnmÝ‘þJñŒ]PÊâ<‰+ü[ É™Y 4A\¹ÉK$€'Šºw–—ê™8¤[Þ©ì5™­oa§àAÔ§¼á[þ?e{·¯ÈÀ)^,w6–6AvÉ>ò„ÙØ#ìô $[è> JÿŠ¿c‹vˆ@¤ÀGȬÙÉÀ®Zϳeâ˜LŒ“§B¥JÓˆxôkšçŒD°ãN<ÇñרCàN!’üM}{*àÑ)÷};u‚©ó<äûº׬dz¾2ؼ%öÑ­ëŒg÷$#œç%ÿ޳ÊoÆÙù5 è¹åQH¶Úq3ï9—6zM–OG¶Yq»'Ç©SÂGíÁ°}ç\BËê™Ða ôo÷šð•œò]ýþw äÉ !áÂ[d¨h=¥0äX¨`B~ðZÆPËÝVé~î°wM¡Ë1qã€K· +‰n‘A—€wÈç·,NUñ¿À»ÿ7®lŸ>}ú ôòïÞhmAB[:šÀ¤Ân°ûXr©—!K¯ä(HcTÂi2GnóA¯m»àøN†mƒÜ/»?óx{Ø«_3°‡ô}‹qÛ/÷j1 :P:Ô{â»oȯ ‚¯·ùƒ–íŸß¨ËsÇöû鞯¿X¼ßüËÀâÕ¡ùý!_=D~}As_q4/~yÂþî·ã­Ö½}BïN*û¾<ñ§`ûêž{wpìï>Šýý¯OþrûÌÙï6ÐAñçýÃÛÿ©¾³çrí„&xÏþl¸"löŒ.BÈj+Î߸úÉU°Ð éÀºT~ò,¬e#Üš©šÝ«e±©8 ‹ jY.õ²™ 7jˆ”hÁÜÀ‚`S#hêuõ£7YàË%W&QÓŽL–«E»)48‚¥rq!DºF$3(†,¹X“ -BÁ­9™ÐÉê~ðë•1}yª€°HŸ|!@¤‹=Y%£ æÒiL8N‚ÉD0Üu9Ì„S*IIDA€4ë]Góœ"=1 <@àÔŸ\Q6¢ Ô½À!a‹d".™Å;'“ôÔÔML§q¸Ô‰ð*ÛÉ´È8HÙ &dípðɃrõAtprò}`Îêt±–žÆ=/¡I¡(© @aQào3‹Z‘¿Þ‰‚<:ˆ·¹ðXÇÂZ6˜ôö×Ìï¢á+…H`™y¥®iÊV+E|ØòˆK¦â.¤>©"E*gø$°ˆ]·õ'Š~™e»5ny¤ Ž)û±Þ…x•„æ¢F«¹+ÓŽn‚ËÅ®È;Ž]{ ìÂðZCÀë ‘ßc·"ur§‰à(q'³‹ö6åU¬=%SÄȬï²+ Ä^5ÈG*›Z!”[¥O*_9 ç’l[wÚºYƒ ¼X`"2|Çv€D’'t Í&ɱ›•a¼Ý///‚G\N¶ç¶‚«',l<8on¸çÞКèäbD«çèÀ`%“ïÂö;^A"«—è‚DÓY‡™Ï&.Án¹f´g匼y^ž,íO´‰@£ÏÔ#?YEíP–t2p…ó¿üרÁ\ôM9òn¶œ¾û¤í†Äí×Yú;®Ú7 z¨ûk<Þò¿Ý3ÌW_ίOW“mf›¦Û~õ´lé±ù>ÅúoÕTÿ4z¾Ëü-ÔóÝÀâå’_M®õæž×øiºß[Bóúë·?Dî‡}óó­þL®þ+[ô‡·×@ÛÝ쫃˿0пm‹þ äß¾ \ A"¼øôþ G(a5v±W†È…Òyt®]…6Ï;„Àg¨¼x©4û°¯å‰QWíFˆÉ õ.P'wß®6ZkE ä4©É¬$piÚ¿XW€&90ÏÚÛÄD^eNŠ#aµ}¹Œ'ñÂ[dNƒIAF•"ÎÐp©Lž ‘`@ßy¡° ¥“¤èœeåuf%cÂ~@®Ì²ý9p.H¬b,ª¦´FëbOéŽ î(¬ÙHQ¢¬«åW¨žÆ7tΑ“Óˆ€4,Ôeö¸ë%ûhµƒÎñ¤ê¨Æ*Ä.^.˜‹ˆKf?Ù2cËßÁV€B‹œ§ä%d{P‰Ñ² ôõ¤ ²€zîÂIëd-ÖÞtà‘ƒxóUh„L{îzɺh8HºÖ¼ÕUŠ_7DÒªY&Î ª·Ö¿L<£ ¬òëpò„hH!>!í ’‚<ê”EJ,ÈMŠ‹Ò=dÂÇ%<p-µ%À…´F¾¨¿1I ŽÀeÀ‰”ÿÊpœQÜèòÆÆz_u¤8c7WB$ÁDdÝäo‹Î’{ÇàpÜ’É?*Úí2À¤§…5Ö›,©W4Jb*±M|¡ÀòîÈ-G šPO®ZRãç.kqýpƒ†…û‹¹òDªËð³<”Ðûɇ\äÌ’sîîC·Éň ¯ŠÒ.)Kδ$Cʾ$ÛTdàÖ¶ ª¤áèý#+k?üM-Rb£'L‚ò…âS!•7€©›žìc»V‹EàðËõ.Kéd÷ø@&½cí>ÂÕU l-e•i?”‘å±.Êq‹êÀ®HF’koX' ‹weJ° —5>+' aMhD!ÉO3¨–ʼÚ^Tü+`êÕ*R—³]°˜^ 36YvN` œL…óôÂWÔÖúeÎ(ÁDºÿàŽÖ7m‚ò&N²‹­}ئæˆYÁà¥<ƒ}Ú2qÈÞ€Œéâ•™l(ø8QaôNáÁ…”4-Àøé¦ì O÷TÍ«¤ õL.7¡$`˜™®|;Ú-x2H×€H´[-½$%€ûëAxÔç\š—›§%Ò1»zhf 5Ì^NFîò0°S…KÝa •@§šólé Ø)uŽ4LlHVQh–Übò¨­È$2 u#,ÀõTÐdš ;êÙʊʨ¼ß騀7•)c¥ð"‰1YòkäŠPY„Š!ÅìÐ'î@»á8¡_5ö0欳MkSC>x"vçß–"Ûüe—ä/C6é˜Ëñ%œ ŧV§„”þÖ[Û«-Zõ-iÒ)3X06-‘8ȵŽKH¤ÛÒ @{TíkÔûºÁ"Aƒ4 µ1d"‡n¬á©ÚÃwËÛ?eÊŸ‡VÃ*O4Y-‹ªár%ñƒÆFÓÉï7üìîù´±Â@Ú÷Ýâg¤iɼY­ÔcÝYЪlÌ Ã­ó4yö«wí¥@â­qךèb;ÆÕ¯*H4‡£ÜœUÐ>™ä¸ŒÊ =ÂöE“÷ƒ—¢Ç)¼‚g”Ž^U6§¬¨<BÿÅzO³ê]'Ÿ¤²Üo”Ø&à„l$@5«¿Ü–Eoë‹\„I÷ÂŽD ŠN >ÑìøÑ9'¸7+©UTwÅâ£Û$*A@€MÆçžò—Ù.IÑu²þ'íTÌhj R¾z^Q¥ ŸAiXW¬%8pG”ž‰‡•j¿S»ð?À0jÅ‚ ‘ŽºÙZÉZf†êvj™vLÕÂ<Ç5±i#Ç®mC4U’©ÎŽÊ~÷(Øp¹X$ º¼2Þý…ËŸùꓽƒ¾%úÿó´v,dWŒdµs$–;¹W¢•"-Ëö­ fúCÙëßpõ÷¨²õ‹ÆI»Û"hq)Ñ"K;íU¼#èæ]t®¿ ¥¹`:ùä=~éÙô<Ÿ;™SÌkÿ•´š´e¥G¼¦ff‚ªCþbØf#©MÖôÓ>úÖù×ÒÛ«j÷›>¿:Ðß¼ýN¤ýú‡·ÿS}¥tuÇC¨}ɪÉfÚ#ævÈ1­ÑÓ7™Û2I.M6®,º!iÛð¢ )=Ijí.rÉ€TA‚ô3ØEWši ÉË™xÑ}¹«s¿²œ«è@’G}ëtrÅ%:¡N–®hÞtk߯t°Ä6X½hœ‹wT›öYò’u6 žFXƒÓŠ“Ö ;¨Ñ ©h"ô{Eñ.©àzÓÝãO]Ùž¸®Õ:Xy,‹ŠLÒ`óA°¡I&“À«ïà ^Ø"ÝPgÈ¢“ý*ÇUµŸ¢u0B¤®B!6PEk“ëÒ̇ãœâ€„*»¯XhhÖí„ý1ŒiÓÒÃ07&Ü'­òEÃΣHȃ1E‘MêäˆpïD/ðšò½(¸ÁG@j8ùñ|À ˜ô~èoù;pIéÛ=<Šï6ç:d^¦´´ZêN/ø¬Dú XZ³òšÀ#Dç •£X±ll3»ØbwC"'ï´íR­±‘›£Q}TÃHcr(”—~¤ò€]dý(•ŸÓý¤n‡ån…ê:¡ˆï÷ß&Òö4klç‡ J7#.r#êX¯]ÙÍ 8ÒœªÌ å& Ò¡Ué±!Ô~·ÌÔ¨‰äXŠØXú,xß‚Œ°Ä†j[»å— ™ð8*¾¢ÉÓR=óepHM0ÅHW Ö¾Ç-Âq;xÀ„wV 3–+NëÆíêõ"®å¦=—û…Ò,G» @þ˜d]&YWØíq_Ajyká±Tù;PWPÉ€”#ý§Óª à­j—·s5%^Ûš ñ‘k›Æbkl'Ñ¢1ÕœÁ¨] ö)+Š@htRR Ì‚ßךÐ'üH|3ì"° œÍ“é[üä"ºcog‡;?p<L%Îé4q0ª³‘%Òµž&-Ú§|ñP¼ã¥«•¼æ ãm£.78úfn(º°Î†ù0U<Ô8Ï"k;D #ÓÙ`dÜ4½ÙÜ䇦¾£ÙbêzbîºN^ž0Dt{˜ÆïŠ9ªv{TÁ@Û•þýõÞ𓙇iïw AõˆûÌÙÁbþñ@ÿèöj w,º¿¯àˆˆè›ü*“Œ…^±xÔÝÀ%uÇ&Ó#ä Ò”¾³å?ÇÀБËü‘ÞR6x¤Å6Hé¹ëôÛÈ43È\Ç-p©ÛïS_X”âª,HÎ@½™²½5û’±AÉC€½´œ‹r ÉÁíe)Ïké’³îäD‚¦¡`míùà¢3YŽÎ~+ÜðÌ{ Òy‡üùÙ›Â4øw sÛÍq1l×£<{΃Y¾v…¤ "íï„™òfã=jdÊ Öò¦ãÕScoš\L£ hA˜sÀoªhØ'{" ·à‰ãKìHÀÙtZ7«;x‚2HƒX“i‹[=5é“Ü×MÖäÔòæ™h­ÄÖ þli.á÷Ëì¯ñ›~PYBù¾4)@ºøÿ;DBiM!’yiÿ ]ò‚EÒ5z³Ž>ð~ØxHGH™i¤ôÖŦ÷°EÚ~¶!ó–übìNvfP3¬ùгªI~MïËàìR xPÇåù2*P‘tt™‘*<•%¦diDöÐü‚"~¤@\IhNo*4×ìp;hiRÈ–¨w@eé¹;¾V+ð €¹FßO™ò£ÕœPHÂL}ɹ¬U Å!$òt#GYûmäXHCIí¦j»²èÌò™L»*Å J*Q¥´¤%éfÜ mÓ± ±kÇó@C^¹‰òp" ƒUž.Ý ¢¡QS‹T$Ešˆ”sôħ—ë‘'´“]I…Q4A¨]ÉoØ Gù v¼}¶žŽ»l¨²];*èïš*°`#Hd•M>ødžL‹*À@%ÿДAí«PkVl¬œ‚õÕîäݬD€yT¼)ÐH×äêŸ:¬*œ64€[½ƒ°$ËÕ› ¼1mȨ\ê5h’4¯¼‚1ÜÀñ„ŀ\SàÂdƒ9‡ùà Bxú°Ý„SEÊBã Sa¥{åVÒn§-]ÇÃçUâÔƒÛÑX¦ ºÞ vÖp‘ž÷²E@à*ECņâÔ¥pWƒHa«ziÆ3ŠèT¦ÆÄ6¸ $d¯Æ³’OZ.¡/2 ,š\ '“!§%ó?Uý6Ü™³ aþ6PúŽü7Ä"y"ÆÕc#IÄË1á#Ä$Rˆµ»?jµýâ‰¶è  NiÐ9+„“Mþõ€Ô6wô$àº;¬§¬VÏ~[A-ŽÌ[¿ŸÝª6¤‰<2¿ä2~he¬…‘œ<-ÚäB,çºÇ@ïLúh£¬q§T@ÿOKœHPOÈUϳ'±ÛZà¬1éE45u(~‚³·"çJc朜¥\ì´pñR9·Gɱû`ÓÊZƒƒvJB9SavL…ªëÊ¥˜A•q`“Üâ%`8›D M·#¼Ë©•…µä‹epHÞ¦ZlïLC>…&òGï/ôá9Š“–µ]ON$ÁÇõÁ…±+Ç£ Ÿ,ô]Fl\|ÜÔòÑ… ›üÕ›èz2jdßQ$r!Ò9É eF0!:f4†©º7Dµ¿Ó›Öå–!¬ë)¾½”JE®`ŠÎNmó­—ƒ ¶Ñ¤<•9 Kl]à£Éÿ$IR$‡tÐ&rBÔädsËè]ÖÕ<>¦L©læ/Úg— "½É׳Q×ÛGÀ2ä 𱺤ÁØÆþ͋ҡƒó€š4!4KÔb̓ý_Ü_lì¢5%®ó°) ƒ.sĶÀ£XÙRÉ2¡Õ @šŽ‡^ÄœMÜ S6¸‘ dQ Jr~$‚l <º1‡’*ê@EŽ9y'%§5ŸÊÓ R’Ï>’?byÄÏrPæ„æÓØ&”Tpp/CKlÌ‹ÆûÔÔHç\‚lPJ£ŸªÀ4 1/;gçLmÕÀÄœR‡Ú{1‰ñb;à"ç‡a-ÆÒõ 8ˆ #m&¥9–)¹}9 Ên,C¢ › o4± 9¸™<]³9t6®..’°·Ú© ÒJ(€‚ {ÂiÚ€Lñ¶(Q‡Áƒ©Zÿð?¼úÿâ% gCaÓH†Î½³q¸0$1Pwú +Ê—…ç~UÃ;Ò–) TS%‡°#§>‰™2á|D,ô狹”à ¢¾ªOå ø1¨šAad¡¿˜¦bb•Zî‘tM—ØZ³ˆtÐÂrP S íZ@†³»Vzt7]õpó2ç •êe Àñæ¹jnÎÐñ¶"³‡Û© ñ3¥a`;e¦X#Ø3Z>dGù ZºÂâE"’š‹ÜôI F¶CÛ™³y#|‹rÕd× ¹BЖs¥±4޼L°iOh ⢻ñâÑx:yµ‹5¸çe§(Í +ò‹"$MȾëe(4 þŒœÏ«ÙÇNFÒc"…ÛOs>¨‹¿Gøå²Ì}{±i[pÿe¼Ð†y*|ýóîèd÷C_†¯qÜ"_°þªÓ:ž?ÿ­ÛïZO_瓾»Ù4mÜ”h/”³ñåfĺƬGö±M²¤!ì'ƒ:h1ýVh DªA‚å4HŒÔ¢¾èêK Ð%Xçx äÚ“šPHE«\*¯yhBÁLâÔÙƒ“?Êê¬?PZ&…5˜s/Ÿ–œmUë,×Á[€M9n"R-QE®êøbyöê>ûˆ¦_ÈŸOøÛŒ¯³ÂÕ W*ŽGÛM…w!½£'**‘ÄÂE‰“6ö%6”ÖA˜}ó®):ZDv9Kƒ§³ï 3¥7óÕ–4«ÃhoŸ"¡Æ®}óFr$ÛÖà Uë(H Š5]îo5’9MÒƒ¡ E+œu„épAŒ™Å¹þ’òê”ÄÙ»=IAR#dŠè=œ¤4¼|4‘Çx¥¿$xšƒæ l µÕ²ðP¨ALjlT;îöØ%CB³é’ßvÒ;‹ÂmtR v± ¸sœ°N ™å­ %Ç“3€|XÕ³¸7IýÀ l’ìQØV/CO¤!g&PzIŒ€÷ ¿pþÒ:°|iQ«Ñ•ÖRN+Iªn `i:KEVxVigQ òªƒnm0@œê²@rxÚçtr6Úæ‰Z]7]Úä«5HŽžöS²Âƒ§XlÙ2ùä’ÿ5°æ_H_§.‚7`òµ"Öšƒ)ó bÂŶ¯&È™g{à…,R§Ä¼r©W8ßwPãƒóofíI®|qFÍ~Tÿ»Ék²Îeícî]^¹˜óZ†œ,ü¡¾š˜qÐÙ³p(Ðl'ÿº›S|¡t4±z×ËT­Í!Uv-©ý —Ìñ0Ø¥eýKÛVÑáøYiÁzYLc$•hn.ÀãÒ|„e @2hg½~pytjaÂÌ;´¹5«ä“èFUzŮݖJÀ‰ƒ•_¤E@ì<飌ó ¤o ùè~6IjÆr“!]\šÀ½#ôlÂŒxp%†ö–'1Dåe!s4Ö¢'Ï.¬f ‹)÷³õ±MÛuéÍa¶|•:‚N}ðøhÌ«›ñcCgÄÛa¡Rä›#Øé&X¬`¢Ìž¢òj‚ÍåH¬¿êñ… xTRkXÁùŒz—îþi©ü7 Ù|)>„±ü#JºòºÁ4t9 $8G†€ d¡éÌ©‰k‰E¨Eé-ú´Š €tÉÚųÂ6œ{Ñî(º£Ģ9 ~ª>þ=½ZdW–Þ†ƒzT8Á ñ¢¿ï¢°|Fr^õ 'VM}2ätRðÔŸ—Mà .Ú™ãÅ"«ÍÚs°DÆÚYü‰Î᪣nH\!ͤµÄ”6-+±œÊé±çá=1¬¢òaûtÏä£oÖç*'@0OK‹~‘ð(¨Î‰Ýuúàš4¬Võ-‡‘òó#,ê£OK¢,UlK WÏMo¦‹þ=—Ní丒 8¯]@zr^T 1öLWÙaó s4¾¤­7¢C’¥Í*‡Årå£ywÏ·ù0é}æRø´~¹ß$¦*õáò3ÚüåsÊ's„"‚ŒS΃ ¤dik’•Õnªp§¥’c‹ÿ”•.¡4ÄvWKéRЮgÃ`Q3]V7¾ ˜Óct´:lڬ賷ÎȨšØrsÒlÉ®ÿªL™Öd É^9°AhY¼YÛ‰<>€“S=‘ÄEáÐ;@jÖϦN”Ùq‚Èr¬-=À_kè“êáÅJË"ÑZ0›÷CO ¤Ás =ÿ|Ø2ˆ4¬‹M“€ov¯Už4‰Š›ÄꙜBiƒµÍ?)­ °_nb†EÒEYœ‹üÍ]L’Á'9¤^.`71Pk¦9ê„æ5OM§IÞN¥Õ@‚wÎ=´f”/¹ÒþÅ‹öÝ~qÿeû5‘7Nd$4ËBîhʰ Èâ3Â/^JXÿ%QDqús½ªÎ¾é›‚F©“ŸzmŸ/M^û5`ªØÕ²óçnþ¡4 jÀ|Ð=Xá¨ïZ4J\¯šª1ÀÉ’x©pë Ôc'4úlã§³2‹µ‰€èeª+5n¤ÿǽ8¢pÏÇ6Cífo¿Åý°[X_ÀœË¾“g¿9pÒnÜݬKâ$Z.¦îh暯2Áj/š-GðÌÀ™±^? °š¹ üਚy$G®*ùP¬wnbGL¶GÉ©**Í«pÔ@ä^„C|­<ôtF)›æVÙc\.¡óO®üxg¬^ž‹•—JAÑ"r¶.¶E…X´'qîÞ+–ÉxR†ÂL^.¶O‰í»IvdŠ£\d½_äM5Þ)û¦~6Ù#XÈY6åAzú´Ê .m*à‘ùH@5ŸHU.‡å&à~Rh‘M`;Hýa"‹“DPÇReL™LG%£(-»Y‹nIc&o#È=yíÅôC Ó‰–Lì_¤ƒU[hØJ ,!¶ª‚âùš­æŒ#'Ór£ÑË”]ξ™vÖL+¸áÃ],‡zTïÚA¬p° ²ÚÜ­ ’¤DÎ&óÝó¨éMZËÏ6äG&XxÚÖ ’@x‰‰ïkPÎmvèV†VCM\@´ÂäÁ˜Øo¬Ë_”62…±C%bN®úƒ­ãÝÊ™)(»`ã!çx¦YlçÄisb¾•{¦áé U%­'.üï ÕŠr¿Åà‰‚:÷ßÅ%ÏSœ´7ÓÛ¡o¼)‰ód«)ŒCA›‘¢–jlz‡æAÛ?O{i6~Ö‚¹HÇieµŸ½ÙÿôöGNÚ/³QHÿµ"ÊÎCÿÕòÍIiÒím…¥H·ÙÓDz`ÐÕv=ÌQ1.)>½¤.‡aâÄÉŒXˆm17É™«”…€èĵ—»æ4˜œxïøðoÕš½´±¤¹ñtW”ÉD>îÛtàÓ@Q¦Ì©X%ï,” ‰´Ý‚¤T.å8Æ#39Þd5cO¶×#WŽK¬N²ÔOtt€©åÁ?y+÷cUš­eaõIaG¸©‘2‡…r_*‚¡™VŒ3L ÖFMŽWòGÍÔßÔâ`¢3#v°3˜¶Ìò&CNÙ5'ü‹5Ÿðøl/³Œ\æªÝw…ñKÎiù” 5ƒG/€ô’MHŸtfAÎ*gΘ"e‰®W i3H§‘Pë "á¥?*4Ë5gÚ†õòú —Í»9X6 Ô2¿$õÑ–ãz2~[ÉQøíÉ0Ê‘"Â첞´víjI!ª/YO4‹hÍ»#-­¬B·ŽêJÜ9ëDzi«òè+ÍÞ²Z½_t€TºK¿P…H AXÏi’ìfÐH ÒIq¹`g´EÑIËM¬Ù íI¼ ŠóßÐ €—,­R‰t ]Ê AŽýâtÆ ¸zñBž!ò¢uƒ³ TêpÙ„Ç).‘Ê ©ãe°•õàe3›ÔÎäәʉ:¥Ò‘¦æ¸ZËÊ_‰'¬üi\„}“ëAtq%®µ2Lèþƒ'‘(2g½¼eKòD:gÔMÃL­Ža d%Á°D”æ1..›'< ¦£çÜÃ#78ñkéÑsó͉õ –¥´·ÿ…‹öŸÝ¾]ÔýA¹¡,ÎܡÄ=Y¤IÁç!ëÀ:àŠeÕî&P÷‰lÁŽ‹+0uEëÎ "‹ÂOW’“Ú•EÔ©¬™Æ5‹—ÒÈæÉÊØ±EÚ•žk“Â-oë‰ þü¬D&ÚÙMÄz5ê<òª±A&,¸<@«½½Ú‹*ÿ±è0™®ZùwyP]¼(]œƒµÈéâ’Ń`”O‰íë>„ÉE|uÄy2ϱæ2±§çe.Ë%W>˘ÒY.™<ž» õ»nuŽâhø™ŠyXסçUgÚªa™¯WµøÂ—§J±Ê¥–sÅÜÃ’‰„ñáiÛ†³y·›¯Xbæu ]u aƒ(ÔÐD WÒH׬À™!Ór´ZýgÏÒÁzPÔ¹ŒÀA"Gv4h¿ž:«Vã.JÍ'é—L C˵\{h•í‡ãñ[ Ìã˜|P ô~ߢËÂÙçS%+Œ#Uø´‘^—76Ô>Íþx«x˜ü£Öó« ùÝ—œ)*Ë7ÄfÉÌ|Ҁ߳õó´ËC`¯qõpZŒã^oiÆz$ùZÏ0­¾M Ʒ(Oo™5º¥¢<Ë*?[]²ÝÜCø…@ùÔp œ|[hé2ûM+îÀÚ'›½O¥JðÉÓ>º™.2r•&‹XGid,#M´ñÝÿK¡,¿HžÞØÅ…å5•mÏãb‰mÊôq³ÍqXgûÏ1Ô&’.z‰ U¤ÀI¶üÃWߺ½6ƒôÅ8’¤“ŽGÁª^MvC“ òAš­ØÁ«t`àçB2•-*ŒÏT«g®ìÂmVÞ·† ²\››o–pI/¼Œ«ÍÝ'‰´nljB+ ³z&vE§ÃÁY±['|Phb8â66¸k%Í)Q §Âå”§jý¢ÀŒ0ÞF}jÖqzpâ>Ì{7r•µæ¯<7“L锩¿ØÌ¡ß·©¡Ÿô£†E/e4VºœuYLÓ ýk¸äðZæ­-g¯}2¯~L…P€tʪLæÀŽÏN}¬/Í„DèaÛ¬Òx*dÝþ>ìßõH¯šœ¹JEUó ¸Þ ’¤I³%šnf±¡ÚÖ.Z›°ÏžŒÚ_rcÞy#£Ý½v+‡$ðhEr )ô$ÀaÇh°'ç€4,ýï¤Nþ2S#$STg²PoŠSU3$L¹3_IûÖ"_bâ¤^¶¡³¦3bŽýsòüR˜6òPEXÐÆ|¬Uþ°4âÖN˜¬íji‡BWÒ;‰«F]¬NF\¤` V8ÍÃ~m»l”³»iŒtÅΣøx %sûÁÅÅAxýì D½,AP$ öŒÆÍ%ÆLýéûƒY$xùÊòÈE€[È" Åo-ž0F7+ƒtªÝŠœ‡n»\d¾MÀ¤Â\•‹ŽÃ8·S&€ƒë`®ÒÝ—èìÅ}1­)ä4+,,›'¯ýÝ&—¢è å®ý¨½+CXadSleK^Ís¹ø2 Æ@ŽRBø÷ˆ´¿^àåêË©N [ER €#pHÖ#'1æŸÙ(wÉtMb±èH³†mýIìöþ â‹ ‰ô6]§|ŸÎš™ô™ÞcµÖ(º*dg‚ nploM*š÷ý4Úg O.jñXÈ¢ötã|¬pq…%ÄÅÂP`-lóT] nM6ôª>§c÷gâºur ÐÍAQùɉߨ öäpØë­òƒC„¤F ]¸'˜ÄÓa‘Ÿôt}­x*Dô ˜j©ÓZ•õŽ¿8yNÉå îõZLá$«™r¦à5$ì•X÷CÒžG« kšL§ÂüX8#ñÚËn»oÏB ì™ÞàAŽE®`4 û|ô}²/äÍNNÙ͘ ¯Ë㸵™dq5!Ïp”êh~…àó4Ó\ú# [ ƒ‚O7À”¬¯h?"úHWo¾Ì4Þ΢C ¯Ë-u4U¡Óc§.WWˆŒ´Ùÿz’…nt±An|Ê´V±C‰ñµsØ nˆü”EÊV•ÞuimóWÏ£E $;AÞt ¶S³×º‰ÄX-Ö&ŠU¿þ›¨öО]gSf A02 ÊúÚN'T3ÊYyØIÄ•xµM„ìíÑ¥EÇ«é²ó¢ñãe™.}7»;µ÷sÑ .['B¶^ÔdY&Ì,ñ2'*¹a2©;b·‹ô8*CÈ [b"‰žLmÒ0¥-£˜ýr$'¡˜×9 –{úó½$5”„/ÌÄ¢RXǧ¨)¸Ú‚,6à,HA”}¥¾ye(é1Yýhä™4¨¥B:å¼(± Ù‚Á£bîGV•ª£Â–´þ¨ÿ’ù¼¤‡tš©ZoÛüÂ!í"4ßá`78@±£ˆ-'2+Ë•þtëZ{±F ж@¤!ðèFÔˆŒˆ³“pyõ!˜€y.ƒpò)­YÏJ4+U«| „£ ºa½ª{;J‚A[$„Ø)oÏÉJíT27ˆd Â'&¶;«ì"|=(wƒÈl¢‡´h*ŽõÝ \mµ¿X«RÙ)R²É¢òßÎ…{}ªŠ…1V… :Ë´7 ¡òzb©àX‹+¬Ä ›>9ðj§å¬› ]˜c¹œ ä§\nቾ+Çߥ¦Ù$jÜíÛy¢èa˜JãÖæÔÕ,ý8–NÈ6)_cá*üà«-|»ÑúJ,jH‚N«¬ßÅ ù•½:Yý¸iƒô\.+4L¶ ¡Œ3ˆ§y“Jv‰s¦’ý\AüZweÑ_ÄÛñJ UU³Q8;Î!NNÀ¶ÿ1tãŸ$¬\ßtƒ„Ì›IEÚP$È']†ÉiÇÆ5˜l9© ‰4K¢µ<Ž›Åª sôˆ­Tþ»gròí_D‡ŠB@²_›ê»U£¦îÌR,ÍùÒö/n¼*»DTg—YÐæ¹&o­-*%pP¢3²ªXhPC£+‡:ÙJÖ‚IÐ*»¥÷ €$¹¬Ï‹ÈkþÎEü´øþ³é™µâ|S wXØÔ%?E÷4y^ÆÁfZ`5²´‘saCãÙ™ÙC£ÖÀŸp~â°HŽ“À ¶”v1þÉWÙ•·Mžx‚­/ô‡À[ÈRA@ø_¹hÿÝ[ˆ(»ËòÖi7™”²üÁ#™ÇŠ`第µ§tZ-³KIC± ®IhsR@;—âMÕãÂWUל¶Óñ+i)¤»xÅŒŽ× õجÖÒµ|féNzª¨k|­@5îŽWÇS×¢rBT9´L­ØÐ-äƒÎMϵTfæI‘Á<"ìG[Š ¾â´ù~ ­¸6@Úý™àC ˆH¯¶mJI,e| ó^14[‹NU€DuG@‹Š(®Û¹³¼WX°Pï 8*Ù2 0+iødó9ùýýã(šÿddžÝË‹’)wr)ÇK ’6^œž«É/.Ãâ3¿F7»µó¦ÍÅa]o|“#‡“T/ Þ2°u&˜îã‚Á&Mc –94Øž3µâHÏ—™ÃNËûÛ7÷–Ñ÷BW/¤p¼²föoñ¸3$/¿,T˜":9ªn™[ý $§€£lAÕ‘ f£jî‡r[5ÛÈ/wçØ%ã­o¸5äÄ‹•¼YSèÙÉN­Ör_ïZît¦Ëǵ2Ò5Nù ä‘©ÃÖÄ9-½šØn¸§RÑLÊÑ·òŽ1îþÉ(Ýn|Ûiq‹Rì;—wž™ºªéé®îËדr†ûmvËÓˆ¡i¢#û»#ø‰ÖµX¬ÁD{¥Î«Ùv%)–W(`jtk’·ÔÃ5UEc{Í©$·6¯‚ƒGÑZj/vGÜ$:NS•i7¶Ó”·™4·:i‡[²{fÉ4Ú÷UåA3°¶|ˆ³4Q7ëíb=kIUE[´4Ÿ‚Ûþ‹*¾é‚*ÊS,Õ2˜­k°"Ëây¯) ¹Ä¢Z¤{™»¶7¤káö0HÍRÑÑÇÝβ'¯ð‘ëZNÁN^÷ F·°o)cÎl䯦u fL|r¯TŸ8¾Å£&›Û•ºj+¶fœ‹Œ_F'|æ•§% ff^æ‚„?76Ó6’Ù/ZX±Î„ªá‰*šÐE]VyÎ\ ˤ”çr½‡ù à(X¬9.…—Ãí)Cœv×tµ“¸©U7•‡£É£(ö8ú°+wˆPycË$;9'£Q×tu·á*Úæ‹{¬H§…Ã,³‰TRZƱ#÷Œ€ÎÓê­Y>Ý›r|,3¦yÚðð/Øo˜|5 C†§?©2·˜×Ǿî`„öÀp iuJ&ð%ˆ{+DÇZ’f<5«¸ ›MáQ6€´ú©:$8a=)«Ñ¬ÂiÔ¯¶²ªÿiÎ|"›`/¿— ·zaøGp°¨¸®æ{›”¸V5ž3!vÏ;>œä7/d™VÝ–‰§¹Æ-µ¢§²à`@ÓA/U0‘ò‘«ÙK &/ëæ‰^s§5uv»Æ«œhhNae øEŽad,16]³³0êy✤R3¿K¹æµUµ¤ÉYód±»7UÏàÂ餙%)¸ œ\Ž£O3ªs(¦fAyg¢‡bÍ!J4ÖäU:)dF8ŠÆ ‡"œá8ú•MÖ7€õÎtΠ7wl© Áo)êϬÝ\,¸h±tÛÝN$V¡aù 6.;X>)_×$®*W™ØâE†:dgUKàÞÁn¶‹¾ûöÿ±w¦irG·þÕ g`9÷¿„çªIQ%˾¶?v?ÉPU( óDÄ>ç(½ŸùµURß(½ÐÉRÇÎÒ€2Á#²µ,3Í ƒí!S¤< &íö¶Ù^,p”3úµêŒ$ˆÚ#tk¿H´ó ð>JªÞ1ÀœÃ™£\~"ùWõS2à;Û@š¬<Õc•§Í± ø„€è\½çóCŠªZQƒB<¿@¨<’>åz³Ú7Ÿž\rârFäôº-ÏÀŸ™j »A§Iˆbyø„{<Éåµ}BÁIåÄŸÞOê”Y¨]þƇ;JÉ8i}†1øi¢ -OqÔ=Ñaðø ÷¶×Âò„«W)dþkì÷ËÄ!l1²:`§Gô°†÷‰ðË®1t[Ü ÞóÁw%ûÞC´8â7÷™üĶ9lrÀÒƒû½1ÓAÜÄ{•Ò¹*¼#Ém‚*ʽհ“¤õÃ:r€¤n_ÉêñµõØ•&»dR4¼šàÛ¹¸ ÖÓT›#bÜ\]— 5".:bÂÍjü\A¾^bå.ÚúæÍ\á””ÃXx€O/l'"©>y ŽŒ9¥˜®¶Öʰ„aÕÕƒÇV\tg˜gðB+4à<½òØ-VòÆ 3£\ÞU·á©ÉBfÖ¡Œ6wTS¦bÄbði jEƒpÜ\bÊtàÃ;òAöA‡ó_ 0aŽ\ í2ëJvˆ: ½¹ý4fuW(„K´3nÖÁcÛ¹'v€tà¨sAÓA,†Z?ç¥^>ŰyãjÏÞÔ8#wÑñ½»^xþ…\ãî®w-{¢|µ£ó·=>ºEòõg|¤Î•ÖóÁvfsÝìnY£sRTõ»hÿÕ^„ý.YWÚ™XêÚ×]×¢¶v÷–p#£¥í 3r Þmê ÀSaxP·4å 1-Ȕ̗ÉÃ껕¨<¤ìaî ­ÉUSÀ#ÝeOÿ¨ÝÀM!KV.>ÈÆlIlMMe5‡²k±cµ*œý5Ìä3ìô™Žé〱`9 \5‚kz;5=¼ÅFè Gƒš kTsAéI]ŶÀÂy>wø ¯ÆDquöa¨ÄØ]b¢õK¢XÑ%Ue¥+{ Z q6¨‰-¸.jöxõöÐÖåÊýîî? (ÿñuôÛ_Ë^O²ó»Ðj–‰­Ñé+kô¼s”âï9ºÎQùq:è#ªù1¡Oè,¤´³ ðŠ>Ô·¨¾4’„Äçk‚À-xÈuz\²`µgx0û[}Ë œ‰4¾©`>¬.`Ûì•_Ó,x´Í—ÜÆ *v"…ä"£L¾HƒÛbÓÀ-hÚOíoÒWÌ8b V^ Àò ¹¯Ðeôw¢¾Z6¾;½o“½v¹ˆ‚c•I?ìl¯V„¨^Âkc{?W.颌êÍê –×õïùvó~aŒÅ?ŸõýõÌ2Îôs·ìý… ð–èÖ¤o(бZDY$èÓ^xq–&àÐ.£¹zZé`m׺±ƒ÷›Ú·*eÅÖ;ÞU[íJÙ”(he߉†n Pv¾ÁžÂ´¹)ø¡1¾HËv€jZ`:EÒÆo7ÀéñFlJÑAòáý¥)ZLÚ{˜õ Úr¾÷‡¾äÜïJ¤[¥£´*ÔÍŽn©áI#ËEË/ëµð1\v¿yk·sŽBÞÿá!-Ç&%›R†"îsÀc³-…Ça4Z†¨Ï…ÕÓÌ ’é/Ÿcz: >7`"v„Û¹þîŽ9GDTìa\#(ùÓAš'&ù7µ“]‰Ë ¹?€L€\Ø_ánà'Ã>~GM]ØMPå:u ±•È­ZY!ž¼¶Ùm%â6QñCµ­êÓDõV'ÜŽ2‰kîÌò1‡tçì-„¾Ô“†¼ÕØÄ“à¿Èò9kÄfw¾,‹¨Ð> ën6ãÜîþ¬T0ìRЇHÓm‡;}0ûº£kt¼}ã+šÏj÷7Øî7æÝÝc wÔ×~'|.˜a‚ßN|ÉRŠ6Eé ”oq /Ÿx"H·¦ØeÛܯjìÌ¡”»æçí?ý!•ÚX&§/ãHê=¡Y%õÄhÄY¹¢1:oW¨ÇRy’g—a¼Mp‚)VÖ|)¥œ\¡„ÎÌYqREº¸‘çÈèB­£6…/ÜýFŽîOïAÀ¢Ç%nD¬¡[ë^À'»Qˆ@–B§9iþˆ8ãô%pS ß#Wyã Ë›L Å®1Ô?Ùƒ »,NEá·rIêzQ»LyQ›<Œds;n@7L 5Ôÿ§§p {.<·%S—ñ¢—*-¿Ê…Fß9ò¦´MéèiLK,õ™(-ÆVó|à'ݘý×ÑÃKêñï=Ýå ²×5Nš;ž$øo>2¸ùáßÁ…Ù§›¬Ox:W0| ã¹Î𥕜ÕÎcbß:€°zÓýJd5òïîøª½¿(SÀ.®xùº‡4}#æÿþCóËgèé)=”H4¶ï$1æOIWµ ÙRmp©Øïl‘ßR1زÌ"ol30ÉÒ÷ÉÇH%ès×C¥‹Ï5ï¼ÆþÅkÓÓÂçs \%N~µ}ãÁÖr„¸K;ÕF¦ÃÍM= ÇýÔ?©;SœÓ²û~¡E Û¯××sDEPâgœQ8»ç†’Üwúˆ~ä EÉc`¯È>¢Wý%FÀ'=µ)Ó®×ä1¶uÙøx7ÖçSøËm9•9.U¸<Ø87‘pf -§Þ½é”Wl+ϲH*«í½Y7HPäÜ¢þ*äïˆyÈÛ•›Øža\›â›í Ç{y³ÙFXo…PþÓ ¶ÛŸÎHÚEÒží|µÂñ)ÇŽuÙm¹ç ŽNÿŒô5@˜¡ðgŸ AWh\ÛÒ¸‚„öl·æõdø3=¹ @Z@ë„­d“ÃXêàTʬxã*Û¾ÈâÞz©ðƤk|ô^IÚ·i6,Õp¡*ÀËS­aƒé”fþÑ^…y' 3ÈeG;âËN¢‚VÜ©ÝÚº0q™WUnì8l×À@Ù?'ÜŽBÞG™aÄ‚QÙŽ[H¾N’¦ “Ov,a«I«|WCÅÀìØx>3«*æ×¬«Kü#¦a¨ôžO»ðí_©`€´O`l•ãa_ƒû´K:ÙÍ¡fª Ô aû"5¶1h[~VØ,fá?O“u™$ÊÒè0m”ZÈ4Gt˜ ùd—q•E£"[䮨»Sí9<¹õ=ë;b´ërØ¢6}I`¤9ÝòÒ’»ç @ª™"kÂLj/Þ°þmÀ´O ÏÇåãOOôáé~W,×g„U<Ý®æÑ|·½‡ìúµr«mwÌ0<}ÙYQÀ<} S5èнھHþçhE%ÿcy|y€îçH ^—ÃP ÿø$Tê •˜›9Æ)˜oº¡C L4¦èå¹óÑ}¢F³éé!õƒÑŒZ¶$’ÛùHX’*›ÐÒ8알F«kEú·`ÑöJ—rãŽyœiJ¸bƒ5Ö,YÜŸ-åÖ¹¥D…-|r™@6UU©KSiDOÁÍ¥‰ÞHÄÆ%æ•mûM¬-DúÎø¨s¥r•P®k¢Ë6‹ˆ³w€¤+M×ÍÅ2xu7Ä‹XB—|EzAõ£‚Nw!^$¸¥æU¼£Šªá uw}ðD¯ÊF’£šÉµUZ•-’p{¤JŸÔà†ÉP;gÖºÝîâ6…ÁéBÙq†ÓãBü€N®ÇA^$…¥Þ`U®+È*}ˆøK²jÁÂ>q…ŽæØ¡ÝQÈü`5ÏO„{¹>IR¿Žüó©å]jî‰7RàH×?¸÷¤¨¥åèZ.j$ʺú»–œošÿKQšˆ:7ÃS¸k'Ú…Ô&Ñ-l¡•I°ãèÍ ÒÆn䓟­‚yÇûÄÊ6h«>+M±ê¸ þœÊìÖY†êó; áÔà»ÝÚáDâ£JÈiêƒH1(ë´þëlÆ+±ó²Ù~(mE1 ·Ýh²>yfgŽ÷M:Ä­3û]¤úSBOcZv3:òÙ]ÃÿÄ À#ªžƒ’ýe6uÓQ˜SÀ®ðÔu¥Óg°Z +:¤8òÅdkyqEӗщÉLWþܶrÛÒô›ÄŸH§û“馞¯ ¸¶S›<®ýë#,ÿ"‡ð^£ª¸i»6`vCɵ)V?š³!Ó¦wg-â"8þ‰qðzô~géÐkDsÌXz4Úg—„ñòOÆlý›ÏÆ:‘Ân F|ь԰írQ‡<䥫sµˆV’ Óõ Ÿ5äüÎKe…÷¹{Äñ~Ï ª:HÃnÒ¼J€y‡œ–]bv0J8JP›é,ñõ`'M ÓÒvЭùLä¶w^WÞp#ÐÖº)ÁÍõoûdÐËV­î6M”G`KÐzÛ}¦”5±ŒìʰKȶµr í6[n] wy¼Û„‰“3ÅwÊex9Q8ŸÑF¬8ÊIà&Ñ´ÅýJ}+ãk˜Ÿ$ÜÑ”;#/Á¶•/9ÐÏcTN¡¨€ÑY8lbÀ·³+òQÓŒ]úb(—(—5ù‘ºG Ùê÷‰8 äµ3¶z[Ìþ¬qN:H³j[ZÞRfª&D“ã$nÍõË…Íý>«={x…#³Nˆ.)™LÞRËÄ«wÊ®î^ƒQÍVÁ°M­¦œ©ÎöÑ»'°7šŸv+ñ2×éUM ˆS™.ÞÉÊû8ºãx©¢MðÉÈÈ>}§Ÿ§Èe=‚àáÔz‘ðNwÓ›z4áˆ~85¹•wßÚy¯)Â'º ƒ÷È— ‘jù±ú°EÑÖ·+ý däûEû¯~dZFäF%]Ö‰løÄ·8ëÙ’Êâß#¼|G Û{ÝÍ4SØôÎOi’vP¸y¦‚5û?ÿüuôUßíÍl8o÷6³Ï\Èdz»}÷kÄP^‘ÓkQ“6ÜÙ®`ÇGä6*‡Cé Á‘}zgói¼æð%¶æA1):pãu‡¨Ü‘mÂeñF¥MÒPÇï1úþñÇW’¶Hë;J{Œ"•æC ­ªì‰-1nºHv‘w:'ûòm˜éHIqí!õû»$æÍƒžÒMØluƒ¯çÒ"=¾sGü{cQã!Fo¢…3Ò#·ÇX„6æô8èíh†¸ºÙ}nZJFچ˟½ÛY¢cçKf˜ìMýlè~d`›HñY_CÙz}/ýÇÀ?Šáßò\è9ì‚Ý#Àóú<):X/@ QëÓ9wydË ùÛ¾îa¸„Wí@+;ÛyW3»'Cºö ì÷'OV«‚>F2= •S…©Ñ¬ôÁ ê¹ °>Dò ‚j m¤¶ÜA½ÎˆýçBnþy˜VâïéÅ;]Ô¡Õ4—ô¥Oô„»u0W .R “% ’Øþæ\¡M©®gw)àUU2[¥j×øa_8!g¯@"õ†a•ëÈöçΘ­q~›Ã2{NUÏË*¿}²_¦öÚÜ’KÆK ‹—ëÙ<«I vL†Äÿõáèý#ožáõ©}Bî¼Ó¿¹ë0É– ëR·NǰËÕn-Û¶H_˜Á® ò댕䊌¤UúÜgÄvR¹Í°üp²mb'wmÇfù@ÛIˆ#€]nŠ:·hcíбO°Ì`n±ãþVqU<"¢Ay‰‰ö¬¶»™¿ Š¡^ ÆÝ¼OeçÜY"j XŸ10—w‡jóeêOæ§ÜRvgoÆ­¹>@‘Æ/aæ,âVªbN_±Ã?Üè|¢+ÛB—P`"mLàN8†·âADóŸY4Ï:{û…ÅåÙÕÛ˼$¯¡<ý®kÒjZpIùleë½ÿŽ›=]YlvÝ­U¡Jxi‹ž]°—©ëµ,=-ÐG„…/áë;"!Ê/ÛC–˜ýÒÝb«~—w¿þop鈱ڂ’¹©ÐV¬9åóŠ œµI= м.Œ[d‡ùHV„Û}%ˆl'Y”ñ(nN»Þ¤Cבœ|¦©NÌü$—DêjçFSqG¿ÿÂêüܪ¼Eä½£õh·úNæÍç&––†l½E!eòyXV­=•Á{ŸŸãƒÆªyÉ–ïJ»+µçµÈRq3’U`®•¶à×.²GýÕH?4ªa©|#ǰ­±V¯´OG‚¹´{¡ˆ³7àÏ_G_„í¶q¸‡Bñ¹Ó}(w¦à<­í“Cy€^ÖWÑ„°›?kЮ¾ˆÂ#ߥNÌ‚J˜•¯a¥ÔSH”ôØi]E•"qéÑ&–ï’Úº¶S9açÏß(dëO¼Hþòwÿz·ÿœ¡ÍöB¥Ñ ©1Ôfů­m£dÀî´çœi¡Ú7íß‹4l˜ny0bÓ>i0‰ÞÒFl-Ü÷ÃkŽ·Ð¢#ŒÙ×骇具öãAÄ£éCƒƒ¤ÛÙ^ƒKg“ÝUoâýj×"ÑBÜ÷«Óû%ÞÓ@zr—GìdJ¶jïÄ{x;jzYÞ=@pë¤G4¿ãcÑÝR ÜV¼Ý»O¯Ã~ Y™ÛTÿZÐÏ`€—@8¶½–ÝPáa ÙfkÓ–µœÒ·D•^%ó쎌Žú…ï%ô RÈz\Ô³ûTÖèçfœO7ÜM=ÜWì#OÐÑm~iÙš‰ñ“ÞmÒH®MôfÔÿ£¶õ×8éÓrZB,·‚…*Á=òH’¶í™©ny¬Þ𪤻Ø"¦´¸…Z P´áz´óçõêØN$e¶>MhØ6»ºÎÍž›zíÚzÃI\:¶P‰yY.*•žx'º®Òĉ=Ø\ë7sÊ\*ÁÛïÁCzòoþ]±NTßbˆ`±"2èRáÆZ‹¤BÍÊÿ @zò.?ò§ÏˆMëÎ2EdÞQµ ;CO½à÷ŒØä¹¶qOªAà¡Æý·NØÏÑÜ=ãVÜ@[-ä§^Q¹­.ìÇgr €—‚J´c‘0ñÙFƒÎ£_;ý#ªS‡HqÇÉB€¤Û6½õikÑÔÅÐÃË÷ã™óNÎßÓ¾«ê¶€Ùw*ê‚+”.Úèê¢QDÚj†³ä³i÷Ö?'Š#í‚«è»<šo]? Ñþì¢ý§?äí›ö)—rõuM„Œx›HÚÒÙvr,v¯l„i:a;3b[qý 5R!3 »bí‡*„lE¥Iž#MóB–‚‚']Ñ&Àt2#[Ù®•õhŠ VBrÒâE§(+{‘g´‡0-€§½V!¢¦ ¥êƒÍä˜ *^1Äú ª{¼ŠiÝ\£)€$­k¥ê ­$‰@ú€D?£¥¶Üê¹-ò·î ºkà Ýjjø6Þb$ü˜í ôt‰t€´€´ŽXh´"dzb»ëað‡@r‹ÒÙMÀ =«™õütjí§C4L¦?n˜Ø~ =øa‘¢Û5^ÞÃû‰1Ç:œ õ{L·{xn¥žá';EñæÝ%‰XvÏbû˜Ž<æ>)L”æ°>¨ÁArüõôŸpWç=ç½bLÖYƒ5[ÊÉG2ŽHù Ïú|ü>@zºIL»jÛ×=ïÕn,žó Ñ’ö"·Š¤¹ª)´äœÝoùb(‘Õ>×P1äðÓ®á§Ý¦ “Èkq¿Þ=ÂiÝ`ÅRFèéúæó|zIÓKK’iï.ò“ý×IÆVx¬õÔ]è ¯$®³˜÷xc#ù™ƒ‡9fÉwX]øZ"oŠ6ÓEéº@𑀄–ì{€„µ–¯Ë<Ѽ”Ö^ƒÔTОAºÒ¡½ð§>¢Ñ»„„pN_øè{ÿHûO*öíÆ‘/iÔ½òïÇêšnò§ª )êôÂÕ%8b~×mOU§šva?Ÿ 9Oè×·ATÜ tH³­0bfé³\¨ØN8HZ ¶Q–]É©‹Ê*ç–~H}ú’¼àC¡¸-¹¾­y»Î, æ‘Fp° «¦Óœ}Ã.J ¹vè½·ƒ”wB/úü²4}mã篣’´6í!¯Þƒ;‚G0\Åôp® =&9Oú¨;B µƒnBàú_ù²‘W7‡Ãxh‹ëõ=tò`y3׈GËžš§y5q§N¬PÝ*€Ÿ.ÄhÛƒ<ú ÷Ú£h«Ñ†Z%M›ub³†¿"ÚÓZ¥á·½]Ì%ÒØ& ¡£±t@j\üNÇˤ‹Šá$~ÄÛ­›$Ãîˆ}˜û"H'±sKXs,aV—"h'Ï`¡ÔY¢ÝkÉHûa•žÞeZðþ.ƒ¬\ñbVV¾ã37£-üd®QP{– ¹—Sz|á‹ Sþ2£Û^¡ÿöŽØ ©{¢»Úû“Xz„*3¹>â²ñËjPläÅ8Ü¥3eІNIËîÐ} ù‡ë>Ó“ÈÆ–s‹©fgXC¶bË•$VkHF¡2a%àA#®Yã þ™^ãâ¤É×i;¢HÔŠ2l0Îux逴DnÎx{KéÌ>hç;Þm:'&sü5HKs4˜ÚË÷~ZP-Ôn>bKt &’A²EfÓ@Úmp€ÔŽD*I¦¦‘R$°¹öf°©=2ý°|`,—¢bq>ê‘ޏ_/±" ¹KEÁ²@L­½æRîâà‘v vs’ö£[ó’lUgç7g8¨›ZQ7뺾a[c+Ëíöd;@:‚$ù‘V>&óžÃ.ÇÉ/9.î’oõ-Ä2V<²/» ɉ8@’DÂõúì@ƒc{‡kþYâ!"”ªf&š<ÑA’c@b2<ýbÇÚFdе»© ¹6j=ºâàZÌQžSÊFrÃÓ¸úàÉ-fœ½@¬¿è×°É óÌ}w„ÚÂKröwŸÞ–’—È-,;½G‹·8Š›™”ž\š*nù|¿m½ªÕˆ  Um§|#ŽytFý7kò.Úö#¸t ší:Bù¢¥tkªº)f ;lS«~H;LÎôZØÉò‘½`ô(l£†òRV[é¤=S0ºÂüEª³ÂA]Ù!–’âÐg¹&hß•0ñ™+óç,(7„t²Ó*,!¤ ‘oÀ¨Ëyô’zíÜ‚8žs…Œ°»/´R=žæâ><$ÌbuØi8X†lõš¨õvƒz‰Ôôf•‚ówfѺ¬s–ݼ"dWs$5²äŒ¾L_–ugY8#jÕãü™wؤ뽰ί‘>„ý.æ»R±p!yGd¼x©›F=Ñâ§rNª×‹úO_GV_kO¹ÂÕ?«ZþI¯&k)"wô†:Y}Æ`~¹H×ÛEò†Peð|È-d„ÚbÿÇì~éÍAg­ãAY=À uŽuu› #ù©S=j@Úî³G‘ÿt~hŸùíÇ’¡s®ÉÒìO¥%ŠÒ®žQ.ÌiD쾘&,;·ƒ ‰3­S¤’v ¨TIh;™OŸ!÷¯o[@¢§ ±Ìð^/9½'ùl+wïB®b%®÷ Çä¹âK¦ œhùgÎ÷Ü´?6X)×d $IwRt–÷ó)«Ý?€Hϯðè Rz<ÕÓ'''lÜ‘”Âþb§B8'*•HuÓt§`É7¸ÂŽIwiŠ^%f‚¨îw°U~yÔþzq,c—r2@#щúÑkeê=vòAÛM©rÈ“öÓë÷ ¸ÅåÞßÏœïSc³zÏ6iQÞÛÎ;¹†¼ƒtúH g¤Æ¢×€H1Ž›b·r8‰éá{§½=3¹Âø-Ñe:@YG@'ÒmhÉ/@’ù¯í‰øt\ö½º]@$ ÚDÎé _¤›Ôme²™õiw¹]vƒ™2˜5”Žî ¸ÂAºœfÏêŒÓ5ní’ùCÒáZëEIìàü]˜Å2× i£xTê?íjEO?¯Jj]ÃvÝn³"²ÌÍÌéé =‹•Ó"—w& @zº¢)L‚¨c˜Qƒí¡¿Tl+I/Ü;H.ð4…®b%ÉõþruÇ1aÖê7ÎDÝØOœ]H÷»2œ¨€~'ZnÀ8U©,(¹³ç œ˜j˜Hÿ .ºKømÁQò’CSñµHNõ}l™‚MÑp!ØBê¿2ÒST„o`2ÝEÉ•¤¨©4G½çõØýÛ+º­õ¡Ú ·c—¿°hÿ•4w¨Ù¶üÍ5]ZB‰è OŸBËv-^ݱè]t¦!›^ê@ÊÌ¿N8îŠ5: agä9{¾‹j0‘±³dý²w¡‹40‹Ü ÝRþ FN°œäN²c/Ð=B>ºVy¢ŒXÙiÜi²)üÚ…"Ø­Y“ ý…Ls'ãxQY• w$ïPiGæßfÖ¦4¡êKV%hÖܱçòbcçÐRç±c.Ÿ$k¸]_RVK³‡h«FÁ<‡Ä?ìa»gDô=„§óëÊ^.<,|ðZïhJo‘Í&Æ‘W\ïâq,`«£kR~–¤}Ù¢„ã-ËYwÌÖx‘Æ=½®L'Ô;·=xïSîÿéÜüÝ…i…Áó¢’vqw)oËý>IƒÅõt— ¤ÄÄ ÜÇö©{.¦+},ïm}—õ£µçãÒôÁªÛ8U¹@bx$Úå:%ÅÕNØ!Ý”ÄÚ6¸¦DÝ$¦™?/ûéË.îÿ‹g }’ØI"i‡ <Ge* :esª‰þ›×}u ØAвúL'ý%ï.µ‡í­ )¹ÈÉ÷>çj”!4»dîáïÅóù,îObT,óÓ›gû|ÃãO<¦±¢>±3¸Ð½ò˜+HMœî)\XÜk 3­'¼%„¿g˜Î±ˆã'Ò`Gäø`…š’Ûk ;§¥»SàšG&î[°ÕŠ™rcMÔä`8Ú±åÞ_{HÃÁKt–Îg¨Ñ'÷Û_rª¶”žŽt ‰ö€G>dëŒÑÜéѬ/@Òû{xFós7e­8\1‘»ã—w¢OúH)Œ¸Uãé7öè;!‡SA¸- …n^,¼ì,;)Ûó{S¤ƒ5ÿ¼ãs§‹IûFñoO×P«¦7p#‡ß†¤Ÿ7H^6ªgå”2{i{]ÝæÈÈ,9t—ÇîªÃ1½fY­"Ñ`µâ^î89 ZM ½¯dÝtV_×;ªµ‡Ñøøš¦Wzìéósä90ƒ.Cr í¦*¶W:H*N™¦ €ks5÷&ökè$Æ“ô…ïÔ£ ¹É.ph,&Ÿí¾±'hk©ÀÃÏ; kø¡—ºÃwÉä‰C¡›À¨ á¿d@šÃ©µ6Ï„ßÉ$i¯×Î.‘iP”ÙNþ7P!Ì—º6¶›9Øm–ˆ|Yψü´><ÕðMM!XÆ®:º‘1΢2ú¬àäÌ,RMd£,æ“ ú'í¿öQ8P:5Û‹Zo%9¦¹~‡¯èÙr‘®fEW¢~}Î;ä¢CÔQq« QhîµѲLTµîïZH •¿AݾÂQ»Úáè=yvɾꌈflvpWZ¸ÛUêk'¶:¤zHBt‰T?¤Ã#í¤nî=.° j±öÌÓkÔ°n=Ùt¦Ê"Ü#*5Ë(2[%®­E{IÁ©ªÀñÓOÜÃuÙ-aÊù-@†ÞYe ý¯Þíà»:$ˆß]û9£Li#`]œºHˆ*!šn=a:mïKSφà­ä2 kåú¸þñuTä0iČڭ“<ðn°ÈyK*s¯)Éø"ãۻʧWûO¤ïIÚ‹.<´ý¦Xù³â ©lÚ%UuVØÜkXkÓ5R?)FljŠúßf䟜D88¬î¹1b[Ø%;½ýÝÙ+ÒÒÁ¿P_“$­ à|üvNnÂlpã €´’±QÕ nŠÕ½v‘¿\ƒÂ4C4]"®û‚>­b‹›æB¹Ó¿ ÝÜ…iÁQÆþo³Éç—¹zN00J8^ ž|2xyåSÃk•ÜVɪþÌ<°Á^…ýßÃ?—OïÓ½z¤{4–·™‹`@–v…¨km@§2Ñ•f»2Ûž®XáÙU˜ž¶Å4-ny4úG;¶3´lFú?ÐúQ±Ièo/e¬ Ï“ÆkÕΈۻQ±9í¾°Æe¼vI6QëÇk3åþU÷3lsEyð^®>8ì '!SŽMÅ僢7@BõPÜ*Ó ¿¾•¹Ð”â×YçG±b,dk‘5¡–K,ÅÝ™÷¤F±,rž{bàme7Xl\BmÑíù)ùŒšj~Y`¨:¸†.«m·èØÿ%^Ä_üЈ }¹!#»X /l—0ù(Nl¬¶|ÏŸðÓùëߦ/|×§¶N`§Ø>ÄB-,¼t×T«¤: §íÊÙë2¡ÏÒ Ç?3óº=Œ)7 ÐJ³IE€|'ä°}Tçj¨ALІÂOVÈ×ÞœO!ìt^eäéʘ#xíNñùÉÅÀM/ˆ0Þ÷g4-º[÷˜ÕL¥©µ_Z]†g¤†Ì€¤ Uµã ±4¿î]W(äŸÇ£´êÚczG’­X»§/\Ì­à)z›®±ô3בz`™§o»]wgµZðÛ“^úž|Ö#¶g´ ÅÊÉê06®¥Õ½¾A‡;)±&ib†Öuè%*˜OLªYTßèÆÜ Qصh’gÀª['ÞâƒÎ±üδ¹ž%Gdíß*ó:qø”ÀavQƒä ¹‰¤½Åç Q‰qš¤¤ª$° ëT'ƒ·Œô¿)¼PŽÚV¿5ÆÛsÉtöà 9±wùî³±[Ú†‹y‡Ü2áA”nÛ+Ë:KçÚŒÕPï‰A½3$ZÑ‘æqØz°áA™ˆFXñh¯i7®À¨é†Òô|±„kü›­Ð¨’;+l7d73øÛ#(’~Š´”± Å­óÐL¼ ¤¡v+ñÎÃ-BÓÃæN3⟷€b°h8-ÜÚSÁBܘµl ‚ç, òï¥`hß§àCåàÒ¬!å/hÛn†mé[´µnΡr›U± jÿi’ôO¤’Kbo€í:‘„¹Úß»™ÄT*Ø®ÌÑCjNØž€>˺@ÉGjŽšõvïÑ`|¾#:Ó &¡€ é2M0Ô +‘TP‹mpKg²KNH‰ÛL:‚}äiGáÖä#¶SŒouVh¿í¡:,‘‹l€æ›»ï‹9Öºu’ªjb!†ÊÁ³¾ø,<Ã-¢Où·ø|×Û­ù:·dþnß|Cy9ìŽZ¸ \h¬n½ å« £—G5òÈ-«“âNLŠÌ çÍañAhV3 ›H»³Ñ–$ÿWÚóÌ,Ê«ˆªY]Æ wŠ¡Ñ!_p€Ê/é™O‹^P ¾vµð³¶ EÈ!–çšUPå„jضÂÁM豿´³»™…r]dpŒ²â¦€Túߤ”žÞxE¶wp{'îÀ÷àI“8ùdÌ=ü­/aÕ0«ó¤…XØ‘DsÚà4ûOÜáyzÿ¸GPüãRUéãIWæõÙ‘þxÓúTl†$m뛈œÕÔ÷iWî^øÀG¼ñ µH8¦„+`ž¿” ¿}÷)Ob9;‰µÁWÝ ¡n7"ÆŠpÿ ˆt2…[è#ÉDR¡ãC÷Z´¤6öc«:À¹®±QVP‚¸y¨Û_‘ K÷1Ãü™c¼¦rÅTsU…7ü¦@J-­ŸD)µ8Ã-’5jïÞ_v§ ÃŽIÝ_¬Ý{øg#L¿(FDàÝVÙíýZ ë#ÕaÞAŠ ¼"qŽÐãÜt®gvÒn rœ ÏjY?ûúÏ\G‚;7³Ì5¤#[XŽìU… ÞãI¼°ÒÌoT©[—ÏÑ_ð\¸bÜï¥Zææ^ ê§w(òðp]‚…¤ÅnƒD!¤zyãH²ÛMð›v—d€¶’²4Ò þü•ÍÕ-Ö‘íír=’Ï«ýGïèdf¶Ûß Ž’ýèÅðí‚…~’¬“†«8JV/ØÿzJn¦AöIÏWIÓ“•õH#f.ϧo¨UÊJvÑŽJdî €tÑ¥h²U}Á Þv`õ:3$Or•s‰UåÅ31×Btð ÒY\.7yû02á–7®ƒ£ôäÍÅÔ:1–h`3=üFåܼ§å)÷À,oÇŠÜÏøÇK?,Xåv.ØðÍQåÚŸ†´Ý¬8ü¡NfØüòé\>"Ø9&¶ö‰YU"T»9‡›´×»=»gNØ]´°R궈V¨OkÈ­Ä¿´²‰¨béF³I°pà>½ÜÃÎK³¥å6“áµôûÖÈ8P êí¤HŸÉ]›2ǽWô´9ãKô”ž!XšFsÞ’Öi…™¶ÛŒÃqÖÜÄÓ¾÷ý˜F¼È¤ƒÿÒ‚µ–RSÛIXmßì-‰Í[;³r2?P …öðZŠàÇ Ò¹ÐjàÔ>…cZçtÞt¸Ñgƒ·Òq~l§ÜãáÀˆæÖ¤“îJ›BL€¼½°n§ì²¢hÏ¥¸£áuÏ')ùµœÑö.ίyŒ€Ü•¥½þj;`&- $mÝS÷"51~íýdжm »nøö!Ü98–á‡áñSØ,54ú£ÈÁ§Vçmf‹;HÂ’Ý£hîŒml†¶cw^÷Ñ5¨`Õ“ãÊ8ãåù7ÕvmöîfðÞÑò‡«ñßÒAê¶H÷)‰Üp„ÈX…§Ð<^5A¨E-fð$çùú;½½Ÿò]è°C{=&[n–Ôæ¦k·íB"·^FÀ$ uÝ/UÁ*û)äsc·[À‰yuWigá`öúÅŠÅo†,ãr÷=÷di7r¼b¨ G¾Þ«]bD´ixKÛIXjúæ­’xZ£KÔW±=RÒǘ¬`ä¿Ð|HëÁÕoåYh×·°®¼9Cš1´Ìš| £ðãŽíD&¢á#{Tlì‹mQÍ1`û)[M³Ü”£lÁlí ¶ ¨Ê›#¼,¼0ÛBx{EH~’;—\/#²¿ÔÚkñ,6üe)ضïhÚâ¡·73RL•D¨Àú¤»ÐÚ3T:tWŒÑ3’~¦üøöãÏ‘€þ™-"¸¯:¢óÿ+%F²î^4b©ê¶£±tÒMÚq×Ö{ïã5ùk7`R­Ð;@À¥ëˈM=…Æ íÛNö´«2 …ñ-Db `ïD ¹ö]H™ŸK­¥–ÆJªýûB')œ>wHyúÚÍŸ§§Ã|éŠó_Eé_7f"M(¶îÿ|xû:¦¢áTÐ_ôØ?$WX¬ÔܲÐÊÌïô]A¥Ä¬Žä†ÁÎ_¬ ÙŽ\h¹ªœ»Éßí”x¯í”`³vÈ- é]íÔúñù\ÚaFО ú3Ìs¤öÞìKi"*yë4ß‚u~Àuìf/]<жجófg«LÚ•—9)9ätBVúнƒT¾ÒžËB“¼Û¤î<”òP°G–43¶Aª 5|dðçñÒ^¢‡´Æ¸àÔmöÉá<>Wöº·×§¼†8¼p77áö_a»#ÜôyBÕŸå°yf‹›»,b¾ú¶i KÚ#RAÃ_¦ðXo Ù*LÓ ¹Tl'éoÉèÖ®ðÞ*A‹ô-ϳ’ö)ÌO÷xûK$BHîçÅß ÒØ.ûYÄÌ mc¹JÙnZˆ6ˆÐˆô8`œå*‘Ýge´‹¢´²Ù÷Dy›¥b«XzÚBAD„˲e’ðyÌÑabä)!›Í*;6»Ò즽\ëîn´{ mÁA"rÄc2õüa¥¯Á­áNwN/‘bŽôŸûFž}Ž8ݽ«ÍÎJ¢ÅºAÏÎþf¢Ù¿ÅÞˆ­GÄ i^º1Sú·©ØÒWS³Õ|¶u|#÷£²`k±8 ïÝ'µŽúì.:{|náe'y>ã=­¶¥,öÌvša›ˆ2¯bUæ,¥ Úöd°]2À'xÇGk}± î M³‹[¥…¢ôŠÌÍöhîyÒ=r±#”È –Œ™…Tµè“Áeª>r:CCNÚÞ“»á|™í@øó†êåÆÃ³"4þµøˆÍÇi¢+¥è Í’vž©Ò=Ÿ'²Ÿ¹#±ÜÒuÖfÄ&€¥%~vWòð ®±ìm_Òø‘ÜK{™ðgÛ¾Ô|çk$Y`I&:©’.,Mhç£ðy€Ñ“.7×õ´` ÍoH­ógÉü3o gßjű“š?ö=úþã'ΑÊauÍWò [-‘J«ØWu–&Ù#Íy¶%ØH; ¨@È›CÙ6#÷/¸!íØG.øa, áF^ e†-”C¹öÙ)ô{Ñs`°ÆžYŸA›F6G†àÈÁ̶ÛÚÚ %1¯¾ :db¾¯hühÇVógf0'®·2ŠªðÎ8’iÞŒ±Àö¤ x´“6ÈC³`“Fk"ñ·,³6q<Å¡×ëMPèÁ{=^RkçoÚƒ¶€Pªs—ÉÝödŠÏ ¨ô°¶ÐðUº7•"FÝP7©HO#SÎ,V¶;K·säFÙäA 7ÓV-“{4¹f-7yY=Á ^éлýaoí¡Ê„=äpž†‚…¬Ù®} îX[ë]ÉM뼇ô!.ˆ…þ‘Ý¿j d™öŽä.¤uµs@©…¨ƒ”úi‡è×¢a×ý¶‹µ#è_He“¸_ΧÂj÷}¯ú9dö@.ºÿ°íaˆS±ùw뫃NÉNZm“Ì/z )ëEæ-aí¢¹Áñ’´âStmXáJ¨ÊV=…âvÅ©3A¬ùJJýL¤œ/aEêQ(ƒNîODræ™îýþŒ|<Â_M^Úª¤cÓ°Û¦ë«ruK3zгô+Œ”É“†eÃÓÄA‡›+ÅgôŠÃÂ[ÚÔl„NT‰”®>b+2k†m~ÒÚœ#(Býø]áévPt3ÉÃŒÞsu§m»¦®‰”ëû4݆”%aëÊBókŠOJ)¼KÄëb ô5…c䛩—Ç.'¦AÈ>„pþŠRkX½¸Á‹?Ç>9]ÔÉònsóÈ”òA4x‹ÕõŸ^´ÿèÃ}òâ@¿o¢pÍ¡Ìq¼g[Y¯øÎoº\?#ÿöÓ6÷Ý÷@ß>§¯ª£Nw颯N±ÍìiÀºÄH®UÈþŽ#vHþg4.æ—Î;,=yá VŸ{ž¼Q«;²{ùõ:a<œáN«5ÁÅ_ ÊøS@ò‰”çh”GO}â O´  ½?é2ÈE)zI-ºIdjN`©“+háÌæw'— êÒ‹õ·vwÒˆCY; ƒ’~â:J²SZHëð—4‚ƒ·2^ÔX#¶‹Õø„|홈‘!’{Ù£‡”À6¡ŸÐ# ¬æO©uOþzrÀž^ÒýÒ\–ô80{ìäåžc+z©!޵Ì?£ýöãg–ÜùýŠ>š]·{JÂöêÖ&»ƒöù°Kæ@Çv£k»âJÞœ¶Ù¼¤ý3J6™Ïï!ù´`)SäùMOL@¤´íÊpíÀßÇ4;ô“VbYÓ-á±y¹•Â"ið#ÃqïÙPÜ9ð p·€¾=[†"2’Ïh->“¸ ¡Ÿ[ßAÌ¢S§Mà˜FÊksUIAôIºÛ;-ýù¨ás¡º›Eâ®õúºÂÖ8ÝÂõ›l×A£4ÃyTžV'åtã<­¢Ößö. K×û¶øÜ™K¢Ò0ü§ŽSÉBi}<)'XNzD=ë5…õ6E .§hŒÒ¨»³Ô/ª‡Sò~Ð6ò†œ¸èì‘ ÄïÁ™Ñr äù$!Á¦‰%¦ž7nÑ—ê#¹!v{M‰g—Š)ïÔß"lÄsÅH²ÔJÛ<1›[Xz² I´2‹24d½c™]¡í¢÷Ç'z°Æ¼q…WøN¬!f—VÌ.Hûóºm‹»L¼Sªï$ІH¾Ç„áㆱ –¤=âÝZ$tÞ_†lR$º';þPèZpÛaTÛÈ…÷`öÝmThŸ–>þª»¤à?–¢96HÚéãˆim5DÇÓç\ósCÐêõðÆþnQŒV<€Ô±z4¦*cw@NQôÎAÔ9£…G¯qÄÊí@vŽ#·Xê$ó¶)È€ÞyÝy£á×3–×o{'ÿÔ¢ýSέ.oìB‰}VùGï“¿élýæþÕÛï胜žŽÒç¹üö0ú¸äS²¹œ«RTT {Ë»`5]ßù¡sRô}â3‡³¡†oa΢pÂ`Þ¡}…¹–cøèó1¢XàÐÝ ôâ7²ÛíV÷ Máü|{msv!xÇÛóKó€E7Æv?•ôÐu yŸÂÐZóúÄÚ“‚Qú ¿nwñ§nMÅUbD ‚œá]]«>ÿsi©ž§g‹…/ã"°†ÒùEîñŸ·¾=âQ¯=ÉIV{€'Nx´Ò$Oƒƒ´³kåõª@òÓ_ùÚ3.ßžàpÏeeV@=!ÂÄ[M2©²þ©?>GÒç–©_.ÊdO-§c¾e©Q“̵OhÙWÀ£'€wÉ`'EÀÑ é ³g C¤-†S€ ƒJ@êÑU¹w3Áøfå's|Sá8a,eÛS!Ÿ8HûQ¹no‰¤]¨‡¶Á¹.øKjüDAjÒg4—#G Ý|#ÉTðôá-AfOämû·ø±æäì¾¥WQ÷5¸SûΦ6‹iµ+(åd¡ÙéYÕÀuú®sÀe‘+05ìz´ö{ª  ©®ƒ:Ù/ÌLLøæ ’êÀHóé1U ý;×¢«D‰?¹ gS'^•ÔªÊ]ÑÛ“zû¸’xõt¡çˆ¤;-HËÛºØ@ÈÌT™TÞ\%Ÿ´>¦X—Îe[£høXƒMÛï²¢ñM–¸ø®¹íVÅûŽ9vÝ–²ÈØ0± -¡é—Îmv ÝÇÚ}ŒC[x=Ãû©™*ó2E‡æ¡8ˆ*»–A3¯3Wœ'%Ö*>ô¼ýÉl¡¹ß© :Ô¿}æ¨/;#¶µùí깋¢ÃÎz&º(>çuš Áë`ÿöñéîÑåñˆÿꤽ0A˜éÔh|ÓR-tä‰äýÐ.YG ½ãšp;ÆCÎ);“ ù³¸­h|:¼¥™6{§òÍê eŒpúi·¬%‡Ú´Hj¥_8ü„£“1nâ ¢ðµ ßšS7ˆª¶õB ‚°¢W¯íÏéãÎA꯯óÜú½†·ýÆ\ùD¾$`tD½»F¶ÉÆN`Ë;œý·Ž¿Ž—Ø÷˜ÕAé0Ìö¬¯?UáþéGŽ0ÿÈ%æw¾÷WŸÑ—´xÇfÓûÿ³~±›ùÑÇãŠüü+Ы:К²ýë"Þ¤Ë{ ³¤áú*\LÎ%ô‰îÝ1 ®ôÇ~ ŽÈ3ÎÙÞjí¼Ù s„…òä»ss*a‰ ÑE›nÚëíB‘»Ç‰·èÒœšZt\¦–ðÝB"çš±‹Z´Dï(9y±[FÛrAÃU¡'ãäÍp·Ôu>8_?e©ì‰ÄGnHH*i Òî>HaâAG1v–µ…ÙÃr»ÉøS† Ëýo¡~Y½Üˆûû´-Q.µ7Äàã`¢ÃÌP³î)Þ¥›–Ô‚jÖÉùøÃ—üÝÇOð´ %„þ®eøÒ%‚-ÍÛ4»¤ÿô´¹"åbÿ*ê‡"ø¿Ñ­UÜ/$óé0áŠÄŽnI=¡—½C©Ä¤%upÂ_¢åS€&;r†/’ò¤ÆÏΆj?6n+g<}2j,ñ‰÷‘–#ÖüB¿â@·Äç >õñГ=„R¾cßï÷÷'VE¡Ôkbs™Y™g'3¨¼åt0¥[KOvŠ“šŽ—ÎÝÁ-°•ª~ÒºLpvjä¬l^0xÈšL´SfÒØý,i:´wy³Ø ñÞ¸ÐÛT‘™šXÓ(åÚ‰žÓiwætš‰v¤ ²Åí†g,¼á¨Ó8çãéÞ(‘¦øHÖn´rŠ}¢¾`‹ùv›h7õ~B ßxúЭũ^"wü€­äoº.‡²Ìbg¾~LœÛ÷ZÆõ²Ûú«ˆ^[/†®ªk¥F€ÛaðH=£'¹¤ï™ïÒJNÀe{Kíž;ëU'ŸDKá)ü6š;ö+ÃMƒ ¨Bï!|ù2“Âɉ—'¯=ìB|`ï¨kX<ˆÏÍ=QFMaù1³ÝvF}"3mU‰ÁûÒÌ?ã1´†œÖÃjÝÓ´ µ×­ 7/ä³"ª*¬|ß(®ãA¥‘¹YüF‘QöÁBÐûä´cæk/@Z„¼A†a¯w>è"f{ø%IË=‘g¶@›G@QK\~À6ª¤ ggL_@z@ýk tmÅÈJÂ~[‘ŽêÃ)™Ð¹ÔƒWB¡? “Ä•ìä‡V'núfRèmÔÅýíÀ-!ykY,—ƒB+VvÕ5¨„ýíì«ùCe<’íôœi{û3Ëüïí }Vùß‘ •¢ãdû|¤C¤ŸÉ…ÿþó1ÜË_?Jß~#RyFýq,ß=«Ï¬nį>ÚÞ ÅI Öi°iw–¢\Ң󗂃ÃWV¨s잨y†Žá†æ!.ç Eçñ} Aî®XsDhÍöt„ Õ°ÝHãò[ðñâe­x8H¨ØQlýHuÅ_Ì»^…ÔÈ Ït(ƒ3@øO©ØF>B*²òøÎâïØZ8@Ú¾¤=j#ˆ“G4Ì®Ž/M¼h”¢7 ÍT&•½ô'Îw¼*¶5Zá•òá{?‘µ:\öÔÓ…òÝM•Öͧ´Ÿ¶?úÍuô>0ÔE™×HŸKw—bb°¦ñZ–-Ãë’4íPT¡Õ°Ì(Üœ¬½2ds€´FéòÏè 9@ª#è¼®+Ñö/4~¼õ³Bõ“¬AK¶QµMâ~R\ôè V~(Ð`.ð׃6 e÷ ÀÅL»Ð˜_AKéo#cf,茩9Œr"?ÏvzzUPš|j­)XIwp rƒ_QÀ'µÄ”©Â÷ëºöÛDoþr_ËÌ;øZUQJöy+ÅÔ:»‹›ø©2#0°6ögcë8´x.šJÉ#¾éNM­&”N¸Á«ájÙ;رw¸~CB¯9üÄR|%S^\!€[£¨x"|¼ÓÄÒÕL7B·Ø®€m#HV'žQå„® B³}½ O¯;__&ÿÖ¸ìÎ’ …-†V¦ÙV*Ó$F´«,lÅ:õ¦pJ¥ÈaÐín”UHËǯ¶ø´Ö¾Rj¶(ZûNyãV{êN(²leÏÌ„Ž‰5íax/¾Êq¦5ÐĆ;˜.ŸnõÙùŽò“§i¼))pÐÎŽktg~¹âú˜";KyE’>¹9µ²Ë¸´WÐMØHu oúƒk9‡RS7ŠÊÙ7ªØ œÈ¯m´ ®pÙsK“'räÑ ¨ƒôÈ‹v¼&ê šFµÑo2|T<Ó¸Èswì“"XPäŠÝÌá0ÙcÀŽ÷«=óInb›n=uc]à£l±¨÷7\#¡^è uúKîÕ1?ß›˜lï2çîg Èvƒ©ª” çƒjf8³W¨ÔAHhYÄÁ~Úª½ÓÁ^j*5»3Kžó>‰ýÿ ¤oôA ?ûñ7“´}‚Ætqúa DŠáß×g™¿ûW‹ß‹®Ó–ú|ôà­9|šž_“wr{ðô¦Ãth|ôäÿq6Oof[øµJ%ñc:ÜFޘЧA%!-9+ PmJ¢ìÚFœn{V>·ÜÁ]NU¯Ñ0«KïÕ{ع(1FTÜSl±ž81"„¥Æ cކFD¯P ´PY'~V~.O(¾œ¾Óȸúªžï˜\-v³³¯ìa%M«`õ‡aÕ¤MtHV6“_ «Hq[—4lp[¾NÀÉu&PYy©Þ÷Û'z~¶Kƈí&år nÂÐæh—5»w ÷tó`¥‰0Œ.¾;m¨IZèe@8¸Á½îHM ÝÏRhéäW’´ˆD‘ÙÆØBú¯¥á“Þ x¶.ïÍæ.6ø¾ÉlÇgl[eê¡N“l/fÑ­¹xÔKÌOš¦§SÄÕ‚òkľj ³·¢ø¾ú¶nÚš`-UZQ¯ cuÃ4xÜGa×O…}xîÒi]PfZR‹–Œžl˜Ú]OCéKšÃ5[këøù\¨?³hÿÏhüc ùoxFB`Ë|Û'{¹“ ”Ãj±9ˆâ7üƒ›¾¶í“Ÿ¹‡Ë™Ÿ{Ñ“@·DRÈB³W…ÙÃÖ¢WsºŽm· xÂ#;þcó›‡ÅdWê»dçh†%¤G¡•ü¹sTôò[·òˆÓÜ3@‹ -£6±¨¹©Áý’¬Îè1@XCVâuáì£5Ò_Ü-i'Ò÷ŽÙs!ûƒíýÿøÍçBâ9ñîï§[æ9ì—z—?­aû¹Þ¨Hâ9æïë9õuŸùJÁ¦Îén@HéV¢-HÝ®#ÙI³y¢%­nI¬­ôlƒìç>M1$Òv%ÉW ™™öìPúŒ² ŒˆÌô¥#C«äAINŠN£•c ¢fÃÃ`b‰¡þEÓ/uj¶€%Æ„æÂñNñúÄan[ê6t}Ÿ8?ËÃ{„´Á„§½ÂªF3êp¶Û¶î2ta§ý%Q9ï©…èT¢îxäÞ?rrs¥õH¡‹cóò|„†Ó`ø·\Ü0K¼¶ic£G2«ó¥-pÝd:U¦& Ϩ¿`lc–§‰Ôúf†,¯>¾T §àäV‡Eînôßó Ÿ{"=Õ¥‰£ã³Žm¢Ïnå¤þÖ¸Ð|ž´ˆk ¦;ª=rÙ{Œª÷`äØÈÉR‰ã¶³;Èáb«0á<ÝÔÓÎÙÁµ§3ëf ‡+´–¡é˜2ëÄ6’Ç\÷ð2CVÚïõDÀ‹VSXï!_QgmÁ}÷iD—飔}"-W¸–$X»bØí‘úcwRè‚ 8cn!\m,ªÆsë¡%ë.öðÔ ¢Ý§4¤T [hóô;ÌÇÅšPqa,AØë d¹-ļö·!uúŠøžXÄ¡ˆ†µ²+Äf (1'/ô°/.À:Nü¿f–b[\J~ÁùOÈüsY Ö·ð.¡Ð©î<$VÔoB’;iÍá®7Ghèã¶=‡2ÿÊþ#v‹O¨¿“ߤ5Üo/É%ƒ®X]=mæ_ž^Qˆïu*¿,ڣϼ üìÄ‹¤\°®Šiƒ•T Ü´ÝWÛµkF•HÃ;–‘¦É%þPáðcÄÞ}B7Ùd&Œ•¥ëdaô.SaË»§ 'ÉÀE¥¹h!re°.þˉÕM{ãNTÅÀ”û Ž‹!œ é”§†­Û¹§­š¼^Z{޲¬$!äñpÿazéç–§m§s“Ö±k:€öw§‡øh@„Ñ+ÎÛÊÁwÑïÔÇyÀÚÁ)wÛ"jν®á^°EþYçàò¬6hJÝ{ÓžˆGk¤%Xè u¼Lpœ—ãËwb»vÏSÁw•ÊÚ V ›-$›ÏG+åÚ'7 xâ~u_êE4ÌÁ…\6F~Ú>ЛáÏP•s²¶¬'§À›ëF¼5 ÎÔ¯!7•¼£AJ¯ê%5'mªü«­“{,ŒÑ,£ÀT¾1>@ð9øt%2)VHÞ¶…Ýßµ·÷ñïÒZ7‡YÉJÝŵ+øLØš6ºçŸ)¤‹ÕÕ&Leº3ë@UY–3Ó1b×C÷ŸîÅ+lG7nè[wÿAÓçv|º =Ý“q­ë'šÜ¶iÿ,Ú[† ¬Í}'6²x¿øa¦äŒEn:)ͰôXN®¦¡¯ÙOÈ+ªl¾çûYkKJÙ®%F“9Ùß¿hÿ8ÐúJ‡þÉýÁÇ?ê ý…\/çgúòùˆk²2 #wP;)`e$ÛqÍX'Ï,Øñ ]‹n]d-ÊéŒÃžgBÌc¥€…‹ºµÓ¡•“Ùò¡µÿñ9jå`.¿…ÛУî®z 6Þ1}öðÉóž‘gǶÀROVƒË3ý÷“•à+@"±¨Å’þd¯prMÐ÷0é=uJ zØID…rQ«ð\O€üä»þ~üÉAÑG-Pq‹o uå¬-F|JõæYî‘7£´e>ì_â$•Ô剄ðÿÆi'¬¶ÂAÚBæoõF‘-ü¢ûr Z„i$VÊÎCb¤åŽGþ÷LŸf[`M`_DëÉ.—áÅ\$Ë ðW ÚÉC`Àã1`;ËèDB%l“h³ XjøÛ¿„¤šæ “‚óM¿¸Ç­G(¦‘Nm7 ¨2‘7¨;éôÀ]<›®ØUrêûÞì{5ÔZVÀOaò½/ ôú2‚(7fK ‰h¾½9ʪë¨yÛvtAS0\S¤ÃiûØ1¸ncˆNNá–+‘·Df\}óWVß!—Wx7^^-ñ“fÏL!š.½‰+§÷"<Î!Ò¨*£—>éNìàœ¼Ùƒ¨Q~žï{kUÄðƒœLupc»Sù”ðPØ#¥´Ä>½ƒ%.øÄøÂ‘Æ$šŽˆAm@ðIúó¥ZT’ó»~~H NÀ@ÓuIÆä;+–·™˜öPæeŠ“—¿ÆaV‚1`LÑ—»—>1Úì4Q’ ªÂMíÆ¢òŽw¬Â¾Ñ¿ M¨¿'½DœÆ2Ev¬»:΄Äè_…̵]د…áC’yñµî¯9”4]ÅÈ¿ÅÂã&z‡ëÛÊë8×¾-$xA&j\u†í특Õ÷TÝaÜë^uÉž² Ú¸x‰줅ޟ®'Ýs»Ý:²»è®uPI8x íQÀòÓOeáÙ‡…1ʼnüa^tzo:GÞ¼^$ˆp•êJ78o®ëÈÜŠó*wðƒ-ÕÕ*=±Ð;å´Ü«V20 W«( Ö «Ž‚ÆnéG>ÿ‹öÿü>åúßj<ð/8Pf¿Ü¦Pî}>~ì™Ð\‘’훂Lj-dµ¬’“‰øVÓäY¢Ví£Ñìu‚HÛÿX™ûö7ctPf–âmmÓ?ã¤]ÜàÒ×¹ÝRœõŒéÙˆÒâBÜ€A×[官wx¬1X»‰O+žöò$D#ÆåzÊËBrHT_ôH#À‘»ÏÞA*´ãäÍæÆ4Õ ×õ¯ðAú åïõŠ!Ió”쳺Hzƒg‚Û¤_Uÿh……äþHr¥ ÓJ®êÙÿ—pDRGi6€¤èô’HÛ½Îû±ÿÏü{ƒá£Ó‹ï¨N¾ÚHj~ï.õÊÎ,…P1³™Þ¼¯ª¥mGá.Ñò) pLÛ¥Íz–wÐÄ£¶wȶaµ#€v}I¼X#9õ¢ísðS3©ó;Ü/¥,˜Â`ç2UêgöÖ$£ˆ5b]Vú¬Ô¶Å1È«ÃpQ½e\,ãÈÆvÑItv8™iõ²rÃŽžz‰¤¾í¡5BRº⦘ˆ­ÑAú2xˆ/gô¼îoÜÆØd šÃ5+{ä@J5$ B«uùp& QèŒïWydÅ¿¯‰VÅàY`4».–$-lœÐÊ­÷«udkËJóE3)ì‹R]e£dqeçk â +W±ªTCMÌwµØ«ºý…c$áÖ–mâºI43Ô}¹° AÕ lsì‹{>¼\â>ô3£`L°–J÷›ˆòÄšöìpTu¶yAvÖé¤ÜïÜÂ8ꀟÖéÏ®ë¹èjÚ5Ìæ|&J?ÜÅù¤b¿=á˜À,ÊMx´‹LÈ ž†ª{uбe4°ñ[n¬T\Yñ¡DËùâ®PûWó¨֙¨jàf7y`ù˜ èbpÿ@ŠQ±sjœúp¹ ŽÛ=Á@öläSþ.ÑhRSϾqÖ#ÇX^¼k ´7ƒåK·K#ÁI°«UÉ/+ÃÊÛÙÞbCi·ñöœôøW%Œÿ9Ðï@¤ÿ—æµ/˜_¿,ƒÁEï}âèjl½õíQäï´Ø‘‚ðl[éLç¡Ñmðì™Íyz&éqåHOàÆOtŽ*+ü5ºÊΙP ß@¸ÍGlŠI/^I/'éÀS{ÅÙ„<ØH_¾l%b?¤§‡ÔÞŽÒoRŽÏ°t¢'¥5smxåþ×pž °‚ÚÕ.|¬¦\2¸Î—b˜gd9<@ª†:¤€$$qñyÂPºœ¶­ˆZþ4”H ©$š÷ë˜l€éÜûÛŒÛñEÅDðï—¤A“]A5å2ÁŒÖ~£â» £Í ý£J¶ÆÜÌ@’ÁÛ8ãÐxl@Ò„kÙä•#€–@zì]³,C<ë~êú®g$˜$ضÒqºìsóô‹Óޝ5ø$ê$ZtúH£7G|¼¥ù€Ô‚”u¸c€;3‰]‡rQ$ä™ñD‹ñš3T3q樚q­Á¾ žÖSËUIÙ2i®XÏœ>õÒ[›k9ºÊm'çk]ùIQéO–U{¸55»Ö³U‡Õ k7T³•ÀËjf ìú{&’ofCvë¬ ²ý>¼œ•*Ì%‚u2-ËÎLwel³ðËÞf$aÐN×MTs8¢ # c‘ºQ˜¾h:væÒ>í]˜F7| ès#Òz˜TËåÁÇÆ»ò}™þÚ/ï¡]î(¢ƒ!‡;?=lôw˜Dm’d/G0Ýð¹¢+ËظD âNø¶;qÆŸPÈ:Ñ缌죆ï<’[Å ?tKìÁ»µ —HŸÉïÃ5ÇCØKR<Òðà!jÁZá;’½í&NÏýy<}ÿn 7L¦»Èy+ÍwøIoxŽR­FB¢šhSk#hH¥óúÚ'zC7ˆnu#c¡ãhr½C¶†Óí‚ãëi8õ¤/¤Ôì'Å®¼’í @ŠL½/ ’v ‡ó†\å²;³ü+|ž>‘÷ŽÊüt”RDضYþ1©:¢j­°Žv<‘Îø×!öA¼’ôgÞ¹Û^q.;x¤€´Dp¨§ªgt7© ±âFÔ(«mdC¦nâPHaµ (%/ ™có›J†wbôÜb u¶=¢ÐÒto‰Ä µ­uNæmÅ£ÒÏ2ð¦À ’ß‹w½Î1óñÛ€ÁtO’‘Ù±½5V†uÆj.™âæÑý«ÄÈϰºk«‡‡Ÿ¸;$誺ta‡:tDÿaW§*^ÇžæF¯a§‰DnÖà(´÷QT•\õÆRyDôÜfjغòç"í*$ƒ)øO¾… luª·­ˆƒàfÛbܶE8:6êÖåÉ^ŒtÔ þ5‡NRµêCSØQ>[—_G¿¥.ìÆìDâ´1u™5ܲ‰éylè‹qdSÌ(à=[âÔ‡`…Sÿ2‰z;§ÓÞÚÕn»%ø…ð\»@èV¡õuqÃA¹P¾¨Çpp’w†lÓVÅŠ6àŸN œ–a‚WÉÝÝßéï!¦ò ôê öŒ<Ý‚Òê3¯WÅ V.›KÞ¢€í-Ä»†~OŠ¡K 6fwøeì°è`ƒF,¶áÍéq6k˜m ›hÞê<ÎO4 -©…ÖA€z…¹á’1ó<ûëÏ!¦Ðî.h—¦}!ïC-™ÈÉbŠ ¡c²äuÏÀøè É”@Ç*…vPi‚&´@ÚN´™aâ x榷kLW?Ck™è•éR-דŠË|™t[Õ¼…„ LkÉ"M)Nw‚&{ºWOÕ5,X;„;]è!ýxÑþì–}þ£ö§ô>~èò@¥Ö[»¼Ì`I(Ú1â/Ð*Åël@¤{¢$×£‚Õ1K{š;ÁK:‰ò‘°²âïÝùž›EBÒ>áS8@ª‘ßYžØO,X!1’|šè–ÙNоøÉ䬨³'ÌEæòGžc%„gæýà#1 }>–)¹Ñ¬›(f’2&IÿWrÙžðÚƒþÑ>ÒòEBNÎ Á#š y¢º:ÍÀ†A#ÙÿÕ»9Ô|9²ý½UÔài„Ó2)[EJ)F21[Ù—ÕªËGãñ˜b˜‚LÇ]´KäL|Hjõ‰Ðʨ±ÞNÏhDÿÊ~ ØÖ " .]àŸe—uPm¨µwM4nÃ3}£j‡ªJû`e;q"Õ¦„m=lŠ‘ˆ;?ºfš¨­ð-$Mn´¸Á¿}í+;è&¶IsKE‰dòB½ Ƀù¬öe;s† !v²ý \[+ʬs&5¸k  t“/‘?)*^ý· Ke¯žçÊÍ^­]÷›•áÚÏɽÞM²‡Ÿ0 ß'Õ…<#Ê%õ9eˉ/Ò‰ð+6³K䘨ª˜Á6LÞ§H÷m8žáãØ™ÉUd]Xá‡äðèÉ.ÎZB¶(Déh¥lvßtÛxJUEr‰öµ& ¹ÏðMôÁQAN©ÍùZÜÝ{‰vˉ×ýcfîÖÃ[Âm*ÔBÙè=îZ+;us;.÷Ø<Ñ‹i°îW€Ñ°/ÿpÿ*Ü­Ô9Êx‡ºÜ“O‚ZÄ­ËxÊÙ¼A)¡:M¸äÇ‹F^;øü ¹ŠL¶è‚móF£{ØÉ×@\®´PFƒìgÈGnWر®÷³º …U(¸@y“y»†Þv[óàmulŽxø¢û\1Ò³¼9 „Hiž·ëÑ4VçðM¡í8=ChÕ}·»/‡7ðxF<«CãÇõIRi¢‹ðŒhG%…zËJ;E횯–Ddr€4–FvÛæñÃ5ö~üvÑÆsð‹EÝ÷dàŸ>Ð_üøu ÿÉÙÒ+ÝÕº‚3›+B“Ó}TlGä~tÆY†"™t¤3‡—ö“ʦ”¥%:H d¡Ée1_¬=‰ÈÅû=Júb¹Å÷kŒãR¸3)øN…³ç-Ò¶z©0ý‡¯·Ðƒûævùó'{À9êìié•yLó㑨Øz5€dH Ht`Pá–­$µ—rÍ»$5f*$MNÚ¤–V ×aù´©)ÜÃ…ú6j±dæ`*×è‘ZºW_Š„mEŒV¿F qI˜- L#§^Ó(­¿4Y¢7sÅ0ä‚ÞäÃ/HF¥oŽÿ‚Ôâtm ¯1ü[y¶úÆ;ÕöÕqR+¹kã´”ÞêOm' ƒjöf%îî9„\oerÊhŠt\ÂÓ„ªä“aj lt:O$¾¥ÍÀÅNƒ!!;²¬ŽRË9Õj0¨°í>­jKždjm8+n8&rý‰/×µ‰Úó"­4‹°3E?è °o£/ÀlïŠ幞ö­f›d%ò£ Ú:ùéê¾:’°ËÎ0ñãv¥\VŒ‹Ú°‘†NòF-å²ûwÇÏzÆãºcΡ;f·{ǧQE‹½í³7rc$žÕ•ˆP÷~Mhâùéªj¤ØvKqm­èÆÓÕO"Xœ™{Ed™Å(fÖŽ®T—HÁÁÞ3¹kÛfo¹_|Ró°SW{c^ŸÔä#.…=ܘú¸SSÑ®À¥”ƒï#Øð¿ywÇs ÃÒ‚¾ÍWÇt© /*CC«`a…É©¸ƒ"¶ðn¿y%[¨Fu@nˆJS$K6®bÒ¤&ž#äˆËÛPK¥Aâm•Щɧ)Ë-¾Ýºàä_<÷«~¨†XxÑp­šŠŒ¨ëºÊú~£M笕~×Ôƒj<Û³ÆL7מîÄ’Ðð9ëd8k–iK‰}y©_øD(™­ÓØSÝK¡¿–Ã茠¡ôÔý±k,ýíæuývŸ>Пøøu ÿÝ9ß\ÐG!½Öj¸›XÓ5f_c¢Ú¸›=>Ù3ó.×1w:8«¬šéyb›r"+øk ÐLopãÌV 0í(‰ÌH¢„å½w7ž{ ˆ›µÐºyZåâAF|VL—;ýãRþ;Ò×3·p/jØf©qOÂD®´#Sëè ¤Œ¶Îwû{ÇPòÆéÄ )\º¦ÉÐÅŒ)…F¬AY˜™‚=°ˆµËÅ÷‹ ­NX ;<-v¶úŸ,„rÙ8ÛjɪdzXIhkXŸAbõ&ûÁ`Ä~uÁ¬îɬ`§£ä¤Š<õ ùÞPa¶ˆu+™ò„Ÿ\&uŠRÛýÂX&rÚ¨¤ë[Úg6Á:Ñ…ú¡˜.À£Î¦î¶Œ‘@ ~€ ù‡$KQ»°Ê…DR/§©ˆŒµÛF$fM)< j»6Š,¯Ú²ãÞ“Ù¨¦¡g>íN‘z¢Ui˜ ŸOºC‚7 >ï£VÜ”K×¹åºäéˆÁJí­õ¶Gq7‰êɬg•EŒ|g‹=Z)»A99ï\vwÚ£Û3¯ N²ÿâ›Û)[ "-N T^¡Ï©ÛË,¤ :ÊQgÅíñxB,pjvµ›ˆ‚÷¸^É,žVÊê]æz¹üÍcïiÒ¹ÝÓ “愪•†XfBÕìÜ~1¨Ëy©aÀµÀké‘è²@õ=. ÒìLH:GLX›æ™;d ùXâ[ºn–àZWä“Tf®·+l8±'0¬Bt‚p¼cMü½ÐÚC#/§M@ÂÀˆnˆÄþÛcÍu‰ƒÔƒSv2Úó¹òÂMÒ"Ćå°–Rx6þ½½{è­tln ¡½‰ù)ZÅ+¡«V¢ô5š*¨ÿ—›`G‹*OðÊ1XÙ¦®„¦bô¤.!Šš¡Ã’D#£¹;$aWòïÈ—­ÎGÍ`§3òè* »‚ÿVÜ3ý¤+Äÿ:yh©uK·þÉ&”Ãí¶F¶õÂwÝ‹É#ŽøÜÃ1x•“vr-¼úx­w:þá |2”??Adÿ퇛_ C<‡Ý~·¡3m“£dÐïVܤlùî±o¯Ì™=¢ÿhW„™äNðH¢´åÓ’(ÐZÑZ˜L—ˆ¥ÃÀ%]9Lwlr%…¾¡É¬xìHóri¹Qiµqn]½Ü±¼Ya B~ «ÈHO@â»°ÁdŸM˜X»£y¥?‚ZŽ’©;¯Ç[¨´çÐ~“6’UÓF–ÂM˜nŠ ØËUÊ”ñ.ý:#>–D^^2û Bq¢%¶ ÖÙ0™ÁZe´*m‚42< ­Ò.™LåJ/HNy*½Êi£øP|¯ÌºN‹R°ö²u7}“ž]"/ÏÁVY&zB Þ/º7Ì=‚vÃE@ÍX¾b©ä–.Ý^eí;(㌰Û1Ù{-7~zWõV(’ŽW| 4ÇÝí~;I©Sñ±4Ø–ÚìoUÌ !¹~VÌ[ݽz¥¨Ù0ãØâÆ:¢*a¼ÖÄ#TRÕAšó•SmèµuõtÔtâ/zD—G®¸wa¥]·}ª¤Ž uÐBˆ~Í ûȳc–p£€ƒWa ¹| %Æ£KÈ­š’Rv+SŸ›Ûceó=ƒ;½G§æŒ(›Æ}px¸\dÎbo@žfjt¯<ÝoUS’ùÊPëfBtј‚€EësãçŠYòÞ¨Ïçwø‡E–ò{Ó.’5+p.)˜lî||K‡øcv ¯"*®‹¾ÂONªp«Ïó?.FÒofÓ å¹ ¹–ÿ9ƒçŠç´ y(-qµ¶ÅÙ'òþ&ûHû»ôkøjÓ”x"ZKÔÈ ‰ÃÅ'çây«­u; d™S \19q¨;=¨[~ȲTÙI¤Y`ÜÎðN/È&áv=d.AÂpE¯‡»¹;é¥ný e„ív—·#|=•c÷YAÈÙÏW³õ€¤Hnö|S¢ßñh9á¶0·÷j¡Ûq“žƒš|ó2Ë„±àŠK¯á&JʧÔ$ BL)a½Òúݲ!ϳ¨«_ rÎó5yo“loÕ’ki<† ã’ó™ó|½Ëo¯§:»ÉÝZáVëÌ}!³ÇM1Hv¾W«OÀRÕ¢Í2^J?<µ*º_vi/´Òrd‘ncÎòƒ˜©Qöt+½ÆÎ¦²²™¸í†íQ™mäyÌ“§˜y`4ÅÄÁˆ|0kÝzk+¤ÚÝÓ/è¹ÍHL¯H…’ݵ©ÜRTŸkC‡=˜a¦÷Àæ´oa¶!füW¦€Ø>¢êáBáª-/|^·q½‹¿†•yîB‹Ý¶]á®kRp½œÆDºCÎ%p½`‘~†ÛúÁë×` 5þ¿>>DÌ„ŒýŒÏæ¥(pÅ.Ö=žÍcûä >"í­Z»O¡==ø˜þ‘Ú&!þÉs¹øJ ¡Ṳ̀V Ã'cîp‡éWz×Ôöµ«£ŸíûÐqTAp€DÝyKê@ÚTzˆ)Ì!½ÏF1ƒmµtN¬Óò‰H¡“_+‘;Mqäqo£4;vÿY ÚXõGÙ àk"eqú:…è\wZokbÒ”Jò›=Ñ6ô­×bW,»ÐŸüø©Çvµg«TWX©sÿ‘íËãžýë@ÿAòüì:Åîð{ÝÐÂêèêQ6b~/Ûo»}¬øAs¥7Tç×kÑ×Þĵ§[t‘ûa"-ñ÷êc¹‰¹Ü ‚7?MalÏûéés¼žü×Òçon©~%CZç“Ï7$Éùï¤áÙŽ/¨÷“Vn7V ’p²ü´v¶l/œ&Ø'ŽFS |ŽÕe?>².ÞÞLvW>†N8óÁŽÝd„s)5bIx aáfËݘÿxWJç–Ëö #ÌO&fNÜH”¤~ZCÑ3b›ÉQõ?‘ ÕíùL5¦õñdwSŽ·F×È±Ì ƒS&ÁzvkDiŽø:8p‚/3Ólµ¸àµrø aœU1[©A>¤¡oÕ@¼á*ZBõHC‘%™)$ä$"~‚…÷V›…{¡†1›+RíR³7¸qÁ_õžð?VVô ¾RÂòƒvF͓ĚÂt£ö0¶u‰ì;í1M•To0ïQÌ©=8ŠºG)ë°#ë¢:ó]5r;íÆ2LGv¶m`öòªýÌ^•«ˆötÇ|ce†}â(,<…Z•¾oi)G;¨E~HwÞ¡¦‡—9‰˜bcõŽšv2¯·—2°’®kl¼¹A·Ï6™ø®¡”œŸ·ÿñLtj’_ÏD,¯%†¡þéc#µ?唟‹²MS•ˆ ëm¢,´Á†CüãE8ÞÊ<€ü%×øk ç…{âJ>Þ\ÍŸ¼P™ŽAƒ[(üÖXA6šP9+ýžÂíh†îäìã¿-î+ ÙjÜagÒöKžðlßBQç"7Y–©­˜'Å©§&M¦çƒ¸ç#Ž­»ÅÒ–E:ɲHhø Œ£#†iÎ O°žqVü1†\ä'ÑNV“övÍV«Cš •'Cê[Uòh…€%´°^vÐßÍé”ËÃKéh?¿|³žþäÇí¢4[Iú…‡Tçß5ZúÚjè?ñ@BNF°þ‰IùAIŸ÷°»óÅî¿=¸jduûÌ=Ÿ“,Ç Ô=½éDõ«‘B%¼`gZ×Ã?[Í›òÖulŠªæw§$Wg&¡Æwsƒ²}üøë 9I»½ŽÚeޥꗽ瀞½¦l_[âþAZ·ªk,Êž-WÛ“‹ÕH·Á#MÒ4á'œi÷¯xÎaØ|x²xì7s{ÞÙ‹OéS@ø5º.šG‘Ã!-Ö\ާ²wì=˜’‚øfñnà0zI8 GH§‡69uâ‰Ç<)×±RŽ(œÇþ°‡}¢»§)fm•wõ_bÇ`¶CZéÍ¡v)ž5.š(Ä^ÚͬG1¤‡i¡Ó”ŠÔë ¼¶>öen—¤iý,˜iVi+2&¸é%+Ÿ·éßxŸ1#ûáõs&oD•š EnXå*ˆ¼HÖv¾0T[P? Œl ÎëåÈŠÃÀ¬ó÷îN}™¬ErÆJ¿i†3ÜŠ#20ÔB§m_:<îQÅ­ÚV}d—è]ІÕp»;›[s_ÈJ‘ÏüúZ[9iCíP›d½5ɵW9áWŒ57U«qì%Þv©ÚºH_NWž˜‘r0K.µ[°’ˉc,d}Ânn°È9÷~õÂ)¢»ˆÝ ˜"â.}zŒÓ–~öüšp¡:^S«4,NÈô†+Z²3æ"ö5¬ …9j?nnÏ„Ä>ËMÑ,½ñä ©‘is“ƒ¶1´_ x§F¿ô ØpÄEò‘´FB2zûÐÓÍîÄýuFÿHÓ°Çœõ‚ÂW¦CHΙЌm¤Ôeà‘’-U×Èvk†E´ž ˜6õ´ü¦%4iàµy4aCÓ„@c¼¸€J:`Æ D.x}2P6†ÌÁ»µ "Ù²]ìêÙ« ´§açĊݺ½5¥«ç½aB5»­kÀ‘TusW†í_øøÍ¢ÕÙòÁÚžmµ»ëÉÿ‡ðÿÆ=û×þ­Êÿ0‘×Ëì<½-ÌöÃévAþÑÞÝ&žQ”:ÿ¼ —%WŠU©s@§Yö}œ/pá)íÄçÞ•ymYF0Mñ’·­°ýw|¾­}žñ_ê ¥·—à§cÑsWi-²ÏÛlOºlÑÙíÛ‚N¦ïA܈L!ÂFÿ­y—ŠMV<âZ0› tº!ß8lJ1‹òü‚%‚aÝÉÎ5#¹ULæâß¼µbt³|òÔ€ +5‡:fJÍËztIÚF05b4RÞM»J;ÜK7UˆLxZ#\=[ Db|‘9Tc#󊵇|(âÑÞ¹Fƒbä!fÚêD_ê鉢tRA7RFä{Ô£1D‡=Å; ¬ç×Pô˜²’%¨¾Á®=¾åg½Ù»Þ–Òµ×½3fÞù$.Ь@=öÇTµLk"çq79rGh™ªë­™ž3\S³Ý “1rd+ÚN2i¼ ±}ªî½S¼šv$i²©Wд,À²íPGi¦’Ø{6ÜÕ®©+ »½0è³Øqò9ß{Àì(.>elšPZ^êØ–wÙM(BnŸj2€t–ÍŸ ò×ÈÄkÏMâ7ôðH¾D': –ôì— ¬¿IIéVÊ„SÄUãoþË.·…áÍHÒ–nפ ÂVÜl.Éÿ¼y[Zm.²±õµ¸ZkLŸÓ£ngj‡…[à P=Ü«¢»¥F\Õ+’Γٙ«ó4¤ÖÂ=Ö;#¶pçvææŠ°¯}ó ‘ÜÇjúóÄFò€Ÿ³Et§ÁðÖ =õ½Á6ÎØJ{u—Û7ÃÙ“HæM4¢Hk´¼ ŒÂ9¢íõö®´w,-¨]¼UßÕNìöP v[íu¥^ö.d€pzóÉML<{ŽÈg¶R`pD:®hM\àj÷uÛrý)Ò”5)úEݶ5O=£š’ú[©Æ]Xþ¿GÞÿ:Яý2<dòœºM™ÍÄaÀIúEefå&jÝŽáß)ŽUûWD  ‡Ò—ø´tËßûŸÿÕUÞœÓH ÓôÿÊ>ëÜ _¸=ü_¨×䃄£¶íjþéÒ`þ¤yE$—z¤éÊp+=*š°]¶W¤þ³ë[žüÔ‹e' ^ÁW´u½d©NE«þ¼Â"\q] ­±ùXÄ«þ~ZBX¼P}!ƒ®QzÍ7þu…ÛM™8DOµèSµhN ìy!Ã@Z߃xpy{#bW‘P.àÑŽê¸t…QãcÀxEèÖ‰±ž9$µßÔበA»¤š )€XCµ++»^LTí "휤åÒ°¢-;Cï¹Ov‚vúGžÉ ’¥„ šw%õbhüTUìcn%ûAªüA¥ù!ÿ|ŒcbrØ( Ì¢K0ÏÄ;ŠV|[*éÑsÙò™› ¶lùTR×{Jé¥ ¸9‚ûÝo?r|êÃÀ­'{Óf·Ý<•JƒiÔ*x§i°•£ÊCJ6'vg;˜ÒÎô{Å­kèØö¡ÞDþ;„3®‡_íTš2Y* ù­gd¤É·jÕög7p³Û_Vµ·Lô[ÕH7µû¨T 9/…ÀÍœÚǵD^¶]}ZšíµÜ#ÅÙÓra:á5ðšgçVC6Zø©‚¥Òñ´ÓK¸;ÅùÕT¡mØßC7~ö„ºü³y+ê±Æ\·¶H§"ÅÚFXŒ¼@Oé–sU‰r[zL4yà.WÎBÒ•ya Âú³ÄÑ=N&´;R½?[F]û•~3“‡ÐêWÆÕ ðèEÏ|W€i#uÝ{“«¡ËÙ^€S®ˆÑ–WTœk<C»?)òÿ®ºÞ/ô´ÛÛwY…sZ-©âDeèbwø3n«¿Ò¯ý(àAiz>Ú¼Sk_¹¦è¾œ¶l6Û.è·G˜hq·=N-)­­V~BÏC”'¯®Ä#Õ?°Mÿís|>4ä.þÒŠÄm‚Háf~L¬¡ËfžŽll¡iR ÃÈùó9i2¶SŒÌ—2«{b\ä)®XÉ,\W¸Îmì -J‘~AÜ=õ}eᬻ¤ÈÁØiEma­'ÑÎÚüð–'tj -]~Szàšöú /0º;À劉†?ÈÅã™)ôÜGM…=’/âì9•)]%Úãæ7´mõ¨!oº¦ ·ä¬%l§¯÷åúØÆS©b¢¢ƒµ;_²THN)ZôN)ËÜ‚·`Éjžh'nùVÚ¦áE!j`µ49SéÍìùÒDÇâÛVgA„Ùàˆa”nW¥ZŸS±J³0è*­×ÛöŠj[½šWµPçÆ®…^RU´…Mª˜c¥/¸/öØQí¡–uÖ¤ÉýæÅV¨³W .›Bª‘K.Ñ › ÈeÌ^íÈ×[¤û%›¿ ÏE—¾|߆ɡ°*“D—v×-̈Ï$Ó÷l/U„v½ ÛžO-:W B«¸.fW°‹og(ÉLóbfº‘¢š=ÌC NY+w·îܺ’/*.‡ÒÐVK‚ù²RRçjdCáp¼ÙØ[ËC™Ä-{|Á;=8HwøïŒ×X vÝ,eÿ ÁYhÁ*é €t8æҌåü`Ÿ‰_ ®ðµþ^ ÐQKçÑHT ûà}1†›‘Ó™b¬çùÍËV–]nVEè^™­ú‘,v^+óñ$‘ú\äJ'ÚQ¨Æ¦×’Üí3FÜÓk˜ïa©^ñJÍFGò4œ:$×{hb“Ï-õD‡è×)漚ë&à’½û2Ò³Ï%Ô[5P·¦ò­t¶šs}ÑÌ¥F‚ÄŸü˜øcû„(Ù†Ríú—-ï‡ûöJþeùë@ÿ«ê_@Ò—Â×›¬ª|>WYÃýSÙ–‘<ÒÃsÐ4R˜ùù"]™÷þÚKûA@ ¤Æî Q¼¥J‹¬8wS5ÉiK.û?IÕ›ÝUûí(öýešè]lî¨ÑÔR˜$Ø´|qòÝœíù˜xË„Á³ì¨w<;¬°3)‹£SœŸÁ^>Y0½“ƒ³®Äs!úßô:…B-[dõùì\×¶yQ¾B_C(ä$íýý)"Ô|±Þ^€ôù|ü`JD;aÖ«„Y¸»~À2ÿeÂ-g…­•h= é¯ö¡T…»¼•]Q\Ù0^²$ç+-_/$Y™gœR)—¬#óWBY@’ýKô%á]Iì7l ÕsZŠ”c‹$Ã-;3á$°Ž¾òFHpÚÿE2c¹ }4kI ¼íòm¶¢]÷D2ˆÚ)«¼övÙ“7¬>¥è¼únPÍ ær0KB]Þz´ç¦âpMm¹Ù5Æ«Moïô¹p×ß\ÄOµßŽ+tÄ ï=ÏÀ^Ÿ …HsYltÎW¶Í²©œ-°^¥IÛ)ó@ò_Ô[:¦Q¨9ìwñ½Æ +.f»Ó§Ú½h¸fÛ¿á¤Û^êe7,ZkSbÜ: |NùŠÛú´w@jÚai×&ÌÛŸÀ ~ûKÛ^BˆØ~ò¶MdÛÎn«2®gæ| %øÅù¢Ý1@ºý¹Xmä½#´xÂ`øÃŒ#¡4|ÈHq²öû¢H«ZÛ‘æ¡Áã5ÔK²ë[6¥pœ/Ö…ºfkþÐC€N&õ“bŸI2ÌU¾ ;zgîw¹€Loµ²É²·D™¸Tû›P»NÑìµÓ86–×ÊhM°¨ P'IIt8ï&Ùû‰Ìß° qQ@Ì ÖÔYȬXAQø³Ëï׿°Õv`¹«€§'Gá·pè@úu ÿ••wFö”»ßOËò×dxåß~«|sˆd5úŒÈ¾3êZøS¾D}–Í<½L¨C\ž?q³>]®üõ¥­ÉŠÀŽžƒ$1’4v“¡ó óHÿܸM|Î à6Hü'—ð - 8ÖtÙ=hσ$§Sd–°òªåW+¥³¨C=µR4Rt§]<ã‡#ÈBŽª\dT²х;¨ž›?Ö1=úG…¾ÒŠUÎïz¶ê•`—·/S…Ãùÿ3\eýCaOXŒc̘íxAÒUóP?=Šâîoþ¥èŒ"wŶŒŠ…³R1lÿ$»º[«ÙEBa¨‘§ò “¼‚ônY7J’#_$Zê_èm³0·d-gC8"r«o(:™CGÙ&t÷Õ~U^ dç p$V†UØðz´Õ/ÁìV_''§ê¯v%M)i†"dáTIʳ½—캲ٻ!Ï=¼øZ“ÿ¼x»Ä{ú¶·ËlÒU%KÖ¸Wôí¾ÑÀ¥â|x±—³þ á­PóãEç×(C›Ú"VR43´'¯‡ª¬%gÃ6šÅˆ«$ÿïÉ€¢ôOCixí4 éêŒ=”Ì3¥ü»¤:0¶3”œqÇÜèí[²Úu2pÞÑ9 ycÞ9íÁÁÐï1«ÁAŸ=é÷©_çu5v€…5JO‚¯zþð _?>·´SÍÝÝà%3þ%{XÍ1(×VŒ«dÒtœ}ví“Q¡ó‘.ÂFæIäÚ:JXÀiŸ,]4 Ûñ†ölzyí¸òUäg;* «=ä¾ú>6yžaëêM|XšA.}îø"ðÀ׈Œ­Y$½®ž ¿…yŒggJÛ3šØf °Sˆ³oý¸!ß®ÑzIÚ-#%,rŠ»g+ˆJI †yº”3M­S+ɘڰ-3Ó“èÝ7ÙfÏø¶7;ÛŸÊcÇð¹µ›-YÚ›™Èµ¤ØÒm]'ybÛ_ä~¤H)ÛSËÅ–¿À|Ó(iظçÁèM†Uk:ž)•á›»ÔtËIݯ¬ÍÞý’Å"³¯ö¸BŸE&²‡üÖEïù†ä(ÊK;¦¾3ê¸áæwZpªöwQQëÍžtŠèaÛ“ÔdJNùöÊtDT§WøüÜ”·%IõFÜ y>‰Pþ*Œþz«Í~×~»•5¼÷WÀ¤ò±wn—qÖ OÒÐUÅÛŠé½@²Ûåa1In_Ü4•‘˹-nQyáÌ$[‚[¾Qö]ÒÞ2wò ·+DPó;{„É9gõΤÛÛóQ„îåÛþNξ~lˆÏ;²™˜saþ&ògÄÊÑ>Ýù5¹AÜñH5‘b2Ö4>Š6 Ÿ×K¼^ÃlÞ¡‘ƒ&¥>?2ûÃ@Lþx)nË„Oýâ6¤Aª‹Š#¥?Ùe/åš=¡èEv+`¬G<päŠÈ±~(”4µÉŽ!YZg’ù¼0±Ý0Ú…Öí˜8ªJÊP‘Q!Ë»õô;ùj× ={gÞ™ìý*£¯'"¹J½tŽl èú…Rzºèuþ©áYÂË× ²}×m±(ûWÊ?нÿÝ;ä¯ý?Ð÷ØæS¤éDþ¥¯·ËÏ~~Š‘?cwÿ m´‡$ ¸\Å&cÈE¡UöÍ ~ùï7ã={0tž”ˆ‡†kNÕ01x›&Ûýή¨¯•q%¾(ÈE›~ºüƒ“'щf.Kèæ7õÆ‹«ë×BrÁI•ô,ÀI‚´£u¶êÁ òpªçè0ø ü ÿÑ~ª‘[ÃÉi«DJÁ´V…|ˆÜ€*¦]½L؉{çøñ¶è‰¸Ò3“çÑ¢dÖ!6lámçc"~l0Æ’Ö‚ûŠ!1Is«¹‰°sb‹˜äsh›r¶ÿ.Ǫ™A—íî šÃ ]D:¶˜…Vp“ÜRfÅ]l?ãf10p„ “•8%Cš‡Ä“Þö_ Èõ´äL#¥ zžmKéòñIG¨k&õ{xf¶Ûcö®Ü“ú/lb³ÒmåfOG> Iß(¶½hÄ–OC‹©ÏõÎ|T;Ĺ’_ÜÓ7­_¶º`Éç2ÖdLn’yžßîësã%ßb¦8z{ïG[tRyý"S˜?‰¸½Ûû5ìL6©hl4Ë‹=uådk$¹Á\¹ñ\’pʤý»ñNÉv)J%—aHL·ÚW퇦b8 öÄ0Ô~¸‰¸·"HsbÜc[ää¸-‚tî/i–}ÑüÏ·àÅ|øï¼j’Há¶9Îó­­Ó}²¥ ñ¡øîÅoà ÉïãgÜvòÝË’->m'ë`U+xËQw ex`$f3ê–¶¹’‡Ge#ŸÀLq߇Hã¸]/@ZÅ„µæW>±N±ªu)à'µ€cny±=½¡¬'Þ>yF \ÏF­:c>8¡× ±ßCrwaÛ¢}[Öy€Æxí°çŸÚU…üTN®u·ÈCn=ø Û¼ Æu³í°wÖ ¦â±¾2¼Ñ4h‘)1ɉåü`Bs“Åfkûf?tÒHT’­šz+ØáïÑ’4‚[Þ«,Vã¤é¨)È?;$ìʶ/ß¡†èY8Ï Sü2½›œ3WJ’“úÑ¡ "õIJMaûïë9Eo«åâ}ËXµÉwaé¢få×å>»[jûþÒN˜Ü>C–/EÔ×G–8-åå7ÍSçyÇ~›ÁÌíý"¤¦¤Ü¡^wƒHb5µyZóLÌ77Û¾«A9aF(ɰ˜×·ýJÆKްᜋž’úl ƒÔé\aÀ«E(öL«ª—"iß³w-a&u–jd€rÉtIs\Ž›[+E{–›[}<Óþš¾ø#ž‘ýÖኔ0JtP6hÚÂó«Ýô`{ áÁþšùçGî¹T{"PÜ„þiYù ð˜Þià\\,»“V¹2 „®UÉ$R· "á¦-[! L¿›Â`YÔgT wvÑï­4WšÑÍ0pÐÙZ¶–÷ ¯í¢¤žØ5¹cæ•âUM¡%õoŒÖôΞ¤² ¼J¢ è´ÙmQ8^VInžu›ôfÖ±j©ßuMÿ?ðe¢ö¤çšÎ±Â?½#¤/Ãß’E¿~ü7ï¿ôë@ß}¤ù1@þr Õ¸ß_G ?BXŸ¯ÄÍõWŸÑçà.WëSJÐnÕE×#¥®]V*:BDr u‰ŠmVpÛ*¦¸‘ãKдi28À$L9à­ày¼y¼V;"Z^.PgäÙDeÓߊDd¤¬åºÌ¢”ûbÐbAë.0 ¯A'$uiಈ‡³»;&j'­ ûyÑbš[r‡ùcæÏÌTN¥m¹QãÎê§L«Éýº Õ(f^'Ë‹W$ý¾–ÂL=8^ê™D ²2^åj‚{ºhW½Ö] ‘K®ê7+ÑcÂêôþ *sÛiñ³ÁÂ2„Áy9Šz$'*õŒ¥˜Fm\Õ‹¸°-ÍéɹT[e§cÙ08Á.m ‘¡—(_Õaڋ쨷V';ô°÷üÔÓ‘I©±š†É´ÈÞÛCîØ ìR2*zï!æ1{ãÇ6‘ŵ¶µ\•šÒHNY0l˜ &ݵäâÅö£½³ó^ÚõÁþß]ëócl¦iòÍ ™—jWŽaÃ1™¡Ü·Éƒ›-]¶/Žo63{õöþßIÚ8J†Ð5®5 ,I©B| y (O{ºJžìj6èhW¿`äŒÏ¾«PåG‹@ã¾ò;éÆÄrã`‹º†Âc ¾k(è´gÍJË-ÏJàHz/Aùÿ8Q\Ñ"ºÃjZM å‘U~RI4í]é! ÙœxŒ=°©A;¿Z·€MïRÆØ›wE×j ãÊFWV£îA§&ÅOô€UDú¨ã4E‡†”ÁLÅ Û …W‚½M ð\ìD/{$ñžôµH€Ä:Ù+Þ++9¹£˜(¼…|é ºãoÁµÍ»J7qi»ôÕ‰f‹rFNz{Šizë•Ï û®áeºaE*R• ‚Œ>Û¡á° ÿÞ­‚²Ç?­²zr~Áö—U5ã1‡ÙÆ÷‹ïÈ~ôë@¿ôë@ÿü*|O%´Ép·;_’ÿEÌ\¡·$àÓ€ÚEÒV§fœ2 oê”Êðî2Àaªþg&À"C’Ll$ÒY'üÅÕÁX¦*L Ö«+È”[ÊêÿI髯¡FU"k¸wùØtÐ ÖJÖR£j`GŸ°¢D.½^Ç¡•˜\5¨Žál ÙžSEÿ.E—fd/W='Ò,O"ŠOOqµ%6®¸7yRö{«Æ–´ó¸—rW »È3LÕ¨ï0Tªñ£nBïÕ3›³—ܲ1jë JÃf "ŸÊ)‰ÚLÊG“§3A”“B´-É(çævùôäõÁõ…¤>Aó—/vú§5(Ùî„™DªÑÈÑ ºöÅ<ãddü\ÚYȲ­òXÌd=·í{·íŒÙð‹´ë \ìöÌg;É"OÛi¶Ã)ûA£65%âiW‹lÍj$‡H+Þ 7ã45ÝÓ{ {}eØIÿ¶Úµ'\˜DR:‘NÉv©‘ÕêÈòr·2œºÚÜö†­9€2p#Ó]d üŽZó±½>ÂQ{ öwàt8<Ò:¢u…ð­ynId:_1©›ñå1ÛóØzÌõ~€´@mv›ø ßMÑ5l?Ɔ8CÍÓ²8þË‘ö‚ñ†üVuž&{T#ì@«ÝÙ;ÎèRO8ˆ*~Û9?BýÈVtŽÎ=ïMoA¡ ”ºgòËV8ènÆk¢ÐŠä6Ñ´ (ƒµ+×hgÌJ[µÆ˜ì8íqënP±¹×Ø?J¯z$•¿ÉjûoZýè×~èôHÝ:@É¿ÒI]™SGSˆÂ3M“­}¨_4«d[‚èÙ âhÛaìëÕÖ½ ñYÛ±ýke‘ò· ‰ €ÕÙ¬ßMò"·UÚ!,‘©ª”èÙÍvòÁÒ¹³±(³D¢ì ­‹–àk¢ÝÔÃÃ1Û×s 7"hö£>5ÎêÊC“|g˜ Ïs­ÇÔJÜW$/;ªx ¸d©¢Ì^G<áTgµ4¨A1/îµÒ³ÌE¸^ºMUó8Ã(4"q˜íÑeÐXÏ|FƒoÆøz‘Bß‘ÂÖn;×W>¼ƒT“ví3¯¯‘Êóp ƒ^‚Ë„1ñ,<šÔu¢QÓûŸhyícЊ_-jU"N–UУŸ&ŒÀ‡l(DßÞcø–•w"]ÞÃ[û¢mqIo¦<»•BtºˆT]b|-¿ð«Ã1ى߻”i;ü•ŒP|&XïŒúE‡,zë ó$¿ütlRq’]k¶‘7®£ Ç[é2—®È> ¾ G¡nðÛíÎ;|UËkÙ8ì»}âB'ÁÇÔÌTìÑf:‹æf’±R¸<Ö@8 ¡}—¥Æn:‰Ù˜wÕGÌϧ&fò[\Ѻ­¸#í¡«;ƒõ& QSdT}D~_î'½áycÅXóZrH"ð³ÛÕ~J¾íbwMŒhÕs=­¾©¸L^`Í{ˆ+w¸Ÿ$m®a°E–ûû.²‘Ôk‚Ovb5†› 2‰•Æ+Õ°Ïû£+^Ûúò’ô®îbÜáM§Ô¶Ü5n+èðÈïÍ@k]¹5ýâ,ßÌÄœá÷‘¨ý©µöO}ü:Яý:Ðÿÿý¾TÃjyzÏtgÌešä ÜÅtU¾Êâ–Ķ0fÛE;•°Kvâ¶G¨¤b2ÃaöŠNC‘ÆD<ÄYí ZIáüœEàýE¾åJ¤èÉXbÅ FD%Âß ‰hË%é„ó‰žÇÌlZ[´w6EiSœù|‰ŠÛÔT¨VWÖÉ–g9-KX¶¡Gë0™/Z^£h==†-æ2È…ºqÀÍ8c¤¼ÕUØoØ7n¹ËÐ [ºœX$"Wó¥©ýÒÅlœW™3i8°i“ 6K6¨!cª£¬: £½"˜l¡ŠÜù°½WÔâvµ_w¹ ¤Çâ©ÙFu×b*h(´«ù´eí.õ}ç5±Ò‡Ž­º nz“ïÜ W"·“éáBÏ ‰Ì$ße5•n{ÜKM0†/[Ó Æ)U³BN˦ÞÜe5:vÛ¹»»>ÔABæ+#ïéÓàù,Ùò˜íÑ;ʲ&žüXÏVM2Ù³B~ßÚùŸÛ¦¸Ü“¬¬›™£Ûv_4îS&Í*cÓ÷ʰl°÷$ܱ LÈëÔ±L9„*è]44;_:s¾S­‚ÎUL~E½iLm”–‚§÷Q׬ü?IÖ$3 Ó"ˆÓQ²m—‡ê"'Erß*ˆôDp髜£bq âu%y·KEž !õÀé€1$NÆ*ïÓÀÞRÊ;Ѩ–ú9-ÞfQA,{—‰ZdšÍ hÂrAäÑ”n”Y6ŽY´bZm'S_åômÇ)AL¿™!¨£$Þw³T@l©›ôjéNUB«|Ä&¡ÚšQHM!?³$ü!×Óli³!*õIxäUµ7[³ŠöA;ã^%å¾§}Ù¯C¶×I‚*n1qævWõ Öc¾Ä"' dÁŒ[èg8·¬Ù™my"zL$®Kã ùéÑkS¨‰½ÁÞWZ ñ‰¬!»êlÉШÞ±w 8µÉ^’ ¯gô•["~¶\8@Ýöê34‹Økâˆô 3ý’ζŸwõâªlÒ|;c+rñìEúZ·/é°qæÙf\ xÙ œºt2Ó¼5b¦ºG·Sÿ-tšº¨ô ÄlŸ™žÑBÕ`‘ì@IèM“)Rº­Ê˜Ñˆ)èýOhâ}É®[±ê>`»ÝÍ܈ì>˜8ºx¸ bØcÜô•Xšw Ò‚Ÿô¦J0¯‡ [“>³C“R«ë¹TBˆ„YEGGÐp¬Þ f²êZ;螦`—Q=xVqÇ×A¤Á «o,^tümclË©w‡ÝFb>©%µVñÀ':TbemöÃ:…m r/;è5¥榆ðˆÔ±¤:gîí]4´ED¯­Kvc&Ò®©Øï±WòÎäPOJ‹ÒvíS¨ÍŸÑE€aÝümÀˆ\´tCÔyÿFøŸæü[Ûçêÿë@¿ôë@áã•SóQ§‰}¨²Y]ìáÞC R{òήH¯W*¨¤‘»J ?ÜôOÚdËqÑNFDÅf+ýNïH3Á‰²)ùR‹ºÚCsü_±W‰¥þž `/Ž7JÞÇæߣ5öN¨LŒ:èV‘/²ò´¸Äz‰˜ƒö“ÒARŸ‰ºoxϹ€{eTsK©E*±èÊj™UÛFF^ÚÖgº RŠé¥vÍ{{…:w¦Îm‡’ë„Û|¤“¯ÐA*šäÎ4n&oø„ð¬[rµg D¶’‘½$š ê]ÚplcÙ÷¼é˜qèc±ç~ïçv­ráL†\Z>ƒc•ó¤ e;“JÀHÝä›ô4J´3ÚàŠUÞMo«¬‚ðNœyq+D´$1¼íéJŒ3Ì( Ënˆðð_P:\2ducOÜ9 P4°Ó}¤ûOÓð„¢0\^±Ót7 +‡Ÿ„Nž“ÏQ”5l¨¸)TP6¸w* ¾ ÛuE½¹§ö:…ñ7þ­r™´O…D„­œÐ8·E’ÙìÝ[‹‘Åë|ĶYM!.a†pv¨1k—¡ ­ +A‹m\zÓÖ[.˜ûŒÉ“­_ÊŽ[áruC´Yc˜}Ù¯ B3g4Ÿ¥ñ‡f/ÿ‹ö¯ý:Яý=ú>qt‘¿wJËÓíõ™ÂCÊfÛ™•D²Øä°h;BÃímØ÷´€“mDÁÞ]Ÿ'-Êt! ñÚ¾vÄâ}~‡¼Z²5,#5:Ùà. e•æDdGUÉM‘¼à\Ø<ŠV=.&;(5 "4ñp‹%=¨ä-÷´ÎÐ9¼/ü»gx"†ošÆb˜¯0ÍõY¶EMÆÊÚ·:9_‚ŒF ÿ@fÒ=µQIá§ 7iÊ£_aH ¤8ïF0ê¡Hy.ûG¸;³ÒÈÝD’ºHw¹íy\Ôý¶¢€([¶,y• Ú0‰a£c:àh=Îc3xt¯÷rqˆˆqf9¥û5p+ÕDfÓÁW¿ûÉ|Hͺ¡ñQ×”vNÂ·ê„ ¼±Ùa¢ºjà¦SŠƒgB‘¸ø–'1¡º)ût¦¿(l§_T¤ó.A^Õ@«áó7Àb+Üý .¿í 4ÑÅVÙEÈSM]y7" ­Å­¤å‚‚I'Ó©Š`ów—.Í É'˪Ý;`¹ôC™jj`Ø»VɰëžooÔ…ãƒf©ß5í„/‰5.’KNƒè¡iºTîò%mCÍM{%ÄÊá¾^›hrBsG’ÐõeŠ“ñ7Œ(™W *èòó:a'{ ùšÎ„—]iœÌï6Z †ý¤Î´Û„›Wf1õÆ`4S¸¸ ËvÏ(C§€¤ j½äŸ±@M¼ìÙf‘ð§— øÉë»l=ù Â4j°}h+O %r+аEL﵉Õ9 ÊéýZYV". ާ¼¢ÜÎ`YìJe’êöS¢Ô«Á;rM«ÛÁYEa7‚ÿÃÏ ¶˜„Šì1£7uaI#ºRP¦¤å äŸZkÿäǯý:Яý§ÈM>ê7¹AåKop‘¦ [^+õÆ[q—v'2%¶iu'‘éMZ µ¶ú5Œ '‘ur4ÊËC´ð@‘A.gÉ‚ÏvÕ“¡Å-†–,^„°UÁºòd†Pqv¬)Ú»ÒŽðx¼ ×vZ KšSc˜56u5MTŒßìÉ÷° «‰é£ëˆýg05Ó^)ÏEµAV ªF#b¦üŠf‡(«oe2hëíáØÒzY»“âé{ƒX9à³”~R_iÈÖç3)°V=+±ØÕé3Kº(1óÎÄžõV÷å˜÷ë0dt.Ó)ïŸûXw%4ØF¥®š&dšE‰4_%æW‹jɹìzCpµÒþ½3$<˜9.“œ+ÕŒ£#¢Iˆhp‡1¬V^Å‹}aŒ#9»z:¤ÌÞÎc“ÿùÅ8¶¢ðÖáDdö… ”ˆ¦OѪ@Z2µ}]³Ø{+Ë%÷vb×:^Ä2Ò¶¾‚õžH) C AÖX–Lå‚gµŒk°7¶äs¢Q™hHÝàµ]fð¡&S¦NKª (uù©«´A ^|c®eªrŸ:Õ0½¸•ôŒ¨^îai¸ºÍ UÄ® ¿#ðÍ oêÖ¨€HÏ ®w ;ÀC–aK—XN±vv¬ÑÛÛRjøÂ¶ÔÉÞÌS?³Lv̶Ã#@\5m… ´óµ°»cq–ð§ØQ\@rùEæ‚× wÍjAÍp#þ<ËjÐÄ.O»8)Ôgp«ýãØ²4c!Ù…¥ÀáNâað´CRßXT ðf•ð ÝÅErS„{âWäÍŸú¹,Ñ?’b°Gï;Éý # ID®r5CÇ[vƒ¥mÛí”,m²×. ÑS-=Y?&©n«dR¯~êÈ2ÿ¯¬„ç#k`ñxjÿ|¬Ûûñ߸ü:Яý«ôÅ.ò?ä}=Єh×ÊqýJ\­q(¡&vI´ôç v8ÚD‹zXɶEˆ¬žM¢±Þ05ê¾!îǸ±r/bBä{àJsÃ{ó‚G"Cò>;ÓºL/+;¹– ­£ç‰½XBcÑKöaÏB=ºW ³9Ws+TÓ^T ¬DÔé Cwƒ.|O´º.¨' Ÿ1Gºm_ØfÊ~ÓJTÙoy9É™ÎàiÒhi¸€¬”©(EVâ6ñ„N%ÛiØ!gKÛ¤ë8WM /fÙr Û@69ȬG;öã<®³ ]Ò ÚžºÂ>:°}S×Ã649*Ž’ðÆ3¸ÔD:["ömÁ§òª©É²Mè +ƒÐÄ „, tlka`Œ™“°BA–%ày¼¬na|M‹òeDõ€@£¡Ñ:CÔE¼·^èɉd¿ë¢Û'üæI³œŽrërÞPu%Ùâm“W“°‹Ó   YÚóp {Ø)>lž4ONbˆ42êôcvØ4~ÑH!xØZÕs?¦‘ry›Çpï‰Fº 6|¢5'œé§­|ÕŸƒ@€ÜrtŠà$‡/5¢ôˆÕÄ,J4Ž ²¡©©a›!•‰gS£³^øz À4ôxö'¸D ã]7©l!2S0,ŸöP2m˜˜m0·:=$®<¤ò ¯j=¾äƒX’"‡¨ª{X쉿´ •'$5ƒ,ëe='FeÇVµ{qËoHT¹@³gL+‘×®g±ÎE+?# hÅÇ ãUd/{ï7M#Z[õ`åt¡:ßé”Γ¡ñ ¯ÌnŸqmÍíºå`n™0ÉX²¬ùÂndÙç£"åuÎARþ~ÌöíZ›¾k5ÕŸJ/ùÁþ‰_úu ÿ™eîÁÆ—ÿ#žÑ·šðJLJÔÂYœ?­¥%²é;í—FL¾OuH8#ùìžbÇëa ?’h÷tܲ!€2캡lÎÞúqú& ­¾(k–0‰”ÅöŽ,çŽ4’ŃÔX˜;Í GZÚÇU›_0y%~º'q^™ùx„Æ@2˜$žÍÒ`Âzs¿(¼œ‘Ÿ¦h ¤Ö r¹àó4Z6êY©Ã¥‘ˆQÚNsºKÆ¢Rlï¢Ð [Ð/Û‘w‘zk¥´©Š™«íN ë wÇ&.É¢àQ;´}G}«®Ù¥½ÔÓÖüÓ Ñq&†ì‹u’Fj£xÀð"l5ïZ]‰é¥$R]«¡U+¾ ÌôZÃ*H[ÁÙÔA²ç@÷¬ÝA­²÷FcÐm·ÝFM ‘E}&NÖeeî{ð óXÍ3—Sû? •†õ¨ÂsE²] ûÍáÚ¸ ÄvÞ¸8°Ì¢öò>5·¥\#ð¼‰HÔ4»´Ó„s®Ž)¡Ú¢Ø‹·Ì 0c@*ÕaïšN­iÄ ïšVòèšY^Ñ™¹º TìeN~vÎL9Ò5ášu»p é¤@›Ä^ðzÉ•[æ ž›¿$ê¢b­Ò|Ù5õÑ„weèç RoõL›G“Þn`§H}…ƒ¶†¦jºᥔ\—âর:ä~ å§êš©ú\èÖ-ôø*$÷5ÈÛ9Xé¼[íSKLðKè[PÈ®_ù yF±dƒ'£=ÃÓ€vG:˜[VîÄºŽ‰ÎƒžN×èÆÄÉóv3ð‰Œi¨ØÒ°)öd‡³äB¼?·î#6yžÕ®<ÃbwÒFܱì3Nƒ¯J:(+æeg¹Z )‡w—Óʆ1©èéVJ‚€»¹Má”ó~¿äRL÷KÂ1e rÂçóÏæp>kí_ûµ_úu ÿáeô¤Ãïºÿˆgôí&”DH t”5Ä&O'ID‹ ë#(ƒm@ôÄ|g›Âðú ûkÇ4.@snhÁ88G¤mBîï‡ÞƒM"—–y"š¶½µõ ³:>>w¯‰p35ÀÛEüŠòîœ`nß02Û2Eú]V¹Þ©çCO O˜°Ü NÉåu¡_œ.,oï})dJ,`ª橦‚K¿$ã²eÕ©(³ø6š¤Ù¶ ÞÑJ»H£­Ö©ÝðÍ…:otÝà ÈÙO­ïGÚór†¢ÎѲÈGñ¥¾‹8:†  ×Ñ&;[¶ pÚNÞ¡ÍvÙ_˜)#ÉŸZúµCŸÔy}­wéÙójî|؆Ô&&)íËõI‡C^Ð};lŸ™‡h`RsW aå¹Ù.î³(CÆËEÝ‘¹ù²èG÷!·z2•ù)]6ë%䌷-ôð¾³ÛOLÑe½ão¦Ò½D¬Z³Làe¥,×‰Ñ ù:Ù];fKî—®‘¯%ÑÆOÔi)êÊPq4sjD*»%Û?ÕOËõ L$%Ybl¹¡r[Éû’ÒOß&‘Xí¦Š§–[Gê1¢9§ÒÈ4Ê$•D–²­g*%ÊJHÙ¶.Lšo"s’7{ÑkâÊ.jµ`Í=¢‚Hr‹B£ˆ9ƒâz3œûŽg½¦såáZãS/øvEôw›-o–afèUvmí¤žî2^KÛ‡w¥1ïP¢¸nw@‹(]1ÂJø~GÔHÇ÷rîœÄÉuÂkgw¼|¿†Ç·bR8Tz3zåïˆvÏ–’qâßSÀåÙÊ !U!ë9 Râ¤uÙµc(®Ð”M&“Ñ: ÌÒ0•ÈéÆöžI‰W3<ûÒ.GŒ·ôxúºÖ¦è éã+aáçÖÚ¿´Bÿ:Яýo¨|˜@ÿ!Ïèë¦HŠ£g<@(bîç@2ùÅ8jªuÈsÜ#(“'’Í=”ö¢¡Þ©&ëKVØb rG ùÎrÚ¬‘%¥Íˆ*/ ·Û¾m;ê”A®‚‡8¡2CæÁµË U¨HM Ь$Vµ ®,ÛZÙ=m3K¼ìlm…P†­g²‹$#Zù>ů+VjáÙXù ÎÉöëVy‹@Óä6y“¾†€œO±XVHªÉ­ÄlŸQùƲJhe;ϽßG^5äïh“þÇN†"†í…÷¹h eõó¶+®a•ZÔŸ\ ô!6¬n«¼srOoÖü¼€÷¤—)”(·ýݸ¡âÛJ—U¸Bk{ÇÛá»eíÌE«½‘âä㥠UÔ±pjìÅd®î“…rÙ¹;À lÅž±¶uê*ô_¨¹àóŸòóŒ»4~š4 Õtµß ¡ÞÞ ò3ÆCú¹ÆææãIIÁ4jÒ²5íìÊRv’öÜ5YšÑãm¹\é~w¥ JÊX²P©áêÑ$izòÙ¾&„n‰¬ëhúVˆß$ë‡ ~5cưy”hñ“Üçæ–Ü–‹=‚Ó m—”ž‚ñ´ÐEÅoRQg£kB–Ë1JÖJÊS¢¢naûŸ±§ØqsHFÛ+ì;©ºÔ$N|wUî!ÆUv‹Wѫ߫]…‹n}ÔåÑØw»(°­¬oø ±µÌÔVï %n¤‡GxÀOÊÜÎ'Àh˜Ràr¥¯Ñ(±‰J}fȦ½ø#ãL/KÑ„é§Þ—ÎÚ\6÷Mð›Î^%k‘]D“ñ¿¡(% ÑÍðv¯ŸÔд?@voÞðqÿfu‰³þÞZ뎓eî¿óýß®µzuþu _ú¿t ÿȇ °'GøÁF{Eó§ y¨ÄÚæÔnG@Ý4[ص¬´YFÄb>¹œAÛ¹U …jÒƒ† Õ?TVý€Ù¼ÆV¶Ø,kH†YX3. Q‚Ò_wAòZEføk^arð ØH"Q)åd¾p)f’B»ö\=/ݦöu ¿èì­Bò¹`ØõðÉ sá™YxGïÖP^TK‰8Áדï|×Ûla|!¬VÖ˲Ñô1¯st¶ŒÓè(!ï˜Ü'ŸnlóaeÐ¥1ÚæØåæ‡78؉å¦Q"‘Í«0Ëäc1d“òIX¡R%‹]1jÈšLº?`o=‰Î¶KaT»b=_EM/{“&½§örpïw,ª~öÒ ó‹Dµ¢RzçÛãívwoòT˜59´7ÊnQŒ"¤KÐ(]:ÃÌŒ\c/¡3¡ö`’æEÓ;qóÊ!±AÒ;Q«-\á+Y¼ž´ D =kŽ‹·Çr£{a£·I G—V– {J§Ý[ý­è •,ÅÂ…öð0Ui’3ŠÙ¦ö¦¾['y'ÈCðHk”™ª*(MZ¬H²ÝÞleØì®?¬;j!spNvs yÒÚÛ/4±ÕVRnt%'îùOÍ×þÖEû×~èã@ßzØ—ÿ€gôý&h‡B=zF+ðÈ»F%Ö±@ª|Ï»éÝêÜ]MöRÂ@äËãÓdÊ4Ô½£T£¿ô|×±Ö /õÖˆ­FŸ(ZJÌà yÅ-ñPÒ ýÁR¤†‚UÝz”1´ñrè•C«1UY¬H»š8ØÒhÓƒÖ'|3¦€]iŠã®«ëÚïГêÙ\š"ÉjÌèŠ KR={5€¤˜9 NÅè`@Æ1(v´ÃžÝ"#ÍËàTÚTg³$µªçoh–'[à‹Ðhúnø©”º!ke; ›½)ÖfÂígÅÁÑ×Ú[’ðMæ ¢u ÜMÕž¶\%m/²u¿ºuQ-G¾¡&ËIÑGJÔü¢4¶ «rXígë„{ˆ1ÊÎRèŠ`’¿þ…?µm¸!Ï¢íjƒ±Ï ñö™/²î’<8e…‡{Šà,¸ÓõMñf$&œñ‘^0 î"ÈŠK»úAì±)D•+^YŒ1ýª'ÏœX$žLÉV`ÅÕ0t©Ñ‰WEdÛ ²KQ(Ý \)ÅǤ"ÝÓ›ÑU÷ÀE´óþ)öþçäÑ9n&å ɾupG©ñp5 éeläü-8Iy[¤ÑZ¡¿O yÑqìæô!´‚ ‘玛Ñq⎼ø¿Ž„àsi«æ™žû#c¢®jÁÞ.úÇ‹„2¾®Øn(¡wЧ—@xÐ’Qãìš"0hƒ¶xÇe‰Š"PÕŠç¬È‚[ÀÇê»ÊµmoDÝK›è¿Êß²Ú‹^©ÕÜÔ°Z3`ÿDmwá_ˆ¨6 ¬¤"ü v Y]}"5½e=U¥êžÖJc‹Ä±{ \U(Í>N»|Ì–¬<À¯iž^*Á t…f&Kr¦ŸV°ý½‹ö¯ý:ÐÿξˆBÿCžÑ×MXÈtŠ:G.Þ:÷Úó•Îÿ\½ s¨$0µ!ÉU“våZ–ô¶›|¼6‹ÔM*ÓÅÌ`cݹðAñ:óš`yΑk~W¾†:}ø ^}õÞÓvm»çœÛÞ´~¯Èù‰)Ѹx2ïb5KÊüf–ËE6Á©Üù¶½½jeQÕÙ\ª:ñ<„ÞÖ˜ŽmÀÈ„ºœ}Ûë%ïðˆ d+B`©ä³f;ì*ÛòÄÜÀ#ö=f*IÄwÛÌÏ3}? 6É `[q³î¦É·Ô }¸ñ…ß´Ùå~¸¹_VsHNÄÙþ~*iD8†;Ôpò\&ɶ¥,§ÕcÓ™1 üì±…ªº"µ‚%Ë€m/އvY<JŸZQµÈN@ý¤Qù Sk8SÅwQøˆéÈ¢=²!u 4›(‰a4kJW7Û“pÒÖH„xé´ƒ²†JC³Ãʬj'šOQÙEÜAoÛÙ©»¥Úw•­½ »¬˜ŒvŒ°ÅIÚå!mHlõémµdƒ(èoÁÀS»£ŒÖ虌{„L§‰-“}ã`”œ™ïø«²oPgÞA”ÚÁåPÖ„Ð`!TM’‰çÜ¡ƒU —“Èø=O´¹ªFŽØ`‹q$ÊÿFÇh'¨v¡ uR5¨ôX]Õ6LBÊv'ì®!…ÛÕmxó2Œ¤†~`CGº`¸)dºâÑBeº@ç‘×p¤€Q$ÑÛ#cÍ;5•Ž’*廙{ž6€œ.ÛÝ^ŒèOs]¦†Ëƒ¨AõVσŒEfÞºÔÅ©©¡ç…‹´0¶,Ü&³lð)Î ãlxO+‹àÙ‰Dd^}÷4ì¿«òÑ ^/U žœö^—C† F[wÔKº‚´ÂØoËQ’%~NV¹7À:ÿÈ!)hÝÓü5ðä!¦¶øWšç/Ư£‡ï}Û×Õ?Çõ[aÞ·¿îV¾ûÚü¹ý:ЯýGh¢‚u€ä+ZŽúðd®ØFÎ,׊ûXûXé õ()R§ ^¡R+LãÜÉúÂÿèD§‰›S ¥·y|ùmúÂéD:Yá56)°–ˆ"KŸXI"CòâîsÈè&[7j ¤HÈîpY$oa»="` $ Úpz˜¤ G&¹(Žðhêc0]Q^”BXmñIIþ9Al|ÄÞõ€ÍÍV~I®”ÇÁ6*t£1°ï»Á!åµÑ¢’–èØŽ²¸F2ª n’M\ø¿{ÉM+ºÂD*OÌWÅS D: ¤è Ãð#èÂQ‰lÚ)÷)<µâp‰šMêxˆ\ Jû£mø”ŸM•êFd Ýž™!~(³‰4zõNZ߃¬4°`´žºL¤’ä\¦¬žùæ´)#N#¬+Ä–7ö3K‘_|Ô ‰\èb6£n(e\ó“=Ý.©åÈû±âã7†´Ë¸Z'÷6k¼(òöÜÊ)סзºÞÄ;"OÔm<‘LÊyhÁë¿J‡ø}À¿{ÚW{¸YW¶›ÅØšk¼†«¸®à™é×s¼ß*;T%ܵ~E±6pS½°[ä½Nq%\Çï+9RÜX±^a1/ÛÏŽÏÀi R}à5ºD¸œuO˜Åœ[ƒ·J+Ø­ºKx£5ØÍØr7Øi˜8ž£ÎÖ;,n‰ähS‚KJR¹d´ ¾þ.‡&u G±{-‡ÝÒÍ`­€ÏñYðØllGÑ¢Š<„” ð®h}˜ÌÞèõ%.ÓOÊ 8aÙ.ÜíÞ;·ûMŽ¥BÕA²‹xȆÀ^|lt¥ggd…èrÃècÓ”—²C·ù?€'SØQöøÒWÇɯøæiK=á)¼Új=½¿üõ#…7AïYüvõÿÙüu _ú?z HN,$š¿ì:W»ìQ4Z- ¤[),Êô³ë[†™¦Á¾+ï®í»ê"y àh[…gR“%aÎv\ØPòر£¹Žo׃Xç½êå\ìÌ¢Uɵq§i¸ÓoÜ0}ÔûRpCZ/à^æòº>Oœ%ÐJy'¨¿©V˜qËbPA×ÙaúÝÞ½Rɶ\MÒH<;œÌǽus팃Ã5ìÝI v~‡sq褈“½)®P¹±F.xÕð¨ºB´QbRÞ€+ 7ì&Ð:«YíŠPGQ™Žè! ÎgÀb0*\7Ë¥ÊÞrÃÎDW˜u+¶MÆ•{lår“6@÷Z¶n0¿÷kwUÂiØúºè­¿îþKÕÓ¨r…æÖ•òQ¨mA¥y¾ µÜ; ºeØ^µÁ'¸ÕŠ¢wLjF,L ߀d»@G™.³ › T$¬ô̺bÈ–f­Ô“íèf`í\Wä­—ak6Ï¿õNøì©ÅÔcÜö³«ÿŸÛ,~è×þÏè!iç«QúÎQŽ>Âÿð@’N‹V¿‹²±ÒUj5àF^J0——éÄ n´w 2ößj_ïVZþE+a¿=wŽDUÜ ö ûíBŠ–á©G/Ø´#OÉ007<ŠÅœX‚JŠ®Û:;Ü) 2ÔÓxbà#¾¬b6vÀÓ¾¸f™€,Í¥€I¶)Má½¢U뀓ºjt[· ¼ÜùÈ¥œD4Ènð¯NO µö8É›[HzM“ÔÈ»è(óaû4Yç‘z¶ãömaþB{.×a ¢Ùw‹¡Iù  Tú‹Ð(°¶W!#嬚 °dL•÷r U°G1Š *»KÊ˲N¤·h|¥þRóºäpc„UfÃyù„P@©4‘AvûÿÞ~aÕ¸•4¡5*V~/deÍó®´Wfuvvèü¯Di(%¾óœ‹ýò]>%;¿ddÔìd︮ Ê¥ äÊh±HèÅþ7¶[Àr5¬„ßÁtµ„i¡»6Eö§ÿÑi%\Xô¨Ã°…P±“€_|×G¶­;‰ï·ºNò…4¬÷—Í=õbda_ÝKŠÐc92iô¶G+SXú`H™¼]w‘‰WëÝDzÖht¥9ã.5MÔ!jˆe « ÎËê=÷m™ÉsVòÍ$§<0À¿d;ê¡Àfê •'Š^r¡·°. »Ž6†µ5Ê£ÎÑw¶Ö„#<\úIéG§(rþ7üko³hÄ9Û“?áa5ÚPîÁ¤¿'ì=3|ë ÙÓiv´¯Š¤M4àNÄE.ýJ{,rñÂñõï*uw.+}ÍØìžÚ—ð ÔMóÌõÞÁ[ï‹Æds@(ö”íΈÍ’ðÅeµÒŒ¤LØ8ëq#öîd¸}‡¯xf IÄîø Ë盵ր½ò|½´T†ii®Uþ S™Ðµ‡ó ÷ŠT£,sËÚÒÉoÓ,—~¥QK*1á·^LõíùŸõ›nÓ—ŽÓà~ôë@¿ôu ‰¾«hNC1 .Úû'ðè£j+Œ×”-‘b)½QáhE,-ÿ-ðî¹[ø4è;ˆ@W§†4¶¤$xÂÔ.%f¹¥Šh«…È´ ºI#“S^H+©›@5‘ZgF û°Á¾¨†ïuv‚ÅYV£˜Véj¿6‡óQcé.Ë…“M&ˆt…òQGÒ{ÛÜhe‚5ÓéâÓ\:4ú%ò®ý®8'òR+;ˆæL¶l.÷Ð)žÆ¥gtîÇá~Ñ`®C¾Øç±î…^¾†sH"{d")NÙk>ɡˡ@2Fg›8V–k$±ØãËTÀž_°eoïEHŠøYn.‰|PLæÝ©èÍÈëh ŸbsXH|¯dfRýAµÝÓ‡Sd…ˆE ž;§Ïª/GðL•.'k|vj¹ˆ#Ûb03`Úœ²T‹– -¼þ!XcXjIAêMìÒ+Ÿ ´p’NçpƒØ4ïUy?Ù Ûèê$¶´¹Ÿ‰LмhÉâ-ÝXkîái“lçZ“Ì z9eÉmÕÀ‚íFÙv)ÉãÝ- ¦"³ôRÚó^º¬ nbbÕk ¹A’¯`FŽÍ! ›R?t½:6ÐDêÿ±÷¦ ŽI¶î¬îðXÃþ—ðì|f@02S*•JÕ­×WŒªT  îÇÌÎ ¿© H¼õ.RÀš”Ö‡[LäÉ•q®·gh¥~_%ØDL)a¤Ž7&‘XÀ_aÎêä¢G©MáľEÑs8þЂ}Æ=e³ßQufçâ€gzÉ·£D…ìKàÑá8‚é“]Èlš„7íW5Ì’½g lçZ­¡æºU¯ä7¾è„#ÝoQ‚“á;“†”mmÙFÙoŠá)HCîiy’ÐwpFŸø 8ZÔ„¿é|²{Ø™-’rÑ•(Ç}âüÙc>×CcëÏÌmÜúcÝ[?™b)IjaÁüôŽÀ5ÙÖ#å-òpþbþ&RÛvÚæº×ÕNš$-ˆGZ˜$ìn-Ý)ë`ئÙóá~+å[’Üßp?úçþy ¿ÕMnóø(†»©AèT‡[Øß®ÈNvlN‹hæwOwuž˜¸˜,Å($Ñî±Ê6º«æj­¨ÞEé{¸s2{иnH¡å¸7¨V½Ž®›ÿ‘J羡+¾pnÛX¡Æ,¤’Ý:#-Š7x뀴ª©Ô¬Ž‘sŸ`¯ýÉÀ°ºMûÑ6ØvNdäy"ã\>Ãd‡Û½@=ë¹éL÷²·!OŸeq'ÍMÍM`à”î\$¨~Ê“=‰yœ£H÷vd‰Ï‡ØÒªÄ±£'æ+BÅý˜IìmLC®Šh™úM-IÞj‘?Lµç·ª²¶5¼µÔWÞE‰š”è:óp-¸&›ÇÅL$Æè­´ÒvÍrÚY/DÅNŠ4-ñˆCÐØé×d.X-.è÷S^&ªÙ¬xÞeE§yÁMóDI3=·•³êÀ³€dü}957Œ³çÉVY}Otß|Â1‡íF†Fj¼P³$Ý#)á”-±×¦Í-OìÎN£fÂn¤:£Äÿi(ÆôTÕ*T‡ã Øb$±ëåzÅׄõV~‹A¤%vä ­ÞÌ»m¦Ï%âÒ|aÅZ¹­8-8 \SÞàuXN«²Î Me÷¿ô¤`¸Þ§Ÿ®‚tlÊkdÀʸKªm _jµNų‡]~‘AÌ5åÆtò¬hÅêz­0#ê4ƒa MÀ ×¥&PÃJÇíŒÜŸ>…àS=&ÿ^yšâ„½³´>R¯‹'êÒA]’"Ç-vá3°ÖÈ/ød'º LSn·‹u´Ý.ŠƒŽ.™Þ[E%%ܺ«— ×Ⱥ]7ׇì.ÛŒ*aYÛÕîf±Û9ñÔ[Ëœ2Ô°+Aב½Ïç¨ÊN»hÑκrÖǨ»v¢nîèOsJhÏ®¸ùW*6dqs™rUÖN^rÌ$<žòmODž·\m@º5>Í+7Œ°J°Þr/c¢ZY¡!(‡R´¸Qg”}ÒŒ^=Ø#ÝØZfò@+}¥Tlÿ<Ð?ôo=E~$ï%á,—|Õ·£ƒ>Í Õ 'Á#Í´.S¬Rnù¸R=Ó !û„Ir);aM µq+Ô˜J¼™F#LÝ2¢3ùä`=­,‰QÑBõ¿S »ÿ¡uwÈ "aœ“­Aîƒjúä—µGË?gF¼G>£+«½¨!\8ƒ¼2 ©æP]§a;çª@ 9SñÔmÍé¶kÚ2Þ6Û’ø9ÚÌ`M õc-û~¬“ޝmé’¯É';y+ˆÄq¨•¡ˆ¦‹'ѱ3±¨ ò…ÄÜÊ×ÊÒÕÙ½ES°ÿohˆs/²˜ _ËaOQ¬#ñˆ";¸‹C…©OO’eŠañf¶®Ú^ñ[åÍÎ*NzúøôR[ ÓÚÉP•øz•U´³þ‚g˜n;½KŽÇ® uÈ8^«ã×*hD ¥]Ž”ô-šÐuv¯;é@ºØA:ôZ´C& E~Æ Kí–cbhŒ& ´2rôÔ°H@SŠI6\£±Úi°çHWnéJKjˆ¶mO1\c?¾s×]4s“¡`•Z@¤™Ü¡ùKåRi.ë¢wD^oÎô Šºl¶yXbg’üµj§„äÞZÚVÏ+Q$Þ›€:$_þ9Oˆæ²n+”·H4^ý‰vMç½³|6z$º*Wrxfs±Œê}£%dÚP¦Õ¢Á¸åˆtsùÄÁÇ ÒX'WtlO`¯D*;”Û'ßu5†X~H÷Ž0á>陸ý룯åãgÔ h(Îa–@MMÈ‹‚Fënµ¹pí_á-0xp{ûýÇ5˜H&Sw0jãÒ€ÙÍyDAg×à¢LÜVv ˆ{ß'%»ÑšŠ9A2Vã ǽ ÞßCÏÚÒúË…¶Ìëd‘øcþH˲v+* G1B°qGl€VÕm´Å ¯»-_=ì¦6ªÕ:máÌzÕeßN¦`‚Ð 6]Jíýë·‘èŸú¿ù@ Ÿ§Æ®¨2Z£Ñ¨fÝš¦Úqç…¸§îá‹ëĪ¥åf‹ÌHupWF°()^Ëô&ކvèb àFz¿A£” ç¾¶Ẹˊâ”ÎtæK¿â ¯k= $dû™f-nÚ3ú¢×QŽs2a ÈÚ:Ö]ªm錈Vµ29Zn‚xA»Šl°Ùí¡äá—]¯eûZ½Db}¶]Ys)Ið$°‚\\ÄtÙ»zŠw—\êbó;0Ðh˰#a\Jù"Z~àfs>i3¶sîXjzŸÍÐ3MßÛ:Óߊ#‡ß°,¯ -ÝöÊ3S¦]Ὠõ+qj-è¼ï W#ѱn·e…кÌz´ +æ‹ †ð}gÌîl ûȶ[Íûª¤3²9Æ$8ï燳袱Yhk®S’úM¶-Ÿé¦Ê^JkvSßjÛpÓ<ä!('kÍm¾³L¥Ô+Z4oDÓ§¤` áFXk*âlM'-„æWí–.`‘À¬öóƒÄ·ZY¸ ¢…Y0â{Iƒ^ÅI{÷æ«'ÃSßm=¨rDÑ4Ÿà²ðŽž¯-Â}Áò¤d¦Ð-Š 5s¸®Vš-ŒØ¸œ[±³“fUÛä>g¤uÎÒ’¡v·k8›˜P7ÅÈŠ£Hg)ñŽ³çª¸n°ý2Ñ¢”|¥ÏíñQã;î±°¶¯;<9ԕ㪘øNœôE¿ì^ä*¢iØEÜêAí½ züš…dr’W“U‚E’òåw^.«®t',6žÏÖo;9K›Îï}©òj˽ˆìï‚Íý¶ÓÇKÁõêž©ƒ µÀ¿I½É–)K)WåžrØ < 0ÿªsæ>NljtºŸ[d‡ÍŸUzÚdÓïèûþ‡žÑ?ôá&`Å‚H~VŸáá¹1awŽãɪÚ_Ò¶Ó^ۛɖ½ƒ4¢Ñ3 (tÈÑÚo†DK×dî´uo¦A”ig\öù@î/Žê>·µy´Úò ª{ž„„]‚ò,âQº®t'²³k¬ªµ_›ñëYÊeuö幨ú{¨²nA —«nöü¶=Á™RÓe¡‡'â*fÈŲT>l=ÒïN×|ÙZ\Z·emö+U–ŒEj(õrŠ:³ý){È}Œ6ík—-ƒÛA”ûl;Äsd„BqTè´Ñ„8n{­‰¬Dˆ—½ØiõÉ¤æ’ Á¾¬œ ˆê${ó"s,W‰Ô.Ã0½;¯W¾Ç[x&Í3EÏ>\e¸Ò¡ÚJ cx Å]nÔ>L4 vî}!G­4Á]»•ÖJZ·§NkÉc!Ps % OݼƒËãËŒhæy-íšÛ-Ø{᪸¡Œ¬áŠ|8[%ªë’§/RØRäq³‹7ìæ;½UÅTzl!·²¼] 4N7’CÝ>DТÏ꫉oÛZkoµ:B:9ªábœ³–®i×¢÷NâªO­Ï¸Nágɶ匙&h³êL YCÈ",ߨ++·Ø1Ò ÈχéM;Ù•’•m_¾ä^U!_Ï«rÅ4Þ¶É2é¡[rº³!Cä ?ý†ä&ð¯ÎL;x³ÀÍòxè3‚tªµ ï°À[éDúg~s©Æ<ùNýjÙÞö‚ãú ð¿Å=Œ’҉ά®GzÑ`Žªñ³àt&C]” a—’€¬<‹9j‰ÈÜôNÏÎízfA<ªÓë-Û#—h ^ÏsÂ<ò]€ÅæyضZÙY)€tòHðhDIÿ½I‘n@$ÿ7ý´¶þËMÙyAiZ$²°¥Ã…f)‚±ì.þ„G#íAù¤Ó¾¡LI;¿ nÚU4EírQ øKðÄy0Òi‹Uêž.,x¬¤*!³ÞduLµêë¶…KíÓ®<º\êv¹?Àïb¿ÍÆö¨Ò?ô—<Є«ˆ¢ MÄXK¡#ö]¢ŸTYs³²Ç"û1Ì^Ki ³Ç1M †X¸LËðSÛ "‰¸Y°-*ýௌ^ R;'ñµå )“­(Nbjš&(+lƒ7vçÂRíü ß·aSõÖÉ6=u-v¤è…©ÆY»O¥˜ ^²·‡&D«y] *¤=~Œ ƒÔl²ÏË k¥*º–£-Û8Ò~ôÃv¹F*qLs˜\%µ/VæŸÎ?ï®UÁv¦RÚ ?iÍ·,7éZÛ<éWNÒ/,¡-1Ó[…ýÎÈJE‰Q%n ;àcѽ!¡r)“`%9O.R(2¨tuO…_™/ئ»n=Àdg³Ÿg~ÉCNÜ€PÓ‡ˆìй«¼½Ÿ1m•+!‚F5Ã^“B£I(X¹³¼ ç£æ »n›ƒû½ ñ¢žé•&â€I³0[Ílà Œ’+6¶ þF ÞTbÊ’¦ð„‚–Ž>ž˜š9£“½_LR3°â¡l;Â3€ÐþõTg‹dŠBŽ®p“½fž5ŽÓ$±8’­Ùv'ÖXJS… é1| »ÿÞsÍ,Ô¸ßiÇ®Ø"À¶G‰uü„%¹Ó{QB•¶v["ùîp‚Ü'fÆöZkbevUIbŸÙvÈ]ž‘+©›[F¿f«©’,ë‰IÈ)v(†ŒšC˜̈ÞÅIÚhû$‰êúBšõ¨ÉRéÒœˆˆ$„)±ê9,$Eªm$€I4Ü IÝ• :ah­Ià"rtÓHkÓ(W«®l§´Õ±(¤¯Õ¶¹–]ŸX½ÀlÙÅ ‚ ÝA2'@É=££…°½é¤ê2v¨fw «ÆC $jžYà–¹}ñ@ÿS÷oÞÊ„é!Lr`uEÏÖ‘ .>ǃÄ}zpDÈþ——Å’ð]2„ðtI<6ÄxóD}ÐÒ{-V-Α=ÁÓ…7gË/¶dWƺW* ý ö¬ø<ƒ‚w^ÈUì ªf¦hJ_QKÑžä$(ô“G†ÝB¤ }ÙI/Ñ×—Þ.mâļ½Ú%\ðìPs†5½qÅtú òÔAýH Ü­Ma½QeŠDBQqÇÀ|Гq­_¡—sñv{LJµCcMðQÛ61TëõÆCy-—Ÿ¹ÛÆð-yº-”×0;ï wô¶H9P&¨m2·o¸ªªRlÚâ|åÐëg¾Ît»žëýÐ+/Âùøó‹øðøƒ§keÌ#w€öÜÕRÍóY(…o=AoѲÔ_UGÆûó: ÏòÖìøÉ;HD™oÅ[”2L‚ Þgì`3 üÝÅ{þò>Fƒöç·«[læ>&jƒ%žQCYW@VÑ${ÁÑåpIpH@.¦x¨d«î¤ÁžhT${ŠÓ Ê]ÑÔè"9Ò(.ýuü-6¶ôŒ÷TþHÿ<Ð_ò@“vâr+ƒJüÛÎ…iV$ë;ÙÜœ†B ÁRŸf4¿ÙN0—y“ò©hûÊú›êÔªÊHfOv…Ï4ß;Üã8©õ³OóZ›‚Ñsz0ƒ½!ù×d«¤’ÕÿU«º’,mö ñ¥Ù¦Qá.I©Þ&r%’¬€‘ÏH·²ÝÕv¿2ÛŸ¯VÎÙKìbàä|åÛ6!±X®\¨ð…æ)þb–ÖÉÖ~˜ðtiv{Øp¤[Fq)\i“2lì“°ÙÂlÙꨭÙgz× ÷âLxb˜)b‘{ZiðvóŽ z”“Ýy"×ý¤cf/[l‘MüØŠÙT‚Áâ ï ¹Ó€ä•ÙÚ`'…ài™`¯¸âñ:Ðãôà̓|J˜nnЀ+ÑS&祥¯ š¶MÄBV—HïÆ÷i[B!éegGïîuEßä«?"ÃQ\¨5‚)à¹ñ†×<­/å–ä1§¤]Ë0í[‡3^&;Dj“Oݬx.Àšm‘uÓ¿ÑÒf;ÿÕnÚ²rU«ís´ø  o©ÙS"”~–‘]µþ5Ývª:÷÷"ô=çHW10¡(Óªc8k§D.ÂKEûLáYbwnÑoØ/Ð+<–E#TùÏ!nÏ=…ûÙ‘5®Oó¨û-€9ë@ XÔbîºq³MvÞ"s-vª¦¿7mè•vÓ#‚s;þ—Ùív’˜]¶õ¢ö(S©T0µæ&$gX½ ‹—ãÑée"¹DÍ5·>ø¯Sd!-¼”íãÍßã…=Š®="¶&õ’eäµ—'íM­¨²jù:sù ´)G(;ŠVy”Ð}nΙæ†]ý:*w½óH‡¿ý‹Õ1x{Q#p,|¶s*HE»ÃŽð\6Ù{^¡È|~œù5o“éõehå©|`ÆPÉçŠþ1ñ­›oîüú3Et”eS°Ë¼ÇËùÿè¯Ýþôo>Ïtîyý ýó@É)hJ‰ ³²À àH‚Ü üÒt±ý`!«sc¹>´øcaBµÂÕµMhÖÔ¸Ï"hŠ÷ Û¶Œ‹9Ñ YiÆh5ë4æ3ƒ&¡ýÞ5µÜmY¦÷5Î]y·™±ú½øSoÌøsä²ë¦?!ccuL)a%¬¯mµ”çâ™O«çÅbÖˆ$ 9àŒ,ÈÕ7Æ#=K/ÊÅPéd·;$iÄ\6ÍP’ë!]wWî-°b°ÁJè,ëÛ[M‹|u{zË“ýàXƒè©Vc_!"Zm{p5Ôð”Ôª„³B¦Uqö¼Dvíö6%ˆÔØNÉX†a¤ÃÊy@(0œERÈ ÉêÀ…ó€ú‹ê(øZ•YÝ1ÁãL ½°Â`­ž]Òoô–öȦì@•Ö Úê ¢Í€™á#¶LÂI² V*$lH_AùÎV<‡ `A[‹ŽÀ˜ÞèîDh\Á‹ dP “i7'ˆvÛ<Ó:ˆ=²NÂ1¡ ï¹E彺MäjïŠír§ý­šstvòGÎU”ú8Øniû¶,g~œ ¤Ð7='ý|ãü¹íw÷ë«ÁÞð‡^§´¤èà­`¹iû¤:ÕÎ…š,hêÒŒ~xC1Î:Yqg<­"•m <°ójWÔ}Ÿ b“Ö` 7: j¡‹ð Eoè Ã– h?³îêàmŸ˜hž@le²5;ûn1ò&2Š« ÄZï.pps'ÉF£iu`»EÖíÊÏW7kEïvÙÉÆ‡±š«éÃW˜Ž<òãuµúÖ0"¨S´¶[ >ã}á¾ã=_(ÐM zO™·D¶þòm!ü{ø ±=GËå ‹©s³5G=ëtÛÇe§¡ã#ø¬Mu^ír°'•JìÜV<ºrà"i’—߯Щœïn—ŒêkYÛôÑË4ìݾøU÷üî/`Š•˜tÒwmÍ~ÑSÄ-˜P;¿zïwSxc¶³þú8«ëüÃío°±=#ÀòIûŸúKGlÄ?ÚrÜl›]+T [T|Xp׸€@) Nµm›÷û†#ÒW+ûHq¢½iô0µ ݨÚ:†U˪Ñf\HZ#µS|‘Ä7ÑdÌvë ÙÍ@ÚÅ¢EŸV©f~Áu²JŠíœžÛ¡gbÕ¤ÏSL&.ÕùRѲR¢¤b#:Q¨¬sÛÆ·‘˜*Íþ’j까Úìge`® ´ÔÁTgí„u²ŽÎ^eŒ3·ƒNH‚û|ÓŒMy“­Ú6bõX~BL q6¾´ãlÝ ü(uŠ4llâ $œ;ìù"©•²UAšÚg*C)ÎiÈskôýÄWW©ÝPBH´xÔˆ[Q«76I;&ÛŒÁÇ=çŒÐç–€Y1ŠÕ•Þè%Ë¿xnI2Eå¤ö«U–ÆY_Û»$—~Y£‰Ë>tÿ“ï‘tùÈò  L¯¶ó,ó•]4ûGÞÜC »âDu§x8 ñÄy'ÍW*x"ÈŠÅóàœºQ1h¦NàEóç™öç(ù„•`ô#ÃÚJ¯7Ú¹ˆG Øt¡K°Éç}#w”‰ÞP¹¦­>žC<‡-MV¬ÃRS¥ƒ¼¦j”àl‘Ï8„ÜqZ>Úüï¸%öƒ|¼QÂ÷)ºEk õÊLÚÂçòˆ ì/œÏíL@`U\ž!ìéå=¼ÃÝèKWX9Z¹«0<½÷#¨ »w'ÃÉÓej€Œj °Ä’lsHÒˆÔP3ÉÎ6É_§àÚáyÇH4Åüô‹“õ4¢Ï·G/¬ɽLO­rÚ‚›µ½,¨Ã® «5Ë–g²Ó©ÒÆÝé~ô§ó«ªù ýó@%Iû€¤½µL¸:ø¾’YˆZ1J@J$jÛfkWú¡Ð¹2…MÓ~Mºbw­  ®6{´:ú9¶Ýj”^¯´T)[Ñš[㨇ÏG1<£;ºÇéñdë"m¾ Yž ·ø­ÿw)ÌîHüEȦ¿KibË]ëòªÉúëEÉ —íBzY‡–gC@9Û®g•™øLI418så1á–= î8¥dºI¬çOžÅ…hyöŠÔ0#ÃFƒT3¶’‰ûØö7 7-2 ’’ÌŠvP©XR•§b´m§º÷¯†á'hôWïGú7€£¶Ò?ô—<Ü5–À£«ƒTºÓv<¶L2r¹ÿˆ ½ùhVfIŽÁÆ“m¼µ:NÍà‡d'%“§P@¤B­M¾ÀTµ/¬žçUÝêþD¬±|H /†°$ÚÛ5î1ö&Þ û¦&Z‚ê$wû™ bŒöú¾µ×ÛDÛäU;›üeé5ÚxYÞdž/аˆ,U·&« Û‘Ž)Ï9I•fX±mL 㫲Ùlƒ8¥eÙµâã`ãíü4ÙÖ'[Á-ï“z@öûÖ°­Ú:NH•¤»aÔ=㨳áª#óå•{&ÿ¢NÚ˜ªŒy <$91kœ&aôPšlUòÄ;µÂ>àMKžšEÛêÑéçÚ'ítõ¦gµv¯ùÅw?|›ÅÖoÇ`S.èÆÎ}u{‘Çå=ŒõD×ÁfÎãÝ' -loûæ~œ'³9R·0ÏÙûO*{‚Þ†é{óxBªZ 'gJcƒ«¥F¨Ês]bz—§‚ï‡ü¾Â‡½1²òŽ¥\Òˆ•ôJ·áâe>ß[ò‹m•Ý•m"©þÚ P7çzwE‹‚zô®Ý ȳ£‹séB,Œ—öfgÙÚ)v2ÈfI)kŽ*OЃ Þg&å–×ã?4q¨ÇŸsÄîGlÏ - ÓèðÈ“3 ®^ÄuÉ…ôŠiØŠUe—\̱gM§Çl¨½¤2RW.²†aI¸&‡[H¡Eˆ+½{7¨z' Œoì5ìê“äsQ‰"?´SU¹D·Pn‘½{ãeåjÙ´ùÜŽùoýðms€¤S$OL Å”Ðã$ƒ—Ô(ÎöhIyPÀ¹¥^é e««Üï`LC¼gÖüLéFˆ)1xM–•þÖ«{n³°‰Õ´^E‘µs²ÂˆÉ€´¼“³öalT¢³d/M½%’ëõ(g>óÁ¶Û5x ~PFC*èDÒ ™`>R¸M^¯œ“õ*ú²l8^ÌÓÞZwEZ¥b[Ÿt ¨í˜ÚŸÏxZSô® Šù{Ê·×Ý»ú_2¥ª¡gW4Nòh "Â,Bš4«¾TøÕPy L%O„”Á‹nèóꟄ”äÖœžÝƒ/@Zº*½¹¥¡{úø ãÌ9çý£M"íµ[úÜog&’ç íâôØÅ.Sðv9„_£}$ýTVÕR^¡é!ßô¿ü•³Óùêñ xšBî•Q00¦ÈM1[ßñÚCPR*Ò†z†¦=ÇY¿<árÿýèOÿæò!µKyú*ÿß|¥Ä¯ÖH©Ëaûô¼Ä4¾ú­p»?|û£èß ©H¹|Uõd¨l{}“‹ ƒvÛ;‡85Ðv;õŽ¥P ’´-’òMV”ùÄìI¢. â4_" ½Ùþva }ó®Á‘dbﶇwæG•l ÞQ‡šÜEN]O[êû&3D]íy3ÿ_ÉR¨†é²/ ·šüŠT#$ƒ ÐŒfk~†XƒíÐì…‰›éh©óåì¤YŽü,j$rõ› -É£L…y®å„Ân/®.Ϊ&êã°]¢3ˆíKÅâIš~,…/…q©=a/ß6Ù}‹[*§=u.f)Ÿ:bÜÕ–ÏÍöÌæ‘úLI£>û÷ÅŠ÷ɶ™Ë~i…¿-ºT³52ËtB ø6µ›4òã{‚k…¢Ž-®™jM¨û®¦Ù©S^äh»Ïçö®>Àý ³;5âlçUµ7q7)„1öÄçÁ-œ¿Ø!=Ø×­îlì^ €$³ÒÇßñ_l︭0>:<3¨JöBvvÔô<òÌén¸Š÷“òÓ=r1ö:{–è³€ÚÚøy±‰K-Rvg¤ŸnËûP¨ò]DŽS/©8!‡P4Œ¦u®c[Se9KÌÈ"d«>ÛªXYƒG÷Q<¡é5>„Ÿää—’ílê#Fig†Û³h#ª€´:]ÉS[×`EÛi‹¶“Z„ê!÷hovM,·wÞG–ú£ÇiÈz¶ë×`=j€ 4m>oÄ=Û…Ò@TB!iëB©“ÓìÔBµã µ&³0Ôº°\ìUiÉ¿›â|Cäð.è‘$R'Xâ´Ìqè\Óטߵˆp[˜‡í´;OÿÐAúHÇô£‡ós~ÿxqL}m‹¶ŸRýNÑ’ÕqÛFïèKµöÅ´®ß>ìž¶Kûª•/««ÀU…¿ýàŸ›yZI{- Òkú¤çiט¼m4»JXg*•r¿«)óǹýã6òlAÑ=̨â×åÏ”úø•¥çO=¦¿ÁKûçþh2$£L/¥©kòн¸S0ñ§Çr3ÕD*¾˜ç]È‹‚Ímõ—üd'Xê€Ñ|ÀjΘ™Ì¶¯Ç| CP [-„%ç©j/€š,#ÇSðlRçEV@u¬ê YÛ*S&rå¿Z< º:Ýœ )šýü³è ,ýdÖgëñšm—=€&Ь^.5sÊ0K„7E}±Í(Ûn›õÒ®eÉ À§ ž'¬¹ã·Èª†²dÝoÛíik%—ŽiàYí)_í°=á*ëd%¶loz,œ…t‹J¸Dâ…×kØ‘’ ¤ñcÎb½¤yJêiUô1"ÂÈnÚR ¼dëROÉñì%jÔ`P ít¸F—MÁa÷Ä>´à·t]oü  »tzí4s4éвËk’Íp°E±Ý±}{™ÞqnXé3®2H yQ˜–9­¶ÐŸØÃBcÛá1sO®îÆigsuîHyiØíÅZõ!fXJω2œ'nç,³g .ÍvN­²Û±oä7Má7.6/2~ªm+KJ¡åþùVÂP«¯!©E­¼¦DãyÈ/@ÎîWšÑX{ZiKuXßÐа¯ÈØX¨™'©§sÇgçDW æ@8G䀬OnÐC%âóá£8î}ø‘1ñÈèÓpp¼Þ¦~¦yX2좠æÂ˜}taØÛ;Z¦¦â †±sØmé9¬QõTt’¢åU1ºªá¡/üZxvEÛ™mç­&z »˜zU ­So¯Šxë—«hçîQµkظI¸Nˆ6½Ï ߢ6<Ü‘gv¶·èT*µ­ö‘Å›7ìÖ•tNŸðˆ\Ê/œw¾Z?5ì$¶³8:paÄ&€´û¡ÓÄ0ùuó;j˜>¡’`̶)æ±ùˆÍCW˜ÝX @`Úèm!îßÃֲЂòäé—7@JO{þ´Áü÷x=˜ès[—ĪôK¡ÿßbc«~…~’´s4~Õú å÷7Ç€wÀþ—Üþy ÿ_>Ø,ò«íð™¯>äzQ¤aS— ;ÆX˜îˆ¤׌Pño°oÆÒÄΉ/œƒ8Ìš¾ÝÍ Ó1ŽÃpÓ¬À~(‹Ù2C¡ÙèžË\Ú6,Hèà×4ª­/[;¢Ásª)Dh¹müe0ôôPÏwÅGti奉q•J¶ ‰Qeø‚øô1$D3üpãWÓ°3NY#'íZK²:×M™T·Š/]mg½=8jžßÙЩujd²¤ÉÙ ßZMƵÏIÁi“©œœÏòÙïõÛMlÁ¦ª®’;’L¬UÅpÜÎÃÈ„§Ùf¢Üxõ’ÔïRx˜òÂ4,pD7NPWäóPà.IÛæî¤pÂøèåãÖ×ûaê.ÃÄ¡‚ºNSLRxý8zð½Ñžp³Š·Y.]uÿ‘ø/îÅðçíL¿IUåö°4TÇ;¡z*ÓÎ?ð"æp[Š·×@û «>s-vPë7æwµÄ‘è#;ÿrcG@¡§ñ3bZöN4£ õKƒQÆwÁë¾iÅ]ñ+ ÉÑS5hÏå²Zåq`óÙjƼîòV”#6ØGžLâbþ…SCùÑE-(išìï7¿D½Ñ×j h²*`Á™ªCéZLê–ÝžèÇ*‡ªT<¼j¾ Ò£m…qÖÝ—)¦rB™²áò o ef3#?wÐ9@ZÏ`în¡°ÿ |œ÷˜+9ãç vÏWÄÛãí5Èqrœt¶Oî÷rê2€TðÀ|ìŒB^FcêÍM ÛdIb™Aÿp¹l¯è,¯úHë+Dó‡lM©òÚäéáp¿Á=þ 5F~=š_ÝêÌKà8J¸ŸÐÆßbcûòç(2Š|€Qzü³CÕsK¸ïY¢Ïô°½ÿá ý¿ù@2fÓ¬k÷ü qŽ\±ÆÔÉ@vÀ•þQÃQõ܆_KÞjpJ੨͢N ¹jš2‚æ*iܾ’½^ã*eÛÚ;J(-’Ú´¢»«!íôÖ_°Zä%[¦l=++–ErºÔj/²*š­gÙv†Ìs¨ýŸ_kµ§¦²’ZË Ú;CAfUj>…éµÄþ²0 a;ç1ßy+²ë¶Íÿä HѶÒ+TB…V?í¥Zy¥úp;mq–èYtDÑ‹7Èì¿öìíSV“é …²yÚº¥ùÇÄ£ôFw}„}¼ÿ~Y낾’P.ò'ìQì-³¨NvÜŠ³]"]EæG½â ÏeƒŒƒ´Ê6† •0”-xcUG N™šˆ Ôòµà“!/QÐ4t´]Îïœ ´r v\.å`@èJØš_$×À£` gÚ':ã¸å€@Dì½S¦Ñ؇:!° ßgá\HË#ÖŠ6Šþ½£cGb¹ejd‡ôò[xÂ5ËÇKÈøâaÄí)V¿àX™'¾é\ב!#5þö’j>ñ0m”èf‡V.V#šiÞÚ§wˆ¶}gø{y{IÜçÛ|ºCÄ÷KÀÒô6 î 騸Z™dT7ÙAÃÅÓ×øÃgèHOï u„ýгѡÊaн3±Ÿ««9 Ðh&ÅïüwµÝ×M¹ ‘¸mÿ..M­@ÞÅ^h ÏE\¨nºÎf׊’[-û¤68µÒůá6Îä“<åï‡'®Iz`‰@VC¶>¸ì?ØFP–£ÇÉû×e„øí¤qôìÒ™!ißv¨®p>*á<) øekäþ”4¤6]wr¢¿'ˆB ÚžŽ{xÒ;0û‚ikô™Ük{ã÷÷±Ç˜øU{ °‹¼HPÁn{$û#CåYgž• {œËϨ‘çÍVZ—‰pë§µ©ÄîÄ@åt[åRéå¶Ÿ®üo/ï’öÿÛ4AÇÖ:vHq+¯X*˜:«¡3è"A@îŒÙ¤¼¹¡öl5‘KvŠ7|MÞhTˆ~sB„ÞhN-«Ê[?l¹ßÏE%Ü>°  ¯\è~N`UJñº6€E+¶+ѱRfMa`£Ûgø<ÊÃZS1û¯}Þ'h:%+îÈ®fÊtœÓE{XµeDû¼Ö}ÑÖ7 W¬YM,-3y2¤P ŠnN ¶žH5F^ý¦OnÅp´i-.‚s YíÇþeJÀ³ˆûúÊz˜+ÏE8hÍæl_Úú­6ùÒêìƒ {±ß­d,Lð.¸-ëC>fð¨'alGý½+f®ÚQ°7V^vY²;uö¦ÙàÍ~ÜpHÒ»¹ †ƒK¬aG¶-Ê"3´+#œcáI€g;„²p’B^]…ËZj0r_%Ù/Øeíè¶Žq™ˆÚÛ×ôrŠ–Ð oDUl.7{`Ðö0f|>žQ[б^•[Ž):S%–µ•(Øüݪ™8µ-Œ$ v•î¶ßh¾®¾_…¯í²­D yfø·†Üô¼Òåê°„uÃs€ôK›R7Ñ!5î´}zï²fáòºs9k]Zìˆ&;~V*è-JcRþ/'£w­Ü¸l9ñnž?³2¡S(I¶×ræ[oK²Zˆ^åö+’öˆ_Û^‹òϨÜ/6Òˆ@†]ßGl‹aÄÖNü³Nõנ퉩u#l˜WÑíBÝì Ó¯A0íF9ä3“û÷9Îêv_ýÆERÛ2òar™È‘›Ø¶…жÅ`T·U¬É>³ï[‘¼§ë§3þÙFþÈ^óGnÿ‰Ìÿ¹·Rå©02–°^X¡-fü»oY¡†Èüþ û¾Øhç+¢<ßsó¶ý×þoÕOÿ/íŸú_| ‰êþ¤®ÊÎò±ƒìs5ánéÎg–«ñÜ´ê(ã¶ 5Ñà9¾l$à®õ„œju° R´kÇuæ³ZÝc»–d*VœBéÝH¨OÒFó7[“¬ßž^mk÷uw!Ù5‰R®l.ûÊ݉ ͬ|ƒH²/JV*XÉVŽínöƒ ™,ƒÙ–’;yM¶É‰óìÙg-y>¬†OØ>uµYå@¨b7õ2W¥È^ CÈ*Ë”EÄ-Éó –6’â2½£µH²â3!¿#íˆë‡5~ú ‰r)dºd-£÷7ýHúzÿe¼ã]=héöõìiÏâSi‡¶'#Fqj‚Qh¤„_E'ºÉÁ‚#sÕüRì&Ý-#Ñ“½úehê€øPËÉÁ\õö¬q,m·r¨4å­M]¼.ª”T̶èØK`ðW4ËÌÊtMlg™Ü‚Ûà+ÇÔJœÔ%}ÝÆ(#XܘhÊY{gdRȽÑKØØ“ͨAÉ7§M/µ9Ì#¾M¤”¶Þ½ªUËËÛÃyÞŒçæ´£ŸXû7§ìï7g)¥àB|¾§  (­tÖªíOkÐ&¾?„6#Q“O’ÑWiÅ€z¿Hkô‹žášÙÂA4ÈÒ_½$'p;ˆá6½M¸NôgÝ,p Uœ˜cîÓcöéA|Gr&‘ñT©t§p¤ü¢¼È­á|¾ÆT®Äd®EPMTá-beËF‘Cx‰,.3ß»Vhÿ½ñ³÷ÞÒlËÀúð’·$‰GY6Ðæ#ËÈpáʼnÏͰs˜'ùŒ¬l¶B± 5±ùYæïñ'Ûë7£·P•ÍAÞùHÙÊBÙwƒõJ…¶2H \TçWï´…Væd—£œ­íè²Á¸¾4¡½ñ^r:ö…@ ™ÿù üÛ;\ €q#(¬ö„ÝêE7éòø‘Ññ轎yŒ#+Uê•søÂÿ=;HºÉÆÌjéýœl)ÁiÏþ»FW`Ù @º°‘¹àxlvzf/ ¨„Æ3Ù•˜êÄ)5~çªÿziÿ<ÐÿÊMø*ÇAÃ2µöG=ºZ;*é2ÞÙ ¿Â9R9v¤NÔ†rF]‰*EGixã^†$|=Hó&­½¥m"]§mЇmPw T)æ¬4Íõª\¢%ûÁV·m{’;ïÚú¼–]É@Ša£8áô3weOžkªGØ3®8Ûˆ©P&ÊÊfÈà®¶vEEHq¯¹…V]«–—û™‘ªâ(W^И͹ã¯-°pN=¶¼Ó ™a9m˜ùÌ+ªot²ûef éjŠc•vÉ}½E†^—œÎ\¦"•ô©R%ºHŸìÁ'íÂ*5¹GñQ‹xÄóæïÒrÛ0ЖYRÃù²²‘œ»¶²5!Éã©P2´(’ƒÊ3ªe;_ï]蔈²æ<Q<6{Gw™Có’:¶†_ÎQ‹23(8.Ÿ€Ž§q-v¶°×:ƒHŠ—³·e`~Ú~rÊ8haN+ܤv &X 6QÆBôÞVr‡1ÒÍKX»iC²¡îKxH/®…¿$Í_­“`rk·÷ùŠuïw)¿±åôü÷‹öðù½à ÙQNÈýr•œ÷ä·n~çì–+™ðá#˜Wp<êü/à3@81 6ÐÂÀ+“ß¼F7©Ã2À~EÙñ§•C»‡è@ΓõcÃï3ÃÇOÁºÞ"ÍumwîåmeHK§ç¬Îì qÔ¤€a1ôÝ]áÃû<êdV'’½Õ9¥LØd Ê/ÈNÔ¡t¬é=ªmÙpó„ #J™_ßuuN.§.¢Ï£P‰‹‚GŽ0&ò±g‘o®•³žT3á”úx–ºoêWVÉF‘Ež˜=lªÛã:¤nѽ·~ÉæíB0<)·mß»8´‡àþ+köØæfÅœ­vÉ,—"‹#í¯ ~áùK%6ÿûe)yi¼»«úÂzPƒG«‹õð½wûëU,+ƒ ¶¨->\þ…Ø¿¿=é·§ÍzaHy'zþj6úä{ûø‹éƒR”¾ ú¾4¥¶†f+ºGš”‚5û¿>Æm#íkUøì¡FÅY!“®™âm ™, GéÚç1Îrغ±b«bUüöE*¶ª³ž“Œ(›"NîvÙŸÒ€Çvæu³•2Ëv4WŠ9eO[«˜˜â}5°Bc#£S1j5Ñ™Z³?+ߟ"Ö‡NÀÒ–‡Õ»]Uò\ÜZ)êæ Sd[`4v²õ6m®8¶Hà€´äåZNdµ=cçÒ£+³cÚ¨'ÝÂf©Àf°FÁw†°lo\>²Juû~u¨žę́óQY0’häO_#¶"yû¡E¢÷ã„\1;)Û®é%_}ñÕ‡pÉÍTðJ{¸ØÉ”9€;ÙJ§C 'ɱæ[ÊÙš¡0uC³Ⱦ¢UÔzñB aâ+§µ ´— „@éßÂ0YóYÇ,˜Ë¥l´%'m{ZdzÕ'ªaÞð­Ý¶_z7ñ6‹ÞµŠx²Ì;ùµö)fOi‹L4,ÖMmÉTß‚ø7!Òï]l_ÎïÖ*ÏC.ÈÔàÚ*³ÄoE_DjƒmÈl¬ïh4x$ž˜:7 «Æ03 Ÿ"ò^§—gäѯÇú$žòP†Ý¡Lƒ¶8Ùi‰kz4…ªØuY®gš²ª!¨ «]ÆQÇéH`ªw+yS:ê’ïùð)¨zZ ¢]v¥å`´Ø¥0°Ì/MÜß\ôÒè ­S¬.g|tN”«n¯yÙÅÑ‹61Xw¾R‚S+˜´X)péê¿Â?l£u*€´3ù^ uÆ|;8ïÀ›ÒŽ${å)ýìƒô€£‡wäÕK¤²¹Ó¿÷m¾σqØPé4¸cë^Qdh´_B6öj ¶€JÃÏþ;†_öaw8í¦bÊêÖZe¸jvÒ:^Ò' zàY{ uÝFi›HÁh <'1âÆC Ðk!ŠÛ­ }hw¿(üûû‘÷muÛ”]:Æ]ãYq~uϧ­wåý‹?êòD~ ÚZä?&àÑiÿ'0”ÏÔ»ùŽ~v J¬@“¾1™Ê;žK„™‰µ]"ÊÈMü9±1•/Ål×Þ˜š°/*Õw-øµƒÀï£/K‘ï|ðÒßà&yeKŽm›xb=QGDchQI8kìk¥G!k!ÚÛ;CšºuL$\dNŸƒ¾QódÈ4ŽQ”s{ãL¶'Ïä¬V÷™D^u *MÊ,`Öº]±£Ø•_­ž­Ûa'ða{íÜd2½ØÝ³ÚLªšì™fž¿’ 2Tòe×s–êòéÄËÙê/¿;‘…‰þí$\–TrŠþHU£CQS®¶|máuÓW{ZrgéÅæ¹$Ã3Ú„¼Èš]‘©ýRk©h™Êq`KÂ6kÌpô —ž’”"J¥HäÇ/1Zµ6æ4±lDVÐhb®¹"S^-ûZw†ÊtÇ+H@’÷sÃ~YÎORû|W] K€TêIÞD·]¤#ËÅ€Îq¹š½<“XXÙRú0Ù”l¹Áª±ã¤y- 1c´~` ^ô‚~@ˆ…W¿·æ‰UË.;dà ɇ*@\ÜCÁÜgâYnÉp°šzvdÙ ŸYPÊõéæÎOX} ž[È¿©Ïõ_]#¿ù“ü.Ë?.‰Ï:×°ŽhȰŽÉpññ#¶²t¸ÚÉbçQªvÀ˜T Úg-¼1³·`\81${Tb,z>*†°²èm.+ÙnßhPFÉ{yê…Œ? ñ驯GS?[·…+샽ptüâjõ\íÀœãœ€Gg\Á¡ûHZñdŸÍñ!Ë‚No.ûJ?¿À¬®Ö ~ÖÕK[ÍîÎP}%:[éž23X­þÞ+ÝÈó0ÓtƒÊöv’~­°Ó-}ºŠü QÄÿáš`× ÕâDHÛÄÚ¼nv^Øâ qÓJPÂcŨޭ@¼$µ§Ò³R§Á^îÉJ *¢‰fV¸ì¬j5Äâ'ue«»]×㸥…žš–‘‹¶Ó=*²6™z²+5ùÓ^Ð`%ñvÛ³»=+õnÈ1Yöù[ë‡ÖW<*!9@:¤M3€4Áëõæ·x4gQ7? M`>m @Õ)¿!&±×e[ðšT±‹ž—äó³!3ñ‘Î|Fÿ·$‰ã.Wxѯ+év‹¡¤ŽVÉû”d‚ã}寛zÌ+×Êþ¡jS˜ÚÍCM6»ÍN1éÕìL— +ÑÐuQð]2<ßë³yœ0f#ìÓ4VÀÎlFl•œÁÆ McÝ*¾¥:È$[r¦×òyÿ $UÜ1b{ôúõ•à·¡ÙÊ5jYí®U´mûš¦þ¤Ý>ÏÁ::iòÀÚÎòk,6“] ¨ïìw²ØÕNŠ_p®µ}ÆÇº·àƒÛ³ÞtŸ‰ôÚ Sc´¶•îpEzHK·frÛY Hùk:H~‘¤ù,Ùö1ÃÁ“É0K"_ÊN´Å;G=îì7‡D¿¢L;(©%@ªxSí91‘ÔAºDþ1ƒ¾<ªÚŠwÛ³¡ÿz¬“ýƒp •õÜì!BS&§Ê§¤ª5žÞzë4~~\4–Œ,Ÿcä^N/âú¢ˆÿÃ4I“¥<ŽzÓTñþsµ]TÍÛÕ®•Å “…¤ôžr{St­¢Ö6ŸšÕâ®C+c'*[ú0zU F…à .€-̶ÄÌÃ*•.•ˆN™ÒÀ”°N1ªÍoUë®’Ê PÛófí²»j‚öî“Ìó"Ó:¸À®®ÎE{]º|ÄèV³Y¡ÚÈ›1Þî¸g;Ëy ÕsCÉ‚wNƒÎt¡ ]ŠÑÕŽmf‹Œ”´O_Òû-WZÑ}ïvoYÕìaðãÙrÓ8èÕC• ;Êíþ´Š_=WÛ?‡DLlK«)Ãl8G²§’l=IA¯*‹T6²Ê„,)¼'v i¼jbIC¶JQ¦¿nøBu¶(êB~«mÕ×Äð§ÎŽü¸^ínÊíõiØI:±v!ÉG¶¿/Þuò÷WÝŽBâÝ<­®Þv–îÖ“hB¶¥aLn%KT3mZÃuñÕÊ'8›'bNÉ´½74õãm}Íñ pÏ_TºÛa°û Ú‹²ãg'ï%\_'(5š*Wê'ƒ¤W9.¤½á·®‘?ueåpÚ9£69—¶ì+þŒŽì?+ÁD³Ì“ÜBƒh…aãëu-PtÖ«9‚q€ä/ðx<>XJl´!ÀÒE˜K}ÏIþöçìü…ÇwS&ž2ö¬á<¾–Q hÁçÕ‰LÍv[Ù„·I(F©µ˜ÝžÄÓ9¥̵EßëK‰X¨À}e«ÁVò@ÊñÑáùÐm§‘Û΀íÄ>2Ñ1.aER%õÜÃ…Úöèð¸Uã[xýh—-÷^XäŠLjE/r±·3«ÉþÞÓü9ƒúðË#ùgxŽ’†)jôi:c®“è5ï$Ýc™`ô4Ã$V‡êYŽu;=J2[ƒ²}„† l³Ý5ÅÖ;Hvo.[ 3º|•‘šÓ-ÌçöHÒ¢•CÁ/ØTeEgmW柈˜-ÇÜ3²ØäVW^ÚŽV¾ŠÙø×¤¸ÚR²Åù¶çr4iG™ †hÛ H¦â`ã³c•?ºEåm¹ø¿Nã±Ýi½ÄAòyhçØtXH tÅhíëãàãÒŽgQŸè*u$KÝ£E›IêïlÜ;;js¿êÌpýj1ùù}Íä–p˜ý~«ï‹üöoÜþy ?ð@“íbÕZ˜¹Ã£ÙTð4CÕ:g WÛ¹0l›´ ¦’(º¡ {_ ¡ˆ}pÓÀ!³^è© [ùÄÿ&©D+žTs¶0]H• ™&šá¹Nï·6¶‡g[“(Û°åí´•×V~;ÏELL«øQ²¶”«ÞJJÛ‘À½4üº&ž gôª§!²•ž,PñÊUx¢p±Ò4;ëFM–9ᦽ Q«”2Ñ—)zJúÈ)×E¾-Ý9¦f¹C®UãÁl@|ˆ®kÁ£¨~:~’w3=Võªª¦)Ós@#ª­2‘LÅòl6«³³<³AqguzöUÌ ÊqTƒ˜ÞPÆS [û÷¤PVù7æùœ04˜ è5ðÃUz0ñÑKL3vâ`†Ò_˜ Š~ïUØÕböVðl:U£=‘Ž7/ÜïþÃKÿºiÚ(Þcþ<µ·¦º=éo99dêÒXŽàNÝ¢§ˆÀÃh§IÂã¢þ2‘2Ñö²¤ã—™!Ÿ×Èïþô“¤ý¹–=_¥$7vu2V!ö´™úi€•\‡eµÁ‡ ÃgÆ%ókõ˜=¹íœÔô­<Ù gĵ¥0ͼ)câ •*jýŒükQ»®}:¡Á#îžÂ¢èŽù] @T#¶6wy.Ú¥ËHcm¥¨\MÑ´%„þjÙ-à<1}Mä¥<½­ñÍ÷à iÿÉ1b ÓL¬D°ßšµ¹ÙŽ=™ØË aAC…áºâo*n)OòÎʸžf’„üPÀm©8ζ>ØÉX”tkvÓs¤ÝéÏ1r{\2¶±dœ…’­Ñ–ñYщ0M#6”ç§àN·+Yo¼$5öðw<Jó«,›Ÿ}­Ã.VÕ9:UÛ¤¼;•°+R§òÉ,üÅ'j$ܼõWt]-ˆN¶À:A·¡þå+#¾E0ÞÀš4]XêÔôÇ6ÿu ’^ªuKUk´v™ ð±k›½Q{Üõ¡`ÿZlÿT¢úתŒ­ŽmŠ#²Dj¼ÀçHíŸö`*©äM<$±‘vÆo†…&o$Å8ë®ö‡H;ÏUÿ6M 6ìù5ÞL¿xž¿H™ŠïFK%8Ÿ¿½*ý QÄÿár£È£7ù–äÚ€Nßü$Iœ+ç†N"]€}S ¾pµ‰U"Ñm³’ÊiίZáG<‰f¼TùËòH)ŠgZ§Æö<‹ —•#/ÿšÎ¢|v0»gÅÿ^m¶;á!°ÄN­¡Mm ³ÐU9Y¥—”\0Ñ/¯’ë¯cž"ÑDsš-e·íßkÉa÷š­F–¬^ÖÔ¢DïËÛf)C-mé»K0K:³úöb<,Y¬§ª%Úþ8ª›0ÊšÕï¡ R¢:HöüÔ'²E¸þâ‚×b ä²Ã4í5òØV…þ†µR–ŽåÂU`f³Øág@^‘¹€=‡A_OĤæXºpÖþ¼EkËžF%nM •摵‡ë9\ŠÖ].:n¼WöЗ”‹½t#DSVÇ-ÛÁ|EnF'|jù½4ýåÇ)òw”V ³ >?æÏgU§/¢ŽÍö­U.o‘D¼òr¢«§ÕQlM‘áZñ ˜íàŠ3¼”n1òåxðw®‘ßù™‡ÄÌñ¢~lý;þY–oL¢ÛûªIå–ÞIAR&Ù*Ær-` —¥U;’g¿Âîi~ÞÓGHm%$#¿.ã-¢}@w2Ü û4Úzg¹ ~ NÊV¶;,!Üo?$—òÛc~·B`ÚÉ Qó@Ç´sêÝ¡Bgkc¥té+I6œÑ÷Ð~90$²BJ¿ 9Iû"ÌqÆuv ¸$r#õlÌ i«W¼Ð=úúPSÉ®Oâ íŒ{.ò²Óz2Ä®[Í] r”ñÌÆœ¢l eëÚäùŸ¶k nÑþŸ3¨Ç›:Å÷<•M6)4dî°‰¼Äøi ví}@f×Õª;AÌÇ®W½–Gèø¶«hþü5Ǫ6ƒÝPÞ]ôKÂÐè5ôüYi÷àÎs¡åZ&<%wÅ€›:Ѹ @‰ïDPÛrú$™?;bË’ŒøèÖtu4ãÊã´/j¿’÷ŸnìS2-ÄA‹æ¸~ó#Ë*Ùl‰ßyêdÀŽ¿¨ÂÁ¬¼ ÿNã¨yWéá%åà#凟4AQZ|öÆøï™ÄùàÍwž._?Û­dHj›hþE$Ë¿ª³~«ƒä&Lþoˆ"þ?ÐÄdÿ® Y³]—ì/ìÛ: Vư›ý;ÛÎ+‰èæ|$œ’6–)íÙŠ¨(3Æ<ªO•E¯°{q‘´O+Û¼ÃÓUj‡§†p‰Ð²E‰çkÝ­#º²mAÆœqnòùÎ$¿9™i·­gÏnȇí‰ZŸO²(3ó¶Ý“°š6é¢(CæÀx ÔÍãPsôêõÝÊdJÙ¥ªZ.‰¯«¦W¨&àΎ顬¤¨±eXDgµô3©C#.C¤˜‘ϤΈa»öŠwàR§s8Où²J×çK]“„HM*¤ç¸!ÉlÙêà w¥KS/l¦æ°øDÅ\3© 3Jx2àp•èâ`6åÎ…Œ¹ôŒ2åÊ´êN¸Ù]=›7Û>6çÂéÉ&ÕwÇìü¢'÷ª¢.Û 2^µ É6¹iž™tP±1>y²f¼~ÁúÉ_2×é]+\èÒbx0ÇÔm•«h9—–¼/SjY,¥¥àйu™œ¬Ó÷l8‚ÛKÄn'•d¦•:ËÏoæ‡üÞÅ&ÿÏ5&eû\çïTRÈ;k:Ôó.#uõà…‘‡2ól¿ ¾ïI\:Å ^3á Ïý»"ˆõØz=)D*ü·‡ö0z®¤Ò¹iO•OuAYHC¾G¿%›D ²_݉Ιa%÷ÈmqE>hËŽÏÆî!û ½Ÿ ·UåuT /'Dmóº†>ÍCq3ß ! ºì™xÜ×Ãûs_·¥Ÿ5æ‰Åc|#j_ìèê €ä¤-ìk+Ö#;#¶œí„´óVé…I¬îθ•ሄ·µo žÅ0M"…ÃÖÑÄRk ’MR±]á+TÂkè+ŸÃ‡iNÅ^bÀÖùl¼àÀ£˜•nºû¶íÍÎ]p%iú%ÑõÕ ìõaÚX¶QžN I“½¤½Ú{Å_P)¡)}ËŽˆÊ5pLºH YÇÙ鞦Î}Cy³e0ÍÌæš·U„’¬Vú 7 ?ÓAòËÜ–;kû“4i¡ŽG]oÏã{Åô%FiWòhÎ és~MPd"vrÜýÃd ÒJß,@ÚP~u®P³à±” ´£:{;ÁàvN7îöšÆwèÒºž(±Ï¢ZðÉüQû&Í#4~¹ØßvJßEB]qH“:þý÷èOÞþy ?ð@.¬ºÓÃc´uÃ.hõ™Ô^œ :UÔ ÑÌ5ß±—Ôªa`’°WZvxÒzÀ¤y)sí;žo+žnÕ.÷³E¦£*VZ’"”ÆÚ´ u¶¯.¹Íš›S‡\¶°ý;õ%©K"çïvR]‹Jj®¡¬}϶ôªñž2m•g¥¾¨9g³ÝöfRÞ†ê=ÌAÓê0-AR5 “,ž¤ð‘æhÝþîèN†x¤b7Ë  þ_ªÒáæÔhoÌÏêó¶eÖ…õ ?ÕMìŸýí¨~j¾lœìtJU6%Q…fþæ Ú~ø§ÄÃØ¡îpÐ/¤÷ê n”ÐbÂÛ¿R ‹–àIõ­:?–΋nÉ«£ßOc*¼/WzL$¿Ômº5Ù–ù½ªª—$«ô[‰}Ø!&9I\¿ œ4|š˜Gg˜`ÁÄÖ´ªL@!y®Õë©JluËžuó›l3ím¬cÚ.WÛÒŮٟ8÷™ÑªR ½ÚQ„ o]ÈÁ>Ó3:$ðêŠn ®©ê誢id § H+o"ƒ Msüѱ)¾¯™”?SŸO~Û¶pLLÄN`Ñû¡² ³ÚAÉ­ð-íŹ]è–+twA@ª5vt â*i%‚äî+q nJ}ÐÉÉÛzÄÒU ^Šº<…öË­7—ìÇÇeü×;%["­O ìsNÒ„õõ¹2JUc äUï£Áßh€»ö\ñfн©äøÀï“@9—°áçè?tJH4Yƒa}2àË1bs²C·uBÔßù± QŠ!Ûç$jVÐð~³ Þ×»jùõ øæýÏpü*LõƒfÕ.uþJï* Ç­VM,üÖ±ŠNc[øjn¶Û–¿WÕ˜¸•Í6® ìÂDÌþ_wݳLõõÉ·t:<ó~ã¦c™Gúa }Ò50xm'ÿ…е·ìØüód`™^ÿ›“£^}ýøt.Q1à7YÏ­Ê›ÃÛç/¦%V›ï-¨åãŒùîþ®dÓ7:8oæçékÉûí¦ùy ¿èö7| ©6Æk'u›Жne'ΆlO¢ý#]vÍ®Y[Ò! åžÚU­¶Óˆ-᜽°æ»ÏÛ-ú $kãa¢(¼ëÉÜL.‹Ýê±Úï †Vl è—-þž4Ùe4 ‚V.1«VâLîä©‘NHz 碯°£2ð woõ¾Ä”º’íÙ9Ï_ôÇ…‰_Ù"¦=£:ßDŠî]Å¡¶7>v"YoîePz cÁ/è9†I7Ÿ‰tÜ_‡ytBɳ``"Ù05r‰Ä:á¡»ûùV$q¸õþz+^bˈåªz*A#1:©?£5‘´i¦¬(lG-ùéï>—‹¦n ùCØå«|9ð ÏBRB/ýÊ㽎KÛøícWJ³ éZÜ£ÛœæS~ öz®I½ Ë:”ôkç+±Ïf­s·ÜzÊ_êJ1X"ôîÒ1=N“Œþ®h7¹À3»K×Û½Jü€Ú ¯ïKüÅdì=t|Üš–âl²º“€N:»(ܸl•)O¶1z8'R<á#ý‡Àôéð¬EÏû–Ö$(±ùáýˆ¢Ò7H÷[°ùo‰kþ²šð¾Z—ëHåèÙ xåý—ˆ¡Puø­ùu»Ùþ#ÀBÖx[ÕKٲ撸…1ä,ê¤Úzgé~'zjz¶ôÈLnqëAüñî©C"ÛNÍÍÀÈ Ù Z«e_”ìE'}·s>//ûøµµI^ÏŠp'r\=Ù×å¹ÒRg»¬üPí–TvÒS©o<¹&§I}uûŽ’6îÕ `2/î•p0Bš´ðò‘fĤãyÚãè*­§=µé‡]xa€öÈ™žïm$ÏÞó—ÿ'§ýþT­ PMb µå [sõv22éaÛˆ•G'|'õRZü=ô%ø÷(@]=£¢,"Õõ ÛSʆ‹'Ì/&«úØ-îrÀ`³3¦Ðq´m‰vÝÕ?-ÛHzYŠÕmöLæÔ9Àoåd?A¡WäZqËáMV?³ýí«‹ˆ¼÷Sç‘Á¥ µ0… "–n¯4}R"ÓüE£þxF¿ða±ƒ|ÁÜ’ßùõ†_~¿ßnz äí·"ßl1ËíÙ WìÎqyMh²0Þñïžì£y «äÉxß»ÖSû|1(r3Æ9ìÂ)†Ž 'êbÛé ›¢²{¯Oü{æÄg¡O’é€dþ@ÁaøTž´]‘e4àivê)¢ã ÕÐ HJLÌrWTa&Zc5L¯Q’‚5vó{~Ÿøå„é¡ e¯<š"¬Ú±ëý²=WXb3,áØg¥Y´ëÉÙ§˜Àž=)ƒò–ˆ•_é×”àý0áëšþöŸ’mÑ”ö´éœ$áúøžqiwhÚg&‹mÃYFÍÔ{‘ÇÅé’ÿì\ºÃ0Î%ñ\ [œV2,i-šÕE\¸ µ#èÏk„§ ÄiLãb˜•|G È2-Úöl¡dÍœNƒ¢ƒ¹ã2´=9hdÉ>&‘andÇ?”Qi’r£m»HB•^H42ø…›ýúDÁï§ ló™€7=~Ñeå 4Ÿ"2ïú\……ÿ‘zí ; vN¤Ïgò5¬ùs· µsÞ¡Ý~MôÐäyH_ú‰/Ú\=í¨‰«¤žŽÅçWa‹“žoŸèÚÙ«·ó»`G1ª¢± Ÿ†uùG­Õ«GôÈù’Áôßc‚T– ò¯ÀפÞ=öÎN‰”ÝC¸(zÔ¹ÜóOÁ¾¿†#=内µÏðF·?­Ù]ƒ÷[ ^{± Ïv?ÙÀO($.JVÞ>\Ñò~yΘ0EH3)<Ǽ~.µâeþ üø '„é÷^ÚŸºý hŠÎ¯‰ê0äb'ݶãaÖY¶í3†­}—öG–·bÛˆ À€že’"W¤ûáŽÀ&òºyP¾¦¥"÷ö.Ws¶¦dÚ-5 QjAS .] y±Ò—7ØNîP­ Yµ¯n¿T•Pi¥žÚAˆ­\®Ë„Õ¶ÕÒ»Ö»C¿T­  Ša/”!PKçRì¬?m÷Ι´*îÕçZÇ#‡q Å)ä)xV†BÛ›è°Ó̼ði1hµÊk ³ŸOôŒºS-_Îe áÀ?JШ€ƒöàuûí—{ögžEù6ŸóÖh‰ÉS{«_'ÏEÅä•p¯Ò@6Kn†ÃäóžNŠ*oIÙ&Ù‘¿²¬5“‚>Âz¦àÓ´NØ\˜7%Y÷µ/d:`ï !TÕpõ¤w”é]Myý3•è·Oí2;]éJ>}^ªn†Eº]•<™Î;S³7OºÝæ¦ì¼©–ÊÐíJö&Lø=¸ïýÈ–éåÔsŸñžºß D¦üŸÛóü%Л‘ÿ«N˜iÉ.U _Ìxöµ€D-Ú-Rê"ït|É×$K1°ªh'dC?W7åûçiÅgÿ†5¬:Ñ@yÆžû¾¡x—%ÐÙ7»êˆ…öžÙ†iõ-;E ÷Ï%ÓТsâPo¨áu‡YæˆôÔ éáül@*už\é±y£ù|ǵ;R´„H¢ÃBš©µ2ôì¦GL«Ù¦|úü«ØD0ÝÅJä µ¤&éž´ùƒþlæÍN VØŸþNC£¼fM-ÕpšY¾¼¤•Q–=÷æ~ÆZ°¬S4}>1»·½Y…2‹¤Ý7C¼¯§ã$éúzh»qѽÙBò±d#G»%Áì,á[øèÖ dÛW‰†¢ÚC5ÐÎ=“ *KÓ×Krn7wlð‘ÚÛJÑ(A(â4€tz”ï7¢Êï^´¿u{|VC4i?bô‡™fžiµ8HOÕ—Xâú"Ó<áÍÂÒfëtèNfí ›&kôíÝÙVïWÒZ7ÏO¹˜`žAúZ€À=®5ÞaØòØ×0 mÑdò•3^²U¯h!asYñn—Kºê~‘xòôN¿œi®§|ÊV¢ä>nÛ`0ã´Ò½æÛþ%Üó<{“V¬üœÍ G•@µ÷3mXžãïÑòÖb·$R\.Åvšž•CpMIižŸ©WŸ‚À~m¿‘œòyûâš¿ì¦ÐHûl]æsr °÷G,².™èö²¯ZqQ°k¾äo‹?pÖ’Ô;Ï/  -€âªkŸµ N¶’‰r¼Àáé°h_c‘1¹b²'Sý£;•~ëü‡iãZ]NM3çpãü Þ;>ýé¡­QŒ /ìÊ/ÃÑÉ¡žhТwT‚ ’ƒ+ä«ñ6ÅR §¦z[Ô¹<ä ¥Y˜-ö·„êì´>^3@¶cíSüµÓ'':·Íऀ!:]N”×<¬ÙZ Mpyôý5¨ÁG¯mP “iÝÔ¯ÙHîãÚÏŠ’N6$môAQ¼iA1ô®6è|ågòqÙlgÌæ¯ùHâl+jD:˃Sñ”×:é‹VŠ4»Þ÷øS`Û°žÏX7ƒOb2ë‰åk€¨ž(XG=ÞÞJèÜßÛ .¶Ï€Jö…-övìÛ‚²jÙƒ0tàøh5©Ó›bv¦Ø1±Áw“]„Á„]\¢%ÞJŸf§ 2Z³ZSýQáã~–£ ت£‘¨Ý™9\é88uJPédp`GÇ®[Ï`O}ò#Hÿþ~ôÌÅ[U,äŽm)©Ùe°lÍù>Ÿ¥lÁÎB7OÒˆí3É)flš'þvfÚŠ¬!EÇØÊ`»,”¥Ò‚âµsÜJDÏå9ïtF5ЮO“õ¢ëÚ™9ïQ'Ìœ ›ûW¡øSÛªäj§ Ù™LÓéÛKA#û9…dªÎƒ½ºë¸NÃÕ†“â¦jDsoMãʈ·OþY°ÖéézGŸ?–Ó5ÛRkoìŒùÇsˆÄšy²T¾V˜¯,dŸn*Ÿ·ß…HC\ó—=ÐDÀ— ‡HÞʶw *ÇŽ®i¬ºX ²‡+–NÛþìOhÄZüUœ#öKï…J¬vܵ/lìDok8 ¦ÖåÙÜ’ò +†¿7¤ÕÅmºèΜØ']rË..EÙyè ’Ó  T„¦ÈµIwliµ U›DUfê {&G—87ºàï¤JÓCs­¬CªVÕתVO¶yÒX¯îXoߥa2Põ,w»(oÕsöÌ tyÖì®]¶gºt‡Äø“*óo§Ú‚ÆÓuA_žÑ?–\ú­é éC àÿ=hܳÕ;5\´þLæ=Wòê"VE°(}”’Ó^¹Û±"ãÖþßÔÄ7àU»œHÍ´KóÌ5øùn:Sà$í9CÞlö†~‘aƒs»«2r×eûìGÿÞ©½Ûås|$Ÿ&~5íRÆ€=·$ãbÛž¬~¼Ù¥›TñÔ`¢¨¯é ñ­žò"Û+ ãŽß…?׿ö¯ŒJž•ä+ïöé5-Ñ%üvû¤iŽdðÌöh©0/øÅD>,$–é#ò¿<LˆÃWé2EþhüÌÉ+±=º0lnŠ÷PG$i†¹Cðm:{»fCëô¡ºÚK3ó¹³.ã ’à‰WÒB´çs@¯@…™À2PA‹Bâ†q‡xÐAÒÅ !=¯›D«¶ØÕyLt±ÝÒuO‡»’º6@æ•Æ´èÙÞÀ@J@%1•¤ u˜By¢i'†ëŽs1¤-7¡÷&Ã~ –ú¸ z³W¤ÜkUux9ˆÌ!|øæÎÑjá0éôZõmDŸì«zmƒ®„°ëÅ~ŠdÐÐÓjÕ'þ>ª¿6:8K°:³±+8ág)Ù{¹<<NžI¯T¾´Üy 2L©&ÓVJÙ®2R=nÇ@<¨›- ÎÍÛ6gLCÑK+¬¸ïpf’Ýö!­ê÷Å ZÁüQP½KÏŸËbÓˆ­i¤ ÎÏôaMt@ßþÒó»W»·Ûefv^Þù}&I f¹Ù™mGF*å[Ë6¥B.*¡¯ÕÉg=¢|ý]L¯!èúa rL‘IWÜý3 «3NžC=«{ó¹J xØó²ÝèB¹³Etr扰ð Ú«˜ #o2¶ão ÜÆfW‡=š€‘Ui·ý÷°¡Î¦}ÔóVΤíÂCÖ¡>Þö„žµ·´Q|ûúó@X«ª-$‡ÚSÉþ¶}f…brRœx+¶B¢™ëxZ‘a«£í¬‹_CŒÿ‡R‹%èid7 ’ôGÂ+êŬö#CÞMF%W8+®2)dDpc"di•ÞŸ)XF¡’]ð’;M–Mc•æ»´ ÁAHV9­1ÜÒÈ/Ç„YḪ7Éq–õ”-¥@oŸ ÖP·‚$ õ’Ü0½ÔA†åQ Èõ2‰‡Q¯®êµo¢Ü$uJŠBÊ”³!ò6t4äUƒµÊjÏñRâ,s2\¤…´•zVi˜èå\ºÔ´eÉåƒvkëîJ¼üQí|í²Ö[í¢Ù5aßeS¦ž­B(½ËOŸÝ–iӯǿ¡bûøâ£ûsÛ)nØfÉ;UuFé,²ží),„'&¦¼•Ñж•_.LóûÙ£ˆ@R¾ÉB³Ö[ŽÎĶò,s:§ÕÖÈž‘厨].7!x‚25>qB.éø™ýóÍãæ4ŽTÖí×Q«oËÇŸý%…ý˜ì4˜H…­­ÓšìT}œ˜Ô¾°ÊÙD¤‡fóø2!“=Ò=ñŸ­mŸîUçñu«?À©€µùÇ)Íâk©”è?v2]ËôÅ}í4½ºœ¶­ÛCªC™) Ç÷EqÌ·Â~íŽ%:5l‰F—b¡Xž™Š© 4¦&´H¤бWéê ²ßvý-¶~g€“žÉÀ3éÞÜ/iE¤¦[ÕmÝØ ӨᓠÝl‘è¶]É Nk¢fœ¸ž\ÐJìtžÊ‚wŸö‡Ù®™<çÚ/™Íد®ÚîìÃ*%FÛ@"|mÛáyÉH²g`Õü9ÎÓêw¹ŽŸ¶W[¾ Û[ÜÎWm[Þ²­Îëbw|{œøõûóq˶ü<„G£ýYç tv%Q ©“S‹G‹¬›_Þþ†¸æ/{ ){3àá!I²/gèF<’,Û®hX¦ HpÁE¥\$x”‰¶’: 7¦‹r±¾™…é¬Âh|]¤Íp¼ÚVïvEþ”<çÄé|Ô^‘²–-uÝMDíCRå× Z€k39”Þ˜ê@¨,iù¤€9IîÅ2X«•®·œ©íÿâ vy,Ðe$ís8|æ±õg‡<#„U¤†$O½2yMö· ‚Uïí*œV<猿¶^p5ãjQ ¢ IsÃþƒ¼ž5Nã/wB·ö9²Ã§O€´¼÷._ïÿNˆ›ŠášÕ Ò¥ºJd¦JI¶­bÀÂ軯?8??ô&ÕÖA Šl<•÷";tžÄalÉ+=½BÇmÆà¯r.Õ`&-b³K4®`?[6dÞíú¶7bzë ^_!E+,+Å!“dó VžIoEà“ký¶úÈVYE¨ÎÊME¢h¿ªÎ7vb®èáô¹UÉÛ'yfÁ<xgÛäÎ6©ý'ØóõY˜¬‡Rdþxn/ìt[}qÏ‚­&ÎR§û«cÌx`1ÝFš nt"¤ìܧM«83”&ávÂbŒ PoZ3på`ÒãœëÌÁ®¾ák}nË„Ê|}eo’œÊ mií=¶ï-íö<öÀ7n¿Tú'¾TpïØ Èëh¦sT¨m¾Œ!3÷r§ïÆ~T±XZìuØ©¢ fu´GDÔº@ðg°y.q ‰øäÃ5¥HJr)ÚÑeç½­+ê %FÆ™ÆàáέóWTtÄ¿ÚSí^OÈE†cÚm׸dþ릭q¶óH™¤jñ[bån$§:E*ç @R£NcuqNYºÉ‹Sï&‡#O„úÕªL»mâä'F+­Â£³?RÉ­6ohz„5$mÛU9 ~?wgš¦–z˜bˆ_µD¡î¶ßÑ[‰~ÓJ.î^uÐê*Ìåt¨Xp9ánΟ!±¬]ŸöHß] ¿Îì÷æ—ꥧçª&Þ„pZý#Û·»-¨WùÓ-¶ªª;û\3F©Iž©ÜÅ Šïö!õ±÷BzÙRÝæîÆdä´-È–áÍ~„B[§ÑmóA?+ÉÄûµ€}–‰î·¨@á¹puË nÙA4þá i9ÓÐå4HÚÞpæ.nííÃÐþWf˜Ã¶‰ÖQ~L¿øð¿žãk¾:oHǹOþ ‰x"f¥:i³f)¶5[]útb×ÑiHZ†–»[•ãé4cõtLÌv\Õ‹K 8?$Š•RÛᥚ$g•Ö*“„¨å7§üQ–Ï›Þü1åøìï÷ù7]xÿóóè¿ü@_éÑl†Ô讚IUqnކBd×JPåð$4¡ «P¤Ê$^ª’Ð2Aa’BËàÄ»PºšÓÀiñuÅyqEÜ¿õn¥ëmß½Õ¯ÙZê„,X%vià°†k¥>â5prjK¥s¤Ž Vy&Ý´¥Šægû3YÍâU†Ì ɵkmîŠÉ²%´Ç~[å2§eù”}&“9¤ST±+6UºMÌŒší\<å°$MiÔ%í’Â]ªÝ/b• Œ/5"V»f¦~4%ûÎ3>ý¿ÂxtûÜ^}R¶ª -_HfV=o©p)xÒ Þ!¿Y{øM{tÃ~{{èe ‡u}ìâ~"ý©‚S¤÷€oûû€j]˘*¦è¼2†Üpó–üýD×ça £Ùk¬º¿1+öt@6Ù~øûëÇkÇNèqá÷Û†$D9z†sä­T‹qjÂqB<²›`;9–æ­â «çÔh9”p/8èRÈ•â˜ä1=ÌËH ñ®»_qó\矲]>¯ZìcÄAjòô bÏ0‚Ì‘¿QñWô½Ò =<ìuÒÔÖÎÉøŒX°t°Uÿh£O3œÆm»èJG§`,i[°²vB*¯nW¶¢¢b÷*p«tbÛT 4¬.ò‡Š\ƒ¢ìSÁ:îÑTÉ;Én©æ×«QC›ì /ð¨½Ö•#1ƒFÔÆ‹’Ìh6ôÚVÿÚÕceFCÕ®çÒÚ‚ÓÇmàTm™{Úõ”½S–…öìÝ*ö^КRðؤ¿×U8Ú9n§¸a#ú2r[Ô¯åe¶ŠëF%[‹˜!5æ¨Ä—,dÚöùaeèö^œSSÞ9EP•,Oq«¢?Tq|°gÙ„ +íÝU­K-&ûÃ1'N¬rg^W9Ñ6Þ¯ñ˜IHÚ¸‰·f'_“´üßŒÑøõÍeg'é|,v(c¶=¼Žµ¹¾›ì³„¥ù,vèqos*­þƒÞû]O½2‹QJçÒTÏ­‰î*~W×.¦ ƒcµmî2Ða{Ã5¾©0€Ê P|¼µM´vô1øFçÇ•ïxi¶ÑÇê å7åÌÌóá}3Ë“mùÄ2ùyXYzò­HÚ3öÜ=2qÕ>ðÿ^øKïÉANÀœ3"øÜ96\—㌌akšÛ]kŽíîQ±ïëôÆý…*€¹û̹þ’ E]’#aÅ`gA;®¡¥œ› Ù³‹ü|ûN†]qÿø<ú/?ÐÄL߃=;ûôDdäÖíPÈGfQ=„†Å³ˆ*‹êªðŽÞ'Ø„†„Ÿß¯ýmçO¬eq­ŒâdO-wÇ{MvÄÕ³™å[-XvêovyÛU;­êHØ TÙR¢‡’·vŽ­·ÛýWdö" »,ªmÔu’CÊ×.Sz[àØÍne›¶mZ¹c Ôzl€Eƒ¤Þ÷ÃîÜY¼±ºµŒF¶Ý nA¶…;“(gƒÜï ‰%•øm¢ùd PQ©XžCËŒð >]£ÙâÎ^à_i8x¤6!rvrŸ‘ëîwÆó°ƒ?Umóû³Ç ãƒÌô;ïÍÇLQu'+òó“*<']°I½4 {€™ ®Ø^tùè êý…ǵLêôçn{9¹W F«÷…¸˜ä²'Ê;ÁÎ[ï¬F:í}ùzÐ8‡07ÊY—}²Ý}îñ×í @Wv• »tåÁ;`Ynã vµ1)(táåÛjp+ØwØ¿ÞÈ‘ o»º½‘à²:è¤øßÈõßɬ³;¡ø“ÕÓ$2G¹ ‰Äµ•ˆ‘‹Î‘ó]Ü!þ"«c[›b`’ê×¢!°Üç;ë$Àv{nÉlº Áj§‚Ý|²àAŠÚ1&oìÚ…wÛUÞí*— v‡ý„]%ÐH|º9äö?ô䈘›'>íôæ•ö[G,Ú­”V<^(“Å>Ô³·ˆ={ót¦–m£ûåÛ9@ö ‚ÙÅÔ®¶­JÍëÏl¼? ¤øÑ UY×@ët[ky¯)ú #H~Côù-ág} WlvB¼`W8f([fZ(aÖ³õ{ìßU€äLvÏg; !ÝX±¯ugD#RSÆ–©›ûï «­&‚1÷N»¥¢³s¯ó3@Çf£Ì:È#‡±…—Ó« Ûô/ ¿ì<òÇØöû‡'ÿAwãFø‡™Q’hÊK2Ý ]ºV'KŠ;ÏzuS&¾¨aJ«Õf~Cýº®4g®ú¥Å¬+]å˜E_™µÌTžmhì|ì©@×aÅýŸœGÿåz’ıªÄæè(©GÒÛ‡Ûa‚]hãv«Ov,z;)[Üë2±ßxá·Qâå7ºŒôG¸ÁVÖ€ªÒª˜Nå7‰¢}¡Ä<&û±ææZˆ$Êœ‡b“oØÙ;pRêI´Å«…É®ˆ"Qƽ§‰¼TÕ'VitÁ4™^ùCÛ¶$¨d F½»¼n[F¡Øª«4ƒh iêX¦,㯗y‡¼“íÂUº,+È앦<Á¢]€ˆñÖŒjì«}¤[[m±šA¶}Þ@÷„,ta+“¨æéjLÏ+` Œ¢, rû4).ãúNùÑWþ¡9}“<Ÿýq€ôù«WÖ qý™[]è]‰ã¤!|AJ/*¿tðk”F Ö°7lŽä¸™øf¥Žè®m²f©‘BìV1Ã&øt3„\> íyö.­›²neCR²œ£Ù´ñcXQgë—íiòô¹ëgm‹1 „N:=}xsDÐ…ü/«¹‡²Šoõíä…TW³’¦“´mäϜ̓l•Íj¼+L#8ªqŒì Ó(vaöl’óVÖM?øæ©gÎn¶…)Ûi,ødÅ`1ì,3Ÿ©hx|s‰¨Aq²ª Èü"ñçNTìNTìáñ°¬qêò‹}¡£Î“¬îuvmîÎÂLcÇ÷ÍÌþ]ˆ«u§zJ¬Yøæãš@Mys?‚‹>ÄìÑ´[bª°1¯+¯—öVÒ©µ»ÜHîÆ6CÁn¡Ró®àÑÜjç# Ð*Íy潃"¨ÅÀb–›˜ºÆvÅw\`ÎÔâòø®1”¡¾Úz޽9ã'Má>A:q¡ZàÄÎö²<ocÃÐÿ­­Ì¤lëRƒ' J_ÜxMþ<—½kJ ¨¶òpfÈpy|ˆü¥Èkd[ªl²ñ¯®ëYïì4~ÇÏ#]ûV%û‹ëˆƒzhß³÷ï2œ“V+l­ÈT¼ð,'´[+Ô"ƒ‚HÛi;$ zlûî–Óî©þ¤«´‡åSÅ*b³¶+ÿç…áÏe±)¯7õmWRƒƒ-y7Fe¨ðÌ:ò£ûÒ†ÖdWÞvs?fÛX^À›¬Ô·!–{’ÂÒ}h÷Çi¿pAoή¾qÍNo Ûkì©mî±pN¯À·ñŽ›ëH\\îñy}ë›Áû ÄôÐã;ð¦¿í÷ûK”‰k­qéÞäô¤7¹'E­'HRwàôÓï"xÅOIª,þ=y€™ûH^¹„;¢L›([²¢… ­4#࿺mlµ|t¥]{ü¸Nl¨,‹-€GÛ&Å¥j£(Ì4gRWÖ1Ê`X~Ááü ΣÿúMÑ7Z^´<*™¡á¬ J#áãFê*UÖÊdw -ÒJ ×61{ºùÕú€¢(ÆKX•,T¾ÅÞ#å¢iÂpª bÇ;/Âø<¡½!uÅÞq±ë¥2Ž·ÆÊ¬ j¯W¹Õ¨Õ r­¶EŸä¾bÎm‹¶Î5«ŸÕ€ê¡oãEj>5‡]joÑnþ«H¶ 'á.QììêyÖ@«’¯!®tkZÃj×9ªšÞ–t ýíºÒRÔ“ž‘L–eø¬œ6íÚ—

8véCaÃø]î›!‡mj·rúN¦IÛ<¼ï@\¸iϾà%uÊäÑDŒG"J­ôlõkÍŒC~ÅdwlЀ•«*v±d僪Ï?ü²KV‰RÞQ!ߨ—n²Ϊ„z[F*$RÏXݤar÷\1-´9/°ù_@ëÿô<ú¯?w–¯-Œ•EI%Yé5õ|)@mSãÐl*ñ±lÌ|žÊ=ÑÊA)Ȫà!ÛíH«›Ü2_Ÿ‰Uvãé0ÓSÙµt«ñCUd©Vºvèò±²@ðÞʬ›7ðìš.Ha—4¦(³«Œ½™O›m¯˜Èø›¾ò §èRÎ#Œ£DºÙÅj—ýWHxK­A«:'ñz’BÛÎ&5„øÃ6 [€ê¹Èê’Û°Ú¶¿eé$Éa^¦¥„Vhé2ôyyl(—›·X­âýFz0þû°¬“s_¦Ùÿ*$¥öÍÞûÍ>HsÆÑ'X*a$p‰þ#·™6²Aûæñã®h«FWaclkýb›†¨ê4]´hßb9l¹cŒÔ(«Uz²úïÛ=Ù]•v–ÌÝt DKÏJ¾^ò83ž!t®Krå†Ì•¶Ixb‘¿Zêc“LE ãF¦8L$¨›^õ´B¹YÛ½’1ѵs‚—¡]¡ÛÊ„Ëoè¶ÓÕCmM2ræU8LìÆ†,F„X挗j±M´âõž5iux–DñvÚ?|ckŸ¦.-)à—‹iµzBÎòçÔÕ¸¡Òªn, ªDpá`ÙœIéUœçÎ +t£%U4΄ƒ©fãyRx­ÝÍWú ~ ¯wãÇ£ÿfPˆ ‹ÝL©*‘£;_#‰íÊÑ +A§rëHH)ZU «*P'iï§9HÚåýwUÄcŸ<»ÑÚfW×ÉE\½6“o©Š‘DïUŽ^²þò“ÓÃiž«kÇyLgvMW‘û„\C·,®Ám{ZµÙ ¹ãç¸`QtCÓñ'ÆÑ麀5ù•l{Y#—€d8æ²µØ}‘-²éí»–A¸ã!‚‡baÄ‘Á ­ªÒ8\òȯôÀ‰ÚvRžÙQØ™d'ó=”Û•ç%»Å°®|ˆ_щ8eñ¹ØmY®ª±rìö¶4â;ÖãB¸^Æ2Š©q¶ï½þLÓþ32yKêcdþ¨&YiâÙHMxÑÝá‹…ä·ÅÖÝ›‘–˜4¶´äWšk6TO¯}F5Ç|ÉçL‰¦kŠžL ìSÝЯ!"úòÞ¨ŸöX4aàújÙȹ:9׸gç>Œ/ø+ÿéí¶h夸P߯‘LÃîXlrKÛl,‚«>W†ÒªõÐîv÷…n@‚z+—›=r) .¼3žA(eoHdˆ5sšÚlç@Qåm¢QÅæ]Þò±?ªÔ„ bÂ%b8@DhÑ)*gK A‹3¦s[–—Þ9ï¿:þ³óè¿þ@_#¶ jHLó›gjs`l+i¼m6ª[c¢ û“D:oä[«|%æW˜<Ñ=”ºk0‘4I]0ŒÝ€ §8Þövi¦µ!í&ëk[.tÅŽs>ÔuQûˇÙc*rSÏ:ûÕž“|T+cü¬Sj‚ó*’ϱ_zÛQ·ë¶T¶‘õ­½ç¢q°3Yœí’Ò&"ÅËõy´ eÍÐaáÉN^ÛáK`¹ ô’ žKÃ/É[j³šGSžE+ЃÐÕC+´]D¶ÅÚ…)Çêž®$ó¢¥]Šïð$ˆ|¾ÿvçy||¾ù<ß,Ùgxê"clîõ£ú—F©ß‰”ÜóýJœ-{؉ÀÜ.+Ùí-W\:‘¶å‹â°ÉFžl«q¥áÝÅ3´•y“\WÔ¤M !ê +×ÖÕ­öéjÙvÅŒª ëñ†YÇȎT’¶Gbþ-hÆ’ùšm·!šW‘¢3Ó×ÔWè—r±'/";sIó0pÐi²ÛKÃ@cŸSØe½{P°J/ KQõ’è$9#TöW6žà^»NO; XAO‰wPüezß3Hgñg‡ BM]7[²7²"uzé@ðï9ÊMšQ4Ÿh i `‹vRMI=qHí,û[¢®“xOoŒo§¡°†6­á§óp«{ ž+ZE%”üÕ-&è ™IAå—*+>Þ}h ¯ÅƒÿK³µ0ª8¾¼Äˆ@š‰qøó4¤¡19ÝcTaÎ{ÌnÝNr™ìD?jRºÙ tËùßÞÅ;ÎÜ”nˆ~¶ÔH”èõN®V´õÀŽ’Hmt~þ 7\Øk¨ÁÔyÐþ2+gWä-Œ“g–<™¥¨£ia¢ölÙ-Nû,Ý¡¶°ªÜï*ç 9;ñôµò»ÌéñÓJ˜Y+®…gv={ûmZíZ’›ör4Ã2 ><ìëó ¨ÅÆèÓY'Û”W´PcÑp‰DÆÙÏwdŸ{+K±ï¿‚ƒ‰%y•ï@D£ìb2çàîô=Å%žÒ¾·¼7*ëTëÊSæÙâ´­2íڦױÊškÈ èàÑ­9ñ@¡3ÄfA®]kÃçPýk0¦YÖ ¢ÑÇe—ï¬~΋sN.ë‹ÙøE{Ø`ë„ɇU^ñuZÎ SL^»#™‚jlÿª¼°å[ÂKY+$©MÞÄ‘åR‘ ³u%êr¦kà?õV=Œ Ÿ¿Ú¬YFÐ);´áËiÆa„ÒHÖ$µ›„Ëb©œLR.B f "Ž(*?DÕ=lUzºQ—ǯý¹óè¿þ@¿"i÷È?ÂðŸYÂòQÍr`ó7Ss—Î ÏR?AωS¼Eèòª~‘VP”N›†i`™ÝŽZfÐ?<ÂзT8j‘í¶wM?¬9WØ?v@JCt¯¼Ã^EÛ iÞ ]o§×•&šö^úžŒ]œ¥²ø©aY´E9Êpc£Gèé뇅½©=_‘2@hÀ9ÚùwÅGõ€Â­ïÙÎQN9i7œ´¯ð¢òüµÓzù×Ë ÔÑ©úÜ3‘kg0–6œÙDÔnkz÷ÕÜP»¬PWtmWl¸µ­ «˜` PçF9“1‹ÕúvmNlQ*Êõ®)n ;Çè¶ýX™$ ž†Z›¢tEÍ•#.¥M‹Û×' þìÙt;÷2<'ó%ñdˆiâT«µ™±ønœéi_ºØ ›¢ÂW{ ã„r|§ŒØo`žã¬X÷,‚B\m·]wœöø ‚ò@BsÊég‡û£²YìdøÌ9U·:föä°ã<~\þ,IÛ®Y»4uD;£­C¸¦¾ [×båûR²É͂Τ¬Žz•íˆSš’æ–]¬õ2ù‰ o0Î|,°ÇÔ¡¥{˜FÇ{9èÆç*_Ω\’ KU!!šåE6¢·é¿‹‡‚ 7;|Î 3ë "«{Ÿè y G;]dz8gŒ®2˜G¸&—%FÍ2)Ø¢¯ã­‰¦Va€·…\ŠÄÊ“è‚áVæIx¡=8anè™Ï©:qHÜ@8CIPB6µÇGZúwæªòzœ’‹ó+Êü êþü@ûå£ú»·¿%@òVuNµkCJLÅNï Õ+¦ŽÍ]³!gÈä¾<I|ÏQ *-å©/¤¬õ&ÍÖb½Ä3Így©“¨Í£¢g›!ãÞ“ôDZÂ/XˆÛBöæÁT_ýŠÙ–:ŠÅÀÊ{Ò‚zRRÛú¡SÛ*ѼÛ9¨ŸczãoÛ2³ÛΈ¹ 4Wõl´‹ƒ!fÉ*«Ví/ÉgäD·Hs–ÙŠÃj õ'›a¬¢>}1¤¶ÄýÆ-ëBºÕö?Ós¨û’åê«8Å´= Ì2}NO4ÑÉôábvÎÈÇòrjäA!y<Íú»›XšÔ÷´í±x5õkðö['Rúéd~ê [ôqõÀD«¼j\eHO8s(ïCLô­„ÇH²+ßêÖÃùÕVàóP´ÑŽnCCž®¤Œ²OÈEüV‚P‹ï’›VîœoÛbf”‡bÕ+ìcY¤P×{‘¶¥ÐkØ_ÕÙïâÇ"^—$º8ŸÂÐmoŒFò P;q‚jÏZÄbV&ʺ• ¹›Fåì”lNæôOoƒAîþ¥¸(õ¾z”ÂP:'Zä+5äÍR½Á³8¹¡ÒèLú5£6@`Õ„ÆÉ.HétöaeOA4u:L„Ã5lФ%¸×°Ë°O“eÙ%gŠÅí» ¸UþVDO1ø¸Àĉýµ©ô–Éyò|?…'÷òÐ `7icpfÏY\~9éd¤€S[¶…á M´å.4†‰â‹„Ȱ…“­ÊþÐ]´Ã”¡QÆ€ÉááÊçAËâŠJ¦Ý6wº¸$u©j.õšd¹¯‡V9}.Ú’AÙÙŽç<­‹½k3gÇ­ÓÔÎjYë ;O5›½;X»i…\ÕÂÎ?äØÙµ½4™ {ß2—`Ú"Ó+#† ~É@qhkaÛ—ö‘®¥›­S’ù«vŽÍû©^»ìŽÔ:³[ÞhJ5ŽÃCË$R+fkužzK—,žnd⃬µåÉ~SŒÔdõË* 8’TÄÚÚÚý‹mäo8_ ŒûdÜ唕¾“‘5Ѐf‚|ç‹RéÒ·¥%Z<º-‹{ ñ ©Ù¡Ÿå‰ë«Ääù`x½„úð¤k<¸…m ä-°ÏCC–yÜ-ÆG†Ï„‘Õ‚iBµ ÅöSø|fjµyO‡ùˆ6O+(D q [8¼“ÙSEY¢í óXZèKMlu%pi÷˾ÓïD¢Á3ò¢¯½¡Pð²`1-iP¡'+8­8 $tyý/¹ý_~ éõéaù¦²ÅRu Öhs­2c̼¡>fÓÜã$EdŸª˜Dªˆø>h8iüïRlÌFŒÌÀb}¨x7²ôCåñJãóÚ”¼,‰]D¼Ý1â:é% »}rÒ«¦q²¯„UÅî”=@̹:˜¥áø®[Ç.èÓÞXj ß3HJËRÌʆ°mefbG¬ì’WµÝ6òÓ• ‘ éÄ·Ët÷ º<®Céίwõãäv>´²SYÃÑb–Ûs:’¯$VûÒÆÜ¾Ôùy>pÁS~Šgãò¾w6”`[Jnì$"Æ ûÈQÇ Ý©oâ¶œ”h¨ghU¯=#ü‰?É=FćäéÙËÞC‚¶T[l ÚŸcïõ<ä8r8*¶€Ê-Ø5_ñƒRìr«V0×)©n\)RÔþº’]â´3WÍ~uÑ«“£!8áxæJkËäÓÌÀqaiÂO6ÎÞY„¡– °aUk«ï¦dÚÜ_œEý7“˜¼sÈóƒÊr™¢ã~’bTý†‘Âm45¼½Š þÇUÓèS—ÄCÞ^ÕJ‰¿Þq*NÈ!­{d«'µ£8&šÖUæ¯;š±3¤(£&àÐReÄ–"€2Ãýq{`Ѷç¦Qu[†ÌîíºN¤*7šFú}¸Õ7lêSÃõÕÊô€>ž=û¤Ê(®ðù æ.P›øDcµ=$xê<—ã!Šóo íOÆ@Tž[s¶*' šÍ d¢3´ÒG:À½'¶eêÌÜÞ]8 Û…O©fÀð´Oñ˲ˆ¬”.(Þ‹j‡¼œµÐ«ÑÚ 6£ðLáØÞœ/{?ô Ή,—S!Ót’ìü0º‰Ãã}$†Q:†9Á;+Õ…ùÛx®ó¥ƒn¨W´Nƒ¸Ú-ˆ^çk±éÜ-×£Ø%‘îïl¿¹NóPÄÑb¥™áW{¿lžA8Eƒ?’ÖNüµ—˜W¹Zÿyë£áŸ0©¼#׿ˆ7sC±‡ö°……å±{ƒ1·¿DÅöÜÖ"oïãÚ§g€%®ÝOI;ÏÑE³zqÑ(¢ÓN‹ôeò|ÊìEþ0ú«*¬B$’H¡‡»BÖ‘µ@ÉaàÍÖtÑÈÛØÆ„ªˆI58Í“¬mÏL׸¬± –§pÖ9øŒÖEÚ€Çt=„$…3œç¸»É…ÎöF‰' àáÀxÅ׉€p1jŒ°¨6¶Ó¡Ù4¿YžOCúæçßÉŸ‹ÿ_rû¿ü@*£-¶U÷åw…Èæ g]oî<ßÀâÄ &ÌSihž ’põƒgw ^ºbƶvAKÑEt|#žì WÓŽË=ç Ë´Bȉ‚´c–7b:_oÛsf¢kÝ0r†*憋¢]6/·[—"PØ •;’™’òŘ˜m2¡ßwßjÝ Â°{RVŠ•âV\V%µáämȾ©àÛÅ.Í ßR;=e ÕãlœgÏ«_¦Gt)c¾áCœYŠæ[R¸õì ÒÄ'EÚ®‘‹ 7‰_ŠkÏÉ„g¥ÂX 0µ—8‡=üwÓ—¯úíy|ò‹éœÿíªý+_“OÌÊõfh™•—‚Þyñºçܪª,Ó1 !} •¶ZútVlf1ÀÝ%rÍk ö`¦†–§m#Œ²är^É”½‘1 ZÄZp$\›|&2£Ù`Ýä!ŽîGDe1Ú–)ÏS­IL/»N¨1» ÖâœËV|eB¥“¶3òø±m~—ÚV<„Â`–¬¾NÇ4QTvÐ̪Ìô·KªwÓµmo‚61B•Ø”ÓׂaDe»7äUm§½rÎ`:CSÞãÑÙ:j`–.õio„='Û•‘D ÷^¢Iä2ä°ô™žÊý)ÜÁ´0§l(ðcüÊå Qù€tT=²v;&@žK7°h„ªÇS–øC7ÏxyÅÑiý*¹yS s E¨Kì…W ¿ªáŽ;™k:•bi¥¯¬‹fñô8±(ì·nÍ|5M4žv´ÿÚ™Ôß 1ªÉ¹ÑÊ“£à S~‰BPRÎàçX&zœû*B‰pa@ÛO—ȯó@¼„Æ×l»áx)W^7p¼ã§HšØ Ü ý&zE Dz•‘ÅɶÌvšlæ”i«ëýÝtÔ/Z5‘lu®jNÞOÏ7Є/'ÖoðmžÓeƒa³CaŸ!`œÜN5>À{Ü%¤Š:-ÔçJö¨ãßÏþÕÍW![Ö”¡!þŠ\N@^ S]ç€~¤°ß.'-‰FÎAþõ ÛjÀ%åùœ —¼† Úî” íøpKVÇZÐffá"òœT7 ´ž…9‡Ø=îmSé‘xVN×­Ï ›÷~ƒÛÞlTýM<Û|.¢ ô™ôÍbö4>« ËV&¯bgaélHXΩšægøøuûÑo(}¡÷{ÿ¤ç&ˆÄ'hA‰Ø’wºRºJaÐe9Kµá\­ŠU3™ÓYüîÅÄ×U±Ð¥ïQˆ>²55 ÅH~ç‘ÄÂ’¹çì©l:V’˜"Ⱦhñ¢UåNb’ TnëÌ ’ ð5ì„nßÎ Z¥l„wž8ã©¢KØèÍLìç$óCMîCŠ>ÀíWÙë-÷ä'v^ؽ×fBd W£§²â-Z P¨ãïcr-@¡/2f#-oK³Ð¡iÐznÀ’[ œÔÀ4+±ëgGC=GÃ}¡jØ´é® ‘Їñi†È}='ÐÀN(QÆr2„Wm2– 'SüIÙ²6X?…Ñ Ï}âýé]Aƒv5˜`ÏŠ¿–NÛ«m£¬üYÇ;ÛG¸[õbä±¼vQœ7 îGz¶½æ/gd]ÐŒ˜ ‰`4áø"VÑÉsyhK 4å±´ Û­û`:_ÖiÛl¬7BÇeb7*TO^G t!7®"-®ˆw\ºs!×9åò«Ý’mÐþÛO½kd%Ä–1ΪQ¾)+O<Ç´Pƒ@„Á >u§}Ï´˜¼úàþ`Å~¿ÅÆî„^ÙH@¨ÕF¬0®J§Yy{EF(-„D› áã8ëe¦Wš*>vøkªýfÄ•)åﺱÇR#‹x§ %qn_Xáìœå}ÁŽËM‰qSv– -û‹ÞýÒ‘÷¸(j|¿¿Â«…s9»Ñå_£bóÒ­«²ƒºL¯g"nó¦Ýcë_´ß?ƒqŶ”çgzVj§(P±½æš8wÖR(Χ2ýÔXÙØ^_n^+RÄ‘ )EŽæÏ¬]hõ¨ÜðZ¼`Óu‡½û=\($ ³eí‚)ñLÚÓ2T»³µ„Ïë5.¡5YâóÒåÏÛ›Þñ{;ÍŸ“€‡m›#É¿û@úwh‚œ:ãØáï7½Z`’(ú'Öh;^•‚Z0nÄ3Y­å‰˜Ì†ÅÔEɪlXÞ†\ˆ«mf}»¢ÐYË,ìš·;åOá)êžs`¤,ÅŠÔ¨ž3õ }8¸º&.lÒ]>H8 ã¾¥ñ…ä$Wæm˜·Š×W¥Ûte©é›\¢»Fa¶e|Öì‚sÍZ)°Òº£7À€YŠbQ\Déé½»únS=!ÖÉKNºåµÊê¬ ƒýT¤’Sý(7wuë e!¿ 厘|*7`»¦† V™xÔ/)¹KáyÇ]æ>_’.óÃI–ú\œÁ]y&»‚zEQÇ„A¥yu°DzFØ §ª®ïŽÅزì*Øm£ßDÿm=× §Õa˜ù³”>äë¿8/þ"Íš¢€öоU=7Í3uˆiɪsñ‚–Yð*ºYöç u–q¡ÝJª_°õ;b£¸èŽÌ<šòQµá­™Í¤ÅÐÍ[™îï³€·Ò„¨v_Ÿœóƒc Dp]ú• ²º±2"|M4ì©LklüeúXö;KÔ^Ÿ±ŒÔ.wfdîQj ÚC’®u½våD—vŸ#ÛÅûaW] p•þ „ÙÞ©™üéúf-ž RÝÙGivõÍÐÙ××…òæÂ/f„›Ë¬P7‚ò (òõåñyÝ|$^†èILUÏî`2Ôb:„kÌ„Í@Å£ð@nKÎØqµrú o3ºX†•ç50ðžWWšgªùf+€2ZC0²3à2ø½Р[ ûÛ}òþÎÉêÔ•¾Š™ÃˆA—e§›í"lá›0•qÚ={F92’(^ÿº° ×.@~9^.YA㠣ѫ.\ü…ä.“YÎÕI~z6¶¯ÖÁ­Y Õ êškPí=Ydž²…åŸ[ûÁ"î\›^QÕóñÜ ßådñù³h—}òú«X­?¿•¬8Ý4ž2sùåkÉÉyŸï3o”5ÚNvtžÔFýX£Ó* q..˜ _á[ÜQz’pÁÍ3ƒZïöuo;³Éh›˜c²D[éBº_°l|ý&6Ïí !2*@¤Dçë–ÜGÿß‘ {CÈÝí2¸fus–)ŠøïoÄÏþ/ÿØßŽüýh²Õ ´?è̉âþÑÁpÃN¯Ú jº4 ë ?!SC©J·jR(ºiÛºÈZËœ“®m³z¨©½©ž&¶üÄwò¦C­1ØBdâ*¥çJãzar®WnÚy\±ØÆ0ŽÔEº +<3ËP¡4“WŒÎ|Y•ÒÖxÊVbÆxç$±ÒPÙ¸¾IKÑsÜ×jYÇžX~S{¥‹»Xm,ÞÂKÛPx¨6+€ŽÕÿ~ÿª‹TÈÚbº‹ïyà²9hÖªuÞÉD Î’h!Ìx¿¨œ±¿)Ëe `H$®ÊQ­ÎÀëò€…—“Ô÷ÕàQUi9_îgꞇ}-úžÙp¹î*´n±ÃÎz@(ÜŠ§g²3.¨‡ ’ðcêz°y}®a‹ý2É;£Š iKq•…/êÀõ´ÝŒnÓ‘†"?NŠJB“[t¶¹h¥Sçº.³•­ºêQ4"­*«:žŠJ,nç¾Z%fÛ^Uù—IÅQ\àLn?>/²Êß÷éKørP¤}p¯°œäSÙú„q:úq®ae©ÌÁÛå'ƒ=ÐeïC^Ôb@„QÛÉæ²åaƒç3ÜhXÚ°Dêµã›sÙ/Õ&[õ{ËqU­ÁÕø3¯4Š:¨ÛçtBiS‘*céêŶ.6WÚÿÎI/aØx!PÛÕ0°k2å}Ù#$ìžZ €$êüJs‡q¤"Q¯ˆG8øwù>a¾ƒç²¬œÝÂÈE3¤]9g’Émq‡¯@µ 1¿X¹äóÑ&~pzŠ„&Ð Ì5é°•ó?ÅÏ«a­ÝAdó Ð0u@☀Ë“‘gt|‡k¼KîbÓ89ÜpïF(8G«\n!\É0T°^°ªŒ<î‡%à–]ªZø¼‰AM£caot»¯­Eçµ\¼¬†ÁÊ(©u—¾42=®†±ðvùîÈ">ÓãÒÃ@L±PYSDk8²7|€<“ ÞáÕt´áÎ* ÍÁ˜ÜͶÄ÷𡀘£_Ýé×f:[¿@H†¤íÍŒ’äå.ÕжŒ”PhÙ¾ñC¨I~±©OÄx˲ù˜ŸðaOCkÇ­íñ— oö"#El¡w÷?­ŸZìåßv;®ª‹²<Ùp¤‚¨«A@Ø0†Xã#Äj_AâïÍéõ) Sù~Œ¾’\—Ï<ë÷g¿cO÷Ûûù[Þ/jóWtì¥ýíãoGþ~4©(g×ÞÃ*áÆò±ŠðÄò\bRÛX]V&Þj½+<¨[å¯_l"cänNÌo#Y&‹‹±R‹¼@ª„‹ZNgb°}œ¿îCÞî+Ù4yS¢p¶…§­²ö²;ˆ<Æ!†"þ¶Ñw{6Š=±ÅHÌE†?v]ë¹ÏÖê~v½.´Çš¤Ä íL´é„‘ØWJ ¥Ùݹš¶T¦¸kŸ¯*ÞùM&\m5€uΦZò IizÛwöÍ2­§¬J“¿öƒÌ³ÌØ9)YRìƒLêã †q1\¥5ÉW]–*¸q^ôêåª(|£uVm û4¬Ù©—DyÐ’ ÕŽÊɱ$"A3Ž‰Íµ…WŽ”¦ ÖM) eìh~T*%z¿__{ÕfÐu2Èsõ0TlÏB>g»·®ÜÆ-³ÕëejµÔÁýÁ0eEؘp:Xä:$ÃíªÍÄW&X­tI) ɱÊ4)Û<«­»xÕ¨K½K©'55´©»Wͺ]À» ñÖÊË…Æ`ï^*„@´’Gvðž©[°Ikí*¶Cž’úâ}ì>;â—…ð£ .ž\Ÿ…±RG—th26ó©=LbŽÚ;¤èÃ^„&•`0—×]7ü±òÞiÇÅû£ö<šÂÊ+JÑ[|’%nædâÊ«%«®™Ío7ïÅqͱß8 g¼†×c¸c`zÉIǪ.‚[åŠ×Î)ƒå£L’s .ÓÁ$_C6’‹Ë]é.ýßv9¥ÃJ?Z•;6õ:àjø_L£Ôä1´·¢¯&’ä­€{cêRál^ ûí#‘–]ƽ+îêRL‰RøÂ~k†!¥æ€7»Eiåϵvè9¡V©™s vW§j‹éÅÀ={áßÎnƒÏR„yÀ‡N\†5z½)ôŸ+ùBPœZyŒÌÁqt³W{?êøéÉ(àMOœ9ÚÆ:ž'1v%|k6=+\ åðêFÜ-çÀe"7|UR•üêÏóΆ âmňÉ·ýTpÅ=;hfÇÀUà¥Øgö›“Õ*·Ò®Äú¡Ô\s2†lvͳü 6;ßpí˜` u)Ë`˜áÙEƒÑƒk{Ð)JhÍ=t‰äÔT¦9 ª#!{;2HVRí}bº¤wÐ@ü‘9Cá|QâeÛå³`&¬ä¦×áf¦ñ²Op/«$!aÙW¯@ÄÒ‰ˆ±ªäô_~RbÅÊèÙ\Ìmç„‹äÀC2aA0Â(B^)FâÆ.e9X¹“Ö÷³w“žÞfÅÛyärLpð\ ¹wÝ#¥rÕB¦è <ôVG9ø‘;—Ð`Anu}‹>ù“ûÑÓA2D£t\VNa›ËŽD¸=8ðã(Ç¥¯mñ“/é±>ئ© Ô«4*-hþˆìöË'%ÕQN~^ÚÓÐùrôùþRò/¼yÓ\⡦=/(ýð ŸŒêßD?Ó{‡QVy“Tþý_qQ<³¿!ùû=Тý=̬/æ×¹‹)«QpS¿U €íl÷jåVk,ꞔ낷œ"FÈ%9ñCœ ŠèJØ´b+Ÿùš§âd§eäëá7>jЖ–êŽq_£bצÆó¶Úž¹úˆO[Nc³;0ñÞèK¯°ËPKª«BîÙÝ5±Öšu ~‘5É–+ìñ.CvQªþX ¶+MÎéšBOm U9‚…¥(z,œ™Jr°@oÀ”%¸'JØ,®›ÙèµQþ6ßFû¥f·“×YïO´GjlLÖh2`;³#Õuï‚ë~¤D³'&öÅÍ àöÄãØ†Ù‰úJ`iRçÏ{ C›¼bìÔ5 Ûä©F7Çêa‘æ˜×›·SIT‘¸ìÝ+S[íO…#)­ßÀ ƒÛUXë,âÈJÒt(J:tû#¹(ßuã¥È–1¤óêŶ§%U7=ÚæË&Ÿ€fè’øÚHIpU"ßVùoó~Øö¼ží¸lnàè’¿Ént¦gª-£ã^º²gž@Zí¬¤u‚óï´è ¸â:e¶×1ÜÌ{æ©hWÄnø(«®'!§ZQ©6RxwÚ<+,áîùgŸžßOBñvÇ칓õ­ÑÖŠè¥ ׇɷÀ¸?†€¹š’ºTv \ ˜ìùVѵqŸäUÑWjàÜW²Mï’2£ëfçPå9¨Ýt yn8XUû5$A§qäá}¦}ä VPÖé· ^”ºWD×Iwø=4|µ' ÒñÎèJ×Va¿gø$V9¼#Ûa‹.›»À‡_`“õ2€4ˆW;¥2BÎXЍ‘Zžñ¦¾p»¿ùù€ ìñ šCúÙ“®ô—zê¯~Ñæ¬n2âð‚+“@§w)}¢Á»¹§eV¶ßBÏhøX=¤=©W§­öPÚ³-FåçNįV a“Ü/9=rr5¢V˜™ûרÉã øÎ>!ÃX¿:Õ[ÒEªQ1.Xêäé}a—§™Ô‚Qʼ}íêó++H–f“X>¶Ìð™ë/îþoÿC[mú@49¨B?NÌÞJ?üêo=àPéwŸÑ¯¸G_F-?¶¥~ó~ìgýü¬žÛW°Czþ¼Û 'ºîŠ!xS,ź«ò!”\[æMìW¾Nü diV§eþlûE"Ľý>‘ý+ë_ó´&ÔWŠ|M€¤F† ;ãáTc»þg j2'‚jµc5̰«í_Vg«¿œ‰)[h6Ib" Íκ$2Á‡èI4L9ö0–#ÞrBø#~õч’¨ÈpÜ)-<'T]òõnƒŸëíÒW€M¶ Ö{òYv“!ϾÝë&©Å}ÀÚAˆÁ ‘GAk]AÆ YUXùH‡ŸÚÅ I—ã’-yE~rP/¯†ºÖÆ©*+6d“¥Ñ\P:3/màm‚õ‚Ê›ÅHš-¶â ɤÃ>Ÿk[LI¡Í}ef K$O'`‘¾×pøUúà²“à ­ÖX•Éy±nîÈߤ×QÄ5;äxë×N~AµuáMÞñ‡]è ÷iá:d§Ã6ñÔo ’üŒ4ØcŸÉ8úÁîØ«¶Åö­¤ÃŸvtºÚ‡ì"¼™_dË€ÍëÆ%5lSl à„Íäl»Ú=BÚš7ç.”‹^½!©Ù•·Y‹vŽ-ýÂéäÆŒñ¥Ôì‰þ_†|Ñé½ÜDBÙAMŽB» q×LG©aó÷äMzòX‡ž<ÛSO\šDV„Ž©›(Ï LßáôÜš.…üàö¨"ÆI›e 7çØ'ÕšuÙ]¢ì¤Åp9„õ0 ùëÂ.««ay½ ?ñú¥è]i¹òd Hi>oûl³+d>Ö1ð¨Zãî c….ÂìîL%»cËyEêuà°£bÝhž,ÉükÅ2KÇ , í‘åñ¯Ç_%\ –‰yeT#±Ê‡ÕG¨f¯Ð’(OFlClÝl l»Š«V\_ÈÛ}`*R½·‰œ[ø²áu¬wkÛ8 ºÈ•'Ø„½‰·t;,$7Å@¦ëÞŒŒªƒÖËÂØÙVFƒ#ö"GB®yìMñ1Åã;U zçkvOŸ¬AÂöó"þóêïkþn;Š\(«aE³ól<õAù§!a÷”qí¢D‰”D›ÈyM+EŽ·tÚmëÊê+l‡¸$ÿ¿ jäÓtÄIôw¤‡9á7~7Èücy‘ÿÑ3úÓä ¨||ýЋ¾aœï$íôŸ·/ºÐôÇo_` }t”â¿Ó Äž¿ü˜ñ›? 'ž$ˆ4B¥Ô$Õ`!MJ8ÍÎ:}ò(Ùª®n|îýÊÇ!óàrÚoÉ+¨“ËŸ‡FÿúýöüÅMÁå¯áX^pˆ(¬ЙÙú ç³­XiiØhÃ\µ@¦IZ"Õ*(XwæsBWbh@3Bn–¸;ÝÆÜI%¿ú1‘Js`rq2;ˆf7hvr­aF0ЬŠ|’ ºQ³ÇË͉(<Ñç°Í}=#Vjf#Û]| ×ÞÑ@ˆaP'M—{Q¦HRÙssÙ€4ø‰¥0Á7¯ÁÉ-ƒ щVç{¢"@Hs"=Ÿ«'ØÙÕ4»ç_t· ”ëeÁóR¥ð†Ëœ˜ØÓ„ÁíÜF;!Åø±û² _¼Eìé+¡PÆïØ®S䔿èði(R[ݶ{W3n-K°:Vx°™z;3y°MgÒl‚­lE-ìI×4¼?”n~B²šIçØ ÝoÁ¬[RÜV§ê`G¾UF¾ÆÅÀßjs,n…l‚…-òšdsô0܇køø”/JóZ´ Ù kÌEg'ãÉýd!ëv =J…d 9¶)r Dsñ7vÛ†7|ì0‹Ñ¼GH¸øPk»ço\‘ñÓµ¨ØìîÝžÿb¯ ²QŽÖ ?#¾òN"èy^DGœ ´@6s£õS&¾¡©—GC(û|C\±’à¢)™«ò PÛ#^ö‹Û›¯¥J¡zjúDè„ì¡%!Ód;_ §®T›FêÊÌâ… ä|!ÏVÃÉE|¿IëæÑ¹XjnŒÚÖX¹¦j©Ó¹?¤=8È#èf7ø+!¬Ú0Ù]Hço JýóycÂéâ«*­ƒ+6X.ßEˆ$A¼Ž½ÝÛ —Í|g 0ä÷ð¯¬ô­ñ›a¬Ó²›¤áJבÏ%—¯T`Ó (:-¢ËÕCÌì·­›@ùècënÑ?ºØÌPbþÕÿP^Šº±xˆXñîR6¿ÌšŠý[v6˦|Á´°ómä­ï¶Yv§ Ý)žõ3\ª¿Ú»þ“ÒôãQøÝ»ÿöí ýüœ¾èÐÒø@ Óo‚¢Ï/Uþχ9õkæ;},‘Eþt²~õœÝÛNM»4%NNúî[¹dÙ£& d¢ R¨- çN¦⦠¿™ M¡•ê–0T·D2xâg-’žRê1ˆÁñ‹÷iéËà?I¿ý®}!?ÿê_=ÐÄê°¼ÉwƒÙµ ¯›åhñHV|Y¤$ÞÑÌ6¤ÿØ´ÕCeÛüïU-i÷õÐê-ÒvaÛ *y xFÚB¢rSIËã…ôʰ)*´5|$W4 Îm‹Î‰·îÅ%R´JV«+i¼ì¸æ² âVsìÆ³wCE·G&# Ò"] ½ÚBáâîÊM¹cµ«5/V|¹ïHM›R½´ûÒ+‘Ñ §4DE;MZAPi½P¦LFEœuŒVúfØ(‡Rz}ݯU%p!ÆM Ç“”3%é˜înnqrN¤ay„K´;n-÷ëû–hÓ´‡në…7@íÅwuEËM,GW3·“æÅn[úfè\Û-3±¢®—_ׂãÊ­‚M¨Ù}è)%çõŒ¡f“jOAR¤\–òÿ›ÏGò#œ%?ñ! õ[9*I®–¬¾l¯9êl§Q:/½¹‰n¶9‡ÜÓÊ+ªüeÒä¾¹MdUÌÛ·¦ö¡GÞßp†gú%u}Ò%åÓ·¯…VÐ¥ÁÖô5÷blÔ÷26ÃÝW[íȶNâ>˜Z-ñ•Çn“bC‘uá.^í×võæìßK†Y×¢@ÉøX¬pSt„@”îÝù#ÛZÚ^ü¤€;Ú‰¤-Ã9;ÞCö¼!ä#YØ sæóIÖVŸ@U‡6Œ~Ö¾7¹/Ùy\˜Q%®D;ƒìðÉ.hר]g“¡c›D@†ö¼0ž]mnefÈÖ£‚afz7B«Å}áì´ƒd©–'¢­ôŸ~>ÒÂ{‡”¾ÏÌÇü{ ˉÚ@ƒ¶Ïh÷‡HíKi3Õ-ZpÌpò#‹q[W ;êÙÃ+CîsL0 yÕŒtü„¢#Ñx$H×g·³Üëåbß úÅÉÿ8ÑÐMé‹2:Ì?\ Aåú2øÕêÿܯ¢£!ùÂvß¿÷+êÌüµÕ:ü«cóÈV\Nþ}±üÜ?ú«àÈGDÀØ@øH¿1Jû÷èW·ï€éÛ®þIfú~[“ÆxRk»­™0F»*F$zÕ*©¦Ž¡ŒYJšpñv˃MŒg¬ÞTè~Å—ÂûpOÐh ”eP²S6”)‚â²ïàÄ‹»ùT‹¸‹3ˆ.“˜‘i#¿R>qÊâzO¯ô¸ñâ`ö–_ °x )°Éö…zÈÁ¤¬±98 ;(rc¯+ËÀFć•`v%Úæ¯hY@ÊèK‡e–ÁfÚá¶z€*jE¾I¨“‡JZß5g2{î-bM½¥»ÈL÷S¤|ß0GDûèØ¿ y0‰%»j„PàvI[Oô*ryÃG¸»×üR¼Ù#uÝ RíA'ÚÑó9ÑõŒ¸‰¢M ô8$†uA;i­ ãà1C «vÆÝ£Òmýñ Ô®¶èrMEúTÍÿNß;^Š£ƒ¸Äz™b’ÿ¦Š³4šÇÖ01<Ý0€Ví½á&-ê\¥ÉöÓi]æ¶È"RQŸ£ò3í˜zÔçd?Fš£KÛ/ «j`§‹&“¨¬+VyÅ–j+•ó -DŽžèf{<~ë£Ò„,O9;Î#ѵ Z¹IÙÕôÈþ‡½Áb¯>íÛf{&%þNÜ‘W0×+,#Âf~‚qÜAš–+¼‡BöòV snog¸fŸ|¨Ëž2½Ú/œªÉÒ­ÐŒ]‘~CÎiñ±Æ‡—ï,W:ïóšÀJDгƒ­NÆ[þÑ­q¿¦ÄO45ë౺ôv®w¯u$•Ov‡…äTŃI“Z…\þòF—|Þ~™çj÷„Ò."i _Ð Pñ’tž¶a¦ªQ¿M•¢hP™)ù¬v0í޽ϔ-¶îÉäC¥‘`l—ÓN‹i¥w6HÐsð~Jèæ[4‹л•MVÒsܩҡu§¡ìþØ%>§‰©5 í‚ÏÌ Q>fMÉÔ°%0òfÉWŒÜNÌ==M˃3hP÷Þ|ÃW£ô½bN ~‘ZÌN Æ¢M‘À+î¦â5¾O>ÏÐÑy/áìScPðóBЋCŸ7–œÅ~ñ›ð¯Vÿïwë²éOó·õmôµKüi}Ÿô|1‰?µbàý±Û÷¡Ó ÙÊO?þ7oÿc#¶O}ù IZ4†¨¾_ÝÀ?ÿþQæïÖØ?Æð…šmú3¥ÈÇTpÕ°¥¶‰â4¤UR¥7‰¤Ì>ì¿{VJÁaOgS¨ÛÎ(ö~ÃNVa[pOm(¯ú„Ä?É*Ÿq50 ³¸'…rÉ{E$Náà± òØÜ®›o+ ¼+äØC©r9—ùµýú¯¼k_yÍÿÕMpŽz$ÖˆójhòB\\!âÖôlÉUƶoõ$'W ²îi“¹¬èªr2#¢L¡ZòÆXkÅ*¤K#ÿêNÐõðwg‚E]q)ÔBÔ1`—DèÍ쑌‰ z̸êÙÊGñá¢Rö¡èθ îÈ…áÃ)}}-o9ý(žgÍš“‰4U¸ŽSxË6®ñ¡KKIC òVØVʧr R´ÅÇ —BÊ6½„Û@@ñ?× âA‡ ãÖ9OJÜcÙƒ›nØWt™{—!OÀç"γLpB±›O;kgæXi¢û¢(t1}šÁQ5]'Ñ¡Ú>îȹ•‡¿$=uO=<34Ý©Ò%Mœá³$g‚|5¾\²Ÿ©Jfr°Kt»@þÍ`ðÂß|~5"¿Ó‹xÄ\ß™ŸùÖ<¿ûäÞ|HùÛþÄíEõ=Áò?x … J÷¢Á’@vÜØþÞ5â7ÿ^¶9È«ið‘dæ„ï6†…ªpTa¤Uèõ°VN5|Ñjx§tJs„^¤@9ÄÏa„&Ò®þD•w]ð`DHm°ã£w„v­æDê®ðI1à´Ëãd¢':ÜÃm™‰ApÎçŸ~óÿõ%âjÇþ«ö4EPùó® ¡ê²“ƒ=‹çu2dÛP%Ô8>Þb!MÎ#0È2Sk³ï,|îõ“¢jTû¥ÄrTq·mTì)~†k•+°‘ÉÔYŠHVG’]N×ò¤0½m/V7£›ž°´\¼7)Ü»ìU”’‚Œëíòb±®h©çè màÜÙu…~ÏO ½¿ƒøÀÓÖaÅŒØ"Ü¡;K>ŽÂ{ gþJàT¨hÒ¡‘…, 牆“šM?ê ¨DjbÕ)j¦k’¸€+nLa;â¬]*ŽüR]ÒÛ_RÓA7nÇ7º§="+\%•l‡›ØÞ˜t¯pèyæ„\È­Þc»b¾Â„w6ÎõÒAÖ~ëu© ‘uð‡˜ÖÅM¸}–ÝHëè{¾ÞôW²†jm*î·R£˜Ù€®ÐuÔv£ƒ®ÐXwH'É{¨'õÃLŸPb5ƒƒ3´ 0 쫼vŽKã-MÂ,—¦btpJ4ì²ó6ó2ñ-±{4X«Çiïx¢ ÑHþ±ºoZ@óKŽÞ“¦kã%”Ös(°.{è넞›÷™6Eö|‡HNR¾g÷$š0"]HBÅÝNlïÛADØ3½µŠ‡ut)ƒžæJù™á'…ÑùÍé'øSâz'˜Âk7Æi"Ÿ(]gÐŽÍ † m"ɼEHu–Z¦_„BŒÚåÄPhÄY¥ÖÞôè}ämbL†`/Ö¤Ù3§3«GèÿÈœHÞùÞ Ü«`]'$¯+EÿÀÐÄþë㟗å8ÃZÖÎl±OÌš6,°åª£¤æ‹3W¤¢´›*|1¬y2¶cþÑ»ÿùõí«#€&$PÃúóëž¡ÌÏ3°ï‰÷óé ä©®óÇ÷uøý±ÛÇ(égÞðŸ¼ý¤òq|Ä®MÞ#Œ$7x¡¶þL|1f4áÅôýCs1A!q”Ï6¬¨ÌßvÁyAËÿÄyzhg#;å¤só5ØJîœË3ßÍžªÂ9žð¦ÐǘÂÚ×áÅ·_Îæ#tº=aöV¡b±y ¸¼añgXÙë={I'!]'´·]ì5 ŸðZØÃügÞ¥ýã`/q€ÿ+*¶Ï¿ù‹qñ$sŽAª×òñáâUu›gŽçæ”, ói9Þn„#pV¿F]gïÊ Ú ³Šë¹4¹î¼)ƒL»¾ˆsr~eÚ¨ñ#¢“ÁO·áH2 AX?£Ýè½ÑÅW;¤SÅ&w%p­â©AÐéVfe ìÌô?šmE†'ÚîŽ!öP ª§­Ü§t…Ët†-˜ç¶ÂÖ.ê•®ÖfXé²Á¥ÆxÙOfVy߉VÏʪÞÑ¥²˜ÙµE¥„¼#ÜI:fÍÁ*rSÚ‹é5ÂQ;î—°Ÿ”¸;òtÍ.Oh7¿$¯ó™¦¸6ž“˜ut^…¿°BûÎ vÑψlñlFÞCÁ¡ ×÷€(Èìãîf›DÛaÌ_¥>ÂLÿ§]áZáR##†Š&Œ ‚¼5ì —èeIƒ·Ž¡æÇDD]K¦<ë¶MVÑ1éDQ'¤ØÏ2@œÞZO«Be³Tç2/˜†›mÝ4ÈNƒ·ýªªÄç êÐÉPKjóT pŽ\.ŸŒ©½“¢zZí¤1ü¦¹âWg Ð£´3XG<¡íán‹:Tc·û¸ìYu=7ù*\4©p@8ɼLІµ oì'ììÄ:ÕlçÌYÐÁWàëÍáÆˆkÃÖò3FñœÐ[î ]ï!7x‡¯çv”#ÃÊ¡³žP„4!ïg<¸f{õdq¾óÇã|}œ›sé!C{tzw¤µÄÝ3ã"‘wÌàáóV?AAVßâòssé$­eäÚ~¦Ký¸ßöHNòmâpŠhô°· c\,{äázZåšeÙ,­×N›Oå[!yà GÑëÆ»¸û2ÿeñœ¿Œ‹Ÿoçù»ØøÇaZ™½£óVÿM}Wœí?7Œpò „–oûQþøÅôÓsø Âj#cú öw$i/qÜ@Þp¥¼EwæßÎI"®7o1™}1íAÓÉŒª>?ZL¨¼oSü×@4m¹BÁ]uB6½€ÒÀ0UüÌEÏÍj Cäþ$‡Ì‹0•}ntiưûÑxà¹}¡Ó/ïËüñ“<rÚÒ÷Þ¨n™ö%´Ò÷nŸ½µ_q·èŸ>–ÌÙÕŸ¾ý1€ôGh¢vßbГé#¬ªF3y%\ïužÈ7V‘+Œk%‹Èô.+"â`™9 Ý’C¡¾uÁ̰³·jàyƒ‘*(XƳ3îeuu$º&NLJí>8mnd³'–—-œª`ú–ˆ"Zè÷•ÉN™ŽÝTš§gkÐÙl¹½X&÷Eþ‹R:±h1Eçkà’\ÖÝqM&¸é€à\ܾi“fÅÅQÂyÂä(Ú»Á¤"·Æh;4mÁ ´É¯ŠëвÏã;IÒ"—we,y +‚,¼lV§„®Û#ÈǺ±eì”ɸäGn ´ Ï;Kl;Þ…³íÀîg°…(¶å ücg{®¿uoöýB>°W=f ûf¾Ü »ˆ,À1ÒN¼°Ñc…#gä Áã:JHÜÓ㶆ÚÀ«Ht@RüíÄ(pà H€’ ¦½"Ú2eúù&Ø 3%f‰«ý%Âv?Ì 0Ä`Ë*ÐEÛÈÒ"¾f‹êjdüÛq€²»Ó \r¡EY8öY•Í»á²f_ûÇ¡Y]#O°„þˆ€kñ늴A·h»£º"Fotz*¾†ƒ&€´œœ7…iسDïìÍt¥Îj€ƒ+e'œ¢ë¡èžvP1´ò~Øx1ÎÂ4~ˆe‰„U°2rq~P®ŒÉ;í¿P}·uÆ æóªÉ` 7g¡Ÿ)Ü#Ôì?±cá+qF&Î2ÇÊ®s#…I $¦ Œç{¡<¥r Sµ9r•FüÜC:æAíu°ßÆ%á¾ô¯²L;±5ôÄ®A>éÈÒéÛ‰nå÷ú{kïÿÊÔgùÇòô«§ý½‹óK¨öǟѳÙ}m­þ—ïù-;¿æ·j–øý^_póÛÃÿ*ù,¿¼Ç üË71¿xÕ=(ÁÒpM‹êî›ìv/á÷Hq'‰íñp¯cö³Î £F¢xöÇç+ÊX¥üG­XbUº6J‚ÔÚ«!©=ŒP·Éª²ÝÎøcþoC[Æÿýúþ«¤¡j{ØÑpóïøôËg_ `²â|"e»±›µmXtEQâ+€Ç«³“£±ÞuN‘ŒÂ@%›Ü´^=CJÄÕxS7cr ?f£ ­áÇëfd“ÊTøG ‹?ŒM¤’Wt·|0¡R?ðdK×q^N¯Þ\OëûÏvýÙR)w „rŽŽ«´0OHë×=¯[ë4WlXåƒ|y(Ê[ ô]éí |uhuO8Û-Lv†–&‡žø„ZºóÓëÞGd›~¢Ù`“fŠï•­l£Ö¾°ž~aö—E¼6j¡êŒ7µýo¶° âpëÃe¥Â¯Ha}Ž @ä„èìf Ó-Ã}Ó¶Ø&§Ú:%€$ }c¢Pqš™tè ?…ÜÿU‹ö¿ý@ùmý®Ðê_=Ð>Ìþï/$qì¥}šòÌ1;|DÝã~MTm?vØÚÇ3ùÂó¬ŸØÏ§:w4znÚžÓ@x¾°wÃ`³0zH”‹ŽýÞBíÝùµÓþ›íLÙÑCÉH݉|›‰·•¿Tñ©Ìßvƒ©„5n¯qYÊö adnLæÜñ;£Êïß_¾÷kê¿:ÝþõíoGþ®ôΤ§‰ùJÕ: d†#k?Q±×oSJ} Ï¨rŠI(\ VŽiM_tÖ27f+¡QƒCñ«kÜÃé¶âEX¢(òNš' ¹O‘á=ti?U¦`N{w§þ5L.(ë é²gµNˆL…˜¸yVýF\³ò™’}~1—“ðd—$¸OƼ+=-=aX¨oðÇ^pˆnôáwò´lQXWö)IÞg”ð›¨Wõœ(y/:AMžGPìÆhïÙ»)úà Y9% Þ ­k R¸ Ï Åä‚o“Õ‘ÀWûލˆæì\‚~›wNhg4×EMö)G)À*'EaU6|µˆ4ì5xgrøÜœ×¼Mn¸u¯Ü¥£‹:邬p¡¶gë‡É÷ßò*2VD¥NþrpQ„FÅ(iÇV¹nî¢m††Ê‰òOïRá\“‰CsMÁ„WwKC0¢ãõÄïUädø7 i!"LND;2´N;È@¤}}“<ð:lM&•ÒEÒû/ûÄɱb.-Zôj¤Cš®qH¶±O:&ØK-˜K‘5C€›,ºvPàãžZ°ì:a­ÁˆwÒ×"&3üsQ€wí2ÂÉîô³ ¼Üム¦Ù!öNøŸ]y‹g¨öN½:ˆ¯Ñ€bÌvù©UFµ2?éÛ¦`=F³5ä.•ëü`‘ÁGñÍß8¢>£m< ú»ãEiäIW|Ü´žòë;·qíé–ó•Ҭ̭UñêVÏ“aÒYYÈÄxÏà©e»‘<Nûš8LHµ­](GU½_öE¯¶›Ùê,eíÌèktÛƒV"@ô9Hóç\ê¿°hÿ”^€ô;Ò³?êñóE=Nóod€ý‘—–>ôªºùþþ¤6ÿúÃSþ.üOVÆÈ\Í=Òt«ñÜ4U¦LKr`m\«!,)˜²VŸ¨øæ;ÞI³Ó,Þx2é$ƒ÷t.>B¨ /‚Þ:f‰Š“œ­Ä’ñ”øÕÃ0ÏÜjršfÖ[8)$ž*-3{§t¾¦90¥/ÊŒœc$'‡ŒW›¯Ž#Êâ½ iZïk®Q\ßÀ†å”}¡ªâ=M3ÝM:  'ï˜OáËXþ;\IšGýáßÞiÿpC÷"´ð"=+3]ìtªüŒ¢¸iºhä?AºñúÈæâ…rÔüLæÌ$G·?Ô-À›‘ç¤ccò!²äI$ÌQÌq¤ÕÝ,ZùzŽ#åØ(˜'ÐÆì!ÄVéxޏ ÉÒ,¬êåŒòéÎŽ'ÄÖQß(y¤!“Ÿ_\þ8ò§5tE"3«Ø"ƒU'qä&©ÒÑLÊüLx¤µ5O5T‡`˜‰–\Ì]Ü©p¢úF“ž4óšX™|=ŒCÐ%$3‘åÍù(S‘®R–³P÷$+§{Ðð7ö½É|ŽVª~WÇr  M„Lª!Ñ+h¨9¦€O ÝýΗqÍ –lW`2¯TÕr©ªîkn;\o£10š±¥=«èTK»ã x|³*1OÁd ¹Ð‚Vs^u¹3lZ;|ÝC.´äÊ‚í‰É™Fí¾€ÚÓgŽÔ*"@š "U³AŽ ¶j0£hH«æ#ßé9R!š¢Ïô­€«×Jñ›U5äÅAžÂ’†TÑ8ŸˆÇÏÁ0Ðtê8AåëjÎ1]M‚ª©4ez§€nÅR>*ì,'ï”WZ1q Ãmd@MV\µ˜öfaq•bŠåÔw(\ߨیª•%…³’2µ(I•&5c™çiä¿,M´ô˜)o´P,á3OC_Ùi•¶h•ðp¡« §ú*ÏÜÉÙÜUé8Ç=¨3­%ÛœjœS*c§{ £ŒV@ªÏ˜7+ XñÕ3Õ…XåÏ£`,e³ç êƒh¤+]‡¦/íB³Š™¬¦õuÇ<ØÆœ˜·¦~ôº*ß§QA„ ¹h˜“yz &Ü=Æ£ HÖJº²‘³õ‰q b®_ûY”²ÆHÃ0lÎTY4—;šëœå/ÆýéÞ2Ü1he&£çånË7Œãê"¯ Åû!ee Éœ›v8ȵ÷öá±þ\ö Xt-kïNⶪ@>—ª½ˆ;‡é±ní]Èi<÷V#£ÁٓͶP¦á1Ë]í¡é±;öÍô‡ °Z‰'nföâ>\Vd’÷³ÎÏë?pJCqò-•.‰ZÑ™µäp|›(^¨¢(4›f<Å©èíìö~ö 9’7Jòãv×xäξïÈoº­½!&oŠøÏ6tgÝM$iï¦Í€q!r~¢©‚S ­šI¦q6ù™¼å’¡ÄÐJ:¦r†•0°s¸™U,0N£‘øÞ•~MÆ¥@u¸£ëQâ à¡åÆN\™ Õª‚M£@¾¨Äa ÑÙ¨(Å´kA âY`‘¡J:0r2 ÙÁ­E©WA rEس ~„7dZïÌ_Ý3lq0q3“­Ü­J 9§Ùʯ6½((ÇHw ½eÏ®Ž*4Ùø·•žVÇÇWêWïlÔS f;cH¥_*Ü(C­2v†rVþW£dhF9,£¢{UJB« jS nu½]Ìö¤ ÇCYDF~&ÑŽ¾Yó>áLrµ–WcVǨP¼VËTW™…ÉÆÆò¼•Åä•®¯Ê:Ô«8ª]fÒÄ*wçñ ,Ô¤b¢=…Y0`¸YÞg!ÅýhþN­ŸÉ.÷Ü;3¹P‡AK°2ÁÌðœÆ–“TÙ ¨2Š Â±¢˜ÓHj)pÌÊâ=-Zô @ã¨ß:Q¹«“˜ÈËXU#I -Ã!$‚s*‰³|¯U&Á¦©¸Ç™¨ \ž4Ž™s|hmð¢1ÇNKˆªìXÁçrÐËMæÇnÏ¿`d~óe:Ä=›~Dwû¸FA^§ïŸ*‹ù[9HÈî”'`ô"-ô™ÀÏuïÒ˜ü‰-²í’A#ñ%êÂt  @ÁúÂà`Ž[¨æ[zHºÈ%&O.òë"yñcûôÝéOŽkÃÈ.LwßÛ÷€6Þ(Ü*Tßñ2Yñ·—¿ù3­pñA®àûfµãÔN%ãg¥)[ÖÑúMËWC.§^¼¤6±­×ìà™J6ÍH’xuc„þ úgýy¢BE‹cIËĺÛ`vEÊ6ØÈ­>J8Ÿ‰`3]J }hD"`Šc( CJ€ºL‘¤Ñƒ±°#³}+ü¡à¿Ñ©au®šMS:,XZn’qe%#lÒºe…ÜD– PO=˜°P0¥:RJ{ŠÌr­6”.Ë&©2š“UqA™xd­vªïÌUá9’P"³,éƒ9˜NSÄ£Ãl>o-n1%”…¹ªU'ÇJËxæ 6·H‡[•£aškÕ´HOqšæFÙUÞ¬V³Ê–ä 1¹ì£Ñ•aùRÇ‹•VÍ&¹½XÒ±4ÔBk¡ÎÎÄPÐDÒLÝLSÒÅÉHß3o(xt‡^uéÍZê[ZnœéŸ¼+hêNÑ €â~†Àò¹Ë»aO©mÆÝR›Ø¼J­(H20Ö)ó™Xh¿1P¦¥#¸™+ðfâBº‡ÿræ@©¤×y½·Ñû>´~°ü­¤ÆlÐó<ªµžT‡®ýï7йVf*+^˜ZErг‹ëW¬F¼aáîQ†¥;Ÿ®+°Ï…ô³à]yùÊNç*ùÍå|œ­ÂÍš`êñPŽf®2¹x—½ .j¼&|T ¯'Zâ6<Ž= Üô>24NÄo ¾6ø;qùcàÈŸÔ æ6½ÌÉœ»YëR „Ph?Ã.‹iðAÞd'Ei™žõ¤w23¦HJ³s«i‰,ªÊÏ/XÊl¦ á~ÃcA†x("«Iw52˜³XÍûÌ¡³3ÀE¢õ«ÇÐGêþö@<¸®&«ö9œ «™zwå›0pU²˜AH%ëNnÍÁ–UêˆÜ¬êzAà§‘Ø;è%º4ÒK"):Y2Ä"ñÏάX7SÅC¾ïÈCUŒ;Lâ ´«-C¥ƒ,¬= MmgF!FxK†$÷@+Ñ D,;]@*I:;Gåù\73RÉ12bwô.%ª’#§÷¯§åE[uýDд3¤ùqb-N¾ Ó£œ¸·mzÊÕýÒòÕЛE¡.óÒAf¦ÎYÍÈbšiÞ*ð+\^a¨džH™÷háNyURÊÑB•…‚³$+tFí é Û)ö_@–¦{IãÈμÂNçP0KVøU8k2zXaËÌÃ4ïÄ>MD¬`\í¦M3@¶Ù}Ö,2þ¹žÿ=÷_ãïèst}vV]¨ïPM‘›‰ÕøIÑÁòÓ3U€Ô/Û\"/r ''ïêT rMÂCìž$ƒZ§¦M¦T]%pR?J ¨þx#Fïiwäõ%“úÁOFÀ‰:ô…j?*ýRYó¾ :†z |òœþ„ Îr:ºD’ Üi¬Z†»Ü,€ï}—X²lŒÔ÷>cÕÀÐÂ—ÅØ£¡gÇó+ë4"Het2Å”òWC÷í¹¾)LW z´†¿Å)nËkC÷ÈÕG?æ æ~ÏÛ3ÅK8òÀ¨ØL‡¶îW*ìÌqu<¸‘J?+ËØ³ ܳ‡z<šÞÎ àmœ˜½4üÛWC¿¡¡gaõÇ„7,6½ÜÃ…pÈú·ëôô'°½”KÿA!õá(—HÙYæ_­"·‘éS59ç |>W²#ú×âßhÕÅpõ>œ È›fSêݘA©Ì¶ìœÀ¤íhVCHÙE±,ÇÆZ«Žž-2£az_÷A:¦+³3ÓQ .eÌüÑzМ Ë­0à£b¬)g2RMhìf1fÉj(gAB«eU¦kVfVºUcó`SFkaªë8ÁKµp˦ðÅÕFl¹Rޱô›n¤Òvfh ŸNô]Á©î†Y1La«z¾¨õênëÁ„ÖÀ6ÊuŽR^ -vÌ4R³ñ­ÃwB_ÓÙäqFz(âíNÀ3V%¯ÄÀÀ¨0÷‡0Ï™j>¥÷ †¨×̬ó«f鮸<Ý€Ñ: ÔíR§Ò 0ʵ³)km(b„¢øÌ2ùNRøN?Aš°2"™Ïü¡®Z6§Ärœ†‰ÜC[œŒ†6 çtîÞ û‹yÞxRá4cF™.Çë&ŸŠæˆÐÎöÖª’º^žÓMÌ-,ZâÈéîYYSünB„š]æ ¿Ë†í„MÖ<<1@2Z´ÊUMçT”WËœwŠÔ„éG&ÞGI(ÁIàâÞ„i¡f,GsG/š©‡¬Ø“á²ù|Ê)yó9ó“€ü)öôÓ=-îLLEÛwËxÿÙÐõost¿ãÿ¸’ÎGŒj¬Ô’qõ.@$ئÐ*‰뤶Ëÿ 7 nX˜š‡è]ó”‚—FØî¿Lv¿¹E¿°|5ôG4Œùôà =Rýß/ÿ:?“òî †ü)q¨°cáóž£[$ÿ¦f*F;ÚÆ©£˜¢Ñ™ž¹/9 NŽÔr»ÙtVOÂ%7âf§ k¤„Eã^Ȭ٠V¿™¨K´‘§ ëÉ­+DõŽj'Á™Å_4f&Óqo¡ÉÒBý‰™5cžrôIöLrÓ!0¼»œâ`þdÊ*Ç?'!ð3……\ Ñ"ö•£cáåYÈ êŽLéÀ·áM–?>÷Aò;M…[±êI¦"¾µä3ôÍå½R`> ž?w.êÐk ix¬ËdT"Š2íãú ¥ÁAúhÑ}Qù‘jñÃñᣆ>úIJL)¯‚€wZŒ§%ùFw¯ò&‡x'«¼¶ï›Žˆ£@/Y\íRœœný‰*¶O._ ý£ =G‰ÒýBx3918ãÞ#ÿá•÷Qð“V#åd†ýÖŸö#Ëø%[Ω~ñ™À ¬B€gaÕb".*olEäöŒÖO-d5OŽåâZî<‘zsh“öÑñæùŒ«Î2S$VDZ¬´²Û¡)<ŸÄdM[ÍdÈjaÒzàµì ~„‰Ž!šx||0!b::†rÈZæh¨ãçˆÙÌF­eôËqÃëB™Ýdy´ÁÙ‚@Ýà‘Ȇ0Æs„ j'‰]_>IÂ7ÛC´Fù8 T4ÜB8ÒO¾ò|ftFVg¾­ú‘b°¥ØÈ®¸º3m¥ñ™ëm#bcQ››½º> Øê®»§A»·ó­ž%ŽÃ™TU¿ûéRªÅdPn€´Pñy»½¼š¸áz vBÙH;AN'Ï2s: 6àè¯ôÑ­fгžh4Y*ò Ž Cæ+41Ü<ºº3IiµZ)W>Ó™C* Ÿ±h!­}U½¶KÐNîô`*V« 4B;`ú¬gIêgžÃÃè1&öD †au!¡’= Þ} £Êš?khЇYfþEÏ·ër̓´@EQ6GåìvCƒö| Xùy„¨ƒüçf– …3jò\ËüA=Ô3ub<û®ýDÏæo…õßHíG{Ù· ­‹Óý;z$\÷.VÒ›’†}®„äû% æÙQ“þºEo«׺¶%?5zñÑ'iò³Ù m`d\^B ÿ†Áÿ«¡_oèá«¡ûÄãýyõþª´¤œû=ñ£_'iŸZHÎY½Õ®uV–ÖJª¥#(§ -,°ZÍbf«°ÀÊ›,Nt–²šˆhôo箚³™oüEIžWGþòÞQ0TÏó0*ËÏÂ{¤N<ý^«¥žýHÎVZU>°KeÍy>©:×\4ärroŒÒãì¥v2“‹1|tXÍ1:y>†j®xކcvG¨3ŸQš™ãw¶ØCºe3÷°E”C¡¦‚œvâšññbë@/&JuFj43U]hÆ¥¥éôèò†hÔ¬âÐ{Ä6Û=äc€)Xó“³Ï¹š‡ÊnaŸÝ¼.’ŽæO4£%C|RÊ ¥šû©]è'6Dž³ÅfBÞMÑÇS±‚î^àG 1ÂÚ¦#ÕôWr'{C‚•;s3bøf@óŠyã~ä9 u²Éü¶ÝÔ„Ô«ø0×Tóq3=Šh¨J–FIØæÈ”njÈzfЂÖÊ‚t]»i»Ì O£ B%[DÝ”q þ3K½’/´‚+á DùÂMK@ØgºÉîgø¥P´WCAã Y ðt1Ž ] ­èÑa•é)1Yw1~¾½¼¾þ4ëüÈkâ[]‹v°§ëkéY÷'YÛàZ_²8¬zÔ¯IÜ/ùœ«Àšk¬¢Ó¬b¦^ráî?@gCz«°¾•Ãy½ôQ¼æû¸FKÄãgbZWTí‘õÉå¿0ø54–p¢,Mè5»j—’³³&Ýx½ÕÂAÌĪ_©A^dŠvCrg¤®É9Ûp~PE@+’†xv–[-w‹ˆý¬<ï'Gy¶ªób‰­K!ùÍ:uFQz<W+×"òý¬ÕÚ-2ðNfZerÆG®Š—øum…Ñ™ýdØ(Æñ øãߌPt|ÉúhüdåÝÞNRòü U›j/úiî{€<÷£o»7õ@UvVzÓÌ3ëóýk|ô½ží7ÙA¡«c¿}™cŽóiƒo–_}gÚqŸV$¶ -ÉB0úzhL®‚MU¶ûÆL¿¶¨Q“y0©¿·O>øi÷MÿÞ^¹–`°)ù.®7õå¿v¡æJØËòÕÐÛPäj !USxi(cZ#BžÖÇ•3ÀM:½DîÛJó–Ö‰´§[^ÑËO{üR]¬/pÎ’e#*T(ï2¢6Ù¨¬Šx4²£ QŽªéÀ’Ê;’’²ÑûÊ\¬Â²t•!‘³ºè‹¥¸º»1C4ïU å ZN´ÒªñlUH¤ØFOFÁ¸ñvŒ³lÅÖ‹Qv”osš9ø!#*3µìfïÈZÞH@èèZÞ³³^mçkWÉ•¢…ì ÓøÓV´³²[t&ž¤+••Œ¤”¡—z–x!¯ G°Œáš!–Idsažfƒ~£;Å6Ðclh%v:T>Šo]‰4•´1¤.¦ô„·xJ7aÐèÜy\£Y(G]Úº^Lp9n¸§±N?82”#«ï*ëvê#6kux—šºCÊ=Á\ƒ*é.M(Óq`öPå]IÑÑ\6´ ¾Qµðgt††=ov•¨V{yݺAZüP6H•½.’ˆÌ ¹±HÒ4kãø¡ô³³|ÞBSLH!6FHv8[Hë‹ìªÍ£ ;¢âÚaè­(†÷Ý”cPD3*,éœæ½Ê!†Û ï Éy‹Ñì–ÔRÖ²bŸtÃ=¬zv?4‰8YËZ=rÕô„¬^kyxoQ9½bÅ뺎ب3¿˜$CS0ñ£žõRmÀgV¯3Ÿ^:ÙÚKÉ$§ÌgIùÊŒ>˜•éVn¾8&a0KLU ý░ꊃ×szδ—Y¨{ÍŒ¥b|‚[@¤ß|Ë‘õl6¾/Žˆ*˜$æ|ûûY:5tu6¢µ$­·**uo—†ìŽQƒÚ©>¾ÐQE-t½UÏF‘O`c$4Y¡É|<®ø8¥®šqÎ"µÀÀ™‰m²É;«.Dc–LP‡#èX(ÉSMÃZ†+(œìj(à"çA œP¤·±ž˜Tb„9X2¿Ô…V«€b»é™óTÞLvJ“ù %no†Ï˜zð¬§?j1£0ª™uÆAÍhõ½Ü¨ãa+Ïr!ÏdsD¬ßê¦9Œ£:LkÖÅë²ÀWÕèEóµÙªÑ«^þmºô`t2ÇÅm@½lßáŒäìmé6¼êÿ»râ£Ì3Ù—Ë÷IÚŸ\>.ªÿ,@Š2‰•Å šD©]á‰fŠN 샭µ†EŽN¯0¯ÝBf"‰ö`M†ï{š£Èüdî5}÷í{bnøçúi–üYªÅó<;Ýî?#ª;pzQAU¢ïXøþ1,#¶MÊùYèƒ-ú…å«¡?¢!LÈ ‰XýØøÿ õo5ÛŸíô šcs,ú@?×ÍàÖJ‡—Ç5ñ¿g‚ÿ‘¾/¶÷÷ á~á§}yˆ#;gDç!ÃãµbíÄ:«U›7C3󸙏cê£ò¼ß¸Ê#УÈÛÉí‰FÝ! dh‡ñg91Í}•[åˆL çNÓYM;0M(ï¸>V5ã*'+¯Æþ)gµy?C>Ñ$»›rFC…© Ä[6,ZH(X³Ù ÝäcÀ>öØŸR¢ñfDÙÍjÜå¯6€% mfÉÅRq2aª³ÖÅãQüR/¬R @9’vØR¹`¼~Þ!§æ¬¹¢.hdbkå‡=)Vs5L›ÁŸ>îÙ.^‹"€UðQ#÷F´1<¤þ~*§Î¡‰hƒ¹¤#7¹ÈÝiZ¹ÓÞ¸1BÓ ¢€ºãã.çðGp‚Jx4")ÉnÚ.¨K$E¦ßzZc—‹¾Êö4ˆ%*šÛP)˜9 ªêŸJ_1ÉU ‘ |1 ÃVv³†ŠY. p8Å'ÙºÃCo†]*fJŽ©PP<{€ãåÚÄTê[I¯óHm½n?ÍøyÌ=SýÓ{Âgòc|½Ç"îßóºÏäiøYYÇô^¸¸HJÓô€xH  Y­‚sŠÎe¹za†Hð1<+xˆA™“ƒÅcFkw(ÈGå˜%2Ò ;m8±%9vº¯ïtdËÈC•i•Z'u`ïo¶ïSË¿i„üjèlèe2?DWÙ›ÙÌxÎ==yÖ¬šå9Æ ·=j@@êüËfÔ|q¬æPã»DöWvÝÐp}\žøØ#ì‹ØÍÏ.¿ï¨ ¨Ã8=ûCh>E5ôÓor<ƒå¬÷“;³îh&Yök5ì~Rt."ô(q7Ç·h¥ùfåìcÕ ôÍJØ×ÓÅ ðeÈ=rîd“édïǹêµÒ¨;?YÍÞÙ¨ßÃúòW€ÄÆNÙ%ñD=¤î0Ž#É+›Ç*´æ³”K À™'S¶ÍÆoª¹ä6{qM<Ía˜fuÆÿ‰dè‰ñuñڌϼåÀÑÔ;Sš³w ™&¶f¦µ€,p? ºˆªzjæë&8{‚Æä'g³?> þ¨¼ó|棒ù´/d1/¬ÔòirŒÉ”°èœÂ§˜M%:«Gé;5z¿O äò‹gF“Öpx-U–ãáx#%ÂÇ[õ#¿*ŠÒ„G]wÅ70+6³ùH‚4D'óc+üSW~_¦ 8zÎÒ¯` °ƒ¨'Ð ¹tŒå“l h++ÐÍOÓ]Qç§Ãzùœ®ºTÝÂkræc€ô*÷Ñò6å¥EõWÀäŠ+¬× “·@Õ=T•iÛýJ³XPx²c¦KÍF€=+ìª`Ïu¤À3殕*Më°þ3Tèi"¯9ª,T„N$v5¦Ì€Ÿ"KõiyM( ©Hr(L¿©ŽªyÇÑ/&ü'öÑÛåj¿ú76t¤”²âtE§éEú¡Ìþ±üà©k˜¯³‡ÌÎ'kÙ“óc…\,tWmäíÒ.¼Ëº›ðÎPï¹ òÌ7‰ân4hîu…»Wžº,ÿ@ÈÑ<”Æl«ÖÉ­éÆoV*¿*´&KY e“å9Œ¨ÓHàYŒ®3B?šäªšÐjF‰ÉD1éÆT§]»g3EPL§vçJü£)-Ús9£Ãl|Kí M'«GSI*j®„ž™˜' á3´sW¢±ú’ßâÈ$FÖõ w:{•%âŸÃÞŸœU´{zXDÁJ+/íÌJA¾yIªh¸R¤w¢ñ{$d‚u‚¶+àH‡O—¡-¬ê‰jE^Õ%ídøä5„ÂÌð. äéI¾R¯È€+Ã(â 먞ô¶0p\ÌA50˲Ã. bz18ãMÅ#®…ñ;QMxyÒöI%³ñ^.>³…`¾Õ¾+úM<$kî`däU´€Ê? {wù¡&ó»- ªõ«Ö¸Öo]îUÃFÓbãWû ^^ Uƒ"T¶RY;s†N4 È93593í&Øsø¨ò#\ÑŠtM“p;É9ªi¼Üˆ9³v£ìhä¦Äž "á×K³¥§!Gï‡G+Ô³%¼’•Xˆð8­Æbý•²Öa͆u¶³L|%!Æ'ÕÎìŒä(•‡¥^ƒ¿£¶î‰oÑÇ…÷«%“”W¼0R³K3ã\Í;ßC!°mC>3«°4nSäÕ•¯Í¤%G²p&poœq–“>ÌÈY°‰VNj†æv !Påq„ìVةڜ˜ùXCv´4(Á›jo•Ù ½æR|2þÑð›‘ä^ôºML\Í“òr¼Vé’)&ß° V«au¹%–‚Ìè%ÙY;±0(鈛##¥`hçZxi£ñ÷ Ø÷¤R>.Æò/åÙ¥Fãa®’Ålö_»Å`‹pKd?§™'˜¨ÛCWǺöU#BL+n,ÀËäduâÙ( ¶•Ï!W¹Òç«+Á¨Îa79  þ¼›vþOŒ'e3­å1’ß¡èç¢5à·ÌJz.ÉS¼§÷†ÐÒcqž×óè¾û~aùƒ†Ú¯†¾zTøz-¾x^tFu6´3s$½€ƒc4©™¥Ç˜B® ü¢Þ—ðnÁ_5¯nVö+uMf­X‘Îÿœõiöý§ÚoZœÓÊv+÷š†ÉÖ™ ÛNä2S=Æ"; kû "pqg¹–rz*•]ÕU´'˜q¶ÿ#½%ˆÇ]JË}îš„ê÷(ª<°Ín]Æ2V\³‹y9aÉǤ/ŒÍDÓÛ9)='T9·)îDy,AuÅk³NZ¾Z­–’ Ñ0´8†n4¤CÃ;>ÄTÕDÌbæê(•ˆB&È„'JWæëŽ`gÞëò”Fkfc/7º–Î'e'­n¥­ÄdEŒŸ ™-NÌ#ïƒx¼œ³úÆ\Óªú5iðÇ@¡¥ÇkbÍIŸB%§ ;Gf°£àÔuVmˆè€Ù±øÑè`åbKŽ1˜MÖq}€2Ë•˜-€«ŽãÓ¾xø,Áã¦KàpØPbé¤ûG²Ÿ…¹0}exjwöcÖðSNÿ ­Œ­˜Î÷<Ä"¾]Î5ø=ñ䯦sŠxZ•©þx#ÏŽ4¶µs¿ÍÄ;+6²Ç N ®ªãÕ]$ ñ€‰õLÂYVH kvŠ Ûy®Ež*ÇÌ¥jw8µätk<;€,»±±VÙÈÄ¢°ÆxÜLŸø Ñ|¤Øp6x T¸éäR£UÊÊ·yíeéùܳ½ìÔgÛvè~&XÝù"ßÑœbùGȯ†þe ù¤Â¼zóÓ¶û’4¥¬yqí@pÛÍ¢3@ !µ¼²Žv£þlãÜ5q– zßÊjÜű“ˆÃ›Y…ÌreoÅÀ …Á’ƒB;ÅY[ßdÔh’î2Ø@(0NVÿùÓü#,¿ ]òÍè¹hÏ ®BuÒŽeL‡eÄaEVa”Z]y(eü$Ò‘;…h¦3ÅåO+.}ÎßS[ŠˆœEkîë®I-MÛÏY΀ÐbæR2¥qBÉîÄ4ÙN9MÒãÜhùqú„‚'eåtÆqŽ|8e$ÚX›¥D%ät«Äʤg~TSZ_’GvÊ1y5™p É ŒËôÕ`°Ñ±É’†_ÈÆÊñHÃ:ª¸œI)žn®¤“xh=º³¾²Y•e³B+\ugä Ð7€ `NÑh`˜a*§k©Zsáq$»cÄqÕXýì˜É8HñÈòÔ’Ž_ÀUæ›äÔ‘qurÑ!<nQœ›ïÏýÔþØ]"<…sÌ' ÅÏeo rÞ\#Oßt ©×³Wë«ãtUD|è3ö¸|’™4"Ñžg¸¤Ö³¶»2–ÓˆV =¡.±Ï ºË©ãì„+<µöœL³ ³§ÛäµjŒøaçÖ8 Dckz‹ž>ŽŽ%Ð3™7’[(Z üa_ŠÓaf8Ž@6¶I)@yèÐGþàZ>ËC¸€åmgûóºó²¾¼{"¼ÿa#äWCÿ× ½H¯šõÃa&>­³¾*o†?ƒ¬;³Þˆ£nAùÅd-@N®ªÇfjl3Sß:vì©ÛH—éŸÉZ+ÓÕª+öNøiÊ1É=/ë:É9 º˜×mÝ×c]e&\·uÛå¯mÙÉ8ƒz ý ¿°üN€4ìBÛ­˜ëJr wP…CSQBL5êñ!ÐÐêÐ…svSøñ¤"” 1¹µ›±é åéÙ9Šc¥›®ódÿ5pðŒ®:kêŒ{Ä1>^eU¸*äGr^¿dH*Ÿñ#Äk†!Ñó\Þã÷W¯BéøÙÒõñ»(ãT¦ù¼ZÃn‚`w9ˆ‘>°ÜóÉB‡X÷~ãÈ3xSf|'Ï®l$¦#Ý©äæ™h %*åY”‡Jø çéÁø_Gð‡$£LXL|œDØgåùñ*àoV§éöZ¸ýÐÛ;žQ£‹T¥þ–þ†w^Ë÷¾Ã@}åc=–齜?l„üjèÿº¡3盾ÆY95RS¡Ž¡*\tœÒ»ËÅ ¿c¼²ÀV–‡U¢€þ ÑâÎòàÍòó ‡*ÁÈ`~P>zžÔ¦‹ žû² ’1hÍk[—uß2„‰·yÛ¤ŸH"ÿ·½ït&“lûqøýØWy6»­”<õÞü­üáåw¤;ã§£dµîþ–K&ųÜ)=CXÙÝ€ÎÎxÐj¦˜ôàfƒËM¶g?ÉÒg)»J^:Ëù!v/nŸ¼V¬+ý¸LÎø=í¦ý§Yj”­¾<^*DH ž˜ \ÀTˆkÌ_]¥x6úh©$$rdÞÍÓ+E™sÓeK«µš„R–‹ã˜v/gJKÃ>“!žèf%®Y8+ÏLr¥›ÁzF‰Î~ŠìD L,Ú9ø òô"ŸÇ¿1¢3ƒÃA‡öê,ÜÓüŒÊi2z Üo]¨ÈŒa£ØàO›§ø0è„+‘Ì â¢wè[­§ªÝ¿Ã¤ ™1½{O\i°Ç¾é!¡TžŠ‹®ijŒ·)eèqľ¨¿}œ÷ž¯×W¶Ñˆ½Æ´âg®Ú•á•.½ØÂ8*Ì–õ # Nq„ØUN¼LfX§. ·†+r_8£L¶`È›I?©î&JO÷dƒQé_E¾}R¥&¿“ïƒéM&G}gò«ž‡ÆàŠ»ýÚÄÚÂë—_¶d÷=7èBºoNþçû2ÿkg¾S.¸¦Ðo‰ì÷§ï¨S—;¥ý·úØ/nëÀ‹øjèÿ²¡s.Š»`ülœŸì§ÒÅláoCBÕ:#Fìzr…!Õ‘gÒ´Ú†C¢ÖÁš A=˜y±µù–á?Ú§Þú2ǹSé'¬~X³.[tPˆÜvÊÌ™m|´ër`2uÈ®çlõòlà³In'y÷€´ÁbþT‡ûÇvöhÈuíÉHуñ-BÎì˜r~.ÑÙd—Ûq§NO³v*,¿3ôBÆÀ< •³°< ÊOxG £<³,};³`Þx?ZØ®E]«­Û¹š³8Q³hQ¶dT6Ñ€ã, ø‚£#u†»œŒpõêiΓc9º²{:Ç}ffÇŠô`<š—QCy¢GðÏXsÃöx8cx«7ÒêÆ¨åÂ×ì$&µ4{11aq°Š ñN”WÍ!»A)† ¸F¹}â$ÁcÆê´3†Ãë‰dÚ…Uç%EävdgÔ–ò0˜|KÝ÷/?#ŸßG¾wcç½püÁQÁ}3Ns¼é„{‡4}ðí—MÃ-K8ÝÁn;µšwÇ©œ­¦+¢Žk«Š®1x(H©Çj3…˜6â™údŠ5ÓjkL}ú$NÿX/g ;Œ‰@Û‡Jºû¦òþ@ÑÕ}4ªí/A`ª#4e…zØøÆÈ<$N9´;ÿ aä«¡¯†.%Œ®î;&¾f3—ÉðyÏçå>AüD¹Õ»†´SÓRØx~«Æ«½¦zCÝœ¦¥ãF7²3ªX¨ÃÔÎ ¿ú]!Á2!ÎÉ&,¨XG†6××^e""‡Šâ3zŒYYÞ(åUÂæãMLž~HœüGȯ†¾º-éìÞwp¯ Åïl‘ö8šóý)€4™WϤ‹V¿S¿j¦Ò¥¨P5êrjZ±f¤J6ó:èä¼Ìu;öºÏ¥Ïf šçmIKH—¡NP““ëXg¹›´­‡À ¤ h;¶mŸ„ò^m„C˾žA!æÙà å4Öô@Ê|Ž1$itqÛ^z”APnß‹ìÿØÎþÙ†Ü)p¸Ÿ•cûBkXoäÖHx“ò1³Qwjz#:—t°Dš!ÓãY¾>Ó˜ <;m,F9ä½K ©Î™ÐHµ ‹µ«žÏ°¨¨7{®aЈˆ‚“§Z¾¾%Z½³æAR5Ñ‘ ›SÄÌ›U|c‘cå|¤3OЉtU°xµøå>23»É" «–ñŒgQ;Ò\Íñl÷2„JÖÓ€¾ºœõÓ u,)E¹1è.³ÖV®ܦi{<þå,¿lguÏ|Jy]Ëðž8±×K¿r"ýjƒI8œ¡ã I=öhO¢@Ëí}ßêÙî <µû×ÀštÑQ¶YŽ÷;+€H3 Bp•üiD?…‘ÉAºWƒ’…Ä|9³£ÍFUg³\ØÎîbg½áÊó&í¬ÄÀ ¡z7gJvWÇÚDªŒÀÂ êŠ š¶Vt?CÂÒt×2ß7~r| ŽÝsPãö¡$pz¦N?-ÿ†ò«¡ÿ놞§dÏÝK9cGùä|b‹>=Š¿Û¢{î™66”¶@x·¤h–”‡!JiÀ@j®>‡ô A!P[ü—¶l@h]ñ $8 æÚ‘þìb9¹©~’=5Ól^!³cJ†qйH¥sµgÜ7ÐãG^Óu;í›ÛCÙ#LŠlõ/д'@ºjà£G/<6É%ºlG‡ WRµfÖ‹ÑTÝY¼¨2´³fDTÒ&À[V‰ž•`‘¾3%z ]Jµ(¬‘ý3Ãkb1žÂ7]îXÉêáÃÐiVãŠÓ¦KMº¬¼Ý…^ ÖSÃG‹¿‚M:­Ï¬!˨×ò³Í´æQÒ*0¼ªÞ3 ¬„Dª#‘•lçEïžh(r:_Qü’âA?¼.›å2°uU0O›ž«Œ á¦ðÀP~tc ·Kïª2÷ÓEŽy@¿ Ès;‘~ú“/"ˆß».W´h0˜bå×àŸN™›‹ðŒNð v!„œ™Êg¸e¶u‘£'s6°é† ‰_ši_.$™PŒ"ÄVâ³Òë;lÄÏÆõ™™ò:@Š2 «ÙZ+LÌ’As¦@7l!Á‡5j£0·®¨…÷Üw úÛ™ƒÏvãÿ Úæè÷ïQ0ÓÓ½öјYß÷“~|˜»}¤¯†þM }ÿ–XÛ翽Eç;[ôîããÃ]º©”‡?8ô‹Á@­m=[1XèËìçeñNæüe©„Bó_@ÈK’­ÛA ™ ËZ9%Èg!öèçØwÆ€¼‘ÂÓÊø9ÔøÄdhF DX û8{2ܰ“®Ð€.O¨ê¾êç@ÚÝ^[I2Š ýÂò;Rµ¤Ù =«‚b0Òs ÚÌ{b½ ÞÏ’w+ sgIWg%¤”¡†2Ë`±–öÉd;ãÑD;®dª†ú8Ák"qê½™ˆótSûQRôj:³ë<35Fñ»3JG8~ÔÍ"X H§êÅh 7±^ß-}¢:Ÿ ö•¤ M´-ö¬i– x—Côéÿ„àA‰®2Ø©P( È(±„ëS%½x\¯#ÏM=ç…¢|«õyͬ_ã%–tnïÿ‘õÕO,ïÈë»$Û7õkžxÌø|k¡£ÌÎ"_T˜s*ÌO6f0ÕxZ¡Ê®J—²Žš…ÁÄ™gRµ^O¥ ¦Ê'†z#<ÐÊs (€Èø¤ŒX]8+›ªi™z •ty<¿X’tc´À2’÷劉¿ãšÛSÓÀ~¯{gÔà]ût Ò8˜ÌßZî$¯—?q„üjèÿº¡çÎã®ý¤–)¯Ó]›ã;[t‘†Êg úÞ5tR¥ChUFVÅ7ù«2?ªK ”4 ´Lƒ[t¬ ØD ”h9ÈÑ7ø#€CkĆ˜ë M¤ã,/–O"лÜXfæ,ï(FÖ”{I¥ý4@šeâ¹Çü¿24ýN€L)1Yœ(XLH +TO±[:«žUñ*êÜ;"ÃŒk2‘(CAÆH^eU E ¢•9†Í‚C¨’÷”æ¡IAlr59éÕ.• ꧤÝ`q?È;ŒÆdNë;™?‰üމŒt#¯v³(–NÅoL"iQáé¨è»QèÉj,(þBÔÁkMO˜š÷Ô½ë2¬Qy3~z_õ‡-Ú…uÏj\ÑqN¨iĽÒça"teÆÞÑrôÞ4]é‘GÄu?þ¿töüÖ†ìºÇ_zÃVX-+&:xU*¶vzxáþJ÷u`¢(x6:“ÅÌÐ÷Q!ž‚z£(S+×ó SyÍ3íEt@Sa±€bA…ÐG…€àF;°BŸ‹ÆX à"%Š$ V¸Øva´nôl+,¯Ç2]`ÓK¬oº½Çý ‹îZ˜ß\îÄç,æûãó†~ËòÕÐWC]CïÏêѽ\³ˆH±I'‹«ûç¶èHKª}YÖ-lYпë†å™\±TXf(¨9FƒV£yÃ;þÁ„Èò_œ¡&kâ*:+“hÀ8ô8Ú ÊF9bCÙè9ùƒ5Ý>ôøüSŠ­ÎsÍcë/ñ>~#@R2ô)4› ôjµ`ËYý~×ÿ)£"þLvmŽøe0~vv ¥šNåóscy@fhA$¤5ó°YPêu¹[tˈU‹i>#QÑ[Xèi5m Å‘×Ú9¬UR9VËuæÉhºEˆ`%ôI­|²û@‰áŽXÄ2_0SšxG¹³Œ{ý,zžXtOJ_i‰Sç>ß÷îi]ÊíÃo2÷0K¸•R 7ÂøðEXÒµÓ§j4~pù~C¯erž œÎÌÐNñì ôªí\áhq¨ã¬ÜM üd澊yÝ.ä:ÞjËê,ÙºSÔU@¾ãŽjÄf`ÈŸšR,¦—Ëu1èJM{0Í™*Ä‚Z˜ÒB`dú é.¯Þ_+>WžÛíÔ8÷Ñý@? Ü—;F D(cΫžŽñ >C!?Rh/ÀéÍQ׿†Ñc¢6œ¹Ì–ËùÕÐÿMC¯èB¶¦RAOó‡t0ÕgúNÇ›„í7¶hÇ5îK@àyòßÍß54‚â-4é¤ÚÖ ÷lûŠ€ŠÜR&ˆf70Ü­LÞëíYHoù±x‹Ðè+þqu‡ù žØ¦<­˜&Öz¥æù =G–ÞA§’vï>wzebßü4Mûw¤f!€£'RRÐlúÐù„Gþ”ŠjLŠÀ£<Ýë´S‹¥sÐwöŪÅv 5mJd=3Ä<“м$B 5ÄÐÚ±t–@O&겚hÐbÁEBóéÁZ…=ƒëº’ãz0 6¼½=X‚ñ¬ÂìTh(÷&*V^L3qº¬Ò÷‡+#ž‡ô.< ?FÈo-þ,÷Ós~l”c%÷2T½Ö†=h¾QN£©Ï—x}sy=#ç§u}Zgƒ:pë©iwN>s7¹Ž2/¨o"䓃šÊ™"Υݼê~8< U\b”QO/­ [˜]Ý™eU}ˆÏ_©-5i N°¬ß*já»?Ôj•AÏ€}#7íÂà|8Q–³ôï÷ѵ‹B~§Æï£=M—žÞ<-ŸUví伤!˜y#Ý匾¹ü‰#äWCÿ× åÇó¹¢3ÿ`°[r}N6¦Å´Çt…„>Ü¢8¥2µ^[\ü§«k–/-%¬eWœ`´ (Ä(Ž·ò°õ8 //Åü’žÀ‘”«Ð><Ã÷z¹ âG$¼Šûí]ÎÌx†?Ïeþϯ?—ù¯k ÁøÂç§íF~'@Ʀ‰N욆hfs:™­)‘’ Çù6Av»bÏ8‡ÎÜè@ŠÞx:à¬Ù`½B6Pf |27\ͬ*;h¡ùá†DD‘ûš™{ ¨DžUªžÙH éR2Çc­¼üA!þ¦òEÑ´ž÷ÇX2k忳ü‰ÃÈWCÿ‚†F¸Ñ,×ÿ€-ú- ]ó?ü0Dß?5…|¿ŒÎN=gÇLûÆÉÅäÈleR=ƒJѕΣjÊ>us0ªIçeóܬSÈZ}襃L»¥±&sýµK/õ½ |'< ?u•ÙÙ\ÊÚ³ˆ1gŸ>ý¸ãIôõ£xN$ÃS¿ÜcDϨ¦<€£8"Mî ¶J|ûǼ£Ú=Âý}Ý£[äSañšŸù#DY™ÒÓÐEˆ¬3™qÍí§\Ðfëð†Ç-#HI'è§jà`µqŸÏ¢úp®šä!e mŽª/ Á:Z4¤d¡HU¼NÊt&•ˆ1fA „ôˆŸcE DòÓ•V`Z¾Y" CâiÕoÈ÷÷ös¥ÄG{ûÃŒÆðÒz}Ïå`š´‹|Ìѽ:q\©“‹ôô²•WÖg|O2¤ón‰Ô™Œ˜ŠÝ<™u+¹3ieÕ’µjx·RÐsãE¤âæ…ùÕ5gÒþ+A6¥©uÅžI8ÌÈx­–7-ŒîB³•RglgjoH·80Ç2½Q7Ö'V…%Ú©š ý©tÌÔT¢ÎW¸åÜÙïÀ¢îâëø¤ïOwþ+ÛWCsC„ÂôlÑoiLä@8TU~±h$O;ÓïkžjASظã×¶´¹í½KÏdž!ÄM×y›×y_&^ô)o&pD€”§wDdÆd´+‡¤%µ—ן–÷$üÜ-¤¸–¶.{fbMÒKFìÇÒ{bô-ðno¼#¨¾à¦õ¤ýØÀ»õþs<ßK*Ô>ïÞ-†¯¾7á§O†ß ›Ogø`<Õüáû9ìÍgè®ð[x[µÖGAÎA€Ï9}·Ðar/Ã÷RS)ÛùŒêá!ðCÕ ¨\[ƒAÕÔaPv¦5@²Àj¡ÑCgUt¤QƒßœGì(ù•Xl¡?ÔE ™Ϯ§ Pê'¢øå½ýìøÃ ½–X|g‹“kwݲü‚·ÞÅ´ Ô µ¼j²Ñ\»®C ô¢šV”'¼[fŒT¨?œ±Óo ý\*KY‘˜”´Y¬ [F\9Ó8¯±’>:¹™o¬ÿŠôTÁ)‘xUh`bL!°]•H’ØBý {0ÏxÖ&gÃLæØÂ$éå{)Ô[rôÚ§ììkGþÐò_ؾú›9P›ý[ôË =vi§P‰;sÍ?³Ì2Ëmen¹×¯°ÞK¯}@äm‹™ÕQ˜Ò¡ã¬<,ÏGíþàve÷áÖè„(³Ÿ™îcEpÖ²{CŠ %gHÏëøù$ú¾q·V_ãFï|||ƒl§•È;xtÕÔMJ¯âR·ÝÍ †n‹Yü!¤ÀLƨ[Lê¥óçµÎñéôWV-N!gÿÊ•>L4¨")üÑz Åfÿ#Ïûoõl×o{O@)Ä9ú5Ã!*>/ ¹=ÄäÒ–â‰Ùvözµk`s§³{'JÖ|êtJLE£ÕïٛĦټ[Îu¥Ýn>.æ´k(9‚T–Yù¾ÆŠx´º`~–þœfúÉ ”(DÝ\¤|&o¢„ÔN„sø v‘¯ðkT“/Z}— – Ÿ‡œf!ƒ ÚRMYXf¾pßGJy¾lÂîQ¶+˜gòî ¾ýâò_ؾúzêPþ€-úå†4©VHÙô« •‹6ô.†þ½E®P/#M]ºŸÛáŸJå ùkë´ÖmÿY@QÖúxÖÈ .9K“ ê{\–&p6[“~—O²¿EÙ»Œ0ß]>HÒfO¾ì2?œ¨¤lR²;@zjнE/w-€«>£ê'¾ñ£ÚÍeoøœµugIÜX6ÛÙë¨Ã“gÔ»-n³›÷ rÃb{çO0«5Ëv–ÍrÐd>ª#7f†©§°ÐÈY¾Ì'N›ù!&­–y³YeÎj“iºxúL·ð ­Œ Á´,òL_M½f#·²2™Zƒ²UÕ“Š4Aä…`%ø±·±\úŠßâùñ½ý¬øóÓ =&k凱]é¾tÆ:è¶S«@QçÊ’Á]ö¥ÆcPÒLIê"Ø“_–'Ç'¼|¤Ršá°ºwš7ó‘2Ë"?Z5X’ú­¬HŸFD{¼»œtM+ªôÌtË^¡,LP“ZIG¼*õªQŸ¼@]çgéz²ôE…4ÊNfš„aÇf i\3±‘ÎÚÙ—ÛÅa¾ä‚®b¯oIÇYÍØ·Ù§–ÿÂÀöÕÐ?ÐÐÅðØ¢ßÑP˜SÎê:5Ëä¸å#´Ÿç åiµæ #ÅVœ@!('&JHǽšft‘±$ Á  p=:/{kQ'WQç¢# ÿL+íÒ¡w(ßËß$T³Ëd?Å*Ðm_AÂÖŸH?º¾¤§—®Ã;2M†t¶§UÏæ ö¬¢\n÷õ?Pgã!(<a7—]jk­®‡›e–κð‰é?!ÅF—»t‹ ©/T BõPȪ€ÎrúÃ*ø¼;Ÿ¥d•œ‘xª UƒJM#E6š–áÈÁS`uh!q(Ê ¼’[¤°ˆ'>_Évå¸m4*ë^iï'hhÄisà ¶×dr¸ÅÂC—3j˜ã4oŽÉïío’´G¹P8áψdø§ÊE»À?h‚D“‰‹  ìáÕ‘÷¾’;i½FM!‰ÏZ˜È&#@2YFTU€åntÄĉ޻VuÈßÎXßAoïTW¬TZLpÁeøŽîpAÙÏŠ“–È’èùƒ¤/²}àz°ÈWgÊeÖÀë[TZçÊ|RöÑbO®v §I‘ÎØK¯`¥ÜÊé´¢â-‘víäg84ŽR²Þ ‚=‰N}’^óGËd`ûjèïnhœ[AeÍÿ€-ú µZ‘qaï+Ý2Z;Òê¾_.ÿÁRaJÖ¦uß' Æîn™a¾ŽâcXZ,‚÷”åh=îÒcMÓ|ý´×2–Š+¿£Ehà+†5å*¨nŸ!t¤ïr^ßòö­î5]´ ÍMHá„Gc?(²}‰ÿ³;PD0àÖû}’w¯Û²uÁªuË‚ZýzÈç`ý6Ó NFŠuZæ%¸vDønÝ»ûŸZ~'@R#àQ ‡ð´¹+(ê¹CJÚOÑbvwzÓøcªB„EÍüê+9ÕwÕ!µlÝY<Ä@‘\YމøÃJ†õjì¢ÎÃß¡áH Uþãl…H#€>ÆÔäƒóÙkz*¿3Üú­{{|^ ‹ÀA>øÎ(¤J–'ÜH§òäœo¤=§Ó ec©àÆ¢ö¤¼G)fx¶ZQêüÁ4“ êœ&¨QŠ"U0ž§ GÍð(›Çt0é´ÁC Û©E˜¦Ü¬6ß[2 v¾½¿úµ9Þ™1ÝŠ@á‚QÌc1¯êÑÃŒ¨NÐr8]l wþ¿‡ƒ¦iTÅãÞÂí¹ªñ,36’BÇ îŠó}÷‹W-üôö ~¤¯†þª†W’“ë?b‹~µ!Ë6¯K^6ó2¯~ Uú£N¹ŒÏ­4?§½Í¢3Ô÷Û¾íËMvGÁUt¥ù(Š AŒgK«G‚Íâ &«·)[;é‹ÚŒ¨‘ç$÷¥öùyyOÒ–>æHYp†|?-=†ì}=å‹z~ÃÓúzÆ„î:#ô£òiD<ú¿˜_›ôóìÛFn{ߪSØ#Àg[—µ® á (µÈåÀî˲´¥ÈaŽ‹Ÿ÷y¡X8h= ŠÍ=“ç±µìJ Þf»¿`Uû{ÒJ€ä‡i¦qTÔE|;ÙÓCghá:(E³Ñ‹VÕÖ4š¦âa-Æ.JfDåÕ®Œï˜5"Ѷ3#ƒ³$5†¨²&ֿިàé ÂPÔ4HIÐÁÎùÿlã$–A Z?ýæ{í‘.ñ6°Æ×#óý½˜ïÙY 5°="y5[? Ì´2`7ô}v M ö”Þ+౩Hç ysä~U’‡˜üä±ÒãT˜âRc•>Ý–såÉ+¿¶Ë•¿ƒ§4•%«§(£.8t·ò’ÛÞJæ—Ψ÷ш¸x*P÷Ýþ(ìô’°»LæUX6* ‡'€¤å¾xwkbLÀãt¤]‰¶o-ÆAúèÅZþÛWCÿDC£ÐòaáØ¢_lh ¡M«_gjF¯ 1Äys2@êÜéG™xæÐöMF{„= ‘'L ü‡ñfL€z ˆKOšI¦.ˆm­¦V½¼iå4p¥‰gÅóòõ–uø‰é‘NQ†ÛÍR!g¤—„—á÷!z^Ÿ3bíqu„>7ð³'ìA°ŠÞYÖD»âŸUP_ÛZ¨$=-®øðæc^úL}ë«üþì}éM o‡@ ¹5à|ÝëR{mòK­ð¢¨S™‹w©RTn„9þ’ö­jÚª¶5‹cT¡j•ÔõäT×§ÕÊÏœÉx4Òt²‹‚rŒX'…¬BB©¸îè  žv*çE`(R >M¦Q9t¬Ó$;T†å)¶EÛ¤­|Ìe¼æ_Èø$Ê`+$ô~¨Ìÿ$~…þX …LòD³ÃwqœºÎØ. Ñf>ìS4RR¡-E鵈Æ©~x%Lšy/ž.*£4p¤+5è3ŸIÊHKõ%¼º>­Ï9¿pŽüŽé«¡O4ô}ç³O6ô›–ÿó†î‡#<áö3Þ< ">>nÏcc˜F±Æx…¾ÓnišÔós.ÁŸ‘ ]0ó( ¿ê³3¿Ù¨x»O·¾Ù'N1 sá™r¨áF26;5£iŒèÈn~Ì<û‡-Û8¾æ7Ôù6Ô¶ÂH#ËÈd¼^¶cm®×äßáÓÃñ 1¢vé_—vHSéÅ€ì{ù'O@%iëKîMÆíI&©Ý |ˆÔ9BóPÏŽ+òÃÖ„iX@*¼ÑVì£Ù>¬ |"áy¤\J=„d+‹ÓÀe6ÉЃ|àïYY}r·Öcëà-ÐM&¦©‚m÷Qn“@±fv•†c[Zd⿪WªzÂá|“ƒ–î»íç–ß º)Oƒú–T!¡v{}fþì¾wÛ;7ºÖ@ÎîqQÒÁ&˜šéóÍ y þ ?€ Q  †[dð*­fw•ˆoÔ‚ç®®Nå-y>‚³2¥å¥ÙÆÜÅÜYMÈv ù֓ɪ~a*$szw–´7Ú‹aÈ+t¤¬Lü¨ƒûBÂÙ|ï ØzѽË%j´‡Kã§—ß F$¨ÝRh³Eª ‹OÝ^’­î¼;–ÝÈ´´Rtèÿ°‘N”,—6Ö<ä9ЧÁS3{‡Fã«M.ˆ•Ø¡†…¬ånq|(UdÌjKt]—/¨,Jêò•®qHZÓû9KÝßÎ<äˆø$Ç*¾«Â3Øs¥y^ ¨>ò F._Èt~qŒVÁNµÉ©ÑÙááÇ-³] Ê(h¶¹ŸÐAú€þáòþ™† ï~CC¿eù?mÈ?Á’ÇמzæïkÞ=âó/ I©+fÜx=w{Kcð[‡Xdèç …ŸŠ¬ Œ*«öjχÌꃫˆolõI;¬´B’i«t"j½I¯u´Cæ²3ã˼-“ŒšBœ¥cï27-Ö“(ìó48‚õËžù÷…Q+þˆùÁýÑ’Ò6Û.xɤ™%»5VéØïfhËk×fÏÈa[rìÄ$ŸÎ<ÔçøÊV%TÉZîUlÓ·ÅÉÒ©ôyêe*b!2~Ä•ÕB܉HI[’w‘Øi×^ '8c1$pdiYö}íë,ÇY€(ˆ8y®r›ûÖs;z2Ë‘*‚k4j£ìO˜; ÂÙœ¼Ñ[0Ç^쓼¼ñåUV€ "§ÍÁÖrÆu ›¹•"€Ï™ ëFC1h×…QìclÖl&oÈi3å iÕ1Ì›ûݪ«·ÈçQŒ¬A®S|¦žÐÐÿKîW¿ Ý#DW4é*4»@¦ÛòÓj¢ÆÎhض¯¦lLxÄ‘¥c+xeªM£H›ê^;:b)aiáY ~”´\O«·N©ž@%=À³ Ý}é:ã/OªQȯD*ÿÜ5 ´–KUÀ#Ù¢DuŽÕ+9<†|»ßA’½[_È©î$'ï$nímMÓÛžoÁX<’.7Ø}Jƒ;*ÏŸ4{¾ <éÚUYpBca–ìwGÆrÚ¿n3 Ì[_Ú\"XI–U ‡`M%¥Õ¶X.%qQ°ÏF!&™Ê/É៦±HÕ<ŠL_í2åÚ™}ZŠ`)XŸ¦é2ÜÏÈ¡*crV"á]ŽÕ,àk•u¡Xx“íÑÿc©´/hÔiÚÁ£È΃ëÉã¹ÆÛ=Y£œ™Þ@20‘¼±±ä<¯ÃÏ#2ó¥§òÁi0i—H «;¯œoEf?±üi@¢;Lj·WGŠíy1ØàΪ´t֩凈R² Ô€Qì‚ù¼¤Î[E‰:‹jÒ$WP¡gW?»VÞ_h[¡úÍcMfƒ2;*öú” ) &b©ìž¬'yn>5›f vB¤æžˆU!R ^ƒ!µ3;8QÁpE´ E투R°Rͧ¾£.÷˜Ð»°ÏcwpåÄN³Ú_]JØ¿Dÿ¶†Â ýt$éÏüiÿ–†ž¯·xNDÒÙ/ß&';͌ƴýp¾‰Wì̈MœVwꗜؓGaF¼¥n2f™û2g,½÷Uæåiž)ú<ÑûB†MYÛ¼t'Ч"Ù²,Òáäe鵯×íNaé[^6Z‹­Ò‘VÖ#ÍûfÂÅ£|›Læ™4—.h- ž sí³€÷£"ö?&Á!ÎÚé]éÜ]"ñ»;û£%BI`ÅNm¢Ê(Ò¶7· BÌí›ÅþÁ&–å‡$Sn™8#ITŒÜ±ù-çèqeäȳðÝß$Š’‡«à% §*øbßòºÊn×¢—"c_Y~òÒx`694GƒCö*è=Á ,ª†º \“à©n´Zƒì꘷´Ç…ÆkÂTÿ1®Pµã¥1qš¼åtýÒÂåΉ½Žv™<×üËÍ]ew­˜j˜3ºI,Š”wÿJĸ“©”v½åLÃWK¸ÍÒéìþ>î÷Å=K}†zÂ/ I¿ ]±E.õ–tk)5IÏ$m…M‹³@Ϧö!¦?9|Jô–²„<¤«Ü] ÙÍ5·8F“+ÁQ£‰n`ð€(³ä‹a¡Ó@×à…’%Cáz{–àífr²[ûl°Í4˜ å£è‡É?»ƒDÞš;bZJTíîÝwjùl¼íÓ-ÔKU Óý@ž¡Ï}x–¸—SùÙÜ䳓׆ô›~™9üo!ÿ¹†ÆnηŠáŸjè7-ÿ— }OöómC7eu>ÆpÑaä¶ i+C®eaÆ~˹L2¥?j¡üŽ2;Ð@B àiŒH’¤¾Ê„]cŸ!ÆdˆÝd˜D¶$¯Iþ/2 kÑ ‚Š“>jß‚t|a[È—Yf/ £:²–j€HYD»ï§´ŠÙµ´{uCèh žÔíØº|K’êG«2ÇÅ!û!süÆ”ù§"Haª‰’'ÍŠËTž‡e/«\}7ÐŽH’ì“Ü:$ ÁAŠn¨=ÉŸ€è¥FŒ%þëÍýbSÄZÏÍ(´Lü¶ÂÖvk¶f—ëzX‰;HÐYŽg`¦ìèMF‚ÆO-˜ÒGò7ÀK^ÌR"Jú¦ËŽñ¨ÙÖAjÒ ¥nxd&ãª2 £«¦¸:ÓM%ä‘_(7ר®2òC ü~ÔP*ðLì­$IG .Ô!šX#äÔ+Æ"sÒNêää­$T#”yžÊ«?ö®áÃo"ëAAüIûÜO._éomˆŽ!—P«‘´ÿ™†®~>œŸ0].Å—4àNºƒŒî2µ‡t‹I•öP»ti;KubiÕ“ÔêÒ|«q¥ïdë‹ksˆAfF‹ˆ´ÒãæyFÔ¡ µ06 Ú¥›Y‘„Ú$-öª2øSýP?¾;ø2‚d„ˆ‘RάÔK›÷½©e¥/j2lIÃ]“9ÅT·!„s$æ˜ \—m©óÖ‘¿ûkMoHt?uÔ|Íh½îEÉÂ4›À‘¼ýíó»ÏÛHY¹‹ž­ý”–ŽHOÆq—@ä"AO5ð|Fõ:WUÞÎΠQhW¨=mÎ%æ)Q'6É ”sŠó"ƒÌ*G¡Ô­Æ‚0P—QpeÃAU‰56 §GžãI»­ýÔ»ÕS0s"Um-ö¿8λәá½+_8DùÉßfÉ·ýøš>H·ôñ•FŽz øŒ)àŽÄé±L×O׈¦ãÙk¦Äß{¢Žü!©Q3<ºÂ¬é#ŠG;[¹ºÂÓší8s°Ð't)\A JCч>ÑÎb35bœ uFEVK•~ õ»Q0OÝ%ÖÎ Qµ‰0î^og q§éTƒVcKo4w£Þ$™Þx®*ŸžU³˜!Íʆj`Ü º¢óºÜõÃ4º8"GñCº§ØîÕ ß‹&¾Éù¿ãýIûa‹~Cíù¿i„ü'Ú¢ 5‚¨[8¾ûþ¿g‹þoJÓâA%íò_ ­QA¦óì Ïæ€ŠÜî ZelÚä¿økª¹²Df²`÷6¡"H@Q‡àK÷¤ÛzA?2Höc^dò8¹~Ô%¡Ôê"é@pÃÈ2ÔnûDÔ+4þ?ˆƒõ´R1Gñé£UU{ÝT<µíËÖzÆ oŽ%IGܧ-Èx>#etºj‹¥Lšrz®…×âQàxü’üoˆ˜È¤s’_´ßÒkü $Y¼O½ÃÃ~’_Êš€²Þeˆx}·ÝÎÕü_N¨– -Ts^DDú@4h}Z+½Ør:Ý1( í†:´À"ˆ6Az_—µ­Ó²ÈÌ›’’mn^N¹°¥Tâªß¨¦€ìÃZÄaÝl"å"Ý~ÚsÅÀ«â ,ÜåküÓHò(]qnPìoðÅ=`™÷¢ºÜs£±Û¬úYPÇßÀwÍ}´„!©ñËi¶ß,ä³›SWP‚³¹²'ÚX$>íN?¯x‚$Ÿvmè8Ð1¢BL¨i†tam`'îºÜoG›iUºÓæDËçƒÅ¶*E¦Q¹Ö™ i¿N6ÐF«S¯925hu@3kå׉Lû‰¢Bß‹Cà|c€èM´ñߨû5ôG6ä=9¹ž†sÄ}gy% èrqœÙu£¡øÎïMƒ÷%L½ï­jà[¨ý.÷9&"W#°®©*:uÈ "PdÍl¡ 'O²I×RXº˜ÓG4{Nª¡ºû ²”^‹k EØ}’¿Œ„[#Ñ5~%37ƒÑpCfL©å@ o}eøì yGZ¾„ý.€kÛ Ê'0se~L®ÓEð:Ï+ÊðŽäâ“À$k®¢´ÛžAZMz8¬-7èN:žËfXÛOÝhP²•ˆ4„&y÷yž«nЈPJèe¼œ©›€"~ïAÜJOž–?²?újè{ 9 ó\«J9ç“ëÉô1›w% ~Áû_š ³ÓÅÄ™»6»SUK¸…¼™ÛšŒ9rcÎøÓ+]KÀ’Î$‰'öjmh˜´ÒÁ²¸FˆUX]¸2c–¡ï˜èC²SŸâa…¨ D‰n3‹Xýc¸ç¯ØÛ_ ý¿7TpRR÷ýú-Ë4tÙ¾MnÜ9'Ò÷¡ÍËk÷p7Á×çltdE<‚<S¢A|) òÞ¡5Û?†ˆ¼Ì&¦úU^f÷%Ci£†šÚÒ×5V­­CõN:Ä&öA¥-‚~v'°g%û¶P%ƒ"$ë®,\’…*³c3™A”¸Ùš¼EƒB‘4dX@¬µìi Ò3V¤°Ô¼ý&oÀлõÕ­TÎ.[PÑ‚¹"£µ`´¸®²ùŠ_uFFÜè²ànì7K.l£Á¤e÷둻׀Ʃuÿ™óÈ?œÄÒ¡”:Ï[&X9gP3&(6¹D.Åx~<¡"o¶ú¥Ís[3lÚXæ_;ŽK4kñ™’ÓÕ-U ÜT;÷ÒDùí{û«¡ÿ“ÿ€ û_Óзcã;a &…{T‰^ɵ€ç1>P0¬ø(œ*M µ_(ü/=”…‚ÑÇø5;2¤7>ˆ ¡;ö™ÝL¿2Ï2xNs—uó¹ïM†=é±&Ä[z_p‚Ü:#¿D6n%ð¡ž1¡¹Í¢ˆWìW2ç¢k}”Û]A@?JçÚâ¾3³t0¸3ŒÁ’åÂ~ Qzßäç%üº$Ýé‘A“ЪöÑÌòtñBdsM/ ·ë¹tºtzÈ›@5Óò)ûÜgdÌܘiîaí²/+@»CPgÙKóÕLÆÇ9¢{ò½m‚kÓÌ[ZJíJèö-yíò,éÔÕaHªfɆ—Ød‚Ó;€üS×cí¹qÙŠ`Ö·ÞºoݵP—" À€’¶±â½¼×©{·üéíWCorZNÀ“Í&l±Ê°‚šÕ‰ ~R=E„°Ç:¿ Ö`§÷­gùüfœï!Ï=›’@½Èòÿè¬Ä Oxº¸ªDôÓf–VFÆŠ¢IOo67 ƒ-$Ô¡;‚Å¿‡Z—ç’û¿po5ôÿÝгðÎO7ô›–ϧØÙ”'«rD”Ü èݳw›OdØþT&¾Q ÏòÑL­ÄHÙùƒ¡é9­Òù,¹—©4Á>^Ƭ µè µ‰2z3hÑÒ·´Þ]¯}‘iTdåefIönAYÆÅÆ#QxK†5B+ p‘PªÅ!4esVƒ)–°{ϱ aD­$s€e“ާdoi¢sØE–¤§õ$À Á}ÀBDmØ §´U~:©/™HϤ𚴬 ©ÀÀÒ•B ÷ûÞò|®k’4E£´-\ÃCŠM&ä{B¹%©Æ9”|DuJÅ‘œ³¦&è'¢a-qî²`Âä,Q¶Ñ[ \êFo±$séU }’¡±Bï *‚DY°nmS½Ÿ›ËS’S0vrŠ UŒü ïT™á yñšƒËËWCgCî ùŒu27U?ÁŠçE“¡JÒ@C“b¡"Õ“ÉYkÌh>£DC {À¡dHH•!²9F‹vF6V0fV2f#@†–ª¨s„Ry9cúÊÔäÊÝôœ øhyNüe{û«¡¯†tLùw¥Ø´’%s»óCð5ކÂt¯TPrR¥¼ ‚AË´{O ‰Ö?r!K/@­:é ŠŽ¯ rae†HžtI‡Ÿk‡ôA ¾eàX—A ÜŸ™µñ+­6¦¾&Ç,X<‹äQæe|¬£j‰A ä]fâ°¸f6Ÿ—¾í œ¡†^ /¸EAÑ AûpQÀD§x¤Ø|ß ”Ø:p12Cžõi¼æÞö}©ïîNF=y™Ý†åØ£Ò•ò9c[ÆAšZº"IÑ£Ó~#@BŠm@ºŸâ¶ŸHĘƞ¼ê ÿŠŸ+æ¿LˆÍ¤D¯[“Ã~; }L½ïð·%uܯ¥ÉÙĺ¶"#Už7¥{mÍ™ÅjPä‹R<I)ªÍ£ƒÊN×]βµVæÎ<)EÅ‚zˆ0âl ÒˆÌD.AÑçÜÃ7KØÓòÕÐßÙcï¤õkJ·‘ÁŸÝBAã­vó#Î3`›e.¡Ì22íô¼ŒäBGGâ3*Àê<#ì#@¨ç€é#hG½‰)/¸s¦u£Pí4õ܈{dݯÁ“̪d+QR*ôe᮸ÆSA1i³±„[nöÀHÎ8’O裫Œ£–Sd“Ï5½ÀBf§²µzdô=­U¶GZ/ò­ïÐÖr´Ä­ÈÛÊÄ´#:ÜUºÊ­C¸¨CE"Gu×é ÏìÛSŠí„E&ÄÒAˆ€T|9 ùþs$œï˜ôæSâH9×1Õv¬™© aŽœû’V?ÛÉ6Ýn—äû¼5sn,\¯FºÙo‚u½d”&ïn)4˜$ñÅcU´d9„Ÿ†àF D#”‚ÒÏ`:ɸ¢öçášf?Á¾7Ãùšfÿ7r§Ö‘¥h5t6»Öò–+[ìÆº Ûhh7ý«‘Hë ªáÉÛK’z2w¶ÊD°¶KNn¼ße:±i¯yƃUø˜Žnè(¬ô¼ju¦»LNõïzø»ŒÃ߸·¿úÿn(¿„Y~²¡ß´|f`ÓØQe‘çLaT„€#‚ñ\¹×É®"V|P´ Zh™Þ?­5Ö¥Mƒª\A}Ýgd9POtH÷QÖâTˆ §3-2 Î C'Œ“²’l«:ÍF½w‚ ÇÀOjÛ]ëDu8Ti/óÆŠì$ Šz>*ƒO”i·'ÜO7½è§Kä®Û´ ®\óUxÿ ÿÌŸ\¾ú;rÓÏÖK*r%¯zHc4-–!» H*Yò~ÇôY7aóëe}‹Z¤[ÜHÍ^vÆzÞ©Ëo€$ÝÖBËÚ`,£…†¿›\ ˆi±YôH°].IÏgd†|ÑûåÛÒ¯ìñWCQC¿äP}oè7-Ÿ«>ê>Éå53îéˆq™1¸Ô4çæ˜Ûª¯]¦é;-3f2~žæ0—yY&Ö¾cÙÍ~aH´ ÍÊ­PN´;Ö éø¼YÁ¶í‡ÄlŒÂCh2Yúh²èã=îd$P, 0TÏ ¾*÷ˆ²ò ™ìä»`äz>[ˆ_ÀoNËžŠÅO’ ŸHqªsÝ£Š!ž9þEq¥êAtr.l›œ¥„!á©ÿõ6†¹ò|š;œw[ÍPݶ±ß³/ eyÇ 9 >§1•gÙY™©3ZDùyR°–­ür,*¤ÒˆÞÝ$D/¸vß¦× æíò'öG_ }·!wêföôe[{]ë³K›Y¬¹“[¤€hÄŒÊéƒTKO-Úxå{¾#’y yô²“»=$ˆùâi}õËMឬ«Ä5>vü+qô'y±àaûW5t‰ƒ§\ðoÛ¢Ÿl(ÜbïÎ¥g2ÜKC¯'ä÷eƒ‰ÝfYôÑImÛ³P.ƒXzn‘¾åI°]Q@„2Œ–!àŸJ±Ä½ÖÇGæÅR;z…/¹SÓxéE*¼©ÖI‰ÐøodhpÀJtÈ@–,Ò*¬Zتyw‘Ÿ-©õŽoó­õCñÙ®f‚2™¯³÷ <¿^˜VSÍjyNÉÝëîZJ™n ÒCf iøÁlþƦž,ƒwÛ”Ã!/WFjMUÆh÷*hI¬t­s i-ëì×NAè„€•ÑÍÍjdÀ¢N¥h­€Wé–§€ÖMÐ ´€ÊؽşšB¶Ð÷n)OWȧãžr[×ë‘«:ªä⃢”„Ù½“ 1Ì|딼1• ›ZCˆ3«‹³­Ê¸²Â+ó[øvù“û£çåQIáúÁå¿Ü{¨²¿Ð‘žÒ³›Ñ‹ÜY‘68FÃßUÓiÞìî7ª:ΰ.bìhci&Í~2Á‘Œ=Qqk´×hfp'#ððè 0–¬ÑÐ{ŠÍÿJNãÊ5ý)*@zÆLÏ ^ $]@Š#x…œÕº:™Lf9<4 2¥yŽ ãø'£°éÄVŠËc=@äŽÖ­t²pÏÁѼ \ÍDmZäzA²±…yÛ2˜Y<Q Ñ)“’M¬{ï¦dÐäÈMLcíjûšÖ¸@ ¼.~>šôÙŸ¿D®%Ý|ŠÆà2G>´"sà‹w3*ƒ@¹H²Ò£þ'KýýQ^=¥&GÃè¦çµåãpòðî4é(ïg+Ÿ]þMý–ðP¡ý ýÀò_nH½Øê ‰î)´÷£ò´ZîÌ uí“]†¦£¥Òð*ŽEŒÞ¯´ÙÃ-ô®å¿?P6°ú*ªùîUšò+7wxÔ¤‡“þy™iÕóâÍ7ö‡¯–?ð°ý  gRþ'ÌOþ’-úM =ÎÓî?ìnd”¬ë¾¡A÷ÔˆŸžÔ›åLšQ¶{øæw6UÆÞêg¿Ë7lždÞ1 IrÝÉ$ÅÉX[ù¹L Þ–‰ZB»tRg‰6Á=Ë6ѵmë¹.'Ch…Y˜ã@«´èĨP50tæÆÎ P°Øˆpƒ-‚2œ=È7*ôO­î×¾Ãðù ]Ù¯ïøÒ~œŒ5¯ÙÕ-E"F/I"Ò-µ¦_0‚fÞTµGs'Hrªì¨ìi¤žl¡·yÙÊžr˜!kBèi*™˦ª?[ܳ®óº8Vö!8¹ƒ.«šäFº3y9| 42g^‚Œ·ý'­FP‚VäÔºÏÚж’ÊQSœõ]Ž9êu|½m€¥n=Jœ¶3Ù5¦ /î¿dXñéŸö5ä¿Ùü@C?°ü—rÄ3å„EÕî?òŒîk~ZmqŒ²ÅN¾‘ºPÐh#4ê”1ši‚G‰Õûž)6H‹ôêÙƒÁ€É <÷åhZº \T¿ôfŽmæ±÷”ù¤.?œfûÛ¿ ¡W`äÊøÎîÿ³ÚH  ;¢ûß`u>·ë{=Û ¾ƒJµ5Jfù²E B|"‹èQ܉ kTz ‚³Iª²ß³\’»š½Ç=¥ÔA£vCÓ^3-V3=ÆR]Û y^ÒrÈX‰ºêJ5ƒš²œëÌtÍ⌻B¯SŸÙÓÓkTM<+“9ÝÁAp>HŸÃ7ßHÏ Ÿçõ =Eâ€t¯·Ÿ~1ÄíÜÖÉÕ’ÔèÄÇ({¼i¿wù[¹×nö採™°ý,¸W¦ÐìŒ1] 63ʈÐîÞªtŽ%Ïf’Ðm—ŽV:øÐŽE曬(x?–à`^F }Ù¬¢\8Âû([¡.5§¹.‹ {ï?A¹\eK¦à§»aM¶«ªÐ %:”QÇà;Ù=NmŸ£#×…qùÎT7ù§‹õ'—?»?z\~¬Îî_õÓþ±†œÑƒ†V㵘ô=€¤y´p543ïæéz¥7ª1†¤…üó@Â#ÃìÌ­x‰HwAS¤i“–vºtýCÂy;Ë(ÊÀlË»=ýþñ†äØQB£ÿÚÛ³bâ#HºÐºrçw¾åÑ'[^â¾™á,~“:1¬:ÃUð6}é,ÛÓæÌìyK%í¹Ò1cGÞó ¡2•^Cm4Ö8ïÀPsî™>ª¥/ó„!oîNFÁºl«Œ\f%yfh!o3ä5vX)ØG±Âqw&É&{Ó7¨aˤH§3štá Õ¡KUèW@¿â}{¯ù^é©,N÷ˆ‰ ʱ²tWPáëÙ7ö T„àÛ,Çr×jS»žÔhÁé:Ó+£ÑÃo‡£)¼S&Ë–­©¬Š³ºP½M9xH!p~øZZä<ñ},EN‰âú::êBÛ÷£ÿTy1CyNÞâ©@NñêùX'ð™zðíǯ5¦ÕÇ+1úL¯Mƒ²í'¸4‡jœÓÕuÈ…•‡+i$”Çu–Þu&z7ò—44fTÃ÷Ÿß¢C΂>ƒ>4dŠî×ë3@2ˆäŒ’]ã»ÜXd½»U¬ñÿ»H£ÙÊú AS‘aÕÊ~G:!“m³¬aêr•@b¥3Ñée¨3fþ^4ô•bû4ºêÓ|vÿÜýe ù‡ùìµÀ?usøç=³\jƒyœôÐ>>L·~‡^´LJé, +æ¿Ö­e­Z+®öL2ì™ÒGh{d€¾©až‰}&Šõm´“(Y?¿ªT¢3‘ -_Íì*©Jèe¢/†EH,,d|gq¡pFˆÆ½ºxÌZ vRŽ!Ô…´>Š×|ßpý˜ƒô\æÿn½‰$Þý8¦[ ìÍGL>hÄÕVjP&[„¹¹Ri•Vdš°Dj i(U"Ñh¢“$m¾‚¶Ó%âÐÛ¶8Ò„2}ß: ÑQõ¾MP…ZdÂúQkô†,p"¿$_Ç—[¨GÝœEAN)‰äÄÊVJùİb*sirî=Î…¢BNªŸ½D .LƒšN€îQ3‡í#¬!“Ñ EÈàŒ6@V¿L;Ýd/Þ§ã–(pßž ¾HÚÿXC—s°Þë_œb{TBIÓðo…Ztaþ7B3šB‰ÁgžÂSÇ+4òPÇ0Ãi=­YÙ>°‘ß k“í¦–ÚL1—¥£Z~î‡ÌÂÌy¼"1²LNî jÌ/<蘚X'¶P7Zí㪠«Uùbf£Jˆ~@ ª˜ÅM'P|C6ZÒ^ÎÂör¼7‚ÖR/º¦Þâ4ñ©¼‹!Ã1“mÉ=7õ }}°º_š¾½>J$Â?õUèq]-ÙØŒ®¦§à=#²3­u99’®NyÉ ž‚{fˆ3RY+ú*âI昺‘äµ8©ÿ¥©NuÝŠ#w„!¢m-¤ ÒYÂQ \ê2=§ÅGb EÍÒÛ¢«‡‘J/µDêÒë_9¦«¼Ê”÷âóŠSþOг*yֹܶìùQ讵áâªÿËÉ|ÂïךvôÓ4Ìj›z½÷Í-ú7hŽý–†Êô¨RõÓ ýÀò_nÈL£bÕùé "} 5…VŽÑ¢Æ²·zŠCzþW€4)@’¿ÊdZer­SC»AðH†º1MŒA*2@‰q"Œ;C·7ž!Æ›*¶8.6SŒå«ÌÿomÈz¨L^¢Tñ[‡áOþi]~ŠžvIî,êÁ@£÷eÜ3åç¡ T2ìÂjYÊæäL f*&æV Á±0ÛÑæy^e†žX+¶0Ä€ä×àÌÎ2 J»NÔ$ƒå®…جk í¦lcfabÆé®gªŒwj£j¥ßŒ`O¶0Ï8îgßñêÇ‘ni|0šÆå ¦‘´ÍIõÄf¯UlÏ‘šïA#?ruߌ} =á!g¡™H³sG?®™ŸQ¶‘ ]*Y?Uðlî͵ŠÃåðÜPsÇá^ä×u%LЬÿKö?mÆažïXŒ ¿:ÚÉm…§5Ê=i ‚N$0^YæY Õ«n\m™G$äd©Úî`¼™=å<ù_ÁSK3¤­è-5§Ä¡œ5pùå¼–Ó­þ쵦õÇÅ\JÊm×.Zúõ˲&ÞþßÕUǽ+7p/_”ÝK)ÏO.rô¼<¦Öú‡ïûnC?¸ü—r/èG×4ªØÒÓ:Ô²¯2ÿÀ"×ÀŽl§½Z%{a l$ï7å ZÒfHûÔéY`çDp‚RýT‹~›ÔøY¯Û!›q†kýíJL?q½x Ý> ÝøÛUûý½ýÃßþ ù‡­üí[ôM¹ø5÷¼&Ì(æ ¾ëcfsøÞùÞåkSgðÝ=ÌPG¨ý± F3bW”Ë"gÚAÕèÎÿ«£Xõ3¥L'9³_ÒÈL–@‡NþºÀ ÍŠ…Úê&x)¶½°Ï lâÚ7×¹9æ4wz§ZjCîKæp0ÔY'_”a"«7Ë0ÔÈ[üÂÔçïv^Ã,ßcø|7^ó-:ÁÐÝ;þ¶¾Ã5Á×çnà±±šÝ ‚] `O?¡¤‚ÉÝ\Æ–3<´Z8ˆº@ÎT "…& ó rO-Ýh+¯¡àš¼U†ñf9Ž‘£ùÀËrŒ‹ƒË\?z“¿¥WÉù• E¥¡%^eÍòQ‹  ÒÄF}©&xB ÁÁDCZL‚¡‹ôc€ 9œè”mlXªûËyØÂO[ˆ1‡UW7îHw]S‘ã‹ém2 LÈöA7Ú_ú:½e¶üÛWC_ ýކþ€4žV€Ît[`´ˆEÿŒ&u$ÜøÜÌrÿ¢$XŒxB$D™˜ dòE@ÖFÚvóšƒõa>cYÆÌ–ö3·-“ˆq1ÓTçÔ =>&«‡‚Ù9Òªêë ?»·öƒ?ÛÐw‹\m‹…FÌ×å²0 äÄï*Hr{óµ~c«ësïÒýž>¨%sodîÛ2ñ¼™i¦Š)€ÚHWæ~¡DÙãv…=aêÔÊ̪äZVHc­2Øy˜ÈŹEŽ]¸ÜØä¨$Ôd F> õÔºi†e¢yX¶pÐfãõsØ©ýiBÎ?¾½†a 6Öo$ 5=Q„’^#¶DjØf0hw ]´g¥` 8‰F#ÝLÉÀ X-¤pix'ð1žÉ ò${[Ô‚GÀ9AK–¬pbš»œ UÎ/)µµm9S”ÏCe¢š½vUSŠù29{ü¼²¶, jªˆ  µ¾Í¨Eƒ=DŠT›j^àßÂà6çì]!—(wæqÉŒŽÍËIëda]i|©}Ñký1¢órÑþòòÕÐWCVC@ºs·=×ÉRÔ’ÌYv‚¥#PdŠ-™RsÄJÙˆÚ;ÒÄÉËÁ*Ÿ8Éi±MÐ S"kܶ=„ø„ÝÆ‡±úÛi7ëGÞ½ð%¤ÿÀñù•†ž—»ì`™–ÑŽËîgí» ä+Šy†Jv0œ‘–ÊËG•&ÓÙ‰{ÿ“ ³íQ÷ùDøœÙËÏp÷å€V4Øêȹ;¥,8¨ËŠò÷$Hè¨ÕÉÙÕd(›Ô$[Qñ3õƒã¬LÔ‚ñÁJg1ÏüXg~ ≉ªHkf¬²d¾pDîæ+¦µñ¼å÷[g…–Ÿÿv€ô`ú =§°ž^¿a?mèÂJ' z =Є¶ˆ|” è—g  P!ìQ;7µu $ ®ÏF¹ÄÆÜXáOe bA›Þa\hfšs¢ &%„äµÃD„ëàšuZ T— ðXY ’c$(ãÌœÛÒ};äÄ©¦@Ô¸*yž;^P‚¶‘ܲâLÞy8ÙÁÜî¾ 2•ÞçIp×BXå¤Jíh­Ö„$Ûëò"¤O&»š¾ß¡ýœÒg–¯†¾ú³r/œ¢ï­¥W¤•Îäš$M»ù A4m§ºö,xÈ“¢]BuÔ“œÉᎌðîŒ%­(€¦2Ò,+̯ŠGU¦<«Y‘ ÑÖu`ÆN Ì¡<"„Ÿ(ó¿bGÑW—:ôŸ)‚8¶)“6ó }ë+âµwÑP$-'¢VÍûo‚Ço¤%ïu,áe”™+S;ßa¼pwJw/¤Áe–Ë£:^ª¨†¯TZHކyFßU ÏÎBè fãØ³ ‰’.K¢FLFTˆCÛb&Vê³:Y¥ØLÊ­?9B]VZªÒáÝrPÏ€ãÂéá9Á‘ ð|øùQ†Ï¤g¼s®û=vtHO˺ªà—“Ô f*?¨ž³cha½Þnœé…Ù°¡MDŒ³S5z£zb74ó~_›³„YcT(1ú7Ë[õíMð/ 8b‹Ò2áx@Òþw'HI ô¼òéyß÷Ð+ÉgdߣJLγaÙªQFüqiÒdgVm]Šú^¢lR‹­í‚Þ}‚ëa€—ÚRSñ²Is$¢Ü/Ÿ+ÅLÆÏèЮ—?ÐL¹å§¿ÒWCÿ? ý%i¼íÂpcc i§„än†#Y 8±U¤!¹]ÈEBüèi’ÿ^ Ñꦊ<¤‚™ä« È;BÊ›ò‘ÃÂó´øl„µË”áq}Ž(µ Çòç—à ŽM¥@ÂßPToŒå@ͪ{—|©·…‡Þö9¯©¯÷ͦfSSC+äUüNmöÝBKÜ€·9”äÈùX \½Ö0¯ #S&B­êÄ Ó|Xeˆ¨r¤B8¨9R;d°²@BgÖ™ù-ÑFrÆÂAV'–nQ>v§@þO2øŸ1¡CÉÈ(Ç?Ô‹=À‘@þv€ô¼¾P‡ÞÕ„½‡GWØz†v÷¦Fl58¤UbùÆÒ’¯íá øuuÄ3HT­šù‚%¤õ(Χj´"µJ©ÌŽ5¾¦˜¨8Bž@šÐÊlØ2NˆS]±Ù:“VäUcDF­ ­s© *¤µ9žñò) y¾V,FL«ÔuœæEND¨Yorj†9¡¡už{¥RÒ þ¿üeÙ1snÙ§&ýî4­gp±uG˜èƒ«LH¾=… ¯3®?p`ûjè«¡ßÑ{‚üÞú 8½"­l•lƒ¢™üˆ‘{´E»Ÿîl³2fÝÀC‚€âÙ3oØv鈨$ ÜÚiJÖv™²Cnžš£çˆ §~5§’Ï.év/a¢õ%ª”¸ä”?»·h+~©¡QÚ‘¹¥!@‚Â[ƒþ9 æÛ®{Îo~³víz¿3¶X¼¡§dëN:Zg%äÎó©C>(xe¶ŽÔnÙTÛÅÉMk{§ôUïvjáÍ2Ͱ—GNŒcÁ²bQfýj8éDNÜ6ïL9hcÅXd<¨Ÿì–í¡ì óú‰ZTïO¼!Ji<Ê·õŽì¾û4úÈ}/ö½ŒÙIz‰ ÝiÑ÷õ1´<¯î¥F,Ý ÒÌŠ)Ò0P1zà’œ(í¶Õ;Å%YqH !çxB!ÜzÊ#‚£‰8#_ 4%mlθ= Ì9W˜óg‘u?›1œ´þpcü(È3³@™@¸]çèˆÃ3%:Þ uÖKÛ›€Ad…ìýJˆéÆ2wƒE>ã¶Êð•1pñvcB$ 4“&­‚3•y™dé 2ŠŽ†¢žfW£djbåÓS²èô]eì×=+aé•aô˜À@锜*Ñÿ@z mC,è‘'}­ÏxçÊŽi@¨öµd9Ö…Ý×;RZ´:á*ÿçZW³KJŽvÄ' éÕ‚ÔN ÚU2J°ÌÎÇÃB8)¬„›&vRŸ–WúñÃö®á0àÈ¥’–Ï·ÞÁÕ“éídrw’„ž_D¢áè2¶?|⎇[ü2úå¢YÂì²óœÅLLG FT²ûåð©Ø*¨ –VvAñ¥}Fµ¨‚É·@¢LÅBåhÌ&Ôi­¸ˆR4 H;6B!ÍŒ©“Ã0—Õü°Ôë9°ó±Ë׺ri'êyô‹Kö(šyO)º¾ú…ñs¦ïn ,›Þ¥Áy>m4îO^Y±Ý”&Ÿ3dZ1¿êÆ𵍾²n¬ó…‚¢i(îÔ…îV+–¨=*çûpÕš1Ðó¥Q#VH*"#ˆ‡|y]#S¥ | GDÄk’œG•ŒžÐ›œE Oc ±³~»3©™/Û™GÓøB‚kvijf¸‡õb´,Ãý&Ïnpw‘æñÌÚ•Ûv°Ä± ô5 Ò/râÕÖ«fæ{c;ÒÁSÙ‘)“Cèµ&铨÷¨B”ýt#ö}W*ìÓË·zWàòS ýÀòÕÐïmèÜ>Ñï/³Ro,PíæZV1Ï{1ñ»“á´…WÐø”J¸¾àn5|Ý¿“ÿ'÷²‘?¹üN€4 ÑPÔžmlZi¬v‡BíHí#€4 Рj?Ks§áok"‰ðè0)IïNF7)KòBx\ùæÉò/LéÖn2HLÒ¯öhw¼[…Ú¹ù³<«®`\¨Ä¨ÑBnËŠ §@ݳ<ŽÒ• îq²4ÃÇä¾|BãçG–û<îlÚ½hÄáYüŇî÷©'^[ôñéò‡”P‘n[¥2ØóH@ÂEOögLhgDȧ,sqØÈÏebÉ<4Kíõ`>a¦d§lâAF¤^¼ãƒÍ¶IFÂÊAm%‰V]Ts,iúŠ™¢´òƒª’¥Ý©‰cERcÐ?qËs|ä7¤;Ú™NüsR‡î`g¤;¦zºÅŽãV7¼ª@¢ù¡¡ø@”>n–a—šâý-û-O†}7²bCkh·¬™æÉ*ëçÃî÷ÿ’V!­+&+­Ub+iÒDw­›_Ï2æ¼ߤ °Î gÉ|'(²€)/K{iöÌá4ÍãŒ=9­övP¦< 9XßHZ…˜ÃýÙô:KÊ)4Ф%ÿ:r^ÒÄÖaQ³CÆ11y­É—‚&üÏÄ?­nÚ¡SñrNöÚœ€!Ô ÀÖc+!û58ôéøÒòj·ÔhàQm;Ê+‘ð¨ð3ÌÕ¦ Ä‘¿•`g£Y£ „re&>B8)IKz›å÷ø.'› …î?"[ô(¨l¡ÆÀº‰£Yz¯Éã V–Åy,ï÷¶?½¯g>Ð,üµÃ¢ç~4¤:i™ï¬Š´b%\`è|íÆË ½ûÖx¯fä쇭ĚìèÌÝÝU™–¯.ïù¡ —Y†ƒPKægÈÉyPeØ™…VÈ"šòÁ„1»#-h“c®ÅI3XD…äñ>‘TÈ[Ž gÀã¡`ÜpÍEy.7”ó^Dè7¤‹ytC@îx„Gá }D‰~ÉŒ»WCWè‹nåòOøÇjÆF&lDp†¬ôEZNUÅQE‰†¼… $á­ÀXïî™ÙlB£¬Ê3…Pi1p¤5ò…¯FÒ¤'·,–-mZ(ϰÎ&ˆ%1•‰jf£WRy†ã7Ë_o( ƒ±Ç„ŒY -Ës3ÉÐG_¤ Ï“13;¦·þLÆû?™ñïâ]-4w=Hû?ÚLmPAüòh¦Bhæ³kË ÁG¤eÏï¥×ªAæi0"–ÒŠ P¦‚Ün±ÛÏV{Ü®þß²|ÜЕËpXþù†~Û}5ôã %+s)ïÉh5t¤`“é0Ý=5¯Å²ŽgI³ u<çàÏò:i>~ÙnŸÎø? ­¶.¶ö<Xg¶×VeîÆggǧǾ·^ß"XIQ€ËÊÐŒ-:ää„Q¶Òá«Þ=1Ø:@Ö!\ ÈVÜ©å­(&óÀFˆJná¢dÖI¸ßdL)”˜™7‹æd’ÆŒíßaº*aã‡ÑšßxØîê$~¤Ø"a8]¯ý—Ò5?U~’äÄ9]â‰Þb WÁ] p‚åð Ÿå $ÙýGÞ jSóL`ʼ`éLCl$eªßi¥V‰eòöS x^W´I5â<ŠÄ”ä…û)&ÝÌ{ƒ_0èM< ˆçHÌßó™õ%^ó½Ü}ΦGDmh¤; Þ$ûi/5cç{Hœz©»Ñ£›ªIš±ñd;¦µvlʯr„Š’£×Ãä‚´¢Yè՗䨇¥Mލm—þœ¥óËYZH14Är¯¨ÌyA;(p_œI-4æÆtÕ® h¥¯ ‰øu‰ÜŸÊÀΑÅ"`%ÔÅÕV³ÌËù=»ÌÓÖš*Ì_V2Êÿ™0æÈpcËùx#0Â{š ûâz‘9(šP¥NV•a|¯ô¸Ø<àSEý€¯+é{dþeæH¨²•n¤OCÑÿ>mÜjÿ&ݳñ>«ù-ËÇ íƒÂØb *?ÕÐoÛ¢¯†~½¡»WÄéê4fÂÉæÃ‰"9ÞÒýd|énÙ;w{ú™¨›‚ûsõnÊé3 /Y]¤Ûþh€t­Û³Ù >,~£Q›Hw¸rOjåÇ4Ð3ÝGÁ4‰Ñ Š•©MquqO^ÞÐÒœùðБ"ÿóê [©an1—\óÊu¦À¤¦Õ¤6Ò•@܆~\¶:ýÖ£×ìi°ðX~õ´·™¦oÈ0¾ìí:6÷üñ“‡ ³yßA´IOh}IAúB³Ê­ÌVžw­,Ô#Ѽ; +“f qi” u©öJ1iOŠh‘ƒpääÔ*ëäU5ºN#¿µŽ žA„ʺ„C ÚÔ¿JPP9m?©$mZÄ5 <7s{ pÆežÑÄ‹XÐ3áù™þü$ÿY œ;yDPoñÝ @šÌGuWÚøGú¶^óói©qáŸÓaLÍݟȧ°ôn®bÙjÅQ†wV*þ ß陟Z)Ø:²ï»£¦OC EÐÂÂÒ­ðÀó#2aªdÖ¿/s×âõÙÓ†Qi>‚®<H…ŽV¯N-ЇÎ}jà6³î½WfÍ‘No‹À+^îå²8ZÂ@"(ʽ]&W;©ÿ+5+Äð•cEÖŠŒïC"+ ôŸðŽt¡YÐÖ„XEû{Ýirß4~È—%¹X¼ì¶#tAú‘xèÖo<_ý#zt¤q…?/霗ýD7òås }¥Øþ ¥0Ñ¡¢ºO• ‹­dqƒ+1| ¨]w…–FÌÏLÌAÈ]§È\³F|„°pÀh1üÑi{Z@¯î6 ÜÀ×¢«w{š ©À7£Æd±u>ÏÌÇxmf“ì$©Hk“v£åq¢mÉ~nÙ`K ’S¹—ÉQ)02ÓDP´2Ó¿ªŒEš¼¾û.8#Ë*H:N¬ÞH³ñlÐjõòXÂ~õl~:™ËÅa{W/’ä´*~q¬®/VÒ¡Ø£èFáL?‚Qf¿†dubÒ5¦.qìæ´ ªNFITÍê'z’ƒ*Ã@rÛVMáóº² Ð(÷2·¥ûtÆ EwãH7fWfgF…à/–,´˜ÖË|žÀhä܉îDï_a–pÜΗxÐ $¹§ü×k†ì3xç!¡õù¢ú3¢sþ2~î/ïÚï© =‹ }«¨~dËF¼hTŽ1 dBB Ã$mkÎbB›å»2?¨_¬š]Ë Ü;ã:Ù*¶VAŠ%M8J¦zTÏ ŠÌzØ T¢µc!«‡PHIáÇ7Õd´°ä,z¤ µ–>“j2‘æW€ V²¬‚ÿ›¼Õ“ TåyÀ—EÛʰ€3ú E þ’ÊÄg ‘d[7AW0@Hm…U2KÁ)GÒøâä{÷Z-% ÆZ*,ÉE!XJAz« X‹LY0|< ^”‘ˆ¸K0>çâï÷ŸUˆËBãeÌþjè/n¨ ]v—ÜKo\c ëŸ æxãó¿sÞŒÙD}²|Ý̆p j¥C’|0=®Œ´œZ‹v5GÅÖŠ>†A!¢4w ã„cëÉ}º’{A IÉÛ .R7Ç-ÕëÞn0i%%;© HÙ,ƒK£”ÏH_©BG2t46™o'‰&çËÃ3ºø'¨þÓ‡íêL§¢y’SÐo¡„M~ć¨Rd!tB,ØH·Z!V:¬®*jÅ*t!´Èß·1…^LÇ3jyÌE¬Ðûr†½“Œ:Ðê2û® ®ãP§ZåÊÛýhh˜ŠewæmÔYlÒZ1*åŒ{W@åQ Hy̦ínúˆé>B1¥è!죸æÇè‘2ô-Ò¤é :.´ã2`ëêr{V‘^oL ¹3ÔOrP1¤V«‡ÕŒÕg±< ´}ßÜéœ2™ÊÏL¤ª>‰tÑq©T9s€@Q'#½Ô&'Ð'/™6N…âiŠŒh‡f´4 €D#9 µ„¨€PÔÌo úfB1dÅ&b/„¬jÙ98$méUòx¥ÈÔÌçU]ôòæä@’Âúé™P:YË$nå6à¶“PT–j?n–ûYË*'_AVa¿‡^µìå5 W¸¨þôr½Ï¨&ýNfìî„ýíª1ÿ7¤Ë]àS^JÿfñÐP¾×@^¤igÆ2N>ÍFÌoMªCE[u樼¦„±“K/ÉT@h‘1}èV˜\æ WÏ&+êäb•+r!{uËYÞãv_ÿL’6ã4#Û¼¢! •ˆî‰üíS'¼=g>ÒURtò&$¡•]dc£ÙBA)Å·kÁh!Úéð u„B«ÅŒ–]ü¢WK£ES¢LtÙêä`‡aç”{¤EUÄN»€‹ 渄N ÍÞ²L#QÏV8’4ejO®òÌ ÑBG÷t-ЬLda¹—˜|“Óøcš£ÑÙC+ꠅƬèÐ¥ÂHÚÁãµ³ï—C 9H«Ì³+ÉÑ‹ù©^¶òÐûõjŽÌØ!?´±†,H3 vJM˜Ž×µ÷%¯óV5c­ÆvÙO} ¯ãWXÑqâ…x Cå„ÒéWš®ÀO&ZxÄQwŽóãúºÒ€Ewœó®¿ )uhì6-–ï·ú°7¢Ò'=ú"H]ݸɉ‡º1@¢(`¨[Bk¥F¡¦JØ5ÔJwî³VÂ+3Ù“„£P¨ªdÖgM†:œëFîQ|˜õ’Ýè dY‘c¢ùÝ"0¼ÇÌrZn`83O O%«yc´e`øâýóHBt—Ö»Ü_™_¿±dÒÖ Ü¨TöEÑIo ÔqÏÉÍžQL‰~bcy:µ$]óΘ)©,ç P^óüÃÄO,U~Z“3q`UpN ïõ’ŸÎvÉêãwÈ"Œ[xà¹>ŽPálâY…èXþþ¡ö ý;"^÷) ”e‚¼Ë¨íe~Qe€Ø ÈŽªâ$Ð?È8²a ѱ]zà–ÿ¸ìl•Âø(kª2ûØ©T­Å¼¤:ä‚A÷åÚ›TwÌÓaé rÆLC.Ñ„¸Ñœ7©&àà+ý‘$m—¡úˆûåi}V†œ4bĸ¦Š³d‹³TZ7†Ñ€DAód'³:¤t‚%>¶RµypÃÝK²¯?­Wô(Ÿ0+ŸÞ&~p·á§ÓÎâI;U‘Vé—#Óº‹@“™Hèè¡Up«'¾}á7¡&¾hÔ³îÒm£#f-=ðÊK"I_„ØOœ—ÉtÏ1¿¤W7ŸZA×^)EÚk±531˜¡«e€ðNŽøÊtÂcÏ÷µç=å¿?Ÿ0ÏþMËWCÿª† r_ ]Rw <V‚c(Ĉº¥†ÑV”rNãrZïK>UÃÕ¿ÊPÚ˜BÆéÍ.2ëä¿ âa—+x SÔe6 F]p²G˜Ê0{$HK.R™IOÀ p—¼c/bJ‡¼9Ëk›\ Y S£ê,]jˆ&lÁAˆÇñy¹ü=ïûæ·îìÑCNl .?– »ÖgYÛå¤ie™Šœ¥ËòmUôâ @RbÓ6ˆP¯´ñåe½Tª´Å0–VõÏŠ´FÈé iiT´‘£)žâX‚¡€¹T¨nÔ>÷ ¢Bµ;„·ƒŒ¬ÈÌÒ”L:S¾²QºRe¹W~/2žœün&™ˆLr†íôRÅØ³²>•z=kü E{³l.XB2N Ze˜ÇUgÖ˜+ ¤2ËäwÒ  {6¤O6–ƒA%쟛©ü³[ݶ¶®kœW2‹„ö¥É^_ežŒ¼ež¹º“zlT¿ …· Œ-ï{|·µ¼C{¾|ž™?ÖÔä®úÝÜ„nä {öl¾v2qODàgR!v« kÌ~´R º®t dök¡(xf¡;WÒ¢ÖlŽy0}ÍÄÂÕôÄ+“gÂtṇƃO³2™”¢YÁ Ю,Gʪ B;äOz0€*Ƙan±ò²…€O—+e 3óñr­8êa ›ê,ÛÂÒ ö€î’©.9J2êQ)ž!ùYÔ‡ê@ÍA>º$ƒBEnQ3p@@(AOs/ÏIS;K30‰Òâ Ïj‹å—ŽsÏ<­~•æÊ„€€ „"… ¬*Í‚ã2I¥PÑ~G_{ÞC¿¿2GþSÓå?hÌþjèolè ™ˆzÈtå—´kä¿ bƒ‰²gfZžEB™Õ É„ÒaŽò¦A&Ø£–Ö©ã•:Ä,Rí%˧ö€a ž–<µLùÔ[— ,’n¤:¹žw™ÍÄ‚¤™ŒkE¦=E®°”¥ß® ±¤E¶J®w¹ÚÀÍɈ°0'>ɬêz› Ù·¸,–w$\UŠO/%Ÿ@2õ|²¦ÛÓÚŸÖ‹:Tˆ} 9K§¥3_W,ŠtA¥x£ñX!“ŸŒ å^x&Ï¥÷Uw è.-§æžO¯;RÒR]Sºia¶3sW¬ï ²³¸T¥Üöd¹.|hãò ‹Uy¤$³ô¼3G€YºöÎJã*(%;¦ÆŠµ”_™ÝØXX Ê!)´Ǥ~³ ÿc]†R´#Ë@èRŠV ãÙx@רMË(¦:ݳÈhÙ·Ê€JSsù^%WKƒÝªÆnø @,êË©õGÖ82cwvÑ= ó|^<š}‘ïüH_ }zy#ƒåR@’åÓŸ„{¤GLdÖ-2?›+J d”é(NˆÐÓû‡ƒ¨iƒÈU™=I²@ÓT®8¨)ü‚—ä+¦‚YÅ–pò2;)ðÅq,âœum¤ìDy&ƒi$âL>¿G6N6.!à{(]$OHÆÅ 1ü+wj|.Z¹þÿ ªû;ÒôÜï.˜¤(H#IÍ‘»ÝØõœ|fƒE÷èÒIOðÉݲqWˆé0Ý…®·õÔmãN`4âH£ü­U-&¾a©¡ÿ½ÜT·M’ÁûÌŠ÷B¢f!Ó•Ã+çÞ«œ<û]N±Ô Vö'mºáQ c5O¥™*h¥AÝ|-{;ȵ]k Ø´¼w)$FCˆ¨ v9h–/–n7댷ƒÝ‚º°0*£ncx7dÃeôNkÀ$b¡CøÞQÿ“¶ÃÖE.VQ}“àzI±}{ýÂzâ'Ò3Lº?ÏÕ`Ïo¾Y®îF%\NƒùQ¶Yþð*”?³aô5Q?±d”è•”hõЇõéìÌâ+0RôNZô/ KFH+ÅñŽÌêšoèÐG…舂B£a¡n´/É6??üÄ‹åó¨^/µ˜8}JVúþöö]Êéþå†~qùjèßÝNÅYнxpc ÝüÀ’k¾–Å–Òi`þ´Ò97dÊ×ZÚ¬ó,Ì­ vͲ”ô¤ÙçÒä2­ F©%¤8ñ ÜK [á.ƒàÌñé éTJtˆGK7ƒi=Ô. F‰’B½IrLZGL™" Ò”¢¸¡Np£âO{Hßž?dXÞÊìü•éÅ›ñi½×êc}à ]Eüó©îXMá±tó\RøT\z^üãú ¢PºZ5ž»+0Ý^ž (@A¥ƒÚK…[«ÛØ™CÆt¡O€w„M•4¨DW“‹Ûº—_º±Öæà W©ïÛÌH|—á0S,Q&äŽÙè'6>5¯~Ye´œû.çÞÔ<Êeä|Â+2Ìn›YgÔ³Ê{Õ1w>a…âgýÅœžìžgh9•‹Œ¾‡ŒËÁ*'xn£CÛðM#jûf5aÊñy/;ýîðãgÒÛÛý£ï¼« iøŒ½£Ýƒæýr»ÂBóM<¨kÒŠä²ìX¥¸:¨ntÅ€t üf2ÐÙT2ÕCv¸³øžV+š/¤IO¤D7ƒC(¤B¶¥TÀˆº;©¢«Ô¦ìÊ1!”Ó³î<ó²:^‡~ÕÂ(Í–vfÐW™Ôœ$&˜+Ù–³c¢ØSµ§L~z§ ¯÷F5ÖZñ¯R–9éæf4IÕ´3òQN*\Æê ¤“ôÀ¸Wg¥>@ÁU¶Qn«\1]ChòÅó†KdaòØæ·h,…€¾ñÓ~=6¤‹³áôÅAújègÚdôm @S=hc³ÉÈÕAÜh‘Uéã!_Q¤“:@Ñn0Üô63&W2Ãp9¢9‘g-—í$Wè#•Ý…Œú21G€ª/Ý ¨ÃÈ—$ùÛà2xP%µ ¾¢H’®xp^á †|“̬+EåZ‰˜¬¥ 3²€K^~Z;g(Óô ù“ã!0ùw¤ ð\ðçÛiyx¿ÖôÎJŠœ-øœokgÈih]ˆ¬ž©¸lÅt$3}nÉ'êz$8å‘ÇsìRgšYê’9ªtú¥&JÊ´ôÀR©—"Ç3taqüÁÐF÷Ôn,c—Q±AÒäÿ¡c¦úŒ¯“#a¨q@E–ceaµ ²†:e9÷sõ%¬»Ð+ƒ¥qœî§ÄŒÒ5”ëÀ®ðg”Ž3Ò¨Ò¼ÚŽ¶Ýoyõô.½»÷äæ¼¬[4‚RVöƒ–sVê¿RŠžÒ-Jóþ-0›Ÿ×G¤u‹½¡MWÈì!D<äNxtq¦Ç½ ]Ó]貚?¶ DöB7±Ã|ÄÊY&ßéÿžOGŒç:ùüH’v êÓnÄNÇfÈ9+œO”:ܸ*s8ÕHäSòVjÆ ;,^XÒÒÐ’JJYd‹èе[R×çU:À&` É-²S2os¬ÆB,æ]7,ãÿøÜ£MØ‹/¼¾´øMPM¦âRØïV:#?M×E³‘]µ£›:S;²új€°JñÈ…y({d.ãw”º|cñær‘b ÓƒóÔ¹êψ·hýã «ªÖ‡óÅŸ®²yŽ iJï'ן=f5ô·4ÄgÔ²úC®ü,“úMƧ&}A˘ÑÃÒaз—y|£^ÄR+ÜR.%uz€…°&dà·4Ç —0ÌF+iº2AAŠMÉ(Í£@«Ëx»eV|;`pfNH ÔJž.‚5†ýå²70j鿃¾ "À_KD‚MÇþ'€ô~Ñ0oàð7¤Øž9Hß[GÿB1€Ýbè·*¶¡°Þš]nx–Œ¬çJã^’|¯I¿g¸6Ÿ`íƒÇi3„ÀšŸ)‡HP,Â)e&ZdüQs% @Ѻ 'N"«Ê,‘ãØ ûåÄîJ”•>b+Í3 ýªy'ì,Ÿ *ÀNc"9Ê›yyqTO\)'Ý6ÏñÔ’Ê’´>OK—W£¯ÌÏ.§A"ú9˜‡‚¢âzº°nÑ1ŒÛ'+ ÷F;‰¨íA¾´¬U&âÀˆIÈ?kwÛÌò)E «VjÉ74ršG-þ«jõ;€ôÙ|~}µÑ¸Ñ€î¡ÛºY!Ø%xÃ>ˆìV$Ý?•é)vX¡åÅF²4SÓPÅ‚®U7ËŸE…\aõ~š°D"¬.ç‘ï+O…PE²V¡’ é|„f’vrÚ 9åd/œÆœ(oº°f2l+L–)}Ê`ìÊ™²]C då|õ#—hû£ Æ·–‡tÓÕ!aØ_Cg'˜Iכĥ”‚ʜѪ Ì8¨fZŒÞ”hp3ûÍѱ“T¹-,ù’Sôù”gU ßiF·ŸöѦ?Š6†·½²×êüKø¢Òg–çNûîkþK ýôòÕпµ!‚ú^Çš{jœð#ïQ8é—çäÎzPÒ©ì2®Œ!¡Ô'÷5ºAW¬2D²J³¶¥ÇA±Y…äµß˜'+3dÈÑCÖ'ÊP–‡\Õ[Ÿµ6é²À~JC1¼ÊRq—$—ô4ûñAtØH2ù:4áåŸYÿ59:5 =ZŸô¿‡¤}!@ëSµU½ñ &­tsVò¶˜ˆÒvB¤í„L;ƒkwuíÙ¢LíŠ0¹—-x…hvd†5ª¡ ²XˆÜË> %àfÒ¢Uœ.÷N¦ƒîÞ Áí23d å Ó$5c“Y9ô 4´«ý¸ ~&®tÛvy®0ƒ¡¥ ¦˜lDŽÖyîeλŒ «4Wm‚mFHƒ*l&:}Jî#ÁÆøÐ/)+i'vÀ&þ“lw˜Är/ 1-Ùê=ÁŒKuɪfÞit ¢É¾9ºÊ¿n)¶§'žÑÌw’-—Æõ¯º±û0¤h§ž®%7S w+šg<èf6?³Ú/™‚âB_±È°j$dÇhô¾×t"ävژϮÃܼV“;dåY_ÍÏk7x4ÓŸWÎ0'7‘‘EE\…¨KÒ|ô\ÂL%È&ÏÆi®œ©­ÆÉI?AÎà % ”P`ÌnJ _G¨Ò× :tøh¥äá6ðßõ ­ Ä„œo¢»ìáûWn³ZÜĈØ{•MF¤ªü(öZYæ´ºšÓÀÙç¡9ÖNð£8¢y™.›=¢~(žbã']Qžx·¼÷Oë³y%V=Ÿ†%M??z掌ïú ÄõgŽÙ_ ý ñL®è{–ZòÌÊ wYúÙá³#“B0Ž2ÔÆd„æÄQÚë”AÊÒƒÖ¼QKõ%ÆIÒ¥dG30Ìó)†ÝRÎ8DeE<Yï6» ®¶GåãWUsŽV¿:E{U™ì í¯êÅ2ã‹Y¦N9`Ã6™Ê<ïûI‰{þ–TŸì™¿ YÜÅ€ÏÆ{ëÄס–$èF¥²Oyl”<À®Ü2µ²á@)ñýz iKÖ n†vf¾:3Òꨶì[3µÈ!_¥M3AƒBN¬ÖNÍ·F Ç€äê†%%] ”öÑ9•QH•bº¨®Æ):^ÉfÑOU0LÄ ‚YÊC‹oVýmÖŽE?ŤŒQTE)ôâUƶIÕÚ/€ Ü‘YFvaÒð"Í5#//’ÊO+#H$ u³ìPõFE7ž©µmÏÛ’ª5Êð­‹Â¯[VùVò¿8`V`Ók´FCR—0¤I­Œp:ôê¹Ï¹Ñ¦ÏË©#}¤»¡<Özj¨}àQdøggýüS0È©Ê6Qs•mU; mͧ‚´Т~ñ‹ñƒË?Ö!³ÌͧÅéBºÐqB¤å,6ë³7͡ĀãNLÌÔ¯®R¢|Gùî´Ð©^ «§º)» 2 $2éSõU>Å«_œ;ùw\þ¿£‘Ç›,2-ˆYNïy¹Ý"A}«7é_…pÉ{éx~àGÿ™Û?ØÐÝ`û—z³|®¡†½·‘È_\^Òó(Z’ö#Í»:çSC,©?™cŠ™G3Ÿ€¹?÷ÓÂ9Qû®8þ„=–Rá> ¾H‡ êT› ŽÒŸÈH5µL±ûµAwì¨Í†I-îXÜÝÚ!cƒº ®zKA¨aÉTº!gš‡`Â@ )"(A¦‚zþX&é•‹«`<-yeÍÒV"ôë™ÆÉ™îÍ .<2I’MÅŒoËpÕ©³ º”]Æ)ï åI‹ùC:ûç,!5¤÷W€D´£Hg2eíá*°¤•¼Ù™Þ¤–õ62ÙU„[½V~‰ªQNWsÜa&ÚøïŠŽ‡ŒX5µÎr|=y—ã»ÓŒ®˜ÃCtWûˆ‰¼R>–)9H3Æò‰]æ@ý=O Åbi0«nGݘ30¤@¨²Œ©š»X³ûÒê7…ä¦P~zÝ''Cu"ZLp’ßv¬]ÞÕÍ¿^=9öïÁ# ˆåVZ¥ oÌ#T´E‚³¸uرµŒ’&AjUNრ©SwO]Y¤j·²þ§ˆÑ ”û3¶s?)ÑOhlávB ‹ÿ3s;êÐùÔ3)(˜'߀A¨S1&*« ÇÔ+CÈ Qf˜~F„fsC+œ«g¥¡gph³Ðbþ¥ÕQL:RQ(Ë3½Ã‰vãåLÕ˜”]åœC@i!ú‚ Z7´¾¸q;@ЮÒ@ƒd‘À#Äž7™s-‚+jAÎHÉ4N² =µ_ýK´Y&¹ŒÖ H3ÿx|Ä=u®¡ûãBæG ý¦å¿×Ð'ˆì?¸|¾¡@†Øo1cúæòQC¤}1}âê¿KŒzèHøâa‚ž?+Öðã?->zókãhhÃpÖiÐÓ<Ã2¢JµPÔJõšõ Šª¥ítHLÔ÷T-%n‘P!_ù¸ «ÿ{÷¼Ò6~a~#½|´"Í6å†:~  DêSC„“0Ùk¥4÷š!NYAÕ6åE HÇîÊ<–×öŠt\a¬ Š“5±»i·_ú‹ËïH#Uf©³œžÖL¤Õ\Ìf¤žâ&AÕ· i¨§pŸk@•OP¿’ +µ‘Ü)ÃWò„G3j3rN4Ê(›šiý66…’åÃV†…62;sb™Hhu¦¢X8€Î#D«òJ-E íÌ¿èð›oÈGq•]F8c} n\uQë óì‘¥j I¾tææh)%g”쌸ôbɪãxßã'SRwfá(Y Å2Sz > +¼%•¥†:¹à@Ù¢ªŒ8ÏUêõQÍûØ‚ýLñ)@º³~Èøy5–]/É ]ïèG`«3±j†òÓ¨£qưΈV8ÑX^ׯÒÁá¨*øXÏ‘DøsøYm éç–†~xžªõ*LÉóŽOfâ%8À±­gâž•Uû„âH3íÍ6³8`q݃©8ÙÎq(; NódÝ !´ç¢úx¹RŒËÿð—ÿ¯60rx÷„¸HÅÿD”ë13vÿ–Ÿnè—ÿVCQœ¿q‹s™ª'•O¹¿¿+¦5¾ïC€ö­†™kÞ§A_ýeéõ™݉Fû×%'h[ƒWH!~¿£¤Š§)×H…aWðN¨†–èðìeòŽîœ»`©Ý +t&ó!°“ê•ñìÆ@PÇÇQ$—بÉë !rÔæZ·©¢½"­!Øâ DEfAG’”ÈŒ’àZ9B $¨'•4;?3v>øýŸ^~§’v4oµL„Ì`„šQÄ5U²|V>¯A¸…F™úo›£ø+jHЬ1Cè {@ ¹ÀÌ „‚àa ï¢`]¶ÈX÷ÞaИ#uƒ!ß9ë¶JiŽF‹Á¡ñ`yx]‰vÁY>:Ë÷!,mŠŠyf˜®ØÈ »Ïb•c…¯Ü¼AÇÐÞOÈ4[4dH4ÎE*Ê:ÚB+|ý`»ºŠ- w>û`§0ãþP`õŠ,Ö»váj¬™M¥ {!Î¥5ÙéòÍÏi]¢Û¾ÑZ»»rF¡×jeq×OÄç¡%°1á¥d'“Xrg4íRê®§fâN^úÅÿþñgaØBx1À–6<³_öÑò¯lžðä1}®‹%ÀMy9Ë‹ÙCƒØõt OLÅFš>(!´p>µ›¹{¢uw#µFÒµšÚ©ŽÃjë m+`ês"Åá{†¢`к8m™]Q#!ªY]¦R%x‹àë2ºˆò”¬ãpg-Ö¯^þ¿Ú€9_w$ºô(¬ÿ ßàP¼E¯®­ñ_ôé†~Óòßjè¨üÍéùdxsrü…[¤¡ýõ?ؼ74ÆmÝðì=Š-yá~B¬á×`íXZXRRðUC%¯g“Œ²H« Ü'YÑ“+ÒÕ„ m$-ˆ-2yu ¤ÃtC?¸Z/IªR9Hi˜ÄÇž! fX!¢ø´” àª5(DÖU;¶J™š ¬'(±•­L|>"ªUã!#< ƒlo“ÞÎÑYL–DÂ¥ó;xÔß°ý.QÖ_Xœ# jæi'=T>Ý– ¢¸X‰JT4¸¦CF„=X£·ÒjÑVaê—½ÚˆSÊÕteü©›`Ì…%:-³w2-ò•+e*mc`4å×`ä 6 «Ä²eÅ šÛŽáìÎÛ‘¤¤¡ü3ºR:å ý`Ì_܃6Î#ÐÇ3i1Ù¸ÂÄ­ 4ÂNQSjgÁr¨g–­÷VÆßHÚ:–‡z¬o¤¡l¤X¦ZJm¹ ”G´3qTÔà‹‚|úÁWæòì³÷R¯¾ß¥€ÚmÑ´l_hÈVb*#=8Ãk€@ŽÎ~”÷“ÖJ²—ÖÆ—3ü3jãùãXæ ‚4ä3Í~‚!E<šëZ÷(;KÀfš­Êéwª)vš¶WSY,ô‹´sŸÉã¬îзv~àO!k$<ÒÈQ%£my«\;˜§ƒÇkc]ÛÞTάx‰Tµx…¦ÛQ¥ŸQjRÅôA9Õ}¡,ãï¹ü¹2ٮ͖>TÅ´„ßR¡`ã§g•ùsºÜ«þ€¤Û`pš1£ë¸þ¤ßÐP%¾²ÚM«lè{‹F»®éBš¼/‚"¤/ñdòî N‚Ð)fô‚i4„"6Z/ÏÒ–ÎÜY 2L7ªÃÏÜW™9éñ¢ŒÚ™]›§™CéS°Kƒ¢lDTl:è‡ØÛš!¥&Ýy.ò|ê°$©ˆi,m‚‹¡ti Ë8ÞPŽ›òAÖ·À³T9ìŒvAí£ä,3ǃ>A!Î4PôËÍþ7VŒþ|CÎÐjpˆ²*‚’Q W ÿh—º³:^)ñ“ÜÏ<ÉY¾b1µ»‰cMåP¶Ù“è¥bA2ÜéÆtЕIF™Ã/N Pa‰|ÐuݶIËäu¦-Ö3ñ3±„};“Q¸{ó<§õ•Õ¼ÅsÍ/k¹s–[ ‰h·Ïk¿ÝëÆ9êRY˜P;¶"ç’§#¬œ¯ŽÖeo tž™°cP”.âÒñ ˆž6`v³ÒN‘}Ù½‰(ªç™,rðP©uvâ°ƒ ¶l›@ÆÏˆ)@:ùåØRêCϧ>4Ò];«ß=S](…ó,üÚ×É™4ÐÂÐÏd45 S) éVò¥*Ñˉ}4®CŸ.gÖí>•/dDú‚@Å‚Aj6ÕÎÉ<ÇÊ;|á³Z RŸ˜vßYÆÑ)>Ý)Ã(0’^dðZYØ£h9š&q‰ÕiJùF#†¤\n9æîVz¾.×(9+ç?L^W¸©Á˜Ã4eû¦:þ—°yt wE25Fj-™¬ÏÃåÿ‡D ˆT`›z<|ÿîÇßlÑÇÕ)?¤©øßÀ5¿­¡jô×ð¤A~~ôLJ6é-·!÷#Dó ’¶§ óùœùc ›üÔXþ³ÔúûRý‘5Ü' ýš5ò›©!ز¤I/B@œñ">Ò+@ µm½%'ã÷LÕHº& Ž %uá·v੆ôúÐÖ&U¨^Þ½!䤟_IÏ\˜áÌ@¸T0U|WÙxjJb@P `-Ã_:Ó·$G¶£óݸ—X~¡{ûI~ÖàR]Ãh²­öu2ˆì¬”PÀ=æÚÍ |‡k†;ó_•ÀÁ¤ðÙù0P„TQ¼ü CÌcha‰aŸÃ*hÈÉ|ÐxUkÆFv ‰šÅÖ‘°Ñ¦«î_‘á w¢ò°^±«ô,Y1š¢œhù¨B $p¤>TÞÔ”GR&¸ÂRæ¹ ¾mê9µ.¿Á4™ëŸYFÙ¾³KÍð õÇÕã(Ê{Ð/ÈêLrÔ‚œÆ±C4`ˆ9?ÔÚ©dcžlˆÑÙŽÝL­@2vuO¥O|Y}1Ú‰v"]ã˜}’ÿª% ©1LUÌ2VK_u7hh•yÃ4ãù]m4û(_æø! 4(EH¥¦3ÙR·E•œž+Q•ÓÇý›t‰ß¬®õGˆŒ»ÊgV®mDô¨ÐOÀ?Ž h3úÛni•¡©@í,4f CS˜Vm”—YÞðžXvy¾¥¬4X²©2ì4â1w FØÖBßø+Iz»üµAiu7ökð³œO?¾…îƒï¾ë‡úMË£¡EF÷—¼ì߸E×1U +] z¿{lç¯L±ÁÊø¶=ïפ»ÞÕÕP§à¼†ÁSà´ÈÅú^á··èG–L¹ÔŽ8«ùŤ^[Q¦"¹R¢öh(6‹iÉE ÏÔŠôC‹àh)÷7Pbv*]ÐCn”}É&Ø¥OĨ5I-¶ˆ‘š„íUfx¨tƒØZJ;ÂDYðPƒÑ­t¹Nz<Š,C]B>0½-[°"l^ ë®-¯2ôôe¥F0´]Ù±Cg²Óõ8~xù©5K= ǨcS Pd\@ƒÖ¡B‹AÁhLŠN¢ë¼@ßÅ‘3‚µ²VL5ðVd„1› T^ƒ$-ÏÌÉ–FØ£Õ¯GP´3€2² é3Ë’\Ùðõþt>w…‰T‡Fd(œ‰µ|ƒH#¹VÌ_+M»Y4©]$í-g°‘ _ÔÒz,Û 5SoîÈAu”»±áàÈ’†ìÎPS7ÆwµXÕ|¦»¾ òîe¿xÆ2¼€#øÞî+T‰#ð• ÷Þ¯rKZ´7­»3mhÔDÞjÞ3üá ô˜ìG5<> WÑ‚Î1®›¬†TÑÂÂM%~ItN¼ÖÜÆRWgwš½-ò»&"öÈG/ûŽSŠeó«Ø ÿÏ¥ØðÝÝ'„,ÝÏ*u‹ð×+þ.áÁÍïÊŽ½?Ÿ¼UÙÕw6Ìpä± õ2´S½^P—íÖïfð~.1ª´rðZ ëeŒí.…XJ²Jw˜\1„·æ¨ Ê8khé Y/% Ò °§&…xæÇì&¨ #G%5‰ln„Ð}Â~FÑÙ#R!o˜ ŠüCj>„Œà>zÈ+;¸Á˜7p¥Ø 3‘³ÒÀNÖ¥p‹›PÌå¥èQˆÊõt¤(ƒs…&{—ÿ3"HV6ˆ2Œ4Ì=ie‹tê*V/F9=Ò¤÷åpL¹$\Ï&Ȳ•E¥ÚcƒkŠz0™6U¤íd6wO¬ýí—ÿ_ѤfVYÛ—ÆŸÔÐ#à&äDCwqpÍç^Ôúð¦˜ò¶h °rG'1bCšCsÛ´LÄnú µ™ï·¨’±Œü‡B¯÷†N$ÃDÝDNµ~v‹^—‹›…HÖlÏ 4“1 5MP`œà1*·ÒI0‚oºá­]F!™±|>ê¼nTéÙ¤ÿ™LÅga¯$ïq˜ÛSN'ÒnÝÓz¶Wà1éÂäc´!ôÙ]J‚½Àœ`RGKA~oƒYé"½¯/ Tnå厫 X! M€DW¶$$-ä!$_Ré[¿ÈøþK¤~ûdpî䜶Ó=A%]Z‚xÖ‹(=Ã\Ö„i• ro&GÈ;ê¡n,]hTµ§u·{”wÁ¶l¡8ã$h"B˜Úñ¥ ,ÚÈA ?Þ1޾š<a5wÓ'd j[›©¤Eà7’(Å ³Ê“¶når§Ø³»qŠ®R¯j$eiÊïþDè‹(-ûx­nd6€ó¯d‡ã/»Põ-¡ ã%¹Ö ì•‘O•™Æì!“Áø0f òÄ3J㕼#›ÖH¼«ä‰aþ’†3#•)¯ŽÙÁIQ%7fé;TWÁQW„U4Y}p43Тiñ¦¯;>Ä۽ư9S›­Öq⥎™G“ Ùö…_Í&¨BQ‹¢°»c«^.䤫l[çO ÿÈôJšöô(Þ2J-;Mˆ›Qµ½IŽÇ”ÞF£ÇZiôíkÚ‹ ‡€¨‚lc70ð¥OQ¦ëØ [,3gG:¢¬…æ$ùžˆåÿžËÿŸiè¹ í§ú…å«¡Ûò¨2þ Jô•2®XÞi˜£¼TÉ‹‚¨bîQz~/½åÜ`:9Iç_ç£,Þ˜' Ù~Ãòn‹ê¹á? .6y‘‘hòòK Å|"Äù9žÖó38[œ‹ÀHéfwAps{¸¿˜\ —kÞSGÙXÍp§HjX!&¹Ã„„"éÓƒÛ(Îb;! ¶Æ(Ýc€ã#zfA:¦¹5m1f Ý .n†tá\È6Ê€Œò½ljÊ›*B„n]„%Rða‹ E£7š“µý³œÚ¯,?ÖPx£«2r¤ -VJ˜ª0äY>OsòÊèRyiOeéH…ÅLêtw„C`O«üËba Õ׺ø;óœ­úî|ÿŒ†Ö“vˆÑ¤Tì=áÝÒk\ݳeɹ¾H÷õÎAbàg˜¹â¶âa5æXÀpé}§h¡0v1H5RÉ@KO”¦vKª>ùf?zÔÛyÙ%™$醸‹“Aµžùà¶ÎB­_¦QXg-üÔ—.Ë×+ÑÏÄ„´GüXÚ¬€ûŽÑ– É0Z‚ÉÛ Ì#•éÃ~p§TÖVLB.‡ àÅQK ¹khËwÒø A,¼ÔÃÕ”D«UP LËrVT9Û‹p¨tû’øpIýõf&´`- €‘ߎ!ÊvÊÆ4'ÈDú#ˆŽŒ‚¦<ØŽ)½Í²ÚLÆ1¹#Î}^;>hðiaé*6{•-4eUjÄot!¬TˆŸI<äõ‘ÒW9¸Òªƒ'«‡Ùƒž£ÁþŸ2?ý/ŒÙ_ ý ]0Ü[|ñ¤ì˜Á‰g5À(c¯“~uåãØÎ'¶H¾n“Kê`N?Ê8“d(©Ò©ùµÊd§êW €ô—*ÆŸýØ‘ç“O€È7ÏyÄ' W¾I&Ï1..™Ãv¯¢à°ŸÞÃ!Ý\õ¨ôÞ2º8̃ÌqaÒŽeŠiL2\xéí=Cë³£açàÖb¥ù@3£Žé$Ââè¯Ë2ôÒã!àiD’þÔ§7Žì³1ÏÜYøÞi£ †%$•-16ó`©FwÒ%wJC{ÊC7ùYͧìI#fç.Ë1zn :4É_@¤šBš)‹¬#Ë·j2õk,jŽº•™Ý×åÍ:Û‡G„©œZbÛ<²’b… hü%)Ÿà%ä"sq$ 5FPÞÕwx°É¾ü€´*Ļ̋VOw¶Èf€)#2 ÿT&ÐùÝ8Ô“=VÿÔ Ïl«ÕŽ!_Ÿ×†À€Ÿ£n%Á æhkh ÍåV™ ¦³£ŒáB€AÑ ’wÒcv²ég&jjÈÑGœf¥­/* &¹‡ „âþL+Ô#ú°Ð ÕÓÎ.Ùë;O}ÖÈ$e¦Y°\‘2]X̹oa  ¯Ø k5 >õ(^x¥¤\‡îD%ÒR”µ#ƒM߾ʋKîë…Îü6¢X‰|X´ÖI\ô¸jCX½\ô2óë ,5Lq ÞgÙó‹?è’* Ê"QbkÃh ,mr :áÉWè•Ù2Ÿ"çg ªKõgøƒÈÞ:Øl0–‹|]s²-³üM6"núÙNþ7_þoCñ!$ö$íß´|5ô²\gÙS5äÇG Ú¥ƒÇ Üê•ýøɵ={Dµ×5D`¥?ܤŒÊãì²ø‹ÊÂ¥×Þ5t/Æ» å'.ßϵa/Õ(X7ÔÄcZ'“b{Žcrdß ªAÁ5t³‚r¤O8M­ôÐxDbk§o|Cš•ŒìdfñŠ4Ú¢tÈ^Ã`EFéÞ¤%Ó¬†¾Î¾¢¿ÇkTv„¯ˆWÞw^BøÆbMÝ0X‡¬mÄ ±,u_ªaK&öž çÆ2 æÿÀ%nG¯¾Fç†ØŒ¿»•Ök|HÒ†î²z"¡nx¨_$ÜËúÁº)ê!BÄi€*+W»ÒIWiúTé%Åö=€tã[[Z-3ê7ô¢Ây‹ ," Î3dнË~3AÆÓ§dR}èÁœÒ†&VÞ–¹½A~rç„*È.‚Ö3äƒPN_èŸOu-0ûk)Ê5áTˆYœÊ> FÏ4aÙ¨7?ÖlŒgRð*{L w9+åÔnÄþr—Xe¦ùKOï‚;|ó¡Ë4 DÁýf¿ÈTi3 ¬ì\hÔE0î–,²÷²`„(hòZ…QCºŠàšAÄ^>Ê*qènrTdĶ¢1z"}‡Qé8Ñ»µÊvy1ša÷y:`òµ“ìÌY¦/r©!PãdÓÃtð4_ä2ð4]<¤+¨~fçÓm6}±°V`§ÇßNA ˆÂš†Ä| yÁLõ4é!àuI²™™ÀQ $mxä¸À/D¦dˆv¡¾¤tÞÝ©<®M]þS骓þ¾ Óß³E_ M Ç/Û–®àüjhPáFÉX²~;¹tsE™F–jóô²|"}{Ýç*M›é…8os‘`]›LWÆý…ɦØìㆮ,å[ §XÑOmÑ»%Üp¦%K¯ÔJŸ0Úä™zyFº1LÉ0}]i ¾E’yßÁ©Ù.Ì@"hˆ É[¤wž`e ]éYWÇli`Òáfë&™c¦¼ÉCøÈ÷²÷e–ß+zsÁ_Èô™Ã#Bî.¢,¨Ëd0pþëeŠˆPJ¢†t‡ž6ç§Öâ&˜o—†šïAŠH¨c åH×·Ý—ãèœVùöÌ#Ëu®,ê§$õûŒYwgdè-/i1£Í*î ãÉm¯Ë‘´ýGü½îÿCÀ4\/²åÒòéýEã´L¶£Èö§RŒ(BZ. stzµ*Dv¬1O¬†~Á4gšBe=è"¦Î©à`eÖŽ­'{uSMNO4KæQ"¡S{¡ g£ÖO“!9³Ø,±,ia—ñ‰W?2‰‘ƒ·!ª¨¤ÓrðCqQ ®LqÈíЇ‹[EÄUzÓla÷±øi–¹j'~Êû¤gd$:Iò¡ñÆk„ÌD„I"M/•%L"Ô‡&!î»Óp““,ðg#»d¢… ØÆ(—œšÕWX€¿™4:{èÕC‘ÿFgh‚±L0¹/³œ(òØ-UÖLëÜ_›30°[B×´4Nþ}Õ {j€|xÁr†ª{}eÑÎ!…̼!;®ÚŸªÊz¸jåÃCC’7¿ÐÐ/,_ }¸ÜJØË´<\Ù‰Ê>Zæ%ƒžÌN6ÐO× 6$|—yÆë‘ýLŠ­–Ø=u_´&:H··a2Ò¸ܤ@ä/Qøºâgõ³ÌêÇØèÇMþä}§AŸdÖ…b¦­ôŠéx’ Ztþ©×åGH׫E{Ç´rª†p ’û]kLÈô)8ªoƒºz‹“tG»2Ž>-$T N‘þ9³DÈg. ¨"qQÓ&ÏWr¿+"îPÝCy“­Ü#íBMZBŸ'ßÖ¤Õ(KAÎ.¥Õ7¶I· ¶‚ ·54ßïŽE¿¸üXCC ¤×Õ³Ñsf¬?E@ZíÕ¾]Ù4F•ÜÉ*º¿ô.Å6pÕ=¦´YªmÞ6÷OXŒå¦×gÀdÏ»7o}¿úÉâJgE|Z—5¹…zØm– Ä59;ZëÇ2ɦ5ÄÝLá»ñ@0çÚPˆFUफ£ ´*%vTŒµ­™ÒéÿØ»ÒÄÈQfùŸÓ°/Ç$Ýÿ/#IU¶Ûn·gÆý=K3íZ)­dFFšÙ¨c×åFÔÞïr±m®2¹1·ŒîeSŒ !qf˜<³T¯J,åb5+ ¼4SiH{ÂxÏüO‚K³Ay1F±ÖÈEvŽaΞ].Æ…oeWEXÕP@íº"ꙥëƒ$å HÊØâm²Qu–¼û¶S°TàÈAB8¦)Õ_có)Ü„‡ý!k‘Ác.OfK²+ö5bçË{ä^°³Äà‚À£ÆØðàH9PçèÞ(É­bô ÊF;'@Å0 E–³AK]Çã4£¾|UœöáÁ¸ä‹üC©Ð'–o3Ôþ4ôw5ÎÛ×ÉÅ»+Óe`ÚæUë©9pÎÊÒ¹‘!9,ÝfÊæ_12û@ÉvÁF¨Œ.—§†ü‘F×g\cD×ò°˜“5X¨™ƒUsŸlh-Küº–+•es»­¾“J†¦LÈ3h2;Ž bJÎÖÒ#‘ÑSè¾JQñš}gc mf)}’®·Èÿ›ü/ƒŒ ›rY8h(b¥c’NÅX2,ˆ¦2x€×Œ‚²A¨I6œh'fõ¼µJ@Rö•l 0¸‘}èaÖ7µl„,ešo‹ô‡A(2›†À!íí˜Pþ§éõ†Ô­Ü¬N(T§_èˆ+õ#zŒ8¨ó{äVo¤d·“ ½M˜ñ¸óµDâŒ:ñ5DÉJ3÷Fü²Në3ÞY¯«ó#ÏÞ¯ÏKá2ì2‚CÂ[ ’ir?oŠ”Œðy€ÂÓÔ‡†Ci!JrY<(KI0±v>N˵qwú^€(T&Ê iœj†^rO@LÛ].¼Pê^#j¨F•|VCîÊ>,¬‚ÜáA©ÔĬSœ†xŒƒÕƒÜLQ=Ü@C'dF`¯TݵÓÒ2!#f_d([ @+2@U2%”ûc|Tú>™îTJ_8¹+7¯gZMËc”»Wæï ž¦äV„gðœþdÓ»5zXŸ¢y°«Q“aìf–hPÔ÷|²u«QÞŠŒã/6_¦.D'Þ×òû²Òç =ˆÞµrûï69æÐåô…¹n–Ä á”1´äZÑàÆº³Ü=©§dZøìXð †Ú7ºbG?òEߪ!gŒ`uF p‡"µ­ä¦n>Ê­ÛäöDi¥ŸÑ#B&k¡OAÂëM +Ý×—çp\ªPÐË0 NsD¸²ÁÞŒ¬]üFÈj7¹ûÇ/ÌçØ¨›©c{…&“?²k놑žÔÊÔMÎ ˆ´a—9š’ :?Ì3»`ÐãYr„“<‚îäQ4‘*¹Ý*æ2©Äô™eÊ Jk»)örÁ"pâuÑiöŠ0èÒ/fÆÒ,£ Q§‘ŸˆC;O~ì°‡r`©v­ºtï»/y„#È\¼ØÆ8ÑA†C$BƒŒ)¿†Á(sªÉÝþo‘7bÞJ½H™=Wå?¿ÿÌÁ>ÓGWðéñc‹´O»A¨~{gV÷«§xVyÀ2;Ëä„8KûiŒº«ù¤O 7bömŽzÑ•ò@~œhÚf Ý•híh-ØyÏAê=‰:?š<Ÿ¡0>DÚëôWqÓøÜ“©>®i{ *Ѥ eyäA‚ަâ¨%ᔺb‘§õr¡{ªV$r‡²öÙK» *oXi^Y9f˜8Ë(šEgEüî*b6r¥zÉ×ÁÛÒ¸Só,c}^f…E¦ JØ7éƒ7A%à 6Ðpä,¼¼“8iÙ½#Îè|–‘"8t&ð¤HuÞHSŠ>˱[™1ÇÛž>a‚a g‚àaJ4Ú1µ„ ²åÉ`nYôÆ!$À1CÉÀ±Ën²ÑègVaïo/ÿ+Cí» ÝYHßc‹¾WCwàh'$1ï­÷ã8t ª+:«‡G×…XÌz¡†IT¶°He{#×·se¢ ãÉ£ôBº <´¢×¶D9 6š[R)ÛÑ[‘ ÛËÞàýcŒàˆCx-¸Âd nÝ©ù@ºw‚ö圑MÁšfg@((Ùš®ž¯ÓÈäq#Cs#;R@å`7[ùkdÃ?e¤!ÇgEA\—h5Ǥ `£±ÐY¤ŸñHæb:?_Úï^üdƒ¢&“ä21Ÿb;µŒ{gÐhHy0ÜNS«ß^¾ó˜ýe ý¡Æ÷wÞµ/mÈž‘ˆ×¹-î™ë^< ª”~Ô^o°òI¾€LáM‰$é&ÆêˆÆc¾!÷)DÆÂ¡ÈªCuŠ•b)Y0‹tH†éu Âe®2Ü)î{/2i{o×^](v˜c÷;,?wÜÈDž€å©+ècO/;¿ÂôÃ8Ý/V©¼¡ã†9íY*ÁÏ1e§ËéÙh £°¹(¾0õiR!†Múo Ô|èBº*N_{·cò†)(Rý"È~¶Ë™¢Lg¬¡çR´à?켋ˆD‘VëÍAúhc”2Ž´ïG¥#Ïg„|ô­Lî¶ Žòßf!}õŽË–)f$×ȕѰ71Þ}Ç׺REáLÐþ·[ôýz½ß_Q#†„îWöÎùC•9FP”y‡v³Tò-Eº½]¦ñÍCªB€‡kœ£]F¨69$2ØY‘/ ºî+‚ÔlÒµ£‡Œ4[˜úò¿Üp/j¤+äî‹qǯvííÅ›æöv$4÷=EÎÔjpö¼ÙÿÁ³öØ~’ƒôË›´ñÛóµHá9¶•N Yà*RÂÈCrZ‡dr¬ :ì,“Œ,_ܤ¯^CÉq§ë™ôqò9õÚÐT¸N5pŠô½0A‚& /Ò]PO VØ‚°›Í›Lõß8-vHPy9œÀ"TÉ‘G:’˜7ùØA„]v¢±>i5i ‰ƒ&T삚·Æ§Ù™oìÏ6ô~Ší=p4$ƒ:ƒ9qR‡1§Ûf•ôÔxù™0Ï\ÕÔèh¥Î ÍtU5Sá»6šÝÒl~¸«Úé(G’4 æýÖ¢o„{0ߦ¢b!k¡”P=U#"HT¶!<êÔ̆ú‘¦ÂPW÷ÛáXª¨)K4óÉ^´Å¦hR1„Þ“ºždËþ®˜f"EæÌ€Ôi/–ÒWsØÌL¥ )VŠ]ë/ó^/ÅÜkù­©ß¸R—,\yñ>oPS¡‘Vø,"éä$ æëd=5»±ì+°¸ÖÏ­«4ë¢h.3'SOµ!ijQ- +Þå¹| q ™J—ïÇppÖ_iè›XLã†~Òû ëØÌ’úg—âQ=š¥»òfŸ%(µ–¡ÆYÐå32Ã%ƒ?$G€3ê  ¸>ò2Ñbcg¯É3RWTlE‘Œ]š }!¤ÜjO2 1B®‘ ½IÓZmYîÙæúgŽG°0“IÓz%•½ôþ˜,~Àüä7—×ÒJÝü–Î?šô{îÓšàJÇ Û=à_fºt­y0 {@|a'= HP°œ|ÃøQdpÎ1¸³ ¼qv ®£…ú#ý¶7‹"Ƴ΄œxÑCÁqòÂ_‡OÒ^ÂR¸`F)ˆ¬4À0qeaM«ˆNsd !ÊïAÉ ‚¯Âxi§m-ª†üTGʬ#‚ÿT• rè¡L½ªïaVûðÄwÖð´Î×Õ ø,€äç37Á“Žý "Е±* 7|zšÛ„¬iØåî r Ï8ØiÐÒŠ³B»õQ" ‘@5€ Ñ Ô˜Q¢'rSQ1ÜÂ@ÃAž55#@‹ª ¯±œv~Å æ«k‰ÓÁu£„Ï+\,èܧuªaά¬Ý±õYú(1C`°‚ÆDGÒËÍ€ºO;Š!qþŸqÁÝ_ò-ôý =ä×$ÁôvUÞŠuBDÚEAhˆ•ZP®« çøÏ1amÉ]Ý}Ø2Î=ºë޼ܑ5„8ýn ç#)67›ë'|ì²Î-º‹zróÇì/kè'Å6k¯õEC³TiŽ†ÆœC#l^„"£vé,4æA2g71²Û‘q ãPÏ!C^ó. ‡ ÒéhFЇF Rù›‹°E°º^°%m!ÛÝ×i$©ÿ+S´#ÂéÔoU`“ §öœYã;¬qà´µvää>%éο#Hl¸Kߺ[ÐON®É¿pÖÜ[¶[¿ÛÐo.¿Jú]Eq2¯à釨èÉØ›sn6)hôM,&³q†§jâ™Ê hˆ5fDæåª9(ñîkr~·]évö€€¯kñ« NnÖƒ*ýΆ¥!ØÞ©ÛI-YAÂn8GÅ€ž`z íâ’vŠ 'ó6C™cob² ÐNJNiSþ0c,ÀòéÛפ÷{ZíÓ:U g'ìðYÐ'õUˆ›VS.hÃÛµÐèÇ «SS1!ÃhÐ6P¤ÇzæßÀ<Ù ÀÐÊ ³ªxú$FçÉ( ÌŽÅI+¡>ìæ‰ª3–GBldÆ@¸N†|5ÒØ¦ÐŠ3·Æ2û@ô T"&ƒbøQ.\ç,2cn3káQ'%—=¯ÖHà¦FÑJ¿èkGÅM¯=3gGó#ó«*Ô_^HÆ‚2ôN`“-¨¶©©œˆ2H\lÒï^®–‹LjÎ-v3J3nЛ/Ùµk»pϾFlýIû%Ö±ú1³á.Nì}î;õËÿÂàÿnC?$í÷’¿®hy¨› 1‹BÚ*&dš^PMíA;A X†Í:Ù±œØÃ‚mxXXÂ&ÇË|Ì×ä†û¸—±¬8¤±Lÿ™¶Ò€F@SvbcUQø Å!l°‚‡ò[kZG«4¢Ú˜Z R,µí9¸—Ñä£gÄìÙ¹Ý^ûÎÚwT­'d$EBúB»ËÅ€s¶³%3në·Ôϧa™à( ¦Ê…eÚl¡]=Ì PXÖ1ùv jƒý#,k§“€–”{Ñ%d™»ûƒtO³&ÔÙd¯ù«‰Ä”&Ð::OÕ:Ä%µGjÎZs¬ÝÍÀ 3nÐ--‰ŠË2®î2lÖ²W[n‚nÖnw>N$»¤Y …aÝp„ø¦B!@šº(ÿÌÁþ½†Ô @äŸVó´êÇ•6%¥gµ¡Ï?F¸ þ „ P¦”j„} PÁI™NcU@²,'ë öÀ@t»†Ö:2e+ 4òc~P‡âtjŠŠŽy²}fà òg½'²ô4®®G<ÔFTZîóu¡aÖ~< Vº#grãF}ü ¤g‹‚ãYœ>îU90.ÚC~Ö Â(rL_ÆN®^„èb‘ÙÞ£Íu4~äjòƒUl#Ìs§H¿|—6*3»Bíæ)‚D¹Â}®ö¼K³–xnã Ÿ”¾ëŠø›;Ç]å1ÜšùtŠm|ýÊà­íðú*–¶«öôeÌ÷·K,þÿ5ôÿ¼Ìÿ¤e {¸1ÚÀÒQºNA=‡¼Õ|‡¼8Š>òšôPÆ‘.g‡å œ&:èkjÕÓÁíÁÉ-†]@ü6‡’LÄ6iÌ_ã “¼…6’EÝD؋횢,¦ög­g8.³P‡KmËÞÕÏLFž-úÆÔÉÏ÷~£¡.¯5ôÀ>ÿ“†>µü -#ˆc·æ .cØH$‚‘u»Y¤‰ÙÌ^ePÙ˹Š,RZC TjpÉ«f€'Öd#8P³am[±*óÛÈÀ%ÑBåû`’Ê@å#DàWoŽŒ‘ùD;ØäÔt%B#ƒò¾äjgE¸À!ù„ß®¾R°p Rø¸Ë•M8†ÇoA 7 34²_I&ë§ÈìÆÎR`¾nD=M±L>æ hèEwª&¬ƒ ™ò@îV7f&]z!ž]§O0”Œ†ä´'9zÑ£AiV‹¼ØÎÀüUŒm<…á£8ƒ@#dH 곌~pƒvÓ{:€uâ¡ìÁé¤9˜¥î \ùvªBz"SpÙR7Z?¥¶Ò×Ñ<Íu¹ ¼²æ‹i ãИ¢è{µî?}þ-z~ŒŽüÑòb‹dzq…oMü/Œ? }ç†ü- ½ªá•Ëô4˜¿nÈ»QYd3ë½ñÅf« rM&ž ¾3ep‘ý“L^2l,Dø4û#(ç'Ç‹K‚xá¤3o#MÎÔ:V &HjDNß,óqÎAPä] ÿ~H&¸Æ9D?R$ù½tj®]‘ 0áÚa\i°´ ŸRλë³'‚®¤ÌËÑ#L³sv¯ôáû­#µæzMp² I?˜Ÿ|Ñò²¡eðv÷šàt¦ºþù-ZÛ% Èõ2ÀXRÎ2ͱ \©*‡Z?mwN@õmÂfº7òr0ÕƒÇ!ȲÀeoF®*ø'™ØeÌ+M ÛçÀ80&[Å$ü›ªð"–Ë‚$Ê”µ±T¥ÁH|p(Ï2°cxÏÀ>öëŠa‡ŠR;þj¥ãRgg­¶gYRb^&φ†.XžUn3á:*Ÿ˜¾ ÒøÎj°H‡Ô£õ–§TÐAîO¯eÊ™"t(Тî?„@«\~ñîÕaC¨Mü3‚>ãßrH‰^à'M(ä¦Ï˜a  «ªìâ\«ïëô}Gèÿ"ÔÖCAý`‰¬=]í7¾¢ù¬ªJ!ÐäÞÑX¾ú!,·Ö ædáÐP®Ç|‘ŽˆBwKÑÐÓ‹/ÏxÄâ,—å©ÿ-€´ô/þ¹ÛßúYˆöÈ>úý†¾l‹~úih-KÞŸ©Û;@ºò¾zGËUÆ–T„|™-3azfÁOÐJ輑.KËì ÷Á 0CÂÌ‘-]m–1icMk’Ydí”kHòp¨Þ·æX슀¦„‚O)$š-#×e» ´eC‘ *«N`ÔnÆ–A"UÊ6–òIfz¦’ž®˜¨ÀvPq,6·gÝœt›;„?#ù(a™¬À=¸Ðàâ)øO*l·…©v‹œ6“jº§ñÍÕÉÉ·S ùVHµ×í‚äw–&9 ðß=j¡7Kû Á,”uFQr#‡@$Oª.¦órÁ):p{ªš[¹dÍuÀž¼³ªIϘƠ¶äÑ@<£CÄIVg;4% Aa‚~Ýàî©9æ˜Z©NŠê€ÎKé¥/Ò,‘´÷yl®¿ä`¶!ÅJ0C„ú´ÌŒUKÇ“Ît—™ŒçΘŽ#û 1›¨VQüäü”óùU6Ö…|–LPš 7Vµ å'KZyÆé²ð“'9(sêåÏ̈Ñ7ü£ˆªÿ !¶ó¤¡Ê´ â|„è‡áɱZJRËý‚>|P{¦jôA}h¸Â€Õ $ªð1g„Ô:Ô~d5T4t÷Ó¶2OÆcù—Ò­¡? ?6ô¸ôó"ÿ­yÀß6Ôþ4ô·5ôzêïîyá¦0't}F*â í” ž}_‚x"µíaFd`NŸ*¿Ó ïôÍÒ³d™l¤‚ì}B}𱔝€y´G‰v ZB,2ÿÂ'en ‡³ Õ TsXlsÈ–8×%;@ÕÔÚTÙ^$áfüd×a[r"Ag2M>ºÙb[ë1¾1øÅイ\±-¶œP_ü«=À%ê´632AEúäNÔï6ôåeC‹§¹¶åå‚k:Ɇÿü=.žvë·ýíõ@AÇóùjˆuøŽÒ7™5a;C… ÄjLƘ‘š•¡ì IÞÍ5jU#Q¶&Ñùj£:òŒ7}?º'I#1šC@$m¹àÀhBxÔ㣷TZ›¬s )ÐN +M.bÀñ¨Xõü4Ïì7¤f4hx†3ŽÐ>C>mjBk%@Ú@"ˆA®ª34þÇ8_G—`ÈRˆÚN0DŠôP“fˆ«â ¨¥7è@ÖíôÛiQVbA¦Á+Æ ’Û' .¨‹i-ƒ2´Ã:ÀÒi2`¿…â•iÒf„š…0£·ÒYšFnI )Y°rï"E¥sÒWUlT·H–;ýe-+_sþ-n¶?rM½–_mÑoA¤¿i¨ýièolè±ÌsñoSVÖ‹â‘€»+‚ÂAÇ0$?™ö? E=èÙmápoh_¾IÏ<¤,Ö]Z¥jÐÜŒ,äe†âð%šŒ6ð‘`g!I°ÐB‹þ©8½9ï#ŠüåsQÁ/‚q— »ŒDÁÑ%”IÆ%Ÿ¨›RþIº,Ù².’ƒ8¤Gï‹êovEÇQ‡n8ÈЭ¤!Ùë‘dbμÝb(G3ˆš½¼ß?k<ÈòícL)©­“(ÙmþWàˆ{ˆ½Þé™—ïÿ+Wvº©h_OŒxEÒÀp…”këjdLQr}8Sd>,R¯‡d<“I?LŽtôì4çt 9‹‘' —“šÃòs û²Q·adÄôä¡€ƒ2¤“ “*T3 ÿ3•´ít?Àg†¦ ä)6}LwTHŒc{´‘b‚Š­zÖ^—× L_ Â)"½OöϪ€¯g¨ëÊ䦶6 PÅØFCÕ‘óZÙ0s‚Ÿ†¢¯3¹Ö”ña`c©ªtt=Âd·=Í<}QHæà¤òÉ`è\hÜ”¨lw«þ\§à`úlá²f} p] ð_L¨ý¶ð<È<²y[BX2Ì;P=\ ¥ë,¡m›¥ÅeÙ¼à¥#4{‡6gS)5ìæ•¼ÇÇÒáÐ3Cg§†ADör ´ýw"HÃ_u³.cùã-|¬ˆ4)#H»{5¡ óG0[‚LØülÜqÖpÝ@£„A9‘å³Í,Ì”©áxËÒ#\ s$¸(«àœHOó¦hÖa;†vr»‡mƒ‡Ï-óvCü¦Ðm¶Û"@y£Ô¯à|¥;ÅìšÎ/vòýe•YÛU|4–· >u°?ÛbNq‰Jï36t «½Xó ¤OSLH¨"ÎUN묅OS&È“ýÕçyq3\cS÷%3 Îbùù3óyã¹utÞ¸'2ãÌŽ!$ÄŒØ ­xvÛ$ Õ™# “6t0ÌW¦·q$>UèÊε‘H”ň ±`{Ä…v†¯Åñ,GÜ 5ò.¸ fýÁ+ôü%/?:é×Ož ýqéå™W4ð>ÕЗmÑOC? qIfwˆ'ºýí…ÆAr:ʨÐЗmÑâYI®ÑB»$g¿É‰r/ƒò/Ò¥‘«Ù‘«-w#ÕD³>-Ëkþ®q3wftQ†J'ÓkPC0 ³²{(HòíÔ–DnÌábàÀç`þ$ëFÑë±B9cT,?5ˆÖlg¢:œú3KwÆN¬õÊZýÍ5Gßõýþ¨vè ÒŒ µIÊ|4êîõ:öæ<ò—ÊÒ#ü{;q­gÍÁ›gg<§2Œõ"K:reOxHZ±édY}A™Eø@6IÈ3<„»SÍSþRÛA¡‰ˆSfA`ï>×ÎQf@p°©7ЄäÒqD??‡Ùǘm@ª1ÃD‘´ì‡¾(ÝãMÖÌPª(Ó?õ’\v×U£f"üµå·ä9þüüŸ²ŒK:é—×rþ«€_ëß@`×PûÓÐß×ר`Þe®Ô¥WЏæ9i°íÈ 5ב‡’ù´ FRzS( +´‹4û€…º ‡·dYó€}³žòŠw>œÐa@mÁ6š$pe÷ £”×ȰlòS[ȮӨ UØ‚ZøÍÊåíÆ8ƒ€$sÀsÑ!Nþ€Ûä•jš7d%ÔHàŠ/tk#@‚ûÈae à^—ÁÒ DŠ}ë¶Ö8Àã„DÆÙ}nÍïŸ5h0:•ÎÞã(É1¥`¿0×? î¿@z^py`ô­È‡Ê Ëø¼CÀˆ9ž¦Xo@ÐM™UÚÈÊ`„uÄí‘äâÔœ‘Ãl9,u¦7*‚"pá>æ` Ô(nœSÏÜÇ[‹9·X µfüé9üÛ¾ÖÃ×I½:¶~bùJ€´€QœPhq§×ª—“™Au’+h¤¾ŽøÉÒ'ttÔëÐ/$¢f¢¥Üë6ß• JS PÓ¥•5cjÇå˜:WÌȰ¶É?c%sd!ÑÈ”9ï']Șºk²*ò¨‰âL˜ùI ÊmQïÏ®ÝWG9C92ýØfí>k®KǬ¼¶qSáÑžphD”ØøJ_‘Ãu%øWX@ï^_z×þC¤ë8èßù‘¿i¨ýiè/m ,*vGÚ:F˜_3#%oϹ hfÕ=B>ÎlÌ|íä;Ê$NÐ|@¦gž÷> .wœ„ÎÎÂŽ2ALò冓y„5¤VŠ0¨ë0ɶ®Ø•€w¾,€?Ó9ŒpvgÁw•-‘Ù¾ë4-‚(]wy¸Á“†}…¹:Åk *ÌKíŠtØHv;¨š­{‘ùaš"92NîpÔŸHÒíFÒ%ÏáPäc‘þZà›W{ÿZãkýÑ«!üx‹.úŸ /vÛéαE3êæ¡;Ä€DIN‘RÙGOBºÊ3š‘‚ÌlXG²ØúãÚû þ¹™7ÅUìiõ¥·¶:ŒæF©ÝdæÇ—ÈÝÕ˜›æW®d½v»G.þù§ÁßßµßkHÍhÐ#"“z‰Úä µú¡ŸH^Ъ/È*¦-ÓI~÷~„zt¨CAß1_)¤M§9µ$¢ )VÖÖO&5ð”c-`8‹ìwæËŽá߸lŸ”ý¯Åž²±wIÛw—ìÚ¥{˜,ó÷M.!-gP‰‰‹â£J#s”V ª‡6ªËD #/¦I–Îoy¿þ½ýѵŒ^heiþ=-5ýÃRÒšä;(“áÔ2ªÆ0 CâkÃl$B¤Šøu Áêj'¨3àƒ¤× Fg¾‚ ™ŸêQ^ïÕ™<;ˆ¥Œ|ð.íDˆDȦïäTV5êÌ"D–ᡦu”ÌÚb6út7«ç];#HµÇ_Ûó<¤OL] }ÑòÓÐOCÿNCæÜúØÏÚ9ƒ|F‰¡Æôã²hW,}O€*a5YúðÎç\ÞÞµ!Þž!Á"â.°ÁŠjš>ÀbÇéf³7ŠšÆ»‡ ‘6 üøp"ð6™+o:Z(£€ÀŠ¤Šª|AA)‹_2’wM:O’¯¥±š˜H1¬Hl+SWéR©ƒ„Å9™9)HŠÌF–-zÀl˜CÈpŠ@>¶ØÛ]º@Á?šÈ'¢æƒœïà#aלl®q6¤¼·¾…­ÈÿÆK½42NO9³ûEð€$ÓP8X„RÒ­w~ãÙbþNCo,OÛ4Z<–¨w½„¥Ì6Ä)‘4HL'ù-â éƒ.G×*x„Ó-¦yYµ‘fÚX‰UN _,HklY.TÅkeÃøFA—«…ä0YF;lË>IA‹ís©—>¿òÛ[ô¡å?HKšë0=V ÐoŠÑ³T~&¹®¤W›ÒAƒ&]i²‘ÀwW ìdò®ÃÊvy;e¥Á2m]ðïN5Ü·ž¶3P®4jVŠŒû@<åžVúð™(§·«ÌP Z¨CÍrH èÎb³Äéè˜+>Õü²ÀAÝú{¢ÕÏíÏ~ñ§¡Ÿ†þ›†^NÌŒŠ_qò0ØuîaœYKT´e8LWB[¾ÓeèA»ZòýšF98JÙÛç#·9F™Iô»/,i <õæpÉWE¦€@ Èç€i4'ŠÐ^HÒÖÑ9Y¬9½\ƒ1sZ %[HÐöNz?D{ŠN­ÿâÓ Á%0§`ð4”pk°(c‘~XÆ_v97˾·P+TK©†&^?Ç|¢Ì?°Ôîh±ôdXî!‘U!xÑÜÌÿäÊ^64'YŸ4eœ¢Ã”»;Ìú§™£uàb!c·io Êz£P‹aòˆNÑMjövCE†œ‘ ¼6Š"}l×~EMžé.uÃ}ôûeìÖ<Íãÿ‹ìá¿ÒÐe‘9þ~º¡7µZôl,ÝNá „j)ÍZ±Q#æfݘfðGûME # NL“ @4 èèiü;ªÇŠüï æ SyH€eÐ WÆug ñÒ˜ÂzÌgˆ+µa”º˜òÌ£Y³+¹F‹Vn]2á‰ùóÈß{óö_ÃÁ§=bþ®ÈŸ†þŸ6ô«Â$ ß^xÊÂ-îx%›¨ßÁÚHúérdà‘±[Áš\PÄ.ãù®_±ýúèò«názÓ?Z1dþ˜2)3q®aéIö£@ È¡™¢æˆªéé"Jƒ¼àŸ Ø'Ãp–¾L%$¹¤±Øªúµ,æ×‡ —QÄ‚z2A(Ø¥kCo¹Ùq§²·Ç¼uG æ¥,,“Ùâ.Ûvx™‚¸äŒôƉ¥,ðÄöìZÁjˆ2údÂF³.Lt@b˜¡„˜ö­à\6ù.ØÀ9‡R“óгYgõizÿ`¯ÅÊke—1BÁD, Ii½Loï­ýÉ•½ú÷—™1Èl "RÆÁÙ©3[Y™#Ùc Üô( ²¬„?’òÄY+jë¡)Däéå˜9Ž^Ml¦ÔݤËûüÝÕÐ}Þnæžß¡Ð;µÑw4–|סK0˜—°(‘IÉúòs@è`Ö¬¾ƒ< ©±¨fØÇæ „Ó™÷Té±Òƒ°6¢€%Æ–oB„iW 7 ©ÍÌ’³Q‹Y‹Ÿ‰¬† g Tc€ˆÐ Ö–åˆÙÒÞO,ãX^ö`!ðæóöÿH? ýkÈžœ#ÿ@ÓĹ‹Y®æ°á ²zÝM–›r—ñ%îjì,ßHà«i4f……Ä>,Æ»-Ÿ—îÄýšøù]»7¤lCâ"À‘LÙ‘´§7E‡|Ä ùvÐÓ\3”PÀo„ª£@#˜©£vÍyNí¼ô¤ˆÈHºâ#Ž R´Jä˜"Ç#ú²-ìjÃî;œµ4ªÎ"ÖÕ×ö:‡"–pŒÜx1ÚÝÙTæ˜v“ßXÐj^‚Ì=åsn”¶l4–ŒmËʼ¦h’>Ú ªJ‹JÆ^ç\,AR-E¾‘ìuß•ýHŠ&§ÅÄÇD è`Ò-îÞ!þʾ.L°ÇÌjWî.°qTeïE§(ÐŒ2AÔLÔÓ·!²)M³NKͽM RTÔ• 4òƒé j/÷弋íÚ—½ÄòFh6®Êxu&Î^~ùqùe‚íïì^.ï€È?\ Ù)(mŠ§šž„ø}ÖŒ-mEÏ$Wb>,]¡ŨÑ1iKc¨L|“IeÚM¤Sg(LQ›Q¦¢&•3Zé&G…ѵca<÷&s‡:cFƒU'¶I³À>ÌR{÷ÊóS³&gXü¨Í‡TØFàÊ‘0”0êô¤o‘ÊÕuËÏœÿX^^ƪó裸öOC? !t»ö— •ÞFC»Tƒ-ÊnÁÌw’q1À[<£6BpǸŠqXn{˜mH¢ Iæ0¬!ý?_Çö‹]“A”UOƸm@Cí¥fJ2J‚}½Ç­™³íÝ+€™ì£qEfaõ² ÕIBPdÀpA<ݸ. Q#ô‰¨À.‰¹3?5R¢m†œïî;}BKÜÈABÍQ•1.³ƒ¥Éõµ8¯BÔ ýã(½50Æ•‡ üa»Óu µj2®Ëk›…q®|i꩸€˜?ÈGô  "µCØ Ò^޲•Fž©•G Î¥19k–½ú'Rp6åAËÛ¡Ð*“„¿ª¶>ÜÐ/ãPØÛh6’eÉÈŶÓСÀ~ ŠÄp«¨¼ÎC’⊌Œ~ ¤zjÀ†„úP¤@o73´ÅvÒO¯¼³ü.@º/cZ7dp~W»î”ƒ´Ú€“é!i3I†k"‰ÈOd#ZÌk=¥;àgFЈ‡ê$ U&ÒîÉ3üã'ÊÓÎÎñ??1ÐPI ÆŒ<ÁQgu~Ÿ”lh}b@¾$O>æO™eœËðÏ]>c뺳wÕNýaqžŸ2ÿŸ†þÿ6tÝ£ˆÜæ9Rfé—‚Üý ËÛÔ_Èí]ˆ|6ˆí:/Ss¨ü$›ƒ÷X P?ÛažIUæ²ÎpŒjéž p¯{>`sVïÞ¯Ú5„-Ð @[ ¤Mú“½îe“1´8é`L± Н½íŠ•)»t.‰’Œ•왊‚–pÈ‚¸-“KP+:{Ê(ÒÁµE–2ɰN—™(¢lrl7–Äå ÇhaÖÐ!n2‘Î…YxÅXŽ(ÝF£Ï‹€6aK—¼?@—@Ÿí¢ÝÕfœâ(´;‚ýy¨Â+ d›H-Ù³(ÂÒ©ü¨F@R’’àOžoÙ•íülŠMλ >|ž‚så舟Šìÿ í²ÁG‚üpQÔ#¶$Ø7Ɔ¨ŽÐåœÀ>COk9ÿæÐ {dšíéP¯°Ý}‹îɃ•‡øÂ2ÿ»<9Ÿÿ×ÜsÞFÛ‡õ]õwöGÏ‹4Â|~é)¡©~=AÑXíYˆf'=ˆŒ“X4Ôû6jêL”]>fñt5[1"OPäˆ|F”õ˜@ÉÍ }¯ø¶Ž"0:ŒÃH›üE4)ÈÝæá‘¢½ 8e®jFé±!í\óÓп×”=ÓØi|wu¿º@ù>£Ï‹±Ñë£×|ò-YÏÞã±È>ZŸG÷ÖQ^u5;uT§z¡©®#?Ã^îÙ³tíhe2)a§‘8ä׬ŒD1 é°¹*£y Œ|YïeVãt æ/d©²QÒå×À£ IÊ+¾o­ÊLï}!$meE ¡™–[­,‡\Ql`¬ëÈ»*ZàQˆœi—lì¬øµL±5#‹l¯eÍ„Ü6°²†&Xþ4zÄ-˜Í{ò¥5Rl6ø]>ˆüW ÉÃöd”ù7Ù²€Ä3C'› l†2È›L}As3æ![g‡œ”îÞOOr‚ Kÿ‡Ùˆôè²kwQ”³3§Éä ÀHŽ@Ù ¸HXªÀ¤’÷ìb”£keº½~0?r‹Àe˜Ë¯ûºT¿fæovh%rŸU‘ fd;­4†špµ‰ Pk€%$Í{H¬cóÏ÷äßÜý4ôç ) gP¤ :)E«¦l8Ú/$ÔfЈt#urª/84ØF4q¢tB¤ñ|X~l0y"B†}gvÕð… @UiÒEDÆ‘µ°àÄ/]#Gøwg¹Œ¹¤?ȈéOøièÿSCcè_¨'Òñûèýu†%¡ÿó‹· ÒÀ=‰Ûq—x_[È¿ ¦Ñ|9ó&”iæbqKù2°hŒ®6{°4?ò¼{x UFR´wpï4ºÇKò5po/"@Šòޤja2åxxš"`”ó!±¡&M7éF Æawp’ÜñH±Ùן½}ÖÖä‹7€qè¦B6 3Gív‹ð˜óœƒ`dæá÷‰)Üî9æ0ËÒ“é¢à#t壓PŒ@BÞðqz÷›Kk«ˆFM‡X’ JèÇi š ”µ7ù0©E61å8$ê6iéŠ å”üV¾„…œ}LY¥u.Ì5Ôâ þ2GB–àÂì@:SA©% úƒæqfœ%H¹šr”.°È©„I6§t$OÏ6™Ì¾8àïìûa_²ÉØ7ÂBÒv&YSi!ȸ&Ç%‚EDðvº‰m& ŠÔN´ó渒ů0/þþþè§¡?iHÍZû‰ºJë· ‚ÖÊ@óY_6Ø`ÅM@tÙzø ’0¡ú5Ë­Xí¼©A1Ñö€œÇð¯"{-À€,œM†þê<ŽD„iæ# ¤;aÜ|$±t™®gÍt[Ñ—®Å²£Ù8CÎE ›<$ $ UP$i 59QÅAñˆEþ€& ` áØ5ô u&ð!à¯÷`·€%ì)* SwmQ¯æhüdLÕCls3@è3H±µjÍ ß·(—×FÉ–2Ž,*Ù’Gâ­„MpÁP Ã&Ýx@‚‡TŒ¨a‹Š’€£&À(ÈcD”tñà5 DŠŒ¯|ºŠÍ<=[FDðx*µï-hB.\9oÔ|QDáTÒZ'ü·Éß ùiè?lHÝRfÛ Š õøu +@§óÈG$©Ñ:LPä'ÇÚNJ‘aG?ˆD*i¥CB¶ „¢‚À‘¼!€ žTówаQÅŠbZ™ëá„léa˜1‚"2ØIÞ5'-?é§¡§¡wRºc!¬GÏ$\ÌŒ¸'ï q@ÐÅ:˜GÞxÕSû×Ë0_pKp윀,ÍLº!q0€Iàð†²À’Mn=O%è@ *éŒF¥é#àYFMx½S2Am{ ³>€ƒ‹ŒR ´«ÞCqIØxÌŸ ‚Pº%‘!ž(PÉE‹"„h;¼•ÑyqÔ– å‡êXÖˆyéæÜ—%d9t‡ä JÍd—:|ÍhV;R8õí'©O ˆ¿%h{xŸí` ÙC?$9 ûN€TÈ¢„q·+w˜É ¡-ò†\À^ B ÊH?àôÐHlæB~g#U¦zˆLo2¿“€t”ÌbvÙª6 £¤¹aÁ–î`èD'x @ÒDAš•í#B«¸RV99‡›Ì–E˜ìïÍ÷J‹Þ>kWìhØjæ‡IúIíGæY~ý£„Gl¤*Ã|€” «,ïr*<|B Ìe{ÚÍqÌ6zhßm&K ´kTµmr·ÁA’Ë%Ò~ËzÁª0éàV7}Å=Ð…»ð­!-pxHtd,ÁÓhA2裘b‘Ü£<´ìä´GùbJAÐBꛀ¤Zà;gJêvIàoS‹Öíú!L÷þÁ^‹y\Á¨’^¥70’;#…­}…:t)[ÞÝoVå܇(ªsôÓП7¤(CÔθQyG™ýlRé €4SlñFÇö3jtÅŽÌ„G=ø k÷7EpI“ZÄ츲°•“—¬t×l#vÜÐ:‚öbH&8M­”áw´þÇ¿IÑ¥ðHßò´ý4ôz Š? µXÒ­Úb®?Zk¼2‘,PˆäÒˆ‚mÚÀvÖ)ÉöRT9䮌¬K÷ò(”-˜§2`àCb÷(^¢às‚Ç`ðžî‡f\ûôP¨4ÖÆSr©CyUÆpl™@Œ Ú;|˜PHDÞ°£Oò{p+ÂX-sÙdé 2SƒwF#Ê„ª-t‚3¼ŒP¨"Ðl~Ã(:aC.I‡h?F ¬Ëöcgíž^»ÎŽg_1ˆ) Å.MfA~PLÑÇÄC_@ø{>H? ý4ôñ%!èÙåBîL%ƒ\À÷ۇѲÉT’ˆØˆÏÔæ[†6a/½÷­o›ÙÒ†ëq“akÓ‚‡Š<‘Z“ÆŠÈV}Ö¡ùarUçtØ#ƒvS=ƒ~cñ¸!<@JÁ*3’ $\£` .e"sSz2fYt0‰)¶È¬OGÁPˆŒ8¨m]B9œu…”c3>d“¤ BørÈè½ ‚ƒÄàšž)6þ˜Å‚1lSH•Û]>†RÐïë íp— ÅK±aYáQ•µà¬›~Xnâ °zíN&ab¢[eDχ9žL„Ò)ø¢PÞµ¯8ˆéè´b“Zoð´BeÀ[Àƒ cå9XÝo”ê†[-ÂBÅEi%x„G¸:EF¦ Ù}¸Êo©Dæ >áD8'§À@X)ÓM¥RÏÎÓ!°Z9(ˆ °ïGýÞžà¼asˆTKºË¿ˆ!jlW¢ÐTy³þ»Në˵ø.ýŠ›ö~°õ=ÍæÏ¹ÊoÌ›ÿþþè§¡?iHÝ¢AŧuTå»Súú.ϨÓMßÑQèú˜Hf’‚v ¬£œ¿Ú&œMÞ9&û CF’ÀA²2³6tVó„F¨gC… ´Þ"%™nµóÛ¦¥²Ü(m…žöuŒ(w;M½>`5òUGû§¡kyb%¼lè^Æõë†ìÃ4q†ÚÕSÚå¹StçÅp7ˆKš£'ÌJ¯"y3©BFï@h£€{•ÿˆ»•™ Bºñ4ÄldD=RÏN‘‹Í;èÌ‚rvQ¡'DUÑ!€(oU@`Ñ!éØö­s•绀d%7RÞ´`¦ÌÔJÙÒê¹¢ÔÞj»2}Ò".ô Ò—oÕÄÁõä——[t‡p¿ÁµûVÇ辡ßHa>vSø:0¥UæO±Ç™>3TyÜZ$ìñ·pN½Ñk63~ÄÔCDÒÕ(²ªaì0ŠÛeºs Ì] X”IŒRÐMÑ„Öu‘•ÁíX… F^À[iFrÇÔå·¬F¾êhÿ4ôö2QŽÒ—ìXî²Z/ôØõñëk+Äþúü$ÿÆA¸ó¯!ñ_ÆlìeÀ‡—Cayüü_H„$C¢ŒŸlª2؀őd-e,dZïV1àSÁbb0”aiòi+xç‚Ïnå1¢G‘ñ£"Ÿ ›î­W%_v„GU^6M~!#Ç‚êr#+ÒmKÖ”ì‘y¿ÏÜ^àð}Æ™CTô_D8éà»À‡(‡eƒ=E@˜±åíQ>ù|cvhéòiQMË¢¡ê†):ŠØ ’ó5Žà‘ D˜DRÄQàUm#‡ºûIFsVl €´r¶íÐÆÏ Ü‡Å † Y@#£7•¤Á¢òÍ Öú9æåOÍF½p±»WéåuùH{а„$ÙE §ˆN :C IïµAÎÈ#Ôå0d«§ró‡¥Ag鑴Ƀ,7lvÝ`¥ïôpTrX\âX ìÓæ ””#¬ÁY“³åY0ìa/â)4°“ ñÔ~ â6õ@¶?ùV• ˜G€C‚ä’g É4¹~å¢I{j©ËE€¶µrw¹Ñ‡côEËOC? }¯†îÅgñáñëÉOÓØS[r%߆¶¦ð†™ùE»sÔŸëÑ"ÇHÑîз åÇB€4%C£Ÿ”¤²5TBBY(eJ05„wµÙŒŒå,3k÷0ÃdÅp¦Im9c XœþHCC÷Š÷—œ{êV/³Æ%tš^_pCšîª Ñ#G_ú1K¹Æ16ù›M“«¯±¹ZqùxHrœÝ§eðØe(ÙJ€‹UµQ‘yëNPïUÐQß Ž:ÁPYyË»àŒ=Ëê·ÉmU^sP–Æð‡` ˆ’2&ØÒæúÑw%·T n@tÙ3 ÐÀ‚23JË<Ý:#• á²IgÍ7Kœä¾‚ó™Ü¸‰º9-°að‡¤Á2™À°$n#ÎØ1dÎxQï'$>R4(µÂY;dC`r‚l·Ü”»Ü•^òÓ7«äåè­ ó2¸N8Åý¬g%‡$g âä—Æíûk€„°XƒS‘%í\€€ ÝBñ²ƒëîd·ìÆœüã„ýcZr°²Ed-¹Áž†Hd•Óé&l­f-YsH±y^—Ø~ÙÙ!çxç ²F…lª%X£]zYy»/@h‹Vð×!£K$(ëŽ@C5ºXÈœ®ôðýF¡? 4v~tãÜr“NR 7ês&‰.®´¥]ÑÌ>0z¤iÖ #aÈ@ñ¡á\òË$h'Œ)¾rŒ¾fùF jzök¸¬¯mÑ+ûQfúÆ ©Ó7vÕ燧uX©¹½È_q£K"[ Ö’¦äSHyÀdÛx‡ðÈ ×tYDB;;ÈCr£Š­Î´šôx„v&Ý0G‰ñà-Zƒ>ÕS ËÀ@—x}QL„Òo>gÍïY•O¿áiûhèÝÛÝeÈè%v3ž¿4‹|Q ò¬¦80LiÖŒ¡6ËÐn ›.WÜF\›@°‹µ ð„\ êȧ¤,I/ºÄªkªæ†õÚ6Ë!zCV¬í($@– ¨H ŒÈcç‹aRÚ6‚¡0Ï!‰"ª\|½÷=Ú? ]Ë3@š«zFLçǯhÑÝŠÑè« ÅN‰jb!…Âyª A]¨³ŒÞ“ðïÀB¡Æá iŒÜ…c)¬Â;ÈM- „Ui%µÜµ€¡ÆWžPù0Ë ç_„„Šü >Dô“åœ3"D‘1£Äˆ‘ã" “@¡*î²ò<¤ÿ>xÚ`åJ’—GÅtRÖ0÷†u*¬ÃAA?‰æšŒ8I@'µ0O–j­G‹TʽÉëšì_à >NÛ«"È ‚ÉÄ1™<Á&;ã=ò·ò㙯ãS–©µ¦¹*BŸ"€ggâL†ð-ʳƒ¿È´Ú eó¼ˆg…[îV [–­5ÍÖ]ÕXu9()¨©ù’e¤¶«z›Hgs÷/¸Ã²r”,e98`äTpa£'+¸;,É´DËÊfÈ 4ªÈ¨5gvN›Å%•LoÁQ2«1P%Ü¢3 ç8¿d «'ø°•:M¬÷à'Bp Â<¬u¤ì›Çñ~ÓÞã$§½ò¹è˜÷~CŸ\>Ûz%Öô+$?¬FV ÉÞœ×öi(2Rk#Õ†*¶m$á „"ÉGi¸‹(¶¨© °Sgrãß¡¥­ib‹±#PByÿUyþ?¹ƒl˜tjtΉçÔM¡¸ C,%”×DVÏò“¯:ÚÿlC£òýQïΜ»¹Îo4ô\3ööòê{j¾å§ ú:À“0/l;íPWÜ`:oÁßϬ ¤£$5‡ˬX”ùt¡…æ&ÁÊDºÉuQÈ –hd äfl‡š:ÁÑ‚?XŽ¹Ž Ðóz(†ŒÆ÷@j/ÒZû„H–ŒêQ—ïf¨È3X4”›Û-²¬­ ÀD‡ðo˜tlÌ Â×Ö"ò¹Öj µ dÒµ€xT•JÀs¦çº-[öuFðeXF¦L`Q›¦Š–Zµö›Nñ#ÄrŒBI7oçæÁ±†……Õ$½Y=4Q~ïí —ùŒ@]OF6´ ]ÝŒ’=1ÊLÔçAy\wøšÜ契wjNBâFšA¢]@HFø[ºT$ƒ¦BØ$ò?FÿL#G}(¸–PG'¯×Š*«T¨X‚@(Q¥ÉHÚ‰˜ ™¸"Íø–zTAŒÆ£!ëdI]‡ßD úŽ&hCq¨”l1 U³—ÁÓr£õ Çhó\5¹›»s¤3y$kÁƒödŒS^$m`*†[ððïNn_*èÈÖñ3r•‚92}ëQv6t€¬ €ü‘F|³k”Iк™åâ9=-¬æx¿F£¸±êŒ eH-xÙiD• ‰I©¥ƒÉÀî7½4ŸBTð«;KiÙXÈ¥ãz<Š ó€H, ”ì4´‘kÄTq›g¯õþ–…# Nv¦°«ôJhTTæÉVNú\®Yͨ;‰,Éý•˜æËßß±ý4ôŸ5tqÚn -uúOdÅÞÛ¢7|’¿¡ßZ.¤ø @r7x„O˜drni"M€Ä„øsȉùG8t°ÓN$m|¡6­HÀHÚÕäm?ÛzÚÏ3©JŽˆÊK?’=’¿ø¤…7ú?é6£FjVÐïà¬+GÊ1ë“•ÊÒˆ‰¤_”°þ%éeÄè.@ý½ÍžišNytfŸ ]E¦#Qg$ pk´’é8ýžÜü¾˜Á´ûÚiȰьµUSKÓêÐVœy²Æ.³ÔŠúˆþŒòDû Ûl'~ÙGPH0Ð=åUQ|ÖNVÑx¹_çÔSH™j¯ƒ¶íe:Ñ˦ʖ9ÌMMËGÚŽn:ñÍá~µ#¯iá›R©Ù!€ÏÜt§€#„"¥ARûQ*`*’†¨Ÿ&¾¸æÏ(L‡6’€¡ƒEÿÀa¤‚*6È:{xÌ @B»¹ sþpr¯órÓ¸ýCŽPœÜ€›¤'Ðó:6yu¢P$ÏÒÛ+×þ˜I)~ÜÜ`UVLnãpJ »ò…%…%ÅÔ˜Cw®Dö uÚF€ää¨j‡’=逳iöˆºxè9Tj ‹&3ÉB:â¹:K©ò!|µ!HÚzVÎßÉÑæî2x½xgj\·ç ¹"zü´S/F!sY#¢ôüÎËßбý4ôº—9¾ÛЗ¤Øôdz@¨â^Óú‰†>µ(ušÔ.ÓÚg€´HÜçÈÝ´·—9ÉeV{%×ny8=ÉJn*%ifc¯¬m;&å¨ÛM1÷¶” ‘ãd¸Ž°“¼¢‘LãÄØ4ñƒBˆ!iO5 /!ÊÄŽu!Á2Y0Ù_0zw,hd|C|Wh ‹z¿ÎN µ“ÔÉ”m…å=M|!S´C-›k¢í]` @‘5‘HsbËM—íR*x·,Œó¡»ÿDoV©é€ôÓÐ×7dq¸]u)6ûhôÖÙ3¹S~y¿ÛÐ'—$І­ÈŠ#=–ùÏô›büH3¡ö¼ÒQÐü`$y*lkþÍî˜hˆ…ÿj"¨¸‰=:§ÂýH•,¥”àW˜Iè_Òà>Ê/n&)SINµòƒN]á`!ªAIæ¡BúI»ÒPÙ~µŠñOö¿Ù%õ*Ühn:‘Ù©±x@•³pØä|YN4ªžš7Eþœ@QÉœÌòV’ME×BÛz? à8ú…5‘-ŸÌÐË 9",*„.…»§¹(žõv?O›i®…uÊ©e=àSzb$ÕŠºøF‘D¦;³ûqÍg6¯ÌÇh®(ïã=¤4Õ ™6Ó+’ JÚß \Ô ¨æMÐP5J¢F”{ÄøŽÈ‘||nÓÀ¶†ÃDÄB+ #†„ÈÖ¸vÖ.lßi)¯j³Hø}¨GœíEO;µòµ‰‚ÿ¤wàml}`<Ð@7ÚcU!C4î­,¤×Bà-†t<à݆ ÎvTNRa²â¯|Ê@)9 S ’Þ ýKã¿Sn:ÌTÚŠÛ.qnwÞ‰¯ÃÞAÒköjîÊþ*åÿºCÏ/–¿³cûiè?kh\MUFÆèˆ€¸Vþñ{ÈŸ?ÝÐ'— iÚëKo¶Ë|äfs«ÎF®|Ü *™YÀ4Næ|ojR>“ºÕRZ:EûE·Ctx©ãê¶Æ ]¢_ &›xôd%˜µ»QÿÏd‘aŸäGQhe&{P#Ñ}µ[™ÿ*3Ìz¨,ÅSeäîÞxeçÖÒú*³={¶Ç^ËMs½º>~6ôb­ÓvþŠŒ~”—^ŠâØIfËx­n4fu”¡¶Œ8"RSRÃI»¨›)tz?²°ÎB¦ ì`«s;¸wÝmY ì‡1}bv Õ!ù[ÀGy-õ«ufÕ®Û3ã§Þt‡úÞŸ¨ÚKÂñ ‰)Sºh?Ók—3ÈE!"Ÿ{£4³hyRŸâ(—“]#ø©ØN§Zv& H‚(ê×íkqëŽÜ£ƒ"ع1ì]žÀ'Dà>$‡Ô#׬ÀN5’´ÝõÖþ‡µëA—ÜV¸I¹«KxL],µr8´3€º“_Ð@U™Î±Ò¡’Nuƒr˜¼ÏžÃ;Øž&ÿy¨oÚQ´ï o홃ë‚zÁôc`Åí<¤½PzŽ˜ =oí¡»’0i 6wÉû¦é‰K¬wß! ‡™Y&@ò‚ªrH e|™®‹w=-Í[zÐ4ôðˆKÏ@:¤À ‹b²Š¼é#eJ0oÉiEÊH‹Í"UÁŠ ¬î«Ò!B"¡A$úQŠÙæÎÄYÿ}cˆkù_!úN ½&6ªŠWê`üæ§_h¼\d·GÅ1;¿–ø5 ƒ|ê¤kOrw–XCGxZ—‘<¥Ë;Üœ] u¶:Oš3L_{«+ƒ¥xg×=WKüÖòODÎ:µÛš^M¹-‹ÚûçoÉžeþÉÉÞÒ€Hð¦nþ‚HIûƒ´€›”«ÎÎÝgyœhÊr;s(™"%CNû ø«T—Œ(z‘óÞQGìÁëFài‚#wzµuÎ/&}⥅.âÃ3iß‚”ëô>à7û{\Fõ Hl_F±ô|b¡ý’T!ïœBšC!* ÷ sL¾V¤¥çÿ§u§›Áð{°jÙ‘e›³ º¥#93±WX+$´Oõ¢OÇa¨!+Â2YÙ Žð‘g€ô’ãü²$ìVTß_H|‚GÛI/Úˆu‚¢ol=éJ÷¸G}Ç4ãEq†¤ÒÜÅ@êQ‘]›Æi#S˜ÎýÇ.kºƒÀ5DC[VÓ2²f­Qã±É¿Í)–ø'èa×T¾]娂¬d[B`(P˜[­òé$_N%瘶ìåôt„=rS9 8*Ù§„H,ëo;(/Bl³£RMóFò ¿"VŠ9„´‰ ÔF· €ùÑL+·B‚Ù’4ò>;úˆöÈOl¬ËÒÆnük[ïHì|øÙâŽ36Ó.2ø’©ŒTüH;kN¶Q¾ã([YC‚7òâ _ŠTB/+òv…ÔQbÕ*¶Ô!$E¶QŒ€EÍ‚Y+Š?‚ü‚ÎFÃ9N)Gk H ¨Å§O+ü8òˆ\‘[½±ÄÆ@ÕöG¹ý*îµ0ïïð']ö÷jú[ṟþÂ'ï|}}%8¬Ž ¥{ð”‘;\î7èÖ!'Ý™NŽ;5g™ªAœ¤æ·A u4ï“öÏA^fnÂùiþÐ+¥PæÀ7”y>)y_¾ ­Ú '8Ê$m¾ÎJºª0ÒEWºt%íS‰ÜK€ôøŠSî™õt!¨Ëü”êîŒÕD"JÜ^Qs©ñ#†êûZ:î@á¤DÒ@"3 rK£Ä¤í iyÍ4t‘ â”3^äOiîWô°¤ñ> ¦éŒ"MÝê4aì<Ë Õ#Óº…ÞÌ×Vô¨°‘nuá ž"㑞´¡‚ê ×YR½2Ü0i’¾HCz2·v©sdí¥³ <©Úˆ`zše 32CÓyCcÖ…Ž“tÑ£ !RRgì(ð…ö"õ`zž×G©¢í m'F±fÛÕ™ä[ˆ&Ÿ9¹µ åÊÜòÌÈÑR ö$RÛ\?¶ò;þk¥) AÈC`R‘cyl†Åý7Q€VÍOä…yÈzÈî;Hid)eõ,úoÕÒ?ÄHOÞq•kÂËù2Cˆï‹U‚ˆ´<Õi8yÕ`Üa pAðL˜zV: WöÎô[†®#Š6¹ªx…€USd î`œf¾à !ü#}¹E…¢lœ]—†TAw´$X›4úª ¬ƒ[`ª» :Ú!ôÙ‘£â–†ulÞh{ãØ"he ÓàBßé—éå‡óØN™MN]Ü“‰…€†¢¼§´ ¨LnUøS†‘¿4ªmGŠ¥±HÃG†a—cý/E^>××þ4ôÓЗ6ôÈÓwŠŒä¬Ÿ•È#Íñ qßÇÅè±7—˜c†­N–1ƒ3 ¹S -’d¶dÞ'Š$7·ÜSU! m ÃÌŽf QÝ\,rq§_³¾çÝ 9€?¤Â†òÅ»-@Ê3Št¥Ô@Êìc_O¹]…ÿsU÷’6÷,­´ÂMþÔƒ/ñà•†ë£‰Pdâóc’6ÏâAääÎô™‡Ôª!#8C(j§ï.–„ª™#O]v¼(ò²Ïާôbvód£2=9: 5÷ ð,—uc1d¨wzrÀô¢(DÓšcü -±8>å†&Ò$ó$$×ø-«b9¨‘Øz ½›b{ =KÝ¿ºøH~×[d×FÀgD‚ òm›òÃ.ÒÆßˆÛùG)7ÑÖ€IÔl9”H:⯀ T°,µF¶ ‹:ð¢ŸZ` i԰Ť»)Ý¢½ Lê27Ë6Bédbo‚h®*0i/­2e•¡ ßK[ŒÁÓ•T.¨IW… 3:¬ÆÈ(Ù¨dh¼aƬ³&ÏÊHBHWÅ‘ò¦LR‘F8Á£ÈSn¿B“EPŃ]Ïom²q;䩵„†Ì´\†r{ üfÒzŽê‡µ>PgÑ£:ÞWqn¨ ¬™ß=udÆâ°¡K=ìôsÝ¥‹ô@8jA®1l‚›2fE¦»GØ”œq8·:Úª «Ž}ì¦+8·Êý5KûWíÂk¥žúY*ì'ÅöÓÐ7ièEØóïsã- ȃ™1,› Œ[Ì̳ÊêÉþ½D™¦á¯—G½Ø4SäÞ“ÙGLC]ˆ7c¦×Õ…¯r¯%FbݶJ†Fãç#@9p„e×¶§¢Í?>F¸@BP}A¤tB¥ô@zÁNºR¾ÑšÂ ‹®ÐsþöÞsóQÝàÚ|~A_œ$&Û:5K©9ŒXÊÐ ` ÏÎ >éJX3O™Loؼ5 ·*OÈæeÓHF@¤;Ãù,„ 5ï¦ ù$| ­´ñÜ[9»ãª¨LòÂqró´Ï;9ÿ°”3HvlÅÎØ8oÝê"i¶Áf "`XóŒ,ax;lîP,´qd]hR!¾(§«ò"îÕ×üiTÙ÷2ZÝC†,#3çK#tI3Þã5X®ÀÏ`ú R#& HR Í+>ð ^“¡~eQo™=GžßOï0~´55ÛHñB &Ý¡QœêH~½‡cdP¡&h#@Z!)OsøoܤL’cHk úG…›HRU̺m­ jB•ÚÁ8^aÝB  Õ5òå˜B^` nÍMR͇À\W’$™ÊÙVå2ðÆA;I4!TŠ«œ7àÜÀô=E¹Š”hˆ ¹‘tE¬ˆat[3îû;¤Ð¬ÉrAC?`'}ÉëÝ÷•Qã`÷£•‘îÂÓ†L¾x>ÈH’ë ¡&È¡+zø0Tp/÷Ô”¢AòÂ!s×Ä„™–7 õª3|g‘JK†A¡ Y‚ª¬«CÊy”ù{0œ ³²ç,S Ìê ŒâCŠû¥X¬‹Õ¡Ÿ†¾iC†D¡•Ì †ëA~REÒšž%„, "ðµê`—ãåÅ´'Cª%ú„ZP÷¶,(¨`jæ`þ˜»ÜÉó¾rä-™Š¤‡Þ¬tÌ„ ›6¢Û=ŠG{`“c™#¨'8Ñ£º5bª‚1XWeDøç~«äµcôG‹¤J€”OHt­éÕõŽjn±$u =-Ó7•$ýÑ}‡EéáG稿ýÌŠZu#º¤oÜðñÊøI­( ­¥(ÃC` ݰÇM¬Ü*ŒLU¾_H`‰8&ÚPGÈR͆„V‘‰ä -è ²·ÍXÊ+E:«|¬¡Ópö¦ëòyP(JÚG½¥¼"ôÝ4«z07È”Xdß÷å`¿05Ò”5`ÌH£¾íËÉõW£×d‹¤}¦zƺêÒ%Úµb®ÐÏ=gØçI׳Å7 9¿:€À÷¼" ª$§WbÀ•dóÜwË„¤fÜ* kù¬!µh—Ó"Ã|GÓ !ëæQ&+tÄw$Me««}0û*ÀaD o¢LxàƒÒ‡NêB q+¨ÊnT®—KTGD¼¶¼F+0ŽÂH÷U0ÒcÌF$¹Ýê3íXºØÊÇàUO¿×Á‚s=>•€[HÓ!°$_ÁcGfu¤öP£uÛ^7\\3»ºL‰FjûËôˆ.E(Ǩ·Fþ*…Y“Ôŵ3)ññá{? ý4ÄÅ=èK4Lð‘=¡ß%pFšŸ*W½<’銓1Hn´ØX²ŒQLÃGG2݆àšÜárÃVŒ92±3ÒCÉŒ&P.šcí¡~wš³œœì2›‡¢-¢NÀ?y~.QÕÙ°8*¡u²íaVñӣؗ£Ï4¤¦§åB)e:\懨ÒK€´€ÊßQ'ì_¼KšAÄÆë •É ½~2/€t½]^¶>Öéü¡™õÉóSVQ\ŠuØx²Žá¦i©3ܧÓF-J`Ío:¦çêX´ô²¾pÖ( 8fë:«æ†šb᧺Ùx]f„†¦ÜåÔ:P«,onräNfNÎôÖ”¡n2=0!¤¬s(‰BÔµ9(2÷¨X>”¨AÒ,'kÓ¬ìž-c¸›Zí ¿ ;³¦ÎêöU:OD±ˆçûãÝ…#ˆlÇd,i5+áé§øARö3'[½Y…ÿl3r×I*ógÛHf;ÔÔ_Ç`ÁÃ;HºV 댴T¹â[hhz¬mF÷6T. ŒX¶‡c üìƒ KÄšÌæåÉÙjá!ùë Q²KøwêÇÃm ³³½™§eAØ‘ y#»¦’3È0ŽÒ ¹Z›‚\@“î)5ÙrÜ·³®5ÊÅ"°)Qlþ‹ÕM2¹%7­´Sã:,€´!ïDqH?“nÍãw_lr,r‡½+”À³Lû+Ÿ’>PÉ“C~ÙÉf:’%r€uƒÂ$JS„i„†˜ÿƒ[mâÜZôJPÜlÑñ‚€=PãCÃОönÔûFßàd‡6x™È½ =GeXÔÕq6»Š"V©¼®‚¯¡7Ô‰že‚¿Á¬ö§¡Ÿ†°LoL¹*wf6ÜlN=•‰m”HG,¸8ù7dÙ‚ëêÐ@ŒL?àˆi§k²˜äPÈ,7g'$’žIðèÙA†¡uÚ‚x—J UyÐD°DFPE %„i¶¼‡â1g´,LŠç=f'[EÖÕË`©Ì61“;wðÑ.O©Ì ×a90Ð3@ò£7æ¸~£] _¿˜ß 鞇ÜìU~þ‘Ô ŒÖ‡.ˆ4Ö:©ãÙéG€"à µ¨“e^¸ niys>½ÀÓP¥<8ENθ‘–ÚŽ4E„te§¢¥'ÜÙá°ë-lWh•náŸ2dœ('īձIøÔ©äšâðT¥ÇnÄÕ~ª Er¨‘)ÃØ¸—™Š- È›¥MHCi8Ø+,…ÜÈóÌÚ«pJó,nͪÊZ(b¼ë&‘º©½²+…õR†ñ×ëÄ?êEnîNzfY_©¥Š4àц[#z»×Ö=B¤•x;jùY7E±áŒ‹p‘EC‘ÇÝÓ|¶gþH9ð6ÏKf)ÉÙB̨÷$ ÆÊ9Œ­È%ÞjVp[«ÚÙ(èçI6¥gpk"@Ÿ‹´£º(›æ AÎ_N’"9iNQ|RzªlÃæ5¯m&Ù#Øq”œE”þ#|IíDD\ŠŽ])”µbáØDŽ—d¦_*^ÙIØAÔ÷°‘æâ++*,Î|Üb]eÔê3J$÷€lGfÜ(ð/ç¨ ô"T’ Ç×6Ùïòÿp. °†5¬ ƒŒ¸QE¦CœËÀqº±~£°Š¡°çʘ}ÀaÚOêè¨d^¤Wª¿óùÓÐÿ󆪯B›ÜK˜– F¹qôdË rVqLý9‹X6eÞ`eï²°QËLÅAQSé=‚ô@Jà‘“[ÍLòo”Þé¸ò¢CÌÄ@’C´t°ˆFÇWùÄËêµ¥ÆY‡-¨b{Ô=ú ÷µ·Ñ-vFdê#˜aÝáX@Ò½y–ñ£33¶Ô#øy¹Ös]¢õÓ?­^ýJ9ã[÷çc}ÌÜ¥ÝÔä/—‡”ßPfªÞKáû|>õNËïQCâûZo sþîùµ¥1~ÈŠš :”ÉL]ÍbœF“2'cz*¨ëÞ™m9dôC¦ n^ûˆBÈ ;ÂBîqU7T³°Íe]6ø5jØa醉6@@žÙ¶çüÓ#‹9>”|%Ê2ކüÚ"wŽ_V ÜØwB¸ø€tò\×6±: —ˉm¥ÎÒÊ òã‹<4ä—ôdˆËOmûV¶¤ˆ(Gi¶›9±_B¥þwòJ2 9¦+ãæEiÚ^NÆøªaô¿aêJ?ÓU´{ƒî#XØ7Êå(M Bj JÙ®êRùº.Äj°m'3Ä2‚0(^ðT}‹]·¦¨€Ò,p×Ù#Ar¢\Ìú1Ú§Ñdcà{ÒÄCž÷;ÂEQ1•esëbMCšQÐ4‡"¥QC¶y¨@œ†×-1W‡¤6@ÉæU]RvA•N@)ÄÊú4 ô3+öf<ç{l¿·¼Ð¯ù¢å§¡‡åÑBáÔ?¿^¸+ÕýöØýç»6Uön äºAFåD#iLPb¢Ó¡A-˜FÜjÐJ`òEiä¹5ê&'ûÖ–Œ_ÛøïÈ’è K_?(¬qÊPƒ™ÚrP Ày4U˜˜îò}‡X44+›€ˆ¢>ú¬šO'}h®/Ò…n–Èáõx¡‰µ†“X”ÕYÿ ú+I¬«bþú?¢)j ×\JBc.€”ö«zl5fy‘ëÃÎR²ë ×ãUh¶jîôLöù)Û7§ÔÉ´:u=>ÆŒØFËùA;ãq~ëòo °QeIðNWEØÓ)“˜¢rv#8‚)m•³ˆ:«Ö#­ÖJ ¨Ù—¯Uh>Ê_ò2%ÝKc ÅW^!Òù@xÁä†:ûâøšcQ­f¢ÍGP•¡Ø¹ÓÈ¥¡âM `÷Í•.ØlgPE› }v ]öùH´X³?b¹cz0;Â1–*ÙŠÄ• ùh`ˆZwÊe P{:×ëé]/Sq±ÐÇ>êÄA‚‚”À Ì"25,¦ïTÊÒ9f°¦™‹ * SñFAjp œ™éO]Íì=¤éè3=HB…Ú­Ã.ñµPÏ?ÚEþ4ôÿ¢¡ Ý3°æ¥ƒÞ¿¶EÏË Á¨eG3M* wl(ò+“(Ïœô*CÙ˜ŠD4©ö渑µíÖ¡¬µË¿5"ÔkeF%ŽMndmJ죤ƒ•”Œ½dÆ4dkKÏY:q¯¦7(€mH¹I—³…>YÙrMÝü¨”Ö°B7”1Æ"9gu[P—ox €Ônðc$p9 :ß¿@J¹•[*ìE<¤~®ÛÓÚÖM½ø@›dŸÛÚo[\§¸]™ðh#¬«c‹ƒ_—vÁÅ1OÌÇ1 8qÕ㮵±EéŒ^ñ& ÔhüÀá¡à!ÑKÿz™ñ˰Uè mRºV=0Yæ'yh;åŸé1åVåáÕÕ¡·ÀÑ=[ÏLÙµ.^Ò€HEͤ”Iù(?ý€›ÔnM¨ÐÔÜ•‹ÿ4ׯó8ÃOáD=W‚+™I*·ŠGÃͦVc׿/À¸˜Ô ‘2DÄü’’Ç0?±Ó&·L\3ÈBcIÄ£CB¬á§*æ.¯ãädƒ<ΊÌA4"›Èr-îMˆAÓ1¶Ú ¹ÖFQzD¤­ô/¨ÓoJ^î@Pºœ„Ò-°AÍ©òú!ïdÆ‹°Ö ­¿Q®ÊB¨¼oÈ„r6Ë{›SÀ©µDHÖ¸QäúðpÙ9Y!V4åò£MÁLp Êœüír¯€„øR}ÇDiæÇ"\;PG& ¨Ð¯Ã’+¤•ß'OºÒ èBoÑ‘mÖ´¶\™tÅf7A€Ž¡x«¥µô«‘Å6}MU÷ì„oØ×þ4ôz620ÏÖ»’Ï¿²EÏËÍØZ3Âzé4áeB‚|W“Áe3´&¥Ü)$Y!wcòteª3¸élã»4´ñ®Ghd}(F4Õ®Œp{éÔŠŒFâÞ‘‰€I«x„!œä#j,À><¤³C)œ‹•¶˜Oì,ÿ¦Ê6ȼ ’èüe<† Ò-_›bÛàÈxÆhÓlýim·GW¶¬ªû“‡Ë#,Úä?&)YÓå`¬f¬j}à\7–Ý ¦Ã-b|ýàv³™sû'ÓyÅsÔú…ùáë C;°‘­Isˆ\“ rfàÄIÔ#ç—KåœÊ…j½Â6\6%ÊeÓ¡ˆÒ¢–iqPŠºÐ™#2"Ѷ®˜ØÚýe1©¯ˆI|Dg&j®/Ò• »*Õ†èó•\ 3Ürãã¨Û6, r5˜o¡žû6á}Fx6”¾Cc:)ÒįhY¡%æ£Ü-N´Šãôm PøŠU|ÙM¼µ—»£¯´š¹²eòùʵ ¶Poªe£î\â:çâ&`Té$âIõ2¬ÕÇ9s=AÀ±y%§t—ž¨R £½âEÙE›t è¢üER¥Ù‹—^%±6˜‡†ÀÎd+{²–Œ2«Õ² ’mó|C”­H# ÚF$ w7¹§* Jp ße¦xô0.HeÔˆEéëb¡4Ÿð›t›cÝÉÆ”Ž¡!~62¤EûÌŠU†ƒCBÒסɭhÙzL$äåFœÂA~ZY¸Å¢„þ˜ë> Ëìð©¬%‹Ôù&bg_NÂR§^µ™vöwy"óqÃÊoØ×~ú›×Ð }Úü ¶è¶!¯ïºvfhÞû†ô?¶E÷Å ± pŠäöã-éBÙPn\Ô¯Z20ã©p;”é¡“)Í!Óy$±‚î§LµeþŽ4ÖQµjƒ’Þ"­È{DF’öŒ™^dä22lªý£Ú6!æ­"*W dÑäX!OÏt8¤£N´:b)¥<}Šb#ãJNÿýéÙšÅS×:ðÄÁ(Ɉ"½µŽ@Ë|¦ã@3ä³?B“óÇè½MF¨'s¬\Ô éÈ_Pí^=åììlÄOgíÕÔEO>+Ê#¤OðƒO%è´æ®¤X $XWFH í¤™™ÿ£ŽÞ+c[†6†jo,©wüDF#& â0ÌàÐÔ KeZAœ›ÑCâê¢ =&¼>AŠû%:ÒÛ°pŸTäÁ™™±«bíÎb~nú.%4R` BÇM þ°[P”pcø’˜¹÷†ÔCnÉ1àTy|ú”¥̉áèãù Ö\‘¤·ìlÈN!‚¶…r6¢žÉ\ržH皈a¨ 0MÞmQ]Ω%#ÞÉ×±D¹½E‘h½ 0ò­°TÎËsͪ|;E‹¼ôH©éIÐw˜œ)ílá±ÁÒvEî2(Ø•˜!$rrD+Eµ~½USne#9 01×ÉÚ¯ÔßÞ”lZ¬‚œ"4¨¡Â˜"*eMò¢ïXN² •cCch8’uþ„y1dÆ’ôe†Eó‰…/û`ѹ>ñ~rBuU]؃¡LMÝ41t+ì?dæW7_µgÇì©ïkõ«r¹w¼[¢ãüûÿ2‚t…Ï¢ ,ßa‹þ²ÚL[L,'_öP—êó—9ÕfñzS¦X½än¬Ld'0ª¥ã¶ìÄQŽJ™ÚANÆÁ;BFÊCnY;K†`$­A)®†!0odŽURŠ•YñmˆjÄ„¶ŒUæH R µÚdŠvD̼B ç5ŒzœÌ}:ô@¨ˆ&pÉúSsŒ¿‹ìû|<<-4ÅZÏ~à^Gj¦‹Æ²”tõdÓ˜ ¶ây„Gy…†Ô-FôˆôÙÜB<–I³'ˆ‰êz8×@NÏbr^Xj51PP"þ)3¶O€´<ð/t}®#…¦1yö©eH>`,ª2E>zèùÑG! ­¸_~Ê%c`íg¢fŒã¯e¼¨×Ø=Gô5Q¤âiþf_Æw½Â•JZ€dIöÜÖ×9H××Ã$ñdºdôÉ ±šc$ ‡â3K¸q£{*íjËGd…¡´4 Õh„gÂ–Õ xÔiÞÖÉ.‡„Pçö8:s&½èw;bFÄY¨ ïoŠ›jב¼"I<ÌÇÔ]²Wxjò;r‚k ÒW‚¼êž1¼Î":@DOšB“šÛ`åÕ@»´Î¸ž$´u¸®hyP&VöªUur]À6­Êìˆ 0Ú ‹¡h‚”Žòz$ƒ?ÒÊÔ&ù3äãž;¤'çù_ô=/+æo×Ô«_ùøÛ£Õ7ìk?ýÍkÇáàx|ƒ-úlè‘u~¿Ú¡Lo1,¿ “¾‚ƒĪ cM¾áì&pºQx!]#JõR÷0gLП)4«FC™Îæ²E;+ê­ ¥=†P=,~ö˜aQ(¶ÄD›ŒY©!\ T]¥W”>(!W~Æ#{$­›ü¦@™ÀNí›t›¡ó8¬—ã7–x–ø_¥§ßñ:É?ÀwyÌ=•5óUw6 ÒL„]™± Í/]Ñ¢0ñÎ ñLø'¶Ïäü×+ëjhëÔø¬ÍW¡à² ×qVÞ€f:ØÃ‚*r¦£ ]&æ°lò$é’d실J| ³ !1¥Í\ Wµtq&Úϱ{?ùÔf¿lZãÊýLäVjkÔŒyŠ º‰` z¥ÙìÄU+åö˜öú@ò7h´HB(îw€tÜ ^sà >OÑÙµ0cŸQšûï>ü6ƒ>Ç-b8è(Ó½«ÛA+s äòD8ÞŽ23däS!þ¶Ó·±©„Œõ¾åF9œ¹åÂúy°·©Fy¥Õv¤f®L°—s©á½Ž<”úÔ\-MV’\*–¯<Á µ“O½Ñ ÍW×2Õ‰}Ñ|I ÂBrµ>´bóÁx ÑNqÙF€äé ²OG$”:E°£–.Æ*Ö€e:mt9¦),\œ…çÌ:±Áî©ÙðGÀòލc—ØŠ•sq ¬&?;“…½XI¦¼êáFŠKS Ò±~ç~PQLHG*]ìÎJ—‹cצ²b:Ðk‹»§À†Ÿ³%viž¸[¦lü»"NO=Ûý%sû`xÄþߤk¡õ·Ú¢ÿ™†Æ•Ô8°ój#b÷Tüõ2c“昑×mÆ¿t‹ž™³pãAä8P" qßAºª2Î 4â8<øµƒI4TT£”ƒ;`þ¡,&Dˆƒ¾dÃAuWC«ˆšÅ´sFµ'¤ÖJqIFÌ„žq/àQ"7sHÇâ´ómà‘Yè²Z7Ôj „›hÁ4¼×ð‡™hÇ•ý%5ƒ;nB$Ï ,Ï(’)¶ç¼Ø‰‚Dz¢HÒÀŽZÉ®2QaÑD;;<ÚÓºH×mÁœ«P~ØnÈi°î˜‹'¯ä¼š'F‡²Àà*@ä f^C«r¬ÏA9‡²™à1êFì=ƒDú,ÂñÖ (r7 Ácjñ0:2Ê»FxŸuWxó9¡•ŸHÑï¦ØÜžaµ;Ø4qF²Ã>•ˆ´+#ö<¢øö¾ÒZ«äëdù¸³<çJxTçî¹Õ‹ì\˜ÌòL\!]ûÎr{¼ù'lõ4›ªVª0Žr8ن´2Rƒ4Ôç1Øs¢‰µ-t¿ƒÐ [³Máy’Y›žZ&“ÚA&Ÿ S°Åä=ÔàÃ7 %òÝ,—4êÅ|é%í­X×*ó«’å‘̯ð¢¼UYhæi“ÖÈ»hþ©‚‡,×_ÍnÆy¢Ĩ¹zËKKåKô´ËpjÌ~EéžÁL¨ÁO5¢¬Ê*zYåÊq!ô_rÎdOÓ”50Uœ)9 × é»äÆÙ8®mgµA‚€…³Š¹GˆŸjNðžýÞZVæl<¶ŸGÜboï\_Ö·÷Ÿ’}€GþöÕð;£Ò7ìkÿðûçü6[ô?Õ.Tˆ‡yov -òzKgÊèߢ—K¶U&þcÜBПIr/Ã.;„78$Ê–YÙ¡C S“±=ËgVInv„¢R€—tó™Å(£¬ Mz$#P³/Çy•tÛTf+Q§‚:¶„‰\“> ­V…î£ítPÛh”ž.Èäµ1.x¶MW6ô„ÖKb´ù^GŠ)ªÈ(â2ŽÎ‰*€¢–Q°¨çNòg!Ÿhi–·MñgeV›Pd”¯¯<Ù eBVÆË#DÜŒÝmĆ’öN¤˜ŽD8§u'‡0T‰BñxîaÍÚÍÍP+V×)2VÙwŠ/†¢ò\Ó)“™çVÖy6®5„ä'É«®P Ú”@Ÿ£Â}º0X+'@ò¿){·^²»¼ ƒƒ¥÷ú°°ƒEì†Á ¹´P|†ÊyI”·>¯TâO ÔéƒsíÉòAʶ ªI4•¯ròzò@C1Óˆ5¦Ä"þS{°KÒSN:Ìz±Â*HP¹Gn®ÉŒº/Dž\< 7Ý`§ät "…•9âÆ›cønŒ\´§¬ÐP[…¸P¥|¤e`0iõ#˜¾%º ~¶ù¢þè§¡¿µ¡)s3ƺ?ièÍeñ§N~Íò}¹ÄORܳYÅ mŒ%>4Jû2+¨ @Æñ&Ú•…« *3=õö¬%xüíOîÚ[Kb³‹Ü'w¼t¨›ÂäÇCvÐa( ÉäV§´¼ ç3•B·ih7bÀôp°ž8Ý• ¦2ºb¦d«7¤ã‚ä‡:£Ýu•Æ:¬~d EJŽÄ±<å‹êÜãHܦGrËgbÍÀÕ.§}0c¢üüÒáf‰ÆF/’1ûB‘“4ôsÇ'‘m¦†­?iÑwÑà,ì ]Üê‹„=2vv68âDˆÇOÄã&Zy1xÝ1KÈR@6´Ñfê C¥q<‚B‘† u"¡:Ù%~0aN§úéÃÑ¢$ ¯¤Ó]kDPÔ­¢|Ö•?${²|.ÛŠû: ±Ô 5Mýå·ÒcÕÚÁ>‹Ô)¿è˜^µöÃòf i4à ‚ÚÜ)M.sc•:èÔ‡"ôA.l°xøÈ„#eÆoÖ:€Sf$'²ž Ô¡ÊWV<îdù¼žHF°® L23{™WÇçð†ôZb €I6úŽPÚÒò"Ô|Ó{ ]ë@í(²ñCuÔ˜µFgŠq!ƒ²TydYžº#Jgêâäo•¹PÃíÎ T”M-0{DŽ`ñ1¸ÕIp“g¾ìb§ÚðJEe< Ó ‰Øuò3ò„Fò:Ax×V1þ³e¸ÉËCl1’; Œ]h’è˜)'°Ê1Ú£3™(„Q™S¶´†…×Ôßûƒb|t³Ëé‚Xbû"^33‹s~;oðÜÐ/ÿBCRz¿¡ß\þ—’ëm›Á~Æ_ºEÇÀc¼Ÿ¡DªË¿»ÜИY‚-4OÄCZ™¨NIw”%¬ËcSþ…`÷vìZzø}óÑQüÏŠ»u,ÆÏ›÷Ñ ý çk8›M†^#0$ÈýÜd FŠGjXW’S–ÛÇe‘7Ìœy´1E«ñ@ÏÁJJgÆ&8ÉÿÒóC³$Ωa„¡d°\àôy‹ Î“ˆ UNä°i;5½7ƒª2ð* ô^Šuþþò•©3¬Ói- ãù¬ÜyÓ'HZË‚Mv–ß;Ÿ­7G‰ÿ×IÙ2s#O²(BèûáömÕ¨B–1…pH‘ÉY«•¹þÞŒ\%‹?}°Š,Mjð©°8I+Û(ª¿êÎ/|£O2Ñkñ£‹tœ 5€“|¤> ;€+ ŸŠˆñóS/jgL©#÷5ÃC°) ÂAUü Knz†r€bH.¬G/ÍwC !Çx‘i)© rEò>hÒ€MûHB¦w€¢ü°l°÷Y”FÀDiF‰€¿€¸@ŠòQKÔ“9ÓžQ!p§m’±(î rEY¢y.ÿƒd„hMXr°6¿Q­(Á6 ÅgCú…è¦1”’dgñÙNÝTégyž²fº-WdX;ÖÒ®€­¤BôT'w°?Ä¡[ÛIІRdt ÒÓ«¼¾ó6¢=6„¹ •¼¶a”c`¹Á>Pæk2+ã4 Ñ×οþÔî‹ä¡ï˜óÿièolÈ$Û9ÆYýzéƒxôW°v,¯—ØÛù^3ÆÀ`éSìø)Œ.÷‚ì!·‰6I¦òðδÌõxJ&nô}vvPh>)Z[ÔfÉf,’ÓU&é”ëú üýƒÏæ­Í²ýNFèä4Ç‚ "9ÓÙlf¼jGÔY œö OÈ»/3+JïPœÒô8Fɹ°ÞI^zu0¥ç+`Iß#Ó2VìWª@"ÛÅ kÙs¢ %¸°‡VÒߌ|ø…/îaÔe†Â r˜àðÈFÈŒ×àô8‚×8F‹¼4bgŸ\¾ ±:ð`‰/`Qc…ÞÁøN'€AWg-þc}YX°Io‡å³Ð¾x$}6XÃlÔ OºL»Áª@ž¬)X›¶žÐ¢A,bã ÏJ²%{Sn ¡UbOÔ£ftÈžlšUX6h¯F@²·\š{?‚tRuÎ×úAbšê5€ôVQÚ…»¯—›&!Úùéº!Í’I·‘Å^…hhÀä°šš‘?f‰´2“mÀÔlÎÔ$QNHå§)ñ´ÝøGñ8•eÕº"hdò¨s=j'ÈÒ‡–Œ  %ö#‚&@B–.Yiæh»ü*8d£fý Å^Ðð=«UàQ¡e©C ¥ldòìjD|¨•!XÔHÃÔ¶v9B$-…A\çYÆêüÆ|Vö‚›€i¯ÜNYŸóô Û)kŸzGŸú¥õ Ulø ¦Y™òŒ&zday%ìX÷s.ÑÙ!Ž™†‡£-›©Jº·Õ!€!ØB²ƒ’Ù˜œ¦v3ƒ¼7ŒCô,ºiÎ}E?ò—6ôqûoݵ¹¡yÿPpúí-z+Ûé A™¿ÈÜ•¡[?hÃA:‘¿´(ýF]és¼ƒ¡ö£te}Ê¿1+„ÞÇÈÑ“Þ&5} Ÿµ]_†¤¥ßrßøf¥¿ZÀvFG ‡«ô‡UÏž—¯Hždgr9Y¿TP:ŽzÀ¤|«›¿Ö8R7©Å;»ÍÀš9BƒÐƒBðàÜéywÔ@Ú¦ žAõ‘g¼AÏ¡Ü2lQÏÇ]q¨³8|áŸ!K8Jëý²K³h$×î@éáñÃk§ Q¯|àeé×iÊ2žv`Ô)ÌÌŠ]³W‘ÿcÄÈ=hþl€#‘X¦3ƒØY&ÄVçG¦OÉL¤A¨¨ž®<`ý ¢€ŨÌΧ9°2Å™]žN;KÞ2_µ3ªƒpÏvI=©™\\i¼Lšöš6‚DP^–2ÍùU€Q|ãåÔgÁ5;£Lû&§ÿ–T®öŠ%¤Æ52”8»#KjQ‘PrvŒŠxÊQƒ:DÍê@´Ò¤CC¬±¤,ÿ;é𸀤ùšJ¢ÓX¤z%Õ(f§ò“ “ŽÍç@Ðd!#p‰ ˆ‘$ÍÂúÆH’¥ðô6ÝÈ‚J†)³$€(þ´?& ò¦È‘Ùá¹!W™h!Î>y³@D^.=¯£2ìcÊ^õ˜_DеØ9Ÿ{Fþ¡~ä/jè%‘ü“ ýæò?ÞиøÂÇsNo5ôúr¯Üéà5x+nþœ5(ÃÌ>Ò—ÌC,&SØÉï ÙžÝ1صÁ5‹zÍCpCqÖv#èBÆ=XËgé2¼+JÀÕnPè !Ôfà@ÌÜá’é·]}7Øñ9Ú8ÀFdµ æ*À¤*Á4H™ Dl“¥h˜&ÁúZ`…ÀÛ-&Mc‹"ÉÀÉEúz”I“Tc‹rš¬òq[½-ƒ€ÝI?HdÏa¢-ûkH¨#OÒš ëÒ”#bmf¢WtE«ÝBbräÎ3o|©LˆôpÜÐPú“ëçÞЗ,J¡ƒ…›œ¬›Ìj› ÃHÎ4x^| ²¨û­¦ly 41‘š¥ú4ê3¥6¦Ä0{JÉdxV肌±ÔüŽ™›¡¢N˜)³%oÓ¦ñÕÅÑ]DÛô]Ô##ú®nåfæ ý¼Â1z¤}‹0™{™ÿ1K÷ŸIÚ‹it/·\#¨C'‹{²¤ûlà‚Cî¬j»=?ÉÒ³¬]MžÕùdBHWÆÇ:XbTW#Ó¨#Ð0lŸ ÓõMÑe õ|–ÿ{â4CueÑ´Éã>qy±M3öå)`ÿ|Ñ·†ƒk`´ˆ0¨f6ùéÒŽÁ¢æÅd+~œ`œ£9ÁDòTQš¨Êõ¤™À#ùp¢NµÜùT$ª¬Êßå/¸Õƒ*U‰sùäƒÔ!¹ Y|†d–¤jçÎ ä!_„PÓ!ìFçL>€IU‘×ÙWІ Ha )‚|êcÛ3F”(hY^ßGq=}êAÊ£žLÑ¢,t1Ž (±‡ÿF“_&z¦š4=7¤å€Âqrã`¾QSC§&ñZì´²_>®÷Û;¸Jí1E»Œ/á¢Ïö#ŸýâÐPeÈ?|TùoÚµÿ®¡;æÓZŠïmÑpk-Nœ9fìä¤j[KAÈ'*æž r‚Œˆ ˆ¡é´Ÿn™^îA„´‡4ý¬4¢¥7ËÒm%šze‘ Ê€DT}fÞ‹EëÙ,=€ì:²ƒ×e1J¦9³)ƒÈ‘—¹"H.‡Ì¥vþõì(¢L‘kGæ,q[å`a vÏ BºPॠ!ŸÄØô.}¹˜ënÁ„×bŒ^!,©ô4le¼©n ÝWùY;ðñüDÞ_ñÖŠ-¿+‡j0á-,¼ 솴Iw™Htl^^Hz]C߃„éÜ!ø ŽL†#¥y¥gÏ'‹ÚÌR3fÉN=¢K‘¨B¾¨M_îvÖ§í„E–œ£äPç£%ºZu²c@Ž\ÓZ‡¼j•·³ÿ^Xµ3ì³bH“[½rP'›ˆàÃ>§Ð^!iß#LöýÒEÌeÿÏàèEÉ %†|üù¡Ké„p§ÚÏ%D†nuœF#šÉ¬Ì:°:ÿßXžæ(|¡'AA"rWŒ7ÙaÄÚ(v`Ntá!%Úõ­*ö“N´Ô· ¨&a[­\Ó‰iîÉžq¥—ééý÷ËüWíÚÈèåé¹ÌÿHm$Â#½ÒhgmÄnúIò‰ D»-Ì‚ú8¬ÇÚ‰p2£m< ÃlÕHg5æ­^³„IºoŠbD‰*Céhñ* ‘1sÄTHp¥ÖˆÐ½Îs"{z$î¬üŠn¥eAú§†ÂzA4µ öÉ´ï Uù—®Ð¨"Hò¨Î|³WÇ }Jþ"™È0P¢½‡a4§äôé´€EÂ.)Æ3!dåˉDíD?9*d_k€#ø‚°ôlg`hà # M{,5÷ìjl&ÊË`yM‘çU¿q¾!Ë&3¥0HÔˆÕ»® ’•xU ¯ Žd.‡Žñl`¢puH£r¯F¥ÍÙüË×g³ßq¨ýúP¢íïܵÿ¢¡YÞÌ ™ÈÑð··h"Ðh`ººTv‹¥[Tªhiå ¹³ó—@qA塽1ÐIúÛh€{¼\%·¬•IKÖGqèn¢àŒˆ0‹6›õañ( ÙÄ’PîªÇ „¼÷ó¡àÊHÇ›ó†ñ»Ñפ MAœ ɰ!#ïʸ®F(…²?øcGfb ±ÍàǪirÓb¨æB!œŒèFÀ‚ü I /ÈIJú Ã{q=DuÃæª¤ö‘¹ÎGË*ý”J@­~’N CM“y×ñ£ÕP€MâCÐ.[ŒºŽ1l¦zäñæËúìa}Cè‚ ®Ù2¶Çp„J b¸ÞJ‡&Ýã,“] 2c#O Yì®ðMô¢çNtø9èÆ êB¶3É.ÕÉŸBÍa³U>3.×)V°Ò‘ÿ©å+’Ìo«LÅeüŽ–»\¹í,ȶµÈHääøyCª\LÀ4¤ŒuÍ#õârzð»™ÊÝ𵘵†±ñŠ«€üZn©ßÑCŸˆæJ¼Ý˺ž×IRgHi;ÓUc½ÂLK#iA£å#² ÖÜ =jì'êºBSÏ 8¼ÈbFXh–¨©Ú‰±úäõl'@j³á:aäÐŽ.HfÔÎ{Ųy€PÒ¡a'xÐÖch)6›ÚäëîêS[™híÒ ì1î$Å&0k<´I”v¿+žòÆ]ûg7ýOCߺ¡/Oú-¸ò,‡õÉ-z ]Ë#D»^NFP*EÃÕÐrP#ÜŒS32ôÚB°Ñ‚²¤_³î=@]Ò ÎclR0_´`¥•ņÀ#èÀ9¨þ Ö"ßÅ#¶%·1ŽöiÉœXÛO€d†e™ß™‡ª>˶B°IgN÷1ùR}ÿ þÎYkòÛu˜ÆKoŸD# \B¦Hã@Ô“ ­Íá-ù/Hµ!¹vpò–ÕFª%± Kw£´"E)Ó€M.’Š”Ü®Ê †fq<°ƒP¸`’Œ`ÆO׳â~î!(¸rdƒM°ÎáZŒðSȲøJƒ;ðAÖû¯–¯H£t>8ÿÖ‘¢ÚAìe²$·Z÷"c(Ö$n—U¢<«Ü<A3ÅFUrC¥#†›Füö Ù ùöÞH‹ƒ´B9‹²Ý&š¸É½&eô"‚Äõ †ËÚUÚÏ”Û%‹¸Ö_rW®n²Žªº2‰:—6ÀL¾<sišlÊѰìŒ_5:E·"6ŦèégÉÿ9h¨A€È'*C=8FÒ.ˆÅ2¦äfæÒõÄäšôÔßyVcÚRe“]oÛ0ŸH~¡ ê¶4¯§™/Ò‚wÃBUžoÔ ‚ÉYh)i‘Ü#Ô߃4d }ài–ÍqM®d ÂÒz¤»6æÍðlÏ»bP ¤!Ë8ÑÁÐS™ðÈPÏz#ÿ:0ø3¼ÏFMªÊ, 1d¿‡n5XÔE™u÷´Ö´íÕ÷ ÁÉ>h‰nDuš¨|`&Bf‡st}@r6¢Û3;çLqéH1 ŽÛuë/s!™ñ,Ò:—•4â03µ¨»j,:-ТE½±¿ Åv²½q†óÔcvƒòäòÐcTD¼r$Ù¹Àà˜_´Í3jáAXZ¶“J!é·€Ìb`Ü©¡Öã@Ý¿¯AÓ¤Óð1BNÞÔ›ÝPø&=â!n=¾ê ìV‹bT3¦å¤g~lœ±ûbÎò~‘ !R7+Ü—í;$’uµÌÀu‚j£Ì­ì .ä˜È Ÿ fiØuß|Æ’øH±z' 60°ü:]ÑĦm;XW¦Êã•^»Ï@ºçßú €tzªŽÇHÛ­Ù+4pØqƒ%u—4këʢ߽êG'2uýþÉMÚ†i™e}~ß–\Ð4uÓ“6µÍFò Ùî–¹—pÑACƒæ°]^p¢Z•sfB-PV:NEEÔ©nx–C©ÍHKh+tê-Ɔº1¨-V%§Vúzµ a–ˆºPëeG>Å!^„È>F`èE ú—t9ä5§ª~¢­ÏäÆ(&MïÖªÔ)HAàç Ïzð6 8ÒË£Å`S&J¬¶oÔl<˜nKÌŠYÒ°Dm¨FNg´@/{…”œ?Ù –ä§…#KjOþâ&“ÍÂë8°è`ÈY4:™GÁv(ó­¶)ð(á/L‚¡À|ÜÅþaÆe%´^øú|×~ƒ ûOCß«¡ÖÕÝÓW£öÝêãâ³3åv絬狼¡µ„qˆkYpím¢Ólh¨×8NÊ‹Œ“1)Ø¡„-ÖçŸ9-ÔÞbyÏ׌|Ý'¹GÛ-ÖD-EÛäVÞhq¸¤ÜŒ8r9–CËt'X(Æšý~’f&Æš"…çñ2ÁJàÄ®;¢Ã2 mÈ yÜg™Üë§/ŽÑ{Ë·ÐÍDN*Å!m‰Ê:ˆïw²GC™x*ÉÖì,r£ï+uÁ‹…¦#æ|YhµFú.’«@-rq¡œÈ©5H¼69Ô®ï!QçSfgH<R̺¡(°¸wèX­(ALZ¶á¸‰/Œ0âQL^O‹q7ÔœÒøÀoH•}æ`´!zhÉHˆdô}êHÜTD"hq g‡Q>p5päwâ¡DÓàŽÐ¥”"ëÕ~ªrÝoµ–™XsLáÔ“œ½€Ò«¤Ë¬¿H±m“•´’]ï¦ØVĦi½ºRjÛ K†Æ@yH÷èÑh"ÏLT"¿ùò,!Hbõ$©AuÃR–åw~ª=§Ø–e¬c¹Í>œ´~9VÝ#Há5r­L10£ ±{0ÒCs(µ¯lIfzÝÊm]E‡ÄœÄÜØZ[ƒ ÃëSnd%“HÈ],è&!ä9VéI&]çD5KÀçBŒ &CI›’3¾Ð_ùØÙºŽÑÇ–A€vv÷T¯™Üƒ©ÜF½´¦@û±AÌ ©{k}œ…\ÀŠÑ<v&>P¼!æ,õ.1\ÆŽM™D‰kG²Œ! +G¹©®e^èQå¾GHABplĵ¿bdOð'kÙ°¬ºÚ¡6fÎëçžb‡;êv…ñ®ëh¤^¿ƒY-ÇB'ã»N¹øfX˜DõFrpw&mPÌ”»“[Ê$XkÜ6šh¦à í§?Ät”!Lî»Täã X \3LºÞHžY€è¤}†Zòy–qœ(DÝBJû(ºc©+–t•Õ%iψWÅ•I ʳØed¼<‡®mÀmˆZß×Ë å„l“iN€4Œ>žIÚcÛ0oÃÖÄTX²ªYJæXD»“ *BL§!VøŽ©°h=*p‘‡¾"àQ™ZkŠšCUyCºîò,€vÍçAú¢C~¾U'° g(• h+KÓÎÂ{E]!Tâgò‹ò)C©R bA0gõ‚_ >6´†ÆêæšÉN â×^mh‹íîýAfц&¢‚ •ˆÜ20S¡1 i‚Óð½A¦lc±þòÓrQ;‡´­t@Uo ˰È-=Í0Ѭ3ZdäÝœv¾&=HZ©¨fš Ê"¨Œ¨ò/بïßµŸ¾ßúŽ ± 3–ÿ›±3ca††¨L ¾AD¤GŠ­×PÜ*rÕ¹ó› C-œà ‹×+µPdvî!ÿãŽ-Œ8¼ ÞYŒ `ýÅìv2WV•¾¡Š gHhÖy{éywR¶Æÿú¸” +µÀ™­Š÷oŸRÍ÷l`™}òf.•+¾&qF’’άéÒÎ+¥Å{”¸Bé îxêݱüýëhI RÚ7Ïbp°‚YHdÁdÊL‡-0…§T¥p®QE2B8§ò>ôyÐéHõº.,GÑ~g+ì­¥! s¶j Ï'xÊ£E&•6´›­t-Ù¥÷ÝcHO¢çD/ ¡mr”pA_Ip“Ü•:»CÇg—¶çòÆó3jä}ø ¾µ|%@Š NÈX˜eDʹÊÐIªËAèd™dC¡Ò6*\Bní`Ñ´Œ›r{Üd`“oH®ʲ2ÐÎnŸ’=žÁŽ2ÍNUÅv2¦ûŠ=–ùßøIÝ<•ù¯Z²ÓBmº¸KièFaÚ·í¤<-ÁnÍ]í¨YHþ©žZŠnƼÀEÙ7&³Úé·*Üå´†õŒi-ä7^\•cu{*ó"K¤_Ź:ÆsàG–›QZl C#ÀIª4î¨Uz¢ŠW‹<—1F‘t…­Çðë󺃸­øqiJ^–s&±µÒ ¡&|MVŠ2Vzu¤©®8JÎ4/„Š¢šÅò» š@ƒø <ŸA á 7-iù ùu(jí0üƒ<ÿU'qÈ/ÒéB6@zXQ›ÃO0T'ßmI¾g†‚ KKkÈœ¡éŽ*°&Љ“ ݰJcŸ gfJ»:Ú=éöGéÙÛ³Úמ­Éè 4ŒҡȳÀ#ë 9¿z×~ö‹? }Û†ÀÐè$¨}°¡A.Ð'³J 3ˆë@²g#y&Óq˹èÚ×N°í[·á óvèoðUn3n!4–.3)°E}‡¥ôR*ÐsÛž÷NúÜÐ,½¸ë—âŸÀ^7 !Ûë¿D‚¶ÜÄa ÎÑû8Z`4FV ÖY÷,i½€y׬|Ï ùŽÏenu%È”eF²Ï’Ü(=®a+­Žx0u'ç|hÿHŠÍPÔ’Ðþ_ÎJO•í6°;X4«=u‘ýOÔ‚‡åZHÐ|´‰‡1LL_¡öèU{Cµ:ç2B”äÀÒQì*•&¥o”áB£†7TÈ‘£»2ã|SÏ?@H$'¹L ¼ã‹OŠ&Ùcšø(Ûæf¾7ÌìcxÑOŸ™¼Ìàè¯iãÅ¥>°?Úâ°o6ÝPtíKê†É5ͨQ D"CxZ¨£p¼ô(ld1Žk’{+¨ÒQ¼Tt²¹TÐ|ãŒ\þ²Kôðª(°èbÿHPgÄå ü,CÙ “NÔ&]ÈÍhMŒçéæâîN³7Ìu°º¬Ï hW4›gÔË*¨,_MÖ=>)c·ƒ{•ªõÝ¥'¹óš&=&ÍÿãIξ³×³¥=9Ùê¡ÄmEŒv†y†U<#]#sf©.}ÇS àr"9\ãñUꯙÒ@ º‹†÷4WQŒ¨m=’›µ÷N1¢D&s!ÓúHcçüžÐmú“ 3j5>ëa‹o_¤«HñÈ ©5ÖÒ‡Ú6ÚshrŠÝ\‡ ã15‡†Ãjâ3%3¨Ó\YH‰0EtÈÌ_‹òáÄx‘gQ@ ˆBI:â>×åãh¯áÄ*ðeƒÏØAäfdw“»ÐÈÄÅR  ŠsY$´`™Ä{t!u-ÈŽZ5½“+2£C Ê,_…äÝ¥¿ØÅ”oë¶r‚É´ÁÉÔ]!EvöìŽ"ˉúE" Šwl¹¾ÍàÿÔÐkF{©®w Ña9ný [ô©†>¿üÉ<­®//¶è>Ç^Dÿ—ªŠk ÍuciF NІad£Q j³@E©2€Âõ@þ¤Š4µôµ9ǤeÔKÂDInb_2ä[b¸Iº™ë¨á*ˆbÔläƒ:K'»S¹¿‚lRò‚I\=‹¸ãüûb÷•~9|¹ÖâM¼¹jÐ (ä^öéýÒ† ókždhYˆ bº”\3‹6´`žF6̰ï: pkÕ2cêœ;YR^.úRQùö“ã[y¶jIDƒ€ìe³‰,–=àÒ:µ¢ííß_,@ºæ0á¡ÂC0—LçAXö$G[¾Ìäü6r%a¼›}WL›d%ÍèÈÀ Ø1eg+À ÙTiÆ¢¦Í³4WMs„ó‡ ³Q…C¬~¼¶ƒ H€êaôp¯k.š‘¢\UûU¬Ó| ²Uš(¦Rއw¦=\Å+8çhùboÇè’Ì2”¦ÊHÊ>xµÌîæW¿@2C§Á½V{H–ÁMYœ¹ÎºóÁÀA|„÷[vªöžaìI†Ö6\/ÖšÎðÊÐü¹Ö ­WQl£Š­nõ¤ÅYbfEz&”Ë7Z÷sÛÓo,¶Ï~ŽYS–§‚µ' 2+5¨(,äf%:Ÿ v!@* Š êÒÒvÌsû"J%º'm|pŒ†–£aPŠJÔÓ™.Ì£5r›±#IiäY»ÖkèÒÁnf™y1T«%†€ª‹ ¾ª „ò.bµÌ—AŸ¨²Š,*–ÏãK‘ed›–¯C]È‘U †µôµ ±,Œ Ñ´ašzܵp§1¬cGI­eÅ¡3!”R0ŵ;2)!„<¸¦Å4ÊpÒžXjs謡á'çR:*™èìì7S¨ò~dø».¼3ƒ¸/ï‘«¨ìµlØÛ÷È×Üj_×¹tù^¼õôýLÅ\ò”þG¶hFGþÀíöjèw—7Îß _ôz9½ž ¡ÓØÉX[àv%s:ÃD7 ¬=‘uJt`1AE¨'€[¸ÔzÐ\zñŠp­¡Q¡%µ:®diHÚ•ÜßÉ‚Uîü½š\äó‡‡j¢êr Åë @†o–~(ôšû¡ÞGü! äd„v6ë!? h‚v@)æ4fW6±¨Ÿ¥«±2:G¨¹ "´³ò‰žÎa¬0ÕGRéAk¡ô£Ñ ¢‡ê#¡¶(!à2pÎÀcò %% ™°¹]U ßú"ôHš²D׉k÷ϳ¬n7çÝ1ú~þQe‡þì5"Å'ýãæ`çXé[ X¨ùȘy’óì50•Ø,YÜ¡žl å&@d ‰?b£ a`$©Aû ²Ó°à*tç¡mâFàÄKcB.lIçûÉuùÆ.@;u¿SDªÀÍŽwsßaŠ7’‘ñºbÎÃã-æÌæ›È°öü ê|kùz€Ô[€#•KÿÒAšµ¹ÇØí'DYî¦rh¼AëÑQÚ”dêïÄx–m9mEÚ ]”è+¹Ö&²Hj{&)å) äÅr³ÁÂä–&™|H@× W¦äj¨ÜDŒ‹ãÊתøLB8È’¤¼ÑéÍ)zezìîÔ¬Žü¿Mï±øT¥?r†K€ªžRsG"w‰Ž21ð:T†2\Ï(JKƒQæ§#Jè-µ„`æke¥¼'ù¾Ð˜Ï¯™`¦=ß4dUœß¸é&ß=6 ¸Ì.Íè åõlçÀP k,ƒzYæ§3|}úœDU…°²†•ž>É™§£kºw×n©á­ †iðkô^¯|ôù¢{íkáÈëËcí8è…r0é5yšï¸k¿»¼q(¾Á®ÙÇÈäcCW¡ó+ý\oòŒ± $z©6#7 lEþ·2”m(ã̹bîdÐ4:tG´ÈqbÔaÃ(7w–{¹#H”LÊ©CÎZÉÔg£Èª£ŸsH;عrŸïœgJro›Á]ŽTUÔ“~íÇÓ®½“Qd!æ.0ÆÁLÜÔâ­Ý•\ð¦R ý€˜µôFVõSbPÈ"Ê/ÝfÔ‹7ÌM×°’,„ðˆLùÆ$ÆÖ–§ À6^oB›ÃØd'›giVqdAð£GÔßwÙkËS`ñíë¨NÜ,€h3À;Ýî”å_L° þ}—·ÁöQ!ÀCî‚E¹-ÉJP%¨r Àè‘î•BP¼weJ £Œ$À²0½#£ïYa:4Yí4%½•óm£fµ˜`öfcCïadüaô©R$-;¤%}@’y±¡ÎÈÖe!‡¿ Èô).xöP&c-ÈŸfÐ=y±œ7Å'—¯M±Q°YÕD^õ¡ýô“ g–,OJÑHrèRëQ’@ŠÍæ=ÉhÜö‰1B9AÒ€IW %±™p6ž¯y´j[(&ÏtŸ›©¶Eⱌiù›øôü)uþæ3@Ïò òäÉSGæpcVlqˆaÄZ™^«Ô¬FM|¢€ô ±C€yäÍŽI%¯çñ "õmzÌú|#ç Ô,? $wÓó¬3¥¶ó–$£Ð ;DhÄ"´’v¢Gç!ê aƒGM­j”5êEor‡ NŽÔ¡Hÿé©I´ËYË­–(1#ãæ«}¦¸Œ"eëQ¶QM2‰Öt cÖL9ÔCDª’!ö»ØyÏÉ+O‰z\øC/eØ?wùÄ(…„Õ4g!Oã·Êjùµ|ÔY½Ùô7j?Üнryô/àî6£uù_Hÿ}CÏ×Ñ}|¿Ä…™õÉóâ7£ræà8YÏ(½‡ü¨Ì¬ Ô?><â´vO)–¢ ‡ÏŽ<ƒ7vÊG“¡¯µ€oóñè) ¼q ²,³Fu2pŒ6êb´t(é+Q>ª¥‘¥±$ïËH¼É Õ ¤²«ô¹fÆneVo£eGûâÙâã%s4¬’È/ÀÕ´qäÌ‹‚†È“¯Å:Jþ¨•ª v`X‚,X«3¶Ë±d {Å©‰B‹ævà T=hVk«jßaDA¤]ѯÊÙÂH6#H2OL”x[®ç#í°Ñx\ÆÍš­eБ£ÆD—JX;Äûް3tß`é0I¬Üáò!Õh²’”¶± Wj€J¼ä„#gé‹Ö!{ ­¨ÁÉåmPH€Ÿ†%øŽàé˰¯Aa‚Ôw@~ÛØËÔ¥tÿJ.Ä&x>Ú:¥ŽF^nfÒ>ŸµÆí˜ÈˆàøÆûuô&Ùÿ£Ë×–ù{¥â©µË¨}ÌÔZ˜Qµ´ÀRÑ9Èí¶)FpºŒ¼®Ôn§YEœž^ùCîöõ4 4ìBXÕSf.O€tÕÞÇ›éS,ÈN1¡|&¼¸^úŽF#ã‹0?ˆq"AËNö9°a¢“kb’M€„€RçGÍŒ%5æÄf íA‚`žÒ‹FšrÄÝ ]ìÞÊô 1Ò›ª ã×Ìà”çÿfT¬IG—jc°(0›fkÉ3Må_ÔôÃÛ\ê’=]Å"-6 šˆ"ûþ;„ Ó=e«š(Ë#pêÐÉøqS,=Ð¥8Rã S‡}¤8Í6*+åÝ”ô4#&´ë»†ÛXÌÍäபÙ=XMUVö²¯tÅú.^·ž?Ê2ž ½ û?¾boØëïHï’´S÷(r™sq%~1°ýáò z:ƒÿé’ÿ¿¤70ŒÙ‰7ÃÐ~ "AàPe6…ö,DsH©ypa¡oh![]U÷ºE”žÆ\©HgÂÏÒI<³A:”–¥ó°í¨a°s´@¨n¨¥‘éDX›4÷‹äŽ$ÃÜ[ÀÙÕÃos¦³wòÂ×(Xz‚Ô&ºr46°!8@!2À`;ËÊ›Ÿî³¢klbíѫijZË“anáÚ¹E^5Ð}-fê–çÑÛtÚe 1„Ly³cå} —Ä­/ì¡ ½ÐÄ´dg9}$@Ò ÉoÁ•$òÔ¾•]|šŸ©/Ž-D¤ Eõ î)ÔŸIÈÙB€±y$RayÀúH;ªÈfbÞz°ç§2 ¿Awqº:ÀÂ7Ép’(¢+—˜üP$<’»†j5èÁ ;ú.ÀNK±2Bˆ2Ú :“ð19 ß#(ËŸBFaG€¡(ÀHØDŸ¾ÿú=ò7Ú×4d¯†.»çÅèaÉë` L€Œxi˜Þ 2ò“Ú­,=j Ðß!“u+S—]&/%5édŠÞ2EYS”™ ä^ßäeÔª¢ªª ÝHÙ¡7-™0AªUË‹²&”vK£Ù( ݇TR•ËN@Ú“€ ’r:pœÇŽ·?ׇ4àé*zW@¶¯]&»BïTé5ønt!À#Àÿ³RêCæhÁ+ ‡Îh¢™+vÌ™•… F'‹øY-FâÕ-Ÿ0ñŒTÄ1=ÒR£CãʈHùÏ]ÁåÚXÓñ½½Y²ìJrµ÷ŽQÔËÿ Ý<4@G•Ù/’V¤L¦ÙË×çŽÌÜûìÛy©L;gwÙ ÑD¬p_Íàë°3Nó²2c‹ël+¿B ›Œ‚ìŠZ…žn±Á1ôâ¿-€õ±)Ó¦Ö¾>|[„aò–8ì« Ý ÎT‡„¿¯*Å‹òtn²{ÛK2€””[+e~Çèjÿj;·™ˆB%3Í*ãHµÓ¶ ‰±d„Þ'ªƒåÉf‚=Ëùè¶Oe'œ®Æø"ni¶‰eÕ/ŒlPm“\ L†]wZ(¶ìˆ=”ìsYBn‰v•Q1ê¼í†?E¶(#Ëci¿òFÿ[Š¿¶‚$Ïå}Üíìyïk@Ÿí­ •(ùuGáv(¨mŸHs¸ÊQûX±rž£^r ÑmroÁµ/•¤ˆH>xO9Þ³¾RyÎר+5J@ÂaåÅYúÖbËáe€hßí”âªdÕ\É=I ìCjÕfÚ“TчۨõìÇL¨ñQÒãîò\ÿûâMÜ®yI‹Öl »¼q†­¢Øg|Ã?AA—}fñ°s—íôÕ@’ÈD—Äg6æHTÆÈ–áQ`QgѮ޾¿ Þ¨ö¯ØI?ã6–îé%+ÓòtÆ%lEÎA^„î-ð¯‹Kl»¡,Y ùœí·ôrûdî~™úɆv}gU.#žøZþùxÒÇcuÄò.×¾6ËÇvÍOùýkä÷ÿüçoi)Ï?µ"4Pj‚Ù—[éÝIÞ¶Ÿ`ò/ß"¿­+üöüŸ»ýó[ôœ%ÔIÿåú/oÑã}²ù©Î²½:™ßõU£7m“}J+®¤â\›fÅ!ŠOѪ&ÉËÌæ(›®ÄèS¢¥íÎbóáev–É…-ô£צôÇ$íyQêž$4cE#RܺʵÃvÁ)ë3›¿¥“¿gpþ°bR¢¬t¼}@ ™É&\=»+ä´ <Õq;8âP¤ô;](á°õ,zÑ· DêÔ¡­S§~‘GµŒ‚Dı²w:È‚äßH^9 1íµµÏô"`—2Ãê,ÂP’~î t0¼ž+Iª%Šqä6I³}Äé~Q?*Ù6àw¢¸3;3=© 5çݹ†|H•Üü<œàND’-R©8ŸÕMuñËf7Œ j|*‚MJ°]ýD°þöTx»B}ºC=q{ÏI²Ù‘R”®d…zq‘¸ë÷kí'7É?}ûk"…eŠÍç{_÷JØ¢Óh\µãh $qay{Éð_—ÍiǯÙ™ÇEÓè/¼É:ãÛûaŸîH;)Yu_çÊf½Q´­‘Ê!ÊÒFš;Ý9/±Ö‡=ïCàDUHÁv§þ7Á*Á/Ú‰Dç·¯m5_m<,D²ŠxĘbLíØHËwH…Ÿs A¹§|C’:^·Oaýá®D“$ )³Nœmí(Ö^¶µ‡tú,€d‰q¥NÎc¥ßý6ü aùŸ?#—ßLן_h™°Vù£7™¾ ¦O˜ô¼äo=õÛí³îû‰¦~z·ÛÇ·O¡ïo¡¿m~[¼UûÏz)("‹2?/ùzÕFmm›F´mîάq_½ÌÁâùz*?ïì'Hé·¨ïÑ\Ë'áKöuonÆ×]þ•NÿD´¼qͷÿþR‹ÐÓöÍöë >Û­ûôËæoaV÷~Ò[éùËûûÏ7|þ%ÞE·w%Àþê.[6½©1²®É ‘-@²ÂAO¹Êl‡lg²’C!øÁ—¢ÚÔ£Í=ÅŠ2n.a]Ö]±M6wÉuiËØäֱשvËÓ1Ûš„‹èØQ/{ÈPõ(µÙ ©Fû¨ömÙQ™îyˆvXh³MYÍ™hŽìwo¤"í6gß,œîmOÇz3kÈ·Æ=å©T>Ë#Õ%f|ª½¿Ò§.EÙi1 ¦!F¥,…Š¡¼Ê¢Í>¬tÐ5m¶`SàÇÎÕXcޢóù"”X ‘¤üX ˜_¢HjºD¾^c‰åÞ¶JRµ£õ8Wep芞Gžì1$ZO-ÌyÃåœUJBûz‰p©€ÚE¼‚#´ï5…òW½-¼È´ ÂãØpË8ýíðKæß‚E†DñO¤“EÇ5ÛZÇFq€Ì]êd»Gg‰r@®×yZ)éc”½3ÎÍŽj•W²dþR‘i¤ú¦|yEuKטmÒÚ$MV(î¶@6­œ2'ßa@-¹²JvW&¹lûQÞãÑ›ê°EeoŽ}ÀD²„OÒ¢p<´$Ÿa1ÓçÈb«ósÕïßû~œ@­Ÿù¸qûk[lRµ/£¶aäI|FRæ§-|}àÜÀ"ö(‹‘~:r_TA’5²MæNúPJMÁQ À$*DØfDaÈÃÍ’‹Ý§èÉEQ óÙdû ®Õ)(D‚Õðö×ô ’»b+¶WÌÞÏZèœÍ°¼ô£‚вoDn,QÝ)Ó1kÓÍ®ŽbPàGä¡ü•Éy¥NDaèŽÞ™˜cï|ŒqMÀ ‰ìw^_ ´*šý¦HŒÖ/|ª¡w¢î[[4¾…ÙôB¸Æ(}‚0¤<à]ž‰vÖKj£q@ ÷Ä5è}6ªÝ”„¾ê>Oü1‘Ñ“(½–4œoFbç>"‚@c‡Œ^û¾ˆúÇ:ÕH½üirý®~«j³|žÚ²ö›§ö—!rùœüôþOMüýèoéX>_üã̶øÁuè×§|Ö×>¿~¿9·ãš_R ¢ÇÆœ¤1BýY/˰ágAhá‘o›®ÙÇžúÉþõ–#§ªq<ÝC?”Å£)¨m~‘¿ö_Ññâ”Gn9øIíw)žw,¯ÞÎç™´öqú’'s èõÝaè« ñZ¤„é4è|Z¸TÅ&@kù ^göMá˜\²‚W£FCõB½U2'»oZ[U€a½%jR“Ì>*ÙÍMæñ›!Œ@ºe`d©kÎRf(†¨v™Û_fëØÈZÔlCÒSCBPÔŽŠ½È`°V_²µÝöb¥,5ÙÛ\͆œì )É"Ï±Í ¶!j.骷q`pýg¾v8I5)‰ð!i‡qÊ6vV ?üo·Æ>CWxÑsÙc…0¾{nQÊ¢½Ý¾ue{ØðyMéæ!G+.GÎè–SˆP –7ØÙVUŠœé’U°¾ÇDŒ)ohm×qS5f­Q›Ù½I)Ÿ×N$‰Ä_ ­†¹Œ¥’Ó²ÍÞÊ‚DMf#WM6 oe*@4¡Zäƒrâëæeßc¹‚Ôw’2L>·‹;‹kôíl…’ä_øy¯8wîù¶q™²Ð˺õUàL%2uOpù*së5É"K ÈU6)(`«bw”c²h(íèueÍ}Ø9!‚6a&[BžÜ€G•§JÒ|"‚>• ®C¶ß|-ú\ŒïÛnGñYSì*N`¬ï‘{ݱQ*5bm"€äË›¢Ý¹® ò߯õ?üÕoË_ IkÓx¿[ëe¿©‰<Ìé…Ñõ ýªN'8"þR¿ê6)9¢áx>Q¢×Ž.‹'ÇK¤›}Þ[¸-º-M~Ê y^ëx)ÙÞ½²(I=P™*=2Ú'H@OFJĆ8mJHKic ´üzï‚)“LNC'ˆÆVj6ÔÌÓ^ î80"ª{VÚ™€'=UR³Éµ¨C›È’”„NFîV$ ”$>¨ñoyŽˆrmß5Uˆ—I‹û$Õ{«Kí ~^ ›¯TÔ'ªD3žÔ—4çMëÌ»±²kcÛDÀ“ØL¨šC²Ÿ”Ù¼LŒæªì)»Ðäá*ÑÆàw¸#Ö3oÖ©ÿ5ÙLü!ÿàRøõ¡oú÷[œàÓ/OøÃêýoœÚ?nÅúmúýþ·ì‘·/Rùò¸=ÛäsågSe뫼àùa‹ÞOúÄR¿2Ï¿>yCŒXÂÓÑh¡ qßW)NNüöŒD ²¶Í_4HŸ·¥Ç)ŽbžËOù‰ØF8[øÞ¥ƒü´<ßûèóÜyn%zRÛO#Û¯çÓ×âû'TKpõõœ˜ªôë“nÉ3¹—׋>/¦h¼=6æ9yæ™Øœå…`|{ÉÏQ™ec1lJê\ìXüÙÔ!%Qê"Okd+»˜vÕcjp¤­hŠ\¾ Ó,v•ï6?!;µk¿¦9Ëjc؆W¼­dŠlÍnT7r´ÅF¶y²Áh4©S·Q•bCo&ß°CÓ•£ìf‹ÖdÛrm•›v-J…/wU- ÈJYë%g§H«%ÕvV³hBI¨Ô»‘§R`,ó‡iØL;…pâÐ?·Ì2i šºw‚Õ‹WFˆæIû8¢‚ Ú(âÊÕ&ÿ‚¢ì=îE¯­fN¡2Ò–²j¶–³¡øÌd¬£vÞld€EÁ@¾†xÖôÃV9¯É¨òáÄŠ¿’ˆE‹ú Tþ¤“o¼±@§ 0Óz AßÀw+Äg•¢ÔUµU‹T_³jI·½Lg«Æ¼Áò)SÓJE¯°ÍäkØzfUçU`1 gIÈÄD·ÉÃcTÅ9Pì/H»šlês%¥Çê$…hƒÉ'¦Ó†2käDSWŠäab–F1]ÓfÜ>ÍÙοÊBP_^«ÿ–Å>Z)( h7[tGâ¼Sn´½IS9½KãOÝOtíú2‘•ç¿‹<ìwCÂι&鳿šæ×š¯åÀ—Kþeðÿí‰ }Uôü…IjvÃŽ&ZlèÛ½Ûu™æn†ô«Ü5éaØ *H—]‡²&n ÷Qƒø<‹ö`ò¨À²GöF’ÓC)"£ âέ Rƙӂæ?|jZ;]3ð€¶oÔ` Q‡:àgÄ×T%½ÚÅÜh ]´ÒnŠ>;(è É6Dš±"ס…x2£dßφsºau!2…¯µxÏÞ+;°o”s4‘]¾Õ®Ä?±(R}Åu¨ÛÎiv†z}HUOEDBû“rÂH¨ |u‡Oú_Zðu» òê×HçQ-xÁ®q¦DnC±º“­2äÓ& t1ÐøyØæŸ º}e_qúýÛgJᯧzzÖ×§ü³é‹1ۯŊßC\ËüÉývú¨8,Á³üäõ<ÞÕï=ó)´o€ôÞ}]}r¥–y~q¹þßýÙ í#/£ÈN¿ô„]­íÀCrõ ‡#^äk=gý ý~.ü÷6eˆœ»}ùä_í¾îòØÎ‘ðP8ûšW¾nɯÛò{®ç+u ¤}ŠRÒBSñüë}¢¬Cáž«Åz…íÛÊc¡¾bvš˜® zҳ˄Äï“û×veñ™Pš|Wk6„ì£èêoTˆkÛëV ×¾î¢ޱ‡op»'²hóÅϪȻÌòûˆÂ«—_'¶>‡y{*HßéBÿÜíØí;Sfû˜\ÿLÏîiýÔŸ{×IÒ·-În¾Ý¾¤ôË6üTïzo»»Ë¤gg?ecM/ã–•µ¤œH”Á¾ÑbzB"¾¿àk‹¾ß“öwðöÛ7oG¾8HßàóÓ÷—*˜`y±jã٠¶Î¾¾¡ó_«nó—¿>§©ÿ¿Ç\yŠÎP— y¨lEßðp‹-8P =OQ£í+ö{~·”‘¼K@h »VòQ QR²âu’„ Ã.de*ˤúˆcëÍKcÂìÞ’Lt–ºSîöpz)Gµ/‹6C§A‹Á)­³ª Ñ}¤I‰‹@¯CñÔ [{2Zv­(SïuUZO5ÔÕv¼Ï{yQ N¡€Kb³øõBà–Ð;ÉqP`9·m w†èHÝ˧ÑqSÉÛG+ &xŽà@J6ªf _+æ°¾(È›s²OkÚ>&ñIU¡ç᳉êÃ-YÒ™×,‚¯RG,èo(îõAÜP^’× ^¤Õ ÉAAYôJ‡Ôñ“@O²¹Dt™Žç‘Ä[ð÷Ûæ3“êFŠîaCw¯¨Ø…Úd§©ŠWãú¿; SÈn ¿§DŒóËþ “~­ÂŠü½5Zg›{ :ê¥VÕÕªmkfK¥¼’bbò”ÕoKJÿÝnÛxÁ2A$™E\«Ož¶[S†.¤eúm3Œš;§î.¨2I;§º%Ÿ5""}€ðªv­øÂÆÅi*¹Iÿh3÷áÚ{A¤2¡¤Dm]ê9þÈþð²ºìžD`Z/w^gà’DËZXÄ}a n1,>Ñ”_í#BÀüKÏâ¯H„ˆ°H*Ùö{ùx@º_©ã›8ÓðJtЄ9²LPÀ­“-V¶~r‡À "Sd‚MÚ‡èËåÿ=êGÝí…¦(ó<˜ª¿èC9^¦~»?þŠ#JU^]ÕÛ¡Ô}¿ÓÏЈêE*ü°Ô »hª©f´‘èªs)Ù†Ùx$QýˆŽ[ÅŠÿ,»¯À¤5êCƒÔ1./l©¶ÔnMÝÈêhÕ!­Ý¡ºP¿Ò>» ©s¶ ² Z)ÉkHœÿ…Ô±ÓN©{¢šë0¤ÏÎÕÓ9v¼ Ýëüµ?õkëfyOµ_N?«!o‘ý÷ùÒÏËW´Çô…¹ó{·ß"iûŒo×HøùýA0ÅÕô+I»|á$üѶ>tÜÙkã_w£oðû¥¸/+ä†A(ø$î÷¥XÄO_í‹Þúº5‚¶Ø‰L_¼øhØÛ,®5lYnq*%†ùá%Ý¥³Ä¨2ÿ4ޏiÞ¤åc¹¥D“›õ ”ôñp=­®ŒÖŸ§L¯hƒ5º™Ÿ»ù}Û­Æ%B9vºƒµ3–‰Ü,%7(Pêâ¼ÙdD2{‡v\‡‰HЌ؎¦¶2ŸV¥!¨ñ §ÜSµúØå(2Š]ÏK>|an u ¦‹0Ža'ɪ»leÝ› ÑÄ€Ú>J«kËH ¨ÐRséN¤µ—Üx+[¸ÛãwƒSiÌí®g_F›”)":6R×­5Œîmíe ÀŒuZiÍ–X6ØÔ½µ&¬F¤Yn’6÷n¨=²l²E“5‹}µ1ƒî¤t¬$vð¦l[¤ÙùÔà_‚G‘¶áÖÑœƒäg&Ýx•š^«±…9à‹('j_þ.4s¯½ù&k«ýncÊ2{TMD Üô±¢“¬ÞSÆUAš%¦2(0ÛVR;±IY²“²Ë­^ÙzÒ¶têåBÊNy:f6§ eOU'‰(¦ ‡èÕ]üät+¬¶ÑplvÍTÚi“ìV¹vÛ vþ唤’ØÀNÀ<ãô8pX”=\Óµöœ\Þ÷i¨g6ȸCLá"XìÓ&°‘a™z‰•$Å-“ó)kK¤•›*°­œdÀr¯Ýž¯é¯ØD+k¼­hÉÝ‚c1&¹/m#ß2‡Ì1JNŠy£±£o"tJ ñFn°“NxR¸ L(UÁ–y”XMªGÎHBžö¶’p/™Ê¶ÛŽvö±i+Õóܘ¶O?­O× ýĉüüþ5Bü•É Ð>7üs ÙR:àÈqÎŒAP@8×…Ü:SªCžÌ¶¦¹lMó´Öp 9šC¤ZNŽ^XGç¶Dž‰ÿUæŒë°¬€m2{=I¼oâE>ï‹2º±-ÓM®CÈ0\¬”€6Dê…‰]ú&Åu#é•NØX  iü“»UÛŸ‚Zñ2tät6 ÚˆfŒvŒE>DêÃFßL±û¼jµÎ.»$™¹çÐ]ÚÑ}EHß픟½©¹ ÖJ™A=Ëu¨…ó–O$~Kó×mÞèUfùóM¬ÏG}¨å·?Ÿ·gÛò‡Ôõû‹/ªÖï¬íùcå¶ó=õXžzLþK~ï…\CæÓÎ@ÍQƒø$ø~ê¡ì E(9‰ýG‡¢w™%½¶ÅÛB$X©àŒhThQ•^¤¯!Cƒì21I=-¤jÐl°×N›wB*IUÑÍË œ}½þ9ö|oèÿþíõè¿”¤}ôÑ$”¨Êmj»²ÆnjE‹0"ð:"¢Üs¤ÕÁË‘ •ɮƲ'e˜æh®=%—œG-Ð2Óòj!¾÷¿©\t)ÃI׸ÓÀQ®Ï_0/šÑ“ù:¡ËînJÙ2;uä:į÷¾ÏT…vdõZ‘ÂìÕku¿ ûØÈ¢„Wû}µ¿½ýôyÒÄb㔂í/\šûLȽLØ:H†™ _Ïìð|WçW«|¹Mhñeþ1çÖ‹_j1§/Ò˜wsðêë\ùeN÷ž¿ãéôš\eܼ³}ÌåŒÙiþJ¸þ|Ð5¢õË#ÖªÒÇÛü¡UÜ 3øªÿg(·ˆ§wAý”áÙñ¡ùc€ô~$5‰Ï,6w yh2Ûo\hÏ[P8X\6»°ªB"|HÚO&ÍŸI>-eMP ~l–ÿ \‚s`Èë¬NÁ‚•Ÿ<4ÑŠEü59M{Rg5Û¬ä9c<¹ÅG¶ó—ç(êæ°óm]þ£§Â»’ü‰ßÛìëÏéõ‹~H'¬úXÆu騙V½„6gÃk¹ºÕœW"7ûÓÂ'wm@Åç$§Ø`Zô›ámå…y™ôŠš¬*ò¾Ñöè°ì»»þOƒuöËVjÍEÜ (DëN—CŽ-PjÔ˜T;RÕ½W{rFvDg®’Uï è¢J´Ñö ½öAGØ  Y$mÅÜ{M¨QfB²lÜð!’ÀÌ lïoûÍÀ=öa[‹ŒtNü¡Ø¢êPÀôh@#)e›-³vÓ2ÑmcI}`O;IcŒ›Ðà*¿¬Ýa+3»|äQð!:ð’ä´Áp‰À{´ ”‰FHމºo;VD•ø¡Ê…¾É:Ò?åŽõ?à‚÷+dÿ¼}’Š$=õo¥,ßåÙ_æÞß5æñ7tS©¹Ñ fÔ…1­dV•Ö¢I/•„?ø‰«Ü_Å´ýç-=ÈN9%ÁÎR¯À_h>¾ñð¿ÿ<˜ó·‰š‹?þx„kì“e •ô ªÙ´žÚQ0Ž|½ø§™¦Ó6ÄþK±2<Úwc)*M±:?y6Š?öXÑN ÷3Ö3‰hí?Y)ÛìòþƒëoYR=+ºÛ<§‡8:Ïï!ÉoA-{ö& ¬TMG=…ƒ¿ñ÷æå:u D‘ë´p»´¨k(í˺zYèÀhnƒ§qU›6-(ÔÍÄd©—!—tüivx¼ KbáœÑ&¨Ôm9&xY*œ²VÑ@õ„í¦ Qß.b­wŠÚHGêÀ•2T([ÿËKU|X…öÌ#í­´·ÉÕ ˆ¢åw[c „ìJYª§ *ê[)Ÿr¶ßÈÜè°q 5´ˆAL,Ï›¶’å„UnöÂQ¢yTŒËNõ5Ê­*v)6hUÛû~}Úmpµù{‘ÈVæH}H_Ô4È%UºU'×t§5»ªöÆš°4Û[ÆÃ€Û1劽ÎVeö;òL¤{O”\D¡Åü×¶j;ÓBMçåî£ürMhT vǯAšµ%oÅÊÏô~uÔÄ›T¿LÄ‚ŽaR50ç9°Û¥t²€z+×”ˆašŒ`¯xܪâËpj˜¢4’òDzò8jE ¯Ø•w_A˜§ZQBv5BpÉ:-£›ÞPbÏ»ýíJò­¶“:­ªÆÒÁ ˆ¨6“\…µA‹Î$Ù7êGÚü±}G€¡ÑDŽ®8FêìZÖ*K¹«­¯RöødÍ݇rSŒ(Z-%²”ûÁÊI…Û"qÝ­ï¢X`¥ªÑŸlÐÚG ÝG›äÄ6Ôî¿í½µÖI@â6j6¿Î4îeÒ-×£ ³È.º5Þ!UnƒÓ¶C¡ºm‰¿×MŪªyÈO»*×¶ˆ°!(ß Ë³®ÈðwfY—ˆ*Ÿ²:/.é_ÚéôâÀS’‚84#·¿©ïìTx™Ù‘™Ühûè‹#*IŠ]]Þ{ ênÕmmi*É<¨Ùß@ËÀóçÌuÒÂt0Rq)cý¯ŠÌÝÓìÎBöÁ/C‘G’,LM,©}Å06üe°OŒÐΘͯ¯$X! \Þ¼àDÊ>Œêmr…Rµè‚+:¢¶Êék™¨¤ BhÝ:jEõÊéH’úÿ:!Œ·%¿e8Ù¸("O U3Go§¿«s(QfÚÑØÉ¼Eâ³&wt²êÏ&·Æ.æu­×Ý<ÔÓÇå”gŸZ]^å,ld#s¢Š¬ -NhÏM'l^ȽU Ï¥€¤ž¥ aök=Û#>§öT>-\8 ›-†ÛæãQ޵ÔÃiØ‚™?]ò_]Š·ŸÊSIòåw¬Eÿ[i%~3€¤nÐÜ‹DeÂ+èðòT¸»Eä`ÉéE#BÅ…bÝ.»I¡ˆá ØÕV{•»Ysw îÿèäe6úb TáÃAjT‚´4°Hös•K¬Íp[˜2žtÑ`™ޔՑìë­ÛB)ZúìL kUW{ìJ…èÒ¢J‘ …|W}7Ш“ÙÑ&rjÔŽ/:ãð4W—ì„“°aŸ¥@3âݽ†|M”Hžäj·kd£§ž( „dåvóÖÿ‘…ŸO§¯¢þ_]ˆýö›å±Ày´cŸíš•ÒÏS†qœá¡1 XŽ,qH6zs¸7ôÅË( ¢Jž^âˆk‹9ûò:Gص(úD^w¥aè_CÀ·ø;Ù_‹™ñÑ%[§à º¤ù³Æ÷¸<·$íãÛïð>M?Õ±”uÙ˜ôÝE&uGˆ­f¸9©0Ðc-9‘"XiÈa°ª«‘€´#V,ì½Ö'µ9þ®—Æì™|m}ÜìM¿¦z;z¿¥µŸÜZ"'Œgn°$Ñ*[a$4aLwR’Ó‘ÛGqÒ-_`¼JÏlGá#Z¹X-³÷Å¢j#I%z¦½° žÂ,(—}/VÙ²ê0M“â #¯Òfe¼Øb:o“]Ë6GÚUÛ¶Ó0 ?íCŠõ{;u)" A&&;¹ÅÏ4´"–̽M[³×ÑqTñ®«ÒÏ0lºhEùutE&‘¡mé—{µ!&ÙòKo²+Z1o<àÍ϶@6|,þB¦‚'z¬7æ IÖ>¸á¿|€sΰ¢Ê%«Ä¬˜EVº‰éô»ì#@›ºÃbºñJ3Ùg]¥ŸÅÃRލ& E´IÕ ÊL+Qjš6ÞI™( ÁcÓÁ—åïBILWpØÏ >MòwÕÎa’Ĥn‡h¤q&Ít Qeÿ(ôXëõ9œ„ˆÇV†Ú$©ˆ)!Á&5Û†Ÿ¶šRiJü¯àªÓ¡G+©An —>š°qĪFd×…_ϤB(•Z‘ƒ}WÂÿH/õS:V·X&†2ê]–íc9¿»o¼f™g®ñÛñéòÇJœ?¼MŠÑD]Ñ`êiÛõ'龤îïx¿€Ò i§j´…Z¥Ÿ¹*³ì”Ÿr¨ìÏ× ¤¸/ÁJò ’†9šu{°¨Cjº õò”|¶Ò&4žQjR;m -¤ì]¾èi324—àÛ86N©÷å[­–#—-òìœiw;íßNè½C"…Õ߸T;m¨ª`"—ÐþÏoµœÿm3‘àÞ¶È'öJɶçR_SÿBÇLÖ÷›—7(ȼ\üaRíØhû< ‡«F½&† :Ê‚†w¦~rÐ$0ÔÖÙŒš%²UÁº)Rf¡Ôâ !ºzÑÓ8¬²UûH#OŸ°P©ið»/O@‘XÎâØi…µ+DÛYÚ›s‚à‘ùÜ}~gƒ:bÏ,m”‰)x)ˆ_)­Ì § ‡c&Z× ÉÍ"í;ظƒpMfšE¡ˆWUR5™¸9W¥™r¥,NìJ¦)l‘eEig •5ˆœ5Íïvéz~öÝtyßý²Két›Øl”žKf ‚÷O½ÛZ4‘ÈFC¢œ“ ´Y¹ujH%o—¨ð‘Ñõ×iÛì]ªÍØSéM(èÕ¶Yþ‹RÆl H àŠ½G­wåñT¾Š}¥¤:›"+Û Nì–gf¡‹I$,g¢ìÕ-•£/‹ÚM¯ŽAÈš lª]21@¶¡/±Ùu´]í6¹/Å•é¬pÔ#’9·<’œömDVu„æI‚ŽÀ,j,¶ƒ6;uK›mgéØù¢Ýл×nð1ĦgBÑDxˆ<áÎUpï ¶™Ðv÷± ˆŠ.7¼ @D ¤°ÒZ!ˆ/pV.;L½ê¥ªJ”bOÏp/E¨Ò6_—¤2QlÎAª”S8°îY…úåJ…®ëf;ûÔy`ßxô¶Þ¸eèi‹}~U¤ú¿ØÑ®OùÈ‹——TìAÂûalóÁà_Ãz×éöÑZHΰ`žØhøu¶R±‘’yÈíH5vM‰4.|õà›¢’6…DãöBg¤iêÒ…‰5 RI=°E‹í@-Ù8Õ7òéBZR¥©a¬'“»M{¦rA•+ô‚Š×jbÌ}óD[ôî¨Ë^ñi4ïèë5F&­á 'íäÚXk]S\x*)h¤”EÄÓx˜­o{Zÿíû{ÝÚ_^ARì˜'GÚ动’ÝŒ.ÌQLEpö`¡ýb´]2¢*»­ŸÊ5©4N×Í“Zû+ ì ~÷ÄVì¦Uî9"¬UýPZ¥d›¼ìì91`Ôà ùRûaK)}¿¡-»àZ;‰Z…méÉD&ê“þ‹<×™{±¨‰e¦:„,é®*Õè‘©0T) ­ÐöÅ X¦ˆëØ8µ£œî§8žcDÍG˜Ø/½Í ÜàîÒç'®]_Çü· ÿè°ýwûO/”>QTbæÏ¤¡G”¨Ìó—\Œw÷øÍbþ tëô›:0é&(rÅ'Åk6maòHæ|Ô„[0H^´LíÁhž#”• ø5;m™T¦Í/¶›Ð€A ÷€´b”©ZR¡ôrIãíHƒn•GWîÑzãת ÉÅ7#_`]œà›Æ!VJëÇéü“—¬æôJÍNM"»_€çÉ6šò)ÌàÖÅ®4Ânè^U€Éœ nr"Œ!ç<½Ñ=aܲ Öü³Gc膟\ 0TBvð\]8†ÖBZZâ¦Ú¸œ%¡“ˆß£s™'ÖC‰œOqÄPh~-d‚š‚Z™•vÇ’¶Ð)S…h2‚¬z®IeU:”V’›ø8'¢…*AÍ„®fËtpØrBÇ"‘„5¤©ýQU½ÁXèèçȶÚ Áµ±-OÕùZT‰Å¬An0У$Ûp®NÙʨGÝL£;¥I-ÛiÓHÉ]ÃÔ*®=E&2¾®6%ÖÝ`K»lü8 ¢dÜ@V²ÔÏv”ÁUñ°Š!01¡W½ Ï6féªlz¯!‰$¹+Êké;:¤¦»iv“®?ïu”©S’ßšjG» I|[ÄFÒžAb³#îÇsQ¹¡BZÉžÉH;i“Nª5$"ª&­x(6МjîǶ[«øÊ6õ'çÛÀÚT÷^èÔ_w]i³šÂ§§z,]náYóy¢³2ã\2`ë/ ïÛù¥%µPoÑ<3Æ× ?¦U%™}K–ˆýɽ(µpIØ“ Áìµo·‚û Ž)<Ù¬AHÛÍ{–ú|*n°œ®vÀ•ƒ"è&!*ÐyâÏLŸi€÷¥0¥’9¶'´}/ © xÈ’[O´ô¦ƒRʼ(Øpt\ñ€r% S}ß$ožEPËRž9îÙyö`¹;6ˆöä¢|™ÁJ¾dÇÈ Î5ØÆÖvªÝø„6xE“`]œ çKG”)O`­/íÙ.ŽéâÓ?©ãCã"7ÇA^‰ÎýJ[Å÷PNôΧ¬I—K¾Å~Ø…œ´½Xm.!­q’¨,—wBîk:ú³èŸš 'ÅaØÅu¶ê±¡æŽ(ÖJë±d|’×Ô7Ûˆ^mÔv$F³kÖÖ,ʈF%¦Ot|5€G3E!õÀfìEZ±jè0¤¥nÙmh8“šŽ˜¼‡\;{äonÔ•r÷‰S¬b˶ÈéX&8Óº0T ¼OX‚ºÔ~Çýj]û ¯Áÿ8c«ãã)‘D‡êçÖÍ#mb¹ñ_Ñ:ü {Ïäxß©—»þànõO¶?|ÄÏ™Y¿ûB%ˆ(O†V}²Q_íßÂY9¢"Ò_Š¥òv \_‰Õß[lËìúûÊ zIržë™h¹é¤ï›EÚµ™8-+ À]´=άq͘袮²ÙUóRÕ‡s˜¢6(k ãÌM `-¡ûÞp¢Ûa g€® ƒ«äF8¸ÔÊqeÐ0jÀ2uœ´-'ì[¶(„U懅¶Ñ'hãô(ÞU"[;#¦Iþ²²rš\yš÷ÍÚ»±œ>À| Î:õ›‰ Â=}µÞSˆ¾³Cæ9¨Ù¸“»íz/šÖv­Â—6¹…žêk‚es¦À}ào,L³Ó|Ói°am|Í@¤'c­®íçDî§v‹–Z«7I¶P,7%4uÕM¶†ÙŠªöÊ#Skµ‹úìçÔN›ü¯vx§L)!X2D2k•.b²:éÄºéØ— ÚK«RYEøÝæi»k¶·“~ý5b›mÕ¤Ïx²ª8‰] ½ì%„;8‚ ÉʹN† n[qÙrŒzk¢—mv½šDc6õ |ªŸ×3ôFš4¸ÙJM:l»Ûã%ÜX„ýXÃC”¥É!a£O„F%ÇSîŽVµãl˜C8bK²,ªe·•_Uöšr¬U+ªŠp¬}Q©©_¸ƒÄ$Š;Q)‰|¥¹sfùÞä! dŸ‡¤ä¨^pr3Øb£ågs‚ »›}liå\zV/o¯ NVágvë$†Z&ž¤]N…]i^ÂXÀA”¡HìÒ·¬\l'€E‹È“ŽØÅi̦/÷´hŠ·L'Ï¿9ƒ¯ ›ƒÕþÛ5h&u„]Ê ïzð³²*Ó¶Ó9{à‘Þ"ÉSQ¬ý‰ð^uÁø9®úî1ÂJlå0é¤0¦³hÄKm|;}'Îbí{y#ºéT¡Tç 65‡¡dÚ p=À«H›©j©#kÇv"vVfÂUEH{Ê?ù òdup¤ˆ“N(cÛU©T^¡kÓGï'Z- >Þ=Ö·#½H’‹8âÆI!—¤ý¦ú㬓…¦_ÖòˆAÀ>óÂGò6mÖ™@PnŠJ¥8(……ˆCðÉj¥á¢E‰mÁ£Â‘ȬV4Ÿˆç®ñùòb­>SWžŸåíK3ôÜ&\¢mÚK6̲"Û¥P»ÐÝ÷—+õYl¨göÓéä÷âÝÕSÉ©ˆBÛ¢ûÖàZo”¢ìûý¶§l˜OCH¬âtæÖÔÛØIñèNÔzû!_»ôW܆Âz@.Tô¡¼¾ˆÔDU9yÑ9•è˜[¥jÑý ð¬7"ïŽþ®ø> àïÆÊåäÒ,ãAr}Œ–Þ!žZ‚Óñhɰbw +So8d-TTuÿš0þÜþ¬EÏsØþðÿ€ÔBmôÄm›gß#ŸÈ<¶ÏìÖþo€ô„¦?[â«T’¼[¦J›x@®ˆrw<…ÿßM¹I y¥Í^ê@ÅùKO*:Uʈ¼DSÇ–5+Žmªó 9Ù’tÕaVâ(B”˜2Gêä,nîÀu.@ZpÄ¿…k0òI¹Å@ˆ6FÆÜO[ˆe¦œKÜk¤+"ƒÎ:›yá™ßƒ [)EÛw—üL!$¶þ[lõjس’gŸJ¹µaéÌ]Åì®E¢t&ª”{Ûš•ZD³k¥«Â^à1)wÄÆT‹[¶Ñö´Œë6V®6”Úg[¾)³¨ä@ÅÐ;­H9ýìSyÀÖÍá_Øi¦-R•çú‰Êt› yFï,¢èRw`»š~LšªÄ¼€êˆ{Æáh Îr¥™–(üØ›*ÔäAv·a‰B „ÓvÜ;Û–Ç&vºSJ¥ß”÷æ`¥Ž€-@©K[$t7SaìrP—‡:ɯϠž$”#“6ÆÛäœ"ð)¦Às•|³J¬Ä;Vd•+—Ê-l+7v‰.£#ÕeX©áØyTÈ>Iý0\II;Ö#6/túò¹Nõßœ­´DǬÊ,ÛöÓ1'½]v ± މØö¸ !†Û"ájvœÂEöÜÒ|u'’PXÅøÑó^nì”Åô¡.f@·#ÈîµÄÌìÃJ˜a™)±®Ê”¢‡SSH)Ùhø 8,Óæå5Ëx>ö#ÞÿÒ ’ îɆ­j'cî÷¸P±‰Míf Ù~¼o3¶B2*H•'*GšÊP%þ…‡d‡W}#MUómƺã ÇêF’ë >ð\ÜAFyŠ%D!%9ÚŽ›ëIuÊPtËȘŽn™kËú£%Óø^Ö ºc¥¤v  è=#”íR^k,Vòë+W¹lV.­³Eöb§ðx ‹©r'—‰? “ßþꤵ'}Ü-¿"ÛïþWª®ô?ÔúHκ!% ÿ7@\¡zTfgëz+׳·ÇO ¢Õ¯2ß_{øÚ4´Ô—yPÏàÛÙî!"Yjôνp™Ó˜Ó]ÿî†þ²P,YO`ž¦gƒxJá.}@Zy’aö½¤nÃÝÖ{Ñ»o*‡ÛÀ5ïyÜ]Mi}V²¦ÐP« d¯Z´šY*kÕÙ4eUµj”2É‹úý: GêFa>U .ÈRkܘ| Tj•-áÔ«[/#ƒ#5fGôª*å¡…ÚÍîS:ý˜èdTX»º4:Pn°#3/Sã»ÀÒ“–ÍøFŸâŸnnALÐ32_U–:œœc{GgL¥6SSÒ´•A:§z¾2äºéŒm­Ñ‹L}¸ €-¢YÂNFJ¬`‰¬[yI5Ðd?a;‘7SÛY/2D×Dy`©Ô D갾ŽMbWCà^dVèV|»+ÀUu¤<ò=¡ý’_EÌÝ©}µè2z20"Fï[ÊsýĤ3ÈŒ`ïEëg©Ý/ŽüåÉDôß¾MSý²>ð6rßFÌÌ_qµÍÛl‡f…ÙÛp0ð!’ZŸº²RHÏÖG…žÚ‰-Ä–¥1KtoXL¼ÊŠÀÞG<©±wõvÙŽ4µ…áGyvš£Ý¬úxSŸtË8ö*Mðˆn$³Ñ|ÇNâÿ_œ›…BíšJ5¨;y…:¥W'›Ly˜¿p΂2ëÍ£W°¯Bö¯$²ù*üרC?pñ§_ŽýW߯%ìöò+ÏúM½õÛþ¼Ð°­@¤ôúsç•6z?i^±~óñdÉ?‡þBkˆãU´}8‰[WxF3ÍÈB)²C––ýªNŠ…þØ@SýN¹®c1{àx²@] Ç¬ˆ±+\‚ ªŠx.^ ­0¸Ýtm!äà‚å½ÃanÜ”A5=ê69¤1kXà¶ háMµ›¬%Ìñ/ìdPÔF²AÁÒYÅÃ#RÀo±A&ïŘ—G¦¾@ºe*ü¨Ÿ`iæYùPKÔ-/”Xn—<~ƒbì@lh—Þ³L}°È—l2šÂ¹lXö²ŽûÊÙE‹½à‘ÚÝ/µà÷vÿ}¨*5÷½Õæ¯É¾5w¸¯ÙVÜõjr:¡äÜ,ÙJWQ ­›f_\Mn’9“!»sÈ:¤©ð6¤ëÐíî§lgï WÔš¸ŸCËÇÑ[Ý¡:ÝØdËüùžðkºT8׸&¶4Ý‚ö ’IgÑ~Ö™APfk'ÁjUY´bóL‹Úüa%sVÔ“æËZ ]zØICT¢„ë•vR^WGM$í:%·“^ÕñA_®"Åm®É¡ÀZ'3}§åzùø²FÝFÌ è³PÌ9 9¯P‰n )‹XÓ˜¾uš'‚—z«Cñ˜—æ”v)ÚIõšñ*ª”Ї9»:|Ö8*$éµ›®6TüRè4‡ð±VÄãl0gØÕrå•2Ær€—ææõ .@ ó¶ÝäZü™“ñÞvÝ øîó½ƒÒ ³Ú%ÌOµ$§yâ¡*^˜n Å•BuT[ºò4ÉÏ2­¯Ý$V ¬l³æÉþÜÐ)œ ?[‹®tf÷v¼ñ£Y•ªyÓ²=ceD{Yd&´OhK„Þ\7éíÍÃ3â/L7GMååuEÕ“ŽŠÞQ`=Täªê70ù„E¿(âÿBnõwç쯎¢÷i{µGµõÕñ†Ì’-6û!i?/áO½¡Û¹+`¡ ƒcSDFTD‹›Ä?¯þ°â˜- [G< ŒŒ+üø=Eô†8ÓB–’&¦øQ å¤˜ü XÁkKN'v"+u>ïùu$°d«˜<â)Ç”_=Ë#>¦&Spr[@)þwÀ¢5´Ü\®)Ȇ¥¼Û]XO!è†å­+GÕ¶†?L'Ý”,a–<7fˆ˜„«©6¼Ô³x"è˜|‰Lo a¸B§PçHert^ÇDAšuNáß+)ˆ•Åå«éApƒZ$ Ê Œ‚lL<è$ô`ïqo” ƒ·ÏH*³^TêglV.*)J9µ‘y è ¶ÕíXP^É5CéÛ¨í²duÅ%ë–ãØï‘¥‚ ¹±Z9މ„ˆ½‹K½n®¢^]³ˆDöš‡ ²]¬ýõ“:v§‚”úÞn23º4̶Ønj²u:,[‘J_N;’TUonÂÒ„éVÒ2“ÚõÁ©ìíšäKw˦޶ äYŠ2:åSËw­Ëz±¡É#–––—Ó¨õE±U´ ÊÎ637¬%‹YBj^þfê’hôdh­ˆŸ+È#Âe•ªÖG¿žo›=Ü„µ ÉØþ/é5zšJ1êäM<ŽŠå€\¹y¿©‘š~:¬2<™jw»J.Ü*9,îÙGNÚAŒ6…·P¦;6ÇÀ E‡¶ÒÅð;\ãkS¶:‡­Ž´YÆ–ãûÞì³IÏ6Eáæð®(%'šÕ¨9q‡†hÀ¥B-G^äubx>žé︄—Ç’DWÏ0€Ž(]ììWöW‡†z’«§^Y›x/M¶ ¥ÊG"õ@;ï‹äæãöjÂÔ帮®¾J)•âÓ v)˜¨¯T$²<9Ï@ªÀ\g¥‰JÂZvädW„˜{sV ‚,!’è%>†Ò]©(yváZVf‰¢ieÎeèß R·õlDÞ *ÉÀ ñÎ'¨˜Þ¢r¯šPqO<4Sv¡!ä×*ÊšNö úš ƒˆæà×o7xZ´ÎÚB#±ÅZï½â[5´-îäz!mñàã%*dÞÐàÈŸ3íÛ½„ ïo_C¶Ó¤ž¿ Ūñ¬öE”¡ ŸúÂǺã˜"çLçùº÷q‘òz“dÃÆ-±+OûÑkÞ3«Å '3ñª×vÙ!UÙ ڥέ'ÞN:( ¢¹!£øÕù Œj~+WªÓ7‘÷ƒ’_qT¤Ã¶`F„ð,„{÷:èÞ;Ø3Æ* …õÁŒ¥¸Ndá{[´“vZêñ{Ÿ>å Z–/ßÇíϤ7'éÑ}¹ÿüB_!Ó[†V\Æ4çoªûUpT Õ2oèÊ}öe¤ÙÃl‹' ªTáVëŸGc2zRRÝbÁ²èà§A!H·pž_;å¹D Ñ HRÅg›âêX(¥Ìè ¦sgÈgÊ:Î`îAÜ£Ô1ƒv2³û6ù:Ä^ì¤ÐRA šúW..¦£H‰»|ÒZë‘sÑ¥Z§×’eÁ%àÄ%W~‰.â=ô‚|àFð0Í&‘•±ÐPàõ‰ ~ tR olXæÍ|4AÐ`ºñ=>^(ˆyÆÐà¨ØŠùˆÀJ‡GÍ[Ä‹¸úޱkÿM¯.ªw> )eSã+5#×¾wª'ìáU”B¨·¾ N[P^ªŽŒ¦Ÿ«»¡†‘`ðk9¿î"Ü\°¤²MDǽÚè°Úxá©a{NZ¬îW·GÀÆ%ÊR}»m­{¶Š)£l/©Æl¥&Vd²!㲅ר 96BVƒ@%ºnü–lÓPƒÁë!e ‰Õ´Š×0ƒxc¶M·¹O6äϽK ' pƒÖ˜«(Ìö*6Û秤ý†ÝV"³Mܺ㼪¢½SèÑÂPþÕ«ŒjeÔkØ&+±¨Ü`Ÿ¸©5"¡Ž*'Øô·©®£ÉéÖC‚ôŒDÎÚÉ0*X–ðA~z-dßDJä³oô:êÄt¿Æ þCÌð¼T Ë­Oµ*¹½VIÕè uÙI±¨¤Ý °o¯½R€Ôá·H¢•6›"d~9ãñ’†­’³ZL‡£ˆA·é!èøË<ô ç÷o´ëÊT‘Ð nðS¼Õmž˜‘"é#îämÈvªqN@”‹¹[½qqÁï*^†JDd­š³cùãxÍ(‰z\"Áµ‰Næ‹pð—ŸSSÍÂÇ{ ÙS“Щ<ä4“$é4žd4@e‘ó ¨É.BÒ‚½Hï˜Á(ƒ~bÆQB¨*Ûuˆ{­ê¤ŽÂ¹«„“ôíö¸‘ ¸ì)$b=ÙÁ¦k£nÍ @R­Ñ“Óž&)>R ·&YßlÛ=¡B·D:{GqxŠòîØ$qþ×x4Ó& ,Ô +¼Â¿0Ü$ÍaÌí& ›”¹®ÝjBy 1ä{Í`ù°?~Ϩïl÷çÑñÝ4uåªê]DŠYF…nÌ0­eøÖ+^D‹ L ú²mÌZ,ªv<Õ«yšë“âzi?S#ôÉ6ÚËnèZéž%,©4Ä}ú‰‡£~ó³— ÿÃVÖ)k䈓ÚÒ‡oýhþúY»1ýžè|íœH`¾©œ” ÁÙ]_fº+2¢ ŽÑòCÆðoÜþruþo3ŒÊP‘wÒžçþš(†íXJßX4î­ôc yI#¡½J ¸Q)iAË*x..“·¨ÎTjòÄn—ªMðP‡úìòp‰0Ü!!ØæœàÐéâÚ¸a7o œºcxÊ_ ’ÈüF²$󺊳/ôca.„‹bK‡>Ô!k߀¿ ½±¤­Ísõpn,æ0¥ÛM±˜Ñé0 ’¯4õHÙ l„q`Ú9ÏâR× ßÙ ëð.aòâ•;8ç y SbªI”7Uü‘ û®î¡£« uuÃ;Q°UñiUûAÍJqÂ)¯•wÐ4‰SŠy^ÌKƒQþd,,6”Cv5Ã2¢ïÝÖ7¶âÙU½íê/“d]‚»Àylˆ°Éü²ÑXN®6ôŽj@ý–B]ætci·è ©Æ ¶ûDcî—­bEÒ®\°ÌM¶ îâv÷›´ ŒvmQ·ngU6*yâUd @Ë£]’÷z*>Í…¤b¸Lí,-£Ô;kú0›MªZ«Ì²¾Z¶L6Hݦ‘Û--×nKA{BjÊ£R'j·,4غ>E³Ç7[%ÊÅ6įzâDv—ÝO0\í.†¬ÊI†‘ÈD;—&¸špš#¦:IÆý‚L 4—4A,PÛȞі®$„Æà©âû C×øÈ3£Æû 0橯ÊãØÕ>bbWbÈØD€1‘ éÝ:VEK¨Ž¢räÎháãÏs(Ý½×²ÒÆrKÑg+6'Ë,F{Î`-ûÕ&…ì[¤à¤„‘ô#jòÚ‘«âßôˆ%8IÔÕæƒ“ú…*ÝlX-lMÖPf=¼êŒämC¡“%æ³5‘¢`ªMª"mx•4yuD¾Ó;{éâr9£µÖbVñ¶ZéŸuʶDÝ䊾Y™X†¬Qv"M–yj¡t'Ñ™ádÛmR ÜT³š„Œ²)°ï6¾JØEœœžµÖ±/Úà³Ô $›öÄÀSí á—~–fÈ쪂•)Š ¶ÚB³RÍ¢åáòwТ¼ÀÑŠÜRµ,;«NXC^*p®2ªeÎk±72—ZfoÔ‘î§Ê&pÄÔΞU@TÜKCC2¯.éž&CåbÿWh©c©‘j,ÍÐ¥¤£Ð÷Ó+0üM ñÖÚ×Ûo±”^í9H€´©<Üó¾âLíqa°‚E ±fÒç£uë+fê— ˆ7|bUö£6Ôƒ:D }ôÈ‚4Šœ¢ï¼sV^¡e'×ó>ñ%±/ý è‰ðÀçj IÛëD[\ÝÈ)7+Øã ˆ^ÂBÌ‹±îêÞ¸À\½?°["ÃZ2:éô*ÿgò<ÖæÃ;oóö›û÷pÍßÒüÄÅ®ß.woú=aŸVÜ[Š>+‰ÛËŸRÔñ§%[´x.($«™'Šd쥔BÁ0è þùäiŽN•ól†ë¡\Bµ„ƒœg9!@„)Â*Ô³Ú£©$±…Ÿ3-Sxæ*Vt¦÷TéDÍXÆ-Ñi£Á®¡j‚U•$7ö‡8:¢ÀÔžÞ+ïŸN– ky@eZ_¥—ìîD¼U_Ž ÿžfÖ[4Ìtv,‹€mÂXX¢·›Ú›ËèVǶ)63‡…ÌÉ6%Þ×Kg”„’ÓÆòØ;3§ôo¶kkŒ)r®k6ù"¹Úˆî”Îþ9µÐÛ3:³~Û”3V˜@ÆÐíµZ”öüÂõVÌW¥4ªº,åERËoíÞÛ¹j #ø$Æò®ÆY~…ö¿d¦F®6tH`/Mì<$ô"¦sx•i±é@þg€¤ ’ÚpëV‚Ï©¹rÏw;T¢"”,QÅ>àAÊov±ŸeSRÛ]µ²'„62ƒÇí€ÕƒªÝÛE“_*ó™ÊŽŠÔI‰=£ ×6¶Î}SIšï{W¬áÁ&aô¬¶vŽ cJ"k5´×ç¾ËñœT :àG&„ ÛaÅîá´kw™†údjt6Ek=– ­Òm]ªÌû¤M›ý.«\§ù±Û•›’àšOšPO\Q`aÉÑÞ_³(H'<óÑï¶*\ãžAÃj¹ ¸*s—ep‚´¨Ö<÷ìÈüƒ:?Ga~cn܃›ûÜ·è9ÙV5ÃÕç|¢£”…Ðûm× ñSðw*SmXT‚ôÖ_€Ä¸;m¶åñœ”K–­vÕ 'f>d¦ö NÖÀjæðªûÓ½fïQ`¥Û aIVÁ7*myÂyºEcí†Á:¿Î‘þn9PbÚ˜’ò©v2çˆuûÄØ—Öñ’§U®JÈÙ!DKƒ¨Eìx@’=9…¿ˆ;=xº|u¶è4Ü0ˆhÂí„TW*EƒË‹ç²mÉWÊœ`Éïh°7×;ºpÙ§S¤š#´ÖT´’ÂI‚ÉUòF;ËmîWA33)oTÐÊsdëb¼P!P%Ñ»\q×¼€TšBF W#Ç™¸tjxß_båÕ…$â´’ ŒƒÛìN4CáÙ/¾¾&»· sŽºÒòÑ£yßÇ—Û íCÃÍÞå0;¨„«?¶cV4#£è´ÖÆ“æT²+ê:Yžh˜b`hXôDÚ'›1ù™ §É–v¹wƒ?Ýð JŒr:«œú"¹È¬`F] N»¢ìæ~y›íÄ>iµÊwçT¯ôË|1uHΈ(úb‚NøMøxFoAÐö°‹¢0é'Ø -@×ý}ÕúZãŠkÔ×î ÑB·V£Õ–áp`ŸœÓq­n²7–öNao`Õ•G‰ÁKZ#xô+`JáúO¤ÏÛú«åÕ„cãN÷5Ïñõ;íÌÓ9ŽÐì -Ê>NHI&/~:Zóýûê¼"2³îˆ¾:aïÎ0„5)®à6oAì…€•?jÞv„u¾Šq{g<²hý„:+À’þ“¿«¸3:MÐtÎ@..Þ£du@„ëG×¼êugU ÚMá]¥šU¨!™y…1•©de„^׫g—#[@piL¸²œtÁZ¤@u€IE6;”[Nb÷VÜsrñ™Ù€©a@jЦC ÍO~á˜Ëd,] M{ÿ+;u1×ÅÄñd .æäýÒjÇͰ0¼CÛå Cj7`y1x‚*qÄËy|Úõ’ß7+vmb¶©•ªº(ˆX´p•)‘±JûfÆ@oPÑ) ³j½QÆÏÛPCkP†óÖň°×<š+šj ÓT޲P oòåÅúØ&Ê%GH¨O.ËJwl¦Å%«ˆ!³I«º¦*Ó,vº® 9ö鄳@{ã¼p%À(+4!•}äN›MÓ:§T4;ðŒG}#ÖF ýs cÈSj7ÿÅG'{ IAì›úÚ)Ñ‚¡€™ºÆ-†hsBb“úB4©wºv{é¤ñ¶¸øŽÍßi;žÏYãdzo );N3Ûb¬|œNò;&ÖÇ+œƒUru"·–µš×μ Ô8 Ó% ÑŸ¸ï¥}Ð9ÅÝ{ Qÿ–'µŒÕaoªÍI¼vÕþð?DöÞ;‚U½K¨¦N$…?¾«C÷G}¨C~WsçkGw)µÆϹÖ꜉ŠQÿÒBsÆ@ˆôîÜ&ÎTõ«‹bi3TA:àêH{\äÑZ &“ Z$.ȅŽÌÐ ŽÌuVŠ7´X÷¢ÌÍŠDݡРÈ7Â7Û÷zް‘ a6³w€×}Š„Oçûœˆ¨D‚vñ~²í(¤Ó{ibêŸMdî•uL4« •‘s®\ \“¨‚(®õÓ"jæ€2=øë£”"h‚’àý®¥8É«nN^9<ºÑ&ŽTŒÞä!·á̼4εÔT“‚!K0?÷È÷¾# ¢‡À¸½¶à~±” 5”Yýì“ô¶Õ0J¡ko2"w ëרç\‘^ þ•˜ÌÛôÖ.£ó¤ó_–•ó'ÂÝP \Ÿ…òê:z¶³fÍ5­U®X£ˆYƒ(ý”~Zœ b*Ùþ0 §×ê+3m ´"Cu‚y@›, °ÜµKZ|—ÓËöVXL»jB×ê5I­¥mÇÌ]m©V/uÈmäNDµs¶wUj1€ L¡J[óš¨ 5C*"ö’kÛqáÏ.Ñ`Í50͘G¶-hZ“õ¾Ïd“:áq›0™› ÆÙ5tÍúnŸõP}ÉàŠ je‰$7¶‹ªÓÖ÷~ØïP²åuBýg 6²|íiÿ EŸö®{/`Bõ”p+›—ì!e¯·´ßÙt{MÀ£Jú™¡Ä®5³­óµá6äÞò–.â¶RA=¸Ø~«L/‡Á1[î‰"Ým»:5õ0<úÄÔjÚ{µSÄбé@M”Å’XRNfÚŠå¬R”Þ‹M`Ã~\i‚ äàj}{mM¶ÊS«faÒ¾·gþJÁÇÙ瞃·ý¬@‹Ç™ÂÃiÝÙ*kLôóéað]^däË ?®[˜øó×~T ¥&𬀠– ]1>ˆÊǶ«Åv Þhd×Þ£ròÕp 2sjŽF ÁüjÒ \¥L@ÃÊ$cÏÍ·\²Œ±ty1àl‰Ðn(Žòm{“—·Ìb`&£þÊØPZZ)*J‰}÷P`} +{s ƒ?c•L[ȧ‡tü ò²KgTMä_­b)ED¼;kÝií}´+¬æ§mÝ•"BÅU[lìßd0jçØµ(aFzð ¸ÞxHq;º©Mú5¦iem]à÷Nçî0¿ w!ºÌ*e_*‹Ô$çÒˆ5Uq ‡oEÈî¦4Â_Ò÷Æ{jïNIÌ›~Yfyõ‡žØw®¢8¢‘[üròð•jðÖéq4tœµB~%79³ÐU!ê^=2g î…Ïgس€xù:MUëA‡j˜/®q_¨]À¡'¸¬Ev‡:eÅ DÀÄýÙÛÞq8›($gŒ¼ÐTF_n€ü5X×6ŒM ŒO[-R†¡ŠõاϞu¸T>Ú0½¸’ðÒõ•Ñújõ&eü`Ú?³ÓóÕK„LûBŸÖÈ€SNfzOÎÙNNîaEèÑä²P»& ¨â4¦ %¾¡éY.”"ÎÜY»zdñï¼’1E¥&þLµãbs@æ‹;$é#Œi=(E÷ÛØ&Œð“ùü|j^ðØžÓ›(t»vd {ã5ætè¾9v˜ßŠ ¸òŽf—›…ÌñâëW'¸§:…uìêeòúƒ{[ …«ÉkÊü"f/ÆL/KŽ4ç‡:ñ®Ûl±U9h¤ÏÉགྷâŒéC¸Ûèì¡Ó}¯ç`Z:;á•@¡ýàê¶³pr†"dÌ©èÃËvŸsosœÏùc˜Øx›MäŒ êxMZ±iZ$™’ÿ±–Ÿ˜Ïg 5dǨ˜0í,ñb/¼É6›mïÉ Ïr ÁÚ¦*ÆüÂÓg%ªÂÆÈYQDò¬1€” €¥§îæhÈãÆ-ÏÙÛ^ÿ8Š]õfue«/ƒezÊr=°/Ò’r^•Î!Jή÷[$5ñ¤EÛrašJšK½íRº)6­ÒÚîCþÓ~*†Ì$wo8)Þµ‹8º€”d;šVÒ69TÙEÞZNìÞ¢”¥³žÌ‹•L…;†ïJÁ@QÏùH²ÑvØ‹É8©©Ñ×öUé(*Љ‘n»½Ø^;›on±¡¢Úø¹âúo/1µ0Ë6à.E2þdûFns¯"‹ËüOl–™"Ù&u{ìɳ’\­å›»M6VŸ<¼#f|T­O[ânJƄڙ ‡×z‹¡È’8+dRÃêAR)ÓyÌØ%¸¹{„¢|]¯:-¸‘?à ™>«{ÄO0Áˆ»¾—¼^ö£.¶Ïl!.L¥²Ø—1ƒh®wûà#ZG4`Ç磸k”ÅŽ×asÕQò \U±ã$é‘íPÚF7q¾™–„ÚLj"Ý8a2TwÀå, M“:M‰jM‹$†5äÓ'1sütà93¯¥(PAgq|0.×RNpE·í¸Úiàã‚[ví-RŽ.K‹/ˆØ{)â ½æTg7ÐŒŸÁ 0tI¢ —SÆ̯"v§([\^ʘ ç) è«§¨ ÷ ÓÈÄ„±qB®„St<)65ú‡@ÄY œbxP•pí®HJ¾y£% !ã•o³NMgÓ,r0È!ÁZâ>#ÓÛ?NG{œ0žº0Z0ŽNn%HîLâ÷k×Çô#¾Ÿñ;}¸XQƒŸ&de%Úg ÿüþÀ£‹ÿBјä{B7Â;Ë(Ëûtàí}_cWFW9&·óÑúø$Úc®Qk^^øåZ¯€,¡Šì Œœ:&×g/zD$æÝY¬a±ú¤Ž(4¿õxM(â©QÞqD÷@y^›È ˜Š§Ç&P5ð†Óv าîO}¼¯#W_AF çyÌâž Oí8∊êñ)^óò+êöá±ãŸezV…€ŠÝýEî§ûW±…VwþØ‹ðñKÞç}¯/×ÈòüýåíóIõ_0p¦èìnž¦*+Þoäî°¢Å~rdãWï³ÊìS€ÆåÝ¢.:bFn1™0ßѽïω^±€%¶IžÔé,=ûh2°nTxn‹I}}·a}X~¹ß²EhÊE±³MU¶+ò “{¢tzÙ;ßM3ÛIb¢Â}Kéd’‰6“e^m—*)ŵ‡Ï¼è=íÅ»LGøçXø¿…Öþ›íåY\T¿™êçø`ŽêŒ‘m†a}[-H’h§©¸?v–÷k¿Ú%ßUEÆ0ßnÊsVóuŠ]Ã…ÔgÖÇGýÞ a)þAzäÒ>V‚ £‰!$GL©œ—®ð¼ð_rËÈ‘“*“²ýn´WÞK’ùæ<Ѳßê­¦ü48ƒW0çª*P½nû-l°“‹|+ç~«µ¸_‡?еj0)‰ótZðtâôœ>ÎÇ[sÜÓÓ }ѯ“”ß¾A…—k¦X¨¸1#Ÿ-þ6—[–®—õ^EýUY’Š-(ÚO©©Æ1õ‘MKY¹Ï°ò¬´)K^ò³ðÙ!ýµ«ÞEª‡ÂÔ¢\U"̤½sòT w}ÉâòÇîy®êØìœãí6)p5Qœ}%äà@´>#¦¨ªz=Ë›úš9õÕM 2sdŸ¢ƒ]Yp¹eÓûÖÆìØ _&Þ=àÝ Nt×çH¼ŸEËkAóÖú UŸ¿í^ï}–=M(Ù(…Í0‹ ÄÛZ4?ïRë_¶Ûv¡UeHÂä49Ib'k\Û/{¾¹š:?©íMnÒÓ1_Î*aÈãEJ¾ŠW²Á¤í­Møìj_‰¢=Õî@8ܪРE'¤Ä™Ù)Ea¡2BVà”άBRÍŒ·7üu:éßÒOÒk‚y’V­ßRz!›÷¼ãñ'ÙšÔÐÙT—´c›9—ÃáÑ>!Òs+¯¯õ)¥|.³©° É åx¬K„\Îâö‡=çÄÍjUáRÇU «"¸H ïqàÒ‚Y_yÜÒ ;,4§ü'³ØXâ=)¯éhðÓÓ9qKóË{uÏ,Õ©Óì b-Jl-Óê ¢—Àcˆ(Ç;ÿàó¤‰÷kû J˨âНª7¶À/åU5º¨â¼oyâwzDœuyݪzíô0fNB²÷p³BÀE+·ª‚¤zU’¹˜{NòëaOX)s& Z+X¬Æ»7¼‹¸ eªM-…¨ÝÍîoV€s30àÀöÎQs!|Šé£‡Õ_0õ¹?xª};“FˆçßçZ1€´¢Xñ¢õ{~¦¦ñ¹?» à4…SÙý"+…ÿ6;âéÒõ(C}Þ3U»þ@Õée™ùºµi²ÔS¨JïßE­ÿfö³F<½û^qÀéõ¢‰?Õ­§-軳Ä.«¾›&¼ƒ=)ÄšoÁ*A•O¦ƒêáòòz_y¸Ö–ÏÁfESýÆ:+5]â =@/O†™¬òš\ó –oË­÷XSâê%Óq ;z_ñ´×{½‡*¦‹øÿýµ½`gÑ•Øàôr«šq$óÁòé¯Öø9ÄœæçgLž^C`z5d}ô÷2¡2伇#ß[oœ¼»íLù÷|_õu½´×¾¯¦WIóyÕÆ¦÷¸ðŽhá?Kÿîóæ¯;ŠCòÚå~uîn’£eA Õ³V²†…ää,Ü“5ˆÚT›¦îDç&Õ€¤Å¸¡œ+BŸE—V´O,I]¶*ìGây»4Û!ˆbÀiRMÈÐLé·Aѳ/{é}— MDÜå²c3¹¡Â ’³l%®!qŒ–½ÛK¶é,@¤&ÛqÛKŠš}ÐÚm^ZìÉÕ~ßP„¶Fý0}‚sWâk·G´s›lSûpÔRaÌ\ªkJƒ$Ò¶s9gƒjþ4Zöo!rÝeÛ·41X¯EÂoአÛ4Nºí ܡޙTòâsý¬/­ ]¼ïÓ1 ×ÙÚv}Þf{*í>¿Ùn·=¦,‚MïŠ]øŒÖ÷$²¿$ýìØ›ÝÓh=q„ÔÍKî*öÁºœ–lƆ¯$•Ýþ²ØÜ%VðG“·Šæ–‰'$é‰ÏMé©:~ æÈn*jÎÐ$tò€[ÙÒ힀+÷ªÁrj¨6ʼn©»âÜrBB•™ï’e·÷Ýãû“Só„ÅoXЉ5^¨îö;t˜J9±Bmeó˜må}ÎU  ¡pOëŽo¯×“1]kkÜÜå×*<0¼,;õ×qÞÇ9Hq¢¿ÙGRƨ*€ÝÐñb§§pqU╌+ìý•H£ ôÚ”ˆ³B»8,¹ïáÌî†õö²‡8Yžô¸~³ÇýDîýÜEò='ŽIåÏz?¡ÃÕ^VòO…N ©x×ÅöM#ÒÔÖ! Es販eâ}–G·½ÄFšûmßã# ËM¿ÏáH¸Æoo>PesõBÛ„<ëêñ¶$Åix•*ƒú—»øÛúû*ƒŸŽß§ÝõæE;û–k+ëQyšÕª¾½¿D—XbŽmÚ8µ%…<úÄ béë¤ñŽ'‹ µ|Lv _Gììïÿ¤ˆP!î6¤Nî÷ýäÚ¿OÆ WÇYçÖûìZâÿùyÄ4MÿñþÛÿóïã_®iú_ûÿü·ÿÛÿýÿ×ùÛ^ÿ׿ÿÛ?Æ?þß¿?þóïÿö¯öítý멇ýã²þãúÛ¿ýãïÿò÷ÿÛž7þóšô#ß=°Çþ¯ÿããïÿûúÇôÿ)ãKf hevea-2.30/examples/test.tex0000644004317100512160000000151412017700472016074 0ustar marangetcristal\documentclass{article} \title{Specific tests} \author{} \date{} \begin{document}\maketitle \begin{itemize} \item Standard test \ahref{suite.html}{suite}. \item List \ahref{list.html}{test}. \item A lot of \ahref{sym.html}{symbols}. \item Accent \ahref{acc.html}{test}. \item Tricky \ahref{di.html}{displays}. \item The \texttt{mathpartir} \ahref{mp.html}{package}. \item The \texttt{listings} \ahref{lis.html}{package}. \item Another \texttt{listings} \ahref{lis2.html}{test}. \item A \texttt{natbib} \ahref{natbib.html}{test}. \item \texttt{hacha} tests (with footnotes) \begin{itemize} \item Default behavior: \ahref{cart-index.html}{article}, \ahref{cbook-index.html}{book}. \item Non-default behavior: \ahref{cart-bis-index.html}{article} (cutting at parts), \ahref{cart-ter-index.html}{article} \end{itemize} \end{itemize} \end{document} hevea-2.30/examples/style-test.tex0000644004317100512160000002324410334123204017226 0ustar marangetcristal\documentclass {article} %\usepackage {texnames} \usepackage {array} \usepackage {url} \usepackage {amssymb} \usepackage {amsmath} \usepackage {hevea} \def\imp{\to} \def\land{\mathbin\&} \title{\hevea{} User Documentation} \author{Luc Maranget\thanks{Inria Rocquencourt -- BP 105, 78153 Le Chesnay Cedex. {\tt \mailto{Luc.Maranget@inria.fr}}}} \date{\today} %\title {Styles Everywhere} %\author {Abhishek Thakur} %HEVEA \loadcssfile{x.css} %HEVEA \loadcssfile{y.css} %HEVEA \newstyle{H1.part}{background:blue;color:white;font-variant:small-caps} %HEVEA \newstyle{.section}{background:blue;color:white} %HEVEA \newstyle{.subsection}{background:blue;color:white} %HEVEA \newstyle{.titlecommon}{background:\#ddccaa;color:white} %HEVEA \newstyle{.titlemain}{padding:5;background:\#ffeecc;color:black;font-variant:small-caps;font-size:30pt} %HEVEA \newstyle{.titlerest}{padding:5;background:\#ffeecc;color:black;font-variant:small-caps} %HEVEA \newstyle{H5}{background:cyan;color:black} %HEVEA \newstyle{.subparagraph}{background:magenta;color:white} %HEVEA \newstyle{.itemize}{border:dotted black;margin-left:20;background:\#eeddbb;color:black;font-variant:small-caps} %HEVEA \newstyle{.li-itemize}{padding-left:10;border-left:solid blue;background:\#bbddff;color:black;font-variant:small-caps} %HEVEA \newstyle{.enumerate}{border:solid black;margin-left:20;background:\#eeddbb;color:\#ccccc;font-style:italic} %HEVEA \newstyle{.li-enumerate}{padding-left:10;background:\#bbddff;color:black;font-variant:small-caps} %HEVEA \newstyle{.list}{border:solid red;padding:8;margin-left:20;background:\#eeddbb;color:black;font-style:italic;font-variant:small-caps} %HEVEA \newstyle{.dt-list}{background:\#eeddbb;color:black;font-style:italic;font-variant:small-caps} %HEVEA \newstyle{.dd-list}{border:solid blue;background:\#bbddff;color:black;font-style:italic;font-variant:normal} %HEVEA \newstyle{.tabular}{margin-left:20;background:\#eeddbb;color:black} %HEVEA \newstyle{.proof}{border:solid \#88aacc;background:\#bbddff;color:black;align:center} %HEVEA \newstyle{.bussproofs}{border:thin solid red;background:\#eeddbb;color:black;align:center} %\newstyle{H3}{background:blue;color:white;font:sans-serif} %\setstyles{background:blue;color:white;font:sans-serif} %\setstyles{backgound:green} %HEVEA \newstyle{.fancy}{background:\#00cb00;color:white} %HEVEA \newstyle{.ruled-table}{border:solid black;padding:5;background:\#00cb00;color:white} \begin{document} \maketitle \part{Adding Style to Macros and Environments} \section {Adding 'Style' to Listing Mechanisms} HEVEA implements the list environments \texttt{itemize}, \texttt{enumerate}, \texttt{description} using the HTML block elements \texttt{UL}, \texttt{OL}, and \texttt{DL}. The \texttt{$\setminus$begin} and \texttt{$\setminus$end} commands correspond to opening and closing of the respective blocks. To allow the user to add style, the blocks for each environment is opened with the a class, whose name is the same as the name of the environment. This allows the user to give a specific style by defining the class in the preamble using the \texttt{$\setminus$newstyle} command. The following subsections describe the three environments in detail, with examples. \subsection{Itemize} \begin{tabular}{lll} Name of Class & : & itemize\\ Example & : &

    ....
,
  • \\ \end{tabular} Class definitions \begin{verbatim} \newstyle{.itemize}{border:dotted black;margin-left:20;background:\#eeddbb;color:black;font-variant:small-caps} \newstyle{.li-itemize}{border-left:solid blue;padding-left:10;background:\#bbddff;color:black;font-variant:small-caps} \end{verbatim} in the document preamble, for an input \begin{verbatim} \begin{itemize} \item First Row of \texttt{Itemize} \item Second Row of \texttt{Itemize} \item Third Row of \texttt{Itemize} \end{itemize} \end{verbatim} would produce output \begin{itemize} \item First Row of \texttt{Itemize} \item Second Row of \texttt{Itemize} \item Third Row of \texttt{Itemize} \end{itemize} Note the use of $\setminus$\# when specifying the color in the \emph{rgb} format. It is exactly what one would do when printing out \# in \LaTeX{} (it would be unreasonable to expect the argument to be parsed in verbose). The arguments of all style commands follow the same principle. \subsection{Enumerate} \begin{tabular}{lll} Name of Class & : & enumerate\\ Example & : &
      ....
    ,
  • \\ Example Class Definition & : & $\setminus$newstyle\{.enumerate\}\{border:solid black;margin-left:20;background:\#eeddbb;color:black;font-variant:small-caps;font-style:italics\}\\ & & $\setminus$newstyle\{.li-enumerate\}\{padding-left:10;background:\#bbddff;color:black;font-variant:small-caps\}\\ \end{tabular} An input of the form \begin{verbatim} \begin{enumerate} \item First Row of \texttt{Enumerate} \item Second Row of \texttt{Enumerate} \item Third Row of \texttt{Enumerate} \end{enumerate} \end{verbatim} would then produce output of the form\begin{enumerate} \item First Row of \texttt{Enumerate} \item Second Row of \texttt{Enumerate} \item Third Row of \texttt{Enumerate} \end{enumerate} \subsection{Description} \begin{tabular}{lll} Name of Class & : & list\\ Example & : &
    ....
    ,
    ,
    \\ Example Class Definition & : & $\setminus$newstyle\{.list\}\{border:solid red;padding:8;margin-left:20;background:$\setminus$\#eeddbb;color:black;font-style:italic;font-variant:small-caps\}\\ & & $\setminus$newstyle\{.dt-list\}\{background:\#eeddbb;color:black;font-style:italic;font-variant:small-caps\}\\ & & $\setminus$newstyle\{.dd-list\}\{border:solid blue;background:\#bbddff;color:black;font-style:italic;font-variant:normal\}\\ \end{tabular} An input of the form \begin{verbatim} \begin{description} \item[Itemize] Unordered lists. $${unordered \over lists}$$ \item[Enumerate] Ordered lists. $${ordered \over lists}$$ \item[Description] Lists with user-defined labels, (also referred to as description lists). $${description \over lists}$$ \end{description} \end{verbatim} would then produce output of the form \begin{description} \item[Itemize] Unordered lists. $${unordered \over lists}$$ \item[Enumerate] Ordered lists. $${ordered \over lists}$$ \item[Description] Lists with user-defined labels, (also referred to as description lists). $${description \over lists}$$ \end{description} \section{Using DIV for Styles} Due to internal use of certain environments by HEVEA, they cannot be supported by defining an appropriate class in the preamble. A typical example would be the \texttt{table} environment. Defining a class \emph{.table} and using it universaly would throw also effect math constructs, such as \verb+\over,\frac,\xleftarrow,etc.+, besides many other things. One could separate \emph{internal} usages from the \emph{real} ones, using a class \emph{.internal} for the former; however, the use of constructs such as tables and arrays is too wide and entertwined to be able to do that. However, for such constructs, limited support for style-sheets is offered by the environment \verb+\divstyle+, which takes the name of a class as an argument, and encloses the part inside using \verb+
    + and \verb+
    +. The limitation is that the enclosed part may generate more HTML blocks, and only the inherited style attributes shall apply uniformly inside. However, it is pretty effective for some basic styling. As an example consider the class definition below. \begin{verbatim} \newstyle{.ruled-table}{border:solid black; padding:5; background:\#00cb00;color:white} \end{verbatim} Enclosing a \emph{tabular} environment using \emph{divstyle} with the class \emph{.ruled-table} as the argument, as shown below \begin{verbatim} $$ \begin{divstyle}{ruled-table} \begin{tabular}{|>{\tt}c|p{0.7\hsize}|} ... \end{tabular} \end{divstyle} $$ \end{verbatim} will produced output of the form %\begin{divstyle}{ruled-table} $$ \def \val {{\em v}} \def \arraystretch {1.4} %HEVEA \begin{divstyle}{ruled-table} \begin{tabular}{|>{\tt}c|p{0.7\hsize}|} \hline \bf key & \bf Effect for value {\val} \\\hline\hline before & Execute {\val} before typesetting the rule. Useful for instance to change the maximal width of the rule. \\\hline width & Set the width of the rule to {\val} \\\hline narrower & Set the width of the rule to {\val} times \verb"\hsize". \\\hline left & Put a label {\val} on the left of the rule \\\hline Left & Idem, but as if the label had zero width. \\\hline Right & As \verb"Left", but on the right of the rule. \\\hline right & As \verb"left", but on the right of the rule. \\\hline leftskip & Cheat by (skip negative space) {\val} on the left side. \\\hline rightskip & Cheat by {\val} on the right side of the rule. \\\hline vdots & Raise the rule by {\val} and insert vertical dots. \\\hline \end{tabular} %HEVEA \end{divstyle} $$ %\end{divstyle} As one can see, all attributes except color (which is not inherited), worked. Thus the user should remember to use only those arttributes which do not need to be inherited (e.g. border and padding, used once at the beginning), or those that get inherited by blocks inside (e.g. background). A typical error would be of the kind. \begin{verbatim} \begin{divstyle}{ruled-table} I should be $$\frac{white}{white}$$ \end{divstyle} \end{verbatim} which would result in \begin{divstyle}{ruled-table} I should be $$\frac{white}{white}$$ \end{divstyle} However, such problems usually arise in math mode, when most stuff is set using tables, and fewer attributes are inherited. The simpler version \begin{verbatim} \begin{divstyle}{ruled-table} I should be $\frac{white}{white}$ \end{divstyle} \end{verbatim} would still work! \begin{divstyle}{ruled-table} I should be $\frac{white}{white}$ \end{divstyle} \label {options} \end{document} hevea-2.30/examples/amstex.tex0000644004317100512160000001076007271051234016422 0ustar marangetcristal\documentclass{article} \usepackage{a4wide} \usepackage{amsmath} \usepackage{ifthen} \usepackage{calc} \title{Test de primitives amstex} \date{} \numberwithin{equation}{section} \renewcommand{\theequation}{\thesection.\alph{equation}} \begin{document} \maketitle \part{Some tests} \section{Matrices} \section*{Toutes les r\'ef\'erences} Les num\'eros sont~: \begin{tabular}{*{5}{|c}|}\hline \ref{bigmat} & \ref{dessus} & \ref{dessous} & \ref{t_2_formula}\\ \hline \end{tabular} \subsection{Simple} \begin{gather} \begin{matrix} 1 & 0\\ 0 & 1\end{matrix} \quad \begin{pmatrix} 1 & 0\\ 0 & 1\end{pmatrix} \quad \begin{Vmatrix} 1 & 0\\ 0 & 1\\ 1 & 2\end{Vmatrix} \end{gather} \subsection{Compliqu\'e} \setcounter{MaxMatrixCols}{20} \newcounter{x} \newcommand{\row}[1]{% \hdotsfor{#1} & \setcounter{x}{#1}\addtocounter{x}{1}\thex \setcounter{x}{-\value{x}}\addtocounter{x}{20} & \hdotsfor{\value{x}}} \begin{equation} \begin{pmatrix} 1 & \hdotsfor{19}\\ \row{1}\\ \row{2}\\ \row{3}\\ \row{4}\\ \row{5}\\ \row{6}\\ \row{7}\\ \row{8}\\ \row{9}\\ \row{10}\\ \row{11}\\ \row{12}\\ \row{13}\\ \row{14}\\ \row{15}\\ \row{16}\\ \row{17}\\ \row{18}\\ \hdotsfor{19} & 20 \end{pmatrix}\label{bigmat} \end{equation} \section{Environement \texttt{cases}} To summarize, we obtain the following exact representation for the inverse of~$x^2e^x+1$: \[\begin{cases} Y(x) = y(\log x),\quad&\text{$y_{\phantom{0}}$ inverse of~$2\log x+x+\log(1+e^{-x}/x^2)$},\\ y[x+\log(1+y_0^{-2}(x)e^{-y_0(x)})] = y_0(x),\quad&\text{$y_0$ inverse of~$x+2\log x$,}\\ y_0(x) = y_1(\log x),\quad&\text{$y_1$ inverse of~$\log x+\log(1+2\log x/x)$},\\ y_1(x) = \exp(y_2(x)),\quad&\text{$y_2$ inverse of~$x+\log(1+2xe^{-x})$},\\ y_2[x+\log(1+2y_3(x)e^{-y_3(x)})] = y_3(x),&\text{$y_3$ inverse of~$x$.} \end{cases} \] \section{Test d'alignement} Now the $\phi_i$s are very easy to compute: \begin{align*} \phi_1& = y_0 = 1/t_2,\\ \phi_2& = \phi_1(y_0(x+g))-\phi_1 = {t_3t_2^2\over(1+2t_2)} -{1+4t_2+2t_2^2\over2(1+2t_2)^3}t_2^4t_3^2+O(t_3^3),\\ \phi_3& = \phi_2(y_0(x+g))-\phi_2 = -{1+4t_2+2t_2^2\over(1+2t_2)^3}t_2^4t_3^2+O(t_3^3), \end{align*} A similar treatment applies to~(\ref{bigmat}), and leads to \begin{alignat*}{5} x+\log(1+2xe^{-x})& = 1/t_1(y_3(x+g))&& = x+2xe^{-x}-2x^2e^{-2x}+O(x^3e^{-3x}),\\ \exp[-x+\log(1+2xe^{-x})]& = t_2(y_3(x+g))&& = e^{-x}-2xe^{-2x}+4x^2e^{-3x}+O(x^3e^{-4x}). \end{alignat*} \subsection{\texttt{gather}, \texttt{multline}} or one of the following (successive) refinements: \begin{gather}\label{dessus} \exp(e^U)\left[1-\frac{2e^{-U^{1/2}}}{U^{1/2}+4} +\frac{2e^{-2U^{1/2}}}{(U^{1/2}+4)^2} -\frac{4}{3}\frac{e^{-3U^{1/2}}}{(U^{1/2}+4)^3}+O(e^{-4U^{1/2}})\right],\\ \exp(e^U)\exp\left[-\frac{2e^{-U^{1/2}}}{U^{1/2}+4}\right]\left[1+ \frac{8-2U^{-1/2}-U^{-1}+U^{-3/2}}{(4+U^{-1/2})^3} e^{-U-2U^{1/2}}+O(e^{-2U})\right],\label{dessous} \end{gather} Cette \'equation a le num\'ero~\ref{t_2_formula}, celles d'au dessus les num\'ero~\ref{dessus} et~\ref{dessous}. \begin{multline} \label{t_2_formula} 1/t_2(y_0(x+g)) = y_0(x+\log(1+y_0^{-2}e^{-y_0}))\\ = y_0+{e^{-y_0}\over y_0^2(1+2/y_0)} -{1+4/y_0+2/y_0^2\over 2y_0^4(1+2/y_0)^3}e^{-2y_0}+O(e^{-3y_0}). \end{multline} \part{Other tests} \section{Z\'ero} \begin{equation} x^2+y^2 = z^2\label{un:un} \end{equation} \begin{equation*} x^2+y^2 = z^2 \end{equation*} \begin{equation} x^2+y^2 = z^2\label{un:deux} \end{equation} \begin{equation} x^2+y^2 = z^2\notag \end{equation} \begin{equation*} \tag{oups}x^2+y^2 = z^2\label{oups} \end{equation*} Au desus \ref{un:un}, \ref{un:deux} et \ref{oups}. Apr\`es \theequation \section{Deux} \begin{gather} x^2+y^2 = z^2\\ x^3+y^3 = z^3\\ x^4+y^4 = z^4\\ x^5+y^5 = z^5\\ x^6+y^6 = z^6\\ x^7+y^7 = z^7 \end{gather} \section{Un} \begin{gather} x^2+y^2 = z^2 \label{eq:r2}\\ x^3+y^3 = z^3 \notag\\ x^4+y^4 = z^4 \tag{$*$}\label{foo}\\ x^5+y^5 = z^5 \tag*{$*$}\\ x^6+y^6 = z^6 \tag*{\ref{eq:r2}$'$}\\ x^7+y^7 = z^7 \end{gather} Ben mon vieux pour avoir l'\'equation~\ref{foo}. \section{Trois} \begin{gather*} x^2+y^2 = z^2\tag{$+$}\\ x^3+y^3 = z^3\\ x^4+y^4 = z^4\\ x^5+y^5 = z^5\\ x^6+y^6 = z^6\\ x^7+y^7 = z^7 \end{gather*} \section{Quatre} \begin{gather} x^2+y^2 = z^2\\ x^3+y^3 = z^3\\ x^4+y^4 = z^4\\ x^5+y^5 = z^5\\ x^6+y^6 = z^6\\ x^7+y^7 = z^7 \end{gather} Maintenant~: \theequation. \section{Cinq} \begin{align} \tag{a} x^2+y^2 &= z^2 & x^3+y^3 &= z^3\label{a}\\ \notag x^4+y^4 &= z^4 & x^5+y^5 &= z^5\label{b}\\ x^6+y^6 &= z^6 & x^7+y^7 &= z^7 \end{align} Au dessus ya l'\'equation~\eqref{a}. \section{Multline} \begin{multline} x+1 =\\ y+2 \end{multline} \end{document} hevea-2.30/examples/pat.tex0000644004317100512160000014743510506164474015725 0ustar marangetcristal\documentclass{article} \usepackage{fullpage} \usepackage{hevea} \addtolength{\topmargin}{-1cm} \input{pat.def} \def\showgraph{\par\medskip\centerline{\begin{toimage} \box\graph \end{toimage} \imageflush}\medskip} \def\status#1{{\tt #1}} \title{Compiling Join-Patterns \footnote{ This work is partly supported by the ESPRIT CONFER-2 WG-21836}} \author {Luc Maranget \and Fabrice Le~Fessant\\[.5em] INRIA Rocquencourt, BP 105, 78153 Le Chesnay Cedex France. \\[.5em] {\tt\small \{Luc.Maranget, Fabrice.Le-Fessant\}@inria.fr} } \date {} \htmlfoot{\rule{}{}\begin{center}DVI version \ahrefurl{pat.dvi}\end{center}} \htmlhead{\begin{center}DVI version \ahrefurl{pat.dvi}\end{center}\rule{}{}} \toplinks{suite.html}{index.html}{env.html} \begin{document} \maketitle \thispagestyle{empty} \begin{abstract} The join-calculus is both a name passing calculus and a core language for concurrent and distributed programming. An essential part of its implementation is the compilation of {\em join-patterns}. Join-patterns define new channels and all the synchronizations they take part to at the same time. Relying on the experience based on our two implementations, we study the translation of join-patterns into deterministic finite-state automata as well as some related optimizations. \end{abstract} \tableofcontents \section {Introduction} %%Baratin Join-pattern is the distinctive feature of the join-calculus, seen both as a process calculus and as a programming language. On the calculus side, join-calculus can roughly be seen as a functional calculus plus join-patterns, thus achieving the same expressive power as previous name-passing process calculi~\cite{Milner-pi-calculus}. Join-definitions are made of several clauses, each clause being a pair of a join-pattern and of a guarded process. A join-pattern expresses a synchronization between several {\em names} (or channels). When messages are pending on all the names that appear in a given join-pattern, then the corresponding clause is said to be active and its guarded process {\em may} be fired. A definition whose join-patterns share some names expresses sophisticated synchronizations. In such a definition, a message on a name that appears in several active clauses is consumed as soon as one of the corresponding guarded processes is fired. Join-languages are built on top of the join-calculus taken as a core language. Therefore, names are first-class citizens, computations are first abstracted as collections of asynchronous processes, and join-patterns provide an unique, clear and powerful mechanism for synchronizing these computations. The documentation for the join-language~\cite{Join} includes a tutorial that shows how join definitions may encode classical synchronization constructs such as locks, barriers, shared counters,\ldots %%%Conclusion de l'intro On the implementation side, join-patterns are meant to be heavily used by programmers, as the only synchronization primitive available. Thus, their compilation requires much care. At the moment, we propose two compilers: the {\tt join} compiler~\cite{Join}, a language of its own, and the {\tt jocaml} compiler~\cite{Jocaml}, an extension of the Objective Caml functional language. %%% Plan Section~\ref{join-calculus} of this paper succinctly presents the join-calculus syntax and semantics. Then, section~\ref{automatas} introduces the kind of automata we use to compile join-synchronization, while section~\ref{implementation} presents two techniques for implementing them. The first technique directly derives from automata description and is used in our {\tt join} compiler. The second technique performs some extra runtime tests, this is the technique used in our {\tt jocaml} compiler. Sections~\ref{optimization} and~\ref{fusion} discuss optimizations and section~\ref{conclusion} concludes. \section{A rapid tour of the join-calculus} \label{join-calculus} \subsection {Syntax} We here rephrase the traditional presentation of the core join-calculus~\cite{FournetGonthier96}, where names are the only value. Thus, we ignore the issue of system primitives and constants, since names provide sufficient expressive power for our purpose of describing our implementation of pattern matching (However we use primitives and constants in our examples). We slightly change the syntax of~\cite{FournetGonthier96}, in order to match the one of the {\tt join} programming language. We use $x$ to denote a name in general. $$ \begin{array}{l@{\hspace{2cm}}l} \begin{array}{rcl} P & ::= & x\tuple{x_i\inu p}\\ & \mid & \Def D in P\\ & \mid & P | P \end{array} & \begin{array}{rcl} D & ::= & J |> P \\ & \mid & D \And D\\[1em] J & ::= & x\tuple {x_i\inu p}\\ & \mid & J | J \end{array} \end{array} $$ A process $P$ is either a message, a defining process, or a parallel composition of processes (note that names are polyadic, meaning that messages may be made of several values); % a definition $D$ consists of one or several clauses $J = P$ that associate a guarded process $P$ to a specific message pattern $J$; % a join-pattern $J$ consists of one or several messages in parallel. We say that the pattern $J = \ldots x\tuple {x_i \inu p}\ldots$ defines the name $x$ and that a definition defines the set of the names defined by its patterns. Moreover, patterns are linear, i.e. names may appear at most once in a given pattern. Processes and definitions are known modulo renaming of bound variables, as substitution performs $\alpha$-conversion to avoid captures. \subsection{Semantics} This semantics is specified as a reflexive chemical abstract machine (RCHAM)~\cite{BeBo92}. The state of the computation is a {\em chemical soup} $\dd \tth \pp$ that consists of two multisets: active definitions~$\dd$ and running processes~$\pp$. The chemical soup evolves according to two families of rules: {\em Structural rules} $\redstruct$ are reversible ($\heat$ is heating, $\cool$ is cooling); they represent the syntactical rearrangement of terms (heating breaks terms into smaller ones, cooling builds larger terms from their components). {\em Reduction rules} $\redsoupe$ consume specific processes present in the soup, replacing them by some others; they are the basic computation steps. % We present simplified chemical rules (see~\cite{FournetGonthier96,FGLMR96_Calculus_mobile_agent} for the complete set of rules). Following the chemical tradition, every rule applies on any matching subpart of the soup, non-matching sub-parts of the soup being left implicit. $$ \let \N \name \let \su \varphi \begin{array}{rl@{~}c@{~}rl@{\quad}l} &\tth P_1 | P_2 &\redstruct& &\tth P_1, P_2 &\mbox{S-Par}\\ D_1 \And D_2 &\tth &\redstruct& D_ 1, D_2 &\tth &\mbox{S-And}\\ &\tth \Def D in P &\redstruct& D &\tth P &\mbox{S-Def} \\[1em] J |> P &\tth \su (J) &\redsoupe & J |> P &\tth \su (P) &\mbox{R-$\beta$} \end{array} $$ Two of the rules above have side conditions: \begin{itemize} \item (\name{S-Def}) the names defined in $D$ must not appear anywhere in solution but in the reacting process and definition~$D$ and $P$. This condition is global; in combination with $\alpha$-renaming it enforces lexical scoping. \item (\name{R-$\beta$}) $\varphi (\cdot)$ substitute actual names for the received variables in $J$ and $P$. \end{itemize} Additionally, we only consider well-typed terms and reductions. See~\cite{join-typing-97} for details on a rich polymorphic type system for the join calculus. Here, this mostly amounts to assuming that message and name arity always agree. In this paper, we take particular interest in the reduction (\name{R-$\beta$}). Informally, when there are messages pending on all the names defined in a given join-pattern, then the process guarded by this join-pattern may be fired. When firing is performed, we say that a {\em matching} occurs. On the semantics level, there is a message $\tuple{x_i\inu p}$ pending on a name~$x$ when there is an active molecule ~$x\tuple {x_i\inu p}$ in the chemical soup. Thus, we may define the reactivity status of a given chemical soup as the multiset of the active molecules in it. Later on in this paper, we shall consider various abstractions of this reactivity status. \subsection{The join programming languages} Apart from primitives, join-languages support {\em synchronous} names, which the core join-calculus does not provide directly. Synchronous names send back results, a bit like functions. However synchronous names may engage in any kind of join-synchronization, just as asynchronous names do. A program written using synchronous names can be translated into the core join-calculus alone. The translation is analogous to continuation passing style transformation in the $\lambda$-calculus. In our implementation, as far as pattern matching is concerned, a synchronous name behave like it was asynchronous and carried one additional continuation argument. All implementation difficulties concentrate in managing this extra argument, whose presence had no effect on pattern matching itself. The {\tt join} language~\cite{Join} is our first prototype. All examples in this paper are in {\tt join} syntax. The system consists in a bytecode compiler and a bytecode interpreter. Both compiler and interpreter are Objective Caml~\cite{Objective-Caml} programs and it is easy to lift Objective Caml data types and functions into {\tt join} abstract data types and primitives. For instance, {\tt join} programs easily draw graphics, using the graphics Objective Caml library. As a consequence, {\tt join} can be seen either as a language of its own, featuring many primitives, or as a distributed layer on top of Objective Caml. Continuations are encoded using ad hoc threads, which are created and scheduled by the {\tt join} bytecode interpreter. The {\tt jocaml} system is our second implementation. In {\tt jocaml}, all join-calculus constructs for concurrency, communication, synchronization and process mobility are directly available as syntactical extensions to Objective Caml. On the runtime environment side, we have supplemented the original Objective Caml runtime system (which already provides a thread library) with a special ``join'' library and a distributed garbage collector~\cite{GCDistri}. On the compiler side, the Objective Caml compiler has been extended to translate join-calculus source code into functions calls to the ``join'' library. However, we also introduced a few new instructions to Objective Caml bytecode, but only to handle code mobility, a feature orthogonal to pattern matching. The {\tt jocaml} system is currently available as a prototype version~\cite{Jocaml}. \section{Pattern matching in join definitions} \label{automatas} \subsection{Principle} Consider the following join definition: \begin{verbatim} let A(n) | B() = P(n) and A(n) | C() = Q(n) ;; \end{verbatim} This defines three names $A$, $B$ and $C$. Name $A$ has arity one, whereas names $B$ and $C$ have arity zero. Names may be synchronous or asynchronous, depending on whether there are \verb+reply ... to ...+ constructs applying to them inside the guarded processes~$P(n)$ and $Q(n)$ or not. According to the general join-calculus semantics, the guarded process $P(n)$ may be fired whenever there are some messages pending on $A$ and $B$. Similarly, $Q(n)$ may be fired whenever there are some messages pending on $A$ and $C$. In both cases, the formal parameter $n$ is replaced by (or bound to in the implementation) one of the messages pending on $A$. Reactivity information is to be considered at the definition level, since matching is indeed performed at this level. Moreover, in order to use finite-state automata, we want this information to range on a finite set of possible values. As far as matching is concerned and by the linearity of patterns, only the presence or absence of messages matters. Thus, let us call \status{0} the status of a name without any message pending, and \status{N} the status of a name with at least one message pending. Then, the status of a definition is a tuple consisting of the statuses of the names it defines, once some arbitrary order of these names has been adopted. For instance, if some messages are pending on $B$ and $C$, whereas none is pending on $A$, then the status of the $A$, $B$, $C$ definition is a three-tuple written \status{0NN}. A {\em matching status} is defined as a status that holds enough \status{N}, so that at least one guarded process can be fired. Definition status evolves towards matching status as messages arrive. This yields a first kind of ``increasing'' transitions. More specifically, when a message arrives on some name, then this name status either evolves from \status{0} to \status{N} or remains \status{N}. Definition status evolves accordingly. In the $A$, $B$, $C$ case we get the following transitions. (In this diagram, transitions are labeled by the name that gets a new message and matching statuses are filled in gray.) \begin{toimage} .PS cm = 0.3937; pt = 1/72; hu = 2 * cm; vu = 1.5 * cm circlerad = 12 * pt arcrad = circlerad rblabht = 2 * circlerad rblabwid = 4 * circlerad fillval=0.3 pi=3.1415927 define clab { {circle at Here $1 $2 $3} } define ilab { {box invis $1 $2 $3 at Here} } define ln { L: [circle rad 0] if $4 < 0 then { box $3 rjust wid 0 ht 0 at L.c + ($1*(hu/3)-circlerad/4, $2*(vu/3)) } else {if $4 > 0 then { box $3 ljust wid 0 ht 0 at L.c + ($1*(hu/3)+circlerad/4, $2*(vu/3)) } else { box $3 ljust wid 0 ht 0 at L.c + ($1*(hu/3)+ 0.001 * cm, $2*(vu/2.5)) }} {line -> chop from L.c to L.c + ($1*hu, $2*vu)} move to L.c + ($1*hu, $2*vu) } define dln { {line -> dotted right $1*hu up $2*vu chop} move right $1*hu up $2*vu } define htccw { psi=$1 phi=$2 { c0=circlerad * 2 * cos(psi/2) * cos(phi+psi/2) s0=circlerad * 2 * cos(psi/2) * sin(phi+psi/2) c1=circlerad * cos(phi) ; s1 = circlerad * sin(phi) c2=circlerad * (2 * cos(psi/2) + 1) * cos(phi+psi/2) s2=circlerad * (2 * cos(psi/2) + 1) * sin(phi+psi/2) c3=circlerad * cos(phi+psi) ; s3 = circlerad * sin(phi+psi) A: [circle rad 0.0] move to A.c + (c1,s1) arc $4 rad circlerad to A.c + (c2,s2) arc -> $4 rad circlerad to A.c + (c3,s3) circle invis $3 with.c at A.c + (c0,s0)} } define htcw { psi=$1 phi=$2 { c0=circlerad * 2 * cos(psi/2) * cos(phi-psi/2) s0=circlerad * 2 * cos(psi/2) * sin(phi-psi/2) c1=circlerad * cos(phi) ; s1 = circlerad * sin(phi) c2=circlerad * (2 * cos(psi/2) + 1) * cos(phi-psi/2) s2=circlerad * (2 * cos(psi/2) + 1) * sin(phi-psi/2) c3=circlerad * cos(phi-psi) ; s3 = circlerad * sin(phi-psi) A: [circle rad 0.0] move to A.c + (c1,s1) arc cw $4 rad circlerad to A.c + (c2,s2) arc cw -> $4 rad circlerad to A.c + (c3,s3) circle invis $3 with.c at A.c + (c0,s0)} } define tourccw { htccw(pi/2,$1,$2,$3) } define tourcw { htcw(pi/2,$1,$2,$3) } hu=3*cm [ vu=2*cm circlerad=15*pt clab("\status{000}") {ln(-1,-1,"$B$",-1) ; clab("\status{0N0}") ; tourccw(pi/2,"$B$") {ln(0,-1,"$A$",0) ; clab("\status{NN0}",fill) tourccw(pi,"$A, B$") ln(1,-1,"$C$",-11)} {ln(1,-1,"$C$",1) ; clab("\status{0NN}") tourcw(pi/8,"$\,B, C$") ln(0,-1,"$A$",-1) ; clab("\status{NNN}",fill) tourccw(5*pi/4,"$A,B,C$")}} {ln(0,-1,"$A$",0) ; clab("\status{N00}") ; tourcw(pi/2.5,"$A$") {ln(-1,-1,"$B$",-1)} {ln(1,-1,"$C$",1)}} {ln(1,-1,"$C$",1) ; clab("\status{00N}") ; tourcw(pi/2,"$C$") {ln(-1,-1,"$B$",1)} {ln(0,-1,"$A$",0) ; clab("\status{N0N}",fill) tourcw(0,"$A, C$") ln(-1,-1,"$B$",1)}} ] .PE \end{toimage}%$ \showgraph Definition status also evolves when matching occurs. This yields new, ``decreasing'', transitions that we call matching transitions. According to the join-calculs semantics, matching may occur at any moment (provided of course that matching is possible). As a consequence, matching transitions start from matching states and they are unlabelled. In the $A$, $B$, $C$ case, they are as follows: \begin{toimage} .PS lab=0.5 define iln { move right $1*hu up $2*vu } aphi=pi/4 define alncw { c= circlerad*cos($1) ; s = circlerad*sin($1) c2 = circlerad*cos($2) ; s2 = circlerad*sin($2) C: [circle rad 0] if $4 < 0 then {abs = -$4} else {abs = $4} x1 = c ; y1 = s ; x2 = $3*hu+c2 ; y2 = $4*vu+s2 d = (x2-x1) * (x2-x1) + (y2-y1)*(y2-y1) ar = sqrt(d) / (2*sin(aphi)) D: arc cw -> $6 rad ar from C.c + (x1,y1) to C.c + (x2,y2) r=last arc.rad x3 = C.c.x + lab*(x1+x2) ; y3 = C.c.y + lab*(y2+y1) d = sqrt((x3-D.c.x) * (x3-D.c.x) + (y3 -D.c.y)*(y3-D.c.y)) line invis from D.c to r/d ; $5 } define aln { c= circlerad*cos($1) ; s = circlerad*sin($1) c2 = circlerad*cos($2) ; s2 = circlerad*sin($2) C: [circle rad 0] if $4 < 0 then {abs = -$4} else {abs = $4} x1=c ; y1 = s ; x2 = $3*hu+c2 ; y2 = $4*vu+s2 d = (x2-x1) * (x2-x1) + (y2-y1)*(y2-y1) ar = sqrt(d) / (2*sin(aphi)) D: arc -> $6 rad ar from C.c + (x1,y1) to C.c + (x2,y2) r=last arc.rad x3 = C.c.x + lab*(x1+x2) ; y3 = C.c.y + lab*(y2+y1) d = sqrt((x3-D.c.x) * (x3-D.c.x) + (y3 -D.c.y)*(y3-D.c.y)) line invis from D.c to r/d ; $5 } clab("\status{000}") {iln(-1,-1,invis) ; clab("\status{0N0}") {iln(0,-1,"$B$") ; clab("\status{NN0}",fill) ; {dln(0,1)} ; {dln(1,1)} ; {dln(1,2)} tourccw(pi,"",dotted) ; iln(1,-1,"$C$")} {iln(1,-1,"$C$") ; clab("\status{0NN}") iln(0,-1,"$B$") ; clab("\status{NNN}",fill) tourccw(5*pi/4,"",dotted) {dln(0,1)} ; {dln(-1,1)} ; {dln(1,1)} ; {aln(3*pi/8,-pi/3,0,2,"",dotted)} {dln(-1,2)} ; {dln(1,2)}}} {iln(0,-1,"$B$") ; clab("\status{N00}") {iln(-1,-1,"$A$")} {iln(1,-1,"$C$")}} {iln(1,-1,"$C$") ; clab("\status{00N}") {iln(-1,-1,"$A$")} {iln(0,-1,"$B$") ; clab("\status{N0N}",fill) ; {dln(0,1)} ; {dln(-1,1)} ; {dln(-1,2)} tourcw(0,"",dotted) ; iln(-1,-1,"$A$")}} .PE \end{toimage} \showgraph Observe that there may be several matching transitions starting from a given status. This is not always a consequence of the non-deterministic semantics of the join-calculus. Often, ambiguity is only apparent. For instance, matching transitions starting from \status{NN0} lead to \status{NN0}, \status{N00}, \status{0N0} and \status{000}. When such a matching occurs, two messages are consumed (one pending on $A$ and one pending on $B$) then, depending on whether there are some messages left pending on $A$ and $B$ or not, status evolves to \status{NN0}, \status{N00}, \status{0N0} or \status{000}. From the implementation point of view, this means that a little runtime testing is required once matching has been performed. Here, we pay a price for using finite-state automata. However, some true non-determinism is still present. Consider status~\status{NNN} for instance. Then, both guarded processes of the $A$, $B$, $C$ definition can now be fired. The choice of firing either $P(n)$ or $Q(n)$ will result in either consuming one message pending on $A$ and one on $B$, or consuming one message pending on $A$ and one on $C$. Finally, a view of join-matching compilation can be given by taking together both kinds of transitions. This yields a non-deterministic automaton. Note that matching of non-linear patterns can also be compiled using automata. For instance, if a name appears at most twice in one or more pattern, then it status will ramge on $\status{0}$, $\status{1}$ and $\status{N}$. We do not present this extension in greater detail, for simplicity, and because we do not implement non-linear patterns. \subsection{Towards deterministic automata} For efficiency and simplicity reasons we choose to implement matching using deterministic automata that react to message reception. Fortunately, it is quite possible to do so. It suffices to perform matching as soon as possible. More precisely, when a message arrives and carries definition status into matching status, matching is performed immediately, while definition status is adjusted to reflect message consumption. This results in pruning the status space just below matching statuses. In practise, in the $A$, $B$, $C$ case, we get the automaton of figure~\ref{abc}. \begin{figure}[th] \begin{toimage} .PS circlerad=16*pt hu=3 *cm vu=3 *cm clab("\status{000}") {ln(-1,-1,"$B$",-1) ; clab("\status{0N0}") tourccw(-9*pi/10,"$B$") tourccw(pi/2,"$A$",dotted) {alncw(pi/4,-3*pi/4,1,1,"$A$",dotted)} {ln(1,-1,"$C$",1) ; clab("\status{0NN}") htccw(pi/4,-pi/2-pi/8,"$B, C$") {alncw(3*pi/4,-pi/4,-1,1,"$A$",dashed)} {aln(pi/4,-3*pi/4,1,1,"$A$",dotted)} tourccw(-5*pi/12,"$A$",dotted) tourcw(-7*pi/12,"$A$",dashed) }} {ln(0,-1,"$A$",0) ; clab("\status{N00}") tourcw(5*pi/12,"$A$") tourccw(-3*pi/4,"$B$",dotted) tourccw(-17*pi/12,"$C$",dashed) {alncw(pi/2,-pi/2,0,1,"$B$",dotted)} {aln(pi/2,-pi/2,0,1,"$C$",dashed)} } {ln(1,-1,"$C$",1) ; clab("\status{00N}") ; tourcw(-pi/10,"$C$") tourcw(pi/2,"$A$",dashed) {aln(3*pi/4,-pi/4,-1,1,"$A$",dashed)} {ln(-1,-1,"$B$",-1)}} .PE \end{toimage} \showgraph \caption{\label{abc} Automaton in the $A$, $B$, $C$ case} \end{figure} Observe that all transitions are now labeled and that a name labels a transition when message reception on this name triggers that transition. Furthermore, matching transitions that correspond to firing $P(n)$ or firing $Q(n)$ are now represented differently (the former by a dotted arrow, the latter by a dashed arrow). This highlights the difference between false and true non-deterministic transitions: real non-determinism is present when there are both dotted and dashed edges with the same label starting from the same node. For instance, there are two $B$-labeled dotted transitions starting from $\status{N00}$. Non-determinism is only apparent here, since $P(n)$ is fired in both cases and that the selected transition depends only on whether there is at least one message left pending on $A$ or not after firing $P(n)$. By contrast, from status \status{0NN}, the automaton may react to the arrival of a message on $A$ in two truly different manners, by firing either $P(n)$ or $Q(n)$. This is clearly shown in figure~\ref{abc} by the $A$-labeled edges that start from status~\status{0NN}, some of them being dashed and the others being dotted. A simple way to avoid such a non-deterministic choice at run-time is to perform it at compile-time. That is, here, we suppress either dotted or dashed $A$-labeled transitions that start from $\status{0NN}$. In the rest of the paper, we take automata such as the one of figure~\ref{abc} as suitable abstractions of join-pattern compilation output. \subsection{Automata and semantics} Both the ``match as soon as possible'' behavior and the deletion of some matching transitions have a price in terms of semantics. More precisely, some CHAM behaviors now just cannot be observed anymore. However, the CHAM semantics is a non-deterministic one: an initial configuration of the CHAM {\em may} evolve into a variety of configurations. Furthermore, there is no fairness constraint of any kind and no particular event is required to occur. As an example of the consequence of the ``match as soon as possible'' behavior, consider this definition: \begin{verbatim} let A() = print(1); and B() = print(2); and A() | B() = print(3); ;; \end{verbatim} Then, we get the following automaton: \begin{toimage} .PS clab("\status{00}") tourcw(-3*pi/4,"$A$",dotted) tourccw(-pi/4,"$B$",dashed) .PE \end{toimage} \showgraph Status \status{NN} that is preceded by the two matching statuses \status{0N} and \status{N0} cannot be reached. As a consequence, the above program will never print a {\tt 3}, no matter how many messages are sent on $A$ and $B$. Next, to illustrate the effect of deleting ambiguous matching transitions, consider the following definition: \begin{verbatim} let A() = print(1); and A() | B() = print(2); \end{verbatim} Such a definition will get compiled into one of the following deterministic automata: \begin{toimage} .PS {clab("\status{00}") tourccw(pi/4,"$A$",dotted) {ln(0,-1,"$B$",0) clab("\status{0N}") tourcw(pi/4,"$B$"); tourcw(-3*pi/4,"$A$",dotted) } } move right 1.5*hu {clab("\status{00}") tourccw(pi/4,"$A$",dotted) {ln(0,-1,"$B$",0) clab("\status{0N}") tourcw(pi/4,"$B$"); tourcw(-3*pi/4,"$A$",dashed) {alncw(pi/2,-pi/2,0,1,"$A$",dashed)} } } .PE \end{toimage} \showgraph In the case of the left automaton, only {\tt 1} will ever get printed. In the case of the right automaton, {\tt 2} will be printed when some messages arrives on~$B$ and then on~$A$. Both automata lead to correct implementations of the semantics. However the second automata looks a better choice than the first one, since it yields more program behaviors. \section{Runtime definitions} \label{implementation} \subsection{Basics} Names are the basic values of the join-calculus, and thus any implementation of the join-calculus must supply a runtime representation for them. For instance, a name can be sent on some appropriate channel. At runtime, we must indeed send something. However, names that are defined together in the same join definition interact when matching is tested for and performed. Moreover, by the very idea behind the join-calculus, matching is the only synchronization primitive. In other words, only names that are defined by the same join definition have some kind of interaction that is of the runtime system responsibility. This makes possible and desirable to compile a source definition into a runtime ``definition'', a single vector structure that groups all the names defined in a given definition. Names must still exist as individuals, they can be represented as infix pointers into their definition (as in {\tt join}), or as a definition pointer and an index (as in {\tt jocaml}). Both the {\tt join} and {\tt jocaml} systems implement the automata of the previous section. However, they do so in quite different manners. The former focuses on minimizing runtime testing, while the latter involves a systematic runtime testing of the current status at every message arrival. \subsection{Definitions in {\tt join}} Runtime definitions are vector structures. Every name defined in a definition occupies two slots in the vector structure. The first entry holds a code pointer that stands for the name itself, while the second entry holds a pointer to a queue of pending messages, queues being organized as linked lists. Runtime definitions include additional slots that hold the values of the variables that are free in guarded processes. This technique resembles much the one used by the SML/NJ compiler~\cite{Appel-compiling} to represent mutually recursive functions. Message sending on name~$x$ is performed by stacking message values and then calling the code for name~$x$. This code is retrieved by dereferencing twice the infix pointer that represents~$x$ at runtime. However, there is a big difference between mutually recursive functions and join definitions. The code for name~$x$ is automaton code that reacts to the arrival of a new message on that name. The compiler issues various versions of name code, one per possible status of the definition that defines~$x$. Typically, name code either saves a message into the queue for~$x$ (in the non-matching case), or retrieves messages from other queues before firing a guarded process (in the matching case). In all cases, definition status may then need an update, which is performed by updating all code entries in the definition. \subsection{Definitions in {\tt jocaml}} In the {\tt jocaml} system, a name is a pointer to a definition plus an index. Definitions are still vectors structures, but there is only one entry per name for message queues. Additionally, definitions hold guarded closures (i.e. guarded process code plus free variable values), a status field and a matching data structure. Status field holds the current status of the definition as a bit-field. Each name status is encoded by a bit, using bit 1 for \status{N} and bit 0 for \status{0}, and bit position is given by name index. % The matching data structure is an array of maps from statuses to % clause indexes. Message sending is performed by calling a generic C~function from the ``join'' library, taking message value, a definition pointer and a name index as arguments. When a message is received on name~$x$, the bit for~$x$ is checked in the current status bit-field. If the bit is set, some messages on name~$x$ are already present. Thus, definition status does not change. Since the current status before message sending is guaranteed to be a non-matching one, the message is queued and the function is exited. Otherwise, the current definition status is searched in the matching structure for~$x$. This matching structure is an array of pattern encoding, guarded process index pairs. Pattern encodings are bit-fields, just like status encodings. corresponding to a join pattern containing name~$x$, from which name~$x$ has been removed. Using a sequential search by a bitwise "and" with each pattern encoding, the current status can be identified as matching or non-matching in at most $N_x$ tests, where $N_x$ is the number of clauses whose pattern contains~$x$. If no match is found, the automaton state is updated and the message value is queued in the queue for $x$. Otherwise, a guarded process index has been found, and is used to retrieve the associated guarded closure. Arguments to the guarded process are extracted from the queues identified by the matching status found. Status is updated at the same moment (when a queue becomes empty a bit is erased). Finally the guarded process is fired. Therefore, the performance of this technique much relies on fast comparisons and modifications of definition statuses. The best result is achieved when statuses are encoded by machine integers. In that case, the number of names that a definition can define is limited by the integer size of the hoisting Objective Caml system (which typically is 31 or 63~bits). If this is not considered enough, then statuses have to be encoded using several integers or one string. Both kinds of status encodings can be mixed, using integers for small definitions and strings for larger ones. However, in the current {\tt jocaml} system, we use a single integer to hold status, and a technique (described in section~\ref{fusion}) is used to associate several channels to a same bit in the status bit-field. \section{The pragmatics of compilation}\label{opt} \label{optimization} This section is dedicated to optimizations that are first pertinent for the {\tt join} technique and that are performed by the current version of the {\tt join} compiler. We first introduce optimizations that improve the runtime behavior of programs, both in speed and dynamic memory usage. Then, we show how to reduce emitted code size. We focus on optimizing definitions written in object-oriented style, as described in the tutorial~\cite{Join}. As this programming style proved quite frequent, it is normal for us compiler writers to concentrate our efforts on such definitions. In this style, a definition is an objet. Object state is encoded by asynchronous {\em state names}, while synchronous {\em methods} access or modify object state. For instance, given one state name $S$ and $n$ methods $m_1$, $m_2$,\ldots $m_n$ taken in that order, we get: \begin{verbatim} let create(x_0) = let S(x) | m_1() = P_1(x) and S(x) | m_2() = P_2(x) .... and S(x) | m_n() = P_n(x) in S(x_0) | reply m_1,m_2,...,m_n to create ;; \end{verbatim} \noindent The synchronous call \verb+create(v)+ creates a new object (i.e. a new $S$, $m_1$, $m_2$,\ldots $m_n$ definition) and then sends back a $n$-tuple of its methods. Moreover, this call initializes object state with the value~$v$. \subsection{Refined status} As a working example of an object-style definition, consider the following adder: \begin{verbatim} let create(x_0) = let S(x) | get() = S(x) | reply x to get and S(x) | add(y) = S(x+y) | reply to add in S(x_0) | reply get,add to create ;; \end{verbatim} The adder has one state name $S$ and two methods $get$ and $add$. We then try to figure out some ``normal'' runtime behavior for it. As the initial \verb+S(x_0)+ is forked as soon as the adder definition has been created, a highly likely initial situation is that there is one message pending on $S$ and none on the other names. Later on, as some external agent invokes the $get$ or $add$ method, the message pending on $S$ is consumed and the appropriate guarded process is fired. Either process quickly sends a message on $S$. Thus, a likely behavior is for the queue of $S$ to alternate between being empty and holding one element, the queue being empty for short periods. By some aspects of the compilation of ``\verb+|+'' and of our scheduling policy that we will not examine here, this behavior is almost certain. As a matter of fact, this ``normal'' life cycle involves a blatant waste of memory, queue elements (cons cells) are allocated and deallocated in the general dynamic fashion, while the runtime usage of these cells would allow a more efficient policy. It is more clever not to allocate a cell for the only message pending on $S$ and to use the queue entry attributed to $S$~in the runtime definition as a placeholder. On the status side, this new situation is rendered by a new ``\status{1}'' status. Hence, $S$ now possesses a three valued status: \status{0} (no message), \status{1} (one message in the queue slot) or \status{N} (some messages organized in a linked list). Thus, assuming for the time being, that there may be an arbitrary number of messages pending on $S$, the adder compiles into the automaton of figure~\ref{adder} (adder names are taken in the order $S$, $get$, $add$). This new automaton can be seen as an evolution of the $A$, $B$, $C$ automaton of figure~\ref{abc}, with a slight change in channel names. \begin{figure}[th] \begin{toimage} .PS [ circlerad=16*pt hu=3 *cm vu=3.5 *cm clab("\status{000}") {ln(-1,-1,"$get$",-1) ; clab("\status{0N0}") tourccw(-9*pi/10,"$get$") tourccw(pi/2,"$S$",dotted) {alncw(pi/4,-3*pi/4,1,1,"$S$",dotted)} {ln(1,-1,"$add$",1) ; clab("\status{0NN}") {alncw(3*pi/4,-pi/4,-1,1,"$S$",dashed)} {aln(pi/4,-3*pi/4,1,1,"$S$",dotted)} htccw(pi/3,-pi/2-pi/6,"$\begin{array}{l} get\\ add\end{array}$") tourccw(-5*pi/12,"$S$",dotted) tourcw(-7*pi/12,"$S$",dashed) }} { ln(0,-.67,"$S$",0) ; clab("\status{100}") {alncw(pi/2,-pi/2-pi/12,0,0.67,"$get$",dotted)} {aln(pi/2,-pi/2+pi/12,0,0.67,"$add$",dashed)} ln(0,-.67,"$S$",0) ; clab("\status{N00}") tourcw(5*pi/12,"$add$",dashed) tourccw(-3*pi/4,"$S$") tourccw(-17*pi/12,"$get$",dotted) {alncw(pi/2,-pi/2-pi/6,0,1.33,"$get$",dotted)} {aln(pi/2,-pi/2+pi/6,0,1.33,"$add$",dashed)} } {ln(1,-1,"$add$",1) ; clab("\status{00N}") ; tourcw(-pi/10,"$add$") tourcw(pi/2,"$S$",dashed) {aln(3*pi/4,-pi/4,-1,1,"$S$",dashed)} {ln(-1,-1,"$get$",-1)}} ] .PE \end{toimage} \showgraph \caption{\label{adder} Full automaton for the adder} \end{figure} Using the status~\status{1} not only spares memory, it also avoids some of the runtime tests that compute post-matching status. Basically, when a matching consumes the sole message pending on a name with status~\status{1}, then the automaton already knows that this name queue is empty. For instance, when the automaton of figure~\ref{adder} is in the \status{100} status and that a message arrive on either one of the two methods, then the appropriate process is fired and status goes back to \status{000} without any runtime test. By contrast, when the automaton is in the \status{00N} status and that a message arrive on $S$, the second guarded process is fired immediately, but a test on $add$ queue is then performed: if this queue is now empty then status goes back to \status{000}, otherwise status remains \status{00N}. Receiving a message on $S$ when status is \status{0NN} is a bit more complicated. First, the automaton chooses to consume a message pending on either one of the two methods and to fire the appropriate process (figure~\ref{adder} does not specify this choice). Then, the queue of the selected method has to be tested, in order to determine post-matching status. Status \status{1} is easy to implement using the {\tt join} compilation technique. The compiler issues different method codes for \status{100} and \status{N00}, and different codes can find $S$~argument at different places. Implementing status \status{1} in {\tt jocaml} would be more tricky, since the encoding of states using bit-patterns would be far less straightforward than with \status{0}/\status{N} statuses only. As a consequence, the {\tt jocaml} compiler does not perform the space optimization described in this section. \subsection{Taking advantage of semantical analysis} The automaton of figure~\ref{adder} has a \status{N00} status, to reflect the case when there are two messages or more pending on $S$. However, one quite easily sees that that status \status{N00} is useless. First, as $S$~does not escape from the scope of its definition, message sending on~$S$ is performed at three places only: once initially (by \verb+S(x_0)+) and once in each guarded process. Thus, there is one message pending on $S$ initially. A single message pending on~$S$ is consumed by any match and the process fired on that occasion is the only one to send one message on $S$. Therefore, there cannot be two messages or more pending on $S$. As a consequence the full automaton can be simplified by suppressing the \status{N00} node and every edge that starts from it or leads to it. In particular, there is no more $S$-labeled edge starting from node \status{100}. In the {\tt join} implementation this means that the code entry for $S$ needs not be updated when going from status \status{000} to \status{100}. This entry is simply left as it is. Symmetrically, the code entry for $S$ will not have to be restored when status goes back to \status{000} after matching. Another important usage of semantical analysis is determining which names are state names. For a given definition, the output of the analyzer is a status set~${\cal S}$, which is a safe approximation of the actual runtime statuses of that definition. State names are the asynchronous names such that all statuses in ${\cal S}$ give them the status \status{0}~or~\status{1}. The current {\tt join} compiler includes a rudimentary name usage analyzer, which suffices for object definitions given in the style of the $S$, $m_1$, $m_2$, \ldots, $m_n$ definitions , where all state variables are asynchronous and do not escape from the scope of their definition. An promising alternative would be to design an ad hoc syntax for distributed objects, or, and this would be more ambitious, a full object-oriented join-calculus. Then, the state variables of object-definitions would be apparent directly from user programs. \subsection{Avoiding status space explosion}\label{space} Consider any definition that defines $n$ names. Ignoring \status{1}~statuses, the size of the status space of a given definition already is $2^n$. The size of the non-matching status space is thus bounded by $2^n$. As a full automaton for this definition has one state per non-matching status, status space size explosion would be a real nuisance in the case of the {\tt join} compiler. In particular, there are $n$~times the number of non-matching statuses automaton code entries to create. Unfortunately the exponential upper bound is reached by practical programs, as demonstrated by the general object-oriented definition given at the beginning of this section~\ref{opt}. In that case, all definition statuses such that $S$ has the \status{0} status are non-matching. In such a situation, using runtime testing, as {\tt jocaml} does, is not that much a penalty, when compared to code size explosion. We thus introduce dynamic behavior in the automata. We do so on a name per name basis: the status of state names will be encoded by automata states as before, whereas method statuses will now be explicitly checked at runtime. Thus, we introduce ``\status{?}'', a new status, which means that nothing is known about the number of messages pending on a name. Additionally, we state that all methods will have the \status{?} status, as soon as there is one message or more pending on any of the methods. This technique can be seen as merging some states of the full automaton compiled by considering complete status information into new states with \status{?} statuses in them. For instance, in the adder example, we get the automaton of figure~\ref{adder2}, where the three statuses \status{0N0}, \status{0NN} and \status{00N} of figure~\ref{adder} merge into the new status~\status{0??}. (Note that we also take advantage of name usage analysis to delete status \status{N00}.) \begin{figure}[th] \begin{toimage} .PS clab("\status{000}") {{iln(-.4,-.4) ; "$\begin{array}{l}get\\add\\[.5em]\end{array}$"} ln(-1,-1,"",0) ; clab("\status{0??}") tourccw(pi,"$\begin{array}{l}get\\add\\[.5em]\end{array}$") tourcw(pi/4-pi/12,"$S$",dashed) tourccw(pi/4+pi/12,"$S$",dotted) {alncw(pi/4,-3*pi/4-pi/12,1,1,"$S$",dotted)} {aln(pi/4,-3*pi/4+pi/12,1,1,"$S$",dashed)} } {ln(1,-1,"$S$",0) clab("\status{100}") {aln(3*pi/4,-pi/4+pi/12,-1,1,"$add$",dashed)} {alncw(3*pi/4,-pi/4-pi/12,-1,1,"$get$",dotted)} } .PE \end{toimage} \showgraph \caption{\label{adder2} Final automaton for the adder} \end{figure} Information on where runtime testing has to be performed can be inferred from the diagram of figure~\ref{adder2}. For instance, assume that current status is \status{0??} and that a message arrives on~$S$. Since there is at least one message pending on a method, a matching will occur. Tests are needed though, before matching to determine the matching clause, and after matching to determine post-matching status. Abstractly, the first series of tests changes the \status{?} statuses in either \status{0} or \status{N} statuses, while the second series checks if there are still messages pending on names with \status{?} status. We are still investigating on how to organize these tests efficiently without producing too much code (see~\cite{Augustsson85,Maranget92} for a discussion of the size of such code in the context of compiling ML~pattern-matching). By contrast, when status is \status{100} and that a message arrives on $get$ or $add$, then the corresponding matching is known immediately and the message pending on $S$ is consumed. Then, the queue for $S$ is known to be empty and status can be restored to \status{000} with no runtime testing at all. As message arrival order is likely to be first one message on $S$ and then one message on $get$ or $add$ the final automaton of figure~\ref{adder2} responds efficiently to more frequent case, still being able to respond to less frequent cases (for instance, two messages on methods may arrive in a row). Furthermore, when trouble is over, the automaton has status \status{000} and is thus ready for the normal case. In this example, a penalty in code size is paid for improving code speed in the frequent, ``normal'' case, whereas this penalty is avoided in non-frequent cases, which are treated by less efficient code. We introduced a \status{?} status on a name per name basis. However, there are other choices possible: {\em a priori}, there are many ways to merge full automata states into final automata states. However, if one really wants to avoid status space explosion the final automaton should be constructed directly, without first constructing the full automaton. Adopting our per name \status{?} status makes this direct construction possible. Additionally, the \status{?} status can be used by the simple static analyzer as a status for the names it cannot trace (e.g. names that escape their definition scope). This dramatically decreases the size of analyzer output and its running time. \section{Optimizing further} \label{fusion} We here describe a simple transformation on join definitions, which does not rely on a full semantical analysis (such as name usage analysis), but only on a simple, local, syntactical analysis of join-patterns. Let us take a simple example: \begin{verbatim} let S(x) | m_1(y) = P_1(x,y) and S(x) | m_2(y) = P_2(x,y) .... and S(x) | m_n(y) = P_n(x,y) ;; \end{verbatim} In this example, a match occurs only when there are messages pending both on $S$ and on one of the methods $m_1$, $m_2$,\ldots Thus, from the synchronization point of view, all the methods are equivalent. And indeed, we can regroup them into one, single method channel $m$ by transforming this join definition into: \begin{verbatim} let S(x) | m(p,y) = P[p] (x,y);; let m_1(y) = m(1,y);; let m_2(y) = m(2,y);; .... let m_n(y) = m(n,y);; \end{verbatim} Where $P$ is the vector of processes $[P_1,P_2,...,P_n]$. Methods $m_1$ $m_2$,\ldots are now simple wrappers. Method $m_i$ now calls $m$ with an additional $i$~argument, which basically is the index of $P_i$ in array $P$. At this point, we must emphasize that we describe this technique as a source to source transformation only for clarity. However, the produced source code may not be correct with respect to the join type system, when the types of methods are different. Anyhow, this optimization is implemented using ad hoc mechanisms, this both improves efficiency and solves the typing problem. Currently, this optimization is performed by the {\tt jocaml} compiler. This leads to a new interpretation of name indexes by the ``join'' library. The least significant bits in name indexes still encode names that actually take part to synchronization (here $S$ and $m$), while their most significant bits (which were previously unused) now encode the extra $i$~argument. This yields two benefits. First, the number of status checks decreases, as the number of matching statuses decreases. Second, the number of channels that can be defined in one definition can now exceed the hosting system integer size, provided some names can be grouped together for synchronization. In the {\tt join} compiler, this technique might be used to reduce automata size, since it lowers the number of non-matching statuses, by reducing the number of synchronizing names. Code entries for methods $m_1$, $m_2$,\ldots would still be contained in the definition structure, they would only stack the index of the process to fire, and then call the code for method $m$. Moreover, they do not need to be updated after each transition of the automaton. Finally, this technique can also be applied to more complex synchronizations. Given a definition that defines names $x_1$, $x_2$, \ldots, $x_n$, using patterns $J_1$, $J_2$, \ldots $J_m$. We say that two names are equivalent, when swapping them in the patterns yields the same set of patterns. We then replace equivalent names by a single name, plus an index. Consider the following definition \begin{verbatim} let S_1(x) | m_1(y) = P_1(x,y) and S_1(x) | m_2(y) = P_2(x,y) and S_2(x) | m_1(y) = P_3(x,y) and S_2(x) | m_2(y) = P_4(x,y) ;; \end{verbatim} Then the set of defined names $\{S_1, S_2, m_1, m_2\}$ can be partitioned into $\{S_1, S_2\}$ and $\{m_1, m_2\}$. Then, the above program can be transformed into: \begin{verbatim} let S(p,x) | m(q,y) = P[p,q] (x,y);; let m_1(y) = m(1,y);; let m_2(y) = m(2,y);; let S_1(y) = S(1,y);; let S_2(y) = S(2,y);; \end{verbatim} (with $P[1,1] = P_1$, $P[1,2] = P_2$, $P[2,1] = P_3$ and $P[2,2] = P_4$) \section{Conclusion and future work}\cutname{conclusion.html} \label{conclusion} In join-calculus, a name definition, all receptors on that name and all possible synchronizations on that name are grouped altogether in a single join definition. This enables the compilation of synchronization between concurrent or even distributed processes, using finite-state automata. In the distributed case, a message transport phase to the machine that currently hosts the join definition (and hence the automaton) is first performed. This strengthens our point of view that the join-calculus is the core of a distributed programming language that can be compiled in practice, mainly because it restricts reception on a channel to statically known parts of the program. The same argument applied to \`a la ML polymorphic typing in~\cite{join-typing-97}. \begin{cutflow}{Benchmarks}\cutname{benchmarks.html} \aname{bench}{} \begin{table}[ht] \begin{center} \begin{tabular}{l@{\quad}r@{\quad}r@{\quad}r@{\quad}r@{\quad}r} & \texttt{fib} & \texttt{afib} & \texttt{pat} & \texttt{qsort} & \texttt{count}\\ \hline \texttt{join} & 32.0 & 14.5 & 37.2 & 9.9 & 16.4 \\ \texttt{jocaml} & 5.7 & 3.5 & 5.4 & 1.4 & 4.2 \\ \texttt{Bologna} & 11.9 & 6.2 & 9.4 & 16.8 & 5.3 \\ \end{tabular} \end{center} \caption{\label{perf}Some performance measures (wall-clock time, in seconds)} \end{table} Benckmarks sources are available on the \footahref{http://join.inria.fr/speed/}{web} \end{cutflow} Taking a few benchmarks (see table~\ref{perf}, or \ahrefloc{bench}{here}) as a set of sensible join programs, both the {\tt join} and the {\tt jocaml} pattern matching compilation schemes prove adequate. In particular, none of the two schemes falls into the pitfall associated to the compilation technique used. In the {\tt join} case, one can be afraid of code size, the technique exposed in section~\ref{space} successfully avoids code size explosion in practical cases. The {\tt jocaml} technique appears expensive in runtime checks and thus {\em a priori} produces slow code. We choose such a scheme of implementing automata using generic code, because it can be implemented simply by adding code to the Objective Caml bytecode interpreter. Using bytecode specialized for automata manipulation would have implied more important modifications of the Objective Caml bytecode interpreter. Moreover, the {\tt jocaml} system runs faster than the {\tt join} system, even for pure join programs, showing that its weaker compilation of join definitions is more than compensated by its total integration in the Objective Caml system. Comparison with the Bologna implementation~\cite{Bologna} of the join-calculus is also instructive. This system also produces bytecode, which is interpreted by a C~program. It proves faster than {\tt join} and slower that {\tt jocaml} on most of the examples. Taking a glance at the Bologna source code reveals that it uses a scheme very similar to the one of {\tt jocaml}, with two slight differences. First, status is systematically encoded as an array of integers. Second when a message arrives on a name $x$ with an empty queue, all patterns are tested (whereas in {\tt jocaml} only the patterns that contain $x$ are tested). Performance of a given join system depends on many factors. In particular, scheduling policy and message queue management have a dramatic impact on it. Furthermore, a policy that gives good results on one benchmark can be defeated by another. For these reasons, we cannot tell which compilation technique is the best by comparing different implementations. Clearly, we now need to integrate all our compilation techniques in the same system, in order to compare them more thoroughly and to experiment further. However, the definition of reactivity status and the automata of section~\ref{automatas} provide a sound basis for these future investigations. Apart from future language development and fully implementing the failure semantics of the join-calculus, we also plan to investigate more on the implementation of threads, attempting to minimize thread suspension and creation. \bibliography{bib} \bibliographystyle{abbrv} \end{document} %\subsection{Playing with the runtime scheduler} % %Concentrating on the {\it object style} of programming, lots of %methods do not modify the automaton status, but only read or modify %state names (such as {\tt set} and {\tt get}), with only little %non-blocking computations. Most of the time, these methods are never %interrupted, and thus behave as in critical sections from the %threads scheduler point of view. % %As a consequence, when such a method is called, an optimization would %be not to modify the automaton status at all, since the method will %end by giving back its original status to the automaton. To prevent %the automaton to receive other messages from other methods while in an %incoherent state, these methods are executed in a critical section. % %This optimization relies on a simple analysis of methods, which can %also be used to decrease the number of forked threads, since such %methods do not need to be executed in a forked thread. hevea-2.30/examples/env.hva0000644004317100512160000000040006664550201015660 0ustar marangetcristal\newenvironment{flushimage}{\begin{toimage}}{\end{toimage}\imageflush} \newcommand{\epsfbox}[1]{\begin{flushimage}\epsfbox{#1}\end{flushimage}} \newenvironment{centergpic} {\begin{toimage}} {\box\graph\end{toimage}\begin{center}\imageflush\end{center}}hevea-2.30/examples/mp.tex0000644004317100512160000000152712017660721015537 0ustar marangetcristal\documentclass{article} \usepackage{mathpartir} \usepackage[dvips]{color} \begin{document} \section*{Infererence rule} Check vertical alignment. $$ \infer* {\infer*{}{A}\and\infer*{\infer*{B'\and{}B''}{B}\and{}X}{C}} {C \and D} $$ \section*{Mathpar} \subsection*{Command} Command defined inside \texttt{mathpar} environment. \begin{mathpar} \newcommand{\for}[2]{\left#1\begin{array}{cc}1&2\\3&4\end{array}\right#2}% \for\{\} \and \for() \and \for\vert.\\ \for\vert\vert \and \for\lfloor\rfloor \end{mathpar} \subsection*{Font change (orange color)} First cell in black. Three last cells in {\textcolor[named]{Orange}{orange}}. No cell in bold font. {\bfseries This is bold. \begin{mathpar} F(0) = 1 \and \color[named]{Orange}F(1) = 1 \and F(2) = 2 \\ F(n+2) = F(n+1) + F(n) \end{mathpar} This is bold also.} This is normal font in black. \end{document} hevea-2.30/examples/hevea.sty0000644004317100512160000000576212477065533016251 0ustar marangetcristal% hevea : hevea.sty % This is a very basic style file for latex document to be processed % with hevea. It contains definitions of LaTeX environment which are % processed in a special way by the translator. % Mostly : % - latexonly, not processed by hevea, processed by latex. % - htmlonly , the reverse. % - rawhtml, to include raw HTML in hevea output. % - toimage, to send text to the image file. % The package also provides hevea logos, html related commands (ahref % etc.), void cutting and image commands. \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{hevea}[2002/01/11] \RequirePackage{comment} \newif\ifhevea\heveafalse \@ifundefined{ifimagen}{\newif\ifimagen\imagenfalse} \makeatletter% \newcommand{\heveasmup}[2]{% \raise #1\hbox{$\m@th$% \csname S@\f@size\endcsname \fontsize\sf@size 0% \math@fontsfalse\selectfont #2% }}% \DeclareRobustCommand{\hevea}{H\kern-.15em\heveasmup{.2ex}{E}\kern-.15emV\kern-.15em\heveasmup{.2ex}{E}\kern-.15emA}% \DeclareRobustCommand{\hacha}{H\kern-.15em\heveasmup{.2ex}{A}\kern-.15emC\kern-.1em\heveasmup{.2ex}{H}\kern-.15emA}% \DeclareRobustCommand{\html}{\protect\heveasmup{0.ex}{HTML}} %%%%%%%%% Hyperlinks hevea style \newcommand{\ahref}[2]{{#2}} \newcommand{\ahrefloc}[2]{{#2}} \newcommand{\aname}[2]{{#2}} \newcommand{\ahrefurl}[1]{\texttt{#1}} \newcommand{\footahref}[2]{#2\footnote{\texttt{#1}}} \newcommand{\mailto}[1]{\texttt{#1}} \newcommand{\imgsrc}[2][]{} \newcommand{\home}[1]{\protect\raisebox{-.75ex}{\char126}#1} \AtBeginDocument {\@ifundefined{url} {%url package is not loaded \let\url\ahref\let\oneurl\ahrefurl\let\footurl\footahref} {}} %% Void cutting instructions \newcounter{cuttingdepth} \newcommand{\tocnumber}{} \newcommand{\notocnumber}{} \newcommand{\cuttingunit}{} \newcommand{\cutdef}[2][]{} \newcommand{\cuthere}[2]{} \newcommand{\cutend}{} \newcommand{\htmlhead}[1]{} \newcommand{\htmlfoot}[1]{} \newcommand{\htmlprefix}[1]{} \newenvironment{cutflow}[1]{}{} \newcommand{\cutname}[1]{} \newcommand{\toplinks}[3]{} \newcommand{\setlinkstext}[3]{} \newcommand{\flushdef}[1]{} \newcommand{\footnoteflush}[1]{} %%%% Html only \excludecomment{rawhtml} \newcommand{\rawhtmlinput}[1]{} \excludecomment{htmlonly} %%%% Latex only \newenvironment{latexonly}{}{} \newenvironment{verblatex}{}{} %%%% Image file stuff \def\toimage{\endgroup} \def\endtoimage{\begingroup\def\@currenvir{toimage}} \def\verbimage{\endgroup} \def\endverbimage{\begingroup\def\@currenvir{verbimage}} \newcommand{\imageflush}[1][]{} %%% Bgcolor definition \newsavebox{\@bgcolorbin} \newenvironment{bgcolor}[2][] {\newcommand{\@mycolor}{#2}\begin{lrbox}{\@bgcolorbin}\vbox\bgroup} {\egroup\end{lrbox}% \begin{flushleft}% \colorbox{\@mycolor}{\usebox{\@bgcolorbin}}% \end{flushleft}} %%% Style sheets macros, defined as no-ops \newcommand{\newstyle}[2]{} \newcommand{\addstyle}[1]{} \newcommand{\setenvclass}[2]{} \newcommand{\getenvclass}[1]{} \newcommand{\loadcssfile}[1]{} \newenvironment{divstyle}[1]{}{} \newenvironment{cellstyle}[2]{}{} \newif\ifexternalcss %%% Postlude \makeatother hevea-2.30/examples/testsccal.tex0000644004317100512160000000026506541530542017110 0ustar marangetcristal\documentclass{article} \title{A simple test} \date{} \begin{document} \maketitle \section{Have a try now} Testing {\sc small caps} and $\cal CALLIGRAPHIC$ letters. \end{document}hevea-2.30/examples/random-math.tex0000644004317100512160000000246410100006613017314 0ustar marangetcristal\documentclass{article} \usepackage{amssymb} \usepackage{amsmath} %\newcommand{\abc}[1] \setstyles{background:\#bbddee;color:black;padding:3} %{\ensuremath{#1}\begin{toimage}{\huge\ensuremath{#1}}\end{toimage}\imageflush} \title{Random Math} \begin{document} \maketitle $$\oiint ~\theta{}d\theta = \frac{\theta}{2}$$ $$\iiint ~\theta{}d\theta = \frac{\theta}{2}$$ $$(\frac{\pi}{2})$$ $$\textrm{bigl} : \bigl[ \frac{\pi}{2} \bigr] : \textrm{bigr}$$ $$\textrm{Bigl} : \Bigl\{ \frac{\pi}{2}\Bigr\} : \textrm{Bigr}$$ $$\textrm{biggl} : \biggl( \frac{\pi}{2}\biggr) : \textrm{biggr}$$ $$\textrm{Biggl} : \Biggl\{ \frac{\pi}{2} \Biggr\} : \textrm{Biggr}$$ $$1+\frac{a}{1+\cfrac[l]{left-align}{\biggl(1 + \sqrt{left-align}\biggr)}}$$ $$1+\cfrac[r]{\sqrt[5]{right-align}}{1 + right-align}$$ boxed formula outside display mode : $\boxed{\eta \leq \bigl\{\frac{\pi}{2}\bigr\}}$ %outside : $a \xrightarrow[2]{1} b \xleftarrow[4]{3} c$ : display $$a \xrightarrow[2]{1} b \xleftarrow{3} c$$ $$\sqrt[3]{x \star x}~\xrightarrow{\beta} x$$ sqrt outside display mode : $\sqrt[5]{4 \star 4 \star 2} \to \sqrt[3]{4 \star 2}\to \sqrt{4}$ $$output = \sqrt[5]{\frac{100+int}{100} ~\star input}$$ $$\frac{3}{2} ~\simeq \boxed{\eta \leq \Biggl[\frac{\sqrt{\pi}}{2}\Biggr] \xleftarrow{\theta} ~\Theta} ~\succapprox \cfrac[l]{4}{4+4}$$ \end{document}hevea-2.30/examples/HF.ps.bb0000644004317100512160000000003207010411403015576 0ustar marangetcristal%%BoundingBox: 0 0 230 180hevea-2.30/examples/colorcir.eps0000644004317100512160000000431606614121561016725 0ustar marangetcristal%!PS-Adobe-2.0 EPSF-1.2 %%Title: colorcir.ps %%Creator: Ghostscript ps2epsi from colorcir.ps %%CreationDate: Oct 23 14:52 %%For:maranget maranget %%Pages: 1 %%DocumentFonts: Times-Roman %%BoundingBox: 9 33 290 319 save countdictstack mark newpath /showpage {} def %%EndProlog %%Page 1 1 %! 0.5 0.5 scale gsave /Times-Roman findfont 24 scalefont setfont 72 72 translate 0 0 moveto 1 0 0 setrgbcolor (Red) show 72 0 translate 0 0 moveto 0 1 0 setrgbcolor (Green) show 72 0 translate 0 0 moveto 0 0 1 setrgbcolor (Blue) show 72 0 translate 0 0 moveto 1 1 0 setrgbcolor (Yellow) show 72 0 translate 0 0 moveto 1 0 1 setrgbcolor (Pink) show 72 0 translate 0 0 moveto 0 1 1 setrgbcolor (Cyan) show 72 0 translate 0 0 moveto 0.9 0.9 0.9 setrgbcolor ('White') show grestore 0.0 setlinewidth /length 0.1 def /width 0.02 def /hsvcircle { gsave /h 0.0 def 0 4 360 { pop gsave 0.5 0.0 translate newpath 0.0 0.0 moveto length 0.0 lineto length width lineto 0.0 width lineto closepath h 1.0 1.0 sethsbcolor fill %newpath %0.0 0.0 moveto %length 0.0 lineto %length width lineto %0.0 width lineto %closepath %0.0 setgray %stroke grestore /h h 4 360 div add def 4 rotate } for grestore } def /graycircle { gsave /h -1.0 def 0 4 360 { pop gsave 0.5 0.0 translate newpath 0.0 0.0 moveto length 0.0 lineto length width lineto 0.0 width lineto closepath h abs setgray fill %newpath %0.0 0.0 moveto %length 0.0 lineto %length width lineto %0.0 width lineto %closepath %0.0 setgray %stroke grestore /h h 8 360 div add def 4 rotate } for grestore } def 0.0 setlinewidth 0.0 setgray 300 400 translate 500 500 scale 30 rotate 1.0 0.7 scale -30 rotate hsvcircle 0.8 0.8 scale graycircle 0.8 0.8 scale hsvcircle 0.8 0.8 scale graycircle 0.8 0.8 scale hsvcircle 0.8 0.8 scale graycircle 0.8 0.8 scale hsvcircle 0.8 0.8 scale graycircle 0.8 0.8 scale hsvcircle 0.8 0.8 scale graycircle 0.8 0.8 scale hsvcircle 0.8 0.8 scale graycircle 0.8 0.8 scale hsvcircle 0.8 0.8 scale graycircle showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF hevea-2.30/examples/suite-macros.sty0000644004317100512160000000000012017660721017536 0ustar marangetcristalhevea-2.30/examples/cart.tex0000644004317100512160000000153012017660721016046 0ustar marangetcristal\documentclass{article} \let\sty\texttt \begin{document} \title{Coucou\footnote{Coucou} --- Toi\footnote{Toi}} \author{Moi\thanks{Moi}} \date{Aujourd'hui} \maketitle \begin{quote} Default \hacha{} behavior for \sty{article}: all footnotes together, cut at sections. \end{quote} \tableofcontents \part{Grand un} \section{\sty{Un \& vice}} Un\footnote{un}. \subsection{\sty{Un}-Un} Un-Un~\footnote{un-un}. \subsection{\sty{Un}-Deux} Un-Deux~\footnote{un-deux}. \subsection{Un-Trois} Un-Trois~\footnote{un-trois}. \subsubsection{Un-Trois-Un} Un-Trois-Un~\footnote{un-trois-un}. \subsubsection{Un-Trois-Deix} Un-Trois-Deux~\footnote{un-trois-deux}. \subsection{Un-Quatre} Un-Quatre~\footnote{un-quatre}. \section{Deux} Deux\footnote{deux}. \section{Trois} Trois\footnote{trois}. \part{Grand deux} \section{Quatre} Quatre\footnote{quatre}. \end{document} hevea-2.30/examples/st.hva0000644004317100512160000000705410513745760015536 0ustar marangetcristal\newenvironment{symtable}[2][] {\begin{table}\caption{#2}\centering} {\end{table}} \newcommand{\index}[1]{} \newcommand{\idxboth}[2]{} \newcommand{\indexcommand}[2][]{} \newcommand{\X}[2][]{\qqquad$#2$\quad\texttt{\string#2}} \newcommand{\NX}[2][]{\qquad``\cmd{#2}'' not available} \def\K#1{\qqquad{#1}\quad\texttt{\string#1}}\let\Kp\K\let\Kt\K \def\Ks#1{\qqquad{#1}\quad\texttt{\string#1}$^{*}$} \def\Q#1{\qquad{#1{A}#1{a}}\quad\texttt{\string#1\{A\}\string#1\{a\}}} \def\QQ#1#2#3{\qquad{#1{#2}#1{#3}}\quad\texttt{\string#1\{#2\}\string#1\{#3\}}} \def\W#1#2{\qquad{$#1{#2}$}\quad\texttt{\string#1\{#2\}}} \def\WD#1#2#3{\qquad$$\mbox{$#1{#2}$}\quad{#1{#2}}\quad\texttt{\string#1\{#2\}#3}$$} \let\Qt\Q\let\Qc\Q \newcommand{\NQ}[1]{\qquad``\cmd{#1}'' not available} \newcommand{\NK}[1]{\qquad``\cmd{#1}'' not available} \newcommand{\NW}[3]{\qquad``\cmd{#1}#3'' not available} \let\Qv\NQ\def\QivBAR{\Qiv{\|}}\let\Qiv\NQ \newcommand{\V}[2][]{\qqquad{#2}\quad\texttt{\string#2}}\let\Vp\V \newcommand{\NV}[2][]{\qquad``\cmd{#2}'' not available} \newcommand{\R}[2][] {\qqquad$$\mbox{$#2$}\quad#2\quad\mbox{\texttt{\string#2}}$$} \newcommand{\N}[2][] {\qqquad$$\mbox{$#2$}\quad\left#2\begin{array}{c}1\\2\\3\end{array}\right.\quad\mbox{\texttt{\string#2}}$$} \let\Y\N \newcommand{\Z}[1]{\qquad\cmd{#1}} \def\latexE{LaTeX2e}\def\latex{latex} \newenvironment{tablenote}[1][] {\begin{flushleft}\begin{description}\item[#1]} {\end{description}\end{flushleft}} \def\qqquad{\quad\quad\quad} \let\pkgname\textsf\def\TC{\pkgname{textcomp}} \newcommand{\fntenc}[1][]{font encoding} \let\vref\ref %%%%%%%%%%%%%%%%%%%%%%% \newcommand{\twosymbolmessage}{% \begin{tablenote} Where two symbols are present, the left one is the ``faked'' symbol that \latexE{} provides by default, and the right one is the ``true'' symbol that \TC\ makes available. \end{tablenote} } \newcommand{\notpredefinedmessage}{% \begin{tablenote}[*] Not predefined in \latexE. Use one of the packages \pkgname{latexsym}, \pkgname{amsfonts}, \pkgname{amssymb}, \pkgname{txfonts}, \pkgname{pxfonts}, or \pkgname{wasysym}. \end{tablenote} } \newcommand{\notpredefinedmessageABX}{% \begin{tablenote}[*] Not predefined in \latexE. Use one of the packages \pkgname{latexsym}, \pkgname{amsfonts}, \pkgname{amssymb}, \pkgname{mathabx}, \pkgname{txfonts}, \pkgname{pxfonts}, or \pkgname{wasysym}. \end{tablenote} } \newcommand{\usetextmathmessage}[1][]{% \begin{tablenote}[#1] It's generally preferable to use the corresponding symbol from Table~\vref{math-text} because the symbols in that table work properly in both text mode and math mode. \end{tablenote} } \newif\ifAMS\AMSfalse \newcommand{\cmd}[2][]{\texttt{\string#2}} \newcommand{\cmdX}[1]{\cmd{#1}} \newcommand{\cmdI}[2][]{\cmd{#2}} \let\cmdW\cmd \newif\ifFC\FCfalse \newcommand\FC{\pkgname{fc}} \newif\ifVIET \newcommand\VIET{\pkgname{vntex}} \newif\ifMDOTS\MDOTSfalse \newcommand\MDOTS{\pkgname{mathdots}} \newif\ifhavecancel\havecancelfalse \newif\ifFRAC\FRACfalse \newcommand{\ABX}{\pkgname{ABX}} \def\idxCTAN{} \newcommand{\vphantom}[1]{#1} \renewcommand{\hbox}[1]{} \newcommand{\AMS}{\mbox{\cal{}AMS}} \iftext\usepackage[latin1]{inputenc}\fi \renewcommand{\cite}[1]{} \newcommand{\unavail}[1]{No} \let\textxleftarrow\unavail \let\textxrightarrow\unavail \let\textoverleftarrow\unavail \let\textoverrightarrow\unavail \let\textunderleftarrow\unavail \let\textunderrightarrow\unavail \let\textoverbrace\unavail \let\textunderbrace\unavail \let\textoverleftrightarrow\unavail \let\textunderleftrightarrow\unavail \usepackage{url} \input{urlhref.hva}hevea-2.30/examples/graphics.tex0000644004317100512160000000207511330060611016707 0ustar marangetcristal\documentclass{article} \usepackage{graphics} \newstyle{IMG}{border:solid 2px;} \newstyle{BODY}{background:gray;} \begin{document} \section{Commande \texttt{\char92 includegraphics}} \label{include} %\label{zobi} \begin{center} \includegraphics{HF.ps} \end{center} \includegraphics*[1cm,1cm]{HF.ps} \label{autre} \section{Commandes \texttt{\char92 scalebox} et \texttt{\char92 resizebox}} \begin{center} \scalebox{.5}{\includegraphics{HF.ps}} \end{center} Scaled .2 \scalebox{.2}[1]{\includegraphics{HF.ps}} Scaled .4 \scalebox{.4}[1]{\includegraphics{HF.ps}} Scaled .6 \scalebox{.6}[1]{\includegraphics{HF.ps}} \resizebox{1cm}{!}{\includegraphics{HF.ps}} \resizebox{2cm}{!}{\includegraphics{HF.ps}} \resizebox{4cm}{!}{\includegraphics{HF.ps}} \resizebox{8cm}{!}{\includegraphics{HF.ps}} \section{Transformations} \rotatebox{45}{\scalebox{.5}{\includegraphics{HF.ps}}} \newcommand{\monrot}[2]{\rotatebox{#1}{#2}} \monrot{135}{\scalebox{.5}{\includegraphics{HF.ps}}} \reflectbox{\includegraphics{HF.ps}} La premi\`ere section est~\ref{include} ou~\ref{autre}. \end{document} hevea-2.30/examples/cbook.tex0000644004317100512160000000147312021356336016217 0ustar marangetcristal\documentclass{book} \usepackage{hevea} \begin{document} \title{Coucou\footnote{Coucou} --- Toi\footnote{Toi}} \author{Moi\thanks{Moi}} \date{Aujourd'hui} \maketitle \begin{quote} Default \hacha{} behavior for \texttt{book}: \begin{enumerate} \item Title footnotes in this file\footnote{This one in extra file}. \item Cut at chapters. \item Chapter footnotes at the end of chapter files. \end{enumerate} \end{quote} \tableofcontents \part{Grand un} \chapter{Un} Un\footnote{un}. \chapter{Deux} Deux\footnote{deux}. \chapter{Trois} Trois\footnote{There was a slight glitch, this footnote \emph{should} appear at the end of its chapter file}. \part{Grand deux\footnote{strange, in its own file.}} \chapter{Quatre} \section{Quatre.Un} Quatre\footnote{quatre.un}. \section{Quatre.Deux} Quatre\footnote{quatre.deux}. \end{document} hevea-2.30/examples/cart-bis.tex0000644004317100512160000000156212017660721016626 0ustar marangetcristal\documentclass{article} \renewcommand{\cuttingunit}{part} \flushdef{part} \setcounter{cuttingdepth}{2}. \begin{document} \title{Coucou\footnote{Coucou} --- Toi\footnote{Toi}} \author{Moi\thanks{Moi}} \date{Aujourd'hui} \maketitle \begin{quote} Non-default \hacha{} behavior for \texttt{article}: cut at parts, flush footnotes at parts. \end{quote} \part{Grand un} \section{Un} Un\footnote{un}. \subsection{Un-Un} Un-Un~\footnote{un-un}. \subsection{Un-Deux} Un-Deux~\footnote{un-deux}. \subsection{Un-Trois} Un-Trois~\footnote{un-trois}. \subsubsection{Un-Trois-Un} Un-Trois-Un~\footnote{un-trois-un}. \subsubsection{Un-Trois-Deux} Un-Trois-Deux~\footnote{un-trois-deux}. \subsection{Un-Quatre} Un-Quatre~\footnote{un-quatre}. \section{Deux} Deux\footnote{deux}. \section{Trois} Trois\footnote{trois}. \part{Grand deux} \section{Quatre} Quatre\footnote{quatre}. \end{document} hevea-2.30/examples/cart-ter.tex0000644004317100512160000000157012017660721016642 0ustar marangetcristal\documentclass{article} \renewcommand{\cuttingunit}{section} \flushdef{part} \setcounter{cuttingdepth}{2}. \begin{document} \title{Coucou\footnote{Coucou} --- Toi\footnote{Toi}} \author{Moi\thanks{Moi}} \date{Aujourd'hui} \maketitle \begin{quote} Non-default \hacha{} behavior for \texttt{article}: cut at sections, flush footnotes at parts. \end{quote} \part{Grand un} \section{Un} Un\footnote{un}. \subsection{Un-Un} Un-Un~\footnote{un-un}. \subsection{Un-Deux} Un-Deux~\footnote{un-deux}. \subsection{Un-Trois} Un-Trois~\footnote{un-trois}. \subsubsection{Un-Trois-Un} Un-Trois-Un~\footnote{un-trois-un}. \subsubsection{Un-Trois-Deux} Un-Trois-Deux~\footnote{un-trois-deux}. \subsection{Un-Quatre} Un-Quatre~\footnote{un-quatre}. \section{Deux} Deux\footnote{deux}. \section{Trois} Trois\footnote{trois}. \part{Grand deux} \section{Quatre} Quatre\footnote{quatre}. \end{document} hevea-2.30/examples/lis2.tex0000644004317100512160000000050510545256233015772 0ustar marangetcristal\documentclass{article} \usepackage{listings} \lstavoidwhitepre \lstset{language=Caml} \lstset{keywordstyle=\textbf,commentstyle=\emph} \begin{document} \section*{Code that should copy-paste properly} \begin{lstlisting} let x = 1 in x+x (* Two lines *) \end{lstlisting} There should be indentation above! \end{document} hevea-2.30/examples/pat.hva0000644004317100512160000000044206772723025015670 0ustar marangetcristal\def\tuple#1{(#1)} \def\inu#1{^{i \in 1\ldots #1}} \def\Def{\mathtt{\upshape let}~} \def\And{~\mathtt{\upshape and}~} \def\dd{{\cal D}} \def\pp{{\cal P}} \def\su{\varphi} \def\redstruct{\leftrightarrow} \def\heat{\rightarrow} \def\cool{\leftarrow} \def\redsoupe{\Rightarrow} \let\name\relaxhevea-2.30/examples/graphicx.tex0000644004317100512160000000114007415373521016724 0ustar marangetcristal\documentclass{article} \usepackage{graphicx} \setkeys{Gin}{width=4cm} \DeclareGraphicsExtensions{{.ps}} \DeclareGraphicsRule{.ps.gz}{eps}{.ps.bb}{} \begin{document} \section{Commande \texttt{\char92 includegraphics}} \begin{center} \includegraphics{HF} \end{center} \includegraphics{HF.ps.gz} \includegraphics*[draft, width=2cm]{HF.ps} \section{Rotations} \rotatebox[origin=c]{45}{\scalebox{.5}{\includegraphics{HF.ps}}} \newcommand{\monrot}[3][]{\rotatebox[#1]{#2}{#3}} \monrot[origin=b]{135}{\scalebox{.5}{\includegraphics{HF.ps}}} \monrot{135}{\scalebox{.5}{\includegraphics{HF.ps}}} \end{document} hevea-2.30/examples/smile.tex0000644004317100512160000000031206614121561016223 0ustar marangetcristal\documentstyle{article} \begin{document} \newenvironment{centergpic}{}{\begin{center}~\box\graph~\end{center}} \begin{centergpic} .PS ellipse "{\Large\bf Smile!}" .PE \end{centergpic} \end{document}hevea-2.30/examples/di.tex0000644004317100512160000000114710513745760015523 0ustar marangetcristal\documentclass{article} \newcommand{\zyva}[2] {\left#1\begin{array}{cc}\hline\hline1&2\\3&4\end{array}\right#2} \begin{document} Fraction is centered: $$ \zyva{[}{]} \times \zyva{\lceil}{\rfloor} \over \zyva{(}{)} $$ You can see arrows: $$\newcommand{\demo}[1]{\quad\quad#1{1 \times 2 \times \cdots \times n}\quad\texttt{\string#1}}% \begin{array}{cc} \demo{\overleftarrow} & \demo{\overrightarrow} \end{array} $$ The arrow extends properly $$\overrightarrow{1234567890}$$ The arrows extend properly $$ \alpha\quad\overrightarrow{1234567890}\quad\beta\quad\overleftarrow{9876543210}\quad\gamma $$ \end{document} hevea-2.30/examples/verbs.tex0000644004317100512160000000267512017700472016247 0ustar marangetcristal\documentclass{article} \usepackage[latin1]{inputenc} \usepackage{moreverb} \begin{document} \section*{Les environnements de positionnement} \subsection*{D'abord quelques imbriqués simples} \begin{center} Je centre. \begin{flushleft} Je fer à gauche. \begin{flushright} Je fer à droite. \end{flushright} \end{flushleft} \end{center} \subsection*{Ensuite quelques tables dans les flush} Il faut positionner la table, mais ne pas hériter des positionnements de texte (si j'ai bien compris). \begin{center} Je centre une table.\\ \begin{tabular}{rcl} Coucou & = & Z\\ Z & = & Coucou (zobi, la mouche)\\ \end{tabular} \begin{flushleft} Je fer à gauche.\\ \begin{tabular}{rcl} Coucou & = & Z\\ Z & = & Coucou (zobi, la mouche)\\ \end{tabular} \begin{flushright} Je fer à droite.\\ \begin{tabular}{rcl} Coucou & = & Z\\ Z & = & Coucou (zobi, la mouche)\\ \end{tabular} \end{flushright} \end{flushleft} \end{center} \section*{Les \texttt{verbatim} dans les environnements} \begin{boxedverbatim} Coucou j'essaie le verbatim dans une boîte. Ça a l'air de fonctionner. \end{boxedverbatim} \begin{flushright} \begin{verbatim} Coucou j'essaie le verbatim dans un flushright. Et bien ça a l'air de fonctionner. C'est à dire que c'est bien à gauche ! \end{verbatim} \end{flushright} \begin{center} \begin{verbatim} Coucou j'essaie le verbatim dans un center. Et bien ça a l'air de fonctionner. C'est à dire que c'est bien à gauche ! \end{verbatim} \end{center} \end{document} hevea-2.30/examples/env.tex0000644004317100512160000000413210506164474015713 0ustar marangetcristal\documentclass{article} \usepackage{epsf} \usepackage[latin1]{inputenc} \usepackage{../hevea} \title{Test de des environnements d'\hevea} \begin{document} \section{Du \LaTeX, sinon rien} \newcommand{\essai}[1]{% \begin{answer}% #1% \end{answer}} \newenvironment{answer}{\begin{latexonly}}{\end{latexonly}} \essai{Visible en \LaTeX.} \begin{htmlonly} \renewenvironment{answer}{\begin{htmlonly}}{\end{htmlonly}} \essai{\red Doit apparaître (en rouge) en \hevea.} \essai{Visible et noir et en \hevea.} \end{htmlonly} \section{Image d'une citation en \LaTeX} \newenvironment{quoteimage} {\begin{toimage}\begin{quote}} {\end{quote}\end{toimage}\imageflush}% \newenvironment{showlatex} {\begin{center}\rule{\linewidth}{.1ex}\begin{quoteimage}} {\end{quoteimage}\end{center}}% \begin{showlatex} \begin{flushright} Ceci est une citation de deux lignes,\\ avec fer \begin{em}à droite\end{em}. \end{flushright} \end{showlatex} La même dans une macro: \newcommand{\essaibis}[1]{\begin{showlatex}#1\end{showlatex}} \essaibis{\begin{flushleft} Ceci est une citation de deux lignes,\\ avec fer \begin{em}à gauche\end{em}. \end{flushleft}} \section{Commentaires \texttt{latexonly}} Ici on ne doit plus rien voir en \html{} %BEGIN LATEX En \LaTeX seulement %END LATEX \newenvironment{foo}{% %HEVEA\begin{latexonly} \begin{center}}{% \end{center} %HEVEA\end{latexonly}% } \begin{foo} Centré en \LaTeX. \end{foo} \section{Les environments \texttt{verblatex} et \texttt{verbimage}} \begin{verblatex} En \LaTeX{} seulement \end{verblatex} \begin{verbimage} Dans l'image et dans elle sans problèmes. %# \end{verbimage} \imageflush \section{Une image Postscript plus ou moins automatique} Voici l'image, directe~: \begin{center} \epsfbox{colorcir.eps} \end{center} Voici l'image avec changement de taille~: \begin{center} %HEVEA\begin{toimage} \def\epsfsize#1#2{.5#1} \epsfbox{colorcir.eps} %HEVEA\end{toimage} %HEVEA\imageflush \end{center} \section{Plus sur \texttt{gpic}} \newenvironment{centergpic}{}{\begin{center}~\box\graph~\end{center}} \begin{centergpic} .PS ellipse "{\Large\bf Smile!}" .PE \end{centergpic} \end{document}hevea-2.30/examples/hp.c0000644004317100512160000000416106720317573015161 0ustar marangetcristal#include #include typedef struct cell { int val; struct cell *next; } Cell, *Stack; Stack stack = NULL; Cell *cons(int val,Cell *next) { Cell *r; r = (Cell *)malloc(sizeof(Cell)); if ( r == NULL) { fprintf(stderr,"Plus de memoire\n"); exit(-1); } r->val = val; r->next = next; return r; } void afficher(void) { Stack p; printf("["); for (p=stack ; p != NULL ; p = p->next) { printf("%d",p->val); if (p->next != NULL) printf(", "); } printf("]"); } Tree pop(void) { Tree r; Stack tmp; if (stack == NULL) { fprintf(stderr,"Tentative de depiler une pile vide, adieu\n"); exit(-1); } r = stack->val; tmp = stack; stack = stack->next; free(tmp); return r; } void push(i) { stack = cons(i,stack); } void swap(void) { int t; if (stack == NULL || stack->next == NULL) return; t = stack->val; stack->val = stack->next->val; stack->next->val = t; return; } void down(void) { Stack p,q; if (stack == NULL) return; for (p = stack ; p->next->next != NULL ; p = p->next) ; q = p->next; p->next = NULL; q->next = stack; stack = q; } void up(void) { Stack p,q; if (stack == NULL || stack->next == NULL) return; for (p = stack ; p->next != NULL ; p = p->next) ; q = stack; stack = stack->next; q->next = NULL; p->next = q; } void main(void) { char pgm[] = "4321ud"; char c; int i; int r1,r2; printf(" "); afficher(); printf("\n"); for(i=0; pgm[i] != '\0'; i++) { c = pgm[i]; switch (c) { case '+': r1 = pop(); r2 = pop(); push(r2+r1); break; case '-': r1 = pop(); r2 = pop(); push(r2-r1); break; case '*': r1 = pop(); r2 = pop(); push(r2*r1); break; case '/': r1 = pop(); r2 = pop(); push(r2/r1); break; case 's': swap(); break; case 'd': down(); break; case 'u': up(); break; default: if ('0' <= c && c <= '9') push(c - '0'); } printf("%c : ",c); afficher(); printf("\n"); } } hevea-2.30/examples/natbib.sty0000644004317100512160000011310010634250756016376 0ustar marangetcristal%% %% This is file `natbib.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% natbib.dtx (with options: `package,all') %% ============================================= %% IMPORTANT NOTICE: %% %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License Distributed from CTAN %% archives in directory macros/latex/base/lppl.txt; either %% version 1 of the License, or any later version. %% %% This is a generated file. %% It may not be distributed without the original source file natbib.dtx. %% %% Full documentation can be obtained by LaTeXing that original file. %% Only a few abbreviated comments remain here to describe the usage. %% ============================================= %% Copyright 1993-2007 Patrick W Daly %% Max-Planck-Institut f\"ur Sonnensystemforschung %% Max-Planck-Str. 2 %% D-37191 Katlenburg-Lindau %% Germany %% E-mail: daly@mps.mpg.de \NeedsTeXFormat{LaTeX2e}[1995/06/01] \ProvidesPackage{natbib} [2007/02/05 8.0 (PWD)] % This package reimplements the LaTeX \cite command to be used for various % citation styles, both author-year and numerical. It accepts BibTeX % output intended for many other packages, and therefore acts as a % general, all-purpose citation-style interface. % % With standard numerical .bst files, only numerical citations are % possible. With an author-year .bst file, both numerical and % author-year citations are possible. % % If author-year citations are selected, \bibitem must have one of the % following forms: % \bibitem[Jones et al.(1990)]{key}... % \bibitem[Jones et al.(1990)Jones, Baker, and Williams]{key}... % \bibitem[Jones et al., 1990]{key}... % \bibitem[\protect\citeauthoryear{Jones, Baker, and Williams}{Jones % et al.}{1990}]{key}... % \bibitem[\protect\citeauthoryear{Jones et al.}{1990}]{key}... % \bibitem[\protect\astroncite{Jones et al.}{1990}]{key}... % \bibitem[\protect\citename{Jones et al., }1990]{key}... % \harvarditem[Jones et al.]{Jones, Baker, and Williams}{1990}{key}... % % This is either to be made up manually, or to be generated by an % appropriate .bst file with BibTeX. % Author-year mode || Numerical mode % Then, \citet{key} ==>> Jones et al. (1990) || Jones et al. [21] % \citep{key} ==>> (Jones et al., 1990) || [21] % Multiple citations as normal: % \citep{key1,key2} ==>> (Jones et al., 1990; Smith, 1989) || [21,24] % or (Jones et al., 1990, 1991) || [21,24] % or (Jones et al., 1990a,b) || [21,24] % \cite{key} is the equivalent of \citet{key} in author-year mode % and of \citep{key} in numerical mode % Full author lists may be forced with \citet* or \citep*, e.g. % \citep*{key} ==>> (Jones, Baker, and Williams, 1990) % Optional notes as: % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2) % \citep[e.g.,][]{key} ==>> (e.g., Jones et al., 1990) % \citep[see][pg. 34]{key}==>> (see Jones et al., 1990, pg. 34) % (Note: in standard LaTeX, only one note is allowed, after the ref. % Here, one note is like the standard, two make pre- and post-notes.) % \citealt{key} ==>> Jones et al. 1990 % \citealt*{key} ==>> Jones, Baker, and Williams 1990 % \citealp{key} ==>> Jones et al., 1990 % \citealp*{key} ==>> Jones, Baker, and Williams, 1990 % Additional citation possibilities (both author-year and numerical modes) % \citeauthor{key} ==>> Jones et al. % \citeauthor*{key} ==>> Jones, Baker, and Williams % \citeyear{key} ==>> 1990 % \citeyearpar{key} ==>> (1990) % \citetext{priv. comm.} ==>> (priv. comm.) % \citenum{key} ==>> 11 [non-superscripted] % Note: full author lists depends on whether the bib style supports them; % if not, the abbreviated list is printed even when full requested. % % For names like della Robbia at the start of a sentence, use % \Citet{dRob98} ==>> Della Robbia (1998) % \Citep{dRob98} ==>> (Della Robbia, 1998) % \Citeauthor{dRob98} ==>> Della Robbia % % % Citation aliasing is achieved with % \defcitealias{key}{text} % \citetalias{key} ==>> text % \citepalias{key} ==>> (text) % % Defining the citation mode and punctual (citation style) % \setcitestyle{} % Example: \setcitestyle{square,semicolon} % Alternatively: % Use \bibpunct with 6 mandatory arguments: % 1. opening bracket for citation % 2. closing bracket % 3. citation separator (for multiple citations in one \cite) % 4. the letter n for numerical styles, s for superscripts % else anything for author-year % 5. punctuation between authors and date % 6. punctuation between years (or numbers) when common authors missing % One optional argument is the character coming before post-notes. It % appears in square braces before all other arguments. May be left off. % Example (and default) \bibpunct[, ]{(}{)}{;}{a}{,}{,} % % To make this automatic for a given bib style, named newbib, say, make % a local configuration file, natbib.cfg, with the definition % \newcommand{\bibstyle@newbib}{\bibpunct...} % Then the \bibliographystyle{newbib} will cause \bibstyle@newbib to % be called on THE NEXT LATEX RUN (via the aux file). % % Such preprogrammed definitions may be invoked anywhere in the text % by calling \citestyle{newbib}. This is only useful if the style specified % differs from that in \bibliographystyle. % % With \citeindextrue and \citeindexfalse, one can control whether the % \cite commands make an automatic entry of the citation in the .idx % indexing file. For this, \makeindex must also be given in the preamble. % % Package Options: (for selecting punctuation) % round - round parentheses are used (default) % square - square brackets are used [option] % curly - curly braces are used {option} % angle - angle brackets are used
  • " ; Out.put out "
  • " ; Out.put out "" ; Out.put out s ; Out.put out "\n" and itemanchor fst_item filename label s out = let filename = check_changed filename in if not fst_item then Out.put out "
  • " ; Out.put out "
  • " ; Out.put out " Out.put_char out c) (fun s -> Out.put out s) label ; Out.put out "\">" ; Out.put out s ; Out.put out "\n" ;; let delayed_anchor = ref false and prev_anchor = ref None let do_putanchor label out = Out.put out "" ;; let putanchor label out = if !delayed_anchor then prev_anchor := Some (label, out) else do_putanchor label out let putlink out name txt = let name = check_changed name in Out.put out "" ; Out.put out txt ; Out.put out "\n" ;; let link_buff = Out.create_buff "link-buf" let putlinks name = let links_there = ref false in if verbose > 0 then prerr_endline ("putlinks: "^name) ; begin try putlink link_buff (Thread.prev name) (get_env "PREVTXT") ; links_there := true with Not_found -> if verbose > 0 then prerr_endline ("No prev link for "^name) end ; begin try putlink link_buff (Thread.up name) (get_env "UPTXT") ; links_there := true with Not_found -> () end ; begin try putlink link_buff (Thread.next name) (get_env "NEXTTXT") ; links_there := true with Not_found -> () end ; if !links_there then Some (Out.to_string link_buff) else None let putlinks_start out outname = if cross_links then match putlinks outname with | Some s -> some_links := true ; Out.put out s ; Out.put out "
    \n" | None -> () let putlinks_end out outname = if cross_links then match putlinks outname with | Some s -> some_links := true ; Out.put out "
    \n" ; Out.put out s | None -> () type file_opt = { with_footer : bool ; with_links : bool ; } let std_file_opt = { with_footer=true; with_links=true ; } let openhtml opt title out outname = Out.put out !doctype ; Out.put_char out '\n' ; Out.put out !html ; Out.put_char out '\n' ; Out.put out "" ; Out.put out !common_headers; Out.put out "" ; let title = let title = !html_prefix^title in try Tagout.tagout title with Tagout.Error -> Location.print_pos () ; eprintf "Warning, cannot erase tags from '%s'\n%!" title ; title in Out.put out title ; Out.put out "\n" ; Out.put out "\n" ; Out.put out !body; Out.put out "\n" ; if opt.with_links then putlinks_start out outname ; if opt.with_footer then Out.put out !html_head and closehtml opt name out = if opt.with_footer then Out.put out !html_foot ; if opt.with_links then putlinks_end out name ; Out.put out "\n" ; Out.put out "\n" ; close_loc "closehtml" name out ;; let put s = Out.put !out s and put_char c = Out.put_char !out c ;; let cur_level = ref (Section.value "DOCUMENT") and chapter = ref (Section.value "CHAPTER") and depth = ref 2 ;; (* Open all lists in toc from chapter to sec, with sec > chapter *) let rec do_open l1 l2 = if l1 < l2 then begin begin match toc_style with | Both -> openlist !toc ; openlist !out_prefix | Special -> openlist !out_prefix | Normal -> openlist !toc end ; do_open (l1+1) l2 end ;; (* close from l1 down to l2 *) let rec do_close l1 l2 = if l1 > l2 then begin begin match toc_style with | Both -> closelist !toc ; closelist !out_prefix | Special -> closelist !out_prefix | Normal -> closelist !toc end ; do_close (l1-1) l2 end else cur_level := l1 ;; let anchor = ref 0 ;; let open_section sec name a = if !phase > 0 then begin let fst_item = if !cur_level > sec then begin do_close !cur_level sec ; false end else if !cur_level < sec then begin do_open !cur_level sec ; true end else false in let label = match a with | Some label -> label | None -> incr anchor ; "toc"^string_of_int !anchor in begin match toc_style with | Normal -> itemanchor fst_item !outname label name !toc ; | Both -> itemanchor fst_item !outname label name !toc ; itemanchor fst_item !outname label name !out_prefix | Special -> itemanchor fst_item !outname label name !out_prefix end ; begin match a with | Some _ -> () | None -> putanchor label !out end ; cur_level := sec end else cur_level := sec and close_section sec = if !phase > 0 then do_close !cur_level sec else cur_level := sec ;; let close_chapter () = if verbose > 0 then prerr_endline ("Close chapter out="^ !outname^" toc="^ !tocname) ; if !phase > 0 then begin if !outname <> !tocname then begin closehtml std_file_opt !outname !out ; let doout out what = if false then begin eprintf "DEBUG:\n" ; Out.debug stderr what ; eprintf "\n" end ; Out.to_chan out what in begin match toc_style with | Both|Special -> let real_out = real_open_out !outname in (* Those hacking try with avoid failure for cuttingsection = document *) begin try doout real_out !out_prefix with Misc.Fatal _ -> () end ; begin try doout real_out !out ; with Misc.Fatal _ -> () end ; close_out real_out | Normal -> () end ; end ; out := !toc end else begin lastclosed := !outname ; outname := !tocname end and open_chapter fst_item name = outname := new_filename ("open_chapter <<"^name^">>") ; if verbose > 0 then prerr_endline ("Open chapter out="^ !outname^" toc="^ !tocname^ " cur_level="^string_of_int !cur_level) ; if !phase > 0 then begin begin match toc_style with | Both|Special -> out_prefix := Out.create_buff (!outname ^ "-prefix") ; out := !out_prefix ; openhtml std_file_opt name !out_prefix !outname | Normal -> out := Out.create_chan (real_name !outname) ; openhtml std_file_opt name !out !outname end ; itemref fst_item !outname name !toc ; cur_level := !chapter end else begin if verbose > 0 then prerr_endline ("link prev="^ !lastclosed^" next="^ !outname) ; Thread.setup !outname !tocname ; Thread.setprevnext !lastclosed !outname ; cur_level := !chapter end ;; let setlink set target = if !phase = 0 && target <> "" then set !outname target let open_notes_pred sec_notes = (sec_notes <> !chapter) || (!cur_level < sec_notes) let open_notes sticky sec_notes = if verbose > 0 && !phase > 0 then Printf.eprintf "Notes flushed as %s (current cut is %s, current level is %s)\n" (Section.pretty sec_notes) (Section.pretty !chapter) (Section.pretty !cur_level) ; if not sticky && open_notes_pred sec_notes then begin otheroutname := !outname ; outname := new_filename "open_notes" ; if !phase > 0 then begin otherout := !out ; out := Out.create_chan (real_name !outname) ; Out.put !out !doctype ; Out.put_char !out '\n' ; Out.put !out !html ; Out.put_char !out '\n' ; Out.put !out "Notes\n" ; Out.put !out !common_headers ; Out.put !out "\n" ; Out.put !out !body ; Out.put !out "\n" end end else otheroutname := "" and close_notes () = if !otheroutname <> "" then begin Out.put !out "\n\n" ; close_loc "notes" !outname !out ; outname := !otheroutname ; out := !otherout ; otheroutname := "" end ;; let toc_buf = Out.create_buff "toc-buf" and arg_buf = Out.create_buff "arg-buf" ;; let stack = MyStack.create "main" ;; let save_state newchapter newdepth = if verbose > 0 then prerr_endline ("New state: "^string_of_int newchapter) ; push stack (!outname, MyStack.save flowname_stack, MyStack.save flow_stack, !chapter,!depth,!toc,!tocname,!cur_level,!lastclosed,!out_prefix) ; chapter := newchapter ; depth := newdepth ; tocname := !outname ; lastclosed := "" ; toc := !out ;; let restore_state () = if verbose > 0 then prerr_endline ("Restore") ; let oldoutname, oldflowname, oldflow, oldchapter,olddepth,oldtoc,oldtocname, oldlevel,_oldlastclosed,oldprefix = pop stack in outname := oldoutname ; MyStack.restore flowname_stack oldflowname ; MyStack.restore flow_stack oldflow ; chapter := oldchapter ; depth := olddepth ; toc := oldtoc ; tocname := oldtocname ; lastclosed := !lastclosed ; cur_level := oldlevel ; out_prefix := oldprefix ;; let hevea_footer = ref false let hevea_footer_buff = Out.create_buff "hevea-footer-buf" let close_top lxm = Out.put !toc !html_foot ; putlinks_end !toc !tocname ; if !hevea_footer then begin Out.put !out "\n" ; Out.copy hevea_footer_buff !out end ; Out.put !toc lxm ; if !tocname = "" then Out.flush !toc else close_loc "top" !tocname !toc ;; let open_toc () = if !phase > 0 then openlist !toc and close_toc () = if !phase > 0 then closelist !toc ;; let close_all () = if !cur_level > !chapter then begin close_section !chapter ; close_chapter () ; close_toc () end else if !cur_level = !chapter then begin close_chapter () ; close_toc () end ; cur_level := (Section.value "DOCUMENT") let openflow with_footer title = let new_outname = new_filename "openflow" in push flowname_stack (!outname,with_footer) ; outname := new_outname ; if !phase > 0 then begin push flow_stack !out ; out := Out.create_chan (real_name !outname) ; let opt = { with_footer=with_footer; with_links=false; } in openhtml opt title !out !outname end and closeflow () = let prev_out, with_footer = pop flowname_stack in if !phase > 0 then begin let opt = { with_links=false; with_footer=with_footer; } in closehtml opt !outname !out; out := pop flow_stack end ; outname := prev_out } let alpha = ['a'-'z' 'A'-'Z'] let secname = alpha+ let blank = [' ''\t''\n'] let tag = ['a'-'z''A'-'Z''0'-'9']+ let anchor = ['a'-'z''A'-'Z''0'-'9']+ let class_name = ['a'-'z''A'-'Z''0'-'9''-']+ let attr_name = ['a'-'z''A'-'Z']['a'-'z''A'-'Z''-''0'-'9'':']* rule main = parse | "" '\n'? {let lxm = lexeme lexbuf in if !phase > 0 then begin put lxm ; put ("\n" end ; main lexbuf} | "" '\n'? {closeflow () ; main lexbuf} | "" {really_putanchor () ; main lexbuf } *) | "" { Section.set_style style ; main lexbuf } | "" blank* {if !phase > 0 then begin put_char '\n' ; match toc_style with | Both|Special when !out == !out_prefix -> out := Out.create_buff "out-buf" | _ -> () end ; main lexbuf} | "" '\n'? {close_all () ; restore_state () ; main lexbuf} | "" '\n'? {if !otheroutname <> "" then close_notes (); main lexbuf} | " 0 then put (lexeme lexbuf) ; aargs lexbuf} | "" '\n' ? {let head = save_html lexbuf in if !phase = 0 then html_head := head else Out.put !out head; main lexbuf} | "" '\n' ? {let foot = save_html lexbuf in if !phase = 0 then begin html_foot := foot end ; main lexbuf} | "" '\n'? {if !phase = 0 then hevea_footer := true ; close_all () ; footer lexbuf} | "']* '>' {let lxm = lexeme lexbuf in if !phase = 0 then doctype := lxm else Out.put !out lxm; main lexbuf} | "']* '>' {let lxm = lexeme lexbuf in if !phase = 0 then html := lxm else Out.put !out lxm; main lexbuf} | "']* '>' {let lxm = lexeme lexbuf in if !phase = 0 then body := lxm else begin Out.put !out lxm ; putlinks_start !out !outname end ; main lexbuf} | "']* '>' {put (lexeme lexbuf); if !phase = 0 then begin if verbose > 0 then prerr_endline "Collect header" ; collect_header lexbuf end else begin repeat_header lexbuf end ; main lexbuf} | "" _ * {let lxm = lexeme lexbuf in close_all () ; if !phase > 0 then begin close_top lxm end} | '<' tag blank+ as lxm { if !phase > 0 then put lxm ; intag lexbuf ; main lexbuf } | _ as lxm {if !phase > 0 then put_char lxm ; main lexbuf} | eof {raise (Error ("No tag in input file"))} and save_html = parse | "" '\n'? {let s = Out.to_string html_buff in if verbose > 0 then eprintf "save_html -> '%s'\n" s; s} | _ {let lxm = lexeme_char lexbuf 0 in Out.put_char html_buff lxm ; save_html lexbuf} | eof {raise (Misc.Fatal ("End of file in save_html"))} and collect_header = parse | "" {finalize_header () ; if verbose > 0 then begin prerr_string "Header is: '" ; prerr_string !common_headers ; prerr_endline "'" end} | '\n'? "']* '>' {skip_title lexbuf ; collect_header lexbuf} | "' '\n'? {collect_style lexbuf ; collect_header lexbuf} | _ as lxm {adjoin_to_header_char lxm; collect_header lexbuf} and repeat_header = parse | "" as lxm {put (!link_style) ; put lxm } | "' {skip_style lexbuf ; repeat_header lexbuf} | _ as lxm {put_char lxm ; repeat_header lexbuf} and collect_style = parse | "" '\n'? { () } | _ as c { Out.put_char style_buff c ; collect_style lexbuf } and skip_style = parse | "" '\n'? { () } | _ { skip_style lexbuf } and skip_title = parse | "" '\n'? {()} | _ {skip_title lexbuf} and footer = parse "" _* as lxm {if !phase > 0 then begin close_top lxm end} | _ as lxm {if !phase = 0 then begin Out.put_char hevea_footer_buff lxm end ; footer lexbuf} | eof {raise (Misc.Fatal ("End of file in footer (no tag)"))} and tocline = parse "-->" '\n' ? {Out.to_string toc_buf} | _ {Out.put_char toc_buf (lexeme_char lexbuf 0) ; tocline lexbuf} and flowline = parse | "" {let title = arg lexbuf in let _,b = flowline lexbuf in title,b} | "" {let yes_no = arg lexbuf in let b = match yes_no with "YES" -> true | _ -> false in let title,_ = flowline lexbuf in title,b} | "-->" '\n'? {"",true} | eof {raise (Misc.Fatal "Unclosed comment")} | _ {flowline lexbuf} and getargs = parse | "-->" '\n'? {[]} | "' {let lxm = lexeme lexbuf in String.sub lxm 0 (String.length lxm-1)} | "" {raise (Misc.Fatal "arg title")} and arg = parse | "" {Out.to_string arg_buf} | _ {Out.put_char arg_buf (Lexing.lexeme_char lexbuf 0) ; arg lexbuf} | eof {raise (Misc.Fatal "Unclosed arg")} and aargs = parse | ("id"|"ID") ' '* '=' ' '* {if !phase = 0 then begin let name = refname lexbuf in Cross.add name !outname end else put (lexeme lexbuf) ; aargs lexbuf} | ("href"|"HREF") ' '* '=' ' '* {if !phase > 0 then begin let lxm = lexeme lexbuf in let name = refname lexbuf in try let newname = if String.length name > 0 && String.get name 0 = '#' then let frag = String.sub name 1 (String.length name-1) in Cross.fullname check_changed !outname frag else name in put lxm ; put "\"" ; put newname ; put "\"" with Not_found -> () end ; aargs lexbuf} | '>' {if !phase > 0 then put_char '>' ; main lexbuf} | _ as c {if !phase > 0 then put_char c ; aargs lexbuf} | eof {raise (Error "Bad tag")} and intag = parse | blank+ as lxm { if !phase > 0 then put lxm ; intag lexbuf } | ("id"|"ID") blank* "=" blank* (('\'' ([^'\'']* as v) '\'' | '"' ([^'"']* as v) '"' | ('#'?['a'-'z''A'-'Z''0'-'9''-''+''_'':''.']+ as v))) as lxm (* '"' *) { if !phase = 0 then Cross.add v !outname else put lxm ; intag lexbuf } | attr_name ( blank* "=" blank* ('\'' ([^'\'']*) '\'' | '"' ([^'"']*) '"' | '#'?['a'-'z''A'-'Z''0'-'9''-''+''_'':''.']+))? as lxm (* '"' *) { if !phase > 0 then put lxm ; intag lexbuf } | '>' as lxm { if !phase > 0 then put_char lxm } | "" { raise (Error "intag: attribute syntax")} and refname = parse | '"' ([^'"']* as name) '"' | ''' ([^''']* as name) ''' | (['a'-'z''A'-'Z''0'-'9''.''_''-']+ as name) (* '"' *) { name } | "" {raise (Error "Bad reference name syntax")} and skip_endcom = parse ' '* "-->" '\n'? {()} | "" {raise (Error "Bad HTML comment syntax")} { let do_lex lexbuff = main lexbuff ; !some_links end }