# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: rousskov@measurement-factory.com-20090317203645-\
#   2spv623fkyjly1db
# target_branch: http://www.squid-cache.org/bzr/squid3/trunk
# testament_sha1: 97730ab799d7eedf538ddc42c166b94024bcdb4d
# timestamp: 2009-03-17 14:37:53 -0600
# base_revision_id: rousskov@measurement-factory.com-20090317171057-\
#   23x9uv83xfty1hnf
# 
# Begin patch
=== modified file 'configure.in'
--- configure.in	2009-03-09 05:53:08 +0000
+++ configure.in	2009-03-13 21:54:28 +0000
@@ -3808,6 +3808,7 @@
 	src/adaptation/Makefile \
 	src/adaptation/icap/Makefile \
 	src/adaptation/ecap/Makefile \
+	src/esi/Makefile \
 	src/icmp/Makefile \
 	src/ip/Makefile \
 	contrib/Makefile \

=== modified file 'lib/Makefile.am'
--- lib/Makefile.am	2009-03-08 18:41:06 +0000
+++ lib/Makefile.am	2009-03-13 21:47:14 +0000
@@ -3,12 +3,16 @@
 #  $Id$
 #
 
-SUBDIRS = libTrie
+SUBDIRS =
 
 if USE_LOADABLE_MODULES
 SUBDIRS += libLtdl
 endif
 
+if USE_ESI
+SUBDIRS += libTrie
+endif
+
 CLEANFILES =
 
 
@@ -89,10 +93,8 @@
 	xusleep.c \
 	$(XPROF_STATS_SOURCE) \
 	$(WIN32SRC)
-libmiscutil_a_LIBADD = \
-	libTrie/src/Trie.o \
-	libTrie/src/TrieNode.o \
-	@LIBOBJS@
+libmiscutil_a_LIBADD = @LIBOBJS@
+
 # $(top_srcdir)/include/version.h should be a dependency
 libntlmauth_a_SOURCES = \
 	ntlmauth.c

=== modified file 'src/Makefile.am'
--- src/Makefile.am	2009-03-17 02:04:14 +0000
+++ src/Makefile.am	2009-03-17 03:39:54 +0000
@@ -40,6 +40,15 @@
 
 ADAPTATION_LIBS = @ADAPTATION_LIBS@
 
+if USE_ESI
+SUBDIRS += esi
+ESI_LIBS = \
+	esi/libesi.la \
+	$(top_builddir)/lib/libTrie/src/libTrie.a
+else
+ESI_LIBS = 
+endif
+
 DELAY_POOL_ALL_SOURCE = \
 	CommonPool.h \
 	CompositePoolNode.h \
@@ -70,43 +79,6 @@
 DELAY_POOL_SOURCE = 
 endif
 
-ESI_ALL_SOURCE = \
-	ElementList.h \
-	ESI.cc \
-	ESI.h \
-	ESIAssign.cc \
-	ESIAssign.h \
-	ESIAttempt.h \
-	ESIContext.cc \
-	ESIContext.h \
-	ESICustomParser.cc \
-	ESICustomParser.h \
-	ESIElement.h \
-	ESIExcept.h \
-	ESIExpatParser.cc \
-	ESIExpatParser.h \
-	ESIExpression.cc \
-	ESIExpression.h \
-	ESIInclude.cc \
-	ESIInclude.h \
-	ESILiteral.h \
-	ESILibxml2Parser.cc \
-	ESILibxml2Parser.h \
-	ESIParser.cc \
-	ESIParser.h \
-	ESISegment.cc \
-	ESISegment.h \
-	ESISequence.cc \
-	ESISequence.h \
-	ESIVar.h \
-	ESIVarState.cc \
-	ESIVarState.h
-if USE_ESI
-  ESI_SOURCE = $(ESI_ALL_SOURCE)
-else
-  ESI_SOURCE = 
-endif
-
 if ENABLE_XPROF_STATS
 XPROF_STATS_SOURCE = ProfStats.cc
 else
@@ -203,7 +175,6 @@
 	-I$(top_srcdir)/src \
 	-I$(top_builddir)/include \
 	-I$(top_srcdir)/include \
-	-I$(top_srcdir)/lib/libTrie/include \
 	-I$(top_builddir)/lib \
 	-I$(top_srcdir)/lib \
 	@SQUID_CPPUNIT_INC@
@@ -280,7 +251,6 @@
 	ipc.cc \
 	ipc_win32.cc \
 	$(IDENT_ALL_SOURCE) \
-	$(ESI_ALL_SOURCE) \
 	ProfStats.cc \
 	LeakFinder.cc \
 	LeakFinder.h \
@@ -374,7 +344,6 @@
 	enums.h \
 	errorpage.cc \
 	errorpage.h \
-	$(ESI_SOURCE) \
 	ETag.cc \
 	event.cc \
 	event.h \
@@ -569,6 +538,7 @@
 	@REGEXLIB@ \
 	@SNMPLIB@ \
 	${ADAPTATION_LIBS} \
+	${ESI_LIBS} \
 	@SSLLIB@ \
 	-lmiscutil \
 	@XTRA_LIBS@ \
@@ -1068,7 +1038,6 @@
 	dlink.cc \
 	$(DNSSOURCE) \
 	errorpage.cc \
-	$(ESI_SOURCE) \
 	ETag.cc \
 	external_acl.cc \
 	ExternalACLEntry.cc \
@@ -1166,6 +1135,7 @@
 	icmp/libicmp.la icmp/libicmp-core.la \
 	@REPL_OBJS@ \
 	${ADAPTATION_LIBS} \
+	${ESI_LIBS} \
 	@REGEXLIB@ \
 	@SNMPLIB@ \
 	-L../lib -lmiscutil \
@@ -1237,7 +1207,6 @@
 	dlink.cc \
 	$(DNSSOURCE) \
 	errorpage.cc \
-	$(ESI_SOURCE) \
 	ETag.cc \
 	external_acl.cc \
 	ExternalACLEntry.cc \
@@ -1334,6 +1303,7 @@
 	icmp/libicmp.la icmp/libicmp-core.la \
 	@REPL_OBJS@ \
 	${ADAPTATION_LIBS} \
+	${ESI_LIBS} \
 	@REGEXLIB@ \
 	@SNMPLIB@ \
 	-L../lib -lmiscutil \
@@ -1384,7 +1354,6 @@
 	dlink.cc \
 	$(DNSSOURCE) \
 	errorpage.cc \
-	$(ESI_SOURCE) \
 	ETag.cc \
 	external_acl.cc \
 	ExternalACLEntry.cc \
@@ -1481,6 +1450,7 @@
 	icmp/libicmp.la icmp/libicmp-core.la \
 	@REPL_OBJS@ \
 	${ADAPTATION_LIBS} \
+	${ESI_LIBS} \
 	@REGEXLIB@ \
 	@SNMPLIB@ \
 	-L../lib -lmiscutil \
@@ -1520,7 +1490,6 @@
 	dlink.cc \
 	$(DNSSOURCE) \
 	errorpage.cc \
-	$(ESI_SOURCE) \
 	ETag.cc \
 	external_acl.cc \
 	ExternalACLEntry.cc \
@@ -1624,6 +1593,7 @@
 	@REPL_OBJS@ \
 	@STORE_LIBS_TO_ADD@ \
 	${ADAPTATION_LIBS} \
+	${ESI_LIBS} \
 	@REGEXLIB@ \
 	@SNMPLIB@ \
 	-L../lib -lmiscutil \
@@ -1673,7 +1643,6 @@
 	dlink.cc \
 	$(DNSSOURCE) \
 	errorpage.cc \
-	$(ESI_SOURCE) \
 	ETag.cc \
 	external_acl.cc \
 	ExternalACLEntry.cc \
@@ -1771,6 +1740,7 @@
 	icmp/libicmp.la icmp/libicmp-core.la \
 	@REPL_OBJS@ \
 	${ADAPTATION_LIBS} \
+	${ESI_LIBS} \
 	@REGEXLIB@ \
 	@SNMPLIB@ \
 	-L../lib -lmiscutil \
@@ -2022,7 +1992,6 @@
 	dlink.cc \
 	$(DNSSOURCE) \
 	errorpage.cc \
-	$(ESI_SOURCE) \
 	ETag.cc \
 	external_acl.cc \
 	ExternalACLEntry.cc \
@@ -2118,6 +2087,7 @@
 	@REGEXLIB@ \
 	@REPL_OBJS@ \
 	${ADAPTATION_LIBS} \
+	${ESI_LIBS} \
 	@SNMPLIB@ \
 	-L../lib -lmiscutil \
 	@SQUID_CPPUNIT_LIBS@ \

=== modified file 'src/Store.h'
--- src/Store.h	2009-02-08 00:02:47 +0000
+++ src/Store.h	2009-03-10 20:52:45 +0000
@@ -50,7 +50,7 @@
 #include "RemovalPolicy.h"
 
 #if USE_SQUID_ESI
-#include "ESIElement.h"
+#include "esi/Element.h"
 #endif
 
 class AsyncCall;

=== modified file 'src/cache_cf.cc'
--- src/cache_cf.cc	2009-03-13 20:45:32 +0000
+++ src/cache_cf.cc	2009-03-13 21:54:28 +0000
@@ -57,7 +57,7 @@
 #include "snmp.h"
 #endif
 #if USE_SQUID_ESI
-#include "ESIParser.h"
+#include "esi/Parser.h"
 #endif
 
 #if USE_ADAPTATION

=== modified file 'src/client_side_reply.cc'
--- src/client_side_reply.cc	2009-03-08 21:53:27 +0000
+++ src/client_side_reply.cc	2009-03-10 20:52:45 +0000
@@ -48,7 +48,7 @@
 #include "clientStream.h"
 #include "auth/UserRequest.h"
 #if USE_SQUID_ESI
-#include "ESI.h"
+#include "esi/Esi.h"
 #endif
 #include "MemObject.h"
 #include "fde.h"

=== added directory 'src/esi'
=== renamed file 'src/ESIAssign.cc' => 'src/esi/Assign.cc'
--- src/ESIAssign.cc	2009-02-11 17:08:24 +0000
+++ src/esi/Assign.cc	2009-03-10 20:52:45 +0000
@@ -40,9 +40,9 @@
  */
 #if (USE_SQUID_ESI == 1)
 
-#include "ESIAssign.h"
-#include "ESIContext.h"
-#include "ESISequence.h"
+#include "esi/Assign.h"
+#include "esi/Context.h"
+#include "esi/Sequence.h"
 
 ESIAssign::~ESIAssign()
 {

=== renamed file 'src/ESIAssign.h' => 'src/esi/Assign.h'
--- src/ESIAssign.h	2009-01-21 03:47:47 +0000
+++ src/esi/Assign.h	2009-03-10 20:52:45 +0000
@@ -37,9 +37,9 @@
 #define SQUID_ESIASSIGN_H
 
 #include "squid.h"
-#include "ESIElement.h"
+#include "esi/Element.h"
 #include "SquidString.h"
-#include "ESIVarState.h"
+#include "esi/VarState.h"
 
 /* ESIVariableExpression */
 /* This is a variable that is itself and expression */

=== renamed file 'src/ESIAttempt.h' => 'src/esi/Attempt.h'
--- src/ESIAttempt.h	2009-01-21 03:47:47 +0000
+++ src/esi/Attempt.h	2009-03-10 20:52:45 +0000
@@ -37,8 +37,8 @@
 #define SQUID_ESIATTEMPT_H
 
 #include "squid.h"
-#include "ESIElement.h"
-#include "ESISequence.h"
+#include "esi/Element.h"
+#include "esi/Sequence.h"
 
 /* esiAttempt */
 

=== renamed file 'src/ESIContext.cc' => 'src/esi/Context.cc'
--- src/ESIContext.cc	2009-01-21 03:47:47 +0000
+++ src/esi/Context.cc	2009-03-10 20:52:45 +0000
@@ -40,7 +40,7 @@
  */
 #if (USE_SQUID_ESI == 1)
 
-#include "ESIContext.h"
+#include "esi/Context.h"
 #include "Store.h"
 #include "client_side_request.h"
 

=== renamed file 'src/ESIContext.h' => 'src/esi/Context.h'
--- src/ESIContext.h	2009-01-21 03:47:47 +0000
+++ src/esi/Context.h	2009-03-10 20:52:45 +0000
@@ -34,14 +34,14 @@
 #ifndef SQUID_ESICONTEXT_H
 #define SQUID_ESICONTEXT_H
 
-#include "ESIElement.h"
+#include "esi/Element.h"
 #include "clientStream.h"
 
 class ESIVarState;
 
 class ClientHttpRequest;
 
-#include "ESIParser.h"
+#include "esi/Parser.h"
 
 /* ESIContext */
 

=== renamed file 'src/ESICustomParser.cc' => 'src/esi/CustomParser.cc'
--- src/ESICustomParser.cc	2009-02-10 11:02:53 +0000
+++ src/esi/CustomParser.cc	2009-03-17 15:29:06 +0000
@@ -34,14 +34,14 @@
  */
 
 #include "squid.h"
-#include "ESICustomParser.h"
+#include "esi/CustomParser.h"
 #include "Trie.h"
 #include "TrieCharTransform.h"
 #include "Array.h"
 
 Trie *ESICustomParser::SearchTrie=NULL;
 
-RegisterESIParser("custom", ESICustomParser);
+EsiParserDefinition(ESICustomParser);
 
 Trie *
 ESICustomParser::GetTrie()

=== renamed file 'src/ESICustomParser.h' => 'src/esi/CustomParser.h'
--- src/ESICustomParser.h	2009-01-21 03:47:47 +0000
+++ src/esi/CustomParser.h	2009-03-17 15:29:06 +0000
@@ -35,7 +35,7 @@
 class Trie;
 
 /* inherits from */
-#include "ESIParser.h"
+#include "esi/Parser.h"
 
 /* for String variables */
 #include "SquidString.h"
@@ -54,8 +54,9 @@
     long int lineNumber() const;
     char const * errorString() const;
 
+    EsiParserDeclaration;
+
 private:
-    ESI_PARSER_TYPE;
     static Trie *SearchTrie;
     static Trie *GetTrie();
     enum ESITAG_t {

=== renamed file 'src/ESIElement.h' => 'src/esi/Element.h'
--- src/ESIElement.h	2009-01-21 03:47:47 +0000
+++ src/esi/Element.h	2009-03-10 20:52:45 +0000
@@ -34,7 +34,7 @@
 #define SQUID_ESIELEMENT_H
 
 #include "RefCount.h"
-#include "ESISegment.h"
+#include "esi/Segment.h"
 
 typedef enum {
     ESI_PROCESS_COMPLETE = 0,

=== renamed file 'src/ElementList.h' => 'src/esi/ElementList.h'
--- src/ElementList.h	2009-01-21 03:47:47 +0000
+++ src/esi/ElementList.h	2009-03-10 20:52:45 +0000
@@ -37,7 +37,7 @@
 #define SQUID_ELEMENTLIST_H
 
 #include "squid.h"
-#include "ESIElement.h"
+#include "esi/Element.h"
 
 class ElementList
 {

=== renamed file 'src/ESI.cc' => 'src/esi/Esi.cc'
--- src/ESI.cc	2009-02-11 17:08:24 +0000
+++ src/esi/Esi.cc	2009-03-10 20:52:45 +0000
@@ -38,22 +38,22 @@
  */
 #if (USE_SQUID_ESI == 1)
 
-#include "ESI.h"
+#include "esi/Esi.h"
 #include "clientStream.h"
 #include "client_side_request.h"
 #include "errorpage.h"
-#include "ESISegment.h"
-#include "ESIElement.h"
-#include "ESIContext.h"
+#include "esi/Segment.h"
+#include "esi/Element.h"
+#include "esi/Context.h"
 #include "HttpHdrSc.h"
 #include "HttpHdrScTarget.h"
 #include "HttpReply.h"
-#include "ESIAttempt.h"
-#include "ESIExcept.h"
+#include "esi/Attempt.h"
+#include "esi/Except.h"
 #include "client_side.h"
-#include "ESIVarState.h"
-#include "ESIAssign.h"
-#include "ESIExpression.h"
+#include "esi/VarState.h"
+#include "esi/Assign.h"
+#include "esi/Expression.h"
 #include "HttpRequest.h"
 #include "MemBuf.h"
 #include "ip/IpAddress.h"
@@ -116,11 +116,11 @@
 
 MEMPROXY_CLASS_INLINE(esiComment)		/**DOCS_NOSEMI*/
 
-#include "ESILiteral.h"
-
-#include "ESISequence.h"
-
-#include "ESIInclude.h"
+#include "esi/Literal.h"
+
+#include "esi/Sequence.h"
+
+#include "esi/Include.h"
 
 /* esiRemove */
 
@@ -181,7 +181,7 @@
 
 MEMPROXY_CLASS_INLINE(esiTry)		/**DOCS_NOSEMI*/
 
-#include "ESIVar.h"
+#include "esi/Var.h"
 
 /* esiChoose */
 

=== renamed file 'src/ESI.h' => 'src/esi/Esi.h'
=== renamed file 'src/ESIExcept.h' => 'src/esi/Except.h'
--- src/ESIExcept.h	2009-01-21 03:47:47 +0000
+++ src/esi/Except.h	2009-03-10 20:52:45 +0000
@@ -37,8 +37,8 @@
 #define SQUID_ESIEXCEPT_H
 
 #include "squid.h"
-#include "ESIElement.h"
-#include "ESISequence.h"
+#include "esi/Element.h"
+#include "esi/Sequence.h"
 
 /* esiExcept */
 

=== renamed file 'src/ESIExpatParser.cc' => 'src/esi/ExpatParser.cc'
--- src/ESIExpatParser.cc	2009-01-21 03:47:47 +0000
+++ src/esi/ExpatParser.cc	2009-03-17 15:29:06 +0000
@@ -37,9 +37,9 @@
 
 #if USE_SQUID_ESI
 
-#include "ESIExpatParser.h"
+#include "esi/ExpatParser.h"
 
-RegisterESIParser("expat", ESIExpatParser);
+EsiParserDefinition(ESIExpatParser);
 
 ESIExpatParser::ESIExpatParser(ESIParserClient *aClient) : theClient (aClient)
 {

=== renamed file 'src/ESIExpatParser.h' => 'src/esi/ExpatParser.h'
--- src/ESIExpatParser.h	2009-01-21 03:47:47 +0000
+++ src/esi/ExpatParser.h	2009-03-17 15:29:06 +0000
@@ -35,8 +35,8 @@
 
 #if USE_SQUID_ESI
 
-#include "ESIParser.h"
-#include "expat.h"
+#include "esi/Parser.h"
+#include <expat.h>
 
 class ESIExpatParser : public ESIParser
 {
@@ -51,8 +51,9 @@
     long int lineNumber() const;
     char const * errorString() const;
 
+    EsiParserDeclaration;
+
 private:
-    ESI_PARSER_TYPE;
     /** our parser */
     mutable XML_Parser p;
     static void Start(void *data, const XML_Char *el, const char **attr);

=== renamed file 'src/ESIExpression.cc' => 'src/esi/Expression.cc'
--- src/ESIExpression.cc	2009-01-21 03:47:47 +0000
+++ src/esi/Expression.cc	2009-03-10 20:52:45 +0000
@@ -34,7 +34,7 @@
  */
 
 #include "squid.h"
-#include "ESIExpression.h"
+#include "esi/Expression.h"
 
 /* stack precedence rules:
  * before pushing an operator onto the stack, the

=== renamed file 'src/ESIExpression.h' => 'src/esi/Expression.h'
=== renamed file 'src/ESIInclude.cc' => 'src/esi/Include.cc'
--- src/ESIInclude.cc	2009-01-21 03:47:47 +0000
+++ src/esi/Include.cc	2009-03-10 20:52:45 +0000
@@ -41,8 +41,8 @@
  */
 #if (USE_SQUID_ESI == 1)
 
-#include "ESIInclude.h"
-#include "ESIVarState.h"
+#include "esi/Include.h"
+#include "esi/VarState.h"
 #include "client_side_request.h"
 #include "HttpReply.h"
 

=== renamed file 'src/ESIInclude.h' => 'src/esi/Include.h'
--- src/ESIInclude.h	2009-01-21 03:47:47 +0000
+++ src/esi/Include.h	2009-03-10 20:52:45 +0000
@@ -37,9 +37,9 @@
 #define SQUID_ESIINCLUDE_H
 
 #include "squid.h"
-#include "ESISegment.h"
-#include "ESIElement.h"
-#include "ESIContext.h"
+#include "esi/Segment.h"
+#include "esi/Element.h"
+#include "esi/Context.h"
 
 class ESIInclude;
 typedef RefCount<ESIInclude> ESIIncludePtr;

=== renamed file 'src/ESILibxml2Parser.cc' => 'src/esi/Libxml2Parser.cc'
--- src/ESILibxml2Parser.cc	2009-01-21 03:47:47 +0000
+++ src/esi/Libxml2Parser.cc	2009-03-17 15:29:06 +0000
@@ -41,13 +41,13 @@
 
 #if USE_SQUID_ESI
 
-#include "ESILibxml2Parser.h"
+#include "esi/Libxml2Parser.h"
 
 // the global document that will store the resolved entity
 // definitions
 static htmlDocPtr entity_doc = NULL;
 
-RegisterESIParser("libxml2", ESILibxml2Parser);
+EsiParserDefinition(ESILibxml2Parser);
 
 // the SAX callback functions
 void esi_startElementSAXFunc(void * ctx, const xmlChar * name, const xmlChar ** atts)

=== renamed file 'src/ESILibxml2Parser.h' => 'src/esi/Libxml2Parser.h'
--- src/ESILibxml2Parser.h	2009-01-21 03:47:47 +0000
+++ src/esi/Libxml2Parser.h	2009-03-17 15:29:06 +0000
@@ -42,7 +42,7 @@
 
 #if USE_SQUID_ESI
 
-#include "ESIParser.h"
+#include "esi/Parser.h"
 // workaround for definition of "free" that prevents include of
 // parser.h from libxml2 without errors
 #ifdef free
@@ -70,8 +70,9 @@
 
     ESIParserClient *getClient() { return theClient; }
 
+    EsiParserDeclaration;
+
 private:
-    ESI_PARSER_TYPE;
     mutable xmlParserCtxtPtr parser; /* our parser */
 
     ESIParserClient *theClient;

=== renamed file 'src/ESILiteral.h' => 'src/esi/Literal.h'
--- src/ESILiteral.h	2009-01-21 03:47:47 +0000
+++ src/esi/Literal.h	2009-03-10 20:52:45 +0000
@@ -37,7 +37,7 @@
 #define SQUID_ESILITERAL_H
 
 #include "squid.h"
-#include "ESIElement.h"
+#include "esi/Element.h"
 
 class ESIContext;
 /* esiLiteral */

=== added file 'src/esi/Makefile.am'
--- src/esi/Makefile.am	1970-01-01 00:00:00 +0000
+++ src/esi/Makefile.am	2009-03-17 15:27:56 +0000
@@ -0,0 +1,43 @@
+include $(top_srcdir)/src/Common.am
+include $(top_srcdir)/src/TestHeaders.am
+
+noinst_LTLIBRARIES = libesi.la
+
+libesi_la_SOURCES = \
+	Assign.cc \
+	Assign.h \
+	Attempt.h \
+	Context.cc \
+	Context.h \
+	CustomParser.cc \
+	CustomParser.h \
+	Element.h \
+	ElementList.h \
+	Esi.cc \
+	Esi.h \
+	Except.h \
+	ExpatParser.cc \
+	ExpatParser.h \
+	Expression.cc \
+	Expression.h \
+	Include.cc \
+	Include.h \
+	Literal.h \
+	Libxml2Parser.cc \
+	Libxml2Parser.h \
+	Module.cc \
+	Module.h \
+	Parser.cc \
+	Parser.h \
+	Segment.cc \
+	Segment.h \
+	Sequence.cc \
+	Sequence.h \
+	Var.h \
+	VarState.cc \
+	VarState.h
+
+INCLUDES += \
+	-I$(top_srcdir)/lib/libTrie/include \
+	-I$(top_builddir)/lib/libTrie/include
+

=== added file 'src/esi/Module.cc'
--- src/esi/Module.cc	1970-01-01 00:00:00 +0000
+++ src/esi/Module.cc	2009-03-17 15:27:56 +0000
@@ -0,0 +1,28 @@
+#include "squid.h"
+#include "esi/Module.h"
+#include "esi/CustomParser.h"
+#include "esi/Libxml2Parser.h"
+#include "esi/ExpatParser.h" /* must follow esi/Libxml2Parser.h */
+
+static ESIParser::Register *prCustom = 0;
+static ESIParser::Register *prLibxml = 0;
+static ESIParser::Register *prExpat = 0;
+
+void Esi::Init() {
+    assert(!prCustom); // we should be called once
+    prCustom = new ESIParser::Register("custom", &ESICustomParser::NewParser);
+    prLibxml = new ESIParser::Register("libxml2", &ESILibxml2Parser::NewParser);
+    prExpat = new ESIParser::Register("expat", &ESIExpatParser::NewParser);
+}
+
+void Esi::Clean() {
+    assert(prCustom); // we should be called once, and only after Init()
+
+    delete prExpat;
+    delete prLibxml;
+    delete prCustom;
+
+    prExpat = NULL;
+    prLibxml = NULL;
+    prCustom = NULL;
+}

=== added file 'src/esi/Module.h'
--- src/esi/Module.h	1970-01-01 00:00:00 +0000
+++ src/esi/Module.h	2009-03-17 15:27:56 +0000
@@ -0,0 +1,11 @@
+#ifndef SQUID_ESI_MODULE_H
+#define SQUID_ESI_MODULE_H
+
+namespace Esi {
+
+    extern void Init();
+    extern void Clean();
+
+}; // namespace Esi
+
+#endif /* SQUID_ESI_MODULE_H */

=== renamed file 'src/ESIParser.cc' => 'src/esi/Parser.cc'
--- src/ESIParser.cc	2009-01-21 03:47:47 +0000
+++ src/esi/Parser.cc	2009-03-17 15:24:36 +0000
@@ -33,7 +33,7 @@
  */
 
 #include "squid.h"
-#include "ESIParser.h"
+#include "esi/Parser.h"
 
 char *ESIParser::Type = NULL;
 ESIParser::Register *ESIParser::Parsers = NULL;
@@ -54,3 +54,14 @@
 
     return (Parser->newParser)(aClient);
 }
+
+ESIParser::Register::Register(const char *_name, ESIParser::Pointer (*_newParser)(ESIParserClient *aClient)) : name(_name), newParser(_newParser) {
+    this->next = ESIParser::Parsers;
+    ESIParser::Parsers = this;
+}
+
+ESIParser::Register::~Register() {
+    // TODO: support random-order deregistration
+    assert(ESIParser::Parsers == this);
+    ESIParser::Parsers = next;
+}

=== renamed file 'src/ESIParser.h' => 'src/esi/Parser.h'
--- src/ESIParser.h	2009-01-21 03:47:47 +0000
+++ src/esi/Parser.h	2009-03-17 15:24:36 +0000
@@ -52,6 +52,7 @@
 class ESIParser : public RefCountable
 {
 public:
+    class Register;
     typedef RefCount<ESIParser> Pointer;
 
     static void registerParser(const char *name, Pointer (*new_func)(ESIParserClient *aClient));
@@ -70,8 +71,6 @@
 protected:
     ESIParser() {};
 
-    class Register;
-
 private:
     static Register *Parser;
     static Register *Parsers;
@@ -83,26 +82,21 @@
 {
 
 public:
-    Register(const char *_name, ESIParser::Pointer (*_newParser)(ESIParserClient *aClient)) : name(_name), newParser(_newParser) {
-        this->next = ESIParser::Parsers;
-        ESIParser::Parsers = this;
-    }
+    Register(const char *_name, ESIParser::Pointer (*_newParser)(ESIParserClient *aClient));
+    ~Register();
 
     const char *name;
     ESIParser::Pointer (*newParser)(ESIParserClient *aClient);
     Register * next;
 };
 
-#define RegisterESIParser(name, ThisClass) \
-    ESIParser::Register ThisClass::thisParser(name, &NewParser); \
+#define EsiParserDefinition(ThisClass) \
     ESIParser::Pointer ThisClass::NewParser(ESIParserClient *aClient) \
     { \
 	return new ThisClass (aClient); \
     }
 
-#define ESI_PARSER_TYPE \
-    static ESIParser::Pointer NewParser(ESIParserClient *aClient); \
-    static ESIParser::Register thisParser
-
+#define EsiParserDeclaration \
+    static ESIParser::Pointer NewParser(ESIParserClient *aClient)
 
 #endif /* SQUID_ESIPARSER_H */

=== renamed file 'src/ESISegment.cc' => 'src/esi/Segment.cc'
--- src/ESISegment.cc	2009-02-06 00:59:06 +0000
+++ src/esi/Segment.cc	2009-03-10 20:52:45 +0000
@@ -34,7 +34,7 @@
  */
 
 #include "squid.h"
-#include "ESISegment.h"
+#include "esi/Segment.h"
 #include "SquidString.h"
 
 CBDATA_TYPE(ESISegment);

=== renamed file 'src/ESISegment.h' => 'src/esi/Segment.h'
=== renamed file 'src/ESISequence.cc' => 'src/esi/Sequence.cc'
--- src/ESISequence.cc	2009-01-21 03:47:47 +0000
+++ src/esi/Sequence.cc	2009-03-10 20:52:45 +0000
@@ -40,10 +40,10 @@
  */
 #if (USE_SQUID_ESI == 1)
 
-#include "ESISequence.h"
-#include "ESILiteral.h"
-#include "ESIAttempt.h"
-#include "ESIExcept.h"
+#include "esi/Sequence.h"
+#include "esi/Literal.h"
+#include "esi/Attempt.h"
+#include "esi/Except.h"
 
 class esiExcept;
 

=== renamed file 'src/ESISequence.h' => 'src/esi/Sequence.h'
--- src/ESISequence.h	2009-01-21 03:47:47 +0000
+++ src/esi/Sequence.h	2009-03-10 20:52:45 +0000
@@ -37,8 +37,8 @@
 #define SQUID_ESISEQUENCE_H
 
 #include "squid.h"
-#include "ESIElement.h"
-#include "ElementList.h"
+#include "esi/Element.h"
+#include "esi/ElementList.h"
 
 /* esiSequence */
 

=== renamed file 'src/ESIVar.h' => 'src/esi/Var.h'
--- src/ESIVar.h	2009-01-21 03:47:47 +0000
+++ src/esi/Var.h	2009-03-10 20:52:45 +0000
@@ -37,8 +37,8 @@
 #define SQUID_ESIVAR_H
 
 #include "squid.h"
-#include "ESIElement.h"
-#include "ESISequence.h"
+#include "esi/Element.h"
+#include "esi/Sequence.h"
 
 /* esiVar */
 

=== renamed file 'src/ESIVarState.cc' => 'src/esi/VarState.cc'
--- src/ESIVarState.cc	2009-01-31 16:05:18 +0000
+++ src/esi/VarState.cc	2009-03-10 20:52:45 +0000
@@ -35,7 +35,7 @@
  */
 
 #include "squid.h"
-#include "ESIVarState.h"
+#include "esi/VarState.h"
 #include "HttpReply.h"
 
 CBDATA_TYPE (ESIVarState);

=== renamed file 'src/ESIVarState.h' => 'src/esi/VarState.h'
--- src/ESIVarState.h	2009-01-21 03:47:47 +0000
+++ src/esi/VarState.h	2009-03-10 20:52:45 +0000
@@ -34,7 +34,7 @@
 #ifndef SQUID_ESIVARSTATE_H
 #define SQUID_ESIVARSTATE_H
 
-#include "ESISegment.h"
+#include "esi/Segment.h"
 #include "Trie.h"
 #include "Array.h"
 #include "HttpHeader.h"

=== modified file 'src/main.cc'
--- src/main.cc	2009-03-08 19:34:36 +0000
+++ src/main.cc	2009-03-17 16:57:05 +0000
@@ -86,6 +86,10 @@
 #include "adaptation/Config.h"
 #endif
 
+#if USE_SQUID_ESI
+#include "esi/Module.h"
+#endif
+
 #if USE_WIN32_SERVICE
 
 #include "squid_windows.h"
@@ -1061,6 +1065,9 @@
     Adaptation::Config::Finalize(enableAdaptation);
 #endif
 
+#if USE_SQUID_ESI
+    Esi::Init();
+#endif
 
     debugs(1, 1, "Ready to serve requests.");
 
@@ -1671,6 +1678,11 @@
 
     releaseServerSockets();
     commCloseAllSockets();
+
+#if USE_SQUID_ESI
+    Esi::Clean();
+#endif
+
 #if DELAY_POOLS
 
     DelayPools::FreePools();

=== modified file 'test-suite/ESIExpressions.cc'
--- test-suite/ESIExpressions.cc	2009-01-21 03:47:47 +0000
+++ test-suite/ESIExpressions.cc	2009-03-10 20:52:45 +0000
@@ -34,7 +34,7 @@
  */
 
 #include "squid.h"
-#include "ESIExpression.h"
+#include "esi/Expression.h"
 
 int
 main ()

=== modified file 'test-suite/Makefile.am'
--- test-suite/Makefile.am	2009-02-18 00:18:43 +0000
+++ test-suite/Makefile.am	2009-03-10 20:52:45 +0000
@@ -66,7 +66,7 @@
 DEBUG_SOURCE = test_tools.cc
 debug_SOURCES = debug.cc $(DEBUG_SOURCE)
 ESIExpressions_SOURCES = ESIExpressions.cc $(DEBUG_SOURCE)
-ESIExpressions_LDADD = $(top_builddir)/src/ESIExpression.o \
+ESIExpressions_LDADD = $(top_builddir)/src/esi/Expression.o \
 		$(LDADD)
 mem_node_test_SOURCES = mem_node_test.cc
 mem_node_test_LDADD = $(top_builddir)/src/mem_node.o $(LDADD)

# Begin bundle
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWd1++JwAM/rfgFAwfX////9/
/4S////7YDReu9e7mSu3nK4dse29W95e4u805fVe4GtPeMgA2++8Mt1mg29u6HQC97gAc2AFHbAB
dzgAyABtgAloA4eEr5tmwuAMVASATYBq87j6e7PrhwmASgACg0qlGigUxege7AB6UDhkEJGjBMUj
9BGETIAAAaBoA0A0DTRNMmk0SU8p6aZTQaeoADQMg0AAAABppoISgYIp5IaaDTQAAAAAAAAk0kiB
DKMqeKMmamhiBpiaAyAANAABEpARiCYQ0JgAIIyamTTR5SbUYTQGymgVSExABBEyCaRjSCbUNIZP
U0GINAADiFLNoQRloKft3LFSqKU+n1epnfs/Wv8/ZxGI0bF1sp1dFaO68y8BtS0a5921hj3QoqEY
iDBXcSaRQo0sbWbiEMu1Tdqsk1fiDDl2bkB2niWcsAWOW4iAsrIejWZMZ+lKzVt2+xlzd2c5wB+W
/pEDq6OndRHDhBL1QrhnOAagPZiaWTR/MRHWFdxdaZsQz4hR9wj+BIH6Ch/Y+8ZwSeDC322ybSyx
6Xj59evAbEHlFQDZkyQ0IEThVTpgso5G1JIW1xWAk4isEoNEVHbMzye9yBub4HDUuvHPckPbgBzy
QsCsFBYoLAsibJQhQACUQEADpKArYO/l7XFrLk1e0Ke4IueqJaru7VNrObLC4a2HGC2UEs5tLYp3
mpiO/h81rbWHly9rU187wF85rA4JIB1efhtkOtoJ2s0apDuTfzXe3G8eucU5Je3LAN7ZANmKHK78
bIiib2FqxisQXCrQvAVqeyIgQdm3blL4VSQFkigq17w7tCRmhkzuOd13rrZN5eBULqwrl2qObnyn
soPDHLqnE87MDKzrVa0tXUyAbML2rFnteKmlvE4YPePK5pvc5QgHC6Udt8yxgT9bbeQ7KHFjKwqs
Ud3f/i6sUbFG4VbIfJ/RT/B2bvK3r9LTJj/V39vEwAT/pReQxiC0JFIAsFkFGIMBYwFWJBUFgggx
EYoKMEWKIgoqsIyEhlqewDRFV4cPZ7M3PrwKhxgUAoxjFkYiiq8OPr47+1HZD1rwpt3Ga1ruvDuz
NEZBAuoCDwXstILZq6mYdYeNYqIGZghYT0cYOLIJijk1D4d2RcjBFlQQ5IObq4kImFUPl1TtUrDt
COUEagTGUCs4ucFxkjTABafMRMqIEXenMPTpQEFDhGbE4qScVCJhXtUXioLtTLUyyLdURTRSQCiF
CJIa62aMVYG7yOfIuENtThmsCwXZkZvZzSA7YiCcsQJRjAgAnRdOIODOQ+bialiUUZBFy4WXsgkW
SXOrqqRmCHJjDp9OtWrdw9q4CNnQ0LGpUQJFEMpqcKVVXBOHVQXdRaOWr9bWZkZwEVv4bbtY2YK2
fRtejJi1jQB/TAxCHw/l/P3bYcpnXz+b4pDn5/m+LnkOP29+h28hViiqqkkkkgv7AZQ+7u7HHqcI
38OrrOvG1gX5ycqRowCnrU5deV1ttNmXvz8mUps38KYFYOeAjhyZUP081LVNrwwt7kxEvMb+ftiK
GWYP0oPXPmzHfW7meuZ6OZpnK6adeSI6VIpv32mLxz2a8iYy2EjNUmdGS+Azrvw3vDNZwAA9AiiI
oiIiigkEgkG0SUnamsebMArHLfUBzjYIiIksMDvRtD1CQJGdsvwxsck+ciq6D5TpusvEYY1S+/SB
6cYJJ2cnVVOI8nIOOKDkk69ZXEDujAVpRxRnqnWfsp10fFlSl2xxuoUvRxe7sxfF3BF+/8Hbr2UQ
SiDWcZ1kOFe+/P0IIJUIiRYgZLSxRyMhKsHOLtrF2zvwbioe2lQVRRiirWqiXyy5QrFHlv9BlRSK
sIWzk5lCyDy7+j3ve+DOju8XwV7Qx38e2Qt6W5mU72YilZ4u6a8bBJxjBVEDo7Qh6Vs45yfBHZuk
72et411ccHKD0/CrfDIJRNQwRQ6ZVyvTNNNVW1l1ItnuxY7EjStYsyLfvzdQioY5YZTXq046te5T
2qYoo9EVH5IrAQpFkAFpBD5CIeH410hRY7VIpt82Q8HLkoOzrzBEd6GQn5Az8y72POxLYags+zDA
SKNC6hTA8dEzYhaRD3NTfZm7zcddP0kx5qilRUc8UkUPUilZ1ey4E2jB0ETNbzeOaylKyhUVFmtk
DR75SkoIiCAggiIIIiIIIIgiIIf9ITcWPwjU2CdgiRaBABS0tKKLtU1ukXmQPEPALeLwTknZFxYI
rSJSh+U32En4nDCIJIzYFBWo2lRULC9AHl7T358z+Qpn9NcHECrvUAkc0DiMovKER/bZ5iFEHEHN
oox2XKYc5RGyDWWAzFVxdgWgj8dmoz8+6Pss79r7zzbYcDTV3pUoutLPTPJSCEu4q0Z1RHUbgyvB
V20pis7fBxdW3fMJTAwNHEOJxOIHAQpwOBooaBNSAcIQALmtFTduddsNWpjTWi2lMstm2VMKtMTW
tG2jWWGsc66C5R2zd0b12xWYxmjAwEENhCmhNgpgiCYwNp9eQDb5NEwp4/V7rPeOJ67IEKGyR2sA
lEnu9rVpbcYxJ7KxkkGSQ3SRbLMTkbu1sO733z304p/JShAUfV0kgW2FtLbC22rS2y2kttvQxYJn
BI07OavfO3dTF3CIrLJouYR1iUoLJGW+BBLTXjwz1SQk0kLtYFScUm7JOLOSE6Mix1zzkg86cmSG
IBysoLCBzYBp5ppYNZczOqxkZZ3J14H7EzCQLam1DMwwo8GmYZsiFUQnqzXF8JJi0kEMWOj+gzFl
oIhC7FgYKqUxtLWRYYQhFWS226ESxraS+ut6i7EhK2UbHeJKNbWid4CJRoyNzfYkMwRO4Lqc4SWc
hNjB3x4D4B9n8Gx0Oe/PNXLyAk5BSkBCSUZ0CEZAkjCzNKCaEYcp5E1GSSbhZ/heLRSUr73zHAs2
GFv7JGTRZ82LSLMGb7QiKMFVm6SOGbGSJZBF4McLw3swgIrESjdkwjJjF2CslElmqldJ4kOU7aUS
oZLsFXqqxrgiVIUK6sUGJaEhVo0arprtHlJpXGsatG7dgREWXG/SzFTVdbhRkyYWePHTI5SWSNMa
aEGEoQiCUTyYVUjA4Yl2DVI5bxCCfpFFHKaSa78oxdd43XTsaKOVS5VqwZuWDdNR3YYNE1W7/QhH
ZQk3bJMWaib67LO7pyxSZOGZw0OTB8wj6/o3gI/UcRFDuNICM4pEPJ6g3Z4ncWjohCT4604J8QIV
iSAGblRdhkqOZNy25mZOgm+VJF1tZjOSS7FmzDZo668daMF5VFQEC0Xs1kYigvr2fWBpKKABCwyJ
jla0bb8DKaMLDC1svFeUKU0AjZQuKlFa80PZSqEU+smyY3xj1V1liku7E0hJNLH6TXYvd75rfT3g
I8GWcSPSW1LqHLiSfM79+qVXSNllLsMyEUTtLvLVpCdBWU6q2eGaayjs7uNpMsL5p66YUcXtDUVQ
i6WJwnU3JAohRLibhk6hobgNUDgccl41my35MJ4IaIwbvpV2NVd5qKw7mWrTtHOuuNmfGdma/Rjc
7Zp2tne+WuWsQzOzrnGzDDqWhnalmiiBWERpeLZEmgS6Gk1lgtSSqV1g4AuBakLy8xUQTU2JuQL0
HgD0jPAQnNwIhePUwlGaDUdChUXkrIYiltMVcCABpMa4gS8n0sguQidJruykLt03j0nfW6kbJYZb
ZYXrnEJYVtbFZJmvhPyn7RZu1ZQVjWWSU5Zdmjl6HDye0czjBBYCJBwV5xySQUJgGZM+GBhpPNKJ
9tGb072dRn1hTbdZL1TZa420Xxwq86sG6ar1eKob9VMxrpm3tKLRuUSzYU0X1WV3e0RBm8OGqrnJ
CCqTJJ4OSbhdY4YNHmIKOzJJq7sGSzsxcLH1N2r46peyNTJN/9IR0xNFSzZI1aKtiBpoQNDcGzhW
6nMgDqAHOm/HZHbdSrdv4oVb0xhm3CQrBujg60+JqcIMIrubmYdGhqgBxZlXp8dcIZipTCyJqxcX
tK2sENoiZXlszWWyz1gVmDiWlRoqs0NeAvGRREaW2CPRSmUS3KY5GblfCIgjh7QvlhJSazFy+kRr
DlSQ4gMSEQw44cdBozh5ufS6DlCTJEUlAk4iF2rRxp76tkLs2ru2hpGUTPjJA3i+EIjox87uGqr4
F4w5eV3u7MPlbW0nSlcGafCShLRJxCIwCNmVEoRjLyuertqekaz0YJ5Yru0Qz5YplIgRo7NmVMlq
YsRY2vll9M3AbtS+8Ku1gJy1cfDHSIGOT1sOI2EVAxk7pxjhJKMvBqqkcu6Sq0pRW0vCfZuyeF0k
sIRqnl3Ys2jSPhfqW1mvoiKQNK7zWUwdKyUVaEj0bNaK1yU0hEd+og0w1KtyqTpay/jJ0yZF2aTI
jHGcVQMoiEPeIcPDsk8lWjc4cKPJ0kzdOXKUqKtDk3UeGisMEnS7hnnstA5aKNzsq0dMGhs3LN1W
DFRkkXYs4xTWVZrM4u6aPMD5GPd9vI/h0uaQUgTOsfMksp717YTjj1DV1VhYxW/CU6jLtBNvnGKV
0HOaVTlYARQxfnsLo6upXNiJNVvveYwgFIUREECmAQItJopbjStyCmZBc7mIUDfAS8waCrgZzIoL
4Rkbtr2ViIhCuQz7tXFc9cmSBj6W0wRCE10nwdYbxlS/K6cgTczhEUer1b5V5cVb55s9bqs1XTLn
hk10iIRRoUfBKupwnozm8Pl1iYNINGLp5uwnNaJSyM/lS0VwdM4hG7FrXNys1XeIzjCcTxs1hEFO
ktGai3dZu+GIqwyolTJ52iI0ctD078orq+EI8zZKzYs3oauIVSI3ljh4SqwlCTLJq+DKsUVdHdo8
LGbqJoytXZLdv3W2Mcll3LEwZ2Q1kwd86xEZtXTBPpkwiBo4csmzBg4WSfjBj06ZppuSTdds4SYt
jVZZs7N0mjGIfvg+HvuzI7um0SatHdXBvslV2USWWTYnzcxBTKD5hHOcloH2iHyCMo9I/rBsgY5P
0z14A6u4VeIFcRNPW03q5FWS5qQuNhwi+xIlYhJkkAZ1kYt4U1tktO08twCCAHMwRc6ONLsaqwXJ
MYmVh6hWWObeUAoIOdOEQeWrlZJk0Q1lES+NIw0TWZjNy4lTTNwxwl7SerKJOWZTvKHMM5REs8M4
cWQZ7sFJskmW7CNIGaZi6YpMlnWmfMojOUdYRg69vdyYJuxOIcJ+7rVS7h+yC+6MpcyLymsyirZJ
LN5dZLsDVjfuTnq1pJuTdjVhslJJGuhSAjWMTFc5Zo5sorik8PDN4aIm4eGrs0Vc+OrUdqZZccNm
jRq+ezOLw2yfqTOXhg9Oq6zYz6Qifo8pxEZpctkIoswpLLFNul9vLNZKERrO8tcFyyWijJ58+E02
yy7DDBqlLRrkxYxjmx3HDVo3aJNSqzdNkZEHWqu9RCYkcQyLiwtMCrYGJDOXFDQsavRz21WUps0f
EiyUZN3dy/FEKO67u6TXTZpOUlnC7l3TdmUQd1GSrgxbOFHvv+uERRgW9Lxyk4y01lJW3F75cUpd
I0CwnKlmgkzQUgkYBAUlorFQ72i09KIL3G0taXwa8MwXgDEAYJSzDEwjZxGsyzN655KRrcswwOGb
hqyfsi+zTT0xlJ7fC+WHByiMOMWbLPHJu6YxbawS1micpz4UhiwNWb0dLRCkBEkojhMFF3D8CI+r
SXeWp4SMkuC3PJz12E+8Ii0IYvgz7xgQiTpTPuVXVaGcG0L4SrLWD08NwirWBdLZh5cNlGLxDjpV
kq4hO/G0pSwswVwkg1iRCKJcJTUTOcU25aMqYo7cwisOq4UdFIxN2ObPWN5yguXTcqNdHloYMeJ6
yxnxs7r0Vbr2csF2Cq7fKOua2TzTzSZspzWc+m7lCNklWZ2cuySyrdZukYpLtcF0ndgs7sV3d2VZ
sU1WjJZusyaMWrI2aw1NW6szmRkYBl1tKsGzSCPmHKBUdiLzvxNrXfsu0ueoeEbujgK3xnubYGwC
WQ4uznGz9rlBE1dDChoc7bdORpxvZxrDrNtiuAEGQSg3BRBKBGBAkbwOuuDBUOqIG6RPX1+QgRNx
vOBFhT3ArcOCm1va9D3UyzdX5ymodHh6wEa5MpOutWGiT9p7tirVum3OHRkwTtnjHNkt16L+rNmm
7vC2056JGa7YzPLtNR8oh+EShCTFOEvkm+aSH6mjU8vkePjXbRvdNZJ0nOCa/lg6TUz95Vd2fvi1
bJnqpCLtz9mcQay19+tMa5egvw4wdnTH2fBWKVty9zBs5b5Y12smlWdXlsvN4Tij3Z44Z5qzTwzL
vLHlk8OnDFVJ2NE37OTRciC7J2LpOmrsk7KsmbaZLFJJz5VWXePWbZdYxar30ZKukfXu4Y49nZsx
btmqqiybdllkxZN4RT7saKUpsyYOWeeJu1aMjZkm0dnST7xRn6vxTiDT8YA3dZjoN7+XVCfp7utA
ZENbTCm+AQOiXyXOHhM15eLlMYguR1zapXT424VuGa26GcAJ9AQGDTx0tpva9sN0lCUOUtEoMUoe
GkE4jJunGyWXp6YuGzJkUgI3cM5pUSjNy96bucuLUm0IxQXiIhRLmRE00x0UYGrajedjHGSlmBcs
0aOFGrJs+6I9IGKqTTVfbLSUV2pHSTBs4TcWjls2arNMdlNE08MvdROZW6EeWo4dlFGTnTOjHGJR
580aM143hH5UXvw1ZNGWDSjqdZ6Kbr9jlwyyrP3XcJpu6bZk+YvtSWc9p4STddV5cKmLNok/No8X
vOiUasXC0dno7tl2zBJRVEIabt2bwsuqmZsn2jVoyXVTZs3lZgqqbqqs2Tv33LYEuWTRJ6tXoxbu
zsmwYKvjql7Xd13Z9c1XLld4aN34STftiN4CN/T83u/VEOwmlpFEA3AGUCJ2+gEAfjkLnByXcz3e
9zYMlVE3sJmw7lBuZpVWSpcg4IFYD3D4vDucPpBmfxs3rNQJMoy/VGamtlGNpa2xmxowrLJ6PUus
k7PbDX4uWjRi5htxxwnrVK+ufUcbpSSRuoylLneUqokkgjN8/ns2U+MIjluzfg7bVY80389nIxl5
aOmlkncms4jTxZPZmo1lRm7MnljWm5LOtaR3+jpP9cbZrOzJdrhanc7pdzy2duU2SyzKvZJO6iZ6
tlFFmLhqyLruGSqbKss9WjB167MH692qfo1bJs1HDlm40nxSJVS4SwcrprvS5RqYLRC+rwmzcnLc
waJJKmzF4ZpptnfvVw3ZNFGzFwm3aMmLJVkqbvDJddm3ck2TRQ2ZmjRybsnz1YOGSjdkkXJtSTrr
7H5PwRD6tUuPl6bvbz8sI5DzNTHYuJPZfCQ0AKHAowBiMPAlSXqrVLEvE70RltPOjobZoNA0MZfl
IhgzZAcNptgg8pfBacIRBYUSJxSINPLJjJX2vxK8gqmXk9wFuN4K8LnujQkYFdWtChkdaocSG6Bk
bujbJuqxaxNhpxlKfJVY2SUdllKGqbRRum3wtvSeUsJUKOGRs+NlVVXqu1d+83wdsW8+ZZExlBJ9
oqdpN3d2cPDnnzs9OHN9ICbOPKjw4SdjkmwSzzPGLTDZ8ICMWTHB4ZMXZNco2erlucrqrqdMmijn
bZPB1JLBdJumsvAbLJo3WVVWYe5Ky+67Zywbs3ldu+OiAzOzpRMs0JNmKa7sk6UYokmiRG12yynD
E6UTTYMGL3ql0+kXZrOFzhTZfeBuxVfD4TZKU4di41lCo1l5kdNx1AYcYeQd3E8uhilzoEe3pP+X
P2+yrUo74qeQXgm9UqQeCm7jGKIbhRKKrXFEOJBWy3Q+Xtc8vhq5NdX95IFhSqyv4wqFPwQCKQHb
FEfqpFGin84KsPlfpSHpFQPckLYKAsBRRIirBVgyKcSQssRRkGMYw6yFhCUnug2QQZZaUVjKA1gE
KDKyHnUkBjBBGMEFkRjGJGMVLuwT7kT4QpBfNTiUoKFSl6lQtUJJEhepRSorUiHpbj9c/wRAC0fV
QP0fAbf49PdIfKvYtpeQeoiESAsBZCKkCMGQSCJIrAifif4fKgP982f/vdl3Scx7BamqpFAWAOR2
COFDWHZ9TXabCYg4wBaJvs/QRQAMvs50RacUIQ5QrAhwpQ/MmY6RYUOackTqq4plcLnNfoyFs5y7
7m/YPDWDopmVyVwNuj3nTaYpZAOsn/ukWhxj0UA0wQ3sRv055pFsfOibXDYYUHNSUo+38YEOU0bP
ASMDhmpGZUChn6ZhAQxFVJtIdUYLZTiUC0sVvAtrA/Zfe4PcRV3e+xuZ2zrmrblbddtJrVjmV2xc
xt7EDyA80cB08eVrYP+SdcNW2KeXS56Qn6YJRUeULW527JtSlJKDT38Dt8OgCy+zQvXU4Z5fefUa
4PG3fqPU+1786a82mklApUANrsIx9vt5xOmNK37/V8ULSIwRIAkgnoKFBaQionbv/sSGwBqdPj+P
iRSLBYCqRYQWCIKIMo/3aRz/Lj+//LN/L9Z/e/wfo6R967NdmUMs64YZMXUQg/1RqzUQgo/sSbJv
l/N/jwyWf7HDVwzf3LOlEy6bXXN057NN2rM3JMTBi/uYKMGTh58NGrBRvvKW7Vs9iEZJqJHCpy3T
WTWeKJk5LuVVXTXWr/gP4dPDU8N2bVqkbnZ3M1k1WaaxtH0j9PS2GubRSmHq9HLRIqwcsGCb/H0W
YppLE3Lp2YKNmbN9PrWxLw6ezRV7e26rsyfdF3ERE8X5JKwgHZy7O77uhq5XcPjHB6vmksxaunhu
YHLcaDrFPcqJyC/eGg1CnD9oFYvWXDx3+DrO9UqUEzKbQzXqaA+yFPAp/UKHD/5/0IB4B2IIl/e8
2Vf1VIARBgBAAkvDSu2f25v5R5M4QDtpHJKJohJDOBmfskagLjQIby/cFQAwx+YP39pcdXX21mH8
yPIdxcuxYPxfkyZuCiy6r816PzP3NWcMay10UYrPwYM2jNgq2ZPeKwZKNWz72zBmms/b+/R0wasm
WbRumso6SdLJt2JxJmTZGaTNU0Omh06bslDRViqrg4TsVcKppIDBkVfdA7kXbsU0mTlRt05J7um5
k5cNXT47ukjFmqum2YxBV2UarMEQ+sbOH0jpiqqqn93hGpw1bu7J3ZuP0Qn9rD1xOCkfg6j+pUA8
Vvoio1BpRllEXRy4VDwFgqwSm8ms1nIbghWbzebOivLKhzmUQfJ7KlWZs+TZRJFXT7OGzZqusou6
P4VYMWiZkumm4UUyScHwWVhRg7ulWibv3yd2Zs+yWmac8GrpVNy7PKOC6hk8uON2jJomTdnts0Se
HhNpp3YM2RN4XdmrpsjSP54lF3xd3bLNunTRJuxeHZJ/MhD/B/AmEiSEM2TNixdj1f93wcMHD2aM
nDlYo2aOntFH/L91LJJxOSIk+7RJ8XYok0ZseG7P+iV1n7Ij8ILuDuq8PR3fH7vV+ezF4fA7tak9
gcqthsrqikLg+GR1EZKwzKoe85TvepQMmIgBFLm9j8zEK3ky1A40yRADbjwA18h6TghPhNYbUY4N
y1Jfa0ayaGSk55+v3SpZEiWB6Kk3zVfNXhLR9n7ctGfZ+p9XTVkqwXd/urA7ReaVkmj6M4m4aKtn
xY7JKqtmzu6bPEQNnUIZG7hg5UTTTaqsTJUmxfVi0cPD1i7Nk2bPBEHZwk/LR5OE3DJ6IhCbVZWJ
uU2BsXctohgs6YuW67BNZ9bGa5VJ4IIcG6zz8HhJ60o1SXKpvVq5UODYo7IhNkk1XO7NJZgum9FH
fRkyXYv77uj3j8IgP3pEOgobxgFppMS81FribHlP1e5pidJtaRLTieWrBgzbpPgom3ejJ8UI9iGs
m6P4xCC7jz5pCf8WmpDepyfajQxvLaeKHkXocpmRt1s7gaXtMKWAAAPgXwPscJbmnnDP7kXRERGN
o7FEuHmX5W2oMjgeY1dC5GpFLMf92DVe6cEcbjIW3CCGOaxuYSiYYNzG5Yri3MtznMMNGDCDdFlA
JR970fc2frYNH8R934vvXUsm7fT2lpnll8vW3G7Z8ljFm2eX3ppuSzl9vtdo8IisfU7uGZV+Dl2b
uF7JeE1f5/3Sjz5fl8OKvWkx4HEuu8oQeuHP35mrfaAjZ36pA27QaMdHTfGqq3vQ+NFngzeHL6ke
HsiTyt5bKTZvVVq91V1HsySZ0bMWjF8vlNRVk9GSpIq2mlmaCo1GkNZzheYmPSpyqbVV51EOgU6B
4w9bIelkAqKoogyCxQ8vXA+mAC8RCHpGzhc7O6jQ9vaqrT/3Ei7U+nUIB8o9HTZokk/nQfiEfRRV
82Ls+Ly7PHijQPQB3tXZ3Rup1ceohsA8uk8mmjeIjMLheLhAQiBAZx8pareGLL4lHwffRLA8xA4k
HDNiu4YMnAqIVYndQ7g0mYw8xTJ5g1/7NhBIP8jmIsOsPTnPl2YPx9/Vh1xEAOoEh5j1FurE8Bbc
PG+Y/bI+xQO/M6YwEEMyK0QxqKq0AgKMM5R7F3m8gEPUEe10oXFdNvLRKiEGQNb0AxGEZDCk9d9f
j80N9xDZ8GbEhgJIeqPT2fGpIePsdfYrIQtq2ZmSSKVCoEv6Na0qqqIiKqIiKqqqIiKiIiqqqq+i
BPRAOp/DJCi+SgatL4GjbmAULX+UCPcoXKatZO/T91Yt+gGRBA+Zagd3HxKXJ90OuJSgB/pn2+vb
B5/il8VEn72D0Zn6KMVFU8umL9H3v0IROaWJ9lGrBdgWbGbdZZZk0aNjRm1amab+ozYIq1LtH0Qi
RRo2ZrruGrBVQmm3SaMm74/xs1WWMmqbpu6JuxVs3ZMDhwy7JLt2p0o3YMlrKOG7QyTZN1Fkm5oS
fpCAb3ZsCTV27Yt2BrGKaThJ2mljjgo0Tbxy7JtWbV2jx3cKKUaqxCDpo44mwcuuG3O6S6yibh0u
wOVVRxqIbSgI+NWxDH2KrET3AAdSgFFm8Le4PlSN9hbFTm9RThlWvMfJ4KVfM8Mn2EIxbCQ8hGyJ
w8H5k3EfU+Yz/q6hEHMkwdNgaw0mxEwU8AojntE/3UiHOfiekEOmCgEU860DSjzKczxIA3Xc6IhA
zBxcR5oVDWr0ZBn2Ht4BS7wFI19RnO3odI9OwPceZ1WfG06XxXBHpD8i7vJ4qIwKSLylAU9QRgAl
SQ25IeFaegHuAtAbTroOlR+jIpAJWnlZX5qWg3B+wzwRP3qAkrQ9pejZpntHPVaZypW3EUrALh8d
h97UohcUmJ03heJghuoFRYlYCjUJ2+2xUx6LKJ6Ier4k7NIq6yUpbnDaApQya8/Fyb9PzrqvvDMP
QvCuMf3/apkpUp7QyFMk0KRYqRiABImPAKAVaBkuLQ7SwC5UQ6W83ol3snPQLucuC457BzqVWjib
tgVlaqzyDmNR2ByevxDYpWHMHw9+rzQB5A7+QHI3J3ou9Dz4kU0aLR5vFUT4Dr40OgPYBuDgAIHG
a93a7m5AHoDkcNhxndQawTFQTQQXpX7RbtjD/j4yLySIHzmnCEkJAacyaAAWhkW5B+aPAjC1j9FN
eBsfh6OkYyQIeVJGrMB5GkeJCl8oGcsNocSFKHhkp9qhibfmhYPEWfNSxS7yQyVQ4+zTNOp+QajQ
JFguY7mSVCVAwIKi1CzzaADNm1F82xTj5Z76UjGSEOTsVOTwRz5BlFEPnhAAd95IAHvAsVIiCxGG
TnIfBS8U8EOM0o8hUpjkA9CFgOkz6pLqsjq0KXAeaiHDS2jwNmjvMD8hHdy+0y+GNNMcoEwUe4zf
UYbTYN9Es4q2JYgixm0VNoA+58+wuLcTgXioVwUccbUatPoxRDZ9D+EPum+wpJ7LykOcIB+IRBPe
1qGWnK1KiVa4tCvio5tPFdlVVUVqaDMoEDU/0p9jYhnZEmJtUvr1JJA1JBtL9kSpf2Fa0ugEkEKE
3wMjABQkJcyAD4ShyEPl8VA1cdIH7qU9236VFkOyUlZgoGJgh69hymkU+ChtvPjLO3xP4EIEMQ4y
8+wDINv5tQcdw7HBZkpCCKuyimZGpTTUBrAMSMbyIiCa/5xC8HZgrCjFJJEj/8zP9LQxgwFL8ENF
aonocdldbzDQB8AqVBCbk4be0ed/Lb/FTUiAHmjwAEDo5iTknDeev0O6CJeeJkFSodqkCAftNbbg
pxm0a3giIj+mIf1RD+lEIUuXNT7FChQoYf0hsUQ0CdHkWZApyfhdgF4Uwhe5j7WJ8NpvDHj/n/E/
z+PFXWUpQpsQJxqcYpFNOqMJGHDlDUH0AfN8V/IEeRezOUCaF54oXG5DmKaBfDQok9akF0kAulIA
dAxUKERkUIQL37Ch0eopU9VinXrA6r1AvGAQDMBQwVEg/uU5o5iyBHHUA6VC81lT1hoYqtOplYLx
ClYgf1hRteU5f5pLwgEivJFfWAo3OoQ6VL1LgAOlSChUAcgjm0DE3IAzN9iOG2NoDLDVWtuQKf8k
PfgfMw6lIQZIFJEoDCwKlLBLEoDCypSg0qUspSwSiUjKJYCSiUGlSlPPynNiBJOhVgspQUw6yJr9
yHmXA3QAQJFNzy8hnD06bW1yrtEwToUQCKHr+X4R5IAi85ZggzAswpfVnFKijn1SBUBcKjsiWv4e
IVqIcgiG0PZJ9dBJIKkIQIghFSKFaEELxILZhgpWDAUCJWAboNqq1ACB3aRROlC/VnDucz2hV/Ae
fWqyMFq6JCE/OaXnMwpH+JCBCiBkAIHKSm1IVRTMcoe7kC1Wy5B0KiY6LBsH47jAuyRAAHGQeACi
kuN5BOMKcBGXYbhi6NKZ0dFaZgzAJxAgBtyoxO0gHLM5ZQLhi4RGXLSqkaFChCovzg+75IQuPBAz
d+zTmt+qnUpWpWKYmTQSlEVtVWIRVa91aPwIQYvG77DdoYZwcymQ4OYPSlKQSpS0bDHhE4F4NBVd
KltBOOc8pUYpyin1DUZrhTRaNwROXC3wA70AfpU7ShnAqZnQcg+4aKickMLVIiAEFNxkBA4z0f2K
XDieKgX5DosCoU0czQUSo8/ANBuU/1O8O/lDDZnuqU6mKae1TmXPzHWge1rMVqdYHg1qoZ8wA/NR
aH9PmGo1htEO0c4P7zYp6TOO2/szuYPNCiIAduNxOelqAgYfRtiMAq0wGnKQ3h2r4Byh3PjQL1MB
HvUOoO7qRbR9LwgH3o5TeP3LSpHlA7p/d9jJSuoiB+AUdXJ7ycEdAdJpDr2hg499wA8AbX7ULQMK
IExiXHNTOKfeLYe2sxNphgocQYhvEqRRBL8FYh6TNSXnmAj5UX/MfnHZn/Ek8SVtoXH3V6UelBva
iKQCEIkIwnQI3COKFaPeRFQ7GwO4Rr7dFtMgZUpMKqMAEDO0CtoGsAcg1ovuQB9A7LlMwPcCPYay
/e9ghwDpz4hz3CHAAem/0xR079fPqeQHyEclA9DsDMptXnzY7qieQMVXmBGUEdKm85HWFBHyDlT9
V+h5Bxr7Cn3d3/i7kinChIbr98Tg

