Date: Fri, 29 Mar 2024 14:34:32 +0000 (UTC)
Message-ID: <1242377335.15.1711722872324@4fb892a57e78>
Subject: Exported From Confluence
MIME-Version: 1.0
Content-Type: multipart/related;
boundary="----=_Part_14_373437138.1711722872324"
------=_Part_14_373437138.1711722872324
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Content-Location: file:///C:/exported.html
Generating =
C with ANTLR 3
Author
Jim Idle - jimi|at|temporal-wave|dott|com www.linkedin.com/in/jimidle
Status
In sync with ANTLR 3 Development, however RewriteTokenStream is not yet =
implemented.
The C code generation templates and C runtime for ANTLR 3 are in-sync wi=
th ANTLR release 3.1
Finding Example Gr=
ammars
If you are looking for the example projects, visit the downloads section=
of the main ANTLR page. Half way down the page is the examples tar/zip. Do=
wnload this and expand it. In there is a subdirectory 'C' with VS2005 proje=
cts (also easy to build manually on UNIX).
Background
The C runtime and therefore the code generated to utilize the runtime re=
flects the object model of the Java version of the runtime as closely as a =
language without class structures and inheritance can. Compromises have onl=
y been made where performance would be adversely affected such as minimizin=
g the number of pointer to pointer to pointer to function type structures t=
hat could ensue through trying to model inheritance too exactly. Other chan=
ges include the use of token and string factories to minimize the number of=
calls to system functions such as calloc().
The generated code is free threading (subject to the systems calls used =
on any particular platform being likewise free threading) and while I am no=
t exactly certain that this is at all useful, it seems silly to write C cod=
e that is not free threading these days unless there is some over arching r=
eason to avoid it.
Model
As there is no such thing as an object reference in C, I chose to create=
a number of typedef structs that reflect the calling interface chosen by T=
erence in the Java version of the same. The initialization of a parser, lex=
er, input stream or internal structure therefore consists of allocating the=
memory required for an instance of the typedef struct that represents the =
interface, initializing any counters, pointers and buffers etc, then popula=
ting a number of pointers to functions that implement the equivalent of the=
methods in the Java class.
The use and initialization of the C versions of a parser is therefore si=
milar to the examples given for Java, but with a bent towards C of course. =
You should also be aware of memory allocation and freeing operations in cer=
tain environments such as Windows, where you cannot allocate memory in one =
DLL and free it in another.
The runtime provides a number of structures and interfaces that I have f=
ound useful when writing action and processing code within java parsers, an=
d furthermore were required by the C runtime code if I was not to depart to=
o far from the logical layout of the Java model. These include the C equiva=
lents of String, List, Hashtable, Vector and Trie, implemented by pointers =
to structures. These are freely available for your own programming needs.=
p>
A goal of the generated code was to minimize the tracking, allocation an=
d freeing of memory for reasons of both performance and reliability. In ess=
ence any memory used by a lexer, parser or tree parser is automatically tra=
cked and freed when the instance of it is released. There are therefore fac=
tory functions for tokens and so on such that they can be allocated in bloc=
ks and parceled out as they are required. They are all then freed in o=
ne go, minimizing the risk of memory leaks. This has only one side effect, =
being that if you wish to preserve some structure generated by the lexer, p=
arser or tree parser, then you must make a copy of it before freeing those =
structures, and track it yourself after that. In practice, it is easy enoug=
h not to release the antlr generated components until you are finished with=
their results.
I have constructed the C code such that it will compile on any reasonabl=
e ANSI C compiler in either 64 or 32 bit mode, with all warnings turned on.=
This is true of both the runtime code and the generated code and has been =
tested with Visual Studio .Net (2003, 2005 and 2008) and later versions of =
gcc on Redhat and Ubuntu Linux, as well as on AIX 5.2/5.3, Solaris 9/10, HP=
UX 11.xx, OSX (PowerPC and Intel), Cygwin and MingW.
The C runtime is constructed such that the library can be integrated as =
an archive library, a shared library or DLL, or by integrating the source c=
ode into your own project or source code set (though this is not recommende=
d, stick to linking with the libraries).
The C runtime is link compatible with C++ and Objective C. The generated=
code can also be compiled as C++ and you can embed C++ code in your gramma=
rs - use the relevant compiler link or option to force the C to compile as =
C++. The generated code can also be compiled by the objective C compiler.=
p>
It is C (well written and documented I hope to claim) and basic testing =
of performance against the Java runtime, using the JDK1.6 source code, and =
the Java parser provided in the examples (which is a tough test as it inclu=
des backtracking and memoization) show that the C runtime uses about half t=
he memory and is between 2 and 3 times the speed. Tests of non-backtracking=
, non-memoizing parsers, indicate results significantly better than that.=
p>
Documentation etc
Documentation on using the C Target has now transferred to the generated=
doxygen documentation, linked from the main ANTLR Home page and at: http://www.antlr.org/api/C/index.html;
------=_Part_14_373437138.1711722872324
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: file:///C:/6d1ebf528a8d9e163b45482e7367c47d752b6889bb7c2b430293fa04a5f9562a
/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYn
KSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo
KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAD6AO4DASIAAhEBAxEB/8QAHAAAAQUBAQEA
AAAAAAAAAAAABAECAwUGBwAI/8QAQxAAAgEDAgQEAwYEBQEGBwAAAQIDAAQREiEFMUFRBhMiYXGB
kRQjMqGxwQdC0fAVM1Ji4UMIFiRyovEXJVOCssLS/8QAGQEAAwEBAQAAAAAAAAAAAAAAAAECAwQF
/8QAIxEAAgICAgIDAQEBAAAAAAAAAAECEQMhEjEEQRMiURRhMv/aAAwDAQACEQMRAD8A+pDKq86Q
Osg9WwoYb717FXxRh8rCi0Z7UKw3OOVewe9ePvtTSoiUuR5VLbCl0b451k+J+J7u04rLHbRwtawt
pIYHU5H4t87dqtvENyZfDVxPCxVZY1IIOCFYj9jU8jT4ur9l1CoDAt8qI0r2Fc48H3kttxmK1EjG
2nyuknIDYyCO3LFdIBzU8uWzX4+Gmer1er3SgZ7ApMqOtNYsfaoztzp0S5E+RnnXqHpwY96KFyJq
Rs42r2cgUtIvshIJODk08IOuxp9ep2SkRSkrypnmtUzoGGOVDsuDimqZE7T0OaU4xUPyqQoQAayv
iy8kF5FaxuyxhNbBTjJJPP6fnTbSJUJTdGmIAjZmOABmsiviK6Mxnyi2wbaLTvp+Perfw7cy3XB5
FdmZlLR5bckYyM/WsEMiIrnkOVRKTpM2x41tM6obgRxl2YBANRY9BQFjxm2vp2ihaQNjK6xjWO4o
bizlvDEjg51QKSfjjNZThE7f4pYgEgCUfnt+9NuqIjDlFuzoWTSU7FeIrWzmaG4pMU7FexRYqFx3
FeHsfrT8DpilxkVJokUPEPEdtY8U+xzxy4UAvKMaUzvy67c6vFwxBB2Nc38XArx6+XBGoqfj6RW4
8MyNNwGwdiGPlhSfgcftUJ2zeeNKKkjA8TJe9viRgee/01GtVfnPgaEE7NFEPzFZq/j1XV2VB0mZ
+vIajV3ezZ8JcJhJ3dwvyXV/xWafZtLaiU/Bhp4/w4KcYmXP51Y+KOL8Qg47MLW5kijg0qqA+k7A
kkdedBcNXHHrHc5Ey5r3Hhr4xxNyTp83GMewFQn9TR05bOhcHvRxDhlvdAafNTUR2PX86Mqh8FHR
4ctQe7//AJGrzWPetkYOkx1epAwNLQLTGFAemDTCpFTUjfh3NNMTSZGrYFKX9qZSgDrTohNjw5PI
V7Vk4xSKcfCn5GOdItCZbotJhs/hBNO1DvSjfrSGRkscADFYvxXAV4zE5A9cQx8if61uN6y/jJB5
1lIR/qX9DRJ6KhqVnvCSELdoAdpFYfT/AIrHvCouHxjZ2G4961nhu6WLiAh2xOu3xXf+tUfFbXRx
e8RX0qspIAHQ7/vWTdxLiqky6hP2jwTLuC0cbREf+U7flis5wyMpxG0YkACdP1q5tJRD4X4xEM4R
hj/7sVSRT+qI4IOtSPqKHK0gSpNG+4xew8MgEkup2c6URebGl4VcrxG0E8SlPUVZG5gis7/EGXTd
WK9lc4+Yqw8B5PD7hzsGl/8A1Fac3dGTxR42X3ktivGFqIr1VyZHxoGGnqKcFz+GkHwNLsPamSjG
eMLMf4srN/1IQfiVJH9KsfBEwNjJaZ9UMmoD/a3/ADmo/G0fosZgxH3hiJ57EZ/aqvgUq8P4vDID
hJG0SEnmD3+eKxb4yOhLlGitZ3kW4ZBnLMc99zUa3hmhsLRsh7cyMx6YYjH70KtwIoXDnYM36mob
V9V20iglQuOVYuVM6FC0i54Qo/7xWXr1DzgfoCadJILrz7nG0sjPj2JOKi4SwMt5eEYW1t3bP+9h
pX9TTHRI7NEAIIG9UukTJfbRtvCi6eBW3TJc/wDqNXAz7UB4fj8nglihG/lKT8Tv+9WG1dK6ON9n
viK8fiaUD3r2D2pgJvXs96UD2r2KApjacAOtLp/s0mKAocApGwzXtI7Ypm45V7eih2hDtyrwJHKv
b0jA6TpxnpQTY7UcVReL018MVz/05VPyORU8+RcOWceYoG46A496m4rbtccKuYSdTFDpOOo3H6UN
DjLZkoLhYpYZ0GGhcNn26j6Zp/if7rjshX1ebGsgx16ftVbbv50O5wGqd2kldXlcu6II1J/0jkK5
W9NHao7sZ9r8nh97Gxw0pjOOeSG3/I0Pa3Almt1XcmZB/wCoUs2UAwMihxNhx/KQeYGMEVHIrh2W
Piu+F5xucEZhh+6U9Nuf55+larwVhOBowXaSRmHuOX7Vz8wzxqX/AM1WJOc75PeukeGwo4DYaOXl
DPx6/nW+N8nZz5LiqLXzD2r3mdxTKStqRhyY4UuKdilxvQFFD4yiDcAmf+aJ0kX46gP3NYqdSV1O
dXsDW58X4Hh67yTvpAx31CudXNw+kLob48hXPl7Orx0eupRJGFjAVfYU+CJvLA5AUIWfRltIBPfl
VtaRHyNzkHlWB0s8gZrZ4/MZVk068cm0nIzTJzIQEJB1YXbuaNCbYHypllEZeKWse28qj88/tVx2
0ZypJ0dFiTyo0jXGEUKPkKf8qcBnJpcAV2HDVjNqUtjfNC395FZxNJIwAAzucfnWA4340LMUtX9P
/lKg/vSbS7E3+HRWnVdyw26mgpeLxBgE9Q7hS36VyDi3iRYxDi6ndmUmSNnyoPt7fGszxPxXd3mp
WuCsedlB0ioc0gXJne5eP20TYnlCnsVx+9SW/H+HTMFF3FqPL1c/rXzgt+zNkykHoAc5ohLtsgLK
ob4YpfIHFn0yjhwGRgynqKf9K+ebDxFxbhrB7e5kAHMZOMfCtnwH+Jx1rHxaHUpOPMQYI+XI/lVK
aYU0dTwabKupD6ivuNqG4ZxG04nbiexuEmjPVTy9j2oxsEYI586uwqyjvNKzShX9OlTnV/zVtGse
SycjzANV9zFEbqdjrGFAHqwu2eXvUdn4g4dc3EUMU33sudiMbjpSckuyVox0kBt7u4hzgxyFQD13
oiME7kcumOdSeI7iG343cmP1SMRqA76RmgYblnJZiM9q5cnZ6EG3Elnj1DbPuarZlKZOFwPfFWbS
oFIyDmqviBWI7ZLHlWZSJbZpZVx5QUdCWrY+FL6JOHJbzzxq6zGKNWOCdtQA79ax1lIfKLHHbast
40lkgWC4hkZXSTI08wccxitISox8has7xczpbW8k0rBY41LEnoBVB4N8QQcas2jjaRpoPSxcDLj/
AFftXP5PGU/GPC8VpeYJKEXDjZpADtjse5qr4JcW/C5JXUvMH2Oucx5PfK8/n71U/KhHRw270d9r
1MilSaNXiZXRhlWU5BFProNjM+PpvL4Iif8A1ZlHyGW/asBdMWtw3Wtl/EmQLa2CA/eGZiF7jTv+
orFOHEJ1A55neufI90dWDoDsy0rFWPI5rSRyLFECTjblWetAY7ksR6RzNEXl1JMQsIOO52rE6JBN
xxJ0bCnPtVp4OuhP4gtvPGlvUVGOuk1QW9jI6mRzk86OitHEisGdGTdWU4IPQg1UW07M5QtUjreo
AZJ2qn4l4isLGUxSTBpP9K742zvWNa64nIg18QmY6SnQbH5fnWI8VXUvDMFmZtQEQ1DOF9v761tL
L+HK8UjReJfEyXrvIS3lY9EZ5exPv/ffPLvEXHpFLKsvljGNKjJqbifFSyKBs5GcdhWP8iTidw2k
nQDknvWfPkxRxhdneszvPPLqXHpz/So5LsuxCg49+lWnDuFKiYcah27VFxKxeF2UIcEbUnJGyxUg
G1nw2BOMdm9P0q0NxJGuJ0WSLmGU4I/rVDJbMGIfYjp1FH8MkZVMcg1J1A6iocqIcS0W4mt1820l
LRcyMch8KsbWWO/iJi0pP/NH/K/w7VSiF7aTVCTp5g550+NdL+fDlcfiUbY9/rS50LhZpOBeIL3g
N8sltK6AHDK24+DDqPeur/8AxAW6tLWS0RRN/wBVDvvjl8M9a4vcMt9BqXa7jHqHSRe4/pXuA37W
d6kjZaIEBl7CqWb8BYk3s6zPxPil9sRgNJ5gJ3xsRj4YNAxWl1bXC3K6DIpyDjrzqF+OPiLyUYx7
4wMEjH6USONxx6fPTSpxgk5qXNN7ZXHFYx/tPnu83qlf1FudMxNg+k1Zi8tnIZUDEnlnbFTakbOV
X6VXZvySRUpLcIQQjEgc8CknZ51JKlT11c6tvQz4x8qhaH1nIBBGCDSaHCSA7MFQOikcsVWcULCX
zSoKqd9s4q5dvLbYavjsQaa9m09szKuVOefWpktURkSaoxqcJnaP0TxQx8tJG6jpUllwjzSWu/NC
Y2WJtOD35UTI7K6+Y5Vd1Izu5H6Eb1JcSwmbVfMVBA8vSDnHXVjrXDJyTpnnuNdml/h54rEMsPDp
50ERYqA/Jds+nHc59uVdMN8pcCIB15MVO4PwrgfgmZ5lEaQu9xIhdpF28uIH8XbmD9Nq11/x+YWc
trry03+ZIPxEY/CO2f0NetCfFbCFvRP4kvv8c468tuwa2t18qP8A37+ph8T+gqFMCINjlzzT+EWW
i0BnGHbJAH8vtUk0EuckkjuBnNZSduzux67AJVHlyBF3bG/z2qeG3SMAuQ3vSNJDEhy2uTOSMbmg
bniDKpLbKu5JpIqUvwuGukgiyuBjeqZ+PogkZG3GW54HPH7j61m7/i7XMqRZKox69a9cyW9zby3M
eiBHKq0Sb+XjY7HcfHrmiUjneZrSLhePvK+lMNk4JAOB86zni0XFxdosr6o0Go+xO5+fSibe/AeO
CIMy6iNR68v796Zxo6mm0jZY3P0G1ZqTfYoTk3sxM2qd5APxNsPYUdw62WBBHqyM5Y8smhIlInQM
DgRBj771d2iBtWwOnn7UcqR1QjbDYIlwCvpG2+N6OSyWdSrqp9+tDQrrGBj6Vc2EeTnblipUmdHF
NFHxjwystu1xCQJQuw79frWYitiEW4gALIfvU9u49j+tdcNsJYSmCds4BrBy2bWdzMsYx6iV+B5j
3Bq5PRjOFbBngARNHrRl1KD1Hb402C1zIDECwYalz3xuKOtiCiRDBhyWTJ3XuPrvRy2vkOJI91B1
D9x+dY2ZVTKOW3ZVEkJIZNweWRUDJokMqj0MA2PY8xWmuhEsjeXgq2XGPz+WarZLUomnH4HPzQ0k
xlpZ3LpZJokCBRhpCN9B7flVtHJHc2iGSJXQsAhA3Y42OPl1rL8KJjdreXdRlQT2NXlrassBwjv6
di43OMdeWKyzJLaOTIqYHfTTWjuYF1RDSFIJyNzn4/tVjw7jMwh1tqmjUesgYKn99qpuISScOngd
oAYixZEZjs2N87b7fr1oiBIhDMZwY1ZNTJuAwI59DyJGKccrikRHI0aW04otzjymHz51aR6pORBP
c1yWbjo4fx1lgZGt85GD0I966TwPisF7aqykB8bjqK7FK1s6MeRS6L2GCKTJYMXXYhznHyorTjnn
tvVZHORIMN6hyPcdqtIpVkTbY+/SqRo2UnGuDCcNNbkq/X39/asRe8OYTYnlkjKgKMbV1Mb0DfcM
iuXBKAmk4KRnKKkYPwrI/DLYyeVi/IKJLG5ClTvkpyNafgnDDJKbm69TElt+/eh+CcLZyJZRjsOw
rT4CLpGMCrvQscOKFOB05cqFu5/L9A2Zuvalkm0Bm6DlVTeXWglicsep7VDZpZPJIo220jnnrWV8
QXSs+mMZX3GQT796mvL8+tVOpgCxVTvWIveLXSXM4MajLlEYZOfbB9jWMsm6RjlyVpB0ekOZriON
nJ2dNt+mPpRkVzCEZZH+7K6yGwdO4xt8e/aqy0upfspdVSMRABmO+rbBGO9NmSci91sokWMejGdR
1DIx8Klb7MKbLrgN1azs4B1S68hdONNOvM+dKh31xMPjVb4bCo6osfr1aiQOQwef99aMuZ9HEVVt
joAH6VS60bYip+yf/NYojzeFl+fSrGwj1iN9I9Sg57Ec6jvZF/xtTHtoOPzqe3JS5LIpKNuVHQ/8
7U0rR2xdBkSSLISBgc8Z51ZWx0NllZSTyG9RQEJIwddL+/ajoHRh+HBHvTo3U0Wdu/mKGjKnHTrV
Hxuzbz2kWEqD1ByM1ex/hH4c+1LKqzI0bZ0EYxneqa0DXIwyRffSZwjSDBB5Z6GorHiRtZXtrkEq
crvzU0dxu1ltw3mDMZ/DIP37VluK3DSBWY+tRgn4VhJUYygHXF4YrnUuCgOR8KtIblXjUjdtlPv2
/UVijd6m0ncc6sbG9JOVO2nGD3FRdMlx0XFzMkbRyxnfYn+/pV5FJJIkUon8hEOTtnV3+f8AWsPL
PrfSucKx+Y51ZeXLIq6JeQGlGJ3K70ZNo5M2jS8WHmxQXscjO8ROkj1HJxjbpv0+FM4jbvfWahzm
Vo1XcAEEHfb5nNN4dqubF2aYStKvqVhjG/PH/P6VGJ54TCLEySx6cPr6j2/v3rmtrSMAQ+DkjvLe
4jVrtTnKSAk+xHTHxq64RwU27pGZWt9OdLCMkv7Ul74iltrUQ2ilbsD1LjJbHQexpLS/nvLQOYFD
nYxs22nmDt7Gm8mSrBOui1kne2cJKwI/lbof+farWxvtW+d/1rJwqQFXzA7zPq0xtrTB+HIVIk8l
owEgIXIz/tJGcH3rrxZeSp9nTjyXpm8ilDAb1MrfSs5w+/Dhdx9edXMU+2c5rpTNSWOMRR6RUNzJ
pXnU8z4HtVHxK5KnGapsQl1dDB35VmuI34MpJY6c6dQGcGk41xEQRNgkYGSe1ZP/ABeaW40WoYSJ
yUjn3+ftXPklS0ZZcnHSCuMSyiRJLadAqPgKpBZhyx8qi4mkkdvFcRxiVtYBQqB6ztk9+3apJEMi
LM5t4brKnAi9eoHbf332o+cPJYyLKrMBgEoPUOW4x9flXHzao5d2ZiCPi0qgywsUcZTIwF3yPT77
YNaCzt7iexe7dhGShYnSM/iT/wDqoYJ0a9ELpKrkY0liQce30Pyq1jczeZGPu0I0NrOCORO/yzW3
y62XCX6D8Ft5vtkiCRNDgvqxjX1waF4xlWLn/OiO/fGf/ejLGY2AkjgOsvBKEbIIUhc46+xpniS3
l1RT6MGSJVkUb4bSD/Wrx7Rpi7Ka3nM3FHYbgkNWjsE1XoPQDO4rP2Vt9mvUTJOYVbfuSf6VqLCF
vLeRdwo+e1bJUdyTLfVAF++0BT0YUNPJZMxMcgWTtnBqtkV51uHiDNIsf3cYON/fqetL4NSa9lnS
9TNusbEyyHdXHLB657c61jG1YSyJOqL/AIfMCpjJy3SjXnRdgMHvVO9m62zXEEhXyyM5BH071Y29
xFc20Ez/AIyPV8aTNosZxaQC1JCqc7YIyCK55xjhySXTfZCFymvywCRntnpmt5dQNdvPMuWWJtCo
v61m/EthdQ3Ef2KNpYHjURsn8rdc7fHt0pcOXZlklXo59JDKJc6CuTjc8jRsEEkFyFfrv8a0vFOF
6XhDLGryRjzQvLX1O3Lp881LDYSQW6NdhJGH4W5kf81i8augttGRhZkvAmDhiefTflWht7zVFdR3
DgLENURVMnOeXcjf61a8H8H3XHJpJ7QJ9ygwD1Jz1oqz8F8WhlYXNgFXVozk8jtqGAeXescsox0c
OZSsfw+8spbh0hUQxAKpBGRy3+efh1o8W6wPL50qtAcmMAb53O5+PKpuH+D+KWkyDzYVjXbzC7Fs
AnYqBvz2rXWnBPNtjHNGSSCGdQASMdCdxXBOX2XEy4s49xGGXifGl/w/z5ZWOgDBCKmMZY8xufba
tVwHgRtbQR3MqtM4xIQffACt2/rVleeCDYSrPw6S8jk1bkyawwzyIA3+dSpw+9lRoHtbiMEbStsM
56A53p5ckmqQuMl6AL9LoTEi0DIMkaBtt025Gsv9hlvuICcCW317DT6lb4jp2rpDeG3aKMTStKA2
cOwGB8jufc1BP4eh85GsI4LeVjiQyMdRX2GcdKIZJR1Q+EjOC2ltE863fzIMn0kYIA5mrbh3ElZN
znapRwu6S8khESNGzHRLrwsYPtnfG1QXnh+WIiS0uIyW2cSkLv7AV14fIfUjog5JbRd3s/loSayl
7O81z5cILyMcKtH8bvBGhJOAOlWng/g/lQfbLlc3EoyM/wAg7fGvShBzY8mRQVmS4nwhHsgt1M0L
g6jqBKv8QBmqe04JwmB3nPFoxcadKhbd9I9zncmur8ZskmiORkY7VjLjh0AdvSowexNZ5fG/Gcby
pu2issbXhcVwzz8WmWLH+THE2n5k8/pR9qvh62YeVNKsW+qNUcq2R714WUSkjRjHZCacbKIj0xt3
2iNYfzAslehtofCluxKQXDSHOXMWpj8yaMN54d8nR9nunA5kou9Brw8E5SGU+/lURHwx2wEglPf0
VP8AJEtTv0V8w4VLfST2o4lG7ROn4kwMjHLHOmTfZlspI0S5e5ZY8SSsCF088Y5Z61fW3B5wQfs8
o+K4zRn+CSOCPs7b7VrHG0XDI07ObcTdl4xDIwCxtF5ew6g5/Qn6VoOEXPoA1ZU9O9CeM7Cbhtko
uoTGY5FeNzyYciPoeVDcJcFAT+tavo9OEk5GhS3RpAxLL2I7VZwxwrGSzsN+9VVlIreljyO1WKRK
hG5Le9CbRq8YBxm4PlFVLFAfQvc96GsZcIqAg9+oFL4hdLZ1Vjl8E1BwkF9XpJBB3qXb7HBJBHCb
14L5sZKvkFc86urkwOmyMGI3IOKzEKiDiyK+ysw37Vp7pETOo8hzHenbRPFNlZ9mi87UF3HVqr+L
Pk4Xl0o29uUQaRkdzUPCrE8X4zZ2ccgQyvgudwoG5P5UdsU0oRtlnwtOJWlmP8PSYB8ElUJzjb+t
Rz8R43bt9/Pcx56MpX9q6qZ7uwtEtrG3t/KiUKjST7kdyAKwviOO/ubgS8Tn1ncIqtlV+AxtUZcU
e72eXkm27soY+LcRY5a6lOfzqccUvSP85z8aQWQUbt+RqMxRjILN8lNcjxGfNkFzxC9LD/xEwHsT
ToLq5bczSnPcmmTRqcAKz5Pb/mlhV8kmEge5ocFWxOTYQ085AHmyc+5qCYzMd5ZPqan0SLygz8dv
nT/Kuj+CCPHx3pxgg5MGiWTOrLse5NJL5gO5b5VYLb3WR6UXtUU0U6nfGPar+JfhLkwOCOTiXFlC
prihw7jOB7D61uba01qNZkUjosg/pWa8LPa2tqnnFjcSkyMQM4PQfT9619nNE6YQMB8MV6+OFLZG
WblIGv7QJCTE8jP/AL3P61m5ri4DZWRsE4BxWw4iwjtXdhqUDcDn+dYy64tZa1wMsw6L+LJ2omkZ
jVu5mYAyt3/CMYohLkjbzZskdAKrpOJ2y4VYyoPc8j706bitvbWzXEoZIl3LkYHwrNU3SAPNyxf0
vLkDrj5143jrsWckb8gKxt54+4NBIBG1xMOugD96NtPFvBr5o1jvCrtvpkGk/DfaqeOS3RUWahL1
1Yeon3HepxdyMPSWAHLHP6VV21w0ijy3Gnnjnn4UVGxPIscdccqz9l2A+LuHtxbgs8Uy+pVLqxO4
I3FYTg9wVQq3P8q6ReyN9mYN+EgjfAyK5xeWM3DeK6ZVAjkJMZB2I6/rUNHV406ZprLGjY9c4qyt
5mAVVB25k1S2TEBeozgGrKRtJKLkHnmsmz1lO1QFxW3Etz56nWijDDO4NG8GvobK40SQrqAzpflj
v8KHSMBfTuP2oqS3imEYlGojkRsQO1UmQ9dAd+63l4DAowGyW6CrSWbVEpDAjnmq64GhisQwp2XG
wFR2shVjHk4NJsqNJ2D3pIy5xgk0f4Hcjj5mByIIWIwOrbf1oXiaBFA22qy8DqkNjcXD6dc0mACc
eldsfXNP0c/lZPqbq5vXCL0ONhzrPcUmaaVMhsfGi5LpBp2csR/f71Q8d8ScM4RDrv2ZBjZVGWJ9
t6FFydI8yUglA4zr146ginqhbHpPM1y/iv8AFWQPp4ZaRqg/nn3PyAwBWm8FeNbfjnlwX6RW16V1
I2r0N7bnY+3XlVvxpLbIs1RhOSAoG+AT/wC9TCMj8KJjbIJxmpG+zg62lUqvXHL4mh5OJcNjjEj8
Sto4x1Lrvjn1qFib6QwhY2DYEa8wDyNEKhCkKi8+WBWZHjjw4Gw3E43J22jb89uXzpeL/wAQOAcP
4fJPbXUd3LjEcUQOWPuTyHvWkcMnqh2jUCOQgBRuemKgmkEbYmlhGMfidQa+f+OeNeM8Znd57ySG
BidMEBKIB223PzqgaXUdUjl2P+o10Lxf9Icj6ai4ZbxRl5nEUWcsWYoD7k5FSL4r8NWC+U/HLEad
tImzj6V86cf8S3vG5i3FJJJiOSM5CL8FGwrNXHlnJQPGewNdKxJGaR9iQcXsOK8Mknsb23ubRfS7
qcqD2Of3rm/jLjvAeFFlNzLPKx9MdvIpWPbHMbD9a4PYcUuLLVbvIXtpCCyEnSSOWR86kuLhCrlF
05546fKj4Yy7HTNLZ+OLiO8kS8QSRtsmCRj3ofxB4pl4lDHEwCrGTpCg7bc/j71j5yzFZBsw7U2R
iQWzz3/v601jjF2kOgxbpVdtWo45EVLJdrLC6ktt6hnaqnWdBANO1ERrnbFaciqNN4e8VcT4SwFv
dS+V/MhOV+hrRr/EjisUbo5guXQ6kZ0wdONuXM1zi0k0q7EchnekkkYorrjKnbP6VDjF9oKOjr/F
O+mtGjmhgjmJ2mVcZHw71UR8evrnib8Rv5mkUFFIJ/CvInHTmKykBSTS6AY5kVecDMNwlzbyAGVo
wRnqM+ofp9KxyRSjo1xf9HXOF3KsIyDkNj4VfOuYgwIDEbCuWeE+KG2I4ZesfMUZgdv+og/cda6J
ZXgnVRmvNkqZ6kXfZFObmGUaZwAeeY6KgmvEjGZLYnHpyGFS3EeqNi5BUAjPSoEguEiIVQw+PKhO
zdAss940+gtDrPPSpOKsLC3YsvmlSwOcgc6bY2+FbJBYbmoL+9NqWYsFAHepbsmf6ReIrxIRKzMA
qAnfsKouAeO7OP7PaX5hhjGQJFBbA9+xrH+NvEguWks4Hyc/ekfpWIlfWxVmwOuOdd2HApR+x5fk
ZOTpHffEHj3hthYg2F7Dey59Sw6goONtTfsK5Dx/jd3xq8a5vHLMdgByUdsVR6iqhSMInJc8vf8A
5pl3OEQ7b8q6IYow6OV7JDJ5swUHbvRxvjBMvlt+HA2qttyAgKgl269adKVX0jc860XQGluvEd5c
RFmu53aQYOpzn4VXScRdoTFESFzuep7mquNgnoOw/Gv71HBKM5Xlyz2HWhIVFnFJk6mJZV6Uk900
j+snPx2oZpQF2PPkP0qEsdA9uVMKDUkHMHalMqknJwNqBRtiRseW1SBxjfBNAC+dq0asc8fOnSA/
j5jHzoJDrDIdj0/v6VK0jFBnmrDIP9+9EXaG1Qyc8xgYO2KlSQmNc8wcGortfRkbA9KkVRo08iTs
aa0wPINSsjc+fwqFmGsR55dallYLH5hHrAx8aBgbXKpwSd6TY6CG2GBjHelm/wArI2pcbEY+tOxr
hNAA6Ei2JB6URGAyAdcUOnqidNs9qkgP3SkY2FJARo5glK81zuO1S/aJbSeK7gOCpyO3wpj7SB+a
sN6ldxspUAHtScbVMadOzXcJ4jw/jYEFwCjMQ2A2Gjf/AFKa0NvxG98PSIOJN59iSAt4BjSemsfy
n35GuSzRNCyuhI32I2rS8O8dXtva/Zr22hvIsaSWOCR2PQ1xzw/h3Ys6r7Hbra+FxbodQYMM7frV
jDOvlhe1cF4d4ts7Fj9iTiNpGd/JSRJI1/8AKGGR8jWgi/iJYBSZZOIscYwFjH6Vi8Ml0dC8mJ1C
W6ERkYnCnvXMPH/iVoHFvCT5x3A/09if6VTcW/iDJMjR8OtnQk/5s76iPgOVZA+feTPLM7O7nLu2
5Na48Du2YZvItUhUkeRjuXdjliTnei4Y9A3wWPXtSwRrCAMbjqKQHU+dJNd0Y0jz27Y1wxJ643oS
4VipLHrge1HE+k4wAfnQtwMlEHfOabQJk1rkAnltjApZsGYb86dspCKMAb1GDlz3G9OtCPTtiWEb
Z3B+lCxPsqg/iOKlbL3i8iFyagh9dyuM4GahjDbtgqbflSxjKDPPpUF2clF5EneiNWIhn9ar2IiB
3J5flSJiQ6ScAb0hb1HJyPhT442EepdyxoAgRsSDIo0gSISDjaq0k8xzo+JyEGd8jOPapgOREGDj
QeuxyevSlMmqWPf+WmyoPOOGA1LkfGoyQtxFKNg3Mdj1qmInmGXdcbYzQ1uuLlfcHFEyHM7cs4FQ
oCLxWGORFDQ0wnODttTIG9bJ0O4pzAk5J59Kjzh1YHkcZHamxHpl0OHOAp2ptocFlHQ7YqZ9MsZy
c4oGMmOQ1PQ0HAZOG9SnpTJIdO6cux5U9GLLkcwO9SDdSd8jtToQPHzaNvUCMjNQy27A6lUkc+VT
y5E0WDjfHKiQBjONsUcbHdFYIi2dOD15cqYI2YnQmr3xtVlO0ajAKkkdqhW4cDAOB7bClwQ1Jnre
z0+qQfWichRhRtQ6yknc8+tPLFl3xy396pKhO32Oztkn6V7O2cjfYb0zGQM7DmTXpGVV2J5cqBCt
JhfVj4mobQmaVpXyAOVDTy+bIEXGKPTENvgc8bil2OqFD51scY5Cowx80lcjOxJp6HMWnHuTUdtv
JtjV3JpiFZQPNYHfkKhtV03G/wDItEHYnfYkkk1BZEnzZOpPSkNPQkh13aLyAFFOML8qEg9d4/XF
EzEhMUIRCDlsnc/GpZZJPMKwEAqMEivW66QWI2G/KpLfREmZTlm3OO9AMr25H96JRhsxJJAFCyb5
71KwIaP3GN+9RAqRNPvGWB9S7ih4iJUkUdDrA7dxUsMuHw2/QZofT5N8OitkflV/6SieGXMrknfA
p2f/ABEePf57UMvonccsVMHJeAnY68flQMKPPbIqLbS4O+DUzr/UCoRnMnb2piHRtvg/KoryLYON
8c8U+POMk7japThl052NIOgS2mK4yeR5UYHyDvjbNV80fky5A2omKQNHtz60IbEZgZVOBtmiZWfS
QAQOdQxDkcjbf4UQOhyKaEQLGxYBgADT3hTpgnNSM2TgHJO3Omk5I2Aycc6YLsh8ob5OR2J50pGC
QT1ycdKlYsrbjemOxxuo770gEJABG3wG9BTygjCkfCn3MgAI7dtqGjQyOOZHWpbGkE8Ph1OTj59q
KuAc/linwqI49skVHlmbHU/OmtCb2K4CrkYz7U22Uayc4A3zTpRhd/rSW+5xyHLNMBHyUdfbIpkA
Cwe+4p6DXGOhBPzpgHpIB70MCOzHqkYHmamc6gFx13IqO3yqtz/F0ojGp1HTOaS0tgEWlldX00Fp
ZQvLczsI0jjBJY+1dd4Z/Aa+ngSTiPHbK0kZQTGkbSFW7E5xt7Vsv4I+FrPg/ALbjVzG54rdoWRz
ziiJ2C9sgZJ9xXUfPWQkokrd8rk/lWEpSYaPlbwL/CPjnHriKbikUnDOFkajJIv3jjsqHffudvjW
o8b/AMFJYojP4XnM4Vd7W4cCTP8AtbkfgcV3QnVkEls/nSbDsO1UrM3NtnxRxjhV9wy4MHErG5tJ
lOPvoyu/xO1ASr5irJjJQ5P719xTwQ3MRiuYoZ0PNZFDD6GuYfxO/hZZ8Y4dJd+G7aGz4rGp+5jA
SO4H+nHIN2PyNPk/Y1kPmdyBe9d6exxHnH4HB5e9JfwyWvENE6NHIjaXRhgqw2II75psmfJnXO4y
fpVGhaMQRpIwR9KgQZlYNnFPjcuikdsjNROfvznG9WJEikiTAGBzpd0cHl15VGDh9znB3FSSZYcs
kGgBZoxLHvjPtVdraCbcc6so29IOSCOYqO4hDjGc5/Kk0NMQepFZTkY70+B9jsOfMVXpI1u5BBI5
Uakochgc56U0xdBGV08yfia8CANtj79aYjKwzk7flTxpIJ2poR6Vs+knHXahrhwmNsU6Vwg2zk0D
O+sgdR25Um6KSIizOx99qOsogDqO5qOzgJOcbUcRo2zpqUrBv0IdiM7/ALVGCc89yd6cT6dWN/1p
nIgZJqyRZT33NPg9K7g796iuCDgAnOdxUkRby9yOXOl7GJbH045jVXpoyH1ZwD8qS3yEJJwc7VMz
a10s3KmHsgAwqg8+eavfCPCJeO+IbLhsA9VzKEyP5V5sfkATVLzOMnI2Nds/7PvAgXvuOT4UIPs1
uSuQSRlyM+2B8zWc3SFZ263jNtFFBCvlxRKEQE40qBgflUpMxO86L2zn+lCNGpxl4/kuKaEiXYSI
D896lGQ7zFzgIfoakDMQrHYdc01BqVdW/qHOm8yuetS3sdDlLdwRypGOx3JB771DISGGCRz5UPMS
HTBIoE+j5h/jdwo8P8ecScLhLhlukIHMMN//AFA1iHGrWMbEb12j/tEoguuCsFUM0EoJxuQGX+pr
jPR/j+wq10aweiSwbVaxZIGBg96WUYl23ptiB5J26t+pp9wB9oj2q10P2KwK4x16VMoOkADORn3o
Y/ye/wDSpAfQ/tVAKpIZv6VOuSCQdXTlzoIMcnc1Ov42+f70hDbiDzU1Dp2qvVpIG7e3Q1bDeEE7
nvQl4o8sHAzmk17LR5bpCBk49qk+2RomNyc8hVYORpD+JflRYUEy3BlbbI2p9vbl2Gv44xQ9vvOo
PLNW0HU9dIpdgKAEiwBg9qY7BiBzwKX+c/CmruBmq9Eoc+MYBGaYo77Uq/ualiG7fCgAaRfhk1PG
2IiVG3ftQ9wfWnxqWI+g/OgPQyD/AC8k49qmjyfYe9QxD7unr+D60AEWVrJd30FtFjXK4RQTtkn+
zX094fueF8B4JacNt2Bjt49JYn8bc2b5nevm7wrvx20J3IZiPbY1v3kff1t9a4vIm1JUUoprZ19/
E1gowFX46jUP/e20Q7OBXIHd9X4m+tDXDuG2Zh865/ll+lcI/h//2Q==
------=_Part_14_373437138.1711722872324--